/* 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")
}