TITLE Borg-Graham K-M channel UNITS { (mA) = (milliamp) (mV) = (millivolt) (mM) = (milli/liter) } INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)} PARAMETER { dt (ms) cai (mM) v (mV) ek (mV) tm=10 celsius = 30 (degC) gkmbar=.003 (mho/cm2) vhalf=-55 (mV) a0=0.0002 (/ms) b0=0.0002 (/ms) zeta=-7 (1) gm=0.8 (1) st=1 } NEURON { SUFFIX borgkm USEION k READ ek WRITE ik RANGE gkmbar GLOBAL inf,tau } STATE { m } ASSIGNED { ik (mA/cm2) inf tau } INITIAL { rate(v) m = inf } BREAKPOINT { SOLVE state ik = gkmbar*m^st*(v-ek) } FUNCTION alp(v(mV)) { alp = exp( 1.e-3*zeta*(v-vhalf)*9.648e4/(8.315*(273.16+celsius))) } FUNCTION bet(v(mV)) { bet = exp(1.e-3*zeta*gm*(v-vhalf)*9.648e4/(8.315*(273.16+celsius))) } LOCAL facm :if state_borgka is called from hoc, garbage or segmentation violation will :result because range variables won't have correct pointer. This is because : only BREAKPOINT sets up the correct pointers to range variables. PROCEDURE state() { : exact when v held constant; integrates over dt step rate(v) m = m + facm*(inf - m) VERBATIM return 0; ENDVERBATIM } PROCEDURE rate(v (mV)) { :callable from hoc LOCAL a,q10 q10=5^((celsius-22)/10) a = alp(v) inf = 1/(1 + a) tau = bet(v)/(q10*(a0+b0*a)) if (tau