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
Accession:240116
"[...] 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. [...]"
Reference:
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;
Gene(s):
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 hotmail.it]; Hines, Michael [Michael.Hines at Yale.edu];
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;
/
modeldb-bulb3d
sim
ampanmda.mod
distrt.mod *
fi.mod
fi_stdp.mod *
gap.mod
Gfluct.mod
kamt.mod
kdrmt.mod
ks.mod
naxn.mod
orn.mod
ThreshDetect.mod *
all.py
all2all.py *
assembly.py
balance.py *
bindict.py
binsave.py
binspikes.py
blanes.hoc
blanes.py
blanes_exc_conn.txt
blanes6.dic
bulb3dtest.py
cancel.py
catfiles.sh
cellreader.py
cellwriter.py
cfg27.py
common.py
complexity.py *
convertdic.py
destroy_model.py
determine_connections.py
distribute.py *
dsac.py
Eta.txt *
fillgloms.py
fixnseg.hoc *
g_conn_stats.py
gapjunc.py
gen_weights.py
geodist.py
geodist.txt
getmitral.py
gidfunc.py
GJ.py
gj_nrn.hoc
Glom.py *
granule.hoc
granules.py
graphmeat.py
grow.py
growdef.py *
growout.py
job
Kod.txt *
lateral_connections.py
loadbalutil.py *
lpt.py *
mcgrow.py
MCrealSoma.py *
mgrs.py
misc.py
mitral.hoc
mkassembly.py
mkmitral.py
modeldata.py
mtgrow.py
MTrealSoma.py
MTrealSoma2.py
mtufted.hoc
multisplit_distrib.py
net_mitral_centric.py
Nod.txt *
odors.py
odorstim.py
odstim2.txt *
pad.txt *
params.py
parrun.py
pathdist.py
realgloms.txt *
runsim.py
spike2file.hoc *
spk2weight.py
split.py
subsetsim.py
test_complexity.py
txt2bin.py
util.py *
vrecord.py
weightsave.py
                            
# -*- coding: utf-8 -*-
'''
OdorStim supplies an odors[name] stimulus to each mitral tuft dendrite
defined by odors[name].glom_weights. Thus there is a separate NetCon for
each tuft dendrite on this process.
'''
from common import *
import params
import odors
from gidfunc import mgid2glom, ismitral, ismtufted
tufts_diverged = {}
import gidfunc

#''' diverge the orn touching the tufts '''
#def init_tufts_diverged():
#  tufts_diverged.clear()
#  N_Mc = params.Nmitral_per_glom
#  N_mTc = params.Nmtufted_per_glom
#  gid_mTc = params.gid_mtufted_begin
#  
#  for glomid in range(params.Ngloms):
#    
#    import mcgrow
#    for gid in range(glomid*N_Mc, (glomid+1)*N_Mc):
#      ntft = int(params.ranstream(gid, params.stream_tuft).discunif(mcgrow.n_min_tuft, mcgrow.n_max_tuft))
#      for i in range(ntft):
#        tufts_diverged[(gid, i)] = params.cellid2glomid(gid)
#
#    import mtcgrow
#    for gid in range(glomid*N_mTc+gid_mTc, (glomid+1)*N_mTc+gid_mTc):
#      ntft = int(params.ranstream(gid, params.stream_tuft).discunif(mtcgrow.n_min_tuft, mtcgrow.n_max_tuft))
#      for i in range(ntft):
#        tufts_diverged[(gid, i)] = params.cellid2glomid(gid)
#
#  # diverge uniformly
#  keys = tufts_diverged.keys()
#  while len(keys) > 1:
#    j = int(params.ranstream(*keys[0]).discunif(1, len(keys)-1))
#    aux = tufts_diverged[keys[0]]
#    tufts_diverged[keys[0]] = tufts_diverged[keys[j]]
#    tufts_diverged[keys[j]] = aux
#    del keys[0]

  

 
class OdorStim:
  def __init__(self, odorname, start, dur, conc):
    ''' Specifies the odor for an OdorStim. Note that the OdorStim is
      activated with setup which can only be called after the mitrals
      dict exists (usually from determine_connections.py).
    ''' 

    self.odorname = odorname
    self.start = start
    self.dur = dur
    self.conc = conc
    self.verbose = True
    self.next_invl = 0
    
    if params.glomerular_layer == 0:
      self.w_odor = odors.odors[odorname].getORNs(conc) # odor vector
    elif params.glomerular_layer == 1:
      self.w_odor = odors.odors[odorname].afterPG_1(conc) # odor vector
    elif params.glomerular_layer == 2:
      self.w_odor = odors.odors[odorname].afterPG_2(conc) # odor vector

    # set up the netcons to simulate the ORNs
    self.netcons = {}
    self.rng_act = params.ranstream(0, params.stream_orn_act)
    self.rng_act.uniform(params.sniff_invl_min, params.sniff_invl_max)
    
    model = getmodel()
    for gid, cell in model.mitrals.items(): 
      if h.section_exists("tuftden", 0, cell):
        for i in range(int(cell.ornsyn.count())):
          self.netcons[(gid, i)] = h.NetCon(None, cell.ornsyn.o(i))

    self.fih = h.FInitializeHandler(0, (self.init_ev, (start,)))

    

  def init_ev(self, start):
    ''' first event at start.
        In principle this can be called by the user during a simulation
        but if h.t < the previous stop, the randomness will be mixed
        between the multiple (start,stop) intervals.
    '''
    h.cvode.event(start, (self.ev, (start,)))


    
  def ev(self, time):
    ''' set odors stimulation intensity '''
    model = getmodel()
    for gid, cell in model.mitrals.items():
      
      if gidfunc.ismitral(gid):
        g_e_baseline = params.orn_g_mc_baseline
        std_e = params.orn_g_mc_std
        g_e_max = params.orn_g_mc_max
      else:
        g_e_baseline = params.orn_g_mt_baseline
        std_e = params.orn_g_mt_std
        g_e_max = params.orn_g_mt_max
        
      if h.section_exists("tuftden", 0, cell):
        for i in range(int(cell.ornsyn.count())):
          cell.ornsyn.o(i).cc_peak = self.w_odor[mgid2glom(gid)]
          cell.ornsyn.o(i).g_e_baseline = g_e_baseline
          cell.ornsyn.o(i).g_e_max = g_e_max
          cell.ornsyn.o(i).std_e =  std_e
    
    for nc in self.netcons.values():
      nc.event(h.t)

    if self.verbose and rank == 0:
      print 'activation of %s at %g (ms)\tinterval %g' % (self.odorname, time, self.next_invl)

    # set up for next sniff
    self.next_invl = self.rng_act.repick()
    if (time + self.next_invl) < (self.start + self.dur):
      h.cvode.event(time+self.next_invl, (self.ev, (time+self.next_invl,)))
    





# init diverged tufts
#init_tufts_diverged()

if __name__ == '__main__':
  h.load_file("nrngui.hoc")
  import common
  common.nmitral = 2
  common.ncell = 10
  import determine_connections
  import odors
  ods = OdorStim(odors.odors['Apple'])
  ods.setup(determine_connections.mitrals, 10., 20., 100.)
  h.tstop = 150
  h.run()
  print 't=', h.t