Merging Procedures/Functions?
vmmr5596
I have a set of individual procedures that I use for the analysis of my data. This worked fine for the initial stages of my project. It is however,getting pretty tedious to go through each individual procedure for the large data sets I have now so I'd like to automate this process even further. I would like to create a single function that uses these procedures to get me to the final product. I was looking into "Accessing Waves in Functions" and "Wave References" but I'm unsure how to implement it.
I'm showing two of the procedures that I use as part of the process. The first one "BLAll" creates a new set of waves that have undergone a baseline subtraction as specified by the procedure "Baseline Subtraction".
Function BaselineSubtraction(w1) //This function finds the minimum value over a specified range and subtracts it from the parent wave.
// The baseline corrected wave is then smoothed out.
WAVE w1 // w1 is the initial wave to be baselined
Variable leftmark=300 // leftmark is the leftmost "x" value of the range, rightmark is the rightmost "x" value of the range
Variable rightmark=629 //rangetype should be a point in the wave that is within the specified range
Variable rangetype=300
String outputName= NameOfWave(w1) +"_bl" //Renames the original wave
if (rangetype<300 || rangetype>629) //if the value of for rangetype is outside the specified range, return null result
return -1 //The range is setup b/n 300 and 629 because that is the corresponding ev/nm range that I care about in the
endif // new waves
Duplicate/o w1 $outputName //Duplicates original wave and renames it according to the outputName function
Wave output = $outputName
if (rangetype==0) //Determines the various wave statistics over the specified range
WaveStats/Q output
endif
if (rangetype==300)
WaveStats/Q/R=[leftmark,rightmark] output
endif
if (rangetype==629)
WaveStats/Q/R=(leftmark,rightmark) output
endif
output= output - V_min //Carry out baseline subtraction by utlizing V_min determined from previous loops
DeletePoints/M=0 0,6,output //Remove irrelevant/uninteresting points from polished data
DeletePoints/M=0 624,1000,output
//Smooth 10,output //Smoothes out the baseline corrected wave.
//print V_min //Prints the minimum value used to carry out the baseline subtraction
End
FUNCTION BLAll(wname, fnum) //When calling the wave for this function, do not include the profile number!
STRING wname
VARIABLE fnum
VARIABLE i
STRING w1
for(i=0; i<=fnum; i=i+1)
w1 = wname+num2str(i)
BaselineSubtraction($(w1))
endfor
End
// The baseline corrected wave is then smoothed out.
WAVE w1 // w1 is the initial wave to be baselined
Variable leftmark=300 // leftmark is the leftmost "x" value of the range, rightmark is the rightmost "x" value of the range
Variable rightmark=629 //rangetype should be a point in the wave that is within the specified range
Variable rangetype=300
String outputName= NameOfWave(w1) +"_bl" //Renames the original wave
if (rangetype<300 || rangetype>629) //if the value of for rangetype is outside the specified range, return null result
return -1 //The range is setup b/n 300 and 629 because that is the corresponding ev/nm range that I care about in the
endif // new waves
Duplicate/o w1 $outputName //Duplicates original wave and renames it according to the outputName function
Wave output = $outputName
if (rangetype==0) //Determines the various wave statistics over the specified range
WaveStats/Q output
endif
if (rangetype==300)
WaveStats/Q/R=[leftmark,rightmark] output
endif
if (rangetype==629)
WaveStats/Q/R=(leftmark,rightmark) output
endif
output= output - V_min //Carry out baseline subtraction by utlizing V_min determined from previous loops
DeletePoints/M=0 0,6,output //Remove irrelevant/uninteresting points from polished data
DeletePoints/M=0 624,1000,output
//Smooth 10,output //Smoothes out the baseline corrected wave.
//print V_min //Prints the minimum value used to carry out the baseline subtraction
End
FUNCTION BLAll(wname, fnum) //When calling the wave for this function, do not include the profile number!
STRING wname
VARIABLE fnum
VARIABLE i
STRING w1
for(i=0; i<=fnum; i=i+1)
w1 = wname+num2str(i)
BaselineSubtraction($(w1))
endfor
End
The second one "SpanoFitAll" fits a function I defined in another procedure to the waves I created using "BLAll".
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
Function SpanoFit(w1,xwave,cwave)
Wave w1,xwave,cwave
String outputName="Spano_" + NameOfWave(w1)
String cwaveName="Cs_" +NameOfWave(w1)
Variable/G V_FitTol=0.00001
Variable/G V_FitMxIters=100
Make/D/O/N=7 EpsilonSpano
EpsilonSpano[0]={0,10^-6,0,10^-6,10^-6,10^-6,10^-6}
Make/D/O/T/N=7 T_ConstraintsSpano
T_ConstraintsSpano[0]={"K1 > 0.01","K1 < 1","K3 > 1.85","K3 < 2.1","K4 > 0.02","K4 < 0.1","K6 > 0.001","K6 < 10"}
Duplicate /O w1 $(outputName)
Wave output=$(outputName)
FuncFit/N=1 /L=624 /H="1010010" Spano cwave w1[256,376] /X=xwave /D/E=EpsilonSpano/C=T_ConstraintsSpano/F={0.95,7}/R //[600,775] for S-Flame [1000,1225] for T-Flame
output= Spano(cwave,xwave)
Duplicate/O cwave $(cwaveName)
Wave output1=$(cwaveName)
End
Function SpanoFitAll(w1,xwave,cwave,fnum)
String w1
Wave xwave,cwave
Variable fnum
Variable i
String neww1
for(i=0; i<=fnum; i=i+1)
neww1 = w1+num2str(i) +"_bl_smth"
SpanoFit($(neww1),xwave,cwave)
endfor
End
Function SpanoFit(w1,xwave,cwave)
Wave w1,xwave,cwave
String outputName="Spano_" + NameOfWave(w1)
String cwaveName="Cs_" +NameOfWave(w1)
Variable/G V_FitTol=0.00001
Variable/G V_FitMxIters=100
Make/D/O/N=7 EpsilonSpano
EpsilonSpano[0]={0,10^-6,0,10^-6,10^-6,10^-6,10^-6}
Make/D/O/T/N=7 T_ConstraintsSpano
T_ConstraintsSpano[0]={"K1 > 0.01","K1 < 1","K3 > 1.85","K3 < 2.1","K4 > 0.02","K4 < 0.1","K6 > 0.001","K6 < 10"}
Duplicate /O w1 $(outputName)
Wave output=$(outputName)
FuncFit/N=1 /L=624 /H="1010010" Spano cwave w1[256,376] /X=xwave /D/E=EpsilonSpano/C=T_ConstraintsSpano/F={0.95,7}/R //[600,775] for S-Flame [1000,1225] for T-Flame
output= Spano(cwave,xwave)
Duplicate/O cwave $(cwaveName)
Wave output1=$(cwaveName)
End
Function SpanoFitAll(w1,xwave,cwave,fnum)
String w1
Wave xwave,cwave
Variable fnum
Variable i
String neww1
for(i=0; i<=fnum; i=i+1)
neww1 = w1+num2str(i) +"_bl_smth"
SpanoFit($(neww1),xwave,cwave)
endfor
End
Could someone provide me with an example or tip as to how I'd create a function that creates the baseline subtracted waves and uses them to create the fits? I have additional procedures that I'd like to implement into this process, but an example on how to do it with these two would help me a lot.
Thank you very much!
That said, it is better to write this:
BaselineSubtraction($(w1))
like this:
Wave w = $w1 // Create wave reference
BaselineSubtraction(w)
This is easier to debug and avoids dependency on the rtGlobals mode in effect.
This applies any time you use $. I recommend creating an explicit wave reference.
December 15, 2016 at 01:46 pm - Permalink
December 19, 2016 at 04:50 pm - Permalink