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),
52 fAloneInChamber(kTRUE),
59 //_________________________________________________________________________
60 AliMUONTrackParam::AliMUONTrackParam(const AliMUONTrackParam& theMUONTrackParam)
61 : TObject(theMUONTrackParam),
62 fZ(theMUONTrackParam.fZ),
63 fParameters(theMUONTrackParam.fParameters),
66 fExtrapParameters(0x0),
67 fExtrapCovariances(0x0),
68 fSmoothParameters(0x0),
69 fSmoothCovariances(0x0),
71 fOwnCluster(theMUONTrackParam.fOwnCluster),
72 fRemovable(theMUONTrackParam.fRemovable),
73 fAloneInChamber(theMUONTrackParam.fAloneInChamber),
74 fTrackChi2(theMUONTrackParam.fTrackChi2),
75 fLocalChi2(theMUONTrackParam.fLocalChi2)
78 if (theMUONTrackParam.fCovariances) fCovariances = new TMatrixD(*(theMUONTrackParam.fCovariances));
79 if (theMUONTrackParam.fPropagator) fPropagator = new TMatrixD(*(theMUONTrackParam.fPropagator));
80 if (theMUONTrackParam.fExtrapParameters) fExtrapParameters = new TMatrixD(*(theMUONTrackParam.fExtrapParameters));
81 if (theMUONTrackParam.fExtrapCovariances) fExtrapCovariances = new TMatrixD(*(theMUONTrackParam.fExtrapCovariances));
82 if (theMUONTrackParam.fSmoothParameters) fSmoothParameters = new TMatrixD(*(theMUONTrackParam.fSmoothParameters));
83 if (theMUONTrackParam.fSmoothCovariances) fSmoothCovariances = new TMatrixD(*(theMUONTrackParam.fSmoothCovariances));
85 if(fOwnCluster) fClusterPtr = static_cast<AliMUONVCluster*>(theMUONTrackParam.fClusterPtr->Clone());
86 else fClusterPtr = theMUONTrackParam.fClusterPtr;
89 //_________________________________________________________________________
90 AliMUONTrackParam& AliMUONTrackParam::operator=(const AliMUONTrackParam& theMUONTrackParam)
92 /// Asignment operator
93 if (this == &theMUONTrackParam)
96 // base class assignement
97 TObject::operator=(theMUONTrackParam);
99 fZ = theMUONTrackParam.fZ;
101 fParameters = theMUONTrackParam.fParameters;
103 if (theMUONTrackParam.fCovariances) {
104 if (fCovariances) *fCovariances = *(theMUONTrackParam.fCovariances);
105 else fCovariances = new TMatrixD(*(theMUONTrackParam.fCovariances));
111 if (theMUONTrackParam.fPropagator) {
112 if (fPropagator) *fPropagator = *(theMUONTrackParam.fPropagator);
113 else fPropagator = new TMatrixD(*(theMUONTrackParam.fPropagator));
119 if (theMUONTrackParam.fExtrapParameters) {
120 if (fExtrapParameters) *fExtrapParameters = *(theMUONTrackParam.fExtrapParameters);
121 else fExtrapParameters = new TMatrixD(*(theMUONTrackParam.fExtrapParameters));
123 delete fExtrapParameters;
124 fExtrapParameters = 0x0;
127 if (theMUONTrackParam.fExtrapCovariances) {
128 if (fExtrapCovariances) *fExtrapCovariances = *(theMUONTrackParam.fExtrapCovariances);
129 else fExtrapCovariances = new TMatrixD(*(theMUONTrackParam.fExtrapCovariances));
131 delete fExtrapCovariances;
132 fExtrapCovariances = 0x0;
135 if (theMUONTrackParam.fSmoothParameters) {
136 if (fSmoothParameters) *fSmoothParameters = *(theMUONTrackParam.fSmoothParameters);
137 else fSmoothParameters = new TMatrixD(*(theMUONTrackParam.fSmoothParameters));
139 delete fSmoothParameters;
140 fSmoothParameters = 0x0;
143 if (theMUONTrackParam.fSmoothCovariances) {
144 if (fSmoothCovariances) *fSmoothCovariances = *(theMUONTrackParam.fSmoothCovariances);
145 else fSmoothCovariances = new TMatrixD(*(theMUONTrackParam.fSmoothCovariances));
147 delete fSmoothCovariances;
148 fSmoothCovariances = 0x0;
151 fOwnCluster = theMUONTrackParam.fOwnCluster;
152 if(fOwnCluster) fClusterPtr = static_cast<AliMUONVCluster*>(theMUONTrackParam.fClusterPtr->Clone());
153 else fClusterPtr = theMUONTrackParam.fClusterPtr;
155 fRemovable = theMUONTrackParam.fRemovable;
157 fAloneInChamber = theMUONTrackParam.fAloneInChamber;
159 fTrackChi2 = theMUONTrackParam.fTrackChi2;
160 fLocalChi2 = theMUONTrackParam.fLocalChi2;
165 //__________________________________________________________________________
166 AliMUONTrackParam::~AliMUONTrackParam()
171 delete fExtrapParameters;
172 delete fExtrapCovariances;
173 delete fSmoothParameters;
174 delete fSmoothCovariances;
175 if(fOwnCluster) delete fClusterPtr;
178 //__________________________________________________________________________
180 AliMUONTrackParam::Clear(Option_t* /*opt*/)
184 delete fPropagator; fPropagator = 0x0;
185 delete fExtrapParameters; fExtrapParameters = 0x0;
186 delete fExtrapCovariances; fExtrapCovariances = 0x0;
187 delete fSmoothParameters; fSmoothParameters = 0x0;
188 delete fSmoothCovariances; fSmoothCovariances = 0x0;
190 delete fClusterPtr; fClusterPtr = 0x0;
194 //_________________________________________________________________________
195 void AliMUONTrackParam::GetParamFrom(const AliESDMuonTrack& esdMuonTrack)
197 /// Get parameters from ESD track
198 fZ = esdMuonTrack.GetZ();
199 fParameters(0,0) = esdMuonTrack.GetNonBendingCoor();
200 fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaX());
201 fParameters(2,0) = esdMuonTrack.GetBendingCoor();
202 fParameters(3,0) = TMath::Tan(esdMuonTrack.GetThetaY());
203 fParameters(4,0) = esdMuonTrack.GetInverseBendingMomentum();
206 //_________________________________________________________________________
207 void AliMUONTrackParam::SetParamFor(AliESDMuonTrack& esdMuonTrack) const
209 /// Set parameters in ESD track
210 esdMuonTrack.SetZ(fZ);
211 esdMuonTrack.SetNonBendingCoor(fParameters(0,0));
212 esdMuonTrack.SetThetaX(TMath::ATan(fParameters(1,0)));
213 esdMuonTrack.SetBendingCoor(fParameters(2,0));
214 esdMuonTrack.SetThetaY(TMath::ATan(fParameters(3,0)));
215 esdMuonTrack.SetInverseBendingMomentum(fParameters(4,0));
218 //_________________________________________________________________________
219 void AliMUONTrackParam::GetParamFromDCA(const AliESDMuonTrack& esdMuonTrack)
221 /// Get parameters from ESD track
222 fZ = esdMuonTrack.GetZ();
223 fParameters(0,0) = esdMuonTrack.GetNonBendingCoorAtDCA();
224 fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaXAtDCA());
225 fParameters(2,0) = esdMuonTrack.GetBendingCoorAtDCA();
226 fParameters(3,0) = TMath::Tan(esdMuonTrack.GetThetaYAtDCA());
227 fParameters(4,0) = esdMuonTrack.GetInverseBendingMomentumAtDCA();
230 //_________________________________________________________________________
231 void AliMUONTrackParam::SetParamForDCA(AliESDMuonTrack& esdMuonTrack) const
233 /// Set parameters in ESD track
234 esdMuonTrack.SetNonBendingCoorAtDCA(fParameters(0,0));
235 esdMuonTrack.SetThetaXAtDCA(TMath::ATan(fParameters(1,0)));
236 esdMuonTrack.SetBendingCoorAtDCA(fParameters(2,0));
237 esdMuonTrack.SetThetaYAtDCA(TMath::ATan(fParameters(3,0)));
238 esdMuonTrack.SetInverseBendingMomentumAtDCA(fParameters(4,0));
241 //_________________________________________________________________________
242 void AliMUONTrackParam::GetParamFromUncorrected(const AliESDMuonTrack& esdMuonTrack)
244 /// Get parameters from ESD track
245 fZ = esdMuonTrack.GetZUncorrected();
246 fParameters(0,0) = esdMuonTrack.GetNonBendingCoorUncorrected();
247 fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaXUncorrected());
248 fParameters(2,0) = esdMuonTrack.GetBendingCoorUncorrected();
249 fParameters(3,0) = TMath::Tan(esdMuonTrack.GetThetaYUncorrected());
250 fParameters(4,0) = esdMuonTrack.GetInverseBendingMomentumUncorrected();
253 //_________________________________________________________________________
254 void AliMUONTrackParam::SetParamForUncorrected(AliESDMuonTrack& esdMuonTrack) const
256 /// Set parameters in ESD track
257 esdMuonTrack.SetZUncorrected(fZ);
258 esdMuonTrack.SetNonBendingCoorUncorrected(fParameters(0,0));
259 esdMuonTrack.SetThetaXUncorrected(TMath::ATan(fParameters(1,0)));
260 esdMuonTrack.SetBendingCoorUncorrected(fParameters(2,0));
261 esdMuonTrack.SetThetaYUncorrected(TMath::ATan(fParameters(3,0)));
262 esdMuonTrack.SetInverseBendingMomentumUncorrected(fParameters(4,0));
265 //_________________________________________________________________________
266 void AliMUONTrackParam::GetCovFrom(const AliESDMuonTrack& esdMuonTrack)
268 /// Get parameters covariances from ESD track
270 // Get ESD covariance matrix
271 if (!fCovariances) fCovariances = new TMatrixD(5,5);
272 esdMuonTrack.GetCovariances(*fCovariances);
274 // compute Jacobian to change the coordinate system
275 // from (X,thetaX,Y,thetaY,c/pYZ) to (X,slopeX,Y,slopeY,c/pYZ)
276 Double_t cosThetaX = TMath::Cos(TMath::ATan(fParameters(1,0)));
277 Double_t cosThetaY = TMath::Cos(TMath::ATan(fParameters(3,0)));
281 jacob(1,1) = 1. / cosThetaX / cosThetaX;
283 jacob(3,3) = 1. / cosThetaY / cosThetaY;
286 // compute covariance matrix in ESD coordinate system
287 TMatrixD tmp(*fCovariances,TMatrixD::kMultTranspose,jacob);
288 *fCovariances = TMatrixD(jacob,TMatrixD::kMult,tmp);
292 //_________________________________________________________________________
293 void AliMUONTrackParam::SetCovFor(AliESDMuonTrack& esdMuonTrack) const
295 /// Set parameters covariances in ESD track
297 // set null matrix if covariances does not exist
301 esdMuonTrack.SetCovariances(tmp);
305 // compute Jacobian to change the coordinate system
306 // from (X,slopeX,Y,slopeY,c/pYZ) to (X,thetaX,Y,thetaY,c/pYZ)
307 Double_t cosThetaX = TMath::Cos(TMath::ATan(fParameters(1,0)));
308 Double_t cosThetaY = TMath::Cos(TMath::ATan(fParameters(3,0)));
312 jacob(1,1) = cosThetaX * cosThetaX;
314 jacob(3,3) = cosThetaY * cosThetaY;
317 // compute covariance matrix in ESD coordinate system
318 TMatrixD tmp(*fCovariances,TMatrixD::kMultTranspose,jacob);
319 TMatrixD tmp2(jacob,TMatrixD::kMult,tmp);
320 esdMuonTrack.SetCovariances(tmp2);
324 //__________________________________________________________________________
325 Double_t AliMUONTrackParam::Px() const
327 /// return p_x from track parameters
328 Double_t pYZ, pZ, pX;
330 if ( TMath::Abs(fParameters(4,0)) > 0 )
331 pYZ = TMath::Abs(1.0 / fParameters(4,0));
332 pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
333 pX = pZ * fParameters(1,0);
337 //__________________________________________________________________________
338 Double_t AliMUONTrackParam::Py() const
340 /// return p_y from track parameters
341 Double_t pYZ, pZ, pY;
343 if ( TMath::Abs(fParameters(4,0)) > 0 )
344 pYZ = TMath::Abs(1.0 / fParameters(4,0));
345 pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
346 pY = pZ * fParameters(3,0);
350 //__________________________________________________________________________
351 Double_t AliMUONTrackParam::Pz() const
353 /// return p_z from track parameters
356 if ( TMath::Abs(fParameters(4,0)) > 0 )
357 pYZ = TMath::Abs(1.0 / fParameters(4,0));
358 pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
362 //__________________________________________________________________________
363 Double_t AliMUONTrackParam::P() const
365 /// return p from track parameters
368 if ( TMath::Abs(fParameters(4,0)) > 0 )
369 pYZ = TMath::Abs(1.0 / fParameters(4,0));
370 pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
372 TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0));
377 //__________________________________________________________________________
378 const TMatrixD& AliMUONTrackParam::GetCovariances() const
380 /// Return the covariance matrix (create it before if needed)
382 fCovariances = new TMatrixD(5,5);
383 fCovariances->Zero();
385 return *fCovariances;
388 //__________________________________________________________________________
389 void AliMUONTrackParam::SetCovariances(const TMatrixD& covariances)
391 /// Set the covariance matrix
392 if (fCovariances) *fCovariances = covariances;
393 else fCovariances = new TMatrixD(covariances);
396 //__________________________________________________________________________
397 void AliMUONTrackParam::SetCovariances(const Double_t matrix[5][5])
399 /// Set the covariance matrix
400 if (fCovariances) fCovariances->SetMatrixArray(&(matrix[0][0]));
401 else fCovariances = new TMatrixD(5,5,&(matrix[0][0]));
404 //__________________________________________________________________________
405 void AliMUONTrackParam::SetVariances(const Double_t matrix[5][5])
407 /// Set the diagonal terms of the covariance matrix (variances)
408 if (!fCovariances) fCovariances = new TMatrixD(5,5);
409 fCovariances->Zero();
410 for (Int_t i=0; i<5; i++) (*fCovariances)(i,i) = matrix[i][i];
413 //__________________________________________________________________________
414 void AliMUONTrackParam::DeleteCovariances()
416 /// Delete the covariance matrix
421 //__________________________________________________________________________
422 const TMatrixD& AliMUONTrackParam::GetPropagator() const
424 /// Return the propagator (create it before if needed)
426 fPropagator = new TMatrixD(5,5);
427 fPropagator->UnitMatrix();
432 //__________________________________________________________________________
433 void AliMUONTrackParam::ResetPropagator()
435 /// Reset the propagator
436 if (fPropagator) fPropagator->UnitMatrix();
439 //__________________________________________________________________________
440 void AliMUONTrackParam::UpdatePropagator(const TMatrixD& propagator)
442 /// Update the propagator
443 if (fPropagator) *fPropagator = TMatrixD(propagator,TMatrixD::kMult,*fPropagator);
444 else fPropagator = new TMatrixD(propagator);
447 //__________________________________________________________________________
448 const TMatrixD& AliMUONTrackParam::GetExtrapParameters() const
450 /// Return extrapolated parameters (create it before if needed)
451 if (!fExtrapParameters) {
452 fExtrapParameters = new TMatrixD(5,1);
453 fExtrapParameters->Zero();
455 return *fExtrapParameters;
458 //__________________________________________________________________________
459 void AliMUONTrackParam::SetExtrapParameters(const TMatrixD& extrapParameters)
461 /// Set extrapolated parameters
462 if (fExtrapParameters) *fExtrapParameters = extrapParameters;
463 else fExtrapParameters = new TMatrixD(extrapParameters);
466 //__________________________________________________________________________
467 const TMatrixD& AliMUONTrackParam::GetExtrapCovariances() const
469 /// Return the extrapolated covariance matrix (create it before if needed)
470 if (!fExtrapCovariances) {
471 fExtrapCovariances = new TMatrixD(5,5);
472 fExtrapCovariances->Zero();
474 return *fExtrapCovariances;
477 //__________________________________________________________________________
478 void AliMUONTrackParam::SetExtrapCovariances(const TMatrixD& extrapCovariances)
480 /// Set the extrapolated covariance matrix
481 if (fExtrapCovariances) *fExtrapCovariances = extrapCovariances;
482 else fExtrapCovariances = new TMatrixD(extrapCovariances);
485 //__________________________________________________________________________
486 const TMatrixD& AliMUONTrackParam::GetSmoothParameters() const
488 /// Return the smoothed parameters (create it before if needed)
489 if (!fSmoothParameters) {
490 fSmoothParameters = new TMatrixD(5,1);
491 fSmoothParameters->Zero();
493 return *fSmoothParameters;
496 //__________________________________________________________________________
497 void AliMUONTrackParam::SetSmoothParameters(const TMatrixD& smoothParameters)
499 /// Set the smoothed parameters
500 if (fSmoothParameters) *fSmoothParameters = smoothParameters;
501 else fSmoothParameters = new TMatrixD(smoothParameters);
504 //__________________________________________________________________________
505 const TMatrixD& AliMUONTrackParam::GetSmoothCovariances() const
507 /// Return the smoothed covariance matrix (create it before if needed)
508 if (!fSmoothCovariances) {
509 fSmoothCovariances = new TMatrixD(5,5);
510 fSmoothCovariances->Zero();
512 return *fSmoothCovariances;
515 //__________________________________________________________________________
516 void AliMUONTrackParam::SetSmoothCovariances(const TMatrixD& smoothCovariances)
518 /// Set the smoothed covariance matrix
519 if (fSmoothCovariances) *fSmoothCovariances = smoothCovariances;
520 else fSmoothCovariances = new TMatrixD(smoothCovariances);
523 //__________________________________________________________________________
524 Int_t AliMUONTrackParam::Compare(const TObject* trackParam) const
526 /// "Compare" function to sort with decreasing Z (spectro. muon Z <0).
527 /// Returns 1 (0, -1) if the current Z
528 /// is smaller than (equal to, larger than) Z of trackParam
529 if (fZ < ((AliMUONTrackParam*)trackParam)->GetZ()) return(1);
530 else if (fZ == ((AliMUONTrackParam*)trackParam)->GetZ()) return(0);
534 //__________________________________________________________________________
535 Bool_t AliMUONTrackParam::CompatibleTrackParam(const AliMUONTrackParam &trackParam, Double_t sigma2Cut, Double_t &chi2) const
537 /// Return kTRUE if the two set of track parameters are compatible within sigma2Cut
538 /// Set chi2 to the compatible chi2 value
539 /// Note that parameter covariances must exist for at least one set of parameters
540 /// Note also that if parameters are not given at the same Z, results will be meaningless
545 // ckeck covariance matrices
546 if (!fCovariances && !trackParam.fCovariances) {
547 AliError("Covariance matrix must exist for at least one set of parameters");
551 Double_t maxChi2 = 5. * sigma2Cut * sigma2Cut; // 5 degrees of freedom
553 // check Z parameters
554 if (fZ != trackParam.fZ)
555 AliWarning(Form("Parameters are given at different Z position (%le : %le): results are meaningless", fZ, trackParam.fZ));
557 // compute the parameter residuals
558 TMatrixD deltaParam(fParameters, TMatrixD::kMinus, trackParam.fParameters);
560 // build the error matrix
561 TMatrixD weight(5,5);
562 if (fCovariances) weight += *fCovariances;
563 if (trackParam.fCovariances) weight += *(trackParam.fCovariances);
565 // invert the error matrix to get the parameter weights if possible
566 if (weight.Determinant() == 0) {
567 AliError("Cannot compute the compatibility chi2");
572 // compute the compatibility chi2
573 TMatrixD tmp(deltaParam, TMatrixD::kTransposeMult, weight);
574 TMatrixD mChi2(tmp, TMatrixD::kMult, deltaParam);
579 // check compatibility
580 if (chi2 > maxChi2) return kFALSE;
585 //__________________________________________________________________________
586 void AliMUONTrackParam::Print(Option_t* opt) const
588 /// Printing TrackParam information
589 /// "full" option for printing all the information about the TrackParam
593 if ( sopt.Contains("FULL") ) {
594 cout << "<AliMUONTrackParam> Bending P=" << setw(5) << setprecision(3) << 1./fParameters(4,0) <<
595 ", NonBendSlope=" << setw(5) << setprecision(3) << fParameters(1,0)*180./TMath::Pi() <<
596 ", BendSlope=" << setw(5) << setprecision(3) << fParameters(3,0)*180./TMath::Pi() <<
597 ", (x,y,z)_IP=(" << setw(5) << setprecision(3) << fParameters(0,0) <<
598 "," << setw(5) << setprecision(3) << fParameters(2,0) <<
599 "," << setw(5) << setprecision(3) << fZ <<
600 ") cm, (px,py,pz)=(" << setw(5) << setprecision(3) << Px() <<
601 "," << setw(5) << setprecision(3) << Py() <<
602 "," << setw(5) << setprecision(3) << Pz() << ") GeV/c" << endl;
605 cout << "<AliMUONTrackParam>" << endl;