Using DoPrompt in a button function
I have been away for a while. With great support of Igor team and you guys I managed to write my own data analysis tool and it works perfectly. However I need to improve some parts and increase the functionality of the code that I wrote. Here is what I need in the very beginning:
I would like to analyse (selectively) a multi-dimensional wave. To do this I wrote a main function which defines the target wave and performs a simple mathematical calculation on it. Another simple function moves the data to another data folder and does a quick statistical calculation on the data. A third function is then responsible for displaying the final result on a panel so the user can select desired result by pressing on previously defined buttons.
What I would like to do is including a small Promt window that appears when the button is called. By doing so user can enter a time interval (i.e., 01.01.2015 12:00:00 - 01.01.2015 13:00:00) which I am planning to save as variables (time can be converted to numbers according to a reference point, right?). After having the start & end point for the analysis, I can look up in the entire wave and extract the interval that I want to analyse.
The problem is where should I put the DoPrompt function? Here are the functions I mentioned above.
//This is the button function. When user clicks the button following functions are called and finally a panel windows appears where the user can display results.
Function ButtonProc_21(ctrlName) : ButtonControl
String ctrlName
buildSizeResolvedRatio()
plotRatioData()
End
// Calculate size resolved ratio waves
// This is so called Nf/Nt data (size resolved)
// So we know the contribution of fluorescent particle number to the total for each size bin
Function buildSizeResolvedRatio()
SetDataFolder root:INCD
// Wave SizeResolvedBioWave // this wave contains only the raw counts, not concentration
Wave finalBioWave3D
Variable numofRows, numofColumns, numofLayers
numofRows = dimSize(finalBioWave3D,0)
numofColumns = dimSize(finalBioWave3D,1)
numofLayers = dimSize(finalBioWave3D,2)
Make/O/N=(numofRows, numofColumns, numofLayers) sizeResolvedRatioWave
Variable i
for(i=0; i<=NumBioType; i +=1)
//sizeResolvedRatioWave[][][i] = SizeResolvedBioWave[p][q][i] / SizeResolvedBioWave[p][q][3] // changed 24/07/2013
sizeResolvedRatioWave[][][i] = finalBioWave3D[p][q][i] / finalBioWave3D[p][q][3]
endfor
// There are lots of missing data points and when we remove all missing points (NaN) it's likeyl that both median and mean
// never reach zero...
sizeResolvedRatioWave = sizeResolvedRatioWave[p][q][r] == NaN ? 0 : sizeResolvedRatioWave[p][q][r]
// Call findSResolvedAverages to calculate mean&median
findSResolvedAverages(sizeResolvedRatioWave)
End
// Calculate mean and median values for each bio_Type and also averaged for entire time
Function findSResolvedAverages(inputWave)
Wave inputWave
//dNdlogDo = dNdlogDo[p][q][r] == 0 ? NAN : dNdlogDo[p][q][r] // Set all NANs to zeros.
String prefix = "temp"
SetDataFolder root:INCD
Duplicate /O inputWave, temp3DWave
NewDataFolder root:tempData
SetDataFolder root:tempData
MoveWave root:INCD:temp3DWave, root:tempData:
Variable numRows = dimSize(temp3DWave,0)
Variable numColumns = dimSize(temp3DWave,1)
Variable numLayers = dimSize(temp3DWave, 2)
Variable i, ii
Variable numStatParam = 6
// Make the output wave
Make/O/N=(numColumns,numLayers,numStatParam) workedAvgWave // distribution wave for mean(layer0) and median(layer1)
SetDimLabel 2, 0, TheMedian, workedAvgWave
SetDimLabel 2, 1, TheMean, workedAvgWave
SetDimLabel 2, 2, Q10, workedAvgWave
SetDimLabel 2, 3, Q90, workedAvgWave
SetDimLabel 2, 4, Q25, workedAvgWave
SetDimLabel 2, 5, Q75, workedAvgWave
Variable numberpoints
for(ii=0; ii<numLayers; ii +=1)
for(i=0; i<numColumns; i += 1)
String colName = "temp_" + num2str(i)
MAKE/O/N=(numRows) $(colName)/Wave=ww
ww = temp3DWave[p][i][ii]
Sort ww, ww
// We need to remove NANs becuase mean doesn't support NaNs.
//WaveTransform zapNaNs, ww
ww = ww[p] == NaN ? 0 : ww[p]
// Calculate inter quartile ranges and mean/median values
WaveStats/Q/Z ww
numberpoints = V_npnts
workedAvgWave[i][ii][%TheMedian] = ww[((numberpoints+1)/2)-1]
workedAvgWave[i][ii][%TheMean] = V_avg
workedAvgWave[i][ii][%Q10] = ww[(2*(numberpoints/20))-1]
workedAvgWave[i][ii][%Q90] = ww[(18*(numberpoints/20))-1]
workedAvgWave[i][ii][%Q25] = ww[(numberpoints/4)-1]
workedAvgWave[i][ii][%Q75] = ww[3*(numberpoints/4)-1]
endfor
endfor
if(DataFolderExists("root:SizeResolved:")==0)
NewDataFolder root:SizeResolved
MoveWave root:tempData:workedAvgWave, root:SizeResolved:
KillDataFolder/Z root:tempData
SetDataFolder root:SizeResolved:
else
KillDataFolder/Z root:SizeResolved
NewDataFolder root:SizeResolved
SetDataFolder root:SizeResolved
MoveWave root:tempData:workedAvgWave, root:SizeResolved:
KillDataFolder/Z root:tempData
endif
End Thanks everyone for any contribution, idea, etc.
Cheers,
Emre
March 3, 2015 at 05:21 am - Permalink
Cheers,
Emre
P.S. If someone is interested in what I did. Here is the function I use now.
March 3, 2015 at 07:22 am - Permalink