//_________________________________________________________________________
void AliMUONTrackParam::GetParamFrom(const AliESDMuonTrack& esdMuonTrack)
{
- /// assigned value form ESD track.
+ /// Get parameters from ESD track
fZ = esdMuonTrack.GetZ();
fParameters(0,0) = esdMuonTrack.GetNonBendingCoor();
fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaX());
//_________________________________________________________________________
void AliMUONTrackParam::SetParamFor(AliESDMuonTrack& esdMuonTrack) const
{
- /// assigned value form ESD track.
+ /// Set parameters in ESD track
esdMuonTrack.SetZ(fZ);
esdMuonTrack.SetNonBendingCoor(fParameters(0,0));
esdMuonTrack.SetThetaX(TMath::ATan(fParameters(1,0)));
//_________________________________________________________________________
void AliMUONTrackParam::GetParamFromUncorrected(const AliESDMuonTrack& esdMuonTrack)
{
- /// assigned value form ESD track.
+ /// Get parameters from ESD track
fZ = esdMuonTrack.GetZUncorrected();
fParameters(0,0) = esdMuonTrack.GetNonBendingCoorUncorrected();
fParameters(1,0) = TMath::Tan(esdMuonTrack.GetThetaXUncorrected());
//_________________________________________________________________________
void AliMUONTrackParam::SetParamForUncorrected(AliESDMuonTrack& esdMuonTrack) const
{
- /// assigned value form ESD track.
+ /// 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);
+
}
//__________________________________________________________________________
void SetParamFor(AliESDMuonTrack& esdMuonTrack) const;
void GetParamFromUncorrected(const AliESDMuonTrack& esdMuonTrack);
void SetParamForUncorrected(AliESDMuonTrack& esdMuonTrack) const;
+
+ void GetCovFrom(const AliESDMuonTrack& esdMuonTrack);
+ void SetCovFor(AliESDMuonTrack& esdMuonTrack) const;
// Get and Set methods for data
/// return Z coordinate (cm)
#include "AliMUONTrackExtrap.h"
#include "AliMUONTrackHitPattern.h"
#include "AliMUONTrackParam.h"
+#include "AliMUONHitForRec.h"
#include "AliMUONTrackReconstructor.h"
#include "AliMUONTrackReconstructorK.h"
#include "AliMUONTrackStoreV1.h"
// setting data member of ESD MUON
// at first station
- esdTrack.SetInverseBendingMomentumUncorrected(trackParam->GetInverseBendingMomentum());
- esdTrack.SetThetaXUncorrected(TMath::ATan(trackParam->GetNonBendingSlope()));
- esdTrack.SetThetaYUncorrected(TMath::ATan(trackParam->GetBendingSlope()));
- esdTrack.SetZUncorrected(trackParam->GetZ());
- esdTrack.SetBendingCoorUncorrected(trackParam->GetBendingCoor());
- esdTrack.SetNonBendingCoorUncorrected(trackParam->GetNonBendingCoor());
+ trackParam->SetParamForUncorrected(esdTrack);
+ trackParam->SetCovFor(esdTrack);
// at vertex
- esdTrack.SetInverseBendingMomentum(trackParamAtVtx.GetInverseBendingMomentum());
- esdTrack.SetThetaX(TMath::ATan(trackParamAtVtx.GetNonBendingSlope()));
- esdTrack.SetThetaY(TMath::ATan(trackParamAtVtx.GetBendingSlope()));
- esdTrack.SetZ(trackParamAtVtx.GetZ());
- esdTrack.SetBendingCoor(trackParamAtVtx.GetBendingCoor());
- esdTrack.SetNonBendingCoor(trackParamAtVtx.GetNonBendingCoor());
+ trackParamAtVtx.SetParamFor(esdTrack);
// global info
esdTrack.SetChi2(track->GetFitFMin());
esdTrack.SetNHit(track->GetNTrackHits());
esdTrack.SetLocalTrigger(track->GetLocalTrigger());
esdTrack.SetChi2MatchTrigger(track->GetChi2MatchTrigger());
esdTrack.SetHitsPatternInTrigCh(track->GetHitsPatternInTrigCh());
+ // muon cluster map
+ AliMUONHitForRec* cluster = static_cast<AliMUONHitForRec*>((track->GetHitForRecAtHit())->First());
+ while (cluster) {
+ esdTrack.AddInMuonClusterMap(cluster->GetChamberNumber());
+ cluster = static_cast<AliMUONHitForRec*>((track->GetHitForRecAtHit())->After(cluster));
+ }
// storing ESD MUON Track into ESD Event
esd->AddMuonTrack(&esdTrack);
fNHit(0),
fLocalTrigger(234),
fChi2MatchTrigger(0),
- fHitsPatternInTrigCh(0)
+ fHitsPatternInTrigCh(0),
+ fMuonClusterMap(0)
{
+ //
// Default constructor
+ //
+ for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0;
}
fNHit(MUONTrack.fNHit),
fLocalTrigger(MUONTrack.fLocalTrigger),
fChi2MatchTrigger(MUONTrack.fChi2MatchTrigger),
- fHitsPatternInTrigCh(MUONTrack.fHitsPatternInTrigCh)
+ fHitsPatternInTrigCh(MUONTrack.fHitsPatternInTrigCh),
+ fMuonClusterMap(MUONTrack.fMuonClusterMap)
{
//
// Copy constructor
// Deep copy implemented
//
+ for (Int_t i = 0; i < 15; i++) fCovariances[i] = MUONTrack.fCovariances[i];
}
//_____________________________________________________________________________
fBendingCoorUncorrected = MUONTrack.fBendingCoorUncorrected;
fNonBendingCoorUncorrected = MUONTrack.fNonBendingCoorUncorrected;
+ for (Int_t i = 0; i < 15; i++) fCovariances[i] = MUONTrack.fCovariances[i];
+
fChi2 = MUONTrack.fChi2;
fNHit = MUONTrack.fNHit;
fHitsPatternInTrigCh = MUONTrack.fHitsPatternInTrigCh;
+ fMuonClusterMap = MUONTrack.fMuonClusterMap;
+
return *this;
}
+//_____________________________________________________________________________
+void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const
+{
+ // 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++)
+ cov(i,j) = cov (j,i) = fCovariances[i*(i+1)/2 + j];
+}
+
+//_____________________________________________________________________________
+void AliESDMuonTrack::SetCovariances(const TMatrixD& cov)
+{
+ // 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);
+
+}
+
+//_____________________________________________________________________________
+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
+ TMatrixD covESD(5,5);
+ GetCovariances(covESD);
+
+ // compute Jacobian to change the coordinate system
+ // from (X,thetaX,Y,thetaY,c/pYZ) to (X,Y,Z,pX,pY,pZ)
+ Double_t tanThetaX = TMath::Tan(fThetaXUncorrected);
+ Double_t tanThetaY = TMath::Tan(fThetaYUncorrected);
+ Double_t cosThetaX2 = TMath::Cos(fThetaXUncorrected) * TMath::Cos(fThetaXUncorrected);
+ Double_t cosThetaY2 = TMath::Cos(fThetaYUncorrected) * TMath::Cos(fThetaYUncorrected);
+ Double_t pZ = PzUncorrected();
+ Double_t dpZdthetaY = - fInverseBendingMomentumUncorrected * fInverseBendingMomentumUncorrected *
+ pZ * pZ * pZ * tanThetaY / cosThetaY2;
+ Double_t dpZdinvpYZ = - pZ / fInverseBendingMomentumUncorrected;
+ TMatrixD jacob(6,5);
+ jacob.Zero();
+ jacob(0,0) = 1.;
+ jacob(1,2) = 1.;
+ jacob(3,1) = pZ / cosThetaX2;
+ jacob(3,3) = dpZdthetaY * tanThetaX;
+ jacob(3,4) = dpZdinvpYZ * tanThetaX;
+ jacob(4,3) = dpZdthetaY * tanThetaY + pZ / cosThetaY2;
+ jacob(4,4) = dpZdinvpYZ * tanThetaY;
+ jacob(5,3) = dpZdthetaY;
+ jacob(5,4) = dpZdinvpYZ;
+
+ // compute covariance matrix in AOD coordinate system
+ TMatrixD tmp(covESD,TMatrixD::kMultTranspose,jacob);
+ TMatrixD covAOD(jacob,TMatrixD::kMult,tmp);
+
+ // Get AOD covariance matrix into co[21]
+ for (Int_t i = 0; i < 6; i++)
+ for (Int_t j = 0; j <= i; j++)
+ cov[i*(i+1)/2 + j] = covAOD(i,j);
+
+}
+
//_____________________________________________________________________________
Double_t AliESDMuonTrack::Px() const
{
void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const
{
// return Lorentz momentum vector from track parameters
- Double_t muonMass = 0.105658369;
+ 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.;
void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const
{
// return Lorentz momentum vector from track parameters
- Double_t muonMass = 0.105658369;
+ 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.;
}
+//_____________________________________________________________________________
+void AliESDMuonTrack::AddInMuonClusterMap(Int_t chamber)
+{
+ // Update the muon cluster map by adding this chamber(0..)
+
+ static const UInt_t kMask[10] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200};
+
+ fMuonClusterMap |= kMask[chamber];
+
+}
+
+//_____________________________________________________________________________
+Bool_t AliESDMuonTrack::IsInMuonClusterMap(Int_t chamber) const
+{
+ // return kTRUE if this chamber(0..) is in the muon cluster map
+
+ static const UInt_t kMask[10] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200};
+
+ return ((fMuonClusterMap | kMask[chamber]) == fMuonClusterMap) ? kTRUE : kFALSE;
+
+}
+
#include <TMath.h>
+#include <TMatrixD.h>
+#include <TDatabasePDG.h>
#include "AliVParticle.h"
void SetBendingCoorUncorrected(Double_t BendingCoor) {fBendingCoorUncorrected = BendingCoor;}
Double_t GetNonBendingCoorUncorrected(void) const {return fNonBendingCoorUncorrected;}
void SetNonBendingCoorUncorrected(Double_t NonBendingCoor) {fNonBendingCoorUncorrected = NonBendingCoor;}
-
+
+ // Get and Set methods for covariance matrix of data at first station
+ void GetCovariances(TMatrixD& cov) const;
+ void SetCovariances(const TMatrixD& cov);
+ void GetCovarianceXYZPxPyPz(Double_t cov[21]) const;
+
// Get and Set methods for global tracking info
Double_t GetChi2(void) const {return fChi2;}
void SetChi2(Double_t Chi2) {fChi2 = Chi2;}
Int_t LoLpt(void) const { return fLocalTrigger >> 22 & 0x03; }
Int_t LoHpt(void) const { return fLocalTrigger >> 24 & 0x03; }
+ // Get and Set methods for muon cluster map
+ UInt_t GetMuonClusterMap() const {return fMuonClusterMap;}
+ void SetMuonClusterMap(UInt_t muonClusterMap) {fMuonClusterMap = muonClusterMap;}
+ void AddInMuonClusterMap(Int_t chamber);
+ Bool_t IsInMuonClusterMap(Int_t chamber) const;
+
// Methods to compute track momentum
Double_t Px() const;
Double_t Py() const;
Double_t OneOverPt() const { return 1./Pt(); }
Double_t Phi() const { return TMath::ATan2(Py(), Px()); }
Double_t Theta() const { return TMath::ATan2(Pt(), Pz()); }
- Double_t E() const { return -999.; }
- Double_t M() const { return -999.; }
+ Double_t E() const { return TMath::Sqrt(M()*M() + P()*P()); }
+ Double_t M() const { return TDatabasePDG::Instance()->GetParticle("mu-")->Mass(); }
Double_t Eta() const { return -TMath::Log(TMath::Tan(0.5 * Theta()));}
- Double_t Y() const { return -999.; }
- Short_t Charge() const { return (Short_t)TMath::Sign(1., GetInverseBendingMomentum()); }
+ Double_t Y() const { return TMath::ATanH(Pz()/E()); }
+ Short_t Charge() const { return (Short_t)TMath::Sign(1., GetInverseBendingMomentum()); }
const Double_t *PID() const { return (Double_t*)0x0; }
protected:
// parameters at vertex
- Double32_t fInverseBendingMomentum; // Inverse bending momentum (GeV/c ** -1) times the charge
- Double32_t fThetaX; // Angle of track at vertex in X direction (rad)
- Double32_t fThetaY; // Angle of track at vertex in Y direction (rad)
- Double32_t fZ; // Z coordinate (cm)
- Double32_t fBendingCoor; // bending coordinate (cm)
- Double32_t fNonBendingCoor; // non bending coordinate (cm)
+ Double32_t fInverseBendingMomentum; ///< Inverse bending momentum (GeV/c ** -1) times the charge
+ Double32_t fThetaX; ///< Angle of track at vertex in X direction (rad)
+ Double32_t fThetaY; ///< Angle of track at vertex in Y direction (rad)
+ Double32_t fZ; ///< Z coordinate (cm)
+ Double32_t fBendingCoor; ///< bending coordinate (cm)
+ Double32_t fNonBendingCoor; ///< non bending coordinate (cm)
// parameters at first tracking station
- Double32_t fInverseBendingMomentumUncorrected; // Inverse bending momentum (GeV/c ** -1) times the charge
- Double32_t fThetaXUncorrected; // Angle of track at vertex in X direction (rad)
- Double32_t fThetaYUncorrected; // Angle of track at vertex in Y direction (rad)
- Double32_t fZUncorrected; // Z coordinate (cm)
- Double32_t fBendingCoorUncorrected; // bending coordinate (cm)
- Double32_t fNonBendingCoorUncorrected; // non bending coordinate (cm)
+ Double32_t fInverseBendingMomentumUncorrected; ///< Inverse bending momentum (GeV/c ** -1) times the charge
+ Double32_t fThetaXUncorrected; ///< Angle of track at vertex in X direction (rad)
+ Double32_t fThetaYUncorrected; ///< Angle of track at vertex in Y direction (rad)
+ Double32_t fZUncorrected; ///< Z coordinate (cm)
+ Double32_t fBendingCoorUncorrected; ///< bending coordinate (cm)
+ Double32_t fNonBendingCoorUncorrected; ///< non bending coordinate (cm)
- // global tracking info
- Double32_t fChi2; // chi2 in the MUON track fit
- UInt_t fNHit; // number of hit in the track
-
- Int_t fLocalTrigger; ///< packed local trigger information
+ /// reduced covariance matrix of UNCORRECTED track parameters, ordered as follow: <pre>
+ /// [0] = <X,X>
+ /// [1] =<X,ThetaX> [2] =<ThetaX,ThetaX>
+ /// [3] = <X,Y> [4] = <Y,ThetaX> [5] = <Y,Y>
+ /// [6] =<X,ThetaY> [7] =<ThetaX,ThetaY> [8] =<Y,ThetaY> [9] =<ThetaY,ThetaY>
+ /// [10]=<X,InvP_yz> [11]=<ThetaX,InvP_yz> [12]=<Y,InvP_yz> [13]=<ThetaY,InvP_yz> [14]=<InvP_yz,InvP_yz> </pre>
+ Double32_t fCovariances[15]; ///< \brief reduced covariance matrix of parameters AT FIRST CHAMBER
- Double32_t fChi2MatchTrigger; // chi2 of trigger/track matching
-
- UShort_t fHitsPatternInTrigCh; ///< Word containing info on the hits left in trigger chambers
+ // global tracking info
+ Double32_t fChi2; ///< chi2 in the MUON track fit
+ UInt_t fNHit; ///< number of hit in the track
+ Int_t fLocalTrigger; ///< packed local trigger information
+ Double32_t fChi2MatchTrigger; ///< chi2 of trigger/track matching
+ UShort_t fHitsPatternInTrigCh; ///< Word containing info on the hits left in trigger chambers
+ UInt_t fMuonClusterMap; ///< Map of clusters in tracking chambers
- ClassDef(AliESDMuonTrack,6) //MUON ESD track class
+ ClassDef(AliESDMuonTrack,7) // MUON ESD track class
};
#endif