1 #ifndef AliAODMCParticle_H
2 #define AliAODMCParticle_H
3 /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
7 //-------------------------------------------------------------------------
8 // AliVParticle realisation for MC Particles in the AOD
9 // Stripped dow AliMCParticle
10 // Author: Christian Klein Bösing, CERN
11 //-------------------------------------------------------------------------
14 #include <TParticlePDG.h>
19 #include "AliTrackReference.h"
20 #include "AliVParticle.h"
21 #include "AliMCParticle.h"
27 class AliAODMCParticle: public AliVParticle {
30 AliAODMCParticle(AliMCParticle* part, Int_t label=0,Int_t flag = 0);
31 virtual ~AliAODMCParticle(){};
32 AliAODMCParticle(const AliAODMCParticle& mcPart);
33 AliAODMCParticle& operator=(const AliAODMCParticle& mcPart);
36 virtual Double_t Px() const;
37 virtual Double_t Py() const;
38 virtual Double_t Pz() const;
39 virtual Double_t Pt() const;
40 virtual Double_t P() const;
41 virtual Bool_t PxPyPz(Double_t p[3]) const;
43 virtual Double_t OneOverPt() const;
44 virtual Double_t Phi() const;
45 virtual Double_t Theta() const;
47 virtual Double_t Xv() const;
48 virtual Double_t Yv() const;
49 virtual Double_t Zv() const;
50 virtual Bool_t XvYvZv(Double_t x[3]) const;
51 virtual Double_t T() const;
53 virtual Double_t E() const;
54 virtual Double_t M() const;
56 virtual Double_t Eta() const;
57 virtual Double_t Y() const;
59 virtual Short_t Charge() const;
61 virtual Int_t Label() const;
62 virtual Int_t GetLabel() const {return Label();}
65 virtual const Double_t *PID() const {return 0;} // return PID object (to be defined, still)
68 virtual Double_t GetCalcMass() const;
69 virtual void SetDaughter(Int_t i,Int_t id){if(i<2)fDaughter[i] = id;}
70 virtual Int_t GetDaughter(Int_t i) const {return fDaughter[i];}
71 virtual void SetMother(Int_t im){fMother = im;}
72 virtual Int_t GetMother() const {return fMother;}
73 virtual void Print(const Option_t *opt = "") const;
74 virtual Int_t GetPdgCode() const { return fPdgCode;}
76 enum { kPrimary = 1<<0, kPhysicalPrim = 1<<1 };
77 void SetFlag(Int_t flag){fFlag = flag;}
78 Int_t GetFlag() const {return fFlag;}
81 void SetPrimary(Bool_t b = kTRUE){
82 if(b)fFlag |= kPrimary;
83 else fFlag &= ~kPrimary;
85 Bool_t IsPrimary() const {return ((fFlag&kPrimary)==kPrimary);}
87 void SetPhysicalPrimary(Bool_t b = kTRUE){
88 if(b)fFlag |= kPhysicalPrim;
89 else fFlag &= ~kPhysicalPrim;
91 Bool_t IsPhysicalPrimary() const {return ((fFlag&kPhysicalPrim)==kPhysicalPrim);}
92 static const char* StdBranchName(){return fgkStdBranchName.Data();}
96 static TString fgkStdBranchName; // Standard branch name
99 Int_t fPdgCode; // PDG code of the particle
100 Int_t fFlag; // Flag for indication of primary etc
101 Int_t fLabel; // Label of the original MCParticle
102 Int_t fMother; // Index of the mother particles
103 Int_t fDaughter[2]; // Indices of the daughter particles
104 Double32_t fPx; // x component of momentum
105 Double32_t fPy; // y component of momentum
106 Double32_t fPz; // z component of momentum
107 Double32_t fE; // [0.,0.,12]
109 Double32_t fVx; // [0.,0.,12] x of production vertex
110 Double32_t fVy; // [0.,0.,12] y of production vertex
111 Double32_t fVz; // [0.,0.,12] z of production vertex
112 Double32_t fVt; // [0.,0.,12] t of production vertex
114 // Copy the uniquID to another data member? unique ID is correctly handled
115 // via TOBject Copy construct but not by AliVParticle ctor (no passing of
117 // Need a flag for primaries?
120 const TMCProcess kMCprocesses[kMaxMCProcess] =
122 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
123 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
124 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
125 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
126 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
127 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
134 ClassDef(AliAODMCParticle,3) // AliVParticle realisation for AODMCParticles
138 inline Double_t AliAODMCParticle::Px() const {return fPx;}
139 inline Double_t AliAODMCParticle::Py() const {return fPy;}
140 inline Double_t AliAODMCParticle::Pz() const {return fPz;}
141 inline Double_t AliAODMCParticle::Pt() const {return TMath::Sqrt(fPx*fPx+fPy*fPy);}
142 inline Double_t AliAODMCParticle::P() const {return TMath::Sqrt(fPx*fPx+fPy*fPy+fPz*fPz); }
143 inline Double_t AliAODMCParticle::OneOverPt() const {return 1. / Pt();}
144 inline Bool_t AliAODMCParticle::PxPyPz(Double_t p[3]) const { p[0] = fPx; p[1] = fPy; p[2] = fPz; return kTRUE; }
145 inline Double_t AliAODMCParticle::Phi() const {return TMath::Pi()+TMath::ATan2(-fPy,-fPx); } // note that Phi() returns an angle between 0 and 2pi
146 inline Double_t AliAODMCParticle::Theta() const {return (fPz==0)?TMath::PiOver2():TMath::ACos(fPz/P()); }
147 inline Double_t AliAODMCParticle::Xv() const {return fVx;}
148 inline Double_t AliAODMCParticle::Yv() const {return fVy;}
149 inline Double_t AliAODMCParticle::Zv() const {return fVz;}
150 inline Bool_t AliAODMCParticle::XvYvZv(Double_t x[3]) const { x[0] = fVx; x[1] = fVy; x[2] = fVz; return kTRUE; }
151 inline Double_t AliAODMCParticle::T() const {return fVt;}
152 inline Double_t AliAODMCParticle::E() const {return fE;}
153 inline Double_t AliAODMCParticle::Eta() const {
155 if (pmom != TMath::Abs(fPz)) return 0.5*TMath::Log((pmom+fPz)/(pmom-fPz));
160 inline Double_t AliAODMCParticle::Y() const
165 if (e > TMath::Abs(pz)) {
166 return 0.5*TMath::Log((e+pz)/(e-pz));
172 inline Int_t AliAODMCParticle::Label() const {return fLabel;}
174 inline Double_t AliAODMCParticle::GetCalcMass() const {
176 Double_t m2 = E()*E()-Px()*Px()-Py()*Py()-Pz()*Pz();
178 return TMath::Sqrt(m2);