CA1 pyramidal neuron: nonlinear a5-GABAAR controls synaptic NMDAR activation (Schulz et al 2018)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:258867
The study shows that IPSCs mediated by a5-subunit containing GABAA receptors are strongly outward-rectifying generating 4-fold larger conductances above -50?mV than at rest. Experiments and modeling show that synaptic activation of these receptors can very effectively control voltage-dependent NMDA-receptor activation in a spatiotemporally controlled manner in fine dendrites of CA1 pyramidal cells. The files contain the NEURON code for Fig.8, Fig.S8 and Fig.S9 of the paper. The model is based on the model published by Bloss et al., 2017. Physiological properties of GABA synapses were modified as determined by optogenetic activation of inputs during voltage-clamp recordings in Schulz et al. 2018. Other changes include stochastic synaptic release and short-term synaptic plasticity. All changes of mechanisms and parameters are detailed in the Methods of the paper. Simulation can be run by starting start_simulation.hoc after running mknrndll. The files that model the individual figures have to be uncommented in start_simulation.hoc beforehand.
Reference:
1 . Schulz JM, Knoflach F, Hernandez MC, Bischofberger J (2018) Dendrite-targeting interneurons control synaptic NMDA-receptor activation via nonlinear a5-GABAA receptors. Nat Commun 9:3576 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell; Dendrite; Synapse;
Brain Region(s)/Organism: Hippocampus; Mouse;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell;
Channel(s): I h; I A;
Gap Junctions:
Receptor(s): GabaA; GabaB; AMPA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s):
Implementer(s): Schulz, Jan M [j.schulz at unibas.ch];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; GabaA; GabaB; AMPA; NMDA; I A; I h; Gaba; Glutamate;
/
Alpha5_NMDA_CA1_pyr
README.html
dists.mod *
eff.mod *
exc.mod *
gabab.mod
h.mod
id.mod *
inh.mod
kad.mod *
kap.mod *
kdr.mod *
na3.mod *
nmdaSyn.mod
syns.mod *
tonic.mod
activateExcitation.hoc
activateInhibition_JMS.hoc
addChannels_JMS.hoc
addExcitation_JMS.hoc
addVgatInhibition_JMS.hoc
channelParameters.hoc
Connect_Stimulator2ExcSyn.hoc
Connect_Stimulator2InhSyn.hoc
Fig8_tuft_NMDA_spike.hoc
FigS8_SR_SLM_burst_stim.hoc
FigS9_test_TI.hoc
flagVgatInhibition_JMS.hoc
Generate_Stimulator.hoc
getBranchOrder.hoc *
idMorph.hoc
inhibitionBiophysics_JMS.hoc
initializationAndRun.hoc *
loadMorph.hoc *
mosinit.hoc
naceaxon.nrn *
Print-to-File.hoc
processMorph.hoc *
proofreadMorph.hoc *
resetNSeg.hoc *
screenshot.png
start_simulation.hoc
synHelperScripts.hoc
SynStim_SR_SLM_control.hoc
SynStim_SR_SLM_noInh.hoc
SynStim_SR_SLM_redInh.hoc
SynStim_SR_SLM_TI.hoc
tuft_NMDA_spike_fast.hoc
tuft_NMDA_spike_noRect.hoc
twinApical.swc *
update_Synapses.hoc
                            
// THIS SCRIPT ASSIGNS ANNOTATION TO SPECIFIC SUBCELLULAR COMPARTMENTS.

forall {
	
	insert id
	
	for (x) {
		isTerm_id(x) = 0
		isTuft_id(x) = 0
		isObl_id(x) = 0
		isBas_id(x) = 0
		isPrim_id(x) = 0
	}
}

objref soma
objref basalList,obliqueList,primList,apicalList,tuftList,dendList,cellList,ca3List,radiatumList 
	
apicalList = new SectionList() // apical list
basalList = new SectionList() // basal list
obliqueList = new SectionList() // oblique list
primList = new SectionList() // primary apical list
tuftList = new SectionList()
dendList = new SectionList() // list of all dendrites
cellList = new SectionList()
ca3List = new SectionList() // list of places that CA3 cells would contact CA1 (SO + SR)
radiatumList = new SectionList() // list of places that CA3 cells would contact CA1 in SR
	
Cell[0].dend[72] {soma = new SectionRef()}

// Populate apical list.
Cell[0].dend[11] { apicalList.subtree() }

// Populate primary apical list.
Cell[0].dend[11] { primList.append() }
Cell[0].dend[74] { primList.append() }
Cell[0].dend[75] { primList.append() }
Cell[0].dend[76] { primList.append() }
Cell[0].dend[77] { primList.append() } // right before twin bifurcation
Cell[0].dend[78] { primList.append() } // left twin apical
Cell[0].dend[79] { primList.append() }
Cell[0].dend[80] { primList.append() }
Cell[0].dend[82] { primList.append() }
Cell[0].dend[83] { primList.append() }
Cell[0].dend[84] { primList.append() }
Cell[0].dend[85] { primList.append() }
Cell[0].dend[86] { primList.append() }
Cell[0].dend[151] { primList.append() } // right twin apical
Cell[0].dend[154] { primList.append() }
Cell[0].dend[155] { primList.append() }
Cell[0].dend[157] { primList.append() }
Cell[0].dend[160] { primList.append() }
Cell[0].dend[161] { primList.append() }

