print "loading correction algorithm routines ....."
// ++++ ROUTINES FOR CORRECTION ALGORITHM ++++
// Global Display Variables
DisplayT=0
DisplayV=0
DisplayG=0
objref g1,g2, g3 , g4, g5
strdef NullStr
IterCount=0
fa=0
fb=0
fc=0
ax=0
bx=0
cx=0
offset=1
measTime=0
FitTPoint=0
ImageCount=1
DummCount=1
// ("global" variables for correction routines in this and following files)
proc Correct() {local g, VCount,VStepCountB, VStepCount, FitTStepCount, TStepCount
for VStepCountB=0,gDKVRange-1 {
for TStepCount=0,gbarTRes*MaxMeasTime-1 gbar[VStepCountB][TStepCount]=0
} // initializing gbar-array
ReadIC_and_leak(ExperimentName,LeakFileName)
g3.label(0.5,0.9,"Corrected Conductances",2, 1, 0.5, 0.5, 1)
for FitTStepCount=0,NumFitTPoints { // only fitting at previously defined timepoints out of MeasTimes-Array
FitTPoint =FitTPoints[FitTStepCount]
measTime=MeasTimes[FitTPoint] // converted into real meas time
measTime_gDKkin3 = measTime
for (VStepCount=FirstVStep;VStepCount*VStepDirection<=LastVStep;VStepCount+=VStepDirection*1) {
VProtocol.x[VProtocolNumSteps-1]=vclmp[VStepCount]
g3.beginline()
if (PrintVerbose==1) print "V : ",vclmp[VStepCount]," i total : ",iclmp[VStepCount][FitTPoint]+leak[VStepCount][FitTPoint], " i-leak: ",iclmp[VStepCount][FitTPoint], " t : ", measTime
DisplayV=vclmp[VStepCount]
DisplayT=measTime
for VCount=0,gDKVRange-1 gv_gDKkin3[VCount]=gbar[VCount][gbarTRes*measTime] // initialize gv in gDK.mod at current time
offset=1
if (UseOffset) for VOffsetCount=0,NumVOffsets-1 { // the area of voltage attenuation used
if (vclmp[VStepCount]>VOffset[VOffsetCount*2]) offset = VOffset[VOffsetCount*2+1]
}
ax=50*abs(iclmp[VStepCount][FitTPoint]/(vclmp[VStepCount]-revPot)) // first guess(Ohm)
bx=ax*1.5
IterCount=3
cx=bracket(VStepCount)
if (PrintVerbose==1) print "Bracketed minimum in ", IterCount, " Function evaluations"
IterCount=0
if(PrintVerbose==1) printf ("Minimizing")
//g5.erase()
g5.flush()
g=golden(VStepCount)
DisplayG=UpdateGbarArrays(VStepCount,g)
g3.color(3)
g3.mark(measTime, abs(DisplayG),"O",4)
g3.flush()
g5.erase()
doNotify()
if (PrintVerbose==1) printf ("\nConverged to a conductance of %7.4f pS/micron^2 in %4.0f iterations\n",abs(g), IterCount)
} // running over voltage
sprint(GFileName,"Output/%s.g",ExperimentName) // for saving data if runtime error occurs
Write(GFileName)
g3.exec_menu("View = plot")
} // running over time
sprint(GFileName,"Output/%s.g",ExperimentName)
Write(GFileName)
}
func LSQ_Calc() { local VStepCount,G, delta, cI
VStepCount=$1
G=abs($2) // best guess so far
UpdateGbarArrays(VStepCount,G)
cI = ClampCurr()
delta = ((cI-leak[VStepCount][FitTPoint])-iclmp[VStepCount][FitTPoint])^2
if (DebugOn==4) if (VStepCount>4) forall print "G: ",G,"gk:",gk_gDKkin3,"tau_gdk:",tau_gDKkin3[v+VoltageOffset_gDKkin3],"cI: ",cI," cI-leak:",cI-leak[VStepCount][FitTPoint],"ref-iclmp: ",iclmp[VStepCount][FitTPoint]
doEvents()
return delta
}
func UpdateGbarArrays() { local VStepCount,G,VCount,interpolStepCount,trueVoltage, trueVPointer,vStep
// updates gbar[] and gv[]-Arrays from current VStep ($1) on due to new estimated G($2)
VStepCount=$1
G=abs($2)
trueVoltage=vclmp[VStepCount-offset] // interpolate over a range of voltages due to voltage-attenuation
TrueVPointer=trueVoltage+gDKVPointerConverter // pointer-conversion for gbar[] and gv[]
vStep=VStep // set in ParameterFile
// INTERPOLATION of Gs:
for VCount=TrueVPointer+1,gDKVRange-1 {
interpolStepCount=VCount-TrueVPointer
gv_gDKkin3[VCount]= gv_gDKkin3[TrueVPointer]+(G-gv_gDKkin3[TrueVPointer])/vStep/offset*interpolStepCount
if (gv_gDKkin3[VCount]<0) gv_gDKkin3[VCount]=0
gbar[VCount][gbarTRes*measTime]=gv_gDKkin3[VCount]
}
trueVoltage=vclmp[VStepCount]
TrueVPointer=trueVoltage+gDKVPointerConverter
for VCount=40, TrueVPointer {
g5.mark(VCount-gDKVPointerConverter,gv_gDKkin3[VCount],"o",2)
}
return gbar[TrueVPointer][gbarTRes*measTime]
}
xopen("Minimize.Algorithm.fit") // includes numerical routines