ROOT logo
#ifndef ALIBALANCE_H
#define ALIBALANCE_H
/*  See cxx source for full Copyright notice */


/* $Id$ */

//-------------------------------------------------------------------------
//                          Class AliBalance
//   This is the class for the Balance Function analysis
//
//    Origin: Panos Christakoglou, UOA-CERN, Panos.Christakoglou@cern.ch
//-------------------------------------------------------------------------

#include <vector>
#include <TObject.h>
#include "TString.h"

using std::vector;

#define ANALYSIS_TYPES	7
#define MAXIMUM_NUMBER_OF_STEPS	1024

class TGraphErrors;
class TH1D;
class TH2D;

const TString kBFAnalysisType[ANALYSIS_TYPES] = {"y","eta","qlong","qout","qside","qinv","phi"};

class AliBalance : public TObject {
 public:
  enum EAnalysisType {
    kRapidity = 0, 
    kEta      = 1, 
    kQlong    = 2, 
    kQout     = 3, 
    kQside    = 4, 
    kQinv     = 5, 
    kPhi      = 6 
  };

  AliBalance();
  AliBalance(const AliBalance& balance);
  ~AliBalance();

  void SetCentralityIdentifier(const char* centralityId) {
    fCentralityId = centralityId;}
  
  void SetAnalysisLevel(const char* analysisLevel) {
    fAnalysisLevel = analysisLevel;}
  void SetShuffle(Bool_t shuffle) {fShuffle = shuffle;}
  void SetHBTcut(Bool_t HBTcut) {fHBTcut = HBTcut;}
  void SetConversionCut(Bool_t ConversionCut) {fConversionCut = ConversionCut;}
  void SetInterval(Int_t iAnalysisType, Double_t p1Start, Double_t p1Stop,
		   Int_t ibins, Double_t p2Start, Double_t p2Stop);
  void SetCentralityInterval(Double_t cStart, Double_t cStop)  { fCentStart = cStart; fCentStop = cStop;};
  void SetNp(Int_t analysisType, Double_t NpSet)   { fNp[analysisType] = NpSet; }
  void SetNn(Int_t analysisType, Double_t NnSet)   { fNn[analysisType] = NnSet; }
  void SetNpp(Int_t analysisType, Int_t ibin, Double_t NppSet) { if(ibin > -1 && ibin < MAXIMUM_NUMBER_OF_STEPS) fNpp[analysisType][ibin] = NppSet; }
  void SetNpn(Int_t analysisType, Int_t ibin, Double_t NpnSet) { if(ibin > -1 && ibin < MAXIMUM_NUMBER_OF_STEPS) fNpn[analysisType][ibin] = NpnSet; }
  void SetNnp(Int_t analysisType, Int_t ibin, Double_t NnpSet) { if(ibin > -1 && ibin < MAXIMUM_NUMBER_OF_STEPS) fNnp[analysisType][ibin] = NnpSet; }
  void SetNnn(Int_t analysisType, Int_t ibin, Double_t NnnSet) { if(ibin > -1 && ibin < MAXIMUM_NUMBER_OF_STEPS) fNnn[analysisType][ibin] = NnnSet; }

  void InitHistograms(void);

  const char* GetAnalysisLevel() {return fAnalysisLevel.Data();}
  Int_t GetNumberOfAnalyzedEvent()  const {return fAnalyzedEvents;}

  Int_t GetNumberOfBins(Int_t ibin) const {return fNumberOfBins[ibin];}
  Double_t GetP1Start(Int_t ibin)   const {return fP1Start[ibin];}
  Double_t GetP1Stop(Int_t ibin)    const {return fP1Stop[ibin];}   
  Double_t GetP2Start(Int_t ibin)   const {return fP2Start[ibin];}
  Double_t GetP2Stop(Int_t ibin)    const {return fP2Stop[ibin];}    
 
  Double_t GetNp(Int_t analysisType) const { return 1.0*fNp[analysisType]; }
  Double_t GetNn(Int_t analysisType) const { return 1.0*fNn[analysisType]; }
  Double_t GetNnn(Int_t analysisType, Int_t p2) const { 
    return 1.0*fNnn[analysisType][p2]; }
  Double_t GetNpp(Int_t analysisType, Int_t p2) const { 
    return 1.0*fNpp[analysisType][p2]; }
  Double_t GetNpn(Int_t analysisType, Int_t p2) const { 
    return 1.0*fNpn[analysisType][p2]; }  
  Double_t GetNnp(Int_t analysisType, Int_t p2) const { 
    return 1.0*fNnp[analysisType][p2]; }

  void CalculateBalance(Float_t fCentrality, vector<Double_t> **chargeVector,Float_t bSign = 0.);
  
  Double_t GetBalance(Int_t a, Int_t p2);
  Double_t GetError(Int_t a, Int_t p2);

  TH2D *GetHistNp(Int_t iAnalysisType)  const { return fHistP[iAnalysisType];}
  TH2D *GetHistNn(Int_t iAnalysisType)  const { return fHistN[iAnalysisType];}
  TH2D *GetHistNpn(Int_t iAnalysisType) const { return fHistPN[iAnalysisType];}
  TH2D *GetHistNnp(Int_t iAnalysisType) const { return fHistNP[iAnalysisType];}
  TH2D *GetHistNpp(Int_t iAnalysisType) const { return fHistPP[iAnalysisType];}
  TH2D *GetHistNnn(Int_t iAnalysisType) const { return fHistNN[iAnalysisType];}

  TH2D *GetQAHistHBTbefore()         {return fHistHBTbefore;};
  TH2D *GetQAHistHBTafter()          {return fHistHBTafter;};
  TH2D *GetQAHistConversionbefore()  {return fHistConversionbefore;};
  TH2D *GetQAHistConversionafter()   {return fHistConversionafter;};

