NEURON {
POINT_PROCESS AMPANMDASynPlast
USEION na WRITE ina
USEION ca WRITE ica
: Parameters
RANGE gAMPAbar, e, AMPA_tau1, AMPA_tau2, gNMDAbar, gNR2Abar, gNR2Bbar
RANGE eNa, eCa
RANGE mg
RANGE Alpha_nr2a, Alpha_nr2b, Beta_nr2a, Beta_nr2b
RANGE v_thresh1, v_thresh2, v_trace1_thresh2, v_trace1_tau, v_trace2_tau
RANGE A_ltp, A_ltd
RANGE wmax, wmin
RANGE hill_coef_ltp, hill_coef_ltd, hill_midpoint_ltp, hill_midpoint_ltp2, hill_midpoint_ltd
: AMPA
RANGE g_ampa, i_ampa, Cmax, Alpha_ampa, Beta_ampa
: NMDA
RANGE g_nr2a, g_nr2b, g_nmda, i_nmda, g_nr2a_base, g_nr2b_base, g_nmda_base
RANGE g_nmda_LTP, g_nmda_LTD
: SynPlast
RANGE g_nmda_trace_ltp_tau, g_nmda_trace_ltd_tau, X_trace_tau
RANGE g_nmda_trace_ltp, g_nmda_trace_ltd, X_trace, X, X_max
RANGE v_threshed1, v_threshed2
RANGE ltp_part, ltd_part, ltp_mult, ltd_mult, w_change, ltp_nr2a_part, ltp_nr2b_part
RANGE v_trace1_threshed1, v_trace2_threshed2
RANGE w_ltp, w_ltd, weight, hilleq_ltp, hilleq_ltp2, hilleq_ltd
RANGE hill_nmda_ltd, hill_nmda_ltp
RANGE moving_threshold_hill_ltd_multiplier, moving_threshold_hill_ltd_tau, moving_threshold_hill_ltd
RANGE moving_threshold_hill_ltp_multiplier, moving_threshold_hill_ltp_tau, moving_threshold_hill_ltp
RANGE moving_threshold_hill_ltp2_multiplier, moving_threshold_hill_ltp2_tau, moving_threshold_hill_ltp2
RANGE nmda_thresh, nmda_threshed
RANGE g_nmda_LTP, g_nmda_LTD
: Misc
: Debug
GLOBAL Cdur, Rinf_nr2a, Rinf_nr2b, Rtau_nr2a, Rtau_nr2b
NONSPECIFIC_CURRENT i
}
UNITS {
(mA) = (milliamp)
(nA) = (nanoamp)
(mV) = (millivolt)
(uS) = (microsiemens)
(nS) = (nanosiemens)
(umho) = (micromho)
(mM) = (milli/liter)
}
PARAMETER {
: ----------------------------------- AMPA
gAMPAbar = 1 (uS)
: - Current
e = 0 (mV)
: - Conductance
AMPA_tau1 = .1 (ms) <1e-9,1e9>
AMPA_tau2 = 10 (ms) <1e-9,1e9>
: ----------------------------------- Destexhe AMPA
Alpha_ampa = 1.1 (/ms) : forward (binding) rate
Beta_ampa = 0.19 (/ms) : backward (unbinding) rate
Cmax = 1
: ----------------------------------- NMDA
gNMDAbar = 1 (uS)
gNR2Abar = 1 (uS)
gNR2Bbar = 1 (uS)
: - Current
e_nmda = 0 (mV)
: - Conductance
mg = 1 (mM) : external magnesium concentration
Cdur = 1 (ms) : transmitter duration (rising phase)
Alpha_nr2a = 0.35 (/ms) : forward (binding) rate
Alpha_nr2b = 0.35 (/ms) : forward (binding) rate
Beta_nr2a = 0.015 (/ms) : backward (unbinding) rate
Beta_nr2b = 0.015 (/ms) : backward (unbinding) rate
: ----------------------------------- SynPlast
v_thresh1 = -25.0 (mV)
v_thresh2 = -58.0 (mV)
v_trace1_thresh2 = 0.1
v_trace1_tau = 200 (ms)
v_trace2_tau = 40 (ms)
g_nmda_trace_ltp_tau = 50 (ms)
g_nmda_trace_ltd_tau = 50 (ms)
X_trace_tau = 2 (ms)
X_max = 1
A_ltp = 5.0e-2
A_ltd = 1.0e-4
wmax = 2
wmin = 0
nmda_thresh = 0.01 (uS)
: ----------------------------------- Misc
hill_coef_ltp = 4
hill_midpoint_ltp = 0.2
hill_midpoint_ltp2 = 0.2
hill_coef_ltd = 2
hill_midpoint_ltd = 0.8
moving_threshold_hill_ltd_multiplier = 1.0
moving_threshold_hill_ltd_tau = 10.0 (ms)
moving_threshold_hill_ltp_multiplier = 1.0
moving_threshold_hill_ltp_tau = 10.0 (ms)
moving_threshold_hill_ltp2_multiplier = 1.0
moving_threshold_hill_ltp2_tau = 10.0 (ms)
: ----------------------------------- Debug
}
ASSIGNED {
: AMPA
i_ampa (nA)
: factor
g_ampa (uS)
: Destexhe AMPA
synon_ampa
Rinf_ampa
Rtau_ampa (ms)
: NMDA
i_nmda (nA)
Rinf_nr2a : steady state channels open
Rinf_nr2b : steady state channels open
Rtau_nr2a (ms) : time constant of channel binding
Rtau_nr2b (ms) : time constant of channel binding
synon
mg_mult
g_nr2a (uS)
g_nr2b (uS)
g_nr2a_base_wbar
g_nr2b_base_wbar
g_nr2a_base
g_nr2b_base
g_nmda (uS)
g_nmda_base (uS)
g_nmda_LTP (uS)
g_nmda_LTD (uS)
ina (nA) : (mA/cm2) : Na current density
ica (nA) : (mA/cm2) : Ca current density
: SynPlast
v_threshed1 (mV)
v_threshed2 (mV)
hilleq_ltp
hilleq_ltp2
hilleq_ltd
hill_nmda_ltp (uS)
hill_nmda_ltd (uS)
ltp_nr2a_part
ltp_nr2b_part
ltp_part
ltd_part
ltp_mult
ltd_mult
w_change
X
: Misc
v (mV)
i (nA)
: Debug
}
STATE {
: AMPA
A (uS)
B (uS)
: Destexhe AMPA
Ron_ampa
Roff_ampa
: NMDA
Ron_nr2a
Ron_nr2b
Roff_nr2a
Roff_nr2b
: SynPlast
v_trace1_threshed1 (mV)
v_trace2_threshed2 (mV)
g_nmda_trace_ltp (uS)
g_nmda_trace_ltd (uS)
X_trace
moving_threshold_hill_ltd
moving_threshold_hill_ltp
moving_threshold_hill_ltp2
nmda_threshed (uS)
w_ltp
w_ltd
weight
: Misc
: Debug
}
INITIAL {
LOCAL tp
: AMPA
Rinf_ampa = Alpha_ampa / (Alpha_ampa + Beta_ampa)
Rtau_ampa = 1 / (Alpha_ampa + Beta_ampa)
Ron_ampa = 0
Roff_ampa = 0
synon_ampa = 0
: NMDA
Rinf_nr2a = Alpha_nr2a / (Alpha_nr2a + Beta_nr2a)
Rinf_nr2b = Alpha_nr2b / (Alpha_nr2b + Beta_nr2b)
Rtau_nr2a = 1 / (Alpha_nr2a + Beta_nr2a)
Rtau_nr2b = 1 / (Alpha_nr2b + Beta_nr2b)
Ron_nr2a = 0
Ron_nr2b = 0
Roff_nr2a = 0
Roff_nr2b = 0
synon = 0
: SynPlast
v_trace1_threshed1 = 0
v_trace2_threshed2 = 0
nmda_threshed = 0
w_ltp = 0
w_ltd = 0
v_threshed1 = 0
v_threshed2 = 0
g_nmda_trace_ltp = 0
g_nmda_trace_ltd = 0
X_trace = 0
moving_threshold_hill_ltd = 0
moving_threshold_hill_ltp = 0
moving_threshold_hill_ltp2 = 0
hilleq_ltp = 0
hilleq_ltp2 = 0
hilleq_ltd = 0
hill_nmda_ltp = 0
hill_nmda_ltd = 0
ltp_nr2a_part = 0
ltp_nr2b_part = 0
ltp_part = 0
ltd_part = 0
ltp_mult = 0
ltd_mult = 0
w_change = 0
weight = 1
X = 0
: Misc
: Debug
}
BREAKPOINT {
SOLVE state METHOD cnexp
if (weight < 0) {
weight = 0
}
: Conductance
g_ampa = (Ron_ampa + Roff_ampa) * gAMPAbar * weight
: - NMDA
mg_mult = mgblock(v)
g_nr2a_base = mg_mult*(Ron_nr2a + Roff_nr2a)
g_nr2b_base = mg_mult*(Ron_nr2b + Roff_nr2b)
g_nr2a_base_wbar = g_nr2a_base * gNR2Abar
g_nr2b_base_wbar = g_nr2b_base * gNR2Bbar
g_nr2a = g_nr2a_base * gNMDAbar
g_nr2b = g_nr2b_base * gNMDAbar
g_nmda_base = (g_nr2a_base_wbar + g_nr2b_base_wbar)
g_nmda = g_nmda_base * gNMDAbar
g_nmda_LTP = (0.2 * g_nr2a_base_wbar + 0.8 * g_nr2b_base_wbar)
g_nmda_LTD = (0.8 * g_nr2a_base_wbar + 0.2 * g_nr2b_base_wbar)
: Current
: - NMDA
ina = 0.94 * g_nmda * (v - e_nmda) : current in mA/cm2
ica = 0.06 * g_nmda * (v - e_nmda) : current in mA/cm2
if (v>=e_nmda) {
ica = 0
}
i_ampa = g_ampa * (v - e)
i_nmda = (ina + ica)
i = i_ampa + i_nmda
}
DERIVATIVE state {
: AMPA
Ron_ampa' = (synon_ampa * Rinf_ampa - Ron_ampa) / Rtau_ampa
Roff_ampa' = -Beta_ampa * Roff_ampa
: NMDA
Ron_nr2a' = (synon*Rinf_nr2a - Ron_nr2a)/Rtau_nr2a
Ron_nr2b' = (synon*Rinf_nr2b - Ron_nr2b)/Rtau_nr2b
Roff_nr2a' = -Beta_nr2a*Roff_nr2a
Roff_nr2b' = -Beta_nr2b*Roff_nr2b
: Plasticity
: - Vmem LTP
v_threshed1 = v - v_thresh1
if (v_threshed1 < 0) {
v_threshed1 = 0
}
v_trace1_threshed1' = (v_threshed1 - v_trace1_threshed1) / v_trace1_tau
: - Vmem LTD
v_threshed2 = v - v_thresh2
if (v_threshed2 < 0) {
v_threshed2 = 0
}
v_trace2_threshed2' = (v_threshed2 - v_trace2_threshed2) / v_trace2_tau
: - NMDA
nmda_threshed = g_nmda_base - nmda_thresh
if (nmda_threshed < 0) {
nmda_threshed = 0
}
g_nmda_trace_ltp' = (g_nmda_LTP - g_nmda_trace_ltp) / g_nmda_trace_ltp_tau
g_nmda_trace_ltd' = (g_nmda_LTD - g_nmda_trace_ltd) / g_nmda_trace_ltd_tau
: - Dirac
X_trace' = (X - X_trace) / X_trace_tau
: - Hill LTP
hill_nmda_ltp = (g_nmda_trace_ltp ^ hill_coef_ltp)
hilleq_ltp = hill_nmda_ltp / ((hill_midpoint_ltp) ^ hill_coef_ltp + hill_nmda_ltp) - hill_nmda_ltp / ((hill_midpoint_ltp2) ^ hill_coef_ltp + hill_nmda_ltp) - moving_threshold_hill_ltp
if (hilleq_ltp < 0) {
hilleq_ltp = 0
}
hilleq_ltp2 = hill_nmda_ltp / ((hill_midpoint_ltp2) ^ hill_coef_ltp + hill_nmda_ltp) - moving_threshold_hill_ltp
if (hilleq_ltp2 < 0) {
hilleq_ltp2 = 0
}
: - Hill LTD
hill_nmda_ltd = (g_nmda_trace_ltd ^ hill_coef_ltd)
hilleq_ltd = hill_nmda_ltd / ((hill_midpoint_ltd) ^ hill_coef_ltd + hill_nmda_ltd) - moving_threshold_hill_ltd
if (hilleq_ltd < 0) {
hilleq_ltd = 0
}
: - Moving Threshold Hill
moving_threshold_hill_ltp' = (hilleq_ltd * moving_threshold_hill_ltp_multiplier - moving_threshold_hill_ltp) / moving_threshold_hill_ltp_tau
moving_threshold_hill_ltp2' = (hilleq_ltp2 * moving_threshold_hill_ltp2_multiplier - moving_threshold_hill_ltp2) / moving_threshold_hill_ltp2_tau
moving_threshold_hill_ltd' = (hilleq_ltp * moving_threshold_hill_ltd_multiplier - moving_threshold_hill_ltd) / moving_threshold_hill_ltd_tau
: - Both
ltp_part = A_ltp * hilleq_ltp * v_trace1_threshed1
ltd_part = A_ltd * hilleq_ltd * X_trace * v_trace2_threshed2
ltp_mult = (wmax - weight)
ltd_mult = (weight - wmin)
w_change = (ltp_part * ltp_mult - ltd_part * ltd_mult)
w_ltp = ltp_part * ltp_mult
w_ltd = ltd_part * ltd_mult
weight' = w_change
}
NET_RECEIVE(w, on, nspike, r0_nr2a, r0_nr2b, r0_ampa, t0 (ms)) {
LOCAL weight_ampa
weight_ampa = w * 0.1
: NMDA:
: flag is an implicit argument of NET_RECEIVE and normally 0
if (flag == 0) { : a spike, so turn on if not already in a Cdur pulse
nspike = nspike + 1
X = X_max
if (!on) {
: AMPA
r0_ampa = r0_ampa*exp(-Beta_ampa*(t - t0))
Ron_ampa = Ron_ampa + r0_ampa
Roff_ampa = Roff_ampa - r0_ampa
synon_ampa = synon_ampa + weight_ampa
: NMDA
r0_nr2a = r0_nr2a*exp(-Beta_nr2a*(t - t0))
r0_nr2b = r0_nr2b*exp(-Beta_nr2b*(t - t0))
on = 1
t0 = t
synon = synon + w
Ron_nr2a = Ron_nr2a + r0_nr2a
Roff_nr2a = Roff_nr2a - r0_nr2a
Ron_nr2b = Ron_nr2b + r0_nr2b
Roff_nr2b = Roff_nr2b - r0_nr2b
}
: come again in Cdur with flag = current value of nspike
net_send(Cdur, nspike)
}
if (flag == nspike) { : if this associated with last spike then turn off
: AMPA
r0_ampa = weight_ampa*Rinf_ampa + (r0_ampa - weight_ampa*Rinf_ampa)*exp(-(t - t0)/Rtau_ampa)
Ron_ampa = Ron_ampa - r0_ampa
Roff_ampa = Roff_ampa + r0_ampa
synon_ampa = synon_ampa - weight_ampa
: NMDA
r0_nr2a = w*Rinf_nr2a + (r0_nr2a - w*Rinf_nr2a)*exp(-(t - t0)/Rtau_nr2a)
r0_nr2b = w*Rinf_nr2b + (r0_nr2b - w*Rinf_nr2b)*exp(-(t - t0)/Rtau_nr2b)
synon = synon - w
Ron_nr2a = Ron_nr2a - r0_nr2a
Ron_nr2b = Ron_nr2b - r0_nr2b
Roff_nr2a = Roff_nr2a + r0_nr2a
Roff_nr2b = Roff_nr2b + r0_nr2b
t0 = t
on = 0
X = 0
}
}
FUNCTION mgblock(v(mV)) {
TABLE
DEPEND mg
FROM -140 TO 80 WITH 1000
: from Jahr & Stevens
mgblock = 1 / (1 + exp(0.062 (/mV) * -v) * (mg / 3.57 (mM)))
}