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>
119 #include "AliESDVertex.h"
120 #include "AliESDtrack.h"
121 #include "AliKalmanTrack.h"
122 #include "AliVTrack.h"
124 #include "AliTrackPointArray.h"
125 #include "TPolyMarker3D.h"
127 ClassImp(AliESDtrack)
129 void SetPIDValues(Double_t * dest, const Double_t * src, Int_t n) {
130 // This function copies "n" PID weights from "scr" to "dest"
131 // and normalizes their sum to 1 thus producing conditional probabilities.
132 // The negative weights are set to 0.
133 // In case all the weights are non-positive they are replaced by
134 // uniform probabilities
138 Float_t uniform = 1./(Float_t)n;
141 for (Int_t i=0; i<n; i++)
151 for (Int_t i=0; i<n; i++) dest[i] /= sum;
153 for (Int_t i=0; i<n; i++) dest[i] = uniform;
156 //_______________________________________________________________________
157 AliESDtrack::AliESDtrack() :
158 AliExternalTrackParam(),
163 fFriendTrack(new AliESDfriendTrack()),
164 fTPCClusterMap(159),//number of padrows
165 fTPCSharedMap(159),//number of padrows
176 fEMCALindex(kEMCALNoMatch),
182 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
185 fCdd(0),fCdz(0),fCzz(0),
219 // The default ESD constructor
222 for (i=0; i<AliPID::kSPECIES; i++) {
232 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
233 for (i=0; i<3; i++) { fV0Indexes[i]=0;}
234 for (i=0;i<kTRDnPlanes;i++) {
237 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
238 for (i=0;i<3;i++) {fTOFLabel[i]=0;}
239 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
240 for (i=0;i<12;i++) {fITSModule[i]=-1;}
243 //_______________________________________________________________________
244 AliESDtrack::AliESDtrack(const AliESDtrack& track):
245 AliExternalTrackParam(track),
251 fTPCClusterMap(track.fTPCClusterMap),
252 fTPCSharedMap(track.fTPCSharedMap),
253 fFlags(track.fFlags),
255 fLabel(track.fLabel),
256 fITSLabel(track.fITSLabel),
257 fTPCLabel(track.fTPCLabel),
258 fTRDLabel(track.fTRDLabel),
259 fTOFCalChannel(track.fTOFCalChannel),
260 fTOFindex(track.fTOFindex),
261 fHMPIDqn(track.fHMPIDqn),
262 fHMPIDcluIdx(track.fHMPIDcluIdx),
263 fEMCALindex(track.fEMCALindex),
264 fHMPIDtrkTheta(track.fHMPIDtrkTheta),
265 fHMPIDtrkPhi(track.fHMPIDtrkPhi),
266 fHMPIDsignal(track.fHMPIDsignal),
267 fTrackLength(track.fTrackLength),
268 fdTPC(track.fdTPC),fzTPC(track.fzTPC),
269 fCddTPC(track.fCddTPC),fCdzTPC(track.fCdzTPC),fCzzTPC(track.fCzzTPC),
270 fCchi2TPC(track.fCchi2TPC),
271 fD(track.fD),fZ(track.fZ),
272 fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
273 fCchi2(track.fCchi2),
274 fITSchi2(track.fITSchi2),
275 fTPCchi2(track.fTPCchi2),
276 fTRDchi2(track.fTRDchi2),
277 fTOFchi2(track.fTOFchi2),
278 fHMPIDchi2(track.fHMPIDchi2),
279 fITSsignal(track.fITSsignal),
280 fTPCsignal(track.fTPCsignal),
281 fTPCsignalS(track.fTPCsignalS),
282 fTRDsignal(track.fTRDsignal),
283 fTRDQuality(track.fTRDQuality),
284 fTRDBudget(track.fTRDBudget),
285 fTOFsignal(track.fTOFsignal),
286 fTOFsignalToT(track.fTOFsignalToT),
287 fTOFsignalRaw(track.fTOFsignalRaw),
288 fTOFsignalDz(track.fTOFsignalDz),
289 fHMPIDtrkX(track.fHMPIDtrkX),
290 fHMPIDtrkY(track.fHMPIDtrkY),
291 fHMPIDmipX(track.fHMPIDmipX),
292 fHMPIDmipY(track.fHMPIDmipY),
293 fTPCncls(track.fTPCncls),
294 fTPCnclsF(track.fTPCnclsF),
295 fTPCsignalN(track.fTPCsignalN),
296 fITSncls(track.fITSncls),
297 fITSClusterMap(track.fITSClusterMap),
298 fTRDncls(track.fTRDncls),
299 fTRDncls0(track.fTRDncls0),
300 fTRDpidQuality(track.fTRDpidQuality),
301 fTRDnSlices(track.fTRDnSlices),
307 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i]=track.fTrackTime[i];
308 for (Int_t i=0;i<AliPID::kSPECIES;i++) fR[i]=track.fR[i];
310 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=track.fITSr[i];
312 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=track.fTPCr[i];
313 for (Int_t i=0;i<4;i++) {fTPCPoints[i]=track.fTPCPoints[i];}
314 for (Int_t i=0; i<3;i++) { fKinkIndexes[i]=track.fKinkIndexes[i];}
315 for (Int_t i=0; i<3;i++) { fV0Indexes[i]=track.fV0Indexes[i];}
317 for (Int_t i=0;i<kTRDnPlanes;i++) {
318 fTRDTimBin[i]=track.fTRDTimBin[i];
322 fTRDslices=new Double32_t[fTRDnSlices];
323 for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=track.fTRDslices[i];
326 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i]=track.fTRDr[i];
327 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i]=track.fTOFr[i];
328 for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
329 for (Int_t i=0;i<10;i++) fTOFInfo[i]=track.fTOFInfo[i];
330 for (Int_t i=0;i<12;i++) fITSModule[i]=track.fITSModule[i];
331 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i]=track.fHMPIDr[i];
333 if (track.fCp) fCp=new AliExternalTrackParam(*track.fCp);
334 if (track.fIp) fIp=new AliExternalTrackParam(*track.fIp);
335 if (track.fTPCInner) fTPCInner=new AliExternalTrackParam(*track.fTPCInner);
336 if (track.fOp) fOp=new AliExternalTrackParam(*track.fOp);
338 if (track.fFriendTrack) fFriendTrack=new AliESDfriendTrack(*(track.fFriendTrack));
341 //_______________________________________________________________________
342 AliESDtrack::AliESDtrack(const AliVTrack *track) :
343 AliExternalTrackParam(track),
349 fTPCClusterMap(159),//number of padrows
350 fTPCSharedMap(159),//number of padrows
361 fEMCALindex(kEMCALNoMatch),
367 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
370 fCdd(0),fCdz(0),fCzz(0),
403 // ESD track from AliVTrack
406 // Reset all the arrays
408 for (i=0; i<AliPID::kSPECIES; i++) {
418 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
419 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
420 for (i=0;i<kTRDnPlanes;i++) {
423 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
424 for (i=0;i<3;i++) {fTOFLabel[i]=0;}
425 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
426 for (i=0;i<12;i++) {fITSModule[i]=-1;}
429 SetID(track->GetID());
431 // Set ITS cluster map
432 fITSClusterMap=track->GetITSClusterMap();
434 // Set the combined PID
435 const Double_t *pid = track->PID();
436 for (i=0; i<5; i++) fR[i]=pid[i];
438 // AliESD track label
439 SetLabel(track->GetLabel());
443 //_______________________________________________________________________
444 AliESDtrack::AliESDtrack(TParticle * part) :
445 AliExternalTrackParam(),
451 fTPCClusterMap(159),//number of padrows
452 fTPCSharedMap(159),//number of padrows
463 fEMCALindex(kEMCALNoMatch),
469 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
472 fCdd(0),fCdz(0),fCzz(0),
505 // ESD track from TParticle
508 // Reset all the arrays
510 for (i=0; i<AliPID::kSPECIES; i++) {
520 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
521 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
522 for (i=0;i<kTRDnPlanes;i++) {
525 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
526 for (i=0;i<3;i++) {fTOFLabel[i]=0;}
527 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
528 for (i=0;i<12;i++) {fITSModule[i]=-1;}
530 // Calculate the AliExternalTrackParam content
537 // Calculate alpha: the rotation angle of the corresponding local system (TPC sector)
538 alpha = part->Phi()*180./TMath::Pi();
539 if (alpha<0) alpha+= 360.;
540 if (alpha>360) alpha -= 360.;
542 Int_t sector = (Int_t)(alpha/20.);
543 alpha = 10. + 20.*sector;
545 alpha *= TMath::Pi();
547 // Covariance matrix: no errors, the parameters are exact
548 for (i=0; i<15; i++) covar[i]=0.;
550 // Get the vertex of origin and the momentum
551 TVector3 ver(part->Vx(),part->Vy(),part->Vz());
552 TVector3 mom(part->Px(),part->Py(),part->Pz());
554 // Rotate to the local coordinate system (TPC sector)
558 // X of the referense plane
561 Int_t pdgCode = part->GetPdgCode();
564 TDatabasePDG::Instance()->GetParticle(pdgCode)->Charge();
568 param[2] = TMath::Sin(mom.Phi());
569 param[3] = mom.Pz()/mom.Pt();
570 param[4] = TMath::Sign(1/mom.Pt(),charge);
572 // Set AliExternalTrackParam
573 Set(xref, alpha, param, covar);
578 switch (TMath::Abs(pdgCode)) {
604 // If the particle is not e,mu,pi,K or p the PID probabilities are set to 0
605 if (indexPID < AliPID::kSPECIES) {
611 fHMPIDr[indexPID]=1.;
614 // AliESD track label
615 SetLabel(part->GetUniqueID());
619 //_______________________________________________________________________
620 AliESDtrack::~AliESDtrack(){
622 // This is destructor according Coding Conventrions
624 //printf("Delete track\n");
634 AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
637 if(&source == this) return *this;
638 AliExternalTrackParam::operator=(source);
642 // we have the trackparam: assign or copy construct
643 if(fCp)*fCp = *source.fCp;
644 else fCp = new AliExternalTrackParam(*source.fCp);
647 // no track param delete the old one
653 // we have the trackparam: assign or copy construct
654 if(fIp)*fIp = *source.fIp;
655 else fIp = new AliExternalTrackParam(*source.fIp);
658 // no track param delete the old one
664 if(source.fTPCInner){
665 // we have the trackparam: assign or copy construct
666 if(fTPCInner) *fTPCInner = *source.fTPCInner;
667 else fTPCInner = new AliExternalTrackParam(*source.fTPCInner);
670 // no track param delete the old one
671 if(fTPCInner)delete fTPCInner;
677 // we have the trackparam: assign or copy construct
678 if(fOp) *fOp = *source.fOp;
679 else fOp = new AliExternalTrackParam(*source.fOp);
682 // no track param delete the old one
687 // copy also the friend track
688 // use copy constructor
689 if(source.fFriendTrack){
690 // we have the trackparam: assign or copy construct
691 delete fFriendTrack; fFriendTrack=new AliESDfriendTrack(*source.fFriendTrack);
694 // no track param delete the old one
695 delete fFriendTrack; fFriendTrack= 0;
698 fTPCClusterMap = source.fTPCClusterMap;
699 fTPCSharedMap = source.fTPCSharedMap;
701 fFlags = source.fFlags;
703 fLabel = source.fLabel;
704 fITSLabel = source.fITSLabel;
705 for(int i = 0; i< 12;++i){
706 fITSModule[i] = source.fITSModule[i];
708 fTPCLabel = source.fTPCLabel;
709 fTRDLabel = source.fTRDLabel;
710 for(int i = 0; i< 3;++i){
711 fTOFLabel[i] = source.fTOFLabel[i];
713 fTOFCalChannel = source.fTOFCalChannel;
714 fTOFindex = source.fTOFindex;
715 fHMPIDqn = source.fHMPIDqn;
716 fHMPIDcluIdx = source.fHMPIDcluIdx;
717 fEMCALindex = source.fEMCALindex;
719 for(int i = 0; i< 3;++i){
720 fKinkIndexes[i] = source.fKinkIndexes[i];
721 fV0Indexes[i] = source.fV0Indexes[i];
724 for(int i = 0; i< AliPID::kSPECIES;++i){
725 fR[i] = source.fR[i];
726 fITSr[i] = source.fITSr[i];
727 fTPCr[i] = source.fTPCr[i];
728 fTRDr[i] = source.fTRDr[i];
729 fTOFr[i] = source.fTOFr[i];
730 fHMPIDr[i] = source.fHMPIDr[i];
731 fTrackTime[i] = source.fTrackTime[i];
734 fHMPIDtrkTheta = source.fHMPIDtrkTheta;
735 fHMPIDtrkPhi = source.fHMPIDtrkPhi;
736 fHMPIDsignal = source.fHMPIDsignal;
739 fTrackLength = source. fTrackLength;
740 fdTPC = source.fdTPC;
741 fzTPC = source.fzTPC;
742 fCddTPC = source.fCddTPC;
743 fCdzTPC = source.fCdzTPC;
744 fCzzTPC = source.fCzzTPC;
745 fCchi2TPC = source.fCchi2TPC;
752 fCchi2 = source.fCchi2;
754 fITSchi2 = source.fITSchi2;
755 fTPCchi2 = source.fTPCchi2;
756 fTRDchi2 = source.fTRDchi2;
757 fTOFchi2 = source.fTOFchi2;
758 fHMPIDchi2 = source.fHMPIDchi2;
761 fITSsignal = source.fITSsignal;
762 fTPCsignal = source.fTPCsignal;
763 fTPCsignalS = source.fTPCsignalS;
764 for(int i = 0; i< 4;++i){
765 fTPCPoints[i] = source.fTPCPoints[i];
767 fTRDsignal = source.fTRDsignal;
769 for(int i = 0;i < kTRDnPlanes;++i){
770 fTRDTimBin[i] = source.fTRDTimBin[i];
776 fTRDnSlices=source.fTRDnSlices;
778 fTRDslices=new Double32_t[fTRDnSlices];
779 for(int j = 0;j < fTRDnSlices;++j) fTRDslices[j] = source.fTRDslices[j];
782 fTRDQuality = source.fTRDQuality;
783 fTRDBudget = source.fTRDBudget;
784 fTOFsignal = source.fTOFsignal;
785 fTOFsignalToT = source.fTOFsignalToT;
786 fTOFsignalRaw = source.fTOFsignalRaw;
787 fTOFsignalDz = source.fTOFsignalDz;
789 for(int i = 0;i<10;++i){
790 fTOFInfo[i] = source.fTOFInfo[i];
793 fHMPIDtrkX = source.fHMPIDtrkX;
794 fHMPIDtrkY = source.fHMPIDtrkY;
795 fHMPIDmipX = source.fHMPIDmipX;
796 fHMPIDmipY = source.fHMPIDmipY;
798 fTPCncls = source.fTPCncls;
799 fTPCnclsF = source.fTPCnclsF;
800 fTPCsignalN = source.fTPCsignalN;
802 fITSncls = source.fITSncls;
803 fITSClusterMap = source.fITSClusterMap;
804 fTRDncls = source.fTRDncls;
805 fTRDncls0 = source.fTRDncls0;
806 fTRDpidQuality = source.fTRDpidQuality;
812 void AliESDtrack::Copy(TObject &obj) const {
814 // this overwrites the virtual TOBject::Copy()
815 // to allow run time copying without casting
818 if(this==&obj)return;
819 AliESDtrack *robj = dynamic_cast<AliESDtrack*>(&obj);
820 if(!robj)return; // not an AliESDtrack
827 void AliESDtrack::AddCalibObject(TObject * object){
829 // add calib object to the list
831 if (!fFriendTrack) fFriendTrack = new AliESDfriendTrack;
832 fFriendTrack->AddCalibObject(object);
835 TObject * AliESDtrack::GetCalibObject(Int_t index){
837 // return calib objct at given position
839 if (!fFriendTrack) return 0;
840 return fFriendTrack->GetCalibObject(index);
844 Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
846 // Fills the information of the TPC-only first reconstruction pass
847 // into the passed ESDtrack object. For consistency fTPCInner is also filled
852 // For data produced before r26675
853 // RelateToVertexTPC was not properly called during reco
854 // so you'll have to call it again, before FillTPCOnlyTrack
855 // Float_t p[2],cov[3];
856 // track->GetImpactParametersTPC(p,cov);
857 // if(p[0]==0&&p[1]==0) // <- Default values
858 // track->RelateToVertexTPC(esd->GetPrimaryVertexTPC(),esd->GetMagneticField(),kVeryBig);
861 if(!fTPCInner)return kFALSE;
863 // fill the TPC track params to the global track parameters
864 track.Set(fTPCInner->GetX(),fTPCInner->GetAlpha(),fTPCInner->GetParameter(),fTPCInner->GetCovariance());
867 track.fCdd = fCddTPC;
868 track.fCdz = fCdzTPC;
869 track.fCzz = fCzzTPC;
871 // copy the TPCinner parameters
872 if(track.fTPCInner) *track.fTPCInner = *fTPCInner;
873 else track.fTPCInner = new AliExternalTrackParam(*fTPCInner);
876 track.fCddTPC = fCddTPC;
877 track.fCdzTPC = fCdzTPC;
878 track.fCzzTPC = fCzzTPC;
879 track.fCchi2TPC = fCchi2TPC;
882 // copy all other TPC specific parameters
884 // replace label by TPC label
885 track.fLabel = fTPCLabel;
886 track.fTPCLabel = fTPCLabel;
888 track.fTPCchi2 = fTPCchi2;
889 track.fTPCsignal = fTPCsignal;
890 track.fTPCsignalS = fTPCsignalS;
891 for(int i = 0;i<4;++i)track.fTPCPoints[i] = fTPCPoints[i];
893 track.fTPCncls = fTPCncls;
894 track.fTPCnclsF = fTPCnclsF;
895 track.fTPCsignalN = fTPCsignalN;
898 for(int i=0;i<AliPID::kSPECIES;++i){
899 track.fTPCr[i] = fTPCr[i];
900 // combined PID is TPC only!
901 track.fR[i] = fTPCr[i];
903 track.fTPCClusterMap = fTPCClusterMap;
904 track.fTPCSharedMap = fTPCSharedMap;
908 track.fFlags = kTPCin;
912 for (Int_t i=0;i<3;i++) track.fKinkIndexes[i] = fKinkIndexes[i];
918 //_______________________________________________________________________
919 void AliESDtrack::MakeMiniESDtrack(){
920 // Resets everything except
921 // fFlags: Reconstruction status flags
922 // fLabel: Track label
923 // fID: Unique ID of the track
924 // Impact parameter information
925 // fR[AliPID::kSPECIES]: combined "detector response probability"
926 // Running track parameters in the base class (AliExternalTrackParam)
930 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] = 0;
932 // Reset track parameters constrained to the primary vertex
935 // Reset track parameters at the inner wall of TPC
937 delete fTPCInner;fTPCInner=0;
938 // Reset track parameters at the inner wall of the TRD
942 // Reset ITS track related information
947 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=0;
950 // Reset TPC related track information
959 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0;
961 for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
962 for (Int_t i=0; i<3;i++) fKinkIndexes[i] = 0;
963 for (Int_t i=0; i<3;i++) fV0Indexes[i] = 0;
965 // Reset TRD related track information
970 for (Int_t i=0;i<kTRDnPlanes;i++) {
973 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0;
983 // Reset TOF related track information
991 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
992 for (Int_t i=0;i<3;i++) fTOFLabel[i] = 0;
993 for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
995 // Reset HMPID related track information
1000 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i] = 0;
1007 fEMCALindex = kEMCALNoMatch;
1009 delete fFriendTrack; fFriendTrack = 0;
1011 //_______________________________________________________________________
1012 Double_t AliESDtrack::GetMass() const {
1013 // Returns the mass of the most probable particle type
1016 for (Int_t i=0; i<AliPID::kSPECIES; i++) {
1017 if (fR[i]>max) {k=i; max=fR[i];}
1019 if (k==0) { // dE/dx "crossing points" in the TPC
1021 if ((p>0.38)&&(p<0.48))
1022 if (fR[0]<fR[3]*10.) return AliPID::ParticleMass(AliPID::kKaon);
1023 if ((p>0.75)&&(p<0.85))
1024 if (fR[0]<fR[4]*10.) return AliPID::ParticleMass(AliPID::kProton);
1027 if (k==1) return AliPID::ParticleMass(AliPID::kMuon);
1028 if (k==2||k==-1) return AliPID::ParticleMass(AliPID::kPion);
1029 if (k==3) return AliPID::ParticleMass(AliPID::kKaon);
1030 if (k==4) return AliPID::ParticleMass(AliPID::kProton);
1031 AliWarning("Undefined mass !");
1032 return AliPID::ParticleMass(AliPID::kPion);
1035 //______________________________________________________________________________
1036 Double_t AliESDtrack::E() const
1038 // Returns the energy of the particle given its assumed mass.
1039 // Assumes the pion mass if the particle can't be identified properly.
1043 return TMath::Sqrt(p*p + m*m);
1046 //______________________________________________________________________________
1047 Double_t AliESDtrack::Y() const
1049 // Returns the rapidity of a particle given its assumed mass.
1050 // Assumes the pion mass if the particle can't be identified properly.
1054 if (e != TMath::Abs(pz)) { // energy was not equal to pz
1055 return 0.5*TMath::Log((e+pz)/(e-pz));
1056 } else { // energy was equal to pz
1061 //_______________________________________________________________________
1062 Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
1064 // This function updates track's running parameters
1070 fLabel=t->GetLabel();
1072 if (t->IsStartedTimeIntegral()) {
1074 Double_t times[10];t->GetIntegratedTimes(times); SetIntegratedTimes(times);
1075 SetIntegratedLength(t->GetIntegratedLength());
1078 Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1082 case kITSin: case kITSout: case kITSrefit:
1084 fITSncls=t->GetNumberOfClusters();
1085 index=fFriendTrack->GetITSindices();
1086 for (Int_t i=0;i<AliESDfriendTrack::kMaxITScluster;i++) {
1087 index[i]=t->GetClusterIndex(i);
1089 Int_t l=(index[i] & 0xf0000000) >> 28;
1090 SETBIT(fITSClusterMap,l);
1093 fITSchi2=t->GetChi2();
1094 fITSsignal=t->GetPIDsignal();
1095 fITSLabel = t->GetLabel();
1096 // keep in fOp the parameters outside ITS for ITS stand-alone tracks
1097 if (flags==kITSout) {
1098 if (!fOp) fOp=new AliExternalTrackParam(*t);
1100 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1104 case kTPCin: case kTPCrefit:
1105 fTPCLabel = t->GetLabel();
1106 if (flags==kTPCin) fTPCInner=new AliExternalTrackParam(*t);
1107 if (!fIp) fIp=new AliExternalTrackParam(*t);
1109 fIp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1111 index=fFriendTrack->GetTPCindices();
1112 if (flags & kTPCout){
1113 if (!fOp) fOp=new AliExternalTrackParam(*t);
1115 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1117 fTPCncls=t->GetNumberOfClusters();
1118 fTPCchi2=t->GetChi2();
1120 {//prevrow must be declared in separate namespace, otherwise compiler cries:
1121 //"jump to case label crosses initialization of `Int_t prevrow'"
1123 // for (Int_t i=0;i<fTPCncls;i++)
1124 for (Int_t i=0;i<AliESDfriendTrack::kMaxTPCcluster;i++)
1126 index[i]=t->GetClusterIndex(i);
1127 Int_t idx = index[i];
1129 if (idx<0) continue;
1131 // Piotr's Cluster Map for HBT
1132 // ### please change accordingly if cluster array is changing
1133 // to "New TPC Tracking" style (with gaps in array)
1134 Int_t sect = (idx&0xff000000)>>24;
1135 Int_t row = (idx&0x00ff0000)>>16;
1136 if (sect > 18) row +=63; //if it is outer sector, add number of inner sectors
1138 fTPCClusterMap.SetBitNumber(row,kTRUE);
1140 //Fill the gap between previous row and this row with 0 bits
1141 //In case ### pleas change it as well - just set bit 0 in case there
1142 //is no associated clusters for current "i"
1145 prevrow = row;//if previous bit was not assigned yet == this is the first one
1148 { //we don't know the order (inner to outer or reverse)
1149 //just to be save in case it is going to change
1162 for (Int_t j = n+1; j < m; j++)
1164 fTPCClusterMap.SetBitNumber(j,kFALSE);
1168 // End Of Piotr's Cluster Map for HBT
1171 fTPCsignal=t->GetPIDsignal();
1174 case kTRDout: case kTRDin: case kTRDrefit:
1175 index = fFriendTrack->GetTRDindices();
1176 fTRDLabel = t->GetLabel();
1177 fTRDchi2 = t->GetChi2();
1178 fTRDncls = t->GetNumberOfClusters();
1179 for (Int_t i=0;i<6;i++) index[i]=t->GetTrackletIndex(i);
1181 fTRDsignal=t->GetPIDsignal();
1184 if (!fOp) fOp=new AliExternalTrackParam(*t);
1186 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1187 fTRDncls0 = t->GetNumberOfClusters();
1196 AliError("Wrong flag !");
1203 //_______________________________________________________________________
1204 void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
1205 //---------------------------------------------------------------------
1206 // This function returns external representation of the track parameters
1207 //---------------------------------------------------------------------
1209 for (Int_t i=0; i<5; i++) p[i]=GetParameter()[i];
1212 //_______________________________________________________________________
1213 void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
1214 //---------------------------------------------------------------------
1215 // This function returns external representation of the cov. matrix
1216 //---------------------------------------------------------------------
1217 for (Int_t i=0; i<15; i++) cov[i]=AliExternalTrackParam::GetCovariance()[i];
1220 //_______________________________________________________________________
1221 Bool_t AliESDtrack::GetConstrainedExternalParameters
1222 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1223 //---------------------------------------------------------------------
1224 // This function returns the constrained external track parameters
1225 //---------------------------------------------------------------------
1226 if (!fCp) return kFALSE;
1227 alpha=fCp->GetAlpha();
1229 for (Int_t i=0; i<5; i++) p[i]=fCp->GetParameter()[i];
1233 //_______________________________________________________________________
1235 AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
1236 //---------------------------------------------------------------------
1237 // This function returns the constrained external cov. matrix
1238 //---------------------------------------------------------------------
1239 if (!fCp) return kFALSE;
1240 for (Int_t i=0; i<15; i++) c[i]=fCp->GetCovariance()[i];
1245 AliESDtrack::GetInnerExternalParameters
1246 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1247 //---------------------------------------------------------------------
1248 // This function returns external representation of the track parameters
1249 // at the inner layer of TPC
1250 //---------------------------------------------------------------------
1251 if (!fIp) return kFALSE;
1252 alpha=fIp->GetAlpha();
1254 for (Int_t i=0; i<5; i++) p[i]=fIp->GetParameter()[i];
1259 AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
1260 //---------------------------------------------------------------------
1261 // This function returns external representation of the cov. matrix
1262 // at the inner layer of TPC
1263 //---------------------------------------------------------------------
1264 if (!fIp) return kFALSE;
1265 for (Int_t i=0; i<15; i++) cov[i]=fIp->GetCovariance()[i];
1270 AliESDtrack::SetOuterParam(const AliExternalTrackParam *p, ULong_t flags) {
1272 // This is a direct setter for the outer track parameters
1275 if (fOp) delete fOp;
1276 fOp=new AliExternalTrackParam(*p);
1280 AliESDtrack::GetOuterExternalParameters
1281 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1282 //---------------------------------------------------------------------
1283 // This function returns external representation of the track parameters
1284 // at the inner layer of TRD
1285 //---------------------------------------------------------------------
1286 if (!fOp) return kFALSE;
1287 alpha=fOp->GetAlpha();
1289 for (Int_t i=0; i<5; i++) p[i]=fOp->GetParameter()[i];
1294 AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
1295 //---------------------------------------------------------------------
1296 // This function returns external representation of the cov. matrix
1297 // at the inner layer of TRD
1298 //---------------------------------------------------------------------
1299 if (!fOp) return kFALSE;
1300 for (Int_t i=0; i<15; i++) cov[i]=fOp->GetCovariance()[i];
1304 Int_t AliESDtrack::GetNcls(Int_t idet) const
1306 // Get number of clusters by subdetector index
1320 if (fTOFindex != -1)
1329 Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
1331 // Get cluster index array by subdetector index
1336 ncls = GetITSclusters(idx);
1339 ncls = GetTPCclusters(idx);
1342 ncls = GetTRDclusters(idx);
1345 if (fTOFindex != -1) {
1353 if (fHMPIDcluIdx != 0) {
1354 idx[0] = GetHMPIDcluIdx();
1366 //_______________________________________________________________________
1367 void AliESDtrack::GetIntegratedTimes(Double_t *times) const {
1368 // Returns the array with integrated times for each particle hypothesis
1369 for (Int_t i=0; i<AliPID::kSPECIES; i++) times[i]=fTrackTime[i];
1372 //_______________________________________________________________________
1373 void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
1374 // Sets the array with integrated times for each particle hypotesis
1375 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTrackTime[i]=times[i];
1378 //_______________________________________________________________________
1379 void AliESDtrack::SetITSpid(const Double_t *p) {
1380 // Sets values for the probability of each particle type (in ITS)
1381 SetPIDValues(fITSr,p,AliPID::kSPECIES);
1382 SetStatus(AliESDtrack::kITSpid);
1385 //_______________________________________________________________________
1386 void AliESDtrack::GetITSpid(Double_t *p) const {
1387 // Gets the probability of each particle type (in ITS)
1388 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fITSr[i];
1391 //_______________________________________________________________________
1392 Char_t AliESDtrack::GetITSclusters(Int_t *idx) const {
1393 //---------------------------------------------------------------------
1394 // This function returns indices of the assgined ITS clusters
1395 //---------------------------------------------------------------------
1397 Int_t *index=fFriendTrack->GetITSindices();
1398 for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) {
1399 if ( (i>=fITSncls) && (i<6) ) idx[i]=-1;
1400 else idx[i]=index[i];
1406 //_______________________________________________________________________
1407 Bool_t AliESDtrack::GetITSModuleIndexInfo(Int_t ilayer,Int_t &idet,Int_t &status,
1408 Float_t &xloc,Float_t &zloc) const {
1409 //----------------------------------------------------------------------
1410 // This function encodes in the module number also the status of cluster association
1411 // "status" can have the following values:
1412 // 1 "found" (cluster is associated),
1413 // 2 "dead" (module is dead from OCDB),
1414 // 3 "skipped" (module or layer forced to be skipped),
1415 // 4 "outinz" (track out of z acceptance),
1416 // 5 "nocls" (no clusters in the road),
1417 // 6 "norefit" (cluster rejected during refit),
1418 // 7 "deadzspd" (holes in z in SPD)
1419 // Also given are the coordinates of the crossing point of track and module
1420 // (in the local module ref. system)
1421 // WARNING: THIS METHOD HAS TO BE SYNCHRONIZED WITH AliITStrackV2::GetModuleIndexInfo()!
1422 //----------------------------------------------------------------------
1424 if(fITSModule[ilayer]==-1) {
1427 xloc=-99.; zloc=-99.;
1431 Int_t module = fITSModule[ilayer];
1433 idet = Int_t(module/1000000);
1435 module -= idet*1000000;
1437 status = Int_t(module/100000);
1439 module -= status*100000;
1441 Int_t signs = Int_t(module/10000);
1443 module-=signs*10000;
1445 Int_t xInt = Int_t(module/100);
1448 Int_t zInt = module;
1450 if(signs==1) { xInt*=1; zInt*=1; }
1451 if(signs==2) { xInt*=1; zInt*=-1; }
1452 if(signs==3) { xInt*=-1; zInt*=1; }
1453 if(signs==4) { xInt*=-1; zInt*=-1; }
1455 xloc = 0.1*(Float_t)xInt;
1456 zloc = 0.1*(Float_t)zInt;
1458 if(status==4) idet = -1;
1463 //_______________________________________________________________________
1464 UShort_t AliESDtrack::GetTPCclusters(Int_t *idx) const {
1465 //---------------------------------------------------------------------
1466 // This function returns indices of the assgined ITS clusters
1467 //---------------------------------------------------------------------
1469 Int_t *index=fFriendTrack->GetTPCindices();
1470 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=index[i];
1475 Double_t AliESDtrack::GetTPCdensity(Int_t row0, Int_t row1) const{
1477 // GetDensity of the clusters on given region between row0 and row1
1478 // Dead zone effect takin into acoount
1483 Int_t *index=fFriendTrack->GetTPCindices();
1484 for (Int_t i=row0;i<=row1;i++){
1485 Int_t idx = index[i];
1486 if (idx!=-1) good++; // track outside of dead zone
1489 Float_t density=0.5;
1490 if (good>(row1-row0)*0.5) density = Float_t(found)/Float_t(good);
1494 //_______________________________________________________________________
1495 void AliESDtrack::SetTPCpid(const Double_t *p) {
1496 // Sets values for the probability of each particle type (in TPC)
1497 SetPIDValues(fTPCr,p,AliPID::kSPECIES);
1498 SetStatus(AliESDtrack::kTPCpid);
1501 //_______________________________________________________________________
1502 void AliESDtrack::GetTPCpid(Double_t *p) const {
1503 // Gets the probability of each particle type (in TPC)
1504 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTPCr[i];
1507 //_______________________________________________________________________
1508 UChar_t AliESDtrack::GetTRDclusters(Int_t *idx) const {
1509 //---------------------------------------------------------------------
1510 // This function returns indices of the assgined TRD clusters
1511 //---------------------------------------------------------------------
1513 Int_t *index=fFriendTrack->GetTRDindices();
1514 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=index[i];
1519 //_______________________________________________________________________
1520 UChar_t AliESDtrack::GetTRDtracklets(Int_t *idx) const {
1521 //---------------------------------------------------------------------
1522 // This function returns indices of the assigned TRD tracklets
1523 //---------------------------------------------------------------------
1525 Int_t *index=fFriendTrack->GetTRDindices();
1526 for (Int_t i=0; i<6/*AliESDfriendTrack::kMaxTRDcluster*/; i++) idx[i]=index[i];
1531 //_______________________________________________________________________
1532 void AliESDtrack::SetTRDpid(const Double_t *p) {
1533 // Sets values for the probability of each particle type (in TRD)
1534 SetPIDValues(fTRDr,p,AliPID::kSPECIES);
1535 SetStatus(AliESDtrack::kTRDpid);
1538 //_______________________________________________________________________
1539 void AliESDtrack::GetTRDpid(Double_t *p) const {
1540 // Gets the probability of each particle type (in TRD)
1541 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTRDr[i];
1544 //_______________________________________________________________________
1545 void AliESDtrack::SetTRDpid(Int_t iSpecies, Float_t p)
1547 // Sets the probability of particle type iSpecies to p (in TRD)
1548 fTRDr[iSpecies] = p;
1551 Double_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
1553 // Returns the probability of particle type iSpecies (in TRD)
1554 return fTRDr[iSpecies];
1557 void AliESDtrack::SetNumberOfTRDslices(Int_t n) {
1558 //Sets the number of slices used for PID
1559 if (fTRDnSlices != 0) return;
1560 fTRDnSlices=kTRDnPlanes*n;
1561 fTRDslices=new Double32_t[fTRDnSlices];
1562 for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=-1.;
1565 void AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
1566 //Sets the charge q in the slice of the plane
1567 Int_t ns=GetNumberOfTRDslices();
1569 AliError("No TRD slices allocated for this track !");
1573 if ((plane<0) || (plane>=kTRDnPlanes)) {
1574 AliError("Wrong TRD plane !");
1577 if ((slice<0) || (slice>=ns)) {
1578 AliError("Wrong TRD slice !");
1581 Int_t n=plane*ns + slice;
1585 Double_t AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
1586 //Gets the charge from the slice of the plane
1587 Int_t ns=GetNumberOfTRDslices();
1589 //AliError("No TRD slices allocated for this track !");
1593 if ((plane<0) || (plane>=kTRDnPlanes)) {
1594 AliError("Wrong TRD plane !");
1597 if ((slice<-1) || (slice>=ns)) {
1598 //AliError("Wrong TRD slice !");
1604 for (Int_t i=0; i<ns; i++) q+=fTRDslices[plane*ns + i];
1608 return fTRDslices[plane*ns + slice];
1612 //_______________________________________________________________________
1613 void AliESDtrack::SetTOFpid(const Double_t *p) {
1614 // Sets the probability of each particle type (in TOF)
1615 SetPIDValues(fTOFr,p,AliPID::kSPECIES);
1616 SetStatus(AliESDtrack::kTOFpid);
1619 //_______________________________________________________________________
1620 void AliESDtrack::SetTOFLabel(const Int_t *p) {
1622 for (Int_t i=0; i<3; i++) fTOFLabel[i]=p[i];
1625 //_______________________________________________________________________
1626 void AliESDtrack::GetTOFpid(Double_t *p) const {
1627 // Gets probabilities of each particle type (in TOF)
1628 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTOFr[i];
1631 //_______________________________________________________________________
1632 void AliESDtrack::GetTOFLabel(Int_t *p) const {
1634 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
1637 //_______________________________________________________________________
1638 void AliESDtrack::GetTOFInfo(Float_t *info) const {
1640 for (Int_t i=0; i<10; i++) info[i]=fTOFInfo[i];
1643 //_______________________________________________________________________
1644 void AliESDtrack::SetTOFInfo(Float_t*info) {
1646 for (Int_t i=0; i<10; i++) fTOFInfo[i]=info[i];
1651 //_______________________________________________________________________
1652 void AliESDtrack::SetHMPIDpid(const Double_t *p) {
1653 // Sets the probability of each particle type (in HMPID)
1654 SetPIDValues(fHMPIDr,p,AliPID::kSPECIES);
1655 SetStatus(AliESDtrack::kHMPIDpid);
1658 //_______________________________________________________________________
1659 void AliESDtrack::GetHMPIDpid(Double_t *p) const {
1660 // Gets probabilities of each particle type (in HMPID)
1661 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fHMPIDr[i];
1666 //_______________________________________________________________________
1667 void AliESDtrack::SetESDpid(const Double_t *p) {
1668 // Sets the probability of each particle type for the ESD track
1669 SetPIDValues(fR,p,AliPID::kSPECIES);
1670 SetStatus(AliESDtrack::kESDpid);
1673 //_______________________________________________________________________
1674 void AliESDtrack::GetESDpid(Double_t *p) const {
1675 // Gets probability of each particle type for the ESD track
1676 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
1679 //_______________________________________________________________________
1680 Bool_t AliESDtrack::RelateToVertexTPC(const AliESDVertex *vtx,
1681 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
1683 // Try to relate the TPC-only track parameters to the vertex "vtx",
1684 // if the (rough) transverse impact parameter is not bigger then "maxd".
1685 // Magnetic field is "b" (kG).
1687 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
1688 // b) The impact parameters and their covariance matrix are calculated.
1689 // c) An attempt to constrain the TPC-only params to the vertex is done.
1690 // The constrained params are returned via "cParam".
1692 // In the case of success, the returned value is kTRUE
1693 // otherwise, it's kFALSE)
1696 if (!fTPCInner) return kFALSE;
1697 if (!vtx) return kFALSE;
1699 Double_t dz[2],cov[3];
1700 if (!fTPCInner->PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
1708 Double_t covar[6]; vtx->GetCovMatrix(covar);
1709 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
1710 Double_t c[3]={covar[2],0.,covar[5]};
1712 Double_t chi2=GetPredictedChi2(p,c);
1713 if (chi2>kVeryBig) return kFALSE;
1717 if (!cParam) return kTRUE;
1719 *cParam = *fTPCInner;
1720 if (!cParam->Update(p,c)) return kFALSE;
1725 //_______________________________________________________________________
1726 Bool_t AliESDtrack::RelateToVertex(const AliESDVertex *vtx,
1727 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
1729 // Try to relate this track to the vertex "vtx",
1730 // if the (rough) transverse impact parameter is not bigger then "maxd".
1731 // Magnetic field is "b" (kG).
1733 // a) The track gets extapolated to the DCA to the vertex.
1734 // b) The impact parameters and their covariance matrix are calculated.
1735 // c) An attempt to constrain this track to the vertex is done.
1736 // The constrained params are returned via "cParam".
1738 // In the case of success, the returned value is kTRUE
1739 // (otherwise, it's kFALSE)
1742 if (!vtx) return kFALSE;
1744 Double_t dz[2],cov[3];
1745 if (!PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
1753 Double_t covar[6]; vtx->GetCovMatrix(covar);
1754 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
1755 Double_t c[3]={covar[2],0.,covar[5]};
1757 Double_t chi2=GetPredictedChi2(p,c);
1758 if (chi2>kVeryBig) return kFALSE;
1763 //--- Could now these lines be removed ? ---
1765 fCp=new AliExternalTrackParam(*this);
1767 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
1768 //----------------------------------------
1771 if (!cParam) return kTRUE;
1774 if (!cParam->Update(p,c)) return kFALSE;
1779 //_______________________________________________________________________
1780 void AliESDtrack::Print(Option_t *) const {
1781 // Prints info on the track
1782 AliExternalTrackParam::Print();
1783 printf("ESD track info\n") ;
1784 Double_t p[AliPID::kSPECIESN] ;
1786 if( IsOn(kITSpid) ){
1787 printf("From ITS: ") ;
1789 for(index = 0 ; index < AliPID::kSPECIES; index++)
1790 printf("%f, ", p[index]) ;
1791 printf("\n signal = %f\n", GetITSsignal()) ;
1793 if( IsOn(kTPCpid) ){
1794 printf("From TPC: ") ;
1796 for(index = 0 ; index < AliPID::kSPECIES; index++)
1797 printf("%f, ", p[index]) ;
1798 printf("\n signal = %f\n", GetTPCsignal()) ;
1800 if( IsOn(kTRDpid) ){
1801 printf("From TRD: ") ;
1803 for(index = 0 ; index < AliPID::kSPECIES; index++)
1804 printf("%f, ", p[index]) ;
1805 printf("\n signal = %f\n", GetTRDsignal()) ;
1807 if( IsOn(kTOFpid) ){
1808 printf("From TOF: ") ;
1810 for(index = 0 ; index < AliPID::kSPECIES; index++)
1811 printf("%f, ", p[index]) ;
1812 printf("\n signal = %f\n", GetTOFsignal()) ;
1814 if( IsOn(kHMPIDpid) ){
1815 printf("From HMPID: ") ;
1817 for(index = 0 ; index < AliPID::kSPECIES; index++)
1818 printf("%f, ", p[index]) ;
1819 printf("\n signal = %f\n", GetHMPIDsignal()) ;
1825 // Draw functionality
1826 // Origin: Marian Ivanov, Marian.Ivanov@cern.ch
1828 void AliESDtrack::FillPolymarker(TPolyMarker3D *pol, Float_t magF, Float_t minR, Float_t maxR, Float_t stepR){
1830 // Fill points in the polymarker
1833 arrayRef.AddLast(new AliExternalTrackParam(*this));
1834 if (fIp) arrayRef.AddLast(new AliExternalTrackParam(*fIp));
1835 if (fOp) arrayRef.AddLast(new AliExternalTrackParam(*fOp));
1837 Double_t mpos[3]={0,0,0};
1838 Int_t entries=arrayRef.GetEntries();
1839 for (Int_t i=0;i<entries;i++){
1841 ((AliExternalTrackParam*)arrayRef.At(i))->GetXYZ(pos);
1842 mpos[0]+=pos[0]/entries;
1843 mpos[1]+=pos[1]/entries;
1844 mpos[2]+=pos[2]/entries;
1846 // Rotate to the mean position
1848 Float_t fi= TMath::ATan2(mpos[1],mpos[0]);
1849 for (Int_t i=0;i<entries;i++){
1850 Bool_t res = ((AliExternalTrackParam*)arrayRef.At(i))->Rotate(fi);
1851 if (!res) delete arrayRef.RemoveAt(i);
1854 for (Double_t r=minR; r<maxR; r+=stepR){
1856 Double_t mlpos[3]={0,0,0};
1857 for (Int_t i=0;i<entries;i++){
1858 Double_t point[3]={0,0,0};
1859 AliExternalTrackParam *param = ((AliExternalTrackParam*)arrayRef.At(i));
1860 if (!param) continue;
1861 if (param->GetXYZAt(r,magF,point)){
1862 Double_t weight = 1./(10.+(r-param->GetX())*(r-param->GetX()));
1864 mlpos[0]+=point[0]*weight;
1865 mlpos[1]+=point[1]*weight;
1866 mlpos[2]+=point[2]*weight;
1873 pol->SetPoint(counter,mlpos[0],mlpos[1], mlpos[2]);
1874 printf("xyz\t%f\t%f\t%f\n",mlpos[0], mlpos[1],mlpos[2]);