#ifndef ALIBALANCEPSI_H
#define ALIBALANCEPSI_H
#include <vector>
#include <TObject.h>
#include "TString.h"
#include "TH2D.h"
#include "AliTHn.h"
using std::vector;
#define ANALYSIS_TYPES 7
#define MAXIMUM_NUMBER_OF_STEPS 1024
#define MAXIMUM_STEPS_IN_PSI 360
class TH1D;
class TH2D;
class TH3D;
const Int_t kTrackVariablesSingle = 3;
const Int_t kTrackVariablesPair = 6;
const TString gBFPsiAnalysisType[ANALYSIS_TYPES] = {"y","eta","qlong","qout","qside","qinv","phi"};
class AliBalancePsi : public TObject {
public:
enum EAnalysisType {
kRapidity = 0,
kEta = 1,
kQlong = 2,
kQout = 3,
kQside = 4,
kQinv = 5,
kPhi = 6
};
AliBalancePsi();
AliBalancePsi(const AliBalancePsi& balance);
~AliBalancePsi();
void SetCentralityIdentifier(const char* centralityId) {
fCentralityId = centralityId;}
void SetAnalysisLevel(const char* analysisLevel) {
fAnalysisLevel = analysisLevel;}
void SetShuffle(Bool_t shuffle) {fShuffle = shuffle;}
void SetCentralityInterval(Double_t cStart, Double_t cStop) { fCentStart = cStart; fCentStop = cStop;};
void SetEventClass(TString receivedEventClass){ fEventClass = receivedEventClass; }
void SetDeltaEtaMax(Double_t receivedDeltaEtaMax){ fDeltaEtaMax = receivedDeltaEtaMax; }
void SetVertexZBinning(Bool_t receivedVertexBinning=kTRUE){ fVertexBinning = receivedVertexBinning; }
void SetCustomBinning(TString receivedCustomBinning) { fCustomBinning = receivedCustomBinning; }
void InitHistograms(void);
const char* GetAnalysisLevel() {return fAnalysisLevel.Data();}
Int_t GetNumberOfAnalyzedEvent() {return fAnalyzedEvents;}
void CalculateBalance(Double_t gReactionPlane,
TObjArray* particles,
TObjArray* particlesMixed,
Float_t bSign,
Double_t kMultorCent = -100,
Double_t vertexZ = 0);
TH2D *GetCorrelationFunction(TString type,
Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1,
AliBalancePsi *bMixed=NULL,
Bool_t normToTrig = kFALSE,
Double_t normalizationRangePhi = TMath::Pi()/6.);
TH2D *GetCorrelationFunctionPN(Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1);
TH2D *GetCorrelationFunctionNP(Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1);
TH2D *GetCorrelationFunctionPP(Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1);
TH2D *GetCorrelationFunctionNN(Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1);
TH2D *GetCorrelationFunctionChargeIndependent(Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1);
AliTHn *GetHistNp() {return fHistP;}
AliTHn *GetHistNn() {return fHistN;}
AliTHn *GetHistNpn() {return fHistPN;}
AliTHn *GetHistNnp() {return fHistNP;}
AliTHn *GetHistNpp() {return fHistPP;}
AliTHn *GetHistNnn() {return fHistNN;}
void SetHistNp(AliTHn *gHist) {
fHistP = gHist; }
void SetHistNn(AliTHn *gHist) {
fHistN = gHist; }
void SetHistNpn(AliTHn *gHist) {
fHistPN = gHist; }
void SetHistNnp(AliTHn *gHist) {
fHistNP = gHist; }
void SetHistNpp(AliTHn *gHist) {
fHistPP = gHist; }
void SetHistNnn(AliTHn *gHist) {
fHistNN = gHist; }
TH1D *GetBalanceFunctionHistogram(Int_t iVariableSingle,
Int_t iVariablePair,
Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1);
TH1D *GetBalanceFunctionHistogram2pMethod(Int_t iVariableSingle,
Int_t iVariablePair,
Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1,
AliBalancePsi *bfMix=NULL);
TH2D *GetBalanceFunctionDeltaEtaDeltaPhi(Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1);
TH2D *GetBalanceFunctionDeltaEtaDeltaPhi2pMethod(Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1.,
AliBalancePsi *bfMix=NULL);
TH1D *GetBalanceFunction1DFrom2D2pMethod(Bool_t bPhi,
Double_t psiMin, Double_t psiMax,
Double_t vertexZMin=-1,
Double_t vertexZMax=-1,
Double_t ptTriggerMin=-1.,
Double_t ptTriggerMax=-1.,
Double_t ptAssociatedMin=-1.,
Double_t ptAssociatedMax=-1.,
AliBalancePsi *bfMix=NULL);
Bool_t GetMomentsAnalytical(Int_t fVariable, TH1D* gHist, Bool_t kUseZYAM,
Double_t &mean, Double_t &meanError,
Double_t &sigma, Double_t &sigmaError,
Double_t &skewness, Double_t &skewnessError,
Double_t &kurtosis, Double_t &kurtosisError);
Double_t GetFWHM(Int_t gDeltaEtaPhi, TH1D* gHist,
Double_t &fwhm_spline, Double_t &fwhmError);
TH2D *GetQAHistHBTbefore() {return fHistHBTbefore;}
TH2D *GetQAHistHBTafter() {return fHistHBTafter;}
TH3D *GetQAHistConversionbefore() {return fHistConversionbefore;}
TH3D *GetQAHistConversionafter() {return fHistConversionafter;}
TH2D *GetQAHistPsiMinusPhi() {return fHistPsiMinusPhi;}
TH3D *GetQAHistResonancesBefore() {return fHistResonancesBefore;}
TH3D *GetQAHistResonancesRho() {return fHistResonancesRho;}
TH3D *GetQAHistResonancesK0() {return fHistResonancesK0;}
TH3D *GetQAHistResonancesLambda() {return fHistResonancesLambda;}
TH3D *GetQAHistQbefore() {return fHistQbefore;}
TH3D *GetQAHistQafter() {return fHistQafter;}
void UseResonancesCut() {fResonancesCut = kTRUE;}
void UseHBTCut(Double_t setHBTCutValue = 0.02) {
fHBTCut = kTRUE; fHBTCutValue = setHBTCutValue;}
void UseConversionCut(Double_t setInvMassCutConversion = 0.04) {
fConversionCut = kTRUE; fInvMassCutConversion = setInvMassCutConversion; }
void UseMomentumDifferenceCut(Double_t gDeltaPtCutMin) {
fQCut = kTRUE; fDeltaPtMin = gDeltaPtCutMin;}
Bool_t IsUseVertexBinning() { return fVertexBinning; }
TString GetBinningString() { return fBinningString; }
Double_t* GetBinning(const char* configuration, const char* tag, Int_t& nBins);
private:
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;
TString fAnalysisLevel;
Int_t fAnalyzedEvents;
TString fCentralityId;
Double_t fCentStart;
Double_t fCentStop;
AliTHn *fHistP;
AliTHn *fHistN;
AliTHn *fHistPN;
AliTHn *fHistNP;
AliTHn *fHistPP;
AliTHn *fHistNN;
TH2D *fHistHBTbefore;
TH2D *fHistHBTafter;
TH3D *fHistConversionbefore;
TH3D *fHistConversionafter;
TH2D *fHistPsiMinusPhi;
TH3D *fHistResonancesBefore;
TH3D *fHistResonancesRho;
TH3D *fHistResonancesK0;
TH3D *fHistResonancesLambda;
TH3D *fHistQbefore;
TH3D *fHistQafter;
Double_t fPsiInterval;
Double_t fDeltaEtaMax;
Bool_t fResonancesCut;
Bool_t fHBTCut;
Double_t fHBTCutValue;
Bool_t fConversionCut;
Double_t fInvMassCutConversion;
Bool_t fQCut;
Double_t fDeltaPtMin;
Bool_t fVertexBinning;
TString fCustomBinning;
TString fBinningString;
TString fEventClass;
AliBalancePsi & operator=(const AliBalancePsi & ) {return *this;}
ClassDef(AliBalancePsi, 2)
};
#endif