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(),
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
235 if (!OnlineMode()) fFriendTrack=new AliESDfriendTrack();
238 for (i=0; i<AliPID::kSPECIES; i++) {
248 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
249 for (i=0; i<3; i++) { fV0Indexes[i]=0;}
250 for (i=0;i<kTRDnPlanes;i++) {
253 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
254 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
255 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
256 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
257 for (i=0;i<12;i++) {fITSModule[i]=-1;}
260 bool AliESDtrack::fgkOnlineMode=false;
262 //_______________________________________________________________________
263 AliESDtrack::AliESDtrack(const AliESDtrack& track):
264 AliExternalTrackParam(track),
271 fTPCClusterMap(track.fTPCClusterMap),
272 fTPCSharedMap(track.fTPCSharedMap),
273 fFlags(track.fFlags),
275 fLabel(track.fLabel),
276 fITSLabel(track.fITSLabel),
277 fTPCLabel(track.fTPCLabel),
278 fTRDLabel(track.fTRDLabel),
279 fTOFCalChannel(track.fTOFCalChannel),
280 fTOFindex(track.fTOFindex),
281 fHMPIDqn(track.fHMPIDqn),
282 fHMPIDcluIdx(track.fHMPIDcluIdx),
283 fCaloIndex(track.fCaloIndex),
284 fHMPIDtrkTheta(track.fHMPIDtrkTheta),
285 fHMPIDtrkPhi(track.fHMPIDtrkPhi),
286 fHMPIDsignal(track.fHMPIDsignal),
287 fTrackLength(track.fTrackLength),
288 fdTPC(track.fdTPC),fzTPC(track.fzTPC),
289 fCddTPC(track.fCddTPC),fCdzTPC(track.fCdzTPC),fCzzTPC(track.fCzzTPC),
290 fCchi2TPC(track.fCchi2TPC),
291 fD(track.fD),fZ(track.fZ),
292 fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
293 fCchi2(track.fCchi2),
294 fITSchi2(track.fITSchi2),
295 fTPCchi2(track.fTPCchi2),
296 fTPCchi2Iter1(track.fTPCchi2Iter1),
297 fTRDchi2(track.fTRDchi2),
298 fTOFchi2(track.fTOFchi2),
299 fHMPIDchi2(track.fHMPIDchi2),
300 fGlobalChi2(track.fGlobalChi2),
301 fITSsignal(track.fITSsignal),
302 fTPCsignal(track.fTPCsignal),
303 fTPCsignalS(track.fTPCsignalS),
304 fTRDsignal(track.fTRDsignal),
305 fTRDQuality(track.fTRDQuality),
306 fTRDBudget(track.fTRDBudget),
307 fTOFsignal(track.fTOFsignal),
308 fTOFsignalToT(track.fTOFsignalToT),
309 fTOFsignalRaw(track.fTOFsignalRaw),
310 fTOFsignalDz(track.fTOFsignalDz),
311 fTOFsignalDx(track.fTOFsignalDx),
312 fTOFdeltaBC(track.fTOFdeltaBC),
313 fTOFl0l1(track.fTOFl0l1),
314 fCaloDx(track.fCaloDx),
315 fCaloDz(track.fCaloDz),
316 fHMPIDtrkX(track.fHMPIDtrkX),
317 fHMPIDtrkY(track.fHMPIDtrkY),
318 fHMPIDmipX(track.fHMPIDmipX),
319 fHMPIDmipY(track.fHMPIDmipY),
320 fTPCncls(track.fTPCncls),
321 fTPCnclsF(track.fTPCnclsF),
322 fTPCsignalN(track.fTPCsignalN),
323 fTPCnclsIter1(track.fTPCnclsIter1),
324 fTPCnclsFIter1(track.fTPCnclsIter1),
325 fITSncls(track.fITSncls),
326 fITSClusterMap(track.fITSClusterMap),
327 fITSSharedMap(track.fITSSharedMap),
328 fTRDncls(track.fTRDncls),
329 fTRDncls0(track.fTRDncls0),
330 fTRDntracklets(track.fTRDntracklets),
331 fTRDnSlices(track.fTRDnSlices),
333 fVertexID(track.fVertexID),
334 fESDEvent(track.fESDEvent)
339 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i]=track.fTrackTime[i];
340 for (Int_t i=0;i<AliPID::kSPECIES;i++) fR[i]=track.fR[i];
342 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=track.fITSr[i];
344 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=track.fTPCr[i];
345 for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=track.fITSdEdxSamples[i];}
346 for (Int_t i=0;i<4;i++) {fTPCPoints[i]=track.fTPCPoints[i];}
347 for (Int_t i=0; i<3;i++) { fKinkIndexes[i]=track.fKinkIndexes[i];}
348 for (Int_t i=0; i<3;i++) { fV0Indexes[i]=track.fV0Indexes[i];}
350 for (Int_t i=0;i<kTRDnPlanes;i++) {
351 fTRDTimBin[i]=track.fTRDTimBin[i];
355 fTRDslices=new Double32_t[fTRDnSlices];
356 for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=track.fTRDslices[i];
359 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i]=track.fTRDr[i];
360 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i]=track.fTOFr[i];
361 for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
362 for (Int_t i=0;i<10;i++) fTOFInfo[i]=track.fTOFInfo[i];
363 for (Int_t i=0;i<12;i++) fITSModule[i]=track.fITSModule[i];
364 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i]=track.fHMPIDr[i];
366 if (track.fCp) fCp=new AliExternalTrackParam(*track.fCp);
367 if (track.fIp) fIp=new AliExternalTrackParam(*track.fIp);
368 if (track.fTPCInner) fTPCInner=new AliExternalTrackParam(*track.fTPCInner);
369 if (track.fOp) fOp=new AliExternalTrackParam(*track.fOp);
370 if (track.fHMPIDp) fHMPIDp=new AliExternalTrackParam(*track.fHMPIDp);
372 if (track.fFriendTrack) fFriendTrack=new AliESDfriendTrack(*(track.fFriendTrack));
375 //_______________________________________________________________________
376 AliESDtrack::AliESDtrack(const AliVTrack *track) :
377 AliExternalTrackParam(track),
384 fTPCClusterMap(159),//number of padrows
385 fTPCSharedMap(159),//number of padrows
396 fCaloIndex(kEMCALNoMatch),
402 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
405 fCdd(0),fCdz(0),fCzz(0),
421 fTOFsignalToT(99999),
422 fTOFsignalRaw(99999),
446 fVertexID(-2), // -2 means an orphan track
450 // ESD track from AliVTrack.
451 // This is not a copy constructor !
454 if (track->InheritsFrom("AliExternalTrackParam")) {
455 AliError("This is not a copy constructor. Use AliESDtrack(const AliESDtrack &) !");
456 AliWarning("Calling the default constructor...");
461 // Reset all the arrays
463 for (i=0; i<AliPID::kSPECIES; i++) {
473 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
474 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
475 for (i=0;i<kTRDnPlanes;i++) {
478 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
479 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
480 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
481 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
482 for (i=0;i<12;i++) {fITSModule[i]=-1;}
485 SetID(track->GetID());
487 // Set ITS cluster map
488 fITSClusterMap=track->GetITSClusterMap();
493 if(HasPointOnITSLayer(i)) fITSncls++;
497 fTPCncls=track->GetTPCNcls();
500 // Set the combined PID
501 const Double_t *pid = track->PID();
503 for (i=0; i<AliPID::kSPECIES; i++) fR[i]=pid[i];
505 // AliESD track label
506 SetLabel(track->GetLabel());
508 SetStatus(track->GetStatus());
511 //_______________________________________________________________________
512 AliESDtrack::AliESDtrack(TParticle * part) :
513 AliExternalTrackParam(),
520 fTPCClusterMap(159),//number of padrows
521 fTPCSharedMap(159),//number of padrows
532 fCaloIndex(kEMCALNoMatch),
538 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
541 fCdd(0),fCdz(0),fCzz(0),
557 fTOFsignalToT(99999),
558 fTOFsignalRaw(99999),
582 fVertexID(-2), // -2 means an orphan track
586 // ESD track from TParticle
589 // Reset all the arrays
591 for (i=0; i<AliPID::kSPECIES; i++) {
601 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
602 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
603 for (i=0;i<kTRDnPlanes;i++) {
606 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
607 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
608 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
609 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
610 for (i=0;i<12;i++) {fITSModule[i]=-1;}
612 // Calculate the AliExternalTrackParam content
619 // Calculate alpha: the rotation angle of the corresponding local system (TPC sector)
620 alpha = part->Phi()*180./TMath::Pi();
621 if (alpha<0) alpha+= 360.;
622 if (alpha>360) alpha -= 360.;
624 Int_t sector = (Int_t)(alpha/20.);
625 alpha = 10. + 20.*sector;
627 alpha *= TMath::Pi();
629 // Covariance matrix: no errors, the parameters are exact
630 for (i=0; i<15; i++) covar[i]=0.;
632 // Get the vertex of origin and the momentum
633 TVector3 ver(part->Vx(),part->Vy(),part->Vz());
634 TVector3 mom(part->Px(),part->Py(),part->Pz());
636 // Rotate to the local coordinate system (TPC sector)
640 // X of the referense plane
643 Int_t pdgCode = part->GetPdgCode();
646 TDatabasePDG::Instance()->GetParticle(pdgCode)->Charge();
650 param[2] = TMath::Sin(mom.Phi());
651 param[3] = mom.Pz()/mom.Pt();
652 param[4] = TMath::Sign(1/mom.Pt(),charge);
654 // Set AliExternalTrackParam
655 Set(xref, alpha, param, covar);
660 switch (TMath::Abs(pdgCode)) {
686 // If the particle is not e,mu,pi,K or p the PID probabilities are set to 0
687 if (indexPID < AliPID::kSPECIES) {
693 fHMPIDr[indexPID]=1.;
696 // AliESD track label
697 SetLabel(part->GetUniqueID());
701 //_______________________________________________________________________
702 AliESDtrack::~AliESDtrack(){
704 // This is destructor according Coding Conventrions
706 //printf("Delete track\n");
712 if (fFriendTrack) delete fFriendTrack;
718 AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
721 if(&source == this) return *this;
722 AliExternalTrackParam::operator=(source);
726 // we have the trackparam: assign or copy construct
727 if(fCp)*fCp = *source.fCp;
728 else fCp = new AliExternalTrackParam(*source.fCp);
731 // no track param delete the old one
737 // we have the trackparam: assign or copy construct
738 if(fIp)*fIp = *source.fIp;
739 else fIp = new AliExternalTrackParam(*source.fIp);
742 // no track param delete the old one
748 if(source.fTPCInner){
749 // we have the trackparam: assign or copy construct
750 if(fTPCInner) *fTPCInner = *source.fTPCInner;
751 else fTPCInner = new AliExternalTrackParam(*source.fTPCInner);
754 // no track param delete the old one
755 if(fTPCInner)delete fTPCInner;
761 // we have the trackparam: assign or copy construct
762 if(fOp) *fOp = *source.fOp;
763 else fOp = new AliExternalTrackParam(*source.fOp);
766 // no track param delete the old one
773 // we have the trackparam: assign or copy construct
774 if(fHMPIDp) *fHMPIDp = *source.fHMPIDp;
775 else fHMPIDp = new AliExternalTrackParam(*source.fHMPIDp);
778 // no track param delete the old one
779 if(fHMPIDp)delete fHMPIDp;
784 // copy also the friend track
785 // use copy constructor
786 if(source.fFriendTrack){
787 // we have the trackparam: assign or copy construct
788 delete fFriendTrack; fFriendTrack=new AliESDfriendTrack(*source.fFriendTrack);
791 // no track param delete the old one
792 delete fFriendTrack; fFriendTrack= 0;
795 fTPCClusterMap = source.fTPCClusterMap;
796 fTPCSharedMap = source.fTPCSharedMap;
798 fFlags = source.fFlags;
800 fLabel = source.fLabel;
801 fITSLabel = source.fITSLabel;
802 for(int i = 0; i< 12;++i){
803 fITSModule[i] = source.fITSModule[i];
805 fTPCLabel = source.fTPCLabel;
806 fTRDLabel = source.fTRDLabel;
807 for(int i = 0; i< 3;++i){
808 fTOFLabel[i] = source.fTOFLabel[i];
810 fTOFCalChannel = source.fTOFCalChannel;
811 fTOFindex = source.fTOFindex;
812 fHMPIDqn = source.fHMPIDqn;
813 fHMPIDcluIdx = source.fHMPIDcluIdx;
814 fCaloIndex = source.fCaloIndex;
816 for(int i = 0; i< 3;++i){
817 fKinkIndexes[i] = source.fKinkIndexes[i];
818 fV0Indexes[i] = source.fV0Indexes[i];
821 for(int i = 0; i< AliPID::kSPECIES;++i){
822 fR[i] = source.fR[i];
823 fITSr[i] = source.fITSr[i];
824 fTPCr[i] = source.fTPCr[i];
825 fTRDr[i] = source.fTRDr[i];
826 fTOFr[i] = source.fTOFr[i];
827 fHMPIDr[i] = source.fHMPIDr[i];
828 fTrackTime[i] = source.fTrackTime[i];
831 fHMPIDtrkTheta = source.fHMPIDtrkTheta;
832 fHMPIDtrkPhi = source.fHMPIDtrkPhi;
833 fHMPIDsignal = source.fHMPIDsignal;
836 fTrackLength = source. fTrackLength;
837 fdTPC = source.fdTPC;
838 fzTPC = source.fzTPC;
839 fCddTPC = source.fCddTPC;
840 fCdzTPC = source.fCdzTPC;
841 fCzzTPC = source.fCzzTPC;
842 fCchi2TPC = source.fCchi2TPC;
849 fCchi2 = source.fCchi2;
851 fITSchi2 = source.fITSchi2;
852 fTPCchi2 = source.fTPCchi2;
853 fTPCchi2Iter1 = source.fTPCchi2Iter1;
854 fTRDchi2 = source.fTRDchi2;
855 fTOFchi2 = source.fTOFchi2;
856 fHMPIDchi2 = source.fHMPIDchi2;
858 fGlobalChi2 = source.fGlobalChi2;
860 fITSsignal = source.fITSsignal;
861 for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=source.fITSdEdxSamples[i];}
862 fTPCsignal = source.fTPCsignal;
863 fTPCsignalS = source.fTPCsignalS;
864 for(int i = 0; i< 4;++i){
865 fTPCPoints[i] = source.fTPCPoints[i];
867 fTRDsignal = source.fTRDsignal;
869 for(int i = 0;i < kTRDnPlanes;++i){
870 fTRDTimBin[i] = source.fTRDTimBin[i];
876 fTRDnSlices=source.fTRDnSlices;
878 fTRDslices=new Double32_t[fTRDnSlices];
879 for(int j = 0;j < fTRDnSlices;++j) fTRDslices[j] = source.fTRDslices[j];
882 fTRDQuality = source.fTRDQuality;
883 fTRDBudget = source.fTRDBudget;
884 fTOFsignal = source.fTOFsignal;
885 fTOFsignalToT = source.fTOFsignalToT;
886 fTOFsignalRaw = source.fTOFsignalRaw;
887 fTOFsignalDz = source.fTOFsignalDz;
888 fTOFsignalDx = source.fTOFsignalDx;
889 fTOFdeltaBC = source.fTOFdeltaBC;
890 fTOFl0l1 = source.fTOFl0l1;
892 for(int i = 0;i<10;++i){
893 fTOFInfo[i] = source.fTOFInfo[i];
896 fHMPIDtrkX = source.fHMPIDtrkX;
897 fHMPIDtrkY = source.fHMPIDtrkY;
898 fHMPIDmipX = source.fHMPIDmipX;
899 fHMPIDmipY = source.fHMPIDmipY;
901 fTPCncls = source.fTPCncls;
902 fTPCnclsF = source.fTPCnclsF;
903 fTPCsignalN = source.fTPCsignalN;
904 fTPCnclsIter1 = source.fTPCnclsIter1;
905 fTPCnclsFIter1 = source.fTPCnclsFIter1;
907 fITSncls = source.fITSncls;
908 fITSClusterMap = source.fITSClusterMap;
909 fITSSharedMap = source.fITSSharedMap;
910 fTRDncls = source.fTRDncls;
911 fTRDncls0 = source.fTRDncls0;
912 fTRDntracklets = source.fTRDntracklets;
913 fVertexID = source.fVertexID;
919 void AliESDtrack::Copy(TObject &obj) const {
921 // this overwrites the virtual TOBject::Copy()
922 // to allow run time copying without casting
925 if(this==&obj)return;
926 AliESDtrack *robj = dynamic_cast<AliESDtrack*>(&obj);
927 if(!robj)return; // not an AliESDtrack
934 void AliESDtrack::AddCalibObject(TObject * object){
936 // add calib object to the list
938 if (!fFriendTrack) fFriendTrack = new AliESDfriendTrack;
939 if (!fFriendTrack) return;
940 fFriendTrack->AddCalibObject(object);
943 TObject * AliESDtrack::GetCalibObject(Int_t index){
945 // return calib objct at given position
947 if (!fFriendTrack) return 0;
948 return fFriendTrack->GetCalibObject(index);
952 Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
954 // Fills the information of the TPC-only first reconstruction pass
955 // into the passed ESDtrack object. For consistency fTPCInner is also filled
960 // For data produced before r26675
961 // RelateToVertexTPC was not properly called during reco
962 // so you'll have to call it again, before FillTPCOnlyTrack
963 // Float_t p[2],cov[3];
964 // track->GetImpactParametersTPC(p,cov);
965 // if(p[0]==0&&p[1]==0) // <- Default values
966 // track->RelateToVertexTPC(esd->GetPrimaryVertexTPC(),esd->GetMagneticField(),kVeryBig);
969 if(!fTPCInner)return kFALSE;
971 // fill the TPC track params to the global track parameters
972 track.Set(fTPCInner->GetX(),fTPCInner->GetAlpha(),fTPCInner->GetParameter(),fTPCInner->GetCovariance());
975 track.fCdd = fCddTPC;
976 track.fCdz = fCdzTPC;
977 track.fCzz = fCzzTPC;
979 // copy the inner params
980 if(track.fIp) *track.fIp = *fIp;
981 else track.fIp = new AliExternalTrackParam(*fIp);
983 // copy the TPCinner parameters
984 if(track.fTPCInner) *track.fTPCInner = *fTPCInner;
985 else track.fTPCInner = new AliExternalTrackParam(*fTPCInner);
988 track.fCddTPC = fCddTPC;
989 track.fCdzTPC = fCdzTPC;
990 track.fCzzTPC = fCzzTPC;
991 track.fCchi2TPC = fCchi2TPC;
993 // copy all other TPC specific parameters
995 // replace label by TPC label
996 track.fLabel = fTPCLabel;
997 track.fTPCLabel = fTPCLabel;
999 track.fTPCchi2 = fTPCchi2;
1000 track.fTPCchi2Iter1 = fTPCchi2Iter1;
1001 track.fTPCsignal = fTPCsignal;
1002 track.fTPCsignalS = fTPCsignalS;
1003 for(int i = 0;i<4;++i)track.fTPCPoints[i] = fTPCPoints[i];
1005 track.fTPCncls = fTPCncls;
1006 track.fTPCnclsF = fTPCnclsF;
1007 track.fTPCsignalN = fTPCsignalN;
1008 track.fTPCnclsIter1 = fTPCnclsIter1;
1009 track.fTPCnclsFIter1 = fTPCnclsFIter1;
1012 for(int i=0;i<AliPID::kSPECIES;++i){
1013 track.fTPCr[i] = fTPCr[i];
1014 // combined PID is TPC only!
1015 track.fR[i] = fTPCr[i];
1017 track.fTPCClusterMap = fTPCClusterMap;
1018 track.fTPCSharedMap = fTPCSharedMap;
1022 track.fFlags = kTPCin;
1025 track.fFlags |= fFlags & kTPCpid; //copy the TPCpid status flag
1027 for (Int_t i=0;i<3;i++) track.fKinkIndexes[i] = fKinkIndexes[i];
1033 //_______________________________________________________________________
1034 void AliESDtrack::MakeMiniESDtrack(){
1035 // Resets everything except
1036 // fFlags: Reconstruction status flags
1037 // fLabel: Track label
1038 // fID: Unique ID of the track
1039 // Impact parameter information
1040 // fR[AliPID::kSPECIES]: combined "detector response probability"
1041 // Running track parameters in the base class (AliExternalTrackParam)
1045 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] = 0;
1047 // Reset track parameters constrained to the primary vertex
1050 // Reset track parameters at the inner wall of TPC
1052 delete fTPCInner;fTPCInner=0;
1053 // Reset track parameters at the inner wall of the TRD
1055 // Reset track parameters at the HMPID
1056 delete fHMPIDp;fHMPIDp = 0;
1059 // Reset ITS track related information
1065 for (Int_t i=0;i<4;i++) fITSdEdxSamples[i] = 0.;
1066 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=0;
1069 // Reset TPC related track information
1081 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0;
1083 for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
1084 for (Int_t i=0; i<3;i++) fKinkIndexes[i] = 0;
1085 for (Int_t i=0; i<3;i++) fV0Indexes[i] = 0;
1087 // Reset TRD related track information
1092 for (Int_t i=0;i<kTRDnPlanes;i++) {
1095 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0;
1100 delete[] fTRDslices;
1105 // Reset TOF related track information
1109 fTOFCalChannel = -1;
1110 fTOFsignalToT = 99999;
1111 fTOFsignalRaw = 99999;
1116 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
1117 for (Int_t i=0;i<3;i++) fTOFLabel[i] = -1;
1118 for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
1120 // Reset HMPID related track information
1125 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i] = 0;
1132 fCaloIndex = kEMCALNoMatch;
1134 // reset global track chi2
1137 fVertexID = -2; // an orphan track
1139 delete fFriendTrack; fFriendTrack = 0;
1142 //_______________________________________________________________________
1143 Int_t AliESDtrack::GetPID() const
1145 // Returns the particle most probable id
1147 for (i=0; i<AliPID::kSPECIES-1; i++) if (fR[i] != fR[i+1]) break;
1149 if (i == AliPID::kSPECIES-1) return AliPID::kPion; // If all the probabilities are equal, return the pion mass
1153 for (i=0; i<AliPID::kSPECIES; i++) if (fR[i]>max) {k=i; max=fR[i];}
1155 if (k==0) { // dE/dx "crossing points" in the TPC
1157 if ((p>0.38)&&(p<0.48))
1158 if (fR[0]<fR[3]*10.) return AliPID::kKaon;
1159 if ((p>0.75)&&(p<0.85))
1160 if (fR[0]<fR[4]*10.) return AliPID::kProton;
1161 return AliPID::kElectron;
1163 if (k==1) return AliPID::kMuon;
1164 if (k==2||k==-1) return AliPID::kPion;
1165 if (k==3) return AliPID::kKaon;
1166 if (k==4) return AliPID::kProton;
1167 AliWarning("Undefined PID !");
1168 return AliPID::kPion;
1171 //_______________________________________________________________________
1172 Int_t AliESDtrack::GetTOFBunchCrossing() const
1174 // Returns the number of bunch crossings after trigger (assuming 25ns spacing)
1175 const UInt_t kAskBits = kESDpid | kTOFout | kTIME;
1176 const double kSpacing = 25e3; // min interbanch spacing
1177 const double kShift = 0;
1178 Int_t bcid = -1; // defualt one
1179 if ( (GetStatus()&kAskBits) != kAskBits) return bcid;
1181 double tdif = fTOFsignal - fTrackTime[pid];
1182 bcid = TMath::Nint((tdif - kShift)/kSpacing);
1186 //______________________________________________________________________________
1187 Double_t AliESDtrack::M() const
1189 // Returns the assumed mass
1190 // (the pion mass, if the particle can't be identified properly).
1191 static Bool_t printerr=kTRUE;
1193 AliWarning("WARNING !!! ... THIS WILL BE PRINTED JUST ONCE !!!");
1195 AliWarning("This is the ESD mass. Use it with care !");
1200 //______________________________________________________________________________
1201 Double_t AliESDtrack::E() const
1203 // Returns the energy of the particle given its assumed mass.
1204 // Assumes the pion mass if the particle can't be identified properly.
1208 return TMath::Sqrt(p*p + m*m);
1211 //______________________________________________________________________________
1212 Double_t AliESDtrack::Y() const
1214 // Returns the rapidity of a particle given its assumed mass.
1215 // Assumes the pion mass if the particle can't be identified properly.
1219 if (e != TMath::Abs(pz)) { // energy was not equal to pz
1220 return 0.5*TMath::Log((e+pz)/(e-pz));
1221 } else { // energy was equal to pz
1226 //_______________________________________________________________________
1227 Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
1229 // This function updates track's running parameters
1234 fLabel=t->GetLabel();
1236 if (t->IsStartedTimeIntegral()) {
1238 Double_t times[10];t->GetIntegratedTimes(times); SetIntegratedTimes(times);
1239 SetIntegratedLength(t->GetIntegratedLength());
1242 Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1244 if (flags==kITSout) fFriendTrack->SetITSOut(*t);
1245 if (flags==kTPCout) fFriendTrack->SetTPCOut(*t);
1246 if (flags==kTRDrefit) fFriendTrack->SetTRDIn(*t);
1251 case kITSin: case kITSout: case kITSrefit:
1254 fITSncls=t->GetNumberOfClusters();
1256 Int_t* indexITS = new Int_t[AliESDfriendTrack::kMaxITScluster];
1257 for (Int_t i=0;i<AliESDfriendTrack::kMaxITScluster;i++) {
1258 indexITS[i]=t->GetClusterIndex(i);
1261 Int_t l=(indexITS[i] & 0xf0000000) >> 28;
1262 SETBIT(fITSClusterMap,l);
1265 fFriendTrack->SetITSIndices(indexITS,AliESDfriendTrack::kMaxITScluster);
1269 fITSchi2=t->GetChi2();
1270 fITSsignal=t->GetPIDsignal();
1271 fITSLabel = t->GetLabel();
1272 // keep in fOp the parameters outside ITS for ITS stand-alone tracks
1273 if (flags==kITSout) {
1274 if (!fOp) fOp=new AliExternalTrackParam(*t);
1276 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1281 case kTPCin: case kTPCrefit:
1283 fTPCLabel = t->GetLabel();
1284 if (flags==kTPCin) {
1285 fTPCInner=new AliExternalTrackParam(*t);
1286 fTPCnclsIter1=t->GetNumberOfClusters();
1287 fTPCchi2Iter1=t->GetChi2();
1289 if (!fIp) fIp=new AliExternalTrackParam(*t);
1291 fIp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1295 if (flags & kTPCout){
1296 if (!fOp) fOp=new AliExternalTrackParam(*t);
1298 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1300 fTPCncls=t->GetNumberOfClusters();
1301 fTPCchi2=t->GetChi2();
1304 {//prevrow must be declared in separate namespace, otherwise compiler cries:
1305 //"jump to case label crosses initialization of `Int_t prevrow'"
1306 Int_t* indexTPC = new Int_t[AliESDfriendTrack::kMaxTPCcluster];
1308 // for (Int_t i=0;i<fTPCncls;i++)
1309 for (Int_t i=0;i<AliESDfriendTrack::kMaxTPCcluster;i++)
1311 indexTPC[i]=t->GetClusterIndex(i);
1312 Int_t idx = indexTPC[i];
1314 if (idx<0) continue;
1316 // Piotr's Cluster Map for HBT
1317 // ### please change accordingly if cluster array is changing
1318 // to "New TPC Tracking" style (with gaps in array)
1319 Int_t sect = (idx&0xff000000)>>24;
1320 Int_t row = (idx&0x00ff0000)>>16;
1321 if (sect > 18) row +=63; //if it is outer sector, add number of inner sectors
1323 fTPCClusterMap.SetBitNumber(row,kTRUE);
1325 //Fill the gap between previous row and this row with 0 bits
1326 //In case ### pleas change it as well - just set bit 0 in case there
1327 //is no associated clusters for current "i"
1330 prevrow = row;//if previous bit was not assigned yet == this is the first one
1333 { //we don't know the order (inner to outer or reverse)
1334 //just to be save in case it is going to change
1347 for (Int_t j = n+1; j < m; j++)
1349 fTPCClusterMap.SetBitNumber(j,kFALSE);
1353 // End Of Piotr's Cluster Map for HBT
1355 fFriendTrack->SetTPCIndices(indexTPC,AliESDfriendTrack::kMaxTPCcluster);
1359 fTPCsignal=t->GetPIDsignal();
1363 case kTRDin: case kTRDrefit:
1367 fTRDLabel = t->GetLabel();
1368 fTRDchi2 = t->GetChi2();
1369 fTRDncls = t->GetNumberOfClusters();
1371 Int_t* indexTRD = new Int_t[AliESDfriendTrack::kMaxTRDcluster];
1372 for (Int_t i=0;i<AliESDfriendTrack::kMaxTRDcluster;i++) indexTRD[i]=-2;
1373 for (Int_t i=0;i<6;i++) indexTRD[i]=t->GetTrackletIndex(i);
1374 fFriendTrack->SetTRDIndices(indexTRD,AliESDfriendTrack::kMaxTRDcluster);
1378 fTRDsignal=t->GetPIDsignal();
1382 if (!fOp) fOp=new AliExternalTrackParam(*t);
1384 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1385 fTRDncls0 = t->GetNumberOfClusters();
1394 if (!fHMPIDp) fHMPIDp=new AliExternalTrackParam(*t);
1396 fHMPIDp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1399 AliError("Wrong flag !");
1406 //_______________________________________________________________________
1407 void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
1408 //---------------------------------------------------------------------
1409 // This function returns external representation of the track parameters
1410 //---------------------------------------------------------------------
1412 for (Int_t i=0; i<5; i++) p[i]=GetParameter()[i];
1415 //_______________________________________________________________________
1416 void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
1417 //---------------------------------------------------------------------
1418 // This function returns external representation of the cov. matrix
1419 //---------------------------------------------------------------------
1420 for (Int_t i=0; i<15; i++) cov[i]=AliExternalTrackParam::GetCovariance()[i];
1423 //_______________________________________________________________________
1424 Bool_t AliESDtrack::GetConstrainedExternalParameters
1425 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1426 //---------------------------------------------------------------------
1427 // This function returns the constrained external track parameters
1428 //---------------------------------------------------------------------
1429 if (!fCp) return kFALSE;
1430 alpha=fCp->GetAlpha();
1432 for (Int_t i=0; i<5; i++) p[i]=fCp->GetParameter()[i];
1436 //_______________________________________________________________________
1438 AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
1439 //---------------------------------------------------------------------
1440 // This function returns the constrained external cov. matrix
1441 //---------------------------------------------------------------------
1442 if (!fCp) return kFALSE;
1443 for (Int_t i=0; i<15; i++) c[i]=fCp->GetCovariance()[i];
1448 AliESDtrack::GetInnerExternalParameters
1449 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1450 //---------------------------------------------------------------------
1451 // This function returns external representation of the track parameters
1452 // at the inner layer of TPC
1453 //---------------------------------------------------------------------
1454 if (!fIp) return kFALSE;
1455 alpha=fIp->GetAlpha();
1457 for (Int_t i=0; i<5; i++) p[i]=fIp->GetParameter()[i];
1462 AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
1463 //---------------------------------------------------------------------
1464 // This function returns external representation of the cov. matrix
1465 // at the inner layer of TPC
1466 //---------------------------------------------------------------------
1467 if (!fIp) return kFALSE;
1468 for (Int_t i=0; i<15; i++) cov[i]=fIp->GetCovariance()[i];
1473 AliESDtrack::SetOuterParam(const AliExternalTrackParam *p, ULong_t flags) {
1475 // This is a direct setter for the outer track parameters
1478 if (fOp) delete fOp;
1479 fOp=new AliExternalTrackParam(*p);
1483 AliESDtrack::SetOuterHmpParam(const AliExternalTrackParam *p, ULong_t flags) {
1485 // This is a direct setter for the outer track parameters
1488 if (fHMPIDp) delete fHMPIDp;
1489 fHMPIDp=new AliExternalTrackParam(*p);
1493 AliESDtrack::GetOuterExternalParameters
1494 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1495 //---------------------------------------------------------------------
1496 // This function returns external representation of the track parameters
1497 // at the inner layer of TRD
1498 //---------------------------------------------------------------------
1499 if (!fOp) return kFALSE;
1500 alpha=fOp->GetAlpha();
1502 for (Int_t i=0; i<5; i++) p[i]=fOp->GetParameter()[i];
1507 AliESDtrack::GetOuterHmpExternalParameters
1508 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1509 //---------------------------------------------------------------------
1510 // This function returns external representation of the track parameters
1511 // at the inner layer of TRD
1512 //---------------------------------------------------------------------
1513 if (!fHMPIDp) return kFALSE;
1514 alpha=fHMPIDp->GetAlpha();
1516 for (Int_t i=0; i<5; i++) p[i]=fHMPIDp->GetParameter()[i];
1521 AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
1522 //---------------------------------------------------------------------
1523 // This function returns external representation of the cov. matrix
1524 // at the inner layer of TRD
1525 //---------------------------------------------------------------------
1526 if (!fOp) return kFALSE;
1527 for (Int_t i=0; i<15; i++) cov[i]=fOp->GetCovariance()[i];
1532 AliESDtrack::GetOuterHmpExternalCovariance(Double_t cov[15]) const {
1533 //---------------------------------------------------------------------
1534 // This function returns external representation of the cov. matrix
1535 // at the inner layer of TRD
1536 //---------------------------------------------------------------------
1537 if (!fHMPIDp) return kFALSE;
1538 for (Int_t i=0; i<15; i++) cov[i]=fHMPIDp->GetCovariance()[i];
1542 Int_t AliESDtrack::GetNcls(Int_t idet) const
1544 // Get number of clusters by subdetector index
1558 if (fTOFindex != -1)
1564 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1565 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1576 Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
1578 // Get cluster index array by subdetector index
1583 ncls = GetITSclusters(idx);
1586 ncls = GetTPCclusters(idx);
1589 ncls = GetTRDclusters(idx);
1592 if (fTOFindex != -1) {
1600 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1601 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1602 idx[0] = GetHMPIDcluIdx();
1615 //_______________________________________________________________________
1616 void AliESDtrack::GetIntegratedTimes(Double_t *times) const {
1617 // Returns the array with integrated times for each particle hypothesis
1618 for (Int_t i=0; i<AliPID::kSPECIES; i++) times[i]=fTrackTime[i];
1621 //_______________________________________________________________________
1622 void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
1623 // Sets the array with integrated times for each particle hypotesis
1624 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTrackTime[i]=times[i];
1627 //_______________________________________________________________________
1628 void AliESDtrack::SetITSpid(const Double_t *p) {
1629 // Sets values for the probability of each particle type (in ITS)
1630 SetPIDValues(fITSr,p,AliPID::kSPECIES);
1631 SetStatus(AliESDtrack::kITSpid);
1634 //_______________________________________________________________________
1635 void AliESDtrack::GetITSpid(Double_t *p) const {
1636 // Gets the probability of each particle type (in ITS)
1637 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fITSr[i];
1640 //_______________________________________________________________________
1641 Char_t AliESDtrack::GetITSclusters(Int_t *idx) const {
1642 //---------------------------------------------------------------------
1643 // This function returns indices of the assgined ITS clusters
1644 //---------------------------------------------------------------------
1645 if (idx && fFriendTrack) {
1646 Int_t *index=fFriendTrack->GetITSindices();
1647 for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) {
1648 if ( (i>=fITSncls) && (i<6) ) idx[i]=-1;
1660 //_______________________________________________________________________
1661 Bool_t AliESDtrack::GetITSModuleIndexInfo(Int_t ilayer,Int_t &idet,Int_t &status,
1662 Float_t &xloc,Float_t &zloc) const {
1663 //----------------------------------------------------------------------
1664 // This function encodes in the module number also the status of cluster association
1665 // "status" can have the following values:
1666 // 1 "found" (cluster is associated),
1667 // 2 "dead" (module is dead from OCDB),
1668 // 3 "skipped" (module or layer forced to be skipped),
1669 // 4 "outinz" (track out of z acceptance),
1670 // 5 "nocls" (no clusters in the road),
1671 // 6 "norefit" (cluster rejected during refit),
1672 // 7 "deadzspd" (holes in z in SPD)
1673 // Also given are the coordinates of the crossing point of track and module
1674 // (in the local module ref. system)
1675 // WARNING: THIS METHOD HAS TO BE SYNCHRONIZED WITH AliITStrackV2::GetModuleIndexInfo()!
1676 //----------------------------------------------------------------------
1678 if(fITSModule[ilayer]==-1) {
1681 xloc=-99.; zloc=-99.;
1685 Int_t module = fITSModule[ilayer];
1687 idet = Int_t(module/1000000);
1689 module -= idet*1000000;
1691 status = Int_t(module/100000);
1693 module -= status*100000;
1695 Int_t signs = Int_t(module/10000);
1697 module-=signs*10000;
1699 Int_t xInt = Int_t(module/100);
1702 Int_t zInt = module;
1704 if(signs==1) { xInt*=1; zInt*=1; }
1705 if(signs==2) { xInt*=1; zInt*=-1; }
1706 if(signs==3) { xInt*=-1; zInt*=1; }
1707 if(signs==4) { xInt*=-1; zInt*=-1; }
1709 xloc = 0.1*(Float_t)xInt;
1710 zloc = 0.1*(Float_t)zInt;
1712 if(status==4) idet = -1;
1717 //_______________________________________________________________________
1718 UShort_t AliESDtrack::GetTPCclusters(Int_t *idx) const {
1719 //---------------------------------------------------------------------
1720 // This function returns indices of the assgined ITS clusters
1721 //---------------------------------------------------------------------
1722 if (idx && fFriendTrack) {
1723 Int_t *index=fFriendTrack->GetTPCindices();
1726 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=index[i];
1729 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=-2;
1735 //_______________________________________________________________________
1736 Float_t AliESDtrack::GetTPCClusterInfo(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1) const
1739 // TPC cluster information
1740 // type 0: get fraction of found/findable clusters with neighbourhood definition
1741 // 1: findable clusters with neighbourhood definition
1742 // 2: found clusters
1744 // definition of findable clusters:
1745 // a cluster is defined as findable if there is another cluster
1746 // within +- nNeighbours pad rows. The idea is to overcome threshold
1747 // effects with a very simple algorithm.
1750 if (type==2) return fTPCClusterMap.CountBits();
1754 Int_t last=-nNeighbours;
1756 Int_t upperBound=fTPCClusterMap.GetNbits();
1757 if (upperBound>row1) upperBound=row1;
1758 for (Int_t i=row0; i<upperBound; ++i){
1759 //look to current row
1760 if (fTPCClusterMap[i]) {
1766 //look to nNeighbours before
1767 if ((i-last)<=nNeighbours) {
1771 //look to nNeighbours after
1772 for (Int_t j=i+1; j<i+1+nNeighbours; ++j){
1773 if (fTPCClusterMap[j]){
1779 if (type==1) return findable;
1784 fraction=(Float_t)found/(Float_t)findable;
1789 return 0; // undefined type - default value
1792 //_______________________________________________________________________
1793 Double_t AliESDtrack::GetTPCdensity(Int_t row0, Int_t row1) const{
1795 // GetDensity of the clusters on given region between row0 and row1
1796 // Dead zone effect takin into acoount
1798 if (!fFriendTrack) return 0.0;
1802 Int_t *index=fFriendTrack->GetTPCindices();
1803 for (Int_t i=row0;i<=row1;i++){
1804 Int_t idx = index[i];
1805 if (idx!=-1) good++; // track outside of dead zone
1808 Float_t density=0.5;
1809 if (good>(row1-row0)*0.5) density = Float_t(found)/Float_t(good);
1813 //_______________________________________________________________________
1814 void AliESDtrack::SetTPCpid(const Double_t *p) {
1815 // Sets values for the probability of each particle type (in TPC)
1816 SetPIDValues(fTPCr,p,AliPID::kSPECIES);
1817 SetStatus(AliESDtrack::kTPCpid);
1820 //_______________________________________________________________________
1821 void AliESDtrack::GetTPCpid(Double_t *p) const {
1822 // Gets the probability of each particle type (in TPC)
1823 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTPCr[i];
1826 //_______________________________________________________________________
1827 UChar_t AliESDtrack::GetTRDclusters(Int_t *idx) const {
1828 //---------------------------------------------------------------------
1829 // This function returns indices of the assgined TRD clusters
1830 //---------------------------------------------------------------------
1831 if (idx && fFriendTrack) {
1832 Int_t *index=fFriendTrack->GetTRDindices();
1835 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=index[i];
1838 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=-2;
1844 //_______________________________________________________________________
1845 UChar_t AliESDtrack::GetTRDtracklets(Int_t *idx) const {
1847 // This function returns the number of TRD tracklets used in tracking
1848 // and it fills the indices of these tracklets in the array "idx" as they
1849 // are registered in the TRD track list.
1852 // 1. The idx array has to be allocated with a size >= AliESDtrack::kTRDnPlanes
1853 // 2. The idx array store not only the index but also the layer of the tracklet.
1854 // Therefore tracks with TRD gaps contain default values for indices [-1]
1856 if (!fFriendTrack) return 0;
1857 if (!idx) return GetTRDntracklets();
1858 Int_t *index=fFriendTrack->GetTRDindices();
1860 for (Int_t i=0; i<kTRDnPlanes; i++){
1862 if(index[i]>=0) n++;
1870 //_______________________________________________________________________
1871 void AliESDtrack::SetTRDpid(const Double_t *p) {
1872 // Sets values for the probability of each particle type (in TRD)
1873 SetPIDValues(fTRDr,p,AliPID::kSPECIES);
1874 SetStatus(AliESDtrack::kTRDpid);
1877 //_______________________________________________________________________
1878 void AliESDtrack::GetTRDpid(Double_t *p) const {
1879 // Gets the probability of each particle type (in TRD)
1880 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTRDr[i];
1883 //_______________________________________________________________________
1884 void AliESDtrack::SetTRDpid(Int_t iSpecies, Float_t p)
1886 // Sets the probability of particle type iSpecies to p (in TRD)
1887 fTRDr[iSpecies] = p;
1890 Double_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
1892 // Returns the probability of particle type iSpecies (in TRD)
1893 return fTRDr[iSpecies];
1896 //____________________________________________________
1897 Int_t AliESDtrack::GetNumberOfTRDslices() const
1899 // built in backward compatibility
1900 Int_t idx = fTRDnSlices - (kTRDnPlanes<<1);
1901 return idx<18 ? fTRDnSlices/kTRDnPlanes : idx/kTRDnPlanes;
1904 //____________________________________________________
1905 Double_t AliESDtrack::GetTRDmomentum(Int_t plane, Double_t *sp) const
1907 //Returns momentum estimation and optional its error (sp)
1908 // in TRD layer "plane".
1911 AliDebug(2, "No TRD info allocated for this track.");
1914 if ((plane<0) || (plane>=kTRDnPlanes)) {
1915 AliWarning(Form("Request for TRD plane[%d] outside range.", plane));
1919 Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
1920 // Protection for backward compatibility
1921 if(idx<(GetNumberOfTRDslices()*kTRDnPlanes)) return -1.;
1923 if(sp) (*sp) = fTRDslices[idx+kTRDnPlanes];
1924 return fTRDslices[idx];
1927 //____________________________________________________
1928 Double_t AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
1929 //Gets the charge from the slice of the plane
1932 //AliError("No TRD slices allocated for this track !");
1935 if ((plane<0) || (plane>=kTRDnPlanes)) {
1936 AliError("Info for TRD plane not available !");
1939 Int_t ns=GetNumberOfTRDslices();
1940 if ((slice<-1) || (slice>=ns)) {
1941 //AliError("Wrong TRD slice !");
1945 if(slice>=0) return fTRDslices[plane*ns + slice];
1947 // return average of the dEdx measurements
1948 Double_t q=0.; Double32_t *s = &fTRDslices[plane*ns];
1949 for (Int_t i=0; i<ns; i++, s++) if((*s)>0.) q+=(*s);
1953 //____________________________________________________
1954 void AliESDtrack::SetNumberOfTRDslices(Int_t n) {
1955 //Sets the number of slices used for PID
1956 if (fTRDnSlices) return;
1959 fTRDslices=new Double32_t[fTRDnSlices];
1961 // set-up correctly the allocated memory
1962 memset(fTRDslices, 0, n*sizeof(Double32_t));
1963 for (Int_t i=GetNumberOfTRDslices(); i--;) fTRDslices[i]=-1.;
1966 //____________________________________________________
1967 void AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
1968 //Sets the charge q in the slice of the plane
1970 AliError("No TRD slices allocated for this track !");
1973 if ((plane<0) || (plane>=kTRDnPlanes)) {
1974 AliError("Info for TRD plane not allocated !");
1977 Int_t ns=GetNumberOfTRDslices();
1978 if ((slice<0) || (slice>=ns)) {
1979 AliError("Wrong TRD slice !");
1982 Int_t n=plane*ns + slice;
1987 //____________________________________________________
1988 void AliESDtrack::SetTRDmomentum(Double_t p, Int_t plane, Double_t *sp)
1991 AliError("No TRD slices allocated for this track !");
1994 if ((plane<0) || (plane>=kTRDnPlanes)) {
1995 AliError("Info for TRD plane not allocated !");
1999 Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
2000 // Protection for backward compatibility
2001 if(idx<GetNumberOfTRDslices()*kTRDnPlanes) return;
2003 if(sp) fTRDslices[idx+kTRDnPlanes] = (*sp);
2004 fTRDslices[idx] = p;
2008 //_______________________________________________________________________
2009 void AliESDtrack::SetTOFpid(const Double_t *p) {
2010 // Sets the probability of each particle type (in TOF)
2011 SetPIDValues(fTOFr,p,AliPID::kSPECIES);
2012 SetStatus(AliESDtrack::kTOFpid);
2015 //_______________________________________________________________________
2016 void AliESDtrack::SetTOFLabel(const Int_t *p) {
2018 for (Int_t i=0; i<3; i++) fTOFLabel[i]=p[i];
2021 //_______________________________________________________________________
2022 void AliESDtrack::GetTOFpid(Double_t *p) const {
2023 // Gets probabilities of each particle type (in TOF)
2024 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTOFr[i];
2027 //_______________________________________________________________________
2028 void AliESDtrack::GetTOFLabel(Int_t *p) const {
2030 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
2033 //_______________________________________________________________________
2034 void AliESDtrack::GetTOFInfo(Float_t *info) const {
2036 for (Int_t i=0; i<10; i++) info[i]=fTOFInfo[i];
2039 //_______________________________________________________________________
2040 void AliESDtrack::SetTOFInfo(Float_t*info) {
2042 for (Int_t i=0; i<10; i++) fTOFInfo[i]=info[i];
2047 //_______________________________________________________________________
2048 void AliESDtrack::SetHMPIDpid(const Double_t *p) {
2049 // Sets the probability of each particle type (in HMPID)
2050 SetPIDValues(fHMPIDr,p,AliPID::kSPECIES);
2051 SetStatus(AliESDtrack::kHMPIDpid);
2054 //_______________________________________________________________________
2055 void AliESDtrack::GetHMPIDpid(Double_t *p) const {
2056 // Gets probabilities of each particle type (in HMPID)
2057 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fHMPIDr[i];
2062 //_______________________________________________________________________
2063 void AliESDtrack::SetESDpid(const Double_t *p) {
2064 // Sets the probability of each particle type for the ESD track
2065 SetPIDValues(fR,p,AliPID::kSPECIES);
2066 SetStatus(AliESDtrack::kESDpid);
2069 //_______________________________________________________________________
2070 void AliESDtrack::GetESDpid(Double_t *p) const {
2071 // Gets probability of each particle type for the ESD track
2072 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
2075 //_______________________________________________________________________
2076 Bool_t AliESDtrack::RelateToVertexTPC(const AliESDVertex *vtx,
2077 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
2079 // Try to relate the TPC-only track parameters to the vertex "vtx",
2080 // if the (rough) transverse impact parameter is not bigger then "maxd".
2081 // Magnetic field is "b" (kG).
2083 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
2084 // b) The impact parameters and their covariance matrix are calculated.
2085 // c) An attempt to constrain the TPC-only params to the vertex is done.
2086 // The constrained params are returned via "cParam".
2088 // In the case of success, the returned value is kTRUE
2089 // otherwise, it's kFALSE)
2092 if (!fTPCInner) return kFALSE;
2093 if (!vtx) return kFALSE;
2095 Double_t dz[2],cov[3];
2096 if (!fTPCInner->PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
2104 Double_t covar[6]; vtx->GetCovMatrix(covar);
2105 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2106 Double_t c[3]={covar[2],0.,covar[5]};
2108 Double_t chi2=GetPredictedChi2(p,c);
2109 if (chi2>kVeryBig) return kFALSE;
2113 if (!cParam) return kTRUE;
2115 *cParam = *fTPCInner;
2116 if (!cParam->Update(p,c)) return kFALSE;
2121 //_______________________________________________________________________
2122 Bool_t AliESDtrack::RelateToVertexTPCBxByBz(const AliESDVertex *vtx,
2123 Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
2125 // Try to relate the TPC-only track parameters to the vertex "vtx",
2126 // if the (rough) transverse impact parameter is not bigger then "maxd".
2128 // All three components of the magnetic field ,"b[3]" (kG),
2129 // are taken into account.
2131 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
2132 // b) The impact parameters and their covariance matrix are calculated.
2133 // c) An attempt to constrain the TPC-only params to the vertex is done.
2134 // The constrained params are returned via "cParam".
2136 // In the case of success, the returned value is kTRUE
2137 // otherwise, it's kFALSE)
2140 if (!fTPCInner) return kFALSE;
2141 if (!vtx) return kFALSE;
2143 Double_t dz[2],cov[3];
2144 if (!fTPCInner->PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
2152 Double_t covar[6]; vtx->GetCovMatrix(covar);
2153 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2154 Double_t c[3]={covar[2],0.,covar[5]};
2156 Double_t chi2=GetPredictedChi2(p,c);
2157 if (chi2>kVeryBig) return kFALSE;
2161 if (!cParam) return kTRUE;
2163 *cParam = *fTPCInner;
2164 if (!cParam->Update(p,c)) return kFALSE;
2169 //_______________________________________________________________________
2170 Bool_t AliESDtrack::RelateToVertex(const AliESDVertex *vtx,
2171 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
2173 // Try to relate this track to the vertex "vtx",
2174 // if the (rough) transverse impact parameter is not bigger then "maxd".
2175 // Magnetic field is "b" (kG).
2177 // a) The track gets extapolated to the DCA to the vertex.
2178 // b) The impact parameters and their covariance matrix are calculated.
2179 // c) An attempt to constrain this track to the vertex is done.
2180 // The constrained params are returned via "cParam".
2182 // In the case of success, the returned value is kTRUE
2183 // (otherwise, it's kFALSE)
2186 if (!vtx) return kFALSE;
2188 Double_t dz[2],cov[3];
2189 if (!PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
2197 Double_t covar[6]; vtx->GetCovMatrix(covar);
2198 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2199 Double_t c[3]={covar[2],0.,covar[5]};
2201 Double_t chi2=GetPredictedChi2(p,c);
2202 if (chi2>kVeryBig) return kFALSE;
2207 //--- Could now these lines be removed ? ---
2209 fCp=new AliExternalTrackParam(*this);
2211 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
2212 //----------------------------------------
2214 fVertexID = vtx->GetID();
2216 if (!cParam) return kTRUE;
2219 if (!cParam->Update(p,c)) return kFALSE;
2224 //_______________________________________________________________________
2225 Bool_t AliESDtrack::RelateToVertexBxByBz(const AliESDVertex *vtx,
2226 Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
2228 // Try to relate this track to the vertex "vtx",
2229 // if the (rough) transverse impact parameter is not bigger then "maxd".
2230 // Magnetic field is "b" (kG).
2232 // a) The track gets extapolated to the DCA to the vertex.
2233 // b) The impact parameters and their covariance matrix are calculated.
2234 // c) An attempt to constrain this track to the vertex is done.
2235 // The constrained params are returned via "cParam".
2237 // In the case of success, the returned value is kTRUE
2238 // (otherwise, it's kFALSE)
2241 if (!vtx) return kFALSE;
2243 Double_t dz[2],cov[3];
2244 if (!PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
2252 Double_t covar[6]; vtx->GetCovMatrix(covar);
2253 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2254 Double_t c[3]={covar[2],0.,covar[5]};
2256 Double_t chi2=GetPredictedChi2(p,c);
2257 if (chi2>kVeryBig) return kFALSE;
2262 //--- Could now these lines be removed ? ---
2264 fCp=new AliExternalTrackParam(*this);
2266 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
2267 //----------------------------------------
2269 fVertexID = vtx->GetID();
2271 if (!cParam) return kTRUE;
2274 if (!cParam->Update(p,c)) return kFALSE;
2279 //_______________________________________________________________________
2280 void AliESDtrack::Print(Option_t *) const {
2281 // Prints info on the track
2282 AliExternalTrackParam::Print();
2283 printf("ESD track info\n") ;
2284 Double_t p[AliPID::kSPECIESN] ;
2286 if( IsOn(kITSpid) ){
2287 printf("From ITS: ") ;
2289 for(index = 0 ; index < AliPID::kSPECIES; index++)
2290 printf("%f, ", p[index]) ;
2291 printf("\n signal = %f\n", GetITSsignal()) ;
2293 if( IsOn(kTPCpid) ){
2294 printf("From TPC: ") ;
2296 for(index = 0 ; index < AliPID::kSPECIES; index++)
2297 printf("%f, ", p[index]) ;
2298 printf("\n signal = %f\n", GetTPCsignal()) ;
2300 if( IsOn(kTRDpid) ){
2301 printf("From TRD: ") ;
2303 for(index = 0 ; index < AliPID::kSPECIES; index++)
2304 printf("%f, ", p[index]) ;
2305 printf("\n signal = %f\n", GetTRDsignal()) ;
2307 if( IsOn(kTOFpid) ){
2308 printf("From TOF: ") ;
2310 for(index = 0 ; index < AliPID::kSPECIES; index++)
2311 printf("%f, ", p[index]) ;
2312 printf("\n signal = %f\n", GetTOFsignal()) ;
2314 if( IsOn(kHMPIDpid) ){
2315 printf("From HMPID: ") ;
2317 for(index = 0 ; index < AliPID::kSPECIES; index++)
2318 printf("%f, ", p[index]) ;
2319 printf("\n signal = %f\n", GetHMPIDsignal()) ;
2325 // Draw functionality
2326 // Origin: Marian Ivanov, Marian.Ivanov@cern.ch
2328 void AliESDtrack::FillPolymarker(TPolyMarker3D *pol, Float_t magF, Float_t minR, Float_t maxR, Float_t stepR){
2330 // Fill points in the polymarker
2333 arrayRef.AddLast(new AliExternalTrackParam(*this));
2334 if (fIp) arrayRef.AddLast(new AliExternalTrackParam(*fIp));
2335 if (fOp) arrayRef.AddLast(new AliExternalTrackParam(*fOp));
2336 if (fHMPIDp) arrayRef.AddLast(new AliExternalTrackParam(*fHMPIDp));
2338 Double_t mpos[3]={0,0,0};
2339 Int_t entries=arrayRef.GetEntries();
2340 for (Int_t i=0;i<entries;i++){
2342 ((AliExternalTrackParam*)arrayRef.At(i))->GetXYZ(pos);
2343 mpos[0]+=pos[0]/entries;
2344 mpos[1]+=pos[1]/entries;
2345 mpos[2]+=pos[2]/entries;
2347 // Rotate to the mean position
2349 Float_t fi= TMath::ATan2(mpos[1],mpos[0]);
2350 for (Int_t i=0;i<entries;i++){
2351 Bool_t res = ((AliExternalTrackParam*)arrayRef.At(i))->Rotate(fi);
2352 if (!res) delete arrayRef.RemoveAt(i);
2355 for (Double_t r=minR; r<maxR; r+=stepR){
2357 Double_t mlpos[3]={0,0,0};
2358 for (Int_t i=0;i<entries;i++){
2359 Double_t point[3]={0,0,0};
2360 AliExternalTrackParam *param = ((AliExternalTrackParam*)arrayRef.At(i));
2361 if (!param) continue;
2362 if (param->GetXYZAt(r,magF,point)){
2363 Double_t weight = 1./(10.+(r-param->GetX())*(r-param->GetX()));
2365 mlpos[0]+=point[0]*weight;
2366 mlpos[1]+=point[1]*weight;
2367 mlpos[2]+=point[2]*weight;
2374 pol->SetPoint(counter,mlpos[0],mlpos[1], mlpos[2]);
2375 printf("xyz\t%f\t%f\t%f\n",mlpos[0], mlpos[1],mlpos[2]);
2381 //_______________________________________________________________________
2382 void AliESDtrack::SetITSdEdxSamples(const Double_t s[4]) {
2384 // Store the dE/dx samples measured by the two SSD and two SDD layers.
2385 // These samples are corrected for the track segment length.
2387 for (Int_t i=0; i<4; i++) fITSdEdxSamples[i]=s[i];
2390 //_______________________________________________________________________
2391 void AliESDtrack::GetITSdEdxSamples(Double_t *s) const {
2393 // Get the dE/dx samples measured by the two SSD and two SDD layers.
2394 // These samples are corrected for the track segment length.
2396 for (Int_t i=0; i<4; i++) s[i]=fITSdEdxSamples[i];
2400 UShort_t AliESDtrack::GetTPCnclsS(Int_t i0,Int_t i1) const{
2402 // get number of shared TPC clusters
2404 return fTPCSharedMap.CountBits(i0)-fTPCSharedMap.CountBits(i1);
2407 UShort_t AliESDtrack::GetTPCncls(Int_t i0,Int_t i1) const{
2409 // get number of TPC clusters
2411 return fTPCClusterMap.CountBits(i0)-fTPCClusterMap.CountBits(i1);