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>
120 #include "AliESDVertex.h"
121 #include "AliESDtrack.h"
122 #include "AliESDEvent.h"
123 #include "AliKalmanTrack.h"
124 #include "AliVTrack.h"
126 #include "AliTrackPointArray.h"
127 #include "TPolyMarker3D.h"
129 ClassImp(AliESDtrack)
131 void SetPIDValues(Double_t * dest, const Double_t * src, Int_t n) {
132 // This function copies "n" PID weights from "scr" to "dest"
133 // and normalizes their sum to 1 thus producing conditional probabilities.
134 // The negative weights are set to 0.
135 // In case all the weights are non-positive they are replaced by
136 // uniform probabilities
140 Float_t uniform = 1./(Float_t)n;
143 for (Int_t i=0; i<n; i++)
153 for (Int_t i=0; i<n; i++) dest[i] /= sum;
155 for (Int_t i=0; i<n; i++) dest[i] = uniform;
158 //_______________________________________________________________________
159 AliESDtrack::AliESDtrack() :
160 AliExternalTrackParam(),
166 fFriendTrack(new AliESDfriendTrack()),
167 fTPCClusterMap(159),//number of padrows
168 fTPCSharedMap(159),//number of padrows
179 fCaloIndex(kEMCALNoMatch),
185 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
188 fCdd(0),fCdz(0),fCzz(0),
204 fTOFsignalToT(99999),
205 fTOFsignalRaw(99999),
229 fVertexID(-2),// -2 means an orphan track
233 // The default ESD constructor
236 for (i=0; i<AliPID::kSPECIES; i++) {
246 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
247 for (i=0; i<3; i++) { fV0Indexes[i]=0;}
248 for (i=0;i<kTRDnPlanes;i++) {
251 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
252 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
253 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
254 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
255 for (i=0;i<12;i++) {fITSModule[i]=-1;}
258 //_______________________________________________________________________
259 AliESDtrack::AliESDtrack(const AliESDtrack& track):
260 AliExternalTrackParam(track),
267 fTPCClusterMap(track.fTPCClusterMap),
268 fTPCSharedMap(track.fTPCSharedMap),
269 fFlags(track.fFlags),
271 fLabel(track.fLabel),
272 fITSLabel(track.fITSLabel),
273 fTPCLabel(track.fTPCLabel),
274 fTRDLabel(track.fTRDLabel),
275 fTOFCalChannel(track.fTOFCalChannel),
276 fTOFindex(track.fTOFindex),
277 fHMPIDqn(track.fHMPIDqn),
278 fHMPIDcluIdx(track.fHMPIDcluIdx),
279 fCaloIndex(track.fCaloIndex),
280 fHMPIDtrkTheta(track.fHMPIDtrkTheta),
281 fHMPIDtrkPhi(track.fHMPIDtrkPhi),
282 fHMPIDsignal(track.fHMPIDsignal),
283 fTrackLength(track.fTrackLength),
284 fdTPC(track.fdTPC),fzTPC(track.fzTPC),
285 fCddTPC(track.fCddTPC),fCdzTPC(track.fCdzTPC),fCzzTPC(track.fCzzTPC),
286 fCchi2TPC(track.fCchi2TPC),
287 fD(track.fD),fZ(track.fZ),
288 fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
289 fCchi2(track.fCchi2),
290 fITSchi2(track.fITSchi2),
291 fTPCchi2(track.fTPCchi2),
292 fTPCchi2Iter1(track.fTPCchi2Iter1),
293 fTRDchi2(track.fTRDchi2),
294 fTOFchi2(track.fTOFchi2),
295 fHMPIDchi2(track.fHMPIDchi2),
296 fGlobalChi2(track.fGlobalChi2),
297 fITSsignal(track.fITSsignal),
298 fTPCsignal(track.fTPCsignal),
299 fTPCsignalS(track.fTPCsignalS),
300 fTRDsignal(track.fTRDsignal),
301 fTRDQuality(track.fTRDQuality),
302 fTRDBudget(track.fTRDBudget),
303 fTOFsignal(track.fTOFsignal),
304 fTOFsignalToT(track.fTOFsignalToT),
305 fTOFsignalRaw(track.fTOFsignalRaw),
306 fTOFsignalDz(track.fTOFsignalDz),
307 fTOFsignalDx(track.fTOFsignalDx),
308 fTOFdeltaBC(track.fTOFdeltaBC),
309 fTOFl0l1(track.fTOFl0l1),
310 fCaloDx(track.fCaloDx),
311 fCaloDz(track.fCaloDz),
312 fHMPIDtrkX(track.fHMPIDtrkX),
313 fHMPIDtrkY(track.fHMPIDtrkY),
314 fHMPIDmipX(track.fHMPIDmipX),
315 fHMPIDmipY(track.fHMPIDmipY),
316 fTPCncls(track.fTPCncls),
317 fTPCnclsF(track.fTPCnclsF),
318 fTPCsignalN(track.fTPCsignalN),
319 fTPCnclsIter1(track.fTPCnclsIter1),
320 fTPCnclsFIter1(track.fTPCnclsIter1),
321 fITSncls(track.fITSncls),
322 fITSClusterMap(track.fITSClusterMap),
323 fITSSharedMap(track.fITSSharedMap),
324 fTRDncls(track.fTRDncls),
325 fTRDncls0(track.fTRDncls0),
326 fTRDntracklets(track.fTRDntracklets),
327 fTRDnSlices(track.fTRDnSlices),
329 fVertexID(track.fVertexID),
330 fESDEvent(track.fESDEvent)
335 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i]=track.fTrackTime[i];
336 for (Int_t i=0;i<AliPID::kSPECIES;i++) fR[i]=track.fR[i];
338 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=track.fITSr[i];
340 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=track.fTPCr[i];
341 for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=track.fITSdEdxSamples[i];}
342 for (Int_t i=0;i<4;i++) {fTPCPoints[i]=track.fTPCPoints[i];}
343 for (Int_t i=0; i<3;i++) { fKinkIndexes[i]=track.fKinkIndexes[i];}
344 for (Int_t i=0; i<3;i++) { fV0Indexes[i]=track.fV0Indexes[i];}
346 for (Int_t i=0;i<kTRDnPlanes;i++) {
347 fTRDTimBin[i]=track.fTRDTimBin[i];
351 fTRDslices=new Double32_t[fTRDnSlices];
352 for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=track.fTRDslices[i];
355 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i]=track.fTRDr[i];
356 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i]=track.fTOFr[i];
357 for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
358 for (Int_t i=0;i<10;i++) fTOFInfo[i]=track.fTOFInfo[i];
359 for (Int_t i=0;i<12;i++) fITSModule[i]=track.fITSModule[i];
360 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i]=track.fHMPIDr[i];
362 if (track.fCp) fCp=new AliExternalTrackParam(*track.fCp);
363 if (track.fIp) fIp=new AliExternalTrackParam(*track.fIp);
364 if (track.fTPCInner) fTPCInner=new AliExternalTrackParam(*track.fTPCInner);
365 if (track.fOp) fOp=new AliExternalTrackParam(*track.fOp);
366 if (track.fHMPIDp) fHMPIDp=new AliExternalTrackParam(*track.fHMPIDp);
368 if (track.fFriendTrack) fFriendTrack=new AliESDfriendTrack(*(track.fFriendTrack));
371 //_______________________________________________________________________
372 AliESDtrack::AliESDtrack(const AliVTrack *track) :
373 AliExternalTrackParam(track),
380 fTPCClusterMap(159),//number of padrows
381 fTPCSharedMap(159),//number of padrows
392 fCaloIndex(kEMCALNoMatch),
398 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
401 fCdd(0),fCdz(0),fCzz(0),
417 fTOFsignalToT(99999),
418 fTOFsignalRaw(99999),
442 fVertexID(-2), // -2 means an orphan track
446 // ESD track from AliVTrack.
447 // This is not a copy constructor !
450 if (track->InheritsFrom("AliExternalTrackParam")) {
451 AliError("This is not a copy constructor. Use AliESDtrack(const AliESDtrack &) !");
452 AliWarning("Calling the default constructor...");
457 // Reset all the arrays
459 for (i=0; i<AliPID::kSPECIES; i++) {
469 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
470 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
471 for (i=0;i<kTRDnPlanes;i++) {
474 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
475 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
476 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
477 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
478 for (i=0;i<12;i++) {fITSModule[i]=-1;}
481 SetID(track->GetID());
483 // Set ITS cluster map
484 fITSClusterMap=track->GetITSClusterMap();
489 if(HasPointOnITSLayer(i)) fITSncls++;
493 fTPCncls=track->GetTPCNcls();
496 // Set the combined PID
497 const Double_t *pid = track->PID();
499 for (i=0; i<AliPID::kSPECIES; i++) fR[i]=pid[i];
501 // AliESD track label
502 SetLabel(track->GetLabel());
504 SetStatus(track->GetStatus());
507 //_______________________________________________________________________
508 AliESDtrack::AliESDtrack(TParticle * part) :
509 AliExternalTrackParam(),
516 fTPCClusterMap(159),//number of padrows
517 fTPCSharedMap(159),//number of padrows
528 fCaloIndex(kEMCALNoMatch),
534 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
537 fCdd(0),fCdz(0),fCzz(0),
553 fTOFsignalToT(99999),
554 fTOFsignalRaw(99999),
578 fVertexID(-2), // -2 means an orphan track
582 // ESD track from TParticle
585 // Reset all the arrays
587 for (i=0; i<AliPID::kSPECIES; i++) {
597 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
598 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
599 for (i=0;i<kTRDnPlanes;i++) {
602 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
603 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
604 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
605 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
606 for (i=0;i<12;i++) {fITSModule[i]=-1;}
608 // Calculate the AliExternalTrackParam content
615 // Calculate alpha: the rotation angle of the corresponding local system (TPC sector)
616 alpha = part->Phi()*180./TMath::Pi();
617 if (alpha<0) alpha+= 360.;
618 if (alpha>360) alpha -= 360.;
620 Int_t sector = (Int_t)(alpha/20.);
621 alpha = 10. + 20.*sector;
623 alpha *= TMath::Pi();
625 // Covariance matrix: no errors, the parameters are exact
626 for (i=0; i<15; i++) covar[i]=0.;
628 // Get the vertex of origin and the momentum
629 TVector3 ver(part->Vx(),part->Vy(),part->Vz());
630 TVector3 mom(part->Px(),part->Py(),part->Pz());
632 // Rotate to the local coordinate system (TPC sector)
636 // X of the referense plane
639 Int_t pdgCode = part->GetPdgCode();
642 TDatabasePDG::Instance()->GetParticle(pdgCode)->Charge();
646 param[2] = TMath::Sin(mom.Phi());
647 param[3] = mom.Pz()/mom.Pt();
648 param[4] = TMath::Sign(1/mom.Pt(),charge);
650 // Set AliExternalTrackParam
651 Set(xref, alpha, param, covar);
656 switch (TMath::Abs(pdgCode)) {
682 // If the particle is not e,mu,pi,K or p the PID probabilities are set to 0
683 if (indexPID < AliPID::kSPECIES) {
689 fHMPIDr[indexPID]=1.;
692 // AliESD track label
693 SetLabel(part->GetUniqueID());
697 //_______________________________________________________________________
698 AliESDtrack::~AliESDtrack(){
700 // This is destructor according Coding Conventrions
702 //printf("Delete track\n");
713 AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
716 if(&source == this) return *this;
717 AliExternalTrackParam::operator=(source);
721 // we have the trackparam: assign or copy construct
722 if(fCp)*fCp = *source.fCp;
723 else fCp = new AliExternalTrackParam(*source.fCp);
726 // no track param delete the old one
732 // we have the trackparam: assign or copy construct
733 if(fIp)*fIp = *source.fIp;
734 else fIp = new AliExternalTrackParam(*source.fIp);
737 // no track param delete the old one
743 if(source.fTPCInner){
744 // we have the trackparam: assign or copy construct
745 if(fTPCInner) *fTPCInner = *source.fTPCInner;
746 else fTPCInner = new AliExternalTrackParam(*source.fTPCInner);
749 // no track param delete the old one
750 if(fTPCInner)delete fTPCInner;
756 // we have the trackparam: assign or copy construct
757 if(fOp) *fOp = *source.fOp;
758 else fOp = new AliExternalTrackParam(*source.fOp);
761 // no track param delete the old one
768 // we have the trackparam: assign or copy construct
769 if(fHMPIDp) *fHMPIDp = *source.fHMPIDp;
770 else fHMPIDp = new AliExternalTrackParam(*source.fHMPIDp);
773 // no track param delete the old one
774 if(fHMPIDp)delete fHMPIDp;
779 // copy also the friend track
780 // use copy constructor
781 if(source.fFriendTrack){
782 // we have the trackparam: assign or copy construct
783 delete fFriendTrack; fFriendTrack=new AliESDfriendTrack(*source.fFriendTrack);
786 // no track param delete the old one
787 delete fFriendTrack; fFriendTrack= 0;
790 fTPCClusterMap = source.fTPCClusterMap;
791 fTPCSharedMap = source.fTPCSharedMap;
793 fFlags = source.fFlags;
795 fLabel = source.fLabel;
796 fITSLabel = source.fITSLabel;
797 for(int i = 0; i< 12;++i){
798 fITSModule[i] = source.fITSModule[i];
800 fTPCLabel = source.fTPCLabel;
801 fTRDLabel = source.fTRDLabel;
802 for(int i = 0; i< 3;++i){
803 fTOFLabel[i] = source.fTOFLabel[i];
805 fTOFCalChannel = source.fTOFCalChannel;
806 fTOFindex = source.fTOFindex;
807 fHMPIDqn = source.fHMPIDqn;
808 fHMPIDcluIdx = source.fHMPIDcluIdx;
809 fCaloIndex = source.fCaloIndex;
811 for(int i = 0; i< 3;++i){
812 fKinkIndexes[i] = source.fKinkIndexes[i];
813 fV0Indexes[i] = source.fV0Indexes[i];
816 for(int i = 0; i< AliPID::kSPECIES;++i){
817 fR[i] = source.fR[i];
818 fITSr[i] = source.fITSr[i];
819 fTPCr[i] = source.fTPCr[i];
820 fTRDr[i] = source.fTRDr[i];
821 fTOFr[i] = source.fTOFr[i];
822 fHMPIDr[i] = source.fHMPIDr[i];
823 fTrackTime[i] = source.fTrackTime[i];
826 fHMPIDtrkTheta = source.fHMPIDtrkTheta;
827 fHMPIDtrkPhi = source.fHMPIDtrkPhi;
828 fHMPIDsignal = source.fHMPIDsignal;
831 fTrackLength = source. fTrackLength;
832 fdTPC = source.fdTPC;
833 fzTPC = source.fzTPC;
834 fCddTPC = source.fCddTPC;
835 fCdzTPC = source.fCdzTPC;
836 fCzzTPC = source.fCzzTPC;
837 fCchi2TPC = source.fCchi2TPC;
844 fCchi2 = source.fCchi2;
846 fITSchi2 = source.fITSchi2;
847 fTPCchi2 = source.fTPCchi2;
848 fTPCchi2Iter1 = source.fTPCchi2Iter1;
849 fTRDchi2 = source.fTRDchi2;
850 fTOFchi2 = source.fTOFchi2;
851 fHMPIDchi2 = source.fHMPIDchi2;
853 fGlobalChi2 = source.fGlobalChi2;
855 fITSsignal = source.fITSsignal;
856 for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=source.fITSdEdxSamples[i];}
857 fTPCsignal = source.fTPCsignal;
858 fTPCsignalS = source.fTPCsignalS;
859 for(int i = 0; i< 4;++i){
860 fTPCPoints[i] = source.fTPCPoints[i];
862 fTRDsignal = source.fTRDsignal;
864 for(int i = 0;i < kTRDnPlanes;++i){
865 fTRDTimBin[i] = source.fTRDTimBin[i];
871 fTRDnSlices=source.fTRDnSlices;
873 fTRDslices=new Double32_t[fTRDnSlices];
874 for(int j = 0;j < fTRDnSlices;++j) fTRDslices[j] = source.fTRDslices[j];
877 fTRDQuality = source.fTRDQuality;
878 fTRDBudget = source.fTRDBudget;
879 fTOFsignal = source.fTOFsignal;
880 fTOFsignalToT = source.fTOFsignalToT;
881 fTOFsignalRaw = source.fTOFsignalRaw;
882 fTOFsignalDz = source.fTOFsignalDz;
883 fTOFsignalDx = source.fTOFsignalDx;
884 fTOFdeltaBC = source.fTOFdeltaBC;
885 fTOFl0l1 = source.fTOFl0l1;
887 for(int i = 0;i<10;++i){
888 fTOFInfo[i] = source.fTOFInfo[i];
891 fHMPIDtrkX = source.fHMPIDtrkX;
892 fHMPIDtrkY = source.fHMPIDtrkY;
893 fHMPIDmipX = source.fHMPIDmipX;
894 fHMPIDmipY = source.fHMPIDmipY;
896 fTPCncls = source.fTPCncls;
897 fTPCnclsF = source.fTPCnclsF;
898 fTPCsignalN = source.fTPCsignalN;
899 fTPCnclsIter1 = source.fTPCnclsIter1;
900 fTPCnclsFIter1 = source.fTPCnclsFIter1;
902 fITSncls = source.fITSncls;
903 fITSClusterMap = source.fITSClusterMap;
904 fITSSharedMap = source.fITSSharedMap;
905 fTRDncls = source.fTRDncls;
906 fTRDncls0 = source.fTRDncls0;
907 fTRDntracklets = source.fTRDntracklets;
908 fVertexID = source.fVertexID;
914 void AliESDtrack::Copy(TObject &obj) const {
916 // this overwrites the virtual TOBject::Copy()
917 // to allow run time copying without casting
920 if(this==&obj)return;
921 AliESDtrack *robj = dynamic_cast<AliESDtrack*>(&obj);
922 if(!robj)return; // not an AliESDtrack
929 void AliESDtrack::AddCalibObject(TObject * object){
931 // add calib object to the list
933 if (!fFriendTrack) fFriendTrack = new AliESDfriendTrack;
934 fFriendTrack->AddCalibObject(object);
937 TObject * AliESDtrack::GetCalibObject(Int_t index){
939 // return calib objct at given position
941 if (!fFriendTrack) return 0;
942 return fFriendTrack->GetCalibObject(index);
946 Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
948 // Fills the information of the TPC-only first reconstruction pass
949 // into the passed ESDtrack object. For consistency fTPCInner is also filled
954 // For data produced before r26675
955 // RelateToVertexTPC was not properly called during reco
956 // so you'll have to call it again, before FillTPCOnlyTrack
957 // Float_t p[2],cov[3];
958 // track->GetImpactParametersTPC(p,cov);
959 // if(p[0]==0&&p[1]==0) // <- Default values
960 // track->RelateToVertexTPC(esd->GetPrimaryVertexTPC(),esd->GetMagneticField(),kVeryBig);
963 if(!fTPCInner)return kFALSE;
965 // fill the TPC track params to the global track parameters
966 track.Set(fTPCInner->GetX(),fTPCInner->GetAlpha(),fTPCInner->GetParameter(),fTPCInner->GetCovariance());
969 track.fCdd = fCddTPC;
970 track.fCdz = fCdzTPC;
971 track.fCzz = fCzzTPC;
973 // copy the inner params
974 if(track.fIp) *track.fIp = *fIp;
975 else track.fIp = new AliExternalTrackParam(*fIp);
977 // copy the TPCinner parameters
978 if(track.fTPCInner) *track.fTPCInner = *fTPCInner;
979 else track.fTPCInner = new AliExternalTrackParam(*fTPCInner);
982 track.fCddTPC = fCddTPC;
983 track.fCdzTPC = fCdzTPC;
984 track.fCzzTPC = fCzzTPC;
985 track.fCchi2TPC = fCchi2TPC;
987 // copy all other TPC specific parameters
989 // replace label by TPC label
990 track.fLabel = fTPCLabel;
991 track.fTPCLabel = fTPCLabel;
993 track.fTPCchi2 = fTPCchi2;
994 track.fTPCchi2Iter1 = fTPCchi2Iter1;
995 track.fTPCsignal = fTPCsignal;
996 track.fTPCsignalS = fTPCsignalS;
997 for(int i = 0;i<4;++i)track.fTPCPoints[i] = fTPCPoints[i];
999 track.fTPCncls = fTPCncls;
1000 track.fTPCnclsF = fTPCnclsF;
1001 track.fTPCsignalN = fTPCsignalN;
1002 track.fTPCnclsIter1 = fTPCnclsIter1;
1003 track.fTPCnclsFIter1 = fTPCnclsFIter1;
1006 for(int i=0;i<AliPID::kSPECIES;++i){
1007 track.fTPCr[i] = fTPCr[i];
1008 // combined PID is TPC only!
1009 track.fR[i] = fTPCr[i];
1011 track.fTPCClusterMap = fTPCClusterMap;
1012 track.fTPCSharedMap = fTPCSharedMap;
1016 track.fFlags = kTPCin;
1019 track.fFlags |= fFlags & kTPCpid; //copy the TPCpid status flag
1021 for (Int_t i=0;i<3;i++) track.fKinkIndexes[i] = fKinkIndexes[i];
1027 //_______________________________________________________________________
1028 void AliESDtrack::MakeMiniESDtrack(){
1029 // Resets everything except
1030 // fFlags: Reconstruction status flags
1031 // fLabel: Track label
1032 // fID: Unique ID of the track
1033 // Impact parameter information
1034 // fR[AliPID::kSPECIES]: combined "detector response probability"
1035 // Running track parameters in the base class (AliExternalTrackParam)
1039 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] = 0;
1041 // Reset track parameters constrained to the primary vertex
1044 // Reset track parameters at the inner wall of TPC
1046 delete fTPCInner;fTPCInner=0;
1047 // Reset track parameters at the inner wall of the TRD
1049 // Reset track parameters at the HMPID
1050 delete fHMPIDp;fHMPIDp = 0;
1053 // Reset ITS track related information
1059 for (Int_t i=0;i<4;i++) fITSdEdxSamples[i] = 0.;
1060 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=0;
1063 // Reset TPC related track information
1075 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0;
1077 for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
1078 for (Int_t i=0; i<3;i++) fKinkIndexes[i] = 0;
1079 for (Int_t i=0; i<3;i++) fV0Indexes[i] = 0;
1081 // Reset TRD related track information
1086 for (Int_t i=0;i<kTRDnPlanes;i++) {
1089 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0;
1094 delete[] fTRDslices;
1099 // Reset TOF related track information
1103 fTOFCalChannel = -1;
1104 fTOFsignalToT = 99999;
1105 fTOFsignalRaw = 99999;
1110 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
1111 for (Int_t i=0;i<3;i++) fTOFLabel[i] = -1;
1112 for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
1114 // Reset HMPID related track information
1119 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i] = 0;
1126 fCaloIndex = kEMCALNoMatch;
1128 // reset global track chi2
1131 fVertexID = -2; // an orphan track
1133 delete fFriendTrack; fFriendTrack = 0;
1135 //_______________________________________________________________________
1136 Double_t AliESDtrack::GetMass() const {
1137 // Returns the mass of the most probable particle type
1140 for (i=0; i<AliPID::kSPECIES-1; i++) {
1141 if (fR[i] != fR[i+1]) break;
1143 // If all the probabilities are equal, return the pion mass
1144 if (i == AliPID::kSPECIES-1) return AliPID::ParticleMass(AliPID::kPion);
1148 for (i=0; i<AliPID::kSPECIES; i++) {
1149 if (fR[i]>max) {k=i; max=fR[i];}
1151 if (k==0) { // dE/dx "crossing points" in the TPC
1153 if ((p>0.38)&&(p<0.48))
1154 if (fR[0]<fR[3]*10.) return AliPID::ParticleMass(AliPID::kKaon);
1155 if ((p>0.75)&&(p<0.85))
1156 if (fR[0]<fR[4]*10.) return AliPID::ParticleMass(AliPID::kProton);
1159 if (k==1) return AliPID::ParticleMass(AliPID::kMuon);
1160 if (k==2||k==-1) return AliPID::ParticleMass(AliPID::kPion);
1161 if (k==3) return AliPID::ParticleMass(AliPID::kKaon);
1162 if (k==4) return AliPID::ParticleMass(AliPID::kProton);
1163 AliWarning("Undefined mass !");
1164 return AliPID::ParticleMass(AliPID::kPion);
1167 //______________________________________________________________________________
1168 Double_t AliESDtrack::M() const
1170 // Returns the assumed mass
1171 // (the pion mass, if the particle can't be identified properly).
1173 AliWarning("This is the ESD mass. Use it with care !");
1177 //______________________________________________________________________________
1178 Double_t AliESDtrack::E() const
1180 // Returns the energy of the particle given its assumed mass.
1181 // Assumes the pion mass if the particle can't be identified properly.
1185 return TMath::Sqrt(p*p + m*m);
1188 //______________________________________________________________________________
1189 Double_t AliESDtrack::Y() const
1191 // Returns the rapidity of a particle given its assumed mass.
1192 // Assumes the pion mass if the particle can't be identified properly.
1196 if (e != TMath::Abs(pz)) { // energy was not equal to pz
1197 return 0.5*TMath::Log((e+pz)/(e-pz));
1198 } else { // energy was equal to pz
1203 //_______________________________________________________________________
1204 Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
1206 // This function updates track's running parameters
1211 fLabel=t->GetLabel();
1213 if (t->IsStartedTimeIntegral()) {
1215 Double_t times[10];t->GetIntegratedTimes(times); SetIntegratedTimes(times);
1216 SetIntegratedLength(t->GetIntegratedLength());
1219 Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1220 if (flags==kITSout) fFriendTrack->SetITSOut(*t);
1221 if (flags==kTPCout) fFriendTrack->SetTPCOut(*t);
1222 if (flags==kTRDrefit) fFriendTrack->SetTRDIn(*t);
1226 case kITSin: case kITSout: case kITSrefit:
1229 fITSncls=t->GetNumberOfClusters();
1230 Int_t* indexITS = new Int_t[AliESDfriendTrack::kMaxITScluster];
1231 for (Int_t i=0;i<AliESDfriendTrack::kMaxITScluster;i++) {
1232 indexITS[i]=t->GetClusterIndex(i);
1235 Int_t l=(indexITS[i] & 0xf0000000) >> 28;
1236 SETBIT(fITSClusterMap,l);
1239 fFriendTrack->SetITSIndices(indexITS,AliESDfriendTrack::kMaxITScluster);
1242 fITSchi2=t->GetChi2();
1243 fITSsignal=t->GetPIDsignal();
1244 fITSLabel = t->GetLabel();
1245 // keep in fOp the parameters outside ITS for ITS stand-alone tracks
1246 if (flags==kITSout) {
1247 if (!fOp) fOp=new AliExternalTrackParam(*t);
1249 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1254 case kTPCin: case kTPCrefit:
1256 fTPCLabel = t->GetLabel();
1257 if (flags==kTPCin) {
1258 fTPCInner=new AliExternalTrackParam(*t);
1259 fTPCnclsIter1=t->GetNumberOfClusters();
1260 fTPCchi2Iter1=t->GetChi2();
1262 if (!fIp) fIp=new AliExternalTrackParam(*t);
1264 fIp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1268 Int_t* indexTPC = new Int_t[AliESDfriendTrack::kMaxTPCcluster];
1269 if (flags & kTPCout){
1270 if (!fOp) fOp=new AliExternalTrackParam(*t);
1272 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1274 fTPCncls=t->GetNumberOfClusters();
1275 fTPCchi2=t->GetChi2();
1277 {//prevrow must be declared in separate namespace, otherwise compiler cries:
1278 //"jump to case label crosses initialization of `Int_t prevrow'"
1280 // for (Int_t i=0;i<fTPCncls;i++)
1281 for (Int_t i=0;i<AliESDfriendTrack::kMaxTPCcluster;i++)
1283 indexTPC[i]=t->GetClusterIndex(i);
1284 Int_t idx = indexTPC[i];
1286 if (idx<0) continue;
1288 // Piotr's Cluster Map for HBT
1289 // ### please change accordingly if cluster array is changing
1290 // to "New TPC Tracking" style (with gaps in array)
1291 Int_t sect = (idx&0xff000000)>>24;
1292 Int_t row = (idx&0x00ff0000)>>16;
1293 if (sect > 18) row +=63; //if it is outer sector, add number of inner sectors
1295 fTPCClusterMap.SetBitNumber(row,kTRUE);
1297 //Fill the gap between previous row and this row with 0 bits
1298 //In case ### pleas change it as well - just set bit 0 in case there
1299 //is no associated clusters for current "i"
1302 prevrow = row;//if previous bit was not assigned yet == this is the first one
1305 { //we don't know the order (inner to outer or reverse)
1306 //just to be save in case it is going to change
1319 for (Int_t j = n+1; j < m; j++)
1321 fTPCClusterMap.SetBitNumber(j,kFALSE);
1325 // End Of Piotr's Cluster Map for HBT
1327 fFriendTrack->SetTPCIndices(indexTPC,AliESDfriendTrack::kMaxTPCcluster);
1331 fTPCsignal=t->GetPIDsignal();
1335 case kTRDin: case kTRDrefit:
1339 fTRDLabel = t->GetLabel();
1340 fTRDchi2 = t->GetChi2();
1341 fTRDncls = t->GetNumberOfClusters();
1342 Int_t* indexTRD = new Int_t[AliESDfriendTrack::kMaxTRDcluster];
1343 for (Int_t i=0;i<AliESDfriendTrack::kMaxTRDcluster;i++) indexTRD[i]=-2;
1344 for (Int_t i=0;i<6;i++) indexTRD[i]=t->GetTrackletIndex(i);
1345 fFriendTrack->SetTRDIndices(indexTRD,AliESDfriendTrack::kMaxTRDcluster);
1349 fTRDsignal=t->GetPIDsignal();
1353 if (!fOp) fOp=new AliExternalTrackParam(*t);
1355 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1356 fTRDncls0 = t->GetNumberOfClusters();
1365 if (!fHMPIDp) fHMPIDp=new AliExternalTrackParam(*t);
1367 fHMPIDp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1370 AliError("Wrong flag !");
1377 //_______________________________________________________________________
1378 void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
1379 //---------------------------------------------------------------------
1380 // This function returns external representation of the track parameters
1381 //---------------------------------------------------------------------
1383 for (Int_t i=0; i<5; i++) p[i]=GetParameter()[i];
1386 //_______________________________________________________________________
1387 void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
1388 //---------------------------------------------------------------------
1389 // This function returns external representation of the cov. matrix
1390 //---------------------------------------------------------------------
1391 for (Int_t i=0; i<15; i++) cov[i]=AliExternalTrackParam::GetCovariance()[i];
1394 //_______________________________________________________________________
1395 Bool_t AliESDtrack::GetConstrainedExternalParameters
1396 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1397 //---------------------------------------------------------------------
1398 // This function returns the constrained external track parameters
1399 //---------------------------------------------------------------------
1400 if (!fCp) return kFALSE;
1401 alpha=fCp->GetAlpha();
1403 for (Int_t i=0; i<5; i++) p[i]=fCp->GetParameter()[i];
1407 //_______________________________________________________________________
1409 AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
1410 //---------------------------------------------------------------------
1411 // This function returns the constrained external cov. matrix
1412 //---------------------------------------------------------------------
1413 if (!fCp) return kFALSE;
1414 for (Int_t i=0; i<15; i++) c[i]=fCp->GetCovariance()[i];
1419 AliESDtrack::GetInnerExternalParameters
1420 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1421 //---------------------------------------------------------------------
1422 // This function returns external representation of the track parameters
1423 // at the inner layer of TPC
1424 //---------------------------------------------------------------------
1425 if (!fIp) return kFALSE;
1426 alpha=fIp->GetAlpha();
1428 for (Int_t i=0; i<5; i++) p[i]=fIp->GetParameter()[i];
1433 AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
1434 //---------------------------------------------------------------------
1435 // This function returns external representation of the cov. matrix
1436 // at the inner layer of TPC
1437 //---------------------------------------------------------------------
1438 if (!fIp) return kFALSE;
1439 for (Int_t i=0; i<15; i++) cov[i]=fIp->GetCovariance()[i];
1444 AliESDtrack::SetOuterParam(const AliExternalTrackParam *p, ULong_t flags) {
1446 // This is a direct setter for the outer track parameters
1449 if (fOp) delete fOp;
1450 fOp=new AliExternalTrackParam(*p);
1454 AliESDtrack::SetOuterHmpParam(const AliExternalTrackParam *p, ULong_t flags) {
1456 // This is a direct setter for the outer track parameters
1459 if (fHMPIDp) delete fHMPIDp;
1460 fHMPIDp=new AliExternalTrackParam(*p);
1464 AliESDtrack::GetOuterExternalParameters
1465 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1466 //---------------------------------------------------------------------
1467 // This function returns external representation of the track parameters
1468 // at the inner layer of TRD
1469 //---------------------------------------------------------------------
1470 if (!fOp) return kFALSE;
1471 alpha=fOp->GetAlpha();
1473 for (Int_t i=0; i<5; i++) p[i]=fOp->GetParameter()[i];
1478 AliESDtrack::GetOuterHmpExternalParameters
1479 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1480 //---------------------------------------------------------------------
1481 // This function returns external representation of the track parameters
1482 // at the inner layer of TRD
1483 //---------------------------------------------------------------------
1484 if (!fHMPIDp) return kFALSE;
1485 alpha=fHMPIDp->GetAlpha();
1487 for (Int_t i=0; i<5; i++) p[i]=fHMPIDp->GetParameter()[i];
1492 AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
1493 //---------------------------------------------------------------------
1494 // This function returns external representation of the cov. matrix
1495 // at the inner layer of TRD
1496 //---------------------------------------------------------------------
1497 if (!fOp) return kFALSE;
1498 for (Int_t i=0; i<15; i++) cov[i]=fOp->GetCovariance()[i];
1503 AliESDtrack::GetOuterHmpExternalCovariance(Double_t cov[15]) const {
1504 //---------------------------------------------------------------------
1505 // This function returns external representation of the cov. matrix
1506 // at the inner layer of TRD
1507 //---------------------------------------------------------------------
1508 if (!fHMPIDp) return kFALSE;
1509 for (Int_t i=0; i<15; i++) cov[i]=fHMPIDp->GetCovariance()[i];
1513 Int_t AliESDtrack::GetNcls(Int_t idet) const
1515 // Get number of clusters by subdetector index
1529 if (fTOFindex != -1)
1535 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1536 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1547 Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
1549 // Get cluster index array by subdetector index
1554 ncls = GetITSclusters(idx);
1557 ncls = GetTPCclusters(idx);
1560 ncls = GetTRDclusters(idx);
1563 if (fTOFindex != -1) {
1571 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1572 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1573 idx[0] = GetHMPIDcluIdx();
1586 //_______________________________________________________________________
1587 void AliESDtrack::GetIntegratedTimes(Double_t *times) const {
1588 // Returns the array with integrated times for each particle hypothesis
1589 for (Int_t i=0; i<AliPID::kSPECIES; i++) times[i]=fTrackTime[i];
1592 //_______________________________________________________________________
1593 void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
1594 // Sets the array with integrated times for each particle hypotesis
1595 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTrackTime[i]=times[i];
1598 //_______________________________________________________________________
1599 void AliESDtrack::SetITSpid(const Double_t *p) {
1600 // Sets values for the probability of each particle type (in ITS)
1601 SetPIDValues(fITSr,p,AliPID::kSPECIES);
1602 SetStatus(AliESDtrack::kITSpid);
1605 //_______________________________________________________________________
1606 void AliESDtrack::GetITSpid(Double_t *p) const {
1607 // Gets the probability of each particle type (in ITS)
1608 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fITSr[i];
1611 //_______________________________________________________________________
1612 Char_t AliESDtrack::GetITSclusters(Int_t *idx) const {
1613 //---------------------------------------------------------------------
1614 // This function returns indices of the assgined ITS clusters
1615 //---------------------------------------------------------------------
1617 Int_t *index=fFriendTrack->GetITSindices();
1618 for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) {
1619 if ( (i>=fITSncls) && (i<6) ) idx[i]=-1;
1631 //_______________________________________________________________________
1632 Bool_t AliESDtrack::GetITSModuleIndexInfo(Int_t ilayer,Int_t &idet,Int_t &status,
1633 Float_t &xloc,Float_t &zloc) const {
1634 //----------------------------------------------------------------------
1635 // This function encodes in the module number also the status of cluster association
1636 // "status" can have the following values:
1637 // 1 "found" (cluster is associated),
1638 // 2 "dead" (module is dead from OCDB),
1639 // 3 "skipped" (module or layer forced to be skipped),
1640 // 4 "outinz" (track out of z acceptance),
1641 // 5 "nocls" (no clusters in the road),
1642 // 6 "norefit" (cluster rejected during refit),
1643 // 7 "deadzspd" (holes in z in SPD)
1644 // Also given are the coordinates of the crossing point of track and module
1645 // (in the local module ref. system)
1646 // WARNING: THIS METHOD HAS TO BE SYNCHRONIZED WITH AliITStrackV2::GetModuleIndexInfo()!
1647 //----------------------------------------------------------------------
1649 if(fITSModule[ilayer]==-1) {
1652 xloc=-99.; zloc=-99.;
1656 Int_t module = fITSModule[ilayer];
1658 idet = Int_t(module/1000000);
1660 module -= idet*1000000;
1662 status = Int_t(module/100000);
1664 module -= status*100000;
1666 Int_t signs = Int_t(module/10000);
1668 module-=signs*10000;
1670 Int_t xInt = Int_t(module/100);
1673 Int_t zInt = module;
1675 if(signs==1) { xInt*=1; zInt*=1; }
1676 if(signs==2) { xInt*=1; zInt*=-1; }
1677 if(signs==3) { xInt*=-1; zInt*=1; }
1678 if(signs==4) { xInt*=-1; zInt*=-1; }
1680 xloc = 0.1*(Float_t)xInt;
1681 zloc = 0.1*(Float_t)zInt;
1683 if(status==4) idet = -1;
1688 //_______________________________________________________________________
1689 UShort_t AliESDtrack::GetTPCclusters(Int_t *idx) const {
1690 //---------------------------------------------------------------------
1691 // This function returns indices of the assgined ITS clusters
1692 //---------------------------------------------------------------------
1694 Int_t *index=fFriendTrack->GetTPCindices();
1697 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=index[i];
1700 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=-2;
1706 //_______________________________________________________________________
1707 Float_t AliESDtrack::GetTPCClusterInfo(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1) const
1710 // TPC cluster information
1711 // type 0: get fraction of found/findable clusters with neighbourhood definition
1712 // 1: findable clusters with neighbourhood definition
1713 // 2: found clusters
1715 // definition of findable clusters:
1716 // a cluster is defined as findable if there is another cluster
1717 // within +- nNeighbours pad rows. The idea is to overcome threshold
1718 // effects with a very simple algorithm.
1721 if (type==2) return fTPCClusterMap.CountBits();
1725 Int_t last=-nNeighbours;
1727 for (Int_t i=row0; i<row1; ++i){
1728 //look to current row
1729 if (fTPCClusterMap[i]) {
1735 //look to nNeighbours before
1736 if ((i-last)<=nNeighbours) {
1740 //look to nNeighbours after
1741 for (Int_t j=i+1; j<i+1+nNeighbours; ++j){
1742 if (fTPCClusterMap[j]){
1748 if (type==1) return findable;
1753 fraction=(Float_t)found/(Float_t)findable;
1758 return 0; // undefined type - default value
1761 //_______________________________________________________________________
1762 Double_t AliESDtrack::GetTPCdensity(Int_t row0, Int_t row1) const{
1764 // GetDensity of the clusters on given region between row0 and row1
1765 // Dead zone effect takin into acoount
1770 Int_t *index=fFriendTrack->GetTPCindices();
1771 for (Int_t i=row0;i<=row1;i++){
1772 Int_t idx = index[i];
1773 if (idx!=-1) good++; // track outside of dead zone
1776 Float_t density=0.5;
1777 if (good>(row1-row0)*0.5) density = Float_t(found)/Float_t(good);
1781 //_______________________________________________________________________
1782 void AliESDtrack::SetTPCpid(const Double_t *p) {
1783 // Sets values for the probability of each particle type (in TPC)
1784 SetPIDValues(fTPCr,p,AliPID::kSPECIES);
1785 SetStatus(AliESDtrack::kTPCpid);
1788 //_______________________________________________________________________
1789 void AliESDtrack::GetTPCpid(Double_t *p) const {
1790 // Gets the probability of each particle type (in TPC)
1791 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTPCr[i];
1794 //_______________________________________________________________________
1795 UChar_t AliESDtrack::GetTRDclusters(Int_t *idx) const {
1796 //---------------------------------------------------------------------
1797 // This function returns indices of the assgined TRD clusters
1798 //---------------------------------------------------------------------
1800 Int_t *index=fFriendTrack->GetTRDindices();
1803 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=index[i];
1806 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=-2;
1812 //_______________________________________________________________________
1813 UChar_t AliESDtrack::GetTRDtracklets(Int_t *idx) const {
1815 // This function returns the number of TRD tracklets used in tracking
1816 // and it fills the indices of these tracklets in the array "idx" as they
1817 // are registered in the TRD track list.
1820 // 1. The idx array has to be allocated with a size >= AliESDtrack::kTRDnPlanes
1821 // 2. The idx array store not only the index but also the layer of the tracklet.
1822 // Therefore tracks with TRD gaps contain default values for indices [-1]
1824 if (!idx) return GetTRDntracklets();
1825 Int_t *index=fFriendTrack->GetTRDindices();
1827 for (Int_t i=0; i<kTRDnPlanes; i++){
1829 if(index[i]>=0) n++;
1837 //_______________________________________________________________________
1838 void AliESDtrack::SetTRDpid(const Double_t *p) {
1839 // Sets values for the probability of each particle type (in TRD)
1840 SetPIDValues(fTRDr,p,AliPID::kSPECIES);
1841 SetStatus(AliESDtrack::kTRDpid);
1844 //_______________________________________________________________________
1845 void AliESDtrack::GetTRDpid(Double_t *p) const {
1846 // Gets the probability of each particle type (in TRD)
1847 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTRDr[i];
1850 //_______________________________________________________________________
1851 void AliESDtrack::SetTRDpid(Int_t iSpecies, Float_t p)
1853 // Sets the probability of particle type iSpecies to p (in TRD)
1854 fTRDr[iSpecies] = p;
1857 Double_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
1859 // Returns the probability of particle type iSpecies (in TRD)
1860 return fTRDr[iSpecies];
1863 //____________________________________________________
1864 Int_t AliESDtrack::GetNumberOfTRDslices() const
1866 // built in backward compatibility
1867 Int_t idx = fTRDnSlices - (kTRDnPlanes<<1);
1868 return idx<18 ? fTRDnSlices/kTRDnPlanes : idx/kTRDnPlanes;
1871 //____________________________________________________
1872 Double_t AliESDtrack::GetTRDmomentum(Int_t plane, Double_t *sp) const
1874 //Returns momentum estimation and optional its error (sp)
1875 // in TRD layer "plane".
1878 AliDebug(2, "No TRD info allocated for this track.");
1881 if ((plane<0) || (plane>=kTRDnPlanes)) {
1882 AliWarning(Form("Request for TRD plane[%d] outside range.", plane));
1886 Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
1887 // Protection for backward compatibility
1888 if(idx<(GetNumberOfTRDslices()*kTRDnPlanes)) return -1.;
1890 if(sp) (*sp) = fTRDslices[idx+kTRDnPlanes];
1891 return fTRDslices[idx];
1894 //____________________________________________________
1895 Double_t AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
1896 //Gets the charge from the slice of the plane
1899 //AliError("No TRD slices allocated for this track !");
1902 if ((plane<0) || (plane>=kTRDnPlanes)) {
1903 AliError("Info for TRD plane not available !");
1906 Int_t ns=GetNumberOfTRDslices();
1907 if ((slice<-1) || (slice>=ns)) {
1908 //AliError("Wrong TRD slice !");
1912 if(slice>=0) return fTRDslices[plane*ns + slice];
1914 // return average of the dEdx measurements
1915 Double_t q=0.; Double32_t *s = &fTRDslices[plane*ns];
1916 for (Int_t i=0; i<ns; i++, s++) if((*s)>0.) q+=(*s);
1920 //____________________________________________________
1921 void AliESDtrack::SetNumberOfTRDslices(Int_t n) {
1922 //Sets the number of slices used for PID
1923 if (fTRDnSlices) return;
1926 fTRDslices=new Double32_t[fTRDnSlices];
1928 // set-up correctly the allocated memory
1929 memset(fTRDslices, 0, n*sizeof(Double32_t));
1930 for (Int_t i=GetNumberOfTRDslices(); i--;) fTRDslices[i]=-1.;
1933 //____________________________________________________
1934 void AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
1935 //Sets the charge q in the slice of the plane
1937 AliError("No TRD slices allocated for this track !");
1940 if ((plane<0) || (plane>=kTRDnPlanes)) {
1941 AliError("Info for TRD plane not allocated !");
1944 Int_t ns=GetNumberOfTRDslices();
1945 if ((slice<0) || (slice>=ns)) {
1946 AliError("Wrong TRD slice !");
1949 Int_t n=plane*ns + slice;
1954 //____________________________________________________
1955 void AliESDtrack::SetTRDmomentum(Double_t p, Int_t plane, Double_t *sp)
1958 AliError("No TRD slices allocated for this track !");
1961 if ((plane<0) || (plane>=kTRDnPlanes)) {
1962 AliError("Info for TRD plane not allocated !");
1966 Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
1967 // Protection for backward compatibility
1968 if(idx<GetNumberOfTRDslices()*kTRDnPlanes) return;
1970 if(sp) fTRDslices[idx+kTRDnPlanes] = (*sp);
1971 fTRDslices[idx] = p;
1975 //_______________________________________________________________________
1976 void AliESDtrack::SetTOFpid(const Double_t *p) {
1977 // Sets the probability of each particle type (in TOF)
1978 SetPIDValues(fTOFr,p,AliPID::kSPECIES);
1979 SetStatus(AliESDtrack::kTOFpid);
1982 //_______________________________________________________________________
1983 void AliESDtrack::SetTOFLabel(const Int_t *p) {
1985 for (Int_t i=0; i<3; i++) fTOFLabel[i]=p[i];
1988 //_______________________________________________________________________
1989 void AliESDtrack::GetTOFpid(Double_t *p) const {
1990 // Gets probabilities of each particle type (in TOF)
1991 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTOFr[i];
1994 //_______________________________________________________________________
1995 void AliESDtrack::GetTOFLabel(Int_t *p) const {
1997 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
2000 //_______________________________________________________________________
2001 void AliESDtrack::GetTOFInfo(Float_t *info) const {
2003 for (Int_t i=0; i<10; i++) info[i]=fTOFInfo[i];
2006 //_______________________________________________________________________
2007 void AliESDtrack::SetTOFInfo(Float_t*info) {
2009 for (Int_t i=0; i<10; i++) fTOFInfo[i]=info[i];
2014 //_______________________________________________________________________
2015 void AliESDtrack::SetHMPIDpid(const Double_t *p) {
2016 // Sets the probability of each particle type (in HMPID)
2017 SetPIDValues(fHMPIDr,p,AliPID::kSPECIES);
2018 SetStatus(AliESDtrack::kHMPIDpid);
2021 //_______________________________________________________________________
2022 void AliESDtrack::GetHMPIDpid(Double_t *p) const {
2023 // Gets probabilities of each particle type (in HMPID)
2024 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fHMPIDr[i];
2029 //_______________________________________________________________________
2030 void AliESDtrack::SetESDpid(const Double_t *p) {
2031 // Sets the probability of each particle type for the ESD track
2032 SetPIDValues(fR,p,AliPID::kSPECIES);
2033 SetStatus(AliESDtrack::kESDpid);
2036 //_______________________________________________________________________
2037 void AliESDtrack::GetESDpid(Double_t *p) const {
2038 // Gets probability of each particle type for the ESD track
2039 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
2042 //_______________________________________________________________________
2043 Bool_t AliESDtrack::RelateToVertexTPC(const AliESDVertex *vtx,
2044 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
2046 // Try to relate the TPC-only track parameters to the vertex "vtx",
2047 // if the (rough) transverse impact parameter is not bigger then "maxd".
2048 // Magnetic field is "b" (kG).
2050 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
2051 // b) The impact parameters and their covariance matrix are calculated.
2052 // c) An attempt to constrain the TPC-only params to the vertex is done.
2053 // The constrained params are returned via "cParam".
2055 // In the case of success, the returned value is kTRUE
2056 // otherwise, it's kFALSE)
2059 if (!fTPCInner) return kFALSE;
2060 if (!vtx) return kFALSE;
2062 Double_t dz[2],cov[3];
2063 if (!fTPCInner->PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
2071 Double_t covar[6]; vtx->GetCovMatrix(covar);
2072 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2073 Double_t c[3]={covar[2],0.,covar[5]};
2075 Double_t chi2=GetPredictedChi2(p,c);
2076 if (chi2>kVeryBig) return kFALSE;
2080 if (!cParam) return kTRUE;
2082 *cParam = *fTPCInner;
2083 if (!cParam->Update(p,c)) return kFALSE;
2088 //_______________________________________________________________________
2089 Bool_t AliESDtrack::RelateToVertexTPCBxByBz(const AliESDVertex *vtx,
2090 Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
2092 // Try to relate the TPC-only track parameters to the vertex "vtx",
2093 // if the (rough) transverse impact parameter is not bigger then "maxd".
2095 // All three components of the magnetic field ,"b[3]" (kG),
2096 // are taken into account.
2098 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
2099 // b) The impact parameters and their covariance matrix are calculated.
2100 // c) An attempt to constrain the TPC-only params to the vertex is done.
2101 // The constrained params are returned via "cParam".
2103 // In the case of success, the returned value is kTRUE
2104 // otherwise, it's kFALSE)
2107 if (!fTPCInner) return kFALSE;
2108 if (!vtx) return kFALSE;
2110 Double_t dz[2],cov[3];
2111 if (!fTPCInner->PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
2119 Double_t covar[6]; vtx->GetCovMatrix(covar);
2120 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2121 Double_t c[3]={covar[2],0.,covar[5]};
2123 Double_t chi2=GetPredictedChi2(p,c);
2124 if (chi2>kVeryBig) return kFALSE;
2128 if (!cParam) return kTRUE;
2130 *cParam = *fTPCInner;
2131 if (!cParam->Update(p,c)) return kFALSE;
2136 //_______________________________________________________________________
2137 Bool_t AliESDtrack::RelateToVertex(const AliESDVertex *vtx,
2138 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
2140 // Try to relate this track to the vertex "vtx",
2141 // if the (rough) transverse impact parameter is not bigger then "maxd".
2142 // Magnetic field is "b" (kG).
2144 // a) The track gets extapolated to the DCA to the vertex.
2145 // b) The impact parameters and their covariance matrix are calculated.
2146 // c) An attempt to constrain this track to the vertex is done.
2147 // The constrained params are returned via "cParam".
2149 // In the case of success, the returned value is kTRUE
2150 // (otherwise, it's kFALSE)
2153 if (!vtx) return kFALSE;
2155 Double_t dz[2],cov[3];
2156 if (!PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
2164 Double_t covar[6]; vtx->GetCovMatrix(covar);
2165 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2166 Double_t c[3]={covar[2],0.,covar[5]};
2168 Double_t chi2=GetPredictedChi2(p,c);
2169 if (chi2>kVeryBig) return kFALSE;
2174 //--- Could now these lines be removed ? ---
2176 fCp=new AliExternalTrackParam(*this);
2178 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
2179 //----------------------------------------
2181 fVertexID = vtx->GetID();
2183 if (!cParam) return kTRUE;
2186 if (!cParam->Update(p,c)) return kFALSE;
2191 //_______________________________________________________________________
2192 Bool_t AliESDtrack::RelateToVertexBxByBz(const AliESDVertex *vtx,
2193 Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
2195 // Try to relate this track to the vertex "vtx",
2196 // if the (rough) transverse impact parameter is not bigger then "maxd".
2197 // Magnetic field is "b" (kG).
2199 // a) The track gets extapolated to the DCA to the vertex.
2200 // b) The impact parameters and their covariance matrix are calculated.
2201 // c) An attempt to constrain this track to the vertex is done.
2202 // The constrained params are returned via "cParam".
2204 // In the case of success, the returned value is kTRUE
2205 // (otherwise, it's kFALSE)
2208 if (!vtx) return kFALSE;
2210 Double_t dz[2],cov[3];
2211 if (!PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
2219 Double_t covar[6]; vtx->GetCovMatrix(covar);
2220 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2221 Double_t c[3]={covar[2],0.,covar[5]};
2223 Double_t chi2=GetPredictedChi2(p,c);
2224 if (chi2>kVeryBig) return kFALSE;
2229 //--- Could now these lines be removed ? ---
2231 fCp=new AliExternalTrackParam(*this);
2233 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
2234 //----------------------------------------
2236 fVertexID = vtx->GetID();
2238 if (!cParam) return kTRUE;
2241 if (!cParam->Update(p,c)) return kFALSE;
2246 //_______________________________________________________________________
2247 void AliESDtrack::Print(Option_t *) const {
2248 // Prints info on the track
2249 AliExternalTrackParam::Print();
2250 printf("ESD track info\n") ;
2251 Double_t p[AliPID::kSPECIESN] ;
2253 if( IsOn(kITSpid) ){
2254 printf("From ITS: ") ;
2256 for(index = 0 ; index < AliPID::kSPECIES; index++)
2257 printf("%f, ", p[index]) ;
2258 printf("\n signal = %f\n", GetITSsignal()) ;
2260 if( IsOn(kTPCpid) ){
2261 printf("From TPC: ") ;
2263 for(index = 0 ; index < AliPID::kSPECIES; index++)
2264 printf("%f, ", p[index]) ;
2265 printf("\n signal = %f\n", GetTPCsignal()) ;
2267 if( IsOn(kTRDpid) ){
2268 printf("From TRD: ") ;
2270 for(index = 0 ; index < AliPID::kSPECIES; index++)
2271 printf("%f, ", p[index]) ;
2272 printf("\n signal = %f\n", GetTRDsignal()) ;
2274 if( IsOn(kTOFpid) ){
2275 printf("From TOF: ") ;
2277 for(index = 0 ; index < AliPID::kSPECIES; index++)
2278 printf("%f, ", p[index]) ;
2279 printf("\n signal = %f\n", GetTOFsignal()) ;
2281 if( IsOn(kHMPIDpid) ){
2282 printf("From HMPID: ") ;
2284 for(index = 0 ; index < AliPID::kSPECIES; index++)
2285 printf("%f, ", p[index]) ;
2286 printf("\n signal = %f\n", GetHMPIDsignal()) ;
2292 // Draw functionality
2293 // Origin: Marian Ivanov, Marian.Ivanov@cern.ch
2295 void AliESDtrack::FillPolymarker(TPolyMarker3D *pol, Float_t magF, Float_t minR, Float_t maxR, Float_t stepR){
2297 // Fill points in the polymarker
2300 arrayRef.AddLast(new AliExternalTrackParam(*this));
2301 if (fIp) arrayRef.AddLast(new AliExternalTrackParam(*fIp));
2302 if (fOp) arrayRef.AddLast(new AliExternalTrackParam(*fOp));
2303 if (fHMPIDp) arrayRef.AddLast(new AliExternalTrackParam(*fHMPIDp));
2305 Double_t mpos[3]={0,0,0};
2306 Int_t entries=arrayRef.GetEntries();
2307 for (Int_t i=0;i<entries;i++){
2309 ((AliExternalTrackParam*)arrayRef.At(i))->GetXYZ(pos);
2310 mpos[0]+=pos[0]/entries;
2311 mpos[1]+=pos[1]/entries;
2312 mpos[2]+=pos[2]/entries;
2314 // Rotate to the mean position
2316 Float_t fi= TMath::ATan2(mpos[1],mpos[0]);
2317 for (Int_t i=0;i<entries;i++){
2318 Bool_t res = ((AliExternalTrackParam*)arrayRef.At(i))->Rotate(fi);
2319 if (!res) delete arrayRef.RemoveAt(i);
2322 for (Double_t r=minR; r<maxR; r+=stepR){
2324 Double_t mlpos[3]={0,0,0};
2325 for (Int_t i=0;i<entries;i++){
2326 Double_t point[3]={0,0,0};
2327 AliExternalTrackParam *param = ((AliExternalTrackParam*)arrayRef.At(i));
2328 if (!param) continue;
2329 if (param->GetXYZAt(r,magF,point)){
2330 Double_t weight = 1./(10.+(r-param->GetX())*(r-param->GetX()));
2332 mlpos[0]+=point[0]*weight;
2333 mlpos[1]+=point[1]*weight;
2334 mlpos[2]+=point[2]*weight;
2341 pol->SetPoint(counter,mlpos[0],mlpos[1], mlpos[2]);
2342 printf("xyz\t%f\t%f\t%f\n",mlpos[0], mlpos[1],mlpos[2]);
2348 //_______________________________________________________________________
2349 void AliESDtrack::SetITSdEdxSamples(const Double_t s[4]) {
2351 // Store the dE/dx samples measured by the two SSD and two SDD layers.
2352 // These samples are corrected for the track segment length.
2354 for (Int_t i=0; i<4; i++) fITSdEdxSamples[i]=s[i];
2357 //_______________________________________________________________________
2358 void AliESDtrack::GetITSdEdxSamples(Double_t *s) const {
2360 // Get the dE/dx samples measured by the two SSD and two SDD layers.
2361 // These samples are corrected for the track segment length.
2363 for (Int_t i=0; i<4; i++) s[i]=fITSdEdxSamples[i];
2367 UShort_t AliESDtrack::GetTPCnclsS(Int_t i0,Int_t i1) const{
2369 // get number of shared TPC clusters
2371 return fTPCSharedMap.CountBits(i0)-fTPCSharedMap.CountBits(i1);
2374 UShort_t AliESDtrack::GetTPCncls(Int_t i0,Int_t i1) const{
2376 // get number of TPC clusters
2378 return fTPCClusterMap.CountBits(i0)-fTPCClusterMap.CountBits(i1);