A two-layer biophysical olfactory bulb model of cholinergic neuromodulation (Li and Cleland 2013)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:149739
This is a two-layer biophysical olfactory bulb (OB) network model to study cholinergic neuromodulation. Simulations show that nicotinic receptor activation sharpens mitral cell receptive field, while muscarinic receptor activation enhances network synchrony and gamma oscillations. This general model suggests that the roles of nicotinic and muscarinic receptors in OB are both distinct and complementary to one another, together regulating the effects of ascending cholinergic inputs on olfactory bulb transformations.
Reference:
1 . Li G, Cleland TA (2013) A two-layer biophysical model of cholinergic neuromodulation in olfactory bulb. J Neurosci 33:3037-58 [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:
Cell Type(s): Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron periglomerular GABA cell; Olfactory bulb main interneuron granule MC GABA cell;
Channel(s): I Na,p; I L high threshold; I T low threshold; I A; I M; I h; I K,Ca; I CAN; I Sodium; I Calcium; I Potassium; I_Ks; I Cl, leak; I Ca,p;
Gap Junctions:
Receptor(s): Nicotinic; GabaA; Muscarinic; AMPA; NMDA;
Gene(s):
Transmitter(s): Acetylcholine;
Simulation Environment: NEURON; MATLAB;
Model Concept(s): Sensory processing; Sensory coding; Neuromodulation; Olfaction;
Implementer(s): Li, Guoshi [guoshi_li at med.unc.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; Nicotinic; GabaA; Muscarinic; AMPA; NMDA; I Na,p; I L high threshold; I T low threshold; I A; I M; I h; I K,Ca; I CAN; I Sodium; I Calcium; I Potassium; I_Ks; I Cl, leak; I Ca,p; Acetylcholine;
/
ACh_ModelDB
data
Input
Readme.txt
cadecay.mod *
cadecay2.mod *
Caint.mod *
Can.mod *
CaPN.mod *
CaT.mod *
GradeAMPA.mod *
GradeGABA.mod *
GradNMDA.mod *
hpg.mod *
kAmt.mod *
KCa.mod *
KDRmt.mod *
kfasttab.mod *
kM.mod *
KS.mod *
kslowtab.mod *
LCa.mod *
nafast.mod *
NaP.mod *
Naxn.mod *
Nicotin.mod *
nmdanet.mod *
OdorInput.mod *
Background.hoc
Connect.hoc
GC_def.hoc
GC_save.hoc *
GC_Stim.hoc
Input.hoc
MC_def.hoc
MC_save.hoc
MC_Stim.hoc
mod_func.c
mosinit.hoc
nrniv.exe.stackdump
OB.hoc
Parameter.hoc
PG_def.hoc
PG_save.hoc *
PG_Stim.hoc
SaveData.hoc
tabchannels.dat *
tabchannels.hoc
                            
//======================================================================
//              Save simulation data into data files
//======================================================================

double Ngm[nMit]

objref f1
f1 = new File()

strdef filepath, filepath1, filepath2, filename
filepath  = "data/"     // data is saved into the "data" folder
filepath1 = "SP/"       // timing of random backgound spike trains is saved into the "SP" folder

objref time, Vmean, Vmean2 
objref GABApm[nMit]
objref Ggm[nMit][nGran], Ggm_Total[nMit]
objref Vms[nMit],  Vmt[nMit]
objref Vmd0[nMit], Vmd1[nMit], Vmd2[nMit]
objref Vgs[nGran], Vgb[nGran]
objref Vps[nPG],   Vpb[nPG] 

time = new Vector()

// Record time
time.record(&t, DT)

//====================================================
//                  Record Voltage
//====================================================	

// Record Mit Soma Voltage
 for i=0, nMit-1 {
    Vms[i] = new Vector()
    Vms[i].record(&mit[i].soma.v(0.5), DT)
 }
 

// Record PG Soma Voltage
 for i=0, nPG-1 {
    Vps[i] = new Vector()
    Vps[i].record(&pg[i].soma.v(0.5), DT)
  } 
  
// Record PG Spine Voltage
 for i=0, nPG-1 {
    Vpb[i] = new Vector()
    Vpb[i].record(&pg[i].gemmbody.v(0.5), DT)
  } 
 
 
// Record GC Voltage if the Full model is simulated (i.e., NTCE==0)

if (NTCE==0) {
// Record GC soma voltage
  for i=0, nGran-1 {
     Vgs[i] = new Vector()
     Vgs[i].record(&gran[i].soma.v(0.5), DT)
   }
 
// Record GC Voltage
  for i=0, nGran-1 { 
     Vgb[i] = new Vector()
     Vgb[i].record(&gran[i].gemmbody.v(0.5), DT)
   }
}
  
//====================================================
//              Record Conductance
//====================================================	
// Save PG->MC conductance
 for i=0, nMit-1 {
	   GABApm[i] = new Vector()
       GABApm[i].record(&p2m[i].g, DT)
}

// Save GC->MC conductance
 if (NTCE==0) { 
   f1.ropen("Connection/Ngc")
   for i=0, nMit-1 {
     Ngm[i] = f1.scanvar()
   }
   f1.close() 

   for i=0, nMit-1 {
    for j=0, Ngm[i]-1 {
	  Ggm[i][j] = new Vector()
      Ggm[i][j].record(&g2m[i][j].g, DT)  
    }
  }
 }
 
 
//====================================================
//                 Save Data
//====================================================

proc save_data() {

 // Calculate the mean voltage for MCs and GCs    
  size1  = Vms[0].size()
  Vmean  = new Vector(size1, 0)

  for i=0, nMit-1 {
	 Vmean = Vmean.c.add(Vms[i]) 
   } 
  
  if (NTCE==0) { 
    size2  = Vgb[0].size()
    Vmean2 = new Vector(size2, 0)
  
    for i=0, nGran-1 {
	  Vmean2 = Vmean2.c.add(Vgb[i]) 
    } 
  }
  
 // Calculate the TOTAL GC GABAa conductance to each MC
  if (NTCE==0) {
    size = Ggm[0][0].size()
	
    for i=0, nMit-1 {
	  Ggm_Total[i] = new Vector(size, 0)
      
	  for j=0, Ngm[i]-1 {  
        Ggm_Total[i] = Ggm_Total[i].c.add(Ggm[i][j])
      }
    } 
  }  

//====================================================
//               Save Conductance
//====================================================		
// Save PG-->MC conductance
  for i=0, nMit-1 {
     sprint(filename, "%sGABApm%d",filepath, i)
     f1.wopen(filename)
     GABApm[i].printf(f1)
     f1.close()	
    } 
   
 // Save GC-->MC conductance
  if (NTCE==0)  {
    for i=0, nMit-1 {
     sprint(filename, "%sGgm%d",filepath, i)
     f1.wopen(filename)
     Ggm_Total[i].printf(f1)
     f1.close()	
    } 
  }	
   
  
// ====================================================
//             Save Simulation Time
// ====================================================
    f1.wopen("data/tt")
	time.printf(f1)
	f1.close()


//====================================================
//                 Save Voltage
//====================================================		
//Save mean voltage	
  Vmean = Vmean.div(nMit)
  f1.wopen("data/Vm")
  Vmean.printf(f1)
  f1.close()	
	
  if (NTCE==0) {
    Vmean2 = Vmean2.div(nGran)
    f1.wopen("data/Vg")
    Vmean2.printf(f1)
    f1.close()	
	}
	
//Save voltage of mitral cells
  //Soma 
  for i=0, nMit-1 {
     sprint(filename, "%sVms%d",filepath, i)
     f1.wopen(filename)
     Vms[i].printf(f1)
     f1.close()	
  }  
  
 // Save PG voltages
 // Soma
  for i=0, nPG-1 {
    sprint(filename, "%sVps%d",filepath, i)
    f1.wopen(filename)
    Vps[i].printf(f1)
    f1.close()	
   } 
  
  // Spine
  for i=0, nPG-1 {
    sprint(filename, "%sVpb%d",filepath, i)
    f1.wopen(filename)
    Vpb[i].printf(f1)
    f1.close()	
  } 
  
  
  
// Save GC voltages
// Soma
if (NTCE==0) {

  for i=0, nGran-1 {
    sprint(filename, "%sVgs%d",filepath, i)
    f1.wopen(filename)
    Vgs[i].printf(f1)
    f1.close()	
   } 
  
 // Spine
  for i=0, nGran-1 {
    sprint(filename, "%sVgb%d",filepath, i)
    f1.wopen(filename)
    Vgb[i].printf(f1)
    f1.close()	
   }  
}  
    
	
//====================================================
//               Save Spike Time
//====================================================	
//Save MC somatic spike time	
  for i=0, nMit-1 {
    sprint(filename, "%sMs%d",filepath, i)
	f1.wopen(filename)
	mit[i].spiketimes.printf(f1)
	f1.close()
    }		  
	
 // Save MC dendritic spike time	
  for i=0, nMit-1 {
    sprint(filename, "%sMd%d",filepath, i)
	f1.wopen(filename)
	mit[i].dendspike.printf(f1)
	f1.close()
   }
 
// Save PG somatic spike time	
  for i=0, nPG-1 {
      sprint(filename, "%sPs%d",filepath, i)
	  f1.wopen(filename)
	  pg[i].spiketimes.printf(f1)
	  f1.close()
   }
 
 // Save PG dendritic spike time	
  for i=0, nPG-1 {
      sprint(filename, "%sPd%d",filepath, i,j)
	  f1.wopen(filename)
	  pg[i].dendspike.printf(f1)
	  f1.close()
  } 
  
 // Save GC somatic spike time	
 if (NTCE==0) {
 
  for i=0, nGran-1 {
      sprint(filename, "%sGs%d",filepath, i)
	  f1.wopen(filename)
	  gran[i].spiketimes.printf(f1)
	  f1.close()
   } 
 
 // Save GC dendritic spike time	
  for i=0, nGran-1 {
      sprint(filename, "%sGd%d", filepath, i)
	  f1.wopen(filename)
	  gran[i].dendspike.printf(f1)
	  f1.close()
    }
  }  
  
 
//===============================================
// Save random spontaneous spikes
  for i=0, nMit-1 {
    sprint(filename, "%sspp%d",filepath1, i)
	f1.wopen(filename)
	WSP[i].printf(f1)
	f1.close()
    }		
  
}