Olfactory Bulb Network (Davison et al 2003)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:2730
A biologically-detailed model of the mammalian olfactory bulb, incorporating the mitral and granule cells and the dendrodendritic synapses between them. The results of simulation experiments with electrical stimulation agree closely in most details with published experimental data. The model predicts that the time course of dendrodendritic inhibition is dependent on the network connectivity as well as on the intrinsic parameters of the synapses. In response to simulated odor stimulation, strongly activated mitral cells tend to suppress neighboring cells, the mitral cells readily synchronize their firing, and increasing the stimulus intensity increases the degree of synchronization. For more details, see the reference below.
Reference:
1 . Davison AP, Feng J, Brown D (2003) Dendrodendritic inhibition and simulated odor responses in a detailed olfactory bulb network model. J Neurophysiol 90:1921-35 [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 granule MC GABA cell;
Channel(s): I Na,t; I L high threshold; I A; I K; I K,leak; I M; I K,Ca; I Sodium; I Calcium; I Potassium;
Gap Junctions:
Receptor(s): GabaA; AMPA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Oscillations; Synchronization; Spatio-temporal Activity Patterns; Olfaction;
Implementer(s): Davison, Andrew [Andrew.Davison at iaf.cnrs-gif.fr];
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell; GabaA; AMPA; NMDA; I Na,t; I L high threshold; I A; I K; I K,leak; I M; I K,Ca; I Sodium; I Calcium; I Potassium; Gaba; Glutamate;
/
bulbNet
README *
cadecay.mod *
flushf.mod *
kA.mod *
kca.mod *
kfasttab.mod *
kM.mod *
kslowtab.mod *
lcafixed.mod *
nafast.mod *
nagran.mod *
nmdanet.mod *
bulb.hoc
calcisilag.hoc *
ddi_baseline.gnu *
ddi_baseline.ses *
experiment_ddi_baseline.hoc *
experiment_odour_baseline.hoc *
granule.tem *
init.hoc *
input.hoc *
input1 *
mathslib.hoc *
mitral.tem *
mosinit.hoc *
odour_baseline.connect
odour_baseline.gnu *
odour_baseline.ses *
parameters_ddi_baseline.hoc *
parameters_odour_baseline.hoc *
screenshot.png *
tabchannels.dat *
tabchannels.hoc *
                            
// bulb.hoc
// Olfactory bulb network model: network specification file
// Andrew Davison, The Babraham Institute, 2000.

// ¬¬ Initialisation ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

objref cvode, random
cvode = new CVode(0)    // start with CVode inactive
random = new Random(seed)
objref mit[nmitx][nmity], gran[ngranx][ngrany]
objref m2gAMPAlist, m2gNMDAlist, g2mlist
m2gAMPAlist = new List()
m2gNMDAlist = new List()
g2mlist = new List()
objref input[nmitx][nmity]
objref outfile
outfile = new File()
strdef filename


// ¬¬  Procedures ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

// Create cells --------------------------------------------------------

proc create_cells() { local i,j,p
  quitmodel = 0
  print "Creating cells. This may take some time."
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      mit[i][j] = new Mit()
    }
    p = 100*(i*nmity+j)/(nmitx*nmity+ngranx*ngrany)
    printf("\r=== %3d\% ===",p)
    flushf()
    doNotify() // Although this slows down cell creation, the
               // process is so long that we have to allow the
               // user to quit during the creation.
  }
  for i = 0, ngranx-1 {
    for j = 0, ngrany-1 {
      gran[i][j] = new Gran()
    }
    p = 100*(nmitx*nmity + i*ngrany+j)/(nmitx*nmity+ngranx*ngrany)
    printf("\r=== %3d\% ===",p)
    flushf()
    doNotify()
  }
  printf("\n")
  access mit[0][0].soma
}

// Connect cells, set synaptic parameters ------------------------------

func wrap() {
  if ($1 < 0) {
    return $2+$1
  } else {
    if ($1 < $2) {
      return $1
    } else {
      return $1-$2
    }
  }
}

