Fit Multiple Peaks

Version Info

Minimum Origin Version Required: Origin 8.1 SR0

Need to do before Running Examples

Prior to running the following example, the nlsf_utils.c file need to be loaded and compiled. This can be done from script with the following command or just add this file to your workspace.



The following code shows how to use NLFitSesssion to fit on multiple peaks in one dataset.

Before running new a worksheet and import \Samples\Curve Fitting\Multiple Peaks.dat, delete other columns just keep the first two columns. Then run "test_NLFitSession" in Command Window.

#include <Origin.h>
#include <..\originlab\NLFitSession.h>

#define ERR_RETURN(_ERR_MSG) { \
    out_str(_ERR_MSG); \
    return; \
void test_NLFitSession(int nNumPeaks = 3)
    Worksheet   wks = Project.ActiveLayer();
    if( !wks )
    // assume there is one pair XY columns in active worksheet including two peaks data
    XYRange drInput;
    drInput.Add(wks, 0, "X");
    drInput.Add(wks, 1, "Y");
    vector vX1, vY1;
    drInput.GetData(vY1, vX1, NULL, 0);
    NLFitSession nlfSession;
    // Set Function
    if ( !nlfSession.SetFunction("Gauss", NULL, nNumPeaks) ) // set function with peak number
        ERR_RETURN("Fail to set function!");
    // Set Data and only need to set the last dataset with global fit mode, as to allow share parameters
    if ( !nlfSession.SetData(vY1, vX1) )
        ERR_RETURN("Fail to set data for the first dataset!")
    // Parameter initialization
    if ( !nlfSession.ParamsInitValues() )
        ERR_RETURN("Fail to init parameters values!")
    // Show parameters before fitting
    nlfSession.GetChiSqr(); // call GetChiSqr order to set parameter settings on internal fit object
    show_params(nlfSession, nNumPeaks, "Before ftting");
    //Set the maximum allowed number of iterate times, if fit not converged, try to set a bigger number
    // Do fit
    int nFitOutcome;
    bool bRet = nlfSession.Fit(&nFitOutcome); //if success    
    string strOutcome = nlfSession.GetFitOutCome(nFitOutcome);
    out_str("Outcome of the fitting session : " + strOutcome);
    if( bRet )
        // Show parameters after fitting
        show_params(nlfSession, nNumPeaks, "After ftting");
        // Get the fitting result
        vector vFitY1(vX1.GetSize());
        nlfSession.GetYFromX(vX1, vFitY1, vX1.GetSize(), -1); //get cumulative fitted data
        // Put fitting data into new column in worksheet
        append_column_data(wks, vFitY1, "Fit Data");  
        GraphPage gp;
        GraphLayer gl = gp.Layers();
void append_column_data(Worksheet& wks, vector& vData, LPCSTR lpcstrLongName)
    int nCol = wks.AddCol();
    if( NULL != lpcstrLongName )
    Dataset ds(wks, nCol);
    ds = vData;
void show_params(NLFitSession& nlfSession, int nCount, LPCSTR lpcscTitle)
    vector<double>  vParamValues;
    vector<int>     vParamOffsets;
    vector<string>  vsParamNames;
    //get parameters values and names
    nlfSession.GetParamValuesAndOffsets(vParamValues, vParamOffsets);
    //output paramter values with names
    for ( int index = 0; index  < nCount; index++ )
        printf("%s, parameters of Peak %d:\n", lpcscTitle, index + 1);
        for ( int nParam = vParamOffsets[index], ii = 0; nParam < vParamOffsets[index + 1]; nParam++, ii++ )
            printf("%s = %lf\n", vsParamNames[ii], vParamValues[nParam]);