#ifndef ALIDIELECTRON_H
#define ALIDIELECTRON_H
#include <TNamed.h>
#include <TObjArray.h>
#include <THnBase.h>
#include <TSpline.h>
#include <AliAnalysisFilter.h>
#include <AliKFParticle.h>
#include "AliDielectronHistos.h"
#include "AliDielectronHF.h"
#include "AliDielectronCutQA.h"
class AliEventplane;
class AliVEvent;
class AliMCEvent;
class THashList;
class AliDielectronCF;
class AliDielectronDebugTree;
class AliDielectronTrackRotator;
class AliDielectronPair;
class AliDielectronSignalMC;
class AliDielectronMixingHandler;
class AliDielectron : public TNamed {
friend class AliDielectronMixingHandler;
public:
enum EPairType { kEv1PP=0, kEv1PM, kEv1MM,
kEv1PEv2P, kEv1MEv2P, kEv2PP,
kEv1PEv2M, kEv1MEv2M, kEv2PM,
kEv2MM, kEv1PMRot };
enum ELegType { kEv1P, kEv1M, kEv2P, kEv2M };
AliDielectron();
AliDielectron(const char* name, const char* title);
virtual ~AliDielectron();
void Init();
void Process(TObjArray *arr);
Bool_t Process(AliVEvent *ev1, AliVEvent *ev2=0);
const AliAnalysisFilter& GetEventFilter() const { return fEventFilter; }
const AliAnalysisFilter& GetTrackFilter() const { return fTrackFilter; }
const AliAnalysisFilter& GetPairFilter() const { return fPairFilter; }
AliAnalysisFilter& GetEventFilter() { return fEventFilter; }
AliAnalysisFilter& GetTrackFilter() { return fTrackFilter; }
AliAnalysisFilter& GetPairFilter() { return fPairFilter; }
AliAnalysisFilter& GetPairPreFilter() { return fPairPreFilter; }
AliAnalysisFilter& GetPairPreFilterLegs() { return fPairPreFilterLegs; }
AliAnalysisFilter& GetEventPlanePreFilter(){ return fEventPlanePreFilter; }
AliAnalysisFilter& GetEventPlanePOIPreFilter(){ return fEventPlanePOIPreFilter; }
void SetMotherPdg( Int_t pdgMother ) { fPdgMother=pdgMother; }
void SetLegPdg(Int_t pdgLeg1, Int_t pdgLeg2) { fPdgLeg1=pdgLeg1; fPdgLeg2=pdgLeg2; }
Int_t GetMotherPdg() const { return fPdgMother; }
Int_t GetLeg1Pdg() const { return fPdgLeg1; }
Int_t GetLeg2Pdg() const { return fPdgLeg2; }
void SetCutQA(Bool_t qa=kTRUE) { fCutQA=qa; }
void SetNoPairing(Bool_t noPairing=kTRUE) { fNoPairing=noPairing; }
void SetProcessLS(Bool_t doLS=kTRUE) { fProcessLS=doLS; }
void SetUseKF(Bool_t useKF=kTRUE) { fUseKF=useKF; }
const TObjArray* GetTrackArray(Int_t i) const {return (i>=0&&i<4)?&fTracks[i]:0;}
const TObjArray* GetPairArray(Int_t i) const {return (i>=0&&i<11)?
static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i)):0;}
TObjArray** GetPairArraysPointer() { return &fPairCandidates; }
void SetPairArraysPointer( TObjArray *arr) { fPairCandidates=arr; }
void SetHistogramArray(AliDielectronHF * const histoarray) { fHistoArray=histoarray; }
const TObjArray * GetHistogramArray() const { return fHistoArray?fHistoArray->GetHistArray():0x0; }
const TObjArray * GetQAHistArray() const { return fQAmonitor?fQAmonitor->GetQAHistArray():0x0; }
void SetHistogramManager(AliDielectronHistos * const histos) { fHistos=histos; }
AliDielectronHistos* GetHistoManager() const { return fHistos; }
const THashList * GetHistogramList() const { return fHistos?fHistos->GetHistogramList():0x0; }
Bool_t HasCandidates() const { return GetPairArray(1)?GetPairArray(1)->GetEntriesFast()>0:0; }
Bool_t HasCandidatesLikeSign() const {
return (GetPairArray(0)&&GetPairArray(2)) ? (GetPairArray(0)->GetEntriesFast()>0 || GetPairArray(2)->GetEntriesFast()>0) : 0;
}
Bool_t HasCandidatesTR() const {return GetPairArray(10)?GetPairArray(10)->GetEntriesFast()>0:0;}
void SetCFManagerPair(AliDielectronCF * const cf) { fCfManagerPair=cf; }
AliDielectronCF* GetCFManagerPair() const { return fCfManagerPair; }
void SetPreFilterEventPlane(Bool_t setValue=kTRUE){fPreFilterEventPlane=setValue;};
void SetLikeSignSubEvents(Bool_t setValue=kTRUE){fLikeSignSubEvents=setValue;};
void SetPreFilterUnlikeOnly(Bool_t setValue=kTRUE){fPreFilterUnlikeOnly=setValue;};
void SetPreFilterAllSigns(Bool_t setValue=kTRUE){fPreFilterAllSigns=setValue;};
void SetTrackRotator(AliDielectronTrackRotator * const rot) { fTrackRotator=rot; }
AliDielectronTrackRotator* GetTrackRotator() const { return fTrackRotator; }
void SetMixingHandler(AliDielectronMixingHandler *mix) { fMixing=mix; }
AliDielectronMixingHandler* GetMixingHandler() const { return fMixing; }
void SetHasMC(Bool_t hasMC) { fHasMC = hasMC; }
Bool_t GetHasMC() const { return fHasMC; }
void SetStoreRotatedPairs(Bool_t storeTR) {fStoreRotatedPairs = storeTR;}
void SetDontClearArrays(Bool_t dontClearArrays=kTRUE) { fDontClearArrays=dontClearArrays; }
Bool_t DontClearArrays() const { return fDontClearArrays; }
void AddSignalMC(AliDielectronSignalMC* signal);
void SetDebugTree(AliDielectronDebugTree * const tree) { fDebugTree=tree; }
const TObjArray* GetMCSignals() const { return fSignalsMC; }
static const char* TrackClassName(Int_t i) { return (i>=0&&i<4)?fgkTrackClassNames[i]:""; }
static const char* PairClassName(Int_t i) { return (i>=0&&i<11)?fgkPairClassNames[i]:""; }
void SetEstimatorFilename(const Char_t* filename) {fEstimatorFilename = filename;}
void SetTRDcorrectionFilename(const Char_t* filename) {fTRDpidCorrectionFilename = filename;}
void SetVZEROCalibrationFilename(const Char_t* filename) {fVZEROCalibrationFilename = filename;}
void SetVZERORecenteringFilename(const Char_t* filename) {fVZERORecenteringFilename = filename;}
void SetZDCRecenteringFilename(const Char_t* filename) {fZDCRecenteringFilename = filename;}
void InitLegEffMap(TString filename) { fLegEffMap=InitEffMap(filename) ;}
void InitPairEffMap(TString filename) { fPairEffMap=InitEffMap(filename) ;}
void SetCentroidCorrFunction(TF1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
void SetWidthCorrFunction(TF1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
void SetCentroidCorrFunction(TH1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
void SetWidthCorrFunction(TH1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
void SaveDebugTree();
Bool_t DoEventProcess() const { return fEventProcess; }
void SetEventProcess(Bool_t setValue=kTRUE) { fEventProcess=setValue; }
void FillHistogramsFromPairArray(Bool_t pairInfoOnly=kFALSE);
private:
Bool_t fCutQA;
AliDielectronCutQA *fQAmonitor;
TH1 *fPostPIDCntrdCorr;
TH1 *fPostPIDWdthCorr;
TObject *fLegEffMap;
TObject *fPairEffMap;
AliAnalysisFilter fEventFilter;
AliAnalysisFilter fTrackFilter;
AliAnalysisFilter fPairPreFilter;
AliAnalysisFilter fPairPreFilterLegs;
AliAnalysisFilter fPairFilter;
AliAnalysisFilter fEventPlanePreFilter;
AliAnalysisFilter fEventPlanePOIPreFilter;
Int_t fPdgMother;
Int_t fPdgLeg1;
Int_t fPdgLeg2;
TObjArray* fSignalsMC;
Bool_t fNoPairing;
Bool_t fProcessLS;
Bool_t fUseKF;
AliDielectronHF *fHistoArray;
AliDielectronHistos *fHistos;
TBits *fUsedVars;
TObjArray fTracks[4];
TObjArray *fPairCandidates;
AliDielectronCF *fCfManagerPair;
AliDielectronTrackRotator *fTrackRotator;
AliDielectronDebugTree *fDebugTree;
AliDielectronMixingHandler *fMixing;
Bool_t fPreFilterEventPlane;
Bool_t fLikeSignSubEvents;
Bool_t fPreFilterUnlikeOnly;
Bool_t fPreFilterAllSigns;
Bool_t fHasMC;
Bool_t fStoreRotatedPairs;
Bool_t fDontClearArrays;
Bool_t fEventProcess;
void FillTrackArrays(AliVEvent * const ev, Int_t eventNr=0);
void EventPlanePreFilter(Int_t arr1, Int_t arr2, TObjArray arrTracks1, TObjArray arrTracks2, const AliVEvent *ev);
void PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2);
void FillPairArrays(Int_t arr1, Int_t arr2);
void FillPairArrayTR();
Int_t GetPairIndex(Int_t arr1, Int_t arr2) const {return arr1>=arr2?arr1*(arr1+1)/2+arr2:arr2*(arr2+1)/2+arr1;}
void InitPairCandidateArrays();
void ClearArrays();
TObjArray* PairArray(Int_t i);
TObject* InitEffMap(TString filename);
static const char* fgkTrackClassNames[4];
static const char* fgkPairClassNames[11];
TString fEstimatorFilename;
TString fTRDpidCorrectionFilename;
TString fVZEROCalibrationFilename;
TString fVZERORecenteringFilename;
TString fZDCRecenteringFilename;
void ProcessMC(AliVEvent *ev1);
void FillHistograms(const AliVEvent *ev, Bool_t pairInfoOnly=kFALSE);
void FillMCHistograms(const AliVEvent *ev);
void FillMCHistograms(Int_t label1, Int_t label2, Int_t nSignal);
void FillHistogramsMC(const AliMCEvent *ev, AliVEvent *ev1);
void FillHistogramsPair(AliDielectronPair *pair,Bool_t fromPreFilter=kFALSE);
void FillHistogramsTracks(TObjArray **tracks);
void FillDebugTree();
AliDielectron(const AliDielectron &c);
AliDielectron &operator=(const AliDielectron &c);
ClassDef(AliDielectron,12);
};
inline void AliDielectron::InitPairCandidateArrays()
{
fPairCandidates->SetOwner();
for (Int_t i=0;i<11;++i){
TObjArray *arr=new TObjArray;
fPairCandidates->AddAt(arr,i);
arr->SetOwner();
}
}
inline TObjArray* AliDielectron::PairArray(Int_t i)
{
return static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i));
}
inline void AliDielectron::ClearArrays()
{
for (Int_t i=0;i<4;++i){
fTracks[i].Clear();
}
for (Int_t i=0;i<11;++i){
if (PairArray(i)) PairArray(i)->Delete();
}
}
#endif