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();
437 for (i=0; i<AliPID::kSPECIES; i++) fR[i]=pid[i];
439 // AliESD track label
440 SetLabel(track->GetLabel());
442 SetStatus(track->GetStatus());
445 //_______________________________________________________________________
446 AliESDtrack::AliESDtrack(TParticle * part) :
447 AliExternalTrackParam(),
453 fTPCClusterMap(159),//number of padrows
454 fTPCSharedMap(159),//number of padrows
465 fEMCALindex(kEMCALNoMatch),
471 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
474 fCdd(0),fCdz(0),fCzz(0),
507 // ESD track from TParticle
510 // Reset all the arrays
512 for (i=0; i<AliPID::kSPECIES; i++) {
522 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
523 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
524 for (i=0;i<kTRDnPlanes;i++) {
527 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
528 for (i=0;i<3;i++) {fTOFLabel[i]=0;}
529 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
530 for (i=0;i<12;i++) {fITSModule[i]=-1;}
532 // Calculate the AliExternalTrackParam content
539 // Calculate alpha: the rotation angle of the corresponding local system (TPC sector)
540 alpha = part->Phi()*180./TMath::Pi();
541 if (alpha<0) alpha+= 360.;
542 if (alpha>360) alpha -= 360.;
544 Int_t sector = (Int_t)(alpha/20.);
545 alpha = 10. + 20.*sector;
547 alpha *= TMath::Pi();
549 // Covariance matrix: no errors, the parameters are exact
550 for (i=0; i<15; i++) covar[i]=0.;
552 // Get the vertex of origin and the momentum
553 TVector3 ver(part->Vx(),part->Vy(),part->Vz());
554 TVector3 mom(part->Px(),part->Py(),part->Pz());
556 // Rotate to the local coordinate system (TPC sector)
560 // X of the referense plane
563 Int_t pdgCode = part->GetPdgCode();
566 TDatabasePDG::Instance()->GetParticle(pdgCode)->Charge();
570 param[2] = TMath::Sin(mom.Phi());
571 param[3] = mom.Pz()/mom.Pt();
572 param[4] = TMath::Sign(1/mom.Pt(),charge);
574 // Set AliExternalTrackParam
575 Set(xref, alpha, param, covar);
580 switch (TMath::Abs(pdgCode)) {
606 // If the particle is not e,mu,pi,K or p the PID probabilities are set to 0
607 if (indexPID < AliPID::kSPECIES) {
613 fHMPIDr[indexPID]=1.;
616 // AliESD track label
617 SetLabel(part->GetUniqueID());
621 //_______________________________________________________________________
622 AliESDtrack::~AliESDtrack(){
624 // This is destructor according Coding Conventrions
626 //printf("Delete track\n");
636 AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
639 if(&source == this) return *this;
640 AliExternalTrackParam::operator=(source);
644 // we have the trackparam: assign or copy construct
645 if(fCp)*fCp = *source.fCp;
646 else fCp = new AliExternalTrackParam(*source.fCp);
649 // no track param delete the old one
655 // we have the trackparam: assign or copy construct
656 if(fIp)*fIp = *source.fIp;
657 else fIp = new AliExternalTrackParam(*source.fIp);
660 // no track param delete the old one
666 if(source.fTPCInner){
667 // we have the trackparam: assign or copy construct
668 if(fTPCInner) *fTPCInner = *source.fTPCInner;
669 else fTPCInner = new AliExternalTrackParam(*source.fTPCInner);
672 // no track param delete the old one
673 if(fTPCInner)delete fTPCInner;
679 // we have the trackparam: assign or copy construct
680 if(fOp) *fOp = *source.fOp;
681 else fOp = new AliExternalTrackParam(*source.fOp);
684 // no track param delete the old one
689 // copy also the friend track
690 // use copy constructor
691 if(source.fFriendTrack){
692 // we have the trackparam: assign or copy construct
693 delete fFriendTrack; fFriendTrack=new AliESDfriendTrack(*source.fFriendTrack);
696 // no track param delete the old one
697 delete fFriendTrack; fFriendTrack= 0;
700 fTPCClusterMap = source.fTPCClusterMap;
701 fTPCSharedMap = source.fTPCSharedMap;
703 fFlags = source.fFlags;
705 fLabel = source.fLabel;
706 fITSLabel = source.fITSLabel;
707 for(int i = 0; i< 12;++i){
708 fITSModule[i] = source.fITSModule[i];
710 fTPCLabel = source.fTPCLabel;
711 fTRDLabel = source.fTRDLabel;
712 for(int i = 0; i< 3;++i){
713 fTOFLabel[i] = source.fTOFLabel[i];
715 fTOFCalChannel = source.fTOFCalChannel;
716 fTOFindex = source.fTOFindex;
717 fHMPIDqn = source.fHMPIDqn;
718 fHMPIDcluIdx = source.fHMPIDcluIdx;
719 fEMCALindex = source.fEMCALindex;
721 for(int i = 0; i< 3;++i){
722 fKinkIndexes[i] = source.fKinkIndexes[i];
723 fV0Indexes[i] = source.fV0Indexes[i];
726 for(int i = 0; i< AliPID::kSPECIES;++i){
727 fR[i] = source.fR[i];
728 fITSr[i] = source.fITSr[i];
729 fTPCr[i] = source.fTPCr[i];
730 fTRDr[i] = source.fTRDr[i];
731 fTOFr[i] = source.fTOFr[i];
732 fHMPIDr[i] = source.fHMPIDr[i];
733 fTrackTime[i] = source.fTrackTime[i];
736 fHMPIDtrkTheta = source.fHMPIDtrkTheta;
737 fHMPIDtrkPhi = source.fHMPIDtrkPhi;
738 fHMPIDsignal = source.fHMPIDsignal;
741 fTrackLength = source. fTrackLength;
742 fdTPC = source.fdTPC;
743 fzTPC = source.fzTPC;
744 fCddTPC = source.fCddTPC;
745 fCdzTPC = source.fCdzTPC;
746 fCzzTPC = source.fCzzTPC;
747 fCchi2TPC = source.fCchi2TPC;
754 fCchi2 = source.fCchi2;
756 fITSchi2 = source.fITSchi2;
757 fTPCchi2 = source.fTPCchi2;
758 fTRDchi2 = source.fTRDchi2;
759 fTOFchi2 = source.fTOFchi2;
760 fHMPIDchi2 = source.fHMPIDchi2;
763 fITSsignal = source.fITSsignal;
764 fTPCsignal = source.fTPCsignal;
765 fTPCsignalS = source.fTPCsignalS;
766 for(int i = 0; i< 4;++i){
767 fTPCPoints[i] = source.fTPCPoints[i];
769 fTRDsignal = source.fTRDsignal;
771 for(int i = 0;i < kTRDnPlanes;++i){
772 fTRDTimBin[i] = source.fTRDTimBin[i];
778 fTRDnSlices=source.fTRDnSlices;
780 fTRDslices=new Double32_t[fTRDnSlices];
781 for(int j = 0;j < fTRDnSlices;++j) fTRDslices[j] = source.fTRDslices[j];
784 fTRDQuality = source.fTRDQuality;
785 fTRDBudget = source.fTRDBudget;
786 fTOFsignal = source.fTOFsignal;
787 fTOFsignalToT = source.fTOFsignalToT;
788 fTOFsignalRaw = source.fTOFsignalRaw;
789 fTOFsignalDz = source.fTOFsignalDz;
791 for(int i = 0;i<10;++i){
792 fTOFInfo[i] = source.fTOFInfo[i];
795 fHMPIDtrkX = source.fHMPIDtrkX;
796 fHMPIDtrkY = source.fHMPIDtrkY;
797 fHMPIDmipX = source.fHMPIDmipX;
798 fHMPIDmipY = source.fHMPIDmipY;
800 fTPCncls = source.fTPCncls;
801 fTPCnclsF = source.fTPCnclsF;
802 fTPCsignalN = source.fTPCsignalN;
804 fITSncls = source.fITSncls;
805 fITSClusterMap = source.fITSClusterMap;
806 fTRDncls = source.fTRDncls;
807 fTRDncls0 = source.fTRDncls0;
808 fTRDpidQuality = source.fTRDpidQuality;
814 void AliESDtrack::Copy(TObject &obj) const {
816 // this overwrites the virtual TOBject::Copy()
817 // to allow run time copying without casting
820 if(this==&obj)return;
821 AliESDtrack *robj = dynamic_cast<AliESDtrack*>(&obj);
822 if(!robj)return; // not an AliESDtrack
829 void AliESDtrack::AddCalibObject(TObject * object){
831 // add calib object to the list
833 if (!fFriendTrack) fFriendTrack = new AliESDfriendTrack;
834 fFriendTrack->AddCalibObject(object);
837 TObject * AliESDtrack::GetCalibObject(Int_t index){
839 // return calib objct at given position
841 if (!fFriendTrack) return 0;
842 return fFriendTrack->GetCalibObject(index);
846 Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
848 // Fills the information of the TPC-only first reconstruction pass
849 // into the passed ESDtrack object. For consistency fTPCInner is also filled
854 // For data produced before r26675
855 // RelateToVertexTPC was not properly called during reco
856 // so you'll have to call it again, before FillTPCOnlyTrack
857 // Float_t p[2],cov[3];
858 // track->GetImpactParametersTPC(p,cov);
859 // if(p[0]==0&&p[1]==0) // <- Default values
860 // track->RelateToVertexTPC(esd->GetPrimaryVertexTPC(),esd->GetMagneticField(),kVeryBig);
863 if(!fTPCInner)return kFALSE;
865 // fill the TPC track params to the global track parameters
866 track.Set(fTPCInner->GetX(),fTPCInner->GetAlpha(),fTPCInner->GetParameter(),fTPCInner->GetCovariance());
869 track.fCdd = fCddTPC;
870 track.fCdz = fCdzTPC;
871 track.fCzz = fCzzTPC;
873 // copy the TPCinner parameters
874 if(track.fTPCInner) *track.fTPCInner = *fTPCInner;
875 else track.fTPCInner = new AliExternalTrackParam(*fTPCInner);
878 track.fCddTPC = fCddTPC;
879 track.fCdzTPC = fCdzTPC;
880 track.fCzzTPC = fCzzTPC;
881 track.fCchi2TPC = fCchi2TPC;
884 // copy all other TPC specific parameters
886 // replace label by TPC label
887 track.fLabel = fTPCLabel;
888 track.fTPCLabel = fTPCLabel;
890 track.fTPCchi2 = fTPCchi2;
891 track.fTPCsignal = fTPCsignal;
892 track.fTPCsignalS = fTPCsignalS;
893 for(int i = 0;i<4;++i)track.fTPCPoints[i] = fTPCPoints[i];
895 track.fTPCncls = fTPCncls;
896 track.fTPCnclsF = fTPCnclsF;
897 track.fTPCsignalN = fTPCsignalN;
900 for(int i=0;i<AliPID::kSPECIES;++i){
901 track.fTPCr[i] = fTPCr[i];
902 // combined PID is TPC only!
903 track.fR[i] = fTPCr[i];
905 track.fTPCClusterMap = fTPCClusterMap;
906 track.fTPCSharedMap = fTPCSharedMap;
910 track.fFlags = kTPCin;
913 track.fFlags |= fFlags & kTPCpid; //copy the TPCpid status flag
915 for (Int_t i=0;i<3;i++) track.fKinkIndexes[i] = fKinkIndexes[i];
921 //_______________________________________________________________________
922 void AliESDtrack::MakeMiniESDtrack(){
923 // Resets everything except
924 // fFlags: Reconstruction status flags
925 // fLabel: Track label
926 // fID: Unique ID of the track
927 // Impact parameter information
928 // fR[AliPID::kSPECIES]: combined "detector response probability"
929 // Running track parameters in the base class (AliExternalTrackParam)
933 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] = 0;
935 // Reset track parameters constrained to the primary vertex
938 // Reset track parameters at the inner wall of TPC
940 delete fTPCInner;fTPCInner=0;
941 // Reset track parameters at the inner wall of the TRD
945 // Reset ITS track related information
950 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=0;
953 // Reset TPC related track information
962 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0;
964 for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
965 for (Int_t i=0; i<3;i++) fKinkIndexes[i] = 0;
966 for (Int_t i=0; i<3;i++) fV0Indexes[i] = 0;
968 // Reset TRD related track information
973 for (Int_t i=0;i<kTRDnPlanes;i++) {
976 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0;
986 // Reset TOF related track information
994 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
995 for (Int_t i=0;i<3;i++) fTOFLabel[i] = 0;
996 for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
998 // Reset HMPID related track information
1003 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i] = 0;
1010 fEMCALindex = kEMCALNoMatch;
1012 delete fFriendTrack; fFriendTrack = 0;
1014 //_______________________________________________________________________
1015 Double_t AliESDtrack::GetMass() const {
1016 // Returns the mass of the most probable particle type
1019 for (Int_t i=0; i<AliPID::kSPECIES; i++) {
1020 if (fR[i]>max) {k=i; max=fR[i];}
1022 if (k==0) { // dE/dx "crossing points" in the TPC
1024 if ((p>0.38)&&(p<0.48))
1025 if (fR[0]<fR[3]*10.) return AliPID::ParticleMass(AliPID::kKaon);
1026 if ((p>0.75)&&(p<0.85))
1027 if (fR[0]<fR[4]*10.) return AliPID::ParticleMass(AliPID::kProton);
1030 if (k==1) return AliPID::ParticleMass(AliPID::kMuon);
1031 if (k==2||k==-1) return AliPID::ParticleMass(AliPID::kPion);
1032 if (k==3) return AliPID::ParticleMass(AliPID::kKaon);
1033 if (k==4) return AliPID::ParticleMass(AliPID::kProton);
1034 AliWarning("Undefined mass !");
1035 return AliPID::ParticleMass(AliPID::kPion);
1038 //______________________________________________________________________________
1039 Double_t AliESDtrack::E() const
1041 // Returns the energy of the particle given its assumed mass.
1042 // Assumes the pion mass if the particle can't be identified properly.
1046 return TMath::Sqrt(p*p + m*m);
1049 //______________________________________________________________________________
1050 Double_t AliESDtrack::Y() const
1052 // Returns the rapidity of a particle given its assumed mass.
1053 // Assumes the pion mass if the particle can't be identified properly.
1057 if (e != TMath::Abs(pz)) { // energy was not equal to pz
1058 return 0.5*TMath::Log((e+pz)/(e-pz));
1059 } else { // energy was equal to pz
1064 //_______________________________________________________________________
1065 Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
1067 // This function updates track's running parameters
1073 fLabel=t->GetLabel();
1075 if (t->IsStartedTimeIntegral()) {
1077 Double_t times[10];t->GetIntegratedTimes(times); SetIntegratedTimes(times);
1078 SetIntegratedLength(t->GetIntegratedLength());
1081 Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1085 case kITSin: case kITSout: case kITSrefit:
1087 fITSncls=t->GetNumberOfClusters();
1088 index=fFriendTrack->GetITSindices();
1089 for (Int_t i=0;i<AliESDfriendTrack::kMaxITScluster;i++) {
1090 index[i]=t->GetClusterIndex(i);
1092 Int_t l=(index[i] & 0xf0000000) >> 28;
1093 SETBIT(fITSClusterMap,l);
1096 fITSchi2=t->GetChi2();
1097 fITSsignal=t->GetPIDsignal();
1098 fITSLabel = t->GetLabel();
1099 // keep in fOp the parameters outside ITS for ITS stand-alone tracks
1100 if (flags==kITSout) {
1101 if (!fOp) fOp=new AliExternalTrackParam(*t);
1103 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1107 case kTPCin: case kTPCrefit:
1108 fTPCLabel = t->GetLabel();
1109 if (flags==kTPCin) fTPCInner=new AliExternalTrackParam(*t);
1110 if (!fIp) fIp=new AliExternalTrackParam(*t);
1112 fIp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1114 index=fFriendTrack->GetTPCindices();
1115 if (flags & kTPCout){
1116 if (!fOp) fOp=new AliExternalTrackParam(*t);
1118 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1120 fTPCncls=t->GetNumberOfClusters();
1121 fTPCchi2=t->GetChi2();
1123 {//prevrow must be declared in separate namespace, otherwise compiler cries:
1124 //"jump to case label crosses initialization of `Int_t prevrow'"
1126 // for (Int_t i=0;i<fTPCncls;i++)
1127 for (Int_t i=0;i<AliESDfriendTrack::kMaxTPCcluster;i++)
1129 index[i]=t->GetClusterIndex(i);
1130 Int_t idx = index[i];
1132 if (idx<0) continue;
1134 // Piotr's Cluster Map for HBT
1135 // ### please change accordingly if cluster array is changing
1136 // to "New TPC Tracking" style (with gaps in array)
1137 Int_t sect = (idx&0xff000000)>>24;
1138 Int_t row = (idx&0x00ff0000)>>16;
1139 if (sect > 18) row +=63; //if it is outer sector, add number of inner sectors
1141 fTPCClusterMap.SetBitNumber(row,kTRUE);
1143 //Fill the gap between previous row and this row with 0 bits
1144 //In case ### pleas change it as well - just set bit 0 in case there
1145 //is no associated clusters for current "i"
1148 prevrow = row;//if previous bit was not assigned yet == this is the first one
1151 { //we don't know the order (inner to outer or reverse)
1152 //just to be save in case it is going to change
1165 for (Int_t j = n+1; j < m; j++)
1167 fTPCClusterMap.SetBitNumber(j,kFALSE);
1171 // End Of Piotr's Cluster Map for HBT
1174 fTPCsignal=t->GetPIDsignal();
1177 case kTRDout: case kTRDin: case kTRDrefit:
1178 index = fFriendTrack->GetTRDindices();
1179 fTRDLabel = t->GetLabel();
1180 fTRDchi2 = t->GetChi2();
1181 fTRDncls = t->GetNumberOfClusters();
1182 for (Int_t i=0;i<6;i++) index[i]=t->GetTrackletIndex(i);
1184 fTRDsignal=t->GetPIDsignal();
1187 if (!fOp) fOp=new AliExternalTrackParam(*t);
1189 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1190 fTRDncls0 = t->GetNumberOfClusters();
1199 AliError("Wrong flag !");
1206 //_______________________________________________________________________
1207 void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
1208 //---------------------------------------------------------------------
1209 // This function returns external representation of the track parameters
1210 //---------------------------------------------------------------------
1212 for (Int_t i=0; i<5; i++) p[i]=GetParameter()[i];
1215 //_______________________________________________________________________
1216 void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
1217 //---------------------------------------------------------------------
1218 // This function returns external representation of the cov. matrix
1219 //---------------------------------------------------------------------
1220 for (Int_t i=0; i<15; i++) cov[i]=AliExternalTrackParam::GetCovariance()[i];
1223 //_______________________________________________________________________
1224 Bool_t AliESDtrack::GetConstrainedExternalParameters
1225 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1226 //---------------------------------------------------------------------
1227 // This function returns the constrained external track parameters
1228 //---------------------------------------------------------------------
1229 if (!fCp) return kFALSE;
1230 alpha=fCp->GetAlpha();
1232 for (Int_t i=0; i<5; i++) p[i]=fCp->GetParameter()[i];
1236 //_______________________________________________________________________
1238 AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
1239 //---------------------------------------------------------------------
1240 // This function returns the constrained external cov. matrix
1241 //---------------------------------------------------------------------
1242 if (!fCp) return kFALSE;
1243 for (Int_t i=0; i<15; i++) c[i]=fCp->GetCovariance()[i];
1248 AliESDtrack::GetInnerExternalParameters
1249 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1250 //---------------------------------------------------------------------
1251 // This function returns external representation of the track parameters
1252 // at the inner layer of TPC
1253 //---------------------------------------------------------------------
1254 if (!fIp) return kFALSE;
1255 alpha=fIp->GetAlpha();
1257 for (Int_t i=0; i<5; i++) p[i]=fIp->GetParameter()[i];
1262 AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
1263 //---------------------------------------------------------------------
1264 // This function returns external representation of the cov. matrix
1265 // at the inner layer of TPC
1266 //---------------------------------------------------------------------
1267 if (!fIp) return kFALSE;
1268 for (Int_t i=0; i<15; i++) cov[i]=fIp->GetCovariance()[i];
1273 AliESDtrack::SetOuterParam(const AliExternalTrackParam *p, ULong_t flags) {
1275 // This is a direct setter for the outer track parameters
1278 if (fOp) delete fOp;
1279 fOp=new AliExternalTrackParam(*p);
1283 AliESDtrack::GetOuterExternalParameters
1284 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1285 //---------------------------------------------------------------------
1286 // This function returns external representation of the track parameters
1287 // at the inner layer of TRD
1288 //---------------------------------------------------------------------
1289 if (!fOp) return kFALSE;
1290 alpha=fOp->GetAlpha();
1292 for (Int_t i=0; i<5; i++) p[i]=fOp->GetParameter()[i];
1297 AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
1298 //---------------------------------------------------------------------
1299 // This function returns external representation of the cov. matrix
1300 // at the inner layer of TRD
1301 //---------------------------------------------------------------------
1302 if (!fOp) return kFALSE;
1303 for (Int_t i=0; i<15; i++) cov[i]=fOp->GetCovariance()[i];
1307 Int_t AliESDtrack::GetNcls(Int_t idet) const
1309 // Get number of clusters by subdetector index
1323 if (fTOFindex != -1)
1329 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1330 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1341 Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
1343 // Get cluster index array by subdetector index
1348 ncls = GetITSclusters(idx);
1351 ncls = GetTPCclusters(idx);
1354 ncls = GetTRDclusters(idx);
1357 if (fTOFindex != -1) {
1365 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1366 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1367 idx[0] = GetHMPIDcluIdx();
1380 //_______________________________________________________________________
1381 void AliESDtrack::GetIntegratedTimes(Double_t *times) const {
1382 // Returns the array with integrated times for each particle hypothesis
1383 for (Int_t i=0; i<AliPID::kSPECIES; i++) times[i]=fTrackTime[i];
1386 //_______________________________________________________________________
1387 void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
1388 // Sets the array with integrated times for each particle hypotesis
1389 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTrackTime[i]=times[i];
1392 //_______________________________________________________________________
1393 void AliESDtrack::SetITSpid(const Double_t *p) {
1394 // Sets values for the probability of each particle type (in ITS)
1395 SetPIDValues(fITSr,p,AliPID::kSPECIES);
1396 SetStatus(AliESDtrack::kITSpid);
1399 //_______________________________________________________________________
1400 void AliESDtrack::GetITSpid(Double_t *p) const {
1401 // Gets the probability of each particle type (in ITS)
1402 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fITSr[i];
1405 //_______________________________________________________________________
1406 Char_t AliESDtrack::GetITSclusters(Int_t *idx) const {
1407 //---------------------------------------------------------------------
1408 // This function returns indices of the assgined ITS clusters
1409 //---------------------------------------------------------------------
1411 Int_t *index=fFriendTrack->GetITSindices();
1412 for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) {
1413 if ( (i>=fITSncls) && (i<6) ) idx[i]=-1;
1414 else idx[i]=index[i];
1420 //_______________________________________________________________________
1421 Bool_t AliESDtrack::GetITSModuleIndexInfo(Int_t ilayer,Int_t &idet,Int_t &status,
1422 Float_t &xloc,Float_t &zloc) const {
1423 //----------------------------------------------------------------------
1424 // This function encodes in the module number also the status of cluster association
1425 // "status" can have the following values:
1426 // 1 "found" (cluster is associated),
1427 // 2 "dead" (module is dead from OCDB),
1428 // 3 "skipped" (module or layer forced to be skipped),
1429 // 4 "outinz" (track out of z acceptance),
1430 // 5 "nocls" (no clusters in the road),
1431 // 6 "norefit" (cluster rejected during refit),
1432 // 7 "deadzspd" (holes in z in SPD)
1433 // Also given are the coordinates of the crossing point of track and module
1434 // (in the local module ref. system)
1435 // WARNING: THIS METHOD HAS TO BE SYNCHRONIZED WITH AliITStrackV2::GetModuleIndexInfo()!
1436 //----------------------------------------------------------------------
1438 if(fITSModule[ilayer]==-1) {
1441 xloc=-99.; zloc=-99.;
1445 Int_t module = fITSModule[ilayer];
1447 idet = Int_t(module/1000000);
1449 module -= idet*1000000;
1451 status = Int_t(module/100000);
1453 module -= status*100000;
1455 Int_t signs = Int_t(module/10000);
1457 module-=signs*10000;
1459 Int_t xInt = Int_t(module/100);
1462 Int_t zInt = module;
1464 if(signs==1) { xInt*=1; zInt*=1; }
1465 if(signs==2) { xInt*=1; zInt*=-1; }
1466 if(signs==3) { xInt*=-1; zInt*=1; }
1467 if(signs==4) { xInt*=-1; zInt*=-1; }
1469 xloc = 0.1*(Float_t)xInt;
1470 zloc = 0.1*(Float_t)zInt;
1472 if(status==4) idet = -1;
1477 //_______________________________________________________________________
1478 UShort_t AliESDtrack::GetTPCclusters(Int_t *idx) const {
1479 //---------------------------------------------------------------------
1480 // This function returns indices of the assgined ITS clusters
1481 //---------------------------------------------------------------------
1483 Int_t *index=fFriendTrack->GetTPCindices();
1484 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=index[i];
1489 Double_t AliESDtrack::GetTPCdensity(Int_t row0, Int_t row1) const{
1491 // GetDensity of the clusters on given region between row0 and row1
1492 // Dead zone effect takin into acoount
1497 Int_t *index=fFriendTrack->GetTPCindices();
1498 for (Int_t i=row0;i<=row1;i++){
1499 Int_t idx = index[i];
1500 if (idx!=-1) good++; // track outside of dead zone
1503 Float_t density=0.5;
1504 if (good>(row1-row0)*0.5) density = Float_t(found)/Float_t(good);
1508 //_______________________________________________________________________
1509 void AliESDtrack::SetTPCpid(const Double_t *p) {
1510 // Sets values for the probability of each particle type (in TPC)
1511 SetPIDValues(fTPCr,p,AliPID::kSPECIES);
1512 SetStatus(AliESDtrack::kTPCpid);
1515 //_______________________________________________________________________
1516 void AliESDtrack::GetTPCpid(Double_t *p) const {
1517 // Gets the probability of each particle type (in TPC)
1518 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTPCr[i];
1521 //_______________________________________________________________________
1522 UChar_t AliESDtrack::GetTRDclusters(Int_t *idx) const {
1523 //---------------------------------------------------------------------
1524 // This function returns indices of the assgined TRD clusters
1525 //---------------------------------------------------------------------
1527 Int_t *index=fFriendTrack->GetTRDindices();
1528 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=index[i];
1533 //_______________________________________________________________________
1534 UChar_t AliESDtrack::GetTRDtracklets(Int_t *idx) const {
1535 //---------------------------------------------------------------------
1536 // This function returns indices of the assigned TRD tracklets
1537 //---------------------------------------------------------------------
1539 Int_t *index=fFriendTrack->GetTRDindices();
1540 for (Int_t i=0; i<6/*AliESDfriendTrack::kMaxTRDcluster*/; i++) idx[i]=index[i];
1545 //_______________________________________________________________________
1546 void AliESDtrack::SetTRDpid(const Double_t *p) {
1547 // Sets values for the probability of each particle type (in TRD)
1548 SetPIDValues(fTRDr,p,AliPID::kSPECIES);
1549 SetStatus(AliESDtrack::kTRDpid);
1552 //_______________________________________________________________________
1553 void AliESDtrack::GetTRDpid(Double_t *p) const {
1554 // Gets the probability of each particle type (in TRD)
1555 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTRDr[i];
1558 //_______________________________________________________________________
1559 void AliESDtrack::SetTRDpid(Int_t iSpecies, Float_t p)
1561 // Sets the probability of particle type iSpecies to p (in TRD)
1562 fTRDr[iSpecies] = p;
1565 Double_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
1567 // Returns the probability of particle type iSpecies (in TRD)
1568 return fTRDr[iSpecies];
1571 void AliESDtrack::SetNumberOfTRDslices(Int_t n) {
1572 //Sets the number of slices used for PID
1573 if (fTRDnSlices != 0) return;
1574 fTRDnSlices=kTRDnPlanes*n;
1575 fTRDslices=new Double32_t[fTRDnSlices];
1576 for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=-1.;
1579 void AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
1580 //Sets the charge q in the slice of the plane
1581 Int_t ns=GetNumberOfTRDslices();
1583 AliError("No TRD slices allocated for this track !");
1587 if ((plane<0) || (plane>=kTRDnPlanes)) {
1588 AliError("Wrong TRD plane !");
1591 if ((slice<0) || (slice>=ns)) {
1592 AliError("Wrong TRD slice !");
1595 Int_t n=plane*ns + slice;
1599 Double_t AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
1600 //Gets the charge from the slice of the plane
1601 Int_t ns=GetNumberOfTRDslices();
1603 //AliError("No TRD slices allocated for this track !");
1607 if ((plane<0) || (plane>=kTRDnPlanes)) {
1608 AliError("Wrong TRD plane !");
1611 if ((slice<-1) || (slice>=ns)) {
1612 //AliError("Wrong TRD slice !");
1618 for (Int_t i=0; i<ns; i++) q+=fTRDslices[plane*ns + i];
1622 return fTRDslices[plane*ns + slice];
1626 //_______________________________________________________________________
1627 void AliESDtrack::SetTOFpid(const Double_t *p) {
1628 // Sets the probability of each particle type (in TOF)
1629 SetPIDValues(fTOFr,p,AliPID::kSPECIES);
1630 SetStatus(AliESDtrack::kTOFpid);
1633 //_______________________________________________________________________
1634 void AliESDtrack::SetTOFLabel(const Int_t *p) {
1636 for (Int_t i=0; i<3; i++) fTOFLabel[i]=p[i];
1639 //_______________________________________________________________________
1640 void AliESDtrack::GetTOFpid(Double_t *p) const {
1641 // Gets probabilities of each particle type (in TOF)
1642 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTOFr[i];
1645 //_______________________________________________________________________
1646 void AliESDtrack::GetTOFLabel(Int_t *p) const {
1648 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
1651 //_______________________________________________________________________
1652 void AliESDtrack::GetTOFInfo(Float_t *info) const {
1654 for (Int_t i=0; i<10; i++) info[i]=fTOFInfo[i];
1657 //_______________________________________________________________________
1658 void AliESDtrack::SetTOFInfo(Float_t*info) {
1660 for (Int_t i=0; i<10; i++) fTOFInfo[i]=info[i];
1665 //_______________________________________________________________________
1666 void AliESDtrack::SetHMPIDpid(const Double_t *p) {
1667 // Sets the probability of each particle type (in HMPID)
1668 SetPIDValues(fHMPIDr,p,AliPID::kSPECIES);
1669 SetStatus(AliESDtrack::kHMPIDpid);
1672 //_______________________________________________________________________
1673 void AliESDtrack::GetHMPIDpid(Double_t *p) const {
1674 // Gets probabilities of each particle type (in HMPID)
1675 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fHMPIDr[i];
1680 //_______________________________________________________________________
1681 void AliESDtrack::SetESDpid(const Double_t *p) {
1682 // Sets the probability of each particle type for the ESD track
1683 SetPIDValues(fR,p,AliPID::kSPECIES);
1684 SetStatus(AliESDtrack::kESDpid);
1687 //_______________________________________________________________________
1688 void AliESDtrack::GetESDpid(Double_t *p) const {
1689 // Gets probability of each particle type for the ESD track
1690 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
1693 //_______________________________________________________________________
1694 Bool_t AliESDtrack::RelateToVertexTPC(const AliESDVertex *vtx,
1695 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
1697 // Try to relate the TPC-only track parameters to the vertex "vtx",
1698 // if the (rough) transverse impact parameter is not bigger then "maxd".
1699 // Magnetic field is "b" (kG).
1701 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
1702 // b) The impact parameters and their covariance matrix are calculated.
1703 // c) An attempt to constrain the TPC-only params to the vertex is done.
1704 // The constrained params are returned via "cParam".
1706 // In the case of success, the returned value is kTRUE
1707 // otherwise, it's kFALSE)
1710 if (!fTPCInner) return kFALSE;
1711 if (!vtx) return kFALSE;
1713 Double_t dz[2],cov[3];
1714 if (!fTPCInner->PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
1722 Double_t covar[6]; vtx->GetCovMatrix(covar);
1723 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
1724 Double_t c[3]={covar[2],0.,covar[5]};
1726 Double_t chi2=GetPredictedChi2(p,c);
1727 if (chi2>kVeryBig) return kFALSE;
1731 if (!cParam) return kTRUE;
1733 *cParam = *fTPCInner;
1734 if (!cParam->Update(p,c)) return kFALSE;
1739 //_______________________________________________________________________
1740 Bool_t AliESDtrack::RelateToVertex(const AliESDVertex *vtx,
1741 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
1743 // Try to relate this track to the vertex "vtx",
1744 // if the (rough) transverse impact parameter is not bigger then "maxd".
1745 // Magnetic field is "b" (kG).
1747 // a) The track gets extapolated to the DCA to the vertex.
1748 // b) The impact parameters and their covariance matrix are calculated.
1749 // c) An attempt to constrain this track to the vertex is done.
1750 // The constrained params are returned via "cParam".
1752 // In the case of success, the returned value is kTRUE
1753 // (otherwise, it's kFALSE)
1756 if (!vtx) return kFALSE;
1758 Double_t dz[2],cov[3];
1759 if (!PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
1767 Double_t covar[6]; vtx->GetCovMatrix(covar);
1768 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
1769 Double_t c[3]={covar[2],0.,covar[5]};
1771 Double_t chi2=GetPredictedChi2(p,c);
1772 if (chi2>kVeryBig) return kFALSE;
1777 //--- Could now these lines be removed ? ---
1779 fCp=new AliExternalTrackParam(*this);
1781 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
1782 //----------------------------------------
1785 if (!cParam) return kTRUE;
1788 if (!cParam->Update(p,c)) return kFALSE;
1793 //_______________________________________________________________________
1794 void AliESDtrack::Print(Option_t *) const {
1795 // Prints info on the track
1796 AliExternalTrackParam::Print();
1797 printf("ESD track info\n") ;
1798 Double_t p[AliPID::kSPECIESN] ;
1800 if( IsOn(kITSpid) ){
1801 printf("From ITS: ") ;
1803 for(index = 0 ; index < AliPID::kSPECIES; index++)
1804 printf("%f, ", p[index]) ;
1805 printf("\n signal = %f\n", GetITSsignal()) ;
1807 if( IsOn(kTPCpid) ){
1808 printf("From TPC: ") ;
1810 for(index = 0 ; index < AliPID::kSPECIES; index++)
1811 printf("%f, ", p[index]) ;
1812 printf("\n signal = %f\n", GetTPCsignal()) ;
1814 if( IsOn(kTRDpid) ){
1815 printf("From TRD: ") ;
1817 for(index = 0 ; index < AliPID::kSPECIES; index++)
1818 printf("%f, ", p[index]) ;
1819 printf("\n signal = %f\n", GetTRDsignal()) ;
1821 if( IsOn(kTOFpid) ){
1822 printf("From TOF: ") ;
1824 for(index = 0 ; index < AliPID::kSPECIES; index++)
1825 printf("%f, ", p[index]) ;
1826 printf("\n signal = %f\n", GetTOFsignal()) ;
1828 if( IsOn(kHMPIDpid) ){
1829 printf("From HMPID: ") ;
1831 for(index = 0 ; index < AliPID::kSPECIES; index++)
1832 printf("%f, ", p[index]) ;
1833 printf("\n signal = %f\n", GetHMPIDsignal()) ;
1839 // Draw functionality
1840 // Origin: Marian Ivanov, Marian.Ivanov@cern.ch
1842 void AliESDtrack::FillPolymarker(TPolyMarker3D *pol, Float_t magF, Float_t minR, Float_t maxR, Float_t stepR){
1844 // Fill points in the polymarker
1847 arrayRef.AddLast(new AliExternalTrackParam(*this));
1848 if (fIp) arrayRef.AddLast(new AliExternalTrackParam(*fIp));
1849 if (fOp) arrayRef.AddLast(new AliExternalTrackParam(*fOp));
1851 Double_t mpos[3]={0,0,0};
1852 Int_t entries=arrayRef.GetEntries();
1853 for (Int_t i=0;i<entries;i++){
1855 ((AliExternalTrackParam*)arrayRef.At(i))->GetXYZ(pos);
1856 mpos[0]+=pos[0]/entries;
1857 mpos[1]+=pos[1]/entries;
1858 mpos[2]+=pos[2]/entries;
1860 // Rotate to the mean position
1862 Float_t fi= TMath::ATan2(mpos[1],mpos[0]);
1863 for (Int_t i=0;i<entries;i++){
1864 Bool_t res = ((AliExternalTrackParam*)arrayRef.At(i))->Rotate(fi);
1865 if (!res) delete arrayRef.RemoveAt(i);
1868 for (Double_t r=minR; r<maxR; r+=stepR){
1870 Double_t mlpos[3]={0,0,0};
1871 for (Int_t i=0;i<entries;i++){
1872 Double_t point[3]={0,0,0};
1873 AliExternalTrackParam *param = ((AliExternalTrackParam*)arrayRef.At(i));
1874 if (!param) continue;
1875 if (param->GetXYZAt(r,magF,point)){
1876 Double_t weight = 1./(10.+(r-param->GetX())*(r-param->GetX()));
1878 mlpos[0]+=point[0]*weight;
1879 mlpos[1]+=point[1]*weight;
1880 mlpos[2]+=point[2]*weight;
1887 pol->SetPoint(counter,mlpos[0],mlpos[1], mlpos[2]);
1888 printf("xyz\t%f\t%f\t%f\n",mlpos[0], mlpos[1],mlpos[2]);