Human Cortical L5 Pyramidal Cell (Rich et al. 2021)

 Download zip file 
Help downloading and running models
Accession:266984
This paper presents a full spiking, biophysically detailed multi-compartment model of a human cortical layer 5 (L5) pyramidal cell, where model development was primarily based on morphological and electrophysiological data from the same neuron. Focus was placed on capturing distinctly human dynamics of the h-channel and led to the articulation of a novel model of this channel's dynamics in humans. This led to an explanation for the surprising lack of subthreshold resonance seen in these cells in the human as opposed to rodent setting.
Reference:
1 . Rich S, Moradi Chameh H, Sekulic V, Valiante TA, Skinner FK (2021) Modeling Reveals Human-Rodent Differences in H-Current Kinetics Influencing Resonance in Cortical Layer 5 Neurons. Cereb Cortex 31:845-872 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex layer 5 pyramidal cell; Hodgkin-Huxley neuron;
Channel(s): I h; I M; I Na,p; I Na,t; I K; I Calcium;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Active Dendrites; Detailed Neuronal Models;
Implementer(s): Rich, Scott [sbrich at umich.edu];
Search NeuronDB for information about:  I Na,p; I Na,t; I K; I M; I h; I Calcium;
/
HumanCellOrganized_v2
readme.html
Ca_HVA.mod *
Ca_LVAst.mod *
CaDynamics_E2.mod *
Ih.mod
Ih_Kole.mod
Ih_me.mod
Ih_original.mod
Ih_shifted.mod
Im.mod *
izap.mod
K_Pst.mod
K_Tst.mod *
Nap_Et2.mod
NaTa_t.mod
NaTs2_t.mod *
SK_E2.mod *
SKv3_1.mod
CurrentClampSetup.hoc
DefineProcs.hoc
init_final.hoc
L5_params_exponential.hoc
ModelSetup.hoc
SimulationParameters_PlusSomeDefinitions.hoc
VoltageAndCurrentTrace.ses
VoltageAndcurrentTrace_noise_full.ses
VoltageAndcurrentTrace_zap.ses
VoltageAndcurrentTrace_zap_laptop.ses
                            
proc turnclampoff() {
	Iclamp = 0
	ic_clamp.amp=Iclamp
}

proc turnclampon() {
	Iclamp= PARAM_ic_clamp_amp
	ic_clamp.amp=Iclamp
}

proc setclamp() {
	Iclamp= $1
	ic_clamp.amp=Iclamp
}

proc setclampdur() {
	PARAM_ic_clamp_dur= $1
	ic_clamp.dur = PARAM_ic_clamp_dur
}

proc block() {
	gIhbar_opt=0
	gSKv3_1bar_opt=0
	gK_Pstbar_opt=0
	gImbar_opt=0
	gSK_E2bar_opt=0
	gK_Tstbar_opt=0
	gCa_LVAstbar_opt=0
	gCa_HVAbar_opt=0
	gNa_Et2_opt=0
	gNaTa_t_soma_opt=0
	gNaTa_t_apical_opt=0
	reset()
}

proc unblock() {
	gIhbar_opt=PARAM_gIhbar
	gSKv3_1bar_opt=PARAM_gSKv3_1bar
	gK_Pstbar_opt=PARAM_gK_Pstbar
	gImbar_opt=PARAM_gImbar
	gSK_E2bar_opt=PARAM_gSK_E2bar
	gK_Tstbar_opt=PARAM_gK_Tstbar
	gCa_LVAstbar_opt=PARAM_gCa_LVAsshiftbar
	gCa_HVAbar_opt=PARAM_gCa_HVAbar
	gNa_Et2_opt=PARAM_Nap_Et2
	gNaTa_t_soma_opt=PARAM_NaTa_t_soma
	gNaTa_t_apical_opt=PARAM_NaTa_t_apical
	reset()
}

proc block_Na() {
	gNa_Et2_opt=0
	gNaTa_t_soma_opt=0
	gNaTa_t_apical_opt=0
	reset()
}

