The Origin Forum
File Exchange
Try Origin for Free
The Origin Forum
Home | Profile | Register | Active Topics | Members | Search | FAQ | Send File to Tech support
 All Forums
 Origin Forum for Programming
 LabTalk Forum
 Output from peak fitting

Note: You must be registered in order to post a reply.
To register, click here. Registration is FREE!

Screensize:
UserName:
Password:
Anti-Spam Code:
Format Mode:
Format: BoldItalicizedUnderlineStrikethrough Align LeftCenteredAlign Right Horizontal Rule Insert HyperlinkUpload FileInsert Image Insert CodeInsert QuoteInsert List
   
Message:

* HTML is OFF
* Forum Code is ON
Smilies
Smile [:)] Big Smile [:D] Cool [8D] Blush [:I]
Tongue [:P] Evil [):] Wink [;)] Clown [:o)]
Black Eye [B)] Eight Ball [8] Frown [:(] Shy [8)]
Shocked [:0] Angry [:(!] Dead [xx(] Sleepy [|)]
Kisses [:X] Approve [^] Disapprove [V] Question [?]

 
Check here to subscribe to this topic.
   

T O P I C    R E V I E W
dafekare Posted - 06/22/2022 : 3:01:30 PM
Hi,

I am trying to write a script to automatically apply multimodal peak fitting to a set of xy data and it works, but the output does not give as much as information as when I do it manually. Here are the codes I wrote:

// Create a new workbook, and import the data
newbook;
string fname$ = "C:\Users\pt4673\Documents\SMPS\data analyses\0.05 PL-2L #11 20mM 51322.csv";
impasc;
// Set data filter for column 1, numeric type
wks.col1.filter = 1; // Add filter
wks.col1.filterx$ = Particle; // Set the variable "Particle size" to represent column 1
// Set filter condition, greater than 12
wks.col1.filter$ = "particle> 12";
// Run the worksheet filter;
wks.runfilter();
plotxy iy:=(1,2) plot:=201;
//Set the scale to Log10
layer.x.type = 2;
//Set the start value to 10 nm
layer.x.from = 10;
//Set the end value to 100 nm
layer.x.to = 100;
//Set the increment value
layer.x.inc = 10;
// Set symbol size
// %C is the active dataset
// Set symbol size to 5 (default is 9)
sec -p 1;
set %C -z 5;
//apply trimodal peak fitting with a gaussian distribution
fitpeaks t:=gauss np:=3;

When I run, it only provides the result titled "peak fitting code output 62222" attached. However, doing it manually yields nlpeakfit output (see nlpeakfit output attached) and a whole table which is more insightful than my code output. Please can you provide guidance on how to write the script for this nlpeakfit results? I assume this is non-linear peak fitting and it differs from my code.

Thanks a lot!



DAA
8   L A T E S T    R E P L I E S    (Newest First)
dafekare Posted - 07/01/2022 : 11:25:36 AM
The report page tree you sent is really helpful! Will follow through with ticket request if I need additional help. Thanks and happy 4th in advance. :)

DAA
YimingChen Posted - 07/01/2022 : 10:51:24 AM
To extract the data from the report sheet, you can refer to this page:
https://www.originlab.com/doc/LabTalk/guide/Accessing-Metadata#Access_Report_Page_Tree
Then you can create your own summary sheet by following the script I provided. If you have more questions on customizing your script, please submit a support ticket with the link below:
https://www.originlab.com/restricted/support/op/newticket.aspx

Please also provide your serial number in the ticket. Thank you.

James
dafekare Posted - 07/01/2022 : 10:19:53 AM
Thanks for the help, but the code is not yet solving the problem. I like the nlfitpeaks function better because it uses the Levenberg Marquadt iteration and I can choose the peaks so it's more precise. I also need to filter the data (remove if x < 12) because it can easily interfere with the main dataset of focus. I want to be able to:
1. do the fitting using nlfitpeaks
2. Pull the xc and standard error values for each xy output and place them in the same table so I can separately analyze.

DAA
YimingChen Posted - 06/30/2022 : 5:11:16 PM
You just need to plot out the original data and the fitted curve. Try the code below.

//Clear the project to start with empty space
doc -s; doc -n; {win -cd;}

// Import sample data into a new workbook
newbook;
string fname$ = system.path.program$ + "Samples\Curve Fitting\Multiple Peaks.dat";
impAsc;	
	
// get number of datasets
String wbk = %H;
int ndata = wks.ncols - 1;
range rsource = 1;

// prepare summary sheet
newbook;
String wbkrslt = %H;
int npeaks = 3;
wks.ncols = npeaks * 2;
Stringarray names = {"x1","x1_error","x2","x2_error","x3","x3_error"}
loop(i, 1, wks.ncols) {
	wcol(i)[L]$ = names.getAt(i)$;  
}

// prepare the fitted curve sheet
newbook;
String wbkplot = %H;
wks.ncols = ndata + 1;
range rx = 1;
rx = rsource;

