ROOT logo
#ifndef ALIDIELECTRONMC_H
#define ALIDIELECTRONMC_H
/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

//#####################################################
//#                                                   # 
//#              Class AliDielectronMC                #
//#       Cut Class for Jpsi->e+e- analysis           #
//#                                                   #
//#   by WooJin J. Park, GSI / W.J.Park@gsi.de        #
//#                                                   #
//#####################################################

#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();                              // initialization
  Int_t GetNMCTracks();                                     // return number of generated tracks
  Int_t GetNMCTracksFromStack();                            // return number of generated tracks from stack
  Int_t GetNPrimary() const;                                      // return number of primary tracks
  Int_t GetNPrimaryFromStack();                                   // return number of primary tracks from stack
  Int_t GetMCPID(const AliESDtrack* _track);                      // return MC PID
  Int_t GetMCPID(const AliAODTrack* _track);                      // return MC PID for AODtrack
  Int_t GetMCPIDFromStack(const AliESDtrack* _track);             // return MC PID
  Int_t GetMotherPDG(const AliESDtrack* _track);                  // return mother PID from the MC stack
  Int_t GetMotherPDG(const AliAODTrack* _track);                  // return mother PID from the MC stack
  Int_t GetMotherPDG(const AliMCParticle* _track);                  // return mother PID from the MC stack
  Int_t GetMotherPDG(const AliAODMCParticle* _track);                  // return mother PID from the MC stack
  Int_t GetMotherPDGFromStack(const AliESDtrack* _track);         // return mother PID from the MC stack
  Int_t GetMCProcess(const AliESDtrack* _track);                  // return process number
  Int_t GetMCProcessFromStack(const AliESDtrack* _track);         // return process number
  Int_t GetMCProcessMother(const AliESDtrack* _track);            // return process number of the mother track
  Int_t GetMCProcessMotherFromStack(const AliESDtrack* _track);   // return process number of the mother 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;  // checks if a particle is physical primary
  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(const AliVParticle *track);   // return MC track directly from MC event
  AliVParticle* GetMCTrackFromMCEvent(Int_t label) const;           // return MC track directly from MC event
  TParticle* GetMCTrackFromStack(const AliESDtrack* _track);        // return MC track from stack
  AliMCParticle* GetMCTrack(const AliESDtrack* _track);             // return MC track associated with reco track
  AliAODMCParticle* GetMCTrack( const AliAODTrack* _track);          // return MC track associated with reco AOD track
  
  TParticle* GetMCTrackMotherFromStack(const AliESDtrack* _track);  // return MC mother track from stack
  AliMCParticle* GetMCTrackMother(const AliESDtrack* _track);       // return MC mother track from stack
  AliAODMCParticle* GetMCTrackMother(const AliAODTrack* _track);       // return MC mother fot track AODTrack
  AliMCParticle* GetMCTrackMother(const AliMCParticle* _particle);       // return MC mother track from stack
  AliAODMCParticle* GetMCTrackMother(const AliAODMCParticle* _particle);       // return MC mother track from stack

  Int_t NumberOfDaughters(const AliESDtrack* track);                 // return number of daughters
  Int_t NumberOfDaughters(const AliAODTrack* track);                 // return number of daughters for AOD track
  Int_t NumberOfDaughters(const AliMCParticle* particle);                 // return number of daughters
  Int_t NumberOfDaughters(const AliAODMCParticle* particle);                 // return number of daughters

  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; }         // return the AliMCEvent
  
private:
  AliMCEvent    *fMCEvent;  // MC event object
  AliStack      *fStack;    // MC stack

  AnalysisType fAnaType;    // Analysis type
  Bool_t fHasMC;            // Do we have an MC handler?
  
  static AliDielectronMC* fgInstance; //! singleton pointer
  TClonesArray* fMcArray; //mcArray for AOD MC particles 

 
  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 functions
