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