Mitral cell activity gating by respiration and inhibition in an olfactory bulb NN (Short et al 2016)

 Download zip file 
Help downloading and running models
Accession:183300
To explore interactions between respiration, inhibition, and olfaction, experiments using light to active channel rhodopsin in sensory neurons expressing Olfactory Marker Protein were performed in mice and modeled in silico. This archive contains NEURON models that were run on parallel computers to explore the interactions between varying strengths of respiratory activity and olfactory sensory neuron input and the roles of periglomerular, granule, and external tufted cells in shaping mitral cell responses.
Reference:
1 . Short SM, Morse TM, McTavish TS, Shepherd GM, Verhagen JV (2016) Respiration Gates Sensory Input Responses in the Mitral Cell Layer of the Olfactory Bulb. PLoS One 11:e0168356 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network; Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Olfactory bulb;
Cell Type(s): Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell; Olfactory bulb main tufted cell external;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Activity Patterns; Sensory processing; Sensory coding; Bursting; Oscillations; Olfaction;
Implementer(s): Morse, Tom [Tom.Morse at Yale.edu];
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell;
Files displayed below are from the implementation
/
ShortEtAl2016
event_generator
gauss.hoc
gen_events.hoc
                            
// gen_events.hoc
// The gen_events function returns a vector of spike times that are
// based on a poisson firing rate created from periodic repetition of
// a gaussian probability distribution function see below for
// documentation on the arguments passed to the gen_events function:

load_file("gauss.hoc")

objref _poisson_rate
objref store_gauss_centers, time_vec, r_
objref r_
renormalization=1 // set to 0 if no renomalization
seed_ = 1 // make random stream reproducible
r_ = new Random(seed_)
r_.uniform(0,1) // random numbers between 0 and 1 will be generated by repick


obfunc poisson() { local i localobj probability, spike_times // receives 
// a poisson rate vector and returns a vector of spike times
  probability = $o1.mul(dt)
  spike_times = new Vector()
  for i=0, probability.size()-1 {
    if (probability.x[i]>r_.repick()) {
      spike_times.append(dt*i) // create a spike where randomly appropriate
    }
  }
  return spike_times
}

obfunc gen_poisson() { local total_time, period, gauss_center, gauss_half_width, gauss_peak  localobj spike_times_vec, probability
// args are tstop, T (period), gauss_center, gauss_half_width, gauss_peak
//          $1,    $2,         $3,           $4,               $5
// Here the gauss_center, gauss_half_width are in milliseconds (ms) and
// the gauss_peak is in spikes/second (Hz).
// The spike_times_vec returns the spike times in ms,
// _poisson_rate probability time series is returned and also is a global
// vector that stores the poisson firing rate at each time step

total_time = $1
// just use dt instead of delta_t = $2
period = $2
gauss_center = $3
gauss_half_width = $4
gauss_peak = $5
print "Creating stimuli's poissons"
spike_times_vec = new Vector()

num_of_stimuli = int(total_time/period+1) // each period is considered a stimuli
//  - actually a period contains a poisson rate and the rate is kind of like a stimuli

time_vec = new Vector()
time_vec.indgen(0, total_time, dt)
_poisson_rate = new Vector(time_vec.size())

for i=-1, num_of_stimuli+1 {
  mu = i*period+gauss_center
  sigma = gauss_half_width
  _poisson_rate.add(time_vec.c.apply("uni_gauss_x"))
}

if (renormalization) {
  renorm = _poisson_rate.max()

  if (renorm != 1) {
    _poisson_rate.div(renorm) // renormalize to a peak of 1 because
    print "gaussians overlapped significantly so renormalized from ",renorm," to 1"
  }                                    // if the gaussians from different 
  // periods overlap significantly their combined peaks will be higher than gauss_peak
}

_poisson_rate.mul(gauss_peak)

// _poisson_rate is now ready to create spikes
//
// loop over the time steps and generate a spike or not at each time

return _poisson_rate
}


obfunc gen_events() { local total_time, period, gauss_center, gauss_half_width, gauss_peak  localobj spike_times_vec, probability
// args are tstop, T (period), gauss_center, gauss_half_width, gauss_peak
//          $1,    $2,         $3,           $4,               $5
// Here the gauss_center, gauss_half_width are in milliseconds (ms) and
// the gauss_peak is in spikes/second (Hz).
// The spike_times_vec returns the spike times in ms,
// _poisson_rate probability time series is a temporary
// vector that stores the poisson firing rate at each time step

return poisson(gen_poisson($1, $2, $3, $4, $5).c.div(1000)) // divide by 1000 because rate is Hz not spikes/ms
}

Loading data, please wait...