Orientation preference in L23 V1 pyramidal neurons (Park et al 2019)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:231185
"Pyramidal neurons integrate synaptic inputs from basal and apical dendrites to generate stimulus-specific responses. It has been proposed that feed-forward inputs to basal dendrites drive a neuron’s stimulus preference, while feedback inputs to apical dendrites sharpen selectivity. However, how a neuron’s dendritic domains relate to its functional selectivity has not been demonstrated experimentally. We performed 2-photon dendritic micro-dissection on layer-2/3 pyramidal neurons in mouse primary visual cortex. We found that removing the apical dendritic tuft did not alter orientation-tuning. Furthermore, orientation-tuning curves were remarkably robust to the removal of basal dendrites: ablation of 2 basal dendrites was needed to cause a small shift in orientation preference, without significantly altering tuning width. Computational modeling corroborated our results and put limits on how orientation preferences among basal dendrites differ in order to reproduce the post-ablation data. In conclusion, neuronal orientation-tuning appears remarkably robust to loss of dendritic input."
Reference:
1 . Park J, Papoutsi A, Ash RT, Marin MA, Poirazi P, Smirnakis SM (2019) Contribution of apical and basal dendrites to orientation encoding in mouse V1 L2/3 pyramidal neurons Nature Communications 10:5372
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex L2/3 pyramidal GLU cell;
Channel(s): I L high threshold; I T low threshold; I A; I K,Ca; I M; I K; I Na,t;
Gap Junctions:
Receptor(s): GabaA; NMDA; AMPA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Vision;
Implementer(s): Papoutsi, Athanasia [athpapoutsi at gmail.com];
Search NeuronDB for information about:  Neocortex L2/3 pyramidal GLU cell; GabaA; AMPA; NMDA; I Na,t; I L high threshold; I T low threshold; I A; I K; I M; I K,Ca; Gaba; Glutamate;
// Simulate spontaneous activity 
// Papoutsi, 2017

//Vectors of Spike trains
objref BG_basal[syn_basal], BG_apical[syn_apical], BG_Inh_soma[syn_inh_soma], BG_Inh_apical[syn_inh_apical], BG_Inh_basal[syn_inh_basal]
//Background synapses
objref bc_apical_ampa[syn_apical], bc_apical_nmda[syn_apical], bc_basal_ampa[syn_basal], bc_basal_nmda[syn_basal], bc_gaba_soma[syn_inh_soma], bc_gaba_apical[syn_inh_apical], bc_gaba_basal[syn_inh_basal]
//VecStims
objref vc_apical[syn_apical+1], vc_basal[syn_basal+1], vc_gaba_soma[syn_inh_soma+1], vc_gaba_apical[syn_inh_apical+1], vc_gaba_basal[syn_inh_basal+1]
//NetCons
objref nc_apical_ampa[syn_apical+1], nc_apical_nmda[syn_apical+1], nc_basal_ampa[syn_basal+1], nc_basal_nmda[syn_basal+1], nc_gaba_soma[syn_inh_soma+1], nc_gaba_apical[syn_inh_apical+1], nc_gaba_basal[syn_inh_basal+1]
//Random objects
objref r, r_time, r_time_inh

//Make distribution of synapses according to length
objref mat_bas, mat_ap, mat_inh_bas, mat_inh_ap,vd
mat_bas=new Vector()
mat_ap=new Vector()
mat_inh_bas=new Vector()
mat_inh_ap=new Vector()
tot_ap=0
tot_bas=0
for i=0, apical.count()-1 {tot_ap=tot_ap+apical.o(i).sec.L}
for i=0, apical.count()-1 {
	mat_ap.append(int((apical.o(i).sec.L/tot_ap)*syn_apical))
	mat_inh_ap.append(int((apical.o(i).sec.L/tot_ap)*syn_inh_apical))
}
for i=0, basal.count()-1 {tot_bas=tot_bas+basal.o(i).sec.L}
for pd=0,4 {
	for i=0, list_primary[pd].count()-1 {
		mat_bas.append(round((list_primary[pd].o(i).sec.L/tot_bas)*syn_basal))
		mat_inh_bas.append(round((list_primary[pd].o(i).sec.L/tot_bas)*syn_inh_basal))
	}	
}

