Batch Process. Use one wave to perform mathematical operation on the rest in data folder.
n.black
So I'm sure there is a way to do this but I'm not sure where in the manual to look.
I want to use one wave to divide all other waves in the data folder and produce a new wave. This is what I've got so far.
Function RemoveBavkgroundFTIR()
Wave w //define data wave
Variable datafolder
String/G list = Wavelist("*",";","") // creates a list of all waves in current "datafolder" separated by a ;
Variable/G numItems = ItemsInList(list), i // counts how and indices the items(graph) broken by ;
for (i = 0; i<numItems; i+=1) // starts a loop to go through each wave data
String/G data //creates a string of ith data
data = StringFromList(i,list,";") //goes through list and extracts ith string
wave w=$data
String newName = NameOfWave(w) + "_AuRemove" // gives output wave new name
Duplicate/O w, $newName
Wave wminAu = $newname
wnminAu= (w/refWave)
endfor
End
Wave w //define data wave
Variable datafolder
String/G list = Wavelist("*",";","") // creates a list of all waves in current "datafolder" separated by a ;
Variable/G numItems = ItemsInList(list), i // counts how and indices the items(graph) broken by ;
for (i = 0; i<numItems; i+=1) // starts a loop to go through each wave data
String/G data //creates a string of ith data
data = StringFromList(i,list,";") //goes through list and extracts ith string
wave w=$data
String newName = NameOfWave(w) + "_AuRemove" // gives output wave new name
Duplicate/O w, $newName
Wave wminAu = $newname
wnminAu= (w/refWave)
endfor
End
So in my last line of code I want variable refwave to be a wave that I can select from a list of IGOR waves. I feel like I need to define a new variable and somehow open up a dialogue to select it. Or should I just write in the name of the wave that I want to use? I hope what I'm trying to do makes sense! You guys of IGOR are usually great at helping out newby programmers like me out!!
Thanks in advance,
N
You neither need the first "wave" statement nor the "datafolder variable" (which should be a datafolder reference 'DFRef' or at least a string btw.)
I assume you use the /G flag for the strings and variables for some debugging after the function has executed (making them "Global").
It is sufficient if you declare the "data" and "newName" strings outside the loop. Pure assignments inside the loop are much faster (remember this for later:-) )
You do not need
NameOfWave
since it is stored already in "data" and you can solely assign it viaNewName=Data+ "_AuR"
(note: I shortened the name; probably you want to do further steps and add more suffixes. In order to avoid 'liberal names', i.e., to stay below 31 characters, keep these extensions short -- my colleagues had this habit; If you have more experience you probably want to sort your data treatment steps in 'data folders').The overwrite flag "/O" is only necessary is you run your code again.
The last line of code seems to contain a typo: "wminAu" vs. "wnminAu".
A possible way would be to pass the reference wave as a function argument
Wave refWave
or by a string and usage the '$' operator.
You probably want to check whether the processed wave is identical to the reference wave and exclude the division it his case (or it is always located in a different data folder).
HJ
PS: Buzzwords, worth to be read in the manual, are given in single quotes.
PPS: I was wondering if division is the right operation? You mention remove, which I would correlate with subtraction, while division goes together normalization.
August 6, 2015 at 02:48 am - Permalink
That was really helpful. Those tips are well noted and will be remembered!
Using the function argument to pass waves like that solved my problem very nicely. However, I left the "String newName" where it was in the code otherwise it wouldn't produce a new named wave to operate on... I think. Anyway the way I have it below works.
Anyway here is the completed code in case an other new IGOR enthusiasts stumble upon similar problems!
Wave refWave
String/G list = Wavelist("*",";","") // creates a list of all waves in current "datafolder" separated by a ;
String/G data //creates a string of ith data
Variable/G numItems = ItemsInList(list), i // counts how and indices the items(graph) broken by ;
for (i = 0; i<numItems; i+=1) // starts a loop to go through each wave data
data = StringFromList(i,list,";") //goes through list and extracts ith string
wave w=$data
String newName = data + "_AuR" // gives output wave new name
Duplicate/O w, $newName
Wave wminAu = $newname
wminAu= (w/refWave)
endfor
End
Function RemoveBackgroundFTIR(refWave)
Wave refWave
RemoveBackgroundFTIRbulk(refWave)
End
Thanks again HJ! This is some useful stuff that can easily be modified to do different batch processing.
Best,N
PS: The reason I had the variable "datafolder" was because I hoped to one day automate it that every new set of data could be collected in different data folders. but I haven't had time to write a piece of code to do that successfully yet. I manually make a new one and select and drag all my brand new waves into it.
PPS It's a division because it's a reflectance measurement and I'm trying to remove the light source signal which is convoluted into my data signal. For absorbance measurements a subtraction is correct! =)
August 6, 2015 at 06:14 am - Permalink
for (i = 0; i<numItems; i+=1) // starts a loop to go through each wave data
data = StringFromList(i,list,";") //goes through list and extracts ith string
wave w=$data
newName = data + "_AuR" // gives output wave new name
Duplicate/O w, $newName
...
endfor
which creates the variable outside the loop and only does the assignment inside.
HJ
August 6, 2015 at 07:18 am - Permalink
Thank you HJ!
August 6, 2015 at 07:26 am - Permalink