proc block_Ca() {
	gCa_LVAstbar_opt=0
	gCa_HVAbar_opt=0
	reset()
}

proc block_K() {
	gSKv3_1bar_opt=0
	gK_Pstbar_opt=0
	gImbar_opt=0
	gSK_E2bar_opt=0
	gK_Tstbar_opt=0
	reset()
}

proc block_Ih() {
	gIhbar_opt=0
	reset()
}

proc setizap() {
	tstop=$1+$2

	setclamp(0)
	access filament_100000042[0]
	Zap= new Izap(0.5)
	
	Zap.del=$1
	Zap.dur=$2
	Zap.f0=$3
	Zap.f1=$4
	Zap.amp=$5

	load_file("VoltageAndCurrentTrace_zap.ses")

}

proc recordizap() {
	setizap($1,$2,$3,$4,$5)	

	time= new Vector()
	voltage= new Vector()
	zapcurrent= new Vector()

	time.record(&t)
	voltage.record(&filament_100000042[0].v(0.5))
	zapcurrent.record(&Zap.i)

	run()

	save_time= new File()
	save_voltage= new File()
	save_zapcurrent= new File()

	sprint(title_time, "ZapData_time_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)
	sprint(title_voltage, "ZapData_voltage_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)
	sprint(title_zapcurrent, "ZapData_zapcurrent_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)


	save_time.wopen(title_time)
	save_voltage.wopen(title_voltage)
	save_zapcurrent.wopen(title_zapcurrent)

	time.printf(save_time)
	voltage.printf(save_voltage)
	zapcurrent.printf(save_zapcurrent)

	save_time.close()
	save_voltage.close()
	save_zapcurrent.close()

	tstop=PARAM_tstop
}

proc noiserun() {
	cvode.active(0)
	dt= $2
	tstop=$3
	numstep=tstop/dt

	NoiseFile= new File()
	NoiseVector= new Vector(numstep)
	NoiseVector
	
	sprint(noiseinput, "%s.dat", $s1)
	NoiseFile.ropen(noiseinput)

	for i=1, numstep {
		NoiseVector.x[i-1]=$4+NoiseFile.scanvar()	
	}

	ic_clamp.del=0
	ic_clamp.dur=1e9
	NoiseVector.play(&ic_clamp.amp, dt)
		
	time= new Vector()
	voltage= new Vector()
	current= new Vector()

	time.record(&t)
	voltage.record(&filament_100000042[0].v(0.5))
	current.record(&ic_clamp.i)

	run()

	save_time= new File()
	save_voltage= new File()
	save_current= new File()

	sprint(title_time, "NoiseData_time_%s.csv", $s1)
	sprint(title_voltage, "NoiseData_voltage_%s.csv", $s1)
	sprint(title_current, "NoiseData_current_%s.csv", $s1)

	save_time.wopen(title_time)
	save_voltage.wopen(title_voltage)
	save_current.wopen(title_current)

	time.printf(save_time)
	voltage.printf(save_voltage)
	current.printf(save_current)

	save_time.close()
	save_voltage.close()
	save_current.close()


	cvode.active(1)
	tstop=PARAM_tstop
	NoiseVector.play_remove()
	ic_clamp.del = PARAM_ic_clamp_del
	ic_clamp.dur = PARAM_ic_clamp_dur
	ic_clamp.amp = Iclamp
}

proc multnoiseruns() {
	pw= new PWManager()
	while (pw.count()>2) {
		pw.close(pw.count()-1)
	}

	xopen("VoltageAndCurrentTrace_noise_full.ses")

	for j=1,60 {
		sprint(noiseinputmult, "%d_%s", j, $s1)
		print noiseinputmult
		noiserun(noiseinputmult,.01, 2500, 0.031)
		print j
	}
}

proc setizap_supra() {
	tstop=$1+$2

	setclamp(0)
	access filament_100000042[0]
	Zap= new Izap(0.5)
	
	Zap.del=$1
	Zap.dur=$2
	Zap.f0=$3
	Zap.f1=$4
	Zap.amp=$5

	load_file("VoltageAndCurrentTrace_zap.ses")
}

proc recordizap_supra() {
	setizap_supra($1,$2,$3,$4,$5)	

	cvode.active(0)
	dt=.01
	numstep=tstop/dt


	time= new Vector()
	voltage= new Vector()
	zapcurrent= new Vector()

	time.record(&t)
	voltage.record(&filament_100000042[0].v(0.5))
	zapcurrent.record(&Zap.i)

	run()

	save_time= new File()
	save_voltage= new File()
	save_zapcurrent= new File()

	sprint(title_time, "ZapData_time_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)
	sprint(title_voltage, "ZapData_voltage_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)
	sprint(title_zapcurrent, "ZapData_zapcurrent_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)


	save_time.wopen(title_time)
	save_voltage.wopen(title_voltage)
	save_zapcurrent.wopen(title_zapcurrent)

	time.printf(save_time)
	voltage.printf(save_voltage)
	zapcurrent.printf(save_zapcurrent)

	save_time.close()
	save_voltage.close()
	save_zapcurrent.close()

	cvode.active(1)
	tstop=PARAM_tstop
}

proc setizap_distal() {
	tstop=$1+$2

	setclamp(0)
	access filament_100000042[203]
	Zap= new Izap(0.5)
	
	Zap.del=$1
	Zap.dur=$2
	Zap.f0=$3
	Zap.f1=$4
	Zap.amp=$5

	load_file("VoltageAndCurrentTrace_zap.ses")
}

proc recordizap_distal() {
	setizap_distal($1,$2,$3,$4,$5)	

	time= new Vector()
	voltage= new Vector()
	zapcurrent= new Vector()

	time.record(&t)
	voltage.record(&filament_100000042[203].v(0.5))
	zapcurrent.record(&Zap.i)

	run()

	save_time= new File()
	save_voltage= new File()
	save_zapcurrent= new File()

	sprint(title_time, "ZapData_time_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)
	sprint(title_voltage, "ZapData_voltage_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)
	sprint(title_zapcurrent, "ZapData_zapcurrent_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur)

	save_time.wopen(title_time)
	save_voltage.wopen(title_voltage)
	save_zapcurrent.wopen(title_zapcurrent)

	time.printf(save_time)
	voltage.printf(save_voltage)
	zapcurrent.printf(save_zapcurrent)

	save_time.close()
	save_voltage.close()
	save_zapcurrent.close()

	tstop=PARAM_tstop
}

proc SwapToKole() {
	forsec Soma {
		insert Ih_mod
		gIhbar_Ih= 0
		gbar_Ih_mod= gIhbar_opt
	}
	
	forsec Apical {
		dist=distance(.5)
		insert Ih_mod
 		gbar_Ih_mod=gIhbar_opt*(-0.8696+2.0870*exp(3.6161*(dist/decay)))
		gIhbar_Ih= 0
	}
	
	forsec Basilar {
		insert Ih_mod
		gIhbar_Ih=0
		gbar_Ih_mod=gIhbar_opt
	}
}

proc ResetHChannel() {
	forsec Soma {
		gIhbar_Ih= gIhbar_opt
		gbar_Ih_mod= 0
	}
	
	forsec Apical {
		dist=distance(.5)
 		gbar_Ih_mod= 0
		gIhbar_Ih= gIhbar_opt*(-0.8696+2.0870*exp(3.6161*(dist/decay)))
	}
	
	forsec Basilar {
		gIhbar_Ih= gIhbar_opt
		gbar_Ih_mod=0
	}

}

proc changepassive() {
    	forall {
        	cm = $1
        	Ra = $2
        	g_pas = $3
        	e_pas = -$4
    	}
}

proc setizap_DC() {
	tstop=$1+$2

	setclamp($6)
	ic_clamp.del=0
	ic_clamp.dur=tstop

	access filament_100000042[0]
	Zap= new Izap(0.5)
	
	Zap.del=$1
	Zap.dur=$2
	Zap.f0=$3
	Zap.f1=$4
	Zap.amp=$5

	load_file("VoltageAndcurrentTrace_zap_laptop.ses")

}

proc recordizap_DC() {
	setizap_DC($1,$2,$3,$4,$5,$6)	

	time= new Vector()
	voltage= new Vector()
	zapcurrent= new Vector()

	time.record(&t)
	voltage.record(&filament_100000042[0].v(0.5))
	zapcurrent.record(&Zap.i)

	run()

	save_time= new File()
	save_voltage= new File()
	save_zapcurrent= new File()

	sprint(title_time, "ZapData_time_%d_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur, ic_clamp.amp*100)
	sprint(title_voltage, "ZapData_voltage_%d_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur, ic_clamp.amp*100)
	sprint(title_zapcurrent, "ZapData_zapcurrent_%d_%d_%d_%d_%d.csv", Zap.f0, Zap.f1, Zap.amp*100, Zap.dur, ic_clamp.amp*100)


	save_time.wopen(title_time)
	save_voltage.wopen(title_voltage)
	save_zapcurrent.wopen(title_zapcurrent)

	time.printf(save_time)
	voltage.printf(save_voltage)
	zapcurrent.printf(save_zapcurrent)

	save_time.close()
	save_voltage.close()
	save_zapcurrent.close()

	tstop=PARAM_tstop
}


proc recordclamp_TTX() {
	tstop=4080.6
	block_Na()
	tstop=4080.6

	ic_clamp.del=$1
	ic_clamp.dur=$2
	ic_clamp.amp=$3

	time= new Vector()
	voltage= new Vector()

	time.record(&t)
	voltage.record(&filament_100000042[0].v(0.5))

	run()

	save_time= new File()
	save_voltage= new File()

	sprint(title_time, "CurrentClampData_TTX_time_%d_%d_%d.csv", ic_clamp.del, ic_clamp.dur, ic_clamp.amp*100)
	sprint(title_voltage, "CurrentClampData_TTX_voltage_%d_%d_%d.csv", ic_clamp.del, ic_clamp.dur, ic_clamp.amp*100)

	save_time.wopen(title_time)
	save_voltage.wopen(title_voltage)

	time.printf(save_time)
	voltage.printf(save_voltage)

	save_time.close()
	save_voltage.close()

	tstop=PARAM_tstop
}

proc recordclamp() {
	tstop=4080.6
	unblock()
	tstop=4080.6

	ic_clamp.del=$1
	ic_clamp.dur=$2
	ic_clamp.amp=$3

	time= new Vector()
	voltage= new Vector()

	time.record(&t)
	voltage.record(&filament_100000042[0].v(0.5))

	run()

	save_time= new File()
	save_voltage= new File()

	sprint(title_time, "CurrentClampData_time_%d_%d_%d.csv", ic_clamp.del, ic_clamp.dur, ic_clamp.amp*100)
	sprint(title_voltage, "CurrentClampData_voltage_%d_%d_%d.csv", ic_clamp.del, ic_clamp.dur, ic_clamp.amp*100)

	save_time.wopen(title_time)
	save_voltage.wopen(title_voltage)

	time.printf(save_time)
	voltage.printf(save_voltage)

	save_time.close()
	save_voltage.close()

	tstop=PARAM_tstop
}





























proc reset() {
filament_100000042[0] distance()

    	forall {
        	insert pas
        	cm = cm_opt
        	Ra = Ra_opt
        	g_pas = g_pas_opt
        	e_pas = -e_pas_opt
    	}

	forsec Soma {
		insert Ca_LVAst 
	  	insert Ca_HVA 
		insert SKv3_1
		insert K_Pst
		insert K_Tst
		insert SK_E2
		insert CaDynamics_E2
		// insert Im
		insert Ih

		insert Nap_Et2 
	  	insert NaTa_t


  		gCa_LVAstbar_Ca_LVAst = gCa_LVAstbar_opt 
  		gCa_HVAbar_Ca_HVA = gCa_HVAbar_opt
		decay_CaDynamics_E2= 460.0
		gamma_CaDynamics_E2= 0.000501
		gSKv3_1bar_SKv3_1= gSKv3_1bar_opt
		gK_Pstbar_K_Pst= gK_Pstbar_opt
		gK_Tstbar_K_Tst= gK_Tstbar_opt
		gSK_E2bar_SK_E2= gSK_E2bar_opt
		// gImbar_Im= gImbar_opt
		gIhbar_Ih= gIhbar_opt

		gNap_Et2bar_Nap_Et2= gNa_Et2_opt
		gNaTa_tbar_NaTa_t= gNaTa_t_soma_opt

		cm=1
	}

	forsec Apical { 
		insert Ca_LVAst 
	  	insert Ca_HVA 
		insert SKv3_1
		// insert K_Pst
		// insert K_Tst
		insert SK_E2
		insert CaDynamics_E2
		insert Im
		insert Ih

  		insert NaTa_t 

		decay_CaDynamics_E2= 460.0
		gamma_CaDynamics_E2= 0.000501
		gSKv3_1bar_SKv3_1= gSKv3_1bar_opt
		// gK_Pstbar_K_Pst= gK_Pstbar_opt
		gSK_E2bar_SK_E2= gSK_E2bar_opt
		gImbar_Im= gImbar_opt
		
		// gIhbar_Ih= gIhbar_opt
		dist=distance(.5)
		// gIhbar_Ih=gIhbar_opt*exp(-1*dist/decay)
		gIhbar_Ih=gIhbar_opt*(-0.8696+2.0870*exp(3.6161*(dist/decay)))

  		// gCa_LVAstbar_Ca_LVAst = gCa_LVAstbar_opt 
  		// gCa_HVAbar_Ca_HVA = gCa_HVAbar_opt
		//if (dist>685 && dist<885) {
		if (dist>360 && dist<600) {
  			gCa_LVAstbar_Ca_LVAst = 100*gCa_LVAstbar_opt 
  			gCa_HVAbar_Ca_HVA = 10*gCa_HVAbar_opt
		} else{
			gCa_LVAstbar_Ca_LVAst = gCa_LVAstbar_opt 
  			gCa_HVAbar_Ca_HVA = gCa_HVAbar_opt
		}

		gNaTa_tbar_NaTa_t=gNaTa_t_apical_opt
	}

	forsec Basilar {
		// insert Ca_LVAst 
	  	// insert Ca_HVA 
		// insert SKv3_1
		// insert K_Pst
		// insert K_Tst
		// insert SK_E2
		// insert CaDynamics_E2
		// insert Im
		insert Ih

		// decay_CaDynamics_E2= 460.0
		// gamma_CaDynamics_E2= 0.000501
		// gSKv3_1bar_SKv3_1= gSKv3_1bar_opt
		// gK_Pstbar_K_Pst= gK_Pstbar_opt
		// gSK_E2bar_SK_E2= gSK_E2bar_opt
		// gImbar_Im= gImbar_opt
		gIhbar_Ih= gIhbar_opt
	}

	/* 
	forsec Axonal {
		insert SKv3_1
		insert K_Pst
		insert SK_E2
		insert CaDynamics_E2
		insert Im
		insert Ih

		decay_CaDynamics_E2= 460.0
		gamma_CaDynamics_E2= 0.000501
		gSKv3_1bar_SKv3_1= gSKv3_1bar_opt
		gK_Pstbar_K_Pst= gK_Pstbar_opt
		gSK_E2bar_SK_E2= gSK_E2bar_opt
		gImbar_Im= gImbar_opt
		gIhbar_Ih= gIhbar_opt
	} 
	*/
}

Loading data, please wait...