14 #include "MCGIDI_fromTOM.h"
15 #include "MCGIDI_misc.h"
17 #if defined __cplusplus
22 static int MCGIDI_fromTOM_pdfOfXGivenW( statusMessageReporting *smr, ptwXYPoints *pdfXY, MCGIDI_pdfsOfXGivenW *dists,
int i,
double *norm );
27 char const *toUnits[3] ) {
30 double norm, wUnitFactor;
31 char const *wFromUnit, *toUnitsXY[2] = { toUnits[1], toUnits[2] };
33 xDataTOM_W_XYs *W_XYs;
34 ptwXYPoints *pdfXY = NULL;
35 ptwXY_interpolation interpolationXY, interpolationWY;
44 dists->interpolationWY = interpolationWY;
45 dists->interpolationXY = interpolationXY;
47 if( interpolationWY == ptwXY_interpolationOther ) {
48 smr_setReportError2p( smr, smr_unknownID, 1,
"interpolationWY ptwXY_interpolationOther not supported" );
54 if( ( dists->Ws = (
double *) smr_malloc2( smr, W_XYs->length *
sizeof(
double ), 1,
"dists->Ws" ) ) == NULL )
goto err;
55 if( ( dists->dist = (MCGIDI_pdfOfX *) smr_malloc2( smr, W_XYs->length *
sizeof( MCGIDI_pdfOfX ), 0,
"dists->dist" ) ) == NULL )
goto err;
57 for( i = 0; i < W_XYs->length; i++ ) {
58 XYs = &(W_XYs->XYs[i]);
59 dists->Ws[i] = wUnitFactor * XYs->value;
64 else if( std::fabs( 1. - norm ) > 0.99 ) {
65 smr_setReportError2( smr, smr_unknownID, 1,
"bad norm = %e for data", norm );
90 int MCGIDI_fromTOM_pdfOfX( statusMessageReporting *smr, ptwXYPoints *pdfXY, MCGIDI_pdfOfX *dist,
double *norm ) {
94 ptwXPoints *cdfX = NULL;
101 if( ( dist->Xs = (
double *) smr_malloc2( smr, 3 * n1 *
sizeof(
double ), 0,
"dist->Xs" ) ) == NULL )
goto err;
102 dist->pdf = &(dist->Xs[n1]);
103 dist->cdf = &(dist->pdf[n1]);
105 for( j1 = 0; j1 < n1; j1++ ) {
107 dist->Xs[j1] = point->x;
108 dist->pdf[j1] = point->y;
112 smr_setReportError2( smr, smr_unknownID, 1,
"ptwXY_runningIntegral err = %d: %s\n", status,
nfu_statusMessage( status ) );
117 double inv_norm, sum = 0;
119 inv_norm = 1.0 / ( dist->Xs[n1-1] - dist->Xs[0] );
120 for( j1 = 0; j1 < n1; ++j1 ) {
121 if( j1 > 0 ) sum += dist->Xs[j1] - dist->Xs[j1-1];
123 dist->cdf[j1] = sum * inv_norm;
125 dist->cdf[n1-1] = 1.; }
128 for( j1 = 0; j1 < n1; j1++ ) dist->pdf[j1] /= *norm;
132 dist->numberOfXs = n1;
145 enum xDataTOM_interpolationFlag independent, dependent;
146 enum xDataTOM_interpolationQualifier qualifier;
150 *interpolation = ptwXY_interpolationOther;
152 if( dependent == xDataTOM_interpolationFlag_flat ) {
153 *interpolation = ptwXY_interpolationFlat; }
154 else if( independent == xDataTOM_interpolationFlag_linear ) {
155 if( dependent == xDataTOM_interpolationFlag_linear ) {
156 *interpolation = ptwXY_interpolationLinLin; }
157 else if( dependent == xDataTOM_interpolationFlag_log ) {
158 *interpolation = ptwXY_interpolationLinLog;
160 else if( independent == xDataTOM_interpolationFlag_log ) {
161 if( dependent == xDataTOM_interpolationFlag_linear ) {
162 *interpolation = ptwXY_interpolationLogLin; }
163 else if( dependent == xDataTOM_interpolationFlag_log ) {
164 *interpolation = ptwXY_interpolationLogLog;
171 #if defined __cplusplus
int64_t ptwXY_length(ptwXYPoints *ptwXY)
nfu_status ptwXY_simpleCoalescePoints(ptwXYPoints *ptwXY)
ptwXYPoints * ptwXY_free(ptwXYPoints *ptwXY)
nfu_status ptwXY_setValueAtX(ptwXYPoints *ptwXY, double x, double y)
ptwXYPoints * MCGIDI_misc_dataFromXYs2ptwXYPointsInUnitsOf(statusMessageReporting *smr, xDataTOM_XYs *XYs, ptwXY_interpolation interpolation, char const *toUnits[2])
double ptwX_getPointAtIndex_Unsafely(ptwXPoints *ptwX, int64_t index)
int MCGIDI_fromTOM_pdfOfX(statusMessageReporting *smr, ptwXYPoints *pdfXY, MCGIDI_pdfOfX *dist, double *norm)
int MCGIDI_fromTOM_pdfsOfXGivenW(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_pdfsOfXGivenW *dists, ptwXYPoints *norms, char const *toUnits[3])
int smr_isOk(statusMessageReporting *smr)
void * xDataTOME_getXDataIfID(statusMessageReporting *smr, xDataTOM_element *TE, char const *ID)
void * smr_freeMemory(void **p)
double MCGIDI_misc_getUnitConversionFactor(statusMessageReporting *smr, char const *fromUnit, char const *toUnit)
char const * xDataTOM_axes_getUnit(statusMessageReporting *smr, xDataTOM_axes *axes, int index)
int xDataTOME_getInterpolation(statusMessageReporting *smr, xDataTOM_element *element, int index, enum xDataTOM_interpolationFlag *independent, enum xDataTOM_interpolationFlag *dependent, enum xDataTOM_interpolationQualifier *qualifier)
ptwXPoints * ptwX_free(ptwXPoints *ptwX)
ptwXYPoint * ptwXY_getPointAtIndex_Unsafely(ptwXYPoints *ptwXY, int64_t index)
const char * nfu_statusMessage(nfu_status status)
ptwXPoints * ptwXY_runningIntegral(ptwXYPoints *ptwXY, nfu_status *status)
int MCGIDI_fromTOM_interpolation(statusMessageReporting *smr, xDataTOM_element *element, int index, ptwXY_interpolation *interpolation)
static int MCGIDI_fromTOM_pdfOfXGivenW(statusMessageReporting *smr, ptwXYPoints *pdfXY, MCGIDI_pdfsOfXGivenW *dists, int i, double *norm)