Purkinje neuron network (Zang et al. 2020)

 Download zip file 
Help downloading and running models
Accession:266799
Both spike rate and timing can transmit information in the brain. Phase response curves (PRCs) quantify how a neuron transforms input to output by spike timing. PRCs exhibit strong firing-rate adaptation, but its mechanism and relevance for network output are poorly understood. Using our Purkinje cell (PC) model we demonstrate that the rate adaptation is caused by rate-dependent subthreshold membrane potentials efficiently regulating the activation of Na+ channels. Then we use a realistic PC network model to examine how rate-dependent responses synchronize spikes in the scenario of reciprocal inhibition-caused high-frequency oscillations. The changes in PRC cause oscillations and spike correlations only at high firing rates. The causal role of the PRC is confirmed using a simpler coupled oscillator network model. This mechanism enables transient oscillations between fast-spiking neurons that thereby form PC assemblies. Our work demonstrates that rate adaptation of PRCs can spatio-temporally organize the PC input to cerebellar nuclei.
Reference:
1 . Zang Y, Hong S, De Schutter E (2020) Firing rate-dependent phase responses of Purkinje cells support transient oscillations. Elife [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell; Realistic Network;
Brain Region(s)/Organism: Cerebellum;
Cell Type(s): Cerebellum Purkinje GABA cell;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; MATLAB;
Model Concept(s): Phase Response Curves; Action Potentials; Spatio-temporal Activity Patterns; Synchronization; Action Potential Initiation; Oscillations;
Implementer(s): Zang, Yunliang ; Hong, Sungho [shhong at oist.jp];
Search NeuronDB for information about:  Cerebellum Purkinje GABA cell;
load_file("nrngui.hoc")
xopen("Purk_active.hoc")

access somaA
celsius = 34
tstop =1000*0.001
dt = 0.02
steps_per_ms = 1/dt
dtsim = 0.02

fr_total = 11

objref st_step
st_step = new Vector(50,0)
st_step.x[0]= 0.25
st_step.x[1]= 0.25
st_step.x[2]= 0.1
st_step.x[3]= 0.1
st_step.x[4]= 0.05
st_step.x[5]= 0.05
st_step.x[6]= 0.05
st_step.x[7]= 0.05
st_step.x[8]= 0.05
st_step.x[9]= 0.05
st_step.x[10]= 0.05
st_step.x[11]= 0.05

finitialize(v_init)
objref ward_num
ward_num = new Vector(400,0)

objref stim_st
stim_st = new Vector(400,20000)

objref basalfr
basalfr = new File("./simdata/basal_condition.dat")
basalfr.ropen()
objref InjectMatrix
InjectMatrix = new Matrix()
InjectMatrix.scanf(basalfr,fr_total,3)

for(i=0; i<fr_total; i = i+1){
		ward_num.x[(InjectMatrix.x[i][0])-1]=int(InjectMatrix.x[i][1]*int(1/st_step.x[(InjectMatrix.x[i][0])-1]))
		stim_st.x[(InjectMatrix.x[i][0])-1] = InjectMatrix.x[i][2]
}

strdef tmpstr
strdef outDir
strdef cmd 
objref outfile
outfile = new File()

objref pc
pc = new ParallelContext()
print "number of hosts: ", pc.nhost(), "\thost id: ", pc.id() 
st = pc.time


proc setdrive() {
  stim1.amp = $1
}

func distscale() {local key localobj returnvec
	key = $1
	returnvec = new Vector()
	returnvec = calc_prc_single(key)
	pc.pack(returnvec)
	pc.post(key)
	return key
}
	
	objref apc
obfunc calc_prc_single() {local base_num, st_num localobj APs
    base_num = $1
	st_num = int((base_num - (int(base_num/100000))*100000)/1000)
    shift = base_num-(int(base_num/100000))*100000-st_num*1000
    base_num = int(base_num/100000)
    stim2.del = stim_st.x[base_num-1]+ st_step.x[base_num-1]* shift
    stim2.amp = -0.5*st_num*0.1
    curr = -0.2+0.1*(base_num-1)
	setdrive (curr)
  APs = new Vector()
  somaA apc = new APCount(0.5)
  apc.thresh = -20
  apc.record(APs)

    run()
    return APs
}

pc.runworker()


objref threshvec
threshvec=new Vector()
objref basalvec


proc calc_prcs() {
	icurr_ind = $1
	if (stim_opt) {
	    sprint(outDir,"simdata/amp")
	    } else{
	    sprint(outDir,"simdata/dur")
	 }
    sprint(cmd, "system(\"mkdir -p %s\")",outDir)
	execute(cmd)
	sprint(tmpstr,"%s/prc_timing_stim.dat",outDir) 
	outfile.wopen(tmpstr)
	
	
	for icurr = 1,icurr_ind {
		for st = 1, $2 {
    		for ward = 1, ward_num.x[icurr-1] {
    			mmtag=ward+1000*st+100000*icurr
    			pc.submit("distscale",mmtag)
			}
		}
	}

		//collect error values
	while (pc.working()) {
		key = pc.retval()	//retrieve the tag
		pc.look_take(key)	//remove the tag/job from the bulletin
		
		threshvec = pc.upkvec()	//unpack the error value associated with the tag
		
		print "received key ",key
	   cuno=int(key/100000)
	   stno = int((key-cuno*100000)/1000)
	   wardno = key-cuno*100000-stno*1000
	   
			for te = 0, threshvec.size() - 1 {
       	 		outfile.printf ("%e %e %e %e\n", cuno, stno, wardno, threshvec.x[te])
      		}
      		outfile.flush()
        }
        outfile.close()
}


printf("the basal firing rates are configured")
stim_opt = 1

calc_prcs(fr_total,1)

print "the time used is",pc.time-st

Loading data, please wait...