Multiscale simulation of the striatal medium spiny neuron (Mattioni & Le Novere 2013)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:150284
"… We present a new event-driven algorithm to synchronize different neuronal models, which decreases computational time and avoids superfluous synchronizations. The algorithm is implemented in the TimeScales framework. We demonstrate its use by simulating a new multiscale model of the Medium Spiny Neuron of the Neostriatum. The model comprises over a thousand dendritic spines, where the electrical model interacts with the respective instances of a biochemical model. Our results show that a multiscale model is able to exhibit changes of synaptic plasticity as a result of the interaction between electrical and biochemical signaling. …"
Reference:
1 . Mattioni M, Le Novère N (2013) Integration of biochemical and electrical signaling-multiscale model of the medium spiny neuron of the striatum. PLoS One 8:e66811 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell; Synapse;
Brain Region(s)/Organism: Striatum;
Cell Type(s): Neostriatum medium spiny direct pathway GABA cell;
Channel(s): I Na,p; I Na,t; I T low threshold; I A; I K,Ca; I CAN; I Calcium; I A, slow; I Krp; I R; I Q;
Gap Junctions:
Receptor(s):
Gene(s): Kv4.2 KCND2; Kv1.2 KCNA2; Cav1.3 CACNA1D; Cav1.2 CACNA1C; Kv2.1 KCNB1;
Transmitter(s):
Simulation Environment: NEURON; Python;
Model Concept(s): Synaptic Plasticity; Signaling pathways; Calcium dynamics; Multiscale;
Implementer(s): Mattioni, Michele [mattioni at ebi.ac.uk];
Search NeuronDB for information about:  Neostriatum medium spiny direct pathway GABA cell; I Na,p; I Na,t; I T low threshold; I A; I K,Ca; I CAN; I Calcium; I A, slow; I Krp; I R; I Q;
# Michele Mattioni
# Tue Aug 10 09:08:06 BST 2010

from neuronvisio.manager import BaseRef

class TimeSeries(BaseRef):
    """
    Extend the classic VecRef from Neuronvisio to allocate 
    the biochemical results.
    """
    
    def __init__(self, sec_name=None, vecs=None, detail=None):
        
        BaseRef.__init__(self)
        self.sec_name = sec_name
        self.vecs = vecs
        self.detail = detail

class WeightRef(BaseRef):
    """
    Extend the classic VecRef from Neuronvisio to allocate 
    the biochemical results.
    """
    
    def __init__(self, sec_name=None, vecs=None, detail=None):
        
        BaseRef.__init__(self)
        self.sec_name = sec_name
        self.vecs = vecs
        self.detail = detail

class FluxRef(BaseRef):
    """
    Extend the classic VecRef from Neuronvisio to allocate 
    the K flux.
    """
    
    def __init__(self, sec_name=None, vecs=None, detail=None):
        
        BaseRef.__init__(self)
        self.sec_name = sec_name
        self.vecs = vecs
        self.detail = detail

class ExtRef(object):
    "Holds all the methods to add new ref to the manager"
    

    def add_timeseries(self, manager, stim_spines, nrnSim):
        """Adding timeseries from the ecell world to the manager"""
        for spine_id in stim_spines:
            
            spine = nrnSim.spines[spine_id]
            # Retrieving the biochemical timecourses
            spine.ecellMan.converToTimeCourses()
            time_courses = spine.ecellMan.timeCourses 
            
            pos = str(spine.pos)
            parent = spine.parent.name()
            detail = parent + "_" + pos
            sec_name = str(spine.id)
            
            # Adding a record for each variable
            vecs = {}
            time = None
            for var in time_courses.keys():
                time = time_courses[var][:,0]
                vecs[var] = time_courses[var][:,1]
                
            timeseriesRef = TimeSeries(sec_name=sec_name, 
                                       vecs=vecs,
                                       detail=detail)
            # Ecell use an adaptative time for the integration so the time is different
            # for each spine.
            # We create a custum timeseries to differentiate within them
            timeseriesRef.group_id = "timeSeries_" + spine.id
            manager.add_ref(timeseriesRef, time)
            
    def add_weights(self, manager, stim_spines, nrnSim):
        """Add the weight to the manager"""
        for spine_id in stim_spines:
            spine = nrnSim.spines[spine_id]
            
            pos = str(spine.pos)
            parent = spine.parent.name()
            detail = parent + "_" + pos
            sec_name = str(spine.id)
            
            vecs = {}
            time = None
            
            for syn in spine.synapses:
                if syn.chan_type == 'ampa':
                    if syn.weight[0]:
                        time = syn.weight[0]
                        weight = syn.weight[1]
                        vecs['weight'] = weight
                        weightRef = WeightRef(sec_name=sec_name,
                                              vecs=vecs,
                                              detail=detail)
                        manager.add_ref(weightRef, time)
                        
    def add_kflux(self, manager, stim_spines, nrnSim):
        """Add the weight to the manager"""
        for spine_id in stim_spines:
            spine = nrnSim.spines[spine_id]
            
            pos = str(spine.pos)
            parent = spine.parent.name()
            detail = parent + "_" + pos
            sec_name = str(spine.id)
            
            vecs = {}
            time = None
            
            for syn in spine.synapses:
                if syn.chan_type == 'ampa':
                    if syn.weight[0]:
                        time = spine.k_flux[0]
                        vecs['k_flux'] = spine.k_flux[1]
                        fluxRef = FluxRef(sec_name=sec_name,
                                              vecs=vecs,
                                              detail=detail)
                        manager.add_ref(fluxRef, time)