Distinct integration properties of noisy inputs in active dendritic subunits (Poleg-Polsky 2019)

 Download zip file 
Help downloading and running models
Accession:259732
The brain operates surprisingly well despite the noisy nature of individual neurons. The central mechanism for noise mitigation in the nervous system is thought to involve averaging over multiple noise-corrupted inputs. Subsequently, there has been considerable interest recently to identify noise structures that can be integrated linearly in a way that preserves reliable signal encoding. By analyzing realistic synaptic integration in biophysically accurate neuronal models, I report a complementary de-noising approach that is mediated by focal dendritic spikes. Dendritic spikes might seem to be unlikely candidates for noise reduction due to their miniscule integration compartments and poor averaging abilities. Nonetheless, the extra thresholding step introduced by dendritic spike generation increases neuronal tolerance for a broad category of noise structures, some of which cannot be resolved well with averaging. This property of active dendrites compensates for compartment size constraints and expands the repertoire of conditions that can be processed by neuronal populations.
Reference:
1 . Poleg-Polsky A (2019) Dendritic spikes expand the range of well-tolerated population noise structures. J Neurosci [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Synapse; Dendrite; Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex L2/3 pyramidal GLU cell; Neocortex primary motor area pyramidal layer 5 corticospinal cell;
Channel(s): I Na,t; I Potassium;
Gap Junctions:
Receptor(s): AMPA; GabaA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Synaptic Integration; Active Dendrites; Information transfer;
Implementer(s): Polsky, Alon [alonpol at tx.technion.ac.il];
Search NeuronDB for information about:  Neocortex L2/3 pyramidal GLU cell; GabaA; AMPA; NMDA; I Na,t; I Potassium; Gaba; Glutamate;
	use_mcell_ran4(1)
	tstop=500
	dt = 0.1	
	v_init=-60	
	steps_per_ms = 10	

	cell=new celltemplate(0,0)
	
	//---different parameters of the simulation
	
	Sim_repeatsPer_Input=100		//---number of trials in a repeat
	InputRepeats=10					//---number of repeats with different random parametres
	insertHH=01						//---run with somatic spiking
	insertHHdend=0					//---run with dendritic fast (Na/K) spiking
	layer5dend1=0					//---distribute on just one dendrite (only with a layer 5 cell)
	Voff_glutamate=0				//---0: voltage dependent; 1: independent NMDARs
	countRS=20						//---random seed
	randomseed=1					//---random seed					
	
	//---noise parameters
	Input_NOISE_type=0				//---0: no noise; 1: stochastic noise; 2: classification errors (DS); 3: binary classification errors
	proc SetNoise(){
		Input_AM=(Input_NOISE_type==1)*1.5		//---stocastic noise (variance)
		Input_DM=(Input_NOISE_type==2)*45		//---directionla modulation (degrees)
		Input_CE=(Input_NOISE_type==3)*15		//---classification errors(%)		
	}	
	SetNoise()	

	//---presynaptic input parameters
	Sim_Global=0					//---0: focal distribution on a dendrite; 1: global distribution over the entire cell
	Sim_Bias=0						//---use background bias
	Sim_Global_L1=Sim_Global		//---focal (0) or global (1) distribution of the fist layer in a network simulation
	proc SetNumberSyn(){	
		Input_numberFocalSynapses=8*(Sim_Global==0)-2*(CellNum-1)		//---# focal synapses
		if(layer5dend1*(CellNum==2)){Input_numberFocalSynapses=30}
		Input_numberGlobalSynapses=Sim_Global*(200)						//---# global synapses
		if(Voff_glutamate) {
			Input_numberFocalSynapses=100*(Sim_Global==0)
			Input_numberGlobalSynapses=100*Sim_Global
		}
		Input_numberDend=1*(CellNum==1)+(CellNum==2)*(5*(layer5dend1==0)+layer5dend1)	//---number of activated dendrites
		Input_biasnumberSynapses=Sim_Bias*400							//---# excitatory bias synapses
		Input_biasGABAnumberSynapses=Sim_Bias*CellNum*400/5				//---# inhibitory bias synapses
		Input_biasnumberSynapsesCV=0									//---CV of bias synapses
		//---do not belong here, but need to be updated
		Input_gNMDAmaxG=Voff_glutamate	//---NMDAR condictance for global (only for voltage independent simulations)
		Input_Background=250*(1+3*Voff_glutamate)//---signal background firing rate (ms)

	}
	SetNumberSyn()
	//---objects
	objref RandObj,SynList,NetList,NetConList,RanList,NetEventList,BiasList,NetBiasList,NetBiasConList,RanBiasList,RanBackgroundList,NetBackgroundList,NetBackgroundConList
	SynList=new List()
	BiasList=new List()
	NetList=new List()
	NetConList=new List()
	RanList=new List()
	RanBiasList=new List()
	RanBackgroundList=new List()
	NetEventList=new List()	
	NetBiasList=new List()
	RandObj=new Random()	
	RandObj.ACG(0)	

	//----------***read APs from file
	/*
	LayerNum=1
	Sim_Read_File=LayerNum>1
	strdef outintfilename,GF,filename,Read_File_st,filename_1
	GF="F"
	if(Sim_Global){GF="G"}
	if(insertHH==0){sprint(GF,"%ssub",GF)}
	Read_File_st="F"//previous generation
	if(Sim_Global_L1){Read_File_st="G"}
	outintfilename=""
	*/
	//---input tuning curve
	Input_Width=90					//---width of directional tuning of the input
	Input_WidthSD=0					//S.D. of width
	Input_Exp=4						//---exponent of: https://en.wikipedia.org/wiki/Generalized_normal_distribution
	Input_AngleInitSD=045			//---S.D of PD distribution for presynaptic inputs
	Input_Number=4					//---mean number of presynaptic inputs in a preferred signal	
	Input_DSI=0.5					//---1-ND/PD (null/preferred)
	Input_DSIsd=0					//---S.D. of DSI

	Input_Angle=0					//---direction of the stimulus. 0: ND; 180: PD

	//---synaptic conductance
	Input_gNMDAmaxF=1				//---NMDAR condictance for focal
	Input_gAMPAmax=1				//---AMPAR condictance
	Input_biasgNMDAmax=0			//---NMDAR condictance for background
	Input_biasgAMPAmax=1			//---AMPAR condictance for background
	Input_biasgGABAmax=1			//---GABAA condictance for background
	//---synaptic timing
	Input_Center=200+100*Sim_Bias	//---signal start time
	Input_Interval=15				//---signal activation rate (ms)			
	Input_biasISI=100				//---background activation rate (ms)
	Input_Noise=1					//---NEURON noise function
	Input_Noise_Background=1		//---NEURON noise function	
	
	Input_PreCells=1000				//---# total possible presynptic cells
	Input_biasNoise=0.5
	Noiser_Level=10
	tau_ampa_glutamate=1			//---decay time constant
	tau2_glutamate=2				//---activation time constant
	tau1_glutamate=100				//---decay time constant
	Pr_glutamate=1					//---p release

	//---active (voltage gated) parameters
	na_s=0.2+(CellNum==2)*0.1
	k_s=0.03+(CellNum==2)*.05	
	km_s=0.001+(CellNum==2)*.0005	
	na_d=0.005	
	k_d=0.001	
	km_d=0	
	vshift_HH=-8
	NF_HH=1
	//---passive
	rpas=10000	
	epas=-60
	
	countR=0
	//****OTHER OBJECTS and VARIABLES
	
	objref syn,pre,ncl,nr,outinFile
	countR=1
	
	double Dend_List[6]
	objref dendV[6]
	if(CellNum==1){				//---layer 2/3
		Dend_List[0]=25
		Dend_List[1]=19
		Dend_List[2]=12
		Dend_List[3]=2
		Dend_List[4]=7
		Dend_List[5]=8		
	}

	if(CellNum==2){
		Dend_List[0]=29			//---layer 5
		Dend_List[1]=14
		Dend_List[2]=37
		Dend_List[3]=56
		Dend_List[4]=71
		Dend_List[5]=4
	}
	if(layer5dend1){Dend_List[0]=10}
	
	for i=0,5{
		dendV[i]=new Vector()
		dendV[i].record(&cell.dend[Dend_List[i]].v(0.9))
		if(insertHHdend){
			access cell.dend[Dend_List[i]]
			insert HH
			gnabar_HH=0
			gkbar_HH=0
			gkmbar_HH=0				
		}		
	}
	if(insertHH){
		access cell.soma
		insert HH
		gnabar_HH=0
		gkbar_HH=0
		gkmbar_HH=0	
	}
	forall {	
		insert pas
		nseg=7
	}

	
	//---placeses synaptic inputs +/- random noise
	objref outinVecList,outinVec,outinSynList,outinSyn,outinMat,tuning
	objref swapvec,noisefreevec,noisefreevecD,orthogonalvec,tuningD,noisefreevecTest

	//---synaptic placement+assigns netstim object for each synapse 
	proc PlaceSynFull(){
		length=0
		forsec cell.dends{length+=L}
		//for numsyn=1,Input_numberSynapses{
		for numsyn=1,Input_numberGlobalSynapses{
			newloc=RandObj.uniform(0,length)// pick global location at random
			newpos=RandObj.uniform(0,1)
			length=0	
			forsec cell.dends{
				if( (length<=newloc)&&(length+L>=newloc)){		//put synapse
					SynList.append(new glutamate(newpos))
					SynList.o(SynList.count()-1).locx=x3d(int(n3d()*newpos))
					SynList.o(SynList.count()-1).locy=y3d(int(n3d()*newpos))
				}
				length+=L
			}
		}
	}
	//---dendritic synaptic placement+assigns netstim object for each synapse 
	proc PlaceSynDend(){
		if(layer5dend1==0){
			for dend=0,Input_numberDend-1{
				for numsyn=1,Input_numberFocalSynapses{
					dendnum=dend
					access cell.dend[Dend_List[dendnum]]
					newpos=RandObj.uniform(0.7,1)
					newpos=RandObj.uniform(0.5,1)
					SynList.append(new glutamate(newpos))
					SynList.o(SynList.count()-1).locx=x3d(int(n3d()*newpos))
					SynList.o(SynList.count()-1).locy=y3d(int(n3d()*newpos))
				}
			}
		}else{
			access cell.dend[Dend_List[0]]
			for numsyn=1,Input_numberFocalSynapses{
				SynList.append(new glutamate(.7))
				SynList.o(SynList.count()-1).locx=x3d(int(n3d()*newpos))
				SynList.o(SynList.count()-1).locy=y3d(int(n3d()*newpos))
			}
		}
	}
	
	//---distributes synapses either locally or globally
	objref biasdends
	double noBiasList[5]
	noBiasList[0]=25
	noBiasList[1]=24
	noBiasList[2]=23
	noBiasList[3]=17
	noBiasList[4]=16
	
	objref BiasRandObj
	proc PlaceSyn(){
		SynList=new List()
		BiasList=new List()
		NetList=new List()
		NetConList=new List()
		BiasRandObj=new Random(countRS)
		Input_numberGlobalSynapsesS=Input_numberGlobalSynapses	
		Input_numberFocalSynapsesS=Input_numberFocalSynapses		
		PlaceSynDend()		
		PlaceSynFull()		
		Input_numberGlobalSynapses=Input_numberGlobalSynapsesS
		Input_numberFocalSynapses=Input_numberFocalSynapsesS
		biasdends=new SectionList()
		forsec cell.all{
			biasdends.append()
		}
		for i=0,4{
			access cell.dend[noBiasList[i]]
			biasdends.remove()
		}
		length=0
		forsec biasdends{length+=L}
		VarSyn=int(BiasRandObj.normal(Input_biasnumberSynapses,(Input_biasnumberSynapses*Input_biasnumberSynapsesCV)^2))
		for numsyn=1,Input_biasGABAnumberSynapses+VarSyn{
			newloc=BiasRandObj.uniform(0,length)// pick global location at random
			newpos=BiasRandObj.uniform(0,1)
			length=0	
			forsec biasdends{
				if( (length<=newloc)&&(length+L>=newloc)){		//put synapse
					if(numsyn<=VarSyn){
						BiasList.append(new glutamate(newpos))
						BiasList.o(BiasList.count()-1).dend=0
					}else{
						BiasList.append(new gabaA(newpos))
						BiasList.o(BiasList.count()-1).dend=1
					}
					BiasList.o(BiasList.count()-1).locx=x3d(int(n3d()*newpos))
					BiasList.o(BiasList.count()-1).locy=y3d(int(n3d()*newpos))
				}
				length+=L
			}
		}
	}
	PlaceSyn()
	access cell.soma
	objref f1,somav,f2,caDend,fSpike
	somav=new Vector()
	somav.record(&cell.soma.v(0.5))

	objref somaAP,netcon,nil						
	somaAP=new Vector()						
	netcon=new NetCon(&cell.soma.v(0.5),nil)         //AP count	
	netcon.record(somaAP)						
	netcon.threshold=-10

	Sim_Read_File=0
	
	objref gVmain
	gVmain=new Graph(0)
	gVmain.view(0,-60,tstop,60,950,280,500,230) 
	gVmain.addexpr("cell.soma.v(0.5)",1,1)
	for i=0,(Input_numberDend-1){
		strdef st
		sprint(st,"cell.dend[%d].v(0.5)",Dend_List[i])
		gVmain.addexpr(st,9,1)
	}
	graphList[0].append(gVmain)
	gVmain = new PlotShape(0)
	gVmain.size(-173.946,185.946,-89.5612,270.331)
	gVmain.variable("v")
	gVmain.view(-173.946, -89.5612, 359.892, 359.892, 187, 187, 200.7, 200.8)
	fast_flush_list.append(gVmain)
	gVmain.save_name("fast_flush_list.")
	
	
	proc init_plots_panels(){//PLOTS
		//objref ginputs,shape,INreptimes,gSPIKE
		xpanel("Input")
			//---# synapses
			xlabel("Signal synapses")
			xbutton("Focal Synapses","Sim_Global=0 SetNumberSyn()  PlaceSyn() Update()")
			xvalue("# Focal Synapses","Input_numberFocalSynapses", 1," PlaceSyn() Update()")
			xbutton("Global Synapses","Sim_Global=1 SetNumberSyn()  PlaceSyn() Update()")
			xvalue("# Global Synapses","Input_numberGlobalSynapses", 1,"  PlaceSyn() Update()")
			// xcheckbox("Voltage independent NMDAR",&Voff_glutamate,"SetNumberSyn() PlaceSyn() Update()")
			xlabel("Background synapses")
			xvalue("# bias Synapses","Input_biasnumberSynapses", 1,"  PlaceSyn()  Update()")
			xvalue("# bias GABA Synapses","Input_biasGABAnumberSynapses", 1,"  PlaceSyn()  Update()")
			//---stimulation
			xbutton("Preferred signal","Input_Angle=180 Update()")
			xbutton("Null signal","Input_Angle=0 Update()")
			xvalue("Stimulation angle","Input_Angle", 1,"Update()")
			//---noise
			xlabel("Noise")
			xvalue("Stochastic noise","Input_AM", 1,"Update()")
			xbutton("Preset=1.5","Input_AM=1.5")
			xvalue("Classification errors (degrees, DS)","Input_DM", 1,"Update()")
			xbutton("Preset=45","Input_DM=45")
			xvalue("Classification errors (%)","Input_CE", 1,"Update()")
			xbutton("Preset=15","Input_CE=15")
		xpanel(140,500)
		xpanel("RUN")
			xvalue("Init","v_init", 1,"stdinit()", 1, 1 )
			xbutton("Init & Run","Update() run()")
			xbutton("Stop","stoprun=1")
			xvalue("Tstop","tstop", 1,"tstop_changed()", 0, 1 )		
		xpanel(540,500)
		// xpanel("PARAMETERS")
			// xlabel("Active Params")
			// xvalue("Na Soma","na_s", 1,"Update()")
			// xvalue("K Soma","k_s", 1,"Update()")
			// xvalue("Km Soma","km_s", 1,"Update()")
			// xvalue("Na Dend","na_d", 1,"Update()")
			// xvalue("K Dend","k_d", 1,"Update()")
			// xvalue("Km Dend","km_d", 1,"Update()")
			// xvalue("V Shift","vshift_HH", 1,"Update()")
			// xvalue("R Passive","rpas", 1,"Update()")
			// xvalue("E Passive","epas", 1,"Update()")
			// xvalue("Noise","NF_HH", 1,"")					
		// xpanel(360,10)

	}
	init_plots_panels()

	
	

Loading data, please wait...