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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 /// \class AliESDMuonTrack
21 /// Class to describe the MUON tracks in the Event Summary Data class
22 /// This is where the results of reconstruction are stored for the muons
24 /// \author G.Martinez
26 ///////////////////////////////////////////////////////////////////////////////
28 #include "AliESDMuonTrack.h"
29 #include "AliESDMuonCluster.h"
30 #include "AliESDEvent.h"
32 #include <TClonesArray.h>
33 #include <TLorentzVector.h>
36 ClassImp(AliESDMuonTrack)
38 //_____________________________________________________________________________
39 AliESDMuonTrack::AliESDMuonTrack ():
41 fInverseBendingMomentum(FLT_MAX),
47 fInverseBendingMomentumAtDCA(FLT_MAX),
51 fNonBendingCoorAtDCA(0),
52 fInverseBendingMomentumUncorrected(FLT_MAX),
53 fThetaXUncorrected(0),
54 fThetaYUncorrected(0),
56 fBendingCoorUncorrected(0),
57 fNonBendingCoorUncorrected(0),
71 fHitsPatternInTrigCh(0),
72 fHitsPatternInTrigChTrk(0),
81 /// Default constructor
83 for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0;
87 //_____________________________________________________________________________
88 AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& muonTrack):
89 AliVParticle(muonTrack),
90 fInverseBendingMomentum(muonTrack.fInverseBendingMomentum),
91 fThetaX(muonTrack.fThetaX),
92 fThetaY(muonTrack.fThetaY),
94 fBendingCoor(muonTrack.fBendingCoor),
95 fNonBendingCoor(muonTrack.fNonBendingCoor),
96 fInverseBendingMomentumAtDCA(muonTrack.fInverseBendingMomentumAtDCA),
97 fThetaXAtDCA(muonTrack.fThetaXAtDCA),
98 fThetaYAtDCA(muonTrack.fThetaYAtDCA),
99 fBendingCoorAtDCA(muonTrack.fBendingCoorAtDCA),
100 fNonBendingCoorAtDCA(muonTrack.fNonBendingCoorAtDCA),
101 fInverseBendingMomentumUncorrected(muonTrack.fInverseBendingMomentumUncorrected),
102 fThetaXUncorrected(muonTrack.fThetaXUncorrected),
103 fThetaYUncorrected(muonTrack.fThetaYUncorrected),
104 fZUncorrected(muonTrack.fZUncorrected),
105 fBendingCoorUncorrected(muonTrack.fBendingCoorUncorrected),
106 fNonBendingCoorUncorrected(muonTrack.fNonBendingCoorUncorrected),
107 fRAtAbsorberEnd(muonTrack.fRAtAbsorberEnd),
108 fChi2(muonTrack.fChi2),
109 fChi2MatchTrigger(muonTrack.fChi2MatchTrigger),
110 fLocalTrigger(muonTrack.fLocalTrigger),
111 fX1Pattern(muonTrack.fX1Pattern),
112 fY1Pattern(muonTrack.fY1Pattern),
113 fX2Pattern(muonTrack.fX2Pattern),
114 fY2Pattern(muonTrack.fY2Pattern),
115 fX3Pattern(muonTrack.fX3Pattern),
116 fY3Pattern(muonTrack.fY3Pattern),
117 fX4Pattern(muonTrack.fX4Pattern),
118 fY4Pattern(muonTrack.fY4Pattern),
119 fMuonClusterMap(muonTrack.fMuonClusterMap),
120 fHitsPatternInTrigCh(muonTrack.fHitsPatternInTrigCh),
121 fHitsPatternInTrigChTrk(muonTrack.fHitsPatternInTrigChTrk),
122 fNHit(muonTrack.fNHit),
125 fLabel(muonTrack.fLabel),
126 fESDEvent(muonTrack.fESDEvent)
130 /// Deep copy implemented
132 for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
134 // necessary to make a copy of the objects and not only the pointers in TClonesArray
135 if (muonTrack.fClusters) {
136 fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast());
137 AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First();
139 new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
140 cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster);
144 // copy of cluster Ids
145 if (muonTrack.fClustersId) fClustersId = new TArrayI(*(muonTrack.fClustersId));
149 //_____________________________________________________________________________
150 AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& muonTrack)
153 /// Equal operator for a deep copy
155 if (this == &muonTrack)
158 AliVParticle::operator=(muonTrack); // don't forget to invoke the base class' assignment operator
160 fInverseBendingMomentum = muonTrack.fInverseBendingMomentum;
161 fThetaX = muonTrack.fThetaX;
162 fThetaY = muonTrack.fThetaY;
164 fBendingCoor = muonTrack.fBendingCoor;
165 fNonBendingCoor = muonTrack.fNonBendingCoor;
167 fInverseBendingMomentumAtDCA = muonTrack.fInverseBendingMomentumAtDCA;
168 fThetaXAtDCA = muonTrack.fThetaXAtDCA;
169 fThetaYAtDCA = muonTrack.fThetaYAtDCA;
170 fBendingCoorAtDCA = muonTrack.fBendingCoorAtDCA;
171 fNonBendingCoorAtDCA = muonTrack.fNonBendingCoorAtDCA;
173 fInverseBendingMomentumUncorrected = muonTrack.fInverseBendingMomentumUncorrected;
174 fThetaXUncorrected = muonTrack.fThetaXUncorrected;
175 fThetaYUncorrected = muonTrack.fThetaYUncorrected;
176 fZUncorrected = muonTrack.fZUncorrected;
177 fBendingCoorUncorrected = muonTrack.fBendingCoorUncorrected;
178 fNonBendingCoorUncorrected = muonTrack.fNonBendingCoorUncorrected;
180 for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
182 fRAtAbsorberEnd = muonTrack.fRAtAbsorberEnd;
184 fChi2 = muonTrack.fChi2;
185 fNHit = muonTrack.fNHit;
187 fLocalTrigger = muonTrack.fLocalTrigger;
188 fX1Pattern = muonTrack.fX1Pattern;
189 fY1Pattern = muonTrack.fY1Pattern;
190 fX2Pattern = muonTrack.fX2Pattern;
191 fY2Pattern = muonTrack.fY2Pattern;
192 fX3Pattern = muonTrack.fX3Pattern;
193 fY3Pattern = muonTrack.fY3Pattern;
194 fX4Pattern = muonTrack.fX4Pattern;
195 fY4Pattern = muonTrack.fY4Pattern;
196 fChi2MatchTrigger = muonTrack.fChi2MatchTrigger;
198 fHitsPatternInTrigCh = muonTrack.fHitsPatternInTrigCh;
199 fHitsPatternInTrigChTrk = muonTrack.fHitsPatternInTrigChTrk;
201 fMuonClusterMap = muonTrack.fMuonClusterMap;
203 fLabel = muonTrack.fLabel;
205 fESDEvent = muonTrack.fESDEvent;
207 // necessary to make a copy of the objects and not only the pointers in TClonesArray
209 if (muonTrack.fClusters) {
210 fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast());
211 AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First();
213 new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
214 cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster);
216 } else fClusters = 0x0;
218 // copy of cluster Ids
219 if (muonTrack.fClustersId) {
220 if (fClustersId) *fClustersId = *(muonTrack.fClustersId);
221 else fClustersId = new TArrayI(*(muonTrack.fClustersId));
230 //__________________________________________________________________________
231 void AliESDMuonTrack::Copy(TObject &obj) const {
233 /// This overwrites the virtual TOBject::Copy()
234 /// to allow run time copying without casting
237 if(this==&obj)return;
238 AliESDMuonTrack *robj = dynamic_cast<AliESDMuonTrack*>(&obj);
239 if(!robj)return; // not an AliESDMuonTrack
244 //__________________________________________________________________________
245 AliESDMuonTrack::~AliESDMuonTrack()
252 //__________________________________________________________________________
253 void AliESDMuonTrack::Clear(Option_t* opt)
256 if (opt && opt[0] == 'C') {
257 if (fClusters) fClusters->Clear("C");
259 delete fClusters; fClusters = 0x0;
261 delete fClustersId; fClustersId = 0x0;
265 //__________________________________________________________________________
266 void AliESDMuonTrack::Reset()
268 /// Reset to default values
270 fInverseBendingMomentum = FLT_MAX;
275 fNonBendingCoor = 0.;
276 fInverseBendingMomentumAtDCA = FLT_MAX;
279 fBendingCoorAtDCA = 0.;
280 fNonBendingCoorAtDCA = 0.;
281 fInverseBendingMomentumUncorrected = FLT_MAX;
282 fThetaXUncorrected = 0.;
283 fThetaYUncorrected = 0.;
285 fBendingCoorUncorrected = 0.;
286 fNonBendingCoorUncorrected = 0.;
287 fRAtAbsorberEnd = 0.;
289 fChi2MatchTrigger = 0.;
300 fHitsPatternInTrigCh = 0;
301 fHitsPatternInTrigChTrk = 0;
303 delete fClusters; fClusters = 0x0;
304 delete fClustersId; fClustersId = 0x0;
305 for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0.;
310 //_____________________________________________________________________________
311 void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const
313 /// return covariance matrix of uncorrected parameters
315 for (Int_t i = 0; i < 5; i++)
316 for (Int_t j = 0; j <= i; j++)
317 cov(i,j) = cov (j,i) = fCovariances[i*(i+1)/2 + j];
320 //_____________________________________________________________________________
321 void AliESDMuonTrack::SetCovariances(const TMatrixD& cov)
323 /// set reduced covariance matrix of uncorrected parameters
324 for (Int_t i = 0; i < 5; i++)
325 for (Int_t j = 0; j <= i; j++)
326 fCovariances[i*(i+1)/2 + j] = cov(i,j);
330 //_____________________________________________________________________________
331 void AliESDMuonTrack::GetCovarianceXYZPxPyPz(Double_t cov[21]) const
333 /// return reduced covariance matrix of uncorrected parameters in (X,Y,Z,Px,Py,Pz) coordinate system
335 /// - Cov(x,x) ... : cov[0]
336 /// - Cov(y,x) ... : cov[1] cov[2]
337 /// - Cov(z,x) ... : cov[3] cov[4] cov[5]
338 /// - Cov(px,x)... : cov[6] cov[7] cov[8] cov[9]
339 /// - Cov(py,x)... : cov[10] cov[11] cov[12] cov[13] cov[14]
340 /// - Cov(pz,x)... : cov[15] cov[16] cov[17] cov[18] cov[19] cov[20]
342 /// Get ESD covariance matrix into a TMatrixD
343 TMatrixD covESD(5,5);
344 GetCovariances(covESD);
346 // compute Jacobian to change the coordinate system
347 // from (X,thetaX,Y,thetaY,c/pYZ) to (X,Y,Z,pX,pY,pZ)
348 Double_t tanThetaX = TMath::Tan(fThetaXUncorrected);
349 Double_t tanThetaY = TMath::Tan(fThetaYUncorrected);
350 Double_t cosThetaX2 = TMath::Cos(fThetaXUncorrected) * TMath::Cos(fThetaXUncorrected);
351 Double_t cosThetaY2 = TMath::Cos(fThetaYUncorrected) * TMath::Cos(fThetaYUncorrected);
352 Double_t pZ = PzUncorrected();
353 Double_t dpZdthetaY = - fInverseBendingMomentumUncorrected * fInverseBendingMomentumUncorrected *
354 pZ * pZ * pZ * tanThetaY / cosThetaY2;
355 Double_t dpZdinvpYZ = (fInverseBendingMomentumUncorrected != 0.) ? - pZ / fInverseBendingMomentumUncorrected : - FLT_MAX;
360 jacob(3,1) = pZ / cosThetaX2;
361 jacob(3,3) = dpZdthetaY * tanThetaX;
362 jacob(3,4) = dpZdinvpYZ * tanThetaX;
363 jacob(4,3) = dpZdthetaY * tanThetaY + pZ / cosThetaY2;
364 jacob(4,4) = dpZdinvpYZ * tanThetaY;
365 jacob(5,3) = dpZdthetaY;
366 jacob(5,4) = dpZdinvpYZ;
368 // compute covariance matrix in AOD coordinate system
369 TMatrixD tmp(covESD,TMatrixD::kMultTranspose,jacob);
370 TMatrixD covAOD(jacob,TMatrixD::kMult,tmp);
372 // Get AOD covariance matrix into co[21]
373 for (Int_t i = 0; i < 6; i++)
374 for (Int_t j = 0; j <= i; j++)
375 cov[i*(i+1)/2 + j] = covAOD(i,j);
379 //_____________________________________________________________________________
380 Double_t AliESDMuonTrack::Px() const
382 /// return p_x from track parameters
383 Double_t nonBendingSlope = TMath::Tan(fThetaX);
384 Double_t bendingSlope = TMath::Tan(fThetaY);
385 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
386 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
387 return pZ * nonBendingSlope;
390 //_____________________________________________________________________________
391 Double_t AliESDMuonTrack::Py() const
393 /// return p_y from track parameters
394 Double_t bendingSlope = TMath::Tan(fThetaY);
395 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
396 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
397 return pZ * bendingSlope;
400 //_____________________________________________________________________________
401 Double_t AliESDMuonTrack::Pz() const
403 /// return p_z from track parameters
404 Double_t bendingSlope = TMath::Tan(fThetaY);
405 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
406 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
409 //_____________________________________________________________________________
410 Double_t AliESDMuonTrack::P() const
412 /// return p from track parameters
413 Double_t nonBendingSlope = TMath::Tan(fThetaX);
414 Double_t bendingSlope = TMath::Tan(fThetaY);
415 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
416 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
417 return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope);
420 //_____________________________________________________________________________
421 void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const
423 /// return Lorentz momentum vector from track parameters
424 Double_t muonMass = M();
425 Double_t nonBendingSlope = TMath::Tan(fThetaX);
426 Double_t bendingSlope = TMath::Tan(fThetaY);
427 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
428 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
429 Double_t pX = pZ * nonBendingSlope;
430 Double_t pY = pZ * bendingSlope;
431 Double_t e = TMath::Sqrt(muonMass*muonMass + pX*pX + pY*pY + pZ*pZ);
432 vP.SetPxPyPzE(pX, pY, pZ, e);
435 //_____________________________________________________________________________
436 Double_t AliESDMuonTrack::PxAtDCA() const
438 /// return p_x from track parameters
439 Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
440 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
441 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
442 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
443 return pZ * nonBendingSlope;
446 //_____________________________________________________________________________
447 Double_t AliESDMuonTrack::PyAtDCA() const
449 /// return p_y from track parameters
450 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
451 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
452 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
453 return pZ * bendingSlope;
456 //_____________________________________________________________________________
457 Double_t AliESDMuonTrack::PzAtDCA() const
459 /// return p_z from track parameters
460 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
461 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
462 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
465 //_____________________________________________________________________________
466 Double_t AliESDMuonTrack::PAtDCA() const
468 /// return p from track parameters
469 Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
470 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
471 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
472 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
473 return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope);
476 //_____________________________________________________________________________
477 void AliESDMuonTrack::LorentzPAtDCA(TLorentzVector& vP) const
479 /// return Lorentz momentum vector from track parameters
480 Double_t muonMass = M();
481 Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
482 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
483 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
484 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
485 Double_t pX = pZ * nonBendingSlope;
486 Double_t pY = pZ * bendingSlope;
487 Double_t e = TMath::Sqrt(muonMass*muonMass + pX*pX + pY*pY + pZ*pZ);
488 vP.SetPxPyPzE(pX, pY, pZ, e);
491 //_____________________________________________________________________________
492 Double_t AliESDMuonTrack::PxUncorrected() const
494 /// return p_x from track parameters
495 Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
496 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
497 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
498 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
499 return pZ * nonBendingSlope;
502 //_____________________________________________________________________________
503 Double_t AliESDMuonTrack::PyUncorrected() const
505 /// return p_y from track parameters
506 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
507 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
508 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
509 return pZ * bendingSlope;
512 //_____________________________________________________________________________
513 Double_t AliESDMuonTrack::PzUncorrected() const
515 /// return p_z from track parameters
516 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
517 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
518 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
521 //_____________________________________________________________________________
522 Double_t AliESDMuonTrack::PUncorrected() const
524 /// return p from track parameters
525 Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
526 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
527 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
528 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
529 return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope);
532 //_____________________________________________________________________________
533 void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const
535 /// return Lorentz momentum vector from track parameters
536 Double_t muonMass = M();
537 Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
538 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
539 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
540 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
541 Double_t pX = pZ * nonBendingSlope;
542 Double_t pY = pZ * bendingSlope;
543 Double_t e = TMath::Sqrt(muonMass*muonMass + pX*pX + pY*pY + pZ*pZ);
544 vP.SetPxPyPzE(pX, pY, pZ, e);
547 //_____________________________________________________________________________
548 Int_t AliESDMuonTrack::GetNDF() const
550 /// return the number of degrees of freedom
552 Int_t ndf = 2 * static_cast<Int_t>(fNHit) - 5;
553 return (ndf > 0) ? ndf : 0;
556 //_____________________________________________________________________________
557 Double_t AliESDMuonTrack::GetNormalizedChi2() const
559 /// return the chi2 value divided by the number of degrees of freedom
561 Int_t ndf = GetNDF();
562 return (ndf > 0) ? fChi2 / static_cast<Double_t>(ndf) : 0.;
565 //_____________________________________________________________________________
566 Int_t AliESDMuonTrack::GetMatchTrigger() const
568 /// backward compatibility after replacing fMatchTrigger by fLocalTrigger
569 /// - 0 track does not match trigger
570 /// - 1 track match but does not pass pt cut
571 /// - 2 track match Low pt cut
572 /// - 3 track match High pt cut
576 } else if (LoLpt() == 0 && LoHpt() == 0) {
578 } else if (LoLpt() > 0 && LoHpt() == 0) {
586 //_____________________________________________________________________________
587 Bool_t AliESDMuonTrack::MatchTriggerDigits(Bool_t fromTrack) const
589 // return kTRUE if the track matches a digit on both planes of at least 2 trigger chambers
591 UShort_t pattern = ( fromTrack ) ? fHitsPatternInTrigChTrk : fHitsPatternInTrigCh;
592 Int_t nMatchedChambers = 0;
593 for (Int_t ich=0; ich<4; ich++)
594 if (IsChamberHit(pattern, 0, ich) &&
595 IsChamberHit(pattern, 1, ich)) nMatchedChambers++;
597 return (nMatchedChambers >= 2);
600 //_____________________________________________________________________________
601 void AliESDMuonTrack::AddClusterId(UInt_t clusterId)
603 /// add the given cluster Id to the list associated to the track
604 if (!fClustersId) fClustersId = new TArrayI(5);
605 if (fClustersId->GetSize() <= fNHit) fClustersId->Set(fNHit+1);
606 fClustersId->AddAt(static_cast<Int_t>(clusterId), fNHit++);
609 //_____________________________________________________________________________
610 void AliESDMuonTrack::MoveClustersToESD(AliESDEvent &esd)
612 /// move the clusters (and attached pads) to the new ESD structure
613 if (!fClusters) return;
615 for (Int_t i = 0; i < fClusters->GetEntriesFast(); i++) {
616 AliESDMuonCluster *cluster = static_cast<AliESDMuonCluster*>(fClusters->UncheckedAt(i));
617 cluster->MovePadsToESD(esd);
618 AliESDMuonCluster *newCluster = esd.NewMuonCluster();
619 *newCluster = *cluster;
620 AddClusterId(newCluster->GetUniqueID());
626 //_____________________________________________________________________________
627 void AliESDMuonTrack::SetFiredChamber(UInt_t& pattern, Int_t cathode, Int_t chamber)
629 /// Turn on the bit corresponding to fired chameber
630 pattern |= (0x1 << ( 7 - ( 4*cathode + chamber )));
633 //_____________________________________________________________________________
634 void AliESDMuonTrack::AddEffInfo(UInt_t& pattern, Int_t slatOrInfo, Int_t board, EAliTriggerChPatternFlag effType)
636 /// Add efficiency flag and crossed RPC or info on rejected track
637 pattern |= effType << 8;
638 pattern |= slatOrInfo << 10;
639 pattern |= board << 15;
642 //_____________________________________________________________________________
643 Bool_t AliESDMuonTrack::IsChamberHit(UInt_t pattern, Int_t cathode, Int_t chamber)
645 /// Check if chamber was was hit
646 return (pattern >> (7 - ( 4*cathode + chamber ))) & 0x1;
649 //_____________________________________________________________________________
650 Int_t AliESDMuonTrack::GetEffFlag(UInt_t pattern)
652 /// Get Efficiency flag
653 return (pattern >> 8) & 0x03;
656 //_____________________________________________________________________________
657 Int_t AliESDMuonTrack::GetSlatOrInfo(UInt_t pattern)
659 /// Getting crossed slat or info
660 return (pattern >> 10) & 0x1F;
663 //_____________________________________________________________________________
664 Int_t AliESDMuonTrack::GetCrossedBoard(UInt_t pattern)
666 /// Getting crossed board
667 return ( pattern >> 15 ) & 0xFF;