NEURON {
: THREADSAFE
POINT_PROCESS FluctExp2Syn
RANGE tau_rise, tau_fall, cn, mean_amp, cv, type, e, i, s, g, std, std0, pf, plas, tau_plas
RANGE seed, flag_print
NONSPECIFIC_CURRENT i
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(uS) = (microsiemens)
}
PARAMETER {
tau_rise = 1.0 (ms) <1e-9,1e9>
tau_fall = 2.0 (ms) <1e-9,1e9>
cn = 4 : (tau_rise/tau_fall)^[-tau_fall/(tau_fall-tau_rise)]
mean_amp = 0.001
cv = 0.0
type = 1
e=0 (mV)
std0 = 1.0
pf = 0.0
plas = 0.75
tau_plas = 120.0
seed = 12
flag_print = 0
}
ASSIGNED {
v (mV)
i (nA)
}
STATE {
s (uS)
g (uS)
std
}
INITIAL {
s = 0
g = 0
std = std0
set_seed(seed)
}
BREAKPOINT {
SOLVE state METHOD cnexp
: obtaining current, whether it is excitatory (default), denoted by type = 1 (exc), or inhibitory, denoted by type = -1
if (type == -1) { : inhibitory
i = -g : current positive (g is negative according to the incoming weights in NET_RECIVE
} else {
i = g * (v-e) / 70 : current negative
}
}
DERIVATIVE state {
s' = -s/tau_rise
g' = (cn*s-g)/tau_fall
std' = -(std-1.0)/tau_plas
}
NET_RECEIVE(w (uS)) {
LOCAL ww, pfail, prob
: w should be equal to mean_amp
: stochastic amplitude
ww = fabs(w*(1+cv*normrand(0,1)))
: clipping response
if (ww > 3*fabs(w)){
ww = 3*fabs(w)
}
: add sign
if (w<0) {
ww = -ww
}
: Includes short-term plasticity
ww = std * ww
: failure of transmission
pfail = pf / std
:scop_random uniform between 0 and 1
prob = scop_random()
if (prob >= pfail) {
s = s + ww : update conductance
std = std * plas : update short-term dynamics
: clipping
if (std >= 5) {
std = 5
}
if (std <= 0.4) {
std = 0.4
}
}
}
COMMENT
with printing options (to check everything is going fine)
NET_RECEIVE(w (uS)) {
LOCAL ww, pfail, prob
: w should be equal to mean_amp
if (flag_print == 1){
VERBATIM
printf("Mean amplitude: %g - ", mean_amp);
ENDVERBATIM
}
: stochastic amplitude
ww = fabs(w*(1+cv*normrand(0,1)))
: clipping response
if (ww > 3*fabs(w)){
ww = 3*fabs(w)
}
: add sign
if (w<0) {
ww = -ww
}
if (flag_print == 1){
VERBATIM
printf("Instantiated Amplitude: %g -> ", _lww);
ENDVERBATIM
}
: Includes short-term plasticity
ww = std * ww
if (flag_print == 1){
VERBATIM
printf("Potentiated: %g\n", _lww);
ENDVERBATIM
}
: failure of transmission
pfail = pf / std
:scop_random uniform between 0 and 1
prob = scop_random()
if (flag_print == 1){
VERBATIM
printf(" Failure probability: %g (prob: %g)\n", _lpfail, _lprob);
printf(" Conductance before (putative) event: %g\n", s);
ENDVERBATIM
}
if (prob >= pfail) {
s = s + ww : update conductance
if (flag_print == 1){
VERBATIM
printf(" Event transmitted\n");
printf(" STD Plasticity before: %g\n", std);
ENDVERBATIM
}
std = std * plas : update short-term dynamics
: clipping
if (std >= 5) {
std = 5
}
if (std <= 0.4) {
std = 0.4
}
if (flag_print == 1){
VERBATIM
printf(" STD Plasticity after: %g\n", std);
ENDVERBATIM
}
} else {
if (flag_print == 1){
VERBATIM
printf(" Event not transmitted\n");
ENDVERBATIM
}
}
if (flag_print == 1){
VERBATIM
printf(" Conductance after (putative) event: %g\n", s);
ENDVERBATIM
}
}
ENDCOMMENT