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 to describe the MUON tracks
21 // in the Event Summary Data class
22 // This is where the results of reconstruction
23 // are stored for the muons
26 ///////////////////////////////////////////////////////////////////////////////
28 #include "AliESDMuonTrack.h"
29 #include "AliESDMuonCluster.h"
31 #include <TClonesArray.h>
32 #include <TLorentzVector.h>
35 ClassImp(AliESDMuonTrack)
37 //_____________________________________________________________________________
38 AliESDMuonTrack::AliESDMuonTrack ():
40 fInverseBendingMomentum(FLT_MAX),
46 fInverseBendingMomentumAtDCA(FLT_MAX),
50 fNonBendingCoorAtDCA(0),
51 fInverseBendingMomentumUncorrected(FLT_MAX),
52 fThetaXUncorrected(0),
53 fThetaYUncorrected(0),
55 fBendingCoorUncorrected(0),
56 fNonBendingCoorUncorrected(0),
69 fHitsPatternInTrigCh(0),
74 // Default constructor
76 for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0;
80 //_____________________________________________________________________________
81 AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& muonTrack):
82 AliVParticle(muonTrack),
83 fInverseBendingMomentum(muonTrack.fInverseBendingMomentum),
84 fThetaX(muonTrack.fThetaX),
85 fThetaY(muonTrack.fThetaY),
87 fBendingCoor(muonTrack.fBendingCoor),
88 fNonBendingCoor(muonTrack.fNonBendingCoor),
89 fInverseBendingMomentumAtDCA(muonTrack.fInverseBendingMomentumAtDCA),
90 fThetaXAtDCA(muonTrack.fThetaXAtDCA),
91 fThetaYAtDCA(muonTrack.fThetaYAtDCA),
92 fBendingCoorAtDCA(muonTrack.fBendingCoorAtDCA),
93 fNonBendingCoorAtDCA(muonTrack.fNonBendingCoorAtDCA),
94 fInverseBendingMomentumUncorrected(muonTrack.fInverseBendingMomentumUncorrected),
95 fThetaXUncorrected(muonTrack.fThetaXUncorrected),
96 fThetaYUncorrected(muonTrack.fThetaYUncorrected),
97 fZUncorrected(muonTrack.fZUncorrected),
98 fBendingCoorUncorrected(muonTrack.fBendingCoorUncorrected),
99 fNonBendingCoorUncorrected(muonTrack.fNonBendingCoorUncorrected),
100 fChi2(muonTrack.fChi2),
101 fChi2MatchTrigger(muonTrack.fChi2MatchTrigger),
102 fLocalTrigger(muonTrack.fLocalTrigger),
103 fX1Pattern(muonTrack.fX1Pattern),
104 fY1Pattern(muonTrack.fY1Pattern),
105 fX2Pattern(muonTrack.fX2Pattern),
106 fY2Pattern(muonTrack.fY2Pattern),
107 fX3Pattern(muonTrack.fX3Pattern),
108 fY3Pattern(muonTrack.fY3Pattern),
109 fX4Pattern(muonTrack.fX4Pattern),
110 fY4Pattern(muonTrack.fY4Pattern),
111 fMuonClusterMap(muonTrack.fMuonClusterMap),
112 fHitsPatternInTrigCh(muonTrack.fHitsPatternInTrigCh),
113 fNHit(muonTrack.fNHit),
118 // Deep copy implemented
120 for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
122 // necessary to make a copy of the objects and not only the pointers in TClonesArray
123 if (muonTrack.fClusters) {
124 fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast());
125 AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First();
127 new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
128 cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster);
133 //_____________________________________________________________________________
134 AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& muonTrack)
137 // Equal operator for a deep copy
139 if (this == &muonTrack)
142 AliVParticle::operator=(muonTrack); // don't forget to invoke the base class' assignment operator
144 fInverseBendingMomentum = muonTrack.fInverseBendingMomentum;
145 fThetaX = muonTrack.fThetaX;
146 fThetaY = muonTrack.fThetaY;
148 fBendingCoor = muonTrack.fBendingCoor;
149 fNonBendingCoor = muonTrack.fNonBendingCoor;
151 fInverseBendingMomentumAtDCA = muonTrack.fInverseBendingMomentumAtDCA;
152 fThetaXAtDCA = muonTrack.fThetaXAtDCA;
153 fThetaYAtDCA = muonTrack.fThetaYAtDCA;
154 fBendingCoorAtDCA = muonTrack.fBendingCoorAtDCA;
155 fNonBendingCoorAtDCA = muonTrack.fNonBendingCoorAtDCA;
157 fInverseBendingMomentumUncorrected = muonTrack.fInverseBendingMomentumUncorrected;
158 fThetaXUncorrected = muonTrack.fThetaXUncorrected;
159 fThetaYUncorrected = muonTrack.fThetaYUncorrected;
160 fZUncorrected = muonTrack.fZUncorrected;
161 fBendingCoorUncorrected = muonTrack.fBendingCoorUncorrected;
162 fNonBendingCoorUncorrected = muonTrack.fNonBendingCoorUncorrected;
164 for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
166 fChi2 = muonTrack.fChi2;
167 fNHit = muonTrack.fNHit;
169 fLocalTrigger = muonTrack.fLocalTrigger;
170 fX1Pattern = muonTrack.fX1Pattern;
171 fY1Pattern = muonTrack.fY1Pattern;
172 fX2Pattern = muonTrack.fX2Pattern;
173 fY2Pattern = muonTrack.fY2Pattern;
174 fX3Pattern = muonTrack.fX3Pattern;
175 fY3Pattern = muonTrack.fY3Pattern;
176 fX4Pattern = muonTrack.fX4Pattern;
177 fY4Pattern = muonTrack.fY4Pattern;
178 fChi2MatchTrigger = muonTrack.fChi2MatchTrigger;
180 fHitsPatternInTrigCh = muonTrack.fHitsPatternInTrigCh;
182 fMuonClusterMap = muonTrack.fMuonClusterMap;
184 // necessary to make a copy of the objects and not only the pointers in TClonesArray
186 if (muonTrack.fClusters) {
187 fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast());
188 AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First();
190 new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
191 cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster);
193 } else fClusters = 0x0;
198 void AliESDMuonTrack::Copy(TObject &obj) const {
200 // this overwrites the virtual TOBject::Copy()
201 // to allow run time copying without casting
204 if(this==&obj)return;
205 AliESDMuonTrack *robj = dynamic_cast<AliESDMuonTrack*>(&obj);
206 if(!robj)return; // not an AliESDMuonTrack
212 //__________________________________________________________________________
213 AliESDMuonTrack::~AliESDMuonTrack()
219 //__________________________________________________________________________
220 void AliESDMuonTrack::Clear(Option_t* opt)
223 if (fClusters) fClusters->Clear(opt);
226 //__________________________________________________________________________
227 void AliESDMuonTrack::Reset()
229 /// Reset to default values
231 fInverseBendingMomentum = FLT_MAX;
236 fNonBendingCoor = 0.;
237 fInverseBendingMomentumAtDCA = FLT_MAX;
240 fBendingCoorAtDCA = 0.;
241 fNonBendingCoorAtDCA = 0.;
242 fInverseBendingMomentumUncorrected = FLT_MAX;
243 fThetaXUncorrected = 0.;
244 fThetaYUncorrected = 0.;
246 fBendingCoorUncorrected = 0.;
247 fNonBendingCoorUncorrected = 0.;
249 fChi2MatchTrigger = 0.;
260 fHitsPatternInTrigCh = 0;
262 delete fClusters; fClusters = 0x0;
263 for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0.;
266 //_____________________________________________________________________________
267 void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const
269 // return covariance matrix of uncorrected parameters
271 for (Int_t i = 0; i < 5; i++)
272 for (Int_t j = 0; j <= i; j++)
273 cov(i,j) = cov (j,i) = fCovariances[i*(i+1)/2 + j];
276 //_____________________________________________________________________________
277 void AliESDMuonTrack::SetCovariances(const TMatrixD& cov)
279 // set reduced covariance matrix of uncorrected parameters
280 for (Int_t i = 0; i < 5; i++)
281 for (Int_t j = 0; j <= i; j++)
282 fCovariances[i*(i+1)/2 + j] = cov(i,j);
286 //_____________________________________________________________________________
287 void AliESDMuonTrack::GetCovarianceXYZPxPyPz(Double_t cov[21]) const
289 // return reduced covariance matrix of uncorrected parameters in (X,Y,Z,Px,Py,Pz) coordinate system
291 // Cov(x,x) ... : cov[0]
292 // Cov(y,x) ... : cov[1] cov[2]
293 // Cov(z,x) ... : cov[3] cov[4] cov[5]
294 // Cov(px,x)... : cov[6] cov[7] cov[8] cov[9]
295 // Cov(py,x)... : cov[10] cov[11] cov[12] cov[13] cov[14]
296 // Cov(pz,x)... : cov[15] cov[16] cov[17] cov[18] cov[19] cov[20]
298 // Get ESD covariance matrix into a TMatrixD
299 TMatrixD covESD(5,5);
300 GetCovariances(covESD);
302 // compute Jacobian to change the coordinate system
303 // from (X,thetaX,Y,thetaY,c/pYZ) to (X,Y,Z,pX,pY,pZ)
304 Double_t tanThetaX = TMath::Tan(fThetaXUncorrected);
305 Double_t tanThetaY = TMath::Tan(fThetaYUncorrected);
306 Double_t cosThetaX2 = TMath::Cos(fThetaXUncorrected) * TMath::Cos(fThetaXUncorrected);
307 Double_t cosThetaY2 = TMath::Cos(fThetaYUncorrected) * TMath::Cos(fThetaYUncorrected);
308 Double_t pZ = PzUncorrected();
309 Double_t dpZdthetaY = - fInverseBendingMomentumUncorrected * fInverseBendingMomentumUncorrected *
310 pZ * pZ * pZ * tanThetaY / cosThetaY2;
311 Double_t dpZdinvpYZ = (fInverseBendingMomentumUncorrected != 0.) ? - pZ / fInverseBendingMomentumUncorrected : - FLT_MAX;
316 jacob(3,1) = pZ / cosThetaX2;
317 jacob(3,3) = dpZdthetaY * tanThetaX;
318 jacob(3,4) = dpZdinvpYZ * tanThetaX;
319 jacob(4,3) = dpZdthetaY * tanThetaY + pZ / cosThetaY2;
320 jacob(4,4) = dpZdinvpYZ * tanThetaY;
321 jacob(5,3) = dpZdthetaY;
322 jacob(5,4) = dpZdinvpYZ;
324 // compute covariance matrix in AOD coordinate system
325 TMatrixD tmp(covESD,TMatrixD::kMultTranspose,jacob);
326 TMatrixD covAOD(jacob,TMatrixD::kMult,tmp);
328 // Get AOD covariance matrix into co[21]
329 for (Int_t i = 0; i < 6; i++)
330 for (Int_t j = 0; j <= i; j++)
331 cov[i*(i+1)/2 + j] = covAOD(i,j);
335 //_____________________________________________________________________________
336 Double_t AliESDMuonTrack::Px() const
338 // return p_x from track parameters
339 Double_t nonBendingSlope = TMath::Tan(fThetaX);
340 Double_t bendingSlope = TMath::Tan(fThetaY);
341 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
342 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
343 return pZ * nonBendingSlope;
346 //_____________________________________________________________________________
347 Double_t AliESDMuonTrack::Py() const
349 // return p_y from track parameters
350 Double_t bendingSlope = TMath::Tan(fThetaY);
351 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
352 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
353 return pZ * bendingSlope;
356 //_____________________________________________________________________________
357 Double_t AliESDMuonTrack::Pz() const
359 // return p_z from track parameters
360 Double_t bendingSlope = TMath::Tan(fThetaY);
361 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
362 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
365 //_____________________________________________________________________________
366 Double_t AliESDMuonTrack::P() const
368 // return p from track parameters
369 Double_t nonBendingSlope = TMath::Tan(fThetaX);
370 Double_t bendingSlope = TMath::Tan(fThetaY);
371 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
372 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
373 return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope);
376 //_____________________________________________________________________________
377 void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const
379 // return Lorentz momentum vector from track parameters
380 Double_t muonMass = M();
381 Double_t nonBendingSlope = TMath::Tan(fThetaX);
382 Double_t bendingSlope = TMath::Tan(fThetaY);
383 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
384 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
385 Double_t pX = pZ * nonBendingSlope;
386 Double_t pY = pZ * bendingSlope;
387 Double_t e = TMath::Sqrt(muonMass*muonMass + pX*pX + pY*pY + pZ*pZ);
388 vP.SetPxPyPzE(pX, pY, pZ, e);
391 //_____________________________________________________________________________
392 Double_t AliESDMuonTrack::PxAtDCA() const
394 // return p_x from track parameters
395 Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
396 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
397 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
398 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
399 return pZ * nonBendingSlope;
402 //_____________________________________________________________________________
403 Double_t AliESDMuonTrack::PyAtDCA() const
405 // return p_y from track parameters
406 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
407 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
408 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
409 return pZ * bendingSlope;
412 //_____________________________________________________________________________
413 Double_t AliESDMuonTrack::PzAtDCA() const
415 // return p_z from track parameters
416 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
417 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
418 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
421 //_____________________________________________________________________________
422 Double_t AliESDMuonTrack::PAtDCA() const
424 // return p from track parameters
425 Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
426 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
427 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
428 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
429 return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope);
432 //_____________________________________________________________________________
433 void AliESDMuonTrack::LorentzPAtDCA(TLorentzVector& vP) const
435 // return Lorentz momentum vector from track parameters
436 Double_t muonMass = M();
437 Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
438 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
439 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
440 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
441 Double_t pX = pZ * nonBendingSlope;
442 Double_t pY = pZ * bendingSlope;
443 Double_t e = TMath::Sqrt(muonMass*muonMass + pX*pX + pY*pY + pZ*pZ);
444 vP.SetPxPyPzE(pX, pY, pZ, e);
447 //_____________________________________________________________________________
448 Double_t AliESDMuonTrack::PxUncorrected() const
450 // return p_x from track parameters
451 Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
452 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
453 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
454 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
455 return pZ * nonBendingSlope;
458 //_____________________________________________________________________________
459 Double_t AliESDMuonTrack::PyUncorrected() const
461 // return p_y from track parameters
462 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
463 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
464 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
465 return pZ * bendingSlope;
468 //_____________________________________________________________________________
469 Double_t AliESDMuonTrack::PzUncorrected() const
471 // return p_z from track parameters
472 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
473 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
474 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
477 //_____________________________________________________________________________
478 Double_t AliESDMuonTrack::PUncorrected() const
480 // return p from track parameters
481 Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
482 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
483 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
484 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
485 return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope);
488 //_____________________________________________________________________________
489 void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const
491 // return Lorentz momentum vector from track parameters
492 Double_t muonMass = M();
493 Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
494 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
495 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
496 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
497 Double_t pX = pZ * nonBendingSlope;
498 Double_t pY = pZ * bendingSlope;
499 Double_t e = TMath::Sqrt(muonMass*muonMass + pX*pX + pY*pY + pZ*pZ);
500 vP.SetPxPyPzE(pX, pY, pZ, e);
503 //_____________________________________________________________________________
504 Int_t AliESDMuonTrack::GetMatchTrigger() const
506 // backward compatibility after replacing fMatchTrigger by fLocalTrigger
507 // 0 track does not match trigger
508 // 1 track match but does not pass pt cut
509 // 2 track match Low pt cut
510 // 3 track match High pt cut
514 } else if (LoLpt() == 0 && LoHpt() == 0) {
516 } else if (LoLpt() > 0 && LoHpt() == 0) {
524 //_____________________________________________________________________________
525 Int_t AliESDMuonTrack::GetNClusters() const
527 // return the number of clusters associated to the track
528 if (!fClusters) return 0;
530 return fClusters->GetEntriesFast();
533 //_____________________________________________________________________________
534 TClonesArray& AliESDMuonTrack::GetClusters() const
536 // return the array of clusters associated to the track
537 if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10);
542 //_____________________________________________________________________________
543 void AliESDMuonTrack::AddCluster(const AliESDMuonCluster &cluster)
545 // add a cluster to the TClonesArray of clusters associated to the track
546 if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10);
548 new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(cluster);
551 //_____________________________________________________________________________
552 Bool_t AliESDMuonTrack::ClustersStored() const
554 // return kTRUE if the clusters associated to the track are registered
555 if (GetNClusters() == 0) return kFALSE;