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 cell; Olfactory bulb main interneuron granule MC cell; Olfactory bulb main interneuron granule TC 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 cell; Olfactory bulb main tufted middle cell; Olfactory bulb main interneuron granule TC 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 * *
Load balanced (either whole cell, or multisplit) distribution of
mitrals, and granules along with all necessary connection information
on each rank. To do this we start with a
1)round-robin distribution of mitrals and granule
2)create the mitrals
3)determine the connection info for each mitral
4)transfer the connection info appropriate for each round-robin located granule
5)create the granules
6)create the MGRS
7)determine complexity of the mitrals and granules
8)destroy the model, retaining the connection info for mitrals and granules
9)load balance the mitrals (or pieces) and granules
10)create the mitrals (multisplit pieces if needed) and granules
11)register the mitral and granule gids with their spike generation locations
11)transfer the connection info to the proper ranks
12)make the connections

Note that 1-6 is accomplished by importing the net_mitral_centric model
and executing nmc.build_net_round_robin(getmodel())

from common import *
import net_mitral_centric as nmc
from complexity import determine_complexity
from balance import load_bal
from destroy_model import destroy_model
from all2all import all2all
import util
import mgrs

def whole_cell_distrib(model):
  enter = h.startsw()
  cx = determine_complexity(model)
  #start over
  # but we still have model.mconnections and model.rank_gconnections
  # from the round-robin distribution perspective.
  # we will need to tell the ranks  where to distribute that information

  cx = load_bal(cx, nhost) #cx is the list of (cx,gid) we want on this process
  # the new distribution of mitrals and granules
  model.gids = set([item[1] for item in cx])
  model.mitral_gids = set([gid for gid in model.gids if gid < params.gid_granule_begin])
  model.granule_gids = model.gids - model.mitral_gids

  # get the correct mconnections and gconnections
  # Round-robin ranks that presently have the connection info for the gids
  rr = {}
  for gid in model.gids:
    r = gid%nhost
    if not rr.has_key(r):
  rr = all2all(rr)
  # rr is now the ranks for where to send the synapse information
  # all the gids in rr were 'owned' by the round-robin distribution
  mc = model.mconnections
  gc = model.rank_gconnections
  # construct a ggid2connection dict
  ggid2connection = {}
  for r in gc:
    for ci in gc[r]:
      ggid = ci[3]
      if not ggid2connection.has_key(ggid):
  for r in rr:
    gids = rr[r]
    mgci = []
    rr[r] = mgci
    for gid in gids:
      if mc.has_key(gid):
  mgci = all2all(rr)
  # mgci contains all the connection info needed by the balanced distribution
  # create mitrals and granules and register and create synapses
  # build_synapses() ... use mgci to build explicitly
  model.mgrss = {}
  for r in mgci:
    for cil in mgci[r]:
      for ci in cil:
        if not model.mgrss.has_key(mgrs.mgrs_gid(ci[0], ci[3], ci[6])):
          rsyn = mgrs.mk_mgrs(*ci[0:7])
          if rsyn:
            model.mgrss.update({rsyn.md_gid : rsyn})
  nmultiple = int(pc.allreduce(mgrs.multiple_cnt(), 1))
  if rank == 0:
    print 'nmultiple = ', nmultiple
  detectors = h.List("ThreshDetect")
  util.elapsed('%d ThreshDetect for reciprocalsynapses constructed'%int(pc.allreduce(detectors.count(),1)))
  if rank == 0: print 'whole_cell_distrib time ', h.startsw() - enter