#ifndef ALICFVERTEXINGHF_H
#define ALICFVERTEXINGHF_H
#include "AliCFContainer.h"
#include "AliAODRecoDecayHF.h"
class TH1I;
class TParticle ;
class TFile ;
class TClonesArray ;
class AliAODMCParticle;
class AliAODMCHeader;
class AliAODEvent;
class THnSparse;
class TClonesArray;
class AliESDtrackCuts;
class AliCFVertexingHF : public TObject {
public:
enum DecayChannel{kD0toKpi = 2, kDStartoKpipi = 21, kLctoV0bachelor = 22, kDplustoKpipi = 31, kLctopKpi = 32, kDstoKKpi = 33, kD0toKpipipi = 4};
AliCFVertexingHF() ;
AliCFVertexingHF(TClonesArray *mcArray, UShort_t originDselection);
AliCFVertexingHF(const AliCFVertexingHF& c);
AliCFVertexingHF& operator= (const AliCFVertexingHF& c);
virtual ~AliCFVertexingHF();
virtual Bool_t GetGeneratedValuesFromMCParticle(Double_t* ) {return kFALSE;}
virtual Bool_t GetRecoValuesFromCandidate(Double_t* ) const {return kFALSE;}
virtual Bool_t CheckMCChannelDecay() const {return kFALSE;}
virtual Bool_t SetRecoCandidateParam(AliAODRecoDecayHF* ) {return kFALSE;}
virtual void SetDecay3Prong(Int_t ){};
void SetFillFromGenerated(Bool_t flag) {fFillFromGenerated = flag;}
Bool_t GetFillFromGenerated() const {return fFillFromGenerated;}
void SetNVar(Int_t nVar) {fNVar = nVar;}
void SetRecoPrimVertex (Double_t zPrimVertex) {fzPrimVertex = zPrimVertex;}
void SetMCPrimaryVertex (Double_t zMCVertex){fzMCVertex = zMCVertex;}
void SetMCLabel (Int_t mcLabel) {fmcLabel = mcLabel;}
Int_t GetMCLabel () const {return fmcLabel;}
void SetMCCandidateParam(Int_t label);
Int_t MCcquarkCounting(AliAODMCParticle* mcPart) const;
Bool_t CheckMCPartFamily(AliAODMCParticle *, TClonesArray *) const;
Int_t CheckOrigin() const;
Bool_t CheckMCDaughters() const;
Bool_t FillMCContainer(Double_t *containerInputMC);
Bool_t FillRecoContainer(Double_t *containerInput);
Bool_t MCAcceptanceStep() const;
Bool_t MCRefitStep(AliAODEvent *aodEvent, AliESDtrackCuts **trackCuts) const;
Bool_t RecoStep();
virtual Double_t GetEtaProng(Int_t iProng) const;
virtual Double_t GetPtProng(Int_t iProng) const;
Double_t GetPtCand() const {return fRecoCandidate->Pt();}
Double_t GetYCand(UInt_t pdg) const {return fRecoCandidate->Y(pdg);}
Bool_t RecoAcceptStep(AliESDtrackCuts **trackCuts) const;
Bool_t FillUnfoldingMatrix(UInt_t pdg, Double_t fill[4]) const;
void SetNProngs(Int_t nProngs){fProngs = nProngs;}
Int_t GetNProngs() const {return fProngs;}
void SetDselection(UShort_t originDselection);
UShort_t GetDselection() {return fOriginDselection;};
Int_t CheckReflexion(Char_t isSign);
virtual Bool_t SetLabelArray();
void SetCentralityValue(Float_t centValue) {fCentValue = centValue;}
virtual void SetPtAccCut(Float_t* ptAccCut);
virtual void SetEtaAccCut(Float_t* etaAccCut);
virtual void SetAccCut(Float_t* ptAccCut, Float_t* etaAccCut);
virtual void SetAccCut();
virtual void SetGeneratedDsOption(Int_t ){
AliError("Method implemented in derived class");
}
void SetFakeSelection(Int_t fakeSel){fFakeSelection = fakeSel;}
Int_t GetFakeSelection(){return fFakeSelection;}
void SetRejectCandidateIfNotFromQuark(Bool_t opt){fRejectIfNoQuark=opt;}
void SetMultiplicity(Double_t multiplicity) {fMultiplicity = multiplicity;}
void SetConfiguration(Int_t configuration) {fConfiguration = configuration;}
protected:
TClonesArray *fmcArray;
AliAODRecoDecayHF *fRecoCandidate;
AliAODMCParticle *fmcPartCandidate;
Int_t fNDaughters;
Int_t fNVar;
Double_t fzPrimVertex;
Double_t fzMCVertex;
Bool_t fFillFromGenerated;
UShort_t fOriginDselection;
Bool_t fKeepDfromB;
Bool_t fKeepDfromBOnly;
Int_t fmcLabel;
Int_t fProngs;
Int_t* fLabelArray;
Float_t fCentValue;
Float_t* fPtAccCut;
Float_t* fEtaAccCut;
Int_t fFakeSelection;
Float_t fFake;
Bool_t fRejectIfNoQuark;
Double_t fMultiplicity;
Int_t fConfiguration;
ClassDef(AliCFVertexingHF, 7);
};
#endif