1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 // Implementation of the ESD track class
17 // ESD = Event Summary Data
18 // This is the class to deal with during the phisics analysis of data
19 // Origin: Iouri Belikov, CERN
20 // e-mail: Jouri.Belikov@cern.ch
24 // What do you need to know before starting analysis
25 // (by Marian Ivanov: marian.ivanov@cern.ch)
29 // 1. What is the AliESDtrack
30 // 2. What informations do we store
31 // 3. How to use the information for analysis
34 // 1.AliESDtrack is the container of the information about the track/particle
35 // reconstructed during Barrel Tracking.
36 // The track information is propagated from one tracking detector to
37 // other using the functionality of AliESDtrack - Current parameters.
39 // No global fit model is used.
40 // Barrel tracking use Kalman filtering technique, it gives optimal local
41 // track parameters at given point under certian assumptions.
43 // Kalman filter take into account additional effect which are
44 // difficult to handle using global fit.
46 // a.) Multiple scattering
48 // c.) Non homogenous magnetic field
50 // In general case, following barrel detectors are contributing to
51 // the Kalman track information:
56 // In general 3 reconstruction itteration are performed:
57 // 1. Find tracks - sequence TPC->ITS
58 // 2. PropagateBack - sequence ITS->TPC->TRD -> Outer PID detectors
59 // 3. Refit invward - sequence TRD->TPC->ITS
60 // The current tracks are updated after each detector (see bellow).
61 // In specical cases a track sanpshots are stored.
64 // For some type of analysis (+visualization) track local parameters at
65 // different position are neccesary. A snapshots during the track
66 // propagation are created.
67 // (See AliExternalTrackParam class for desctiption of variables and
70 // a. Current parameters - class itself (AliExternalTrackParam)
71 // Contributors: general case TRD->TPC->ITS
72 // Preferable usage: Decission - primary or secondary track
73 // NOTICE - By default the track parameters are stored at the DCA point
74 // to the primary vertex. optimal for primary tracks,
75 // far from optimal for secondary tracks.
76 // b. Constrained parameters - Kalman information updated with
77 // the Primary vertex information
78 // Contributors: general case TRD->TPC->ITS
79 // Preferable usage: Use only for tracks selected as primary
80 // NOTICE - not real constrain - taken as additional measurement
81 // with corresponding error
83 // const AliExternalTrackParam *GetConstrainedParam() const {return fCp;}
84 // c. Inner parameters - Track parameters at inner wall of the TPC
85 // Contributors: general case TRD->TPC
87 // const AliExternalTrackParam *GetInnerParam() const { return fIp;}
89 // d. TPCinnerparam - contributors - TPC only
91 // Preferable usage: Requested for HBT study
92 // (smaller correlations as using also ITS information)
93 // NOTICE - the track parameters are propagated to the DCA to
95 // Optimal for primary, far from optimal for secondary tracks
97 // const AliExternalTrackParam *GetTPCInnerParam() const {return fTPCInner;}
99 // e. Outer parameters -
100 // Contributors- general case - ITS-> TPC -> TRD
101 // The last point - Outer parameters radius is determined
102 // e.a) Local inclination angle bigger than threshold -
103 // Low momenta tracks
104 // e.a) Catastrofic energy losss in material
105 // e.b) Not further improvement (no space points)
107 // a.) Tracking: Starting parameter for Refit inward
110 // NOTICE: Should be not used for the physic analysis
112 // const AliExternalTrackParam *GetOuterParam() const { return fOp;}
114 //-----------------------------------------------------------------
117 #include <TParticle.h>
118 #include <TDatabasePDG.h>
119 #include <TMatrixD.h>
121 #include "AliESDVertex.h"
122 #include "AliESDtrack.h"
123 #include "AliESDEvent.h"
124 #include "AliKalmanTrack.h"
125 #include "AliVTrack.h"
127 #include "AliTrackPointArray.h"
128 #include "TPolyMarker3D.h"
129 #include "AliTrackerBase.h"
130 #include "AliTPCdEdxInfo.h"
131 #include "AliDetectorPID.h"
133 ClassImp(AliESDtrack)
135 void SetPIDValues(Double_t * dest, const Double_t * src, Int_t n) {
136 // This function copies "n" PID weights from "scr" to "dest"
137 // and normalizes their sum to 1 thus producing conditional probabilities.
138 // The negative weights are set to 0.
139 // In case all the weights are non-positive they are replaced by
140 // uniform probabilities
144 Float_t uniform = 1./(Float_t)n;
147 for (Int_t i=0; i<n; i++)
157 for (Int_t i=0; i<n; i++) dest[i] /= sum;
159 for (Int_t i=0; i<n; i++) dest[i] = uniform;
162 //_______________________________________________________________________
163 AliESDtrack::AliESDtrack() :
164 AliExternalTrackParam(),
171 fTPCFitMap(159),//number of padrows
172 fTPCClusterMap(159),//number of padrows
173 fTPCSharedMap(159),//number of padrows
184 fCaloIndex(kEMCALNoMatch),
190 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
193 fCdd(0),fCdz(0),fCzz(0),
211 fTOFsignalTuned(99999),
212 fTOFsignalToT(99999),
213 fTOFsignalRaw(99999),
239 fVertexID(-2),// -2 means an orphan track
241 fCacheNCrossedRows(-10),
242 fCacheChi2TPCConstrainedVsGlobal(-10),
243 fCacheChi2TPCConstrainedVsGlobalVertex(0),
245 fTrackPhiOnEMCal(-999),
246 fTrackEtaOnEMCal(-999)
249 // The default ESD constructor
251 if (!OnlineMode()) fFriendTrack=new AliESDfriendTrack();
254 for (i=kNITSchi2Std;i--;) fITSchi2Std[i] = 0;
255 for (i=0; i<AliPID::kSPECIES; i++) {
265 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
266 for (i=0; i<3; i++) { fV0Indexes[i]=0;}
267 for (i=0;i<kTRDnPlanes;i++) {
270 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
271 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
272 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
273 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
274 for (i=0;i<12;i++) {fITSModule[i]=-1;}
277 bool AliESDtrack::fgkOnlineMode=false;
279 //_______________________________________________________________________
280 AliESDtrack::AliESDtrack(const AliESDtrack& track):
281 AliExternalTrackParam(track),
288 fTPCFitMap(track.fTPCFitMap),
289 fTPCClusterMap(track.fTPCClusterMap),
290 fTPCSharedMap(track.fTPCSharedMap),
291 fFlags(track.fFlags),
293 fLabel(track.fLabel),
294 fITSLabel(track.fITSLabel),
295 fTPCLabel(track.fTPCLabel),
296 fTRDLabel(track.fTRDLabel),
297 fTOFCalChannel(track.fTOFCalChannel),
298 fTOFindex(track.fTOFindex),
299 fHMPIDqn(track.fHMPIDqn),
300 fHMPIDcluIdx(track.fHMPIDcluIdx),
301 fCaloIndex(track.fCaloIndex),
302 fHMPIDtrkTheta(track.fHMPIDtrkTheta),
303 fHMPIDtrkPhi(track.fHMPIDtrkPhi),
304 fHMPIDsignal(track.fHMPIDsignal),
305 fTrackLength(track.fTrackLength),
306 fdTPC(track.fdTPC),fzTPC(track.fzTPC),
307 fCddTPC(track.fCddTPC),fCdzTPC(track.fCdzTPC),fCzzTPC(track.fCzzTPC),
308 fCchi2TPC(track.fCchi2TPC),
309 fD(track.fD),fZ(track.fZ),
310 fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
311 fCchi2(track.fCchi2),
312 fITSchi2(track.fITSchi2),
313 fTPCchi2(track.fTPCchi2),
314 fTPCchi2Iter1(track.fTPCchi2Iter1),
315 fTRDchi2(track.fTRDchi2),
316 fTOFchi2(track.fTOFchi2),
317 fHMPIDchi2(track.fHMPIDchi2),
318 fGlobalChi2(track.fGlobalChi2),
319 fITSsignal(track.fITSsignal),
320 fTPCsignal(track.fTPCsignal),
321 fTPCsignalTuned(track.fTPCsignalTuned),
322 fTPCsignalS(track.fTPCsignalS),
324 fTRDsignal(track.fTRDsignal),
325 fTRDQuality(track.fTRDQuality),
326 fTRDBudget(track.fTRDBudget),
327 fTOFsignal(track.fTOFsignal),
328 fTOFsignalTuned(track.fTOFsignalTuned),
329 fTOFsignalToT(track.fTOFsignalToT),
330 fTOFsignalRaw(track.fTOFsignalRaw),
331 fTOFsignalDz(track.fTOFsignalDz),
332 fTOFsignalDx(track.fTOFsignalDx),
333 fTOFdeltaBC(track.fTOFdeltaBC),
334 fTOFl0l1(track.fTOFl0l1),
335 fCaloDx(track.fCaloDx),
336 fCaloDz(track.fCaloDz),
337 fHMPIDtrkX(track.fHMPIDtrkX),
338 fHMPIDtrkY(track.fHMPIDtrkY),
339 fHMPIDmipX(track.fHMPIDmipX),
340 fHMPIDmipY(track.fHMPIDmipY),
341 fTPCncls(track.fTPCncls),
342 fTPCnclsF(track.fTPCnclsF),
343 fTPCsignalN(track.fTPCsignalN),
344 fTPCnclsIter1(track.fTPCnclsIter1),
345 fTPCnclsFIter1(track.fTPCnclsIter1),
346 fITSncls(track.fITSncls),
347 fITSClusterMap(track.fITSClusterMap),
348 fITSSharedMap(track.fITSSharedMap),
349 fTRDncls(track.fTRDncls),
350 fTRDncls0(track.fTRDncls0),
351 fTRDntracklets(track.fTRDntracklets),
352 fTRDNchamberdEdx(track.fTRDNchamberdEdx),
353 fTRDNclusterdEdx(track.fTRDNclusterdEdx),
354 fTRDnSlices(track.fTRDnSlices),
356 fVertexID(track.fVertexID),
357 fESDEvent(track.fESDEvent),
358 fCacheNCrossedRows(track.fCacheNCrossedRows),
359 fCacheChi2TPCConstrainedVsGlobal(track.fCacheChi2TPCConstrainedVsGlobal),
360 fCacheChi2TPCConstrainedVsGlobalVertex(track.fCacheChi2TPCConstrainedVsGlobalVertex),
362 fTrackPhiOnEMCal(track.fTrackPhiOnEMCal),
363 fTrackEtaOnEMCal(track.fTrackEtaOnEMCal)
368 for (Int_t i=kNITSchi2Std;i--;) fITSchi2Std[i] = track.fITSchi2Std[i];
369 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i]=track.fTrackTime[i];
370 for (Int_t i=0;i<AliPID::kSPECIES;i++) fR[i]=track.fR[i];
372 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=track.fITSr[i];
374 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=track.fTPCr[i];
375 for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=track.fITSdEdxSamples[i];}
376 for (Int_t i=0;i<4;i++) {fTPCPoints[i]=track.fTPCPoints[i];}
377 for (Int_t i=0; i<3;i++) { fKinkIndexes[i]=track.fKinkIndexes[i];}
378 for (Int_t i=0; i<3;i++) { fV0Indexes[i]=track.fV0Indexes[i];}
380 for (Int_t i=0;i<kTRDnPlanes;i++) {
381 fTRDTimBin[i]=track.fTRDTimBin[i];
385 fTRDslices=new Double32_t[fTRDnSlices];
386 for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=track.fTRDslices[i];
389 if (track.fDetectorPID) fDetectorPID = new AliDetectorPID(*track.fDetectorPID);
391 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i]=track.fTRDr[i];
392 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i]=track.fTOFr[i];
393 for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
394 for (Int_t i=0;i<10;i++) fTOFInfo[i]=track.fTOFInfo[i];
395 for (Int_t i=0;i<12;i++) fITSModule[i]=track.fITSModule[i];
396 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i]=track.fHMPIDr[i];
398 if (track.fCp) fCp=new AliExternalTrackParam(*track.fCp);
399 if (track.fIp) fIp=new AliExternalTrackParam(*track.fIp);
400 if (track.fTPCInner) fTPCInner=new AliExternalTrackParam(*track.fTPCInner);
401 if (track.fOp) fOp=new AliExternalTrackParam(*track.fOp);
402 if (track.fHMPIDp) fHMPIDp=new AliExternalTrackParam(*track.fHMPIDp);
403 if (track.fTPCdEdxInfo) fTPCdEdxInfo = new AliTPCdEdxInfo(*track.fTPCdEdxInfo);
406 if (track.fFriendTrack) fFriendTrack=new AliESDfriendTrack(*(track.fFriendTrack));
409 //_______________________________________________________________________
410 AliESDtrack::AliESDtrack(const AliVTrack *track) :
411 AliExternalTrackParam(track),
418 fTPCFitMap(159),//number of padrows
419 fTPCClusterMap(159),//number of padrows
420 fTPCSharedMap(159),//number of padrows
431 fCaloIndex(kEMCALNoMatch),
437 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
440 fCdd(0),fCdz(0),fCzz(0),
458 fTOFsignalTuned(99999),
459 fTOFsignalToT(99999),
460 fTOFsignalRaw(99999),
486 fVertexID(-2), // -2 means an orphan track
488 fCacheNCrossedRows(-10),
489 fCacheChi2TPCConstrainedVsGlobal(-10),
490 fCacheChi2TPCConstrainedVsGlobalVertex(0),
492 fTrackPhiOnEMCal(-999),
493 fTrackEtaOnEMCal(-999)
496 // ESD track from AliVTrack.
497 // This is not a copy constructor !
500 if (track->InheritsFrom("AliExternalTrackParam")) {
501 AliError("This is not a copy constructor. Use AliESDtrack(const AliESDtrack &) !");
502 AliWarning("Calling the default constructor...");
507 // Reset all the arrays
509 for (i=kNITSchi2Std;i--;) fITSchi2Std[i] = 0;
510 for (i=0; i<AliPID::kSPECIES; i++) {
520 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
521 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
522 for (i=0;i<kTRDnPlanes;i++) {
525 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
526 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
527 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
528 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
529 for (i=0;i<12;i++) {fITSModule[i]=-1;}
532 SetID(track->GetID());
534 // Set ITS cluster map
535 fITSClusterMap=track->GetITSClusterMap();
540 if(HasPointOnITSLayer(i)) fITSncls++;
544 fTPCncls=track->GetTPCNcls();
545 fTPCnclsF=track->GetTPCNclsF();
547 const TBits* bmap = track->GetTPCClusterMapPtr();
548 if (bmap) SetTPCClusterMap(*bmap);
549 bmap = GetTPCFitMapPtr();
550 if (bmap) SetTPCFitMap(*bmap);
551 bmap = GetTPCSharedMapPtr();
552 if (bmap) SetTPCSharedMap(*bmap);
554 // Set the combined PID
555 const Double_t *pid = track->PID();
556 if(pid) for (i=0; i<AliPID::kSPECIES; i++) fR[i]=pid[i];
558 // calo matched cluster id
559 SetEMCALcluster(track->GetEMCALcluster());
560 // AliESD track label
563 fITSsignal = track->GetITSsignal();
565 track->GetITSdEdxSamples(itsdEdx);
566 SetITSdEdxSamples(itsdEdx);
568 SetTPCsignal(track->GetTPCsignal(),fTPCsignalS,track->GetTPCsignalN()); // No signalS in AODPi
569 AliTPCdEdxInfo * dEdxInfo = track->GetTPCdEdxInfo();
570 if (dEdxInfo) SetTPCdEdxInfo(new AliTPCdEdxInfo(*dEdxInfo));
572 SetTRDsignal(track->GetTRDsignal());
573 int ntrdsl = track->GetNumberOfTRDslices();
575 SetNumberOfTRDslices((ntrdsl+2)*kTRDnPlanes);
576 for (int ipl=kTRDnPlanes;ipl--;){
577 for (int isl=ntrdsl;isl--;) SetTRDslice(track->GetTRDslice(ipl,isl),ipl,isl);
578 Double_t sp, p = track->GetTRDmomentum(ipl, &sp);
579 SetTRDmomentum(p, ipl, &sp);
583 fTRDncls = track->GetTRDncls();
584 fTRDntracklets &= 0xff & track->GetTRDntrackletsPID();
585 fTRDchi2 = track->GetTRDchi2();
587 SetTOFsignal(track->GetTOFsignal());
588 Double_t expt[AliPID::kSPECIES];
589 track->GetIntegratedTimes(expt);
590 SetIntegratedTimes(expt);
592 SetTrackPhiEtaOnEMCal(track->GetTrackPhiOnEMCal(),track->GetTrackEtaOnEMCal());
594 SetLabel(track->GetLabel());
596 SetStatus(track->GetStatus());
599 //_______________________________________________________________________
600 AliESDtrack::AliESDtrack(TParticle * part) :
601 AliExternalTrackParam(),
608 fTPCFitMap(159),//number of padrows
609 fTPCClusterMap(159),//number of padrows
610 fTPCSharedMap(159),//number of padrows
621 fCaloIndex(kEMCALNoMatch),
627 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
630 fCdd(0),fCdz(0),fCzz(0),
648 fTOFsignalTuned(99999),
649 fTOFsignalToT(99999),
650 fTOFsignalRaw(99999),
676 fVertexID(-2), // -2 means an orphan track
678 fCacheNCrossedRows(-10),
679 fCacheChi2TPCConstrainedVsGlobal(-10),
680 fCacheChi2TPCConstrainedVsGlobalVertex(0),
682 fTrackPhiOnEMCal(-999),
683 fTrackEtaOnEMCal(-999)
686 // ESD track from TParticle
689 // Reset all the arrays
691 for (i=kNITSchi2Std;i--;) fITSchi2Std[i] = 0;
692 for (i=0; i<AliPID::kSPECIES; i++) {
702 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
703 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
704 for (i=0;i<kTRDnPlanes;i++) {
707 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
708 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
709 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
710 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
711 for (i=0;i<12;i++) {fITSModule[i]=-1;}
713 // Calculate the AliExternalTrackParam content
720 // Calculate alpha: the rotation angle of the corresponding local system (TPC sector)
721 alpha = part->Phi()*180./TMath::Pi();
722 if (alpha<0) alpha+= 360.;
723 if (alpha>360) alpha -= 360.;
725 Int_t sector = (Int_t)(alpha/20.);
726 alpha = 10. + 20.*sector;
728 alpha *= TMath::Pi();
730 // Covariance matrix: no errors, the parameters are exact
731 for (i=0; i<15; i++) covar[i]=0.;
733 // Get the vertex of origin and the momentum
734 TVector3 ver(part->Vx(),part->Vy(),part->Vz());
735 TVector3 mom(part->Px(),part->Py(),part->Pz());
737 // Rotate to the local coordinate system (TPC sector)
741 // X of the referense plane
744 Int_t pdgCode = part->GetPdgCode();
747 TDatabasePDG::Instance()->GetParticle(pdgCode)->Charge();
751 param[2] = TMath::Sin(mom.Phi());
752 param[3] = mom.Pz()/mom.Pt();
753 param[4] = TMath::Sign(1/mom.Pt(),charge);
755 // Set AliExternalTrackParam
756 Set(xref, alpha, param, covar);
761 switch (TMath::Abs(pdgCode)) {
787 // If the particle is not e,mu,pi,K or p the PID probabilities are set to 0
788 if (indexPID < AliPID::kSPECIES) {
794 fHMPIDr[indexPID]=1.;
797 // AliESD track label
798 SetLabel(part->GetUniqueID());
802 //_______________________________________________________________________
803 AliESDtrack::~AliESDtrack(){
805 // This is destructor according Coding Conventrions
807 //printf("Delete track\n");
818 //Reset cached values - needed for TClonesArray in AliESDInputHandler
819 fCacheNCrossedRows = -10.;
820 fCacheChi2TPCConstrainedVsGlobal = -10.;
821 if(fCacheChi2TPCConstrainedVsGlobalVertex) fCacheChi2TPCConstrainedVsGlobalVertex = 0;
826 AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
829 if(&source == this) return *this;
830 AliExternalTrackParam::operator=(source);
834 // we have the trackparam: assign or copy construct
835 if(fCp)*fCp = *source.fCp;
836 else fCp = new AliExternalTrackParam(*source.fCp);
839 // no track param delete the old one
845 // we have the trackparam: assign or copy construct
846 if(fIp)*fIp = *source.fIp;
847 else fIp = new AliExternalTrackParam(*source.fIp);
850 // no track param delete the old one
856 if(source.fTPCInner){
857 // we have the trackparam: assign or copy construct
858 if(fTPCInner) *fTPCInner = *source.fTPCInner;
859 else fTPCInner = new AliExternalTrackParam(*source.fTPCInner);
862 // no track param delete the old one
867 if(source.fTPCdEdxInfo) {
868 if(fTPCdEdxInfo) *fTPCdEdxInfo = *source.fTPCdEdxInfo;
869 fTPCdEdxInfo = new AliTPCdEdxInfo(*source.fTPCdEdxInfo);
873 // we have the trackparam: assign or copy construct
874 if(fOp) *fOp = *source.fOp;
875 else fOp = new AliExternalTrackParam(*source.fOp);
878 // no track param delete the old one
885 // we have the trackparam: assign or copy construct
886 if(fHMPIDp) *fHMPIDp = *source.fHMPIDp;
887 else fHMPIDp = new AliExternalTrackParam(*source.fHMPIDp);
890 // no track param delete the old one
895 // copy also the friend track
896 // use copy constructor
897 if(source.fFriendTrack){
898 // we have the trackparam: assign or copy construct
899 delete fFriendTrack; fFriendTrack=new AliESDfriendTrack(*source.fFriendTrack);
902 // no track param delete the old one
903 delete fFriendTrack; fFriendTrack= 0;
906 fTPCFitMap = source.fTPCFitMap;
907 fTPCClusterMap = source.fTPCClusterMap;
908 fTPCSharedMap = source.fTPCSharedMap;
910 fFlags = source.fFlags;
912 fLabel = source.fLabel;
913 fITSLabel = source.fITSLabel;
914 for(int i = 0; i< 12;++i){
915 fITSModule[i] = source.fITSModule[i];
917 fTPCLabel = source.fTPCLabel;
918 fTRDLabel = source.fTRDLabel;
919 for(int i = 0; i< 3;++i){
920 fTOFLabel[i] = source.fTOFLabel[i];
922 fTOFCalChannel = source.fTOFCalChannel;
923 fTOFindex = source.fTOFindex;
924 fHMPIDqn = source.fHMPIDqn;
925 fHMPIDcluIdx = source.fHMPIDcluIdx;
926 fCaloIndex = source.fCaloIndex;
927 for (int i=kNITSchi2Std;i--;) fITSchi2Std[i] = source.fITSchi2Std[i];
928 for(int i = 0; i< 3;++i){
929 fKinkIndexes[i] = source.fKinkIndexes[i];
930 fV0Indexes[i] = source.fV0Indexes[i];
933 for(int i = 0; i< AliPID::kSPECIES;++i){
934 fR[i] = source.fR[i];
935 fITSr[i] = source.fITSr[i];
936 fTPCr[i] = source.fTPCr[i];
937 fTRDr[i] = source.fTRDr[i];
938 fTOFr[i] = source.fTOFr[i];
939 fHMPIDr[i] = source.fHMPIDr[i];
940 fTrackTime[i] = source.fTrackTime[i];
943 fHMPIDtrkTheta = source.fHMPIDtrkTheta;
944 fHMPIDtrkPhi = source.fHMPIDtrkPhi;
945 fHMPIDsignal = source.fHMPIDsignal;
948 fTrackLength = source. fTrackLength;
949 fdTPC = source.fdTPC;
950 fzTPC = source.fzTPC;
951 fCddTPC = source.fCddTPC;
952 fCdzTPC = source.fCdzTPC;
953 fCzzTPC = source.fCzzTPC;
954 fCchi2TPC = source.fCchi2TPC;
961 fCchi2 = source.fCchi2;
963 fITSchi2 = source.fITSchi2;
964 fTPCchi2 = source.fTPCchi2;
965 fTPCchi2Iter1 = source.fTPCchi2Iter1;
966 fTRDchi2 = source.fTRDchi2;
967 fTOFchi2 = source.fTOFchi2;
968 fHMPIDchi2 = source.fHMPIDchi2;
970 fGlobalChi2 = source.fGlobalChi2;
972 fITSsignal = source.fITSsignal;
973 for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=source.fITSdEdxSamples[i];}
974 fTPCsignal = source.fTPCsignal;
975 fTPCsignalTuned = source.fTPCsignalTuned;
976 fTPCsignalS = source.fTPCsignalS;
977 for(int i = 0; i< 4;++i){
978 fTPCPoints[i] = source.fTPCPoints[i];
980 fTRDsignal = source.fTRDsignal;
981 fTRDNchamberdEdx = source.fTRDNchamberdEdx;
982 fTRDNclusterdEdx = source.fTRDNclusterdEdx;
984 for(int i = 0;i < kTRDnPlanes;++i){
985 fTRDTimBin[i] = source.fTRDTimBin[i];
991 fTRDnSlices=source.fTRDnSlices;
993 fTRDslices=new Double32_t[fTRDnSlices];
994 for(int j = 0;j < fTRDnSlices;++j) fTRDslices[j] = source.fTRDslices[j];
997 fTRDQuality = source.fTRDQuality;
998 fTRDBudget = source.fTRDBudget;
999 fTOFsignal = source.fTOFsignal;
1000 fTOFsignalTuned = source.fTOFsignalTuned;
1001 fTOFsignalToT = source.fTOFsignalToT;
1002 fTOFsignalRaw = source.fTOFsignalRaw;
1003 fTOFsignalDz = source.fTOFsignalDz;
1004 fTOFsignalDx = source.fTOFsignalDx;
1005 fTOFdeltaBC = source.fTOFdeltaBC;
1006 fTOFl0l1 = source.fTOFl0l1;
1008 for(int i = 0;i<10;++i){
1009 fTOFInfo[i] = source.fTOFInfo[i];
1012 fHMPIDtrkX = source.fHMPIDtrkX;
1013 fHMPIDtrkY = source.fHMPIDtrkY;
1014 fHMPIDmipX = source.fHMPIDmipX;
1015 fHMPIDmipY = source.fHMPIDmipY;
1017 fTPCncls = source.fTPCncls;
1018 fTPCnclsF = source.fTPCnclsF;
1019 fTPCsignalN = source.fTPCsignalN;
1020 fTPCnclsIter1 = source.fTPCnclsIter1;
1021 fTPCnclsFIter1 = source.fTPCnclsFIter1;
1023 fITSncls = source.fITSncls;
1024 fITSClusterMap = source.fITSClusterMap;
1025 fITSSharedMap = source.fITSSharedMap;
1026 fTRDncls = source.fTRDncls;
1027 fTRDncls0 = source.fTRDncls0;
1028 fTRDntracklets = source.fTRDntracklets;
1029 fVertexID = source.fVertexID;
1031 fCacheNCrossedRows = source.fCacheNCrossedRows;
1032 fCacheChi2TPCConstrainedVsGlobal = source.fCacheChi2TPCConstrainedVsGlobal;
1033 fCacheChi2TPCConstrainedVsGlobalVertex = source.fCacheChi2TPCConstrainedVsGlobalVertex;
1035 delete fDetectorPID;
1037 if (source.fDetectorPID) fDetectorPID = new AliDetectorPID(*source.fDetectorPID);
1039 fTrackPhiOnEMCal= source.fTrackPhiOnEMCal;
1040 fTrackEtaOnEMCal= source.fTrackEtaOnEMCal;
1047 void AliESDtrack::Copy(TObject &obj) const {
1049 // this overwrites the virtual TOBject::Copy()
1050 // to allow run time copying without casting
1053 if(this==&obj)return;
1054 AliESDtrack *robj = dynamic_cast<AliESDtrack*>(&obj);
1055 if(!robj)return; // not an AliESDtrack
1062 void AliESDtrack::AddCalibObject(TObject * object){
1064 // add calib object to the list
1066 if (!fFriendTrack) fFriendTrack = new AliESDfriendTrack;
1067 if (!fFriendTrack) return;
1068 fFriendTrack->AddCalibObject(object);
1071 TObject * AliESDtrack::GetCalibObject(Int_t index){
1073 // return calib objct at given position
1075 if (!fFriendTrack) return 0;
1076 return fFriendTrack->GetCalibObject(index);
1080 Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
1082 // Fills the information of the TPC-only first reconstruction pass
1083 // into the passed ESDtrack object. For consistency fTPCInner is also filled
1088 // For data produced before r26675
1089 // RelateToVertexTPC was not properly called during reco
1090 // so you'll have to call it again, before FillTPCOnlyTrack
1091 // Float_t p[2],cov[3];
1092 // track->GetImpactParametersTPC(p,cov);
1093 // if(p[0]==0&&p[1]==0) // <- Default values
1094 // track->RelateToVertexTPC(esd->GetPrimaryVertexTPC(),esd->GetMagneticField(),kVeryBig);
1097 if(!fTPCInner)return kFALSE;
1099 // fill the TPC track params to the global track parameters
1100 track.Set(fTPCInner->GetX(),fTPCInner->GetAlpha(),fTPCInner->GetParameter(),fTPCInner->GetCovariance());
1103 track.fCdd = fCddTPC;
1104 track.fCdz = fCdzTPC;
1105 track.fCzz = fCzzTPC;
1107 // copy the inner params
1108 if(track.fIp) *track.fIp = *fIp;
1109 else track.fIp = new AliExternalTrackParam(*fIp);
1111 // copy the TPCinner parameters
1112 if(track.fTPCInner) *track.fTPCInner = *fTPCInner;
1113 else track.fTPCInner = new AliExternalTrackParam(*fTPCInner);
1114 track.fdTPC = fdTPC;
1115 track.fzTPC = fzTPC;
1116 track.fCddTPC = fCddTPC;
1117 track.fCdzTPC = fCdzTPC;
1118 track.fCzzTPC = fCzzTPC;
1119 track.fCchi2TPC = fCchi2TPC;
1121 // copy all other TPC specific parameters
1123 // replace label by TPC label
1124 track.fLabel = fTPCLabel;
1125 track.fTPCLabel = fTPCLabel;
1127 track.fTPCchi2 = fTPCchi2;
1128 track.fTPCchi2Iter1 = fTPCchi2Iter1;
1129 track.fTPCsignal = fTPCsignal;
1130 track.fTPCsignalTuned = fTPCsignalTuned;
1131 track.fTPCsignalS = fTPCsignalS;
1132 for(int i = 0;i<4;++i)track.fTPCPoints[i] = fTPCPoints[i];
1134 track.fTPCncls = fTPCncls;
1135 track.fTPCnclsF = fTPCnclsF;
1136 track.fTPCsignalN = fTPCsignalN;
1137 track.fTPCnclsIter1 = fTPCnclsIter1;
1138 track.fTPCnclsFIter1 = fTPCnclsFIter1;
1141 for(int i=0;i<AliPID::kSPECIES;++i){
1142 track.fTPCr[i] = fTPCr[i];
1143 // combined PID is TPC only!
1144 track.fR[i] = fTPCr[i];
1146 track.fTPCFitMap = fTPCFitMap;
1147 track.fTPCClusterMap = fTPCClusterMap;
1148 track.fTPCSharedMap = fTPCSharedMap;
1152 track.fFlags = kTPCin;
1155 track.fFlags |= fFlags & kTPCpid; //copy the TPCpid status flag
1157 for (Int_t i=0;i<3;i++) track.fKinkIndexes[i] = fKinkIndexes[i];
1163 //_______________________________________________________________________
1164 void AliESDtrack::MakeMiniESDtrack(){
1165 // Resets everything except
1166 // fFlags: Reconstruction status flags
1167 // fLabel: Track label
1168 // fID: Unique ID of the track
1169 // Impact parameter information
1170 // fR[AliPID::kSPECIES]: combined "detector response probability"
1171 // Running track parameters in the base class (AliExternalTrackParam)
1175 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] = 0;
1177 // Reset track parameters constrained to the primary vertex
1180 // Reset track parameters at the inner wall of TPC
1182 delete fTPCInner;fTPCInner=0;
1183 // Reset track parameters at the inner wall of the TRD
1185 // Reset track parameters at the HMPID
1186 delete fHMPIDp;fHMPIDp = 0;
1189 // Reset ITS track related information
1195 for (Int_t i=0;i<4;i++) fITSdEdxSamples[i] = 0.;
1196 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=0;
1199 // Reset TPC related track information
1213 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0;
1215 for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
1216 for (Int_t i=0; i<3;i++) fKinkIndexes[i] = 0;
1217 for (Int_t i=0; i<3;i++) fV0Indexes[i] = 0;
1219 // Reset TRD related track information
1224 fTRDNchamberdEdx = 0;
1225 fTRDNclusterdEdx = 0;
1227 for (Int_t i=0;i<kTRDnPlanes;i++) {
1230 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0;
1235 delete[] fTRDslices;
1240 // Reset TOF related track information
1244 fTOFCalChannel = -1;
1245 fTOFsignalToT = 99999;
1246 fTOFsignalRaw = 99999;
1251 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
1252 for (Int_t i=0;i<3;i++) fTOFLabel[i] = -1;
1253 for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
1255 // Reset HMPID related track information
1260 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i] = 0;
1267 fCaloIndex = kEMCALNoMatch;
1269 // reset global track chi2
1272 fVertexID = -2; // an orphan track
1274 delete fFriendTrack; fFriendTrack = 0;
1277 //_______________________________________________________________________
1278 Int_t AliESDtrack::GetPID(Bool_t tpcOnly) const
1280 // Returns the particle most probable id
1282 const Double32_t *prob = 0;
1283 if (tpcOnly) { // check if TPCpid is valid
1285 for (i=0; i<AliPID::kSPECIES-1; i++) if (prob[i] != prob[i+1]) break;
1286 if (i == AliPID::kSPECIES-1) prob = 0; // not valid, try with combined pid
1288 if (!prob) { // either requested TPCpid is not valid or comb.pid is requested
1290 for (i=0; i<AliPID::kSPECIES-1; i++) if (prob[i] != prob[i+1]) break;
1291 if (i == AliPID::kSPECIES-1) return AliPID::kPion; // If all the probabilities are equal, return the pion mass
1296 for (i=0; i<AliPID::kSPECIES; i++) if (prob[i]>max) {k=i; max=prob[i];}
1298 if (k==0) { // dE/dx "crossing points" in the TPC
1300 if ((p>0.38)&&(p<0.48))
1301 if (prob[0]<prob[3]*10.) return AliPID::kKaon;
1302 if ((p>0.75)&&(p<0.85))
1303 if (prob[0]<prob[4]*10.) return AliPID::kProton;
1304 return AliPID::kElectron;
1306 if (k==1) return AliPID::kMuon;
1307 if (k==2||k==-1) return AliPID::kPion;
1308 if (k==3) return AliPID::kKaon;
1309 if (k==4) return AliPID::kProton;
1310 AliWarning("Undefined PID !");
1311 return AliPID::kPion;
1314 //_______________________________________________________________________
1315 Int_t AliESDtrack::GetTOFBunchCrossing(Double_t b, Bool_t pidTPConly) const
1317 // Returns the number of bunch crossings after trigger (assuming 25ns spacing)
1318 const double kSpacing = 25e3; // min interbanch spacing
1319 const double kShift = 0;
1320 Int_t bcid = kTOFBCNA; // defualt one
1321 if (!IsOn(kTOFout) || !IsOn(kESDpid)) return bcid; // no info
1323 double tdif = fTOFsignal;
1324 if (IsOn(kTIME)) { // integrated time info is there
1325 int pid = GetPID(pidTPConly);
1326 tdif -= fTrackTime[pid];
1328 else { // assume integrated time info from TOF radius and momentum
1329 const double kRTOF = 385.;
1330 const double kCSpeed = 3.e-2; // cm/ps
1332 if (p<0.01) return bcid;
1333 double m = GetMass(pidTPConly);
1334 double curv = GetC(b);
1335 double path = TMath::Abs(curv)>kAlmost0 ? // account for curvature
1336 2./curv*TMath::ASin(kRTOF*curv/2.)*TMath::Sqrt(1.+GetTgl()*GetTgl()) : kRTOF;
1337 tdif -= path/kCSpeed*TMath::Sqrt(1.+m*m/(p*p));
1339 bcid = TMath::Nint((tdif - kShift)/kSpacing);
1343 //______________________________________________________________________________
1344 Double_t AliESDtrack::M() const
1346 // Returns the assumed mass
1347 // (the pion mass, if the particle can't be identified properly).
1348 static Bool_t printerr=kTRUE;
1350 AliWarning("WARNING !!! ... THIS WILL BE PRINTED JUST ONCE !!!");
1352 AliWarning("This is the ESD mass. Use it with care !");
1357 //______________________________________________________________________________
1358 Double_t AliESDtrack::E() const
1360 // Returns the energy of the particle given its assumed mass.
1361 // Assumes the pion mass if the particle can't be identified properly.
1365 return TMath::Sqrt(p*p + m*m);
1368 //______________________________________________________________________________
1369 Double_t AliESDtrack::Y() const
1371 // Returns the rapidity of a particle given its assumed mass.
1372 // Assumes the pion mass if the particle can't be identified properly.
1376 if (e != TMath::Abs(pz)) { // energy was not equal to pz
1377 return 0.5*TMath::Log((e+pz)/(e-pz));
1378 } else { // energy was equal to pz
1383 //_______________________________________________________________________
1384 Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
1386 // This function updates track's running parameters
1391 fLabel=t->GetLabel();
1393 if (t->IsStartedTimeIntegral()) {
1395 Double_t times[10];t->GetIntegratedTimes(times); SetIntegratedTimes(times);
1396 SetIntegratedLength(t->GetIntegratedLength());
1399 Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1401 if (flags==kITSout) fFriendTrack->SetITSOut(*t);
1402 if (flags==kTPCout) fFriendTrack->SetTPCOut(*t);
1403 if (flags==kTRDrefit) fFriendTrack->SetTRDIn(*t);
1409 fITSchi2Std[0] = t->GetChi2();
1412 fITSchi2Std[1] = t->GetChi2();
1415 fITSchi2Std[2] = t->GetChi2();
1417 fITSncls=t->GetNumberOfClusters();
1419 Int_t* indexITS = new Int_t[AliESDfriendTrack::kMaxITScluster];
1420 for (Int_t i=0;i<AliESDfriendTrack::kMaxITScluster;i++) {
1421 indexITS[i]=t->GetClusterIndex(i);
1424 Int_t l=(indexITS[i] & 0xf0000000) >> 28;
1425 SETBIT(fITSClusterMap,l);
1428 fFriendTrack->SetITSIndices(indexITS,AliESDfriendTrack::kMaxITScluster);
1432 fITSchi2=t->GetChi2();
1433 fITSsignal=t->GetPIDsignal();
1434 fITSLabel = t->GetLabel();
1435 // keep in fOp the parameters outside ITS for ITS stand-alone tracks
1436 if (flags==kITSout) {
1437 if (!fOp) fOp=new AliExternalTrackParam(*t);
1439 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1444 case kTPCin: case kTPCrefit:
1446 fTPCLabel = t->GetLabel();
1447 if (flags==kTPCin) {
1448 fTPCInner=new AliExternalTrackParam(*t);
1449 fTPCnclsIter1=t->GetNumberOfClusters();
1450 fTPCchi2Iter1=t->GetChi2();
1452 if (!fIp) fIp=new AliExternalTrackParam(*t);
1454 fIp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1456 // Intentionally no break statement; need to set general TPC variables as well
1459 if (flags & kTPCout){
1460 if (!fOp) fOp=new AliExternalTrackParam(*t);
1462 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1464 fTPCncls=t->GetNumberOfClusters();
1465 fTPCchi2=t->GetChi2();
1467 if (fFriendTrack) { // Copy cluster indices
1468 Int_t* indexTPC = new Int_t[AliESDfriendTrack::kMaxTPCcluster];
1469 for (Int_t i=0;i<AliESDfriendTrack::kMaxTPCcluster;i++)
1470 indexTPC[i]=t->GetClusterIndex(i);
1471 fFriendTrack->SetTPCIndices(indexTPC,AliESDfriendTrack::kMaxTPCcluster);
1474 fTPCsignal=t->GetPIDsignal();
1478 case kTRDin: case kTRDrefit:
1482 fTRDLabel = t->GetLabel();
1483 fTRDchi2 = t->GetChi2();
1484 fTRDncls = t->GetNumberOfClusters();
1486 Int_t* indexTRD = new Int_t[AliESDfriendTrack::kMaxTRDcluster];
1487 for (Int_t i=0;i<AliESDfriendTrack::kMaxTRDcluster;i++) indexTRD[i]=-2;
1488 for (Int_t i=0;i<6;i++) indexTRD[i]=t->GetTrackletIndex(i);
1489 fFriendTrack->SetTRDIndices(indexTRD,AliESDfriendTrack::kMaxTRDcluster);
1493 //commented out by Xianguo
1494 //fTRDsignal=t->GetPIDsignal();
1498 if (!fOp) fOp=new AliExternalTrackParam(*t);
1500 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1501 fTRDncls0 = t->GetNumberOfClusters();
1510 if (!fHMPIDp) fHMPIDp=new AliExternalTrackParam(*t);
1512 fHMPIDp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1515 AliError("Wrong flag !");
1522 //_______________________________________________________________________
1523 void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
1524 //---------------------------------------------------------------------
1525 // This function returns external representation of the track parameters
1526 //---------------------------------------------------------------------
1528 for (Int_t i=0; i<5; i++) p[i]=GetParameter()[i];
1531 //_______________________________________________________________________
1532 void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
1533 //---------------------------------------------------------------------
1534 // This function returns external representation of the cov. matrix
1535 //---------------------------------------------------------------------
1536 for (Int_t i=0; i<15; i++) cov[i]=AliExternalTrackParam::GetCovariance()[i];
1539 //_______________________________________________________________________
1540 Bool_t AliESDtrack::GetConstrainedExternalParameters
1541 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1542 //---------------------------------------------------------------------
1543 // This function returns the constrained external track parameters
1544 //---------------------------------------------------------------------
1545 if (!fCp) return kFALSE;
1546 alpha=fCp->GetAlpha();
1548 for (Int_t i=0; i<5; i++) p[i]=fCp->GetParameter()[i];
1552 //_______________________________________________________________________
1554 AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
1555 //---------------------------------------------------------------------
1556 // This function returns the constrained external cov. matrix
1557 //---------------------------------------------------------------------
1558 if (!fCp) return kFALSE;
1559 for (Int_t i=0; i<15; i++) c[i]=fCp->GetCovariance()[i];
1564 AliESDtrack::GetInnerExternalParameters
1565 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1566 //---------------------------------------------------------------------
1567 // This function returns external representation of the track parameters
1568 // at the inner layer of TPC
1569 //---------------------------------------------------------------------
1570 if (!fIp) return kFALSE;
1571 alpha=fIp->GetAlpha();
1573 for (Int_t i=0; i<5; i++) p[i]=fIp->GetParameter()[i];
1578 AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
1579 //---------------------------------------------------------------------
1580 // This function returns external representation of the cov. matrix
1581 // at the inner layer of TPC
1582 //---------------------------------------------------------------------
1583 if (!fIp) return kFALSE;
1584 for (Int_t i=0; i<15; i++) cov[i]=fIp->GetCovariance()[i];
1589 AliESDtrack::SetOuterParam(const AliExternalTrackParam *p, ULong_t flags) {
1591 // This is a direct setter for the outer track parameters
1594 if (fOp) delete fOp;
1595 fOp=new AliExternalTrackParam(*p);
1599 AliESDtrack::SetOuterHmpParam(const AliExternalTrackParam *p, ULong_t flags) {
1601 // This is a direct setter for the outer track parameters
1604 if (fHMPIDp) delete fHMPIDp;
1605 fHMPIDp=new AliExternalTrackParam(*p);
1609 AliESDtrack::GetOuterExternalParameters
1610 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1611 //---------------------------------------------------------------------
1612 // This function returns external representation of the track parameters
1613 // at the inner layer of TRD
1614 //---------------------------------------------------------------------
1615 if (!fOp) return kFALSE;
1616 alpha=fOp->GetAlpha();
1618 for (Int_t i=0; i<5; i++) p[i]=fOp->GetParameter()[i];
1623 AliESDtrack::GetOuterHmpExternalParameters
1624 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1625 //---------------------------------------------------------------------
1626 // This function returns external representation of the track parameters
1627 // at the inner layer of TRD
1628 //---------------------------------------------------------------------
1629 if (!fHMPIDp) return kFALSE;
1630 alpha=fHMPIDp->GetAlpha();
1632 for (Int_t i=0; i<5; i++) p[i]=fHMPIDp->GetParameter()[i];
1637 AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
1638 //---------------------------------------------------------------------
1639 // This function returns external representation of the cov. matrix
1640 // at the inner layer of TRD
1641 //---------------------------------------------------------------------
1642 if (!fOp) return kFALSE;
1643 for (Int_t i=0; i<15; i++) cov[i]=fOp->GetCovariance()[i];
1648 AliESDtrack::GetOuterHmpExternalCovariance(Double_t cov[15]) const {
1649 //---------------------------------------------------------------------
1650 // This function returns external representation of the cov. matrix
1651 // at the inner layer of TRD
1652 //---------------------------------------------------------------------
1653 if (!fHMPIDp) return kFALSE;
1654 for (Int_t i=0; i<15; i++) cov[i]=fHMPIDp->GetCovariance()[i];
1658 Int_t AliESDtrack::GetNcls(Int_t idet) const
1660 // Get number of clusters by subdetector index
1674 if (fTOFindex != -1)
1680 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1681 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1692 Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
1694 // Get cluster index array by subdetector index
1699 ncls = GetITSclusters(idx);
1702 ncls = GetTPCclusters(idx);
1705 ncls = GetTRDclusters(idx);
1708 if (fTOFindex != -1) {
1716 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1717 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1718 idx[0] = GetHMPIDcluIdx();
1731 //_______________________________________________________________________
1732 void AliESDtrack::GetIntegratedTimes(Double_t *times) const {
1733 // Returns the array with integrated times for each particle hypothesis
1734 for (Int_t i=0; i<AliPID::kSPECIES; i++) times[i]=fTrackTime[i];
1737 //_______________________________________________________________________
1738 void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
1739 // Sets the array with integrated times for each particle hypotesis
1740 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTrackTime[i]=times[i];
1743 //_______________________________________________________________________
1744 void AliESDtrack::SetITSpid(const Double_t *p) {
1745 // Sets values for the probability of each particle type (in ITS)
1746 SetPIDValues(fITSr,p,AliPID::kSPECIES);
1747 SetStatus(AliESDtrack::kITSpid);
1750 //_______________________________________________________________________
1751 void AliESDtrack::GetITSpid(Double_t *p) const {
1752 // Gets the probability of each particle type (in ITS)
1753 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fITSr[i];
1756 //_______________________________________________________________________
1757 Char_t AliESDtrack::GetITSclusters(Int_t *idx) const {
1758 //---------------------------------------------------------------------
1759 // This function returns indices of the assgined ITS clusters
1760 //---------------------------------------------------------------------
1761 if (idx && fFriendTrack) {
1762 Int_t *index=fFriendTrack->GetITSindices();
1763 for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) {
1764 if ( (i>=fITSncls) && (i<6) ) idx[i]=-1;
1776 //_______________________________________________________________________
1777 Bool_t AliESDtrack::GetITSModuleIndexInfo(Int_t ilayer,Int_t &idet,Int_t &status,
1778 Float_t &xloc,Float_t &zloc) const {
1779 //----------------------------------------------------------------------
1780 // This function encodes in the module number also the status of cluster association
1781 // "status" can have the following values:
1782 // 1 "found" (cluster is associated),
1783 // 2 "dead" (module is dead from OCDB),
1784 // 3 "skipped" (module or layer forced to be skipped),
1785 // 4 "outinz" (track out of z acceptance),
1786 // 5 "nocls" (no clusters in the road),
1787 // 6 "norefit" (cluster rejected during refit),
1788 // 7 "deadzspd" (holes in z in SPD)
1789 // Also given are the coordinates of the crossing point of track and module
1790 // (in the local module ref. system)
1791 // WARNING: THIS METHOD HAS TO BE SYNCHRONIZED WITH AliITStrackV2::GetModuleIndexInfo()!
1792 //----------------------------------------------------------------------
1794 if(fITSModule[ilayer]==-1) {
1797 xloc=-99.; zloc=-99.;
1801 Int_t module = fITSModule[ilayer];
1803 idet = Int_t(module/1000000);
1805 module -= idet*1000000;
1807 status = Int_t(module/100000);
1809 module -= status*100000;
1811 Int_t signs = Int_t(module/10000);
1813 module-=signs*10000;
1815 Int_t xInt = Int_t(module/100);
1818 Int_t zInt = module;
1820 if(signs==1) { xInt*=1; zInt*=1; }
1821 if(signs==2) { xInt*=1; zInt*=-1; }
1822 if(signs==3) { xInt*=-1; zInt*=1; }
1823 if(signs==4) { xInt*=-1; zInt*=-1; }
1825 xloc = 0.1*(Float_t)xInt;
1826 zloc = 0.1*(Float_t)zInt;
1828 if(status==4) idet = -1;
1833 //_______________________________________________________________________
1834 UShort_t AliESDtrack::GetTPCclusters(Int_t *idx) const {
1835 //---------------------------------------------------------------------
1836 // This function returns indices of the assgined ITS clusters
1837 //---------------------------------------------------------------------
1838 if (idx && fFriendTrack) {
1839 Int_t *index=fFriendTrack->GetTPCindices();
1842 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=index[i];
1845 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=-2;
1851 //_______________________________________________________________________
1852 Float_t AliESDtrack::GetTPCCrossedRows() const
1854 // This function calls GetTPCClusterInfo with some default parameters which are used in the track selection and caches the outcome
1855 // because GetTPCClusterInfo is quite time-consuming
1857 if (fCacheNCrossedRows > -1)
1858 return fCacheNCrossedRows;
1860 fCacheNCrossedRows = GetTPCClusterInfo(2, 1);
1861 return fCacheNCrossedRows;
1864 //_______________________________________________________________________
1865 Float_t AliESDtrack::GetTPCClusterInfo(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1, Int_t bitType ) const
1868 // TPC cluster information
1869 // type 0: get fraction of found/findable clusters with neighbourhood definition
1870 // 1: findable clusters with neighbourhood definition
1871 // 2: found clusters
1873 // 0 - all cluster used
1874 // 1 - clusters used for the kalman update
1875 // definition of findable clusters:
1876 // a cluster is defined as findable if there is another cluster
1877 // within +- nNeighbours pad rows. The idea is to overcome threshold
1878 // effects with a very simple algorithm.
1884 Int_t last=-nNeighbours;
1885 const TBits & clusterMap = (bitType%2==0) ? fTPCClusterMap : fTPCFitMap;
1887 Int_t upperBound=clusterMap.GetNbits();
1888 if (upperBound>row1) upperBound=row1;
1889 for (Int_t i=row0; i<upperBound; ++i){
1890 //look to current row
1891 if (clusterMap[i]) {
1897 //look to nNeighbours before
1898 if ((i-last)<=nNeighbours) {
1902 //look to nNeighbours after
1903 for (Int_t j=i+1; j<i+1+nNeighbours; ++j){
1910 if (type==2) return found;
1911 if (type==1) return findable;
1916 fraction=(Float_t)found/(Float_t)findable;
1921 return 0; // undefined type - default value
1924 //_______________________________________________________________________
1925 Float_t AliESDtrack::GetTPCClusterDensity(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1, Int_t bitType ) const
1928 // TPC cluster density - only rows where signal before and after given row are used
1929 // - slower function
1930 // type 0: get fraction of found/findable clusters with neighbourhood definition
1931 // 1: findable clusters with neighbourhood definition
1932 // 2: found clusters
1934 // 0 - all cluster used
1935 // 1 - clusters used for the kalman update
1936 // definition of findable clusters:
1937 // a cluster is defined as findable if there is another cluster
1938 // within +- nNeighbours pad rows. The idea is to overcome threshold
1939 // effects with a very simple algorithm.
1943 // Int_t last=-nNeighbours;
1944 const TBits & clusterMap = (bitType%2==0) ? fTPCClusterMap : fTPCFitMap;
1945 Int_t upperBound=clusterMap.GetNbits();
1946 if (upperBound>row1) upperBound=row1;
1947 for (Int_t i=row0; i<upperBound; ++i){
1949 Bool_t isDown=kFALSE;
1950 for (Int_t idelta=1; idelta<=nNeighbours; idelta++){
1951 if (i-idelta>=0 && clusterMap[i-idelta]) isDown=kTRUE;
1952 if (i+idelta<upperBound && clusterMap[i+idelta]) isUp=kTRUE;
1956 if (clusterMap[i]) ++found;
1959 if (type==2) return found;
1960 if (type==1) return findable;
1965 fraction=(Float_t)found/(Float_t)findable;
1970 return 0; // undefined type - default value
1976 //_______________________________________________________________________
1977 Double_t AliESDtrack::GetTPCdensity(Int_t row0, Int_t row1) const{
1979 // GetDensity of the clusters on given region between row0 and row1
1980 // Dead zone effect takin into acoount
1982 if (!fFriendTrack) return 0.0;
1986 Int_t *index=fFriendTrack->GetTPCindices();
1987 for (Int_t i=row0;i<=row1;i++){
1988 Int_t idx = index[i];
1989 if (idx!=-1) good++; // track outside of dead zone
1992 Float_t density=0.5;
1993 if (good>TMath::Max((row1-row0)*0.5,0.0)) density = Float_t(found)/Float_t(good);
1997 //_______________________________________________________________________
1998 void AliESDtrack::SetTPCpid(const Double_t *p) {
1999 // Sets values for the probability of each particle type (in TPC)
2000 SetPIDValues(fTPCr,p,AliPID::kSPECIES);
2001 SetStatus(AliESDtrack::kTPCpid);
2004 //_______________________________________________________________________
2005 void AliESDtrack::GetTPCpid(Double_t *p) const {
2006 // Gets the probability of each particle type (in TPC)
2007 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTPCr[i];
2010 //_______________________________________________________________________
2011 UChar_t AliESDtrack::GetTRDclusters(Int_t *idx) const {
2012 //---------------------------------------------------------------------
2013 // This function returns indices of the assgined TRD clusters
2014 //---------------------------------------------------------------------
2015 if (idx && fFriendTrack) {
2016 Int_t *index=fFriendTrack->GetTRDindices();
2019 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=index[i];
2022 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=-2;
2028 //_______________________________________________________________________
2029 UChar_t AliESDtrack::GetTRDtracklets(Int_t *idx) const {
2031 // This function returns the number of TRD tracklets used in tracking
2032 // and it fills the indices of these tracklets in the array "idx" as they
2033 // are registered in the TRD track list.
2036 // 1. The idx array has to be allocated with a size >= AliESDtrack::kTRDnPlanes
2037 // 2. The idx array store not only the index but also the layer of the tracklet.
2038 // Therefore tracks with TRD gaps contain default values for indices [-1]
2040 if (!fFriendTrack) return 0;
2041 if (!idx) return GetTRDntracklets();
2042 Int_t *index=fFriendTrack->GetTRDindices();
2044 for (Int_t i=0; i<kTRDnPlanes; i++){
2046 if(index[i]>=0) n++;
2054 //_______________________________________________________________________
2055 void AliESDtrack::SetTRDpid(const Double_t *p) {
2056 // Sets values for the probability of each particle type (in TRD)
2057 SetPIDValues(fTRDr,p,AliPID::kSPECIES);
2058 SetStatus(AliESDtrack::kTRDpid);
2061 //_______________________________________________________________________
2062 void AliESDtrack::GetTRDpid(Double_t *p) const {
2063 // Gets the probability of each particle type (in TRD)
2064 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTRDr[i];
2067 //_______________________________________________________________________
2068 void AliESDtrack::SetTRDpid(Int_t iSpecies, Float_t p)
2070 // Sets the probability of particle type iSpecies to p (in TRD)
2071 fTRDr[iSpecies] = p;
2074 Double_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
2076 // Returns the probability of particle type iSpecies (in TRD)
2077 return fTRDr[iSpecies];
2080 //____________________________________________________
2081 Int_t AliESDtrack::GetNumberOfTRDslices() const
2083 // built in backward compatibility
2084 Int_t idx = fTRDnSlices - (kTRDnPlanes<<1);
2085 return idx<18 ? fTRDnSlices/kTRDnPlanes : idx/kTRDnPlanes;
2088 //____________________________________________________
2089 Double_t AliESDtrack::GetTRDmomentum(Int_t plane, Double_t *sp) const
2091 //Returns momentum estimation and optional its error (sp)
2092 // in TRD layer "plane".
2095 AliDebug(2, "No TRD info allocated for this track.");
2098 if ((plane<0) || (plane>=kTRDnPlanes)) {
2099 AliWarning(Form("Request for TRD plane[%d] outside range.", plane));
2103 Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
2104 // Protection for backward compatibility
2105 if(idx<(GetNumberOfTRDslices()*kTRDnPlanes)) return -1.;
2107 if(sp) (*sp) = fTRDslices[idx+kTRDnPlanes];
2108 return fTRDslices[idx];
2111 //____________________________________________________
2112 Double_t AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
2113 //Gets the charge from the slice of the plane
2116 //AliError("No TRD slices allocated for this track !");
2119 if ((plane<0) || (plane>=kTRDnPlanes)) {
2120 AliError("Info for TRD plane not available !");
2123 Int_t ns=GetNumberOfTRDslices();
2124 if ((slice<-1) || (slice>=ns)) {
2125 //AliError("Wrong TRD slice !");
2129 if(slice>=0) return fTRDslices[plane*ns + slice];
2131 // return average of the dEdx measurements
2132 Double_t q=0.; Double32_t *s = &fTRDslices[plane*ns];
2133 for (Int_t i=0; i<ns; i++, s++) if((*s)>0.) q+=(*s);
2137 //____________________________________________________
2138 void AliESDtrack::SetNumberOfTRDslices(Int_t n) {
2139 //Sets the number of slices used for PID
2140 if (fTRDnSlices) return;
2143 fTRDslices=new Double32_t[fTRDnSlices];
2145 // set-up correctly the allocated memory
2146 memset(fTRDslices, 0, n*sizeof(Double32_t));
2147 for (Int_t i=GetNumberOfTRDslices(); i--;) fTRDslices[i]=-1.;
2150 //____________________________________________________
2151 void AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
2152 //Sets the charge q in the slice of the plane
2154 AliError("No TRD slices allocated for this track !");
2157 if ((plane<0) || (plane>=kTRDnPlanes)) {
2158 AliError("Info for TRD plane not allocated !");
2161 Int_t ns=GetNumberOfTRDslices();
2162 if ((slice<0) || (slice>=ns)) {
2163 AliError(Form("Wrong TRD slice %d/%d, NSlices=%d",plane,slice,ns));
2166 Int_t n=plane*ns + slice;
2171 //____________________________________________________
2172 void AliESDtrack::SetTRDmomentum(Double_t p, Int_t plane, Double_t *sp)
2175 AliError("No TRD slices allocated for this track !");
2178 if ((plane<0) || (plane>=kTRDnPlanes)) {
2179 AliError("Info for TRD plane not allocated !");
2183 Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
2184 // Protection for backward compatibility
2185 if(idx<GetNumberOfTRDslices()*kTRDnPlanes) return;
2187 if(sp) fTRDslices[idx+kTRDnPlanes] = (*sp);
2188 fTRDslices[idx] = p;
2192 //_______________________________________________________________________
2193 void AliESDtrack::SetTOFpid(const Double_t *p) {
2194 // Sets the probability of each particle type (in TOF)
2195 SetPIDValues(fTOFr,p,AliPID::kSPECIES);
2196 SetStatus(AliESDtrack::kTOFpid);
2199 //_______________________________________________________________________
2200 void AliESDtrack::SetTOFLabel(const Int_t *p) {
2202 for (Int_t i=0; i<3; i++) fTOFLabel[i]=p[i];
2205 //_______________________________________________________________________
2206 void AliESDtrack::GetTOFpid(Double_t *p) const {
2207 // Gets probabilities of each particle type (in TOF)
2208 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTOFr[i];
2211 //_______________________________________________________________________
2212 void AliESDtrack::GetTOFLabel(Int_t *p) const {
2214 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
2217 //_______________________________________________________________________
2218 void AliESDtrack::GetTOFInfo(Float_t *info) const {
2220 for (Int_t i=0; i<10; i++) info[i]=fTOFInfo[i];
2223 //_______________________________________________________________________
2224 void AliESDtrack::SetTOFInfo(Float_t*info) {
2226 for (Int_t i=0; i<10; i++) fTOFInfo[i]=info[i];
2231 //_______________________________________________________________________
2232 void AliESDtrack::SetHMPIDpid(const Double_t *p) {
2233 // Sets the probability of each particle type (in HMPID)
2234 SetPIDValues(fHMPIDr,p,AliPID::kSPECIES);
2235 SetStatus(AliESDtrack::kHMPIDpid);
2238 //_______________________________________________________________________
2239 void AliESDtrack::SetTPCdEdxInfo(AliTPCdEdxInfo * dEdxInfo){
2240 if(fTPCdEdxInfo) delete fTPCdEdxInfo;
2241 fTPCdEdxInfo = dEdxInfo;
2244 //_______________________________________________________________________
2245 void AliESDtrack::GetHMPIDpid(Double_t *p) const {
2246 // Gets probabilities of each particle type (in HMPID)
2247 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fHMPIDr[i];
2252 //_______________________________________________________________________
2253 void AliESDtrack::SetESDpid(const Double_t *p) {
2254 // Sets the probability of each particle type for the ESD track
2255 SetPIDValues(fR,p,AliPID::kSPECIES);
2256 SetStatus(AliESDtrack::kESDpid);
2259 //_______________________________________________________________________
2260 void AliESDtrack::GetESDpid(Double_t *p) const {
2261 // Gets probability of each particle type for the ESD track
2262 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
2265 //_______________________________________________________________________
2266 Bool_t AliESDtrack::RelateToVertexTPC(const AliESDVertex *vtx,
2267 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
2269 // Try to relate the TPC-only track parameters to the vertex "vtx",
2270 // if the (rough) transverse impact parameter is not bigger then "maxd".
2271 // Magnetic field is "b" (kG).
2273 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
2274 // b) The impact parameters and their covariance matrix are calculated.
2275 // c) An attempt to constrain the TPC-only params to the vertex is done.
2276 // The constrained params are returned via "cParam".
2278 // In the case of success, the returned value is kTRUE
2279 // otherwise, it's kFALSE)
2282 if (!fTPCInner) return kFALSE;
2283 if (!vtx) return kFALSE;
2285 Double_t dz[2],cov[3];
2286 if (!fTPCInner->PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
2294 Double_t covar[6]; vtx->GetCovMatrix(covar);
2295 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2296 Double_t c[3]={covar[2],0.,covar[5]};
2298 Double_t chi2=GetPredictedChi2(p,c);
2299 if (chi2>kVeryBig) return kFALSE;
2303 if (!cParam) return kTRUE;
2305 *cParam = *fTPCInner;
2306 if (!cParam->Update(p,c)) return kFALSE;
2311 //_______________________________________________________________________
2312 Bool_t AliESDtrack::RelateToVertexTPCBxByBz(const AliESDVertex *vtx,
2313 Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
2315 // Try to relate the TPC-only track parameters to the vertex "vtx",
2316 // if the (rough) transverse impact parameter is not bigger then "maxd".
2318 // All three components of the magnetic field ,"b[3]" (kG),
2319 // are taken into account.
2321 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
2322 // b) The impact parameters and their covariance matrix are calculated.
2323 // c) An attempt to constrain the TPC-only params to the vertex is done.
2324 // The constrained params are returned via "cParam".
2326 // In the case of success, the returned value is kTRUE
2327 // otherwise, it's kFALSE)
2330 if (!fTPCInner) return kFALSE;
2331 if (!vtx) return kFALSE;
2333 Double_t dz[2],cov[3];
2334 if (!fTPCInner->PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
2342 Double_t covar[6]; vtx->GetCovMatrix(covar);
2343 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2344 Double_t c[3]={covar[2],0.,covar[5]};
2346 Double_t chi2=GetPredictedChi2(p,c);
2347 if (chi2>kVeryBig) return kFALSE;
2351 if (!cParam) return kTRUE;
2353 *cParam = *fTPCInner;
2354 if (!cParam->Update(p,c)) return kFALSE;
2359 //_______________________________________________________________________
2360 Bool_t AliESDtrack::RelateToVertex(const AliESDVertex *vtx,
2361 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
2363 // Try to relate this track to the vertex "vtx",
2364 // if the (rough) transverse impact parameter is not bigger then "maxd".
2365 // Magnetic field is "b" (kG).
2367 // a) The track gets extapolated to the DCA to the vertex.
2368 // b) The impact parameters and their covariance matrix are calculated.
2369 // c) An attempt to constrain this track to the vertex is done.
2370 // The constrained params are returned via "cParam".
2372 // In the case of success, the returned value is kTRUE
2373 // (otherwise, it's kFALSE)
2376 if (!vtx) return kFALSE;
2378 Double_t dz[2],cov[3];
2379 if (!PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
2387 Double_t covar[6]; vtx->GetCovMatrix(covar);
2388 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2389 Double_t c[3]={covar[2],0.,covar[5]};
2391 Double_t chi2=GetPredictedChi2(p,c);
2392 if (chi2>kVeryBig) return kFALSE;
2397 //--- Could now these lines be removed ? ---
2399 fCp=new AliExternalTrackParam(*this);
2401 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
2402 //----------------------------------------
2404 fVertexID = vtx->GetID();
2406 if (!cParam) return kTRUE;
2409 if (!cParam->Update(p,c)) return kFALSE;
2414 //_______________________________________________________________________
2415 Bool_t AliESDtrack::RelateToVertexBxByBz(const AliESDVertex *vtx,
2416 Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
2418 // Try to relate this track to the vertex "vtx",
2419 // if the (rough) transverse impact parameter is not bigger then "maxd".
2420 // Magnetic field is "b" (kG).
2422 // a) The track gets extapolated to the DCA to the vertex.
2423 // b) The impact parameters and their covariance matrix are calculated.
2424 // c) An attempt to constrain this track to the vertex is done.
2425 // The constrained params are returned via "cParam".
2427 // In the case of success, the returned value is kTRUE
2428 // (otherwise, it's kFALSE)
2431 if (!vtx) return kFALSE;
2433 Double_t dz[2],cov[3];
2434 if (!PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
2442 Double_t covar[6]; vtx->GetCovMatrix(covar);
2443 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2444 Double_t c[3]={covar[2],0.,covar[5]};
2446 Double_t chi2=GetPredictedChi2(p,c);
2447 if (chi2>kVeryBig) return kFALSE;
2452 //--- Could now these lines be removed ? ---
2454 fCp=new AliExternalTrackParam(*this);
2456 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
2457 //----------------------------------------
2459 fVertexID = vtx->GetID();
2461 if (!cParam) return kTRUE;
2464 if (!cParam->Update(p,c)) return kFALSE;
2469 //_______________________________________________________________________
2470 void AliESDtrack::Print(Option_t *) const {
2471 // Prints info on the track
2472 AliExternalTrackParam::Print();
2473 printf("ESD track info\n") ;
2474 Double_t p[AliPID::kSPECIES] ;
2476 if( IsOn(kITSpid) ){
2477 printf("From ITS: ") ;
2479 for(index = 0 ; index < AliPID::kSPECIES; index++)
2480 printf("%f, ", p[index]) ;
2481 printf("\n signal = %f\n", GetITSsignal()) ;
2483 if( IsOn(kTPCpid) ){
2484 printf("From TPC: ") ;
2486 for(index = 0 ; index < AliPID::kSPECIES; index++)
2487 printf("%f, ", p[index]) ;
2488 printf("\n signal = %f\n", GetTPCsignal()) ;
2490 if( IsOn(kTRDpid) ){
2491 printf("From TRD: ") ;
2493 for(index = 0 ; index < AliPID::kSPECIES; index++)
2494 printf("%f, ", p[index]) ;
2495 printf("\n signal = %f\n", GetTRDsignal()) ;
2496 printf("\n NchamberdEdx = %d\n", GetTRDNchamberdEdx()) ;
2497 printf("\n NclusterdEdx = %d\n", GetTRDNclusterdEdx()) ;
2499 if( IsOn(kTOFpid) ){
2500 printf("From TOF: ") ;
2502 for(index = 0 ; index < AliPID::kSPECIES; index++)
2503 printf("%f, ", p[index]) ;
2504 printf("\n signal = %f\n", GetTOFsignal()) ;
2506 if( IsOn(kHMPIDpid) ){
2507 printf("From HMPID: ") ;
2509 for(index = 0 ; index < AliPID::kSPECIES; index++)
2510 printf("%f, ", p[index]) ;
2511 printf("\n signal = %f\n", GetHMPIDsignal()) ;
2517 // Draw functionality
2518 // Origin: Marian Ivanov, Marian.Ivanov@cern.ch
2520 void AliESDtrack::FillPolymarker(TPolyMarker3D *pol, Float_t magF, Float_t minR, Float_t maxR, Float_t stepR){
2522 // Fill points in the polymarker
2525 arrayRef.AddLast(new AliExternalTrackParam(*this));
2526 if (fIp) arrayRef.AddLast(new AliExternalTrackParam(*fIp));
2527 if (fOp) arrayRef.AddLast(new AliExternalTrackParam(*fOp));
2528 if (fHMPIDp) arrayRef.AddLast(new AliExternalTrackParam(*fHMPIDp));
2530 Double_t mpos[3]={0,0,0};
2531 Int_t entries=arrayRef.GetEntries();
2532 for (Int_t i=0;i<entries;i++){
2534 ((AliExternalTrackParam*)arrayRef.At(i))->GetXYZ(pos);
2535 mpos[0]+=pos[0]/entries;
2536 mpos[1]+=pos[1]/entries;
2537 mpos[2]+=pos[2]/entries;
2539 // Rotate to the mean position
2541 Float_t fi= TMath::ATan2(mpos[1],mpos[0]);
2542 for (Int_t i=0;i<entries;i++){
2543 Bool_t res = ((AliExternalTrackParam*)arrayRef.At(i))->Rotate(fi);
2544 if (!res) delete arrayRef.RemoveAt(i);
2547 for (Double_t r=minR; r<maxR; r+=stepR){
2549 Double_t mlpos[3]={0,0,0};
2550 for (Int_t i=0;i<entries;i++){
2551 Double_t point[3]={0,0,0};
2552 AliExternalTrackParam *param = ((AliExternalTrackParam*)arrayRef.At(i));
2553 if (!param) continue;
2554 if (param->GetXYZAt(r,magF,point)){
2555 Double_t weight = 1./(10.+(r-param->GetX())*(r-param->GetX()));
2557 mlpos[0]+=point[0]*weight;
2558 mlpos[1]+=point[1]*weight;
2559 mlpos[2]+=point[2]*weight;
2566 pol->SetPoint(counter,mlpos[0],mlpos[1], mlpos[2]);
2567 // printf("xyz\t%f\t%f\t%f\n",mlpos[0], mlpos[1],mlpos[2]);
2573 //_______________________________________________________________________
2574 void AliESDtrack::SetITSdEdxSamples(const Double_t s[4]) {
2576 // Store the dE/dx samples measured by the two SSD and two SDD layers.
2577 // These samples are corrected for the track segment length.
2579 for (Int_t i=0; i<4; i++) fITSdEdxSamples[i]=s[i];
2582 //_______________________________________________________________________
2583 void AliESDtrack::GetITSdEdxSamples(Double_t s[4]) const {
2585 // Get the dE/dx samples measured by the two SSD and two SDD layers.
2586 // These samples are corrected for the track segment length.
2588 for (Int_t i=0; i<4; i++) s[i]=fITSdEdxSamples[i];
2592 UShort_t AliESDtrack::GetTPCnclsS(Int_t i0,Int_t i1) const{
2594 // get number of shared TPC clusters
2596 return fTPCSharedMap.CountBits(i0)-fTPCSharedMap.CountBits(i1);
2599 UShort_t AliESDtrack::GetTPCncls(Int_t i0,Int_t i1) const{
2601 // get number of TPC clusters
2603 return fTPCClusterMap.CountBits(i0)-fTPCClusterMap.CountBits(i1);
2606 //____________________________________________________________________
2607 Double_t AliESDtrack::GetChi2TPCConstrainedVsGlobal(const AliESDVertex* vtx) const
2609 // Calculates the chi2 between the TPC track (TPCinner) constrained to the primary vertex and the global track
2611 // Returns -1 in case the calculation failed
2613 // Value is cached as a non-persistent member.
2615 // Code adapted from original code by GSI group (Jacek, Marian, Michael)
2617 // cache, ignoring that a different vertex might be passed
2618 if (fCacheChi2TPCConstrainedVsGlobalVertex == vtx)
2619 return fCacheChi2TPCConstrainedVsGlobal;
2621 fCacheChi2TPCConstrainedVsGlobal = -1;
2622 fCacheChi2TPCConstrainedVsGlobalVertex = vtx;
2627 AliTrackerBase::GetBxByBz(x,b);
2630 AliWarning("Could not get TPC Inner Param.");
2631 return fCacheChi2TPCConstrainedVsGlobal;
2634 // clone for constraining
2635 AliExternalTrackParam* tpcInnerC = new AliExternalTrackParam(*fTPCInner);
2637 AliWarning("Clone of TPCInnerParam failed.");
2638 return fCacheChi2TPCConstrainedVsGlobal;
2641 // transform to the track reference frame
2642 Bool_t isOK = tpcInnerC->Rotate(GetAlpha());
2643 isOK &= tpcInnerC->PropagateTo(GetX(), b[2]);
2647 AliWarning("Rotation/Propagation of track failed.") ;
2648 return fCacheChi2TPCConstrainedVsGlobal;
2651 // constrain TPCinner
2652 isOK = tpcInnerC->ConstrainToVertex(vtx, b);
2654 // transform to the track reference frame
2655 isOK &= tpcInnerC->Rotate(GetAlpha());
2656 isOK &= tpcInnerC->PropagateTo(GetX(), b[2]);
2659 AliWarning("ConstrainTPCInner failed.") ;
2662 return fCacheChi2TPCConstrainedVsGlobal;
2665 // calculate chi2 between vi and vj vectors
2666 // with covi and covj covariance matrices
2667 // chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)
2668 TMatrixD deltaT(5,1);
2669 TMatrixD delta(1,5);
2670 TMatrixD covarM(5,5);
2672 for (Int_t ipar=0; ipar<5; ipar++) {
2673 deltaT(ipar,0) = tpcInnerC->GetParameter()[ipar] - GetParameter()[ipar];
2674 delta(0,ipar) = tpcInnerC->GetParameter()[ipar] - GetParameter()[ipar];
2676 for (Int_t jpar=0; jpar<5; jpar++) {
2677 Int_t index = GetIndex(ipar,jpar);
2678 covarM(ipar,jpar) = GetCovariance()[index]+tpcInnerC->GetCovariance()[index];
2681 // chi2 distance TPC constrained and TPC+ITS
2682 TMatrixD covarMInv = covarM.Invert();
2683 TMatrixD mat2 = covarMInv*deltaT;
2684 TMatrixD chi2 = delta*mat2;
2689 fCacheChi2TPCConstrainedVsGlobal = chi2(0,0);
2690 return fCacheChi2TPCConstrainedVsGlobal;
2693 void AliESDtrack::SetDetectorPID(const AliDetectorPID *pid)
2696 // Set the detector PID
2698 if (fDetectorPID) delete fDetectorPID;