ocmath_create_baseline_by_masking_peaks

 

Description

Create curve's baseline by masking its peaks.

Syntax

int ocmath_create_baseline_by_masking_peaks( UINT lDataSize, const double * px, const double * py, UINT lBaselinePoints, double * pxb, double * pyb, DWORD dwCtrl = POSITIVE_DIRECTION )

Parameters

lDataSize
[input] size of px, py
px
[input] it contains curve's X coordinate's datas
py
[input] it contains curve's Y coordinate's datas
lBaselinePoints
[input] size of pxb, pyb
pxb
[output] X coordinate's datas of baseline
pyb
[output] Y coordinate's datas of baseline
dwCtrl
[input]
BOTH_DIRECTION: find peaks in both direction
NEGATIVE_DIRECTION: only find peaks in negative direction
POSITIVE_DIRECTION: only find peaks in positive direction

Return

Return OE_NOERROR if succeed, otherwise, non-zero error code is returned.

Examples

EX1

//Assume the active layer is a graph with at least one data plots. This piece of
//code get the data in the first data plot to create baseline. The result is 
//output into a new worksheet.
void ocmath_create_baseline_by_masking_peaks_ex1()
{
    GraphLayer gl = Project.ActiveLayer();
    if (!gl)
    {
        return;
    }
    
    //Get plot data from the first data plot
    DataPlot dp = gl.DataPlots(0);        
    DataRange dr;
    vector vxData, vyData;
    if(dp.GetDataRange(dr))
    {
        DWORD dwPlotID;
        if(dr.GetData(DRR_GET_DEPENDENT | DRR_NO_FACTORS, 0, &dwPlotID, NULL, &vyData, &vxData) < 0)
        {
            printf("get_plot_data failed GetData");
            return;
        }
    }
 
    uint nDataSize = vxData.GetSize();
 
    vector vxb, vyb;
    vxb.SetSize(nDataSize);
    vyb.SetSize(nDataSize);
    int nRet=ocmath_create_baseline_by_masking_peaks(nDataSize, vxData, vyData, nDataSize, vxb, vyb, POSITIVE_DIRECTION | NEGATIVE_DIRECTION);
    if( nRet < OE_NOERROR )
    {
        printf("error code: %d\n", nRet);
        return;
    }
    
    //New a worksheet and put the result in it
    WorksheetPage wksPage;
    wksPage.Create();
    Worksheet wksResult = wksPage.Layers(0);
    //wksResult.AddCol("Indices");
    int nXCol, nYCol;
    nXCol = wksResult.AddCol("X");
    nYCol = wksResult.AddCol("Y");
    //wksResult.Columns(0).SetType(OKDATAOBJ_DESIGNATION_X);
    wksResult.Columns(1).SetType(OKDATAOBJ_DESIGNATION_X);
    wksResult.Columns(2).SetType(OKDATAOBJ_DESIGNATION_Y);

    DataRange drOut;
    drOut.Add("X", wksResult, 0, nXCol, -1, nXCol);
    drOut.Add("Y", wksResult, 0, nYCol, -1, nYCol);
    drOut.SetData(&vyb, &vxb);
    
    //plot the baseline
    gl.AddPlot(drOut, IDM_PLOT_LINE);
}

Remark

Create curve's baseline by masking its peaks.

First, use ocmath_find_peaks_1st_derivative to find curve's peaks, then according to every peak, use ocmath_find_peaks_partition to find its partition, which recorded in nStart and nEnd.

At last, use the two end points of every peak's partition to interpolate the baseline between nStart and nEnd.

lBaselinePoints records the number of baseline, pxb and pyb contain X and Y coordinate's datas of baseline

See Also

ocmath_find_peaks_1st_derivative, ocmath_find_peaks_partition, ocmath_init_baseline_by_connect_ends

header to Include

origin.h

Reference