Removing the option to vary the density of the materials (M. Sitta)
[u/mrichter/AliRoot.git] / STEER / AOD / AliAODTrack.h
1 #ifndef AliAODTrack_H
2 #define AliAODTrack_H
3 /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 //-------------------------------------------------------------------------
9 //     AOD track implementation of AliVTrack
10 //     Author: Markus Oldenburg, CERN
11 //-------------------------------------------------------------------------
12
13 #include <TRef.h>
14 #include <TBits.h>
15
16 #include "AliVTrack.h"
17 #include "AliAODVertex.h"
18 #include "AliAODRedCov.h"
19 #include "AliAODPid.h"
20  
21
22 class AliVVertex;
23
24 class AliAODTrack : public AliVTrack {
25
26  public:
27   
28   enum AODTrk_t {kUndef = -1, 
29                  kPrimary, 
30                  kSecondary, 
31                  kOrphan};
32
33   enum AODTrkBits_t {
34     kIsDCA=BIT(14),   // set if fPosition is the DCA and not the position of the first point
35     kUsedForVtxFit=BIT(15), // set if this track was used to fit the vertex it is attached to
36     kUsedForPrimVtxFit=BIT(16), // set if this track was used to fit the primary vertex
37     kIsTPCConstrained=BIT(17), // set if this track is a SA TPC track constrained to the SPD vertex, needs to be skipped in any track loop to avoid double counting
38     kIsHybridTPCCG=BIT(18), // set if this track can be used as a hybrid track i.e. Gbobal tracks with certain slecetion plus the TPC constrained tracks that did not pass the selection
39     kIsGlobalConstrained=BIT(19), // set if this track is a global track constrained to the vertex, needs to be skipped in any track loop to avoid double counting
40     kIsHybridGCG=BIT(20)// set if this track can be used as a hybrid track i.e. tracks with certain slecetion plus the global constraint tracks that did not pass the selection
41   };
42
43
44   enum AODTrkFilterBits_t {
45     kTrkTPCOnly            = BIT(0), // Standard TPC only tracks
46     kTrkITSsa              = BIT(1), // ITS standalone
47     kTrkITSConstrained     = BIT(2), // Pixel OR necessary for the electrons
48     kTrkElectronsPID       = BIT(3),    // PID for the electrons
49     kTrkGlobalNoDCA        = BIT(4), // standard cuts with very loose DCA
50     kTrkGlobal             = BIT(5),  // standard cuts with tight DCA cut
51     kTrkGlobalSDD          = BIT(6), // standard cuts with tight DCA but with requiring the first SDD cluster instead of an SPD cluster tracks selected by this cut are exclusive to those selected by the previous cut
52     kTrkTPCOnlyConstrained = BIT(7) // TPC only tracks: TPConly information constrained to SPD vertex in the filter below
53   };
54   
55
56   enum AODTrkPID_t {
57     kElectron     =  0,
58     kMuon         =  1,
59     kPion         =  2,
60     kKaon         =  3,
61     kProton       =  4,
62     kDeuteron     =  5,
63     kTriton       =  6,
64     kHelium3      =  7,
65     kAlpha        =  8,
66     kUnknown      =  9,
67     kMostProbable = -1
68   };
69
70   AliAODTrack();
71   AliAODTrack(Short_t id,
72               Int_t label,
73               Double_t p[3],
74               Bool_t cartesian,
75               Double_t x[3],
76               Bool_t dca,
77               Double_t covMatrix[21],
78               Short_t q,
79               UChar_t itsClusMap,
80               Double_t pid[10],
81               AliAODVertex *prodVertex,
82               Bool_t usedForVtxFit,
83               Bool_t usedForPrimVtxFit,
84               AODTrk_t ttype=kUndef,
85               UInt_t selectInfo=0,
86               Float_t chi2perNDF = -999.);
87
88   AliAODTrack(Short_t id,
89               Int_t label,
90               Float_t p[3],
91               Bool_t cartesian,
92               Float_t x[3],
93               Bool_t dca,
94               Float_t covMatrix[21],
95               Short_t q,
96               UChar_t itsClusMap,
97               Float_t pid[10],
98               AliAODVertex *prodVertex,
99               Bool_t usedForVtxFit,
100               Bool_t usedForPrimVtxFit,
101               AODTrk_t ttype=kUndef,
102               UInt_t selectInfo=0,
103               Float_t chi2perNDF = -999.);
104
105   virtual ~AliAODTrack();
106   AliAODTrack(const AliAODTrack& trk); 
107   AliAODTrack& operator=(const AliAODTrack& trk);
108
109   // kinematics
110   virtual Double_t OneOverPt() const { return (fMomentum[0] != 0.) ? 1./fMomentum[0] : -999.; }
111   virtual Double_t Phi()       const { return fMomentum[1]; }
112   virtual Double_t Theta()     const { return fMomentum[2]; }
113   
114   virtual Double_t Px() const { return fMomentum[0] * TMath::Cos(fMomentum[1]); }
115   virtual Double_t Py() const { return fMomentum[0] * TMath::Sin(fMomentum[1]); }
116   virtual Double_t Pz() const { return fMomentum[0] / TMath::Tan(fMomentum[2]); }
117   virtual Double_t Pt() const { return fMomentum[0]; }
118   virtual Double_t P()  const { return TMath::Sqrt(Pt()*Pt()+Pz()*Pz()); }
119   virtual Bool_t   PxPyPz(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
120
121   virtual Double_t Xv() const { return GetProdVertex() ? GetProdVertex()->GetX() : -999.; }
122   virtual Double_t Yv() const { return GetProdVertex() ? GetProdVertex()->GetY() : -999.; }
123   virtual Double_t Zv() const { return GetProdVertex() ? GetProdVertex()->GetZ() : -999.; }
124   virtual Bool_t   XvYvZv(Double_t x[3]) const { x[0] = Xv(); x[1] = Yv(); x[2] = Zv(); return kTRUE; }
125
126   Double_t Chi2perNDF()  const { return fChi2perNDF; }
127   UShort_t GetTPCNcls()  const { return fTPCClusterMap.CountBits();}
128   
129   virtual Double_t M() const { return M(GetMostProbablePID()); }
130   Double_t M(AODTrkPID_t pid) const;
131   virtual Double_t E() const { return E(GetMostProbablePID()); }
132   Double_t E(AODTrkPID_t pid) const;
133   Double_t E(Double_t m) const { return TMath::Sqrt(P()*P() + m*m); }
134   virtual Double_t Y() const { return Y(GetMostProbablePID()); }
135   Double_t Y(AODTrkPID_t pid) const;
136   Double_t Y(Double_t m) const;
137   
138   virtual Double_t Eta() const { return -TMath::Log(TMath::Tan(0.5 * fMomentum[2])); }
139
140   virtual Short_t  Charge() const {return fCharge; }
141
142   virtual Bool_t   PropagateToDCA(const AliVVertex *vtx, 
143           Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3]);
144
145   // PID
146   virtual const Double_t *PID() const { return fPID; }
147   AODTrkPID_t GetMostProbablePID() const;
148   void ConvertAliPIDtoAODPID();
149   void SetDetPID(AliAODPid *aodpid) {fDetPid = aodpid;}
150
151   template <class T> void GetPID(T *pid) const {
152     for(Int_t i=0; i<10; ++i) pid[i]=fPID[i];}
153  
154   template <class T> void SetPID(const T *pid) {
155     if(pid) for(Int_t i=0; i<10; ++i) fPID[i]=pid[i];
156     else {for(Int_t i=0; i<10; fPID[i++]=0.) ; fPID[AliAODTrack::kUnknown]=1.;}}
157
158   Bool_t IsOn(Int_t mask) const {return (fFlags&mask)>0;}
159   ULong_t GetStatus() const { return GetFlags(); }
160   ULong_t GetFlags() const { return fFlags; }
161
162   Int_t   GetID() const { return (Int_t)fID; }
163   Int_t   GetLabel() const { return fLabel; } 
164   Char_t  GetType() const { return fType;}
165   Bool_t  IsPrimaryCandidate() const;
166   Bool_t  GetUsedForVtxFit() const { return TestBit(kUsedForVtxFit); }
167   Bool_t  GetUsedForPrimVtxFit() const { return TestBit(kUsedForPrimVtxFit); }
168
169   Bool_t  IsHybridGlobalConstrainedGlobal() const { return TestBit(kIsHybridGCG); }
170   Bool_t  IsHybridTPCConstrainedGlobal() const { return TestBit(kIsHybridTPCCG); }
171   Bool_t  IsTPCOnly() const { return IsTPCConstrained(); } // obsolete bad naming
172   Bool_t  IsTPCConstrained() const { return TestBit(kIsTPCConstrained); }
173   Bool_t  IsGlobalConstrained() const { return TestBit(kIsGlobalConstrained); }
174   //
175   Int_t   GetTOFBunchCrossing(Double_t b=0) const;
176   //
177   template <class T> void GetP(T *p) const {
178     p[0]=fMomentum[0]; p[1]=fMomentum[1]; p[2]=fMomentum[2];}
179
180 //  template <class T> void GetPxPyPz(T *p) const {
181 //    p[0] = Px(); p[1] = Py(); p[2] = Pz();}
182   Bool_t GetPxPyPz(Double_t *p) const;
183
184   template <class T> Bool_t GetPosition(T *x) const {
185     x[0]=fPosition[0]; x[1]=fPosition[1]; x[2]=fPosition[2];
186     return TestBit(kIsDCA);}
187
188   template <class T> void SetCovMatrix(const T *covMatrix) {
189     if(!fCovMatrix) fCovMatrix=new AliAODRedCov<6>();
190     fCovMatrix->SetCovMatrix(covMatrix);}
191
192   template <class T> Bool_t GetCovMatrix(T *covMatrix) const {
193     if(!fCovMatrix) return kFALSE;
194     fCovMatrix->GetCovMatrix(covMatrix); return kTRUE;}
195
196   Bool_t GetXYZ(Double_t *p) const {
197     return GetPosition(p); }
198
199   Bool_t GetCovarianceXYZPxPyPz(Double_t cv[21]) const {
200     return GetCovMatrix(cv);}
201
202   void RemoveCovMatrix() {delete fCovMatrix; fCovMatrix=NULL;}
203
204   Double_t XAtDCA() const { return fPositionAtDCA[0]; }
205   Double_t YAtDCA() const { return fPositionAtDCA[1]; }
206   Double_t ZAtDCA() const {
207     if (IsMuonTrack()) return fPosition[2];
208     else if (TestBit(kIsDCA)) return fPosition[1];
209     else return -999.; }
210   Bool_t   XYZAtDCA(Double_t x[3]) const { x[0] = XAtDCA(); x[1] = YAtDCA(); x[2] = ZAtDCA(); return kTRUE; }
211   
212   Double_t DCA() const {
213     if (IsMuonTrack()) return TMath::Sqrt(XAtDCA()*XAtDCA() + YAtDCA()*YAtDCA());
214     else if (TestBit(kIsDCA)) return fPosition[0];
215     else return -999.; }
216   
217   Double_t PxAtDCA() const { return fMomentumAtDCA[0]; }
218   Double_t PyAtDCA() const { return fMomentumAtDCA[1]; }
219   Double_t PzAtDCA() const { return fMomentumAtDCA[2]; }
220   Double_t PAtDCA() const { return TMath::Sqrt(PxAtDCA()*PxAtDCA() + PyAtDCA()*PyAtDCA() + PzAtDCA()*PzAtDCA()); }
221   Bool_t   PxPyPzAtDCA(Double_t p[3]) const { p[0] = PxAtDCA(); p[1] = PyAtDCA(); p[2] = PzAtDCA(); return kTRUE; }
222   
223   Double_t GetRAtAbsorberEnd() const { return fRAtAbsorberEnd; }
224   
225   UChar_t  GetITSClusterMap() const       { return (UChar_t)(fITSMuonClusterMap&0xff); }
226   Int_t    GetITSNcls() const; 
227   Bool_t   HasPointOnITSLayer(Int_t i) const { return TESTBIT(GetITSClusterMap(),i); }
228   UShort_t GetHitsPatternInTrigCh() const { return (UShort_t)((fITSMuonClusterMap&0xff00)>>8); }
229   UInt_t   GetMUONClusterMap() const      { return (fITSMuonClusterMap&0x3ff0000)>>16; }
230   UInt_t   GetITSMUONClusterMap() const   { return fITSMuonClusterMap; }
231   
232   Bool_t  TestFilterBit(UInt_t filterBit) const {return (Bool_t) ((filterBit & fFilterMap) != 0);}
233   Bool_t  TestFilterMask(UInt_t filterMask) const {return (Bool_t) ((filterMask & fFilterMap) == filterMask);}
234   void    SetFilterMap(UInt_t i){fFilterMap = i;}
235   UInt_t  GetFilterMap() const {return fFilterMap;}
236
237   const TBits& GetTPCClusterMap() const {return fTPCClusterMap;}
238   Float_t GetTPCClusterInfo(Int_t nNeighbours=3, Int_t type=0, Int_t row0=0, Int_t row1=159) const;
239   
240   const TBits& GetTPCSharedMap() const {return fTPCSharedMap;}
241   void    SetTPCClusterMap(const TBits amap) {fTPCClusterMap = amap;}
242   void    SetTPCSharedMap(const TBits amap) {fTPCSharedMap = amap;}
243   void    SetTPCPointsF(UShort_t  findable){fTPCnclsF = findable;}
244
245   UShort_t GetTPCNclsF() const { return fTPCnclsF;}
246
247   // Calorimeter Cluster
248   Int_t GetEMCALcluster() const {return fCaloIndex;}
249   void SetEMCALcluster(Int_t index) {fCaloIndex=index;}
250   Bool_t IsEMCAL() const {return fFlags&kEMCALmatch;}
251
252   Int_t GetPHOScluster() const {return fCaloIndex;}
253   void SetPHOScluster(Int_t index) {fCaloIndex=index;}
254   Bool_t IsPHOS() const {return fFlags&kPHOSmatch;}
255
256   //pid signal interface
257   Double_t  GetITSsignal()       const { return fDetPid?fDetPid->GetITSsignal():0.;    }
258   Double_t  GetTPCsignal()       const { return fDetPid?fDetPid->GetTPCsignal():0.;    }
259   UShort_t  GetTPCsignalN()      const { return fDetPid?fDetPid->GetTPCsignalN():0;    }
260   Double_t  GetTPCmomentum()     const { return fDetPid?fDetPid->GetTPCmomentum():0.;  }
261   Double_t  GetTOFsignal()       const { return fDetPid?fDetPid->GetTOFsignal():0.;    }
262   Double_t  GetHMPIDsignal()     const { return fDetPid?fDetPid->GetHMPIDsignal():0.;  }
263   
264   void      GetIntegratedTimes(Double_t *times) const {if (fDetPid) fDetPid->GetIntegratedTimes(times); }
265   Double_t  GetTRDslice(Int_t plane, Int_t slice) const;
266   Double_t  GetTRDmomentum(Int_t plane, Double_t */*sp*/=0x0) const;
267   UChar_t   GetTRDncls(Int_t layer = -1) const;
268   UChar_t   GetTRDntrackletsPID() const;
269   void      GetHMPIDpid(Double_t *p) const { if (fDetPid) fDetPid->GetHMPIDprobs(p); }
270
271   
272   AliAODPid    *GetDetPid() const { return fDetPid; }
273   AliAODVertex *GetProdVertex() const { return (AliAODVertex*)fProdVertex.GetObject(); }
274   
275   // print
276   void  Print(const Option_t *opt = "") const;
277
278   // setters
279   void SetFlags(ULong_t flags) { fFlags = flags; }
280   void SetStatus(ULong_t flags) { fFlags|=flags; }
281   void ResetStatus(ULong_t flags) { fFlags&=~flags; }
282
283   void SetID(Short_t id) { fID = id; }
284   void SetLabel(Int_t label) { fLabel = label; }
285
286   template <class T> void SetPosition(const T *x, Bool_t isDCA = kFALSE);
287   void SetDCA(Double_t d, Double_t z);
288   void SetUsedForVtxFit(Bool_t used = kTRUE) { used ? SetBit(kUsedForVtxFit) : ResetBit(kUsedForVtxFit); }
289   void SetUsedForPrimVtxFit(Bool_t used = kTRUE) { used ? SetBit(kUsedForPrimVtxFit) : ResetBit(kUsedForPrimVtxFit); }
290
291   void SetIsTPCOnly(Bool_t b = kTRUE) { SetIsTPCConstrained(b); }// obsolete bad naming
292
293   void SetIsTPCConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsTPCConstrained) : ResetBit(kIsTPCConstrained); }
294   void SetIsHybridTPCConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridTPCCG) : ResetBit(kIsHybridTPCCG); }
295
296   void SetIsGlobalConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsGlobalConstrained) : ResetBit(kIsGlobalConstrained); }
297   void SetIsHybridGlobalConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridGCG) : ResetBit(kIsHybridGCG); }
298
299
300
301   void SetOneOverPt(Double_t oneOverPt) { fMomentum[0] = 1. / oneOverPt; }
302   void SetPt(Double_t pt) { fMomentum[0] = pt; };
303   void SetPhi(Double_t phi) { fMomentum[1] = phi; }
304   void SetTheta(Double_t theta) { fMomentum[2] = theta; }
305   template <class T> void SetP(const T *p, Bool_t cartesian = kTRUE);
306   void SetP() {fMomentum[0]=fMomentum[1]=fMomentum[2]=-999.;}
307
308   void SetXYAtDCA(Double_t x, Double_t y) {fPositionAtDCA[0] = x; fPositionAtDCA[1] = y;}
309   void SetPxPyPzAtDCA(Double_t pX, Double_t pY, Double_t pZ) {fMomentumAtDCA[0] = pX; fMomentumAtDCA[1] = pY; fMomentumAtDCA[2] = pZ;}
310   
311   void SetRAtAbsorberEnd(Double_t r) { fRAtAbsorberEnd = r; }
312   
313   void SetCharge(Short_t q) { fCharge = q; }
314   void SetChi2perNDF(Double_t chi2perNDF) { fChi2perNDF = chi2perNDF; }
315
316   void SetITSClusterMap(UChar_t itsClusMap)                 { fITSMuonClusterMap = (fITSMuonClusterMap&0xffffff00)|(((UInt_t)itsClusMap)&0xff); }
317   void SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh) { fITSMuonClusterMap = (fITSMuonClusterMap&0xffff00ff)|((((UInt_t)hitsPatternInTrigCh)&0xff)<<8); }
318   void SetMuonClusterMap(UInt_t muonClusMap)                { fITSMuonClusterMap = (fITSMuonClusterMap&0xfc00ffff)|((muonClusMap&0x3ff)<<16); }
319   void SetITSMuonClusterMap(UInt_t itsMuonClusMap)          { fITSMuonClusterMap = itsMuonClusMap; }
320
321   Int_t GetMatchTrigger() const {return fITSMuonClusterMap>>30;}
322                                         //  0 Muon track does not match trigger
323                                         //  1 Muon track match but does not pass pt cut
324                                         //  2 Muon track match Low pt cut
325                                         //  3 Muon track match High pt cut
326   void     SetMatchTrigger(Int_t MatchTrigger);
327   Bool_t   MatchTrigger() const { return (GetMatchTrigger()>0); }         //  Muon track matches trigger track
328   Bool_t   MatchTriggerLowPt()   const  { return (GetMatchTrigger()>1); } //  Muon track matches trigger track and passes Low pt cut
329   Bool_t   MatchTriggerHighPt()  const  { return (GetMatchTrigger()>2); } //  Muon track matches trigger track and passes High pt cut
330   Bool_t   MatchTriggerDigits()  const;                                   //  Muon track matches trigger digits
331   Double_t GetChi2MatchTrigger() const  { return fChi2MatchTrigger;}
332   void     SetChi2MatchTrigger(Double_t Chi2MatchTrigger) {fChi2MatchTrigger = Chi2MatchTrigger; }
333   Bool_t   HitsMuonChamber(Int_t MuonChamber, Int_t cathode = -1) const;  // Check if track hits Muon chambers
334   Bool_t   IsMuonTrack() const { return (GetMUONClusterMap()>0) ? kTRUE : kFALSE; }
335   
336   void     Connected(Bool_t flag) {flag ? SETBIT(fITSMuonClusterMap,26) : CLRBIT(fITSMuonClusterMap,26);}
337   Bool_t   IsConnected() const {return TESTBIT(fITSMuonClusterMap,26);}
338
339   void     SetProdVertex(TObject *vertex) { fProdVertex = vertex; }
340   void     SetType(AODTrk_t ttype) { fType=ttype; }
341
342
343
344   // Dummy
345   Int_t    PdgCode() const {return 0;}
346   
347  private :
348
349   // Momentum & position
350   Double32_t    fMomentum[3];       // momemtum stored in pt, phi, theta
351   Double32_t    fPosition[3];       // position of first point on track or dca
352   
353   Double32_t    fMomentumAtDCA[3];  // momentum (px,py,pz) at DCA
354   Double32_t    fPositionAtDCA[2];  // trasverse position (x,y) at DCA
355   
356   Double32_t    fRAtAbsorberEnd;    // transverse position r at the end of the muon absorber
357   
358   Double32_t    fChi2perNDF;        // chi2/NDF of momentum fit
359   Double32_t    fChi2MatchTrigger;  // chi2 of trigger/track matching
360   Double32_t    fPID[10];           // [0.,1.,8] pointer to PID object
361
362   ULong_t       fFlags;             // reconstruction status flags 
363   Int_t         fLabel;             // track label, points back to MC track
364   
365   UInt_t        fITSMuonClusterMap; // map of ITS and muon clusters, one bit per layer
366                                     // (ITS: bit 1-8, muon trigger: bit 9-16, muon tracker: bit 17-26, muon match trigger: bit 31-32) 
367   UInt_t        fFilterMap;         // filter information, one bit per set of cuts
368
369   TBits         fTPCClusterMap;     // Map of clusters, one bit per padrow; 1 if has a cluster on given padrow
370   TBits         fTPCSharedMap;      // Map of clusters, one bit per padrow; 1 if has a shared cluster on given padrow
371   UShort_t      fTPCnclsF;          // findable clusters
372
373   Short_t       fID;                // unique track ID, points back to the ESD track
374
375   Char_t        fCharge;            // particle charge
376   Char_t        fType;              // Track Type
377
378   Int_t         fCaloIndex;         // index of associated EMCAL/PHOS cluster (AliAODCaloCluster)
379
380   
381   AliAODRedCov<6> *fCovMatrix;      // covariance matrix (x, y, z, px, py, pz)
382   AliAODPid    *fDetPid;            // more detailed or detector specific pid information
383   TRef          fProdVertex;        // vertex of origin
384
385   ClassDef(AliAODTrack, 14);
386 };
387
388 inline Bool_t  AliAODTrack::IsPrimaryCandidate() const
389 {
390     // True of track passes primary particle selection (independent of type) 
391     // 
392     if (fFilterMap) {
393         return kTRUE;
394     } else {
395         return kFALSE;
396     }
397 }
398
399 inline Int_t AliAODTrack::GetITSNcls() const 
400 {
401   // Number of points in ITS
402   Int_t n=0;
403   for(Int_t i=0;i<6;i++) if(HasPointOnITSLayer(i)) n++;
404   return n;
405 }
406
407 #endif