// fit each dataset
loop(i, 1, ndata) {
	range aa = [%(wbk$)]1!(1, $(i + 1));
	nlbegin aa gauss tt replica:=$(npeaks - 1);
	nlfit;
	range ry = [%(wbkplot$)]1!wcol(i + 1);
	ry = fit(rx);
	ry[L]$ = fitted$(i);
	nlend;	
	%(wbkrslt$)!cell(i, 1) = tt.xc;
	%(wbkrslt$)!cell(i, 2) = tt.e_xc;
	%(wbkrslt$)!cell(i, 3) = tt.xc__2;
	%(wbkrslt$)!cell(i, 4) = tt.e_xc__2;
	%(wbkrslt$)!cell(i, 5) = tt.xc__3;
	%(wbkrslt$)!cell(i, 6) = tt.e_xc__3;
	
	// Plot both src and fit in the new graph
	range rs = [%(wbk$)]1!wcol(i+1);
	plotxy iy:=rs plot:=201 ogl:=[<new>];
	range rt = [%(wbkplot$)]1!wcol(i + 1);
	plotxy iy:=rt plot:=200 ogl:=[<active>] color:=color(red);	
}
dafekare Posted - 06/30/2022 : 4:32:29 PM
The code is not quite doing the trick, because I need to filter the data first and adjust the graph scale. Please find my previous code below:
// Clear the project to start with empty space
doc -s; doc -n; {win -cd;}
// Create a new workbook, and import the data
newbook;
string fname$ = "C:\Users\pt4673\Documents\particle\SMPS\data analyses\0.05 PL-2L #11 20mM 51322.csv";
impasc;
// Set data filter for column 1, numeric type
wks.col1.filter = 1; // Add filter
wks.col1.filterx$ = Particle; // Set the variable "Particle size" to represent column 1
// Set filter condition, greater than 12
wks.col1.filter$ = "particle> 12";
// Run the worksheet filter;
wks.runfilter();
plotxy iy:=(1,2) plot:=201;
//Set the scale to Log10
layer.x.type = 2;
//Set the start value to 10 nm
layer.x.from = 10;
//Set the end value to 100 nm
layer.x.to = 100;
//Set the increment value
layer.x.inc = 10;
// Set symbol size
// %C is the active dataset
// Set symbol size to 5 (default is 9)
sec -p 1;
set %C -z 5;
//apply non-linear peak fitting with a gaussian distribution. specify peaks once dialog box pops up
nlfitpeaks iy:=<active> func:=Gauss useqp:=0

DAA
YimingChen Posted - 06/30/2022 : 2:35:41 PM
Please try the sample code below:

// Clear the project to start with empty space
doc -s; doc -n; {win -cd;}

// Import sample data into a new workbook
newbook;
string fname$ = system.path.program$ + "Samples\Curve Fitting\Multiple Peaks.dat";
impAsc;	
	
// get number of datasets
String wbk = %H;
int ndata = wks.ncols - 1;

// prepare summary sheet
newbook;
String wbkrslt = %H;
int npeaks = 3;
wks.ncols = npeaks * 2;
Stringarray names = {"x1","x1_error","x2","x2_error","x3","x3_error"}
loop(i, 1, wks.ncols) {
	wcol(i)[L]$ = names.getAt(i)$;  
}

// fit each dataset
loop(i, 1, ndata) {
	range aa = [%(wbk$)]1!(1, $(i + 1));
	nlbegin aa gauss tt replica:=$(npeaks - 1);
	nlfit;
	nlend;	
	%(wbkrslt$)!cell(i, 1) = tt.xc;
	%(wbkrslt$)!cell(i, 2) = tt.e_xc;
	%(wbkrslt$)!cell(i, 3) = tt.xc__2;
	%(wbkrslt$)!cell(i, 4) = tt.e_xc__2;
	%(wbkrslt$)!cell(i, 5) = tt.xc__3;
	%(wbkrslt$)!cell(i, 6) = tt.e_xc__3;
}
dafekare Posted - 06/30/2022 : 11:28:07 AM
Excellent comment! Just what I needed to get my problem solved! However, I have some follow up questions:

1. I need to apply the non-linear peak fitting to different xy curves (same x, different ys). How can I automate this within the code I already wrote without copying and pasting the script with the updated y column number?

2. I need to create a table of the xc and standard error values reported in the result sheet after peak fitting. Where can I find the code to this command? see image attached.



DAA
YimingChen Posted - 06/22/2022 : 3:53:56 PM
You may want to refer to these pages on using nlfit related X-function to do the fitting:
https://www.originlab.com/doc/LabTalk/guide/Non-linear-Fitting
https://www.originlab.com/doc/LabTalk/examples/Curve-Fitting#Fit_Multiple_Peaks_with_Replica

It generates more detailed fitting statistics:
https://www.originlab.com/doc/en/X-Function/ref/nlbegin#Details_of_the_nltree_TreeNode

James

The Origin Forum © 2020 Originlab Corporation Go To Top Of Page
Snitz Forums 2000