  void PrintAnalysisSettings();
  TGraphErrors *DrawBalance(Int_t fAnalysisType);

  void SetHistNp(Int_t iAnalysisType, TH2D *gHist) { 
    fHistP[iAnalysisType] = gHist;}
  void SetHistNn(Int_t iAnalysisType, TH2D *gHist) { 
    fHistN[iAnalysisType] = gHist;}
  void SetHistNpn(Int_t iAnalysisType, TH2D *gHist) { 
    fHistPN[iAnalysisType] = gHist;}
  void SetHistNnp(Int_t iAnalysisType, TH2D *gHist) { 
    fHistNP[iAnalysisType] = gHist;}
  void SetHistNpp(Int_t iAnalysisType, TH2D *gHist) { 
    fHistPP[iAnalysisType] = gHist;}
  void SetHistNnn(Int_t iAnalysisType, TH2D *gHist) { 
    fHistNN[iAnalysisType] = gHist;}

  TH1D *GetBalanceFunctionHistogram(Int_t iAnalysisType,Double_t centrMin, Double_t centrMax, Double_t etaWindow = -1, Bool_t correctWithEfficiency = kFALSE, Bool_t correctWithAcceptanceOnly = kFALSE, Bool_t correctWithMixed = kFALSE, TH1D *hMixed[4]=NULL);
  void PrintResults(Int_t iAnalysisType, TH1D *gHist);

 private:
  inline Float_t GetDPhiStar(Float_t phi1, Float_t pt1, Float_t charge1, Float_t phi2, Float_t pt2, Float_t charge2, Float_t radius, Float_t bSign); 

  Bool_t fShuffle; // shuffled balance function object
  Bool_t fHBTcut;  // apply HBT like cuts
  Bool_t fConversionCut;  // apply conversion cuts

  TString fAnalysisLevel; //ESD, AOD or MC
  Int_t fAnalyzedEvents; //number of events that have been analyzed

  TString fCentralityId;//Centrality identifier to be used for the histo naming

  Int_t fNumberOfBins[ANALYSIS_TYPES];//number of bins of the analyzed interval
  Double_t fP1Start[ANALYSIS_TYPES];//lower boundaries for single particle histograms 
  Double_t fP1Stop[ANALYSIS_TYPES];//upper boundaries for single particle histograms 
  Double_t fP2Start[ANALYSIS_TYPES];//lower boundaries for pair histograms 
  Double_t fP2Stop[ANALYSIS_TYPES];//upper boundaries for pair histograms 
  Double_t fP2Step[ANALYSIS_TYPES];//bin size for pair histograms 
  Double_t fCentStart;//lower boundary for centrality
  Double_t fCentStop;//upper boundary for centrality

 	
  Double_t fNnn[ANALYSIS_TYPES][MAXIMUM_NUMBER_OF_STEPS]; //N(--)
  Double_t fNpp[ANALYSIS_TYPES][MAXIMUM_NUMBER_OF_STEPS]; //N(++)
  Double_t fNpn[ANALYSIS_TYPES][MAXIMUM_NUMBER_OF_STEPS]; //N(+-)
  Double_t fNnp[ANALYSIS_TYPES][MAXIMUM_NUMBER_OF_STEPS]; //N(-+)
  Double_t fNn[ANALYSIS_TYPES], fNp[ANALYSIS_TYPES]; //number of pos./neg. inside the analyzed interval
  
  Double_t fB[ANALYSIS_TYPES][MAXIMUM_NUMBER_OF_STEPS]; //BF matrix
  Double_t ferror[ANALYSIS_TYPES][MAXIMUM_NUMBER_OF_STEPS]; //error of the BF
  
  TH2D *fHistP[ANALYSIS_TYPES]; //N+
  TH2D *fHistN[ANALYSIS_TYPES]; //N-
  TH2D *fHistPN[ANALYSIS_TYPES]; //N+-
  TH2D *fHistNP[ANALYSIS_TYPES]; //N-+
  TH2D *fHistPP[ANALYSIS_TYPES]; //N++
  TH2D *fHistNN[ANALYSIS_TYPES]; //N--

  //QA histograms
  TH2D *fHistHBTbefore; // Delta Eta vs. Delta Phi before HBT inspired cuts
  TH2D *fHistHBTafter; // Delta Eta vs. Delta Phi after HBT inspired cuts
  TH2D *fHistConversionbefore; // Delta Eta vs. Delta Phi before Conversion cuts
  TH2D *fHistConversionafter; // Delta Eta vs. Delta Phi before Conversion cuts



  AliBalance & operator=(const AliBalance & ) {return *this;}

  ClassDef(AliBalance, 3)
};

Float_t AliBalance::GetDPhiStar(Float_t phi1, Float_t pt1, Float_t charge1, Float_t phi2, Float_t pt2, Float_t charge2, Float_t radius, Float_t bSign)
{ 
  //
  // calculates dphistar
  //
  
  Float_t dphistar = phi1 - phi2 - charge1 * bSign * TMath::ASin(0.075 * radius / pt1) + charge2 * bSign * TMath::ASin(0.075 * radius / pt2);
  
  static const Double_t kPi = TMath::Pi();
  
  // circularity
//   if (dphistar > 2 * kPi)
//     dphistar -= 2 * kPi;
//   if (dphistar < -2 * kPi)
//     dphistar += 2 * kPi;
  
  if (dphistar > kPi)
    dphistar = kPi * 2 - dphistar;
  if (dphistar < -kPi)
    dphistar = -kPi * 2 - dphistar;
  if (dphistar > kPi) // might look funny but is needed
    dphistar = kPi * 2 - dphistar;
  
  return dphistar;
}

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