ROOT logo
#ifndef ALICFGRIDSPARSE_H
#define ALICFGRIDSPARSE_H
//--------------------------------------------------------------------//
//                                                                    //
// AliCFGridSparse.cxx Class                                          //
// Class to handle N-dim maps for the correction Framework            // 
// uses a THnSparse to store the grid                                 //
// Author:S.Arcelli, silvia.arcelli@cern.ch
//--------------------------------------------------------------------//

#include "AliCFFrame.h"
#include "THnSparse.h"
#include "AliLog.h"
#include "TAxis.h"

class TH1D;
class TH2D;
class TH3D;

class AliCFGridSparse : public AliCFFrame
{
 public:
  AliCFGridSparse();
  AliCFGridSparse(const Char_t* name, const Char_t* title);
  AliCFGridSparse(const Char_t* name, const Char_t* title, Int_t nVarIn, const Int_t* nBinIn);
  AliCFGridSparse(const AliCFGridSparse& c);
  virtual ~AliCFGridSparse();
  AliCFGridSparse& operator=(const AliCFGridSparse& c);
  virtual void Copy(TObject& c) const;

  // AliCFFrame functions
  virtual Int_t      GetNVar() const {return fData->GetNdimensions();}
  virtual void       PrintBinLimits() const ;
  virtual void       PrintNBins() const ; 
  virtual void       SetBinLimits(Int_t ivar, Double_t min, Double_t max); // for uniform bin width only
  virtual void       SetBinLimits(Int_t ivar, const Double_t * array);     // for variable or uniform bin width
  virtual void       GetBinLimits(Int_t ivar, Double_t * array) const ;
  virtual Double_t * GetBinLimits(Int_t ivar) const ;
  virtual Long_t     GetNBinsTotal() const ;
  virtual Long_t     GetNFilledBins() const {return fData->GetNbins();}
  virtual Int_t      GetNBins(Int_t ivar) const {return fData->GetAxis(ivar)->GetNbins();}
  virtual Int_t *    GetNBins() const ;
  virtual Float_t    GetBinCenter(Int_t ivar,Int_t ibin) const ;
  virtual Float_t    GetBinSize  (Int_t ivar,Int_t ibin) const ;
  //virtual void       GetBinCenters(const Int_t *ibin, Float_t *binCenter) const ;
  //virtual void       GetBinSizes  (const Int_t *ibin, Float_t *binSizes)  const ;
  virtual TAxis    * GetAxis(Int_t ivar) const {return fData->GetAxis(ivar);}

  virtual void          SetVarTitle(Int_t ivar, const Char_t* lab) {fData->GetAxis(ivar)->SetTitle(lab);}
  virtual const Char_t* GetVarTitle(Int_t ivar) const {return GetAxis(ivar)->GetTitle();}
  virtual Int_t         GetVar(const Char_t* title) const ; // returns the variable corresponding to the given title

  // probably not needed anymore
  //virtual Int_t      GetBinIndex(const Int_t *ibin) const ;
  //virtual void       GetBinIndex(Int_t iel, const Int_t *ibin) const ;
  //virtual Int_t      GetBinIndex(Int_t ivar, Int_t ind) const ;

  virtual void    Fill(const Double_t *var, Double_t weight=1.);
  virtual Float_t GetEntries()const;
  virtual Float_t GetElement(Long_t iel)               const; 
  virtual Float_t GetElement(const Int_t *bin)         const; 
  virtual Float_t GetElement(const Double_t *var)      const; 
  virtual Float_t GetElementError(Long_t iel)          const;  
  virtual Float_t GetElementError(const Int_t *bin)    const; 
  virtual Float_t GetElementError(const Double_t *var) const; 
  virtual void    SetElement(Long_t iel, Float_t val); 
  virtual void    SetElement(const Int_t *bin, Float_t val); 
  virtual void    SetElement(const Double_t *var, Float_t val); 
  virtual void    SetElementError(Long_t iel, Float_t val); 
  virtual void    SetElementError(const Int_t *bin, Float_t val) ; 
  virtual void    SetElementError(const Double_t *var, Float_t val); 

  virtual TH1*             Project(Int_t ivar1, Int_t ivar2=-1, Int_t ivar3=-1) const {return Slice(ivar1,ivar2,ivar3,0x0,0x0,kFALSE);}
  virtual TH1*             Slice(Int_t ivar1, Int_t ivar2=-1, Int_t ivar3=-1, 
				 const Double_t *varMin=0x0, const Double_t *varMax=0x0, Bool_t useBins=0) const ; 
  virtual AliCFGridSparse* MakeSlice(Int_t nVars, const Int_t* vars,
				   const Double_t* varMin, const Double_t* varMax, Bool_t useBins=0) const ;

