# 2.1.23.2.7 ocmath_find_markers_of_peak_centers_by_height_and_width

## Description

Find feets of the peaks by user settings

## Syntax

int ocmath_find_markers_of_peak_centers_by_height_and_width( UINT lSize, const double * px, const double * py, int nPeakNum, const double * pPeakX, int nMarkersNum, int * pMarkersIndices, double dMarkerHeight, double dMaxWidth, double dMinWidth )

## Parameters

lSize
[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
nPeakNum
[input] size of pPeakIndices
pPeakX
[input] X coordinates of peak centers
nMarkersNum
[input] size of pMarkersIndices, its initial value should larger than 2*nPeakNum
pMarkersIndices
[output] the indices of peaks' feets, its initial size is nMarkersNum, if nMarkersNum
is more than 2*nPeakNum, fill the excrescent elements with NANUM after pMarkersIndices[2*nPeakNum-1]
dMarkerHeight
[input] the estimated feet height of peaks, which will be marked
dMaxWidth
[input] the maximum width of peaks, which will be marked
dMinWidth
[input] the minimum width of peaks, which will be marked

## Return

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

## Examples

EX1

//Assume in the current graph, curve's XY data is in the first data plot. This piece
//of code get the XY data of the curve from the first data plot and find the feets of
//the peaks. The result is output in a new worksheet and the feets will plot in the
//original data plot.
void ocmath_find_markers_of_peak_centers_by_height_and_width_ex1( )
{
GraphLayer gl = Project.ActiveLayer();
if (!gl)
{
return;
}

//get plot data of curve from the first dataplot
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 vxPeaks, vyPeaks;
vector<int> vnIndices;

vxPeaks.SetSize(nDataSize);
vyPeaks.SetSize(nDataSize);
vnIndices.SetSize(nDataSize);

ocmath_find_peaks_1st_derivative( &nDataSize, vxData, vyData, vxPeaks, vyPeaks, vnIndices, POSITIVE_DIRECTION | NEGATIVE_DIRECTION,3);
vxPeaks.SetSize(nDataSize);
vyPeaks.SetSize(nDataSize);
vnIndices.SetSize(nDataSize);
int lSize = vxData.GetSize();
int peakNum=vnIndices.GetSize();
double dMarkerHeight = 30;
double dMaxWidth=30;
double dMinWidth=1;
vector<int> markeIndices;
markeIndices.SetSize(2*peakNum);
int nRet = ocmath_find_markers_of_peak_centers_by_height_and_width(vxData.GetSize(), vxData, vyData, peakNum,
vxPeaks, 2*peakNum, markeIndices,
dMarkerHeight, dMaxWidth, dMinWidth);
if( nRet < OE_NOERROR )
{
printf("error code: %d\n", nRet);
return;
}

vector vxMarker, vyMarker;
int nSize = markeIndices.GetSize();
vxMarker.SetSize(nSize);
vyMarker.SetSize(nSize);
for(int ii = 0; ii < markeIndices.GetSize(); ii++)
{
if(markeIndices[ii] >= 0)
{
vxMarker[ii] = vxData[markeIndices[ii]];
vyMarker[ii] = vyData[markeIndices[ii]];
}
else
{
vxMarker[ii] = NANUM;
vyMarker[ii] = NANUM;
}
}
vxMarker.Trim();
vyMarker.Trim();

//new a worksheet to show the result
WorksheetPage wksPage;
wksPage.Create();
Worksheet wksResult = wksPage.Layers(0);
int nXCol, nYCol;
//wksResult.Columns(0).SetType(OKDATAOBJ_DESIGNATION_X);
wksResult.Columns(1).SetType(OKDATAOBJ_DESIGNATION_X);
wksResult.Columns(2).SetType(OKDATAOBJ_DESIGNATION_Y);

//plot the feets in the original data plot
DataRange drOut;
drOut.Add("X", wksResult, 0, nXCol, -1, nXCol);
drOut.Add("Y", wksResult, 0, nYCol, -1, nYCol);
drOut.SetData(&vyMarker, &vxMarker);
}

## Remark

Find feets of the peaks, whose height is greater than dMarkerHeight(means abs of the points' y values are greater than dMarkerHeight) and width is between dMinWidth and dMaxWidth, then record peaks' left and right feets in pMarkersIndices.

pMarkersIndices contains the indices of peaks' feets.