Fixes for bug #52499: Field polarities inconsistiency
[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;
51
52 virtual Double_t E() const;
53 virtual Double_t M() const;
54
55 virtual Double_t Eta() const;
56 virtual Double_t Y() const;
57
58 virtual Short_t Charge() const;
59
60 virtual Int_t Label() const;
61 virtual Int_t GetLabel() const {return Label();}
62
63 // PID
64 virtual const Double_t *PID() const {return 0;} // return PID object (to be defined, still)
65
66 //
67 virtual Double_t GetCalcMass() const;
68 virtual void SetDaughter(Int_t i,Int_t id){if(i<2)fDaughter[i] = id;}
69 virtual Int_t GetDaughter(Int_t i) const {return fDaughter[i];}
70 virtual void SetMother(Int_t im){fMother = im;}
71 virtual Int_t GetMother() const {return fMother;}
72 virtual void Print(const Option_t *opt = "") const;
73 virtual Int_t GetPdgCode() const { return fPdgCode;}
74
75 enum { kPrimary = 1<<0, kPhysicalPrim = 1<<1 };
76 void SetFlag(Int_t flag){fFlag = flag;}
77 Int_t GetFlag() const {return fFlag;}
78
79 // Bitwise operations
80 void SetPrimary(Bool_t b = kTRUE){
81 if(b)fFlag |= kPrimary;
82 else fFlag &= ~kPrimary;
83 }
84 Bool_t IsPrimary() const {return ((fFlag&kPrimary)==kPrimary);}
85
86 void SetPhysicalPrimary(Bool_t b = kTRUE){
87 if(b)fFlag |= kPhysicalPrim;
88 else fFlag &= ~kPhysicalPrim;
89 }
90 Bool_t IsPhysicalPrimary() const {return ((fFlag&kPhysicalPrim)==kPhysicalPrim);}
91 static const char* StdBranchName(){return fgkStdBranchName.Data();}
92
93 private:
94
95 static TString fgkStdBranchName; // Standard branch name
96
97
98 Int_t fPdgCode; // PDG code of the particle
99 Int_t fFlag; // Flag for indication of primary etc
100 Int_t fLabel; // Label of the original MCParticle
101 Int_t fMother; // Index of the mother particles
102 Int_t fDaughter[2]; // Indices of the daughter particles
1d8ad855 103 Double32_t fPx; // x component of momentum
104 Double32_t fPy; // y component of momentum
105 Double32_t fPz; // z component of momentum
106 Double32_t fE; // [0.,0.,12]
da97a08a 107
108 Double32_t fVx; // [0.,0.,12] x of production vertex
109 Double32_t fVy; // [0.,0.,12] y of production vertex
110 Double32_t fVz; // [0.,0.,12] z of production vertex
111
112 // Copy the uniquID to another data member? unique ID is correctly handled
113 // via TOBject Copy construct but not by AliVParticle ctor (no passing of
114 // TParicles
115 // Need a flag for primaries?
116
117 /*
118 const TMCProcess kMCprocesses[kMaxMCProcess] =
119 {
120 kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
121 kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
122 kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
123 kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
124 kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
125 kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
126 };
127 */
128
129
130
131
1d8ad855 132 ClassDef(AliAODMCParticle,2) // AliVParticle realisation for AODMCParticles
da97a08a 133
134};
135
136inline Double_t AliAODMCParticle::Px() const {return fPx;}
137inline Double_t AliAODMCParticle::Py() const {return fPy;}
138inline Double_t AliAODMCParticle::Pz() const {return fPz;}
139inline Double_t AliAODMCParticle::Pt() const {return TMath::Sqrt(fPx*fPx+fPy*fPy);}
140inline Double_t AliAODMCParticle::P() const {return TMath::Sqrt(fPx*fPx+fPy*fPy+fPz*fPz); }
141inline Double_t AliAODMCParticle::OneOverPt() const {return 1. / Pt();}
142inline Bool_t AliAODMCParticle::PxPyPz(Double_t p[3]) const { p[0] = fPx; p[1] = fPy; p[2] = fPz; return kTRUE; }
143inline Double_t AliAODMCParticle::Phi() const { return TMath::Pi()+TMath::ATan2(-fPy,-fPx); } // note that Phi() returns an angle between 0 and 2pi
144inline Double_t AliAODMCParticle::Theta() const { return (fPz==0)?TMath::PiOver2():TMath::ACos(fPz/P()); }
145inline Double_t AliAODMCParticle::Xv() const {return fVx;}
146inline Double_t AliAODMCParticle::Yv() const {return fVy;}
147inline Double_t AliAODMCParticle::Zv() const {return fVz;}
148inline Bool_t AliAODMCParticle::XvYvZv(Double_t x[3]) const { x[0] = fVx; x[1] = fVy; x[2] = fVz; return kTRUE; }
149inline Double_t AliAODMCParticle::E() const {return fE;}
150inline Double_t AliAODMCParticle::Eta() const {
151 Double_t pmom = P();
152 if (pmom != TMath::Abs(fPz)) return 0.5*TMath::Log((pmom+fPz)/(pmom-fPz));
153 else return 1.e30;
154}
155
156
157inline Double_t AliAODMCParticle::Y() const
158{
159 Double_t e = E();
160 Double_t pz = Pz();
161
162 if (e != TMath::Abs(pz)) {
163 return 0.5*TMath::Log((e+pz)/(e-pz));
164 } else {
165 return -999.;
166 }
167}
168
169inline Int_t AliAODMCParticle::Label() const {return fLabel;}
170
171inline Double_t AliAODMCParticle::GetCalcMass() const {
172
173 Double_t m2 = E()*E()-Px()*Px()-Py()*Py()-Pz()*Pz();
174 if(m2<0)return 0;
175 return TMath::Sqrt(m2);
176}
177
178
179#endif