// By eye, these were the beginning of sections that define the tuft.
Cell[0].dend[87] { tuftList.subtree() }
Cell[0].dend[162] { tuftList.subtree() }
Cell[0].dend[163] { tuftList.subtree() }

// Populate obliques.  By previous definitions, this is simply the
// whole apical dendrite less the tuft and the primary apical.
forsec apicalList { obliqueList.append() }
forsec tuftList { obliqueList.remove() }
forsec primList { obliqueList.remove() }


	
// Populate basals.  By previous definitions, this is simply the
// whole tree less the apical dendrite and the soma.
forall { basalList.append() }
forsec apicalList { basalList.remove() }
soma.sec { basalList.remove () }


// Populate all dendrites.  This is everything minus the soma.
forall { dendList.append() }
soma.sec { dendList.remove() }

// Populate the whole cell.  This is everything.
forall { cellList.append() }

// Populate sections which would contact CA3 axons.
forsec basalList {ca3List.append()}
forsec primList {ca3List.append()}
forsec obliqueList {ca3List.append()}
soma.sec {ca3List.append()}

forsec primList {radiatumList.append()}
forsec obliqueList {radiatumList.append()}

// Declare a function that looks at whether a given SectionRef instance 
// (argument 1) is found in a given SectionList (argument 2).
// $o1: SectionRef instance to match.
// $o2: SectionList instance to search over.
// Returns logical of whether section is in list.
func sectionRefInList() {local isInList
	isInList = 0
	
	strdef tempSecName
	
	$o1.sec { tempSecName = secname() }
	
	forsec $o2 {
		if(abs(strcmp(secname(),tempSecName))<(1e-5)){
			isInList=1
		}
	}

	return isInList
}

objref theSec
forall {
	theSec = new SectionRef()
	for (x){
		isTuft_id(x) = sectionRefInList(theSec,tuftList)
		isPrim_id(x) = sectionRefInList(theSec,primList)
		isObl_id(x) = sectionRefInList(theSec,obliqueList)
		isBas_id(x) = sectionRefInList(theSec,basalList)
		brOrd_id(x) = -1
	}
}

// Assign distances from bifurcation of apical trunk.  Note this is used solely
// for obliques, so all other locations get assigned a -1 value.

forall {
	insert dists
	
}

// Generate a function that point out how far something is from main apical.
// INPUT: a SectionRef instance that refers to an oblique branch.
// OUTPUT: the distance from the initial bifurcation of this branch from the
//	primary apical branch.  [ note : to be consistent with AT data, this 
//	may not be the distance of the branch itself, but rather from a
//	parent branch that stems directly off of the primary apical ]
func oblDist(){localobj theSec,tempParSec
	theSec = $o1 // a SectionRef instance
	
	// Traverse down branch until hit parent branch that stems directly
	// off the main apical.
	
	// Identify parent.
	strdef strPar
	while(1){
		theSec.parent{	
			strPar = secname()	
		}
		
		inList = 0
		
		// Is parent in the obliques list?
		forsec obliqueList {
			curDist = abs(strcmp(secname(),strPar))
			if(curDist<0.0001){
				inList = 1
				tempParSec = new SectionRef()
			}
		}
		if(inList){
			// Repeat; update parent section.
			tempParSec.sec { theSec = new SectionRef() }
		}else{
			break
		}
	}
	
	// Get the distance from this parent branch to the soma.
	soma.sec {
		distance()
	}
	
	theSec.sec {
		theDist = distance(0)
	}
			
	return theDist
}

// Generate a function that point out how far along the main apical a given
// section (with associated x value) is.
// INPUT: a SectionRef instance that refers to an main apical branch, and a 
//	variable (0<= , <=1) corresponding to the x value.
// OUTPUT: the distance of the _middle_ of the section from the soma, divided
//	by the distance of the total main apical dendrite
func primDist(){local tuftDist,somaDist,outDist,theX localobj theSec,allTuftDists
	theSec = $o1 // a SectionRef instance
	theX = $2
	allTuftDists = new Vector()
	
	// Calculate minimum distance from tuft to selected section.
	theSec.sec { distance() }
	forsec tuftList {
		tuftDist = distance(0)
		allTuftDists.append(tuftDist)
	}
	tuftDist = allTuftDists.min() 
	
	// Calculate distance from selected section to soma.
	soma.sec { distance() }
	theSec.sec { somaDist = distance(theX) }

	outDist = somaDist/(somaDist+tuftDist)	
	return outDist
}

// Assign main bifurcation distances to obliques, as well as normalised
// primary apical distances.
forall {
	for(x) {
		theSec = new SectionRef()
		
		// Main bifurcation distance.
		if(sectionRefInList(theSec,obliqueList)){
			mainbif_dists = oblDist(theSec)
		}else{
			mainbif_dists = -1
		}
		
		// Norm prim apical distance.
		if(sectionRefInList(theSec,primList)){
			normprim_dists(x) = primDist(theSec,x)
		}else{
			normprim_dists = -1
		}
	}
}

forall {
	insert syns
	npyAt_syns = 0
	npyUnif_syns = 0
	sstAt_syns = 0
	sstUnif_syns = 0
	vlsAt_syns = 0
	exc_syns = 0
}