LabTalk supports variables of data types, statements and control structures. Some common to other programming languages while some are unique in Origin to easily perform tasks related to Origin's worksheet, graph, plot, etc. Using these variables with different statements is the basic idea of scripting in Origin.
This tutorial will show these fundamentals with various examples:
LabTalk supports nine data types: double, integer, constant, dataset, string, stringarray, range, tree and graphic objects. A variable used without a declaration is by default type double or string -- if it ends with $, it's a string variable, otherwise, it's a double variable
There are 3 scopes of variable: Session, project and local and it's determined by declaration.
aa = 3; //double variable since not declared str$ = "Hello"; //string variable ends with $
double bb = 1.234; //declare and assign double cc; //declare cc = 9.876; //assign int nn; //declare //You must assign a value when declaring a constant //And the constant value cannot be changed. const c1 = 0.5; //declare and assign
list;
![]() | You can use the list and delete command with options to view and delete variables. |
aa=; //output Undefined variable: AA str$=; //output #Command Error!
bb=; //output bb=1.234 cc=; //output cc=9.876 nn=; //output nn=0 c1=; //output c1=0.5
aa=; str$=; bb=; cc=; nn=; c1=;
aa=; //output aa=3 str$=; //output Hello bb=; cc=; nn=; c1=;
String Register was the only way to save strings before string variable was supported in Origin. We recommend using string variable though string register is still supported. Please note that some string registers are reserved for Origin use e.g. %H for current window name, %Y for User Files folder, etc.. Please use the unreserved string registers if you want to use it to save strings.
%A="Hello World"; %A=;
string greeting$ = "Good Morning"; %B = greeting$; greeting$ =; %B =;
%J="%A, " + greeting$; %J=;
//Define a string variable with the text "%B" without recognizing it as a string register string str1$ = %%B; str1$ =; //should output %B
Dataset type data is loose dataset not associated with any worksheet. They can be used in calculations and be assigned to worksheet columns. Project level dataset can be used for plotting while session level dataset can't be used for plotting.
//define loose dataset temp = {10,9,8,7,6}; //output values temp[1]=; //output 1st value 10 type $(temp); //output all values separated by space //using dataset to do calculation temp2=sqrt(temp); //square root of temp //Use plotxy X-Function to plot line+symbol graph, temp as X, temp2 as Y plotxy iy:=(temp, temp2) plot:=202; //assign loose dataset to worksheet columns col(A)=temp; col(B)=temp2;
//Create a XY loose dataset "tmpdata" and define row number as 5 create tmpdata -wdn 5 X Y;
Note: As demonstrated in previous lessons that command can take options. Some options can also take arguments. E.g. The create command takes argument tmpdata and -wdn option. The -wdn option also takes argument 5 X Y so tmpdata_X and tempdata_Y dataset are created with size of 5.
tmpdata_X[1] = .1; tmpdata_X[2] = .2; tmpdata_X[3] = .25; tmpdata_X[4] = .4; tmpdata_X[5] = .5;
tmpdata_Y = temp;
//plotXY is an X-Function plotxy iy:=tmpdata_Y plot:=202;
tmpdata_X=data(0.1,0.5, 0.1); //assign 0.1, 0.2, ... 0.5 to tmpdata_X tmpdata_Y=sort(normal(5)*10); //generate 5 random values and sort them, then assign to tmpdata_Y
//create a session variable aa with numbers 1-10with increment of 0.5 dataset aa = {1:0.5:10}; //declare and assign
Inside your Origin Project, data exists in four primary places: in worksheet, in matrix, in a loose dataset, or in a graph. Range data type provides a consistent way to access them. The syntax is
Range variable can also refer to window, sheet, layer, subrange of data or a block of data across multiple columns or even sheets. This tutorial will only show some basic examples. You can learn more about it in the next Range Notation in LabTalk Tutorial.
range rA = [Book1]Sheet1!Col(A); rA.=; //dump all properties rA.(); //dump all methods rA.lname$=; //output long name rA.nRows=; //output number of rows rA.unit$="MM/DD/YYYY"; //set unit as "MM/DD/YYYY" ra.setformat(4);//set column as Date
// Point to column 1 of sheets 1, 2, and 3 of the active workbook: //for active book, [bookname] part can be skipped range aa = 1!col(1); range bb = 2!col(1); range cc = 3!col(1); cc = aa+bb; //column contents will be updated
newbook; fname$ = system.path.program$ + "\Samples\Signal Processing\EMG Recording.dat"; impasc; // Define two range variables for subranges of imported data //rxy1 specifies subrange with X value from 5 to 5.5 //rxy2 specifies subrange with X value from 9.3 to 9.8 range rxy1 = (1, 2)[x5:5.5]; range rxy2 = 2[x9.3:9.8]; //if X info not mentioned, it will use the associated X column for Y plotxy rxy1 plot:=200; // Plot line for the 1st XY subrange smooth -r 2 rxy2 method:=le; // Smooth the 2nd XY subrange by Loess method
The smooth result is put to rows 10601 -11601 in column C, the corresponding X in 1st column is from 9.3 to 9.8.
range rwks = sheet1!; //sheet1 rwks.addcol(); //add a column. range rC=rwks!C; //column C rC=data(5,10, 0.5);
StringArray stra; stra.Add("Hello"); stra.Add("World"); stra.getAt(1)$=; //output Hello stra.getAt(2)$=; //output World
loop(ii,1,stra.GetSize()) { string str$=stra.GetAt(ii)$; str$=; //It should return //Hello //World }
LabTalk supports the standard tree data type, which emulates a tree structure with a set of branches and leaves (both are called nodes). The branches contain leaves, and the leaves contain data.
tree report; // Tree nodes are added automatically during assignment: //report two has 2 branches, each branche has two leaves report.user.name$="Tom"; //string report.user.age=22; // number report.=; //output the tree contents
The tree data type is often used in X-Function's tree type argument, no matter it's input or output.
//use impasc X-Function to import data string str$ = system.path.program$ + "Samples\Graphing\Group.dat"; impasc fname:=str$ //Get import information impinfo trInfo:=fileInfo; //impinfo. X-function has a tree output trInfo, assign it to a tree variable fileinfo.info.filename$=; //output imported filename fileInfo.=; //output all contents of the tree
System variables are used to monitor or control Origin behavior. E.g. the @ASC system variable to check and change the number of megabytes needed to trigger auto save checking.
//Run the following script line to get the variable value @ASC = ; //Run the following script line to set the variable value to be 10 (MB) @ASC = 10;
Use = to output the left hand side (LHS) expression, variable, string register, object property, function, system variable info. There are already many examples of using = to output variable values in previous section.
Below will show examples of There are already many examples of output variable, string register and object properties in above section. Here are some examples output calculation results
10+3*5=; //output 10+3*5=25 aa=8.1; aa+sqrt(aa)=; //output aa+sqrt(aa)=10.946049894152 col(A)[1]-mean(col(A)=; //calculation using col() and mean() functions range ra=A; ra[0]-min(ra)=; //calculation expression using range variable dataset ds={5.6, 3.4, 2.1, 0.5}; total(ds)=; //output total(ds)=11.6 //calculation using total() function and dataset variable //note: sum(ds) will return a dataset with cumulative sums {5.6, 9.0, 11.1, 11.6} sum(ds)=; //will return 5.6, 1st value in cumulative sum sum(ds)[0]=; //will return 11.6, last value in cumulative sum
Expression (RHS, right-hand side) is evaluated and put into LHS (left-hand side). If LHS does not exist, it is created if possible, otherwise an error will be reported.
Assign value to variable and output values
//assign double min = 0.5; string filename$="sensor01.dat"; dataset ds={0.1, 0.2, 0.3}; range ra=[book1]sheet1!A; //range variable for column A in specified book and sheet ra=data(800, 1000, 10); //fill it with 800 to 1000 with increment of 10 //output min =; //output 0.5 filename$=; //output sensor01.dat ds[1]=; //output 0.1, 1st value of ds ra[2]=; //output 900, 2nd value in column A
Note: For dataset and range variable, need to use e.g. type $(ds); type $(ra); to output all values
Read and write object properties
wks.name$=; //output current sheet name. For string property, use $ at the end wks.name$="Data"; //set wks.ncols= ; //output number of columns in current sheet; wks.ncols=10; //set number of columns to 10 wks.=; //list all wks object properties Col(A)[1]=; //return first value in column 1 Col(A)[0]=; //return last value in column 1 wks.col1.=; //list all wks.col1 (1st column) object properties
LabTalk command statements are similar to DOS batch commands in form of
command -option argument(s);
//Display string in a dialog box with Yes and No buttons type -n "Do you want to continue?";
//Prints "Hello World" in a dialog box three times. repeat 3 {type -b "Hello World"}
create tmpdata -wdn 10 X Y; tmpdata_X=normal(10); tmpdata_Y=tmpdata_X-mean(tmpdata_X); type $(tmpdata_X, .2); type $(tmpdata_Y, .2);
LabTalk supports 3 control structures and they can be nested inside another.
Decision Making Statements
In an Origin project file, make sure there is one workbook, one graph window one matrix window and one Layout page. Activate them and run the following script one by one to determine window type by exist() function
<lt> if(exist(%H)==3) type -b "A graph window is active"; else if(exist(%H)==2) type -b "A worksheet is active"; else type -b "Neither a graph nor worksheet is active";
The switch command is used when more than two possibilities are needed in a script.
For example the script above with the if-else structure can be modified as below:
switch(exist(%H)) { case 3: type -b "A graph window is active"; break; case 2: type -b "A worksheet is active"; break; case 5: type -b "A Matrix is active"; break; default: type -b "Neither a graph, worksheet nor matrix is active"; break; }
Loop Control Statements
Loop control allows the program to repetitively perform a set of actions as long as conditions are met. LabTalk provides four loop commands: for, repeat, loop, doc -e.
The for loop is similar to C.
In this syntax, expression1 specifies the initialization, expression2 is evaluated to determine whether to execute the script(if true) or to terminate the loop (if false), expression3 is executed at the end of each loop, it is often the increment of a counter. Both expression1 and expression3 can consist of multiple statements separated by commas as in
for(ii = 1, jj = 9; ii <= 5 ; ii++, jj++) { ty $(ii), $(jj), $(ii+jj); }
Execute the following for loop to output every 10th value in the loose dataset loopdata.
dataset loopdata=normal(50); for(jj = 1; jj <= loopdata.GetSize(); jj = jj + 10) { loopdata[$(jj)] =; }
The following shows using for loop to set columns as XYXY... and their long names
wks.ncols=10; for (ii=1; ii<=wks.ncols; ii++) { if (mod(ii,2)==1) { wks.col$(ii).type=4; wks.col$(ii).lname$="Time"; } else { wks.col$(ii).lname$="Amplitude"; } }
The repeat loop is used when a set of actions must be repeated without any alterations.
//create 6 new workbooks repeat 6 { newbook;}
The loop is used when a single variable is being incremented by 1 with each successive loop.
//Create a loose dataset (50 rows) which is not associated with a worksheet create loopdata -t 50; //Pass values into the dataset with a loop loop(ii, 1, 50) { loopdata[$(ii)] = ii^2; } //dump loopdata values type $(loopdata);
The doc -e loop is used loop through Origin objects (window, sheet, etc.) and execute script.
doc is the abbreviation for document. Remember for LabTalk commands, the command can be shorted as long as it's unique.
The following script loops through all graph windows and set legend background to shadow and refresh the graph
doc -e LP { legend.background=2; //set legend background to shadow doc -uw; //refresh window }
The following script output the name of each dataset in the Origin project (including worksheet columns and project-level loose datasets).
doc -e S { %C =; }
Origin provides many built-in LabTalk functions to work with different types of data and object in Origin, such as string, math, statistics, date and time, data generation, lookup, logic, etc. User can also define LabTalk functions and call them in Script.
The syntax to call LabTalk Functions FunctionName(Arg1 Arg2 ... ArgN);
Supported argument and return types:string, double, int, dataset and tree. Functions can be used in expressions and usually show on right hand side of assignment statement. But some functions can show on left hand side of assignement.
Use the Left( ) function to process strings
//Define a string variable and assign "Hello World" to it string str1$ = "Hello World"; //Use 'Left' function to get the left 5 characters the string string strLeft$ = Left(str1$,5)$; strLeft$ = ; //should return Hello
Some functions can appear on the left side of an assignment, e.g. Col() function
//Fill column A with data() function col(A) = data(600,850,10); //data() function creates a dataset from 600 to 850 in steps of 10
Use mean(), min() and max() functions to calculate mean, min and max of column and output them by type command.
for (ii=1; ii<=wks.ncols; ii++) { type "Col $(ii): Mean -- $(mean(wcol(ii)), .2), Min -- $(min(wcol(ii)),.2), Max -- $(max(wcol(ii)),.2)"; }
User-Defined LabTalk Function
Create user-defined functions with the syntax below:
function dataType funcName(Arg1 Arg2 ... ArgN) {script;}
function double JDate(double num) { //Calculate an integral from the double number int x = int(exp(num)*1000); //Generate the day, month and year integral with remainder function mod() int iDay = mod(x, 27) + 1; int iMonth = mod(x, 11) + 1; int iYear = 2013 - mod(x, 5); //Define a string as MM/DD/YYYY string jd$ = $(iMonth)/$(iDay)/$(iYear); //Return the Julian date number from the string as the function result //The string will be substituted with %() notation return date(%(jd$)); }
//calculate the Julian date and pass it to double variable jda double jda = JDate(0.83); //Output the numeric value of jda jda =;//Should return 2455373 //Display the date with format MM/DD/YYYY type $(jda, D0);//Should display 6/26/2010
Note: You can also run the following script to get the random values filled in the first column with the csetvalue x-function:
newbook; wks.nCols = 2; csetvalue col:=1 formula:="grnd()";
col(B) = JDate(col(A));
wks.col2.format = 4;
There are many Origin LabTalk Object (visible or not visible) to control Origin and its elements. Object contains properties and methods (functions).
E.g. run object isn't visible in workspace. Use it to run ogs file.
See the example in Save Script as an OGS File and Run it section in previous Getting Started tutorial.
There are also many visible objects. Each workbook and graph window contains basic elements (objects). These objects each have pre-defined names and unique properties and methods that can be controlled using LabTalk. For a complete list of Origin objects, view the Help file.
E.g. each window has page object for the window. For graph window, there is also at least one layer object.
Have a graph window active and run the following to set window long name and anti-alising on so curves look smooth on screen
page.longname$="My Chart"; //set window long name page.aa=1; //set anti-alising on
All legend, axis title, label and graphic object also have properties and methods.
legend.SHOWFRAME=0;//Turn legend object frame off by yl.TEXT$="Power"; //Rename left Y axis title yl.color=4;//Set left Y axis title color to blue
![]() | For such legend, title, label, arrow, line, rectangle, circle objects on graph, hold down Alt key and double click on an object in graph to see the object name on Programming tab. Or in newer versions, right click Graph node in Object Manager window and choose Show Graph Objects to find the name. |
There is at least one worksheet object wks in workbook. Each worksheet has column sub-objects (coln) for each (nth) column. Start a new worksheet and run the following to fill data, add column, set filter condition and apply the filter
//fill column A with 600 to 850 with increment of 10 col(A) = data(600,850,10); //fill column B with with random numbers, number of data is same as col(A) col(B) = normal(wks.col1.nrows); // nrows of wks.col1 object //Add a column wks.addcol(); //addcol() method of wks object wcol($(wks.ncols))=col(B)/col(A); //ncols property of wks object wks.col$(wks.ncols).type=3 //set last column as YError bar //Set filter condition in col2 wks.col2.filter$="x>0"; //filter$ property of wks.coln object //Apply the filter so only rows with positive value in col2 will show wks.runfilter(); //runfilter() method of wks object
Note: In above script both wks.col$(wks.ncols).type=3 and wks.col3.type=3 work but using the wks.ncols property is a better coding practice since it refers to last column. The $(wks.ncols) is a numeric substitution notation which means that the value of wks.ncols is evaluated first and then that value gets substituted before the LabTalk statement is executed.
![]() | Use objectname.= and objectname.() will dump all all available properties and methods. E.g. to see all wks object properties and methods, run wks.=; wks.(); |
Most of the dialogs and functions in Origin are based on X-Functions, which are callable from LabTalk For example, if you select the Analysis:Signal Processing:Smooth menu, a dialog will open allowing you to smooth irregular and noisy data. You can tell the dialog is built by X-Function since the dialog title shows Dialog name:X-Function name.
Not all X-Functions are associated with menu or toolbars so you may not be able to find all X-Functions from GUI. In such cases, the best approach is go to Help: Programming: X-Function and check the X-Function Reference with are organized by category.
The syntax to call X-Function is as follows, xFunctionName [argument1:=<range,name or value> argument2:=<range,name or value> ... ][ -switch];
where the arguments and -switches may be optional depending on the X-Function.
The following script uses [newbook x-function to create a new workbook with arguments to set book name and sheet number
//The workbook will be named as Test1 (both long and short name) //There'll be 5 worksheets in this workbook newbook name:=Test1 sheet:=5 option:=lsname;
X-Functions have a number of input and output variables. In this case, we specified name, sheet and option. For those we skipped, default value will be used.
Some useful switch options to find info. of the x-function
newbook -h; //dump help newbook -hv; //dump variable list newbook -he; //dump script example newbook -d; //open X-Function dialog
Associate a name with given script which can later be used as a command and include arguments.
Define a simple macro and use it. Run the following script first to define a macro named as testmacro
def testmacro { repeat %1 { repeat %2 { type -l "="; } type; } }
Use the macro
testmacro 2 64; // 2 is substituted for %1 and 64 for %2
A function properly implemented with Origin C can be called by LabTalk script.
double CubeRoot(double x) { if(x < 0) return -10^(log10(abs(x))/3); else return 10^(log10(x)/3); }
double aa = CubeRoot(125); aa = ;//It should return aa=5 Col(A)=data(1,100); //fill column A with 1, 2, ... 100 col(B)=aa*CubeRoot(Col(A)); //set col(B) value by function and variable