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
21 //-----------------------------------------------------------------
25 #include "AliESDVertex.h"
26 #include "AliESDtrack.h"
27 #include "AliKalmanTrack.h"
29 #include "AliTrackPointArray.h"
33 void SetPIDValues(Float_t * dest, const Double_t * src, Int_t n) {
34 // This function copies "n" PID weights from "scr" to "dest"
35 // and normalizes their sum to 1 thus producing conditional probabilities.
36 // The negative weights are set to 0.
37 // In case all the weights are non-positive they are replaced by
38 // uniform probabilities
42 Float_t uniform = 1./(Float_t)n;
45 for (Int_t i=0; i<n; i++)
55 for (Int_t i=0; i<n; i++) dest[i] /= sum;
57 for (Int_t i=0; i<n; i++) dest[i] = uniform;
60 //_______________________________________________________________________
61 AliESDtrack::AliESDtrack() :
62 AliExternalTrackParam(),
68 fCdd(0),fCdz(0),fCzz(0),
82 fTPCClusterMap(159),//number of padrows
110 fFriendTrack(new AliESDfriendTrack())
113 // The default ESD constructor
116 for (i=0; i<AliPID::kSPECIES; i++) {
126 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
127 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
128 for (i=0;i<kNPlane;i++) {
129 for (j=0;j<kNSlice;j++) {
130 fTRDsignals[i][j]=0.;
134 for (i=0;i<4;i++) {fTPCPoints[i]=-1;}
135 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
136 for (i=0;i<10;i++) {fTOFInfo[i]=-1;}
139 //_______________________________________________________________________
140 AliESDtrack::AliESDtrack(const AliESDtrack& track):
141 AliExternalTrackParam(track),
142 fFlags(track.fFlags),
143 fLabel(track.fLabel),
145 fTrackLength(track.fTrackLength),
146 fD(track.fD),fZ(track.fZ),
147 fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
148 fStopVertex(track.fStopVertex),
150 fCchi2(track.fCchi2),
153 fITSchi2(track.fITSchi2),
154 fITSncls(track.fITSncls),
155 fITSsignal(track.fITSsignal),
156 fITSLabel(track.fITSLabel),
157 fITSFakeRatio(track.fITSFakeRatio),
158 fTPCchi2(track.fTPCchi2),
159 fTPCncls(track.fTPCncls),
160 fTPCnclsF(track.fTPCnclsF),
161 fTPCClusterMap(track.fTPCClusterMap),
162 fTPCsignal(track.fTPCsignal),
163 fTPCsignalN(track.fTPCsignalN),
164 fTPCsignalS(track.fTPCsignalS),
165 fTPCLabel(track.fTPCLabel),
166 fTRDchi2(track.fTRDchi2),
167 fTRDncls(track.fTRDncls),
168 fTRDncls0(track.fTRDncls0),
169 fTRDsignal(track.fTRDsignal),
170 fTRDLabel(track.fTRDLabel),
171 fTRDQuality(track.fTRDQuality),
172 fTRDBudget(track.fTRDBudget),
173 fTOFchi2(track.fTOFchi2),
174 fTOFindex(track.fTOFindex),
175 fTOFCalChannel(track.fTOFCalChannel),
176 fTOFsignal(track.fTOFsignal),
177 fTOFsignalToT(track.fTOFsignalToT),
178 fRICHchi2(track.fRICHchi2),
179 fRICHncls(track.fRICHncls),
180 fRICHindex(track.fRICHindex),
181 fRICHsignal(track.fRICHsignal),
182 fRICHtheta(track.fRICHtheta),
183 fRICHphi(track.fRICHphi),
184 fRICHdx(track.fRICHdx),
185 fRICHdy(track.fRICHdy),
186 fRICHmipX(track.fRICHmipX),
187 fRICHmipY(track.fRICHmipY),
194 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i]=track.fTrackTime[i];
195 for (Int_t i=0;i<AliPID::kSPECIES;i++) fR[i]=track.fR[i];
197 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=track.fITSr[i];
199 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=track.fTPCr[i];
200 for (Int_t i=0;i<4;i++) {fTPCPoints[i]=track.fTPCPoints[i];}
201 for (Int_t i=0; i<3;i++) { fKinkIndexes[i]=track.fKinkIndexes[i];}
202 for (Int_t i=0; i<3;i++) { fV0Indexes[i]=track.fV0Indexes[i];}
204 for (Int_t i=0;i<kNPlane;i++) {
205 for (Int_t j=0;j<kNSlice;j++) {
206 fTRDsignals[i][j]=track.fTRDsignals[i][j];
208 fTRDTimBin[i]=track.fTRDTimBin[i];
210 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i]=track.fTRDr[i];
211 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i]=track.fTOFr[i];
212 for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
213 for (Int_t i=0;i<10;i++) fTOFInfo[i]=track.fTOFInfo[i];
214 for (Int_t i=0;i<AliPID::kSPECIES;i++) fRICHr[i]=track.fRICHr[i];
216 if (track.fCp) fCp=new AliExternalTrackParam(*track.fCp);
217 if (track.fIp) fIp=new AliExternalTrackParam(*track.fIp);
218 if (track.fOp) fOp=new AliExternalTrackParam(*track.fOp);
220 if (track.fPoints) fPoints=new AliTrackPointArray(*(track.fPoints));
221 if (track.fFriendTrack) fFriendTrack=new AliESDfriendTrack(*(track.fFriendTrack));
224 //_______________________________________________________________________
225 AliESDtrack::~AliESDtrack(){
227 // This is destructor according Coding Conventrions
229 //printf("Delete track\n");
237 void AliESDtrack::AddCalibObject(TObject * object){
239 // add calib object to the list
241 if (!fFriendTrack) fFriendTrack = new AliESDfriendTrack;
242 fFriendTrack->AddCalibObject(object);
245 TObject * AliESDtrack::GetCalibObject(Int_t index){
247 // return calib objct at given position
249 if (!fFriendTrack) return 0;
250 return fFriendTrack->GetCalibObject(index);
254 //_______________________________________________________________________
255 void AliESDtrack::MakeMiniESDtrack(){
256 // Resets everything except
257 // fFlags: Reconstruction status flags
258 // fLabel: Track label
259 // fID: Unique ID of the track
260 // fD: Impact parameter in XY-plane
261 // fZ: Impact parameter in Z
262 // fR[AliPID::kSPECIES]: combined "detector response probability"
263 // Running track parameters in the base class (AliExternalTrackParam)
266 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] = 0;
269 // Reset track parameters constrained to the primary vertex
273 // Reset track parameters at the inner wall of TPC
276 // Reset track parameters at the inner wall of the TRD
279 // Reset ITS track related information
283 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=0;
287 // Reset TPC related track information
295 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0;
297 for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
298 for (Int_t i=0; i<3;i++) fKinkIndexes[i] = 0;
299 for (Int_t i=0; i<3;i++) fV0Indexes[i] = 0;
301 // Reset TRD related track information
306 for (Int_t i=0;i<kNPlane;i++) {
307 for (Int_t j=0;j<kNSlice;j++) {
308 fTRDsignals[i][j] = 0;
312 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0;
317 // Reset TOF related track information
323 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
324 for (Int_t i=0;i<3;i++) fTOFLabel[i] = 0;
325 for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
327 // Reset RICH related track information
332 for (Int_t i=0;i<AliPID::kSPECIES;i++) fRICHr[i] = 0;
340 delete fFriendTrack; fFriendTrack = 0;
341 delete fPoints; fPoints = 0;
343 //_______________________________________________________________________
344 Double_t AliESDtrack::GetMass() const {
345 // Returns the mass of the most probable particle type
348 for (Int_t i=0; i<AliPID::kSPECIES; i++) {
349 if (fR[i]>max) {k=i; max=fR[i];}
351 if (k==0) { // dE/dx "crossing points" in the TPC
353 if ((p>0.38)&&(p<0.48))
354 if (fR[0]<fR[3]*10.) return AliPID::ParticleMass(AliPID::kKaon);
355 if ((p>0.75)&&(p<0.85))
356 if (fR[0]<fR[4]*10.) return AliPID::ParticleMass(AliPID::kProton);
359 if (k==1) return AliPID::ParticleMass(AliPID::kMuon);
360 if (k==2||k==-1) return AliPID::ParticleMass(AliPID::kPion);
361 if (k==3) return AliPID::ParticleMass(AliPID::kKaon);
362 if (k==4) return AliPID::ParticleMass(AliPID::kProton);
363 AliWarning("Undefined mass !");
364 return AliPID::ParticleMass(AliPID::kPion);
367 //_______________________________________________________________________
368 Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
370 // This function updates track's running parameters
376 fLabel=t->GetLabel();
378 if (t->IsStartedTimeIntegral()) {
380 Double_t times[10];t->GetIntegratedTimes(times); SetIntegratedTimes(times);
381 SetIntegratedLength(t->GetIntegratedLength());
388 case kITSin: case kITSout: case kITSrefit:
389 index=fFriendTrack->GetITSindices();
390 for (Int_t i=0;i<AliESDfriendTrack::kMaxITScluster;i++)
391 index[i]=t->GetClusterIndex(i);
392 fITSncls=t->GetNumberOfClusters();
393 fITSchi2=t->GetChi2();
394 fITSsignal=t->GetPIDsignal();
395 fITSLabel = t->GetLabel();
396 fITSFakeRatio = t->GetFakeRatio();
399 case kTPCin: case kTPCrefit:
400 fTPCLabel = t->GetLabel();
401 if (!fIp) fIp=new AliExternalTrackParam(*t);
404 index=fFriendTrack->GetTPCindices();
405 if (flags & kTPCout){
406 if (!fOp) fOp=new AliExternalTrackParam(*t);
409 fTPCncls=t->GetNumberOfClusters();
410 fTPCchi2=t->GetChi2();
412 {//prevrow must be declared in separate namespace, otherwise compiler cries:
413 //"jump to case label crosses initialization of `Int_t prevrow'"
415 // for (Int_t i=0;i<fTPCncls;i++)
416 for (Int_t i=0;i<AliESDfriendTrack::kMaxTPCcluster;i++)
418 index[i]=t->GetClusterIndex(i);
419 Int_t idx = index[i];
423 // Piotr's Cluster Map for HBT
424 // ### please change accordingly if cluster array is changing
425 // to "New TPC Tracking" style (with gaps in array)
426 Int_t sect = (idx&0xff000000)>>24;
427 Int_t row = (idx&0x00ff0000)>>16;
428 if (sect > 18) row +=63; //if it is outer sector, add number of inner sectors
430 fTPCClusterMap.SetBitNumber(row,kTRUE);
432 //Fill the gap between previous row and this row with 0 bits
433 //In case ### pleas change it as well - just set bit 0 in case there
434 //is no associated clusters for current "i"
437 prevrow = row;//if previous bit was not assigned yet == this is the first one
440 { //we don't know the order (inner to outer or reverse)
441 //just to be save in case it is going to change
454 for (Int_t j = n+1; j < m; j++)
456 fTPCClusterMap.SetBitNumber(j,kFALSE);
460 // End Of Piotr's Cluster Map for HBT
463 fTPCsignal=t->GetPIDsignal();
466 case kTRDout: case kTRDin: case kTRDrefit:
467 index=fFriendTrack->GetTRDindices();
468 fTRDLabel = t->GetLabel();
469 fTRDncls=t->GetNumberOfClusters();
470 fTRDchi2=t->GetChi2();
471 for (Int_t i=0;i<fTRDncls;i++) index[i]=t->GetClusterIndex(i);
472 fTRDsignal=t->GetPIDsignal();
475 if (!fOp) fOp=new AliExternalTrackParam(*t);
477 fTRDncls0 = t->GetNumberOfClusters();
486 AliError("Wrong flag !");
493 //_______________________________________________________________________
494 void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
495 //---------------------------------------------------------------------
496 // This function returns external representation of the track parameters
497 //---------------------------------------------------------------------
499 for (Int_t i=0; i<5; i++) p[i]=GetParameter()[i];
502 //_______________________________________________________________________
503 void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
504 //---------------------------------------------------------------------
505 // This function returns external representation of the cov. matrix
506 //---------------------------------------------------------------------
507 for (Int_t i=0; i<15; i++) cov[i]=AliExternalTrackParam::GetCovariance()[i];
510 //_______________________________________________________________________
511 Bool_t AliESDtrack::GetConstrainedExternalParameters
512 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
513 //---------------------------------------------------------------------
514 // This function returns the constrained external track parameters
515 //---------------------------------------------------------------------
516 if (!fCp) return kFALSE;
517 alpha=fCp->GetAlpha();
519 for (Int_t i=0; i<5; i++) p[i]=fCp->GetParameter()[i];
523 //_______________________________________________________________________
525 AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
526 //---------------------------------------------------------------------
527 // This function returns the constrained external cov. matrix
528 //---------------------------------------------------------------------
529 if (!fCp) return kFALSE;
530 for (Int_t i=0; i<15; i++) c[i]=fCp->GetCovariance()[i];
535 AliESDtrack::GetInnerExternalParameters
536 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
537 //---------------------------------------------------------------------
538 // This function returns external representation of the track parameters
539 // at the inner layer of TPC
540 //---------------------------------------------------------------------
541 if (!fIp) return kFALSE;
542 alpha=fIp->GetAlpha();
544 for (Int_t i=0; i<5; i++) p[i]=fIp->GetParameter()[i];
549 AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
550 //---------------------------------------------------------------------
551 // This function returns external representation of the cov. matrix
552 // at the inner layer of TPC
553 //---------------------------------------------------------------------
554 if (!fIp) return kFALSE;
555 for (Int_t i=0; i<15; i++) cov[i]=fIp->GetCovariance()[i];
560 AliESDtrack::GetOuterExternalParameters
561 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
562 //---------------------------------------------------------------------
563 // This function returns external representation of the track parameters
564 // at the inner layer of TRD
565 //---------------------------------------------------------------------
566 if (!fOp) return kFALSE;
567 alpha=fOp->GetAlpha();
569 for (Int_t i=0; i<5; i++) p[i]=fOp->GetParameter()[i];
574 AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
575 //---------------------------------------------------------------------
576 // This function returns external representation of the cov. matrix
577 // at the inner layer of TRD
578 //---------------------------------------------------------------------
579 if (!fOp) return kFALSE;
580 for (Int_t i=0; i<15; i++) cov[i]=fOp->GetCovariance()[i];
584 Int_t AliESDtrack::GetNcls(Int_t idet) const
586 // Get number of clusters by subdetector index
609 Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
611 // Get cluster index array by subdetector index
616 ncls = GetITSclusters(idx);
619 ncls = GetTPCclusters(idx);
622 ncls = GetTRDclusters(idx);
625 if (fTOFindex != 0) {
626 idx[0] = GetTOFcluster();
636 //_______________________________________________________________________
637 void AliESDtrack::GetIntegratedTimes(Double_t *times) const {
638 // Returns the array with integrated times for each particle hypothesis
639 for (Int_t i=0; i<AliPID::kSPECIES; i++) times[i]=fTrackTime[i];
642 //_______________________________________________________________________
643 void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
644 // Sets the array with integrated times for each particle hypotesis
645 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTrackTime[i]=times[i];
648 //_______________________________________________________________________
649 void AliESDtrack::SetITSpid(const Double_t *p) {
650 // Sets values for the probability of each particle type (in ITS)
651 SetPIDValues(fITSr,p,AliPID::kSPECIES);
652 SetStatus(AliESDtrack::kITSpid);
655 //_______________________________________________________________________
656 void AliESDtrack::GetITSpid(Double_t *p) const {
657 // Gets the probability of each particle type (in ITS)
658 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fITSr[i];
661 //_______________________________________________________________________
662 Int_t AliESDtrack::GetITSclusters(Int_t *idx) const {
663 //---------------------------------------------------------------------
664 // This function returns indices of the assgined ITS clusters
665 //---------------------------------------------------------------------
667 Int_t *index=fFriendTrack->GetITSindices();
668 for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) idx[i]=index[i];
673 //_______________________________________________________________________
674 Int_t AliESDtrack::GetTPCclusters(Int_t *idx) const {
675 //---------------------------------------------------------------------
676 // This function returns indices of the assgined ITS clusters
677 //---------------------------------------------------------------------
679 Int_t *index=fFriendTrack->GetTPCindices();
680 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=index[i];
685 Float_t AliESDtrack::GetTPCdensity(Int_t row0, Int_t row1) const{
687 // GetDensity of the clusters on given region between row0 and row1
688 // Dead zone effect takin into acoount
693 Int_t *index=fFriendTrack->GetTPCindices();
694 for (Int_t i=row0;i<=row1;i++){
695 Int_t idx = index[i];
696 if (idx!=-1) good++; // track outside of dead zone
700 if (good>(row1-row0)*0.5) density = Float_t(found)/Float_t(good);
704 //_______________________________________________________________________
705 void AliESDtrack::SetTPCpid(const Double_t *p) {
706 // Sets values for the probability of each particle type (in TPC)
707 SetPIDValues(fTPCr,p,AliPID::kSPECIES);
708 SetStatus(AliESDtrack::kTPCpid);
711 //_______________________________________________________________________
712 void AliESDtrack::GetTPCpid(Double_t *p) const {
713 // Gets the probability of each particle type (in TPC)
714 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTPCr[i];
717 //_______________________________________________________________________
718 Int_t AliESDtrack::GetTRDclusters(Int_t *idx) const {
719 //---------------------------------------------------------------------
720 // This function returns indices of the assgined TRD clusters
721 //---------------------------------------------------------------------
723 Int_t *index=fFriendTrack->GetTRDindices();
724 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=index[i];
729 //_______________________________________________________________________
730 void AliESDtrack::SetTRDpid(const Double_t *p) {
731 // Sets values for the probability of each particle type (in TRD)
732 SetPIDValues(fTRDr,p,AliPID::kSPECIES);
733 SetStatus(AliESDtrack::kTRDpid);
736 //_______________________________________________________________________
737 void AliESDtrack::GetTRDpid(Double_t *p) const {
738 // Gets the probability of each particle type (in TRD)
739 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTRDr[i];
742 //_______________________________________________________________________
743 void AliESDtrack::SetTRDpid(Int_t iSpecies, Float_t p)
745 // Sets the probability of particle type iSpecies to p (in TRD)
749 Float_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
751 // Returns the probability of particle type iSpecies (in TRD)
752 return fTRDr[iSpecies];
755 //_______________________________________________________________________
756 void AliESDtrack::SetTOFpid(const Double_t *p) {
757 // Sets the probability of each particle type (in TOF)
758 SetPIDValues(fTOFr,p,AliPID::kSPECIES);
759 SetStatus(AliESDtrack::kTOFpid);
762 //_______________________________________________________________________
763 void AliESDtrack::SetTOFLabel(const Int_t *p) {
765 for (Int_t i=0; i<3; i++) fTOFLabel[i]=p[i];
768 //_______________________________________________________________________
769 void AliESDtrack::GetTOFpid(Double_t *p) const {
770 // Gets probabilities of each particle type (in TOF)
771 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTOFr[i];
774 //_______________________________________________________________________
775 void AliESDtrack::GetTOFLabel(Int_t *p) const {
777 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
780 //_______________________________________________________________________
781 void AliESDtrack::GetTOFInfo(Float_t *info) const {
783 for (Int_t i=0; i<10; i++) info[i]=fTOFInfo[i];
786 //_______________________________________________________________________
787 void AliESDtrack::SetTOFInfo(Float_t*info) {
789 for (Int_t i=0; i<10; i++) fTOFInfo[i]=info[i];
794 //_______________________________________________________________________
795 void AliESDtrack::SetRICHpid(const Double_t *p) {
796 // Sets the probability of each particle type (in RICH)
797 SetPIDValues(fRICHr,p,AliPID::kSPECIES);
798 SetStatus(AliESDtrack::kRICHpid);
801 //_______________________________________________________________________
802 void AliESDtrack::GetRICHpid(Double_t *p) const {
803 // Gets probabilities of each particle type (in RICH)
804 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fRICHr[i];
809 //_______________________________________________________________________
810 void AliESDtrack::SetESDpid(const Double_t *p) {
811 // Sets the probability of each particle type for the ESD track
812 SetPIDValues(fR,p,AliPID::kSPECIES);
813 SetStatus(AliESDtrack::kESDpid);
816 //_______________________________________________________________________
817 void AliESDtrack::GetESDpid(Double_t *p) const {
818 // Gets probability of each particle type for the ESD track
819 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
822 //_______________________________________________________________________
823 Bool_t AliESDtrack::RelateToVertex
824 (const AliESDVertex *vtx, Double_t b, Double_t maxd) {
826 // Try to relate this track to the vertex "vtx",
827 // if the (rough) transverse impact parameter is not bigger then "maxd".
828 // Magnetic field is "b" (kG).
830 // a) The track gets extapolated to the DCA to the vertex.
831 // b) The impact parameters and their covariance matrix are calculated.
832 // c) An attempt to constrain this track to the vertex is done.
834 // In the case of success, the returned value is kTRUE
835 // (otherwise, it's kFALSE)
838 if (!vtx) return kFALSE;
840 Double_t alpha=GetAlpha();
841 Double_t sn=TMath::Sin(alpha), cs=TMath::Cos(alpha);
842 Double_t x=GetX(), y=GetParameter()[0], snp=GetParameter()[2];
843 Double_t xv= vtx->GetXv()*cs + vtx->GetYv()*sn;
844 Double_t yv=-vtx->GetXv()*sn + vtx->GetYv()*cs, zv=vtx->GetZv();
847 //Estimate the impact parameter neglecting the track curvature
848 Double_t d=TMath::Abs(x*snp - y*TMath::Sqrt(1.- snp*snp));
849 if (d > maxd) return kFALSE;
851 //Propagate to the DCA
852 Double_t crv=kB2C*b*GetParameter()[4];
853 if (TMath::Abs(b) < kAlmost0Field) crv=0.;
855 Double_t tgfv=-(crv*x - snp)/(crv*y + TMath::Sqrt(1.-snp*snp));
856 sn=tgfv/TMath::Sqrt(1.+ tgfv*tgfv);
857 if (TMath::Abs(tgfv)>0.) cs = sn/tgfv;
861 yv=-xv*sn + yv*cs; xv=x;
863 if (!Propagate(alpha+TMath::ASin(sn),xv,b)) return kFALSE;
865 fD = GetParameter()[0] - yv;
866 fZ = GetParameter()[1] - zv;
868 Double_t cov[6]; vtx->GetCovMatrix(cov);
869 fCdd = GetCovariance()[0] + cov[2]; // neglecting non-diagonals
870 fCdz = GetCovariance()[1]; // in the vertex's
871 fCzz = GetCovariance()[2] + cov[5]; // covariance matrix
874 Double_t p[2]={yv,zv}, c[3]={cov[2],0.,cov[5]};
875 Double_t chi2=GetPredictedChi2(p,c);
877 if (chi2>77.) return kFALSE;
879 AliExternalTrackParam tmp(*this);
880 if (!tmp.Update(p,c)) return kFALSE;
883 if (!fCp) fCp=new AliExternalTrackParam();
884 new (fCp) AliExternalTrackParam(tmp);
890 void AliESDtrack::SetTrackPointArray(AliTrackPointArray *points) {
892 //fFriendTrack->SetTrackPointArray(points);
894 const AliTrackPointArray *AliESDtrack::GetTrackPointArray() const {
896 //return fFriendTrack->GetTrackPointArray();
899 //_______________________________________________________________________
900 void AliESDtrack::Print(Option_t *) const {
901 // Prints info on the track
903 printf("ESD track info\n") ;
904 Double_t p[AliPID::kSPECIESN] ;
907 printf("From ITS: ") ;
909 for(index = 0 ; index < AliPID::kSPECIES; index++)
910 printf("%f, ", p[index]) ;
911 printf("\n signal = %f\n", GetITSsignal()) ;
914 printf("From TPC: ") ;
916 for(index = 0 ; index < AliPID::kSPECIES; index++)
917 printf("%f, ", p[index]) ;
918 printf("\n signal = %f\n", GetTPCsignal()) ;
921 printf("From TRD: ") ;
923 for(index = 0 ; index < AliPID::kSPECIES; index++)
924 printf("%f, ", p[index]) ;
925 printf("\n signal = %f\n", GetTRDsignal()) ;
928 printf("From TOF: ") ;
930 for(index = 0 ; index < AliPID::kSPECIES; index++)
931 printf("%f, ", p[index]) ;
932 printf("\n signal = %f\n", GetTOFsignal()) ;
934 if( IsOn(kRICHpid) ){
935 printf("From RICH: ") ;
937 for(index = 0 ; index < AliPID::kSPECIES; index++)
938 printf("%f, ", p[index]) ;
939 printf("\n signal = %f\n", GetRICHsignal()) ;