How to implement short term depression in AMPA/NMDA synapses
Posted: Wed Jul 10, 2013 8:34 am
Hi all,
I want to implement the short term depression mechanism described in
Tsodyks M, Pawelzik K, Markram H (1998) Neural networks with dynamic synapses. Neural Comput 10:821-35
https://senselab.med.yale.edu/modeldb/s ... model=3815
Here is the mod file
I was thinking to add that plasticity mechanism in the synaptic mechanisms I already have an AMPA and an NMDA in the NET RECEIVE block. Here is the AMPA mod file (the NMDA is almost the same with an Mg block).
So, I thought that the x, y, z parameters of Tsodyks code correspond to the r0, Ron, Roff of the ampa code and I tried to change the ampa mod file according to that, but the results I got were far from what I was expecting.. Probably I haven't understood correctly these codes.
Any hints on how I can implement that?
Thanks
maria
I want to implement the short term depression mechanism described in
Tsodyks M, Pawelzik K, Markram H (1998) Neural networks with dynamic synapses. Neural Comput 10:821-35
https://senselab.med.yale.edu/modeldb/s ... model=3815
Here is the mod file
Code: Select all
COMMENT
Revised 12/15/2000 in light of a personal communication
from Misha Tsodyks that u is incremented _before_ x is
converted to y--a point that was not clear in the paper.
If u is incremented _after_ x is converted to y, then
the first synaptic activation after a long interval of
silence will produce smaller and smaller postsynaptic
effect as the length of the silent interval increases,
eventually becoming vanishingly small.
Implementation of a model of short-term facilitation and depression
based on the kinetics described in
Tsodyks et al.
Synchrony generation in recurrent networks
with frequency-dependent synapses
Journal of Neuroscience 20:RC50:1-5, 2000.
Their mechanism represented synapses as current sources.
The mechanism implemented here uses a conductance change instead.
The basic scheme is
x -------> y Instantaneous, spike triggered.
Increment is u*x (see discussion of u below).
x == fraction of "synaptic resources" that have
"recovered" (fraction of xmtr pool that is
ready for release, or fraction of postsynaptic
channels that are ready to be opened, or some
joint function of these two factors)
y == fraction of "synaptic resources" that are in the
"active state." This is proportional to the
number of channels that are open, or the
fraction of max synaptic current that is
being delivered.
tau_1
y -------> z z == fraction of "synaptic resources" that are
in the "inactive state"
tau_rec
z -------> x
where x + y + z = 1
The active state y is multiplied by a synaptic weight to compute
the actual synaptic conductance (or current, in the original form
of the model).
In addition, there is a "facilition" term u that
governs the fraction of x that is converted to y
on each synaptic activation.
-------> u Instantaneous, spike triggered,
happens _BEFORE_ x is converted to y.
Increment is U*(1-u) where U and u both
lie in the range 0 - 1.
tau_facil
u -------> decay of facilitation
This implementation for NEURON offers the user a parameter
u0 that has a default value of 0 but can be used to specify
a nonzero initial value for u.
When tau_facil = 0, u is supposed to equal U.
Note that the synaptic conductance in this mechanism
has the same kinetics as y, i.e. decays with time
constant tau_1.
This mechanism can receive multiple streams of
synaptic input via NetCon objects.
Each stream keeps track of its own
weight and activation history.
The printf() statements are for testing purposes only.
ENDCOMMENT
NEURON {
POINT_PROCESS tmgsyn
RANGE e, i
RANGE tau_1, tau_rec, tau_facil, U, u0
NONSPECIFIC_CURRENT i
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(umho) = (micromho)
}
PARAMETER {
: e = -90 mV for inhibitory synapses,
: 0 mV for excitatory
e = -90 (mV)
: tau_1 was the same for inhibitory and excitatory synapses
: in the models used by T et al.
tau_1 = 3 (ms) < 1e-9, 1e9 >
: tau_rec = 100 ms for inhibitory synapses,
: 800 ms for excitatory
tau_rec = 100 (ms) < 1e-9, 1e9 >
: tau_facil = 1000 ms for inhibitory synapses,
: 0 ms for excitatory
tau_facil = 1000 (ms) < 0, 1e9 >
: U = 0.04 for inhibitory synapses,
: 0.5 for excitatory
: the (1) is needed for the < 0, 1 > to be effective
: in limiting the values of U and u0
U = 0.04 (1) < 0, 1 >
: initial value for the "facilitation variable"
u0 = 0 (1) < 0, 1 >
}
ASSIGNED {
v (mV)
i (nA)
x
}
STATE {
g (umho)
}
INITIAL {
g=0
}
BREAKPOINT {
SOLVE state METHOD cnexp
i = g*(v - e)
}
DERIVATIVE state {
g' = -g/tau_1
}
NET_RECEIVE(weight (umho), y, z, u, tsyn (ms)) {
INITIAL {
: these are in NET_RECEIVE to be per-stream
y = 0
z = 0
: u = 0
u = u0
tsyn = t
: this header will appear once per stream
: printf("t\t t-tsyn\t y\t z\t u\t newu\t g\t dg\t newg\t newy\n")
}
: first calculate z at event-
: based on prior y and z
z = z*exp(-(t - tsyn)/tau_rec)
z = z + ( y*(exp(-(t - tsyn)/tau_1) - exp(-(t - tsyn)/tau_rec)) / ((tau_1/tau_rec)-1) )
: now calc y at event-
y = y*exp(-(t - tsyn)/tau_1)
x = 1-y-z
: calc u at event--
if (tau_facil > 0) {
u = u*exp(-(t - tsyn)/tau_facil)
} else {
u = U
}
: printf("%g\t%g\t%g\t%g\t%g", t, t-tsyn, y, z, u)
if (tau_facil > 0) {
state_discontinuity(u, u + U*(1-u))
}
: printf("\t%g\t%g\t%g", u, g, weight*x*u)
state_discontinuity(g, g + weight*x*u)
state_discontinuity(y, y + x*u)
tsyn = t
: printf("\t%g\t%g\n", g, y)
}
Code: Select all
: AMPA mod
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
:(umho) = (micromho)
(pS) = (picosiemens)
}
NEURON {
POINT_PROCESS AMPA_S
NONSPECIFIC_CURRENT i
RANGE g, gmax, i
GLOBAL Cdur, Alpha, Beta, Erev, Rinf, Rtau
}
PARAMETER {
Cdur = 0.05 (ms) :1.0 (ms) :rising phase-transmitter duration
Alpha = 0.2(/ms) :1.1 (/ms)
Beta = 0.4(/ms) :0.19 (/ms)
Erev = 0 (mV)
gmax = 30(pS) :700(pS) :10e4 (pS)
}
ASSIGNED {
v (mV)
i (nA)
g (pS)
Rtau (ms) : time const of channel binding
Rinf : fraction of open channels at steady state
synon : sum of weights of all synapses in the "onset" state
}
STATE {
Ron Roff :total conductances of all synapses
}
INITIAL {
synon = 0
Rtau = 1 / (Alpha + Beta)
Rinf = Alpha / (Alpha + Beta)
}
BREAKPOINT {
SOLVE release METHOD cnexp
g = (Ron + Roff)*gmax
i = g*(v - Erev)
}
DERIVATIVE release {
Ron' = (synon*Rinf - Ron)/Rtau
Roff' = -Beta*Roff
}
NET_RECEIVE(weight, on, r0, t0 (ms)) {
if (flag == 0) {
:a spike arrived, start onset state if not already on
if (!on) {
synon = synon + weight
r0 = r0*exp(-Beta*(t-t0))
Ron = Ron + r0
Roff = Roff - r0
t0 = t
on = 1
net_send(Cdur, 1)
} else {
net_move(t + Cdur)
}
}
if (flag == 1) {
synon = synon - weight
r0 = weight*Rinf + (r0-weight*Rinf)*exp(-(t-t0)/Rtau)
Ron = Ron - r0
Roff = Roff + r0
t0 = t
on = 0
}
}
Any hints on how I can implement that?
Thanks
maria