: ampa.mod
: saturating synapse model using discrete events
NEURON {
POINT_PROCESS AMPA_S
RANGE g, g_eff,g_specif,cellu_area
RANGE Cdur, Alpha, Beta, Erev, Rinf, Rtau
NONSPECIFIC_CURRENT i
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(uS) = (microsiemens)
(um) = (microns)
}
PARAMETER {
Cdur = 1.0 (ms) : transmitter duration (rising phase)
Alpha = 1.1 (/ms) : forward (binding) rate
Beta = 0.19 (/ms) : backward (dissociation) rate
Erev = 0 (mV) : equilibrium potential
g_specif = 1e5 (uS/um2) : conductance
cellu_area= 1 (um2)
g (uS)
}
ASSIGNED {
v (mV) : postsynaptic voltage
i (nA) : current = g*(v  Erev)
g_eff (uS) : conductance
Rtau (ms) : time constant of channel binding
Rinf : fraction of open channels if xmtr was present "forever"
synon : sum of weights of all synapses that are in the "onset" state
}
STATE { Ron Roff } : initialized to 0 by default
: Ron and Roff are the total conductances of all synapses
: that are in the "onset" (transmitter pulse ON)
: and "offset" (transmitter pulse OFF) states, respectively
INITIAL {
Rinf = Alpha / (Alpha + Beta)
Rtau = 1 / (Alpha + Beta)
synon = 0
g=g_specif*cellu_area
}
BREAKPOINT {
SOLVE release METHOD cnexp
g_eff = g*(Ron + Roff)
i = g_eff*(v  Erev)
}
DERIVATIVE release {
Ron' = (synon*Rinf  Ron)/Rtau
Roff' = Beta*Roff
}
NET_RECEIVE(weight, on, r0, t0 (ms)) {
: on == 1 if transmitter is present ("onset" state), otherwise 0
: flag is an implicit argument of NET_RECEIVE, normally 0
if (flag == 0) {
: a spike happened, so start onset state if not already in onset state
if (!on) {
: this synapse joins the set of synapses in the onset state
synon = synon + weight
r0 = r0*exp(Beta*(t  t0)) : r0 at start of onset state
:printf("r0aaa is %g\n", r0)
: r0 joins the "onset" conductance pool,
: which grows according to Ron' = ...
: and leaves the "offset" conductance pool,
: which decays according to Roff' = ...
Ron = Ron + r0
Roff = Roff  r0
t0 = t
on = 1
net_send(Cdur, 1)
} else {
: already in onset state, so move offset time
net_move(t+Cdur)
}
}
if (flag == 1) {
: "turn off transmitter"
: i.e. this synapse joins the set of synapses in the offset state
synon = synon  weight
: r0 at start of offset state
:printf("Ron and Roff are %g\t%g\n", Ron,Roff)
r0 = weight*Rinf + (r0  weight*Rinf)*exp((t  t0)/Rtau)
:printf("r0 is %g\n", r0)
: r0 leaves the "onset" conductance pool,
: and joins the "offset" conductance pool
Ron = Ron  r0
Roff = Roff + r0
t0 = t
on = 0
}
:printf("the conductance is %g\n",g_eff )
}
