PdgCode() ported to the interface
[u/mrichter/AliRoot.git] / STEER / AliAODMCParticle.h
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"
21 #include "AliMCParticle.h"
22
23 class AliAODEvent;
24 class TParticle;
25 class TClonesArray;
26
27 class AliAODMCParticle: public AliVParticle {
28  public:
29   AliAODMCParticle();
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);
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     virtual Double_t T() const;
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
61     virtual Int_t   Label()       const;
62     virtual Int_t   GetLabel()    const {return Label();} 
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];}
71     virtual Int_t GetNDaughters  () const { return fDaughter[1]>0 ? fDaughter[1]-fDaughter[0]+1 : 0;}
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;}
76     virtual Int_t PdgCode()    const { return GetPdgCode();}
77     
78     enum { kPrimary = 1<<0, kPhysicalPrim = 1<<1 };
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     }
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
117   UInt_t           fFlag;                 // Flag for indication of primary etc
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
121   Double32_t       fPx;                   // x component of momentum
122   Double32_t       fPy;                   // y component of momentum
123   Double32_t       fPz;                   // z component of momentum
124   Double32_t       fE;                    // Energy
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
129   Double32_t       fVt;                   // [0.,0.,12] t of production vertex
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 
133   // TParticles
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
148   ClassDef(AliAODMCParticle,5)  // AliVParticle realisation for AODMCParticles
149
150 };
151
152 inline Double_t AliAODMCParticle::Px()        const {return fPx;}
153 inline Double_t AliAODMCParticle::Py()        const {return fPy;}
154 inline Double_t AliAODMCParticle::Pz()        const {return fPz;}
155 inline Double_t AliAODMCParticle::Pt()        const {return TMath::Sqrt(fPx*fPx+fPy*fPy);}
156 inline Double_t AliAODMCParticle::P()         const {return TMath::Sqrt(fPx*fPx+fPy*fPy+fPz*fPz); }
157 inline Double_t AliAODMCParticle::OneOverPt() const {return 1. / Pt();}
158 inline Bool_t   AliAODMCParticle::PxPyPz(Double_t p[3]) const { p[0] = fPx; p[1] = fPy; p[2] = fPz; return kTRUE; }
159 inline Double_t AliAODMCParticle::Phi()       const {return TMath::Pi()+TMath::ATan2(-fPy,-fPx); }  // note that Phi() returns an angle between 0 and 2pi
160 inline Double_t AliAODMCParticle::Theta()     const {return (fPz==0)?TMath::PiOver2():TMath::ACos(fPz/P()); }
161 inline Double_t AliAODMCParticle::Xv()        const {return fVx;}
162 inline Double_t AliAODMCParticle::Yv()        const {return fVy;}
163 inline Double_t AliAODMCParticle::Zv()        const {return fVz;}
164 inline Bool_t   AliAODMCParticle::XvYvZv(Double_t x[3]) const { x[0] = fVx; x[1] = fVy; x[2] = fVz; return kTRUE; }
165 inline Double_t AliAODMCParticle::T()         const {return fVt;}
166 inline Double_t AliAODMCParticle::E()         const {return fE;}
167 inline 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
174 inline Double_t AliAODMCParticle::Y()         const 
175 {
176     Double_t e  = E();
177     Double_t pz = Pz();
178     
179     if (e > TMath::Abs(pz)) { 
180         return 0.5*TMath::Log((e+pz)/(e-pz));
181     } else { 
182         return -999.;
183     }
184 }
185
186 inline Int_t AliAODMCParticle::Label()       const {return fLabel;}
187
188 inline 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