X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONTrackParam.cxx;h=045920c93069f568bd8bead7fd9706bcb1dee982;hb=1d2a91c902e1cde1856e52d9c653bfc9c7cd7777;hp=986af5031663638c5dfbebf7bbd6b8fa5def2758;hpb=1467f4ba9199b90673c9cad7a0771ec2caa4204b;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONTrackParam.cxx b/MUON/AliMUONTrackParam.cxx index 986af503166..045920c9306 100644 --- a/MUON/AliMUONTrackParam.cxx +++ b/MUON/AliMUONTrackParam.cxx @@ -24,7 +24,6 @@ #include "AliMUONTrackParam.h" #include "AliMUONVCluster.h" -#include "AliESDMuonTrack.h" #include "AliLog.h" #include @@ -49,7 +48,6 @@ AliMUONTrackParam::AliMUONTrackParam() fClusterPtr(0x0), fOwnCluster(kFALSE), fRemovable(kFALSE), - fAloneInChamber(kTRUE), fTrackChi2(0.), fLocalChi2(0.) { @@ -70,7 +68,6 @@ AliMUONTrackParam::AliMUONTrackParam(const AliMUONTrackParam& theMUONTrackParam) fClusterPtr(0x0), fOwnCluster(theMUONTrackParam.fOwnCluster), fRemovable(theMUONTrackParam.fRemovable), - fAloneInChamber(theMUONTrackParam.fAloneInChamber), fTrackChi2(theMUONTrackParam.fTrackChi2), fLocalChi2(theMUONTrackParam.fLocalChi2) { @@ -148,14 +145,13 @@ AliMUONTrackParam& AliMUONTrackParam::operator=(const AliMUONTrackParam& theMUON fSmoothCovariances = 0x0; } + if (fOwnCluster) delete fClusterPtr; fOwnCluster = theMUONTrackParam.fOwnCluster; if(fOwnCluster) fClusterPtr = static_cast(theMUONTrackParam.fClusterPtr->Clone()); else fClusterPtr = theMUONTrackParam.fClusterPtr; fRemovable = theMUONTrackParam.fRemovable; - fAloneInChamber = theMUONTrackParam.fAloneInChamber; - fTrackChi2 = theMUONTrackParam.fTrackChi2; fLocalChi2 = theMUONTrackParam.fLocalChi2; @@ -189,166 +185,55 @@ AliMUONTrackParam::Clear(Option_t* /*opt*/) if(fOwnCluster) { delete fClusterPtr; fClusterPtr = 0x0; } -} - - //_________________________________________________________________________ -void AliMUONTrackParam::GetParamFrom(const AliESDMuonTrack& esdMuonTrack) -{ - /// Get parameters from ESD track - fZ = esdMuonTrack.GetZ(); - fParameters(0,0) = esdMuonTrack.GetNonBendingCoor(); - fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaX()); - fParameters(2,0) = esdMuonTrack.GetBendingCoor(); - fParameters(3,0) = TMath::Tan(esdMuonTrack.GetThetaY()); - fParameters(4,0) = esdMuonTrack.GetInverseBendingMomentum(); -} - - //_________________________________________________________________________ -void AliMUONTrackParam::SetParamFor(AliESDMuonTrack& esdMuonTrack) const -{ - /// Set parameters in ESD track - esdMuonTrack.SetZ(fZ); - esdMuonTrack.SetNonBendingCoor(fParameters(0,0)); - esdMuonTrack.SetThetaX(TMath::ATan(fParameters(1,0))); - esdMuonTrack.SetBendingCoor(fParameters(2,0)); - esdMuonTrack.SetThetaY(TMath::ATan(fParameters(3,0))); - esdMuonTrack.SetInverseBendingMomentum(fParameters(4,0)); -} - - //_________________________________________________________________________ -void AliMUONTrackParam::GetParamFromUncorrected(const AliESDMuonTrack& esdMuonTrack) -{ - /// Get parameters from ESD track - fZ = esdMuonTrack.GetZUncorrected(); - fParameters(0,0) = esdMuonTrack.GetNonBendingCoorUncorrected(); - fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaXUncorrected()); - fParameters(2,0) = esdMuonTrack.GetBendingCoorUncorrected(); - fParameters(3,0) = TMath::Tan(esdMuonTrack.GetThetaYUncorrected()); - fParameters(4,0) = esdMuonTrack.GetInverseBendingMomentumUncorrected(); -} - - //_________________________________________________________________________ -void AliMUONTrackParam::SetParamForUncorrected(AliESDMuonTrack& esdMuonTrack) const -{ - /// Set parameters in ESD track - esdMuonTrack.SetZUncorrected(fZ); - esdMuonTrack.SetNonBendingCoorUncorrected(fParameters(0,0)); - esdMuonTrack.SetThetaXUncorrected(TMath::ATan(fParameters(1,0))); - esdMuonTrack.SetBendingCoorUncorrected(fParameters(2,0)); - esdMuonTrack.SetThetaYUncorrected(TMath::ATan(fParameters(3,0))); - esdMuonTrack.SetInverseBendingMomentumUncorrected(fParameters(4,0)); -} - - //_________________________________________________________________________ -void AliMUONTrackParam::GetCovFrom(const AliESDMuonTrack& esdMuonTrack) -{ - /// Get parameters covariances from ESD track - - // Get ESD covariance matrix - if (!fCovariances) fCovariances = new TMatrixD(5,5); - esdMuonTrack.GetCovariances(*fCovariances); - - // compute Jacobian to change the coordinate system - // from (X,thetaX,Y,thetaY,c/pYZ) to (X,slopeX,Y,slopeY,c/pYZ) - Double_t cosThetaX = TMath::Cos(TMath::ATan(fParameters(1,0))); - Double_t cosThetaY = TMath::Cos(TMath::ATan(fParameters(3,0))); - TMatrixD jacob(5,5); - jacob.Zero(); - jacob(0,0) = 1.; - jacob(1,1) = 1. / cosThetaX / cosThetaX; - jacob(2,2) = 1.; - jacob(3,3) = 1. / cosThetaY / cosThetaY; - jacob(4,4) = 1.; - - // compute covariance matrix in ESD coordinate system - TMatrixD tmp(*fCovariances,TMatrixD::kMultTranspose,jacob); - *fCovariances = TMatrixD(jacob,TMatrixD::kMult,tmp); - -} - - //_________________________________________________________________________ -void AliMUONTrackParam::SetCovFor(AliESDMuonTrack& esdMuonTrack) const -{ - /// Set parameters covariances in ESD track - - // set null matrix if covariances does not exist - if (!fCovariances) { - TMatrixD tmp(5,5); - tmp.Zero(); - esdMuonTrack.SetCovariances(tmp); - return; - } - - // compute Jacobian to change the coordinate system - // from (X,slopeX,Y,slopeY,c/pYZ) to (X,thetaX,Y,thetaY,c/pYZ) - Double_t cosThetaX = TMath::Cos(TMath::ATan(fParameters(1,0))); - Double_t cosThetaY = TMath::Cos(TMath::ATan(fParameters(3,0))); - TMatrixD jacob(5,5); - jacob.Zero(); - jacob(0,0) = 1.; - jacob(1,1) = cosThetaX * cosThetaX; - jacob(2,2) = 1.; - jacob(3,3) = cosThetaY * cosThetaY; - jacob(4,4) = 1.; - - // compute covariance matrix in ESD coordinate system - TMatrixD tmp(*fCovariances,TMatrixD::kMultTranspose,jacob); - TMatrixD tmp2(jacob,TMatrixD::kMult,tmp); - esdMuonTrack.SetCovariances(tmp2); - } //__________________________________________________________________________ Double_t AliMUONTrackParam::Px() const { /// return p_x from track parameters - Double_t pYZ, pZ, pX; - pYZ = 0; - if ( TMath::Abs(fParameters(4,0)) > 0 ) - pYZ = TMath::Abs(1.0 / fParameters(4,0)); - pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) - pX = pZ * fParameters(1,0); - return pX; + Double_t pZ; + if (TMath::Abs(fParameters(4,0)) > 0) { + Double_t pYZ = (TMath::Abs(fParameters(4,0)) > 0) ? TMath::Abs(1.0 / fParameters(4,0)) : FLT_MAX; + pZ = - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) + } else { + pZ = - FLT_MAX / TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0)); + } + return pZ * fParameters(1,0); } //__________________________________________________________________________ Double_t AliMUONTrackParam::Py() const { /// return p_y from track parameters - Double_t pYZ, pZ, pY; - pYZ = 0; - if ( TMath::Abs(fParameters(4,0)) > 0 ) - pYZ = TMath::Abs(1.0 / fParameters(4,0)); - pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) - pY = pZ * fParameters(3,0); - return pY; + Double_t pZ; + if (TMath::Abs(fParameters(4,0)) > 0) { + Double_t pYZ = (TMath::Abs(fParameters(4,0)) > 0) ? TMath::Abs(1.0 / fParameters(4,0)) : FLT_MAX; + pZ = - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) + } else { + pZ = - FLT_MAX / TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0)); + } + return pZ * fParameters(3,0); } //__________________________________________________________________________ Double_t AliMUONTrackParam::Pz() const { /// return p_z from track parameters - Double_t pYZ, pZ; - pYZ = 0; - if ( TMath::Abs(fParameters(4,0)) > 0 ) - pYZ = TMath::Abs(1.0 / fParameters(4,0)); - pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) - return pZ; + if (TMath::Abs(fParameters(4,0)) > 0) { + Double_t pYZ = TMath::Abs(1.0 / fParameters(4,0)); + return - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) + } else return - FLT_MAX / TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0)); } //__________________________________________________________________________ Double_t AliMUONTrackParam::P() const { /// return p from track parameters - Double_t pYZ, pZ, p; - pYZ = 0; - if ( TMath::Abs(fParameters(4,0)) > 0 ) - pYZ = TMath::Abs(1.0 / fParameters(4,0)); - pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) - p = TMath::Abs(pZ) * - TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0)); - return p; - + if (TMath::Abs(fParameters(4,0)) > 0) { + Double_t pYZ = TMath::Abs(1.0 / fParameters(4,0)); + Double_t pZ = - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) + return - pZ * TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0)); + } else return FLT_MAX; } //__________________________________________________________________________ @@ -497,6 +382,15 @@ void AliMUONTrackParam::SetSmoothCovariances(const TMatrixD& smoothCovariances) else fSmoothCovariances = new TMatrixD(smoothCovariances); } +//__________________________________________________________________________ +void AliMUONTrackParam::SetClusterPtr(AliMUONVCluster* cluster, Bool_t owner) +{ + /// set pointeur to associated cluster + if (fOwnCluster) delete fClusterPtr; + fClusterPtr = cluster; + fOwnCluster = owner; +} + //__________________________________________________________________________ Int_t AliMUONTrackParam::Compare(const TObject* trackParam) const { @@ -508,7 +402,58 @@ Int_t AliMUONTrackParam::Compare(const TObject* trackParam) const else return(-1); } -//_____________________________________________- + //__________________________________________________________________________ +Bool_t AliMUONTrackParam::CompatibleTrackParam(const AliMUONTrackParam &trackParam, Double_t sigma2Cut, Double_t &chi2) const +{ + /// Return kTRUE if the two set of track parameters are compatible within sigma2Cut + /// Set chi2 to the compatible chi2 value + /// Note that parameter covariances must exist for at least one set of parameters + /// Note also that if parameters are not given at the same Z, results will be meaningless + + // reset chi2 value + chi2 = 0.; + + // ckeck covariance matrices + if (!fCovariances && !trackParam.fCovariances) { + AliError("Covariance matrix must exist for at least one set of parameters"); + return kFALSE; + } + + Double_t maxChi2 = 5. * sigma2Cut * sigma2Cut; // 5 degrees of freedom + + // check Z parameters + if (fZ != trackParam.fZ) + AliWarning(Form("Parameters are given at different Z position (%le : %le): results are meaningless", fZ, trackParam.fZ)); + + // compute the parameter residuals + TMatrixD deltaParam(fParameters, TMatrixD::kMinus, trackParam.fParameters); + + // build the error matrix + TMatrixD weight(5,5); + if (fCovariances) weight += *fCovariances; + if (trackParam.fCovariances) weight += *(trackParam.fCovariances); + + // invert the error matrix to get the parameter weights if possible + if (weight.Determinant() == 0) { + AliError("Cannot compute the compatibility chi2"); + return kFALSE; + } + weight.Invert(); + + // compute the compatibility chi2 + TMatrixD tmp(deltaParam, TMatrixD::kTransposeMult, weight); + TMatrixD mChi2(tmp, TMatrixD::kMult, deltaParam); + + // set chi2 value + chi2 = mChi2(0,0); + + // check compatibility + if (chi2 > maxChi2) return kFALSE; + + return kTRUE; +} + + //__________________________________________________________________________ void AliMUONTrackParam::Print(Option_t* opt) const { /// Printing TrackParam information