#ifndef ALIHFESECVTX_H
#define ALIHFESECVTX_H
#ifndef ROOT_TObject
#endif
#ifndef ROOT_THnSparse
#include <THnSparse.h>
#endif
class TH1F;
class TH2F;
class TString;
class AliESDEvent;
class AliAODEvent;
class AliVTrack;
class AliESDtrack;
class AliAODTrack;
class AliMCEvent;
class AliHFEtrackFilter;
class AliHFEpairs;
class AliHFEsecVtxs;
class AliKFParticle;
class AliHFEmcQA;
class AliHFEsecVtx : public TObject {
public:
AliHFEsecVtx();
AliHFEsecVtx(const AliHFEsecVtx &p);
AliHFEsecVtx &operator=(const AliHFEsecVtx &);
virtual ~AliHFEsecVtx();
void CreateHistograms(TList * const qaList);
Bool_t Process(AliVTrack *track);
Bool_t HasMCData() const { return TestBit(kHasMCData); };
Bool_t IsAODanalysis() const { return TestBit(kAODanalysis); };
Bool_t IsESDanalysis() const { return !TestBit(kAODanalysis); };
void SetHasMCData(Bool_t hasMCdata = kTRUE) { SetBit(kHasMCData,hasMCdata); };
void SetAODAnalysis() { SetBit(kAODanalysis, kTRUE); };
void SetESDAnalysis() { SetBit(kAODanalysis, kFALSE); };
void SetEvent(AliESDEvent* const ESD){fESD1=ESD;};
void SetEventAOD(AliAODEvent* const AOD){fAOD1=AOD;};
void SetMCEvent(AliMCEvent* const mcEvent){fMCEvent=mcEvent;};
void SetMCArray(TClonesArray* const mcarry){fMCArray=mcarry;}
void SetUseMCPID(Bool_t usemcpid){fUseMCPID=usemcpid;};
void SetMCQA(AliHFEmcQA * const mcqa){fMCQA=mcqa;};
Int_t GetMCPID(const AliESDtrack *track);
Int_t GetMCPDG(const AliVTrack *track);
Int_t GetPairOriginESD(AliESDtrack* track1, AliESDtrack* track2);
Int_t GetPairOriginAOD(AliAODTrack* track1, AliAODTrack* track2);
Int_t GetPairCode(const AliVTrack* const track1, const AliVTrack* const track2);
Int_t GetElectronSource(Int_t mclabel);
Int_t GetPDG(const AliVTrack *track);
void GetESDPID(const AliESDtrack *track, Int_t &recpid, Double_t &recprob);
void GetPrimaryCondition();
void RecalcPrimvtx(Int_t nkftrk, const Int_t * const, const AliKFParticle * const);
TClonesArray *HFEpairs();
TClonesArray *HFEsecvtxs();
void AddHFEpairToArray(const AliHFEpairs* const pair);
void AddHFEsecvtxToArray(const AliHFEsecVtxs* const secvtx);
void InitHFEpairs();
void InitHFEsecvtxs();
void DeleteHFEpairs();
void DeleteHFEsecvtxs();
void PairAnalysis(AliVTrack* ESDtrack1, AliVTrack* ESDtrack2, Int_t index2);
void RunSECVTX(AliVTrack *track);
void MakeContainer();
void MakeHistos(Int_t step);
void FillHistos(Int_t step, const AliESDtrack *track);
protected:
void Init();
void FindSECVTXCandid(AliVTrack *track);
void CalcSECVTXProperty(AliVTrack* track1, AliVTrack* track2, AliVTrack* track3);
void CalcSECVTXProperty(AliVTrack* track1, AliVTrack* track2, AliVTrack* track3, AliVTrack* track4);
void Fill4TrkSECVTX(AliVTrack* track, Int_t ipair, Int_t jpair, Int_t kpair);
void Fill3TrkSECVTX(AliVTrack* track, Int_t ipair, Int_t jpair);
void Fill2TrkSECVTX(AliVTrack* track, const AliHFEpairs *pair);
private:
enum{
kHasMCData = BIT(15),
kAODanalysis = BIT(16)
};
enum {kAll, kDirectCharm, kDirectBeauty, kBeautyCharm, kGamma, kPi0, kElse, kBeautyGamma, kBeautyPi0, kBeautyElse, kMisID};
enum {kCharm=4, kBeauty=5};
AliHFEtrackFilter *fFilter;
AliESDEvent* fESD1;
AliAODEvent* fAOD1;
AliMCEvent* fMCEvent;
AliHFEmcQA* fMCQA;
Bool_t fUseMCPID;
TString fkSourceLabel[10];
Int_t fNparents;
Int_t fParentSelect[2][7];
Double_t fPtRng[7];
Double_t fDcaCut[6];
Int_t fNoOfHFEpairs;
Int_t fNoOfHFEsecvtxs;
Int_t fArethereSecVtx;
TClonesArray *fHFEpairs;
TClonesArray *fHFEsecvtxs;
TClonesArray *fMCArray;
Double_t fPVx;
Double_t fPVy;
Double_t fPVx2;
Double_t fPVy2;
Double_t fCosPhi;
Double_t fSignedLxy;
Double_t fSignedLxy2;
Double_t fKFchi2;
Double_t fInvmass;
Double_t fInvmassSigma;
Double_t fKFip;
Double_t fKFip2;
Int_t fNsectrk2prim;
Double_t fVtxchi2Tightcut;
Double_t fVtxchi2Loosecut;
THnSparseF *fPairQA;
THnSparseF *fSecvtxQA;
TList *fSecVtxList;
ClassDef(AliHFEsecVtx,0);
};
#endif