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

 Download zip file 
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]
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
# date Tue Dec  8 15:55:10 GMT 2009

from helpers.loader import Loader
import matplotlib
import matplotlib.pyplot as plt

class spinePercentual(object):
    def __init__(self):
        self.soma_radius = 8
        self.prox_ex = self.soma_radius + 20 
        self.mid_ex = self.prox_ex + 20
        self.dist_ex = self.mid_ex + 190

    def reduce_noise(self, spines_pos):
        """We don't take in account the first 5 spines position"""
        pos_to_remove = 5
        for i in range(pos_to_remove):
        return spines_pos
    def convert_to_perc(self, spines_pos):
        """Convert the position to a normalized per dend pos"""
        # Divide the spines for branch
        # Two mid dendrite for branch
        self.mids = [[],[]]
        # 4 Distal dendrite for branch.
        self.dists = [[],[],[],[]]
        for sp in spines_pos:
            if self.prox_ex < sp < self.mid_ex: #Mid dend
                x = self.calc_perc_pos(self.prox_ex, self.mid_ex, sp)
                # Add the spine to the dendrite which have less spines
                shortest = min(self.mids, key=len)
            elif self.mid_ex < sp < self.dist_ex: # Dist dend
                x = self.calc_perc_pos(self.mid_ex, self.dist_ex, sp)
                shortest = min(self.dists, key=len) 
        # Insert the spines in perc
    def calc_perc_pos(self, start, end, value):
        """Calc the percentual of the spine in the dends
        lenght : 1 = value : x
        x = value/lenght 
        real_value = value - start
        length = end -start
        x = real_value/length
        return x
if __name__ == "__main__":
    l = Loader()
    spines_pos = l.load('spines_pos.pickle')
    plt.hist(spines_pos, bins=30, label='normal')
    spinePer = spinePercentual()
    spines_pos = spinePer.reduce_noise(spines_pos)
    plt.hist(spines_pos, bins=30, label='noise red')
    print "Calculating the spines pos normalized to 1"
    spinePer.convert_to_perc(spines_pos), '.', 'mid_spines_per_branch.pickle'), '.', 'dist_spines_per_branch.pickle')

Loading data, please wait...