proc connect_cells() { local i,j,phi,r,ii,jj,dg,edel // 2 args - dg, fileroot
  dg = $1   // "different glomeruli"
  print "Connecting cells"
  m2gAMPAlist.remove_all()
  m2gNMDAlist.remove_all()
  g2mlist.remove_all()
  sprint(filename,"%s.connect",$s2)
  outfile.wopen(filename)
  // Note: here it is possible for a mitral cell to have more than one
  // synaptic contact with any particular granule cell.
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      for k = 1, synpermit {
        phi = random.uniform(0,2*PI)
        r = random.uniform(0,rmax)
        x = dg*i*g2m + r*sin(phi)
        y = dg*j*g2m + r*cos(phi)
        ii = wrap( nint(x),ngranx )
        jj = wrap( nint(y),ngrany )
        outfile.printf("%d %d\n%5.1f %5.1f %d %d\n\n",dg*i*g2m,dg*j*g2m,x,y,ii,jj)
        //print "Mitral cell [",i,",",j,"] connected to granule cell [",ii,",",jj,"]. "
        edel = edelay + r/rmax*conducdel
        mit[i][j].dend m2gAMPAlist.append( new NetCon(&v(0.5),gran[ii][jj].AMPAr,thresh,edel,AMPAweight) )
        mit[i][j].dend m2gNMDAlist.append( new NetCon(&v(0.5),gran[ii][jj].NMDAr,thresh,edel,NMDAweight) )
        gran[ii][jj].periph g2mlist.append( new NetCon(&v(0.5),mit[i][j].GABAA,thresh,idelay,iweight) )
      }
    }
  }
  outfile.close()
}

proc set_GABAA_weights() { local i // 1 arg - weight
  for i = 0,g2mlist.count()-1 {
    g2mlist.object(i).weight = $1
  }
}

proc set_AMPA_weights() { local i // 1 arg - weight
  for i = 0,m2gAMPAlist.count()-1 {
    m2gAMPAlist.object(i).weight = $1
  }
}

proc set_NMDA_weights() { local i // 1 arg - weight
  for i = 0,m2gNMDAlist.count()-1 {
    m2gNMDAlist.object(i).weight = $1
  }
}

proc randomise_NMDA() { local i // 2 args - mean weight, variance
  m2gNMDAlist.object(0).weight = random.normal($1,$2)
  //m2gNMDAlist.object(0).weight = random.poisson($1)
  for i = 1,m2gNMDAlist.count()-1 {
    m2gNMDAlist.object(i).weight = random.repick()
  }
}

proc set_NMDA_time_constants() { local i,j, alpha, beta
				           // 2 args - rise time constant (ms), 
				           //     decay time constant (ms)
  if ($1 < 1e-9) { $1 = 1e-9 }
  if ($2 < 1e-9) { $2 = 1e-9 }
  beta = 1/$2
  alpha = 1/$1 - beta
   

  for i = 0, ngranx-1 {
    for j = 0, ngrany-1 {
      gran[i][j].NMDAr.Alpha = alpha
      gran[i][j].NMDAr.Beta = beta
    }
  }
}

proc set_GABAA_time_constant() { local i,j, tau
				           // 1 args - decay time constant (ms)
  if ($1 < 1e-9) { $1 = 1e-9 }
  tau = $1

  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      mit[i][j].GABAA.tau = tau
    }
  }
}

// Add input currents --------------------------------------------------

proc insert_iclamps() { local i,j // 2 args - del dur
  // if $1 is negative, delay is randomly chosen in the uniform interval 0,$1
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      mit[i][j].glom input[i][j] = new IClamp(0.5)
      input[i][j].dur = $2
      input[i][j].del = abs($1)
    }
  }
  random.uniform(0,abs($1))
  if ($1 < 0) {
    for i = 0, nmitx-1 {
      for j = 0, nmity-1 {
         input[i][j].del = random.repick()
      }
    }
  }
}

// Randomise initial conditions ----------------------------------------

proc random_init() { local i,j
  random.normal(-65,25)
  for i = 0,nmitx-1 {
    for j = 0, nmity-1 {
      mit[i][j].soma.v(0.5) = random.repick()
      mit[i][j].dend.v(0.5) = mit[i][j].soma.v(0.5)
      mit[i][j].prim.v(0.5) = mit[i][j].soma.v(0.5)
      mit[i][j].glom.v(0.5) = mit[i][j].soma.v(0.5)
    }
  }
  for i = 0,ngranx-1 {
    for j = 0, ngrany-1 {
      gran[i][j].soma.v(0.5) = random.repick()
      gran[i][j].deep.v(0.5) = gran[i][j].soma.v(0.5)
      gran[i][j].periph.v(0.5) = gran[i][j].soma.v(0.5)
    }
  }
}

// ¬¬ Create the model ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬

create_cells()
connect_cells(diffglom,fileroot)
insert_iclamps(-200,tstop)

// set synaptic properties
Cdur_NMDA = NMDArisetime
mg_NMDA = mgconc	
set_AMPA_weights(AMPAweight)
set_NMDA_weights(NMDAweight)
set_GABAA_weights(iweight)
set_NMDA_time_constants(NMDArise,NMDAdecay)