Hippocampal CA1 NN with spontaneous theta, gamma: full scale & network clamp (Bezaire et al 2016)

 Download zip file 
Help downloading and running models
Accession:187604
This model is a full-scale, biologically constrained rodent hippocampal CA1 network model that includes 9 cells types (pyramidal cells and 8 interneurons) with realistic proportions of each and realistic connectivity between the cells. In addition, the model receives realistic numbers of afferents from artificial cells representing hippocampal CA3 and entorhinal cortical layer III. The model is fully scaleable and parallelized so that it can be run at small scale on a personal computer or large scale on a supercomputer. The model network exhibits spontaneous theta and gamma rhythms without any rhythmic input. The model network can be perturbed in a variety of ways to better study the mechanisms of CA1 network dynamics. Also see online code at http://bitbucket.org/mbezaire/ca1 and further information at http://mariannebezaire.com/models/ca1
References:
1 . Bezaire MJ, Raikov I, Burk K, Vyas D, Soltesz I (2016) Interneuronal mechanisms of hippocampal theta oscillations in a full-scale model of the rodent CA1 circuit. Elife [PubMed]
2 . Bezaire M, Raikov I, Burk K, Armstrong C, Soltesz I (2016) SimTracker tool and code template to design, manage and analyze neural network model simulations in parallel NEURON bioRxiv
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell; Hippocampus CA1 interneuron oriens alveus GABA cell; Hippocampus CA1 basket cell; Hippocampus CA1 stratum radiatum interneuron; Hippocampus CA1 bistratified cell; Hippocampus CA1 axo-axonic cell; Hippocampus CA1 PV+ fast-firing interneuron;
Channel(s): I Na,t; I K; I K,leak; I h; I K,Ca; I Calcium;
Gap Junctions:
Receptor(s): GabaA; GabaB; Glutamate; Gaba;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON; NEURON (web link to model);
Model Concept(s): Oscillations; Methods; Connectivity matrix; Laminar Connectivity; Gamma oscillations;
Implementer(s): Bezaire, Marianne [mariannejcase at gmail.com]; Raikov, Ivan [ivan.g.raikov at gmail.com];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; Hippocampus CA1 interneuron oriens alveus GABA cell; GabaA; GabaB; Glutamate; Gaba; I Na,t; I K; I K,leak; I h; I K,Ca; I Calcium; Gaba; Glutamate;
begintemplate ngfcell
public init, connect_sections, size_sections, append_sections
public mechinit, insert_mechs, set_biophys, get_root
public  pre_list, connect_pre, is_art, is_connected, gid, randi
public soma, dend
public all, basal_list, apical_list, soma_list, axon_list, dendrite_list
public x, y, z, position, myroot, Vrest
public NumSoma, NumApical, NumBasal, NumAxon

// strings
strdef myroot

// objects
objref syn, pre_list, templist, rootlist, this

// external variables
external numCellTypes, cellType

// create the sections[segments]
NumSoma=1
NumApical=16
NumBasal=0
NumAxon=0
create soma[NumSoma], dend[NumApical]


proc init() {
	gid = $1
	randi = $2
	
	// morphology
	connect_sections()	// local fcn: connect soma, dendrites, axon initial segment
	size_sections()		// local fcn: set the size dimensions of each section
	define_shape()		// builtin fcn: fill in 3d info for sections defined by only L and diam, translate 3d points for consistency with their connections 
  	append_sections()	// local fcn: append all sections to the section list
	set_nseg()			// local fcn: set the number of segments in each section
	get_root()			// local fcn: perform morphology checks

	// electrophysiology
	mechinit()			// local fcn: set values for max conductances and reversal potentials of ion channels and other ephys parameters that are subject to fitting
	insert_mechs()		// local fcn: insert ion channels and actually set values determined in the mechinit fcn
	set_chanparams()	// local fcn: after all channels have been inserted, then their other parameters can be set	
	// synapses
	pre_list = new List() // define a list for the presynaptic connections
	define_synapses($3)	// local fcn: define all possible synaptic connections received by this cell
}

