COMMENT
----------------------------------------------------------------
Persistent version of sna.mod (inactivation removed)
The model keeps track of the number of channels in each state and
uses a binomial rng to update this number. The model requires that the
RNG mechanism be inserted somewhere in the simulation in order to provide
the BnlDev_RNG function.
Jan 1999 Mickey London, Hebrew University, 1998, mikilon@lobster.ls.huji.ac.il
Peter N. Steinmetz, Caltech, peter@klab.caltech.edu
14 Sep 99 PNS. Added deterministic flag.
01 Sep 02 K. Diba changed deterministic to RANGE variable
----------------------------------------------------------------
ENDCOMMENT
INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
NEURON {
SUFFIX snap
USEION na READ ena WRITE ina
GLOBAL minf, mtau,am,bm
RANGE N, reff, eta, gamma, deterministic, gna
GLOBAL P_am, P_bm
GLOBAL tha, qa, vshift
GLOBAL Ra, Rb
GLOBAL vmin, vmax, q10, orig_temp, wflag, tadj
GLOBAL DONT_VECTORIZE : prevent vectorization to agree with RNG.mod
}
UNITS {
(mA) = (milliamp)
(mV) = (millivolt)
(pS) = (picosiemens)
(um) = (micron)
}
PARAMETER {
v (mV)
dt (ms)
area
vshift = -10 (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)
gamma = 20 (pS)
eta = 50 (1/um2) : channel density
celsius (degC)
orig_temp = 23 (degC) : original temperature
q10 = 2.3 : temperature sensitivity
deterministic = 0 : if non-zero, use deterministic variables
vmin = -120 (mV) : range to construct tables for
vmax = 100 (mV)
DONT_VECTORIZE : required declaration
}
ASSIGNED {
ina (mA/cm2)
gna (pS/um2)
ena (mV)
am (/ms)
bm (/ms)
minf
mtau (ms)
tadj
N
reff (pS/um2)
scale_dens (pS/um2)
P_am : probability of one channel making am transition
P_bm
wflag
}
STATE { m : deterministic variables
m00 m1 m2 m3 : states
m00_m1 m1_m2 m2_m3
m3_m2 m2_m1 m1_m00
}
: ----------------------------------------------------------------
: Initialization.
INITIAL {
trates(v+vshift)
wflag = 1 : only give a warning once!
m = minf
scale_dens = gamma/area
reff = gamma*eta
N = floor(eta*area + 0.5) : round to nearest number of channels
m1 = floor(3*m*(1-m)*(1-m)*N + 0.5)
m2 = floor(3*m*m*(1-m)*N + 0.5)
m3 = floor(m*m*m*N + 0.5)
: put the rest of the channels in the non-conducting & inactivated state
m00 = N - (m1 + m2 + m3)
m00_m1 = 0
m1_m2 = 0
m2_m3 = 0
m3_m2 = 0
m2_m1 = 0
m1_m00 = 0
}
: ----------------------------------------------------------------
: Breakpoint for each integration step
BREAKPOINT {
SOLVE states
if (deterministic) {
if (deterministic-1){
gna = m*m*m*reff*tadj
} else {
gna = floor(m*m*m*N + 0.5) * scale_dens *tadj}
} else{
gna = strap(m3) * scale_dens * tadj
}
ina = (1e-4) * gna * (v - ena)
}
: ----------------------------------------------------------------
: states - compute state variables
PROCEDURE states() {
VERBATIM
extern double BnlDev_RNG();
ENDVERBATIM
trates(v+vshift)
: deterministic versions of state variables
: integrated by relaxing toward the steady state value
m = m + (1 - exp(-dt/mtau)) * (minf-m)
P_am = strap(am*dt)
P_bm = strap(bm*dt)
: check that will represent probabilities when used
ChkProb( 3.0 * P_am)
ChkProb( 3.0 * P_bm)
ChkProb( P_bm/(1.0-2.0*P_am) )
ChkProb( 2.0 * P_bm/(1.0-P_am) )
m00_m1 = BnlDev_RNG(3.0*P_am,m00)
m1_m2 = BnlDev_RNG(2.0*P_am,m1)
m1_m00 = BnlDev_RNG(P_bm/(1.0-2.0*P_am), m1 - m1_m2)
m2_m3 = BnlDev_RNG(P_am,m2)
m2_m1 = BnlDev_RNG(2.0*P_bm/(1.0-P_am), m2 - m2_m3)
m3_m2 = BnlDev_RNG(3.0*P_bm,m3)
: new numbers in each state after the m gate transitions
m00 = m00 - m00_m1 + m1_m00
m1 = m1 - m1_m2 - m1_m00 + m2_m1 + m00_m1
m2 = m2 - m2_m3 - m2_m1 + m3_m2 + m1_m2
m3 = m3 - m3_m2 + m2_m3
}
: ----------------------------------------------------------------
: trates - compute rates, using table if possible
PROCEDURE trates(vm) {
TABLE minf, mtau, am, bm, tadj
DEPEND dt,Ra,Rb,tha,qa,q10,orig_temp,celsius
FROM vmin TO vmax WITH 199
tadj = q10^((celsius-orig_temp)/10)
: m activation variable
am = SigmoidRate(vm,tha,Ra,qa)
am = am * tadj
bm = SigmoidRate(-vm,-tha,Rb,qa)
bm = bm * tadj
mtau = 1/(am+bm)
minf = am*mtau
}
: ----------------------------------------------------------------
: SigmoidRate - Compute a sigmoid rate function given the
: 50% point th, the slope q, and the amplitude a.
FUNCTION SigmoidRate(v,th,a,q) {
if (fabs(v-th) > 1e-6) {
SigmoidRate = a * (v - th) / (1 - exp(-(v - th)/q))
} else {
SigmoidRate = a * q
}
}
: ----------------------------------------------------------------
: sign trap - trap negative numbers and replace with zero
FUNCTION strap(x) {
if (x < 0) {
strap = 0
if (wflag){
VERBATIM
fprintf (stderr,"snap.mod:strap: negative value for state");
ENDVERBATIM
wflag = 0}
} else {
strap = x
}
}
: ----------------------------------------------------------------
: ChkProb - Check that number represents a probability
PROCEDURE ChkProb(p) {
if (p < 0.0 || p > 1.0) {
if (wflag){
VERBATIM
fprintf(stderr, "snap.mod:ChkProb: argument not a probability.\n");
ENDVERBATIM
wflag =0}
} }