]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliESDMuonTrack.cxx
silvermy@ornl.gov - SMcalib - directory with tools for SuperModule calibrations at...
[u/mrichter/AliRoot.git] / STEER / AliESDMuonTrack.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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 /* $Id$ */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //
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
24 //  Author: G.Martinez
25 //
26 ///////////////////////////////////////////////////////////////////////////////
27
28 #include "AliESDMuonTrack.h"
29 #include "AliESDMuonCluster.h"
30
31 #include <TClonesArray.h>
32 #include <TLorentzVector.h>
33 #include <TMath.h>
34
35 ClassImp(AliESDMuonTrack)
36
37 //_____________________________________________________________________________
38 AliESDMuonTrack::AliESDMuonTrack ():
39   AliVParticle(),
40   fInverseBendingMomentum(FLT_MAX),
41   fThetaX(0),
42   fThetaY(0),
43   fZ(0),
44   fBendingCoor(0),
45   fNonBendingCoor(0),
46   fInverseBendingMomentumAtDCA(FLT_MAX),
47   fThetaXAtDCA(0),
48   fThetaYAtDCA(0),
49   fBendingCoorAtDCA(0),
50   fNonBendingCoorAtDCA(0),
51   fInverseBendingMomentumUncorrected(FLT_MAX),
52   fThetaXUncorrected(0),
53   fThetaYUncorrected(0),
54   fZUncorrected(0),
55   fBendingCoorUncorrected(0),
56   fNonBendingCoorUncorrected(0),
57   fChi2(0),
58   fChi2MatchTrigger(0),
59   fLocalTrigger(0),
60   fX1Pattern(0),
61   fY1Pattern(0),
62   fX2Pattern(0),
63   fY2Pattern(0),
64   fX3Pattern(0),
65   fY3Pattern(0),
66   fX4Pattern(0),
67   fY4Pattern(0),
68   fMuonClusterMap(0),
69   fHitsPatternInTrigCh(0),
70   fNHit(0),
71   fClusters(0x0)
72 {
73   //
74   // Default constructor
75   //
76   for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0;
77 }
78
79
80 //_____________________________________________________________________________
81 AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& muonTrack):
82   AliVParticle(muonTrack),
83   fInverseBendingMomentum(muonTrack.fInverseBendingMomentum),
84   fThetaX(muonTrack.fThetaX),
85   fThetaY(muonTrack.fThetaY),
86   fZ(muonTrack.fZ),
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),
114   fClusters(0x0)
115 {
116   //
117   // Copy constructor
118   // Deep copy implemented
119   //
120   for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
121   
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();
126     while (cluster) {
127       new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
128       cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster);
129     }
130   }
131 }
132
133 //_____________________________________________________________________________
134 AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& muonTrack)
135 {
136   // 
137   // Equal operator for a deep copy
138   //
139   if (this == &muonTrack)
140     return *this;
141
142   AliVParticle::operator=(muonTrack); // don't forget to invoke the base class' assignment operator
143   
144   fInverseBendingMomentum = muonTrack.fInverseBendingMomentum; 
145   fThetaX                 = muonTrack.fThetaX;           
146   fThetaY                 = muonTrack.fThetaY;           
147   fZ                      = muonTrack.fZ;                
148   fBendingCoor            = muonTrack.fBendingCoor;      
149   fNonBendingCoor         = muonTrack.fNonBendingCoor;   
150   
151   fInverseBendingMomentumAtDCA = muonTrack.fInverseBendingMomentumAtDCA; 
152   fThetaXAtDCA                 = muonTrack.fThetaXAtDCA;           
153   fThetaYAtDCA                 = muonTrack.fThetaYAtDCA;           
154   fBendingCoorAtDCA            = muonTrack.fBendingCoorAtDCA;      
155   fNonBendingCoorAtDCA         = muonTrack.fNonBendingCoorAtDCA;   
156   
157   fInverseBendingMomentumUncorrected = muonTrack.fInverseBendingMomentumUncorrected; 
158   fThetaXUncorrected                 = muonTrack.fThetaXUncorrected;           
159   fThetaYUncorrected                 = muonTrack.fThetaYUncorrected;           
160   fZUncorrected                      = muonTrack.fZUncorrected;                
161   fBendingCoorUncorrected            = muonTrack.fBendingCoorUncorrected;      
162   fNonBendingCoorUncorrected         = muonTrack.fNonBendingCoorUncorrected;   
163   
164   for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
165   
166   fChi2                   = muonTrack.fChi2;             
167   fNHit                   = muonTrack.fNHit; 
168
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; 
179
180   fHitsPatternInTrigCh    = muonTrack.fHitsPatternInTrigCh;
181  
182   fMuonClusterMap         = muonTrack.fMuonClusterMap;
183   
184   // necessary to make a copy of the objects and not only the pointers in TClonesArray
185   delete fClusters;
186   if (muonTrack.fClusters) {
187     fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast());
188     AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First();
189     while (cluster) {
190       new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
191       cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster);
192     }
193   } else fClusters = 0x0;
194   
195   return *this;
196 }
197
198 void AliESDMuonTrack::Copy(TObject &obj) const {
199   
200   // this overwrites the virtual TOBject::Copy()
201   // to allow run time copying without casting
202   // in AliESDEvent
203
204   if(this==&obj)return;
205   AliESDMuonTrack *robj = dynamic_cast<AliESDMuonTrack*>(&obj);
206   if(!robj)return; // not an AliESDMuonTrack
207   *robj = *this;
208
209 }
210
211
212 //__________________________________________________________________________
213 AliESDMuonTrack::~AliESDMuonTrack()
214 {
215   /// Destructor
216   delete fClusters;
217 }
218
219 //__________________________________________________________________________
220 void AliESDMuonTrack::Clear(Option_t* opt)
221 {
222   /// Clear arrays
223   if (fClusters) fClusters->Clear(opt);
224 }
225
226 //__________________________________________________________________________
227 void AliESDMuonTrack::Reset()
228 {
229   /// Reset to default values
230   SetUniqueID(0);
231   fInverseBendingMomentum = FLT_MAX;
232   fThetaX = 0.;
233   fThetaY = 0.;
234   fZ = 0.;
235   fBendingCoor = 0.;
236   fNonBendingCoor = 0.;
237   fInverseBendingMomentumAtDCA = FLT_MAX;
238   fThetaXAtDCA = 0.;
239   fThetaYAtDCA = 0.;
240   fBendingCoorAtDCA = 0.;
241   fNonBendingCoorAtDCA = 0.;
242   fInverseBendingMomentumUncorrected = FLT_MAX;
243   fThetaXUncorrected = 0.;
244   fThetaYUncorrected = 0.;
245   fZUncorrected = 0.;
246   fBendingCoorUncorrected = 0.;
247   fNonBendingCoorUncorrected = 0.;
248   fChi2 = 0.;
249   fChi2MatchTrigger = 0.;
250   fLocalTrigger = 0;
251   fX1Pattern = 0;
252   fY1Pattern = 0;
253   fX2Pattern = 0;
254   fY2Pattern = 0;
255   fX3Pattern = 0;
256   fY3Pattern = 0;
257   fX4Pattern = 0;
258   fY4Pattern = 0;
259   fMuonClusterMap = 0;
260   fHitsPatternInTrigCh = 0;
261   fNHit = 0;
262   delete fClusters; fClusters = 0x0;
263   for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0.;
264 }
265
266 //_____________________________________________________________________________
267 void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const
268 {
269   // return covariance matrix of uncorrected parameters
270   cov.ResizeTo(5,5);
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];
274 }
275
276 //_____________________________________________________________________________
277 void AliESDMuonTrack::SetCovariances(const TMatrixD& cov)
278 {
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);
283
284 }
285
286 //_____________________________________________________________________________
287 void AliESDMuonTrack::GetCovarianceXYZPxPyPz(Double_t cov[21]) const
288 {
289   // return reduced covariance matrix of uncorrected parameters in (X,Y,Z,Px,Py,Pz) coordinate system
290   // 
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]
297   //
298   // Get ESD covariance matrix into a TMatrixD
299   TMatrixD covESD(5,5);
300   GetCovariances(covESD);
301
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;
312   TMatrixD jacob(6,5);
313   jacob.Zero();
314   jacob(0,0) = 1.;
315   jacob(1,2) = 1.;
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;
323   
324   // compute covariance matrix in AOD coordinate system
325   TMatrixD tmp(covESD,TMatrixD::kMultTranspose,jacob);
326   TMatrixD covAOD(jacob,TMatrixD::kMult,tmp);
327   
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);
332   
333 }
334
335 //_____________________________________________________________________________
336 Double_t AliESDMuonTrack::Px() const
337 {
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;
344 }
345
346 //_____________________________________________________________________________
347 Double_t AliESDMuonTrack::Py() const
348 {
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;
354 }
355
356 //_____________________________________________________________________________
357 Double_t AliESDMuonTrack::Pz() const
358 {
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)
363 }
364
365 //_____________________________________________________________________________
366 Double_t AliESDMuonTrack::P() const
367 {
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);
374 }
375
376 //_____________________________________________________________________________
377 void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const
378 {
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);
389 }
390
391 //_____________________________________________________________________________
392 Double_t AliESDMuonTrack::PxAtDCA() const
393 {
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;
400 }
401
402 //_____________________________________________________________________________
403 Double_t AliESDMuonTrack::PyAtDCA() const
404 {
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;
410 }
411
412 //_____________________________________________________________________________
413 Double_t AliESDMuonTrack::PzAtDCA() const
414 {
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)
419 }
420
421 //_____________________________________________________________________________
422 Double_t AliESDMuonTrack::PAtDCA() const
423 {
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);
430 }
431
432 //_____________________________________________________________________________
433 void AliESDMuonTrack::LorentzPAtDCA(TLorentzVector& vP) const
434 {
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);
445 }
446
447 //_____________________________________________________________________________
448 Double_t AliESDMuonTrack::PxUncorrected() const
449 {
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;
456 }
457
458 //_____________________________________________________________________________
459 Double_t AliESDMuonTrack::PyUncorrected() const
460 {
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;
466 }
467
468 //_____________________________________________________________________________
469 Double_t AliESDMuonTrack::PzUncorrected() const
470 {
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)
475 }
476
477 //_____________________________________________________________________________
478 Double_t AliESDMuonTrack::PUncorrected() const
479 {
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);
486 }
487
488 //_____________________________________________________________________________
489 void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const
490 {
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);
501 }
502
503 //_____________________________________________________________________________
504 Int_t AliESDMuonTrack::GetMatchTrigger() const
505 {
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
511
512   if (!LoCircuit()) {
513     return 0;
514   } else if (LoLpt() == 0 && LoHpt() == 0) {
515     return 1;
516   } else if (LoLpt() >  0 && LoHpt() == 0) {
517     return 2;
518   } else {
519     return 3;
520   }
521
522 }
523
524 //_____________________________________________________________________________
525 Int_t AliESDMuonTrack::GetNClusters() const
526 {
527   // return the number of clusters associated to the track
528   if (!fClusters) return 0;
529   
530   return fClusters->GetEntriesFast();
531 }
532
533 //_____________________________________________________________________________
534 TClonesArray& AliESDMuonTrack::GetClusters() const
535 {
536   // return the array of clusters associated to the track
537   if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10);
538   
539   return *fClusters;
540 }
541
542 //_____________________________________________________________________________
543 void AliESDMuonTrack::AddCluster(const AliESDMuonCluster &cluster)
544 {
545   // add a cluster to the TClonesArray of clusters associated to the track
546   if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10);
547   
548   new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(cluster);
549 }
550
551 //_____________________________________________________________________________
552 Bool_t AliESDMuonTrack::ClustersStored() const
553 {
554   // return kTRUE if the clusters associated to the track are registered
555   if (GetNClusters() == 0) return kFALSE;
556   
557   return kTRUE;
558 }
559