proc connect_sections() { local i
 	connect dend[0](0), soma(1)
	for i=0,3 {
		connect dend[i+1](0), dend[i](1)
	}

  	connect dend[5](0), soma(1)
	for i=5,8 {
		connect dend[i+1](0), dend[i](1)
	}
	
  	connect dend[10](0), soma(0)
	for i=10,11 {
		connect dend[i+1](0), dend[i](1)
	}

  	connect dend[13](0), soma(0)
	for i=13,14 {
		connect dend[i+1](0), dend[i](1)
	}
}

proc size_sections() {
	soma[0] {pt3dclear()
		pt3dadd(0, 0, 0, 10) // distance from (0,0,0) = 0
		pt3dadd(0, 10, 0, 10) // distance from (0,0,0) = 10
		pt3dadd(0, 20, 0, 10) // distance from (0,0,0) = 20
	}
	dend[0] {pt3dclear()
		pt3dadd(0, 20, 0, 4) // distance from (0,0,0) = 20
		pt3dadd(19.4709, 66.053, 0, 4) // distance from (0,0,0) = 68.8631
		pt3dadd(38.9418, 112.106, 0, 4) // distance from (0,0,0) = 118.677
	}
	dend[1] {pt3dclear()
		pt3dadd(38.9418, 112.106, 0, 3) // distance from (0,0,0) = 118.677
		pt3dadd(58.4128, 158.159, 0, 3) // distance from (0,0,0) = 168.601
		pt3dadd(77.8837, 204.212, 0, 3) // distance from (0,0,0) = 218.56
	}
	dend[2] {pt3dclear()
		pt3dadd(77.8837, 204.212, 0, 2) // distance from (0,0,0) = 218.56
		pt3dadd(116.826, 296.318, 0, 2) // distance from (0,0,0) = 318.516
		pt3dadd(155.767, 388.424, 0, 2) // distance from (0,0,0) = 418.494
	}
	dend[3] {pt3dclear()
		pt3dadd(155.767, 388.424, 0, 1.5) // distance from (0,0,0) = 418.494
		pt3dadd(175.238, 434.477, 0, 1.5) // distance from (0,0,0) = 468.486
		pt3dadd(194.709, 480.531, 0, 1.5) // distance from (0,0,0) = 518.48
	}
	dend[4] {pt3dclear()
		pt3dadd(194.709, 480.531, 0, 1) // distance from (0,0,0) = 518.48
		pt3dadd(214.18, 526.584, 0, 1) // distance from (0,0,0) = 568.475
		pt3dadd(233.651, 572.637, 0, 1) // distance from (0,0,0) = 618.47
	}
	dend[5] {pt3dclear()
		pt3dadd(0, 20, 0, 4) // distance from (0,0,0) = 20
		pt3dadd(-19.4709, 66.053, 0, 4) // distance from (0,0,0) = 68.8631
		pt3dadd(-38.9418, 112.106, 0, 4) // distance from (0,0,0) = 118.677
	}
	dend[6] {pt3dclear()
		pt3dadd(-38.9418, 112.106, 0, 3) // distance from (0,0,0) = 118.677
		pt3dadd(-58.4128, 158.159, 0, 3) // distance from (0,0,0) = 168.601
		pt3dadd(-77.8837, 204.212, 0, 3) // distance from (0,0,0) = 218.56
	}
	dend[7] {pt3dclear()
		pt3dadd(-77.8837, 204.212, 0, 2) // distance from (0,0,0) = 218.56
		pt3dadd(-116.826, 296.318, 0, 2) // distance from (0,0,0) = 318.516
		pt3dadd(-155.767, 388.424, 0, 2) // distance from (0,0,0) = 418.494
	}
	dend[8] {pt3dclear()
		pt3dadd(-155.767, 388.424, 0, 1.5) // distance from (0,0,0) = 418.494
		pt3dadd(-175.238, 434.477, 0, 1.5) // distance from (0,0,0) = 468.486
		pt3dadd(-194.709, 480.531, 0, 1.5) // distance from (0,0,0) = 518.48
	}
	dend[9] {pt3dclear()
		pt3dadd(-194.709, 480.531, 0, 1) // distance from (0,0,0) = 518.48
		pt3dadd(-214.18, 526.584, 0, 1) // distance from (0,0,0) = 568.475
		pt3dadd(-233.651, 572.637, 0, 1) // distance from (0,0,0) = 618.47
	}
	dend[10] {pt3dclear()
		pt3dadd(0, 0, 0, 2) // distance from (0,0,0) = 0
		pt3dadd(-19.4709, -46.0531, 0, 2) // distance from (0,0,0) = 50
		pt3dadd(-38.9418, -92.1061, 0, 2) // distance from (0,0,0) = 100
	}
	dend[11] {pt3dclear()
		pt3dadd(-38.9418, -92.1061, 0, 1.5) // distance from (0,0,0) = 100
		pt3dadd(-58.4128, -138.159, 0, 1.5) // distance from (0,0,0) = 150
		pt3dadd(-77.8837, -184.212, 0, 1.5) // distance from (0,0,0) = 200
	}
	dend[12] {pt3dclear()
		pt3dadd(-77.8837, -184.212, 0, 1) // distance from (0,0,0) = 200
		pt3dadd(-97.3546, -230.265, 0, 1) // distance from (0,0,0) = 250
		pt3dadd(-116.826, -276.318, 0, 1) // distance from (0,0,0) = 300
	}
	dend[13] {pt3dclear()
		pt3dadd(0, 0, 0, 2) // distance from (0,0,0) = 0
		pt3dadd(19.4709, -46.053, 0, 2) // distance from (0,0,0) = 50
		pt3dadd(38.9419, -92.1061, 0, 2) // distance from (0,0,0) = 100
	}
	dend[14] {pt3dclear()
		pt3dadd(38.9419, -92.1061, 0, 1.5) // distance from (0,0,0) = 100
		pt3dadd(58.4128, -138.159, 0, 1.5) // distance from (0,0,0) = 150
		pt3dadd(77.8837, -184.212, 0, 1.5) // distance from (0,0,0) = 200
	}
	dend[15] {pt3dclear()
		pt3dadd(77.8837, -184.212, 0, 1) // distance from (0,0,0) = 200
		pt3dadd(97.3546, -230.265, 0, 1) // distance from (0,0,0) = 250
		pt3dadd(116.826, -276.318, 0, 1) // distance from (0,0,0) = 300
	}
}

