]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliCheb3DCalc.h
Bug in AliZDCQADataMakerRec corrected
[u/mrichter/AliRoot.git] / STEER / AliCheb3DCalc.h
CommitLineData
99adacae 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 */
40389866 5#include <TNamed.h>
6#include <TSystem.h>
99adacae 7//
8// Author: Ruben Shahoyan
9// ruben.shahoyan@cern.ch 09/09/2006
10// See Comments in AliCheb3D.h
11//
40389866 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
99adacae 23
24class AliCheb3DCalc: public TNamed
25{
26 public:
27 AliCheb3DCalc();
40389866 28 AliCheb3DCalc(const AliCheb3DCalc& src);
29 AliCheb3DCalc(FILE* stream);
30 ~AliCheb3DCalc() {Clear();}
99adacae 31 //
40389866 32 AliCheb3DCalc& operator=(const AliCheb3DCalc& rhs);
99adacae 33 void Print(Option_t* opt="") const;
34 void LoadData(FILE* stream);
35 Float_t Eval(Float_t *par) const;
40389866 36 Float_t EvalDeriv(int dim, Float_t *par) const;
99adacae 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 //
99adacae 43 void InitRows(int nr);
44 void InitCols(int nc);
99adacae 45 Int_t* GetNColsAtRow() const {return fNColsAtRow;}
46 Int_t* GetColAtRowBg() const {return fColAtRowBg;}
40389866 47 void InitElemBound2D(int ne);
99adacae 48 Int_t* GetCoefBound2D0() const {return fCoefBound2D0;}
49 Int_t* GetCoefBound2D1() const {return fCoefBound2D1;}
40389866 50 void Clear(Option_t* option = "");
51 static Float_t ChebEval1D(Float_t x, const Float_t * array, int ncf);// const;
52 static Float_t ChebEval1Deriv(Float_t x, const Float_t * array, int ncf);// const;
53 void InitCoefs(int nc);
99adacae 54 Float_t * GetCoefs() const {return fCoefs;}
55 //
40389866 56 static void ReadLine(TString& str,FILE* stream);
57 //
99adacae 58 protected:
59 Int_t fNCoefs; // total number of coeeficients
60 Int_t fNRows; // number of significant rows in the 3D coeffs matrix
61 Int_t fNCols; // max number of significant cols in the 3D coeffs matrix
62 Int_t fNElemBound2D; // number of elements (fNRows*fNCols) to store for the 2D boundary of significant coeffs
63 Int_t* fNColsAtRow; //[fNRows] number of sighificant columns (2nd dim) at each row of 3D coefs matrix
64 Int_t* fColAtRowBg; //[fNRows] beginnig of significant columns (2nd dim) for row in the 2D boundary matrix
65 Int_t* fCoefBound2D0; //[fNElemBound2D] 2D matrix defining the boundary of significance for 3D coeffs.matrix (Ncoefs for col/row)
66 Int_t* fCoefBound2D1; //[fNElemBound2D] 2D matrix defining the start beginnig of significant coeffs for col/row
67 Float_t * fCoefs; //[fNCoefs] array of Chebyshev coefficients
68 //
69 Float_t * fTmpCf1; //[fNCols] temp. coeffs for 2d summation
70 Float_t * fTmpCf0; //[fNRows] temp. coeffs for 1d summation
71 //
40389866 72 ClassDef(AliCheb3DCalc,1) // Class for interpolation of 3D->1 function by Chebyshev parametrization
99adacae 73};
74
40389866 75//__________________________________________________________________________________________
76inline Float_t AliCheb3DCalc::ChebEval1D(Float_t x, const Float_t * array, int ncf )
99adacae 77{
78 // evaluate 1D Chebyshev parameterization. x is the argument mapped to [-1:1] interval
40389866 79 Float_t b0, b1, b2, x2 = x+x;
99adacae 80 b0 = array[--ncf];
81 b1 = b2 = 0;
82 for (int i=ncf;i--;) {
83 b2 = b1;
84 b1 = b0;
85 b0 = array[i] + x2*b1 -b2;
86 }
87 return b0 - x*b1;
40389866 88 //
99adacae 89}
90
91#endif