# Simulation of tripartite synapse model
# Tiina Manninen and Ausra Saudargiene
# Reference: Tiina Manninen, Ausra Saudargiene, and Marja-Leena Linne. Astrocyte-mediated spike-timing-dependent
# long-term depression modulates synaptic properties in the developing cortex. PLoS Comput Biol, 2020.
# -----------------------------------------------------------------------
from math import exp
# Presynaptic neuron model includes the model components in the presynaptic neuron only.
class Pre:
__DEFAULT_INITIAL_VALUES = {
"Ca_CaNHVA_pre": 0.082523, # uM; Presynaptic Ca_NHVA-mediated Ca concentration
"Ca_NMDAR_pre": 0.05, # uM; Presynaptic NMDAR-mediated Ca concentration
"CaN_pre": 0.00012499, # uM; Presynaptic CaN concentration
"h_CaNHVA_pre": 0.91675, # 1; Gating variable for presynaptic Ca_NHVA inactivation
"h_Na_pre": 0.99976, # 1; Gating variable for presynaptic Na inactivation
"m_CaNHVA_pre": 0.006381, # 1; Gating variable for presynaptic Ca_NHVA activation
"m_Na_pre": 4.5445e-5, # 1; Gating variable for presynaptic Na activation
"n_K_pre": 4.5445e-5, # 1; Gating variable for presynaptic K activation
"n_K2_pre": 4.5445e-5, # 1; Gating variable for presynaptic K activation
"Prel_pre": 0, # 1; Release probability of presynaptic Glu vesicles
"R_pre": 0, # 1; Fraction of presynaptic NMDARs in closed state
"RA_pre": 0, # 1; Fraction of presynaptic NMDARs in single liganded state
"RA2_pre": 0, # 1; Fraction of presynaptic NMDARs in fully liganded state
"RA2d1_pre": 0, # 1; Fraction of presynaptic NMDARs in desensitized state
"RA2d2_pre": 0, # 1; Fraction of presynaptic NMDARs in desensitized state
"RA2f_pre": 0, # 1; Fraction of presynaptic NMDARs in faster conformational change of GluN1 subunit
"RA2s_pre": 0, # 1; Fraction of presynaptic NMDARs in slower conformational change of GluN2 subunit
"RA2_O_pre": 0, # 1; Fraction of presynaptic NMDARs in open state
"RAMg_pre": 0, # 1; Fraction of presynaptic NMDARs in single liganded Mg-blocked state
"RA2Mg_pre": 0, # 1; Fraction of presynaptic NMDARs in fully liganded Mg-blocked state
"RA2d1Mg_pre": 0, # 1; Fraction of presynaptic NMDARs in desensitized Mg-blocked state
"RA2d2Mg_pre": 0, # 1; Fraction of presynaptic NMDARs in desensitized Mg-blocked state
"RA2fMg_pre": 0, # 1; Fraction of presynaptic NMDARs in faster conformational change of Mg-blocked \
# GluN1 subunit
"RA2sMg_pre": 0, # 1; Fraction of presynaptic NMDARs in slower conformational change of Mg-blocked \
# GluN2 subunit
"RA2_OMg_pre": 0, # 1; Fraction of presynaptic NMDARs in Mg-blocked state
"RMg_pre": 1, # 1; Fraction of presynaptic NMDARs in closed Mg-blocked state
"Rrel_pre": 1, # 1; Fraction of releasable presynaptic vesicles
"s_Na_pre": 0.99983, # 1; Gating variable for presynaptic Na inactivation
"V_pre": -59.9969, # mV; Presynaptic membrane potential
"X_ac_pre": 0 # uM; Concentration of presynaptic active protein affecting vesicular release
}
__DEFAULT_PARAMS = {
# Basic parameters
"F": 96485, # C/mol; Faraday constant
"N_A": 6.0221e23, # 1/mol; Avogadro's constant
"R": 8.3145, # J/(K mol); Molar gas constant
"T_celsius": 36, # C; Temperature; Sarid et al., 2007
"z": 2, # 1; Valence of Ca ion
# Membrane capacitance
"Cm_pre": 1.5, # uF/cm^2; Presynaptic membrane capacitance per unit area; Lavzin et al., 2012
# Conductances
"gCaNHVA_pre": 0.3, # mS/cm^2; Maximum conductance of presynaptic Ca_NHVA current per unit area; \
# Safiulina et al., 2010: 0.0003 mho/cm^2 = 0.0003 S/cm^2 = 0.3 mS/cm^2
"gK_pre": 20, # mS/cm^2; Maximum conductance of presynaptic K current per unit area; \
# Modified from Lavzin et al., 2012: 120 mS/cm^2
"gK2_pre": 20, # mS/cm^2; Maximum conductance of presynaptic K current per unit area; \
# Modified from Lavzin et al., 2012: 120 mS/cm^2
"gL_pre": 0.2, # mS/cm^2; Leak conductance of presynaptic neuron per unit area; \
# Modified from Lavzin et al., 2012: 0.1 mS/cm^2
"gNa_pre": 30, # mS/cm^2; Maximum conductance of presynaptic Na current per unit area; \
# Modified from Lavzin et al., 2012: 200 mS/cm^2
"gNMDAR_pre": 0.1, # mS/cm^2; Maximum conductance of presynaptic NMDAR per unit area; \
# Modified from Gabbiani and Cox, 2010: 0.014 mS/cm^2
# Particle parameters
"tau_h_CaNHVA_pre": 80, # ms; Time constant for presynaptic Ca_NHVA inactivation; Safiulina et al., 2010
"tau_h_Na_pre": 1, # ms; Time constant for presynaptic Na inactivation; \
# Modified from Lavzin et al., 2012: 0.5 ms
"tau_m_Na_pre": 0.05, # ms; Time constant for presynaptic Na activation; Lavzin et al., 2012
"tau_n_K_pre": 1, # ms; Time constant for presynaptic K activation; Lavzin et al., 2012
"tau_n_K2_pre": 10, # ms; Time constant for presynaptic K activation; Lavzin et al., 2012
"tau_s_Na_pre": 30, # ms; Time constant for presynaptic Na inactivation; Lavzin et al., 2012
"tau_sb_Na_pre": 0.1, # ms; Time constant for presynaptic Na inactivation; \
# Modified from Lavzin et al., 2012: 0.5 ms
"V_sd_Na_pre": 1, # mV; Shift in presynaptic membrane potential used in calculation of Na current; \
# Lavzin et al., 2012
"Vshift_pre": -10, # mV; Shift in presynaptic membrane potential; \
# Modified from Lavzin et al., 2012: 0 mV
"V_sv_Na_pre": 10, # mV; Shift in presynaptic membrane potential used in calculation of Na current; \
# Modified from Lavzin et al., 2012: 30 mV
# Reversal potentials
"VK_pre": -77, # mV; Reversal potential of presynaptic K current; Lavzin et al., 2012
"VL_pre": -60, # mV; Leak reversal potential of presynaptic neuron; \
# Modified from Lavzin et al., 2012: -70mV
"VNa_pre": 50, # mV; Reversal potential of presynaptic Na current; \
# Modified from Lavzin et al., 2012: 40 mv and 70mV
"V_NMDAR_pre": 0, # mV; Reversal potential of presynaptic NMDAR current; Destexhe et al., 1998
# Other calcium related parameters
# Safiulina et al., 2010
"a0m_pre": 0.03, # 1/ms; Parameter used in calculation of presynaptic Ca_NHVA activation time \
# constant
"c_Ca_pre": 1.9297, # (uA ms)/(cm^2 uM); Presynaptic scaling factor to convert from units uA/cm^2 to \
# uM/ms
"c_V_pre": 13.3203, # mV; Presynaptic scaling factor to convert from units mV to 1 used in calculation \
# of GHK current equation
"Ca_ext_pre": 2000, # uM; Ca concentration outside presynaptic neuron
"Ca_rest_pre": 0.05, # uM; Presynaptic resting Ca concentration
"d_pre": 0.1, # um; Depth of presynaptic axonal shell
"gmm_pre": 0.1, # 1; Parameter used in calculation of presynaptic Ca_NHVA activation time constant
"k_Ca_pre": 10000, # 1; Presynaptic scaling factor used in calculation of c_Ca_pre
"k_V_pre": 1000, # 1; Presynaptic scaling factor used in calculation of c_V_pre
"K_inh_pre": 1, # uM; Presynaptic Ca_NHVA channel dissociation constant (inhibition)
"tau_Ca_pre": 100, # ms; Time constant of presynaptic pump
"tau_mmin_pre": 0.2, # ms; Minimun value for presynaptic Ca_NHVA activation time constant
"Vhalfm_pre": -14, # mV; Half-activation potential of presynaptic Ca_NHVA channel
"zm_pre": 2, # 1; Parameter used in calculation of presynaptic Ca_NHVA activation time constant
# NMDAR parameters
"kd1_f_pre": 0.055, # 1/ms; Rate constant into desensitized state of presynaptic NMDAR; \
# Modified from Erreger et al., 2005: 0.55 1/ms
"kd1_b_pre": 0.0814, # 1/ms; Rate constant out of desensitized state of presynaptic NMDAR; \
# Erreger et al., 2005
"kd2_f_pre": 0.0112, # 1/ms; Rate constant into desensitized state of presynaptic NMDAR; \
# Modified from Erreger et al., 2005: 0.112 1/ms
"kd2_b_pre": 9.1e-4, # 1/ms; Rate constant out of desensitized state of presynaptic NMDAR; \
# Erreger et al., 2005
"kf_f_pre": 2.836, # 1/ms; Rate constant for gating-associated conformational changes of \
# presynaptic GluN1 subunit of NMDAR; Erreger et al., 2005; Clarke and Johnson, 2008
"kf_b_pre": 0.175, # 1/ms; Rate constant for gating-associated conformational changes of \
# presynaptic GluN1 subunit of NMDAR; Erreger et al., 2005; Clarke and Johnson, 2008
"kon_pre": 2.83e-3, # 1/(uM ms); Rate constant for agonist (Glu) binding to presynaptic NMDAR; \
# Erreger et al., 2005; Clarke and Johnson, 2008
"koff_pre": 0.0381, # 1/ms; Rate constant for agonist (Glu) unbinding from presynaptic NMDAR; \
# Erreger et al., 2005; Clarke and Johnson, 2008
"ks_f_0_pre": 0.048, # 1/ms; Rate constant for gating-associated conformational changes of \
# presynaptic GluN2 subunit of NMDAR; Erreger et al., 2005; Clarke and Johnson, 2008
"ks_b_pre": 0.23, # 1/ms; Rate constant for gating-associated conformational changes of \
# presynaptic GluN2 subunit of NMDAR; Erreger et al., 2005; Clarke and Johnson, 2008
# Glu release related parameters
"C_thr_pre": 3, # uM; Ca threshold concentration of Glu release in presynaptic neuron
"CaN_max_pre": 2, # uM; Total concentration of presynaptic CaN; Steuber and Willshaw, 2004
"f_Glu_pre": 0.1, # 1; Factor representing spillover of Glu from synaptic cleft that presynaptic \
# NMDAR receives
"G_pre": 1092, # 1; Number of Glu per presynaptic vesicle; Riveros et al., 1986
"k1_pre": 0.001, # 1/(uM^3 ms); Rate constant for Ca activation of presynaptic CaN; \
# Steuber and Willshaw, 2004
"k2_pre": 0.002, # 1/ms; Rate constant for inactivation of presynaptic CaN; \
# Modified from Steuber and Willshaw, 2004: 0.012 1/ms
"k_f_pre": 0.0075, # 1/ms; Presynaptic facilitation rate constant
"k_Glu_pre": 1e-6, # 1; Presynaptic scaling factor to convert from units M to uM
"k_recov_pre": 0.0075, # 1/ms; Presynaptic recovery rate constant from empty to releasable state; \
# Markram et al., 1998: 7.7e-3; Lee et al., 2009: 7.5e-3
"KA_pre": 2, # uM; Presynaptic CaN concentration producing half occupation
"K_rel_pre": 5, # uM; Presynaptic Ca concentration producing half occupation used in calculation \
# of Glu release; Modified from Lee et al., 2009: 20 uM
"n1_pre": 2, # 1; Presynaptic Hill coefficient; Modified from Lee et al., 2009: 4
"n2_pre": 2, # 1; Presynaptic Hill coefficient
"N_pre": 2, # 1; Number of readily releasable presynaptic vesicles; \
# Schikorski and Stevens, 1997: 4.6 +/- 3.0
"p1_pre": 3e-5, # 1/ms; Rate constant for presynaptic protein activation affecting vesicular release
"V_syncleft": 2e-18, # l; Volume of synaptic cleft; \
# Harris and Sultan, 1995: 0.7e-18 l - 8e-18 l; \
# Schikorski and Stevens, 1997: 0.76e-3 um^3 = 0.76e-18 l
"X_total_pre": 0.1 # uM; Total concentration of presynaptic protein affecting vesicular release
}
@staticmethod
def get_parameters():
p = dict(Pre.__DEFAULT_PARAMS)
intermed = Pre.parameter_equations(p)
p["c_Ca_pre"] = intermed["c_Ca_pre"]
p["c_V_pre"] = intermed["c_V_pre"]
return p
@staticmethod
def get_initial_values(p):
x = dict(Pre.__DEFAULT_INITIAL_VALUES)
intermed = Pre.intermediate_equations(p, x)
x["h_CaNHVA_pre"] = intermed["h_inf_CaNHVA_pre"]
x["h_Na_pre"] = intermed["h_inf_Na_pre"]
x["m_CaNHVA_pre"] = intermed["m_inf_CaNHVA_pre"]
x["m_Na_pre"] = intermed["m_inf_Na_pre"]
x["n_K_pre"] = intermed["n_inf_K_pre"]
x["n_K2_pre"] = intermed["n_inf_K2_pre"]
x["s_Na_pre"] = intermed["s_inf_Na_pre"]
return x
@staticmethod
def parameter_equations(p):
# ----------------------
# Presynaptic parameters
# ----------------------
# Safiulina et al., 2010
c_Ca_pre = p["z"] * p["F"] * p["d_pre"] / p["k_Ca_pre"]
c_V_pre = p["k_V_pre"] * p["R"] * (p["T_celsius"] + 273.15) / (p["z"] * p["F"])
return {"c_Ca_pre": c_Ca_pre,
"c_V_pre": c_V_pre
}
@staticmethod
def intermediate_equations(p, x):
# -------------------------------
# Presynaptic algebraic equations
# -------------------------------
# K and Na channels in axon
# Lavzin et al., 2012
sigmas_Na_pre = 1 / (1 + exp((x["V_pre"] + p["V_sv_Na_pre"] + p["Vshift_pre"]) / p["V_sd_Na_pre"])) # 1
h_inf_Na_pre = 1 / (1 + exp((x["V_pre"] + 45 + p["Vshift_pre"]) / 3)) # 1
m_inf_Na_pre = 1 / (1 + exp(-(x["V_pre"] + 40 + p["Vshift_pre"]) / 3)) # 1
s_inf_Na_pre = 1 / (1 + exp((x["V_pre"] + 44 + p["Vshift_pre"]) / 3)) # 1
n_inf_K_pre = 1 / (1 + exp(-(x["V_pre"] + 40 + p["Vshift_pre"]) / 3)) # 1
n_inf_K2_pre = 1 / (1 + exp(-(x["V_pre"] + 40 + p["Vshift_pre"]) / 3)) # 1
# N-type HVA Ca channel in axon
# Safiulina et al., 2010
alph_CaNHVA_pre = 1.6e-4 * exp(-x["V_pre"] / 48.4) # 1/ms
alpm_CaNHVA_pre = 0.1967 * (-x["V_pre"] + 19.88) / (exp((-x["V_pre"] + 19.88) / 10) - 1) # 1/ms
alpmt_CaNHVA_pre = exp(0.0378 * p["zm_pre"] * (x["V_pre"] - p["Vhalfm_pre"])) # 1
beth_CaNHVA_pre = 1 / (1 + exp((-x["V_pre"] + 39) / 10)) # 1/ms
betm_CaNHVA_pre = 0.046 * exp(-x["V_pre"] / 20.73) # 1/ms
betmt_CaNHVA_pre = exp(0.0378 * p["zm_pre"] * p["gmm_pre"] * (x["V_pre"] - p["Vhalfm_pre"])) # 1
h_inf_CaNHVA_pre = alph_CaNHVA_pre / (alph_CaNHVA_pre + beth_CaNHVA_pre) # 1
m_inf_CaNHVA_pre = alpm_CaNHVA_pre / (alpm_CaNHVA_pre + betm_CaNHVA_pre) # 1
h_inf_CaNHVA2_pre = p["K_inh_pre"] / (p["K_inh_pre"] + x["Ca_CaNHVA_pre"]) # 1
tau_m_CaNHVA_pre = max(p["tau_mmin_pre"] / (5 ** ((p["T_celsius"] - 25) / 10)),
betmt_CaNHVA_pre / (5 ** ((p["T_celsius"] - 25) / 10) *
p["a0m_pre"] * (1 + alpmt_CaNHVA_pre))) # ms
return {"sigmas_Na_pre": sigmas_Na_pre,
"h_inf_CaNHVA_pre": h_inf_CaNHVA_pre,
"h_inf_CaNHVA2_pre": h_inf_CaNHVA2_pre,
"h_inf_Na_pre": h_inf_Na_pre,
"m_inf_CaNHVA_pre": m_inf_CaNHVA_pre,
"m_inf_Na_pre": m_inf_Na_pre,
"n_inf_K_pre": n_inf_K_pre,
"n_inf_K2_pre": n_inf_K2_pre,
"s_inf_Na_pre": s_inf_Na_pre,
"tau_m_CaNHVA_pre": tau_m_CaNHVA_pre
}
def __init__(self, params, x0):
print("Created new Pre")
self.params = params # Parameters
self.x = x0 # Initial values of state variables
def variable_names(self):
return self.x.keys()
def derivative(self, Glu_extsyn, Glu_syncleft, I_ext_pre):
# ----------------------------------------
# Presynaptic neuron inputs and parameters
# ----------------------------------------
p = self.params
x = self.x
# -------------------------------
# Presynaptic algebraic equations
# -------------------------------
intermed = Pre.intermediate_equations(p, x)
# Currents
# N-type HVA Ca current
# Safiulina et al., 2010
nu_pre = x["V_pre"] / p["c_V_pre"] # 1
if abs(nu_pre) < 0.0001:
e_pre = nu_pre / 2 - 1 # 1
else:
e_pre = nu_pre / (1 - exp(nu_pre)) # 1
f_ghk_pre = p["c_V_pre"] * (1 - (x["Ca_CaNHVA_pre"] / p["Ca_ext_pre"]) * exp(nu_pre)) * e_pre # mV
ICaNHVA_pre = p["gCaNHVA_pre"] * x["m_CaNHVA_pre"] ** 2 * x["h_CaNHVA_pre"] * intermed["h_inf_CaNHVA2_pre"] * \
f_ghk_pre # uA/cm^2
# K current
# Lavzin et al., 2012
IK_pre = p["gK_pre"] * x["n_K_pre"] ** 3 * (x["V_pre"] - p["VK_pre"]) + p["gK2_pre"] * x["n_K2_pre"] ** 3 * (
x["V_pre"] - p["VK_pre"]) # uA/cm^2
# Leak current
# Lavzin et al., 2012
IL_pre = p["gL_pre"] * (x["V_pre"] - p["VL_pre"]) # uA/cm^2
# Na current
# Lavzin et al., 2012
INa_pre = p["gNa_pre"] * x["m_Na_pre"] ** 3 * x["h_Na_pre"] * x["s_Na_pre"] * (
x["V_pre"] - p["VNa_pre"]) # uA/cm^2
# Ca current via NMDAR
# Schneggenburger et al., 1993; Burnashev et al., 1995
if x["V_pre"] >= p["V_NMDAR_pre"]:
ICa_NMDAR_pre = 0
else:
ICa_NMDAR_pre = 0.1 * p["gNMDAR_pre"] * x["RA2_O_pre"] * (x["V_pre"] - p["V_NMDAR_pre"]) # uA/cm^2
# Na current via NMDAR
# Schneggenburger et al., 1993; Burnashev et al., 1995
if x["V_pre"] >= p["V_NMDAR_pre"]:
INa_NMDAR_pre = 0
else:
INa_NMDAR_pre = 0.9 * p["gNMDAR_pre"] * x["RA2_O_pre"] * (x["V_pre"] - p["V_NMDAR_pre"]) # uA/cm^2
# NMDAR
# Total concentration of Glu that presynaptic NMDARs receives
Glu_NMDAR_pre = p["f_Glu_pre"] * Glu_syncleft + Glu_extsyn
# Rates dependent on V_pre
# Ascher and Nowak, 1988
kMg_f_pre = 6.1e-4 * exp(-x["V_pre"] / 17) # 1/(uM ms); Rate of presynaptic NMDAR blocking by external Mg
kMg_b_pre = 5.4 * exp(x["V_pre"] / 47) # 1/ms; Rate of presynaptic NMDAR unblocking by external Mg
# Clarke and Johnson, 2008
ks_f_pre = p["ks_f_0_pre"] * exp((x["V_pre"] + 100) / 175) # 1/ms; Rate of gating-associated conformational
# changes of presynaptic GluN2 subunit of NMDAR
# Erreger et al., 2005; Clarke and Johnson, 2008
# No Mg
# A + R <-> RA (2kon, koff)
v_2kon_pre = 2 * p["kon_pre"] * Glu_NMDAR_pre * x["R_pre"]
v_koff_pre = p["koff_pre"] * x["RA_pre"]
# A + RA <-> RA2 (kon, 2koff)
v_kon_pre = p["kon_pre"] * Glu_NMDAR_pre * x["RA_pre"]
v_2koff_pre = 2 * p["koff_pre"] * x["RA2_pre"]
# RA2 <-> RA2d1 (kd1_f, kd1_b)
v_d1_f_pre = p["kd1_f_pre"] * x["RA2_pre"]
v_d1_b_pre = p["kd1_b_pre"] * x["RA2d1_pre"]
# RA2 <-> RA2d2 (kd2_f, kd2_b)
v_d2_f_pre = p["kd2_f_pre"] * x["RA2_pre"]
v_d2_b_pre = p["kd2_b_pre"] * x["RA2d2_pre"]
# RA2 <-> RA2f (kf_f, kf_b)
v_f1_f_pre = p["kf_f_pre"] * x["RA2_pre"]
v_f1_b_pre = p["kf_b_pre"] * x["RA2f_pre"]
# RA2 <-> RA2s (ks_f, ks_b)
v_s1_f_pre = ks_f_pre * x["RA2_pre"]
v_s1_b_pre = p["ks_b_pre"] * x["RA2s_pre"]
# RA2f <-> RA2_O (ks_f, ks_b)
v_s2_f_pre = ks_f_pre * x["RA2f_pre"]
v_s2_b_pre = p["ks_b_pre"] * x["RA2_O_pre"]
# RA2s <-> RA2_O (kf_f, kf_b)
v_f2_f_pre = p["kf_f_pre"] * x["RA2s_pre"]
v_f2_b_pre = p["kf_b_pre"] * x["RA2_O_pre"]
# With Mg
# A + RMg <-> RAMg (2kon, koff)
v_2konMg_pre = 2 * p["kon_pre"] * Glu_NMDAR_pre * x["RMg_pre"]
v_koffMg_pre = p["koff_pre"] * x["RAMg_pre"]
# A + RAMg <-> RA2Mg (kon, 2koff)
v_konMg_pre = p["kon_pre"] * Glu_NMDAR_pre * x["RAMg_pre"]
v_2koffMg_pre = 2 * p["koff_pre"] * x["RA2Mg_pre"]
# RA2Mg <-> RA2d1Mg (kd1_f, kd1_b)
v_d1Mg_f_pre = p["kd1_f_pre"] * x["RA2Mg_pre"]
v_d1Mg_b_pre = p["kd1_b_pre"] * x["RA2d1Mg_pre"]
# RA2Mg <-> RA2d2Mg (kd2_f, kd2_b)
v_d2Mg_f_pre = p["kd2_f_pre"] * x["RA2Mg_pre"]
v_d2Mg_b_pre = p["kd2_b_pre"] * x["RA2d2Mg_pre"]
# RA2Mg <-> RA2fMg (kf_f, kf_b)
v_f1Mg_f_pre = p["kf_f_pre"] * x["RA2Mg_pre"]
v_f1Mg_b_pre = p["kf_b_pre"] * x["RA2fMg_pre"]
# RA2Mg <-> RA2sMg (ks_f, ks_b)
v_s1Mg_f_pre = ks_f_pre * x["RA2Mg_pre"]
v_s1Mg_b_pre = p["ks_b_pre"] * x["RA2sMg_pre"]
# RA2fMg <-> RA2_OMg (ks_f, ks_b)
v_s2Mg_f_pre = ks_f_pre * x["RA2fMg_pre"]
v_s2Mg_b_pre = p["ks_b_pre"] * x["RA2_OMg_pre"]
# RA2sMg <-> RA2_OMg (kf_f, kf_b)
v_f2Mg_f_pre = p["kf_f_pre"] * x["RA2sMg_pre"]
v_f2Mg_b_pre = p["kf_b_pre"] * x["RA2_OMg_pre"]
# RA2_O <-> RA2_OMg (kMg_f, kMg_b)
v_Mg_f_pre = kMg_f_pre * x["RA2_O_pre"]
v_Mg_b_pre = kMg_b_pre * x["RA2_OMg_pre"]
# --------------------------------------------
# Differential equations in presynaptic neuron
# --------------------------------------------
return {
# Membrane potential
# Lavzin et al., 2012
"V_pre": (-ICaNHVA_pre - IK_pre - INa_pre - IL_pre - ICa_NMDAR_pre - INa_NMDAR_pre + I_ext_pre) / \
p["Cm_pre"],
# K and Na channels
# Lavzin et al., 2012
"h_Na_pre": (intermed["h_inf_Na_pre"] - x["h_Na_pre"]) / p["tau_h_Na_pre"],
"m_Na_pre": (intermed["m_inf_Na_pre"] - x["m_Na_pre"]) / p["tau_m_Na_pre"],
"n_K_pre": (intermed["n_inf_K_pre"] - x["n_K_pre"]) / p["tau_n_K_pre"],
"n_K2_pre": (intermed["n_inf_K2_pre"] - x["n_K2_pre"]) / p["tau_n_K2_pre"],
"s_Na_pre": (intermed["s_inf_Na_pre"] - x["s_Na_pre"]) / (
p["tau_s_Na_pre"] * intermed["sigmas_Na_pre"] + p["tau_sb_Na_pre"]),
# N-type HVA Ca channel
# Safiulina et al., 2010
"h_CaNHVA_pre": (intermed["h_inf_CaNHVA_pre"] - x["h_CaNHVA_pre"]) / p["tau_h_CaNHVA_pre"],
"m_CaNHVA_pre": (intermed["m_inf_CaNHVA_pre"] - x["m_CaNHVA_pre"]) / intermed["tau_m_CaNHVA_pre"],
# NMDAR
# Cull-Candy et al., 2001; Erreger et al., 2005; Clarke and Johnson, 2008
"R_pre": -v_2kon_pre + v_koff_pre,
"RA_pre": v_2kon_pre - v_koff_pre - v_kon_pre + v_2koff_pre,
"RA2_pre": v_kon_pre - v_2koff_pre - v_d1_f_pre + v_d1_b_pre - v_d2_f_pre + v_d2_b_pre - \
v_f1_f_pre + v_f1_b_pre - v_s1_f_pre + v_s1_b_pre,
"RA2d1_pre": v_d1_f_pre - v_d1_b_pre,
"RA2d2_pre": v_d2_f_pre - v_d2_b_pre,
"RA2f_pre": v_f1_f_pre - v_f1_b_pre - v_s2_f_pre + v_s2_b_pre,
"RA2s_pre": v_s1_f_pre - v_s1_b_pre - v_f2_f_pre + v_f2_b_pre,
"RA2_O_pre": v_s2_f_pre - v_s2_b_pre + v_f2_f_pre - v_f2_b_pre - v_Mg_f_pre + v_Mg_b_pre,
"RMg_pre": -v_2konMg_pre + v_koffMg_pre,
"RAMg_pre": v_2konMg_pre - v_koffMg_pre - v_konMg_pre + v_2koffMg_pre,
"RA2Mg_pre": v_konMg_pre - v_2koffMg_pre - v_d1Mg_f_pre + v_d1Mg_b_pre - v_d2Mg_f_pre + v_d2Mg_b_pre - \
v_f1Mg_f_pre + v_f1Mg_b_pre - v_s1Mg_f_pre + v_s1Mg_b_pre,
"RA2d1Mg_pre": v_d1Mg_f_pre - v_d1Mg_b_pre,
"RA2d2Mg_pre": v_d2Mg_f_pre - v_d2Mg_b_pre,
"RA2fMg_pre": v_f1Mg_f_pre - v_f1Mg_b_pre - v_s2Mg_f_pre + v_s2Mg_b_pre,
"RA2sMg_pre": v_s1Mg_f_pre - v_s1Mg_b_pre - v_f2Mg_f_pre + v_f2Mg_b_pre,
"RA2_OMg_pre": v_s2Mg_f_pre - v_s2Mg_b_pre + v_f2Mg_f_pre - v_f2Mg_b_pre + v_Mg_f_pre - v_Mg_b_pre,
# Ca and Glu release
# Badoual et al., 2008
"Ca_CaNHVA_pre": -ICaNHVA_pre / p["c_Ca_pre"] + (p["Ca_rest_pre"] - x["Ca_CaNHVA_pre"]) / p["tau_Ca_pre"],
"Ca_NMDAR_pre": -ICa_NMDAR_pre / p["c_Ca_pre"] + (p["Ca_rest_pre"] - x["Ca_NMDAR_pre"]) / p["tau_Ca_pre"],
# Fiala et al., 1996
"CaN_pre": p["k1_pre"] * (p["CaN_max_pre"] - x["CaN_pre"]) * x["Ca_NMDAR_pre"] ** 3 - \
p["k2_pre"] * x["CaN_pre"],
# Modified from Tsodyks and Markram, 1997; Tsodyks et al., 1998; Lee et al., 2009;
# De Pitta et al., 2011; De Pitta and Brunel, 2016
"Prel_pre": -p["k_f_pre"] * x["Prel_pre"], # Delta term added in solve_deltaf
"Rrel_pre": p["k_recov_pre"] * (1 - x["Rrel_pre"]), # Delta term subtracted in solve_deltaf
"X_ac_pre": p["p1_pre"] * x["CaN_pre"] ** p["n2_pre"] / (
p["KA_pre"] ** p["n2_pre"] + x["CaN_pre"] ** p["n2_pre"]) * (p["X_total_pre"] - x["X_ac_pre"])
}, {"Glu_NMDAR_pre": Glu_NMDAR_pre,
"ICaNHVA_pre": ICaNHVA_pre,
"ICa_NMDAR_pre": ICa_NMDAR_pre,
"IK_pre": IK_pre,
"IL_pre": IL_pre,
"INa_pre": INa_pre,
"INa_NMDAR_pre": INa_NMDAR_pre
}
def solve_deriv(self, deriv_pre, dt):
for key in self.x:
self.x[key] += deriv_pre[key] * dt
def solve_deltaf(self, Ca_pre_old, f_pre, Prel_pre_old, Rrel_pre_old):
# ----------------------------------------
# Presynaptic neuron inputs and parameters
# ----------------------------------------
p = self.params
x = self.x
# -----------------------------------------------------
# Updating those variables that include delta functions
# -----------------------------------------------------
# Modified from Tsodyks and Markram, 1997; Tsodyks et al., 1998; Lee et al., 2009; De Pitta et al., 2011;
# De Pitta and Brunel, 2016
x["Prel_pre"] += (1 - f_pre) * Ca_pre_old ** p["n1_pre"] / (
p["K_rel_pre"] ** p["n1_pre"] + Ca_pre_old ** p["n1_pre"]) * (1 - Prel_pre_old)
x["Rrel_pre"] -= x["Prel_pre"] * Rrel_pre_old