Gamma-beta alternation in the olfactory bulb (David, Fourcaud-Trocmé et al., 2015)

 Download zip file 
Help downloading and running models
Accession:185014
This model, a simplified olfactory bulb network with mitral and granule cells, proposes a framework for two regimes of oscillation in the olfactory bulb: 1 - a weak inhibition regime (with no granule spike) where the network oscillates in the gamma (40-90Hz) band 2 - a strong inhibition regime (with granule spikes) where the network oscillates in the beta (15-30Hz) band. Slow modulations of sensory and centrifugal inputs, phase shifted by a quarter of cycle, possibly combined with short term depression of the mitral to granule AMPA synapse, allows the network to alternate between the two regimes as observed in anesthetized animals.
Reference:
1 . David F, Courtiol E, Buonviso N, Fourcaud-Trocmé N (2015) Competing Mechanisms of Gamma and Beta Oscillations in the Olfactory Bulb Based on Multimodal Inhibition of Mitral Cells Over a Respiratory Cycle. eNeuro [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_Ks;
Gap Junctions:
Receptor(s): GabaA; AMPA;
Gene(s):
Transmitter(s):
Simulation Environment: Brian; Python;
Model Concept(s): Short-term Synaptic Plasticity; Gamma oscillations; Beta oscillations; Olfaction;
Implementer(s):
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell; GabaA; AMPA; I_Ks;
# -*- coding: utf-8 -*-
from brian import *
import types

class PopulationStateMonitor(StateMonitor):
    """
    Adapted from the Brian standard StateMonitor, it records the population average of a given variable every timestep
    """
    
    def __init__(self,P,varname,clock=None,record=True,timestep=1,when='end'):
        StateMonitor.__init__(self,P,varname,clock,record,timestep,when)
        
    def __call__(self):
        '''
        This function is called every time step.
        '''
        V=self.P.state_(self.varname)
        self._mu+=V.mean()
        self._sqr+=V.mean()*V.mean()
        if self.record is not False and self.curtimestep==self.timestep:
            i = self._recordstep
            if self._values is None:
                self._values = []
                self._times = []
            if type(self.record)!=types.BooleanType:
                self._values.append(V[self.record].mean()) 
            elif self.record is True:
                self._values.append((V.copy()).mean())
            self._times.append(self.clock.t)
            self._recordstep += 1
        self.curtimestep-=1
        if self.curtimestep==0: self.curtimestep=self.timestep
        self.N+=1

    def reinit(self):
        self._values = []
        self._times = []
        ri = self.get_record_indices()
        self._values_cache = zeros((1, 0))
        self.N = 0
        self._recordstep = 0
        self._mu = zeros(len(self.P))
        self._sqr = zeros(len(self.P))