]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliCheb3D.h
The track number and track pid associated with the cluster are included
[u/mrichter/AliRoot.git] / STEER / AliCheb3D.h
index 512b81dbe413b527526c8c46a60835006d069e0b..65fb19bf395670c19735675e935f372b2b497fb6 100644 (file)
 ////////////////////////////////////////////////////////////////////////////////
 
 
-#ifndef _ALICHEB3D_
-#define _ALICHEB3D_
-#include <stdio.h>
+#ifndef ALICHEB3D_H
+#define ALICHEB3D_H
+
 #include <TNamed.h>
-#include <TMethodCall.h>
-#include <TMath.h>
-#include <TH1.h>
 #include <TObjArray.h>
 #include "AliCheb3DCalc.h"
 
 class TString;
 class TSystem;
 class TRandom;
+class TH1;
+class TMethodCall;
+class TRandom;
+class TROOT;
+class stdio;
+
 
 
 class AliCheb3D: public TNamed 
@@ -88,24 +91,27 @@ class AliCheb3D: public TNamed
   AliCheb3D(const char* funName, Int_t DimOut, Float_t  *bmin,Float_t  *bmax, Int_t *npoints, Float_t  prec=1E-6);
   AliCheb3D(void (*ptr)(float*,float*), Int_t DimOut, Float_t  *bmin,Float_t  *bmax, Int_t *npoints, Float_t  prec=1E-6);
   AliCheb3D(void (*ptr)(float*,float*), int DimOut, Float_t  *bmin,Float_t  *bmax, Int_t *npX,Int_t *npY,Int_t *npZ, Float_t prec=1E-6);
-  AliCheb3D(void (*ptr)(float*,float*), int DimOut, Float_t  *bmin,Float_t  *bmax, Float_t prec=1E-6);
+  AliCheb3D(void (*ptr)(float*,float*), int DimOut, Float_t  *bmin,Float_t  *bmax, Float_t prec=1E-6, Bool_t run=kTRUE);
 #endif
   //
   ~AliCheb3D()                                                                 {Clear();}
   //
   AliCheb3D&   operator=(const AliCheb3D& rhs);
-  void         Eval(Float_t  *par,Float_t  *res);
-  Float_t      Eval(Float_t  *par,int idim);
+  void         Eval(const Float_t  *par, Float_t *res);
+  Float_t      Eval(const Float_t  *par,int idim);
+  void         Eval(const Double_t  *par, Double_t *res);
+  Double_t     Eval(const Double_t  *par,int idim);
+  //
+  void         EvalDeriv(int dimd, const Float_t  *par, Float_t  *res);
+  void         EvalDeriv2(int dimd1, int dimd2, const Float_t  *par,Float_t  *res);
+  Float_t      EvalDeriv(int dimd, const Float_t  *par, int idim);
+  Float_t      EvalDeriv2(int dimd1,int dimd2, const Float_t  *par, int idim);
+  void         EvalDeriv3D(const Float_t *par, Float_t dbdr[3][3]); 
+  void         EvalDeriv3D2(const Float_t *par, Float_t dbdrdr[3][3][3]); 
+  void         Print(const Option_t* opt="")                             const;
+  Bool_t       IsInside(const Float_t  *par)                             const;
+  Bool_t       IsInside(const Double_t *par)                             const;
   //
-  void         EvalDeriv(int dimd, Float_t  *par,Float_t  *res);
-  void         EvalDeriv2(int dimd1, int dimd2,Float_t  *par,Float_t  *res);
-  Float_t      EvalDeriv(int dimd,Float_t  *par, int idim);
-  Float_t      EvalDeriv2(int dimd1,int dimd2, Float_t  *par, int idim);
-  void         EvalDeriv3D(Float_t *par, Float_t dbdr[3][3]); 
-  void         EvalDeriv3D2(Float_t *par, Float_t dbdrdr[3][3][3]); 
-  void         Print(Option_t* opt="")                                   const;
-  Bool_t       IsInside(Float_t  *par)                                   const;
-  Bool_t       IsInside(Double_t  *par)                                  const;
   AliCheb3DCalc*  GetChebCalc(int i)                                     const {return (AliCheb3DCalc*)fChebCalc.UncheckedAt(i);}
   Float_t      GetBoundMin(int i)                                        const {return fBMin[i];}
   Float_t      GetBoundMax(int i)                                        const {return fBMax[i];}
@@ -118,32 +124,35 @@ class AliCheb3D: public TNamed
   void         LoadData(FILE* stream);
   //
 #ifdef _INC_CREATION_ALICHEB3D_
-  int*         GetNCNeeded(float xyz[3],int DimVar, float mn,float mx, float prec);
-  void         EstimateNPoints(float Prec, int gridBC[3][3]);
+  int*         GetNCNeeded(float xyz[3],int DimVar, float mn,float mx, float prec, Int_t npCheck=30);
+  void         EstimateNPoints(float Prec, int gridBC[3][3],Int_t npd1=30,Int_t npd2=30,Int_t npd3=30);
   void         SaveData(const char* outfile,Bool_t append=kFALSE)        const;
   void         SaveData(FILE* stream=stdout)                             const;
   //
   void         SetUsrFunction(const char* name);
   void         SetUsrFunction(void (*ptr)(float*,float*));
