Parallel odor processing by mitral and middle tufted cells in the OB (Cavarretta et al 2016, 2018)

 Download zip file   Auto-launch 
Help downloading and running models
"[...] experimental findings suggest that MC and mTC may encode parallel and complementary odor representations. We have analyzed the functional roles of these pathways by using a morphologically and physiologically realistic three-dimensional model to explore the MC and mTC microcircuits in the glomerular layer and deeper plexiform layers. [...]"
1 . Cavarretta F, Burton SD, Igarashi KM, Shepherd GM, Hines ML, Migliore M (2018) Parallel odor processing by mitral and middle tufted cells in the olfactory bulb. Sci Rep 8:7625 [PubMed]
2 . Cavarretta F, Marasco A, Hines ML, Shepherd GM, Migliore M (2016) Glomerular and Mitral-Granule Cell Microcircuits Coordinate Temporal and Spatial Information Processing in the Olfactory Bulb. Front Comput Neurosci 10:67 [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 tufted middle GLU cell; Olfactory bulb main interneuron granule MC GABA cell; Olfactory bulb main interneuron granule TC GABA cell; Olfactory bulb (accessory) mitral cell; Olfactory bulb main tufted cell external; Olfactory bulb short axon cell;
Channel(s): I A; I Na,t; I_Ks; I K;
Gap Junctions: Gap junctions;
Receptor(s): AMPA; GabaA; NMDA;
Transmitter(s): Glutamate; Gaba;
Simulation Environment: NEURON;
Model Concept(s): Action Potentials; Action Potential Initiation; Active Dendrites; Long-term Synaptic Plasticity; Synaptic Integration; Synchronization; Pattern Recognition; Spatio-temporal Activity Patterns; Temporal Pattern Generation; Sensory coding; Sensory processing; Olfaction;
Implementer(s): Cavarretta, Francesco [francescocavarretta at]; Hines, Michael [Michael.Hines at];
Search NeuronDB for information about:  Olfactory bulb main interneuron granule MC GABA cell; Olfactory bulb main tufted middle GLU cell; Olfactory bulb main interneuron granule TC GABA cell; GabaA; AMPA; NMDA; I Na,t; I A; I K; I_Ks; Gaba; Glutamate;
distrt.mod *
fi_stdp.mod *
ThreshDetect.mod * * *
blanes6.dic * *
Eta.txt *
fixnseg.hoc *
gj_nrn.hoc *
granule.hoc *
Kod.txt * * * *
Nod.txt *
odstim2.txt *
pad.txt *
realgloms.txt *
spike2file.hoc * *
from common import *
import gidfunc
import params
import misc
import geodist
from math import exp
from util import elapsed
import params

def load_blanes_dic(filename):
    ggids_here = getmodel().granules.keys()
    blanes_here = set([x[1] for x in params.glom2blanes ])
    import struct
    with open(filename, 'rb') as fi:
        rec =
        while rec:
            ggid, blanesgid, w = struct.unpack('>QQQ', rec)
            if ggid in ggids_here and blanesgid in blanes_here:
                yield ggid, blanesgid, w
            rec =


def mkblanes(gid):
    return h.Blanes()

def mk_gl2b_connections():
  for x in params.glom2blanes:
    if len(x) == 2:
      glomid, blanes_gid = x
      w = None
      glomid, blanes_gid, w = x
    if blanes_gid not in getmodel().blanes.keys():
    for mtgid in range(glomid*params.Nmtufted_per_glom+params.gid_mtufted_begin, (glomid+1)*params.Nmtufted_per_glom+params.gid_mtufted_begin):
      getmodel().mt2blanes_connections.add((mtgid, blanes_gid, w))
  elapsed('%d middle tufted to blanes connections generated' % pc.allreduce(len(getmodel().mt2blanes_connections),1))
class mt2blanes:
    def __init__(self, mgid, blanesgid, w=None):
        self.mgid = mgid
        self.blanes_gid = blanesgid
        self.blanes_cell = getmodel().blanes[blanesgid]

        rng = params.ranstream(blanesgid, params.stream_blanes+gidfunc.mgid2glom(mgid))
        ibranch = int(rng.discunif(0, self.blanes_cell.nden0-1))
        idend = int(rng.discunif(0, self.blanes_cell.nden1-1))
        x = rng.uniform(0,1)

        self.syn = h.Exp2Syn(self.blanes_cell.dend[ibranch][idend](x))
        self.syn.e = 0
        self.syn.tau1 = 1
        self.syn.tau2 = 250 = pc.gid_connect(mgid, self.syn)
        if w:
[0] = w
[0] = params.mt2bc_exc_gmax = 1
        self.gid = gidfunc.mbs_gid(mgid, blanesgid)
    def wstr(self):
        return '%d %d %g\n'%(self.gid,[1],[2]*self.syn.gmax)
class blanes2granule:
    def __init__(self, blanesgid, ggid, w=1):
        self.ggid = ggid
        self.blanes_gid = blanesgid
        self.granule_cell = getmodel().granules[ggid]

        rng = params.ranstream(blanesgid, params.stream_blanes+params.Nmtufted+ggid)
        L = self.granule_cell.priden2[0].L * rng.uniform(0, 1)
        if L <= self.granule_cell.priden2[0].L:
            sec = self.granule_cell.priden2[0]
            x = L/self.granule_cell.priden2[0].L
        self.syn = h.Exp2Syn(sec(x))
        self.syn.e = -80
        self.syn.tau1 = 1
        self.syn.tau2 = 15 = pc.gid_connect(self.blanes_gid, self.syn)[0] = w*params.bc2gc_inh_gmax = 1

        self.gid = gidfunc.bc2gc_gid(blanesgid, ggid)
    def wstr(self):
        return '%d %d %g\n'%(self.gid,[1],[2]*self.syn.gmax)

def mk_b2g_connections():
#    gid_blanes_existing = set([x[1] for x in params.glom2blanes ])
    elapsed('\t%d granules are generated' % pc.allreduce(len(getmodel().granules),1))
    for ggid, blanes_gid, factor in load_blanes_dic('blanes6.dic'):
      getmodel().blanes2gc_connections.add((ggid, blanes_gid, factor))

#    for ggid in getmodel().granules:
#      for blanes_gid in gid_blanes_existing:
#        getmodel().blanes2gc_connections.add((ggid, blanes_gid))
    elapsed('%d blanes to granule connections generated' % pc.allreduce(len(getmodel().blanes2gc_connections),1))