COMMENT Mechanism for varying internal [Ca++] ENDCOMMENT INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)} NEURON { POINT_PROCESS caconc RANGE Alpha_Max, Alpha_Delay, Alpha_tau, DC_Level, DC_Delay, DC_Off, Ramp_Max, Ramp_Delay, Ramp_Off, Slope_UP, Slope_DOWN, alpend GLOBAL caconc } UNITS { (mV) = (millivolt) (umho) = (micromho) (mM) = (milli/liter) } PARAMETER { Alpha_Max=0 (umho) Alpha_Delay=0 (ms) Alpha_tau=.1 (ms) e=0 (mV) v (mV) caconc=0 (mM) DC_Level (mM) DC_Delay (ms) DC_Off (ms) Ramp_Max (mM) Ramp_Delay (ms) Ramp_Off (ms) Slope_UP (ms) Slope_DOWN (ms) alpend=0 } BREAKPOINT { if (Ramp_Max > 0) { if (Ramp_Off > t) {caconc = gramp(t) + (Alpha_Max * alpha( (t - Alpha_Delay)/Alpha_tau )) alpend = caconc } else {caconc = alpend + (Slope_DOWN * (t - Ramp_Off))} } else {caconc = gramp(t) + (Alpha_Max * alpha( (t - Alpha_Delay)/Alpha_tau ))} if (caconc < 0) { caconc = 0 } } FUNCTION alpha(x) { if (x < 0 || x > 10) { alpha = 0 }else{ alpha = x * exp(1 - x) } } FUNCTION gramp(x) { VERBATIM double tramp, x, Dc; x = _lx; if (x >= DC_Delay & x < DC_Off) Dc = DC_Level; else Dc = 0; if (x < Ramp_Delay) tramp = Dc; else { if (x < Ramp_Off) { tramp = Dc + (Slope_UP * (x - Ramp_Delay)); if (tramp >= Ramp_Max) tramp = Ramp_Max; } else { tramp = Ramp_Max + (Slope_DOWN * (x - Ramp_Off)); if (tramp <= Dc) tramp = Dc; } } return (tramp); ENDVERBATIM }