Added methods for finding a given module in the DDL map (F. Prino)
[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 */
5
6/* $Id$ */
7
8//
9// Author: Ruben Shahoyan
10// ruben.shahoyan@cern.ch 09/09/2006
11// See Comments in AliCheb3D.h
12//
13#include <TNamed.h>
14
15class AliCheb3DCalc: public TNamed
16{
17 public:
18 AliCheb3DCalc();
19 AliCheb3DCalc(FILE* stream); // read coefs from text file
20 AliCheb3DCalc(const AliCheb3DCalc &src);
21 AliCheb3DCalc& operator= (const AliCheb3DCalc &rhs);
22 ~AliCheb3DCalc() {Clear();}
23 //
24 void Print(Option_t* opt="") const;
25 void LoadData(FILE* stream);
26 Float_t Eval(Float_t *par) const;
27 //
28#ifdef _INC_CREATION_ALICHEB3D_
29 void SaveData(const char* outfile,Bool_t append=kFALSE) const;
30 void SaveData(FILE* stream=stdout) const;
31#endif
32 //
33 static void ReadLine(TString& str,FILE* stream);
34 //
35 protected:
36 //
37 void Clear(Option_t* option = "");
38 void Init0();
39 Float_t ChebEval1D(Float_t x, const Float_t * array, int ncf) const;
40 void InitRows(int nr);
41 void InitCols(int nc);
42 void InitElemBound2D(int ne);
43 void InitCoefs(int nc);
44 Int_t* GetNColsAtRow() const {return fNColsAtRow;}
45 Int_t* GetColAtRowBg() const {return fColAtRowBg;}
46 Int_t* GetCoefBound2D0() const {return fCoefBound2D0;}
47 Int_t* GetCoefBound2D1() const {return fCoefBound2D1;}
48 Float_t * GetCoefs() const {return fCoefs;}
49 //
50 protected:
51 Int_t fNCoefs; // total number of coeeficients
52 Int_t fNRows; // number of significant rows in the 3D coeffs matrix
53 Int_t fNCols; // max number of significant cols in the 3D coeffs matrix
54 Int_t fNElemBound2D; // number of elements (fNRows*fNCols) to store for the 2D boundary of significant coeffs
55 Int_t* fNColsAtRow; //[fNRows] number of sighificant columns (2nd dim) at each row of 3D coefs matrix
56 Int_t* fColAtRowBg; //[fNRows] beginnig of significant columns (2nd dim) for row in the 2D boundary matrix
57 Int_t* fCoefBound2D0; //[fNElemBound2D] 2D matrix defining the boundary of significance for 3D coeffs.matrix (Ncoefs for col/row)
58 Int_t* fCoefBound2D1; //[fNElemBound2D] 2D matrix defining the start beginnig of significant coeffs for col/row
59 Float_t * fCoefs; //[fNCoefs] array of Chebyshev coefficients
60 //
61 Float_t * fTmpCf1; //[fNCols] temp. coeffs for 2d summation
62 Float_t * fTmpCf0; //[fNRows] temp. coeffs for 1d summation
63 //
64 ClassDef(AliCheb3DCalc,1) // Class for interpolation of 3D->1 function by Chebyshev parametrization
65};
66
67inline Float_t AliCheb3DCalc::ChebEval1D(Float_t x, const Float_t * array, int ncf ) const
68{
69 // evaluate 1D Chebyshev parameterization. x is the argument mapped to [-1:1] interval
70 Float_t b0, b1, b2;
71 Float_t x2 = x+x;
72 b0 = array[--ncf];
73 b1 = b2 = 0;
74 for (int i=ncf;i--;) {
75 b2 = b1;
76 b1 = b0;
77 b0 = array[i] + x2*b1 -b2;
78 }
79 return b0 - x*b1;
80}
81
82#endif