16#ifndef ALICEO2_MATHUTILS_CHEBYSHEV3D_H_
17#define ALICEO2_MATHUTILS_CHEBYSHEV3D_H_
75#ifdef _INC_CREATION_Chebyshev3D_
110 const Int_t* npX,
const Int_t* npY,
const Int_t* npZ,
121 Bool_t run = kTRUE,
const Float_t* precD =
nullptr);
135 void Eval(
const Double_t* par, Double_t*
res);
137 Double_t
Eval(
const Double_t* par,
int idim);
151 void Print(
const Option_t* opt =
"")
const override;
155 Bool_t
isInside(
const Double_t* par)
const;
164 return mMinBoundaries[
i];
169 return mMaxBoundaries[
i];
174 return (
float*)mMinBoundaries;
179 return (
float*)mMaxBoundaries;
184 return (
float*)mBoundaryMappingScale;
189 return (
float*)mBoundaryMappingOffset;
203#ifdef _INC_CREATION_Chebyshev3D_
205 int* getNcNeeded(
float xyz[3],
int dimVar,
float mn,
float mx,
float prec, Int_t npCheck = 30);
206 void estimateNumberOfPoints(
float prec,
int gridBC[3][3], Int_t npd1 = 30, Int_t npd2 = 30, Int_t npd3 = 30);
207 void saveData(
const char* outfile, Bool_t append = kFALSE)
const;
208 void saveData(FILE*
stream = stdout)
const;
210 void setuserFunction(
const char*
name);
211 void setuserFunction(
void (*
ptr)(
float*,
float*));
213 TH1* TestRMS(
int idim,
int npoints = 1000, TH1* histo =
nullptr);
214 static Int_t calculateChebyshevCoefficients(
const Float_t* funval,
int np,
Float_t* outCoefs,
Float_t prec = -1);
218 void Clear(
const Option_t* option =
"")
override;
220 void setDimOut(
const int d,
const float* prec =
nullptr);
224#ifdef _INC_CREATION_Chebyshev3D_
225 void evaluateUserFunction();
226 void defineGrid(
const Int_t* npoints);
227 Int_t chebyshevFit();
228 Int_t chebyshevFit(
int dmOut);
229 void setPrecision(
float prec)
238 return x / mBoundaryMappingScale[d] + mBoundaryMappingOffset[d];
243 return x / mBoundaryMappingScale[d] + mBoundaryMappingOffset[d];
247 Int_t mOutputArrayDimension;
251 Float_t mBoundaryMappingScale[3];
252 Float_t mBoundaryMappingOffset[3];
253 TObjArray mChebyshevParameter;
255 Int_t mMaxCoefficients;
256 Int_t mNumberOfPoints[3];
257 Float_t mTemporaryCoefficient[3];
258 Float_t* mTemporaryUserResults;
259 Float_t* mTemporaryChebyshevGrid;
260 Int_t mTemporaryChebyshevGridOffs[3];
261 TString mUserFunctionName;
262 TMethodCall* mUserMacro;
264 static const Float_t sMinimumPrecision;
273 for (
int i = 3;
i--;) {
274 if (mMinBoundaries[
i] > par[
i] || par[
i] > mMaxBoundaries[
i]) {
284 for (
int i = 3;
i--;) {
285 if (mMinBoundaries[
i] > par[
i] || par[
i] > mMaxBoundaries[
i]) {
295 for (
int i = 3;
i--;) {
298 for (
int i = mOutputArrayDimension;
i--;) {
306 for (
int i = 3;
i--;) {
309 for (
int i = mOutputArrayDimension;
i--;) {
317 for (
int i = 3;
i--;) {
326 for (
int i = 3;
i--;) {
335 for (
int i = 3;
i--;) {
338 for (
int ib = 3; ib--;) {
339 for (
int id = 3;
id--;) {
348 for (
int i = 3;
i--;) {
351 for (
int ib = 3; ib--;) {
352 for (
int id = 3;
id--;) {
353 for (
int id1 = 3; id1--;) {
355 mBoundaryMappingScale[
id] * mBoundaryMappingScale[id1];
364 for (
int i = 3;
i--;) {
367 for (
int i = mOutputArrayDimension;
i--;) {
375 for (
int i = 3;
i--;) {
378 for (
int i = mOutputArrayDimension;
i--;) {
380 mBoundaryMappingScale[dimd1] * mBoundaryMappingScale[dimd2];
388 for (
int i = 3;
i--;) {
398 for (
int i = 3;
i--;) {
402 mBoundaryMappingScale[dimd1] * mBoundaryMappingScale[dimd2];
408#ifdef _BRING_TO_BOUNDARY_
409 T
res = (
x - mBoundaryMappingOffset[d]) * mBoundaryMappingScale[d];
418 return (
x - mBoundaryMappingOffset[d]) * mBoundaryMappingScale[d];
425#ifdef _BRING_TO_BOUNDARY_
426 T
res = (
x - mBoundaryMappingOffset[d]) * mBoundaryMappingScale[d];
435 return (
x - mBoundaryMappingOffset[d]) * mBoundaryMappingScale[d];
Float_t Eval(const Float_t *par) const
Float_t evaluateDerivative(int dim, const Float_t *par) const
Float_t evaluateDerivative2(int dim1, int dim2, const Float_t *par) const
Float_t * getBoundMax() const
void evaluateDerivative3D(const Float_t *par, Float_t dbdr[3][3])
Returns the gradient matrix.
void prepareBoundaries(const Float_t *bmin, const Float_t *bmax)
Bool_t isInside(const Float_t *par) const
Checks if the point is inside of the fitted box.
void loadData(const char *inpFile)
Float_t * getBoundMin() const
void Clear(const Option_t *option="") override
Float_t mapToExternal(Float_t x, Int_t d) const
Float_t * getBoundaryMappingOffset() const
void evaluateDerivative(int dimd, const Float_t *par, Float_t *res)
Float_t getPrecision() const
Float_t mapToInternal(Float_t x, Int_t d) const
Μaps x to [-1:1].
Float_t * getBoundaryMappingScale() const
void evaluateDerivative2(int dimd1, int dimd2, const Float_t *par, Float_t *res)
Double_t mapToExternal(Double_t x, Int_t d) const
void evaluateDerivative3D2(const Float_t *par, Float_t dbdrdr[3][3][3])
Returns the gradient matrix.
void shiftBound(int id, float dif)
Float_t getBoundMin(int i) const
Chebyshev3DCalc * getChebyshevCalc(int i) const
void setDimOut(const int d, const float *prec=nullptr)
void Print(const Option_t *opt="") const override
void Eval(const Float_t *par, Float_t *res)
Evaluates Chebyshev parameterization for 3d->DimOut function.
Float_t getBoundMax(int i) const
Chebyshev3D & operator=(const Chebyshev3D &rhs)
GLuint const GLchar * name
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...