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 //-----------------------------------------------------------------------------
19 // Class AliMUONTrackParam
20 //-------------------------
21 // Track parameters in ALICE dimuon spectrometer
22 //-----------------------------------------------------------------------------
24 #include "AliMUONTrackParam.h"
25 #include "AliMUONVCluster.h"
27 #include "AliESDMuonTrack.h"
32 #include <Riostream.h>
35 ClassImp(AliMUONTrackParam) // Class implementation in ROOT context
38 //_________________________________________________________________________
39 AliMUONTrackParam::AliMUONTrackParam()
45 fExtrapParameters(0x0),
46 fExtrapCovariances(0x0),
47 fSmoothParameters(0x0),
48 fSmoothCovariances(0x0),
58 //_________________________________________________________________________
59 AliMUONTrackParam::AliMUONTrackParam(const AliMUONTrackParam& theMUONTrackParam)
60 : TObject(theMUONTrackParam),
61 fZ(theMUONTrackParam.fZ),
62 fParameters(theMUONTrackParam.fParameters),
65 fExtrapParameters(0x0),
66 fExtrapCovariances(0x0),
67 fSmoothParameters(0x0),
68 fSmoothCovariances(0x0),
70 fOwnCluster(theMUONTrackParam.fOwnCluster),
71 fRemovable(theMUONTrackParam.fRemovable),
72 fTrackChi2(theMUONTrackParam.fTrackChi2),
73 fLocalChi2(theMUONTrackParam.fLocalChi2)
76 if (theMUONTrackParam.fCovariances) fCovariances = new TMatrixD(*(theMUONTrackParam.fCovariances));
77 if (theMUONTrackParam.fPropagator) fPropagator = new TMatrixD(*(theMUONTrackParam.fPropagator));
78 if (theMUONTrackParam.fExtrapParameters) fExtrapParameters = new TMatrixD(*(theMUONTrackParam.fExtrapParameters));
79 if (theMUONTrackParam.fExtrapCovariances) fExtrapCovariances = new TMatrixD(*(theMUONTrackParam.fExtrapCovariances));
80 if (theMUONTrackParam.fSmoothParameters) fSmoothParameters = new TMatrixD(*(theMUONTrackParam.fSmoothParameters));
81 if (theMUONTrackParam.fSmoothCovariances) fSmoothCovariances = new TMatrixD(*(theMUONTrackParam.fSmoothCovariances));
83 if(fOwnCluster) fClusterPtr = static_cast<AliMUONVCluster*>(theMUONTrackParam.fClusterPtr->Clone());
84 else fClusterPtr = theMUONTrackParam.fClusterPtr;
87 //_________________________________________________________________________
88 AliMUONTrackParam& AliMUONTrackParam::operator=(const AliMUONTrackParam& theMUONTrackParam)
90 /// Asignment operator
91 if (this == &theMUONTrackParam)
94 // base class assignement
95 TObject::operator=(theMUONTrackParam);
97 fZ = theMUONTrackParam.fZ;
99 fParameters = theMUONTrackParam.fParameters;
101 if (theMUONTrackParam.fCovariances) {
102 if (fCovariances) *fCovariances = *(theMUONTrackParam.fCovariances);
103 else fCovariances = new TMatrixD(*(theMUONTrackParam.fCovariances));
109 if (theMUONTrackParam.fPropagator) {
110 if (fPropagator) *fPropagator = *(theMUONTrackParam.fPropagator);
111 else fPropagator = new TMatrixD(*(theMUONTrackParam.fPropagator));
117 if (theMUONTrackParam.fExtrapParameters) {
118 if (fExtrapParameters) *fExtrapParameters = *(theMUONTrackParam.fExtrapParameters);
119 else fExtrapParameters = new TMatrixD(*(theMUONTrackParam.fExtrapParameters));
121 delete fExtrapParameters;
122 fExtrapParameters = 0x0;
125 if (theMUONTrackParam.fExtrapCovariances) {
126 if (fExtrapCovariances) *fExtrapCovariances = *(theMUONTrackParam.fExtrapCovariances);
127 else fExtrapCovariances = new TMatrixD(*(theMUONTrackParam.fExtrapCovariances));
129 delete fExtrapCovariances;
130 fExtrapCovariances = 0x0;
133 if (theMUONTrackParam.fSmoothParameters) {
134 if (fSmoothParameters) *fSmoothParameters = *(theMUONTrackParam.fSmoothParameters);
135 else fSmoothParameters = new TMatrixD(*(theMUONTrackParam.fSmoothParameters));
137 delete fSmoothParameters;
138 fSmoothParameters = 0x0;
141 if (theMUONTrackParam.fSmoothCovariances) {
142 if (fSmoothCovariances) *fSmoothCovariances = *(theMUONTrackParam.fSmoothCovariances);
143 else fSmoothCovariances = new TMatrixD(*(theMUONTrackParam.fSmoothCovariances));
145 delete fSmoothCovariances;
146 fSmoothCovariances = 0x0;
149 if (fOwnCluster) delete fClusterPtr;
150 fOwnCluster = theMUONTrackParam.fOwnCluster;
151 if(fOwnCluster) fClusterPtr = static_cast<AliMUONVCluster*>(theMUONTrackParam.fClusterPtr->Clone());
152 else fClusterPtr = theMUONTrackParam.fClusterPtr;
154 fRemovable = theMUONTrackParam.fRemovable;
156 fTrackChi2 = theMUONTrackParam.fTrackChi2;
157 fLocalChi2 = theMUONTrackParam.fLocalChi2;
162 //__________________________________________________________________________
163 AliMUONTrackParam::~AliMUONTrackParam()
168 delete fExtrapParameters;
169 delete fExtrapCovariances;
170 delete fSmoothParameters;
171 delete fSmoothCovariances;
172 if(fOwnCluster) delete fClusterPtr;
175 //__________________________________________________________________________
177 AliMUONTrackParam::Clear(Option_t* /*opt*/)
181 delete fPropagator; fPropagator = 0x0;
182 delete fExtrapParameters; fExtrapParameters = 0x0;
183 delete fExtrapCovariances; fExtrapCovariances = 0x0;
184 delete fSmoothParameters; fSmoothParameters = 0x0;
185 delete fSmoothCovariances; fSmoothCovariances = 0x0;
187 delete fClusterPtr; fClusterPtr = 0x0;
191 //_________________________________________________________________________
192 void AliMUONTrackParam::GetParamFrom(const AliESDMuonTrack& esdMuonTrack)
194 /// Get parameters from ESD track
195 fZ = esdMuonTrack.GetZ();
196 fParameters(0,0) = esdMuonTrack.GetNonBendingCoor();
197 fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaX());
198 fParameters(2,0) = esdMuonTrack.GetBendingCoor();
199 fParameters(3,0) = TMath::Tan(esdMuonTrack.GetThetaY());
200 fParameters(4,0) = esdMuonTrack.GetInverseBendingMomentum();
203 //_________________________________________________________________________
204 void AliMUONTrackParam::SetParamFor(AliESDMuonTrack& esdMuonTrack) const
206 /// Set parameters in ESD track
207 esdMuonTrack.SetZ(fZ);
208 esdMuonTrack.SetNonBendingCoor(fParameters(0,0));
209 esdMuonTrack.SetThetaX(TMath::ATan(fParameters(1,0)));
210 esdMuonTrack.SetBendingCoor(fParameters(2,0));
211 esdMuonTrack.SetThetaY(TMath::ATan(fParameters(3,0)));
212 esdMuonTrack.SetInverseBendingMomentum(fParameters(4,0));
215 //_________________________________________________________________________
216 void AliMUONTrackParam::GetParamFromDCA(const AliESDMuonTrack& esdMuonTrack)
218 /// Get parameters from ESD track
219 fZ = esdMuonTrack.GetZ();
220 fParameters(0,0) = esdMuonTrack.GetNonBendingCoorAtDCA();
221 fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaXAtDCA());
222 fParameters(2,0) = esdMuonTrack.GetBendingCoorAtDCA();
223 fParameters(3,0) = TMath::Tan(esdMuonTrack.GetThetaYAtDCA());
224 fParameters(4,0) = esdMuonTrack.GetInverseBendingMomentumAtDCA();
227 //_________________________________________________________________________
228 void AliMUONTrackParam::SetParamForDCA(AliESDMuonTrack& esdMuonTrack) const
230 /// Set parameters in ESD track
231 esdMuonTrack.SetNonBendingCoorAtDCA(fParameters(0,0));
232 esdMuonTrack.SetThetaXAtDCA(TMath::ATan(fParameters(1,0)));
233 esdMuonTrack.SetBendingCoorAtDCA(fParameters(2,0));
234 esdMuonTrack.SetThetaYAtDCA(TMath::ATan(fParameters(3,0)));
235 esdMuonTrack.SetInverseBendingMomentumAtDCA(fParameters(4,0));
238 //_________________________________________________________________________
239 void AliMUONTrackParam::GetParamFromUncorrected(const AliESDMuonTrack& esdMuonTrack)
241 /// Get parameters from ESD track
242 fZ = esdMuonTrack.GetZUncorrected();
243 fParameters(0,0) = esdMuonTrack.GetNonBendingCoorUncorrected();
244 fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaXUncorrected());
245 fParameters(2,0) = esdMuonTrack.GetBendingCoorUncorrected();
246 fParameters(3,0) = TMath::Tan(esdMuonTrack.GetThetaYUncorrected());
247 fParameters(4,0) = esdMuonTrack.GetInverseBendingMomentumUncorrected();
250 //_________________________________________________________________________
251 void AliMUONTrackParam::SetParamForUncorrected(AliESDMuonTrack& esdMuonTrack) const
253 /// Set parameters in ESD track
254 esdMuonTrack.SetZUncorrected(fZ);
255 esdMuonTrack.SetNonBendingCoorUncorrected(fParameters(0,0));
256 esdMuonTrack.SetThetaXUncorrected(TMath::ATan(fParameters(1,0)));
257 esdMuonTrack.SetBendingCoorUncorrected(fParameters(2,0));
258 esdMuonTrack.SetThetaYUncorrected(TMath::ATan(fParameters(3,0)));
259 esdMuonTrack.SetInverseBendingMomentumUncorrected(fParameters(4,0));
262 //_________________________________________________________________________
263 void AliMUONTrackParam::GetCovFrom(const AliESDMuonTrack& esdMuonTrack)
265 /// Get parameters covariances from ESD track
267 // Get ESD covariance matrix
268 if (!fCovariances) fCovariances = new TMatrixD(5,5);
269 esdMuonTrack.GetCovariances(*fCovariances);
271 // compute Jacobian to change the coordinate system
272 // from (X,thetaX,Y,thetaY,c/pYZ) to (X,slopeX,Y,slopeY,c/pYZ)
273 Double_t cosThetaX = TMath::Cos(TMath::ATan(fParameters(1,0)));
274 Double_t cosThetaY = TMath::Cos(TMath::ATan(fParameters(3,0)));
278 jacob(1,1) = 1. / cosThetaX / cosThetaX;
280 jacob(3,3) = 1. / cosThetaY / cosThetaY;
283 // compute covariance matrix in ESD coordinate system
284 TMatrixD tmp(*fCovariances,TMatrixD::kMultTranspose,jacob);
285 *fCovariances = TMatrixD(jacob,TMatrixD::kMult,tmp);
289 //_________________________________________________________________________
290 void AliMUONTrackParam::SetCovFor(AliESDMuonTrack& esdMuonTrack) const
292 /// Set parameters covariances in ESD track
294 // set null matrix if covariances does not exist
298 esdMuonTrack.SetCovariances(tmp);
302 // compute Jacobian to change the coordinate system
303 // from (X,slopeX,Y,slopeY,c/pYZ) to (X,thetaX,Y,thetaY,c/pYZ)
304 Double_t cosThetaX = TMath::Cos(TMath::ATan(fParameters(1,0)));
305 Double_t cosThetaY = TMath::Cos(TMath::ATan(fParameters(3,0)));
309 jacob(1,1) = cosThetaX * cosThetaX;
311 jacob(3,3) = cosThetaY * cosThetaY;
314 // compute covariance matrix in ESD coordinate system
315 TMatrixD tmp(*fCovariances,TMatrixD::kMultTranspose,jacob);
316 TMatrixD tmp2(jacob,TMatrixD::kMult,tmp);
317 esdMuonTrack.SetCovariances(tmp2);
321 //__________________________________________________________________________
322 Double_t AliMUONTrackParam::Px() const
324 /// return p_x from track parameters
325 Double_t pYZ, pZ, pX;
327 if ( TMath::Abs(fParameters(4,0)) > 0 )
328 pYZ = TMath::Abs(1.0 / fParameters(4,0));
329 pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
330 pX = pZ * fParameters(1,0);
334 //__________________________________________________________________________
335 Double_t AliMUONTrackParam::Py() const
337 /// return p_y from track parameters
338 Double_t pYZ, pZ, pY;
340 if ( TMath::Abs(fParameters(4,0)) > 0 )
341 pYZ = TMath::Abs(1.0 / fParameters(4,0));
342 pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
343 pY = pZ * fParameters(3,0);
347 //__________________________________________________________________________
348 Double_t AliMUONTrackParam::Pz() const
350 /// return p_z from track parameters
353 if ( TMath::Abs(fParameters(4,0)) > 0 )
354 pYZ = TMath::Abs(1.0 / fParameters(4,0));
355 pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
359 //__________________________________________________________________________
360 Double_t AliMUONTrackParam::P() const
362 /// return p from track parameters
365 if ( TMath::Abs(fParameters(4,0)) > 0 )
366 pYZ = TMath::Abs(1.0 / fParameters(4,0));
367 pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
369 TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0));
374 //__________________________________________________________________________
375 const TMatrixD& AliMUONTrackParam::GetCovariances() const
377 /// Return the covariance matrix (create it before if needed)
379 fCovariances = new TMatrixD(5,5);
380 fCovariances->Zero();
382 return *fCovariances;
385 //__________________________________________________________________________
386 void AliMUONTrackParam::SetCovariances(const TMatrixD& covariances)
388 /// Set the covariance matrix
389 if (fCovariances) *fCovariances = covariances;
390 else fCovariances = new TMatrixD(covariances);
393 //__________________________________________________________________________
394 void AliMUONTrackParam::SetCovariances(const Double_t matrix[5][5])
396 /// Set the covariance matrix
397 if (fCovariances) fCovariances->SetMatrixArray(&(matrix[0][0]));
398 else fCovariances = new TMatrixD(5,5,&(matrix[0][0]));
401 //__________________________________________________________________________
402 void AliMUONTrackParam::SetVariances(const Double_t matrix[5][5])
404 /// Set the diagonal terms of the covariance matrix (variances)
405 if (!fCovariances) fCovariances = new TMatrixD(5,5);
406 fCovariances->Zero();
407 for (Int_t i=0; i<5; i++) (*fCovariances)(i,i) = matrix[i][i];
410 //__________________________________________________________________________
411 void AliMUONTrackParam::DeleteCovariances()
413 /// Delete the covariance matrix
418 //__________________________________________________________________________
419 const TMatrixD& AliMUONTrackParam::GetPropagator() const
421 /// Return the propagator (create it before if needed)
423 fPropagator = new TMatrixD(5,5);
424 fPropagator->UnitMatrix();
429 //__________________________________________________________________________
430 void AliMUONTrackParam::ResetPropagator()
432 /// Reset the propagator
433 if (fPropagator) fPropagator->UnitMatrix();
436 //__________________________________________________________________________
437 void AliMUONTrackParam::UpdatePropagator(const TMatrixD& propagator)
439 /// Update the propagator
440 if (fPropagator) *fPropagator = TMatrixD(propagator,TMatrixD::kMult,*fPropagator);
441 else fPropagator = new TMatrixD(propagator);
444 //__________________________________________________________________________
445 const TMatrixD& AliMUONTrackParam::GetExtrapParameters() const
447 /// Return extrapolated parameters (create it before if needed)
448 if (!fExtrapParameters) {
449 fExtrapParameters = new TMatrixD(5,1);
450 fExtrapParameters->Zero();
452 return *fExtrapParameters;
455 //__________________________________________________________________________
456 void AliMUONTrackParam::SetExtrapParameters(const TMatrixD& extrapParameters)
458 /// Set extrapolated parameters
459 if (fExtrapParameters) *fExtrapParameters = extrapParameters;
460 else fExtrapParameters = new TMatrixD(extrapParameters);
463 //__________________________________________________________________________
464 const TMatrixD& AliMUONTrackParam::GetExtrapCovariances() const
466 /// Return the extrapolated covariance matrix (create it before if needed)
467 if (!fExtrapCovariances) {
468 fExtrapCovariances = new TMatrixD(5,5);
469 fExtrapCovariances->Zero();
471 return *fExtrapCovariances;
474 //__________________________________________________________________________
475 void AliMUONTrackParam::SetExtrapCovariances(const TMatrixD& extrapCovariances)
477 /// Set the extrapolated covariance matrix
478 if (fExtrapCovariances) *fExtrapCovariances = extrapCovariances;
479 else fExtrapCovariances = new TMatrixD(extrapCovariances);
482 //__________________________________________________________________________
483 const TMatrixD& AliMUONTrackParam::GetSmoothParameters() const
485 /// Return the smoothed parameters (create it before if needed)
486 if (!fSmoothParameters) {
487 fSmoothParameters = new TMatrixD(5,1);
488 fSmoothParameters->Zero();
490 return *fSmoothParameters;
493 //__________________________________________________________________________
494 void AliMUONTrackParam::SetSmoothParameters(const TMatrixD& smoothParameters)
496 /// Set the smoothed parameters
497 if (fSmoothParameters) *fSmoothParameters = smoothParameters;
498 else fSmoothParameters = new TMatrixD(smoothParameters);
501 //__________________________________________________________________________
502 const TMatrixD& AliMUONTrackParam::GetSmoothCovariances() const
504 /// Return the smoothed covariance matrix (create it before if needed)
505 if (!fSmoothCovariances) {
506 fSmoothCovariances = new TMatrixD(5,5);
507 fSmoothCovariances->Zero();
509 return *fSmoothCovariances;
512 //__________________________________________________________________________
513 void AliMUONTrackParam::SetSmoothCovariances(const TMatrixD& smoothCovariances)
515 /// Set the smoothed covariance matrix
516 if (fSmoothCovariances) *fSmoothCovariances = smoothCovariances;
517 else fSmoothCovariances = new TMatrixD(smoothCovariances);
520 //__________________________________________________________________________
521 void AliMUONTrackParam::SetClusterPtr(AliMUONVCluster* cluster, Bool_t owner)
523 /// set pointeur to associated cluster
524 if (fOwnCluster) delete fClusterPtr;
525 fClusterPtr = cluster;
529 //__________________________________________________________________________
530 Int_t AliMUONTrackParam::Compare(const TObject* trackParam) const
532 /// "Compare" function to sort with decreasing Z (spectro. muon Z <0).
533 /// Returns 1 (0, -1) if the current Z
534 /// is smaller than (equal to, larger than) Z of trackParam
535 if (fZ < ((AliMUONTrackParam*)trackParam)->GetZ()) return(1);
536 else if (fZ == ((AliMUONTrackParam*)trackParam)->GetZ()) return(0);
540 //__________________________________________________________________________
541 Bool_t AliMUONTrackParam::CompatibleTrackParam(const AliMUONTrackParam &trackParam, Double_t sigma2Cut, Double_t &chi2) const
543 /// Return kTRUE if the two set of track parameters are compatible within sigma2Cut
544 /// Set chi2 to the compatible chi2 value
545 /// Note that parameter covariances must exist for at least one set of parameters
546 /// Note also that if parameters are not given at the same Z, results will be meaningless
551 // ckeck covariance matrices
552 if (!fCovariances && !trackParam.fCovariances) {
553 AliError("Covariance matrix must exist for at least one set of parameters");
557 Double_t maxChi2 = 5. * sigma2Cut * sigma2Cut; // 5 degrees of freedom
559 // check Z parameters
560 if (fZ != trackParam.fZ)
561 AliWarning(Form("Parameters are given at different Z position (%le : %le): results are meaningless", fZ, trackParam.fZ));
563 // compute the parameter residuals
564 TMatrixD deltaParam(fParameters, TMatrixD::kMinus, trackParam.fParameters);
566 // build the error matrix
567 TMatrixD weight(5,5);
568 if (fCovariances) weight += *fCovariances;
569 if (trackParam.fCovariances) weight += *(trackParam.fCovariances);
571 // invert the error matrix to get the parameter weights if possible
572 if (weight.Determinant() == 0) {
573 AliError("Cannot compute the compatibility chi2");
578 // compute the compatibility chi2
579 TMatrixD tmp(deltaParam, TMatrixD::kTransposeMult, weight);
580 TMatrixD mChi2(tmp, TMatrixD::kMult, deltaParam);
585 // check compatibility
586 if (chi2 > maxChi2) return kFALSE;
591 //__________________________________________________________________________
592 void AliMUONTrackParam::Print(Option_t* opt) const
594 /// Printing TrackParam information
595 /// "full" option for printing all the information about the TrackParam
599 if ( sopt.Contains("FULL") ) {
600 cout << "<AliMUONTrackParam> Bending P=" << setw(5) << setprecision(3) << 1./fParameters(4,0) <<
601 ", NonBendSlope=" << setw(5) << setprecision(3) << fParameters(1,0)*180./TMath::Pi() <<
602 ", BendSlope=" << setw(5) << setprecision(3) << fParameters(3,0)*180./TMath::Pi() <<
603 ", (x,y,z)_IP=(" << setw(5) << setprecision(3) << fParameters(0,0) <<
604 "," << setw(5) << setprecision(3) << fParameters(2,0) <<
605 "," << setw(5) << setprecision(3) << fZ <<
606 ") cm, (px,py,pz)=(" << setw(5) << setprecision(3) << Px() <<
607 "," << setw(5) << setprecision(3) << Py() <<
608 "," << setw(5) << setprecision(3) << Pz() << ") GeV/c" << endl;
611 cout << "<AliMUONTrackParam>" << endl;