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 "AliESDtrack.h"
26 #include "AliKalmanTrack.h"
31 //_______________________________________________________________________
32 AliESDtrack::AliESDtrack() :
54 fTPCClusterMap(159),//number of padrows
76 // The default ESD constructor
78 for (Int_t i=0; i<AliPID::kSPECIES; i++) {
88 for (Int_t i=0; i<AliPID::kSPECIESN; i++) {
94 fPHOSpos[0]=fPHOSpos[1]=fPHOSpos[2]=0.;
95 fEMCALpos[0]=fEMCALpos[1]=fEMCALpos[2]=0.;
98 fRp[i]=fCp[i]=fIp[i]=fTp[i]=0.;
100 for (i=0; i<15; i++) {
101 fRc[i]=fCc[i]=fIc[i]=fTc[i]=0.;
103 for (i=0; i<6; i++) { fITSindex[i]=0; }
104 for (i=0; i<180; i++){ fTPCindex[i]=0; }
105 for (i=0; i<3;i++) { fKinkIndexes[i]=0;}
106 for (i=0; i<3;i++) { fV0Indexes[i]=-1;}
107 for (i=0; i<130; i++) { fTRDindex[i]=0; }
108 for (i=0;i<kNPlane;i++) {fTRDsignals[i]=0.; fTRDTimBin[i]=-1;}
109 for (Int_t i=0;i<4;i++) {fTPCPoints[i]=-1;}
110 for (Int_t i=0;i<3;i++) {fTOFLabel[i]=-1;}
111 for (Int_t i=0;i<10;i++) {fTOFInfo[i]=-1;}
120 //_______________________________________________________________________
122 AliESDtrack::AliESDtrack(const AliESDtrack& track):TObject(track){
126 fFlags = track.fFlags;
127 fLabel =track.fLabel;
129 fTrackLength =track.fTrackLength;
130 fD=track.fD; fZ=track.fZ;
131 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] =track.fTrackTime[i];
132 for (Int_t i=0;i<AliPID::kSPECIES;i++) fR[i] =track.fR[i];
133 fStopVertex =track.fStopVertex;
135 fRalpha =track.fRalpha;
137 for (Int_t i=0;i<5;i++) fRp[i] =track.fRp[i];
138 for (Int_t i=0;i<15;i++) fRc[i] =track.fRc[i];
140 fCalpha =track.fCalpha;
142 for (Int_t i=0;i<5;i++) fCp[i] =track.fCp[i];
143 for (Int_t i=0;i<15;i++) fCc[i] =track.fCc[i];
144 fCchi2 =track.fCchi2;
146 fIalpha =track.fIalpha;
148 for (Int_t i=0;i<5;i++) fIp[i] =track.fIp[i];
149 for (Int_t i=0;i<15;i++) fIc[i] =track.fIc[i];
151 fTalpha =track.fTalpha;
153 for (Int_t i=0;i<5;i++) fTp[i] =track.fTp[i];
154 for (Int_t i=0;i<15;i++) fTc[i] =track.fTc[i];
156 fITSchi2 =track.fITSchi2;
157 for (Int_t i=0;i<12;i++) fITSchi2MIP[i] =track.fITSchi2MIP[i];
158 fITSncls =track.fITSncls;
159 for (Int_t i=0;i<6;i++) fITSindex[i]=track.fITSindex[i];
160 fITSsignal =track.fITSsignal;
161 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=track.fITSr[i];
162 fITSLabel =track.fITSLabel;
163 fITSFakeRatio =track.fITSFakeRatio;
164 fITStrack =0; //coping separatelly - in user code
166 fTPCchi2 =track.fTPCchi2;
167 fTPCncls =track.fTPCncls;
168 for (Int_t i=0;i<180;i++) fTPCindex[i]=track.fTPCindex[i];
169 fTPCClusterMap=track.fTPCClusterMap;
170 fTPCsignal=track.fTPCsignal;
171 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=track.fTPCr[i];
172 fTPCLabel=track.fTPCLabel;
173 for (Int_t i=0;i<4;i++) {fTPCPoints[i]=track.fTPCPoints[i];}
174 for (Int_t i=0; i<3;i++) { fKinkIndexes[i]=track.fKinkIndexes[i];}
175 for (Int_t i=0; i<3;i++) { fV0Indexes[i]=track.fV0Indexes[i];}
177 fTRDchi2=track.fTRDchi2;
178 fTRDncls=track.fTRDncls;
179 fTRDncls0=track.fTRDncls0;
180 for (Int_t i=0;i<130;i++) fTRDindex[i]=track.fTRDindex[i];
181 fTRDsignal=track.fTRDsignal;
182 for (Int_t i=0;i<kNPlane;i++) {
183 fTRDsignals[i]=track.fTRDsignals[i];
184 fTRDTimBin[i]=track.fTRDTimBin[i];
186 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i]=track.fTRDr[i];
187 fTRDLabel=track.fTRDLabel;
189 fTRDQuality = track.fTRDQuality;
191 fTOFchi2=track.fTOFchi2;
192 fTOFindex=track.fTOFindex;
193 fTOFsignal=track.fTOFsignal;
194 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i]=track.fTOFr[i];
195 for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
196 for (Int_t i=0;i<10;i++) fTOFInfo[i]=track.fTOFInfo[i];
198 for (Int_t i=0;i<3;i++) fPHOSpos[i]=track.fPHOSpos[i];
199 fPHOSsignal=track.fPHOSsignal;
200 for (Int_t i=0;i<AliPID::kSPECIESN;i++) fPHOSr[i]=track.fPHOSr[i];
202 for (Int_t i=0;i<3;i++) fEMCALpos[i]=track.fEMCALpos[i];
203 fEMCALsignal=track.fEMCALsignal;
204 for (Int_t i=0;i<AliPID::kSPECIESN;i++) fEMCALr[i]=track.fEMCALr[i];
206 fRICHchi2=track.fRICHchi2;
207 fRICHncls=track.fRICHncls;
208 fRICHindex=track.fRICHindex;
209 fRICHsignal=track.fRICHsignal;
210 for (Int_t i=0;i<AliPID::kSPECIES;i++) fRICHr[i]=track.fRICHr[i];
211 fRICHtheta=track.fRICHtheta;
212 fRICHphi=track.fRICHphi;
213 fRICHdx=track.fRICHdx;
214 fRICHdy=track.fRICHdy;
216 //_______________________________________________________________________
217 AliESDtrack::~AliESDtrack(){
219 // This is destructor according Coding Conventrions
221 //printf("Delete track\n");
226 //_______________________________________________________________________
227 void AliESDtrack::MakeMiniESDtrack(){
228 // Resets everything except
229 // fFlags: Reconstruction status flags
230 // fLabel: Track label
231 // fID: Unique ID of the track
232 // fD: Impact parameter in XY-plane
233 // fZ: Impact parameter in Z
234 // fR[AliPID::kSPECIES]: combined "detector response probability"
235 // Running track parameters
236 // fRalpha: track rotation angle
237 // fRx: X-coordinate of the track reference plane
238 // fRp[5]: external track parameters
239 // fRc[15]: external cov. matrix of the track parameters
242 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] = 0;
245 // Reset track parameters constrained to the primary vertex
248 for (Int_t i=0;i<5;i++) fCp[i] = 0;
249 for (Int_t i=0;i<15;i++) fCc[i] = 0;
252 // Reset track parameters at the inner wall of TPC
255 for (Int_t i=0;i<5;i++) fIp[i] = 0;
256 for (Int_t i=0;i<15;i++) fIc[i] = 0;
258 // Reset track parameters at the inner wall of the TRD
261 for (Int_t i=0;i<5;i++) fTp[i] = 0;
262 for (Int_t i=0;i<15;i++) fTc[i] = 0;
264 // Reset ITS track related information
266 for (Int_t i=0;i<12;i++) fITSchi2MIP[i] = 0;
268 for (Int_t i=0;i<6;i++) fITSindex[i]= 0;
270 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]= 0;
275 // Reset TPC related track information
278 for (Int_t i=0;i<180;i++) fTPCindex[i] = 0;
281 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0;
283 for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
284 for (Int_t i=0; i<3;i++) fKinkIndexes[i] = 0;
285 for (Int_t i=0; i<3;i++) fV0Indexes[i] = 0;
287 // Reset TRD related track information
291 for (Int_t i=0;i<130;i++) fTRDindex[i] = 0;
293 for (Int_t i=0;i<kNPlane;i++) {
297 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0;
302 // Reset TOF related track information
306 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
307 for (Int_t i=0;i<3;i++) fTOFLabel[i] = 0;
308 for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
310 // Reset PHOS related track information
311 for (Int_t i=0;i<3;i++) fPHOSpos[i] = 0;
313 for (Int_t i=0;i<AliPID::kSPECIESN;i++) fPHOSr[i] = 0;
315 // Reset EMCAL related track information
316 for (Int_t i=0;i<3;i++) fEMCALpos[i] = 0;
318 for (Int_t i=0;i<AliPID::kSPECIESN;i++) fEMCALr[i] = 0;
320 // Reset RICH related track information
325 for (Int_t i=0;i<AliPID::kSPECIES;i++) fRICHr[i] = 0;
332 //_______________________________________________________________________
333 Double_t AliESDtrack::GetMass() const {
334 // Returns the mass of the most probable particle type
337 for (Int_t i=0; i<AliPID::kSPECIES; i++) {
338 if (fR[i]>max) {k=i; max=fR[i];}
340 if (k==0) { // dE/dx "crossing points" in the TPC
342 if ((p>0.38)&&(p<0.48))
343 if (fR[0]<fR[3]*10.) return AliPID::ParticleMass(AliPID::kKaon);
344 if ((p>0.75)&&(p<0.85))
345 if (fR[0]<fR[4]*10.) return AliPID::ParticleMass(AliPID::kProton);
348 if (k==1) return AliPID::ParticleMass(AliPID::kMuon);
349 if (k==2||k==-1) return AliPID::ParticleMass(AliPID::kPion);
350 if (k==3) return AliPID::ParticleMass(AliPID::kKaon);
351 if (k==4) return AliPID::ParticleMass(AliPID::kProton);
352 AliWarning("Undefined mass !");
353 return AliPID::ParticleMass(AliPID::kPion);
356 //_______________________________________________________________________
357 Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags) {
359 // This function updates track's running parameters
364 fLabel=t->GetLabel();
366 if (t->IsStartedTimeIntegral()) {
368 Double_t times[10];t->GetIntegratedTimes(times); SetIntegratedTimes(times);
369 SetIntegratedLength(t->GetIntegratedLength());
372 fRalpha=t->GetAlpha();
373 t->GetExternalParameters(fRx,fRp);
374 t->GetExternalCovariance(fRc);
378 case kITSin: case kITSout: case kITSrefit:
379 fITSncls=t->GetNumberOfClusters();
380 fITSchi2=t->GetChi2();
381 for (Int_t i=0;i<fITSncls;i++) fITSindex[i]=t->GetClusterIndex(i);
382 fITSsignal=t->GetPIDsignal();
383 fITSLabel = t->GetLabel();
384 fITSFakeRatio = t->GetFakeRatio();
387 case kTPCin: case kTPCrefit:
388 fTPCLabel = t->GetLabel();
393 for (i=0; i<5; i++) fIp[i]=fRp[i];
394 for (i=0; i<15;i++) fIc[i]=fRc[i];
398 fTPCncls=t->GetNumberOfClusters();
399 fTPCchi2=t->GetChi2();
401 {//prevrow must be declared in separate namespace, otherwise compiler cries:
402 //"jump to case label crosses initialization of `Int_t prevrow'"
404 // for (Int_t i=0;i<fTPCncls;i++)
405 for (Int_t i=0;i<160;i++)
407 fTPCindex[i]=t->GetClusterIndex(i);
409 // Piotr's Cluster Map for HBT
410 // ### please change accordingly if cluster array is changing
411 // to "New TPC Tracking" style (with gaps in array)
412 Int_t idx = fTPCindex[i];
413 Int_t sect = (idx&0xff000000)>>24;
414 Int_t row = (idx&0x00ff0000)>>16;
415 if (sect > 18) row +=63; //if it is outer sector, add number of inner sectors
417 fTPCClusterMap.SetBitNumber(row,kTRUE);
419 //Fill the gap between previous row and this row with 0 bits
420 //In case ### pleas change it as well - just set bit 0 in case there
421 //is no associated clusters for current "i"
424 prevrow = row;//if previous bit was not assigned yet == this is the first one
427 { //we don't know the order (inner to outer or reverse)
428 //just to be save in case it is going to change
441 for (Int_t j = n+1; j < m; j++)
443 fTPCClusterMap.SetBitNumber(j,kFALSE);
447 // End Of Piotr's Cluster Map for HBT
450 fTPCsignal=t->GetPIDsignal();
451 {Double_t mass=t->GetMass(); // preliminary mass setting
452 if (mass>0.5) fR[4]=1.; // used by
453 else if (mass<0.4) fR[2]=1.; // the ITS reconstruction
458 case kTRDout: case kTRDin: case kTRDrefit:
459 fTRDLabel = t->GetLabel();
460 fTRDncls=t->GetNumberOfClusters();
461 fTRDchi2=t->GetChi2();
462 for (Int_t i=0;i<fTRDncls;i++) fTRDindex[i]=t->GetClusterIndex(i);
463 fTRDsignal=t->GetPIDsignal();
466 t->GetExternalParameters(fTx,fTp);
467 t->GetExternalCovariance(fTc);
468 fTalpha = t->GetAlpha();
469 fTRDncls0 = t->GetNumberOfClusters();
478 AliError("Wrong flag !");
485 //_______________________________________________________________________
487 AliESDtrack::SetConstrainedTrackParams(const AliKalmanTrack *t, Double_t chi2) {
489 // This function sets the constrained track parameters
493 fCalpha=t->GetAlpha();
494 t->GetExternalParameters(x,buf); fCx=x;
495 for (i=0; i<5; i++) fCp[i]=buf[i];
496 t->GetExternalCovariance(buf);
497 for (i=0; i<15; i++) fCc[i]=buf[i];
502 //_______________________________________________________________________
503 void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
504 //---------------------------------------------------------------------
505 // This function returns external representation of the track parameters
506 //---------------------------------------------------------------------
508 for (Int_t i=0; i<5; i++) p[i]=fRp[i];
511 //_______________________________________________________________________
512 Bool_t AliESDtrack::GetExternalParametersAt(Double_t x, Double_t p[5]) const {
513 //---------------------------------------------------------------------
514 // This function returns external representation of the track parameters
515 // at the position given by the first argument
516 //---------------------------------------------------------------------
518 Double_t f1=fRp[2], f2=f1 + dx*fRp[4]/AliKalmanTrack::GetConvConst();
520 if (TMath::Abs(f2) >= 0.9999) return kFALSE;
522 Double_t r1=TMath::Sqrt(1.- f1*f1), r2=TMath::Sqrt(1.- f2*f2);
523 p[0] = fRp[0] + dx*(f1+f2)/(r1+r2);
524 p[1] = fRp[1] + dx*(f1+f2)/(f1*r2 + f2*r1)*fRp[3];
532 //_______________________________________________________________________
533 void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
534 //---------------------------------------------------------------------
535 // This function returns external representation of the cov. matrix
536 //---------------------------------------------------------------------
537 for (Int_t i=0; i<15; i++) cov[i]=fRc[i];
541 //_______________________________________________________________________
543 AliESDtrack::GetConstrainedExternalParameters(Double_t &x, Double_t p[5])const{
544 //---------------------------------------------------------------------
545 // This function returns the constrained external track parameters
546 //---------------------------------------------------------------------
548 for (Int_t i=0; i<5; i++) p[i]=fCp[i];
550 //_______________________________________________________________________
552 AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
553 //---------------------------------------------------------------------
554 // This function returns the constrained external cov. matrix
555 //---------------------------------------------------------------------
556 for (Int_t i=0; i<15; i++) c[i]=fCc[i];
560 Double_t AliESDtrack::GetP() const {
561 //---------------------------------------------------------------------
562 // This function returns the track momentum
563 // Results for (nearly) straight tracks are meaningless !
564 //---------------------------------------------------------------------
565 if (TMath::Abs(fRp[4])<=0) return 0;
566 Double_t pt=1./TMath::Abs(fRp[4]);
567 return pt*TMath::Sqrt(1.+ fRp[3]*fRp[3]);
570 Bool_t Local2GlobalMomentum(Double_t p[3],Double_t alpha) {
571 //----------------------------------------------------------------
572 // This function performs local->global transformation of the
574 // When called, the arguments are:
575 // p[0] = 1/pt of the track;
576 // p[1] = sine of local azim. angle of the track momentum;
577 // p[2] = tangent of the track momentum dip angle;
578 // alpha - rotation angle.
579 // The result is returned as:
583 // Results for (nearly) straight tracks are meaningless !
584 //----------------------------------------------------------------
585 if (TMath::Abs(p[0])<=0) return kFALSE;
586 if (TMath::Abs(p[1])> 0.999999) return kFALSE;
588 Double_t pt=1./TMath::Abs(p[0]);
589 Double_t cs=TMath::Cos(alpha), sn=TMath::Sin(alpha);
590 Double_t r=TMath::Sqrt(1 - p[1]*p[1]);
591 p[0]=pt*(r*cs - p[1]*sn); p[1]=pt*(p[1]*cs + r*sn); p[2]=pt*p[2];
596 Bool_t Local2GlobalPosition(Double_t r[3],Double_t alpha) {
597 //----------------------------------------------------------------
598 // This function performs local->global transformation of the
600 // When called, the arguments are:
604 // alpha - rotation angle.
605 // The result is returned as:
609 //----------------------------------------------------------------
610 Double_t cs=TMath::Cos(alpha), sn=TMath::Sin(alpha), x=r[0];
611 r[0]=x*cs - r[1]*sn; r[1]=x*sn + r[1]*cs;
616 Bool_t AliESDtrack::GetConstrainedPxPyPz(Double_t *p) const {
617 //---------------------------------------------------------------------
618 // This function returns the constrained global track momentum components
619 // Results for (nearly) straight tracks are meaningless !
620 //---------------------------------------------------------------------
621 p[0]=fCp[4]; p[1]=fCp[2]; p[2]=fCp[3];
622 return Local2GlobalMomentum(p,fCalpha);
625 Bool_t AliESDtrack::GetConstrainedXYZ(Double_t *r) const {
626 //---------------------------------------------------------------------
627 // This function returns the constrained global track position
628 //---------------------------------------------------------------------
629 r[0]=fCx; r[1]=fCp[0]; r[2]=fCp[1];
630 return Local2GlobalPosition(r,fCalpha);
633 Bool_t AliESDtrack::GetPxPyPz(Double_t *p) const {
634 //---------------------------------------------------------------------
635 // This function returns the global track momentum components
636 // Results for (nearly) straight tracks are meaningless !
637 //---------------------------------------------------------------------
638 p[0]=fRp[4]; p[1]=fRp[2]; p[2]=fRp[3];
639 return Local2GlobalMomentum(p,fRalpha);
642 Bool_t AliESDtrack::GetXYZ(Double_t *r) const {
643 //---------------------------------------------------------------------
644 // This function returns the global track position
645 //---------------------------------------------------------------------
646 r[0]=fRx; r[1]=fRp[0]; r[2]=fRp[1];
647 return Local2GlobalPosition(r,fRalpha);
650 void AliESDtrack::GetCovariance(Double_t cv[21]) const {
651 //---------------------------------------------------------------------
652 // This function returns the global covariance matrix of the track params
654 // Cov(x,x) ... : cv[0]
655 // Cov(y,x) ... : cv[1] cv[2]
656 // Cov(z,x) ... : cv[3] cv[4] cv[5]
657 // Cov(px,x)... : cv[6] cv[7] cv[8] cv[9]
658 // Cov(py,x)... : cv[10] cv[11] cv[12] cv[13] cv[14]
659 // Cov(pz,x)... : cv[15] cv[16] cv[17] cv[18] cv[19] cv[20]
661 // Results for (nearly) straight tracks are meaningless !
662 //---------------------------------------------------------------------
663 if (TMath::Abs(fRp[4])<=0) {
664 for (Int_t i=0; i<21; i++) cv[i]=0.;
667 if (TMath::Abs(fRp[2]) > 0.999999) {
668 for (Int_t i=0; i<21; i++) cv[i]=0.;
671 Double_t pt=1./TMath::Abs(fRp[4]);
672 Double_t cs=TMath::Cos(fRalpha), sn=TMath::Sin(fRalpha);
673 Double_t r=TMath::Sqrt(1-fRp[2]*fRp[2]);
675 Double_t m00=-sn, m10=cs;
676 Double_t m23=-pt*(sn + fRp[2]*cs/r), m43=-pt*pt*(r*cs - fRp[2]*sn);
677 Double_t m24= pt*(cs - fRp[2]*sn/r), m44=-pt*pt*(r*sn + fRp[2]*cs);
678 Double_t m35=pt, m45=-pt*pt*fRp[3];
680 cv[0]=fRc[0]*m00*m00;
681 cv[1]=fRc[0]*m00*m10;
682 cv[2]=fRc[0]*m10*m10;
686 cv[6]=m00*(fRc[3]*m23+fRc[10]*m43);
687 cv[7]=m10*(fRc[3]*m23+fRc[10]*m43);
688 cv[8]=fRc[4]*m23+fRc[11]*m43;
689 cv[9]=m23*(fRc[5]*m23+fRc[12]*m43)+m43*(fRc[12]*m23+fRc[14]*m43);
690 cv[10]=m00*(fRc[3]*m24+fRc[10]*m44);
691 cv[11]=m10*(fRc[3]*m24+fRc[10]*m44);
692 cv[12]=fRc[4]*m24+fRc[11]*m44;
693 cv[13]=m23*(fRc[5]*m24+fRc[12]*m44)+m43*(fRc[12]*m24+fRc[14]*m44);
694 cv[14]=m24*(fRc[5]*m24+fRc[12]*m44)+m44*(fRc[12]*m24+fRc[14]*m44);
695 cv[15]=m00*(fRc[6]*m35+fRc[10]*m45);
696 cv[16]=m10*(fRc[6]*m35+fRc[10]*m45);
697 cv[17]=fRc[7]*m35+fRc[11]*m45;
698 cv[18]=m23*(fRc[8]*m35+fRc[12]*m45)+m43*(fRc[13]*m35+fRc[14]*m45);
699 cv[19]=m24*(fRc[8]*m35+fRc[12]*m45)+m44*(fRc[13]*m35+fRc[14]*m45);
700 cv[20]=m35*(fRc[9]*m35+fRc[13]*m45)+m45*(fRc[13]*m35+fRc[14]*m45);
703 Bool_t AliESDtrack::GetInnerPxPyPz(Double_t *p) const {
704 //---------------------------------------------------------------------
705 // This function returns the global track momentum components
706 // af the entrance of the TPC
707 //---------------------------------------------------------------------
708 p[0]=fIp[4]; p[1]=fIp[2]; p[2]=fIp[3];
709 return Local2GlobalMomentum(p,fIalpha);
712 Bool_t AliESDtrack::GetInnerXYZ(Double_t *r) const {
713 //---------------------------------------------------------------------
714 // This function returns the global track position
715 // af the entrance of the TPC
716 //---------------------------------------------------------------------
717 if (fIx==0) return kFALSE;
718 r[0]=fIx; r[1]=fIp[0]; r[2]=fIp[1];
719 return Local2GlobalPosition(r,fIalpha);
722 void AliESDtrack::GetInnerExternalParameters(Double_t &x, Double_t p[5]) const
725 //---------------------------------------------------------------------
726 // This function returns external representation of the track parameters at Inner Layer of TPC
727 //---------------------------------------------------------------------
729 for (Int_t i=0; i<5; i++) p[i]=fIp[i];
731 void AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const
734 //---------------------------------------------------------------------
735 // This function returns external representation of the cov. matrix at Inner Layer of TPC
736 //---------------------------------------------------------------------
737 for (Int_t i=0; i<15; i++) cov[i]=fIc[i];
741 void AliESDtrack::GetTRDExternalParameters(Double_t &x, Double_t&alpha, Double_t p[5], Double_t cov[15]) const
744 //this function returns TRD parameters
748 for (Int_t i=0; i<5; i++) p[i]=fTp[i];
749 for (Int_t i=0; i<15; i++) cov[i]=fTc[i];
752 Bool_t AliESDtrack::GetPxPyPzAt(Double_t x,Double_t *p) const {
753 //---------------------------------------------------------------------
754 // This function returns the global track momentum components
755 // at the position "x" using the helix track approximation
756 //---------------------------------------------------------------------
758 p[1]=fRp[2]+(x-fRx)*fRp[4]/AliKalmanTrack::GetConvConst();
760 return Local2GlobalMomentum(p,fRalpha);
763 Bool_t AliESDtrack::GetXYZAt(Double_t x, Double_t *r) const {
764 //---------------------------------------------------------------------
765 // This function returns the global track position
766 // af the radius "x" using the helix track approximation
767 //---------------------------------------------------------------------
769 Double_t f1=fRp[2], f2=f1 + dx*fRp[4]/AliKalmanTrack::GetConvConst();
771 if (TMath::Abs(f2) >= 0.9999) return kFALSE;
773 Double_t r1=TMath::Sqrt(1.- f1*f1), r2=TMath::Sqrt(1.- f2*f2);
775 r[1] = fRp[0] + dx*(f1+f2)/(r1+r2);
776 r[2] = fRp[1] + dx*(f1+f2)/(f1*r2 + f2*r1)*fRp[3];
777 return Local2GlobalPosition(r,fRalpha);
780 //_______________________________________________________________________
781 void AliESDtrack::GetIntegratedTimes(Double_t *times) const {
782 // Returns the array with integrated times for each particle hypothesis
783 for (Int_t i=0; i<AliPID::kSPECIES; i++) times[i]=fTrackTime[i];
786 //_______________________________________________________________________
787 void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
788 // Sets the array with integrated times for each particle hypotesis
789 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTrackTime[i]=times[i];
792 //_______________________________________________________________________
793 void AliESDtrack::SetITSpid(const Double_t *p) {
794 // Sets values for the probability of each particle type (in ITS)
795 for (Int_t i=0; i<AliPID::kSPECIES; i++) fITSr[i]=p[i];
796 SetStatus(AliESDtrack::kITSpid);
799 void AliESDtrack::SetITSChi2MIP(const Float_t *chi2mip){
800 for (Int_t i=0; i<12; i++) fITSchi2MIP[i]=chi2mip[i];
802 //_______________________________________________________________________
803 void AliESDtrack::GetITSpid(Double_t *p) const {
804 // Gets the probability of each particle type (in ITS)
805 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fITSr[i];
808 //_______________________________________________________________________
809 Int_t AliESDtrack::GetITSclusters(UInt_t *idx) const {
810 //---------------------------------------------------------------------
811 // This function returns indices of the assgined ITS clusters
812 //---------------------------------------------------------------------
813 for (Int_t i=0; i<fITSncls; i++) idx[i]=fITSindex[i];
817 //_______________________________________________________________________
818 Int_t AliESDtrack::GetTPCclusters(Int_t *idx) const {
819 //---------------------------------------------------------------------
820 // This function returns indices of the assgined ITS clusters
821 //---------------------------------------------------------------------
823 for (Int_t i=0; i<180; i++) idx[i]=fTPCindex[i]; // MI I prefer some constant
827 //_______________________________________________________________________
828 void AliESDtrack::SetTPCpid(const Double_t *p) {
829 // Sets values for the probability of each particle type (in TPC)
830 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTPCr[i]=p[i];
831 SetStatus(AliESDtrack::kTPCpid);
834 //_______________________________________________________________________
835 void AliESDtrack::GetTPCpid(Double_t *p) const {
836 // Gets the probability of each particle type (in TPC)
837 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTPCr[i];
840 //_______________________________________________________________________
841 Int_t AliESDtrack::GetTRDclusters(UInt_t *idx) const {
842 //---------------------------------------------------------------------
843 // This function returns indices of the assgined TRD clusters
844 //---------------------------------------------------------------------
846 for (Int_t i=0; i<130; i++) idx[i]=fTRDindex[i]; // MI I prefer some constant
850 //_______________________________________________________________________
851 void AliESDtrack::SetTRDpid(const Double_t *p) {
852 // Sets values for the probability of each particle type (in TRD)
853 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTRDr[i]=p[i];
854 SetStatus(AliESDtrack::kTRDpid);
857 //_______________________________________________________________________
858 void AliESDtrack::GetTRDpid(Double_t *p) const {
859 // Gets the probability of each particle type (in TRD)
860 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTRDr[i];
863 //_______________________________________________________________________
864 void AliESDtrack::SetTRDpid(Int_t iSpecies, Float_t p)
866 // Sets the probability of particle type iSpecies to p (in TRD)
870 Float_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
872 // Returns the probability of particle type iSpecies (in TRD)
873 return fTRDr[iSpecies];
876 //_______________________________________________________________________
877 void AliESDtrack::SetTOFpid(const Double_t *p) {
878 // Sets the probability of each particle type (in TOF)
879 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTOFr[i]=p[i];
880 SetStatus(AliESDtrack::kTOFpid);
883 //_______________________________________________________________________
884 void AliESDtrack::SetTOFLabel(const Int_t *p) {
886 for (Int_t i=0; i<3; i++) fTOFLabel[i]=p[i];
889 //_______________________________________________________________________
890 void AliESDtrack::GetTOFpid(Double_t *p) const {
891 // Gets probabilities of each particle type (in TOF)
892 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTOFr[i];
895 //_______________________________________________________________________
896 void AliESDtrack::GetTOFLabel(Int_t *p) const {
898 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
901 //_______________________________________________________________________
902 void AliESDtrack::GetTOFInfo(Float_t *info) const {
904 for (Int_t i=0; i<10; i++) info[i]=fTOFInfo[i];
907 //_______________________________________________________________________
908 void AliESDtrack::SetTOFInfo(Float_t*info) {
910 for (Int_t i=0; i<10; i++) fTOFInfo[i]=info[i];
915 //_______________________________________________________________________
916 void AliESDtrack::SetPHOSpid(const Double_t *p) {
917 // Sets the probability of each particle type (in PHOS)
918 for (Int_t i=0; i<AliPID::kSPECIESN; i++) fPHOSr[i]=p[i];
919 SetStatus(AliESDtrack::kPHOSpid);
922 //_______________________________________________________________________
923 void AliESDtrack::GetPHOSpid(Double_t *p) const {
924 // Gets probabilities of each particle type (in PHOS)
925 for (Int_t i=0; i<AliPID::kSPECIESN; i++) p[i]=fPHOSr[i];
928 //_______________________________________________________________________
929 void AliESDtrack::SetEMCALpid(const Double_t *p) {
930 // Sets the probability of each particle type (in EMCAL)
931 for (Int_t i=0; i<AliPID::kSPECIESN; i++) fEMCALr[i]=p[i];
932 SetStatus(AliESDtrack::kEMCALpid);
935 //_______________________________________________________________________
936 void AliESDtrack::GetEMCALpid(Double_t *p) const {
937 // Gets probabilities of each particle type (in EMCAL)
938 for (Int_t i=0; i<AliPID::kSPECIESN; i++) p[i]=fEMCALr[i];
941 //_______________________________________________________________________
942 void AliESDtrack::SetRICHpid(const Double_t *p) {
943 // Sets the probability of each particle type (in RICH)
944 for (Int_t i=0; i<AliPID::kSPECIES; i++) fRICHr[i]=p[i];
945 SetStatus(AliESDtrack::kRICHpid);
948 //_______________________________________________________________________
949 void AliESDtrack::GetRICHpid(Double_t *p) const {
950 // Gets probabilities of each particle type (in RICH)
951 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fRICHr[i];
956 //_______________________________________________________________________
957 void AliESDtrack::SetESDpid(const Double_t *p) {
958 // Sets the probability of each particle type for the ESD track
959 for (Int_t i=0; i<AliPID::kSPECIES; i++) fR[i]=p[i];
960 SetStatus(AliESDtrack::kESDpid);
963 //_______________________________________________________________________
964 void AliESDtrack::GetESDpid(Double_t *p) const {
965 // Gets probability of each particle type for the ESD track
966 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
969 //_______________________________________________________________________
970 void AliESDtrack::Print(Option_t *) const {
971 // Prints info on the track
973 printf("ESD track info\n") ;
974 Double_t p[AliPID::kSPECIESN] ;
977 printf("From ITS: ") ;
979 for(index = 0 ; index < AliPID::kSPECIES; index++)
980 printf("%f, ", p[index]) ;
981 printf("\n signal = %f\n", GetITSsignal()) ;
984 printf("From TPC: ") ;
986 for(index = 0 ; index < AliPID::kSPECIES; index++)
987 printf("%f, ", p[index]) ;
988 printf("\n signal = %f\n", GetTPCsignal()) ;
991 printf("From TRD: ") ;
993 for(index = 0 ; index < AliPID::kSPECIES; index++)
994 printf("%f, ", p[index]) ;
995 printf("\n signal = %f\n", GetTRDsignal()) ;
998 printf("From TOF: ") ;
1000 for(index = 0 ; index < AliPID::kSPECIES; index++)
1001 printf("%f, ", p[index]) ;
1002 printf("\n signal = %f\n", GetTOFsignal()) ;
1004 if( IsOn(kRICHpid) ){
1005 printf("From TOF: ") ;
1007 for(index = 0 ; index < AliPID::kSPECIES; index++)
1008 printf("%f, ", p[index]) ;
1009 printf("\n signal = %f\n", GetRICHsignal()) ;
1011 if( IsOn(kPHOSpid) ){
1012 printf("From PHOS: ") ;
1014 for(index = 0 ; index < AliPID::kSPECIESN; index++)
1015 printf("%f, ", p[index]) ;
1016 printf("\n signal = %f\n", GetPHOSsignal()) ;
1018 if( IsOn(kEMCALpid) ){
1019 printf("From EMCAL: ") ;
1021 for(index = 0 ; index < AliPID::kSPECIESN; index++)
1022 printf("%f, ", p[index]) ;
1023 printf("\n signal = %f\n", GetEMCALsignal()) ;