proc background_activity () {	
	//Define random for position
	r=new Random(num_seed2)
	r.uniform(0,1)
	//and for poisson trains
	r_time=new Random(num_seed+1200)
	r_time.poisson(Hz/1000)

	r_time_inh=new Random(num_seed-7000)
	r_time_inh.poisson(Hz_inh/1000)
	//Basal	
	syn=0
	c_d=-1
	for pd=0,4 {
		for num=0, list_primary[pd].count()-1 {
			c_d=c_d+1
			for i=0, mat_bas.x(c_d)-1 {
				BG_basal[syn]=new Vector()
				for tt=0, tstop-1 {
					if (r_time.repick()){
						BG_basal[syn].append(tt)
					}
				}
				vc_basal[syn] = new VecStim(0.5)
				vc_basal[syn].delay = 0
				vc_basal[syn].play(BG_basal[syn])
				PID=r.repick()
				list_primary[pd].o(num).sec bc_basal_ampa[syn]=new GLU(PID)
				list_primary[pd].o(num).sec bc_basal_nmda[syn]=new nmda(PID)
				if (!cut_basal) {
					nc_basal_ampa[syn] = new NetCon(vc_basal[syn], bc_basal_ampa[syn], -20, 0, ampa_g)
					nc_basal_nmda[syn] = new NetCon(vc_basal[syn], bc_basal_nmda[syn], -20, 0, nmda_g)
				} else if (pd !=dend_id1 && pd!=dend_id2) {
					nc_basal_ampa[syn] = new NetCon(vc_basal[syn], bc_basal_ampa[syn], -20, 0, ampa_g)
					nc_basal_nmda[syn] = new NetCon(vc_basal[syn], bc_basal_nmda[syn], -20, 0, nmda_g)
				}
				syn=syn+1
			}
		}
	}
			
	//Apical
	syn=-1
	for num=0, apical.count()-1 {
		for i=0, mat_ap.x(num)-1 {
			syn=syn+1
			BG_apical[syn]=new Vector()
			for tt=0, tstop-1 {
				if (r_time.repick()){
					BG_apical[syn].append(tt)
				}
			}

			vc_apical[syn] = new VecStim(0.5)
			vc_apical[syn].delay = 0
			vc_apical[syn].play(BG_apical[syn])

			PID=r.repick()
			apical.o(num).sec bc_apical_ampa[syn]=new GLU(PID)
			apical.o(num).sec bc_apical_nmda[syn]=new nmda(PID)
			if (!ablated) {
				nc_apical_ampa[syn] = new NetCon(vc_apical[syn], bc_apical_ampa[syn], -20, 0, ampa_g)
				nc_apical_nmda[syn] = new NetCon(vc_apical[syn], bc_apical_nmda[syn], -20, 0, nmda_g)
			}
		}
	}
	
	for syn=0,syn_inh_soma-1 {
		BG_Inh_soma[syn]=new Vector()
		for tt=0, tstop-1 {
			if (r_time_inh.repick()){
				BG_Inh_soma[syn].append(tt)
			}
		}
		vc_gaba_soma[syn] = new VecStim(0.5)
		vc_gaba_soma[syn].delay = 0
		vc_gaba_soma[syn].play(BG_Inh_soma[syn])
		
		PID=r.repick()
		soma bc_gaba_soma[syn]=new GABAa(PID)
		nc_gaba_soma[syn] = new NetCon(vc_gaba_soma[syn], bc_gaba_soma[syn], -20, 0, gaba_g)
	}
	//Inhibition Basal	
	syn=0
	c_d=-1
	for pd=0,4 {
		for num=0, list_primary[pd].count()-1 {
			c_d=c_d+1
			for i=0, mat_inh_bas.x(c_d)-1 {
				BG_Inh_basal[syn]=new Vector()
				for tt=0, tstop-1 {
					if (r_time_inh.repick()){
						BG_Inh_basal[syn].append(tt)
					}
				}
				vc_gaba_basal[syn] = new VecStim(0.5)
				vc_gaba_basal[syn].delay = 0
				vc_gaba_basal[syn].play(BG_Inh_basal[syn])

				PID=r.repick()
				
				list_primary[pd].o(num).sec bc_gaba_basal[syn]=new GABAa(PID)
				if (!cut_basal) {
					nc_gaba_basal[syn] = new NetCon(vc_gaba_basal[syn], bc_gaba_basal[syn], -20, 0, gaba_g)
				} else if (pd !=dend_id1 && pd!=dend_id2) {
					nc_gaba_basal[syn] = new NetCon(vc_gaba_basal[syn], bc_gaba_basal[syn], -20, 0, gaba_g)
				}
				syn=syn+1
			}
		}
	}	
	
	syn=-1
	for num=0, apical.count()-1  {	
		for i=0, mat_inh_ap.x(num)-1 {
			syn=syn+1
			BG_Inh_apical[syn]=new Vector()
			for tt=0, tstop-1 {
				if (r_time_inh.repick()){
					BG_Inh_apical[syn].append(tt)
				}
			}
			vc_gaba_apical[syn] = new VecStim(0.5)
			vc_gaba_apical[syn].delay = 0
			vc_gaba_apical[syn].play(BG_Inh_apical[syn])

			PID=r.repick()

			apical.o(num).sec bc_gaba_apical[syn]=new GABAa(PID)
			if (!ablated) {
				nc_gaba_apical[syn] = new NetCon(vc_gaba_apical[syn], bc_gaba_apical[syn], -20, 0, gaba_g)
			}
		}
	}	
}