COMMENT
Implementation of the model of short-term facilitation and depression described in
Varela, J.A., Sen, K., Gibson, J., Fost, J., Abbott, L.R., and Nelson, S.B.
A quantitative description of short-term plasticity at excitatory synapses
in layer 2/3 of rat primary visual cortex
Journal of Neuroscience 17:7926-7940, 1997
This is an "integrate and fire" cell that can receive multiple streams of
synaptic input via NetCon objects. Each stream keeps track of its own
weight and activation history.
An input that occurs when the cell is not refractory causes an immediate
increment of activation by an amount equal to the product of the intrinsic
synaptic weight and the facilitation and depression terms. The latter are
functions of the time that has elapsed since the most recent prior event.
The effect of synaptic input on the facilitation and depression terms is
computed _after_ the activation is incremented.
An input that occurs when the cell is refractory does nothing to the activation
but does affect facilitation and depression.
The printf() statements are for testing purposes only.
Added FUNCTION yy() to allow smooth plot of "activation"
and FUNCTIONs Fval(), D1val(), and D2val() to allow plots of
F, D1, and D2 vs. t
20110810 Changed POINT_PROCESS to ARTIFICIAL_CELL,
to be consistent with best practices in recent versions of NEURON.
ENDCOMMENT
NEURON {
: POINT_PROCESS FDSIntFire
ARTIFICIAL_CELL FDSIntFire
RANGE tau, y, spikedur, refrac, f, tau_F, d1, tau_D1, d2, tau_D2
: y plays the role of voltage
}
PARAMETER {
tau = 10 (ms) < 1e-9, 1e9 >
spikedur = 1 (ms) < 0, 1e9 >
refrac = 5 (ms) < 0, 1e9 >
: these values are from Fig.3 in Varela et al. 1997
: the (1) is needed for the range limits to be effective
f = 0.917 (1) < 0, 1e9 > : facilitation
tau_F = 94 (ms) < 1e-9, 1e9 >
d1 = 0.416 (1) < 0, 1 > : fast depression
tau_D1 = 380 (ms) < 1e-9, 1e9 >
d2 = 0.975 (1) < 0, 1 > : slow depression
tau_D2 = 9200 (ms) < 1e-9, 1e9 >
}
ASSIGNED {
y
t0 (ms)
refractory
}
INITIAL {
y = 0
t0 = t
refractory = 0 : 0-integrates input, 1-spiking, 2-refractory
}
FUNCTION yy() {
yy = y*exp(-(t - t0)/tau)
}
FUNCTION Fval(F, time) {
Fval = 1 + (F-1)*exp(-time/tau_F)
}
FUNCTION D1val(D1, time) {
D1val = 1 - (1-D1)*exp(-time/tau_D1)
}
FUNCTION D2val(D2, time) {
D2val = 1 - (1-D2)*exp(-time/tau_D2)
}
NET_RECEIVE (w, F, D1, D2, tsyn (ms)) {
INITIAL {
: these are in NET_RECEIVE to be per-stream
F = 1
D1 = 1
D2 = 1
tsyn = t
: this header will appear once per stream
: printf("t\t t-tsyn\t F\t D1\t D2\t amp\t newF\t newD1\t newD2\n")
}
if (flag == 0) {
: calculate present facilitation & depression of the active input
: from the values they had the last time the input was active
: F = 1 + (F-1)*exp(-(t - tsyn)/tau_F)
: D1 = 1 - (1-D1)*exp(-(t - tsyn)/tau_D1)
: D2 = 1 - (1-D2)*exp(-(t - tsyn)/tau_D2)
F = Fval(F, t-tsyn)
D1 = D1val(D1, t-tsyn)
D2 = D2val(D2, t-tsyn)
: printf("%g\t%g\t%g\t%g\t%g\t%g", t, t-tsyn, F, D1, D2, w*F*D1*D2)
tsyn = t
}
if (refractory == 0) { : inputs affect activation only when excitable
: y = y*exp(-(t - t0)/tau)
y = yy()
y = y + w*F*D1*D2
t0 = t
if (y > 1) {
refractory = 1
y = 2
net_send(spikedur, refractory)
net_event(t)
}
} else if (flag == 1) { : don't really need this.
: this extra event just makes the spike narrow
refractory = 2
y = -1
net_send(refrac, refractory)
} else if (flag == 2) { : ready to integrate again
refractory = 0
y = 0
}
if (flag == 0) {
: add facil and depr produced by the active input
F = F + f
D1 = D1 * d1
D2 = D2 * d2
: printf("\t%g\t%g\t%g\n", F, D1, D2)
}
}