]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliESDMuonTrack.cxx
a new macro providing a QA GUI for shifter
[u/mrichter/AliRoot.git] / STEER / AliESDMuonTrack.cxx
CommitLineData
af7ba10c 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
672b5f43 28#include "AliESDMuonTrack.h"
d5efea33 29#include "AliESDMuonCluster.h"
672b5f43 30
d5efea33 31#include <TClonesArray.h>
39b8d0dd 32#include <TLorentzVector.h>
33#include <TMath.h>
34
af7ba10c 35ClassImp(AliESDMuonTrack)
36
90e48c0c 37//_____________________________________________________________________________
38AliESDMuonTrack::AliESDMuonTrack ():
ad85871a 39 AliVParticle(),
12186235 40 fInverseBendingMomentum(FLT_MAX),
90e48c0c 41 fThetaX(0),
42 fThetaY(0),
43 fZ(0),
44 fBendingCoor(0),
45 fNonBendingCoor(0),
12186235 46 fInverseBendingMomentumAtDCA(FLT_MAX),
d5efea33 47 fThetaXAtDCA(0),
48 fThetaYAtDCA(0),
49 fBendingCoorAtDCA(0),
50 fNonBendingCoorAtDCA(0),
12186235 51 fInverseBendingMomentumUncorrected(FLT_MAX),
39b8d0dd 52 fThetaXUncorrected(0),
53 fThetaYUncorrected(0),
54 fZUncorrected(0),
55 fBendingCoorUncorrected(0),
56 fNonBendingCoorUncorrected(0),
90e48c0c 57 fChi2(0),
fbc3395d 58 fChi2MatchTrigger(0),
01413742 59 fLocalTrigger(0),
9dea53d8 60 fX1Pattern(0),
61 fY1Pattern(0),
62 fX2Pattern(0),
63 fY2Pattern(0),
64 fX3Pattern(0),
65 fY3Pattern(0),
66 fX4Pattern(0),
67 fY4Pattern(0),
4f036e6e 68 fMuonClusterMap(0),
60765b06 69 fHitsPatternInTrigCh(0),
d5efea33 70 fNHit(0),
71 fClusters(0x0)
90e48c0c 72{
60765b06 73 //
90e48c0c 74 // Default constructor
60765b06 75 //
76 for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0;
90e48c0c 77}
78
79
af7ba10c 80//_____________________________________________________________________________
4c510ac5 81AliESDMuonTrack::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),
9dea53d8 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),
4c510ac5 111 fMuonClusterMap(muonTrack.fMuonClusterMap),
112 fHitsPatternInTrigCh(muonTrack.fHitsPatternInTrigCh),
113 fNHit(muonTrack.fNHit),
d5efea33 114 fClusters(0x0)
5ec1b3bc 115{
af7ba10c 116 //
117 // Copy constructor
118 // Deep copy implemented
119 //
4c510ac5 120 for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
d5efea33 121
122 // necessary to make a copy of the objects and not only the pointers in TClonesArray
4c510ac5 123 if (muonTrack.fClusters) {
124 fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast());
125 AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First();
d5efea33 126 while (cluster) {
127 new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
4c510ac5 128 cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster);
d5efea33 129 }
130 }
5ec1b3bc 131}
132
af7ba10c 133//_____________________________________________________________________________
4c510ac5 134AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& muonTrack)
5ec1b3bc 135{
af7ba10c 136 //
137 // Equal operator for a deep copy
138 //
4c510ac5 139 if (this == &muonTrack)
5ec1b3bc 140 return *this;
141
4c510ac5 142 AliVParticle::operator=(muonTrack); // don't forget to invoke the base class' assignment operator
ad85871a 143
4c510ac5 144 fInverseBendingMomentum = muonTrack.fInverseBendingMomentum;
145 fThetaX = muonTrack.fThetaX;
146 fThetaY = muonTrack.fThetaY;
147 fZ = muonTrack.fZ;
148 fBendingCoor = muonTrack.fBendingCoor;
149 fNonBendingCoor = muonTrack.fNonBendingCoor;
39b8d0dd 150
4c510ac5 151 fInverseBendingMomentumAtDCA = muonTrack.fInverseBendingMomentumAtDCA;
152 fThetaXAtDCA = muonTrack.fThetaXAtDCA;
153 fThetaYAtDCA = muonTrack.fThetaYAtDCA;
154 fBendingCoorAtDCA = muonTrack.fBendingCoorAtDCA;
155 fNonBendingCoorAtDCA = muonTrack.fNonBendingCoorAtDCA;
d5efea33 156
4c510ac5 157 fInverseBendingMomentumUncorrected = muonTrack.fInverseBendingMomentumUncorrected;
158 fThetaXUncorrected = muonTrack.fThetaXUncorrected;
159 fThetaYUncorrected = muonTrack.fThetaYUncorrected;
160 fZUncorrected = muonTrack.fZUncorrected;
161 fBendingCoorUncorrected = muonTrack.fBendingCoorUncorrected;
162 fNonBendingCoorUncorrected = muonTrack.fNonBendingCoorUncorrected;
39b8d0dd 163
4c510ac5 164 for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
60765b06 165
4c510ac5 166 fChi2 = muonTrack.fChi2;
167 fNHit = muonTrack.fNHit;
8252d536 168
4c510ac5 169 fLocalTrigger = muonTrack.fLocalTrigger;
9dea53d8 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;
4c510ac5 178 fChi2MatchTrigger = muonTrack.fChi2MatchTrigger;
fbc3395d 179
4c510ac5 180 fHitsPatternInTrigCh = muonTrack.fHitsPatternInTrigCh;
8252d536 181
4c510ac5 182 fMuonClusterMap = muonTrack.fMuonClusterMap;
60765b06 183
d5efea33 184 // necessary to make a copy of the objects and not only the pointers in TClonesArray
185 delete fClusters;
4c510ac5 186 if (muonTrack.fClusters) {
187 fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast());
188 AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First();
d5efea33 189 while (cluster) {
190 new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
4c510ac5 191 cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster);
d5efea33 192 }
193 } else fClusters = 0x0;
194
5ec1b3bc 195 return *this;
196}
197
732a24fe 198void 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
d5efea33 212//__________________________________________________________________________
213AliESDMuonTrack::~AliESDMuonTrack()
214{
215 /// Destructor
216 delete fClusters;
217}
218
219//__________________________________________________________________________
220void AliESDMuonTrack::Clear(Option_t* opt)
221{
222 /// Clear arrays
223 if (fClusters) fClusters->Clear(opt);
224}
225
12186235 226//__________________________________________________________________________
227void 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
60765b06 266//_____________________________________________________________________________
267void 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//_____________________________________________________________________________
277void 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//_____________________________________________________________________________
287void 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;
4c510ac5 311 Double_t dpZdinvpYZ = (fInverseBendingMomentumUncorrected != 0.) ? - pZ / fInverseBendingMomentumUncorrected : - FLT_MAX;
60765b06 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
39b8d0dd 335//_____________________________________________________________________________
336Double_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);
4c510ac5 341 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
39b8d0dd 342 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
343 return pZ * nonBendingSlope;
344}
345
346//_____________________________________________________________________________
347Double_t AliESDMuonTrack::Py() const
348{
349 // return p_y from track parameters
350 Double_t bendingSlope = TMath::Tan(fThetaY);
4c510ac5 351 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
39b8d0dd 352 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
353 return pZ * bendingSlope;
354}
355
356//_____________________________________________________________________________
357Double_t AliESDMuonTrack::Pz() const
358{
359 // return p_z from track parameters
360 Double_t bendingSlope = TMath::Tan(fThetaY);
4c510ac5 361 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
39b8d0dd 362 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
363}
364
365//_____________________________________________________________________________
366Double_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);
4c510ac5 371 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
39b8d0dd 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//_____________________________________________________________________________
377void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const
378{
379 // return Lorentz momentum vector from track parameters
60765b06 380 Double_t muonMass = M();
39b8d0dd 381 Double_t nonBendingSlope = TMath::Tan(fThetaX);
382 Double_t bendingSlope = TMath::Tan(fThetaY);
4c510ac5 383 Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
39b8d0dd 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
d5efea33 391//_____________________________________________________________________________
392Double_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);
4c510ac5 397 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
d5efea33 398 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
399 return pZ * nonBendingSlope;
400}
401
402//_____________________________________________________________________________
403Double_t AliESDMuonTrack::PyAtDCA() const
404{
405 // return p_y from track parameters
406 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
4c510ac5 407 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
d5efea33 408 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
409 return pZ * bendingSlope;
410}
411
412//_____________________________________________________________________________
413Double_t AliESDMuonTrack::PzAtDCA() const
414{
415 // return p_z from track parameters
416 Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
4c510ac5 417 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
d5efea33 418 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
419}
420
421//_____________________________________________________________________________
422Double_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);
4c510ac5 427 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
d5efea33 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//_____________________________________________________________________________
433void 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);
4c510ac5 439 Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
d5efea33 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
39b8d0dd 447//_____________________________________________________________________________
448Double_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);
4c510ac5 453 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
39b8d0dd 454 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
455 return pZ * nonBendingSlope;
456}
457
458//_____________________________________________________________________________
459Double_t AliESDMuonTrack::PyUncorrected() const
460{
461 // return p_y from track parameters
462 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
4c510ac5 463 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
39b8d0dd 464 Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
465 return pZ * bendingSlope;
466}
467
468//_____________________________________________________________________________
469Double_t AliESDMuonTrack::PzUncorrected() const
470{
471 // return p_z from track parameters
472 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
4c510ac5 473 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
39b8d0dd 474 return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0)
475}
476
477//_____________________________________________________________________________
478Double_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);
4c510ac5 483 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
39b8d0dd 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//_____________________________________________________________________________
489void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const
490{
491 // return Lorentz momentum vector from track parameters
60765b06 492 Double_t muonMass = M();
39b8d0dd 493 Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
494 Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
4c510ac5 495 Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
39b8d0dd 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}
672b5f43 502
423b32ca 503//_____________________________________________________________________________
504Int_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
01413742 512 if (!LoCircuit()) {
423b32ca 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
4c510ac5 524//_____________________________________________________________________________
525Int_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
d5efea33 533//_____________________________________________________________________________
534TClonesArray& 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//_____________________________________________________________________________
543void 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//_____________________________________________________________________________
552Bool_t AliESDMuonTrack::ClustersStored() const
553{
554 // return kTRUE if the clusters associated to the track are registered
4c510ac5 555 if (GetNClusters() == 0) return kFALSE;
d5efea33 556
557 return kTRUE;
558}
559