]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AOD/AliAODTrack.cxx
Patches for the TRD on-line tracklets and tracks in the AODs.
[u/mrichter/AliRoot.git] / STEER / AOD / AliAODTrack.cxx
CommitLineData
df9db588 1/**************************************************************************
2 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id$ */
17
18//-------------------------------------------------------------------------
4f6e22bd 19// AOD track implementation of AliVTrack
df9db588 20// Author: Markus Oldenburg, CERN
0c5f89fb 21// Markus.Oldenburg@cern.ch
df9db588 22//-------------------------------------------------------------------------
23
086400fc 24#include <TVector3.h>
8ac4fa64 25#include "AliLog.h"
6dc40b1c 26#include "AliExternalTrackParam.h"
27#include "AliVVertex.h"
00a38d07 28#include "AliDetectorPID.h"
aab77ed0 29#include "AliAODEvent.h"
567624b5 30#include "AliAODHMPIDrings.h"
31
32#include "AliAODTrack.h"
df9db588 33
34ClassImp(AliAODTrack)
35
36//______________________________________________________________________________
37AliAODTrack::AliAODTrack() :
4f6e22bd 38 AliVTrack(),
f43586f0 39 fRAtAbsorberEnd(0.),
1912763f 40 fChi2perNDF(-999.),
9333290e 41 fChi2MatchTrigger(0.),
6efb741f 42 fFlags(0),
df9db588 43 fLabel(-999),
a2c30af1 44 fTOFLabel(),
9b5c8b95 45 fTrackLength(0),
1912763f 46 fITSMuonClusterMap(0),
0a2dcc83 47 fMUONtrigHitsMapTrg(0),
48 fMUONtrigHitsMapTrk(0),
9333290e 49 fFilterMap(0),
bcabd0e4 50 fTPCFitMap(),
d999f2e6 51 fTPCClusterMap(),
52 fTPCSharedMap(),
3c01c166 53 fTPCnclsF(0),
820214a7 54 fTPCNCrossedRows(0),
02153d58 55 fID(-999),
9333290e 56 fCharge(-99),
e1c744ca 57 fType(kUndef),
a7d9ab9e 58 fCaloIndex(kEMCALNoMatch),
9333290e 59 fCovMatrix(NULL),
7be1db84 60 fDetPid(NULL),
00a38d07 61 fDetectorPID(NULL),
ed15417e 62 fProdVertex(NULL),
63 fTrackPhiOnEMCal(-999),
aab77ed0 64 fTrackEtaOnEMCal(-999),
a29b2a8a 65 fTrackPtOnEMCal(-999),
539a5a59 66 fTPCsignalTuned(0),
a2c30af1 67 fTOFsignalTuned(99999),
aab77ed0 68 fAODEvent(NULL)
df9db588 69{
70 // default constructor
71
72 SetP();
73 SetPosition((Float_t*)NULL);
6c954176 74 SetXYAtDCA(-999., -999.);
75 SetPxPyPzAtDCA(-999., -999., -999.);
df9db588 76 SetPID((Float_t*)NULL);
a2c30af1 77 for (Int_t i = 0; i < 3; i++) {fTOFLabel[i] = -1;}
df9db588 78}
79
80//______________________________________________________________________________
02153d58 81AliAODTrack::AliAODTrack(Short_t id,
df9db588 82 Int_t label,
83 Double_t p[3],
84 Bool_t cartesian,
85 Double_t x[3],
86 Bool_t isDCA,
87 Double_t covMatrix[21],
88 Short_t charge,
89 UChar_t itsClusMap,
90 Double_t pid[10],
91 AliAODVertex *prodVertex,
1912763f 92 Bool_t usedForVtxFit,
dc825b15 93 Bool_t usedForPrimVtxFit,
ec40c484 94 AODTrk_t ttype,
862ce351 95 UInt_t selectInfo,
96 Float_t chi2perNDF) :
4f6e22bd 97 AliVTrack(),
f43586f0 98 fRAtAbsorberEnd(0.),
862ce351 99 fChi2perNDF(chi2perNDF),
9333290e 100 fChi2MatchTrigger(0.),
6efb741f 101 fFlags(0),
df9db588 102 fLabel(label),
a2c30af1 103 fTOFLabel(),
9b5c8b95 104 fTrackLength(0),
6c954176 105 fITSMuonClusterMap(0),
0a2dcc83 106 fMUONtrigHitsMapTrg(0),
107 fMUONtrigHitsMapTrk(0),
9333290e 108 fFilterMap(selectInfo),
bcabd0e4 109 fTPCFitMap(),
d999f2e6 110 fTPCClusterMap(),
111 fTPCSharedMap(),
3c01c166 112 fTPCnclsF(0),
820214a7 113 fTPCNCrossedRows(0),
02153d58 114 fID(id),
9333290e 115 fCharge(charge),
e1c744ca 116 fType(ttype),
a7d9ab9e 117 fCaloIndex(kEMCALNoMatch),
9333290e 118 fCovMatrix(NULL),
7be1db84 119 fDetPid(NULL),
00a38d07 120 fDetectorPID(NULL),
ed15417e 121 fProdVertex(prodVertex),
122 fTrackPhiOnEMCal(-999),
aab77ed0 123 fTrackEtaOnEMCal(-999),
a29b2a8a 124 fTrackPtOnEMCal(-999),
539a5a59 125 fTPCsignalTuned(0),
a2c30af1 126 fTOFsignalTuned(99999),
aab77ed0 127 fAODEvent(NULL)
df9db588 128{
129 // constructor
130
131 SetP(p, cartesian);
132 SetPosition(x, isDCA);
6c954176 133 SetXYAtDCA(-999., -999.);
134 SetPxPyPzAtDCA(-999., -999., -999.);
1912763f 135 SetUsedForVtxFit(usedForVtxFit);
dc825b15 136 SetUsedForPrimVtxFit(usedForPrimVtxFit);
df9db588 137 if(covMatrix) SetCovMatrix(covMatrix);
138 SetPID(pid);
6c954176 139 SetITSClusterMap(itsClusMap);
a2c30af1 140 for (Int_t i=0;i<3;i++) {fTOFLabel[i]=-1;}
df9db588 141}
142
143//______________________________________________________________________________
02153d58 144AliAODTrack::AliAODTrack(Short_t id,
df9db588 145 Int_t label,
146 Float_t p[3],
147 Bool_t cartesian,
148 Float_t x[3],
149 Bool_t isDCA,
150 Float_t covMatrix[21],
151 Short_t charge,
152 UChar_t itsClusMap,
153 Float_t pid[10],
154 AliAODVertex *prodVertex,
1912763f 155 Bool_t usedForVtxFit,
dc825b15 156 Bool_t usedForPrimVtxFit,
ec40c484 157 AODTrk_t ttype,
862ce351 158 UInt_t selectInfo,
159 Float_t chi2perNDF) :
4f6e22bd 160 AliVTrack(),
f43586f0 161 fRAtAbsorberEnd(0.),
862ce351 162 fChi2perNDF(chi2perNDF),
9333290e 163 fChi2MatchTrigger(0.),
6efb741f 164 fFlags(0),
df9db588 165 fLabel(label),
a2c30af1 166 fTOFLabel(),
9b5c8b95 167 fTrackLength(0),
6c954176 168 fITSMuonClusterMap(0),
0a2dcc83 169 fMUONtrigHitsMapTrg(0),
170 fMUONtrigHitsMapTrk(0),
9333290e 171 fFilterMap(selectInfo),
bcabd0e4 172 fTPCFitMap(),
d999f2e6 173 fTPCClusterMap(),
174 fTPCSharedMap(),
3c01c166 175 fTPCnclsF(0),
820214a7 176 fTPCNCrossedRows(0),
02153d58 177 fID(id),
9333290e 178 fCharge(charge),
e1c744ca 179 fType(ttype),
a7d9ab9e 180 fCaloIndex(kEMCALNoMatch),
9333290e 181 fCovMatrix(NULL),
7be1db84 182 fDetPid(NULL),
00a38d07 183 fDetectorPID(NULL),
ed15417e 184 fProdVertex(prodVertex),
185 fTrackPhiOnEMCal(-999),
aab77ed0 186 fTrackEtaOnEMCal(-999),
a29b2a8a 187 fTrackPtOnEMCal(-999),
539a5a59 188 fTPCsignalTuned(0),
a2c30af1 189 fTOFsignalTuned(99999),
aab77ed0 190 fAODEvent(NULL)
df9db588 191{
192 // constructor
193
194 SetP(p, cartesian);
195 SetPosition(x, isDCA);
6c954176 196 SetXYAtDCA(-999., -999.);
197 SetPxPyPzAtDCA(-999., -999., -999.);
1912763f 198 SetUsedForVtxFit(usedForVtxFit);
dc825b15 199 SetUsedForPrimVtxFit(usedForPrimVtxFit);
df9db588 200 if(covMatrix) SetCovMatrix(covMatrix);
201 SetPID(pid);
6c954176 202 SetITSClusterMap(itsClusMap);
a2c30af1 203 for (Int_t i=0;i<3;i++) {fTOFLabel[i]=-1;}
df9db588 204}
205
df9db588 206//______________________________________________________________________________
207AliAODTrack::~AliAODTrack()
208{
209 // destructor
210 delete fCovMatrix;
7450f8ab 211 delete fDetPid;
00a38d07 212 delete fDetectorPID;
df9db588 213}
214
215
216//______________________________________________________________________________
217AliAODTrack::AliAODTrack(const AliAODTrack& trk) :
4f6e22bd 218 AliVTrack(trk),
f43586f0 219 fRAtAbsorberEnd(trk.fRAtAbsorberEnd),
1912763f 220 fChi2perNDF(trk.fChi2perNDF),
9333290e 221 fChi2MatchTrigger(trk.fChi2MatchTrigger),
6efb741f 222 fFlags(trk.fFlags),
df9db588 223 fLabel(trk.fLabel),
a2c30af1 224 fTOFLabel(),
9b5c8b95 225 fTrackLength(trk.fTrackLength),
1912763f 226 fITSMuonClusterMap(trk.fITSMuonClusterMap),
0a2dcc83 227 fMUONtrigHitsMapTrg(trk.fMUONtrigHitsMapTrg),
228 fMUONtrigHitsMapTrk(trk.fMUONtrigHitsMapTrk),
9333290e 229 fFilterMap(trk.fFilterMap),
bcabd0e4 230 fTPCFitMap(trk.fTPCFitMap),
d999f2e6 231 fTPCClusterMap(trk.fTPCClusterMap),
232 fTPCSharedMap(trk.fTPCSharedMap),
3c01c166 233 fTPCnclsF(trk.fTPCnclsF),
820214a7 234 fTPCNCrossedRows(trk.fTPCNCrossedRows),
02153d58 235 fID(trk.fID),
9333290e 236 fCharge(trk.fCharge),
e1c744ca 237 fType(trk.fType),
a7d9ab9e 238 fCaloIndex(trk.fCaloIndex),
9333290e 239 fCovMatrix(NULL),
7be1db84 240 fDetPid(NULL),
00a38d07 241 fDetectorPID(NULL),
ed15417e 242 fProdVertex(trk.fProdVertex),
243 fTrackPhiOnEMCal(trk.fTrackPhiOnEMCal),
aab77ed0 244 fTrackEtaOnEMCal(trk.fTrackEtaOnEMCal),
a29b2a8a 245 fTrackPtOnEMCal(trk.fTrackPtOnEMCal),
539a5a59 246 fTPCsignalTuned(trk.fTPCsignalTuned),
a2c30af1 247 fTOFsignalTuned(trk.fTOFsignalTuned),
aab77ed0 248 fAODEvent(trk.fAODEvent)
df9db588 249{
250 // Copy constructor
251
252 trk.GetP(fMomentum);
253 trk.GetPosition(fPosition);
6c954176 254 SetXYAtDCA(trk.XAtDCA(), trk.YAtDCA());
255 SetPxPyPzAtDCA(trk.PxAtDCA(), trk.PyAtDCA(), trk.PzAtDCA());
1912763f 256 SetUsedForVtxFit(trk.GetUsedForVtxFit());
dc825b15 257 SetUsedForPrimVtxFit(trk.GetUsedForPrimVtxFit());
5d62ce04 258 if(trk.fCovMatrix) fCovMatrix=new AliAODRedCov<6>(*trk.fCovMatrix);
7be1db84 259 if(trk.fDetPid) fDetPid=new AliAODPid(*trk.fDetPid);
df9db588 260 SetPID(trk.fPID);
00a38d07 261 if (trk.fDetectorPID) fDetectorPID = new AliDetectorPID(*trk.fDetectorPID);
a2c30af1 262 for (Int_t i = 0; i < 3; i++) {fTOFLabel[i] = trk.fTOFLabel[i];}
df9db588 263}
264
265//______________________________________________________________________________
266AliAODTrack& AliAODTrack::operator=(const AliAODTrack& trk)
267{
268 // Assignment operator
269 if(this!=&trk) {
270
4f6e22bd 271 AliVTrack::operator=(trk);
df9db588 272
273 trk.GetP(fMomentum);
274 trk.GetPosition(fPosition);
6c954176 275 SetXYAtDCA(trk.XAtDCA(), trk.YAtDCA());
276 SetPxPyPzAtDCA(trk.PxAtDCA(), trk.PyAtDCA(), trk.PzAtDCA());
05f9607e 277 fRAtAbsorberEnd = trk.fRAtAbsorberEnd;
278 fChi2perNDF = trk.fChi2perNDF;
279 fChi2MatchTrigger = trk.fChi2MatchTrigger;
280 trk.GetPID(fPID);
281 fFlags = trk.fFlags;
282 fLabel = trk.fLabel;
9b5c8b95 283 fTrackLength = trk.fTrackLength;
9333290e 284 fITSMuonClusterMap = trk.fITSMuonClusterMap;
0a2dcc83 285 fMUONtrigHitsMapTrg = trk.fMUONtrigHitsMapTrg;
286 fMUONtrigHitsMapTrk = trk.fMUONtrigHitsMapTrk;
05f9607e 287 fFilterMap = trk.fFilterMap;
bcabd0e4 288 fTPCFitMap = trk.fTPCFitMap;
05f9607e 289 fTPCClusterMap = trk.fTPCClusterMap;
290 fTPCSharedMap = trk.fTPCSharedMap;
291 fTPCnclsF = trk.fTPCnclsF;
820214a7 292 fTPCNCrossedRows = trk.fTPCNCrossedRows;
05f9607e 293 fID = trk.fID;
294 fCharge = trk.fCharge;
295 fType = trk.fType;
296 fCaloIndex = trk.fCaloIndex;
ed15417e 297 fTrackPhiOnEMCal = trk.fTrackPhiOnEMCal;
298 fTrackEtaOnEMCal = trk.fTrackEtaOnEMCal;
a29b2a8a 299 fTrackPtOnEMCal = trk.fTrackPtOnEMCal;
539a5a59 300 fTPCsignalTuned = trk.fTPCsignalTuned;
a2c30af1 301 fTOFsignalTuned = trk.fTOFsignalTuned;
a7d9ab9e 302
df9db588 303 delete fCovMatrix;
5d62ce04 304 if(trk.fCovMatrix) fCovMatrix=new AliAODRedCov<6>(*trk.fCovMatrix);
df9db588 305 else fCovMatrix=NULL;
df9db588 306
05f9607e 307
308 fProdVertex = trk.fProdVertex;
1912763f 309 SetUsedForVtxFit(trk.GetUsedForVtxFit());
dc825b15 310 SetUsedForPrimVtxFit(trk.GetUsedForPrimVtxFit());
7be1db84 311
00a38d07 312 //detector raw signals
7be1db84 313 delete fDetPid;
314 if(trk.fDetPid) fDetPid=new AliAODPid(*trk.fDetPid);
315 else fDetPid=NULL;
05f9607e 316
00a38d07 317 //calibrated PID cache
318 delete fDetectorPID;
319 fDetectorPID=0x0;
320 if (trk.fDetectorPID) fDetectorPID = new AliDetectorPID(*trk.fDetectorPID);
a2c30af1 321 for (Int_t i = 0; i < 3; i++) {fTOFLabel[i] = trk.fTOFLabel[i];}
df9db588 322 }
323
324 return *this;
325}
326
4697e4fb 327//______________________________________________________________________________
328Double_t AliAODTrack::M(AODTrkPID_t pid) const
329{
330 // Returns the mass.
9861edc0 331 // Masses for nuclei don't exist in the PDG tables, therefore they were put by hand.
4697e4fb 332
333 switch (pid) {
334
335 case kElectron :
9861edc0 336 return 0.000510999; //TDatabasePDG::Instance()->GetParticle(11/*::kElectron*/)->Mass();
4697e4fb 337 break;
338
339 case kMuon :
9861edc0 340 return 0.1056584; //TDatabasePDG::Instance()->GetParticle(13/*::kMuonMinus*/)->Mass();
4697e4fb 341 break;
342
343 case kPion :
9861edc0 344 return 0.13957; //TDatabasePDG::Instance()->GetParticle(211/*::kPiPlus*/)->Mass();
4697e4fb 345 break;
346
347 case kKaon :
9861edc0 348 return 0.4937; //TDatabasePDG::Instance()->GetParticle(321/*::kKPlus*/)->Mass();
4697e4fb 349 break;
350
351 case kProton :
9861edc0 352 return 0.9382720; //TDatabasePDG::Instance()->GetParticle(2212/*::kProton*/)->Mass();
4697e4fb 353 break;
354
355 case kDeuteron :
9861edc0 356 return 1.8756; //TDatabasePDG::Instance()->GetParticle(1000010020)->Mass();
4697e4fb 357 break;
358
359 case kTriton :
9861edc0 360 return 2.8089; //TDatabasePDG::Instance()->GetParticle(1000010030)->Mass();
4697e4fb 361 break;
362
363 case kHelium3 :
9861edc0 364 return 2.8084; //TDatabasePDG::Instance()->GetParticle(1000020030)->Mass();
4697e4fb 365 break;
366
367 case kAlpha :
9861edc0 368 return 3.7274; //TDatabasePDG::Instance()->GetParticle(1000020040)->Mass();
4697e4fb 369 break;
370
371 case kUnknown :
372 return -999.;
373 break;
374
375 default :
376 return -999.;
377 }
378}
379
380//______________________________________________________________________________
381Double_t AliAODTrack::E(AODTrkPID_t pid) const
382{
383 // Returns the energy of the particle of a given pid.
384
385 if (pid != kUnknown) { // particle was identified
386 Double_t m = M(pid);
387 return TMath::Sqrt(P()*P() + m*m);
388 } else { // pid unknown
389 return -999.;
390 }
391}
392
393//______________________________________________________________________________
394Double_t AliAODTrack::Y(AODTrkPID_t pid) const
395{
9861edc0 396 // Returns the rapidity of a particle of a given pid.
4697e4fb 397
398 if (pid != kUnknown) { // particle was identified
399 Double_t e = E(pid);
400 Double_t pz = Pz();
401 if (e>=0 && e!=pz) { // energy was positive (e.g. not -999.) and not equal to pz
402 return 0.5*TMath::Log((e+pz)/(e-pz));
403 } else { // energy not known or equal to pz
404 return -999.;
405 }
406 } else { // pid unknown
407 return -999.;
408 }
409}
410
411//______________________________________________________________________________
412Double_t AliAODTrack::Y(Double_t m) const
413{
9861edc0 414 // Returns the rapidity of a particle of a given mass.
4697e4fb 415
416 if (m >= 0.) { // mass makes sense
417 Double_t e = E(m);
418 Double_t pz = Pz();
419 if (e>=0 && e!=pz) { // energy was positive (e.g. not -999.) and not equal to pz
420 return 0.5*TMath::Log((e+pz)/(e-pz));
421 } else { // energy not known or equal to pz
422 return -999.;
423 }
424 } else { // pid unknown
425 return -999.;
426 }
427}
428
a2c30af1 429void AliAODTrack::SetTOFLabel(const Int_t *p) {
430 // Sets (in TOF)
431 for (Int_t i = 0; i < 3; i++) fTOFLabel[i]=p[i];
432}
433
434//_______________________________________________________________________
435void AliAODTrack::GetTOFLabel(Int_t *p) const {
436 // Gets (in TOF)
437 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
438}
439
4697e4fb 440//______________________________________________________________________________
441AliAODTrack::AODTrkPID_t AliAODTrack::GetMostProbablePID() const
442{
443 // Returns the most probable PID array element.
444
445 Int_t nPID = 10;
7ba6f91a 446 AODTrkPID_t loc = kUnknown;
447 Double_t max = 0.;
448 Bool_t allTheSame = kTRUE;
449
450 for (Int_t iPID = 0; iPID < nPID; iPID++) {
451 if (fPID[iPID] >= max) {
452 if (fPID[iPID] > max) {
453 allTheSame = kFALSE;
454 max = fPID[iPID];
455 loc = (AODTrkPID_t)iPID;
456 } else {
457 allTheSame = kTRUE;
4697e4fb 458 }
459 }
4697e4fb 460 }
7ba6f91a 461 return allTheSame ? kUnknown : loc;
4697e4fb 462}
463
464//______________________________________________________________________________
465void AliAODTrack::ConvertAliPIDtoAODPID()
466{
467 // Converts AliPID array.
468 // The numbering scheme is the same for electrons, muons, pions, kaons, and protons.
469 // Everything else has to be set to zero.
470
471 fPID[kDeuteron] = 0.;
8a1418dc 472 fPID[kTriton] = 0.;
473 fPID[kHelium3] = 0.;
474 fPID[kAlpha] = 0.;
475 fPID[kUnknown] = 0.;
4697e4fb 476
477 return;
478}
479
480
df9db588 481//______________________________________________________________________________
cdd730d0 482template <typename T> void AliAODTrack::SetP(const T *p, const Bool_t cartesian)
df9db588 483{
8a1418dc 484 // Set the momentum
df9db588 485
486 if (p) {
487 if (cartesian) {
16b65f2a 488 Double_t pt2 = p[0]*p[0] + p[1]*p[1];
0c5f89fb 489 Double_t pp = TMath::Sqrt(pt2 + p[2]*p[2]);
df9db588 490
16b65f2a 491 fMomentum[0] = TMath::Sqrt(pt2); // pt
b1a9edc8 492 fMomentum[1] = (pt2 != 0.) ? TMath::Pi()+TMath::ATan2(-p[1], -p[0]) : -999; // phi
0c5f89fb 493 fMomentum[2] = (pp != 0.) ? TMath::ACos(p[2] / pp) : -999.; // theta
df9db588 494 } else {
16b65f2a 495 fMomentum[0] = p[0]; // pt
df9db588 496 fMomentum[1] = p[1]; // phi
497 fMomentum[2] = p[2]; // theta
498 }
499 } else {
500 fMomentum[0] = -999.;
501 fMomentum[1] = -999.;
502 fMomentum[2] = -999.;
503 }
504}
505
6e78367a 506/*
df9db588 507//______________________________________________________________________________
cdd730d0 508template <typename T> void AliAODTrack::SetPosition(const T *x, const Bool_t dca)
df9db588 509{
510 // set the position
511
512 if (x) {
513 if (!dca) {
514 ResetBit(kIsDCA);
515
516 fPosition[0] = x[0];
517 fPosition[1] = x[1];
518 fPosition[2] = x[2];
519 } else {
520 SetBit(kIsDCA);
521 // don't know any better yet
522 fPosition[0] = -999.;
523 fPosition[1] = -999.;
524 fPosition[2] = -999.;
525 }
526 } else {
527 ResetBit(kIsDCA);
528
529 fPosition[0] = -999.;
530 fPosition[1] = -999.;
531 fPosition[2] = -999.;
532 }
533}
6e78367a 534*/
df9db588 535//______________________________________________________________________________
536void AliAODTrack::SetDCA(Double_t d, Double_t z)
537{
538 // set the dca
539 fPosition[0] = d;
540 fPosition[1] = z;
541 fPosition[2] = 0.;
542 SetBit(kIsDCA);
543}
544
545//______________________________________________________________________________
546void AliAODTrack::Print(Option_t* /* option */) const
547{
548 // prints information about AliAODTrack
549
550 printf("Object name: %s Track type: %s\n", GetName(), GetTitle());
551 printf(" px = %f\n", Px());
552 printf(" py = %f\n", Py());
553 printf(" pz = %f\n", Pz());
554 printf(" pt = %f\n", Pt());
555 printf(" 1/pt = %f\n", OneOverPt());
556 printf(" theta = %f\n", Theta());
557 printf(" phi = %f\n", Phi());
1912763f 558 printf(" chi2/NDF = %f\n", Chi2perNDF());
df9db588 559 printf(" charge = %d\n", Charge());
df9db588 560}
561
2200238e 562//______________________________________________________________________________
563void AliAODTrack::SetMatchTrigger(Int_t matchTrig)
564{
565 // Set the MUON trigger information
8ac4fa64 566 switch(matchTrig){
e1c744ca 567 case 0: // 0 track does not match trigger
568 fITSMuonClusterMap=fITSMuonClusterMap&0x3fffffff;
569 break;
570 case 1: // 1 track match but does not pass pt cut
571 fITSMuonClusterMap=(fITSMuonClusterMap&0x3fffffff)|0x40000000;
572 break;
573 case 2: // 2 track match Low pt cut
574 fITSMuonClusterMap=(fITSMuonClusterMap&0x3fffffff)|0x80000000;
575 break;
576 case 3: // 3 track match High pt cut
577 fITSMuonClusterMap=fITSMuonClusterMap|0xc0000000;
578 break;
579 default:
580 fITSMuonClusterMap=fITSMuonClusterMap&0x3fffffff;
8ac4fa64 581 AliWarning(Form("unknown case for matchTrig: %d\n",matchTrig));
e1c744ca 582 }
583}
584
2200238e 585//______________________________________________________________________________
586Bool_t AliAODTrack::HitsMuonChamber(Int_t MuonChamber, Int_t cathode) const
587{
588 // return kTRUE if the track fires the given tracking or trigger chamber.
589 // If the chamber is a trigger one:
590 // - if cathode = 0 or 1, the track matches the corresponding cathode
591 // - if cathode = -1, the track matches both cathodes
592
593 if (MuonChamber < 0) return kFALSE;
594
595 if (MuonChamber < 10) return TESTBIT(GetMUONClusterMap(), MuonChamber);
596
597 if (MuonChamber < 14) {
598
599 if (cathode < 0) return TESTBIT(GetHitsPatternInTrigCh(), 13-MuonChamber) &&
600 TESTBIT(GetHitsPatternInTrigCh(), 13-MuonChamber+4);
601
602 if (cathode < 2) return TESTBIT(GetHitsPatternInTrigCh(), 13-MuonChamber+(1-cathode)*4);
603
e1c744ca 604 }
2200238e 605
606 return kFALSE;
e1c744ca 607}
608
2200238e 609//______________________________________________________________________________
610Bool_t AliAODTrack::MatchTriggerDigits() const
611{
612 // return kTRUE if the track matches a digit on both planes of at least 2 trigger chambers
6c954176 613
2200238e 614 Int_t nMatchedChambers = 0;
615 for (Int_t ich=10; ich<14; ich++) if (HitsMuonChamber(ich)) nMatchedChambers++;
616
617 return (nMatchedChambers >= 2);
e1c744ca 618}
c683ddc2 619
6dc40b1c 620//______________________________________________________________________________
621Bool_t AliAODTrack::PropagateToDCA(const AliVVertex *vtx,
622 Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3])
623{
624 // compute impact parameters to the vertex vtx and their covariance matrix
625 // b is the Bz, needed to propagate correctly the track to vertex
626 // only the track parameters are update after the propagation (pos and mom),
627 // not the covariance matrix. This is OK for propagation over short distance
628 // inside the beam pipe.
629 // return kFALSE is something went wrong
630
631 // convert to AliExternalTrackParam
4ec1ca0f 632 AliExternalTrackParam etp; etp.CopyFromVTrack(this);
6dc40b1c 633
634 Float_t xstart = etp.GetX();
635 if(xstart>3.) {
636 AliError("This method can be used only for propagation inside the beam pipe");
637 return kFALSE;
638 }
639
640 if(!etp.PropagateToDCA(vtx,b,maxd,dz,covar)) return kFALSE;
641
642 // update track position and momentum
643 Double_t mom[3];
644 etp.GetPxPyPz(mom);
645 SetP(mom,kTRUE);
646 etp.GetXYZ(mom);
647 SetPosition(mom,kFALSE);
648
649
650 return kTRUE;
651}
652
c8fe2783 653//______________________________________________________________________________
654Bool_t AliAODTrack::GetPxPyPz(Double_t p[3]) const
655{
656 //---------------------------------------------------------------------
657 // This function returns the global track momentum components
658 //---------------------------------------------------------------------
659 p[0]=Px(); p[1]=Py(); p[2]=Pz();
660 return kTRUE;
661}
9006fe9c 662
25f906db 663
664//_______________________________________________________________________
665Float_t AliAODTrack::GetTPCClusterInfo(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1, Int_t bitType ) const
9006fe9c 666{
667 //
25f906db 668 // TPC cluster information
9006fe9c 669 // type 0: get fraction of found/findable clusters with neighbourhood definition
670 // 1: findable clusters with neighbourhood definition
671 // 2: found clusters
25f906db 672 // bitType:
673 // 0 - all cluster used
674 // 1 - clusters used for the kalman update
9006fe9c 675 // definition of findable clusters:
676 // a cluster is defined as findable if there is another cluster
677 // within +- nNeighbours pad rows. The idea is to overcome threshold
678 // effects with a very simple algorithm.
679 //
25f906db 680
9006fe9c 681
682 Int_t found=0;
683 Int_t findable=0;
684 Int_t last=-nNeighbours;
25f906db 685 const TBits & clusterMap = (bitType%2==0) ? fTPCClusterMap : fTPCFitMap;
9006fe9c 686
25f906db 687 Int_t upperBound=clusterMap.GetNbits();
688 if (upperBound>row1) upperBound=row1;
689 for (Int_t i=row0; i<upperBound; ++i){
9006fe9c 690 //look to current row
25f906db 691 if (clusterMap[i]) {
9006fe9c 692 last=i;
693 ++found;
694 ++findable;
695 continue;
696 }
697 //look to nNeighbours before
698 if ((i-last)<=nNeighbours) {
699 ++findable;
700 continue;
701 }
702 //look to nNeighbours after
703 for (Int_t j=i+1; j<i+1+nNeighbours; ++j){
25f906db 704 if (clusterMap[j]){
9006fe9c 705 ++findable;
706 break;
707 }
708 }
709 }
25f906db 710 if (type==2) return found;
9006fe9c 711 if (type==1) return findable;
712
713 if (type==0){
714 Float_t fraction=0;
25f906db 715 if (findable>0)
9006fe9c 716 fraction=(Float_t)found/(Float_t)findable;
25f906db 717 else
9006fe9c 718 fraction=0;
719 return fraction;
25f906db 720 }
9006fe9c 721 return 0; // undefined type - default value
722}
fd21ec8d 723
25f906db 724
fd21ec8d 725//______________________________________________________________________________
726Double_t AliAODTrack::GetTRDslice(Int_t plane, Int_t slice) const {
727 //
728 // return TRD Pid information
729 //
730 if (!fDetPid) return -1;
6736efd5 731 Double32_t *trdSlices=fDetPid->GetTRDslices();
fd21ec8d 732 if (!trdSlices) return -1;
733 if ((plane<0) || (plane>=kTRDnPlanes)) {
734 return -1.;
735 }
736
99e9d5ec 737 Int_t ns=fDetPid->GetTRDnSlices()/kTRDnPlanes;
fd21ec8d 738 if ((slice<-1) || (slice>=ns)) {
739 return -1.;
740 }
741
742 if(slice>=0) return trdSlices[plane*ns + slice];
743
744 // return average of the dEdx measurements
745 Double_t q=0.; Double32_t *s = &trdSlices[plane*ns];
746 for (Int_t i=0; i<ns; i++, s++) if((*s)>0.) q+=(*s);
747 return q/ns;
748}
749
99e9d5ec 750//______________________________________________________________________________
751UChar_t AliAODTrack::GetTRDntrackletsPID() const{
752 //
753 // return number of tracklets calculated from the slices
754 //
755 if(!fDetPid) return -1;
59a8e853 756 return fDetPid->GetTRDntrackletsPID();
757}
99e9d5ec 758
59a8e853 759//______________________________________________________________________________
760UChar_t AliAODTrack::GetTRDncls(Int_t layer) const {
761 //
762 // return number of TRD clusters
763 //
764 if(!fDetPid || layer > 5) return -1;
765 if(layer < 0) return fDetPid->GetTRDncls();
766 else return fDetPid->GetTRDncls(layer);
99e9d5ec 767}
768
fd21ec8d 769//______________________________________________________________________________
770Double_t AliAODTrack::GetTRDmomentum(Int_t plane, Double_t */*sp*/) const
771{
772 //Returns momentum estimation
773 // in TRD layer "plane".
774
775 if (!fDetPid) return -1;
c997f0f9 776 const Double_t *trdMomentum=fDetPid->GetTRDmomentum();
fd21ec8d 777
778 if (!trdMomentum) {
779 return -1.;
780 }
781 if ((plane<0) || (plane>=kTRDnPlanes)) {
782 return -1.;
783 }
784
785 return trdMomentum[plane];
786}
76e6ee6a 787
788//_______________________________________________________________________
1cecd6e3 789Int_t AliAODTrack::GetTOFBunchCrossing(Double_t b, Bool_t) const
76e6ee6a 790{
791 // Returns the number of bunch crossings after trigger (assuming 25ns spacing)
76e6ee6a 792 const double kSpacing = 25e3; // min interbanch spacing
793 const double kShift = 0;
3f2db92f 794 Int_t bcid = kTOFBCNA; // defualt one
a512bf97 795 if (!IsOn(kTOFout) || !IsOn(kESDpid)) return bcid; // no info
796 //
797 double tdif = GetTOFsignal();
798 if (IsOn(kTIME)) { // integrated time info is there
799 int pid = (int)GetMostProbablePID();
800 double ttimes[10];
801 GetIntegratedTimes(ttimes);
802 tdif -= ttimes[pid];
803 }
804 else { // assume integrated time info from TOF radius and momentum
805 const double kRTOF = 385.;
806 const double kCSpeed = 3.e-2; // cm/ps
807 double p = P();
808 if (p<0.001) p = 1.0;
809 double m = M();
810 double path = kRTOF; // mean TOF radius
811 if (TMath::Abs(b)>kAlmost0) { // account for curvature
812 double curv = Pt()/(b*kB2C);
813 if (curv>kAlmost0) {
814 double tgl = Pz()/Pt();
815 path = 2./curv*TMath::ASin(kRTOF*curv/2.)*TMath::Sqrt(1.+tgl*tgl);
816 }
817 }
818 tdif -= path/kCSpeed*TMath::Sqrt(1.+m*m/(p*p));
819 }
76e6ee6a 820 bcid = TMath::Nint((tdif - kShift)/kSpacing);
821 return bcid;
822}
086400fc 823
00a38d07 824void AliAODTrack::SetDetectorPID(const AliDetectorPID *pid)
825{
826 //
827 // Set the detector PID
828 //
829 if (fDetectorPID) delete fDetectorPID;
830 fDetectorPID=pid;
831
832}
833
567624b5 834//_____________________________________________________________________________
835Double_t AliAODTrack::GetHMPIDsignal() const
836{
837 if(fAODEvent->GetHMPIDringForTrackID(fID)) return fAODEvent->GetHMPIDringForTrackID(fID)->GetHmpSignal();
838 else return -999.;
839}
840
841//_____________________________________________________________________________
842Double_t AliAODTrack::GetHMPIDoccupancy() const
843{
844 if(fAODEvent->GetHMPIDringForTrackID(fID)) return fAODEvent->GetHMPIDringForTrackID(fID)->GetHmpOccupancy();
845 else return -999.;
846}
847
848//_____________________________________________________________________________
849Int_t AliAODTrack::GetHMPIDcluIdx() const
850{
851 if(fAODEvent->GetHMPIDringForTrackID(fID)) return fAODEvent->GetHMPIDringForTrackID(fID)->GetHmpCluIdx();
852 else return -999;
853}
854
855//_____________________________________________________________________________
856void AliAODTrack::GetHMPIDtrk(Float_t &x, Float_t &y, Float_t &th, Float_t &ph) const
857{
858 x = -999; y = -999.; th = -999.; ph = -999.;
859
860 const AliAODHMPIDrings *ring=fAODEvent->GetHMPIDringForTrackID(fID);
861 if(ring){
862 x = ring->GetHmpTrackX();
863 y = ring->GetHmpTrackY();
864 th = ring->GetHmpTrackTheta();
865 ph = ring->GetHmpTrackPhi();
866 }
867}
868
869//_____________________________________________________________________________
870void AliAODTrack::GetHMPIDmip(Float_t &x,Float_t &y,Int_t &q, Int_t &nph) const
871{
872 x = -999; y = -999.; q = -999; nph = -999;
873
874 const AliAODHMPIDrings *ring=fAODEvent->GetHMPIDringForTrackID(fID);
875 if(ring){
876 x = ring->GetHmpMipX();
877 y = ring->GetHmpMipY();
878 q = (Int_t)ring->GetHmpMipCharge();
879 nph = (Int_t)ring->GetHmpNumOfPhotonClusters();
880 }
881}
882
883//_____________________________________________________________________________
884Bool_t AliAODTrack::GetOuterHmpPxPyPz(Double_t *p) const
885{
886 if(fAODEvent->GetHMPIDringForTrackID(fID)) {fAODEvent->GetHMPIDringForTrackID(fID)->GetHmpMom(p); return kTRUE;}
887
888 else return kFALSE;
889}
086400fc 890//_____________________________________________________________________________
891Bool_t AliAODTrack::GetXYZAt(Double_t x, Double_t b, Double_t *r) const
892{
893 //---------------------------------------------------------------------
894 // This function returns the global track position extrapolated to
895 // the radial position "x" (cm) in the magnetic field "b" (kG)
896 //---------------------------------------------------------------------
897
898 //conversion of track parameter representation is
899 //based on the implementation of AliExternalTrackParam::Set(...)
900 //maybe some of this code can be moved to AliVTrack to avoid code duplication
901 const double kSafe = 1e-5;
902 Double_t alpha=0.0;
903 Double_t radPos2 = fPosition[0]*fPosition[0]+fPosition[1]*fPosition[1];
904 Double_t radMax = 45.; // approximately ITS outer radius
905 if (radPos2 < radMax*radMax) { // inside the ITS
906 alpha = TMath::ATan2(fMomentum[1],fMomentum[0]);
907 } else { // outside the ITS
908 Float_t phiPos = TMath::Pi()+TMath::ATan2(-fPosition[1], -fPosition[0]);
909 alpha =
910 TMath::DegToRad()*(20*((((Int_t)(phiPos*TMath::RadToDeg()))/20))+10);
911 }
912 //
913 Double_t cs=TMath::Cos(alpha), sn=TMath::Sin(alpha);
914 // protection: avoid alpha being too close to 0 or +-pi/2
915 if (TMath::Abs(sn)<kSafe) {
916 alpha = kSafe;
917 cs=TMath::Cos(alpha);
918 sn=TMath::Sin(alpha);
919 }
920 else if (cs<kSafe) {
921 alpha -= TMath::Sign(kSafe, alpha);
922 cs=TMath::Cos(alpha);
923 sn=TMath::Sin(alpha);
924 }
925
926 // Get the vertex of origin and the momentum
927 TVector3 ver(fPosition[0],fPosition[1],fPosition[2]);
928 TVector3 mom(fMomentum[0],fMomentum[1],fMomentum[2]);
929 //
930 // avoid momenta along axis
931 if (TMath::Abs(mom[0])<kSafe) mom[0] = TMath::Sign(kSafe*TMath::Abs(mom[1]), mom[0]);
932 if (TMath::Abs(mom[1])<kSafe) mom[1] = TMath::Sign(kSafe*TMath::Abs(mom[0]), mom[1]);
933
934 // Rotate to the local coordinate system
935 ver.RotateZ(-alpha);
936 mom.RotateZ(-alpha);
937
938 Double_t param0 = ver.Y();
939 Double_t param1 = ver.Z();
940 Double_t param2 = TMath::Sin(mom.Phi());
941 Double_t param3 = mom.Pz()/mom.Pt();
942 Double_t param4 = TMath::Sign(1/mom.Pt(),(Double_t)fCharge);
943
944 //calculate the propagated coordinates
945 //this is based on AliExternalTrackParam::GetXYZAt(Double_t x, Double_t b, Double_t *r)
946 Double_t dx=x-ver.X();
947 if(TMath::Abs(dx)<=kAlmost0) return GetXYZ(r);
948
949 Double_t f1=param2;
950 Double_t f2=f1 + dx*param4*b*kB2C;
951
952 if (TMath::Abs(f1) >= kAlmost1) return kFALSE;
953 if (TMath::Abs(f2) >= kAlmost1) return kFALSE;
954
955 Double_t r1=TMath::Sqrt((1.-f1)*(1.+f1)), r2=TMath::Sqrt((1.-f2)*(1.+f2));
956 r[0] = x;
957 r[1] = param0 + dx*(f1+f2)/(r1+r2);
958 r[2] = param1 + dx*(r2 + f2*(f1+f2)/(r1+r2))*param3;//Thanks to Andrea & Peter
959
960 return Local2GlobalPosition(r,alpha);
961}
962
963
74ca66e3 964//_______________________________________________________
965void AliAODTrack::GetITSdEdxSamples(Double_t s[4]) const
966{
967 // get ITS dedx samples
968 if (!fDetPid) for (int i=4;i--;) s[i]=0;
969 else for (int i=4;i--;) s[i] = fDetPid->GetITSdEdxSample(i);
970}