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"
24 class AliAODTrack : public AliVTrack {
28 enum AODTrk_t {kUndef = -1,
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
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
71 AliAODTrack(Short_t id,
77 Double_t covMatrix[21],
81 AliAODVertex *prodVertex,
83 Bool_t usedForPrimVtxFit,
84 AODTrk_t ttype=kUndef,
86 Float_t chi2perNDF = -999.);
88 AliAODTrack(Short_t id,
94 Float_t covMatrix[21],
98 AliAODVertex *prodVertex,
100 Bool_t usedForPrimVtxFit,
101 AODTrk_t ttype=kUndef,
103 Float_t chi2perNDF = -999.);
105 virtual ~AliAODTrack();
106 AliAODTrack(const AliAODTrack& trk);
107 AliAODTrack& operator=(const AliAODTrack& trk);
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]; }
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; }
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; }
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
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;
142 virtual Double_t Eta() const { return -TMath::Log(TMath::Tan(0.5 * fMomentum[2])); }
144 virtual Short_t Charge() const {return fCharge; }
146 virtual Bool_t PropagateToDCA(const AliVVertex *vtx,
147 Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3]);
150 virtual const Double_t *PID() const { return fPID; }
151 AODTrkPID_t GetMostProbablePID() const;
152 void ConvertAliPIDtoAODPID();
153 void SetDetPID(AliAODPid *aodpid) {fDetPid = aodpid;}
155 template <class T> void GetPID(T *pid) const {
156 for(Int_t i=0; i<10; ++i) pid[i]=fPID[i];}
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.;}}
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; }
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); }
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); }
179 Int_t GetTOFBunchCrossing(Double_t b=0) const;
181 template <class T> void GetP(T *p) const {
182 p[0]=fMomentum[0]; p[1]=fMomentum[1]; p[2]=fMomentum[2];}
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;
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);}
192 template <class T> void SetCovMatrix(const T *covMatrix) {
193 if(!fCovMatrix) fCovMatrix=new AliAODRedCov<6>();
194 fCovMatrix->SetCovMatrix(covMatrix);}
196 template <class T> Bool_t GetCovMatrix(T *covMatrix) const {
197 if(!fCovMatrix) return kFALSE;
198 fCovMatrix->GetCovMatrix(covMatrix); return kTRUE;}
200 Bool_t GetXYZ(Double_t *p) const {
201 return GetPosition(p); }
203 Bool_t GetCovarianceXYZPxPyPz(Double_t cv[21]) const {
204 return GetCovMatrix(cv);}
206 void RemoveCovMatrix() {delete fCovMatrix; fCovMatrix=NULL;}
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];
214 Bool_t XYZAtDCA(Double_t x[3]) const { x[0] = XAtDCA(); x[1] = YAtDCA(); x[2] = ZAtDCA(); return kTRUE; }
216 Double_t DCA() const {
217 if (IsMuonTrack()) return TMath::Sqrt(XAtDCA()*XAtDCA() + YAtDCA()*YAtDCA());
218 else if (TestBit(kIsDCA)) return fPosition[0];
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; }
227 Double_t GetRAtAbsorberEnd() const { return fRAtAbsorberEnd; }
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; }
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;}
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;
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;}
251 UShort_t GetTPCNclsF() const { return fTPCnclsF;}
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;}
258 Int_t GetPHOScluster() const {return fCaloIndex;}
259 void SetPHOScluster(Int_t index) {fCaloIndex=index;}
260 Bool_t IsPHOS() const {return fFlags&kPHOSmatch;}
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.; }
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); }
278 AliAODPid *GetDetPid() const { return fDetPid; }
279 AliAODVertex *GetProdVertex() const { return (AliAODVertex*)fProdVertex.GetObject(); }
282 void Print(const Option_t *opt = "") const;
285 void SetFlags(ULong_t flags) { fFlags = flags; }
286 void SetStatus(ULong_t flags) { fFlags|=flags; }
287 void ResetStatus(ULong_t flags) { fFlags&=~flags; }
289 void SetID(Short_t id) { fID = id; }
290 void SetLabel(Int_t label) { fLabel = label; }
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); }
297 void SetIsTPCOnly(Bool_t b = kTRUE) { SetIsTPCConstrained(b); }// obsolete bad naming
299 void SetIsTPCConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsTPCConstrained) : ResetBit(kIsTPCConstrained); }
300 void SetIsHybridTPCConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridTPCCG) : ResetBit(kIsHybridTPCCG); }
302 void SetIsGlobalConstrained(Bool_t b = kTRUE) { b ? SetBit(kIsGlobalConstrained) : ResetBit(kIsGlobalConstrained); }
303 void SetIsHybridGlobalConstrainedGlobal(Bool_t hybrid = kTRUE) { hybrid ? SetBit(kIsHybridGCG) : ResetBit(kIsHybridGCG); }
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.;}
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;}
317 void SetRAtAbsorberEnd(Double_t r) { fRAtAbsorberEnd = r; }
319 void SetCharge(Short_t q) { fCharge = q; }
320 void SetChi2perNDF(Double_t chi2perNDF) { fChi2perNDF = chi2perNDF; }
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; }
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; }
342 void Connected(Bool_t flag) {flag ? SETBIT(fITSMuonClusterMap,26) : CLRBIT(fITSMuonClusterMap,26);}
343 Bool_t IsConnected() const {return TESTBIT(fITSMuonClusterMap,26);}
345 void SetProdVertex(TObject *vertex) { fProdVertex = vertex; }
346 void SetType(AODTrk_t ttype) { fType=ttype; }
351 Int_t PdgCode() const {return 0;}
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
359 Double32_t fMomentumAtDCA[3]; // momentum (px,py,pz) at DCA
360 Double32_t fPositionAtDCA[2]; // trasverse position (x,y) at DCA
362 Double32_t fRAtAbsorberEnd; // transverse position r at the end of the muon absorber
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
368 ULong_t fFlags; // reconstruction status flags
369 Int_t fLabel; // track label, points back to MC track
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
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
379 UShort_t fTPCnclsF; // findable clusters
381 Short_t fID; // unique track ID, points back to the ESD track
383 Char_t fCharge; // particle charge
384 Char_t fType; // Track Type
386 Int_t fCaloIndex; // index of associated EMCAL/PHOS cluster (AliAODCaloCluster)
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
393 ClassDef(AliAODTrack, 15);
396 inline Bool_t AliAODTrack::IsPrimaryCandidate() const
398 // True of track passes primary particle selection (independent of type)
407 inline Int_t AliAODTrack::GetITSNcls() const
409 // Number of points in ITS
411 for(Int_t i=0;i<6;i++) if(HasPointOnITSLayer(i)) n++;