trouble with saveTableCopy
ychen344
Dear Igor guru,
I am having trouble outputting the table content. The macro "AUC curve fitting FFTs-individual" appears to create the correct waves to calculate the correct AUC by FaverageXY (checked manually). However, in the output .cvs table, all the outputs are "0". It feels like the SaveTableCopy command won't run until the "for" loop completes when columns in the output table are deleted (therefore, the numbers turn "0"). Is this the case?
Thanks,
Judy
//===============================================================================================
function DeleteWaves(strToDelete) //delete logFvector and noNegativeSigFit waves
string strToDelete
string wList = Wavelist(strToDelete, ";", "")
variable nWaves = itemsinList(wList)
string wName
variable i
for (i=0; i<nWaves; i+=1)
wName = stringfromList(i, wList)
killWaves/Z $wName
endfor
end
//===============================================================================================
//===============================================================================================
menu "Macros"
"AUC curve fitting FFTs_individual", createAUCCurveFittingIndividualFFTsDialog()
End
Function createAUCCurveFittingIndividualFFTsDialog()
setDataFolder root:BOSS3_450sub:
DFREF dfr = GetDataFolderDFR()
string folderName, trialName, path
variable numDataFolders = CountObjectsDFR(dfr, 4)
variable i, c, trialNumber
for(i=0; i < numDataFolders; i += 1)
folderName = getIndexedObjNameDFR(dfr, 4, i)
SetDataFolder ":'" + folderName + "':"
//DFREF dfr = GetDataFolderDFR()
edit/N=outputTable_AUCfittedFFT
appendtoTable/W=outputTable_AUCfittedFFT root:AUCsegmentation
make/O/T/FREE stimList = {"PDmm", "BPD", "R1", "R2", "postR", "B1", "B2", "postB"}
make/O/N=16 PDmm
make/O/N=16 BPD
make/O/N=16 R1
make/O/N=16 R2
make/O/N=16 postR
make/O/N=16 B1
make/O/N=16 B2
make/O/N=16 postB
appendtotable/W=outputTable_AUCfittedFFT PDmm, BPD, R1, R2, postR, B1, B2, postB
for (trialNumber=1; trialNumber<=2; trialNumber +=1)
trialName="trial"+num2str(trialNumber)
path= "root:BOSS3_450sub:'"+folderName+"':'"+trialName+"'"
SetDataFolder path
duplicate $"PDmm_gap_avgEye_interpolate_avgRepeat_FFT", $"PDmm_gap_avg_PDmm_FFT"
for (c=0; c<8; c += 1) //add 8 AUC_sigFit_FFTs to tables
//obtain logFvector
string FvectorName = "Fvector_"+stimList[c]
string logFvectorName = "log"+FvectorName
duplicate/O root:Fvector:$FvectorName, $logFvectorName
wave logFvector = $logFvectorName
logFvector = log(logFvector) //obtain logFvector
string FFTName = "PDmm_gap_avg_"+stimList[c]+"_FFT"
string logFFTName = "log"+FFTName
duplicate/O $FFTName, $logFFTName
wave logFFT = $logFFTName
logFFT = log(logFFT) //obtain logFFT
//fit FFT with sigmoid function
string sigFitName = "sigFit_"+FFTName
string noNegative_sigFitName = "noNegative_"+sigFitName
wavestats/Q logFvector
make/O/N=(V_npnts) $sigFitName
wave sigFit = $sigFitName
curveFit Sigmoid logFFT/X=logFvector /D=sigFit
duplicate/O sigFit, $noNegative_sigFitName
wave sigFitnoNegative = $noNegative_sigFitName
sigFitnoNegative = sigFit[p] < 0 ? 0 : sigFit[p] //set the negative portion of sigFit to 0 for AUC calculation
//obtain AUC and post to outputTable
wave pupCategory = $stimList[c]
pupCategory[(trialNumber-1)*8] = FaverageXY(logFvector, sigFitnoNegative, -4, -2)
pupCategory[(trialNumber-1)*8+1] = FaverageXY(logFvector, sigFitnoNegative, -2, -1.5)
pupCategory[(trialNumber-1)*8+2] = FaverageXY(logFvector, sigFitnoNegative, -1.5, -1)
pupCategory[(trialNumber-1)*8+3] = FaverageXY(logFvector, sigFitnoNegative, -1, -0.5)
pupCategory[(trialNumber-1)*8+4] = FaverageXY(logFvector, sigFitnoNegative, -0.5, 0)
pupCategory[(trialNumber-1)*8+5] = FaverageXY(logFvector, sigFitnoNegative, 0, 0.5)
pupCategory[(trialNumber-1)*8+6] = FaverageXY(logFvector, sigFitnoNegative, 0.5, 1)
pupCategory[(trialNumber-1)*8+7] = FaverageXY(logFvector, sigFitnoNegative, 1, 1.5)
endfor
endfor
//export outputTable
SaveTableCopy/P=home/T=2/W=outputTable_AUCfittedFFT as "AUCSigFit"+"_"+folderName+".csv"
killwindow/Z outputTable_AUCfittedFFT
SetDataFolder root:BOSS3_450sub:
SetDataFolder ":'" + folderName + "':"
DeleteWaves("PDmm*")
DeleteWaves("BPD*")
DeleteWaves("R1*")
DeleteWaves("R2*")
DeleteWaves("postR*")
DeleteWaves("B1*")
DeleteWaves("B2*")
DeleteWaves("postB*")
for(trialNumber=1; trialNumber<=2; trialNumber +=1)
trialName="trial"+num2str(trialNumber)
path= "root:BOSS3_450sub:'"+folderName+"':'"+trialName+"'"
SetDataFolder path
DeleteWaves("logFvector*")
DeleteWaves("noNegative*")
endfor
setDataFolder root:BOSS3_450sub:
DFREF dfr = GetDataFolderDFR()
endfor
end
//===============================================================================================//
function DeleteWaves(strToDelete) //delete logFvector and noNegativeSigFit waves
string strToDelete
string wList = Wavelist(strToDelete, ";", "")
variable nWaves = itemsinList(wList)
string wName
variable i
for (i=0; i<nWaves; i+=1)
wName = stringfromList(i, wList)
killWaves/Z $wName
endfor
end
//===============================================================================================
//===============================================================================================
menu "Macros"
"AUC curve fitting FFTs_individual", createAUCCurveFittingIndividualFFTsDialog()
End
Function createAUCCurveFittingIndividualFFTsDialog()
setDataFolder root:BOSS3_450sub:
DFREF dfr = GetDataFolderDFR()
string folderName, trialName, path
variable numDataFolders = CountObjectsDFR(dfr, 4)
variable i, c, trialNumber
for(i=0; i < numDataFolders; i += 1)
folderName = getIndexedObjNameDFR(dfr, 4, i)
SetDataFolder ":'" + folderName + "':"
//DFREF dfr = GetDataFolderDFR()
edit/N=outputTable_AUCfittedFFT
appendtoTable/W=outputTable_AUCfittedFFT root:AUCsegmentation
make/O/T/FREE stimList = {"PDmm", "BPD", "R1", "R2", "postR", "B1", "B2", "postB"}
make/O/N=16 PDmm
make/O/N=16 BPD
make/O/N=16 R1
make/O/N=16 R2
make/O/N=16 postR
make/O/N=16 B1
make/O/N=16 B2
make/O/N=16 postB
appendtotable/W=outputTable_AUCfittedFFT PDmm, BPD, R1, R2, postR, B1, B2, postB
for (trialNumber=1; trialNumber<=2; trialNumber +=1)
trialName="trial"+num2str(trialNumber)
path= "root:BOSS3_450sub:'"+folderName+"':'"+trialName+"'"
SetDataFolder path
duplicate $"PDmm_gap_avgEye_interpolate_avgRepeat_FFT", $"PDmm_gap_avg_PDmm_FFT"
for (c=0; c<8; c += 1) //add 8 AUC_sigFit_FFTs to tables
//obtain logFvector
string FvectorName = "Fvector_"+stimList[c]
string logFvectorName = "log"+FvectorName
duplicate/O root:Fvector:$FvectorName, $logFvectorName
wave logFvector = $logFvectorName
logFvector = log(logFvector) //obtain logFvector
string FFTName = "PDmm_gap_avg_"+stimList[c]+"_FFT"
string logFFTName = "log"+FFTName
duplicate/O $FFTName, $logFFTName
wave logFFT = $logFFTName
logFFT = log(logFFT) //obtain logFFT
//fit FFT with sigmoid function
string sigFitName = "sigFit_"+FFTName
string noNegative_sigFitName = "noNegative_"+sigFitName
wavestats/Q logFvector
make/O/N=(V_npnts) $sigFitName
wave sigFit = $sigFitName
curveFit Sigmoid logFFT/X=logFvector /D=sigFit
duplicate/O sigFit, $noNegative_sigFitName
wave sigFitnoNegative = $noNegative_sigFitName
sigFitnoNegative = sigFit[p] < 0 ? 0 : sigFit[p] //set the negative portion of sigFit to 0 for AUC calculation
//obtain AUC and post to outputTable
wave pupCategory = $stimList[c]
pupCategory[(trialNumber-1)*8] = FaverageXY(logFvector, sigFitnoNegative, -4, -2)
pupCategory[(trialNumber-1)*8+1] = FaverageXY(logFvector, sigFitnoNegative, -2, -1.5)
pupCategory[(trialNumber-1)*8+2] = FaverageXY(logFvector, sigFitnoNegative, -1.5, -1)
pupCategory[(trialNumber-1)*8+3] = FaverageXY(logFvector, sigFitnoNegative, -1, -0.5)
pupCategory[(trialNumber-1)*8+4] = FaverageXY(logFvector, sigFitnoNegative, -0.5, 0)
pupCategory[(trialNumber-1)*8+5] = FaverageXY(logFvector, sigFitnoNegative, 0, 0.5)
pupCategory[(trialNumber-1)*8+6] = FaverageXY(logFvector, sigFitnoNegative, 0.5, 1)
pupCategory[(trialNumber-1)*8+7] = FaverageXY(logFvector, sigFitnoNegative, 1, 1.5)
endfor
endfor
//export outputTable
SaveTableCopy/P=home/T=2/W=outputTable_AUCfittedFFT as "AUCSigFit"+"_"+folderName+".csv"
killwindow/Z outputTable_AUCfittedFFT
SetDataFolder root:BOSS3_450sub:
SetDataFolder ":'" + folderName + "':"
DeleteWaves("PDmm*")
DeleteWaves("BPD*")
DeleteWaves("R1*")
DeleteWaves("R2*")
DeleteWaves("postR*")
DeleteWaves("B1*")
DeleteWaves("B2*")
DeleteWaves("postB*")
for(trialNumber=1; trialNumber<=2; trialNumber +=1)
trialName="trial"+num2str(trialNumber)
path= "root:BOSS3_450sub:'"+folderName+"':'"+trialName+"'"
SetDataFolder path
DeleteWaves("logFvector*")
DeleteWaves("noNegative*")
endfor
setDataFolder root:BOSS3_450sub:
DFREF dfr = GetDataFolderDFR()
endfor
end
//===============================================================================================//
As you build windows like graphs or tables, the changes don't get finalized until the window is drawn. For command-line changes, the redraw happens automatically when the command finishes executing. But updating and redrawing windows doesn't happen while a user function is executing unless you request it by calling `DoUpdate`. I think adding a call to `DoUpdate` just before you call `SaveTableCopy` will fix your problem.
December 12, 2024 at 10:32 am - Permalink
I think John is right - DoUpdate will make your function work as expected.
Alternatively, you can create the .csv file without the use of a table using the Save operation as illustrated here:
SetDataFolder root:
Make/O/N=5 AUCsegmentation
NewDataFolder/O/S root:TestDataFolder
Make/O/N=5 PDmm, BPD, R1, R2, postR, B1, B2, postB
String list = "root:AUCsegmentation;"
list += "PDmm;BPD;R1;R2;postR;B1;B2;postB;"
String fileName = "AUCSigFit" + "_" + "Test" + ".csv"
Save /J /B /DLIM="," /P=home list as fileName
SetDataFolder ::
End
December 12, 2024 at 03:28 pm - Permalink
I added DoUpdate before the saveTableCopy command and still have "0" in the output table. Any idea?
SaveTableCopy/P=home/T=2/W=outputTable_AUCfittedFFT as "AUCSigFit"+"_"+folderName+".csv"
December 13, 2024 at 07:45 am - Permalink
Can you post an Igor experiment file with data and instructions on how to run it?
You might also try to debug the code yourself using Igor's symbolic debugger. The debugger allows you to single-step through the code watching how things change as the code runs. Read about it: DisplayHelpTopic "The Debugger"
December 13, 2024 at 09:52 am - Permalink
Replace the DoUpdate with Abort and check the table which this will generate. Verify that you indeed have numbers in the table before you try to save it. Then we will know where the problem is.
December 13, 2024 at 09:54 am - Permalink