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
                            
// DEFINE FUNCTIONS THAT HELP WITH SYNAPSE ALLOCATION.

// identify vgat synapses that are part of a given branch
// provide a SectionRef instance to seek, and optionally, two x values for 
// low and high values to seek.
// $o1: SectionRef instance.
// $2,$3: optional, variables, low and high values to constrain results.
// NOTE: $2 and $3 are currently implemented to work with EFFECTIVE x values,
// 	not the true x values.
strdef seekSecName
obfunc getVgatInds(){local theX localobj vecOfInds

	vecOfInds = new Vector(0)
	
	
	$o1.sec { seekSecName = secname() }
	for ii=1,totVgatAt {
		{ 
			theX = synGABA[ii-1].get_loc() 
			theX = synGABA[ii-1].xEff
			
			if(abs(strcmp(secname(),seekSecName))<0.00001){
				if(numarg()>1.1){
					// x values supplied
					if(theX>$2&&theX<$3){	
						vecOfInds.append(ii-1)
					}
				}else{
					// no x values supplied, simply take
					vecOfInds.append(ii-1)
				}
			}
			pop_section()
		}
	}
	return vecOfInds
}

theRandomSeed = 1000000
// Sample values from the given vector without replacement.  
// $o1: Vector.  The vector of values to sample from.
// $2: numeric.  The number of values to sample.
// $3: numeric.  The seed.  If set =-1 (or just <=-0.1), sets a random seed that increments.  If >-0.1, uses
//	the supplied seed.
obfunc sampleNoReplace(){local tempRand,jj localobj randGen,theOut,theOut2
	if($2>$o1.size()){
		//print "Number of items to return exceeds vector size."
		//print "Returning the original vector."
		//print "Wanted/got:",$2,$o1.size()
		return $o1
	}
	
	if($2<0.0001){
		theOut2 = new Vector()
		return theOut2
	}
	
	if($3>(-0.1)) {
		// supplied a random seed; go with it.
		randGen = new Random($3)
	}else{
		// define a random number generator with new seed
		randGen = new Random(theRandomSeed)
		theRandomSeed+=1
	}
	randGen.uniform(0,$o1.size())
	theOut = new Vector()
	theOut2 = new Vector($2)
	while(1){
		tempRand = int(randGen.repick())
		// add new number if not present
		if(theOut.contains(tempRand)){
			// do nothing
		}else{
			// add
			theOut.append(tempRand)
		}
		
		if(abs(theOut.size()-$2)<0.0001){
			// have filled the desired vector.			
			for jj=1,$2{
				theOut2.x[jj-1] = $o1.x[theOut.x[jj-1]]
			}
			return theOut2
		}
	}
}

// Sample a given branch (and potential limits on x locations) to identify the 
// a subset of synapses.  This is used for tagging VGAT+ synapses as other types
// of synapses.
// $o1: SectionRef.  The section to look at.
// $2: numeric.  The number of sampled synapse indices to return.
// $3: numeric.  The seed to use.
// $3,$4: numerics (optional).  The low and high x values to consider for the 
//	particular SectionRef.
obfunc synIndSubset(){localobj allInds,theOut
	allInds = new Vector()
	if(numarg()<3.1){
		allInds = getVgatInds($o1)
	}else{
		allInds = getVgatInds($o1,$4,$5)
	}
	theOut = sampleNoReplace(allInds,$2,$3)
	return theOut
}