ROOT logo
#ifndef ALICFCONTAINER_H
#define ALICFCONTAINER_H

/* $Id$ */

//--------------------------------------------------------------------//
//                                                                    //
// AliCFContainer Class                                               //
// Class to handle input data for correction Framework                // 
//                                                                    //
//--------------------------------------------------------------------//

#include "AliCFFrame.h"
#include "AliCFGridSparse.h"

class TH1D;
class TH2D;
class TH3D;
class TCollection;

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

  virtual ~AliCFContainer();

  // AliCFFrame functions
  virtual Int_t      GetNVar()                                       const {return fGrid[0]->GetNVar();}
  virtual void       PrintBinLimits()                                const {fGrid[0]->PrintBinLimits();}
  virtual void       PrintNBins()                                    const {fGrid[0]->PrintNBins();}
  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       SetBinLabel (Int_t ivar,Int_t ibin, const Char_t* label);// set a label to bin ibin on axis ivar
  virtual void       SetBinContent(Int_t* bin, Int_t step, Double_t value);
  virtual void       SetBinError  (Int_t* bin, Int_t step, Double_t value);
  virtual void       GetBinLimits(Int_t ivar, Double_t * array)      const {return fGrid[0]->GetBinLimits(ivar,array);}
  virtual Double_t * GetBinLimits(Int_t ivar)                        const {return fGrid[0]->GetBinLimits(ivar);}
  virtual Long_t     GetNBinsTotal()                                 const {return fGrid[0]->GetNBinsTotal()*fNStep;}
  virtual Int_t      GetNBins(Int_t ivar)                            const {return fGrid[0]->GetNBins(ivar);}
  virtual Int_t    * GetNBins()                                      const {return fGrid[0]->GetNBins();}
  virtual Float_t    GetBinCenter(Int_t ivar,Int_t ibin)             const {return fGrid[0]->GetBinCenter(ivar,ibin);}
  virtual Float_t    GetBinSize  (Int_t ivar,Int_t ibin)             const {return fGrid[0]->GetBinSize  (ivar,ibin);}
  virtual Float_t    GetBinContent(const Int_t* coordinates, Int_t step) const {return fGrid[step]->GetGrid()->GetBinContent(coordinates);}
  virtual Float_t    GetBinError  (const Int_t* coordinates, Int_t step) const {return fGrid[step]->GetGrid()->GetBinError  (coordinates);}
  virtual const Char_t* GetBinLabel (Int_t ivar,Int_t ibin)          const {return GetAxis(ivar,0)->GetBinLabel(ibin);}

  virtual void       Print(const Option_t*) const ;

  virtual TAxis       * GetAxis(Int_t ivar, Int_t istep) const {return fGrid[istep]->GetAxis(ivar);}
  virtual void          SetVarTitle (Int_t ivar,  const Char_t* title) ;
  virtual void          SetStepTitle(Int_t istep, const Char_t* title) ;
  virtual const Char_t* GetVarTitle (Int_t ivar)  const {return GetAxis(ivar,0)->GetTitle();}
  virtual const Char_t* GetStepTitle(Int_t istep) const {return fGrid[istep]->GetTitle();}
  virtual Int_t         GetStep(const Char_t* title) const ; // returns the step     corresponding to the given title
  virtual Int_t         GetVar (const Char_t* title) const ; // returns the variable corresponding to the given title

  virtual Int_t GetNStep() const {return fNStep;};
  virtual void  SetNStep(Int_t nStep) {fNStep=nStep;}
  virtual void  Fill(const Double_t *var, Int_t istep, Double_t weight=1.) ;

  virtual Float_t  GetOverFlows (Int_t var,Int_t istep,Bool_t excl=kFALSE) const;
  virtual Float_t  GetUnderFlows(Int_t var,Int_t istep,Bool_t excl=kFALSE) const ;
  virtual Float_t  GetEntries  (Int_t istep) const ;
  virtual Long_t   GetEmptyBins(Int_t istep) const {return fGrid[istep]->GetEmptyBins();}
  virtual Double_t GetIntegral (Int_t istep) const ;

  //basic operations
  virtual void     Add(const AliCFContainer* aContainerToAdd, Double_t c=1.);
  virtual Long64_t Merge(TCollection* list);

  virtual TH1* Project (Int_t istep, Int_t ivar1, Int_t ivar2=-1 ,Int_t ivar3=-1) const;
  virtual AliCFContainer* MakeSlice(Int_t nVars, const Int_t* vars, const Double_t* varMin=0x0, const Double_t* varMax=0x0, Bool_t useBins=0) const ;
  virtual AliCFContainer* MakeSlice(Int_t nStep, const Int_t* steps, 
				    Int_t nVars, const Int_t* vars, const Double_t* varMin=0x0, const Double_t* varMax=0x0, 
				    Bool_t useBins=0) const ;
  virtual void  Smooth(Int_t istep) {GetGrid(istep)->Smooth();}

  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  SetGrid(Int_t step, AliCFGridSparse* grid) {if (fGrid[step]) delete fGrid[step]; fGrid[step]=grid;}
  virtual AliCFGridSparse * GetGrid(Int_t istep) const {return fGrid[istep];};

  virtual void  Scale(Double_t factor) const;

  /****   TO BE REMOVED SOON ******/
  virtual TH1D* ShowProjection( Int_t ivar,  Int_t istep)                          const {return (TH1D*)Project(istep,ivar);}
  virtual TH2D* ShowProjection( Int_t ivar1, Int_t ivar2, Int_t istep)             const {return (TH2D*)Project(istep,ivar1,ivar2);}
  virtual TH3D* ShowProjection( Int_t ivar1, Int_t ivar2,Int_t ivar3, Int_t istep) const {return (TH3D*)Project(istep,ivar1,ivar2,ivar3);}
  
 private:
  Int_t    fNStep; //number of selection steps
  AliCFGridSparse **fGrid;//[fNStep]
  
  ClassDef(AliCFContainer,5);
};

