]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONTrackParam.cxx
Added setting the default CDB storage,
[u/mrichter/AliRoot.git] / MUON / AliMUONTrackParam.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 // Class AliMUONTrackParam
20 //-------------------------
21 // Track parameters in ALICE dimuon spectrometer
22 //-----------------------------------------------------------------------------
23
24 #include "AliMUONTrackParam.h"
25 #include "AliMUONVCluster.h"
26
27 #include "AliESDMuonTrack.h"
28 #include "AliLog.h"
29
30 #include <TMath.h>
31
32 #include <Riostream.h>
33
34 /// \cond CLASSIMP
35 ClassImp(AliMUONTrackParam) // Class implementation in ROOT context
36 /// \endcond
37
38   //_________________________________________________________________________
39 AliMUONTrackParam::AliMUONTrackParam()
40   : TObject(),
41     fZ(0.),
42     fParameters(5,1),
43     fCovariances(0x0),
44     fPropagator(0x0),
45     fExtrapParameters(0x0),
46     fExtrapCovariances(0x0),
47     fSmoothParameters(0x0),
48     fSmoothCovariances(0x0),
49     fClusterPtr(0x0),
50     fOwnCluster(kFALSE),
51     fRemovable(kFALSE),
52     fAloneInChamber(kTRUE),
53     fTrackChi2(0.),
54     fLocalChi2(0.)
55 {
56   /// Constructor
57 }
58
59   //_________________________________________________________________________
60 AliMUONTrackParam::AliMUONTrackParam(const AliMUONTrackParam& theMUONTrackParam)
61   : TObject(theMUONTrackParam),
62     fZ(theMUONTrackParam.fZ),
63     fParameters(theMUONTrackParam.fParameters),
64     fCovariances(0x0),
65     fPropagator(0x0),
66     fExtrapParameters(0x0),
67     fExtrapCovariances(0x0),
68     fSmoothParameters(0x0),
69     fSmoothCovariances(0x0),
70     fClusterPtr(0x0),
71     fOwnCluster(theMUONTrackParam.fOwnCluster),
72     fRemovable(theMUONTrackParam.fRemovable),
73     fAloneInChamber(theMUONTrackParam.fAloneInChamber),
74     fTrackChi2(theMUONTrackParam.fTrackChi2),
75     fLocalChi2(theMUONTrackParam.fLocalChi2)
76 {
77   /// Copy constructor
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));
84   
85   if(fOwnCluster) fClusterPtr = static_cast<AliMUONVCluster*>(theMUONTrackParam.fClusterPtr->Clone());
86   else fClusterPtr = theMUONTrackParam.fClusterPtr;
87 }
88
89   //_________________________________________________________________________
90 AliMUONTrackParam& AliMUONTrackParam::operator=(const AliMUONTrackParam& theMUONTrackParam)
91 {
92   /// Asignment operator
93   if (this == &theMUONTrackParam)
94     return *this;
95
96   // base class assignement
97   TObject::operator=(theMUONTrackParam);
98
99   fZ = theMUONTrackParam.fZ; 
100   
101   fParameters = theMUONTrackParam.fParameters;
102   
103   if (theMUONTrackParam.fCovariances) {
104     if (fCovariances) *fCovariances = *(theMUONTrackParam.fCovariances);
105     else fCovariances = new TMatrixD(*(theMUONTrackParam.fCovariances));
106   } else {
107     delete fCovariances;
108     fCovariances = 0x0;
109   }
110   
111   if (theMUONTrackParam.fPropagator) {
112     if (fPropagator) *fPropagator = *(theMUONTrackParam.fPropagator);
113     else fPropagator = new TMatrixD(*(theMUONTrackParam.fPropagator));
114   } else {
115     delete fPropagator;
116     fPropagator = 0x0;
117   }
118   
119   if (theMUONTrackParam.fExtrapParameters) {
120     if (fExtrapParameters) *fExtrapParameters = *(theMUONTrackParam.fExtrapParameters);
121     else fExtrapParameters = new TMatrixD(*(theMUONTrackParam.fExtrapParameters));
122   } else {
123     delete fExtrapParameters;
124     fExtrapParameters = 0x0;
125   }
126   
127   if (theMUONTrackParam.fExtrapCovariances) {
128     if (fExtrapCovariances) *fExtrapCovariances = *(theMUONTrackParam.fExtrapCovariances);
129     else fExtrapCovariances = new TMatrixD(*(theMUONTrackParam.fExtrapCovariances));
130   } else {
131     delete fExtrapCovariances;
132     fExtrapCovariances = 0x0;
133   }
134   
135   if (theMUONTrackParam.fSmoothParameters) {
136     if (fSmoothParameters) *fSmoothParameters = *(theMUONTrackParam.fSmoothParameters);
137     else fSmoothParameters = new TMatrixD(*(theMUONTrackParam.fSmoothParameters));
138   } else {
139     delete fSmoothParameters;
140     fSmoothParameters = 0x0;
141   }
142   
143   if (theMUONTrackParam.fSmoothCovariances) {
144     if (fSmoothCovariances) *fSmoothCovariances = *(theMUONTrackParam.fSmoothCovariances);
145     else fSmoothCovariances = new TMatrixD(*(theMUONTrackParam.fSmoothCovariances));
146   } else {
147     delete fSmoothCovariances;
148     fSmoothCovariances = 0x0;
149   }
150   
151   fOwnCluster = theMUONTrackParam.fOwnCluster;
152   if(fOwnCluster) fClusterPtr = static_cast<AliMUONVCluster*>(theMUONTrackParam.fClusterPtr->Clone());
153   else fClusterPtr = theMUONTrackParam.fClusterPtr;
154   
155   fRemovable = theMUONTrackParam.fRemovable;
156   
157   fAloneInChamber = theMUONTrackParam.fAloneInChamber;
158   
159   fTrackChi2 = theMUONTrackParam.fTrackChi2;
160   fLocalChi2 = theMUONTrackParam.fLocalChi2;
161   
162   return *this;
163 }
164
165   //__________________________________________________________________________
166 AliMUONTrackParam::~AliMUONTrackParam()
167 {
168 /// Destructor
169   DeleteCovariances();
170   delete fPropagator;
171   delete fExtrapParameters;
172   delete fExtrapCovariances;
173   delete fSmoothParameters;
174   delete fSmoothCovariances;
175   if(fOwnCluster) delete fClusterPtr;
176 }
177
178   //__________________________________________________________________________
179 void
180 AliMUONTrackParam::Clear(Option_t* /*opt*/)
181 {
182   /// clear memory
183   DeleteCovariances();
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;
189   if(fOwnCluster) {
190     delete fClusterPtr; fClusterPtr = 0x0;
191   }
192 }
193
194   //_________________________________________________________________________
195 void AliMUONTrackParam::GetParamFrom(const AliESDMuonTrack& esdMuonTrack)
196 {
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();
204 }
205
206   //_________________________________________________________________________
207 void AliMUONTrackParam::SetParamFor(AliESDMuonTrack& esdMuonTrack) const
208 {
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));
216 }
217
218   //_________________________________________________________________________
219 void AliMUONTrackParam::GetParamFromDCA(const AliESDMuonTrack& esdMuonTrack)
220 {
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();
228 }
229
230   //_________________________________________________________________________
231 void AliMUONTrackParam::SetParamForDCA(AliESDMuonTrack& esdMuonTrack) const
232 {
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));
239 }
240
241 //_________________________________________________________________________
242 void AliMUONTrackParam::GetParamFromUncorrected(const AliESDMuonTrack& esdMuonTrack)
243 {
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();
251 }
252
253 //_________________________________________________________________________
254 void AliMUONTrackParam::SetParamForUncorrected(AliESDMuonTrack& esdMuonTrack) const
255 {
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));
263 }
264
265 //_________________________________________________________________________
266 void AliMUONTrackParam::GetCovFrom(const AliESDMuonTrack& esdMuonTrack)
267 {
268   /// Get parameters covariances from ESD track
269   
270   // Get ESD covariance matrix
271   if (!fCovariances) fCovariances = new TMatrixD(5,5);
272   esdMuonTrack.GetCovariances(*fCovariances);
273
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)));
278   TMatrixD jacob(5,5);
279   jacob.Zero();
280   jacob(0,0) = 1.;
281   jacob(1,1) = 1. / cosThetaX / cosThetaX;
282   jacob(2,2) = 1.;
283   jacob(3,3) = 1. / cosThetaY / cosThetaY;
284   jacob(4,4) = 1.;
285   
286   // compute covariance matrix in ESD coordinate system
287   TMatrixD tmp(*fCovariances,TMatrixD::kMultTranspose,jacob);
288   *fCovariances = TMatrixD(jacob,TMatrixD::kMult,tmp);
289   
290 }
291
292   //_________________________________________________________________________
293 void AliMUONTrackParam::SetCovFor(AliESDMuonTrack& esdMuonTrack) const
294 {
295   /// Set parameters covariances in ESD track
296   
297   // set null matrix if covariances does not exist
298   if (!fCovariances) {
299     TMatrixD tmp(5,5);
300     tmp.Zero();
301     esdMuonTrack.SetCovariances(tmp);
302     return;
303   }
304   
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)));
309   TMatrixD jacob(5,5);
310   jacob.Zero();
311   jacob(0,0) = 1.;
312   jacob(1,1) = cosThetaX * cosThetaX;
313   jacob(2,2) = 1.;
314   jacob(3,3) = cosThetaY * cosThetaY;
315   jacob(4,4) = 1.;
316   
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);
321
322 }
323
324   //__________________________________________________________________________
325 Double_t AliMUONTrackParam::Px() const
326 {
327   /// return p_x from track parameters
328   Double_t pYZ, pZ, pX;
329   pYZ = 0;
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); 
334   return pX;
335 }
336
337   //__________________________________________________________________________
338 Double_t AliMUONTrackParam::Py() const
339 {
340   /// return p_y from track parameters
341   Double_t pYZ, pZ, pY;
342   pYZ = 0;
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); 
347   return pY;
348 }
349
350   //__________________________________________________________________________
351 Double_t AliMUONTrackParam::Pz() const
352 {
353   /// return p_z from track parameters
354   Double_t pYZ, pZ;
355   pYZ = 0;
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)
359   return pZ;
360 }
361
362   //__________________________________________________________________________
363 Double_t AliMUONTrackParam::P() const
364 {
365   /// return p from track parameters
366   Double_t  pYZ, pZ, p;
367   pYZ = 0;
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)
371   p = TMath::Abs(pZ) * 
372     TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0));
373   return p;
374   
375 }
376
377   //__________________________________________________________________________
378 const TMatrixD& AliMUONTrackParam::GetCovariances() const
379 {
380   /// Return the covariance matrix (create it before if needed)
381   if (!fCovariances) {
382     fCovariances = new TMatrixD(5,5);
383     fCovariances->Zero();
384   }
385   return *fCovariances;
386 }
387
388   //__________________________________________________________________________
389 void AliMUONTrackParam::SetCovariances(const TMatrixD& covariances)
390 {
391   /// Set the covariance matrix
392   if (fCovariances) *fCovariances = covariances;
393   else fCovariances = new TMatrixD(covariances);
394 }
395
396   //__________________________________________________________________________
397 void AliMUONTrackParam::SetCovariances(const Double_t matrix[5][5])
398 {
399   /// Set the covariance matrix
400   if (fCovariances) fCovariances->SetMatrixArray(&(matrix[0][0]));
401   else fCovariances = new TMatrixD(5,5,&(matrix[0][0]));
402 }
403
404   //__________________________________________________________________________
405 void AliMUONTrackParam::SetVariances(const Double_t matrix[5][5])
406 {
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];
411 }
412
413   //__________________________________________________________________________
414 void AliMUONTrackParam::DeleteCovariances()
415 {
416   /// Delete the covariance matrix
417   delete fCovariances;
418   fCovariances = 0x0;
419 }
420
421   //__________________________________________________________________________
422 const TMatrixD& AliMUONTrackParam::GetPropagator() const
423 {
424   /// Return the propagator (create it before if needed)
425   if (!fPropagator) {
426     fPropagator = new TMatrixD(5,5);
427     fPropagator->UnitMatrix();
428   }
429   return *fPropagator;
430 }
431
432   //__________________________________________________________________________
433 void AliMUONTrackParam::ResetPropagator()
434 {
435   /// Reset the propagator
436   if (fPropagator) fPropagator->UnitMatrix();
437 }
438
439   //__________________________________________________________________________
440 void AliMUONTrackParam::UpdatePropagator(const TMatrixD& propagator)
441 {
442   /// Update the propagator
443   if (fPropagator) *fPropagator = TMatrixD(propagator,TMatrixD::kMult,*fPropagator);
444   else fPropagator = new TMatrixD(propagator);
445 }
446
447   //__________________________________________________________________________
448 const TMatrixD& AliMUONTrackParam::GetExtrapParameters() const
449 {
450   /// Return extrapolated parameters (create it before if needed)
451   if (!fExtrapParameters) {
452     fExtrapParameters = new TMatrixD(5,1);
453     fExtrapParameters->Zero();
454   }
455   return *fExtrapParameters;
456   }
457
458   //__________________________________________________________________________
459 void AliMUONTrackParam::SetExtrapParameters(const TMatrixD& extrapParameters)
460 {
461   /// Set extrapolated parameters
462   if (fExtrapParameters) *fExtrapParameters = extrapParameters;
463   else fExtrapParameters = new TMatrixD(extrapParameters);
464 }
465
466   //__________________________________________________________________________
467 const TMatrixD& AliMUONTrackParam::GetExtrapCovariances() const
468 {
469   /// Return the extrapolated covariance matrix (create it before if needed)
470   if (!fExtrapCovariances) {
471     fExtrapCovariances = new TMatrixD(5,5);
472     fExtrapCovariances->Zero();
473   }
474   return *fExtrapCovariances;
475   }
476
477   //__________________________________________________________________________
478 void AliMUONTrackParam::SetExtrapCovariances(const TMatrixD& extrapCovariances)
479 {
480   /// Set the extrapolated covariance matrix
481   if (fExtrapCovariances) *fExtrapCovariances = extrapCovariances;
482   else fExtrapCovariances = new TMatrixD(extrapCovariances);
483 }
484
485   //__________________________________________________________________________
486 const TMatrixD& AliMUONTrackParam::GetSmoothParameters() const
487 {
488   /// Return the smoothed parameters (create it before if needed)
489   if (!fSmoothParameters) {
490     fSmoothParameters = new TMatrixD(5,1);
491     fSmoothParameters->Zero();
492   }
493   return *fSmoothParameters;
494   }
495
496   //__________________________________________________________________________
497 void AliMUONTrackParam::SetSmoothParameters(const TMatrixD& smoothParameters)
498 {
499   /// Set the smoothed parameters
500   if (fSmoothParameters) *fSmoothParameters = smoothParameters;
501   else fSmoothParameters = new TMatrixD(smoothParameters);
502 }
503
504   //__________________________________________________________________________
505 const TMatrixD& AliMUONTrackParam::GetSmoothCovariances() const
506 {
507   /// Return the smoothed covariance matrix (create it before if needed)
508   if (!fSmoothCovariances) {
509     fSmoothCovariances = new TMatrixD(5,5);
510     fSmoothCovariances->Zero();
511   }
512   return *fSmoothCovariances;
513   }
514
515   //__________________________________________________________________________
516 void AliMUONTrackParam::SetSmoothCovariances(const TMatrixD& smoothCovariances)
517 {
518   /// Set the smoothed covariance matrix
519   if (fSmoothCovariances) *fSmoothCovariances = smoothCovariances;
520   else fSmoothCovariances = new TMatrixD(smoothCovariances);
521 }
522
523   //__________________________________________________________________________
524 Int_t AliMUONTrackParam::Compare(const TObject* trackParam) const
525 {
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);
531   else return(-1);
532 }
533
534   //__________________________________________________________________________
535 Bool_t AliMUONTrackParam::CompatibleTrackParam(const AliMUONTrackParam &trackParam, Double_t sigma2Cut, Double_t &chi2) const
536 {
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
541   
542   // reset chi2 value
543   chi2 = 0.;
544   
545   // ckeck covariance matrices
546   if (!fCovariances && !trackParam.fCovariances) {
547     AliError("Covariance matrix must exist for at least one set of parameters");
548     return kFALSE;
549   }
550   
551   Double_t maxChi2 = 5. * sigma2Cut * sigma2Cut; // 5 degrees of freedom
552   
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));
556   
557   // compute the parameter residuals
558   TMatrixD deltaParam(fParameters, TMatrixD::kMinus, trackParam.fParameters);
559   
560   // build the error matrix
561   TMatrixD weight(5,5);
562   if (fCovariances) weight += *fCovariances;
563   if (trackParam.fCovariances) weight += *(trackParam.fCovariances);
564   
565   // invert the error matrix to get the parameter weights if possible
566   if (weight.Determinant() == 0) {
567     AliError("Cannot compute the compatibility chi2");
568     return kFALSE;
569   }
570   weight.Invert();
571   
572   // compute the compatibility chi2
573   TMatrixD tmp(deltaParam, TMatrixD::kTransposeMult, weight);
574   TMatrixD mChi2(tmp, TMatrixD::kMult, deltaParam);
575   
576   // set chi2 value
577   chi2 = mChi2(0,0);
578   
579   // check compatibility
580   if (chi2 > maxChi2) return kFALSE;
581   
582   return kTRUE;
583 }
584
585   //__________________________________________________________________________
586 void AliMUONTrackParam::Print(Option_t* opt) const
587 {
588   /// Printing TrackParam information 
589   /// "full" option for printing all the information about the TrackParam
590   TString sopt(opt);
591   sopt.ToUpper();
592  
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;
603   }
604   else {
605     cout << "<AliMUONTrackParam>"  << endl;
606   }
607     
608 }