objref all, basal_list, apical_list, dendrite_list, soma_list, axon_list
proc append_sections() { local i
	objref all, basal_list, apical_list, dendrite_list, soma_list, axon_list

	all = new SectionList()
	basal_list = new SectionList()
	apical_list = new SectionList()
	soma_list = new SectionList()
	axon_list = new SectionList()
	dendrite_list = new SectionList()

	soma all.append()
	soma soma_list.append()
	for i=0,15 {
		dend[i] all.append()
		dend[i] dendrite_list.append()
	}

	for i=0,9 {
		dend[i] apical_list.append()
	}

	for i=10,15 {
		dend[i] basal_list.append()
	}
}


external lambda_f
proc set_nseg() {
  	forsec all { nseg = int((L/(0.1*lambda_f(100))+.9)/2)*2 + 1  }
}



proc mechinit() {

	// resting membrane potential. Must lie between Na+ and K+ reversal potentials
	Vrest=-65
	
	// Temperature of simulation
	celsius = 34.0  

	// Membrane resistance in ohm*cm2
	RmDend = 5555 //1/0.00018 
	RmSoma = 5555 //1/0.00018 

	// Membrane capacitance in uF/cm2
	CmSoma= 1.4
	CmDend = 1.4

	// Axial resistance in ohm*cm
	RaDend= 100
	RaSoma= 100	
	
	// Calcium concentrations in mM
	ca_outside = 2
	ca_inside = 5.e-6 // 50.e-6
	catau = 10

	// reversal potentials in mV
	ekval = -90	
	enaval = 55
	eHCNval = -30
	ecaval = 8.314*(273.15+celsius)/(2*9.649e4)*log(ca_outside/ca_inside)*1000 // about 170, otherwise set to 130
	
	if (Vrest<ekval) Vrest=ekval // Cell cannot rest lower than K+ reversal potential
	if (Vrest>enaval) Vrest=enaval // Cell cannot rest higher than Na+ reversal potential
	eleakval = Vrest

	// max ion channel conductances in mho/cm2
	gNav     = 0.15 // soma: // 0.12 //original 0.030 to .055 ; lm: //0.5  	//original 0.015
	gKdr     = 0.013    // Delayed rectifier potassium
	gKvA 	 = 0.00015 // Proximal A-type potassium
	gHCN     = 0.00002 // HCN (hyperpolarization-activated cyclic nucleotide-gated channel)
	gCavN    = 0.0008 //   T-type calcium
	gCavL    = 0.005 //  L-type calcium
	gKvCaB	 = 0.0000002 // Big potassium channel: voltage and calcium gated 
	gKCaS	 = 0.000002 //  Small potassium channel: calcium gated		

	gNasoma=3.7860265 
	gNadend=0.25918894  
	gKvA=5.2203905e-06
	kdrf=0.15514516
	kdrfdend = 0.0021817289
	gleak=8.470825e-05
	gCavL=0.056108352
	gCavN=0.00058169587
	gKvCaB=1.0235317e-06 
	gKCaS=4.5152237e-07  
	myRa = 14 //75
	CM = 1.8 //1.8
	offset1=20
	offset2=20
	offset3=13.5816 
	offset4=13.35371
	slope1=0.68266
	slope2=0.56966
	slope3=1.18592
	slope4=49.4896
	offset5=9
	offset6=9
	slope5=.07
	slope6=.264
}