-  void         EvalUsrFunction(Float_t  *x, Float_t  *res);
+  void         EvalUsrFunction(const Float_t  *x, Float_t  *res);
   TH1*         TestRMS(int idim,int npoints = 1000,TH1* histo=0);
-  static Int_t CalcChebCoefs(Float_t  *funval,int np, Float_t  *outCoefs, Float_t  prec=-1);
+  static Int_t CalcChebCoefs(const Float_t  *funval,int np, Float_t  *outCoefs, Float_t  prec=-1);
 #endif
   //
  protected:
-  void         Clear(Option_t* option = "");
-  void         SetDimOut(int d);
-  void         PrepareBoundaries(Float_t  *bmin,Float_t  *bmax);
+  void         Clear(const Option_t* option = "");
+  void         SetDimOut(const int d);
+  void         PrepareBoundaries(const Float_t  *bmin,const Float_t  *bmax);
   //
 #ifdef _INC_CREATION_ALICHEB3D_
   void         EvalUsrFunction();
   void         DefineGrid(Int_t* npoints);
   Int_t        ChebFit();                                                                 // fit all output dimensions
   Int_t        ChebFit(int dmOut);
+  void         SetPrecision(float prec)                      {fPrec = prec;}
 #endif
   //
-  Float_t      MapToInternal(Float_t  x,Int_t d) const; // map x to [-1:1]
-  Float_t      MapToExternal(Float_t  x,Int_t d) const {return x/fBScale[d]+fBOffset[d];}   // map from [-1:1] to x
+  Float_t      MapToInternal(Float_t  x,Int_t d)       const; // map x to [-1:1]
+  Float_t      MapToExternal(Float_t  x,Int_t d)       const {return x/fBScale[d]+fBOffset[d];}   // map from [-1:1] to x
+  Double_t     MapToInternal(Double_t  x,Int_t d)      const; // map x to [-1:1]
+  Double_t     MapToExternal(Double_t  x,Int_t d)      const {return x/fBScale[d]+fBOffset[d];}   // map from [-1:1] to x
   //  
  protected:
   Int_t        fDimOut;            // dimension of the ouput array
@@ -157,38 +166,41 @@ class AliCheb3D: public TNamed
   Int_t        fMaxCoefs;          //! max possible number of coefs per parameterization
   Int_t        fNPoints[3];        //! number of used points in each dimension
   Float_t      fArgsTmp[3];        //! temporary vector for coefs caluclation
-  Float_t      fBuff[6];           //! buffer for coordinate transformations
   Float_t *    fResTmp;            //! temporary vector for results of user function caluclation
   Float_t *    fGrid;              //! temporary buffer for Chebyshef roots grid
   Int_t        fGridOffs[3];       //! start of grid for each dimension
   TString      fUsrFunName;        //! name of user macro containing the function of  "void (*fcn)(float*,float*)" format
   TMethodCall* fUsrMacro;          //! Pointer to MethodCall for function from user macro 
   //
-  ClassDef(AliCheb3D,1)  // Chebyshev parametrization for 3D->N function
+  ClassDef(AliCheb3D,2)  // Chebyshev parametrization for 3D->N function
 };
 
 //__________________________________________________________________________________________
-inline Bool_t  AliCheb3D::IsInside(Float_t  *par) const 
+inline Bool_t  AliCheb3D::IsInside(const Float_t *par) const 
 {
   // check if the point is inside of the fitted box
-  const float kTol = 1.e-4; 
-  for (int i=3;i--;) if (fBMin[i]-par[i]>kTol || par[i]-fBMax[i]>kTol) return kFALSE;
-  //if(par[i]<fBMin[i]||par[i]>fBMax[i]) return kFALSE;
+  for (int i=3;i--;) if (fBMin[i]>par[i] || par[i]>fBMax[i]) return kFALSE;
   return kTRUE;
 }
 
 //__________________________________________________________________________________________
-inline Bool_t  AliCheb3D::IsInside(Double_t  *par) const 
+inline Bool_t  AliCheb3D::IsInside(const Double_t *par) const 
 {
   // check if the point is inside of the fitted box
-  const float kTol = 1.e-4; 
-  for (int i=3;i--;) if (fBMin[i]-par[i]>kTol || par[i]-fBMax[i]>kTol) return kFALSE;
-  //if(par[i]<fBMin[i]||par[i]>fBMax[i]) return kFALSE;
+  for (int i=3;i--;) if (fBMin[i]>par[i] || par[i]>fBMax[i]) return kFALSE;
   return kTRUE;
 }
 
 //__________________________________________________________________________________________
-inline void AliCheb3D::Eval(Float_t  *par, Float_t  *res)
+inline void AliCheb3D::Eval(const Float_t  *par, Float_t  *res)
+{
+  // evaluate Chebyshev parameterization for 3d->DimOut function
+  for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
+  for (int i=fDimOut;i--;) res[i] = GetChebCalc(i)->Eval(fArgsTmp);
+  //
+}
+//__________________________________________________________________________________________
+inline void AliCheb3D::Eval(const Double_t  *par, Double_t  *res)
 {
   // evaluate Chebyshev parameterization for 3d->DimOut function
   for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
@@ -197,7 +209,7 @@ inline void AliCheb3D::Eval(Float_t  *par, Float_t  *res)
 }
 
 //__________________________________________________________________________________________
