Dopaminergic subtantia nigra neuron (Moubarak et al 2019)

 Download zip file 
Help downloading and running models
Accession:245427
Axon initial segment (AIS) geometry critically influences neuronal excitability. Interestingly, the axon of substantia nigra pars compacta (SNc) dopaminergic (DA) neurons displays a highly variable location and most often arises from an axon-bearing dendrite (ABD). We combined current-clamp somatic and dendritic recordings, outside-out recordings of dendritic sodium and potassium currents, morphological reconstructions and multi-compartment modelling to determine cell-to-cell variations in AIS and ABD geometry and their influence on neuronal output (spontaneous pacemaking frequency, AP shape). Both AIS and ABD geometries are highly variable between SNc DA neurons. Surprisingly, we found that AP shape and pacemaking frequency were independent of AIS geometry. Modelling realistic morphological and biophysical variations clarify this result: in SNc DA neurons, the complexity of the ABD combined with its excitability predominantly define pacemaking frequency and AP shape, such that large variations in AIS geometry negligibly affect neuronal output, and are tolerated.
Reference:
1 . Moubarak E, Engel D, Dufour MA, Tapia M, Tell F, Goaillard JM (2019) Robustness to Axon Initial Segment Variation Is Explained by Somatodendritic Excitability in Rat Substantia Nigra Dopaminergic Neurons. J Neurosci 39:5044-5063 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism: Basal ganglia;
Cell Type(s): Substantia nigra pars compacta DA cell;
Channel(s): Ca pump; I A; I Calcium; I h; I Na,t; I K;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Action Potential Initiation; Pacemaking mechanism;
Implementer(s): Tell, Fabien [fabien.tell at univ-amu.fr]; Moubarak, Estelle ;
Search NeuronDB for information about:  Substantia nigra pars compacta DA cell; I Na,t; I A; I K; I h; I Calcium; Ca pump;
// frequence meter
objref rec, nil , inter_spike,  spike_indx, somaVm_late, somaD1_late, somaD2_late, somaT_late, abdVm_late
objref abdD1_late, abdD2_late,nabdVm_late, nabdD1_late, nabdD2_late, abdT_late, nabdT_late

spike_indx = new Vector()



inter_spike = new Vector() // a vector to store spike time intervals
 
soma rec = new NetCon(&v(0.5), nil) // create a netcon that watch the soma to reach a threshold 
rec.threshold = -35  // record time indexes when V crosses threshold
rec.record(spike_indx)
nb_spikes_rejected = 8// ignore the first 10-1 = 9 interspike intervals
nbr=nb_spikes_rejected 
nb_spikes_recorded= 4// nb +1  of ISI from which instantaneous  frequency will be calculated 
nbrec=nb_spikes_recorded
nb_min = nb_spikes_rejected + nb_spikes_recorded  // ignore recordings with fewer spikes than this sum (3)


