1 #ifndef ALICHEB3DCALC_H
2 #define ALICHEB3DCALC_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
8 // Author: Ruben Shahoyan
9 // ruben.shahoyan@cern.ch 09/09/2006
10 // See Comments in AliCheb3D.h
14 // to decrease the compilable code size comment this define. This will exclude the routines
15 // used for the calculation and saving of the coefficients.
16 //#define _INC_CREATION_ALICHEB3D_
18 // when _BRING_TO_BOUNDARY_ is defined, the point outside of the fitted folume is assumed
19 // to be on the surface
20 // #define _BRING_TO_BOUNDARY_
24 class AliCheb3DCalc: public TNamed
28 AliCheb3DCalc(const AliCheb3DCalc& src);
29 AliCheb3DCalc(FILE* stream);
30 ~AliCheb3DCalc() {Clear();}
32 AliCheb3DCalc& operator=(const AliCheb3DCalc& rhs);
33 void Print(const Option_t* opt="") const;
34 void LoadData(FILE* stream);
35 Float_t EvalDeriv(int dim, const Float_t *par) const;
36 Float_t EvalDeriv2(int dim1,int dim2, const Float_t *par) const;
38 #ifdef _INC_CREATION_ALICHEB3D_
39 void SaveData(const char* outfile,Bool_t append=kFALSE) const;
40 void SaveData(FILE* stream=stdout) const;
43 void InitRows(int nr);
44 void InitCols(int nc);
45 Int_t* GetNColsAtRow() const {return fNColsAtRow;}
46 Int_t* GetColAtRowBg() const {return fColAtRowBg;}
47 void InitElemBound2D(int ne);
48 Int_t* GetCoefBound2D0() const {return fCoefBound2D0;}
49 Int_t* GetCoefBound2D1() const {return fCoefBound2D1;}
50 void Clear(const Option_t* option = "");
51 static Float_t ChebEval1D(Float_t x, const Float_t * array, int ncf);
52 static Float_t ChebEval1Deriv(Float_t x, const Float_t * array, int ncf);
53 static Float_t ChebEval1Deriv2(Float_t x, const Float_t * array, int ncf);
54 void InitCoefs(int nc);
55 Float_t * GetCoefs() const {return fCoefs;}
57 static void ReadLine(TString& str,FILE* stream);
60 T Eval(const T *par) const {
61 // evaluate Chebyshev parameterization for 3D function.
62 // VERY IMPORTANT: par must contain the function arguments ALREADY MAPPED to [-1:1] interval
64 for (int id0=fNRows;id0--;) {
65 int nCLoc = fNColsAtRow[id0]; // number of significant coefs on this row
66 int col0 = fColAtRowBg[id0]; // beginning of local column in the 2D boundary matrix
67 for (int id1=nCLoc;id1--;) {
69 fTmpCf1[id1] = (ncfRC=fCoefBound2D0[id]) ? ChebEval1D(par[2],fCoefs + fCoefBound2D1[id], ncfRC) : 0.0;
71 fTmpCf0[id0] = nCLoc>0 ? ChebEval1D(par[1],fTmpCf1,nCLoc):0.0;
73 return ChebEval1D(par[0],fTmpCf0,fNRows);
77 Int_t fNCoefs; // total number of coeeficients
78 Int_t fNRows; // number of significant rows in the 3D coeffs matrix
79 Int_t fNCols; // max number of significant cols in the 3D coeffs matrix
80 Int_t fNElemBound2D; // number of elements (fNRows*fNCols) to store for the 2D boundary of significant coeffs
81 Int_t* fNColsAtRow; //[fNRows] number of sighificant columns (2nd dim) at each row of 3D coefs matrix
82 Int_t* fColAtRowBg; //[fNRows] beginnig of significant columns (2nd dim) for row in the 2D boundary matrix
83 Int_t* fCoefBound2D0; //[fNElemBound2D] 2D matrix defining the boundary of significance for 3D coeffs.matrix (Ncoefs for col/row)
84 Int_t* fCoefBound2D1; //[fNElemBound2D] 2D matrix defining the start beginnig of significant coeffs for col/row
85 Float_t * fCoefs; //[fNCoefs] array of Chebyshev coefficients
87 Float_t * fTmpCf1; //[fNCols] temp. coeffs for 2d summation
88 Float_t * fTmpCf0; //[fNRows] temp. coeffs for 1d summation
90 ClassDef(AliCheb3DCalc,1) // Class for interpolation of 3D->1 function by Chebyshev parametrization
93 //__________________________________________________________________________________________
94 inline Float_t AliCheb3DCalc::ChebEval1D(Float_t x, const Float_t * array, int ncf )
96 // evaluate 1D Chebyshev parameterization. x is the argument mapped to [-1:1] interval
98 Float_t b0, b1, b2, x2 = x+x;
101 for (int i=ncf;i--;) {
104 b0 = array[i] + x2*b1 -b2;