AliRoot Core  3dc7879 (3dc7879)
AliCheb3DCalc.h
Go to the documentation of this file.
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 */
5 #include <TNamed.h>
6 class TSystem;
7 //
8 // Author: Ruben Shahoyan
9 // ruben.shahoyan@cern.ch 09/09/2006
10 // See Comments in AliCheb3D.h
11 //
12 
13 
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_
17 
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_
21 //
22 
23 
24 class AliCheb3DCalc: public TNamed
25 {
26  public:
27  AliCheb3DCalc();
28  AliCheb3DCalc(const AliCheb3DCalc& src);
29  AliCheb3DCalc(FILE* stream);
31  //
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;
37  //
38 #ifdef _INC_CREATION_ALICHEB3D_
39  void SaveData(const char* outfile,Bool_t append=kFALSE) const;
40  void SaveData(FILE* stream=stdout) const;
41 #endif
42  //
43  void InitRows(int nr);
44  void InitCols(int nc);
45  void SetPrecision(Float_t prc=1e-6) {fPrec = prc;}
46  Float_t GetPrecision() const {return fPrec;}
47  Int_t GetNCoefs() const {return fNCoefs;}
48  Int_t GetNCols() const {return (Int_t)fNCols;}
49  Int_t GetNRows() const {return (Int_t)fNRows;}
50  Int_t GetNElemBound2D() const {return (Int_t)fNElemBound2D;}
51  Int_t GetMaxColsAtRow() const;
52  UShort_t* GetNColsAtRow() const {return fNColsAtRow;}
53  UShort_t* GetColAtRowBg() const {return fColAtRowBg;}
54  void InitElemBound2D(int ne);
55  UShort_t* GetCoefBound2D0() const {return fCoefBound2D0;}
56  UShort_t* GetCoefBound2D1() const {return fCoefBound2D1;}
57  void Clear(const Option_t* option = "");
58  static Float_t ChebEval1D(Float_t x, const Float_t * array, int ncf);
59  static Float_t ChebEval1Deriv(Float_t x, const Float_t * array, int ncf);
60  static Float_t ChebEval1Deriv2(Float_t x, const Float_t * array, int ncf);
61  void InitCoefs(int nc);
62  Float_t * GetCoefs() const {return fCoefs;}
63  //
64  static void ReadLine(TString& str,FILE* stream);
65  //
66  Float_t Eval(const Float_t *par) const;
67  Double_t Eval(const Double_t *par) const;
68  //
69  protected:
70  Int_t fNCoefs; // total number of coeeficients
71  Int_t fNRows; // number of significant rows in the 3D coeffs matrix
72  Int_t fNCols; // max number of significant cols in the 3D coeffs matrix
73  Int_t fNElemBound2D; // number of elements (fNRows*fNCols) to store for the 2D boundary of significant coeffs
74  UShort_t* fNColsAtRow; //[fNRows] number of sighificant columns (2nd dim) at each row of 3D coefs matrix
75  UShort_t* fColAtRowBg; //[fNRows] beginnig of significant columns (2nd dim) for row in the 2D boundary matrix
76  UShort_t* fCoefBound2D0; //[fNElemBound2D] 2D matrix defining the boundary of significance for 3D coeffs.matrix (Ncoefs for col/row)
77  UShort_t* fCoefBound2D1; //[fNElemBound2D] 2D matrix defining the start beginnig of significant coeffs for col/row
78  Float_t * fCoefs; //[fNCoefs] array of Chebyshev coefficients
79  //
80  Float_t * fTmpCf1; //[fNCols] temp. coeffs for 2d summation
81  Float_t * fTmpCf0; //[fNRows] temp. coeffs for 1d summation
82  //
83  Float_t fPrec; // Requested precision
84  ClassDef(AliCheb3DCalc,4) // Class for interpolation of 3D->1 function by Chebyshev parametrization
85 };
86 
87 //__________________________________________________________________________________________
88 inline Float_t AliCheb3DCalc::ChebEval1D(Float_t x, const Float_t * array, int ncf )
89 {
90  // evaluate 1D Chebyshev parameterization. x is the argument mapped to [-1:1] interval
91  if (ncf<=0) return 0;
92  Float_t b0, b1, b2, x2 = x+x;
93  b0 = array[--ncf];
94  b1 = b2 = 0;
95  for (int i=ncf;i--;) {
96  b2 = b1;
97  b1 = b0;
98  b0 = array[i] + x2*b1 -b2;
99  }
100  return b0 - x*b1;
101  //
102 }
103 
104 //__________________________________________________________________________________________
105 inline Float_t AliCheb3DCalc::Eval(const Float_t *par) const
106 {
107  // evaluate Chebyshev parameterization for 3D function.
108  // VERY IMPORTANT: par must contain the function arguments ALREADY MAPPED to [-1:1] interval
109  if (!fNRows) return 0.;
110  int ncfRC;
111  for (int id0=fNRows;id0--;) {
112  int nCLoc = fNColsAtRow[id0]; // number of significant coefs on this row
113  int col0 = fColAtRowBg[id0]; // beginning of local column in the 2D boundary matrix
114  for (int id1=nCLoc;id1--;) {
115  int id = id1+col0;
116  fTmpCf1[id1] = (ncfRC=fCoefBound2D0[id]) ? ChebEval1D(par[2],fCoefs + fCoefBound2D1[id], ncfRC) : 0.0;
117  }
118  fTmpCf0[id0] = nCLoc>0 ? ChebEval1D(par[1],fTmpCf1,nCLoc):0.0;
119  }
120  return ChebEval1D(par[0],fTmpCf0,fNRows);
121 }
122 
123 //__________________________________________________________________________________________
124 inline Double_t AliCheb3DCalc::Eval(const Double_t *par) const
125 {
126  // evaluate Chebyshev parameterization for 3D function.
127  // VERY IMPORTANT: par must contain the function arguments ALREADY MAPPED to [-1:1] interval
128  if (!fNRows) return 0.;
129  int ncfRC;
130  for (int id0=fNRows;id0--;) {
131  int nCLoc = fNColsAtRow[id0]; // number of significant coefs on this row
132  int col0 = fColAtRowBg[id0]; // beginning of local column in the 2D boundary matrix
133  for (int id1=nCLoc;id1--;) {
134  int id = id1+col0;
135  fTmpCf1[id1] = (ncfRC=fCoefBound2D0[id]) ? ChebEval1D(par[2],fCoefs + fCoefBound2D1[id], ncfRC) : 0.0;
136  }
137  fTmpCf0[id0] = nCLoc>0 ? ChebEval1D(par[1],fTmpCf1,nCLoc):0.0;
138  }
139  return ChebEval1D(par[0],fTmpCf0,fNRows);
140 }
141 
142 #endif
Float_t Eval(const Float_t *par) const
Int_t GetNCoefs() const
Definition: AliCheb3DCalc.h:47
UShort_t * fNColsAtRow
Definition: AliCheb3DCalc.h:74
UShort_t * GetCoefBound2D1() const
Definition: AliCheb3DCalc.h:56
UShort_t * GetCoefBound2D0() const
Definition: AliCheb3DCalc.h:55
Int_t GetNElemBound2D() const
Definition: AliCheb3DCalc.h:50
Float_t * fTmpCf1
Definition: AliCheb3DCalc.h:80
Int_t fNElemBound2D
Definition: AliCheb3DCalc.h:73
Float_t * fTmpCf0
Definition: AliCheb3DCalc.h:81
void Clear(const Option_t *option="")
UShort_t * fCoefBound2D0
Definition: AliCheb3DCalc.h:76
TObjArray * array
Definition: AnalyzeLaser.C:12
static void ReadLine(TString &str, FILE *stream)
void Print(const Option_t *opt="") const
AliCheb3DCalc & operator=(const AliCheb3DCalc &rhs)
Float_t EvalDeriv2(int dim1, int dim2, const Float_t *par) const
void SaveData(const char *outfile, Bool_t append=kFALSE) const
static Float_t ChebEval1Deriv(Float_t x, const Float_t *array, int ncf)
static Float_t ChebEval1Deriv2(Float_t x, const Float_t *array, int ncf)
void SetPrecision(Float_t prc=1e-6)
Definition: AliCheb3DCalc.h:45
UShort_t * GetNColsAtRow() const
Definition: AliCheb3DCalc.h:52
UShort_t * GetColAtRowBg() const
Definition: AliCheb3DCalc.h:53
Float_t EvalDeriv(int dim, const Float_t *par) const
Int_t GetMaxColsAtRow() const
static Float_t ChebEval1D(Float_t x, const Float_t *array, int ncf)
Definition: AliCheb3DCalc.h:88
void InitRows(int nr)
UShort_t * fCoefBound2D1
Definition: AliCheb3DCalc.h:77
Int_t GetNRows() const
Definition: AliCheb3DCalc.h:49
void LoadData(FILE *stream)
void InitCols(int nc)
UShort_t * fColAtRowBg
Definition: AliCheb3DCalc.h:75
Float_t * fCoefs
Definition: AliCheb3DCalc.h:78
Float_t GetPrecision() const
Definition: AliCheb3DCalc.h:46
void InitElemBound2D(int ne)
Float_t * GetCoefs() const
Definition: AliCheb3DCalc.h:62
void InitCoefs(int nc)
Int_t GetNCols() const
Definition: AliCheb3DCalc.h:48