Effects of KIR current inactivation in NAc Medium Spiny Neurons (Steephen and Manchanda 2009)

 Download zip file 
Help downloading and running models
Accession:121060
"Inward rectifying potassium (KIR) currents in medium spiny (MS) neurons of nucleus accumbens inactivate significantly in ~40% of the neurons but not in the rest, which may lead to differences in input processing by these two groups. Using a 189-compartment computational model of the MS neuron, we investigate the influence of this property using injected current as well as spatiotemporally distributed synaptic inputs. Our study demonstrates that KIR current inactivation facilitates depolarization, firing frequency and firing onset in these neurons. ..."
Reference:
1 . Steephen JE, Manchanda R (2009) Differences in biophysical properties of nucleus accumbens medium spiny neurons emerging from inactivation of inward rectifying potassium currents. J Comput Neurosci 27:453-70 [PubMed]
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: Basal ganglia;
Cell Type(s): Nucleus accumbens spiny projection neuron;
Channel(s): I Na,p; I L high threshold; I T low threshold; I p,q; I A; I h; I K,Ca; I CAN; I A, slow; I Krp; I R;
Gap Junctions:
Receptor(s): AMPA; NMDA; Gaba;
Gene(s): Cav1.3 CACNA1D; Cav1.2 CACNA1C; IRK;
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Action Potential Initiation; Ion Channel Kinetics; Action Potentials; Synaptic Integration; Delay;
Implementer(s): Steephen, John Eric [johneric at duk.ac.in];
Search NeuronDB for information about:  AMPA; NMDA; Gaba; I Na,p; I L high threshold; I T low threshold; I p,q; I A; I h; I K,Ca; I CAN; I A, slow; I Krp; I R;
/* Execute main.hoc to run the program. The program implements the model described in Steephen & Manchanda, 2009.
 * 
 * Steephen, J. E., & Manchanda, R. (2009). Differences in biophysical properties of nucleus accumbens medium spiny neurons emerging from inactivation of inward rectifying potassium currents. J Comput Neurosci, 
 * doi:10.1007/s10827-009-0161-7
 */
 
strdef szTxt 
proc Batch_Run() {local idx, n localobj mSpkTmng
	printf ("\nRUN\n")
	mSpkTmng = new Matrix(iterations, StateNo*3)
	vgraph.size(0, tstop, -80, 40)
	szTxt = "Spike Timings\n"

	for idx = 1, iterations {
		 if(bSynput && idx>1) seed+=1
		if(!Run()) break
		printf("\nDur = %d, Spike timings: ", stim.dur)
		vecAPC.printf("%.0f")
		for n = 0, vecAPC.size()-1 {sprint(szTxt, "%s%.0f ms\n", szTxt, vecAPC.x[n])}		
		mSpkTmng.setrow(idx-1, vecAPC)		
	}
}

objref gStimAmp
proc Ramp(){local Dt, RampSteps, ExtraDur, idx localobj vecTime, mRamp, vecRamp, vecRev
	vecRamp = new Vector()
	szTxt = "Spike Timings\n"
	if(bSynput) {
		Dt = 10
		mRamp = new Matrix(iterations, tstop/Dt)	
		for idx = 1, iterations {
			vecRamp.record(&v(0.5), Dt)
			vgraph.size(0, tstop, -80, 40)
			if(idx>1) seed+=1
			if(!Run()) break
			for n = 0, vecAPC.size()-1 {sprint(szTxt, "%s%.0f ms\n", szTxt, vecAPC.x[n])}		
			mRamp.setrow(idx-1, vecRamp)			
		}	
		return
	}
		
	vecTime = new Vector()
	vecRev = new Vector()

	RampSteps = 100
	printf("\nstim.amp=%f",stim.amp)
	vecRamp.indgen(0, stim.amp, stim.amp/RampSteps)
	vecRev.copy(vecRamp)
	vecRev.reverse()
	vecRamp.append(vecRev)
	vecTime.indgen(stim.del, stim.del+50, 50/RampSteps)
	vecRev.indgen(stim.del+stim.dur-50, stim.del+stim.dur, 50/RampSteps)
	vecTime.append(vecRev)
	stim.amp = 0
	vecRamp.play(&stim.amp, vecTime)
	
	if(gStimAmp == null) {
		gStimAmp = new Graph()
		graphList[0].append(gStimAmp)
		gStimAmp.addexpr("stim.amp", 3, 1, 0.7, 0.9, 2)
		gStimAmp.size(0, tstop, 0, 0.3)
	}
	
	vgraph.size(0, tstop, -80, 40)
	Run()
}

