Modeling a Nociceptive Neuro-Immune Synapse Activated by ATP and 5-HT in Meninges (Suleimanova et al., 2020)

 Download zip file 
Help downloading and running models
Accession:266782
"Extracellular ATP and serotonin (5-HT) are powerful triggers of nociceptive firing in the meninges, a process supporting headache and whose cellular mechanisms are incompletely understood. The current study aimed to develop, with the neurosimulator NEURON, a novel approach to explore in silico the molecular determinants of the long-lasting, pulsatile nature of migraine attacks. The present model included ATP and 5-HT release, ATP diffusion and hydrolysis, 5-HT uptake, differential activation of ATP P2X or 5-HT3 receptors, and receptor subtype-specific desensitization. The model also tested the role of branched meningeal fibers with multiple release sites. Spike generation and propagation were simulated using variable contribution by potassium and sodium channels in a multi-compartment fiber environment. Multiple factors appeared important to ensure prolonged nociceptive firing potentially relevant to long-lasting pain. Crucial roles were observed in: (i) co-expression of ATP P2X2 and P2X3 receptor subunits; (ii) intrinsic activation/inactivation properties of sodium Nav1.8 channels; and (iii) temporal and spatial distribution of ATP/5-HT release sites along the branches of trigeminal nerve fibers. Based on these factors we could obtain either persistent activation of nociceptive firing or its periodic bursting mimicking the pulsating nature of pain. In summary, our model proposes a novel tool for the exploration of peripheral nociception to test the contribution of clinically relevant factors to headache including migraine pain." (paper abstract)
Reference:
1 . Suleimanova A, Talanov M, Gafurov O, Gafarov F, Koroleva K, Virenque A, Noe FM, Mikhailov N, Nistri A, Giniatullin R (2020) Modeling a Nociceptive Neuro-Immune Synapse Activated by ATP and 5-HT in Meninges: Novel Clues on Transduction of Chemical Signals Into Persistent or Rhythmic Neuronal Firing. Front Cell Neurosci 14:135 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism:
Cell Type(s):
Channel(s): I Sodium;
Gap Junctions:
Receptor(s): 5-HT3; P2X3;
Gene(s): Nav1.8 SCN10A; Nav1.3 SCN3A; Nav1.7 SCN9A;
Transmitter(s): Serotonin; ATP;
Simulation Environment: NEURON; Python;
Model Concept(s): Nociception;
Implementer(s):
Search NeuronDB for information about:  5-HT3; P2X3; I Sodium; Serotonin; ATP;
from neuron import h, gui
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as pyplot
import math
import random
import sys
#neuron.load_mechanisms("./mod")

from cfiber import cfiber
from onefibersimulation import balance

#paralleling NEURON interface
pc = h.ParallelContext()
rank = int(pc.id()) 
nhost = int(pc.nhost())

#parameters
cell_number = int(sys.argv[4]) # number of neurons 
fibers = []
nclist = []
spike_times_vec = h.Vector()
id_vec = h.Vector()

def addfibers(num = cell_number):
    '''
    Creates neuronal pool and returns gids of pool
    Parameters
    ----------
    num: int
        neurons number in pool
    Returns
    -------
    gids: list
        the list of neurons gids
    '''
    global fibers, rank, nhost, spike_times_vec, id_vec
    gids = []
    for i in range(rank, num, nhost):
        cell = cfiber(250, random.uniform(0.2, 3), random.randint(100, 500), random.randint(100, 1000), False, random.randint(int(sys.argv[5]), int(sys.argv[6])))
        fibers.append(cell)
        pc.set_gid2node(i, rank)
        nc = cell.connect2target(None)
        pc.cell(i, nc)
        nclist.append(nc)
        gids.append(i)
        pc.spike_record(i, spike_times_vec, id_vec)
    return gids

def spike_record(pool):
    ''' Records spikes from gids 
    Parameters
    ----------
    pool: list
      list of neurons gids
    Returns
    -------
    v_vec: list of h.Vector()
        recorded voltage
    '''
    v_vec = []
    for i in pool:
        cell = pc.gid2cell(i)
        vec = h.Vector()
        vec.record(cell.branch(0.5)._ref_vext[0])
        v_vec.append(vec)
    return v_vec

def simulate(pool, tstop=300, vinit=-55):
    ''' simulation control 
    Parameters
    ----------
    cell: NEURON cell
        cell for simulation
    tstop: int (ms)
        simulation time
    vinit: int (mV)
        initialized voltage
    '''
    h.finitialize(vinit)
    for i in pool:
        cell = pc.gid2cell(i)
        balance(cell)
    if h.cvode.active():
        h.cvode.active()
    else:
        h.fcurrent()
    h.frecord_init()
    h.tstop = tstop
    h.v_init = vinit
    pc.set_maxstep(0.5)
    h.stdinit()
    pc.psolve(tstop)

def finish():
    ''' proper exit '''
    pc.runworker()
    pc.done()
    h.quit()

def spikeout(pool, name, v_vec):
    ''' Reports simulation results 
    Parameters
    ----------
    pool: list
      list of neurons gids
    name: string
      pool name
    v_vec: list of h.Vector()
        recorded voltage
    '''
    global rank 
    pc.barrier()
    for i in range(nhost):
        if i == rank:
            for j in range(len(pool)):
                path=str('./results/'+ name + '%dr%d'%(j,rank))
                f = open(path, 'w')
                for v in list(v_vec[j]):
                    f.write(str(v)+"\n")
        pc.barrier()

def spiketimeout(file_name):
    ''' Reports simulation results 
    Parameters
    ----------
    pool: list
      list of neurons gids
    name: string
      pool name
    v_vec: list of h.Vector()
        recorded voltage
    '''
    global spike_times_vec, id_vec
    for i in range(int(pc.nhost())):
            pc.barrier() # Sync all processes at this point
            if i == int(pc.id()):
                if i == 0:
                    mode = 'w' # write
                else:
                    mode = 'a' # append
                with open(file_name, mode) as spk_file: # Append
                    for (t, idd) in zip(spike_times_vec, id_vec):
                        spk_file.write('%.3f\t%d\n' %(t, idd)) # timestamp, i
                        print(t)
                        print(idd)
    pc.barrier()
    print(spk_file)


if __name__ == '__main__':
    pool = addfibers()
    vext = spike_record(pool)
    print("- "*10, "\nstart")
    simulate(pool)
    print("- "*10, "\nend")
    spikeout(pool, "vext", vext)
    spiketimeout("./results/out.spk")
    #if (nhost > 1):
    finish()

Loading data, please wait...