Draft:Epileptor-2

From testwiki
Jump to navigation Jump to search

Template:AFC submission

Template:AFC comment


Template:Short description Template:Draft topics Template:AfC topic

Epileptor-2 is the simplified mathematical model of epileptic discharges observed in the brain[1], named after the previous model called Epileptor[2]. It replicates brief interictal discharges—observed as clusters of action potential spikes in the activity of individual neurons—and longer ictal discharges, represented as clusters of these shorter discharges. According to the Epileptor-2 model, brief interictal discharges are characterized as stochastic oscillations of the membrane potential and synaptic resources, while ictal discharges emerge as oscillations in the extracellular concentration of potassium ions and the intracellular concentration of sodium ions. The both models, Epileptor and Epileptor-2, demonstrate that ionic dynamics play a decisive role in the generation of pathological activity.

Below, a modified Epileptor-2 model is described, where the second extracellular compartment has been added. Ionic dynamics is described with two extracellular concentrations of potassium ions, at the proximity of neurons, [K]o1, and at a distance, [K]o2, and the intracellular concentration of sodium ions, [Na]i:

d[K]o1dt=[K]o2[K]o1τK1+δKν(t)2βIpump(t)

d[K]o2dt=[K]bath[K]o2τK2+[K]o1[K]o2τK1

d[Na]idt=[Na]i0[Na]iτNa+δNaν(t)3Ipump(t)

According to these equations, the concentrations increase because of firing with the rate ν, relax with the time scales τK1,τK2, and τNa, and decrease due to the sodium-potassium pump Ipump.

The membrane polarization V averaged across population and the synaptic resource x are governed by

dVdt=u(t)Vτm

dxdt=1xτxδxxν(t)

where

u(t)=gK(VK(t)VK0)+Gsyn(x0.5)ν(t)+ση(t)

The source term u(t) summarises the current mediated by the changes ot the potassium concentration, the synaptic current and the noise η(t) (white gaussian noise). The synaptic resource decreases because of firing with the rate ν and recovers with the time scale τx.

The potassium reversal potential is

VK(t)=26.6ln([K]o2/130)

The sodium-potassium pump is

