ROOT logo
#ifndef AliUEHist_H
#define AliUEHist_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id: AliUEHist.h 20164 2007-08-14 15:31:50Z morsch $ */

// encapsulate histogram and corrections for one underlying event histogram

#include "TObject.h"
#include "TString.h"

class AliCFContainer;
class TH1;
class TH1F;
class TH3;
class TH3F;
class TH1D;
class TH2;
class TH2D;
class TCollection;
class AliCFGridSparse;
class THnSparse;
class THnBase;

class AliUEHist : public TObject
{
 public:
  AliUEHist(const char* reqHist = "", const char* binning = 0);
  virtual ~AliUEHist();
  
  const UInt_t fkRegions;
  enum Region { kToward = 0, kAway, kMin, kMax };
  
  static const Int_t fgkCFSteps;
  enum CFStep { kCFStepAll = 0, kCFStepTriggered, kCFStepVertex, kCFStepAnaTopology, kCFStepTrackedOnlyPrim, kCFStepTracked, kCFStepReconstructed, kCFStepRealLeading, kCFStepBiasStudy, kCFStepBiasStudy2, kCFStepCorrected };
  
  const char* GetRegionTitle(Region region);
  const char* GetStepTitle(CFStep step);
  
  AliCFContainer* GetTrackHist(Region region) { return fTrackHist[region]; }
  AliCFContainer* GetEventHist() { return fEventHist; }
  AliCFContainer* GetTrackHistEfficiency()     { return fTrackHistEfficiency; }
  TH3F* GetMCRecoPtCorrelation() { return fFakePt; } 
 
  void SetTrackHist(Region region, AliCFContainer* hist) { fTrackHist[region] = hist; }
  void SetEventHist(AliCFContainer* hist) { fEventHist = hist; }
  void SetTrackHistEfficiency(AliCFContainer* hist) { fTrackHistEfficiency = hist; }
  
  void CopyReconstructedData(AliUEHist* from);
  void DeepCopy(AliUEHist* from);
  
  TH1* GetUEHist(CFStep step, Region region, Float_t ptLeadMin = -1, Float_t ptLeadMax = -1, Int_t multBinBegin = 0, Int_t multBinEnd = -1, Int_t twoD = 0, Bool_t etaNorm = kTRUE, Long64_t* normEvents = 0);
  TH1* GetPtHist(CFStep step, Region region, Float_t ptLeadMin, Float_t ptLeadMax, Int_t multBinBegin, Int_t multBinEnd, Float_t phiMin, Float_t phiMax, Float_t etaMin, Float_t etaMax, Bool_t skipPhiNormalization = kFALSE);
  TH2* GetSumOfRatios(AliUEHist* mixed, CFStep step, Region region, Float_t ptLeadMin, Float_t ptLeadMax, Int_t multBinBegin, Int_t multBinEnd, Bool_t etaNorm = kTRUE, Bool_t useVertexBins = kFALSE);
  
  void GetHistsZVtx(AliUEHist::CFStep step, AliUEHist::Region region, Float_t ptLeadMin, Float_t ptLeadMax, Int_t multBinBegin, Int_t multBinEnd, TH3** trackHist, TH1** eventHist);
  void GetHistsZVtxMult(AliUEHist::CFStep step, AliUEHist::Region region, Float_t ptLeadMin, Float_t ptLeadMax, THnBase** trackHist, TH2** eventHist);
  
  TH2* GetSumOfRatios2(AliUEHist* mixed, AliUEHist::CFStep step, AliUEHist::Region region, Float_t ptLeadMin, Float_t ptLeadMax, Int_t multBinBegin, Int_t multBinEnd, Bool_t normalizePerTrigger = kTRUE, Int_t stepForMixed = -1, Int_t *trigger = NULL);
  
  TH1* GetTriggersAsFunctionOfMultiplicity(AliUEHist::CFStep step, Float_t ptLeadMin, Float_t ptLeadMax);

