TITLE skm95.mod
COMMENT
----------------------------------------------------------------
Stochastic version of km.mod
Potassium channel, Hodgkin-Huxley style kinetics
Based on I-M (muscarinic K channel)
Slow, noninactivating
Author: Zach Mainen, Salk Institute, 1995, zach@salk.edu
19 May 2002 Kamran Diba. Changed gamma and deterministic from GLOBAL to RANGE.
----------------------------------------------------------------
ENDCOMMENT
INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
UNITS {
(mA) = (milliamp)
(mV) = (millivolt)
(pS) = (picosiemens)
(um) = (micron)
}
NEURON {
SUFFIX skm
USEION k READ ek WRITE ik
RANGE gk, gamma, deterministic,reff
RANGE N,eta
GLOBAL ninf, ntau,a,b, P_a,P_b
GLOBAL Rb, Ra
GLOBAL vmin, vmax, q10, temp, tadj
GLOBAL DONT_VECTORIZE : prevent vectorization to agree with RNG.mod
}
PARAMETER {
v (mV)
dt (ms)
area
gamma = 40 (pS) : 0.03 mho/cm2
eta = 0.25 (1/um2)
tha = -30 (mV) : v 1/2 for inf
qa = 9 (mV) : inf slope
Ra = 0.001 (/ms) : max act rate (slow)
Rb = 0.001 (/ms) : max deact rate (slow)
celsius (degC)
temp = 23 (degC) : original temp
q10 = 2.3 : temperature sensitivity
deterministic = 0 : if non-zero, will use deterministic version
vmin = -120 (mV) : range to construct tables for
vmax = 100 (mV)
DONT_VECTORIZE : required declaration
}
ASSIGNED {
a (/ms)
b (/ms)
ik (mA/cm2)
gk (pS/um2)
ek (mV)
ninf : steady-state value
ntau (ms) : time constant for relaxation
tadj
N
reff (pS/um2)
scale_dens (pS/um2)
P_a : probability of one channel making alpha transition
P_b : probability of one channel making beta transition
}
STATE {
n : state variable of deterministic description
N0 N1 : N states populations
n0_n1 n1_n0 : number of channels moving from one state to the other
}
: ----------------------------------------------------------------
: initialization
INITIAL {
trates(v)
n = ninf
scale_dens = gamma/area
reff = eta*gamma
N = floor(eta*area + 0.5)
N1 = floor(n * N+ 0.5)
N0 = N-N1 : any round off into non-conducting state
n0_n1 = 0
n1_n0 = 0
}
: ----------------------------------------------------------------
: Breakpoint for each integration step
BREAKPOINT {
SOLVE states
if (deterministic) {
if (deterministic-1){
gk = n*reff*tadj
} else {
gk = floor(n*N + 0.5) * scale_dens*tadj}
} else{
gk = strap(N1) * scale_dens * tadj
}
ik = (1e-4) * gk * (v - ek)
}
: ----------------------------------------------------------------
: states - updates number of channels in each state
PROCEDURE states() {
VERBATIM
extern double BnlDev_RNG();
ENDVERBATIM
trates(v)
: deterministic versions of state variables
: integrated by relaxing toward steady-state
n = n + (1 - exp(-dt/ntau)) * (ninf-n)
P_a = strap(a*dt)
P_b = strap(b*dt)
: check that will represent probabilities when used
ChkProb( P_a)
ChkProb( P_b)
: transitions
: if (deterministic) {
: n0_n1 = P_a*N0
: n1_n0 = P_b*N1
: }
: else{
n0_n1 = BnlDev_RNG(P_a, N0)
n1_n0 = BnlDev_RNG(P_b, N1)
: }
: move the channels
N0 = strap(N0 - n0_n1 + n1_n0)
N1 = N - N0
}
PROCEDURE trates(v) { :Computes rate and other constants at current v.
:Call once from HOC to initialize inf at resting v.
TABLE ninf, ntau, a, b, tadj
DEPEND celsius, temp, Ra, Rb, tha, qa,q10
FROM vmin TO vmax WITH 199
tadj = q10^((celsius - temp)/10)
a = Ra * (v - tha) / (1 - exp(-(v - tha)/qa))
a = a * tadj
b = -Rb * (v - tha) / (1 - exp((v - tha)/qa))
b = b * tadj
ntau = 1/(a+b)
ninf = a/(a+b)
}
: ----------------------------------------------------------------
: sign trap - trap for negative values and replace with zero
FUNCTION strap(x) {
if (x < 0) {
strap = 0
VERBATIM
fprintf (stderr,"skm.mod:strap: negative state");
ENDVERBATIM
} else {
strap = x
}
}
: ----------------------------------------------------------------
: ChkProb - Check that number represents a probability
PROCEDURE ChkProb(p) {
if (p < 0.0 || p > 1.0) {
VERBATIM
fprintf(stderr, "skm.mod:ChkProb: argument not a probability.\n");
ENDVERBATIM
}
}