Rhesus Monkey Young and Aged L3 PFC Pyramidal Neurons (Rumbell et al. 2016)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:184497
A stereotypical pyramidal neuron morphology with ion channel parameter combinations that reproduce firing patterns of one young and one aged rhesus monkey L3 PFC pyramidal neurons. Parameters were found through an automated optimization method.
Reference:
1 . Rumbell TH, Draguljic D, Yadav A, Hof PR, Luebke JI, Weaver CM (2016) Automated evolutionary optimization of ion channel conductances and kinetics in models of young and aged rhesus monkey pyramidal neurons. J Comput Neurosci 41:65-90 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism:
Cell Type(s): Neocortex L2/3 pyramidal GLU cell;
Channel(s): I Na,p; I Na,t; I A; I K; I M; I h; I K,Ca; I Sodium; I Calcium; I Potassium; I_AHP; I Cl, leak;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Ion Channel Kinetics; Parameter Fitting; Detailed Neuronal Models; Aging/Alzheimer`s;
Implementer(s):
Search NeuronDB for information about:  Neocortex L2/3 pyramidal GLU cell; I Na,p; I Na,t; I A; I K; I M; I h; I K,Ca; I Sodium; I Calcium; I Potassium; I_AHP; I Cl, leak;
// Make a multiple run fitter:
objref MRF
MRF = new MulRunFitter()

// gener list required:
objref gener
gener = new List()

// cell name - determines folder name and 
strdef cellname
if (CELL==2) {
	cellname = "Dec15IR2e_y"
} else if (CELL==3) {
	cellname = "Jun24IR2i_o"
}

//init some important params used in the loops:
objref xobj, f1, orig_data
strdef xstr
orig_data = new Matrix()
f1 = new File()

// Vectors for parameter boundaries:
objref minvec,maxvec
minvec = new Vector()
maxvec = new Vector()

// Keep track of the total number of fitness functions present:
totalFFs = 0

// Generators and parameters specified in these 2 files using MRFflag

xopen("setup/setupGenerators.hoc")
xopen("setup/setupParameters.hoc")

NP = parameters.count()
NGens = gener.count()

/*****************************************************
 * General useful processes reliant on set up of a MRF
 ****************************************************/
 
 // First argument to this function has to be the number of parameters
 // to be set, which is also the number of additional input arguments
proc set_n_params() {local i
	for ( i = 1 ; i <= numarg() ; i += 1 ) {
		MRF.p.pf.parmlist.object(i-1).val = $i
	}
	MRF.p.pf.putall()
}

// For recording voltage traces:
//set up some kind of voltage recording vector
objref voltVec
voltVec = new Vector()
// voltvecdt is the time step for the voltage vector, output to metaparams.dat
voltvecdt=0.1

sprint(xstr,"voltVec.record(&%s,%g)",somaname,voltvecdt)
execute(xstr)

//initialise the vtraces file
objref vt_file
vt_file = new File()
vt_file.wopen("output/vtraces.dat")
vt_file.close()

//initialise the IV file
objref iv_file
iv_file = new File()
iv_file.wopen("data/IV.dat")
iv_file.close()

//initialise the IF file
objref if_file
if_file = new File()
if_file.wopen("data/IF.dat")
if_file.close()

// initialise the parameter combination file
objref pc_file
pc_file = new File()

objref invec

proc outputVtrace(){local i, k

	// open up the vtraces file
	vt_file.aopen("output/vtraces.dat")

	invec = new Vector()
	for ( i = 1 ; i < ( NP + 1 ) ; i += 1 ) {
		invec.append($i)
	}
	sprint( xstr , "set_n_params(" )
	for ( k = 0 ; k < NP ; k += 1 ) {
		if ( k == 0 ) {
			sprint( xstr, "%sinvec.x[%d]", xstr, k )
		} else {
			sprint( xstr, "%s,invec.x[%d]", xstr, k )
		}
	}
	sprint( xstr, "%s)", xstr )
	execute( xstr  )

	//adjust conductances
	set_conds()
	//adjust kinetics
	set_kins()

	//save params to vt_file
	for j=0,parameters.count()-1 {
		vt_file.vwrite(&MRF.p.pf.parmlist.object(j).val)
	}

	//for each generator
	for j=0,gener.count()-1 {
		//save generator name to vt_file
		//use binary:
		//vt_file.vwrite(&gener.object(j).s)
		//run a generator
		error = MRF.p.pf.generatorlist.object(j).gen.efun()
		//save the voltage recording vector to vt_file
		//use binary:
		voltVec.vwrite(vt_file)
		printf("Generator %d: error = %f\n",j,error)
	}

	//close up the vt file
	vt_file.close()
}

//initialise the ivcurve file
objref iv_file
iv_file = new File()
iv_file.wopen("output/ivcurve.dat")
iv_file.close()

objref invec

proc outputIVcurve(){local i, k

	// open up the ivcurve file
	iv_file.aopen("output/ivcurve.dat")
	
	invec = new Vector()

	// check whether there are any input arguments
	// if there are, then set them as parameters
	if (numarg()) {
		for ( i = 1 ; i < ( NP + 1 ) ; i += 1 ) {
			invec.append($i)
		}
		sprint( xstr , "set_n_params(" )
		for ( k = 0 ; k < NP ; k += 1 ) {
			if ( k == 0 ) {
				sprint( xstr, "%sinvec.x[%d]", xstr, k )
			} else {
				sprint( xstr, "%s,invec.x[%d]", xstr, k )
			}
		}
		sprint( xstr, "%s)", xstr )
		execute( xstr  )
	}
	
	//adjust conductances
	set_conds()
	//adjust kinetics
	set_kins()

	//save params to iv_file
	for j=0,parameters.count()-1 {
		iv_file.printf("%f\t", MRF.p.pf.parmlist.object(j).val)
	}
	iv_file.printf("\n")

	//for each generator
	for j=0,gener.count()-1 {
		//run the generator
		error = MRF.p.pf.generatorlist.object(j).gen.efun()
		//save the average voltage between 185 and 195 ms.
		iv_file.printf("%f\t%f\n", pyr3_.inj1_.amp, voltVec.mean(740,780))
	}
	//close up the iv file
	iv_file.close()
}

//initialise the spike times file
objref sptimes_file
sptimes_file = new File()
sptimes_file.wopen("output/spTimes.dat")
sptimes_file.close()

objref apc	//object to count action potentials
objref v1	//vector to hold action potential data

// initialise these objects
apc = new APCount(0.5)
v1 = new Vector()

proc outputSpTimes(){local i, k
	
	// open up the spike times file
	sptimes_file.aopen("output/spTimes.dat")
	
	invec = new Vector()
	for ( i = 1 ; i < ( NP + 1 ) ; i += 1 ) {
		invec.append($i)
	}
	sprint( xstr , "set_n_params(" )
	for ( k = 0 ; k < NP ; k += 1 ) {
		if ( k == 0 ) {
			sprint( xstr, "%sinvec.x[%d]", xstr, k )
		} else {
			sprint( xstr, "%s,invec.x[%d]", xstr, k )
		}
	}
	sprint( xstr, "%s)", xstr )
	execute( xstr  )

	//adjust conductances
	set_conds()
	//adjust kinetics
	set_kins()

	//save params to sptimes_file
	for j=0,parameters.count()-1 {
		sptimes_file.printf("%16.16f \t",MRF.p.pf.parmlist.object(j).val)
	}
	sptimes_file.printf("\n")

	apc.record(v1)	//record spike times into v when the simulation runs

	//for each generator
	for j=1,gener.count()-1 {
		//save generator name to sptimes_file
		sptimes_file.printf("%s\n",gener.object(j).s)
		//run a generator
		error = MRF.p.pf.generatorlist.object(j).gen.efun()
		//record number of spikes in file:
		sptimes_file.printf("%d\n",apc.n)
		//save the voltage recording vector to vt_file
		v1.printf(sptimes_file)
		//append the error value for this generator
		//append the FCNTYP and fit 
		//(intercept and slope) if the FCNTYP is lin (for mod, then exp)
		//(intcpt, slope, and chi) if the FCNTYP is exp (for mod, then exp)
		//just error if the FR type!=3
		if (FRtype==3) {
			if (MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).FCNTYP==0) {
				sptimes_file.printf("%f\t%d\t%f\t%f\t%f\t%f\n\n",error, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).FCNTYP, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).mod_slope, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).mod_intcpt, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).exp_slope, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).exp_intcpt)
			} else if (MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).FCNTYP==1) {
				sptimes_file.printf("%f\t%d\t%f\t%f\t%f\t%f\t%f\t%f\n\n",error, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).FCNTYP, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).mod_slope, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).mod_intcpt, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).modchi, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).exp_slope, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).exp_intcpt, \
				MRF.p.pf.generatorlist.object(j).gen.fitnesslist.object(0).expchi)
			}
		} else {
			sptimes_file.printf("\n%f\n",error)
		}
	}
	
	//close up the sptimes_file
	sptimes_file.close()
}