  virtual void             SetRangeUser(Int_t iVar, Double_t varMin, Double_t varMax, Bool_t useBins=kFALSE) const ;
  virtual void             SetRangeUser(const Double_t* varMin, const Double_t* varMax, Bool_t useBins=kFALSE) const ;
  virtual void             Smooth() ;

  //basic operations
  virtual void     SumW2();
  virtual void     Add(const AliCFGridSparse* aGrid, Double_t c=1.);
  virtual void     Add(const AliCFGridSparse* aGrid1 ,const AliCFGridSparse* aGrid2, Double_t c1=1.,Double_t c2=1.);
  virtual void     Multiply(const AliCFGridSparse* aGrid, Double_t c=1.);
  virtual void     Multiply(const AliCFGridSparse* aGrid1,const AliCFGridSparse* aGrid2, Double_t c1=1.,Double_t c2=1.);
  virtual void     Divide(const AliCFGridSparse* aGrid, Double_t c=1.);
  virtual void     Divide(const AliCFGridSparse* aGrid1, const AliCFGridSparse* aGrid2, Double_t c1=1., Double_t c2=1.,Option_t *option=0);
  virtual void     Rebin(const Int_t* group);
  virtual void     Scale(Long_t iel, const Double_t *fact); 
  virtual void     Scale(const Int_t* bin, const Double_t *fact); 
  virtual void     Scale(const Double_t* var, const Double_t *fact); 
  virtual void     Scale(const Double_t *fact); // To normalize MC to int lumi, for ex. 
  virtual Int_t    CheckStats(Double_t thr) const;
  virtual Int_t    GetSumW2() const {return fSumW2;};
  virtual Double_t GetIntegral() const;
  //virtual Double_t GetIntegral(const Double_t *varMin, const Double_t *varMax) const;
  virtual Long64_t Merge(TCollection* list);

  virtual void     SetGrid(THnSparse* grid) {if (fData) delete fData ; fData=grid;}
  THnSparse   *    GetGrid() const {return fData;}

  virtual Float_t GetOverFlows (Int_t var, Bool_t excl=kFALSE) const;
  virtual Float_t GetUnderFlows(Int_t var, Bool_t excl=kFALSE) const;
  virtual Long_t  GetEmptyBins() const;

  /*  FUNCTIONS TO REMOVE   */
  virtual AliCFGridSparse* Project(Int_t nVars, const Int_t* vars, const Double_t* varMin, const Double_t* varMax, Bool_t useBins=0) const 
  {return MakeSlice(nVars,vars,varMin,varMax,useBins);}


 protected:

  //protected functions
  void     GetScaledValues(const Double_t *fact, const Double_t *in, Double_t *out) const;
  void     SetAxisRange(TAxis* axis, Double_t min, Double_t max, Bool_t useBins) const;
  void     GetProjectionName (TString& s,Int_t var0, Int_t var1=-1, Int_t var2=-1) const;
  void     GetProjectionTitle(TString& s,Int_t var0, Int_t var1=-1, Int_t var2=-1) const;

  // data members:
  Bool_t      fSumW2    ; // Flag to check if calculation of squared weights enabled
  THnSparse  *fData     ; // The data Container: a THnSparse  

  ClassDef(AliCFGridSparse,3);
};


//inline functions :

inline Long_t AliCFGridSparse::GetNBinsTotal() const {
  Long_t n=1;
  for (Int_t iVar=0; iVar<GetNVar(); iVar++) {
    n *= fData->GetAxis(iVar)->GetNbins();
  }
  return n ;
}

inline void AliCFGridSparse::PrintNBins() const
{
  //
  // printing the array containing the # of bins  
  //
  for (Int_t i=0;i<GetNVar();i++) {
    AliInfo(Form("bins in axis %i are: %i",i,fData->GetAxis(i)->GetNbins()));
  }
} 

inline void AliCFGridSparse::PrintBinLimits() const
{
  //
  // printing the bin limits for each variable  
  //
  for (Int_t iVar=0; iVar<GetNVar(); iVar++) {
    AliInfo(Form("variable %d :",iVar));
    const Int_t nBins = GetNBins(iVar) ;
    Double_t *array = new Double_t[nBins+1];
    GetBinLimits(iVar,array);
    for (Int_t iBin=0; iBin<nBins; iBin++) {
      AliInfo(Form("    bin limit index %i is: %e",iBin,array[iBin]));
    }
    delete [] array ;
  }
}

inline void AliCFGridSparse::GetBinLimits(Int_t ivar, Double_t * array) const {
  TAxis * axis = fData->GetAxis(ivar) ;
  Int_t nBins = axis->GetNbins();
  for (Int_t iBin=0; iBin<nBins; iBin++) array[iBin] = axis->GetBinLowEdge(iBin+1);
  array[nBins] = axis->GetBinUpEdge(nBins);
}

