: $Id: nmda.mod,v 1.4 1994/05/24 15:56:52 billl Exp $
COMMENT
-----------------------------------------------------------------------------
Simple synaptic mechanism derived for first order kinetics of
binding of transmitter to postsynaptic receptors.
A. Destexhe & Z. Mainen, The Salk Institute, March 12, 1993.
Last modif. March 4th, 1994.
Reference:
Destexhe, A., Mainen, Z. and Sejnowski, T.J. An efficient method for
computing synaptic conductances based on a kinetic model of receptor binding.
Neural Computation, 6: 14-18, 1994.
-----------------------------------------------------------------------------
Simple NMDA based on GABA SYNAPSE (GABA-A receptors) in gabalow.mod
-----------------------------------------------------------------------------
ENDCOMMENT
INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
NEURON {
POINT_PROCESS NMDA
POINTER pre
RANGE C, R, R0, R1, g, gmax, lastrelease, B, spk
NONSPECIFIC_CURRENT i
GLOBAL Cmax, Cdur, Alpha, Beta, Erev, Prethresh, Deadtime, Rinf, Rtau
}
INCLUDE "queue.inc" : queue routines
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(umho) = (micromho)
(mM) = (milli/liter)
}
PARAMETER {
mg = 1. (mM) : external magnesium concentration
Cmax = 1 (mM) : max transmitter concentration
Cdur = 5.0 (ms) : transmitter duration (rising phase)
Alpha = 0.072 (/ms mM) : forward (binding) rate
Beta = 0.0066 (/ms) : backward (unbinding) rate 1/150
Erev = 0 (mV) : reversal potential
Prethresh = 0 : voltage level nec for release
Deadtime = 1 (ms) : mimimum time between release events
gmax = 0.001 (umho) : maximum conductance
vmin = -120 (mV)
vmax = 100 (mV)
}
ASSIGNED {
v (mV) : postsynaptic voltage
i (nA) : current = g*(v - Erev)
g (umho) : conductance
C (mM) : transmitter concentration
B : fraction free of Mg2+ block
R : fraction of open channels
R0 : open channels at start of release
R1 : open channels at end of release
Rinf : steady state channels open
Rtau (ms) : time constant of channel binding
pre : pointer to presynaptic variable
spk : flag for spk occuring
lastrelease (ms) : time of last spike
}
INITIAL {
initq() : ****
R = 0
C = 0
R0 = 0
R1 = 0
Rinf = Cmax*Alpha / (Cmax*Alpha + Beta)
Rtau = 1 / ((Alpha * Cmax) + Beta)
lastrelease = -9e9
rates(v)
}
BREAKPOINT {
rates(v)
SOLVE release
g = gmax * R * B
i = g*(v - Erev)
}
PROCEDURE release() { LOCAL q
:will crash if user hasn't set pre with the connect statement
if (! spk && pre > Prethresh) { : new spike occured?
spk = 1
pushq(t+delay) }
if (spk && pre < Prethresh) { : spike over?
spk = 0 }
q = ((t - lastrelease) - Cdur) : time since last release ended
: ready for another release?
if (q > Deadtime) {
if (t >= queu[head]) { : **** a current spike time
popq() : ****
C = Cmax : start new release
R0 = R
lastrelease = t
}
} else if (q < 0) { : still releasing?
if (t > queu[head]) { popq() } : **** throw away value from missed spikes
} else if (C == Cmax) { : in dead time after release
R1 = R
C = 0.
}
if (C > 0) { : transmitter being released?
R = Rinf + (R0 - Rinf) * exptable (- (t - lastrelease) / Rtau)
} else { : no release occuring
R = R1 * exptable (- Beta * (t - (lastrelease + Cdur)))
}
VERBATIM
return 0;
ENDVERBATIM
}
FUNCTION exptable(x) {
TABLE FROM -10 TO 10 WITH 2000
if ((x > -10) && (x < 10)) {
exptable = exp(x)
} else {
exptable = 0.
}
}
PROCEDURE rates(v(mV)) {
TABLE B
DEPEND mg
FROM vmin TO vmax WITH 200
: Stevens & Jahr 1990a,b
B = 1 / (1 + exp(0.062 (/mV) * -v) * (mg / 3.57 (mM)))
}