ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ptwXY.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file ptwXY.h
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 
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. */
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 */
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 );
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;
72  void *argList;
74 
75 typedef
76  struct ptwXYOverflowPoint_s {
79  int64_t index; /* For overflowHeader set to -1. */
82 
83 typedef
84  struct ptwXYPoints_s {
89  int userFlag;
90  double biSectionMax;
91  double accuracy;
93  int64_t length;
94  int64_t allocatedSize;
95  int64_t overflowLength;
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 
118 ptwXYPoints *ptwXY_clone( ptwXYPoints *ptwXY, 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 
126 char const *ptwXY_getInterpolationString( 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 );
137 nfu_status ptwXY_coalescePoints( ptwXYPoints *ptwXY, int64_t size, ptwXYPoint *newPoint, int forceSmallerResize );
139 
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 );
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 );
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 */
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 );
198 nfu_status ptwXY_mul_double( 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 );
225 ptwXYPoints *ptwXY_fromUnitbase( ptwXYPoints *ptwXY, double xMin, double xMax, nfu_status *status );
226 
227 /*
228 * Functions in ptwXY_convenient.c
229 */
231 nfu_status ptwXY_dullEdges( ptwXYPoints *ptwXY, double lowerEps, double upperEps, int positiveXOnly );
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 );
269 double ptwXY_integrateWithWeight_x( ptwXYPoints *ptwXY, double xMin, double xMax, 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 );
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. */