I'm trying to figure out how to use the areaxy function to generate a list of values between a single x-series (time) and 1,000 different y-series. I only have 6 time points and a corresponding number of y-values. Using the print areaxy command, I can get the area values, however, I don't want to manually do this 1,000 times. How can I import the data sets from Excel into Igor, have it automatically calculate the areas and generate a new wave containing those values? Can anybody help.
Thanks,
Mark
This should help with the loading of files. AC suggests a better way than I did.
AreaXY and storing the results should be obvious from the example codes.
I'm trying to figure out how to use the areaxy function to generate a list of values between a single x-series (time) and 1,000 different y-series.
I have posted a snippet that does the area work here. Copy and paste it to your procedure window. Read the comments to see how it works. You will need to find a way to come up with a list of your 1000 Y wave names. If they are named systematically then you can use WaveList as shown in the example.
mkeller3 wrote:
How can I import the data sets from Excel into Igor, have it automatically calculate the areas and generate a new wave containing those values?
You can load Excel data using the XLLoadWave operation. Execute this:
DisplayHelpTopic "XLLoadWave XOP"
For a discussion of loading multiple waves from a user-defined function:
DisplayHelpTopic "Loading Waves Using Igor Procedures"
You will have to modify the procedures shown there to use XLLoadWave instead of the LoadWave operation and will no doubt need to make other modifications.
[Mark has a table where column 0 is a wave containing x values, and the other columns (about 500 of them) contain Y values. He want the average of those Y values using the X wave to provide X coordinates, all of those averages in one wave.]
Here's the macro and function I came up with:
#pragma rtGlobals=1// Use modern global access method.
Macro AreaXYOfTableXinFirstCol(outputWaveName, showResultInTable) String outputWaveName="AreaOut" Variable showResultInTable= 1// 1 == yes, 2 == No Prompt outputWaveName, "Choose name for output wave:" Prompt showResultInTable, "Show result in new table?",popup,"Yes;No;"
String tableName= WinName(0,2) if(strlen(tableName) == 0) DoAlert0, "Expected a table to read waves from" return endif
String pathToWave= fAreaXYOfTable(tableName,outputWaveName) if(strlen(pathToWave)&& showResultInTable == 1) Edit$pathToWave endif End
WAVE/Z wx= WaveRefIndexed("Table0",0,1)// first wave contains X values
if(!WaveExists(wx)) DoAlert0, "Expected wave in first column of table "+tableName return""// failure endif // Figure out how many other waves are in the table String ListOfAllWaves= WaveList("*", ";", "WIN:"+tableName) Variable numOfYWaves= ItemsInList(ListOfAllWaves) -1 if( numOfYWaves <1) DoAlert0, "Expected wave in second and following columns of table "+tableName return""// failure endif
WAVE output= $outputWaveName if(WaveExists(output)) DoAlert1, "Wave "+outputWaveName+" exists. Overwrite?" if( V_Flag != 1) returnGetWavesDataFolder(output,2) endif endif Make/O/N=(numOfYWaves)$outputWaveName WAVE output= $outputWaveName Variable index= 1// skip 0, that's X do WAVE/Z wy= WaveRefIndexed("Table0",index,1) if(!WaveExists(wy)) DoAlert0, "Expected wave in column "+num2istr(index)+" of table "+tableName break endif if(WaveType(wy,1)!= 1) DoAlert0, "Expected numeric wave in column "+num2istr(index)+" of table "+tableName break endif Variable theArea=areaxy(wx,wy)
output[index-1] = theArea
index += 1 while( index <= numOfYWaves )
Have a look here
http://www.igorexchange.com/node/1406
This should help with the loading of files. AC suggests a better way than I did.
AreaXY and storing the results should be obvious from the example codes.
Hope this helps,
Jason.
March 14, 2010 at 11:03 am - Permalink
I have posted a snippet that does the area work here. Copy and paste it to your procedure window. Read the comments to see how it works. You will need to find a way to come up with a list of your 1000 Y wave names. If they are named systematically then you can use WaveList as shown in the example.
You can load Excel data using the XLLoadWave operation. Execute this:
DisplayHelpTopic "XLLoadWave XOP"
For a discussion of loading multiple waves from a user-defined function:
DisplayHelpTopic "Loading Waves Using Igor Procedures"
You will have to modify the procedures shown there to use XLLoadWave instead of the LoadWave operation and will no doubt need to make other modifications.
March 14, 2010 at 11:28 am - Permalink
Here's the macro and function I came up with:
Macro AreaXYOfTableXinFirstCol(outputWaveName, showResultInTable)
String outputWaveName="AreaOut"
Variable showResultInTable= 1 // 1 == yes, 2 == No
Prompt outputWaveName, "Choose name for output wave:"
Prompt showResultInTable, "Show result in new table?",popup,"Yes;No;"
String tableName= WinName(0,2)
if( strlen(tableName) == 0 )
DoAlert 0, "Expected a table to read waves from"
return
endif
String pathToWave= fAreaXYOfTable(tableName,outputWaveName)
if( strlen(pathToWave) && showResultInTable == 1 )
Edit $pathToWave
endif
End
Function/S fAreaXYOfTable(tableName,outputWaveName)
String tableName,outputWaveName
WAVE/Z wx= WaveRefIndexed("Table0",0,1) // first wave contains X values
if( !WaveExists(wx) )
DoAlert 0, "Expected wave in first column of table "+tableName
return "" // failure
endif
// Figure out how many other waves are in the table
String ListOfAllWaves= WaveList("*", ";", "WIN:"+tableName)
Variable numOfYWaves= ItemsInList(ListOfAllWaves) -1
if( numOfYWaves < 1 )
DoAlert 0, "Expected wave in second and following columns of table "+tableName
return "" // failure
endif
WAVE output= $outputWaveName
if( WaveExists(output) )
DoAlert 1, "Wave "+outputWaveName+" exists. Overwrite?"
if( V_Flag != 1 )
return GetWavesDataFolder(output,2)
endif
endif
Make/O/N=(numOfYWaves) $outputWaveName
WAVE output= $outputWaveName
Variable index= 1 // skip 0, that's X
do
WAVE/Z wy= WaveRefIndexed("Table0",index,1)
if( !WaveExists(wy) )
DoAlert 0, "Expected wave in column "+num2istr(index)+" of table "+tableName
break
endif
if( WaveType(wy,1) != 1 )
DoAlert 0, "Expected numeric wave in column "+num2istr(index)+" of table "+tableName
break
endif
Variable theArea=areaxy(wx,wy)
output[index-1] = theArea
index += 1
while( index <= numOfYWaves )
return GetWavesDataFolder(output,2)
End
--Jim Prouty
Software Engineer, WaveMetrics, Inc.
March 15, 2010 at 11:29 am - Permalink