#ifndef AliHFCorrelator_H
#define AliHFCorrelator_H
#include "AliHFAssociatedTrackCuts.h"
#include "AliEventPoolManager.h"
#include "AliVParticle.h"
#include "AliReducedParticle.h"
#include "AliVertexingHFUtils.h"
#include "AliRDHFCuts.h"
class AliHFCorrelator : public TNamed
{
public:
AliHFCorrelator();
AliHFCorrelator(const Char_t* name, AliHFAssociatedTrackCuts *cuts, Bool_t useCentrality);
AliHFCorrelator(const Char_t* name, AliHFAssociatedTrackCuts *cuts, Bool_t useCentrality, AliRDHFCuts *cutObject);
virtual ~AliHFCorrelator();
enum{
kUndefined=0,
kHadron=1,
kKaon,
kKZero,
kElectron
};
void SetDeltaPhiInterval (Double_t min, Double_t max){
fPhiMin = min; fPhiMax = max;
if(TMath::Abs(fPhiMin-fPhiMax) != 2*TMath::Pi()) AliInfo("AliHFCorrelator::Warning: the delta phi interval is not set to 2 Pi");
}
void SetDMesonCutObject(AliRDHFCuts* cutObject){
if(fDMesonCutObject) delete fDMesonCutObject;
fDMesonCutObject = cutObject;
if(!fDMesonCutObject) printf("AliHFCorrelator::warning! D meson object not implemented correctly!");
}
void SetEventMixing(Bool_t mixON){fmixing=mixON;}
void SetTriggerParticleProperties(Double_t ptTrig, Double_t phiTrig, Double_t etaTrig)
{fPtTrigger = ptTrig; fPhiTrigger = phiTrig; fEtaTrigger = etaTrig;}
void SetTriggerParticleDaughterCharge(Short_t charge) {fDCharge=charge;}
void SetAssociatedParticleType(Int_t type){fselect = type;}
void SetAODEvent(AliAODEvent* inputevent){fAODEvent = inputevent;}
void SetMCArray(TClonesArray* mcArray){fmcArray = mcArray;}
void SetUseMC(Bool_t useMC){fmontecarlo = useMC;}
void SetApplyDisplacementCut(Int_t applycut){fUseImpactParameter = applycut;}
void SetPIDmode(Int_t mode){fPIDmode = mode;}
void SetD0Properties(AliAODRecoDecayHF2Prong* d, Int_t D0hyp)
{fD0cand = d; fhypD0 = D0hyp;}
void SetUseReco(Bool_t useReco) {fUseReco = useReco;}
Bool_t DefineEventPool();
Bool_t Initialize();
Bool_t ProcessEventPool();
Bool_t ProcessAssociatedTracks(Int_t EventLoopIndex, const TObjArray* associatedTracks=NULL);
Bool_t Correlate(Int_t loopindex);
Bool_t PoolUpdate(const TObjArray* associatedTracks=NULL);
Double_t SetCorrectPhiRange(Double_t phi);
void SetPidAssociated() {fhadcuts->SetPidAssociated();}
AliEventPool* GetPool() {return fPool;}
TObjArray * GetTrackArray(){return fAssociatedTracks;}
AliHFAssociatedTrackCuts* GetSelectionCuts() {return fhadcuts;}
AliReducedParticle* GetAssociatedParticle() {return fReducedPart;}
AliRDHFCuts* GetDMesonCutObject(){return fDMesonCutObject;}
Int_t GetNofTracks(){return fNofTracks;}
Int_t GetNofEventsInPool(){return fPoolContent;}
Double_t GetDeltaPhi(){return fDeltaPhi;}
Double_t GetDeltaEta(){return fDeltaEta;}
Double_t GetCentrality(){return fMultCentr;}
Double_t GetAssociatedKZeroInvariantmass(){return fk0InvMass;}
TObjArray* AcceptAndReduceTracks(AliAODEvent* inputEvent);
TObjArray* AcceptAndReduceKZero(AliAODEvent* inputEvent);
private:
AliHFCorrelator(const AliHFCorrelator& vtxr);
AliHFCorrelator& operator=(const AliHFCorrelator& vtxr );
AliEventPoolManager* fPoolMgr;
AliEventPool * fPool;
AliHFAssociatedTrackCuts* fhadcuts;
AliAODEvent * fAODEvent;
AliRDHFCuts * fDMesonCutObject;
TObjArray* fAssociatedTracks;
TClonesArray* fmcArray;
AliReducedParticle * fReducedPart;
AliAODRecoDecayHF2Prong* fD0cand;
Int_t fhypD0;
Int_t fDCharge;
Bool_t fmixing;
Bool_t fmontecarlo;
Bool_t fUseCentrality;
Bool_t fUseReco;
Int_t fselect;
Int_t fUseImpactParameter;
Int_t fPIDmode;
Int_t fNofTracks;
Int_t fPoolContent;
Double_t fPhiMin;
Double_t fPhiMax;
Double_t fMultCentr;
Double_t fPtTrigger;
Double_t fPhiTrigger;
Double_t fEtaTrigger;
Double_t fDeltaPhi;
Double_t fDeltaEta;
Double_t fk0InvMass;
ClassDef(AliHFCorrelator,4);
};
#endif