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

 Download zip file   Auto-launch 
Help downloading and running models
"… 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. …"
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:
Gene(s): Kv4.2 KCND2; Kv1.2 KCNA2; Cav1.3 CACNA1D; Cav1.2 CACNA1C; Kv2.1 KCNB1;
Simulation Environment: NEURON; Python;
Model Concept(s): Synaptic Plasticity; Signaling pathways; Calcium dynamics; Multiscale;
Implementer(s): Mattioni, Michele [mattioni at];
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;
# Author Michele Mattioni
# Thu Mar 19 10:40:51 GMT 2009

from neuron import h

class Synapse(object):
    """Synapse object class. Usually created in the spine"""
    def __init__(self, chan_type, section, position=0.5):
        self.chan_type = chan_type
        self.section = section
        self.chan = self.create_channel(chan_type, position)
        self.vecs = {} # Dictionary to record all the vectors 
        self.weight =  [[],[]]
        self.stims = []
    def create_channel(self, chan_type, position):
        """Create the NMDA or AMPA channel"""
        if chan_type == 'ampa':
            chan = h.AMPA(position, sec = self.section)
        elif chan_type == 'nmda':
            chan = h.NMDA(position, sec = self.section)
        elif chan_type == 'gaba':
            chan = h.GABA(position, sec = self.section)
        return chan    
    def create_stimul(self, array_inputs, neuron_time_resolution):
        """Create a netStim object and assign it to the synapse together with 
        a NetConnect one.
            array_inputs - Array which holds the inputs time
            neuron_time_resolution - resolution of the vectors when saving results"""
        # Removing duplicates
        array_inputs = list(set(array_inputs))
        # Ordering the inputs
        print "Creating vecStim for syn  Channel %s, %s Array input: %s" %(self.chan,
        vecStim = h.VecStim()
        self.vec = h.Vector(array_inputs)
        self.vecStim = vecStim
        # NetCon obj
        netCon = h.NetCon(vecStim, self.chan, 0, 0, 1) #Setting the weight
        #netCon.weight[0] = 1
        self.netCon = netCon # assign the point to the class as attribute
        #for thread safe reason
        self.netCon.delay = 1
        self.createVec(neuron_time_resolution) # Recording the synapse

    def createVec(self, neuron_time_resolution):
        """Create the vector to measure the activity of the synapse
        :param syn -  The synapse to record
        Remember: The weight on the synapse is a special one and holds the time 
        (from Neuron) and the corrispondent value.
        # Record the stimuls
        # The NetCon needs a record allocated to use to record the stuff
        stimul = "stimul_" + self.chan_type
        self.vecs[stimul] = h.Vector()
        # Record the current into the synaptic chan
        i = "i_" + self.chan_type
        g = "g_" + self.chan_type
        itmp = "itmp_" + self.chan_type
        scale = "scale_" + self.chan_type
        scale_ref = "scale_ref_" + self.chan_type
        self.vecs[i] = h.Vector()
        self.vecs[g] = h.Vector()
        self.vecs[itmp] = h.Vector()
        self.vecs[scale] = h.Vector()
        if neuron_time_resolution is None:
            self.vecs[i].record(self.chan, self.chan._ref_i)
            self.vecs[g].record(self.chan, self.chan._ref_g)
            self.vecs[itmp].record(self.chan, self.chan._ref_itmp)
            self.vecs[scale].record(self.chan, self.chan._ref_scale)
            self.vecs[i].record(self.chan, self.chan._ref_i, neuron_time_resolution)
            self.vecs[g].record(self.chan, self.chan._ref_g, neuron_time_resolution)
            self.vecs[itmp].record(self.chan, self.chan._ref_itmp, neuron_time_resolution)
            self.vecs[scale].record(self.chan, self.chan._ref_scale, neuron_time_resolution)