proc insert_mechs() {

	forsec all {
		insert iconc_Ca
			catau_iconc_Ca = 10
			caiinf_iconc_Ca = 5.e-6
		insert ch_KvAngf
	gmax_ch_KvAngf = gKvA
		insert ch_CavN  // HAV-N- Ca channel
	gmax_ch_CavN =   gCavN
		insert ch_CavL 
	gmax_ch_CavL=gCavL
		insert ch_KCaS
	gmax_ch_KCaS=gKCaS
		insert ch_KvCaB
	gmax_ch_KvCaB =gKvCaB
	cm=CM
	} 

	soma {
	insert ch_Navngf
	gmax_ch_Navngf=gNasoma //0.10*gna_scale
	offset1_ch_Navngf=offset1
	offset2_ch_Navngf=offset2
	offset3_ch_Navngf=offset3
	offset4_ch_Navngf=offset4
	slope1_ch_Navngf=slope1
	slope2_ch_Navngf=slope2
	slope3_ch_Navngf=slope3
	slope4_ch_Navngf=slope4
	ena = 55 
		insert ch_Kdrfastngf
	gmax_ch_Kdrfastngf=kdrf 
	offset5_ch_Kdrfastngf=offset5 
	offset6_ch_Kdrfastngf=offset6 
	slope6_ch_Kdrfastngf=slope6 
	slope5_ch_Kdrfastngf=slope5	
//		insert ch_Kdrslow
//	gmax_ch_Kdrslow=kdrf 
	
	insert ch_leak
	gmax_ch_leak = gleak
	} 

	access soma
	distance()
	forsec dendrite_list {
		for (x,0) {
			if (distance(x)<100) {
			insert ch_Navngf
			gmax_ch_Navngf=gNadend //0.08*gna_scale
			offset1_ch_Navngf=offset1
			offset2_ch_Navngf=offset2
			offset3_ch_Navngf=offset3
			offset4_ch_Navngf=offset4
			slope1_ch_Navngf=slope1
			slope2_ch_Navngf=slope2
			slope3_ch_Navngf=slope3
			slope4_ch_Navngf=slope4
			ena = 55 
				insert ch_Kdrfastngf
			gmax_ch_Kdrfastngf=kdrfdend //.007
			offset5_ch_Kdrfastngf=offset5 
			offset6_ch_Kdrfastngf=offset6 
			slope6_ch_Kdrfastngf=slope6 
			slope5_ch_Kdrfastngf=slope5	
			}
		}
	}	

	forsec dendrite_list {
	insert ch_leak
	gmax_ch_leak = gleak
	}
}