inline void AliCFContainer::SetBinLimits(Int_t ivar, const Double_t* array) {
  for (Int_t iStep=0; iStep<GetNStep(); iStep++) {
    fGrid[iStep]->SetBinLimits(ivar,array);
  }
}

inline void AliCFContainer::SetBinLimits(Int_t ivar, Double_t min, Double_t max) {
  for (Int_t iStep=0; iStep<GetNStep(); iStep++) {
    fGrid[iStep]->SetBinLimits(ivar,min,max);
  }
}

inline void AliCFContainer::SetVarTitle(Int_t ivar, const Char_t* title) {
  for (Int_t iStep=0; iStep<fNStep; iStep++) {
    GetAxis(ivar,iStep)->SetTitle(title);
  }
}

inline void AliCFContainer::SetStepTitle(Int_t istep, const Char_t* title) {
  fGrid[istep]->SetTitle(title);
}

inline Int_t AliCFContainer::GetStep(const Char_t* title) const {
  TString str(title);
  for (Int_t iStep=0; iStep<fNStep; iStep++) {
    if (!str.CompareTo(GetStepTitle(iStep))) return iStep;
  }
  AliError("Step not found");
  return -1;
}

inline Int_t AliCFContainer::GetVar(const Char_t* title) const {
  return fGrid[0]->GetVar(title);
}

inline void AliCFContainer::SetBinLabel(Int_t iVar, Int_t iBin, const Char_t* label) {
  for (Int_t iStep=0; iStep<GetNStep(); iStep++) GetAxis(iVar,iStep)->SetBinLabel(iBin,label);
}

inline void  AliCFContainer::Scale(Double_t factor) const {
  Double_t fact[2] = {factor,0} ;
  for (Int_t iStep=0; iStep<fNStep; iStep++) fGrid[iStep]->Scale(fact);
}

inline void AliCFContainer::SetBinContent(Int_t* bin, Int_t step, Double_t value) {
  // sets the content 'value' to the current container, at step 'step'
  // 'bin' is the array of the bin coordinates
  GetGrid(step)->GetGrid()->SetBinContent(bin,value);
}

inline void AliCFContainer::SetBinError(Int_t* bin, Int_t step, Double_t value) {
  // sets the error 'value' to the current container, at step 'step'
  // 'bin' is the array of the bin coordinates
  GetGrid(step)->GetGrid()->SetBinError(bin,value);
}

