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 *
                            
// input.hoc
// Olfactory bulb network model: define procedures to set-up input
// Andrew Davison, The Babraham Institute, 2000.

strdef odourfile,inputfile
objref odour, inputarray
objref A, X, S
odour = new Vector(nof)
inputarray = new Matrix(nmitx,nmity)


proc set_no_input() {
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] = 0.0
      input[i][j].amp = inputarray.x[i][j]
    }
  }
}


proc add_uniform_input() { local i,j // 2 args - min and max input
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] += random.uniform($1,$2)
      input[i][j].amp = inputarray.x[i][j]
    }
  }
}


proc add_focal_input() {  // 4 args - max input, centre coords and half-width of spot
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] += $1*exp(-2.77259*((i-$3)*(i-$3)+(j-$2)*(j-$2))/($2*$2))
      input[i][j].amp = inputarray.x[i][j]
      //print i,j,input[i][j].amp
    }
  }
}



proc generate_odour_matrix() { local i,j,r,ix,iy,k,l,min,max
  A = new Matrix(nglom,nof) 	// A is set here and should
                		// not be changed elsewhere
  S = new Matrix(nmitx,nmity)   // X and S are local
  X = new Vector(nglom)     	// matrices

  r = random.normal(0.0,0.5)

  // Generate original matrix
  for i = 0,nglom-1 for j = 0,nof-1 {
    r = random.repick()
    if (r < 0) {r = 0}
    A.x[i][j] = r
  }

  // Average to obtain similar responses of nearby glomeruli
  blur = 2

  for j = 0,nof-1 {
    X = A.getcol(j)
    for ix = 0,nmitx-1 for iy = 0,nmity-1 {
      S.x[ix][iy] = X.x[ix*nmity+iy]
    }
    for ix = 0,nmitx-1 for iy = 0,nmity-1 {
      X.x[ix*nmity+iy] = 0
      for k = -1,1 for l = -1,1 {
        kx = mod(ix+k,nmitx)
        ly = mod(iy+l,nmity)
        X.x[ix*nmity+iy] += ( S.x[kx][ly] * exp(-blur*sqrt(k^2+l^2)) )
      }
    }
    A.setcol(j,X)
  }

  max = arraymax(A)
  min = arraymin(A)
  print "min, max ",min,max
  for i=0,nglom-1 for j=0,nof-1 {
    A.x[i][j] += -min
  }
  A.muls(1/(max-min))
}


proc read_odour_file() {
  sprint(odourfile,"odour%d",$1)
  ropen(odourfile)
  for i = 0,nof-1 {
    odour.x[i] = fscan()
  }
  ropen()
  printf("Odour %d loaded:\n",$1)
  odour.printf("%6.3f")
}

proc map_odour_to_input() { local i,j // 2 args - odour vector and odour intensity
  X = A.mulv($o1)
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] += $2 * X.x[i*nmity+j]
      input[i][j].amp = inputarray.x[i][j]
    }
  }
}

proc add_odour_input() { // 2 args - odour number and input intensity
  generate_odour_matrix()
  read_odour_file($1)
  map_odour_to_input(odour,$2)
}

proc add_fixed_input() { local i,j // 2 args - input vector and input intensity
  sprint(inputfile,"input%d",$1)
  ropen(inputfile)
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] = fscan()
      input[i][j].amp = $2*inputarray.x[i][j]
    }
  }
  ropen()
  printf("Input %d loaded:\n",$1)
  inputarray.printf("%6.3f")
}

proc glomshock() { local i,j // 3 args - amplitude, delay and duration
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] = $1
      input[i][j].amp = inputarray.x[i][j]
      input[i][j].del = $2
      input[i][j].dur = $3
    }
  }
}