]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AOD/AliAODTrack.h
ce536a147c5dc6ba0ec3c2b9e578080d2414a206
[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 { 
128     UShort_t cl = fTPCFitMap.CountBits();
129     if(cl==0)return fTPCClusterMap.CountBits();// backward compatibility
130     return cl;
131   }
132   
133   virtual Double_t M() const { return M(GetMostProbablePID()); }
134   Double_t M(AODTrkPID_t pid) const;
135   virtual Double_t E() const { return E(GetMostProbablePID()); }
136   Double_t E(AODTrkPID_t pid) const;
137   Double_t E(Double_t m) const { return TMath::Sqrt(P()*P() + m*m); }
138   virtual Double_t Y() const { return Y(GetMostProbablePID()); }
139   Double_t Y(AODTrkPID_t pid) const;
140   Double_t Y(Double_t m) const;
141   
142   virtual Double_t Eta() const { return -TMath::Log(TMath::Tan(0.5 * fMomentum[2])); }
143
144   virtual Short_t  Charge() const {return fCharge; }
145
146   virtual Bool_t   PropagateToDCA(const AliVVertex *vtx, 
147           Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3]);
148
149   // PID
150   virtual const Double_t *PID() const { return fPID; }
151   AODTrkPID_t GetMostProbablePID() const;
152   void ConvertAliPIDtoAODPID();
153   void SetDetPID(AliAODPid *aodpid) {fDetPid = aodpid;}
154
155   template <class T> void GetPID(T *pid) const {
156     for(Int_t i=0; i<10; ++i) pid[i]=fPID[i];}
157  
158   template <class T> void SetPID(const T *pid) {
159     if(pid) for(Int_t i=0; i<10; ++i) fPID[i]=pid[i];
160     else {for(Int_t i=0; i<10; fPID[i++]=0.) ; fPID[AliAODTrack::kUnknown]=1.;}}
161
162   Bool_t IsOn(Int_t mask) const {return (fFlags&mask)>0;}
163   ULong_t GetStatus() const { return GetFlags(); }
164   ULong_t GetFlags() const { return fFlags; }
165
166   Int_t   GetID() const { return (Int_t)fID; }
167   Int_t   GetLabel() const { return fLabel; } 
168   Char_t  GetType() const { return fType;}
169   Bool_t  IsPrimaryCandidate() const;
170   Bool_t  GetUsedForVtxFit() const { return TestBit(kUsedForVtxFit); }
171   Bool_t  GetUsedForPrimVtxFit() const { return TestBit(kUsedForPrimVtxFit); }
172
173   Bool_t  IsHybridGlobalConstrainedGlobal() const { return TestBit(kIsHybridGCG); }
174   Bool_t  IsHybridTPCConstrainedGlobal() const { return TestBit(kIsHybridTPCCG); }
175   Bool_t  IsTPCOnly() const { return IsTPCConstrained(); } // obsolete bad naming
176   Bool_t  IsTPCConstrained() const { return TestBit(kIsTPCConstrained); }
177   Bool_t  IsGlobalConstrained() const { return TestBit(kIsGlobalConstrained); }
178   //
179   Int_t   GetTOFBunchCrossing(Double_t b=0) const;
180   //
181   template <class T> void GetP(T *p) const {
182     p[0]=fMomentum[0]; p[1]=fMomentum[1]; p[2]=fMomentum[2];}
183
184 //  template <class T> void GetPxPyPz(T *p) const {
185 //    p[0] = Px(); p[1] = Py(); p[2] = Pz();}
186   Bool_t GetPxPyPz(Double_t *p) const;
187
188   template <class T> Bool_t GetPosition(T *x) const {
189     x[0]=fPosition[0]; x[1]=fPosition[1]; x[2]=fPosition[2];
190     return TestBit(kIsDCA);}
191
192   template <class T> void SetCovMatrix(const T *covMatrix) {
193     if(!fCovMatrix) fCovMatrix=new AliAODRedCov<6>();
194     fCovMatrix->SetCovMatrix(covMatrix);}
195
196   template <class T> Bool_t GetCovMatrix(T *covMatrix) const {
197     if(!fCovMatrix) return kFALSE;
198     fCovMatrix->GetCovMatrix(covMatrix); return kTRUE;}
199
200   Bool_t GetXYZ(Double_t *p) const {
201     return GetPosition(p); }
202
203   Bool_t GetCovarianceXYZPxPyPz(Double_t cv[21]) const {
204     return GetCovMatrix(cv);}
205
206   void RemoveCovMatrix() {delete fCovMatrix; fCovMatrix=NULL;}
207
208   Double_t XAtDCA() const { return fPositionAtDCA[0]; }
209   Double_t YAtDCA() const { return fPositionAtDCA[1]; }
210   Double_t ZAtDCA() const {
211     if (IsMuonTrack()) return fPosition[2];
212     else if (TestBit(kIsDCA)) return fPosition[1];
213     else return -999.; }
214   Bool_t   XYZAtDCA(Double_t x[3]) const { x[0] = XAtDCA(); x[1] = YAtDCA(); x[2] = ZAtDCA(); return kTRUE; }
215   
216   Double_t DCA() const {
217     if (IsMuonTrack()) return TMath::Sqrt(XAtDCA()*XAtDCA() + YAtDCA()*YAtDCA());
218     else if (TestBit(kIsDCA)) return fPosition[0];
219     else return -999.; }
220   
221   Double_t PxAtDCA() const { return fMomentumAtDCA[0]; }
222   Double_t PyAtDCA() const { return fMomentumAtDCA[1]; }
223   Double_t PzAtDCA() const { return fMomentumAtDCA[2]; }
224   Double_t PAtDCA() const { return TMath::Sqrt(PxAtDCA()*PxAtDCA() + PyAtDCA()*PyAtDCA() + PzAtDCA()*PzAtDCA()); }
225   Bool_t   PxPyPzAtDCA(Double_t p[3]) const { p[0] = PxAtDCA(); p[1] = PyAtDCA(); p[2] = PzAtDCA(); return kTRUE; }
226   
227   Double_t GetRAtAbsorberEnd() const { return fRAtAbsorberEnd; }
228   
229   UChar_t  GetITSClusterMap() const       { return (UChar_t)(fITSMuonClusterMap&0xff); }
230   Int_t    GetITSNcls() const; 
231   Bool_t   HasPointOnITSLayer(Int_t i) const { return TESTBIT(GetITSClusterMap(),i); }
232   UShort_t GetHitsPatternInTrigCh() const { return (UShort_t)((fITSMuonClusterMap&0xff00)>>8); }
233   UInt_t   GetMUONClusterMap() const      { return (fITSMuonClusterMap&0x3ff0000)>>16; }
234   UInt_t   GetITSMUONClusterMap() const   { return fITSMuonClusterMap; }
235   
236   Bool_t  TestFilterBit(UInt_t filterBit) const {return (Bool_t) ((filterBit & fFilterMap) != 0);}
237   Bool_t  TestFilterMask(UInt_t filterMask) const {return (Bool_t) ((filterMask & fFilterMap) == filterMask);}
238   void    SetFilterMap(UInt_t i){fFilterMap = i;}
239   UInt_t  GetFilterMap() const {return fFilterMap;}
240
241   const TBits& GetTPCClusterMap() const {return fTPCClusterMap;}
242   const TBits& GetTPCFitMap() const {return fTPCFitMap;}
243   Float_t GetTPCClusterInfo(Int_t nNeighbours=3, Int_t type=0, Int_t row0=0, Int_t row1=159, Int_t /*type*/=0) const;
244   
245   const TBits& GetTPCSharedMap() const {return fTPCSharedMap;}
246   void    SetTPCClusterMap(const TBits amap) {fTPCClusterMap = amap;}
247   void    SetTPCSharedMap(const TBits amap) {fTPCSharedMap = amap;}
248   void    SetTPCFitMap(const TBits amap) {fTPCFitMap = amap;}
249   void    SetTPCPointsF(UShort_t  findable){fTPCnclsF = findable;}
250
251   UShort_t GetTPCNclsF() const { return fTPCnclsF;}
252
253   // Calorimeter Cluster
254   Int_t GetEMCALcluster() const {return fCaloIndex;}
255   void SetEMCALcluster(Int_t index) {fCaloIndex=index;}
256   Bool_t IsEMCAL() const {return fFlags&kEMCALmatch;}
257
258   Int_t GetPHOScluster() const {return fCaloIndex;}
259   void SetPHOScluster(Int_t index) {fCaloIndex=index;}
260   Bool_t IsPHOS() const {return fFlags&kPHOSmatch;}
261
262   //pid signal interface
263   Double_t  GetITSsignal()       const { return fDetPid?fDetPid->GetITSsignal():0.;    }
264   Double_t  GetTPCsignal()       const { return fDetPid?fDetPid->GetTPCsignal():0.;    }
265   UShort_t  GetTPCsignalN()      const { return fDetPid?fDetPid->GetTPCsignalN():0;    }
266   Double_t  GetTPCmomentum()     const { return fDetPid?fDetPid->GetTPCmomentum():0.;  }
267   Double_t  GetTOFsignal()       const { return fDetPid?fDetPid->GetTOFsignal():0.;    }
268   Double_t  GetHMPIDsignal()     const { return fDetPid?fDetPid->GetHMPIDsignal():0.;  }
269   
270   void      GetIntegratedTimes(Double_t *times) const {if (fDetPid) fDetPid->GetIntegratedTimes(times); }
271   Double_t  GetTRDslice(Int_t plane, Int_t slice) const;
272   Double_t  GetTRDmomentum(Int_t plane, Double_t */*sp*/=0x0) const;
273   UChar_t   GetTRDncls(Int_t layer = -1) const;
274   UChar_t   GetTRDntrackletsPID() const;
275   void      GetHMPIDpid(Double_t *p) const { if (fDetPid) fDetPid->GetHMPIDprobs(p); }
276
277   
278   AliAODPid    *GetDetPid() const { return fDetPid; }
279   AliAODVertex *GetProdVertex() const { return (AliAODVertex*)fProdVertex.GetObject(); }
280   
281   // print
282   void  Print(const Option_t *opt = "") const;
283
284   // setters
285   void SetFlags(ULong_t flags) { fFlags = flags; }
286   void SetStatus(ULong_t flags) { fFlags|=flags; }
287   void ResetStatus(ULong_t flags) { fFlags&=~flags; }
288
289   void SetID(Short_t id) { fID = id; }
290   void SetLabel(Int_t label) { fLabel = label; }
291
292   template <class T> void SetPosition(const T *x, Bool_t isDCA = kFALSE);
293   void SetDCA(Double_t d, Double_t z);
294   void SetUsedForVtxFit(Bool_t used = kTRUE) { used ? SetBit(kUsedForVtxFit) : ResetBit(kUsedForVtxFit); }
295   void SetUsedForPrimVtxFit(Bool_t used = kTRUE) { used ? SetBit(kUsedForPrimVtxFit) : ResetBit(kUsedForPrimVtxFit); }
296
297   void SetIsTPCOnly(Bool_t b = kTRUE) { SetIsTPCConstrained(b); }// obsolete bad naming
298
299   void SetIsTPCConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsTPCConstrained) : ResetBit(kIsTPCConstrained); }
300   void SetIsHybridTPCConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridTPCCG) : ResetBit(kIsHybridTPCCG); }
301
302   void SetIsGlobalConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsGlobalConstrained) : ResetBit(kIsGlobalConstrained); }
303   void SetIsHybridGlobalConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridGCG) : ResetBit(kIsHybridGCG); }
304
305
306
307   void SetOneOverPt(Double_t oneOverPt) { fMomentum[0] = 1. / oneOverPt; }
308   void SetPt(Double_t pt) { fMomentum[0] = pt; };
309   void SetPhi(Double_t phi) { fMomentum[1] = phi; }
310   void SetTheta(Double_t theta) { fMomentum[2] = theta; }
311   template <class T> void SetP(const T *p, Bool_t cartesian = kTRUE);
312   void SetP() {fMomentum[0]=fMomentum[1]=fMomentum[2]=-999.;}
313
314   void SetXYAtDCA(Double_t x, Double_t y) {fPositionAtDCA[0] = x; fPositionAtDCA[1] = y;}
315   void SetPxPyPzAtDCA(Double_t pX, Double_t pY, Double_t pZ) {fMomentumAtDCA[0] = pX; fMomentumAtDCA[1] = pY; fMomentumAtDCA[2] = pZ;}
316   
317   void SetRAtAbsorberEnd(Double_t r) { fRAtAbsorberEnd = r; }
318   
319   void SetCharge(Short_t q) { fCharge = q; }
320   void SetChi2perNDF(Double_t chi2perNDF) { fChi2perNDF = chi2perNDF; }
321
322   void SetITSClusterMap(UChar_t itsClusMap)                 { fITSMuonClusterMap = (fITSMuonClusterMap&0xffffff00)|(((UInt_t)itsClusMap)&0xff); }
323   void SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh) { fITSMuonClusterMap = (fITSMuonClusterMap&0xffff00ff)|((((UInt_t)hitsPatternInTrigCh)&0xff)<<8); }
324   void SetMuonClusterMap(UInt_t muonClusMap)                { fITSMuonClusterMap = (fITSMuonClusterMap&0xfc00ffff)|((muonClusMap&0x3ff)<<16); }
325   void SetITSMuonClusterMap(UInt_t itsMuonClusMap)          { fITSMuonClusterMap = itsMuonClusMap; }
326
327   Int_t GetMatchTrigger() const {return fITSMuonClusterMap>>30;}
328                                         //  0 Muon track does not match trigger
329                                         //  1 Muon track match but does not pass pt cut
330                                         //  2 Muon track match Low pt cut
331                                         //  3 Muon track match High pt cut
332   void     SetMatchTrigger(Int_t MatchTrigger);
333   Bool_t   MatchTrigger() const { return (GetMatchTrigger()>0); }         //  Muon track matches trigger track
334   Bool_t   MatchTriggerLowPt()   const  { return (GetMatchTrigger()>1); } //  Muon track matches trigger track and passes Low pt cut
335   Bool_t   MatchTriggerHighPt()  const  { return (GetMatchTrigger()>2); } //  Muon track matches trigger track and passes High pt cut
336   Bool_t   MatchTriggerDigits()  const;                                   //  Muon track matches trigger digits
337   Double_t GetChi2MatchTrigger() const  { return fChi2MatchTrigger;}
338   void     SetChi2MatchTrigger(Double_t Chi2MatchTrigger) {fChi2MatchTrigger = Chi2MatchTrigger; }
339   Bool_t   HitsMuonChamber(Int_t MuonChamber, Int_t cathode = -1) const;  // Check if track hits Muon chambers
340   Bool_t   IsMuonTrack() const { return (GetMUONClusterMap()>0) ? kTRUE : kFALSE; }
341   
342   void     Connected(Bool_t flag) {flag ? SETBIT(fITSMuonClusterMap,26) : CLRBIT(fITSMuonClusterMap,26);}
343   Bool_t   IsConnected() const {return TESTBIT(fITSMuonClusterMap,26);}
344
345   void     SetProdVertex(TObject *vertex) { fProdVertex = vertex; }
346   void     SetType(AODTrk_t ttype) { fType=ttype; }
347
348
349
350   // Dummy
351   Int_t    PdgCode() const {return 0;}
352   
353  private :
354
355   // Momentum & position
356   Double32_t    fMomentum[3];       // momemtum stored in pt, phi, theta
357   Double32_t    fPosition[3];       // position of first point on track or dca
358   
359   Double32_t    fMomentumAtDCA[3];  // momentum (px,py,pz) at DCA
360   Double32_t    fPositionAtDCA[2];  // trasverse position (x,y) at DCA
361   
362   Double32_t    fRAtAbsorberEnd;    // transverse position r at the end of the muon absorber
363   
364   Double32_t    fChi2perNDF;        // chi2/NDF of momentum fit
365   Double32_t    fChi2MatchTrigger;  // chi2 of trigger/track matching
366   Double32_t    fPID[10];           // [0.,1.,8] pointer to PID object
367
368   ULong_t       fFlags;             // reconstruction status flags 
369   Int_t         fLabel;             // track label, points back to MC track
370   
371   UInt_t        fITSMuonClusterMap; // map of ITS and muon clusters, one bit per layer
372                                     // (ITS: bit 1-8, muon trigger: bit 9-16, muon tracker: bit 17-26, muon match trigger: bit 31-32) 
373   UInt_t        fFilterMap;         // filter information, one bit per set of cuts
374
375   TBits         fTPCFitMap;      // Map of clusters, one bit per padrow; if has a cluster on given padrow which is used in the fit   
376   TBits         fTPCClusterMap;     // Map of clusters, one bit per padrow; 1 if has a cluster on given padrow
377   TBits         fTPCSharedMap;      // Map of clusters, one bit per padrow; 1 if has a shared cluster on given padrow
378
379   UShort_t      fTPCnclsF;          // findable clusters
380
381   Short_t       fID;                // unique track ID, points back to the ESD track
382
383   Char_t        fCharge;            // particle charge
384   Char_t        fType;              // Track Type
385
386   Int_t         fCaloIndex;         // index of associated EMCAL/PHOS cluster (AliAODCaloCluster)
387
388   
389   AliAODRedCov<6> *fCovMatrix;      // covariance matrix (x, y, z, px, py, pz)
390   AliAODPid    *fDetPid;            // more detailed or detector specific pid information
391   TRef          fProdVertex;        // vertex of origin
392
393   ClassDef(AliAODTrack, 15);
394 };
395
396 inline Bool_t  AliAODTrack::IsPrimaryCandidate() const
397 {
398     // True of track passes primary particle selection (independent of type) 
399     // 
400     if (fFilterMap) {
401         return kTRUE;
402     } else {
403         return kFALSE;
404     }
405 }
406
407 inline Int_t AliAODTrack::GetITSNcls() const 
408 {
409   // Number of points in ITS
410   Int_t n=0;
411   for(Int_t i=0;i<6;i++) if(HasPointOnITSLayer(i)) n++;
412   return n;
413 }
414
415 #endif