Multiplexed coding in Purkinje neuron dendrites (Zang and De Schutter 2021)

 Download zip file 
Help downloading and running models
Accession:266864
Neuronal firing patterns are crucial to underpin circuit level behaviors. In cerebellar Purkinje cells (PCs), both spike rates and pauses are used for behavioral coding, but the cellular mechanisms causing code transitions remain unknown. We use a well-validated PC model to explore the coding strategy that individual PCs use to process parallel fiber (PF) inputs. We find increasing input intensity shifts PCs from linear rate-coders to burst-pause timing-coders by triggering localized dendritic spikes. We validate dendritic spike properties with experimental data, elucidate spiking mechanisms, and predict spiking thresholds with and without inhibition. Both linear and burst-pause computations use individual branches as computational units, which challenges the traditional view of PCs as linear point neurons. Dendritic spike thresholds can be regulated by voltage state, compartmentalized channel modulation, between-branch interaction and synaptic inhibition to expand the dynamic range of linear computation or burst-pause computation. In addition, co-activated PF inputs between branches can modify somatic maximum spike rates and pause durations to make them carry analogue signals. Our results provide new insights into the strategies used by individual neurons to expand their capacity of information processing.
Reference:
1 . Zang Y, De Schutter E (2021) The Cellular Electrophysiological Properties Underlying Multiplexed Coding in Purkinje Cells. J Neurosci [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Dendrite; Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Cerebellum;
Cell Type(s): Cerebellum Purkinje GABA cell;
Channel(s): I T low threshold; I Na,p; I h; I Potassium; I Sodium; I p,q; I K,Ca;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Dendritic Action Potentials; Detailed Neuronal Models; Synaptic Integration; Temporal Coding; Reaction-diffusion;
Implementer(s): Zang, Yunliang ;
Search NeuronDB for information about:  Cerebellum Purkinje GABA cell; I Na,p; I T low threshold; I p,q; I h; I K,Ca; I Sodium; I Potassium;
load_file("nrngui.hoc")

Default_Eleak = -65
membranecap = 0.64      	/* specific membrane capacitance in uF cm^-2 */
membraneresist = 120236 	/* specific membrane resistance in ohm cm^2 */
axialresist = 120	     	/* axial resistivity in ohm cm */

xopen("Purkinje19b972-1.nrn")	// Load the morphology file.
forsec "axon" delete_section()	// Delete original axon and add a fake AIS

objref g2, b2,c2, distrx, distry, cdistry, p

	forall {
		insert pas e_pas=Default_Eleak	/* Insert Leak everywhere */
	    insert hpkj	// Ih inserted everywhere
		insert ds
		insert pk
	}

    AIS {  g_pas=1/membraneresist Ra=axialresist cm=membranecap}
	forsec spinydend {g_pas=5.3/membraneresist Ra=axialresist cm=5.3*membranecap}
    forsec maindend {g_pas=1.2/membraneresist Ra=axialresist cm=1.2*membranecap}
	forsec "soma" { g_pas=1/membraneresist Ra=axialresist cm=membranecap}

forsec maindend {insert cdp4N}
forsec alldend {
    insert Kv3
    gbar_Kv3 = 0.1512
    vshift_Kv3 = 4
    insert newCaP
    pcabar_newCaP = 0.00019 
    vshift_newCaP =-5
    insert CaT3_1
    pcabar_CaT3_1 = 2.7e-05

    insert mslo
    gbar_mslo = 0.21504
    insert SK2
    gkbar_SK2 = 2.4000e-04*1.5
    scal_SK2 = 1.0
    ghbar_hpkj = 0.00036
	insert Kv1
	gbar_Kv1 = 0.002
	insert Kv4
	 gbar_Kv4 = 0.0252 
    insert Kv4s
    gbar_Kv4s = 0.015

}

forsec spinydend {
	insert cdp4Nsp
    gkbar_SK2 = 0.00036 
    
    scal_SK2 = 1.0
	gbar_Kv4 = 0.0264 
    gbar_Kv4s = 0.015
    ghbar_hpkj = 0.000324
    vshift_Kv4 = 0
    gbar_Kv1 = 0.001
    gbar_Kv3 =0.1512
    vshift_Kv3 = 0
    pcabar_CaT3_1 = 0.000108 
    pcabar_newCaP = 0.00076 
    vshift_newCaP = -5
    scale_cdp4Nsp = 3.5
    gbar_mslo = 0.0896
    insert abBK
    gabkbar_abBK = 0.15
}

access somaA
somaA distance(0,0.5)

forsec "soma" {	
	insert naRsg
	gbar_naRsg = 0.03168 
	vshifta_naRsg = 0
    vshiftk_naRsg = 0
    vshifti_naRsg = -5
    
	insert nap
	gbar_nap = 0.00014 
	insert pk
	ena = 63
    ghbar_hpkj = 0.000108

    insert cdp20N_FD2

    insert Kv3
    gbar_Kv3 = 1.8
    vshift_Kv3 = 4
    insert newCaP
    pcabar_newCaP =0.00019 
    kt_newCaP = 1
    vshift_newCaP = -5
    insert mslo
    gbar_mslo = 0.8736
    insert abBK
    gabkbar_abBK = 0.3
    insert SK2
    gkbar_SK2 = 0.0075 
}

AIS {
    insert naRsg
	gbar_naRsg = 0.56
	vshifta_naRsg = 15
	vshiftk_naRsg = 5
    vshifti_naRsg = -5
	insert nap
	gbar_nap = 0.0023
	insert CaT3_1
	pcabar_CaT3_1 = 0.000128 
	ena = 63
    ghbar_hpkj = 0.000108 
    insert cdpAIS

    insert Kv3
    gbar_Kv3 =115.2 
    vshift_Kv3 = 4
    insert newCaP
    pcabar_newCaP = 0.00228 
    kt_newCaP = 1
    vshift_newCaP = -5
    insert mslo
    gbar_mslo = 6
    insert abBK
    gabkbar_abBK = 1.05
    insert SK2
    gkbar_SK2 = 0.027777778 
}

proc kv4_ko() {
	forsec maindend{
		 gbar_Kv4 = 0.0252*$1
   		 gbar_Kv4s = 0.015*$1
	}
	forsec spinydend{
		 gbar_Kv4 = 0.0264 *$1
   		 gbar_Kv4s = 0.015*$1
	}
}

access somaA

xopen("dendv_arnd21.ses")
xopen("distal2.ses")
celsius = 34
dt = 0.02
tstop = 600
steps_per_ms = 1/dt
dtsim = 0.02
protc = 1

objref g2, b2,c2, distrm, distrd


objref cu0,cu1,cu2,cu3,cu4,cu5,cu6,cu7,cu8,cu9,cu10,cu11,cu12,cu13,cu14,cu15,dummy1,dummy2
objref du0,du1,du2,du3,du4,du5,du6,du7,du8,du9,du10,du11,du12,du13
objref eu0,eu1,eu2,eu3,eu4,eu5,eu6,eu7,eu8,eu9,eu10,eu11,eu12,eu13,eu14
objref cumatrix,dumatrix, eumatrix
objref fcu,fdu,feu
fcu = new File()
fdu = new File()
feu = new File()

strdef outDir,cmd
sprint(outDir,"simdata/fig2")
sprint(cmd, "system(\"mkdir -p %s\")",outDir)
execute(cmd)

xopen ("electrode.hoc")
  if (protc==1) {

  		fcu.wopen("main_current_0_0.dat")
		fdu.wopen("spiny_current_0_0.dat")
		feu.wopen("spiny2_current_0_0.dat")
		stim1.amp = 0
  } else if (protc==2) {
  		fcu.wopen("main_current_0_2.dat")
		fdu.wopen("spiny_current_0_2.dat")
		feu.wopen("spiny2_current_0_2.dat")
		stim1.amp = -0.2
  } else if (protc==3) {
  		fcu.wopen("main_current_0_4.dat")
		fdu.wopen("spiny_current_0_4.dat")
		feu.wopen("spiny2_current_0_4.dat")
		stim1.amp = -0.4
  } else {
 		print "undefined protocol"
 		stop 
  }

stim1.del = 0
stim1.dur =50000000000000
v_init = -70

dendA1_001011110110010110 {nseg =3}

cu0 = new Vector()
cu1 = new Vector()
cu2 = new Vector()
cu3 = new Vector()
cu4 = new Vector()
cu5 = new Vector()
cu6 = new Vector()
cu7 = new Vector()
cu8 = new Vector()
cu9 = new Vector()
cu10 = new Vector()
cu11= new Vector()
cu12 = new Vector()
cu13 = new Vector()
cu14 = new Vector()
cu15 = new Vector()

du0 = new Vector()
du1 = new Vector()
du2 = new Vector()
du3 = new Vector()
du4 = new Vector()
du5 = new Vector()
du6 = new Vector()
du7 = new Vector()
du8 = new Vector()
du9 = new Vector()
du10 = new Vector()
du11= new Vector()
du12 = new Vector()
du13 = new Vector()

eu0 = new Vector()
eu1 = new Vector()
eu2 = new Vector()
eu3 = new Vector()
eu4 = new Vector()
eu5 = new Vector()
eu6 = new Vector()
eu7 = new Vector()
eu8 = new Vector()
eu9 = new Vector()
eu10 = new Vector()
eu11= new Vector()
eu12 = new Vector()
eu13 = new Vector()
eu14 = new Vector()

cumatrix = new Matrix()
dumatrix = new Matrix()
eumatrix = new Matrix()

cu0.record(&dendA1_00101111011.ik_Kv3(0.5))
cu1.record(&dendA1_00101111011.ica_newCaP(0.5))
cu2.record(&dendA1_00101111011.iCa_CaT3_1(0.5))
cu3.record(&dendA1_00101111011.ik_mslo(0.5))
cu4.record(&dendA1_00101111011.ik_Kv4(0.5))
cu5.record(&dendA1_00101111011.ik_SK2(0.5))
cu6.record(&dendA1_00101111011.i_hpkj(0.5))
cu7.record(&dendA1_00101111011.ik_Kv1(0.5))
cu8.record(&dendA1_00101111011.ik_Kv4s(0.5))
cu9.record(&dendA1_00101111011.i_pas(0.5))
cu10.record(&dendA1_001011110110010110.v(0.5))	//tip
cu11.record(&dendA1_001011.v(0.5))	//onpath
cu12.record(&somaA.v(0.5))	//soma
cu13.record(&dendA1_00101111011.v(0.5))
cu14.record(&dendA1_00101111011.v(0.5+1/3))
cu15.record(&dendA1_00101111011.v(0.5-1/3))

dendA1_001011110110010110 {nseg = 3}
du0.record(&dendA1_001011110110010110.ik_Kv3(0.5))
du1.record(&dendA1_001011110110010110.ica_newCaP(0.5))
du2.record(&dendA1_001011110110010110.iCa_CaT3_1(0.5))
du3.record(&dendA1_001011110110010110.ik_mslo(0.5))
du4.record(&dendA1_001011110110010110.ik_Kv4(0.5))
du5.record(&dendA1_001011110110010110.ik_SK2(0.5))
du6.record(&dendA1_001011110110010110.i_hpkj(0.5))
du7.record(&dendA1_001011110110010110.ik_Kv1(0.5))
du8.record(&dendA1_001011110110010110.ik_Kv4s(0.5))
du9.record(&dendA1_001011110110010110.i_pas(0.5))
du10.record(&dendA1_001011110110010110.ik_abBK(0.5))

du11.record(&dendA1_001011110110010110.v(0.5))
du12.record(&dendA1_001011110110010110.v(0.5+1/3))
du13.record(&dendA1_001011110110010110.v(0.5-1/3))

//dendA1_001011110110011101 2 segments by default
//dendA1_001011110110011101 {nseg = 3}
forsec "dendA1_0010111101100111*" {nseg = 3}
eu0.record(&dendA1_001011110110011110.ik_Kv3(0.5))
eu1.record(&dendA1_001011110110011110.ica_newCaP(0.5))
eu2.record(&dendA1_001011110110011110.iCa_CaT3_1(0.5))
eu3.record(&dendA1_001011110110011110.ik_mslo(0.5))
eu4.record(&dendA1_001011110110011110.ik_Kv4(0.5))
eu5.record(&dendA1_001011110110011110.ik_SK2(0.5))
eu6.record(&dendA1_001011110110011110.i_hpkj(0.5))
eu7.record(&dendA1_001011110110011110.ik_Kv1(0.5))
eu8.record(&dendA1_001011110110011110.ik_Kv4s(0.5))
eu9.record(&dendA1_001011110110011110.i_pas(0.5))
eu10.record(&dendA1_001011110110011110.ik_abBK(0.5))

eu11.record(&dendA1_001011110110011110.v(0.5))
eu12.record(&dendA1_001011110110011110.v(0.5+1/3))
eu13.record(&dendA1_001011110110011110.v(0.5-1/3))


//kv4_ko(0.5)

xopen("distri.hoc")	//voltage spatial distribution

xopen("distri_synapse.hoc")

objref sl2
sl2 = new SectionList()
sl2.wholetree()
objref ss
ss = new Shape(sl2)

Npf=45
nlist = 10/10	// in fact nlist can be multiple, make synapses firing at bursting
objref aSynapseList[nlist]
for i = 0,nlist-1 {aSynapseList[i] = new List()}
randomseed = 20
objref br1
br1 = new SectionList()
forsec "dendA1_00101111011" {br1.append()}

br1.remove(cf)
br1.unique()

for i = 0,nlist-1 {aSynapseList[i] = distSyns(Npf,br1,randomseed)}

for i = 0,nlist-1 {
for ii=0,aSynapseList[i].count()-1 {
	aSynapseList[i].object(ii).onset = 396
    aSynapseList[i].object(ii).tau0 = 0.3
    aSynapseList[i].object(ii).tau1 = 3
    aSynapseList[i].object(ii).e = 0
    aSynapseList[i].object(ii).gmax = 0.5e-3//
    ss.point_mark(aSynapseList[i].object(ii),4,4,4)
    ss.exec_menu("Show Diam")
}
}
eu14.record(&syn2[20].i)
/***
objref f1,f2
f1 = new File()
f1.wopen("simdata/fig2/maindistr_amp.dat")
f2 = new File()
f2.wopen("simdata/fig2/spinydistr_amp.dat")
**/
finitialize(v_init)
startsw()
continuerun(tstop)		// This is "run()" without the "init()"

cumatrix.resize(cu0.size(),17)
cumatrix.setcol(0,cu0)
cumatrix.setcol(1,cu1)
cumatrix.setcol(2,cu2)
cumatrix.setcol(3,cu3)
cumatrix.setcol(4,cu4)
cumatrix.setcol(5,cu5)
cumatrix.setcol(6,cu6)
cumatrix.setcol(7,cu7)
cumatrix.setcol(8,cu8)
cumatrix.setcol(9,cu9)
cumatrix.setcol(10,cu10)
cumatrix.setcol(11,cu11)
cumatrix.setcol(12,cu12)
cumatrix.setcol(13,cu13)
dendA1_00101111011 {r1 = ri(0.5) r2 = ri(0.5+1/3)}
cumatrix.setcol(14,cu14)
cumatrix.setcol(15,cu15)

cu14.sub(cu13)
cu14.div(r2)	//disgtal
cu15.sub(cu13)	//proximal
cu15.div(r1)
cumatrix.setcol(16,cu14.add(cu15))

dumatrix.resize(du0.size(),15)
dumatrix.setcol(0,du0)
dumatrix.setcol(1,du1)
dumatrix.setcol(2,du2)
dumatrix.setcol(3,du3)
dumatrix.setcol(4,du4)


dumatrix.setcol(5,du5)
dumatrix.setcol(6,du6)
dumatrix.setcol(7,du7)
dumatrix.setcol(8,du8)
dumatrix.setcol(9,du9)
dumatrix.setcol(10,du10)
dumatrix.setcol(11,du11)
dumatrix.setcol(12,du12)
dumatrix.setcol(13,du13)

dendA1_001011110110010110 {r1 = ri(0.5) r2 = ri(0.5+1/3)}

du12.sub(du11)
du12.div(r2)
du13.sub(du11)
du13.div(r1)
dumatrix.setcol(14,du12.add(du13))

eumatrix.resize(eu0.size(),16)
eumatrix.setcol(0,eu0)
eumatrix.setcol(1,eu1)
eumatrix.setcol(2,eu2)
eumatrix.setcol(3,eu3)
eumatrix.setcol(4,eu4)
eumatrix.setcol(5,eu5)
eumatrix.setcol(6,eu6)
eumatrix.setcol(7,eu7)
eumatrix.setcol(8,eu8)
eumatrix.setcol(9,eu9)
eumatrix.setcol(10,eu10)
eumatrix.setcol(11,eu11)
eumatrix.setcol(12,eu12)
eumatrix.setcol(13,eu13)

dendA1_001011110110010110 {r1 = ri(0.5) r2 = ri(0.5+1/3)}

eu12.sub(eu11)
eu12.div(r2)
eu13.sub(eu11)
eu13.div(r1)
eumatrix.setcol(14,eu12.add(eu13))
eumatrix.setcol(15,eu14)

cumatrix.fprint(fcu, "  %g")
dumatrix.fprint(fdu, "  %g")
eumatrix.fprint(feu, "  %g")
fcu.close()
fdu.close()
feu.close()
stopsw()

Loading data, please wait...