Ipump(t)=ρ/(1+exp(3.5[K]o1)/(1+exp((25[Na]o1)/3))

The sigmoidal dependence of the firing rate on voltage is

ν(t)=100(2/(1+exp((6V)/10))1)

Representative neuron is governed by the quadratic integrate-and-fire model for the membrane potential U. It receives the same input u(t) as the population:

dUdt=gUCU(UU1)(UU2)+gLCUu(t),ifU>UththenU=Ureset

The parameters are as follows:

τK1=25s,τK2=250s,τNa=20s,τx=2s,τm=0.01s,δK=0.04mM,δNa=0.03mM,δx=0.01,ρ=0.8,β=10,σ=8,Gsyn/gL=2.5mVs,gK/gL=0.5,gL=5nS,[K]o0=3mM,[K]bath=8.5mM,[Na]i0=10mM,gU=0.4,CU=0.2,Uth=25,Ureset=50,U1=60,U2=40,U0=70

Ictal discharges in experiment and Epileptor-2 model. Membrane potential and extracellular potassium concentration have been recorded in rat brain slice during induced epileptiform activity. Membrane potential and the extracellular potassium concentration obtained in simulations are compared to data. The ictal discharges are composed of short bursts each containing several action potentilals.

The model's implementation in Python is given below:

import numpy as np
import pylab as pl

def Sigmoid(V):
    scc = 2. / (1 + np.exp(2 * (Vth - V) / K_v)) - 1
    psc = np.clip(scc, a_min=0, a_max=None)
    return vmax * psc

def I_pump(K, Na):
    return rho / ((1 + np.exp(3.5 - K)) * (1 + np.exp((25 - Na) / 3)))

def VK(Kconc):
    return 26.6 * np.log(Kconc / 130.)

def u_over_gL(K, nu, x, y, Ipi):
    eta = np.random.normal(0, 1)
    vkk = VK(y)
    #********************************************************************************************
    return (g_K * (vkk - vkk0) + G_syn * nu * (x - 0.5)
            + sigma * eta / np.sqrt(dt) / np.sqrt(1000))
    #********************************************************************************************

def dots(states):
    K, Na, x, V, U, y = states
    Ip_ = I_pump(K, Na)
    nu_ = Sigmoid(V)
    uu_ = u_over_gL(K, nu_, x, y, Ip_)
    #*************************************************************
    dotK  = (y    - K ) / tau_K  + deltaK  * nu_ - 2 * beta * Ip_
    dotNa = (Na_0 - Na) / tau_Na + deltaNa * nu_ - 3 * Ip_
    dotV  = (uu_ - V) / tau_m
    dotx  = (1 - x) / tau_x - deltax * x * nu_
    doty  = (Kbath - y) / tau_y + (K-y)/tau_K
    dotU  = 1000 * ((gU / CU) * (U - U1) * (U - U2) + gL * uu_ / CU)
    #*************************************************************
    return np.array([dotK, dotNa, dotx, dotV, dotU, doty])

# in ms
tau_K = 100/4  # s
tau_Na = 20  # s
tau_m = 0.01  # s
tau_x = 2  # s
tau_y = 250

deltaK = 0.02*2         # switches from ID to IID
deltaNa = 0.03
deltax = 0.01
rho = 0.2*4             # mM/ms
beta = 10.
sigma = 25./3
G_syn = 5./2
g_K = 0.5
K_0 = 3.
Kbath1 = 3
Kbath2 = 8.5
Na_0 = 10.
vmax = 100
Vth = 25./4
K_v = 20.
gL = 1*5  # from their mathematica notebook
# parameters of the observer:
gU = 0.4
CU = 200.
Uth = 25.
Vr = -50.
U1 = -60.
U2 = -40.
U_0 = -70.

V_0 = 0
x_0 = 1.
y_0 = Kbath1
nu_0 = 0
Ip_0 = 0
vkk0 = VK(K_0)

dt = 0.01  # in second
u_0 = u_over_gL(K_0, nu_0, x_0, y_0, Ip_0)

tt = 400.  # in second
lngth = int(tt / dt)
xax = np.arange(0, tt, dt)

arbig = np.zeros((lngth, 9))
arbig[0] = [K_0, Na_0, x_0, V_0, U_0, y_0, nu_0, Ip_0, u_0]
Ki, Nai, xi, Vi, Ui, yi, nui, Ipi, ui = arbig[0]

for ii, it in enumerate(xax[1:], 1):
    if it <= 50:
        Kbath = Kbath1
    else:
        Kbath = Kbath2
    state = dots(arbig[ii - 1, :6])
    Ki, Nai, xi, Vi, Ui, yi = arbig[ii - 1, :6] + dt * state

    #***********************************
    Ipi = I_pump(Ki, Nai)
    nui = Sigmoid(Vi)
    ui = u_over_gL(Ki, nui, xi, yi, Ipi)
    #***********************************

    if Ui > Uth:
        Ui = Vr
    arbig[ii] = [Ki, Nai, xi, Vi, Ui, yi, nui, Ipi, ui]

# Plotting **********************************************************************************
KK, NNa, xx, VV, UU, yy, nuu, II, uu = arbig.T

pl.close('all')
pl.figure(figsize=(10, 7))

ax = pl.subplot(511)
pl.plot(xax, UU, 'k')
pl.ylabel(r'$U (mV)$')

pl.subplot(512, sharex=ax)
pl.plot(xax, VV, 'r')
pl.ylabel(r'$V(mV)$')

pl.subplot(513, sharex=ax)
pl.plot(xax, xx, color=(0.5, 0., 0.5))
pl.ylabel(r'$x^D$')

pl.subplot(514, sharex=ax)
pl.plot(xax, NNa, 'r')
pl.ylabel(r'$[Na]_i$ (mM)')

pl.subplot(515, sharex=ax)
pl.plot(xax, (yy+KK)/2, color=(0.2, 0.6, 0.2), linewidth=3)
pl.ylabel(r'$[K]_o$ (mM)')

pl.tight_layout()
pl.show()

References

Template:Reflist