#include "TParticle.h"
#include "AliMuonForwardTrack.h"
#include "AliMFTConstants.h"
+#include "TLorentzVector.h"
+#include "TDatabasePDG.h"
+#include "AliMUONConstants.h"
ClassImp(AliMuonForwardTrack)
fMCTrackRef(0),
fMFTClusters(0),
fNWrongClustersMC(-1),
- fTrackMCId(-1)
+ fTrackMCId(-1),
+ fKinem(0,0,0,0),
+ fParamCovMatrix(5,5)
{
// default constructor
fParentPDGCode[iParent] = 0;
}
fMFTClusters = new TClonesArray("AliMFTCluster");
+ fMFTClusters -> SetOwner(kTRUE);
}
fMCTrackRef(0),
fMFTClusters(0),
fNWrongClustersMC(-1),
- fTrackMCId(-1)
+ fTrackMCId(-1),
+ fKinem(0,0,0,0),
+ fParamCovMatrix(5,5)
{
SetMUONTrack(MUONTrack);
fParentPDGCode[iParent] = 0;
}
fMFTClusters = new TClonesArray("AliMFTCluster");
- fMFTClusters->SetOwner(kTRUE);
+ fMFTClusters -> SetOwner(kTRUE);
}
fMCTrackRef(0x0),
fMFTClusters(0x0),
fNWrongClustersMC(track.fNWrongClustersMC),
- fTrackMCId(track.fTrackMCId)
+ fTrackMCId(track.fTrackMCId),
+ fKinem(track.fKinem),
+ fParamCovMatrix(track.fParamCovMatrix)
{
// copy constructor
fMUONTrack = new AliMUONTrack(*(track.fMUONTrack));
if (track.fMCTrackRef) fMCTrackRef = new TParticle(*(track.fMCTrackRef));
fMFTClusters = new TClonesArray(*(track.fMFTClusters));
+ fMFTClusters->SetOwner(kTRUE);
for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) fPlaneExists[iPlane] = (track.fPlaneExists)[iPlane];
for (Int_t iParent=0; iParent<fgkNParentsMax; iParent++) {
fParentMCLabel[iParent] = (track.fParentMCLabel)[iParent];
AliMUONTrack::operator=(track);
// clear memory
- Clear();
+ Clear("");
fMUONTrack = new AliMUONTrack(*(track.fMUONTrack));
if (track.fMCTrackRef) fMCTrackRef = new TParticle(*(track.fMCTrackRef));
fMFTClusters = new TClonesArray(*(track.fMFTClusters));
+ fMFTClusters->SetOwner(kTRUE);
fNWrongClustersMC = track.fNWrongClustersMC;
fTrackMCId = track.fTrackMCId;
+ fKinem = track.fKinem;
+ fParamCovMatrix = track.fParamCovMatrix;
for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) fPlaneExists[iPlane] = (track.fPlaneExists)[iPlane];
for (Int_t iParent=0; iParent<fgkNParentsMax; iParent++) {
//====================================================================================================================================================
+void AliMuonForwardTrack::Clear(const Option_t* /*opt*/) {
+
+ // Clear arrays
+ fMFTClusters -> Delete();
+ delete fMFTClusters; fMFTClusters = 0x0;
+ delete fMUONTrack; fMUONTrack = 0x0;
+ delete fMCTrackRef; fMCTrackRef = 0x0;
+
+}
+
+//====================================================================================================================================================
+
AliMuonForwardTrack::~AliMuonForwardTrack() {
delete fMUONTrack;
//====================================================================================================================================================
+Double_t AliMuonForwardTrack::GetDCA(Double_t x, Double_t y, Double_t z) {
+
+ // Distance of Closest Approach, according to the standard MUON terminology. Actually, the offset of the track w.r.t. the primary vertex,
+ // where the extrapolation of the track DOES NOT include the MFT information
+
+ AliMUONTrackParam *param = GetTrackParamAtMUONCluster(0);
+ AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(param, z);
+ Double_t dX = param->GetNonBendingCoor() - x;
+ Double_t dY = param->GetBendingCoor() - y;
+ return TMath::Sqrt(dX*dX + dY*dY);
+
+}
+
+//====================================================================================================================================================
+
+Double_t AliMuonForwardTrack::GetMomentumSpectrometer(Double_t z) {
+
+ // Momentum of the track at the primary vertex plane, where the extrapolation of the track DOES NOT include the MFT information
+
+ AliMUONTrackParam *param = GetTrackParamAtMUONCluster(0);
+ AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(param, z);
+ return param->P();
+
+}
+
+//====================================================================================================================================================
+
+Double_t AliMuonForwardTrack::GetThetaAbs() {
+
+ // it is the angle defined by the imaginary line goingo from the vertex to the exit point of the track at the end of the hadron absorber
+
+ Double_t z = AliMUONConstants::AbsZEnd();
+ AliMUONTrackParam *param = GetTrackParamAtMFTCluster(0);
+ AliMUONTrackExtrap::ExtrapToZ(param, z);
+ Double_t x = param->GetNonBendingCoor();
+ Double_t y = param->GetBendingCoor();
+
+ return 180. +TMath::ATan(TMath::Sqrt(x*x + y*y)/z)*TMath::RadToDeg();
+
+}
+
+//====================================================================================================================================================
+
+Bool_t AliMuonForwardTrack::IsFromResonance() {
+
+ Bool_t result = kFALSE;
+
+ if ( GetParentPDGCode(0) == 113 ||
+ GetParentPDGCode(0) == 221 ||
+ GetParentPDGCode(0) == 223 ||
+ GetParentPDGCode(0) == 331 ||
+ GetParentPDGCode(0) == 333 ||
+ GetParentPDGCode(0) == 443 ||
+ GetParentPDGCode(0) == 100443 ||
+ GetParentPDGCode(0) == 553 ||
+ GetParentPDGCode(0) == 100553 ) result = kTRUE;
+
+ if (result) AliDebug(1, Form("Muon comes from a resonance %d", GetParentPDGCode(0)));
+
+ return result;
+
+}
+
+//====================================================================================================================================================
+
+Bool_t AliMuonForwardTrack::IsDirectCharm() {
+
+ Bool_t result = kFALSE;
+
+ if (IsPDGCharm(GetParentPDGCode(0)) && !IsPDGBeauty(GetParentPDGCode(1))) result = kTRUE;
+
+ if (result) AliDebug(1, Form("Muon comes from a charmed hadron %d", GetParentPDGCode(0)));
+
+ return result;
+
+}
+
+//====================================================================================================================================================
+
+Bool_t AliMuonForwardTrack::IsDirectBeauty() {
+
+ Bool_t result = kFALSE;
+
+ if (IsPDGBeauty(GetParentPDGCode(0))) result = kTRUE;
+
+ if (result) AliDebug(1, Form("Muon comes from a beauty hadron %d", GetParentPDGCode(0)));
+
+ return result;
+
+}
+
+//====================================================================================================================================================
+
+Bool_t AliMuonForwardTrack::IsChainBeauty() {
+
+ Bool_t result = kFALSE;
+
+ if (IsPDGCharm(GetParentPDGCode(0)) && IsPDGBeauty(GetParentPDGCode(1))) result = kTRUE;
+
+ if (result) AliDebug(1, Form("Muon comes from a charmed hadron %d which comes from a beauty hadron %d", GetParentPDGCode(0), GetParentPDGCode(1)));
+
+ return result;
+
+}
+
+//====================================================================================================================================================
+
+Bool_t AliMuonForwardTrack::IsPDGCharm(Int_t pdg) {
+
+ Bool_t result = kFALSE;
+
+ if ( TMath::Abs(pdg) == 411 ||
+ TMath::Abs(pdg) == 421 ||
+ TMath::Abs(pdg) == 10411 ||
+ TMath::Abs(pdg) == 10421 ||
+ TMath::Abs(pdg) == 413 ||
+ TMath::Abs(pdg) == 423 ||
+ TMath::Abs(pdg) == 10413 ||
+ TMath::Abs(pdg) == 10423 ||
+ TMath::Abs(pdg) == 20413 ||
+ TMath::Abs(pdg) == 20423 ||
+ TMath::Abs(pdg) == 415 ||
+ TMath::Abs(pdg) == 425 ||
+ TMath::Abs(pdg) == 431 ||
+ TMath::Abs(pdg) == 10431 ||
+ TMath::Abs(pdg) == 433 ||
+ TMath::Abs(pdg) == 10433 ||
+ TMath::Abs(pdg) == 20433 ||
+ TMath::Abs(pdg) == 435 ) result = kTRUE;
+
+ return result;
+
+}
+
+//====================================================================================================================================================
+
+Bool_t AliMuonForwardTrack::IsPDGBeauty(Int_t pdg) {
+
+ Bool_t result = kFALSE;
+
+ if ( TMath::Abs(pdg) == 511 ||
+ TMath::Abs(pdg) == 521 ||
+ TMath::Abs(pdg) == 10511 ||
+ TMath::Abs(pdg) == 10521 ||
+ TMath::Abs(pdg) == 513 ||
+ TMath::Abs(pdg) == 523 ||
+ TMath::Abs(pdg) == 10513 ||
+ TMath::Abs(pdg) == 10523 ||
+ TMath::Abs(pdg) == 20513 ||
+ TMath::Abs(pdg) == 20523 ||
+ TMath::Abs(pdg) == 515 ||
+ TMath::Abs(pdg) == 525 ||
+ TMath::Abs(pdg) == 531 ||
+ TMath::Abs(pdg) == 10531 ||
+ TMath::Abs(pdg) == 533 ||
+ TMath::Abs(pdg) == 10533 ||
+ TMath::Abs(pdg) == 20533 ||
+ TMath::Abs(pdg) == 535 ||
+ TMath::Abs(pdg) == 541 ||
+ TMath::Abs(pdg) == 10541 ||
+ TMath::Abs(pdg) == 543 ||
+ TMath::Abs(pdg) == 10543 ||
+ TMath::Abs(pdg) == 20543 ||
+ TMath::Abs(pdg) == 545 ) result = kTRUE;
+
+ return result;
+
+}
+
+//====================================================================================================================================================
+
+Bool_t AliMuonForwardTrack::IsFromBackground() {
+
+ Bool_t result = kFALSE;
+
+ if (!IsFromResonance() && !IsDirectCharm() && !IsDirectBeauty() && !IsChainBeauty()) result = kTRUE;
+
+ if (result) AliDebug(1, Form("Muon comes from a background source %d", GetParentPDGCode(0)));
+
+ return result;
+
+}
+
+//====================================================================================================================================================
+
+void AliMuonForwardTrack::EvalKinem(Double_t z) {
+
+ AliMUONTrackParam *param = GetTrackParamAtMFTCluster(0);
+ AliMUONTrackExtrap::ExtrapToZCov(param, z);
+
+ Double_t mMu = TDatabasePDG::Instance()->GetParticle("mu-")->Mass();
+ Double_t energy = TMath::Sqrt(param->P()*param->P() + mMu*mMu);
+ fKinem.SetPxPyPzE(param->Px(), param->Py(), param->Pz(), energy);
+
+ TMatrixD cov(5,5);
+ fParamCovMatrix = param->GetCovariances();
+
+}
+
+//====================================================================================================================================================
+