proc MaxCurVsFreq() {local i, dcmlpts, newmax localobj freqvec
	vgraph.size(0, tstop, -80, 40)
	for i=1,2 vgraph.exec_menu("Keep Lines")
	newmax = max
	dcmlpts = 3
	freqvec = new Vector(SpikeNo+1, min)
	
	while (SpikeNo>-1){
		while ((newmax-freqvec.x[SpikeNo])>(10^(-dcmlpts))){
			stim.amp = Rnd((freqvec.x[SpikeNo]+newmax)/2, 1, dcmlpts)
			if(!Run()) break
			if(apc.n>SpikeNo) {newmax = stim.amp}else {freqvec.fill(stim.amp, apc.n, SpikeNo)}
		}
		
		if(stoprun) break
		printf("\nEarliest Spike Onset occurs when current is %.3f nA\n", freqvec.x[SpikeNo])
		if($1==1) {if(stim.amp!=stim.amp=freqvec.x[SpikeNo]) Run() break}
		SpikeNo-=1
	}	

	if($1==2)freqvec.printf()
}

proc MingmaxVsFreq() {local dcmlpts, newmin localobj freqvec, pgmax
	vgraph.size(0, tstop, -80, 40)
	newmin = min
	dcmlpts = 6
	freqvec = new Vector(SpikeNo+1, max)
	if(!eKir) {pgmax = new Pointer("gmax_KIR")}else{pgmax = new Pointer("gmax_inKIR")}
		
	while (SpikeNo>-1){
		while ((freqvec.x[SpikeNo]-newmin)>(10^(-dcmlpts))){
			pgmax.val = Rnd((freqvec.x[SpikeNo]+newmin)/2, 1, dcmlpts)
			if(!Run()) break
			if(apc.n>SpikeNo) {newmin = pgmax.val}else {freqvec.fill(pgmax.val, apc.n, SpikeNo)}
			printf("\ngmax_KIR=%g, Spike No = %d, max =%g, min = %g\n", pgmax.val, apc.n, freqvec.x[SpikeNo], newmin)	
			freqvec.printf()
		}
		
		if(stoprun) break
		printf("\nMinimum KIR gmax required for generating %d spike(s) is %.6f uS\n", SpikeNo, freqvec.x[SpikeNo])
		if($1==7) break
		SpikeNo-=1
	}	

	if($1==8) freqvec.printf()
}

proc StrengthDur() {local input, interval
	strdef szStrength
	szStrength = "Hz"
	if(iterations<1) return
	if(iterations==1) {interval = max-min+1
	}else {interval = (max-min)/(iterations-1)}
	tstop = 0
	if(!bSynput) {stim.dur = 2000-stim.del szStrength="nA"}
	//~ interval = (max-min)/iterations
	vgraph.size(0, 2000, -80, 40)
	
	for (input=min; input<=max; input+=interval){
		if(bSynput){Upf = input}else {stim.amp = input}
		if(!Run()) break
	
		 for i = 1, 2000/100 {			
			continuerun(t + 100)
			total_time+=realtime/60
			if(stoprun) break
				
			if(apc.n>0){
				printf("Strength=%g %s, Duration=%.0f ms\n", input, szStrength, vecAPC.x[0]-stim.del)
				break
			}
		}
		if(stoprun) break
	 }
	
	if(bSynput) {Upf = 7.5}
}

proc FreqVsV() {local interval, i localobj vTime, vRec, mValues
	if(iterations<1) return
	if(iterations==1) {interval = max-min+1
	}else {interval = (max-min)/(iterations-1)}
	vRec = new Vector()
	vTime =new Vector()
	mValues = new Matrix (iterations, 2)
	vTime.indgen(TSO-450, TSO, 1)
	vRec.record(&v(0.5), vTime)
	vgraph.size(0, TSO, -90, -50)
	vgraph.exec_menu("Erase")
	vgraph.exec_menu("Keep Lines")
	Upf = min

	for i=0, iterations-1 {
		if (i>0) seed+=1
		if(!Run()) break
		if(apc.n>0) break
		total_time+=realtime/60
		mValues.x[i][0] = Upf
		mValues.x[i][1] = vRec.mean()
		Upf+=interval		
		vRec.printf()		
	}
	mValues.resize(i,2)
	mValues.printf()
	Upf = 7.5
	vgraph.exec_menu("Keep Lines")
	
	if(gFV==null) {gFV = new Graph()}
	mValues.getcol(1).line(gFV, mValues.getcol(0), 3*!eKir+2*eKir, 1)
	mValues.getcol(1).line(gFV, mValues.getcol(0), 3, 1)
	gFV.exec_menu("View = plot")
	gFV.exec_menu("Keep Lines")
}

Loading data, please wait...