Geant4 Cross Reference |
1 /* 2 # <<BEGIN-copyright>> 3 # <<END-copyright>> 4 */ 5 6 #ifndef ptwXY_h_included 7 #define ptwXY_h_included 8 9 #include <stdio.h> 10 #include <stdint.h> 11 12 #include <nf_utilities.h> 13 #include <ptwX.h> 14 15 #if defined __cplusplus 16 extern "C" { 17 namespace GIDI { 18 #endif 19 20 #define ptwXY_minimumSize 10 /* This must be > 0 otherwise some logic will fail. */ 21 #define ptwXY_minimumOverflowSize 4 /* This must be > 0 otherwise some logic will fail. */ 22 #define ptwXY_maxBiSectionMax 20 23 #define ptwXY_minAccuracy 1e-14 24 #define ptwXY_sectionSubdivideMax 1 << 16 25 #define ClosestAllowXFactor 10 26 27 typedef enum ptwXY_dataFrom_e { ptwXY_dataFrom_Unknown, ptwXY_dataFrom_Points, ptwXY_dataFrom_Overflow } ptwXY_dataFrom; 28 typedef enum ptwXY_group_normType_e { ptwXY_group_normType_none, ptwXY_group_normType_dx, ptwXY_group_normType_norm } ptwXY_group_normType; 29 30 /* The next macro are used in the routine ptwXY_union. */ 31 #define ptwXY_union_fill 1 /* If filling, union is filled with y value of first ptw. */ 32 #define ptwXY_union_trim 2 /* If trimming, union in only over common domain of ptw1 and ptw2. */ 33 #define ptwXY_union_mergeClosePoints 4 /* If true, union calls ptwXY_mergeClosePoints with eps = 4 * DBL_EPSILON. */ 34 typedef enum ptwXY_sigma_e { ptwXY_sigma_none, ptwXY_sigma_plusMinus, ptwXY_sigma_Minus, ptwXY_sigma_plus } ptwXY_sigma; 35 typedef enum ptwXY_interpolation_e { ptwXY_interpolationLinLin, ptwXY_interpolationLinLog, ptwXY_interpolationLogLin, ptwXY_interpolationLogLog, 36 ptwXY_interpolationFlat, ptwXY_interpolationOther } ptwXY_interpolation; 37 38 /* 39 * The function ptwXY_getPointsAroundX determines where an x fits into a ptwXY instance. It returns/sets the following. 40 * 41 * if ( some point's x == x ) 42 * lessThanEqualXPoint is set to point's information (prior, next, index, x, y), 43 * greaterThanXPoint is set to a overflowHeader, 44 * return( ptwXY_lessEqualGreaterX_equal ). 45 * else if ( x < first point's x ) 46 * lessThanEqualXPoint is set to overflowHeader, 47 * greaterThanXPoint is set to first point's information, 48 * and greaterThanXPoint.prior points to the overflow which will be before the new point when the new point is inserted into overflowPoints. 49 * else if ( x > last point's x ) 50 * lessThanEqualXPoint is set to last point's information 51 * greaterThanXPoint is set to a overflowHeader point 52 * and lessThanEqualXPoint.prior points to the overflow which will be before new point when the new point is inserted into overflowPoints. 53 * else 54 * lessThanEqualXPoint is set to point's information for closes point with point's x <= x 55 * greaterThanXPoint is set to point's information for closes point with point's x > x 56 */ 57 typedef enum ptwXY_lessEqualGreaterX_e { ptwXY_lessEqualGreaterX_empty, ptwXY_lessEqualGreaterX_lessThan, ptwXY_lessEqualGreaterX_equal, 58 ptwXY_lessEqualGreaterX_between, ptwXY_lessEqualGreaterX_greater } ptwXY_lessEqualGreaterX; 59 60 typedef 61 struct ptwXYPoint_s { 62 double x, y; 63 } ptwXYPoint; 64 65 typedef nfu_status (*ptwXY_createFromFunction_callback)( double x, double *y, void *argList ); 66 typedef nfu_status (*ptwXY_applyFunction_callback)( ptwXYPoint *point, void *argList ); 67 typedef nfu_status (*ptwXY_getValue_callback)( void *argList, double x, double *y, double x1, double y1, double x2, double y2 ); 68 69 typedef struct { 70 char const *interpolationString; 71 ptwXY_getValue_callback getValueFunc; 72 void *argList; 73 } ptwXY_interpolationOtherInfo; 74 75 typedef 76 struct ptwXYOverflowPoint_s { 77 struct ptwXYOverflowPoint_s *prior; 78 struct ptwXYOverflowPoint_s *next; 79 int64_t index; /* For overflowHeader set to -1. */ 80 ptwXYPoint point; 81 } ptwXYOverflowPoint; 82 83 typedef 84 struct ptwXYPoints_s { 85 nfu_status status; 86 ptwXY_sigma typeX, typeY; 87 ptwXY_interpolation interpolation; 88 ptwXY_interpolationOtherInfo interpolationOtherInfo; 89 int userFlag; 90 double biSectionMax; 91 double accuracy; 92 double minFractional_dx; 93 int64_t length; 94 int64_t allocatedSize; 95 int64_t overflowLength; 96 int64_t overflowAllocatedSize; 97 int64_t mallocFailedSize; 98 ptwXYOverflowPoint overflowHeader; 99 ptwXYPoint *points; 100 ptwXYOverflowPoint *overflowPoints; 101 } ptwXYPoints; 102 103 /* 104 * Routines in ptwXY_core.c 105 */ 106 ptwXYPoints *ptwXY_new( ptwXY_interpolation interpolation, ptwXY_interpolationOtherInfo const *interpolationOtherInfo, double biSectionMax, 107 double accuracy, int64_t primarySize, int64_t secondarySize, nfu_status *status, int userFlag ); 108 nfu_status ptwXY_setup( ptwXYPoints *ptwXY, ptwXY_interpolation interpolation, ptwXY_interpolationOtherInfo const *interpolationOtherInfo, 109 double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int userFlag ); 110 ptwXYPoints *ptwXY_create( ptwXY_interpolation interpolation, ptwXY_interpolationOtherInfo const *interpolationOtherInfo, 111 double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int64_t length, double const *xy, 112 nfu_status *status, int userFlag ); 113 ptwXYPoints *ptwXY_createFrom_Xs_Ys( ptwXY_interpolation interpolation, ptwXY_interpolationOtherInfo const *interpolationOtherInfo, 114 double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int64_t length, double const *Xs, 115 double const *Ys, nfu_status *status, int userFlag ); 116 117 nfu_status ptwXY_copy( ptwXYPoints *dest, ptwXYPoints *src ); 118 ptwXYPoints *ptwXY_clone( ptwXYPoints *ptwXY, nfu_status *status ); 119 ptwXYPoints *ptwXY_cloneToInterpolation( ptwXYPoints *ptwXY, ptwXY_interpolation interpolationTo, nfu_status *status ); 120 ptwXYPoints *ptwXY_slice( ptwXYPoints *ptwXY, int64_t index1, int64_t index2, int64_t secondarySize, nfu_status *status ); 121 ptwXYPoints *ptwXY_xSlice( ptwXYPoints *ptwXY, double xMin, double xMax, int64_t secondarySize, int fill, nfu_status *status ); 122 ptwXYPoints *ptwXY_xMinSlice( ptwXYPoints *ptwXY, double xMin, int64_t secondarySize, int fill, nfu_status *status ); 123 ptwXYPoints *ptwXY_xMaxSlice( ptwXYPoints *ptwXY, double xMax, int64_t secondarySize, int fill, nfu_status *status ); 124 125 ptwXY_interpolation ptwXY_getInterpolation( ptwXYPoints *ptwXY ); 126 char const *ptwXY_getInterpolationString( ptwXYPoints *ptwXY ); 127 nfu_status ptwXY_getStatus( ptwXYPoints *ptwXY ); 128 int ptwXY_getUserFlag( ptwXYPoints *ptwXY ); 129 void ptwXY_setUserFlag( ptwXYPoints *ptwXY, int userFlag ); 130 double ptwXY_getAccuracy( ptwXYPoints *ptwXY ); 131 double ptwXY_setAccuracy( ptwXYPoints *ptwXY, double accuracy ); 132 double ptwXY_getBiSectionMax( ptwXYPoints *ptwXY ); 133 double ptwXY_setBiSectionMax( ptwXYPoints *ptwXY, double biSectionMax ); 134 135 nfu_status ptwXY_reallocatePoints( ptwXYPoints *ptwXY, int64_t size, int forceSmallerResize ); 136 nfu_status ptwXY_reallocateOverflowPoints( ptwXYPoints *ptwXY, int64_t size ); 137 nfu_status ptwXY_coalescePoints( ptwXYPoints *ptwXY, int64_t size, ptwXYPoint *newPoint, int forceSmallerResize ); 138 nfu_status ptwXY_simpleCoalescePoints( ptwXYPoints *ptwXY ); 139 140 nfu_status ptwXY_clear( ptwXYPoints *ptwXY ); 141 nfu_status ptwXY_release( ptwXYPoints *ptwXY ); 142 ptwXYPoints *ptwXY_free( ptwXYPoints *ptwXY ); 143 144 int64_t ptwXY_length( ptwXYPoints *ptwXY ); 145 int64_t ptwXY_getNonOverflowLength( ptwXYPoints const *ptwXY ); 146 147 nfu_status ptwXY_setXYData( ptwXYPoints *ptwXY, int64_t length, double const *xy ); 148 nfu_status ptwXY_setXYDataFromXsAndYs( ptwXYPoints *ptwXY, int64_t length, double const *x, double const *y ); 149 nfu_status ptwXY_deletePoints( ptwXYPoints *ptwXY, int64_t i1, int64_t i2 ); 150 ptwXYPoint *ptwXY_getPointAtIndex( ptwXYPoints *ptwXY, int64_t index ); 151 ptwXYPoint *ptwXY_getPointAtIndex_Unsafely( ptwXYPoints *ptwXY, int64_t index ); 152 nfu_status ptwXY_getXYPairAtIndex( ptwXYPoints *ptwXY, int64_t index, double *x, double *y ); 153 ptwXY_lessEqualGreaterX ptwXY_getPointsAroundX( ptwXYPoints *ptwXY, double x, ptwXYOverflowPoint *lessThanEqualXPoint, ptwXYOverflowPoint *greaterThanXPoint ); 154 ptwXY_lessEqualGreaterX ptwXY_getPointsAroundX_closeIsEqual( ptwXYPoints *ptwXY, double x, ptwXYOverflowPoint *lessThanEqualXPoint, 155 ptwXYOverflowPoint *greaterThanXPoint, double eps, int *closeIsEqual, ptwXYPoint **closePoint ); 156 nfu_status ptwXY_getValueAtX( ptwXYPoints *ptwXY, double x, double *y ); 157 nfu_status ptwXY_setValueAtX( ptwXYPoints *ptwXY, double x, double y ); 158 nfu_status ptwXY_setValueAtX_overrideIfClose( ptwXYPoints *ptwXY, double x, double y, double eps, int override ); 159 nfu_status ptwXY_mergeFromXsAndYs( ptwXYPoints *ptwXY, int length, double *xs, double *ys ); 160 nfu_status ptwXY_mergeFromXYs( ptwXYPoints *ptwXY, int length, double *xys ); 161 nfu_status ptwXY_appendXY( ptwXYPoints *ptwXY, double x, double y ); 162 nfu_status ptwXY_setXYPairAtIndex( ptwXYPoints *ptwXY, int64_t index, double x, double y ); 163 164 nfu_status ptwXY_getSlopeAtX( ptwXYPoints *ptwXY, double x, const char side, double *slope ); 165 166 double ptwXY_getXMinAndFrom( ptwXYPoints *ptwXY, ptwXY_dataFrom *dataFrom ); 167 double ptwXY_getXMin( ptwXYPoints *ptwXY ); 168 double ptwXY_getXMaxAndFrom( ptwXYPoints *ptwXY, ptwXY_dataFrom *dataFrom ); 169 double ptwXY_getXMax( ptwXYPoints *ptwXY ); 170 double ptwXY_getYMin( ptwXYPoints *ptwXY ); 171 double ptwXY_getYMax( ptwXYPoints *ptwXY ); 172 173 /* 174 * Methods in ptwXY_methods.c 175 */ 176 nfu_status ptwXY_clip( ptwXYPoints *ptwXY1, double yMin, double yMax ); 177 nfu_status ptwXY_thicken( ptwXYPoints *ptwXY1, int sectionSubdivideMax, double dxMax, double fxMax ); 178 ptwXYPoints *ptwXY_thin( ptwXYPoints *ptwXY1, double accuracy, nfu_status *status ); 179 nfu_status ptwXY_trim( ptwXYPoints *ptwXY ); 180 181 ptwXYPoints *ptwXY_union( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, nfu_status *status, int unionOptions ); 182 183 nfu_status ptwXY_scaleOffsetXAndY( ptwXYPoints *ptwXY, double xScale, double xOffset, double yScale, double yOffset ); 184 185 /* 186 * Functions in ptwXY_unitaryOperators.c 187 */ 188 nfu_status ptwXY_abs( ptwXYPoints *ptwXY ); 189 nfu_status ptwXY_neg( ptwXYPoints *ptwXY ); 190 191 /* 192 * Functions in ptwXY_binaryOperators.c 193 */ 194 nfu_status ptwXY_slopeOffset( ptwXYPoints *ptwXY, double slope, double offset ); 195 nfu_status ptwXY_add_double( ptwXYPoints *ptwXY, double value ); 196 nfu_status ptwXY_sub_doubleFrom( ptwXYPoints *ptwXY, double value ); 197 nfu_status ptwXY_sub_fromDouble( ptwXYPoints *ptwXY, double value ); 198 nfu_status ptwXY_mul_double( ptwXYPoints *ptwXY, double value ); 199 nfu_status ptwXY_div_doubleFrom( ptwXYPoints *ptwXY, double value ); 200 nfu_status ptwXY_div_fromDouble( ptwXYPoints *ptwXY, double value ); 201 nfu_status ptwXY_mod( ptwXYPoints *ptwXY, double m, int pythonMod ); 202 203 ptwXYPoints *ptwXY_binary_ptwXY( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, double v1, double v2, double v1v2, nfu_status *status ); 204 ptwXYPoints *ptwXY_add_ptwXY( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, nfu_status *status ); 205 ptwXYPoints *ptwXY_sub_ptwXY( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, nfu_status *status ); 206 ptwXYPoints *ptwXY_mul_ptwXY( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, nfu_status *status ); 207 ptwXYPoints *ptwXY_mul2_ptwXY( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, nfu_status *status ); 208 ptwXYPoints *ptwXY_div_ptwXY( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, nfu_status *status, int safeDivide ); 209 210 /* 211 * Functions in ptwXY_functions.c 212 */ 213 nfu_status ptwXY_pow( ptwXYPoints *ptwXY, double p ); 214 nfu_status ptwXY_exp( ptwXYPoints *ptwXY, double a ); 215 ptwXYPoints *ptwXY_convolution( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, nfu_status *status, int mode ); 216 217 /* 218 * Functions in ptwXY_interpolation.c 219 */ 220 nfu_status ptwXY_interpolatePoint( ptwXY_interpolation interpolation, double x, double *y, double x1, double y1, double x2, double y2 ); 221 ptwXYPoints *ptwXY_flatInterpolationToLinear( ptwXYPoints *ptwXY, double lowerEps, double upperEps, nfu_status *status ); 222 ptwXYPoints *ptwXY_toOtherInterpolation( ptwXYPoints *ptwXY, ptwXY_interpolation interpolation, double accuracy, nfu_status *status ); 223 ptwXYPoints *ptwXY_unitbaseInterpolate( double w, double w1, ptwXYPoints *ptwXY1, double w2, ptwXYPoints *ptwXY2, nfu_status *status ); 224 ptwXYPoints *ptwXY_toUnitbase( ptwXYPoints *ptwXY, nfu_status *status ); 225 ptwXYPoints *ptwXY_fromUnitbase( ptwXYPoints *ptwXY, double xMin, double xMax, nfu_status *status ); 226 227 /* 228 * Functions in ptwXY_convenient.c 229 */ 230 ptwXPoints *ptwXY_getXArray( ptwXYPoints *ptwXY, nfu_status *status ); 231 nfu_status ptwXY_dullEdges( ptwXYPoints *ptwXY, double lowerEps, double upperEps, int positiveXOnly ); 232 nfu_status ptwXY_mergeClosePoints( ptwXYPoints *ptwXY, double epsilon ); 233 ptwXYPoints *ptwXY_intersectionWith_ptwX( ptwXYPoints *ptwXY, ptwXPoints *ptwX, nfu_status *status ); 234 nfu_status ptwXY_areDomainsMutual( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2 ); 235 nfu_status ptwXY_tweakDomainsToMutualify( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int epsilonFactor, double epsilon ); 236 nfu_status ptwXY_mutualifyDomains( ptwXYPoints *ptwXY1, double lowerEps1, double upperEps1, int positiveXOnly1, 237 ptwXYPoints *ptwXY2, double lowerEps2, double upperEps2, int positiveXOnly2 ); 238 nfu_status ptwXY_copyToC_XY( ptwXYPoints *ptwXY, int64_t index1, int64_t index2, int64_t allocatedSize, int64_t *numberOfPoints, double *xy ); 239 nfu_status ptwXY_valueTo_ptwXAndY( ptwXYPoints *ptwXY, double **xs, double **ys ); 240 ptwXYPoints *ptwXY_valueTo_ptwXY( double x1, double x2, double y, nfu_status *status ); 241 ptwXYPoints *ptwXY_createGaussianCenteredSigma1( double accuracy, nfu_status *status ); 242 ptwXYPoints *ptwXY_createGaussian( double accuracy, double xCenter, double sigma, double amplitude, double xMin, double xMax, 243 double dullEps, nfu_status *status ); 244 245 /* 246 * Functions in ptwXY_misc.c 247 */ 248 void ptwXY_update_biSectionMax( ptwXYPoints *ptwXY1, double oldLength ); 249 ptwXYPoints *ptwXY_createFromFunction( int n, double *xs, ptwXY_createFromFunction_callback func, void *argList, double accuracy, int checkForRoots, 250 int biSectionMax, nfu_status *status ); 251 ptwXYPoints *ptwXY_createFromFunction2( ptwXPoints *xs, ptwXY_createFromFunction_callback func, void *argList, double accuracy, int checkForRoots, 252 int biSectionMax, nfu_status *status ); 253 nfu_status ptwXY_applyFunction( ptwXYPoints *ptwXY1, ptwXY_applyFunction_callback func, void *argList, int checkForRoots ); 254 ptwXYPoints *ptwXY_fromString( char const *str, ptwXY_interpolation interpolation, ptwXY_interpolationOtherInfo const *interpolationOtherInfo, 255 double biSectionMax, double accuracy, char **endCharacter, nfu_status *status ); 256 257 void ptwXY_showInteralStructure( ptwXYPoints *ptwXY, FILE *f, int printPointersAsNull ); 258 void ptwXY_simpleWrite( ptwXYPoints *ptwXY, FILE *f, char *format ); 259 void ptwXY_simplePrint( ptwXYPoints *ptwXY, char *format ); 260 261 /* 262 * Functions in ptwXY_integration.c 263 */ 264 nfu_status ptwXY_f_integrate( ptwXY_interpolation interpolation, double x1, double y1, double x2, double y2, double *value ); 265 double ptwXY_integrate( ptwXYPoints *ptwXY, double xMin, double xMax, nfu_status *status ); 266 double ptwXY_integrateDomain( ptwXYPoints *ptwXY, nfu_status *status ); 267 nfu_status ptwXY_normalize( ptwXYPoints *ptwXY1 ); 268 double ptwXY_integrateDomainWithWeight_x( ptwXYPoints *ptwXY, nfu_status *status ); 269 double ptwXY_integrateWithWeight_x( ptwXYPoints *ptwXY, double xMin, double xMax, nfu_status *status ); 270 double ptwXY_integrateDomainWithWeight_sqrt_x( ptwXYPoints *ptwXY, nfu_status *status ); 271 double ptwXY_integrateWithWeight_sqrt_x( ptwXYPoints *ptwXY, double xMin, double xMax, nfu_status *status ); 272 ptwXPoints *ptwXY_groupOneFunction( ptwXYPoints *ptwXY, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm, nfu_status *status ); 273 ptwXPoints *ptwXY_groupTwoFunctions( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, 274 ptwXPoints *ptwX_norm, nfu_status *status ); 275 ptwXPoints *ptwXY_groupThreeFunctions( ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, ptwXYPoints *ptwXY3, ptwXPoints *groupBoundaries, 276 ptwXY_group_normType normType, ptwXPoints *ptwX_norm, nfu_status *status ); 277 ptwXPoints *ptwXY_runningIntegral( ptwXYPoints *ptwXY, nfu_status *status ); 278 double ptwXY_integrateWithFunction( ptwXYPoints *ptwXY, ptwXY_createFromFunction_callback func, void *argList, 279 double xMin, double xMax, int degree, int recursionLimit, double tolerance, nfu_status *status ); 280 281 #if defined __cplusplus 282 } 283 } 284 #endif 285 286 #endif /* End of ptwXY_h_included. */ 287