def dkdt_syn_both(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        phi_sn, phi_se, phi_sg, phi_dn, phi_de, phi_dg, phi_msn, phi_mdn, phi_msg, phi_mdg = my_cell.membrane_potentials(
        )
        E_Na_sn, E_Na_sg, E_Na_dn, E_Na_dg, E_K_sn, E_K_sg, E_K_dn, E_K_dg, E_Cl_sn, E_Cl_sg, E_Cl_dn, E_Cl_dg, E_Ca_sn, E_Ca_dn = my_cell.reversal_potentials(
        )
        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > syn_start:
            dNadt_sn, dNadt_se, dKdt_sn, dKdt_se, dCadt_sn, dCadt_se = activate_synapse(
                my_cell, t, spikes, phi_msn, E_Na_sn, E_K_sn, E_Ca_sn,
                dNadt_sn, dNadt_se, dKdt_sn, dKdt_se, dCadt_sn, dCadt_se)
            dNadt_dn, dNadt_de, dKdt_dn, dKdt_de, dCadt_dn, dCadt_de = activate_synapse(
                my_cell, t, spikes, phi_mdn, E_Na_dn, E_K_dn, E_Ca_dn,
                dNadt_dn, dNadt_de, dKdt_dn, dKdt_de, dCadt_dn, dCadt_de)

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt
示例#2
0
    def dkdt_Cl_both(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dCldt_sn -= I_stim / my_cell.F
            dCldt_se += I_stim / my_cell.F
            dCldt_dn -= I_stim / my_cell.F
            dCldt_de += I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt
示例#3
0
def dummy_cell():
    """ Create "dummy" cell to fetch functions and paramters. """
    
    T = 309.14
    alpha = 2

    cbK_se = 3.082
    cbK_sg = 99.959
    cbK_de = 3.082
    cbK_dg = 99.959
    cbCa_sn = 0.01
    cbCa_dn = 0.01

    cell = edNEGmodel(T, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, alpha, \
        cbK_se, cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, 1, 1, 1, 1, 1, 1, \
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

    return cell
def solve_edNEGmodel(t_dur, alpha, syn_rate, syn_start, syn_end, syn_protocol):
    """
    Solves the edNEG model (Sætra et al. 2021) using the solve_ivp function from scipy.

    Arguments:
        t_dur (float): duration of simulation [s]
        alpha (float): coupling strength
        I_stim (float): stimulus current [A]
        stim_start (float): time of stimulus onset [s]
        stim_end (float): time of stimulus offset [s]
        syn_protocol (str): protocol defining synaptic location 
    
    Returns:
        sol: solution from solve_ivp
        my_cell: edNEGmodel object
        spikes: synaptic spike train
    """

    spikes = homogeneous_poisson_process(rate=syn_rate * qnt.Hz,
                                         t_start=syn_start * qnt.s,
                                         t_stop=syn_end * qnt.s,
                                         as_array=True)
    filename = pkg_resources.resource_filename(
        'data', 'initial_values/initial_values.npz')
    data = np.load(filename)

    T = 309.14

    # initial membrane potentials [V]
    phi_msn = data['phi_msn']
    phi_msg = data['phi_msg']
    phi_mdn = data['phi_mdn']
    phi_mdg = data['phi_mdg']

    # initial volumes [m**3]
    V_sn0 = data['V_sn']
    V_se0 = data['V_se']
    V_sg0 = data['V_sg']
    V_dn0 = data['V_dn']
    V_de0 = data['V_de']
    V_dg0 = data['V_dg']

    # initial amounts of ions [mol]
    Na_sn0 = data['Na_sn']
    Na_se0 = data['Na_se']
    Na_sg0 = data['Na_sg']
    K_sn0 = data['K_sn']
    K_se0 = data['K_se']
    K_sg0 = data['K_sg']
    Cl_sn0 = data['Cl_sn']
    Cl_se0 = data['Cl_se']
    Cl_sg0 = data['Cl_sg']
    Ca_sn0 = data['Ca_sn']
    Ca_se0 = data['Ca_se']

    Na_dn0 = data['Na_dn']
    Na_de0 = data['Na_de']
    Na_dg0 = data['Na_dg']
    K_dn0 = data['K_dn']
    K_de0 = data['K_de']
    K_dg0 = data['K_dg']
    Cl_dn0 = data['Cl_dn']
    Cl_de0 = data['Cl_de']
    Cl_dg0 = data['Cl_dg']
    Ca_dn0 = data['Ca_dn']
    Ca_de0 = data['Ca_de']

    # intial gating variables
    n0 = data['n']
    h0 = data['h']
    s0 = data['s']
    c0 = data['c']
    q0 = data['q']
    z0 = data['z']

    # baseline ion concentrations [mol/m**3]
    cbK_se = 3.082
    cbK_sg = 99.959
    cbK_de = 3.082
    cbK_dg = 99.959
    cbCa_sn = 0.01
    cbCa_dn = 0.01

    # residual charges [mol]
    res_sn = phi_msn * 3e-2 * 616e-12 / 9.648e4
    res_sg = phi_msg * 3e-2 * 616e-12 / 9.648e4
    res_se = res_sn + res_sg
    res_dn = phi_mdn * 3e-2 * 616e-12 / 9.648e4
    res_dg = phi_mdg * 3e-2 * 616e-12 / 9.648e4
    res_de = res_dn + res_dg

    X_sn = Na_sn0 + K_sn0 - Cl_sn0 + 2 * Ca_sn0 - res_sn
    X_se = Na_se0 + K_se0 - Cl_se0 + 2 * Ca_se0 + res_se
    X_sg = Na_sg0 + K_sg0 - Cl_sg0 - res_sg
    X_dn = Na_dn0 + K_dn0 - Cl_dn0 + 2 * Ca_dn0 - res_dn
    X_de = Na_de0 + K_de0 - Cl_de0 + 2 * Ca_de0 + res_de
    X_dg = Na_dg0 + K_dg0 - Cl_dg0 - res_dg

    # residual mass [mol/m**3]
    cM_sn = (Na_sn0 + K_sn0 + Cl_sn0 + Ca_sn0) / V_sn0
    cM_se = (Na_se0 + K_se0 + Cl_se0 + Ca_se0) / V_se0
    cM_sg = (Na_sg0 + K_sg0 + Cl_sg0) / V_sg0
    cM_dn = (Na_dn0 + K_dn0 + Cl_dn0 + Ca_dn0) / V_dn0
    cM_de = (Na_de0 + K_de0 + Cl_de0 + Ca_de0) / V_de0
    cM_dg = (Na_dg0 + K_dg0 + Cl_dg0) / V_dg0

    # print initial values
    #init_cell = edNEGmodel(T, Na_sn0, Na_se0, Na_sg0, Na_dn0, Na_de0, Na_dg0, K_sn0, K_se0, K_sg0, K_dn0, K_de0, K_dg0, Cl_sn0, Cl_se0, Cl_sg0, Cl_dn0, Cl_de0, Cl_dg0, Ca_sn0, Ca_se0, Ca_dn0, Ca_de0, X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se, cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n0, h0, s0, c0, q0, z0, V_sn0, V_se0, V_sg0, V_dn0, V_de0, V_dg0, cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)
    #print_initial_values(init_cell)

    # define differential equations for different synaptic protocols
    def dkdt_syn_soma(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        phi_sn, phi_se, phi_sg, phi_dn, phi_de, phi_dg, phi_msn, phi_mdn, phi_msg, phi_mdg = my_cell.membrane_potentials(
        )
        E_Na_sn, E_Na_sg, E_Na_dn, E_Na_dg, E_K_sn, E_K_sg, E_K_dn, E_K_dg, E_Cl_sn, E_Cl_sg, E_Cl_dn, E_Cl_dg, E_Ca_sn, E_Ca_dn = my_cell.reversal_potentials(
        )
        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > syn_start:
            dNadt_sn, dNadt_se, dKdt_sn, dKdt_se, dCadt_sn, dCadt_se = activate_synapse(
                my_cell, t, spikes, phi_msn, E_Na_sn, E_K_sn, E_Ca_sn,
                dNadt_sn, dNadt_se, dKdt_sn, dKdt_se, dCadt_sn, dCadt_se)

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_syn_dendrite(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        phi_sn, phi_se, phi_sg, phi_dn, phi_de, phi_dg, phi_msn, phi_mdn, phi_msg, phi_mdg = my_cell.membrane_potentials(
        )
        E_Na_sn, E_Na_sg, E_Na_dn, E_Na_dg, E_K_sn, E_K_sg, E_K_dn, E_K_dg, E_Cl_sn, E_Cl_sg, E_Cl_dn, E_Cl_dg, E_Ca_sn, E_Ca_dn = my_cell.reversal_potentials(
        )
        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > syn_start:
            dNadt_dn, dNadt_de, dKdt_dn, dKdt_de, dCadt_dn, dCadt_de = activate_synapse(
                my_cell, t, spikes, phi_mdn, E_Na_dn, E_K_dn, E_Ca_dn,
                dNadt_dn, dNadt_de, dKdt_dn, dKdt_de, dCadt_dn, dCadt_de)

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_syn_both(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        phi_sn, phi_se, phi_sg, phi_dn, phi_de, phi_dg, phi_msn, phi_mdn, phi_msg, phi_mdg = my_cell.membrane_potentials(
        )
        E_Na_sn, E_Na_sg, E_Na_dn, E_Na_dg, E_K_sn, E_K_sg, E_K_dn, E_K_dg, E_Cl_sn, E_Cl_sg, E_Cl_dn, E_Cl_dg, E_Ca_sn, E_Ca_dn = my_cell.reversal_potentials(
        )
        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > syn_start:
            dNadt_sn, dNadt_se, dKdt_sn, dKdt_se, dCadt_sn, dCadt_se = activate_synapse(
                my_cell, t, spikes, phi_msn, E_Na_sn, E_K_sn, E_Ca_sn,
                dNadt_sn, dNadt_se, dKdt_sn, dKdt_se, dCadt_sn, dCadt_se)
            dNadt_dn, dNadt_de, dKdt_dn, dKdt_de, dCadt_dn, dCadt_de = activate_synapse(
                my_cell, t, spikes, phi_mdn, E_Na_dn, E_K_dn, E_Ca_dn,
                dNadt_dn, dNadt_de, dKdt_dn, dKdt_de, dCadt_dn, dCadt_de)

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    # solve
    t_span = (0, t_dur)

    k0 = [
        Na_sn0, Na_se0, Na_sg0, Na_dn0, Na_de0, Na_dg0, K_sn0, K_se0, K_sg0,
        K_dn0, K_de0, K_dg0, Cl_sn0, Cl_se0, Cl_sg0, Cl_dn0, Cl_de0, Cl_dg0,
        Ca_sn0, Ca_se0, Ca_dn0, Ca_de0, n0, h0, s0, c0, q0, z0, V_sn0, V_se0,
        V_sg0, V_dn0, V_de0, V_dg0
    ]

    if syn_protocol == 'syn_soma':
        sol = solve_ivp(dkdt_syn_soma,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-4)
    elif syn_protocol == 'syn_dendrite':
        sol = solve_ivp(dkdt_syn_dendrite,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-4)
    elif syn_protocol == 'syn_both':
        sol = solve_ivp(dkdt_syn_both,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-4)

    Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = sol.y

    my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, \
        Ca_sn, Ca_se, Ca_dn, Ca_de, X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, \
        cbK_se, cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s, c, q, z, \
        V_sn, V_se, V_sg, V_dn, V_de, V_dg, cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

    return sol, my_cell, spikes
示例#5
0
def solve_edNEGmodel(t_dur, alpha, I_stim, stim_start, stim_end,
                     injection_protocol):
    """
    Solves the edNEG model (Sætra et al. 2021) using the solve_ivp function from scipy.

    Arguments:
        t_dur (float): duration of simulation [s]
        alpha (float): coupling strength
        I_stim (float): stimulus current [A]
        stim_start (float): time of stimulus onset [s]
        stim_end (float): time of stimulus offset [s]
        injection_protocol (str): injection protocol defining ion species and location
    
    Returns:
        sol: solution from solve_ivp
        my_cell: edNEGmodel object
    """

    filename = pkg_resources.resource_filename(
        'data', 'initial_values/initial_values.npz')
    data = np.load(filename)

    T = 309.14

    # initial membrane potentials [V]
    phi_msn = data['phi_msn']
    phi_msg = data['phi_msg']
    phi_mdn = data['phi_mdn']
    phi_mdg = data['phi_mdg']

    # initial volumes [m**3]
    V_sn0 = data['V_sn']
    V_se0 = data['V_se']
    V_sg0 = data['V_sg']
    V_dn0 = data['V_dn']
    V_de0 = data['V_de']
    V_dg0 = data['V_dg']

    # initial amounts of ions [mol]
    Na_sn0 = data['Na_sn']
    Na_se0 = data['Na_se']
    Na_sg0 = data['Na_sg']
    K_sn0 = data['K_sn']
    K_se0 = data['K_se']
    K_sg0 = data['K_sg']
    Cl_sn0 = data['Cl_sn']
    Cl_se0 = data['Cl_se']
    Cl_sg0 = data['Cl_sg']
    Ca_sn0 = data['Ca_sn']
    Ca_se0 = data['Ca_se']

    Na_dn0 = data['Na_dn']
    Na_de0 = data['Na_de']
    Na_dg0 = data['Na_dg']
    K_dn0 = data['K_dn']
    K_de0 = data['K_de']
    K_dg0 = data['K_dg']
    Cl_dn0 = data['Cl_dn']
    Cl_de0 = data['Cl_de']
    Cl_dg0 = data['Cl_dg']
    Ca_dn0 = data['Ca_dn']
    Ca_de0 = data['Ca_de']

    # intial gating variables
    n0 = data['n']
    h0 = data['h']
    s0 = data['s']
    c0 = data['c']
    q0 = data['q']
    z0 = data['z']

    # baseline ion concentrations [mol/m**3]
    cbK_se = 3.082
    cbK_sg = 99.959
    cbK_de = 3.082
    cbK_dg = 99.959
    cbCa_sn = 0.01
    cbCa_dn = 0.01

    # residual charges [mol]
    res_sn = phi_msn * 3e-2 * 616e-12 / 9.648e4
    res_sg = phi_msg * 3e-2 * 616e-12 / 9.648e4
    res_se = res_sn + res_sg
    res_dn = phi_mdn * 3e-2 * 616e-12 / 9.648e4
    res_dg = phi_mdg * 3e-2 * 616e-12 / 9.648e4
    res_de = res_dn + res_dg

    X_sn = Na_sn0 + K_sn0 - Cl_sn0 + 2 * Ca_sn0 - res_sn
    X_se = Na_se0 + K_se0 - Cl_se0 + 2 * Ca_se0 + res_se
    X_sg = Na_sg0 + K_sg0 - Cl_sg0 - res_sg
    X_dn = Na_dn0 + K_dn0 - Cl_dn0 + 2 * Ca_dn0 - res_dn
    X_de = Na_de0 + K_de0 - Cl_de0 + 2 * Ca_de0 + res_de
    X_dg = Na_dg0 + K_dg0 - Cl_dg0 - res_dg

    # residual mass [mol/m**3]
    cM_sn = (Na_sn0 + K_sn0 + Cl_sn0 + Ca_sn0) / V_sn0
    cM_se = (Na_se0 + K_se0 + Cl_se0 + Ca_se0) / V_se0
    cM_sg = (Na_sg0 + K_sg0 + Cl_sg0) / V_sg0
    cM_dn = (Na_dn0 + K_dn0 + Cl_dn0 + Ca_dn0) / V_dn0
    cM_de = (Na_de0 + K_de0 + Cl_de0 + Ca_de0) / V_de0
    cM_dg = (Na_dg0 + K_dg0 + Cl_dg0) / V_dg0

    # print initial values
    #    init_cell = edNEGmodel(T, Na_sn0, Na_se0, Na_sg0, Na_dn0, Na_de0, Na_dg0, K_sn0, K_se0, K_sg0, K_dn0, K_de0, K_dg0, Cl_sn0, Cl_se0, Cl_sg0, Cl_dn0, Cl_de0, Cl_dg0, Ca_sn0, Ca_se0, Ca_dn0, Ca_de0, X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se, cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n0, h0, s0, c0, q0, z0, V_sn0, V_se0, V_sg0, V_dn0, V_de0, V_dg0, cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)
    #print_initial_values(init_cell)

    # define differential equations for different injection protocols
    def dkdt_K_soma(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dKdt_sn += I_stim / my_cell.F
            dKdt_se -= I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_K_dendrite(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dKdt_dn += I_stim / my_cell.F
            dKdt_de -= I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_K_both(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dKdt_sn += I_stim / my_cell.F
            dKdt_se -= I_stim / my_cell.F
            dKdt_dn += I_stim / my_cell.F
            dKdt_de -= I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_Na_soma(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dNadt_sn += I_stim / my_cell.F
            dNadt_se -= I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_Na_dendrite(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dNadt_dn += I_stim / my_cell.F
            dNadt_de -= I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_Na_both(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dNadt_sn += I_stim / my_cell.F
            dNadt_se -= I_stim / my_cell.F
            dNadt_dn += I_stim / my_cell.F
            dNadt_de -= I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_Cl_soma(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dCldt_sn -= I_stim / my_cell.F
            dCldt_se += I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_Cl_dendrite(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dCldt_dn -= I_stim / my_cell.F
            dCldt_de += I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    def dkdt_Cl_both(t, k):

        Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = k

        my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn,
                             K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg,
                             Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de,
                             X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, cbK_se,
                             cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s,
                             c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg,
                             cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

        dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de = my_cell.dkdt(
        )
        dndt, dhdt, dsdt, dcdt, dqdt, dzdt = my_cell.dmdt()
        dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt = my_cell.dVdt()

        if t > stim_start and t < stim_end:
            dCldt_sn -= I_stim / my_cell.F
            dCldt_se += I_stim / my_cell.F
            dCldt_dn -= I_stim / my_cell.F
            dCldt_de += I_stim / my_cell.F

        return dNadt_sn, dNadt_se, dNadt_sg, dNadt_dn, dNadt_de, dNadt_dg, dKdt_sn, dKdt_se, dKdt_sg, dKdt_dn, dKdt_de, dKdt_dg, \
            dCldt_sn, dCldt_se, dCldt_sg, dCldt_dn, dCldt_de, dCldt_dg, dCadt_sn, dCadt_se, dCadt_dn, dCadt_de, \
            dndt, dhdt, dsdt, dcdt, dqdt, dzdt, dVsidt, dVsedt, dVsgdt, dVdidt, dVdedt, dVdgdt

    # solve
    t_span = (0, t_dur)

    k0 = [
        Na_sn0, Na_se0, Na_sg0, Na_dn0, Na_de0, Na_dg0, K_sn0, K_se0, K_sg0,
        K_dn0, K_de0, K_dg0, Cl_sn0, Cl_se0, Cl_sg0, Cl_dn0, Cl_de0, Cl_dg0,
        Ca_sn0, Ca_se0, Ca_dn0, Ca_de0, n0, h0, s0, c0, q0, z0, V_sn0, V_se0,
        V_sg0, V_dn0, V_de0, V_dg0
    ]

    if injection_protocol == 'K_soma_ss':
        sol = solve_ivp(dkdt_K_soma, t_span, k0, method='RK23', max_step=1e-5)
    elif injection_protocol == 'K_soma_db':
        sol = solve_ivp(dkdt_K_soma, t_span, k0, method='RK23', max_step=1e-4)
    elif injection_protocol == 'K_dendrite_ss':
        sol = solve_ivp(dkdt_K_dendrite,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-5)
    elif injection_protocol == 'K_dendrite_db':
        sol = solve_ivp(dkdt_K_dendrite,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-4)
    elif injection_protocol == 'K_both_ss':
        sol = solve_ivp(dkdt_K_both, t_span, k0, method='RK23', max_step=1e-5)
    elif injection_protocol == 'K_both_db':
        sol = solve_ivp(dkdt_K_both, t_span, k0, method='RK23', max_step=1e-4)
    elif injection_protocol == 'Na_soma_ss':
        sol = solve_ivp(dkdt_Na_soma, t_span, k0, method='RK23', max_step=1e-5)
    elif injection_protocol == 'Na_soma_db':
        sol = solve_ivp(dkdt_Na_soma, t_span, k0, method='RK23', max_step=1e-4)
    elif injection_protocol == 'Na_dendrite_ss':
        sol = solve_ivp(dkdt_Na_dendrite,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-5)
    elif injection_protocol == 'Na_dendrite_db':
        sol = solve_ivp(dkdt_Na_dendrite,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-4)
    elif injection_protocol == 'Na_both_ss':
        sol = solve_ivp(dkdt_Na_both, t_span, k0, method='RK23', max_step=1e-5)
    elif injection_protocol == 'Na_both_db':
        sol = solve_ivp(dkdt_Na_both, t_span, k0, method='RK23', max_step=1e-4)
    elif injection_protocol == 'Cl_soma_ss':
        sol = solve_ivp(dkdt_Cl_soma, t_span, k0, method='RK23', max_step=1e-5)
    elif injection_protocol == 'Cl_soma_db':
        sol = solve_ivp(dkdt_Cl_soma, t_span, k0, method='RK23', max_step=1e-4)
    elif injection_protocol == 'Cl_dendrite_ss':
        sol = solve_ivp(dkdt_Cl_dendrite,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-5)
    elif injection_protocol == 'Cl_dendrite_db':
        sol = solve_ivp(dkdt_Cl_dendrite,
                        t_span,
                        k0,
                        method='RK23',
                        max_step=1e-4)
    elif injection_protocol == 'Cl_both_ss':
        sol = solve_ivp(dkdt_Cl_both, t_span, k0, method='RK23', max_step=1e-5)
    elif injection_protocol == 'Cl_both_db':
        sol = solve_ivp(dkdt_Cl_both, t_span, k0, method='RK23', max_step=1e-4)

    Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, Ca_sn, Ca_se, Ca_dn, Ca_de, n, h, s, c, q, z, V_sn, V_se, V_sg, V_dn, V_de, V_dg = sol.y

    my_cell = edNEGmodel(T, Na_sn, Na_se, Na_sg, Na_dn, Na_de, Na_dg, K_sn, K_se, K_sg, K_dn, K_de, K_dg, Cl_sn, Cl_se, Cl_sg, Cl_dn, Cl_de, Cl_dg, \
        Ca_sn, Ca_se, Ca_dn, Ca_de, X_sn, X_se, X_sg, X_dn, X_de, X_dg, alpha, \
        cbK_se, cbK_sg, cbK_de, cbK_dg, cbCa_sn, cbCa_dn, n, h, s, c, q, z, \
        V_sn, V_se, V_sg, V_dn, V_de, V_dg, cM_sn, cM_se, cM_sg, cM_dn, cM_de, cM_dg)

    return sol, my_cell