-inline Float_t AliCheb3D::Eval(Float_t  *par, int idim)
+inline Double_t AliCheb3D::Eval(const Double_t  *par, int idim)
 {
   // evaluate Chebyshev parameterization for idim-th output dimension of 3d->DimOut function
   for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
@@ -206,7 +218,16 @@ inline Float_t AliCheb3D::Eval(Float_t  *par, int idim)
 }
 
 //__________________________________________________________________________________________
-inline void AliCheb3D::EvalDeriv3D(Float_t *par, Float_t dbdr[3][3])
+inline Float_t AliCheb3D::Eval(const Float_t  *par, int idim)
+{
+  // evaluate Chebyshev parameterization for idim-th output dimension of 3d->DimOut function
+  for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
+  return GetChebCalc(idim)->Eval(fArgsTmp);
+  //
+}
+
+//__________________________________________________________________________________________
+inline void AliCheb3D::EvalDeriv3D(const Float_t *par, Float_t dbdr[3][3])
 {
   // return gradient matrix
   for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
@@ -214,7 +235,7 @@ inline void AliCheb3D::EvalDeriv3D(Float_t *par, Float_t dbdr[3][3])
 }
 
 //__________________________________________________________________________________________
-inline void AliCheb3D::EvalDeriv3D2(Float_t *par, Float_t dbdrdr[3][3][3])
+inline void AliCheb3D::EvalDeriv3D2(const Float_t *par, Float_t dbdrdr[3][3][3])
 {
   // return gradient matrix
   for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
@@ -223,7 +244,7 @@ inline void AliCheb3D::EvalDeriv3D2(Float_t *par, Float_t dbdrdr[3][3][3])
 }
 
 //__________________________________________________________________________________________
-inline void AliCheb3D::EvalDeriv(int dimd,Float_t  *par, Float_t  *res)
+inline void AliCheb3D::EvalDeriv(int dimd, const Float_t  *par, Float_t  *res)
 {
   // evaluate Chebyshev parameterization derivative for 3d->DimOut function
   for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
@@ -232,7 +253,7 @@ inline void AliCheb3D::EvalDeriv(int dimd,Float_t  *par, Float_t  *res)
 }
 
 //__________________________________________________________________________________________
-inline void AliCheb3D::EvalDeriv2(int dimd1,int dimd2,Float_t  *par, Float_t  *res)
+inline void AliCheb3D::EvalDeriv2(int dimd1,int dimd2, const Float_t  *par, Float_t  *res)
 {
   // evaluate Chebyshev parameterization 2nd derivative over dimd1 and dimd2 dimensions for 3d->DimOut function
   for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
@@ -241,7 +262,7 @@ inline void AliCheb3D::EvalDeriv2(int dimd1,int dimd2,Float_t  *par, Float_t  *r
 }
 
 //__________________________________________________________________________________________
-inline Float_t AliCheb3D::EvalDeriv(int dimd,Float_t  *par, int idim)
+inline Float_t AliCheb3D::EvalDeriv(int dimd, const Float_t  *par, int idim)
 {
   // evaluate Chebyshev parameterization derivative over dimd dimention for idim-th output dimension of 3d->DimOut function
   for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
@@ -250,7 +271,7 @@ inline Float_t AliCheb3D::EvalDeriv(int dimd,Float_t  *par, int idim)
 }
 
 //__________________________________________________________________________________________
-inline Float_t AliCheb3D::EvalDeriv2(int dimd1,int dimd2,Float_t  *par, int idim)
+inline Float_t AliCheb3D::EvalDeriv2(int dimd1,int dimd2, const Float_t  *par, int idim)
 {
   // evaluate Chebyshev parameterization 2ns derivative over dimd1 and dimd2 dimensions for idim-th output dimension of 3d->DimOut function
   for (int i=3;i--;) fArgsTmp[i] = MapToInternal(par[i],i);
@@ -263,7 +284,21 @@ inline Float_t AliCheb3D::MapToInternal(Float_t  x,Int_t d) const
 {
   // map x to [-1:1]
 #ifdef _BRING_TO_BOUNDARY_
-  float res = (x-fBOffset[d])*fBScale[d];
+  T res = (x-fBOffset[d])*fBScale[d];
+  if (res<-1) return -1;
+  if (res> 1) return 1;
+  return res;
+#else
+  return (x-fBOffset[d])*fBScale[d];
+#endif
+}
+
+//__________________________________________________________________________________________
+inline Double_t AliCheb3D::MapToInternal(Double_t  x,Int_t d) const
+{
+  // map x to [-1:1]
+#ifdef _BRING_TO_BOUNDARY_
+  T res = (x-fBOffset[d])*fBScale[d];
   if (res<-1) return -1;
   if (res> 1) return 1;
   return res;