COMMENT
This .mod file MUST use the euler method of differentiation. Other
methods make numerous calls to the check() block within a single
timestep and hence do unintuitive things to the state variables there.
ENDCOMMENT
:INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
UNITS {
(mM) = (milli/liter)
(umho) = (micromho)
(nA) = (nanoamp)
(mA) = (milliamp)
(mV) = (millivolt)
}
NEURON {
POINT_PROCESS abbott_nmda
POINTER vpre
NONSPECIFIC_CURRENT i
RANGE d, s
RANGE tauD, tauS, taug, G
RANGE erev, thresh
}
STATE {
D
S
g (umho) : conductance
h (umho) : conductance
}
PARAMETER {
v (mV)
erev = 0 (mV)
thresh = 0.5 (mV) : useful for 0-1 files
d = 0.4
s = 1.0
tauD = 300 (ms)
tauS = 20e3 (ms)
taug = 2 (ms)
G = 10e-12 (umho)
eta = 0.33 (/mM)
mag = 1 (mM)
gamma = 0.06 (/mV)
}
ASSIGNED {
i (nA)
firing
vpre (mV)
}
INITIAL {
firing = 0
D = 1
S = 1
g = 0
}
BREAKPOINT {
SOLVE depression METHOD euler : so now we're clinical psychiatrists
aux()
}
DERIVATIVE depression {
check()
D' = (1/tauD) * ( 1 - D )
S' = (1/tauS) * ( 1 - S )
g' = (1/taug) * (-g)
: printf("D: %f, S: %f, g: %f\n", D, S, g)
}
PROCEDURE aux() {
h = 1/(1 + eta * mag * exp( - (gamma * v)))
i = (g * h * (v - erev))
}
PROCEDURE check() {
: printf ("--------------------------------------------------\n")
: printf ("t: %f\n", t)
if (firing && (vpre < thresh)) {
firing = 0
}
if ((vpre >= thresh) && !firing) {
firing = 1
D = d * D
S = s * S
g = g + G * D * S
: printf(" **** firing: %f \n", firing)
}
: printf("vpre: %f, firing: %f\n", vpre, firing)
}