//
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

 AliDielectronMC.h:1
 AliDielectronMC.h:2
 AliDielectronMC.h:3
 AliDielectronMC.h:4
 AliDielectronMC.h:5
 AliDielectronMC.h:6
 AliDielectronMC.h:7
 AliDielectronMC.h:8
 AliDielectronMC.h:9
 AliDielectronMC.h:10
 AliDielectronMC.h:11
 AliDielectronMC.h:12
 AliDielectronMC.h:13
 AliDielectronMC.h:14
 AliDielectronMC.h:15
 AliDielectronMC.h:16
 AliDielectronMC.h:17
 AliDielectronMC.h:18
 AliDielectronMC.h:19
 AliDielectronMC.h:20
 AliDielectronMC.h:21
 AliDielectronMC.h:22
 AliDielectronMC.h:23
 AliDielectronMC.h:24
 AliDielectronMC.h:25
 AliDielectronMC.h:26
 AliDielectronMC.h:27
 AliDielectronMC.h:28
 AliDielectronMC.h:29
 AliDielectronMC.h:30
 AliDielectronMC.h:31
 AliDielectronMC.h:32
 AliDielectronMC.h:33
 AliDielectronMC.h:34
 AliDielectronMC.h:35
 AliDielectronMC.h:36
 AliDielectronMC.h:37
 AliDielectronMC.h:38
 AliDielectronMC.h:39
 AliDielectronMC.h:40
 AliDielectronMC.h:41
 AliDielectronMC.h:42
 AliDielectronMC.h:43
 AliDielectronMC.h:44
 AliDielectronMC.h:45
 AliDielectronMC.h:46
 AliDielectronMC.h:47
 AliDielectronMC.h:48
 AliDielectronMC.h:49
 AliDielectronMC.h:50
 AliDielectronMC.h:51
 AliDielectronMC.h:52
 AliDielectronMC.h:53
 AliDielectronMC.h:54
 AliDielectronMC.h:55
 AliDielectronMC.h:56
 AliDielectronMC.h:57
 AliDielectronMC.h:58
 AliDielectronMC.h:59
 AliDielectronMC.h:60
 AliDielectronMC.h:61
 AliDielectronMC.h:62
 AliDielectronMC.h:63
 AliDielectronMC.h:64
 AliDielectronMC.h:65
 AliDielectronMC.h:66
 AliDielectronMC.h:67
 AliDielectronMC.h:68
 AliDielectronMC.h:69
 AliDielectronMC.h:70
 AliDielectronMC.h:71
 AliDielectronMC.h:72
 AliDielectronMC.h:73
 AliDielectronMC.h:74
 AliDielectronMC.h:75
 AliDielectronMC.h:76
 AliDielectronMC.h:77
 AliDielectronMC.h:78
 AliDielectronMC.h:79
 AliDielectronMC.h:80
 AliDielectronMC.h:81
 AliDielectronMC.h:82
 AliDielectronMC.h:83
 AliDielectronMC.h:84
 AliDielectronMC.h:85
 AliDielectronMC.h:86
 AliDielectronMC.h:87
 AliDielectronMC.h:88
 AliDielectronMC.h:89
 AliDielectronMC.h:90
 AliDielectronMC.h:91
 AliDielectronMC.h:92
 AliDielectronMC.h:93
 AliDielectronMC.h:94
 AliDielectronMC.h:95
 AliDielectronMC.h:96
 AliDielectronMC.h:97
 AliDielectronMC.h:98
 AliDielectronMC.h:99
 AliDielectronMC.h:100
 AliDielectronMC.h:101
 AliDielectronMC.h:102
 AliDielectronMC.h:103
 AliDielectronMC.h:104
 AliDielectronMC.h:105
 AliDielectronMC.h:106
 AliDielectronMC.h:107
 AliDielectronMC.h:108
 AliDielectronMC.h:109
 AliDielectronMC.h:110
 AliDielectronMC.h:111
 AliDielectronMC.h:112
 AliDielectronMC.h:113
 AliDielectronMC.h:114
 AliDielectronMC.h:115
 AliDielectronMC.h:116
 AliDielectronMC.h:117
 AliDielectronMC.h:118
 AliDielectronMC.h:119
 AliDielectronMC.h:120
 AliDielectronMC.h:121
 AliDielectronMC.h:122
 AliDielectronMC.h:123
 AliDielectronMC.h:124
 AliDielectronMC.h:125
 AliDielectronMC.h:126
 AliDielectronMC.h:127
 AliDielectronMC.h:128
 AliDielectronMC.h:129
 AliDielectronMC.h:130
 AliDielectronMC.h:131
 AliDielectronMC.h:132
 AliDielectronMC.h:133
 AliDielectronMC.h:134
 AliDielectronMC.h:135
 AliDielectronMC.h:136
 AliDielectronMC.h:137
 AliDielectronMC.h:138
 AliDielectronMC.h:139
 AliDielectronMC.h:140
 AliDielectronMC.h:141
 AliDielectronMC.h:142
 AliDielectronMC.h:143
 AliDielectronMC.h:144
 AliDielectronMC.h:145
 AliDielectronMC.h:146
 AliDielectronMC.h:147
 AliDielectronMC.h:148
 AliDielectronMC.h:149
 AliDielectronMC.h:150
 AliDielectronMC.h:151
 AliDielectronMC.h:152
 AliDielectronMC.h:153
 AliDielectronMC.h:154