NEURON {
:NOTE: since this is an interface, there is no POINT_PROCESS name
RANGE e, i, gmax, g
RANGE tau_r
RANGE tau_d
RANGE factor
RANGE tsyn,block
RANGE D,tau_stp,fD :for synaptic depression
RANGE tag
NONSPECIFIC_CURRENT i
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(uS) = (microsiemens)
}
PARAMETER {
e = 0 (mV)
tau_r = 0 (ms)
tau_d = 0 (ms)
tau_stp = 1000 (ms)
fD = 1 <0,1> :no depression
:fF = 1 <0,1> :no fascilitaiton by default
factor
gmax
tsyn
block = 0
tag = 0
}
ASSIGNED {
v (mV)
i (nA)
g (uS)
}
STATE {
A
B
D :simple mechanism for depression
}
FUNCTION get_factor(tau_fast,tau_slow){
LOCAL tp
tp = (tau_fast*tau_slow)/(tau_slow - tau_fast) * log(tau_slow/tau_fast)
get_factor = -exp(-tp/tau_fast) + exp(-tp/tau_slow)
get_factor = 1/get_factor
}
INITIAL {
:start fresh
A = 0
B = 0
g = 0
D = 1
tsyn = -1e80 :last time the synapse was active is very long ego
if(tau_r/tau_d>0.999){
tau_r = tau_d*0.999
}
if(!tau_r || !tau_d){
printf("User must set tau_r and tau_d (zero by default)")
}
factor = get_factor(tau_r,tau_d)
}
BREAKPOINT {
SOLVE state METHOD cnexp
g = gmax * (B - A) * (!block)
i = g*(v - e)
}
DERIVATIVE state {
A' = -A/tau_r
B' = -B/tau_d
D' = (1 - D)/tau_stp
}
PROCEDURE EPSP(w){
A = A + w*factor*D
B = B + w*factor*D
D = D*fD
:D = D + fF*(1-D) :for fascilitation .
tsyn = t
}