#endif

 AliCFContainer.h:1
 AliCFContainer.h:2
 AliCFContainer.h:3
 AliCFContainer.h:4
 AliCFContainer.h:5
 AliCFContainer.h:6
 AliCFContainer.h:7
 AliCFContainer.h:8
 AliCFContainer.h:9
 AliCFContainer.h:10
 AliCFContainer.h:11
 AliCFContainer.h:12
 AliCFContainer.h:13
 AliCFContainer.h:14
 AliCFContainer.h:15
 AliCFContainer.h:16
 AliCFContainer.h:17
 AliCFContainer.h:18
 AliCFContainer.h:19
 AliCFContainer.h:20
 AliCFContainer.h:21
 AliCFContainer.h:22
 AliCFContainer.h:23
 AliCFContainer.h:24
 AliCFContainer.h:25
 AliCFContainer.h:26
 AliCFContainer.h:27
 AliCFContainer.h:28
 AliCFContainer.h:29
 AliCFContainer.h:30
 AliCFContainer.h:31
 AliCFContainer.h:32
 AliCFContainer.h:33
 AliCFContainer.h:34
 AliCFContainer.h:35
 AliCFContainer.h:36
 AliCFContainer.h:37
 AliCFContainer.h:38
 AliCFContainer.h:39
 AliCFContainer.h:40
 AliCFContainer.h:41
 AliCFContainer.h:42
 AliCFContainer.h:43
 AliCFContainer.h:44
 AliCFContainer.h:45
 AliCFContainer.h:46
 AliCFContainer.h:47
 AliCFContainer.h:48
 AliCFContainer.h:49
 AliCFContainer.h:50
 AliCFContainer.h:51
 AliCFContainer.h:52
 AliCFContainer.h:53
 AliCFContainer.h:54
 AliCFContainer.h:55
 AliCFContainer.h:56
 AliCFContainer.h:57
 AliCFContainer.h:58
 AliCFContainer.h:59
 AliCFContainer.h:60
 AliCFContainer.h:61
 AliCFContainer.h:62
 AliCFContainer.h:63
 AliCFContainer.h:64
 AliCFContainer.h:65
 AliCFContainer.h:66
 AliCFContainer.h:67
 AliCFContainer.h:68
 AliCFContainer.h:69
 AliCFContainer.h:70
 AliCFContainer.h:71
 AliCFContainer.h:72
 AliCFContainer.h:73
 AliCFContainer.h:74
 AliCFContainer.h:75
 AliCFContainer.h:76
 AliCFContainer.h:77
 AliCFContainer.h:78
 AliCFContainer.h:79
 AliCFContainer.h:80
 AliCFContainer.h:81
 AliCFContainer.h:82
 AliCFContainer.h:83
 AliCFContainer.h:84
 AliCFContainer.h:85
 AliCFContainer.h:86
 AliCFContainer.h:87
 AliCFContainer.h:88
 AliCFContainer.h:89
 AliCFContainer.h:90
 AliCFContainer.h:91
 AliCFContainer.h:92
 AliCFContainer.h:93
 AliCFContainer.h:94
 AliCFContainer.h:95
 AliCFContainer.h:96
 AliCFContainer.h:97
 AliCFContainer.h:98
 AliCFContainer.h:99
 AliCFContainer.h:100
 AliCFContainer.h:101
 AliCFContainer.h:102
 AliCFContainer.h:103
 AliCFContainer.h:104
 AliCFContainer.h:105
 AliCFContainer.h:106
 AliCFContainer.h:107
 AliCFContainer.h:108
 AliCFContainer.h:109
 AliCFContainer.h:110
 AliCFContainer.h:111
 AliCFContainer.h:112
 AliCFContainer.h:113
 AliCFContainer.h:114
 AliCFContainer.h:115
 AliCFContainer.h:116
 AliCFContainer.h:117
 AliCFContainer.h:118
 AliCFContainer.h:119
 AliCFContainer.h:120
 AliCFContainer.h:121
 AliCFContainer.h:122
 AliCFContainer.h:123
 AliCFContainer.h:124
 AliCFContainer.h:125
 AliCFContainer.h:126
 AliCFContainer.h:127
 AliCFContainer.h:128
 AliCFContainer.h:129
 AliCFContainer.h:130
 AliCFContainer.h:131
 AliCFContainer.h:132
 AliCFContainer.h:133
 AliCFContainer.h:134
 AliCFContainer.h:135
 AliCFContainer.h:136
 AliCFContainer.h:137
 AliCFContainer.h:138
 AliCFContainer.h:139
 AliCFContainer.h:140
 AliCFContainer.h:141
 AliCFContainer.h:142
 AliCFContainer.h:143
 AliCFContainer.h:144
 AliCFContainer.h:145
 AliCFContainer.h:146
 AliCFContainer.h:147
 AliCFContainer.h:148
 AliCFContainer.h:149
 AliCFContainer.h:150
 AliCFContainer.h:151
 AliCFContainer.h:152
 AliCFContainer.h:153
 AliCFContainer.h:154
 AliCFContainer.h:155
 AliCFContainer.h:156
 AliCFContainer.h:157
 AliCFContainer.h:158
 AliCFContainer.h:159
 AliCFContainer.h:160