X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliESDMuonTrack.cxx;h=ad9db0989d584cae064440a21d6f1080eeae119f;hb=c231afb91ec4bb196385cf21fb721f353ec4dd18;hp=16c418ad22e9dc7a03996c421855b01ee9f401dc;hpb=60765b06290ca3415474baf4f767e5132b669994;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliESDMuonTrack.cxx b/STEER/AliESDMuonTrack.cxx index 16c418ad22e..ad9db0989d5 100644 --- a/STEER/AliESDMuonTrack.cxx +++ b/STEER/AliESDMuonTrack.cxx @@ -17,16 +17,19 @@ /////////////////////////////////////////////////////////////////////////////// // -// Class to describe the MUON tracks -// in the Event Summary Data class -// This is where the results of reconstruction -// are stored for the muons -// Author: G.Martinez +/// \class AliESDMuonTrack +/// Class to describe the MUON tracks in the Event Summary Data class +/// This is where the results of reconstruction are stored for the muons +/// +/// \author G.Martinez // /////////////////////////////////////////////////////////////////////////////// #include "AliESDMuonTrack.h" +#include "AliESDMuonCluster.h" +#include "AliESDEvent.h" +#include #include #include @@ -35,105 +38,252 @@ ClassImp(AliESDMuonTrack) //_____________________________________________________________________________ AliESDMuonTrack::AliESDMuonTrack (): AliVParticle(), - fInverseBendingMomentum(0), + fInverseBendingMomentum(FLT_MAX), fThetaX(0), fThetaY(0), fZ(0), fBendingCoor(0), fNonBendingCoor(0), - fInverseBendingMomentumUncorrected(0), + fInverseBendingMomentumAtDCA(FLT_MAX), + fThetaXAtDCA(0), + fThetaYAtDCA(0), + fBendingCoorAtDCA(0), + fNonBendingCoorAtDCA(0), + fInverseBendingMomentumUncorrected(FLT_MAX), fThetaXUncorrected(0), fThetaYUncorrected(0), fZUncorrected(0), fBendingCoorUncorrected(0), fNonBendingCoorUncorrected(0), + fRAtAbsorberEnd(0), fChi2(0), - fNHit(0), - fLocalTrigger(234), fChi2MatchTrigger(0), + fLocalTrigger(0), + fX1Pattern(0), + fY1Pattern(0), + fX2Pattern(0), + fY2Pattern(0), + fX3Pattern(0), + fY3Pattern(0), + fX4Pattern(0), + fY4Pattern(0), + fMuonClusterMap(0), fHitsPatternInTrigCh(0), - fMuonClusterMap(0) + fNHit(0), + fClusters(0x0), + fLabel(-1), + fESDEvent(0) + { // - // Default constructor + /// Default constructor // for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0; } //_____________________________________________________________________________ -AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& MUONTrack): - AliVParticle(MUONTrack), - fInverseBendingMomentum(MUONTrack.fInverseBendingMomentum), - fThetaX(MUONTrack.fThetaX), - fThetaY(MUONTrack.fThetaY), - fZ(MUONTrack.fZ), - fBendingCoor(MUONTrack.fBendingCoor), - fNonBendingCoor(MUONTrack.fNonBendingCoor), - fInverseBendingMomentumUncorrected(MUONTrack.fInverseBendingMomentumUncorrected), - fThetaXUncorrected(MUONTrack.fThetaXUncorrected), - fThetaYUncorrected(MUONTrack.fThetaYUncorrected), - fZUncorrected(MUONTrack.fZUncorrected), - fBendingCoorUncorrected(MUONTrack.fBendingCoorUncorrected), - fNonBendingCoorUncorrected(MUONTrack.fNonBendingCoorUncorrected), - fChi2(MUONTrack.fChi2), - fNHit(MUONTrack.fNHit), - fLocalTrigger(MUONTrack.fLocalTrigger), - fChi2MatchTrigger(MUONTrack.fChi2MatchTrigger), - fHitsPatternInTrigCh(MUONTrack.fHitsPatternInTrigCh), - fMuonClusterMap(MUONTrack.fMuonClusterMap) +AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& muonTrack): + AliVParticle(muonTrack), + fInverseBendingMomentum(muonTrack.fInverseBendingMomentum), + fThetaX(muonTrack.fThetaX), + fThetaY(muonTrack.fThetaY), + fZ(muonTrack.fZ), + fBendingCoor(muonTrack.fBendingCoor), + fNonBendingCoor(muonTrack.fNonBendingCoor), + fInverseBendingMomentumAtDCA(muonTrack.fInverseBendingMomentumAtDCA), + fThetaXAtDCA(muonTrack.fThetaXAtDCA), + fThetaYAtDCA(muonTrack.fThetaYAtDCA), + fBendingCoorAtDCA(muonTrack.fBendingCoorAtDCA), + fNonBendingCoorAtDCA(muonTrack.fNonBendingCoorAtDCA), + fInverseBendingMomentumUncorrected(muonTrack.fInverseBendingMomentumUncorrected), + fThetaXUncorrected(muonTrack.fThetaXUncorrected), + fThetaYUncorrected(muonTrack.fThetaYUncorrected), + fZUncorrected(muonTrack.fZUncorrected), + fBendingCoorUncorrected(muonTrack.fBendingCoorUncorrected), + fNonBendingCoorUncorrected(muonTrack.fNonBendingCoorUncorrected), + fRAtAbsorberEnd(muonTrack.fRAtAbsorberEnd), + fChi2(muonTrack.fChi2), + fChi2MatchTrigger(muonTrack.fChi2MatchTrigger), + fLocalTrigger(muonTrack.fLocalTrigger), + fX1Pattern(muonTrack.fX1Pattern), + fY1Pattern(muonTrack.fY1Pattern), + fX2Pattern(muonTrack.fX2Pattern), + fY2Pattern(muonTrack.fY2Pattern), + fX3Pattern(muonTrack.fX3Pattern), + fY3Pattern(muonTrack.fY3Pattern), + fX4Pattern(muonTrack.fX4Pattern), + fY4Pattern(muonTrack.fY4Pattern), + fMuonClusterMap(muonTrack.fMuonClusterMap), + fHitsPatternInTrigCh(muonTrack.fHitsPatternInTrigCh), + fNHit(muonTrack.fNHit), + fClusters(0x0), + fLabel(muonTrack.fLabel), + fESDEvent(muonTrack.fESDEvent) { // - // Copy constructor - // Deep copy implemented + /// Copy constructor + /// Deep copy implemented // - for (Int_t i = 0; i < 15; i++) fCovariances[i] = MUONTrack.fCovariances[i]; + for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i]; + + // necessary to make a copy of the objects and not only the pointers in TClonesArray + if (muonTrack.fClusters) { + fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast()); + AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First(); + while (cluster) { + new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster); + cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster); + } + } } //_____________________________________________________________________________ -AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& MUONTrack) +AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& muonTrack) { // - // Equal operator for a deep copy + /// Equal operator for a deep copy // - if (this == &MUONTrack) + if (this == &muonTrack) return *this; - AliVParticle::operator=(MUONTrack); // don't forget to invoke the base class' assignment operator + AliVParticle::operator=(muonTrack); // don't forget to invoke the base class' assignment operator - fInverseBendingMomentum = MUONTrack.fInverseBendingMomentum; - fThetaX = MUONTrack.fThetaX; - fThetaY = MUONTrack.fThetaY; - fZ = MUONTrack.fZ; - fBendingCoor = MUONTrack.fBendingCoor; - fNonBendingCoor = MUONTrack.fNonBendingCoor; + fInverseBendingMomentum = muonTrack.fInverseBendingMomentum; + fThetaX = muonTrack.fThetaX; + fThetaY = muonTrack.fThetaY; + fZ = muonTrack.fZ; + fBendingCoor = muonTrack.fBendingCoor; + fNonBendingCoor = muonTrack.fNonBendingCoor; - fInverseBendingMomentumUncorrected = MUONTrack.fInverseBendingMomentumUncorrected; - fThetaXUncorrected = MUONTrack.fThetaXUncorrected; - fThetaYUncorrected = MUONTrack.fThetaYUncorrected; - fZUncorrected = MUONTrack.fZUncorrected; - fBendingCoorUncorrected = MUONTrack.fBendingCoorUncorrected; - fNonBendingCoorUncorrected = MUONTrack.fNonBendingCoorUncorrected; + fInverseBendingMomentumAtDCA = muonTrack.fInverseBendingMomentumAtDCA; + fThetaXAtDCA = muonTrack.fThetaXAtDCA; + fThetaYAtDCA = muonTrack.fThetaYAtDCA; + fBendingCoorAtDCA = muonTrack.fBendingCoorAtDCA; + fNonBendingCoorAtDCA = muonTrack.fNonBendingCoorAtDCA; - for (Int_t i = 0; i < 15; i++) fCovariances[i] = MUONTrack.fCovariances[i]; + fInverseBendingMomentumUncorrected = muonTrack.fInverseBendingMomentumUncorrected; + fThetaXUncorrected = muonTrack.fThetaXUncorrected; + fThetaYUncorrected = muonTrack.fThetaYUncorrected; + fZUncorrected = muonTrack.fZUncorrected; + fBendingCoorUncorrected = muonTrack.fBendingCoorUncorrected; + fNonBendingCoorUncorrected = muonTrack.fNonBendingCoorUncorrected; - fChi2 = MUONTrack.fChi2; - fNHit = MUONTrack.fNHit; - - fLocalTrigger = MUONTrack.fLocalTrigger; - fChi2MatchTrigger = MUONTrack.fChi2MatchTrigger; - - fHitsPatternInTrigCh = MUONTrack.fHitsPatternInTrigCh; + for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i]; + + fRAtAbsorberEnd = muonTrack.fRAtAbsorberEnd; + + fChi2 = muonTrack.fChi2; + fNHit = muonTrack.fNHit; + + fLocalTrigger = muonTrack.fLocalTrigger; + fX1Pattern = muonTrack.fX1Pattern; + fY1Pattern = muonTrack.fY1Pattern; + fX2Pattern = muonTrack.fX2Pattern; + fY2Pattern = muonTrack.fY2Pattern; + fX3Pattern = muonTrack.fX3Pattern; + fY3Pattern = muonTrack.fY3Pattern; + fX4Pattern = muonTrack.fX4Pattern; + fY4Pattern = muonTrack.fY4Pattern; + fChi2MatchTrigger = muonTrack.fChi2MatchTrigger; + + fHitsPatternInTrigCh = muonTrack.fHitsPatternInTrigCh; - fMuonClusterMap = MUONTrack.fMuonClusterMap; + fMuonClusterMap = muonTrack.fMuonClusterMap; + + fLabel = muonTrack.fLabel; + + fESDEvent = muonTrack.fESDEvent; + + // necessary to make a copy of the objects and not only the pointers in TClonesArray + delete fClusters; + if (muonTrack.fClusters) { + fClusters = new TClonesArray("AliESDMuonCluster",muonTrack.fClusters->GetEntriesFast()); + AliESDMuonCluster *cluster = (AliESDMuonCluster*) muonTrack.fClusters->First(); + while (cluster) { + new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster); + cluster = (AliESDMuonCluster*) muonTrack.fClusters->After(cluster); + } + } else fClusters = 0x0; return *this; } +void AliESDMuonTrack::Copy(TObject &obj) const { + + /// This overwrites the virtual TOBject::Copy() + /// to allow run time copying without casting + /// in AliESDEvent + + if(this==&obj)return; + AliESDMuonTrack *robj = dynamic_cast(&obj); + if(!robj)return; // not an AliESDMuonTrack + *robj = *this; + +} + + +//__________________________________________________________________________ +AliESDMuonTrack::~AliESDMuonTrack() +{ + /// Destructor + delete fClusters; +} + +//__________________________________________________________________________ +void AliESDMuonTrack::Clear(Option_t* opt) +{ + /// Clear arrays + if (fClusters) fClusters->Clear(opt); +} + +//__________________________________________________________________________ +void AliESDMuonTrack::Reset() +{ + /// Reset to default values + SetUniqueID(0); + fInverseBendingMomentum = FLT_MAX; + fThetaX = 0.; + fThetaY = 0.; + fZ = 0.; + fBendingCoor = 0.; + fNonBendingCoor = 0.; + fInverseBendingMomentumAtDCA = FLT_MAX; + fThetaXAtDCA = 0.; + fThetaYAtDCA = 0.; + fBendingCoorAtDCA = 0.; + fNonBendingCoorAtDCA = 0.; + fInverseBendingMomentumUncorrected = FLT_MAX; + fThetaXUncorrected = 0.; + fThetaYUncorrected = 0.; + fZUncorrected = 0.; + fBendingCoorUncorrected = 0.; + fNonBendingCoorUncorrected = 0.; + fRAtAbsorberEnd = 0.; + fChi2 = 0.; + fChi2MatchTrigger = 0.; + fLocalTrigger = 0; + fX1Pattern = 0; + fY1Pattern = 0; + fX2Pattern = 0; + fY2Pattern = 0; + fX3Pattern = 0; + fY3Pattern = 0; + fX4Pattern = 0; + fY4Pattern = 0; + fMuonClusterMap = 0; + fHitsPatternInTrigCh = 0; + fNHit = 0; + delete fClusters; fClusters = 0x0; + for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0.; + fLabel = -1; + fESDEvent = 0; +} + //_____________________________________________________________________________ void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const { - // return covariance matrix of uncorrected parameters + /// return covariance matrix of uncorrected parameters cov.ResizeTo(5,5); for (Int_t i = 0; i < 5; i++) for (Int_t j = 0; j <= i; j++) @@ -143,7 +293,7 @@ void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const //_____________________________________________________________________________ void AliESDMuonTrack::SetCovariances(const TMatrixD& cov) { - // set reduced covariance matrix of uncorrected parameters + /// set reduced covariance matrix of uncorrected parameters for (Int_t i = 0; i < 5; i++) for (Int_t j = 0; j <= i; j++) fCovariances[i*(i+1)/2 + j] = cov(i,j); @@ -153,16 +303,16 @@ void AliESDMuonTrack::SetCovariances(const TMatrixD& cov) //_____________________________________________________________________________ void AliESDMuonTrack::GetCovarianceXYZPxPyPz(Double_t cov[21]) const { - // return reduced covariance matrix of uncorrected parameters in (X,Y,Z,Px,Py,Pz) coordinate system - // - // Cov(x,x) ... : cov[0] - // Cov(y,x) ... : cov[1] cov[2] - // Cov(z,x) ... : cov[3] cov[4] cov[5] - // Cov(px,x)... : cov[6] cov[7] cov[8] cov[9] - // Cov(py,x)... : cov[10] cov[11] cov[12] cov[13] cov[14] - // Cov(pz,x)... : cov[15] cov[16] cov[17] cov[18] cov[19] cov[20] - // - // Get ESD covariance matrix into a TMatrixD + /// return reduced covariance matrix of uncorrected parameters in (X,Y,Z,Px,Py,Pz) coordinate system + /// + /// - Cov(x,x) ... : cov[0] + /// - Cov(y,x) ... : cov[1] cov[2] + /// - Cov(z,x) ... : cov[3] cov[4] cov[5] + /// - Cov(px,x)... : cov[6] cov[7] cov[8] cov[9] + /// - Cov(py,x)... : cov[10] cov[11] cov[12] cov[13] cov[14] + /// - Cov(pz,x)... : cov[15] cov[16] cov[17] cov[18] cov[19] cov[20] + /// + /// Get ESD covariance matrix into a TMatrixD TMatrixD covESD(5,5); GetCovariances(covESD); @@ -175,7 +325,7 @@ void AliESDMuonTrack::GetCovarianceXYZPxPyPz(Double_t cov[21]) const Double_t pZ = PzUncorrected(); Double_t dpZdthetaY = - fInverseBendingMomentumUncorrected * fInverseBendingMomentumUncorrected * pZ * pZ * pZ * tanThetaY / cosThetaY2; - Double_t dpZdinvpYZ = - pZ / fInverseBendingMomentumUncorrected; + Double_t dpZdinvpYZ = (fInverseBendingMomentumUncorrected != 0.) ? - pZ / fInverseBendingMomentumUncorrected : - FLT_MAX; TMatrixD jacob(6,5); jacob.Zero(); jacob(0,0) = 1.; @@ -202,10 +352,10 @@ void AliESDMuonTrack::GetCovarianceXYZPxPyPz(Double_t cov[21]) const //_____________________________________________________________________________ Double_t AliESDMuonTrack::Px() const { - // return p_x from track parameters + /// return p_x from track parameters Double_t nonBendingSlope = TMath::Tan(fThetaX); Double_t bendingSlope = TMath::Tan(fThetaY); - Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : 0.; + Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX; Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) return pZ * nonBendingSlope; } @@ -213,9 +363,9 @@ Double_t AliESDMuonTrack::Px() const //_____________________________________________________________________________ Double_t AliESDMuonTrack::Py() const { - // return p_y from track parameters + /// return p_y from track parameters Double_t bendingSlope = TMath::Tan(fThetaY); - Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : 0.; + Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX; Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) return pZ * bendingSlope; } @@ -223,19 +373,19 @@ Double_t AliESDMuonTrack::Py() const //_____________________________________________________________________________ Double_t AliESDMuonTrack::Pz() const { - // return p_z from track parameters + /// return p_z from track parameters Double_t bendingSlope = TMath::Tan(fThetaY); - Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : 0.; + Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX; return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) } //_____________________________________________________________________________ Double_t AliESDMuonTrack::P() const { - // return p from track parameters + /// return p from track parameters Double_t nonBendingSlope = TMath::Tan(fThetaX); Double_t bendingSlope = TMath::Tan(fThetaY); - Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : 0.; + Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX; Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope); } @@ -243,11 +393,67 @@ Double_t AliESDMuonTrack::P() const //_____________________________________________________________________________ void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const { - // return Lorentz momentum vector from track parameters + /// return Lorentz momentum vector from track parameters Double_t muonMass = M(); Double_t nonBendingSlope = TMath::Tan(fThetaX); Double_t bendingSlope = TMath::Tan(fThetaY); - Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : 0.; + Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX; + Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) + Double_t pX = pZ * nonBendingSlope; + Double_t pY = pZ * bendingSlope; + Double_t e = TMath::Sqrt(muonMass*muonMass + pX*pX + pY*pY + pZ*pZ); + vP.SetPxPyPzE(pX, pY, pZ, e); +} + +//_____________________________________________________________________________ +Double_t AliESDMuonTrack::PxAtDCA() const +{ + /// return p_x from track parameters + Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA); + Double_t bendingSlope = TMath::Tan(fThetaYAtDCA); + Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX; + Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) + return pZ * nonBendingSlope; +} + +//_____________________________________________________________________________ +Double_t AliESDMuonTrack::PyAtDCA() const +{ + /// return p_y from track parameters + Double_t bendingSlope = TMath::Tan(fThetaYAtDCA); + Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX; + Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) + return pZ * bendingSlope; +} + +//_____________________________________________________________________________ +Double_t AliESDMuonTrack::PzAtDCA() const +{ + /// return p_z from track parameters + Double_t bendingSlope = TMath::Tan(fThetaYAtDCA); + Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX; + return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) +} + +//_____________________________________________________________________________ +Double_t AliESDMuonTrack::PAtDCA() const +{ + /// return p from track parameters + Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA); + Double_t bendingSlope = TMath::Tan(fThetaYAtDCA); + Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX; + Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) + return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope); +} + +//_____________________________________________________________________________ +void AliESDMuonTrack::LorentzPAtDCA(TLorentzVector& vP) const +{ + /// return Lorentz momentum vector from track parameters + Double_t muonMass = M(); + Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA); + Double_t bendingSlope = TMath::Tan(fThetaYAtDCA); + Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX; Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) Double_t pX = pZ * nonBendingSlope; Double_t pY = pZ * bendingSlope; @@ -258,10 +464,10 @@ void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const //_____________________________________________________________________________ Double_t AliESDMuonTrack::PxUncorrected() const { - // return p_x from track parameters + /// return p_x from track parameters Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected); Double_t bendingSlope = TMath::Tan(fThetaYUncorrected); - Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : 0.; + Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX; Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) return pZ * nonBendingSlope; } @@ -269,9 +475,9 @@ Double_t AliESDMuonTrack::PxUncorrected() const //_____________________________________________________________________________ Double_t AliESDMuonTrack::PyUncorrected() const { - // return p_y from track parameters + /// return p_y from track parameters Double_t bendingSlope = TMath::Tan(fThetaYUncorrected); - Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : 0.; + Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX; Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) return pZ * bendingSlope; } @@ -279,19 +485,19 @@ Double_t AliESDMuonTrack::PyUncorrected() const //_____________________________________________________________________________ Double_t AliESDMuonTrack::PzUncorrected() const { - // return p_z from track parameters + /// return p_z from track parameters Double_t bendingSlope = TMath::Tan(fThetaYUncorrected); - Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : 0.; + Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX; return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) } //_____________________________________________________________________________ Double_t AliESDMuonTrack::PUncorrected() const { - // return p from track parameters + /// return p from track parameters Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected); Double_t bendingSlope = TMath::Tan(fThetaYUncorrected); - Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : 0.; + Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX; Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope); } @@ -299,11 +505,11 @@ Double_t AliESDMuonTrack::PUncorrected() const //_____________________________________________________________________________ void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const { - // return Lorentz momentum vector from track parameters + /// return Lorentz momentum vector from track parameters Double_t muonMass = M(); Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected); Double_t bendingSlope = TMath::Tan(fThetaYUncorrected); - Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : 0.; + Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX; Double_t pZ = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope); // spectro. (z<0) Double_t pX = pZ * nonBendingSlope; Double_t pY = pZ * bendingSlope; @@ -314,13 +520,13 @@ void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const //_____________________________________________________________________________ Int_t AliESDMuonTrack::GetMatchTrigger() const { - // backward compatibility after replacing fMatchTrigger by fLocalTrigger - // 0 track does not match trigger - // 1 track match but does not pass pt cut - // 2 track match Low pt cut - // 3 track match High pt cut + /// backward compatibility after replacing fMatchTrigger by fLocalTrigger + /// - 0 track does not match trigger + /// - 1 track match but does not pass pt cut + /// - 2 track match Low pt cut + /// - 3 track match High pt cut - if (LoCircuit() == -1) { + if (!LoCircuit()) { return 0; } else if (LoLpt() == 0 && LoHpt() == 0) { return 1; @@ -333,24 +539,86 @@ Int_t AliESDMuonTrack::GetMatchTrigger() const } //_____________________________________________________________________________ -void AliESDMuonTrack::AddInMuonClusterMap(Int_t chamber) +Bool_t AliESDMuonTrack::MatchTriggerDigits() const { - // Update the muon cluster map by adding this chamber(0..) + // return kTRUE if the track matches a digit on both planes of at least 2 trigger chambers - static const UInt_t kMask[10] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200}; + Int_t nMatchedChambers = 0; + for (Int_t ich=0; ich<4; ich++) + if (IsChamberHit(fHitsPatternInTrigCh, 0, ich) && + IsChamberHit(fHitsPatternInTrigCh, 1, ich)) nMatchedChambers++; - fMuonClusterMap |= kMask[chamber]; + return (nMatchedChambers >= 2); +} + +//_____________________________________________________________________________ +Int_t AliESDMuonTrack::GetNClusters() const +{ + /// return the number of clusters associated to the track + if (!fClusters) return 0; + return fClusters->GetEntriesFast(); } //_____________________________________________________________________________ -Bool_t AliESDMuonTrack::IsInMuonClusterMap(Int_t chamber) const +TClonesArray& AliESDMuonTrack::GetClusters() const { - // return kTRUE if this chamber(0..) is in the muon cluster map + /// return the array of clusters associated to the track + if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10); - static const UInt_t kMask[10] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200}; + return *fClusters; +} + +//_____________________________________________________________________________ +void AliESDMuonTrack::AddCluster(const AliESDMuonCluster &cluster) +{ + /// add a cluster to the TClonesArray of clusters associated to the track + if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10); - return ((fMuonClusterMap | kMask[chamber]) == fMuonClusterMap) ? kTRUE : kFALSE; + new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(cluster); +} + +//_____________________________________________________________________________ +Bool_t AliESDMuonTrack::ClustersStored() const +{ + /// return kTRUE if the clusters associated to the track are registered + if (GetNClusters() == 0) return kFALSE; + return kTRUE; +} + +//_____________________________________________________________________________ +void AliESDMuonTrack::SetFiredChamber(UShort_t& pattern, Int_t cathode, Int_t chamber) +{ + /// Turn on the bit corresponding to fired chameber + pattern |= (0x1 << ( 7 - ( 4*cathode + chamber ))); +} + +//_____________________________________________________________________________ +void AliESDMuonTrack::AddEffInfo(UShort_t& pattern, Int_t slatOrInfo, EAliTriggerChPatternFlag effType) +{ + /// Add efficiency flag and crossed RPC or info on rejected track + pattern |= effType << 8; + pattern |= slatOrInfo << 10; +} + +//_____________________________________________________________________________ +Bool_t AliESDMuonTrack::IsChamberHit(UShort_t pattern, Int_t cathode, Int_t chamber) +{ + /// Check if chamber was was hit + return (pattern >> (7 - ( 4*cathode + chamber ))) & 0x1; } +//_____________________________________________________________________________ +Int_t AliESDMuonTrack::GetEffFlag(UShort_t pattern) +{ + /// Get Efficiency flag + return (pattern >> 8) & 0x03; +} + +//_____________________________________________________________________________ +Int_t AliESDMuonTrack::GetSlatOrInfo(UShort_t pattern) +{ + /// Getting crossed slat or info + return (pattern >> 10) & 0x1F; +}