Olfactory bulb microcircuits model with dual-layer inhibition (Gilra & Bhalla 2015)

 Download zip file 
Help downloading and running models
Accession:153574
A detailed network model of the dual-layer dendro-dendritic inhibitory microcircuits in the rat olfactory bulb comprising compartmental mitral, granule and PG cells developed by Aditya Gilra, Upinder S. Bhalla (2015). All cell morphologies and network connections are in NeuroML v1.8.0. PG and granule cell channels and synapses are also in NeuroML v1.8.0. Mitral cell channels and synapses are in native python.
Reference:
1 . Gilra A, Bhalla US (2015) Bulbar microcircuit model predicts connectivity and roles of interneurons in odor coding. PLoS One 10:e0098045 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Olfactory bulb;
Cell Type(s): Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell;
Channel(s): I A; I h; I K,Ca; I Sodium; I Calcium; I Potassium;
Gap Junctions:
Receptor(s): AMPA; NMDA; Gaba;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: Python; MOOSE/PyMOOSE;
Model Concept(s): Sensory processing; Sensory coding; Markov-type model; Olfaction;
Implementer(s): Bhalla, Upinder S [bhalla at ncbs.res.in]; Gilra, Aditya [aditya_gilra -at- yahoo -period- com];
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell; AMPA; NMDA; Gaba; I A; I h; I K,Ca; I Sodium; I Calcium; I Potassium; Gaba; Glutamate;
import string
from pylab import *
#from scipy.interpolate import interp1d # needs liblapack, not available on cluster nodes
# Have just extracted the Poisson generating routines from neuroutils.py
# so that I don't need to import scipy and thus it will run on all gj nodes.

def poissonTrain(runtime, firingrate, refractory):
    lastfiredtime = 0 # s
    ornstimvector = []
    if firingrate > 0:
        while lastfiredtime < runtime:
            # numpy.random.exponential
            isi = exponential(1/firingrate) # inter-spike interval 'isi' of a Poisson spike generator is exponentially distributed r*exp(-r*isi)
            if isi < refractory:
                continue ###### Do not fire
            else:
                #### FIRED! append time of firing
                lastfiredtime += isi
                if lastfiredtime < runtime:
                    ornstimvector.append(lastfiredtime)
    return ornstimvector

def poissonTrainVaryingRate(runtime, maxfiringrate, refractory, tvec, ratevec):
    """
    This uses the spike thinning algorithm outlined in Dayan and Abbott 2001.
    firing rate should never exceed maxfiringrate. I typically give twice the estimated max to be safe.
    tvec and ratevec are lists t and rate respectively,
    from which I obtain a rate(t) function by linear interpolation (numpy).
    """
    lastfiredtime = 0 # s
    ornstimvector = []
    # Do not want to increase dependency on scipy.interpolate
    # as not installed on all nodes on cluster -- use numpy
    #rate = interp1d(tvec, ratevec, kind='linear')
    while lastfiredtime < runtime:
        # numpy.random.exponential
        # inter-spike interval 'isi' of a homogeneous (const rate 'r') Poisson spike generator
        # is exponentially distributed r*exp(-r*isi)
        isi = exponential(1/maxfiringrate)
        if isi < refractory:
            continue ###### Do not fire
        else:
            lastfiredtime += isi
            if lastfiredtime > runtime:
                break
            # spike thinning by rate(t)/maxfiringrate
            # numpy.random.uniform
            if uniform(0,1) < interp(lastfiredtime,tvec,ratevec)/maxfiringrate:
                #### FIRED! append time of firing
                ornstimvector.append(lastfiredtime)
    return ornstimvector