proc set_chanparams() {
	forsec all {Ra=myRa}
	forsec all {ek=-90  eca=130
		 e_ch_leak =-60
	cao_iconc_CaZ=2 
		//cao_ccanl=2 
		}  // make catau slower70e-3 	cao=2 cai=50.e-6 
}


	proc connect_pre() {  // $o1 target point process, $o2 returned NetCon
	soma $o2 = new NetCon (&v(1), $o1)
			$o2.threshold = -15

	}

	func is_art()  { return 0 }

proc position(){ local i
	forall {
		for i = 0, n3d()-1 {
			pt3dchange(i, $1-x+x3d(i), $2-y+y3d(i), $3-z+z3d(i), diam3d(i))
		}
	}
	x = $1  y = $2  z = $3	
}

proc get_root() {local i localobj sref
	rootlist = new SectionList()
	rootlist.allroots()
	i=0
	forsec all {
		sref = new SectionRef()
		if (sref.has_parent==0) {
			myroot = secname()
			i=i+1
		}
		for(x,0) {
			if (diam(x) <=0.01) print "WARNING: tiny diameter of ",  diam(x), " um at ", secname(), ", point ", x, "!"
			if (diam3d(x) <=0.01) print "WARNING: tiny 3d diameter of ", diam3d(x), " um at ", secname(), ", point ", x, "!"
		}
		if (L <=0.001) print "WARNING: tiny length of ", L, " um at ", secname(), "!"
	}
	if (i>1) {
		print "WARNING: cell ", gid, " has ", i, " root sections!"
	}
}

strdef myStr

objref newSecRef, syn
proc define_synapses() {
	ind = $1
	i = 0

	access soma[0]
	{distance()}

	for celltype = 0, numCellTypes-1 {
		templist = new List ()
		for r=0, cellType[ind].SynList[celltype].count()-1 {
			execute(cellType[ind].SynList[celltype].object(r).NewSynStr, this) // sets newSecRef
						
			forsec newSecRef {		
				for (x,0) {
					execute(cellType[ind].SynList[celltype].object(r).CondStr, this)
					 if (y==1) {
						execute(cellType[ind].SynList[celltype].object(r).SynStr, this)
						if (cellType[ind].SynList[celltype].object(r).GABAabFlag==0) {
							syn.tau1 = cellType[ind].SynList[celltype].object(r).tau1
							syn.tau2 = cellType[ind].SynList[celltype].object(r).tau2
							syn.e = cellType[ind].SynList[celltype].object(r).efirst
							if (strcmp(cellType[ind].SynList[celltype].object(r).SynType,"MyExp2Sidnw")==0) {
								execute(cellType[ind].SynList[celltype].object(r).Scaling, this)
							}
						} else {
							syn.tau1a = cellType[ind].SynList[celltype].object(r).tau1a
							syn.tau2a = cellType[ind].SynList[celltype].object(r).tau2a
							syn.ea = cellType[ind].SynList[celltype].object(r).ea
							syn.tau1b = cellType[ind].SynList[celltype].object(r).tau1b
							syn.tau2b = cellType[ind].SynList[celltype].object(r).tau2b
							syn.eb = cellType[ind].SynList[celltype].object(r).eb
						}
						syn.sid = i
						templist.append(syn)
						i = i + 1
					}
				}
			}
		}
		pre_list.append(templist)
		findme = 1
	}
}
endtemplate ngfcell

Loading data, please wait...