Home Forums Code snippets Sum of a wave in the output_1 selection group

This topic contains 2 replies, has 2 voices, and was last updated by  Katharina Halbach 2 years, 4 months ago.

• Creator
Topic
• #7850

Katharina Halbach
Participant

Hello iolite-team,

I would like to know how to refer to a channel just for the output integration time. I was trying to print the sum of a channel. However, it returns the sum including the standard. I only want the sum for my output.

Katharina

Viewing 2 replies - 1 through 2 (of 2 total)
• Author
Replies
• #7983

Dr Bence Paul
Keymaster

Hi Katharina,

Sorry for taking so long to reply. I have just returned from leave, and it took a little coding to produce what you’re after. To return the sum of values in a channel only for your samples requires to you make selections within a selection group. For example, if you wanted the sum of all values for your samples for the channel Na23, you would put your selections for your samples in Output_1. Then you would sum all the values that occur during the time intervals defined by the selections. We have some code to return the avg and 2SD/2SE, but I had to alter our code to return the sum. Below is some code that you can copy and paste into a procedure window in Igor Pro (Windows -> Procedure Window). You can then type into the Command Window (Cmd + H, Ctrl + H on PC):

print ExtractIntegTypeValuesOnly(“Output_1”, “Na23”, “sum”)

As described above, this will print the sum of all values in channel Na23 within the time defined by selections in Output_1.

Please note that this bit of code should be included with the next release of iolite, so you won’t have to copy and past the code below when it is released.

Please let us know if you have any troubles.

Best regards,
Bence

``````//This function extracts the mean value, sum or standard deviations of a particular selection group and returns it as a number
Function ExtractIntegTypeValuesOnly(Integ_Name,Wave_Name,Mode)

String Integ_Name		//Name of Integration, e.g. Baseline_1
String Wave_Name		//This is the Name of the wave that the function will return stats for
String Mode				//Set to "Avg" to return the average, set to "2sd" to return 2 standard deviations, "2SE" to return 2 standard error, "sum" to return sum of all selections

String DatafolderName = WhereIsWave(Wave_Name)	//This is the data folder to look for the wave in

wave YAxisSource = \$ioliteDFpath(DatafolderName,Wave_Name)	//Now we can reference the wave

//the next 5 lines reference all of the global strings and variables in the header of this file for use in the main code of the DRS that follows.
string currentdatafolder = GetDataFolder(1)
setdatafolder \$ioliteDFpath("DRSGlobals","")
SVar IndexChannel, ReferenceStandard, DefaultIntensityUnits
setdatafolder \$ioliteDFpath("Temp","")

wave SourceMatrix = \$IoliteDFpath("integration","m_" + Integ_Name)
if(!waveexists(SourceMatrix))
PrintAbort ("Could not find the integration matrix selected. Process has been aborted.")
endif
wave Index_time = \$IoliteDFpath("CurrentDRS","Index_Time")
if(!waveexists(Index_time))
PrintAbort ("Could not find Index Time in CurrentDRS folder. Process has been aborted.")
endif
variable thisinteg=0, NoOfIntegs=dimsize(SourceMatrix,0)
variable thisstartpoint,thisendpoint,thisstarttime,thisendtime // per-integration start and end points and times

wave StdSegments = \$MakeIoliteWave("temp",Wave_Name+"_m",N = 0)	//Create a temporary wave with no points in it to hold all the values. Don't worry, points will be added during the loop

StdSegments = NaN

Variable NoOfPoints		//This is the number of points in each integration
Variable RowNumber		//This is the row number of the last entry in the StdSegments wave, where we'll add the points

Do //loop through the integrations of the standard integration and make a separate wave for each one
if(thisinteg>NoOfIntegs-1) //if there are no integrations left
break //then break the loop
endif
thisstarttime=SourceMatrix[thisinteg][0][%\$"Median Time"]-SourceMatrix[thisinteg][0][%\$"Time Range"]//get start, and
thisendtime=SourceMatrix[thisinteg][0][%\$"Median Time"]+SourceMatrix[thisinteg][0][%\$"Time Range"]//end times for this integration
thisstartpoint=ForBinarySearch(index_time, thisstarttime)
thisendpoint=ForBinarySearch(index_time, thisendtime) //find point indices for requested start and end points
if(thisstartpoint==thisendpoint) //if start and end points the same, then both times precede or postdate entire wave, wave is only 0 points long, or start and end times do not bracket any point in the wave.
thisinteg+=1 //set pointer to next sample
endif //otherwise, have bracketed at least a single point
Duplicate/O/R=[thisstartpoint,thisendpoint] YAxisSource temporyExtract		//Copy the values out of the source wave into a temporary wave
Duplicate/O StdSegments TempOrig		//Can't concatenate two waves into one, muct concatenate two waves into a new wave, so we create a temporary copy of the original, then concentate that with the new data
Wave temporyExtract, TempOrig
Concatenate/NP/O "TempOrig;temporyExtract;", StdSegments	//Then join the two together
thisinteg+=1 //next integration

Variable ReturnValue

If (cmpstr(Mode, "avg", 0)==0)
Wavestats/Q /M=1 StdSegments
ReturnValue=V_avg
SetDataFolder currentdatafolder
Return ReturnValue
ElseIf(cmpstr(Mode, "2sd", 0)==0)
Wavestats/Q  StdSegments
ReturnValue = 2 * V_sdev
SetDataFolder currentdatafolder
Return ReturnValue
ElseIf(cmpstr(Mode, "2se", 0)==0)
Wavestats/Q  StdSegments
ReturnValue = 2 * V_sdev / sqrt(V_npnts)
SetDataFolder currentdatafolder
Return ReturnValue
ElseIf(cmpstr(Mode, "sum", 0)==0)
Wavestats/Q  StdSegments
ReturnValue = V_sum
SetDataFolder currentdatafolder
Return ReturnValue
Endif
end``````
#8080

Katharina Halbach
Participant

Thanks Bence, it’s working nicely!

Viewing 2 replies - 1 through 2 (of 2 total)

You must be logged in to reply to this topic.