ALIROOT-5592 AliAODTrack::GetIntegratedTimes() breaks old analysis code
[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 class AliDetectorPID;
24 class AliTPCdEdxInfo;
25 class AliAODEvent;
26 class AliTOFHeader;
27
28 class AliAODTrack : public AliVTrack {
29
30  public:
31   
32   enum AODTrk_t {kUndef = -1, 
33                  kPrimary, 
34                  kSecondary, 
35                  kOrphan};
36
37   enum AODTrkBits_t {
38     kIsDCA=BIT(14),   // set if fPosition is the DCA and not the position of the first point
39     kUsedForVtxFit=BIT(15), // set if this track was used to fit the vertex it is attached to
40     kUsedForPrimVtxFit=BIT(16), // set if this track was used to fit the primary vertex
41     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
42     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
43     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
44     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
45   };
46
47
48   enum AODTrkFilterBits_t {
49     kTrkTPCOnly            = BIT(0), // Standard TPC only tracks
50     kTrkITSsa              = BIT(1), // ITS standalone
51     kTrkITSConstrained     = BIT(2), // Pixel OR necessary for the electrons
52     kTrkElectronsPID       = BIT(3),    // PID for the electrons
53     kTrkGlobalNoDCA        = BIT(4), // standard cuts with very loose DCA
54     kTrkGlobal             = BIT(5),  // standard cuts with tight DCA cut
55     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
56     kTrkTPCOnlyConstrained = BIT(7) // TPC only tracks: TPConly information constrained to SPD vertex in the filter below
57   };
58   
59
60   enum AODTrkPID_t {
61     kElectron     =  0,
62     kMuon         =  1,
63     kPion         =  2,
64     kKaon         =  3,
65     kProton       =  4,
66     kDeuteron     =  5,
67     kTriton       =  6,
68     kHelium3      =  7,
69     kAlpha        =  8,
70     kUnknown      =  9,
71     kMostProbable = -1
72   };
73
74   AliAODTrack();
75   AliAODTrack(Short_t id,
76               Int_t label,
77               Double_t p[3],
78               Bool_t cartesian,
79               Double_t x[3],
80               Bool_t dca,
81               Double_t covMatrix[21],
82               Short_t q,
83               UChar_t itsClusMap,
84               AliAODVertex *prodVertex,
85               Bool_t usedForVtxFit,
86               Bool_t usedForPrimVtxFit,
87               AODTrk_t ttype=kUndef,
88               UInt_t selectInfo=0,
89               Float_t chi2perNDF = -999.);
90
91
92   AliAODTrack(Short_t id,
93               Int_t label,
94               Float_t p[3],
95               Bool_t cartesian,
96               Float_t x[3],
97               Bool_t dca,
98               Float_t covMatrix[21],
99               Short_t q,
100               UChar_t itsClusMap,
101               AliAODVertex *prodVertex,
102               Bool_t usedForVtxFit,
103               Bool_t usedForPrimVtxFit,
104               AODTrk_t ttype=kUndef,
105               UInt_t selectInfo=0,
106               Float_t chi2perNDF = -999.);
107
108   virtual ~AliAODTrack();
109   AliAODTrack(const AliAODTrack& trk); 
110   AliAODTrack& operator=(const AliAODTrack& trk);
111
112   // kinematics
113   virtual Double_t OneOverPt() const { return (fMomentum[0] != 0.) ? 1./fMomentum[0] : -999.; }
114   virtual Double_t Phi()       const { return fMomentum[1]; }
115   virtual Double_t Theta()     const { return fMomentum[2]; }
116   
117   virtual Double_t Px() const { return fMomentum[0] * TMath::Cos(fMomentum[1]); }
118   virtual Double_t Py() const { return fMomentum[0] * TMath::Sin(fMomentum[1]); }
119   virtual Double_t Pz() const { return fMomentum[0] / TMath::Tan(fMomentum[2]); }
120   virtual Double_t Pt() const { return fMomentum[0]; }
121   virtual Double_t P()  const { return TMath::Sqrt(Pt()*Pt()+Pz()*Pz()); }
122   virtual Bool_t   PxPyPz(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
123
124   virtual Double_t Xv() const { return GetProdVertex() ? GetProdVertex()->GetX() : -999.; }
125   virtual Double_t Yv() const { return GetProdVertex() ? GetProdVertex()->GetY() : -999.; }
126   virtual Double_t Zv() const { return GetProdVertex() ? GetProdVertex()->GetZ() : -999.; }
127   virtual Bool_t   XvYvZv(Double_t x[3]) const { x[0] = Xv(); x[1] = Yv(); x[2] = Zv(); return kTRUE; }
128
129   Double_t Chi2perNDF()  const { return fChi2perNDF; }
130
131   UShort_t GetTPCnclsS(Int_t i0=0,Int_t i1=159)  const { 
132     UShort_t cl = fTPCSharedMap.CountBits(i0)-fTPCSharedMap.CountBits(i1);
133     return cl;
134   }
135   
136   UShort_t GetTPCncls(Int_t i0=0,Int_t i1=159)  const { 
137     UShort_t cl = fTPCFitMap.CountBits(i0)-fTPCFitMap.CountBits(i1);
138     if(cl==0)cl = fTPCClusterMap.CountBits(i0)-fTPCClusterMap.CountBits(i1);// backward compatibility
139     return cl;
140   }
141   
142   UShort_t GetTPCNcls()  const { return GetTPCncls(); }
143
144   virtual Double_t M() const { return M(GetMostProbablePID()); }
145   Double_t M(AODTrkPID_t pid) const;
146   virtual Double_t E() const { return E(GetMostProbablePID()); }
147   Double_t E(AODTrkPID_t pid) const;
148   Double_t E(Double_t m) const { return TMath::Sqrt(P()*P() + m*m); }
149   virtual Double_t Y() const { return Y(GetMostProbablePID()); }
150   Double_t Y(AODTrkPID_t pid) const;
151   Double_t Y(Double_t m) const;
152   
153   virtual Double_t Eta() const { return -TMath::Log(TMath::Tan(0.5 * fMomentum[2])); }
154
155   virtual Short_t  Charge() const {return fCharge; }
156
157   virtual Bool_t   PropagateToDCA(const AliVVertex *vtx, 
158           Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3]);
159
160   // PID
161   virtual const Double_t *PID() const { return fPID; }
162   AODTrkPID_t GetMostProbablePID() const;
163   void ConvertAliPIDtoAODPID();
164   void SetDetPID(AliAODPid *aodpid) {fDetPid = aodpid;}
165
166   void     SetPIDForTracking(Int_t pid) {fPIDForTracking = pid;}
167   Int_t    GetPIDForTracking()  const   {return fPIDForTracking;}
168   Double_t GetMassForTracking() const;
169
170   template <typename T> void GetPID(T *pid) const {
171     for(Int_t i=0; i<10; ++i) pid[i] = fPID ? fPID[i]:0;}
172  
173   template <typename T> void SetPID(const T *pid) {
174     if (pid) {
175       if (!fPID) fPID = new Double32_t[10];
176       for(Int_t i=0; i<10; ++i) fPID[i]=pid[i];
177     }
178     else {delete[] fPID; fPID = 0;}
179   }
180   
181   Bool_t IsOn(Int_t mask) const {return (fFlags&mask)>0;}
182   ULong_t GetStatus() const { return GetFlags(); }
183   ULong_t GetFlags() const { return fFlags; }
184
185   Int_t   GetID() const { return (Int_t)fID; }
186   Int_t   GetLabel() const { return fLabel; } 
187   void    GetTOFLabel(Int_t *p) const;
188
189
190   Char_t  GetType() const { return fType;}
191   Bool_t  IsPrimaryCandidate() const;
192   Bool_t  GetUsedForVtxFit() const { return TestBit(kUsedForVtxFit); }
193   Bool_t  GetUsedForPrimVtxFit() const { return TestBit(kUsedForPrimVtxFit); }
194
195   Bool_t  IsHybridGlobalConstrainedGlobal() const { return TestBit(kIsHybridGCG); }
196   Bool_t  IsHybridTPCConstrainedGlobal() const { return TestBit(kIsHybridTPCCG); }
197   Bool_t  IsTPCOnly() const { return IsTPCConstrained(); } // obsolete bad naming
198   Bool_t  IsTPCConstrained() const { return TestBit(kIsTPCConstrained); }
199   Bool_t  IsGlobalConstrained() const { return TestBit(kIsGlobalConstrained); }
200   //
201   Int_t   GetTOFBunchCrossing(Double_t b=0, Bool_t tpcPIDonly=kFALSE) const;
202   //
203   template <typename T> void GetP(T *p) const {
204     p[0]=fMomentum[0]; p[1]=fMomentum[1]; p[2]=fMomentum[2];}
205
206 //  template <typename T> void GetPxPyPz(T *p) const {
207 //    p[0] = Px(); p[1] = Py(); p[2] = Pz();}
208   Bool_t GetPxPyPz(Double_t *p) const;
209
210   template <typename T> Bool_t GetPosition(T *x) const {
211     x[0]=fPosition[0]; x[1]=fPosition[1]; x[2]=fPosition[2];
212     return TestBit(kIsDCA);}
213
214   template <typename T> void SetCovMatrix(const T *covMatrix) {
215     if(!fCovMatrix) fCovMatrix=new AliAODRedCov<6>();
216     fCovMatrix->SetCovMatrix(covMatrix);}
217
218   template <typename T> Bool_t GetCovMatrix(T *covMatrix) const {
219     if(!fCovMatrix) return kFALSE;
220     fCovMatrix->GetCovMatrix(covMatrix); return kTRUE;}
221
222   Bool_t GetXYZ(Double_t *p) const {
223     return GetPosition(p); }
224   
225   Bool_t GetXYZAt(Double_t x, Double_t b, Double_t *r) const;
226   Bool_t GetXYZatR(Double_t xr,Double_t bz, Double_t *xyz=0, Double_t* alpSect=0) const;  
227
228   Bool_t GetCovarianceXYZPxPyPz(Double_t cv[21]) const {
229     return GetCovMatrix(cv);}
230
231   void RemoveCovMatrix() {delete fCovMatrix; fCovMatrix=NULL;}
232
233   Double_t XAtDCA() const { return fPositionAtDCA[0]; }
234   Double_t YAtDCA() const { return fPositionAtDCA[1]; }
235   Double_t ZAtDCA() const {
236     if (IsMuonTrack()) return fPosition[2];
237     else if (TestBit(kIsDCA)) return fPosition[1];
238     else return -999.; }
239   Bool_t   XYZAtDCA(Double_t x[3]) const { x[0] = XAtDCA(); x[1] = YAtDCA(); x[2] = ZAtDCA(); return kTRUE; }
240   
241   Double_t DCA() const {
242     if (IsMuonTrack()) return TMath::Sqrt(XAtDCA()*XAtDCA() + YAtDCA()*YAtDCA());
243     else if (TestBit(kIsDCA)) return fPosition[0];
244     else return -999.; }
245   
246   Double_t PxAtDCA() const { return fMomentumAtDCA[0]; }
247   Double_t PyAtDCA() const { return fMomentumAtDCA[1]; }
248   Double_t PzAtDCA() const { return fMomentumAtDCA[2]; }
249   Double_t PAtDCA() const { return TMath::Sqrt(PxAtDCA()*PxAtDCA() + PyAtDCA()*PyAtDCA() + PzAtDCA()*PzAtDCA()); }
250   Bool_t   PxPyPzAtDCA(Double_t p[3]) const { p[0] = PxAtDCA(); p[1] = PyAtDCA(); p[2] = PzAtDCA(); return kTRUE; }
251   
252   Double_t GetRAtAbsorberEnd() const { return fRAtAbsorberEnd; }
253   
254   UChar_t  GetITSClusterMap() const       { return (UChar_t)(fITSMuonClusterMap&0xff); }
255   Int_t    GetITSNcls() const; 
256   Bool_t   HasPointOnITSLayer(Int_t i) const { return TESTBIT(GetITSClusterMap(),i); }
257   UShort_t GetHitsPatternInTrigCh() const { return (UShort_t)((fITSMuonClusterMap&0xff00)>>8); }
258   UInt_t   GetMUONClusterMap() const      { return (fITSMuonClusterMap&0x3ff0000)>>16; }
259   UInt_t   GetITSMUONClusterMap() const   { return fITSMuonClusterMap; }
260   
261   Bool_t  TestFilterBit(UInt_t filterBit) const {return (Bool_t) ((filterBit & fFilterMap) != 0);}
262   Bool_t  TestFilterMask(UInt_t filterMask) const {return (Bool_t) ((filterMask & fFilterMap) == filterMask);}
263   void    SetFilterMap(UInt_t i){fFilterMap = i;}
264   UInt_t  GetFilterMap() const {return fFilterMap;}
265
266   const TBits& GetTPCClusterMap() const {return fTPCClusterMap;}
267   const TBits* GetTPCClusterMapPtr() const {return &fTPCClusterMap;}
268   const TBits& GetTPCFitMap() const {return fTPCFitMap;}
269   const TBits* GetTPCFitMapPtr() const {return &fTPCFitMap;}
270   Float_t GetTPCClusterInfo(Int_t nNeighbours=3, Int_t type=0, Int_t row0=0, Int_t row1=159, Int_t /*type*/=0) const;
271   
272   const TBits& GetTPCSharedMap() const {return fTPCSharedMap;}
273   const TBits* GetTPCSharedMapPtr() const {return &fTPCSharedMap;}
274   void    SetTPCClusterMap(const TBits amap) {fTPCClusterMap = amap;}
275   void    SetTPCSharedMap(const TBits amap) {fTPCSharedMap = amap;}
276   void    SetTPCFitMap(const TBits amap) {fTPCFitMap = amap;}
277   void    SetTPCPointsF(UShort_t  findable){fTPCnclsF = findable;}
278   void    SetTPCNCrossedRows(UInt_t n)     {fTPCNCrossedRows = n;}
279
280   UShort_t GetTPCNclsF() const { return fTPCnclsF;}
281   UShort_t GetTPCNCrossedRows()  const { return fTPCNCrossedRows;}
282   Float_t  GetTPCFoundFraction() const { return fTPCNCrossedRows>0 ? float(GetTPCNcls())/fTPCNCrossedRows : 0;}
283
284   // Calorimeter Cluster
285   Int_t GetEMCALcluster() const {return fCaloIndex;}
286   void SetEMCALcluster(Int_t index) {fCaloIndex=index;}
287   Bool_t IsEMCAL() const {return fFlags&kEMCALmatch;}
288
289   Double_t GetTrackPhiOnEMCal() const {return fTrackPhiOnEMCal;}
290   Double_t GetTrackEtaOnEMCal() const {return fTrackEtaOnEMCal;}
291   Double_t GetTrackPtOnEMCal() const {return fTrackPtOnEMCal;}
292   Double_t GetTrackPOnEMCal() const {return TMath::Abs(fTrackEtaOnEMCal) < 1 ? fTrackPtOnEMCal*TMath::CosH(fTrackEtaOnEMCal) : -999;}
293   void SetTrackPhiEtaPtOnEMCal(Double_t phi,Double_t eta,Double_t pt) {fTrackPhiOnEMCal=phi;fTrackEtaOnEMCal=eta;fTrackPtOnEMCal=pt;}
294
295   Int_t GetPHOScluster() const {return fCaloIndex;}
296   void SetPHOScluster(Int_t index) {fCaloIndex=index;}
297   Bool_t IsPHOS() const {return fFlags&kPHOSmatch;}
298
299   //pid signal interface
300   Double_t  GetITSsignal()       const { return fDetPid?fDetPid->GetITSsignal():0.;    }
301   void      GetITSdEdxSamples(Double_t s[4]) const;
302   Double_t  GetTPCsignal()       const { return fDetPid?fDetPid->GetTPCsignal():0.;    }
303   Double_t  GetTPCsignalTunedOnData() const { return fTPCsignalTuned;}
304   void      SetTPCsignalTunedOnData(Double_t signal) {fTPCsignalTuned = signal;}
305   UShort_t  GetTPCsignalN()      const { return fDetPid?fDetPid->GetTPCsignalN():0;    }
306   virtual AliTPCdEdxInfo* GetTPCdEdxInfo() const {return fDetPid?fDetPid->GetTPCdEdxInfo():0;}
307   Double_t  GetTPCmomentum()     const { return fDetPid?fDetPid->GetTPCmomentum():0.;  }
308   Double_t  GetTPCTgl()          const { return fDetPid?fDetPid->GetTPCTgl():0.;  }
309   Double_t  GetTOFsignal()       const { return fDetPid?fDetPid->GetTOFsignal():0.;    }
310   Double_t  GetIntegratedLength() const { return fTrackLength;}
311   void      SetIntegratedLength(Double_t l) {fTrackLength = l;}
312   Double_t  GetTOFsignalTunedOnData() const { return fTOFsignalTuned;}
313   void      SetTOFsignalTunedOnData(Double_t signal) {fTOFsignalTuned = signal;}
314   Double_t  GetHMPIDsignal()     const; 
315   Double_t  GetHMPIDoccupancy()  const;
316
317   Int_t     GetHMPIDcluIdx()     const;
318     
319   void GetHMPIDtrk(Float_t &x, Float_t &y, Float_t &th, Float_t &ph) const;  
320   void GetHMPIDmip(Float_t &x,Float_t &y,Int_t &q,Int_t &nph) const;
321   
322   Bool_t GetOuterHmpPxPyPz(Double_t *p) const;
323   
324   void      GetIntegratedTimes(Double_t *times, Int_t nspec=AliPID::kSPECIES) const {if (fDetPid) fDetPid->GetIntegratedTimes(times, nspec);}
325   Double_t  GetTRDslice(Int_t plane, Int_t slice) const;
326   Double_t  GetTRDsignal()                        const {return fDetPid ? fDetPid->GetTRDsignal() : 0;}
327   Double_t  GetTRDmomentum(Int_t plane, Double_t */*sp*/=0x0) const;
328   Double_t  GetTRDchi2()                 const {return fDetPid ? fDetPid->GetTRDChi2() : -1;}
329   UChar_t   GetTRDncls(Int_t layer)      const;
330   UChar_t   GetTRDncls()                 const {return GetTRDncls(-1);}
331   UChar_t   GetTRDntrackletsPID() const;
332   Int_t     GetNumberOfTRDslices() const { return fDetPid?fDetPid->GetTRDnSlices():0; }
333   void      GetHMPIDpid(Double_t */*p*/) const { return; } // TODO: To be implemented properly with the new HMPID object
334
335   void SetMFTClusterPattern(ULong_t mftClusterPattern) { fMFTClusterPattern = mftClusterPattern; }   // AU
336   ULong_t GetMFTClusterPattern() { return fMFTClusterPattern; }                                      // AU
337
338   const AliAODEvent* GetAODEvent() const {return fAODEvent;}
339   virtual const AliVEvent* GetEvent() const {return (AliVEvent*)fAODEvent;}
340   void SetAODEvent(const AliAODEvent* ptr){fAODEvent = ptr;}
341   const AliTOFHeader* GetTOFHeader() const;
342
343   AliAODPid    *GetDetPid() const { return fDetPid; }
344   AliAODVertex *GetProdVertex() const { return (AliAODVertex*)fProdVertex.GetObject(); }
345   
346   // print
347   void  Print(const Option_t *opt = "") const;
348
349   // setters
350   void SetFlags(ULong_t flags) { fFlags = flags; }
351   void SetStatus(ULong_t flags) { fFlags|=flags; }
352   void ResetStatus(ULong_t flags) { fFlags&=~flags; }
353
354   void SetID(Short_t id) { fID = id; }
355   void SetLabel(Int_t label) { fLabel = label; }
356   void SetTOFLabel(const Int_t* p);
357   template <typename T> void SetPosition(const T *x, Bool_t isDCA = kFALSE);
358   void SetDCA(Double_t d, Double_t z);
359   void SetUsedForVtxFit(Bool_t used = kTRUE) { used ? SetBit(kUsedForVtxFit) : ResetBit(kUsedForVtxFit); }
360   void SetUsedForPrimVtxFit(Bool_t used = kTRUE) { used ? SetBit(kUsedForPrimVtxFit) : ResetBit(kUsedForPrimVtxFit); }
361
362   void SetIsTPCOnly(Bool_t b = kTRUE) { SetIsTPCConstrained(b); }// obsolete bad naming
363
364   void SetIsTPCConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsTPCConstrained) : ResetBit(kIsTPCConstrained); }
365   void SetIsHybridTPCConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridTPCCG) : ResetBit(kIsHybridTPCCG); }
366
367   void SetIsGlobalConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsGlobalConstrained) : ResetBit(kIsGlobalConstrained); }
368   void SetIsHybridGlobalConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridGCG) : ResetBit(kIsHybridGCG); }
369
370
371
372   void SetOneOverPt(Double_t oneOverPt) { fMomentum[0] = 1. / oneOverPt; }
373   void SetPt(Double_t pt) { fMomentum[0] = pt; };
374   void SetPhi(Double_t phi) { fMomentum[1] = phi; }
375   void SetTheta(Double_t theta) { fMomentum[2] = theta; }
376   template <typename T> void SetP(const T *p, Bool_t cartesian = kTRUE);
377   void SetP() {fMomentum[0]=fMomentum[1]=fMomentum[2]=-999.;}
378
379   void SetXYAtDCA(Double_t x, Double_t y) {fPositionAtDCA[0] = x; fPositionAtDCA[1] = y;}
380   void SetPxPyPzAtDCA(Double_t pX, Double_t pY, Double_t pZ) {fMomentumAtDCA[0] = pX; fMomentumAtDCA[1] = pY; fMomentumAtDCA[2] = pZ;}
381   
382   void SetRAtAbsorberEnd(Double_t r) { fRAtAbsorberEnd = r; }
383   
384   void SetCharge(Short_t q) { fCharge = q; }
385   void SetChi2perNDF(Double_t chi2perNDF) { fChi2perNDF = chi2perNDF; }
386
387   void SetITSClusterMap(UChar_t itsClusMap)                 { fITSMuonClusterMap = (fITSMuonClusterMap&0xffffff00)|(((UInt_t)itsClusMap)&0xff); }
388   void SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh) { fITSMuonClusterMap = (fITSMuonClusterMap&0xffff00ff)|((((UInt_t)hitsPatternInTrigCh)&0xff)<<8); }
389   void SetMuonClusterMap(UInt_t muonClusMap)                { fITSMuonClusterMap = (fITSMuonClusterMap&0xfc00ffff)|((muonClusMap&0x3ff)<<16); }
390   void SetITSMuonClusterMap(UInt_t itsMuonClusMap)          { fITSMuonClusterMap = itsMuonClusMap; }
391   void SetMUONtrigHitsMapTrg(UInt_t muonTrigHitsMap) { fMUONtrigHitsMapTrg = muonTrigHitsMap; }
392   UInt_t GetMUONTrigHitsMapTrg() const { return fMUONtrigHitsMapTrg; }
393   void SetMUONtrigHitsMapTrk(UInt_t muonTrigHitsMap) { fMUONtrigHitsMapTrk = muonTrigHitsMap; }
394   UInt_t GetMUONTrigHitsMapTrk() const { return fMUONtrigHitsMapTrk; }
395   Int_t GetMuonTrigDevSign() const;
396
397   Int_t GetMatchTrigger() const {return fITSMuonClusterMap>>30;}
398                                         //  0 Muon track does not match trigger
399                                         //  1 Muon track match but does not pass pt cut
400                                         //  2 Muon track match Low pt cut
401                                         //  3 Muon track match High pt cut
402   void     SetMatchTrigger(Int_t MatchTrigger);
403   Bool_t   MatchTrigger() const { return (GetMatchTrigger()>0); }         //  Muon track matches trigger track
404   Bool_t   MatchTriggerLowPt()   const  { return (GetMatchTrigger()>1); } //  Muon track matches trigger track and passes Low pt cut
405   Bool_t   MatchTriggerHighPt()  const  { return (GetMatchTrigger()>2); } //  Muon track matches trigger track and passes High pt cut
406   Bool_t   MatchTriggerDigits()  const;                                   //  Muon track matches trigger digits
407   Double_t GetChi2MatchTrigger() const  { return fChi2MatchTrigger;}
408   void     SetChi2MatchTrigger(Double_t Chi2MatchTrigger) {fChi2MatchTrigger = Chi2MatchTrigger; }
409   Bool_t   HitsMuonChamber(Int_t MuonChamber, Int_t cathode = -1) const;  // Check if track hits Muon chambers
410   Bool_t   IsMuonTrack() const { return ( (GetMUONClusterMap()>0) && !fIsMuonGlobalTrack ) ? kTRUE : kFALSE; }
411   
412   Bool_t   IsMuonGlobalTrack() const { return fIsMuonGlobalTrack; }                                     // AU
413   void     SetIsMuonGlobalTrack(Bool_t isMuonGlobalTrack) { fIsMuonGlobalTrack = isMuonGlobalTrack; }   // AU
414
415   void     Connected(Bool_t flag) {flag ? SETBIT(fITSMuonClusterMap,26) : CLRBIT(fITSMuonClusterMap,26);}
416   Bool_t   IsConnected() const {return TESTBIT(fITSMuonClusterMap,26);}
417
418   void     SetProdVertex(TObject *vertex) { fProdVertex = vertex; }
419   void     SetType(AODTrk_t ttype) { fType=ttype; }
420
421   // Trasient PID object, is owned by the track
422   virtual void  SetDetectorPID(const AliDetectorPID *pid);
423   virtual const AliDetectorPID* GetDetectorPID() const { return fDetectorPID; }
424
425   // Dummy
426   Int_t    PdgCode() const {return 0;}
427   
428  private :
429
430   // Momentum & position
431   Double32_t    fMomentum[3];       // momemtum stored in pt, phi, theta
432   Double32_t    fPosition[3];       // position of first point on track or dca
433   
434   Double32_t    fMomentumAtDCA[3];  // momentum (px,py,pz) at DCA
435   Double32_t    fPositionAtDCA[2];  // trasverse position (x,y) at DCA
436   
437   Double32_t    fRAtAbsorberEnd;    // transverse position r at the end of the muon absorber
438   
439   Double32_t    fChi2perNDF;        // chi2/NDF of momentum fit
440   Double32_t    fChi2MatchTrigger;  // chi2 of trigger/track matching
441   Double32_t*   fPID;               //! [0.,1.,8] pointer to PID object
442
443   ULong_t       fFlags;             // reconstruction status flags 
444   Int_t         fLabel;             // track label, points back to MC track
445   Int_t         fTOFLabel[3];       // TOF label
446   Double32_t    fTrackLength;       // Track length
447   UInt_t        fITSMuonClusterMap; // map of ITS and muon clusters, one bit per layer
448                                     // (ITS: bit 1-8, muon trigger: bit 9-16, muon tracker: bit 17-26, muon match trigger: bit 31-32) 
449   UInt_t        fMUONtrigHitsMapTrg; // Muon trigger hits map from trigger
450   UInt_t        fMUONtrigHitsMapTrk; // Muon trigger hits map from tracker track extrapolation
451   UInt_t        fFilterMap;         // filter information, one bit per set of cuts
452
453   TBits         fTPCFitMap;      // Map of clusters, one bit per padrow; if has a cluster on given padrow which is used in the fit   
454   TBits         fTPCClusterMap;     // Map of clusters, one bit per padrow; 1 if has a cluster on given padrow
455   TBits         fTPCSharedMap;      // Map of clusters, one bit per padrow; 1 if has a shared cluster on given padrow
456
457   UShort_t      fTPCnclsF;          // findable clusters
458   UShort_t      fTPCNCrossedRows;   // n crossed rows
459
460   Short_t       fID;                // unique track ID, points back to the ESD track
461
462   Char_t        fCharge;            // particle charge
463   Char_t        fType;              // Track Type
464
465   Char_t        fPIDForTracking;    // pid using for tracking of ESD track
466
467   Int_t         fCaloIndex;         // index of associated EMCAL/PHOS cluster (AliAODCaloCluster)
468
469   
470   AliAODRedCov<6> *fCovMatrix;      // covariance matrix (x, y, z, px, py, pz)
471   AliAODPid    *fDetPid;            // more detailed or detector specific raw pid information
472   mutable const AliDetectorPID* fDetectorPID; //! transient object to cache calibrated PID information
473   TRef          fProdVertex;        // vertex of origin
474
475   Double_t      fTrackPhiOnEMCal;   // phi of track after being propagated to the EMCal surface (default r = 440 cm)
476   Double_t      fTrackEtaOnEMCal;   // eta of track after being propagated to the EMCal surface (default r = 440 cm)
477   Double_t      fTrackPtOnEMCal;    // pt of track after being propagated to the EMCal surface (default r = 440 cm)
478
479   Bool_t fIsMuonGlobalTrack;        // True if the track is built from the combination of MUON and MFT clusters     // AU
480
481   Double_t      fTPCsignalTuned;    //! TPC signal tuned on data when using MC
482   Double_t      fTOFsignalTuned;    //! TOF signal tuned on data when using MC
483
484   ULong_t fMFTClusterPattern;       // Tells us which MFT clusters are contained in the track, and which one is a good one (if MC)  // AU
485
486   const AliAODEvent* fAODEvent;     //! pointer back to the event the track belongs to
487
488   ClassDef(AliAODTrack, 24);
489 };
490
491 inline Bool_t  AliAODTrack::IsPrimaryCandidate() const
492 {
493     // True of track passes primary particle selection (independent of type) 
494     // 
495     if (fFilterMap) {
496         return kTRUE;
497     } else {
498         return kFALSE;
499     }
500 }
501
502 inline Int_t AliAODTrack::GetITSNcls() const 
503 {
504   // Number of points in ITS
505   Int_t n=0;
506   for(Int_t i=0;i<6;i++) if(HasPointOnITSLayer(i)) n++;
507   return n;
508 }
509
510 //______________________________________________________________________________
511 template <typename T> 
512 void AliAODTrack::SetPosition(const T *x, const Bool_t dca) 
513 {
514   // set the position
515
516   if (x) {
517     if (!dca) {
518       ResetBit(kIsDCA);
519
520       fPosition[0] = x[0];
521       fPosition[1] = x[1];
522       fPosition[2] = x[2];
523     } else {
524       SetBit(kIsDCA);
525       // don't know any better yet
526       fPosition[0] = -999.;
527       fPosition[1] = -999.;
528       fPosition[2] = -999.;
529     }
530   } else {
531     ResetBit(kIsDCA);
532
533     fPosition[0] = -999.;
534     fPosition[1] = -999.;
535     fPosition[2] = -999.;
536   }
537 }
538
539 //template<> void AliAODTrack::SetPosition(const double *, Bool_t);
540
541 #endif