# 5.8 Mathematical Analysis with LabTalk

## Summary

Many mathematical analysis tools in Origin is accessible from LabTalk script, for example, differentiation, integration, interpolation, averaging multiple curves .etc. Most of these analysis has one or more associated X-Functions, and many commands, objects or arithmetic operators work as an implement to these X-Functions.

When carrying out mathematical analysis, it is sometimes very useful to create a user-interactive dialog to get user input and use the input value(s) for further calculation.

## What You Will Learn

This tutorial will show you how to:

• subtract a line from source data
• create a user-interactive dialog (getn) to get input from user and make use of the input values
• use interpolation to compute the Y value for given X
• normalize a data column
• calculate average for multiple curves

## Steps

1. Import the data file Waterfall.dat under <Origin EXE folder>\Samples\Graphing folder with the associated import filter into the workbook Waterfall.
2. // Create a newbook and name it Waterfall (both long and short name)
newbook name:="Waterfall" option:=lsname;
// Define the file name and filter name
string fname$= system.path.program$ + "Samples\Graphing\Waterfall.dat";
string filtername$= "waterfall.oif"; // Use the impfile x-function to import the specified file with the import filter impfile fname:=fname$ filtername:=filtername$location:=data orng:=[Waterfall]1!; 3. Use a loop and the subtract_line X-Function to subtract a simple baseline of end points connection. 4. //Create new sheet named as SubtractedData newsheet name:=SubtractedData; //Define the newly created worksheet(current active) as a range variable range sdwk = !; //Active the "Waterfall" worksheet by its name page.active$ = "Waterfall";
//Define a integral to hold the number of columns in Waterfall sheet
int nc = wks.nCols;
//Set the number of columns in SubtractedData sheet to be the same
sdwk.nCols = nc;
//Use the loop and subtract_line x-function to subtract baseline
//The first and last data points are found and connected linearly
//This line will be subtracted as baseline from source data
//Subtracted data will be named by excitation wavelength of source data
loop(ii, 2, nc)
{
range rx = [Waterfall]Waterfall!col(1);
range ry = [Waterfall]Waterfall!col($(ii)); subtract_line iy:=[Waterfall]Waterfall!(1,$(ii))
x1:=rx[1] /* Specifies the X value of the first point*/
y1:=ry[1] /* Specifies the Y value of the first point*/
x2:=rx[$(wks.maxRows)] /* Specifies the X value of the last point*/ y2:=ry[$(wks.maxRows)] /* Specifies the Y value of the last point*/
oy:=[Waterfall]SubtractedData!(1,$(ii)); //Rename the column long names in SubtractedData sheet //Use the User Defined Parameter Wavelength in Waterfall sheet [Waterfall]SubtractedData!col($(ii))[L]$= [Waterfall]Waterfall!col($(ii))[D1]$+ "nm"; } 5. Use a getn dialog to get some user input, let user decide whether to use the peak height at a reference position, or simply the maximum peak height for normalization. 6. //Create a dialog to get user input of reference peak position X value double xx;//give an initial value //Create getn dialog int n; getn (Use Specified Reference Peak for Normalization) n:2s (Reference Peak Position X Value) xx (If not specified, the data will be normalized based on maximum Y value); 7. Based on the user input from the previous step, loop over all Y columns to do data normalization. 8. //Create a new worksheet Normalized //And set the number of columns to be the same as previous worksheets newsheet name:=Normalized cols:=nc outname:=sname1$;
//Fill in column A with the same data of column A in SubtractedData worksheet
range r1 = col(1);
range r2 = [Waterfall]SubtractedData!col(1);
r1 = r2;

if(n==0)/*If user hasn't chosen "Use Specified Reference Peak for Normalization"*/
{
loop(ii, 2, nc)
{
//Use the rnormalize x-function to normalize the columns
rnormalize -r 2
irng:=[Waterfall]SubtractedData!col($(ii)) method:=max /*Use "Divided by Maximum" as Normalization method" */ orng:=%(sname1$)col($(ii)); wks.col = ii; col($(ii))[L]$= [Waterfall]Waterfall!col($(ii))[D1]$+ "nm"; } } if(n==1)/*If user has chosen "Use Specified Reference Peak for Normalization"*/ { loop(ii, 2, nc) { range rr=[Waterfall]SubtractedData!(1,$(ii));
//Use interpolation to compute the Y value for given X
double yy = rr(xx);
//Use the rnormalize x-function to normalize the columns
rnormalize -r 2
irng:=[Waterfall]SubtractedData!col($(ii)) method:=specify /*Use "Divided by a specified value" as Normalization method" */ val:=yy /*Use the computed Y value from interpolation as reference value*/ orng:=%(sname1$)col($(ii)); wks.col = ii; col($(ii))[L]$= [Waterfall]Waterfall!col($(ii))[D1]$+ "nm"; } }  Except for the range( ) syntax, several X-Functions can be used for interpolation, e.g. interp1(interpolate Y from X), interp1q(linear interpolation and extrapolation), interp1xy(1D interpolation/extrapolation on a group of XY data).etc 9. Plot the normalized data as grouped line plots. 10. //Plot the normalized data as grouped line plots, no legend plotxy iy:=(1,2:end) plot:=200 legend:=0; 11. Calculate the average of multiple curves with the avecurves X-Function. 12. win -a Waterfall; //Create new sheet named as Avecurve newsheet name:=Avecurve; //Use a loop to calculate the average for every 4 curves for(ii=2; ii<nc; ii=ii+4) { avecurves -r 2 iy:=%(sname1$)(1,$(ii):$(ii+4)) rd:=[Waterfall]Avecurve!col(\$(ii/2));
}
13. Plot the average curve results as another grouped line plot.
14. //Select the whole worksheet of Avecurve
worksheet -s 0 0 0 0;
//Plot the active range as grouped line plot
plotxy plot:=200 legend:=0;