COMMENT This a stochastic version of the na3h5.mod of Z. Mainen in mainen 95 (Zach Mainen, Salk Institute, 1994, zach@salk.edu). It is a Sodium channel, Hodgkin & Huxley like kinetics, based on the gates model, assuming stochastic opening and closing. Kinetics were fit to data from Huguenard et al. (1988) and Hamill et al. (1991). (qi is not well constrained by the data, since there are no points between -80 and -55. So this was fixed at 5 while the thi1,thi2,Rg,Rd were optimized using a simplex least square proc) voltage dependencies are shifted approximately +5mV from the best fit to give higher threshold. The rates function are addapted directly from the na3h5.mod by Zach Mainen, available through: http://www.cnl.salk.edu/~zach/initdemo.html the stochastic model is as following: = 3alpha_m => = 2alpha_m => = alpha_m => [m0h1] [m1h1] [m2h1] <[m3h1]> <= beta_m = <= 2beta_m = <= 3beta_m = ^ ^ ^ ^ beta_h| | beta_h| | beta_h| | beta_h| | | |alpha_h | |alpha_h | |alpha_h | |alphah | | | | | | | | V = 3alpha_m => V = 2alpha_m => = alpha_m =>V [m0h0] [m1h0] [m2h0] [m3h0] <= beta_m = <= 2beta_m = <= 3beta_m = The model kips track on the number of channels in each state, and uses binomial distribution to update these number. All the random routines are based on Numerical Rec, and are plugged in as source code (see below). Author: Mickey London, Hebrew University, 1998, mikilon@lobster.ls.huji.ac.il ENDCOMMENT INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)} UNITS { (mA) = (milliamp) (mV) = (millivolt) (pS) = (picosiemens) (um) = (micron) } NEURON { SUFFIX sna USEION na READ ena WRITE ina RANGE m, h, gna, gbar, vshift RANGE binom_rv,N,D,gama,alpham,betam,alphah,betah RANGE minf, hinf, mtau, htau,am,bm,ah,bh GLOBAL tha, thi1, thi2, qa, qi, qinf, thinf GLOBAL Ra, Rb, Rd, Rg GLOBAL q10, temp, tadj, vmin, vmax } PARAMETER { gbar = 1200 (pS/um2) : 0.12 mho/cm2 vshift = 0 (mV) : voltage shift (affects all) tha = -35 (mV) : v 1/2 for act (-42) qa = 9 (mV) : act slope Ra = 0.182 (/ms) : open (v) Rb = 0.124 (/ms) : close (v) thi1 = -50 (mV) : v 1/2 for inact thi2 = -75 (mV) : v 1/2 for inact qi = 5 (mV) : inact tau slope thinf = -65 (mV) : inact inf slope qinf = 6.2 (mV) : inact inf slope Rg = 0.0091 (/ms) : inact (v) Rd = 0.024 (/ms) : inact recov (v) temp = 23 (degC) : original temp q10 = 2.3 : temperature sensitivity v (mV) dt (ms) celsius (degC) vmin = -120 (mV) vmax = 100 (mV) gama = 20 (pS) D = 60 (1/um2) } ASSIGNED { am (/ms) bm (/ms) ah (/ms) bh (/ms) ina (mA/cm2) gna (pS/um2) ena (mV) minf hinf mtau (ms) htau (ms) tadj N scale_dens (pS/um2) alpham betam alphah betah binp binn binom_rv } STATE { m h m0h0 m0h1 m1h0 m1h1 m2h0 m2h1 m3h0 m3h1 m0h0_m1h0 m1h0_m2h0 m2h0_m3h0 m0h1_m1h1 m1h1_m2h1 m2h1_m3h1 m3h0_m2h0 m2h0_m1h0 m1h0_m0h0 m3h1_m2h1 m2h1_m1h1 m1h1_m0h1 m0h0_m0h1 m0h1_m0h0 m1h0_m1h1 m1h1_m1h0 m2h0_m2h1 m2h1_m2h0 m3h0_m3h1 m3h1_m3h0 } INITIAL { trates(v+vshift) m = minf h = hinf scale_dens = gama/area N = floor(D*area) m0h0 = floor((1-m)*(1-m)*(1-m)*(1-h)*N) m1h0 = floor(3*m*(1-m)*(1-m)*(1-h)*N) m2h0 = floor(3*m*m*(1-m)*(1-h)*N) m3h0 = floor(m*m*m*(1-h)*N) m0h1 = floor((1-m)*(1-m)*(1-m)*h*N) m1h1 = floor(3*m*(1-m)*(1-m)*h*N) m2h1 = floor(3*m*m*(1-m)*h*N) m3h1 = floor(m*m*m*h*N) m0h0_m1h0=0 m1h0_m2h0=0 m2h0_m3h0=0 m0h1_m1h1=0 m1h1_m2h1=0 m2h1_m3h1=0 m3h0_m2h0=0 m2h0_m1h0=0 m1h0_m0h0=0 m3h1_m2h1=0 m2h1_m1h1=0 m1h1_m0h1=0 m0h0_m0h1=0 m0h1_m0h0=0 m1h0_m1h1=0 m1h1_m1h0=0 m2h0_m2h1=0 m2h1_m2h0=0 m3h0_m3h1=0 m3h1_m3h0=0 } BREAKPOINT { SOLVE states gna = strap(m3h1)*scale_dens ina = (1e-4) * gna * (v - ena) } LOCAL mexp, hexp PROCEDURE states() { :Computes state variables m, h, and n trates(v+vshift) : at the current v and dt. m = m + mexp*(minf-m) h = h + hexp*(hinf-h) alpham = strap(am*dt) betam = strap(bm*dt) m0h0_m1h0 = binom(3.0*alpham,m0h0) m1h0_m2h0 = binom(2.0*alpham,m1h0) m2h0_m3h0 = binom(alpham,m2h0) m0h1_m1h1 = binom(3.0*alpham,m0h1) m1h1_m2h1 = binom(2.0*alpham,m1h1) m2h1_m3h1 = binom(alpham,m2h1) m3h0_m2h0 = binom(3.0*betam,m3h0) m2h0_m1h0 = binom(2.0*betam,m2h0) m1h0_m0h0 = binom(betam,m1h0) m3h1_m2h1 = binom(3.0*betam,m3h1) m2h1_m1h1 = binom(2.0*betam,m2h1) m1h1_m0h1 = binom(betam,m1h1) m0h0 = m0h0 - m0h0_m1h0 + m1h0_m0h0 m1h0 = m1h0 - m1h0_m2h0 - m1h0_m0h0 + m2h0_m1h0 + m0h0_m1h0 m2h0 = m2h0 - m2h0_m3h0 - m2h0_m1h0 + m3h0_m2h0 + m1h0_m2h0 m3h0 = m3h0 - m3h0_m2h0 + m2h0_m3h0 m0h1 = m0h1 - m0h1_m1h1 + m1h1_m0h1 m1h1 = m1h1 - m1h1_m2h1 - m1h1_m0h1 + m2h1_m1h1 + m0h1_m1h1 m2h1 = m2h1 - m2h1_m3h1 - m2h1_m1h1 + m3h1_m2h1 + m1h1_m2h1 m3h1 = m3h1 - m3h1_m2h1 + m2h1_m3h1 alphah = strap(ah*dt) betah = strap(bh*dt) m0h0_m0h1 = binom(betah,m0h0) m0h1_m0h0 = binom(alphah,m0h1) m1h0_m1h1 = binom(betah,m1h0) m1h1_m1h0 = binom(alphah,m1h1) m2h0_m2h1 = binom(betah,m2h0) m2h1_m2h0 = binom(alphah,m2h1) m3h0_m3h1 = binom(betah,m3h0) m3h1_m3h0 = binom(alphah,m3h1) m0h0 = m0h0 - m0h0_m0h1 + m0h1_m0h0 m1h0 = m1h0 - m1h0_m1h1 + m1h1_m1h0 m2h0 = m2h0 - m2h0_m2h1 + m2h1_m2h0 m3h0 = m3h0 - m3h0_m3h1 + m3h1_m3h0 m0h1 = m0h1 - m0h1_m0h0 + m0h0_m0h1 m1h1 = m1h1 - m1h1_m1h0 + m1h0_m1h1 m2h1 = m2h1 - m2h1_m2h0 + m2h0_m2h1 m3h1 = m3h1 - m3h1_m3h0 + m3h0_m3h1 VERBATIM return 0; ENDVERBATIM } PROCEDURE trates(v) { LOCAL tinc TABLE minf, mexp, hinf, hexp,am,bm,ah,bh DEPEND dt, celsius, temp, Ra, Rb, Rd, Rg, tha, thi1, thi2, qa, qi, qinf FROM vmin TO vmax WITH 199 rates(v): not consistently executed from here if usetable == 1 tadj = q10^((celsius - temp)/10) tinc = -dt * tadj mexp = 1 - exp(tinc/mtau) hexp = 1 - exp(tinc/htau) } PROCEDURE rates(v) { am = trap0(v,tha,Ra*tadj,qa) bm = trap0(-v,-tha,Rb*tadj,qa) mtau = 1/(am+bm)*tadj minf = am*mtau/tadj :"h" inactivation ah = trap0(v,thi1,Rd*tadj,qi) bh = trap0(-v,-thi2,Rg*tadj,qi) htau = 1/(ah+bh)*tadj hinf = ah*htau/tadj : hinf = 1/(1+exp((v-thinf)/qinf)) : look here for troubles h is special } FUNCTION trap0(v,th,a,q) { if (fabs(v/th) > 1e-6) { trap0 = a * (v - th) / (1 - exp(-(v - th)/q)) } else { trap0 = a * q } } FUNCTION strap(x) { :Traps for negaiv values for number of channels if (x < 0) { strap = 0 VERBATIM fprintf (stderr,"snam95.mod:strap: negative value for state"); ENDVERBATIM }else{ strap = x } } FUNCTION binom(ppr,nnr) { VERBATIM extern double bnldev(); ENDVERBATIM binp = ppr : This is a nasty trick to pass variables into the verbatim code binn = nnr if (ppr<=0 || nnr <=0) { binom = 0 } else { VERBATIM binom_rv = bnldev(binp,(int)binn); ENDVERBATIM binom = binom_rv } } UNITSON