3 /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
8 //-------------------------------------------------------------------------
9 // AOD track implementation of AliVTrack
10 // Author: Markus Oldenburg, CERN
11 //-------------------------------------------------------------------------
16 #include "AliVTrack.h"
17 #include "AliAODVertex.h"
18 #include "AliAODRedCov.h"
19 #include "AliAODPid.h"
28 class AliAODTrack : public AliVTrack {
32 enum AODTrk_t {kUndef = -1,
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
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
75 AliAODTrack(Short_t id,
81 Double_t covMatrix[21],
84 AliAODVertex *prodVertex,
86 Bool_t usedForPrimVtxFit,
87 AODTrk_t ttype=kUndef,
89 Float_t chi2perNDF = -999.);
92 AliAODTrack(Short_t id,
98 Float_t covMatrix[21],
101 AliAODVertex *prodVertex,
102 Bool_t usedForVtxFit,
103 Bool_t usedForPrimVtxFit,
104 AODTrk_t ttype=kUndef,
106 Float_t chi2perNDF = -999.);
108 virtual ~AliAODTrack();
109 AliAODTrack(const AliAODTrack& trk);
110 AliAODTrack& operator=(const AliAODTrack& trk);
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]; }
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; }
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; }
129 Double_t Chi2perNDF() const { return fChi2perNDF; }
131 UShort_t GetTPCnclsS(Int_t i0=0,Int_t i1=159) const {
132 UShort_t cl = fTPCSharedMap.CountBits(i0)-fTPCSharedMap.CountBits(i1);
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
142 UShort_t GetTPCNcls() const { return GetTPCncls(); }
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;
153 virtual Double_t Eta() const { return -TMath::Log(TMath::Tan(0.5 * fMomentum[2])); }
155 virtual Short_t Charge() const {return fCharge; }
157 virtual Bool_t PropagateToDCA(const AliVVertex *vtx,
158 Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3]);
161 virtual const Double_t *PID() const { return fPID; }
162 AODTrkPID_t GetMostProbablePID() const;
163 void ConvertAliPIDtoAODPID();
164 void SetDetPID(AliAODPid *aodpid) {fDetPid = aodpid;}
166 void SetPIDForTracking(Int_t pid) {fPIDForTracking = pid;}
167 Int_t GetPIDForTracking() const {return fPIDForTracking;}
168 Double_t GetMassForTracking() const;
170 template <typename T> void GetPID(T *pid) const {
171 for(Int_t i=0; i<10; ++i) pid[i] = fPID ? fPID[i]:0;}
173 template <typename T> void SetPID(const T *pid) {
175 if (!fPID) fPID = new Double32_t[10];
176 for(Int_t i=0; i<10; ++i) fPID[i]=pid[i];
178 else {delete[] fPID; fPID = 0;}
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; }
185 Int_t GetID() const { return (Int_t)fID; }
186 Int_t GetLabel() const { return fLabel; }
187 void GetTOFLabel(Int_t *p) const;
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); }
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); }
201 Int_t GetTOFBunchCrossing(Double_t b=0, Bool_t tpcPIDonly=kFALSE) const;
203 template <typename T> void GetP(T *p) const {
204 p[0]=fMomentum[0]; p[1]=fMomentum[1]; p[2]=fMomentum[2];}
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;
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);}
214 template <typename T> void SetCovMatrix(const T *covMatrix) {
215 if(!fCovMatrix) fCovMatrix=new AliAODRedCov<6>();
216 fCovMatrix->SetCovMatrix(covMatrix);}
218 template <typename T> Bool_t GetCovMatrix(T *covMatrix) const {
219 if(!fCovMatrix) return kFALSE;
220 fCovMatrix->GetCovMatrix(covMatrix); return kTRUE;}
222 Bool_t GetXYZ(Double_t *p) const {
223 return GetPosition(p); }
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;
228 Bool_t GetCovarianceXYZPxPyPz(Double_t cv[21]) const {
229 return GetCovMatrix(cv);}
231 void RemoveCovMatrix() {delete fCovMatrix; fCovMatrix=NULL;}
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];
239 Bool_t XYZAtDCA(Double_t x[3]) const { x[0] = XAtDCA(); x[1] = YAtDCA(); x[2] = ZAtDCA(); return kTRUE; }
241 Double_t DCA() const {
242 if (IsMuonTrack()) return TMath::Sqrt(XAtDCA()*XAtDCA() + YAtDCA()*YAtDCA());
243 else if (TestBit(kIsDCA)) return fPosition[0];
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; }
252 Double_t GetRAtAbsorberEnd() const { return fRAtAbsorberEnd; }
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; }
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;}
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;
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;}
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;}
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;}
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;}
295 Int_t GetPHOScluster() const {return fCaloIndex;}
296 void SetPHOScluster(Int_t index) {fCaloIndex=index;}
297 Bool_t IsPHOS() const {return fFlags&kPHOSmatch;}
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;
317 Int_t GetHMPIDcluIdx() const;
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;
322 Bool_t GetOuterHmpPxPyPz(Double_t *p) const;
324 void GetIntegratedTimes(Double_t *times, Int_t nspec=AliPID::kSPECIESC) 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
335 void SetMFTClusterPattern(ULong_t mftClusterPattern) { fMFTClusterPattern = mftClusterPattern; } // AU
336 ULong_t GetMFTClusterPattern() { return fMFTClusterPattern; } // AU
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;
343 AliAODPid *GetDetPid() const { return fDetPid; }
344 AliAODVertex *GetProdVertex() const { return (AliAODVertex*)fProdVertex.GetObject(); }
347 void Print(const Option_t *opt = "") const;
350 void SetFlags(ULong_t flags) { fFlags = flags; }
351 void SetStatus(ULong_t flags) { fFlags|=flags; }
352 void ResetStatus(ULong_t flags) { fFlags&=~flags; }
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); }
362 void SetIsTPCOnly(Bool_t b = kTRUE) { SetIsTPCConstrained(b); }// obsolete bad naming
364 void SetIsTPCConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsTPCConstrained) : ResetBit(kIsTPCConstrained); }
365 void SetIsHybridTPCConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridTPCCG) : ResetBit(kIsHybridTPCCG); }
367 void SetIsGlobalConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsGlobalConstrained) : ResetBit(kIsGlobalConstrained); }
368 void SetIsHybridGlobalConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridGCG) : ResetBit(kIsHybridGCG); }
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.;}
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;}
382 void SetRAtAbsorberEnd(Double_t r) { fRAtAbsorberEnd = r; }
384 void SetCharge(Short_t q) { fCharge = q; }
385 void SetChi2perNDF(Double_t chi2perNDF) { fChi2perNDF = chi2perNDF; }
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() { return fMUONtrigHitsMapTrg; }
393 void SetMUONtrigHitsMapTrk(UInt_t muonTrigHitsMap) { fMUONtrigHitsMapTrk = muonTrigHitsMap; }
394 UInt_t GetMUONTrigHitsMapTrk() { return fMUONtrigHitsMapTrk; }
396 Int_t GetMatchTrigger() const {return fITSMuonClusterMap>>30;}
397 // 0 Muon track does not match trigger
398 // 1 Muon track match but does not pass pt cut
399 // 2 Muon track match Low pt cut
400 // 3 Muon track match High pt cut
401 void SetMatchTrigger(Int_t MatchTrigger);
402 Bool_t MatchTrigger() const { return (GetMatchTrigger()>0); } // Muon track matches trigger track
403 Bool_t MatchTriggerLowPt() const { return (GetMatchTrigger()>1); } // Muon track matches trigger track and passes Low pt cut
404 Bool_t MatchTriggerHighPt() const { return (GetMatchTrigger()>2); } // Muon track matches trigger track and passes High pt cut
405 Bool_t MatchTriggerDigits() const; // Muon track matches trigger digits
406 Double_t GetChi2MatchTrigger() const { return fChi2MatchTrigger;}
407 void SetChi2MatchTrigger(Double_t Chi2MatchTrigger) {fChi2MatchTrigger = Chi2MatchTrigger; }
408 Bool_t HitsMuonChamber(Int_t MuonChamber, Int_t cathode = -1) const; // Check if track hits Muon chambers
409 Bool_t IsMuonTrack() const { return ( (GetMUONClusterMap()>0) && !fIsMuonGlobalTrack ) ? kTRUE : kFALSE; }
411 Bool_t IsMuonGlobalTrack() const { return fIsMuonGlobalTrack; } // AU
412 void SetIsMuonGlobalTrack(Bool_t isMuonGlobalTrack) { fIsMuonGlobalTrack = isMuonGlobalTrack; } // AU
414 void Connected(Bool_t flag) {flag ? SETBIT(fITSMuonClusterMap,26) : CLRBIT(fITSMuonClusterMap,26);}
415 Bool_t IsConnected() const {return TESTBIT(fITSMuonClusterMap,26);}
417 void SetProdVertex(TObject *vertex) { fProdVertex = vertex; }
418 void SetType(AODTrk_t ttype) { fType=ttype; }
420 // Trasient PID object, is owned by the track
421 virtual void SetDetectorPID(const AliDetectorPID *pid);
422 virtual const AliDetectorPID* GetDetectorPID() const { return fDetectorPID; }
425 Int_t PdgCode() const {return 0;}
429 // Momentum & position
430 Double32_t fMomentum[3]; // momemtum stored in pt, phi, theta
431 Double32_t fPosition[3]; // position of first point on track or dca
433 Double32_t fMomentumAtDCA[3]; // momentum (px,py,pz) at DCA
434 Double32_t fPositionAtDCA[2]; // trasverse position (x,y) at DCA
436 Double32_t fRAtAbsorberEnd; // transverse position r at the end of the muon absorber
438 Double32_t fChi2perNDF; // chi2/NDF of momentum fit
439 Double32_t fChi2MatchTrigger; // chi2 of trigger/track matching
440 Double32_t* fPID; //! [0.,1.,8] pointer to PID object
442 ULong_t fFlags; // reconstruction status flags
443 Int_t fLabel; // track label, points back to MC track
444 Int_t fTOFLabel[3]; // TOF label
445 Double32_t fTrackLength; // Track length
446 UInt_t fITSMuonClusterMap; // map of ITS and muon clusters, one bit per layer
447 // (ITS: bit 1-8, muon trigger: bit 9-16, muon tracker: bit 17-26, muon match trigger: bit 31-32)
448 UInt_t fMUONtrigHitsMapTrg; // Muon trigger hits map from trigger
449 UInt_t fMUONtrigHitsMapTrk; // Muon trigger hits map from tracker track extrapolation
450 UInt_t fFilterMap; // filter information, one bit per set of cuts
452 TBits fTPCFitMap; // Map of clusters, one bit per padrow; if has a cluster on given padrow which is used in the fit
453 TBits fTPCClusterMap; // Map of clusters, one bit per padrow; 1 if has a cluster on given padrow
454 TBits fTPCSharedMap; // Map of clusters, one bit per padrow; 1 if has a shared cluster on given padrow
456 UShort_t fTPCnclsF; // findable clusters
457 UShort_t fTPCNCrossedRows; // n crossed rows
459 Short_t fID; // unique track ID, points back to the ESD track
461 Char_t fCharge; // particle charge
462 Char_t fType; // Track Type
464 Char_t fPIDForTracking; // pid using for tracking of ESD track
466 Int_t fCaloIndex; // index of associated EMCAL/PHOS cluster (AliAODCaloCluster)
469 AliAODRedCov<6> *fCovMatrix; // covariance matrix (x, y, z, px, py, pz)
470 AliAODPid *fDetPid; // more detailed or detector specific raw pid information
471 mutable const AliDetectorPID* fDetectorPID; //! transient object to cache calibrated PID information
472 TRef fProdVertex; // vertex of origin
474 Double_t fTrackPhiOnEMCal; // phi of track after being propagated to the EMCal surface (default r = 440 cm)
475 Double_t fTrackEtaOnEMCal; // eta of track after being propagated to the EMCal surface (default r = 440 cm)
476 Double_t fTrackPtOnEMCal; // pt of track after being propagated to the EMCal surface (default r = 440 cm)
478 Bool_t fIsMuonGlobalTrack; // True if the track is built from the combination of MUON and MFT clusters // AU
480 Double_t fTPCsignalTuned; //! TPC signal tuned on data when using MC
481 Double_t fTOFsignalTuned; //! TOF signal tuned on data when using MC
483 ULong_t fMFTClusterPattern; // Tells us which MFT clusters are contained in the track, and which one is a good one (if MC) // AU
485 const AliAODEvent* fAODEvent; //! pointer back to the event the track belongs to
487 ClassDef(AliAODTrack, 24);
490 inline Bool_t AliAODTrack::IsPrimaryCandidate() const
492 // True of track passes primary particle selection (independent of type)
501 inline Int_t AliAODTrack::GetITSNcls() const
503 // Number of points in ITS
505 for(Int_t i=0;i<6;i++) if(HasPointOnITSLayer(i)) n++;
509 //______________________________________________________________________________
510 template <typename T>
511 void AliAODTrack::SetPosition(const T *x, const Bool_t dca)
524 // don't know any better yet
525 fPosition[0] = -999.;
526 fPosition[1] = -999.;
527 fPosition[2] = -999.;
532 fPosition[0] = -999.;
533 fPosition[1] = -999.;
534 fPosition[2] = -999.;
538 //template<> void AliAODTrack::SetPosition(const double *, Bool_t);