#ifndef ALIDIELECTRONMC_H
#define ALIDIELECTRONMC_H
#ifndef ROOT_TObject
#include <TObject.h>
#include <TMCProcess.h>
#endif
class AliESDEvent;
class AliHFEpid;
class AliStack;
class AliMCEvent;
class AliESDtrack;
class AliAODTrack;
class TParticle;
class AliMCParticle;
class AliAODMCParticle;
class AliAODMCHeader;
#include "AliDielectronSignalMC.h"
#include "AliDielectronPair.h"
class AliDielectronMC : public TObject{
public:
enum AnalysisType {kUNSET=0, kESD, kAOD};
AliDielectronMC(AnalysisType type=kUNSET);
virtual ~AliDielectronMC();
void SetHasMC(Bool_t hasMC) { fHasMC=hasMC; }
Bool_t HasMC() const { return fHasMC; }
static AliDielectronMC* Instance();
void Initialize();
Int_t GetNMCTracks();
Int_t GetNMCTracksFromStack();
Int_t GetNPrimary() const;
Int_t GetNPrimaryFromStack();
Int_t GetMCPID(const AliESDtrack* _track);
Int_t GetMCPID(const AliAODTrack* _track);
Int_t GetMCPIDFromStack(const AliESDtrack* _track);
Int_t GetMotherPDG(const AliESDtrack* _track);
Int_t GetMotherPDG(const AliAODTrack* _track);
Int_t GetMotherPDG(const AliMCParticle* _track);
Int_t GetMotherPDG(const AliAODMCParticle* _track);
Int_t GetMotherPDGFromStack(const AliESDtrack* _track);
Int_t GetMCProcess(const AliESDtrack* _track);
Int_t GetMCProcessFromStack(const AliESDtrack* _track);
Int_t GetMCProcessMother(const AliESDtrack* _track);
Int_t GetMCProcessMotherFromStack(const AliESDtrack* _track);
Bool_t ConnectMCEvent();
Bool_t UpdateStack();
Bool_t IsMotherPdg(const AliDielectronPair* pair, Int_t pdgMother);
Bool_t IsMotherPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
Bool_t IsMCMotherToEE(const AliVParticle *particle, Int_t pdgMother);
Bool_t IsMCTruth(const AliDielectronPair* pair, const AliDielectronSignalMC* signalMC) const;
Bool_t IsMCTruth(Int_t label, AliDielectronSignalMC* signalMC, Int_t branch) const;
Int_t GetMothersLabel(Int_t daughterLabel) const;
Int_t GetPdgFromLabel(Int_t label) const;
Bool_t IsPhysicalPrimary(Int_t label) const;
Bool_t CheckGEANTProcess(Int_t label, TMCProcess process) const;
Bool_t IsSecondaryFromWeakDecay(Int_t label) const;
Bool_t IsSecondaryFromMaterial(Int_t label) const;
Bool_t HaveSameMother(const AliDielectronPair *pair) const;
Int_t GetLabelMotherWithPdg(const AliDielectronPair* pair, Int_t pdgMother);
Int_t GetLabelMotherWithPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
AliVParticle* GetMCTrackFromMCEvent(Int_t label) const;
TParticle* GetMCTrackFromStack(const AliESDtrack* _track);
AliMCParticle* GetMCTrack(const AliESDtrack* _track);
AliAODMCParticle* GetMCTrack( const AliAODTrack* _track);
TParticle* GetMCTrackMotherFromStack(const AliESDtrack* _track);
AliMCParticle* GetMCTrackMother(const AliESDtrack* _track);
AliAODMCParticle* GetMCTrackMother(const AliAODTrack* _track);
AliMCParticle* GetMCTrackMother(const AliMCParticle* _particle);
AliAODMCParticle* GetMCTrackMother(const AliAODMCParticle* _particle);
Int_t NumberOfDaughters(const AliESDtrack* track);
Int_t NumberOfDaughters(const AliAODTrack* track);
Int_t NumberOfDaughters(const AliMCParticle* particle);
Int_t NumberOfDaughters(const AliAODMCParticle* particle);
void GetDaughters(const TObject *mother, AliVParticle* &d1, AliVParticle* &d2);
Int_t IsJpsiPrimary(const AliDielectronPair * pair);
Int_t IsJpsiPrimary(const AliVParticle * pair);
Bool_t CheckParticleSource(Int_t label, AliDielectronSignalMC::ESource source) const;
Bool_t GetPrimaryVertex(Double_t &primVtxX, Double_t &primVtxY, Double_t &primVtxZ);
AliMCEvent* GetMCEvent() { return fMCEvent; }
private:
AliMCEvent *fMCEvent;
AliStack *fStack;
AnalysisType fAnaType;
Bool_t fHasMC;
static AliDielectronMC* fgInstance;
TClonesArray* fMcArray;
AliDielectronMC(const AliDielectronMC &c);
AliDielectronMC &operator=(const AliDielectronMC &c);
Bool_t IsMCMotherToEEesd(const AliMCParticle *particle, Int_t pdgMother);
Bool_t IsMCMotherToEEaod(const AliAODMCParticle *particle, Int_t pdgMother);
Int_t GetLabelMotherWithPdgESD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
Int_t GetLabelMotherWithPdgAOD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother);
Bool_t ComparePDG(Int_t particlePDG, Int_t requiredPDG, Bool_t pdgExclusion, Bool_t checkBothCharges) const;
Bool_t CheckIsRadiative(Int_t label) const;
Bool_t CheckRadiativeDecision(Int_t mLabel, const AliDielectronSignalMC * const signalMC) const;
ClassDef(AliDielectronMC, 0)
};
inline Bool_t AliDielectronMC::IsMotherPdg(const AliDielectronPair* pair, Int_t pdgMother)
{
return IsMotherPdg(pair->GetFirstDaughterP(),pair->GetSecondDaughterP(),pdgMother);
}
inline Bool_t AliDielectronMC::IsMotherPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother){
return GetLabelMotherWithPdg(particle1,particle2,pdgMother)>=0;
}
inline Int_t AliDielectronMC::GetLabelMotherWithPdg(const AliDielectronPair* pair, Int_t pdgMother){
return GetLabelMotherWithPdg(pair->GetFirstDaughterP(),pair->GetSecondDaughterP(),pdgMother);
}
#endif