COMMENT
traub_nmda.mod
Traub-like NMDA synaptic current
This file is a merge of rampsyn.mod and expsyn.mod
The Traub et al 2005 paper contains a nmda synaptic current which
when activated has a linear ramp (in conductance) up to the conductance scale
over 5ms, then there is an exponential decay (in conductance).
Tom Morse, Michael Hines
ENDCOMMENT
NEURON {
POINT_PROCESS NMDA
RANGE tau, time_interval, e, i,weight, NMDA_saturation_fact, flag, g
NONSPECIFIC_CURRENT i
GLOBAL gfac
: for network debugging
USEION nmda1 WRITE inmda1 VALENCE 0
USEION nmda2 WRITE inmda2 VALENCE 0
RANGE srcgid, targid, comp, synid
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(uS) = (microsiemens)
(mM) = (milli/liter)
}
PARAMETER {
tau = 130.5 (ms) <1e-9,1e9> : NMDA conductance decay time constant
: default choice is tauNMDA_suppyrRS_to_suppyrRS=130.5e0, a sample tau from groucho.f
time_interval = 5 (ms) <1e-9,1e9>
e = 0 (mV)
weight = 2.5e-8 (uS) : example conductance scale from Traub 2005 et al
: gNMDA_suppyrRS_to_suppyrRS (double check units)
NMDA_saturation_fact= 80e0 (1) : this saturation factor is multiplied into
: the conductance scale, weight, for testing against the
: instantaneous conductance, to see if it should be limited.
: FORTRAN nmda subroutine constants and variables here end with underbar
A_ = 0 (1) : initialized with below in INITIAL, assigned in each integrate_celltype.f
BB1_ = 0 (1) : assigned in each integrate_celltype.f
BB2_ = 0 (1) : assigned in each integrate_celltype.f
Mg = 1.5 (mM) : a FORTRAN variable set in groucho.f
gfac = 1
}
ASSIGNED {
v (mV)
i (nA)
event_count (1) : counts number of syn events being processed
k (uS/ms) : slope of ramp or 0
g (uS)
A1_ (1)
A2_ (1)
B1_ (1)
B2_ (1)
Mg_unblocked (1)
inmda1 (nA)
inmda2 (nA)
srcgid
targid
comp
synid
}
STATE {
A (uS)
B (uS)
}
INITIAL {
A_ = exp(-2.847) : assigned in each integrate_celltype.f
BB1_ = exp(-.693) : assigned in each integrate_celltype.f
BB2_ = exp(-3.101) : assigned in each integrate_celltype.f
g = 0
A = 0
B = 0
k = 0
}
BREAKPOINT {
SOLVE state METHOD cnexp
g = A + B
if (g > NMDA_saturation_fact * weight) { g = NMDA_saturation_fact * weight }
g = g*Mg_unblocked*gfac
i = g*(v - e)
inmda1 = g
inmda2 = -g
}
DERIVATIVE state {
Mg_factor()
B' = -B/tau
A' = k
}
NET_RECEIVE(weight (uS)) {
if (flag>=1) {
: self event arrived, terminate ramp up
: remove one event's contribution to the slope, k
k = k - weight/time_interval
: Transfer the conductance over from A to B
B = B + weight
A = A - weight
} else {
: stimulus arrived, make or continue ramp
net_send(time_interval, 1) : self event to terminate ramp
: add one event ramp to slope k:
k = k + weight/time_interval
: note there are no state discontinuities at event start since the begining of a ramp
: only has a discontinuous change in derivative
}
}
: an NMDA subroutine converted from FORTRAN whose sole purpose was to compute the number
: of open nmda recpt channels due to relief from Mg block
PROCEDURE Mg_factor() {
UNITSOFF
A1_ = exp(-.016*v - 2.91)
A2_ = 1000.0 * Mg * exp (-.045 * v - 6.97)
B1_ = exp(.009*v + 1.22)
B2_ = exp(.017*v + 0.96)
UNITSON
Mg_unblocked = 1.0/(1.0 + (A1_+A2_)*(A1_*BB1_ + A2_*BB2_) /
(A_*A1_*(B1_+BB1_) + A_*A2_*(B2_+BB2_)) )
}