2.1.17.4.3 ocmath_integrate

Description

Integrate area under curve using Trapezoid Rule. Missing values are ignored.

Syntax

int ocmath_integrate( const double * pXData, const double * pYData, uint i1, uint i2, IntegrationResult * pInteg, double * pIntegral = NULL, int areaType = MATHEMATICAL_AREA, const double * pBaseLine = NULL, bool bSortAscending = false, int nMethodSearchHalfWidth = SEARCH_FROM_BOTH_ENDS)

Parameters

pXData
[input] pointer to X vector data
pYData
[input] pointer to Y vector data
i1
[input] starting index for the integration
i2
[input] ending index (inclusive) for the integration
pInteg
[output] result of integration.
pIntegral
[output] optional cumulative vector from the integration, must be allocated with with at least (i2+1) points
areaType
[input] MATHEMATICAL_AREA, direct cumulative vector from the integration; ABSOLUTE_AREA, integrate absolute area
pBaseLine
[input] integrate baseline
bSortAscending
[input] sort X before perform integration
nMethodSearchHalfWidth
[input] SEARCH_FROM_BOTH_ENDS, find half width from two ends by using linear search; SEARCH_FROM_PEAK, find half width from peak center by using linear search

Return

return OE_NOERROR for success, otherwise return errors

Examples

EX1

// This example reports all the properties of an ocmath_IntegResult structure after integrating a plotted dataset.
// Active window must be a 2D Graph window with plotted data.
void    ocmath_integrate_ex1()
{
printf("Area = %f\n", ocmath_integrate_sub1(Project.ActiveCurveBase()));
}
// Function dumps integration result and returns area
double    ocmath_integrate_sub1(curvebase& cuv, IntegrationResult* presult = NULL, int nFrom = 0, int nTo = -1)
{
IntegrationResult    result;
// make a local copy of the input curve so that we can be sure that it is numeric(double) so that
// we can get its double* directly to pass into ocmath functions which all expect double* from vectors
Curve cc(cuv);
if(nTo < 0)
nTo = cc.GetUpperIndex();
vector  vx, vy;
cc.CopyData(vx, vy);
if(ocmath_integrate(vx, cc, nFrom, nTo, &result))
return NANUM;
if(presult)
*presult = result;
else // show in script window if NULL for presult
{
Tree trTemp;
tr = result;
out_tree(tr);
}
return result.Area;
}

EX2

//integrate nY col with baseline nYb col from given range of index
//nY col is assumed to have its sample interval, or using Row# as X
//nYb is assumed to share same X as nY
int integ_with_base(Worksheet wks, int nY, int nYb, IntegrationResult& result = NULL, int nFrom = 0, int nTo = -1)
{
Column yy(wks, nY);
Column yb(wks, nYb);
if(!yy || !yb)
return -1;

vector vy;
vectorbase &y1 = yy.GetDataObject();
vectorbase &y2 = yb.GetDataObject();
vy = y1 - y2;
double x1, xinc;
if(!yy.IsEvenSampling(&x1, &xinc))
x1 = xinc = 1;
double x2 = x1 + (vy.GetSize()-1) * xinc;

vector vx;
vx.Data(x1, x2, xinc);
ASSERT(vx.GetSize() == vy.GetSize());

if(nTo < 0) nTo = vy.GetSize()-1;

return ocmath_integrate(vx, vy, nFrom, nTo, &result);
}
void test_integ_with_base(int nFrom = 0, int nTo = -1, int nY = 0, int nB = 1)
{
Worksheet wks = Project.ActiveLayer();
IntegrationResult result;
int nErr = integ_with_base(wks, nY, nB, result, nFrom, nTo);
if(nErr != 0)
out_int("Err ", nErr);
else
{
Tree trTemp;
tr = result;
out_tree(tr);
}
}