L5 PFC pyramidal neurons (Papoutsi et al. 2017)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:230811
" ... Here, we use a modeling approach to investigate whether and how the morphology of the basal tree mediates the functional output of neurons. We implemented 57 basal tree morphologies of layer 5 prefrontal pyramidal neurons of the rat and identified morphological types which were characterized by different response features, forming distinct functional types. These types were robust to a wide range of manipulations (distribution of active ionic mechanisms, NMDA conductance, somatic and apical tree morphology or the number of activated synapses) and supported different temporal coding schemes at both the single neuron and the microcircuit level. We predict that the basal tree morphological diversity among neurons of the same class mediates their segregation into distinct functional pathways. ..."
Reference:
1 . Papoutsi A, Kastellakis G, Poirazi P (2017) Basal tree complexity shapes functional pathways in the prefrontal cortex. J Neurophysiol 118:1970-1983 [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;
Brain Region(s)/Organism: Prefrontal cortex (PFC);
Cell Type(s): Neocortex L5/6 pyramidal GLU cell;
Channel(s): I A; I h; I L high threshold; I T low threshold; I N; I R; I K,Ca; I_AHP; I_Ks; I Na,p; I Na,t; I K;
Gap Junctions:
Receptor(s): AMPA; NMDA; GabaA; GabaB;
Gene(s):
Transmitter(s): Glutamate; Gaba;
Simulation Environment: NEURON;
Model Concept(s): Active Dendrites; Detailed Neuronal Models;
Implementer(s): Papoutsi, Athanasia [athpapoutsi at gmail.com];
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; GabaA; GabaB; AMPA; NMDA; I Na,p; I Na,t; I L high threshold; I N; I T low threshold; I A; I K; I h; I K,Ca; I_Ks; I R; I_AHP; Gaba; Glutamate;
//Background noise
init_obj=8000
objref r_time,r_time_a,r_time_inh, time_vec_a[nPcells][init_obj], time_vec_b[nPcells][init_obj], vd, r, vc_apical[nPcells][init_obj], vc_basal[nPcells][init_obj], bc_apical_ampa[nPcells][init_obj], bc_apical_nmda[nPcells][init_obj], bc_basal_ampa[nPcells][init_obj], bc_basal_nmda[nPcells][init_obj]
objref nc_apical_ampa[nPcells][init_obj], nc_apical_nmda[nPcells][init_obj], nc_basal_ampa[nPcells][init_obj], nc_basal_nmda[nPcells][init_obj]
objref mat_bas[nPcells], mat_ap[nPcells]
objref time_vec_inh[nPcells][init_obj],vc_inh[nPcells][init_obj], bc_inh_ampa[nPcells][init_obj], bc_inh_nmda[nPcells][init_obj], nc_inh_ampa[nPcells][init_obj], nc_inh_nmda[nPcells][init_obj]

proc background () {
	num_seed=$1
	r=new Random(num_seed*3)
	r.uniform(0,1)

	//Random for background noise
	r_time_a=new Random(num_seed*4)
	r_time_a.poisson(0.1/1000)
	r_time=new Random(num_seed)
	r_time.poisson($2/1000)

	r_time_inh=new Random(num_seed/10)
	r_time_inh.poisson(1/1000)

	for cn=0, nPcells-1 {
		//Uniform distribute inputs to dendrites according their length, so as to have the same density
		mat_bas[cn]=new Vector()
		mat_ap[cn]=new Vector()
		tot_ap=0
		tot_bas=0
		syn_apical=0
		syn_basal=0
		forsec Pcells[cn].apical {tot_ap=tot_ap+L}
		forsec Pcells[cn].basal {tot_bas=tot_bas+L}
		syn_apical=2*tot_ap*perc_back_ap		
		syn_basal=2*tot_bas*perc_back_bas
		forsec Pcells[cn].apical {
			mat_ap[cn].append(int((L/tot_ap)*syn_apical))
		}
		forsec Pcells[cn].basal {
			mat_bas[cn].append(int((L/tot_bas)*syn_basal))
		}

		syn=-1
		num=0
		forsec Pcells[cn].apical {
			for many_a=0, mat_ap[cn].x(num)-1 {
				syn=syn+1
				//Generate time-points
				time_vec_a[cn][syn]=new Vector()
				for tt=0, tstop-1 {
					if (r_time_a.repick()) {time_vec_a[cn][syn].append(tt)}
				}
				//Create Vecstims
				vc_apical[cn][syn] = new VecStim(0.5)
				vc_apical[cn][syn].delay = 0
				vc_apical[cn][syn].play(time_vec_a[cn][syn])
				
				PID=r.repick()
				bc_apical_ampa[cn][syn]=new GLU(PID)
				bc_apical_nmda[cn][syn]=new nmda_spikes(PID)

				nc_apical_ampa[cn][syn] = new NetCon(vc_apical[cn][syn], bc_apical_ampa[cn][syn], -20, 0, ampaweight)
				nc_apical_nmda[cn][syn] = new NetCon(vc_apical[cn][syn], bc_apical_nmda[cn][syn], -20, 0, nmdaweight*0.5)	
			
			}
			num=num+1
		}

		syn=-1
		num=0
		forsec Pcells[cn].basal {
			for many_b=0, mat_bas[cn].x(num)-1 {
				syn=syn+1
				time_vec_b[cn][syn]=new Vector()
				for tt=0,tstop-1 {
					if (r_time.repick()){time_vec_b[cn][syn].append(tt)}
				}
				vc_basal[cn][syn] = new VecStim(0.5)
				vc_basal[cn][syn].delay = 0
				vc_basal[cn][syn].play(time_vec_b[cn][syn])

				PID=r.repick()

				bc_basal_ampa[cn][syn]=new GLU(PID)
				bc_basal_nmda[cn][syn]=new nmda_spikes(PID)

				nc_basal_ampa[cn][syn] = new NetCon(vc_basal[cn][syn], bc_basal_ampa[cn][syn], -20, 0, ampaweight)
				nc_basal_nmda[cn][syn] = new NetCon(vc_basal[cn][syn], bc_basal_nmda[cn][syn], -20, 0, nmdaweight)
			}
			num=num+1
		}
	}
	for cn=0, nINcells-1 {
		for syn=0, bc_inh-1 {
			objref vd
			vd=new Vector()

			for i=0, tstop-1 {
				vd.append(r_time_inh.repick())
			}
			time_vec_inh[cn][syn]=new Vector()
			time_vec_inh[cn][syn]=vd.c.indvwhere(">=", 1)

			vc_inh[cn][syn] = new VecStim(0.5)
			vc_inh[cn][syn].delay = 0
			vc_inh[cn][syn].play(time_vec_inh[cn][syn])

			PID=r.repick()

			INcells[cn].soma bc_inh_ampa[cn][syn]=new GLUIN(PID)
			INcells[cn].soma bc_inh_nmda[cn][syn]=new NMDA(PID)

			nc_inh_ampa[cn][syn] = new NetCon(vc_inh[cn][syn], bc_inh_ampa[cn][syn], -20, 0, ampaweightin)
			nc_inh_nmda[cn][syn] = new NetCon(vc_inh[cn][syn], bc_inh_nmda[cn][syn], -20, 0, nmdaweightin)
		}
	}
}