proc freqmeter () {local t1, t2 
   mean_freq = 0
  
 nbspikes = spike_indx.size() // calculate the number of spikes
print "spike times are  ",  spike_indx.printf // 
 t1 = spike_indx.x[nbr] // nbr th spike time
 t2 = spike_indx.x[nbr+1] // nbr+1 th spike time 
 print "t1 et t2 " , t1 ," " , t2 
 index1 = somaT.indwhere(">=", t1+40) // time before the extracted spike
 index2 = somaT.indwhere(">=", t2+40) //time after the extracted spike 
 
 print "index1 is ", index1
 print "index2 is ", index2
 
 if (nbspikes > nb_min) {
	 somaVm_late = new Vector()
somaD1_late = new Vector()
somaD2_late = new Vector()
somaT_late = new Vector()

abdVm_late = new Vector()
abdD1_late = new Vector()
abdD2_late = new Vector()
abdT_late = new Vector()

nabdVm_late = new Vector()
nabdD1_late = new Vector()
nabdD2_late = new Vector()
nabdT_late = new Vector()
	 
 inter_spike.copy(spike_indx,nb_spikes_rejected,nb_min) // copy the vector to a new vector starting by the n th intervals
 sub_nbspikes=inter_spike.size() // nb of spikes in the sub sample
 inter_spike.deriv  // calculate spike time intervals (ISI)
// inter_spike.printf 
moy = inter_spike.mean() // calculate mean ISI
// sd = inter_spike.stdev() // Calculate ISI STANDARD DEVIATION 
// sem = inter_spike.stderr() // calculate ISI sem
// time_total = inter_spike.sum() // calculate total time between the first and last spike 
// mean_freq = (sub_nbspikes/time_total)*500 // mean firing frequency 

// print "nb of spikes is  ",sub_nbspikes, "mean ISI is " , moy, "sd is " , sd, "sem is ", sem
 print " mean ISI is ", moy

somaVm_late.copy(somaVm,index1,index2) // copy the spikes of interest from the different compartment
somaD1_late.copy(somaD1,index1,index2)
somaD2_late.copy(somaD2,index1,index2)
somaT_late.copy(somaT,index1,index2)

abdVm_late.copy(abdVm,index1,index2)	
abdD1_late.copy(abdD1,index1,index2)		
abdD2_late.copy(abdD2,index1,index2)
abdT_late.copy(abdT, index1,index2)		

nabdVm_late.copy(nabdVm,index1,index2)	
nabdD1_late.copy(nabdD1,index1,index2)		
nabdD2_late.copy(nabdD2,index1,index2)
nabdT_late.copy(nabdT, index1,index2)	

strdef somaName
		sprint (somaName, "%s%d%s%d%s%d%s%d%s", "I_soma_SD", soma.gbar_Na12, "_AIS", SIprox.gbar_Na12, "_AIS_length_", ais_length, "_ABD_length_", abd_length, ".txt")
		print "soma file is ", somaName
		
		soma_analysis()
		fsomaSum.aopen(somaSum)
				fsomaSum.printf("\n %s\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t ", somaName, soma.gbar_Na12, SIprox.gbar_kdrDA, SIprox.gbar_Na12, abd_length, ais_length, iTh, threshold, AP, HW, peakIS, peakSD)
			fsomaSum.close()
			
			fISI.aopen(ISISum) 
			fISI.printf("\n %s\t%g\t%g\t%g\t%g\t%g\t", somaName,ais_length, abd_length, soma.gbar_Na12, SIprox.gbar_Na12, moy)
			fISI.close()

		strdef ABDname
		sprint (ABDname, "%s%d%s%d%s%d%s%d%s", "I_ABD_SD", soma.gbar_Na12, "_AIS", SIprox.gbar_Na12, "_AIS_length_", ais_length, "_ABD_length_", abd_length, ".txt")
		print "ABD file is ", ABDname
		
		abd_analysis()
		fabdSum.aopen(abdSum)
				fabdSum.printf("\n %s\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t ", ABDname, soma.gbar_Na12, SIprox.gbar_kdrDA, SIprox.gbar_Na12, abd_length, ais_length, iTh, threshold, AP, HW, peakIS, peakSD)
			fabdSum.close()	
		
		strdef nABDname
		sprint (nABDname, "%s%d%s%d%s%d%s%d%s", "I_nABD_SD", soma.gbar_Na12, "_AIS", SIprox.gbar_Na12, "_AIS_length_", ais_length, "_ABD_length_", abd_length, ".txt")
		print "nABD file is ", nABDname		
		
		nabd_analysis()
		fnabdSum.aopen(nabdSum)
				fnabdSum.printf("\n %s\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t%g\t ", nABDname, soma.gbar_Na12, SIprox.gbar_kdrDA, SIprox.gbar_Na12, abd_length, ais_length, iTh, threshold, AP, HW, peakIS, peakSD)
			fnabdSum.close()
		

		


chdir("data")
		fsoma.wopen(somaName)
		fabd.wopen(ABDname)
		fnabd.wopen(nABDname)
		
			for n=0, somaVm_late.size()-1{
					
					fsoma.printf("%g %g %g %g \n", somaT_late.x(n), somaVm_late.x(n), somaD1_late.x(n), somaD2_late.x(n))
					fabd.printf("%g %g %g %g \n", abdT_late.x(n), abdVm_late.x(n), abdD1_late.x(n), abdD2_late.x(n))
					fnabd.printf("%g %g %g %g \n", nabdT_late.x(n), nabdVm_late.x(n), nabdD1_late.x(n), nabdD2_late.x(n))
					
				} 
			fsoma.close()
			fabd.close()
			fnabd.close()	
			
		
print "controle spike extract1" 


} else {
	print "not enough spikes, increase duration of simulation " 
	quit()
}
print "controle spike extract2" 
}