: STDP by Hines, modified by Michiel to implement additive STDP as in Song et al 2000
NEURON {
POINT_PROCESS ExpSynCaSTDP
RANGE tau, e, i, dd, dp, dtau, ptau, thresh, ca_thresh, wmax, wmin, D, cai
NONSPECIFIC_CURRENT i
USEION ca READ cai
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(uS) = (microsiemens)
}
PARAMETER {
tau = 3 (ms) <1e-9,1e9>
e = 0 (mV)
dd = 0.001 <0,1> : depression factor (relative!)
dp = 0.00106 : potentiation factor (relative!)
dtau = 20 (ms) : depression effectiveness time constant
ptau = 20 (ms) : Bi & Poo (1998, 2001)
thresh = -20 (mV) : postsynaptic voltage threshold
ca_thresh = 0.5 (mM) : postsynaptic calcium threshold
wmax = 0.001 (uS)
wmin = 0 (uS)
}
ASSIGNED {
v (mV)
cai (mM)
i (nA)
D
tpost (ms)
}
STATE {
g (uS)
}
INITIAL {
g = 0
D = 0
tpost = -1e9
net_send(0, 1)
}
BREAKPOINT {
SOLVE state METHOD cnexp
i = g*(v - e)
}
DERIVATIVE state {
g' = -g/tau
}
NET_RECEIVE(w (uS), P, tpre (ms), wsyn) {
INITIAL { P = 0 tpre = -1e9 wsyn = w}
if (flag == 0) { : presynaptic spike (after last post so depress)
printf("entryca flag=%g t=%g w=%g A=%g tpre=%g tpost=%g g=%g ca=%g ca_thresh=%g\n", flag, t, w, P, tpre, tpost,g,cai,ca_thresh)
printf("wsynca=%g\n", wsyn)
g = g + wsyn
P = P*exp((tpre-t)/ptau) + dp
tpre = t
wsyn = wsyn + wmax * D * exp((tpost-t)/dtau) : interval is negative
if (wsyn < wmin) { wsyn = wmin }
}else if (flag == 2) { : postsynaptic spike
printf("entryca flag=%g t=%g tpost=%g ca=%g\n", flag, t, tpost,cai)
FOR_NETCONS(w1, P1, tpre1, wsyn1) {
:D1 = D1*exp((tpost-t)/dtau) - dd
wsyn1 = wsyn1 + wmax * P1 * exp(-(t - tpre1)/ptau) : interval is positive
if (wsyn1 > wmax) { wsyn1 = wmax }
}
D = D*exp((tpost-t)/dtau) - dd
:wsyn = 0
:wsyn = wsyn + wmax * P * exp(-(t - tpre)/ptau)
:if (wsyn > wmax) { wsyn = wmax }
tpost = t
} else { : flag == 1 from INITIAL block
printf("entryca flag=%g t=%g ca=%g\n", flag, t,cai)
WATCH (cai > ca_thresh) 2
}
}