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 olmcell
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

NumSoma=1
NumApical=0
NumBasal=2
NumAxon=1

create soma[NumSoma], dend[NumBasal], axon[NumAxon]


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)
  	connect dend[1](0), soma(1)
  	connect axon(0), soma(0)
}

proc size_sections() {
	/*soma[0] {L=20 diam=10}
	dend[0] {L=250 diam=3}
	dend[1] {L=250 diam=3}
	axon[0] {L=150 diam=1.5}*/
NumSoma=1
NumApical=0
NumBasal=2
NumAxon=1
	
	soma[0] {pt3dclear()
		pt3dadd(0.0, 0.0, 0.0, 10.0) // distance from (0,0,0) = 0
		pt3dadd(0.0, 10.0, 0.0, 10.0) // distance from (0,0,0) = 10
		pt3dadd(0.0, 20.0, 0.0, 10.0) // distance from (0,0,0) = 20
	}
	dend[0] {pt3dclear()
		pt3dadd(0.0, 20.0, 0.0, 3.0) // distance from (0,0,0) = 0
		pt3dadd(100.0, 120.0, 0.0, 3.0) // distance from (0,0,0) = 10
		pt3dadd(177.0, 197.0, 0.0, 3.0) // distance from (0,0,0) = 20
	}
	dend[1] {pt3dclear()
		pt3dadd(0.0, 20.0, 0.0, 3.0) // distance from (0,0,0) = 0
		pt3dadd(-100.0, 120.0, 0.0, 3.0) // distance from (0,0,0) = 10
		pt3dadd(-177.0, 197.0, 0.0, 3.0) // distance from (0,0,0) = 20
	}
	axon[0] {pt3dclear()
		pt3dadd(0.0, 0.0, 0.0, 1.5) // distance from (0,0,0) = 0
		pt3dadd(0.0, -75.0, 0.0, 1.5) // distance from (0,0,0) = 10
		pt3dadd(0.0, -150.0, 0.0, 1.5) // distance from (0,0,0) = 20
	}
}

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()
    	dend[0] all.append()
    	dend[0] basal_list.append()
    	dend[0] dendrite_list.append()
    	dend[1] all.append()
    	dend[1] basal_list.append()
    	dend[1] dendrite_list.append()
    	axon all.append()
    	axon axon_list.append()
}


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



proc mechinit() {	
	// Temperature of simulation
	celsius = 34.0  

	Vrest = -67
	
	Rm = 20000*5
	
	gH = 0.0005
	
	gKvAsoma = 0.0165*.3
	gKvAdend = 0.004*.7
	
	// *2.3 gives 2x frequency & no depol. block
	gKvEaxon =  0.05104*2.3
	gKvEsoma =  0.0319*2.3
	gKvEdend =  2*0.023*2.3
	
	gNasoma = 0.0107
	gNadend = 2*0.0117
	gNaaxon = 0.01712
	
	eleak = -67	
}

proc insert_mechs() {
  	soma {
		insert ch_KvAolm
    		gmax_ch_KvAolm = gKvAsoma
		insert ch_HCNolm
			gmax_ch_HCNolm = gH 
		insert ch_Kdrfast  // ch_Kvsoma
			gmax_ch_Kdrfast = gKvEsoma 
		insert ch_Nav // ch_Navsoma
			gmax_ch_Nav = gNasoma
		insert ch_leak
			gmax_ch_leak = 1/Rm
			e_ch_leak = eleak  	
	}

  	dend[0] {
		insert ch_KvAolm
    		gmax_ch_KvAolm = gKvAdend
		insert ch_Kdrfast // ch_Kvdend
			gmax_ch_Kdrfast = gKvEdend
		insert ch_Nav // ch_Navdend
			gmax_ch_Nav = gNadend
		insert ch_leak
			gmax_ch_leak = 1/Rm
			e_ch_leak = eleak  	
  	}

  	dend[1] {
		insert ch_KvAolm
    		gmax_ch_KvAolm = gKvAdend
		insert ch_Kdrfast // ch_Kvdend
			gmax_ch_Kdrfast = gKvEdend
		insert ch_Nav // ch_Navdend
			gmax_ch_Nav = gNadend
		insert ch_leak
			gmax_ch_leak = 1/Rm
			e_ch_leak = eleak  	
  	}
  
  	axon {
		insert ch_Kdrfast // ch_Kvsoma //ch_Kvaxon
			gmax_ch_Kdrfast = gKvEaxon
		insert ch_Nav // ch_Navsoma //ch_Navaxon
			gmax_ch_Nav = gNaaxon
		insert ch_leak
			gmax_ch_leak = 1/Rm
			e_ch_leak = eleak  	
  	}
}

proc set_chanparams() {
	forsec all {
		Ra = 150	// Ra = Axial resistivity in ohm-cm. Ra is a
					//  section variable that must be set for each
					//  section. Default is 35.4.

		cm = 1.3	// capacitance in uF/cm^2. default = 1.0
		//ena = 55
		//ek = -90
	}  // 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 = -20

	}

	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 olmcell

Loading data, please wait...