  TH1* GetTrackEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_t axis2 = -1, Int_t source = 1, Int_t axis3 = -1);
  THnBase* GetTrackEfficiencyND(CFStep step1, CFStep step2);
  TH1* GetEventEfficiency(CFStep step1, CFStep step2, Int_t axis1, Int_t axis2 = -1, Float_t ptLeadMin = -1, Float_t ptLeadMax = -1);
  TH1* GetBias(CFStep step1, CFStep step2, Int_t region, const char* axis, Float_t leadPtMin = 0, Float_t leadPtMax = -1, Int_t weighting = 0);
  
  TH1D* GetTrackingEfficiency(Int_t axis);
  TH2D* GetTrackingEfficiency();
  TH2D* GetTrackingEfficiencyCentrality();
  
  TH2D* GetFakeRate();
  TH1D* GetFakeRate(Int_t axis);

  TH1D* GetTrackingContamination(Int_t axis);
  TH2D* GetTrackingContamination();
  TH2D* GetTrackingContaminationCentrality();
  
  TH1D* GetTrackingCorrection(Int_t axis);
  TH2D* GetTrackingCorrection();
  
  TH1D* GetTrackingEfficiencyCorrection(Int_t axis);
  TH2D* GetTrackingEfficiencyCorrection();
  TH2D* GetTrackingEfficiencyCorrectionCentrality();
  
  TH2* GetCorrelatedContamination();

  void ExtendTrackingEfficiency(Bool_t verbose = kFALSE);
  
  void Correct(AliUEHist* corrections);
  void CorrectTracks(CFStep step1, CFStep step2, TH1* trackCorrection, Int_t var1, Int_t var2 = -1);
  void CorrectTracks(CFStep step1, CFStep step2, Int_t region, TH1* trackCorrection, Int_t var1, Int_t var2 = -1);
  void CorrectEvents(CFStep step1, CFStep step2, TH1* eventCorrection, Int_t var1, Int_t var2 = -1);
  void CorrectCorrelatedContamination(CFStep step1, Int_t region, TH1* trackCorrection);
  
  void CondenseBin(THnSparse* grid, THnSparse* target, Int_t axis, Float_t targetValue, Float_t from, Float_t to);
  void CondenseBin(CFStep step, Int_t trackAxis, Int_t eventAxis, Float_t targetValue, Float_t from = 0, Float_t to = -1, CFStep tmpStep = AliUEHist::kCFStepBiasStudy2);
  void SymmetrizepTBins();
  
  void SetCombineMinMax(Bool_t flag) { fCombineMinMax = flag; }
  
  void SetEtaRange(Float_t etaMin, Float_t etaMax) { fEtaMin = etaMin; fEtaMax = etaMax; }
  void SetPtRange(Float_t ptMin, Float_t ptMax)    { fPtMin = ptMin; fPtMax = ptMax; }
  void SetPartSpecies(Int_t species)    { fPartSpecies = species;}
  void SetCentralityRange(Float_t min, Float_t max)    { fCentralityMin = min; fCentralityMax = max; }
  void SetZVtxRange(Float_t min, Float_t max)          { fZVtxMin = min; fZVtxMax = max; }
  void SetPt2Min(Float_t ptMin)			       { fPt2Min = ptMin; }
  
  Float_t GetTrackEtaCut() { return fTrackEtaCut; }
  void SetTrackEtaCut(Float_t value) { fTrackEtaCut = value; }
  void SetWeightPerEvent(Bool_t flag)   { fWeightPerEvent = flag; }
  void SetSkipScaleMixedEvent(Bool_t flag)  { fSkipScaleMixedEvent = flag; }
  
  void SetContaminationEnhancement(TH1F* hist)    { fContaminationEnhancement = hist; }
  
  void SetHistogramType(const char* histogramType)  { fHistogramType = histogramType; }
  
  void CountEmptyBins(AliUEHist::CFStep step, Float_t ptLeadMin, Float_t ptLeadMax);
  
  void AdditionalDPhiCorrection(Int_t step);
  
  void SetBinLimits(AliCFGridSparse* grid);
  void SetBinLimits(THnBase* grid);

  void ResetBinLimits(AliCFGridSparse* grid);
  void ResetBinLimits(THnBase* grid);
  
  void SetGetMultCache(Bool_t flag = kTRUE) { fGetMultCacheOn = flag; }
  
  AliUEHist(const AliUEHist &c);
  AliUEHist& operator=(const AliUEHist& corr);
  virtual void Copy(TObject& c) const;

  virtual Long64_t Merge(TCollection* list);
  void Scale(Double_t factor);
  void Reset();
  THnBase* ChangeToThn(THnBase* sparse);
  
  static TString CombineBinning(TString defaultBinning, TString customBinning);
  
protected:
  Double_t* GetBinning(const char* configuration, const char* tag, Int_t& nBins);
  void SetStepNames(AliCFContainer* container);
  void WeightHistogram(TH3* hist1, TH1* hist2);
  void MultiplyHistograms(THnSparse* grid, THnSparse* target, TH1* histogram, Int_t var1, Int_t var2);

  AliCFContainer* fTrackHist[4];      // container for track level distributions in four regions (toward, away, min, max) and at all analysis steps
  AliCFContainer* fEventHist;         // container for event level distribution at all analysis steps
  AliCFContainer* fTrackHistEfficiency; // container for tracking efficiency and contamination (all particles filled including leading one): axes: eta, pT, particle species
  TH3F* fFakePt;
 
  Float_t fEtaMin;                    // eta min for projections
  Float_t fEtaMax;                    // eta max for projections
  Float_t fPtMin;                     // pT min for projections (for track pT, not pT,lead)
  Float_t fPtMax;                     // pT max for projections (for track pT, not pT,lead)
  Int_t fPartSpecies;                   // Particle species for projections 
  Float_t fCentralityMin;             // centrality min for projections
  Float_t fCentralityMax;             // centrality max for projections
  Float_t fZVtxMin;                   // z vtx min for projections
  Float_t fZVtxMax;                   // z vtx max for projections
  Float_t fPt2Min;		      // pT min for projections (for pT,2 (only 2+1 corr case))
  
  TH1F* fContaminationEnhancement;    // histogram that contains the underestimation of secondaries in the MC as function of pT
  
  Bool_t fCombineMinMax;              // flag to combine min and max to a general towards region
  Float_t fTrackEtaCut;               // cut used during production of histograms (needed for finite bin correction in GetSumOfRatios)
  Bool_t fWeightPerEvent;	      // weight with the number of trigger particles per event
  Bool_t fSkipScaleMixedEvent;        // scale the mixed event with (0, 0) plus finite bin correction (default: kTRUE)
  
  AliCFContainer* fCache;             //! cache variable for GetTrackEfficiency
  
  Bool_t fGetMultCacheOn;             //! cache for GetHistsZVtxMult function active
  THnBase* fGetMultCache;             //! cache for GetHistsZVtxMult function
  
  TString fHistogramType;             // what is stored in this histogram
  
  ClassDef(AliUEHist, 15) // underlying event histogram container
};

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