inline Int_t* AliCFGridSparse::GetNBins() const {
  Int_t *bins = new Int_t[GetNVar()];
  for (Int_t iVar=0; iVar<GetNVar(); iVar++) {
    bins[iVar] = GetNBins(iVar) ;
  }
  return bins;
}

inline Double_t* AliCFGridSparse::GetBinLimits(Int_t ivar) const {
  Double_t * binLimits = new Double_t[GetNBins(ivar)+1] ;
  GetBinLimits(ivar,binLimits);
  return binLimits;
}

inline Int_t AliCFGridSparse::GetVar(const Char_t* title) const {
  TString str(title);
  for (Int_t iVar=0; iVar<GetNVar(); iVar++) {
    if (!str.CompareTo(GetVarTitle(iVar))) return iVar;
  }
  AliError("Variable not found");
  return -1;
}

inline void AliCFGridSparse::GetProjectionName (TString& s, Int_t var0, Int_t var1, Int_t var2) const {
  s.Form("%s_proj-%s",GetName(),GetVarTitle(var0));
  if (var1>=0) {
    s.Append(Form("-%s",GetVarTitle(var1)));
    if (var2>=0) s.Append(Form("-%s",GetVarTitle(var2)));
  }
}

inline void AliCFGridSparse::GetProjectionTitle(TString& s, Int_t var0, Int_t var1, Int_t var2) const {
  s.Form("%s: projection on %s",GetTitle(),GetVarTitle(var0));
  if (var1>=0) {
    s.Append(Form("-%s",GetVarTitle(var1)));
    if (var2>=0) s.Append(Form("-%s",GetVarTitle(var2)));
  }
}

