Bug corrected.
[u/mrichter/AliRoot.git] / STEER / AliAODMCParticle.h
CommitLineData
da97a08a 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 */
5
6
7//-------------------------------------------------------------------------
8// AliVParticle realisation for MC Particles in the AOD
9// Stripped dow AliMCParticle
10// Author: Christian Klein Bösing, CERN
11//-------------------------------------------------------------------------
12
13#include <Rtypes.h>
14#include <TParticlePDG.h>
15#include <TExMap.h>
16#include <TString.h>
17
18
19#include "AliTrackReference.h"
20#include "AliVParticle.h"
93836e1b 21#include "AliMCParticle.h"
da97a08a 22
23class AliAODEvent;
24class TParticle;
25class TClonesArray;
26
27class AliAODMCParticle: public AliVParticle {
28 public:
29 AliAODMCParticle();
93836e1b 30 AliAODMCParticle(AliMCParticle* part, Int_t label=0,Int_t flag = 0);
da97a08a 31 virtual ~AliAODMCParticle(){};
32 AliAODMCParticle(const AliAODMCParticle& mcPart);
33 AliAODMCParticle& operator=(const AliAODMCParticle& mcPart);
34
35 // Kinematics
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;
42
43 virtual Double_t OneOverPt() const;
44 virtual Double_t Phi() const;
45 virtual Double_t Theta() const;
46
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;
0b603250 51 virtual Double_t T() const;
da97a08a 52
53 virtual Double_t E() const;
54 virtual Double_t M() const;
55
56 virtual Double_t Eta() const;
57 virtual Double_t Y() const;
58
59 virtual Short_t Charge() const;
60
0b603250 61 virtual Int_t Label() const;
62 virtual Int_t GetLabel() const {return Label();}
da97a08a 63
64 // PID
65 virtual const Double_t *PID() const {return 0;} // return PID object (to be defined, still)
66
67 //
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];}
7542d3d0 71 virtual Int_t GetNDaughters () const { return fDaughter[1]>0 ? fDaughter[1]-fDaughter[0]+1 : 0;}
da97a08a 72 virtual void SetMother(Int_t im){fMother = im;}
73 virtual Int_t GetMother() const {return fMother;}
74 virtual void Print(const Option_t *opt = "") const;
75 virtual Int_t GetPdgCode() const { return fPdgCode;}
6a8e543a 76 virtual Int_t PdgCode() const { return GetPdgCode();}
77
da97a08a 78 enum { kPrimary = 1<<0, kPhysicalPrim = 1<<1 };
6326aeae 79 void SetFlag(UInt_t flag){fFlag = flag;}
80 UInt_t GetFlag() const {return fFlag;}
81
82
83 // for the status we use the upper 16 bits/2 bytes of the flag word
84 void SetStatus(Int_t status){
85 // a TParticle can have a negative stuts, catch this here and do nothing
86 if(status<0)return;
87 // reset the upper bins keep the lower bins
88 fFlag &= 0xffff;
89 // bit shift by 16
90 fFlag |= (((UInt_t)status)<<16);
91 }
92 UInt_t GetStatus() const {
93 // bit shift by 16
94 return fFlag>>16;
95 }
da97a08a 96
97 // Bitwise operations
98 void SetPrimary(Bool_t b = kTRUE){
99 if(b)fFlag |= kPrimary;
100 else fFlag &= ~kPrimary;
101 }
102 Bool_t IsPrimary() const {return ((fFlag&kPrimary)==kPrimary);}
103
104 void SetPhysicalPrimary(Bool_t b = kTRUE){
105 if(b)fFlag |= kPhysicalPrim;
106 else fFlag &= ~kPhysicalPrim;
107 }
108 Bool_t IsPhysicalPrimary() const {return ((fFlag&kPhysicalPrim)==kPhysicalPrim);}
109 static const char* StdBranchName(){return fgkStdBranchName.Data();}
110
111 private:
112
113 static TString fgkStdBranchName; // Standard branch name
114
115
116 Int_t fPdgCode; // PDG code of the particle
6326aeae 117 UInt_t fFlag; // Flag for indication of primary etc
da97a08a 118 Int_t fLabel; // Label of the original MCParticle
119 Int_t fMother; // Index of the mother particles
120 Int_t fDaughter[2]; // Indices of the daughter particles
1d8ad855 121 Double32_t fPx; // x component of momentum
122 Double32_t fPy; // y component of momentum
123 Double32_t fPz; // z component of momentum
9ce038a5 124 Double32_t fE; // Energy
da97a08a 125
126 Double32_t fVx; // [0.,0.,12] x of production vertex
127 Double32_t fVy; // [0.,0.,12] y of production vertex
128 Double32_t fVz; // [0.,0.,12] z of production vertex
0b603250 129 Double32_t fVt; // [0.,0.,12] t of production vertex
da97a08a 130
131 // Copy the uniquID to another data member? unique ID is correctly handled
132 // via TOBject Copy construct but not by AliVParticle ctor (no passing of
6326aeae 133 // TParticles
da97a08a 134 // Need a flag for primaries?
135
136 /*
137 const TMCProcess kMCprocesses[kMaxMCProcess] =
138 {
139 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
140 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
141 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
142 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
143 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
144 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
145 };
146 */
147
9ce038a5 148 ClassDef(AliAODMCParticle,5) // AliVParticle realisation for AODMCParticles
da97a08a 149
150};
151
152inline Double_t AliAODMCParticle::Px() const {return fPx;}
153inline Double_t AliAODMCParticle::Py() const {return fPy;}
154inline Double_t AliAODMCParticle::Pz() const {return fPz;}
155inline Double_t AliAODMCParticle::Pt() const {return TMath::Sqrt(fPx*fPx+fPy*fPy);}
156inline Double_t AliAODMCParticle::P() const {return TMath::Sqrt(fPx*fPx+fPy*fPy+fPz*fPz); }
157inline Double_t AliAODMCParticle::OneOverPt() const {return 1. / Pt();}
158inline Bool_t AliAODMCParticle::PxPyPz(Double_t p[3]) const { p[0] = fPx; p[1] = fPy; p[2] = fPz; return kTRUE; }
0b603250 159inline Double_t AliAODMCParticle::Phi() const {return TMath::Pi()+TMath::ATan2(-fPy,-fPx); } // note that Phi() returns an angle between 0 and 2pi
160inline Double_t AliAODMCParticle::Theta() const {return (fPz==0)?TMath::PiOver2():TMath::ACos(fPz/P()); }
da97a08a 161inline Double_t AliAODMCParticle::Xv() const {return fVx;}
162inline Double_t AliAODMCParticle::Yv() const {return fVy;}
163inline Double_t AliAODMCParticle::Zv() const {return fVz;}
164inline Bool_t AliAODMCParticle::XvYvZv(Double_t x[3]) const { x[0] = fVx; x[1] = fVy; x[2] = fVz; return kTRUE; }
0b603250 165inline Double_t AliAODMCParticle::T() const {return fVt;}
da97a08a 166inline Double_t AliAODMCParticle::E() const {return fE;}
167inline Double_t AliAODMCParticle::Eta() const {
168 Double_t pmom = P();
169 if (pmom != TMath::Abs(fPz)) return 0.5*TMath::Log((pmom+fPz)/(pmom-fPz));
170 else return 1.e30;
171}
172
173
174inline Double_t AliAODMCParticle::Y() const
175{
176 Double_t e = E();
177 Double_t pz = Pz();
178
5e5ebe83 179 if (e > TMath::Abs(pz)) {
da97a08a 180 return 0.5*TMath::Log((e+pz)/(e-pz));
181 } else {
182 return -999.;
183 }
184}
185
186inline Int_t AliAODMCParticle::Label() const {return fLabel;}
187
188inline Double_t AliAODMCParticle::GetCalcMass() const {
189
190 Double_t m2 = E()*E()-Px()*Px()-Py()*Py()-Pz()*Pz();
191 if(m2<0)return 0;
192 return TMath::Sqrt(m2);
193}
194
195
196#endif