#endif

 AliCFGridSparse.h:1
 AliCFGridSparse.h:2
 AliCFGridSparse.h:3
 AliCFGridSparse.h:4
 AliCFGridSparse.h:5
 AliCFGridSparse.h:6
 AliCFGridSparse.h:7
 AliCFGridSparse.h:8
 AliCFGridSparse.h:9
 AliCFGridSparse.h:10
 AliCFGridSparse.h:11
 AliCFGridSparse.h:12
 AliCFGridSparse.h:13
 AliCFGridSparse.h:14
 AliCFGridSparse.h:15
 AliCFGridSparse.h:16
 AliCFGridSparse.h:17
 AliCFGridSparse.h:18
 AliCFGridSparse.h:19
 AliCFGridSparse.h:20
 AliCFGridSparse.h:21
 AliCFGridSparse.h:22
 AliCFGridSparse.h:23
 AliCFGridSparse.h:24
 AliCFGridSparse.h:25
 AliCFGridSparse.h:26
 AliCFGridSparse.h:27
 AliCFGridSparse.h:28
 AliCFGridSparse.h:29
 AliCFGridSparse.h:30
 AliCFGridSparse.h:31
 AliCFGridSparse.h:32
 AliCFGridSparse.h:33
 AliCFGridSparse.h:34
 AliCFGridSparse.h:35
 AliCFGridSparse.h:36
 AliCFGridSparse.h:37
 AliCFGridSparse.h:38
 AliCFGridSparse.h:39
 AliCFGridSparse.h:40
 AliCFGridSparse.h:41
 AliCFGridSparse.h:42
 AliCFGridSparse.h:43
 AliCFGridSparse.h:44
 AliCFGridSparse.h:45
 AliCFGridSparse.h:46
 AliCFGridSparse.h:47
 AliCFGridSparse.h:48
 AliCFGridSparse.h:49
 AliCFGridSparse.h:50
 AliCFGridSparse.h:51
 AliCFGridSparse.h:52
 AliCFGridSparse.h:53
 AliCFGridSparse.h:54
 AliCFGridSparse.h:55
 AliCFGridSparse.h:56
 AliCFGridSparse.h:57
 AliCFGridSparse.h:58
 AliCFGridSparse.h:59
 AliCFGridSparse.h:60
 AliCFGridSparse.h:61
 AliCFGridSparse.h:62
 AliCFGridSparse.h:63
 AliCFGridSparse.h:64
 AliCFGridSparse.h:65
 AliCFGridSparse.h:66
 AliCFGridSparse.h:67
 AliCFGridSparse.h:68
 AliCFGridSparse.h:69
 AliCFGridSparse.h:70
 AliCFGridSparse.h:71
 AliCFGridSparse.h:72
 AliCFGridSparse.h:73
 AliCFGridSparse.h:74
 AliCFGridSparse.h:75
 AliCFGridSparse.h:76
 AliCFGridSparse.h:77
 AliCFGridSparse.h:78
 AliCFGridSparse.h:79
 AliCFGridSparse.h:80
 AliCFGridSparse.h:81
 AliCFGridSparse.h:82
 AliCFGridSparse.h:83
 AliCFGridSparse.h:84
 AliCFGridSparse.h:85
 AliCFGridSparse.h:86
 AliCFGridSparse.h:87
 AliCFGridSparse.h:88
 AliCFGridSparse.h:89
 AliCFGridSparse.h:90
 AliCFGridSparse.h:91
 AliCFGridSparse.h:92
 AliCFGridSparse.h:93
 AliCFGridSparse.h:94
 AliCFGridSparse.h:95
 AliCFGridSparse.h:96
 AliCFGridSparse.h:97
 AliCFGridSparse.h:98
 AliCFGridSparse.h:99
 AliCFGridSparse.h:100
 AliCFGridSparse.h:101
 AliCFGridSparse.h:102
 AliCFGridSparse.h:103
 AliCFGridSparse.h:104
 AliCFGridSparse.h:105
 AliCFGridSparse.h:106
 AliCFGridSparse.h:107
 AliCFGridSparse.h:108
 AliCFGridSparse.h:109
 AliCFGridSparse.h:110
 AliCFGridSparse.h:111
 AliCFGridSparse.h:112
 AliCFGridSparse.h:113
 AliCFGridSparse.h:114
 AliCFGridSparse.h:115
 AliCFGridSparse.h:116
 AliCFGridSparse.h:117
 AliCFGridSparse.h:118
 AliCFGridSparse.h:119
 AliCFGridSparse.h:120
 AliCFGridSparse.h:121
 AliCFGridSparse.h:122
 AliCFGridSparse.h:123
 AliCFGridSparse.h:124
 AliCFGridSparse.h:125
 AliCFGridSparse.h:126
 AliCFGridSparse.h:127
 AliCFGridSparse.h:128
 AliCFGridSparse.h:129
 AliCFGridSparse.h:130
 AliCFGridSparse.h:131
 AliCFGridSparse.h:132
 AliCFGridSparse.h:133
 AliCFGridSparse.h:134
 AliCFGridSparse.h:135
 AliCFGridSparse.h:136
 AliCFGridSparse.h:137
 AliCFGridSparse.h:138
 AliCFGridSparse.h:139
 AliCFGridSparse.h:140
 AliCFGridSparse.h:141
 AliCFGridSparse.h:142
 AliCFGridSparse.h:143
 AliCFGridSparse.h:144
 AliCFGridSparse.h:145
 AliCFGridSparse.h:146
 AliCFGridSparse.h:147
 AliCFGridSparse.h:148
 AliCFGridSparse.h:149
 AliCFGridSparse.h:150
 AliCFGridSparse.h:151
 AliCFGridSparse.h:152
 AliCFGridSparse.h:153
 AliCFGridSparse.h:154
 AliCFGridSparse.h:155
 AliCFGridSparse.h:156
 AliCFGridSparse.h:157
 AliCFGridSparse.h:158
 AliCFGridSparse.h:159
 AliCFGridSparse.h:160
 AliCFGridSparse.h:161
 AliCFGridSparse.h:162
 AliCFGridSparse.h:163
 AliCFGridSparse.h:164
 AliCFGridSparse.h:165
 AliCFGridSparse.h:166
 AliCFGridSparse.h:167
 AliCFGridSparse.h:168
 AliCFGridSparse.h:169
 AliCFGridSparse.h:170
 AliCFGridSparse.h:171
 AliCFGridSparse.h:172
 AliCFGridSparse.h:173
 AliCFGridSparse.h:174
 AliCFGridSparse.h:175
 AliCFGridSparse.h:176
 AliCFGridSparse.h:177
 AliCFGridSparse.h:178
 AliCFGridSparse.h:179
 AliCFGridSparse.h:180
 AliCFGridSparse.h:181
 AliCFGridSparse.h:182
 AliCFGridSparse.h:183
 AliCFGridSparse.h:184
 AliCFGridSparse.h:185
 AliCFGridSparse.h:186
 AliCFGridSparse.h:187
 AliCFGridSparse.h:188
 AliCFGridSparse.h:189
 AliCFGridSparse.h:190
 AliCFGridSparse.h:191
 AliCFGridSparse.h:192
 AliCFGridSparse.h:193
 AliCFGridSparse.h:194
 AliCFGridSparse.h:195
 AliCFGridSparse.h:196
 AliCFGridSparse.h:197
 AliCFGridSparse.h:198
 AliCFGridSparse.h:199
 AliCFGridSparse.h:200
 AliCFGridSparse.h:201
 AliCFGridSparse.h:202
 AliCFGridSparse.h:203
 AliCFGridSparse.h:204
 AliCFGridSparse.h:205
 AliCFGridSparse.h:206
 AliCFGridSparse.h:207
 AliCFGridSparse.h:208
 AliCFGridSparse.h:209
 AliCFGridSparse.h:210
 AliCFGridSparse.h:211
 AliCFGridSparse.h:212
 AliCFGridSparse.h:213
 AliCFGridSparse.h:214