ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

//====================================================================================================================================================
//
//      Description of an ALICE muon forward track, combining the information of the Muon Spectrometer and the Muon Forward Tracker
//
//      Contact author: antonio.uras@cern.ch
//
//====================================================================================================================================================

#include "AliLog.h"
#include "AliMUONTrack.h"
#include "AliMFTCluster.h"
#include "AliMUONVCluster.h"
#include "AliMUONTrackParam.h"
#include "AliMUONTrackExtrap.h"
#include "TClonesArray.h"
#include "TMatrixD.h"
#include "TParticle.h"
#include "AliMuonForwardTrack.h"
#include "AliMFTConstants.h"
#include "TLorentzVector.h"
#include "TDatabasePDG.h"
#include "AliMUONConstants.h"

ClassImp(AliMuonForwardTrack)

//====================================================================================================================================================

AliMuonForwardTrack::AliMuonForwardTrack():
  AliMUONTrack(),
  fMUONTrack(0),
  fMCTrackRef(0),
  fMFTClusters(0),
  fNWrongClustersMC(-1),
  fTrackMCId(-1),
  fKinem(0,0,0,0),
  fParamCovMatrix(5,5),
  fRAtAbsorberEnd(0)
{

  // default constructor
  
  for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) fPlaneExists[iPlane] = kFALSE;
  for (Int_t iParent=0; iParent<fgkNParentsMax; iParent++) {
    fParentMCLabel[iParent] = -1;
    fParentPDGCode[iParent] =  0;
  }
  fMFTClusters = new TClonesArray("AliMFTCluster");
  fMFTClusters -> SetOwner(kTRUE);

}

//====================================================================================================================================================

AliMuonForwardTrack::AliMuonForwardTrack(AliMUONTrack *MUONTrack):
  AliMUONTrack(),
  fMUONTrack(0),
  fMCTrackRef(0),
  fMFTClusters(0),
  fNWrongClustersMC(-1),
  fTrackMCId(-1),
  fKinem(0,0,0,0),
  fParamCovMatrix(5,5),
  fRAtAbsorberEnd(0)
{

  SetMUONTrack(MUONTrack);
  for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) fPlaneExists[iPlane] = kFALSE;
  for (Int_t iParent=0; iParent<fgkNParentsMax; iParent++) {
    fParentMCLabel[iParent] = -1;
    fParentPDGCode[iParent] =  0;
  }
  fMFTClusters = new TClonesArray("AliMFTCluster");
  fMFTClusters -> SetOwner(kTRUE);

}

//====================================================================================================================================================

AliMuonForwardTrack::AliMuonForwardTrack(const AliMuonForwardTrack& track): 
  AliMUONTrack(track),
  fMUONTrack(0x0),
  fMCTrackRef(0x0),
  fMFTClusters(0x0),
  fNWrongClustersMC(track.fNWrongClustersMC),
  fTrackMCId(track.fTrackMCId),
  fKinem(track.fKinem),
  fParamCovMatrix(track.fParamCovMatrix),
  fRAtAbsorberEnd(track.fRAtAbsorberEnd)
{

  // 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];
    fParentPDGCode[iParent] = (track.fParentPDGCode)[iParent];
  }
  
}

//====================================================================================================================================================

AliMuonForwardTrack& AliMuonForwardTrack::operator=(const AliMuonForwardTrack& track) {

  // Asignment operator

  // check assignement to self
  if (this == &track) return *this;

  // base class assignement
  AliMUONTrack::operator=(track);
  
  // clear memory
  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;
  fRAtAbsorberEnd   = track.fRAtAbsorberEnd;

  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];
    fParentPDGCode[iParent] = (track.fParentPDGCode)[iParent];
  }
  
  return *this;

}

//====================================================================================================================================================

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;
  delete fMCTrackRef;
  fMFTClusters -> Delete();
  delete fMFTClusters;
  
}

//====================================================================================================================================================

void AliMuonForwardTrack::SetMUONTrack(AliMUONTrack *MUONTrack) {

  if (fMUONTrack) {
    AliInfo("fMUONTrack already exists, nothing will be done");
    return;
  }

  fMUONTrack = MUONTrack;
  SetGlobalChi2(fMUONTrack->GetGlobalChi2());
  
}

//====================================================================================================================================================

void AliMuonForwardTrack::SetMCTrackRef(TParticle *MCTrackRef) {

  if (fMCTrackRef) {
    AliInfo("fMCTrackRef already exists, nothing will be done");
    return;
  }

  fMCTrackRef = MCTrackRef;
  
}

//====================================================================================================================================================

void AliMuonForwardTrack::AddTrackParamAtMFTCluster(AliMUONTrackParam &trackParam, AliMFTCluster &mftCluster) {

  AliDebug(1, Form("Before adding: this->fMFTClusters=%p has %d entries", this->fMFTClusters, this->fMFTClusters->GetEntries()));
  Int_t iMFTCluster = this->fMFTClusters->GetEntries();
  AliDebug(1, Form("mftCluster->GetX() = %f  mftCluster->GetY() = %f  mftCluster->GetErrX() = %f  cmftCluster->GetErrY() = %f", 
	   mftCluster.GetX(), mftCluster.GetY(), mftCluster.GetErrX(), mftCluster.GetErrY()));
  AliMUONVCluster *muonCluster = (AliMUONVCluster*) mftCluster.CreateMUONCluster();
  AliDebug(1, Form("Created MUON cluster %p", muonCluster));
  trackParam.SetUniqueID(iMFTCluster);    // we profit of this slot to store the reference to the corresponding MFTCluster
  AliDebug(1, Form("Now adding muonCluster %p and trackParam %p",muonCluster, &trackParam));
  AddTrackParamAtCluster(trackParam, *muonCluster, kTRUE);
  // we pass the parameters this->GetTrackParamAtCluster()->First() to the Kalman Filter algorithm: they will be updated!!
  Double_t chi2Kalman = RunKalmanFilter(*(AliMUONTrackParam*)(GetTrackParamAtCluster()->First()));
  AliDebug(1, Form("Adding Kalman chi2 = %f to global chi2 = %f", chi2Kalman, GetGlobalChi2()));
  Double_t newGlobalChi2 = GetGlobalChi2() + chi2Kalman;
  mftCluster.SetLocalChi2(chi2Kalman);
  mftCluster.SetTrackChi2(newGlobalChi2);
  new ((*(this->fMFTClusters))[iMFTCluster]) AliMFTCluster(mftCluster);
  AliDebug(1, Form("GetTrackParamAtCluster() = %p  has %d entries while this->fMFTClusters=%p has %d entries",
		   GetTrackParamAtCluster(), GetTrackParamAtCluster()->GetEntries(), this->fMFTClusters, this->fMFTClusters->GetEntries()));
  AliDebug(1, Form("muonCluster->GetZ() = %f, trackParam->GetZ() = %f",muonCluster->GetZ(), trackParam.GetZ()));
  SetGlobalChi2(newGlobalChi2);
  AliDebug(1, Form("New global chi2 = %f", GetGlobalChi2()));
  ((AliMUONTrackParam*) GetTrackParamAtCluster()->First())->SetTrackChi2(newGlobalChi2);
  for (Int_t iPar=0; iPar<GetTrackParamAtCluster()->GetEntries(); iPar++) {
    AliDebug(1, Form("GetTrackParamAtCluster()->At(%d)->GetClusterPtr() = %p",
		     iPar, ((AliMUONTrackParam*)(GetTrackParamAtCluster()->At(iPar)))->GetClusterPtr()));
  }

}

//====================================================================================================================================================

AliMUONTrackParam* AliMuonForwardTrack::GetTrackParamAtMUONCluster(Int_t iMUONCluster) {

  if (iMUONCluster<0 || iMUONCluster>=GetNMUONClusters()) {
    AliError("Invalid MUON cluster index. NULL pointer will be returned");
    return NULL;
  }

  AliMUONTrackParam *trackParam = (AliMUONTrackParam*) fMUONTrack->GetTrackParamAtCluster()->At(iMUONCluster); 

  return trackParam;

}

//====================================================================================================================================================

AliMUONTrackParam* AliMuonForwardTrack::GetTrackParamAtMFTCluster(Int_t iMFTCluster) {

  if (iMFTCluster<0 || iMFTCluster>=GetNMFTClusters()) {
    AliError("Invalid MFT cluster index. NULL pointer will be returned");
    return NULL;
  }

  AliMUONTrackParam *trackParam = (AliMUONTrackParam*) GetTrackParamAtCluster()->At(iMFTCluster); 

  return trackParam;

}

//====================================================================================================================================================

AliMUONVCluster* AliMuonForwardTrack::GetMUONCluster(Int_t iMUONCluster) {

  if (iMUONCluster<0 || iMUONCluster>=GetNMUONClusters()) {
    AliError("Invalid MUON cluster index. NULL pointer will be returned");
    return NULL;
  }

  AliMUONTrackParam *trackParam = GetTrackParamAtMUONCluster(iMUONCluster);
  AliMUONVCluster *muonCluster = trackParam->GetClusterPtr();

  return muonCluster;

}

//====================================================================================================================================================

AliMFTCluster* AliMuonForwardTrack::GetMFTCluster(Int_t iMFTCluster) {

  if (iMFTCluster<0 || iMFTCluster>=GetNMFTClusters()) {
    AliError(Form("Invalid MFT cluster index (%d). GetNMFTClusters()=%d. NULL pointer will be returned", iMFTCluster, GetNMFTClusters()));
    return NULL;
  }

  AliMUONTrackParam *trackParam = GetTrackParamAtMFTCluster(iMFTCluster);
  AliMFTCluster *mftCluster = (AliMFTCluster*) this->fMFTClusters->At(trackParam->GetUniqueID());

  return mftCluster;

}

//====================================================================================================================================================

Double_t AliMuonForwardTrack::RunKalmanFilter(AliMUONTrackParam &trackParamAtCluster) {

  AliDebug(1, Form("Running Kalman filter for parameters %p (z = %f) and cluster %p (z = %f)", 
		   &trackParamAtCluster, trackParamAtCluster.GetZ(), trackParamAtCluster.GetClusterPtr(), trackParamAtCluster.GetClusterPtr()->GetZ()));
  
  // Compute new track parameters and their covariances including new cluster using kalman filter
  // return the *additional* track chi2
  
  // Get actual track parameters (p)
  TMatrixD param(trackParamAtCluster.GetParameters());
  
  // Get new cluster parameters (m)
  AliMUONVCluster *cluster = trackParamAtCluster.GetClusterPtr();
  AliDebug(1, Form("cluster->GetX() = %f  cluster->GetY() = %f  cluster->GetErrX() = %f  cluster->GetErrY() = %f", 
		   cluster->GetX(), cluster->GetY(), cluster->GetErrX(), cluster->GetErrY()));
  TMatrixD clusterParam(5,1);
  clusterParam.Zero();
  clusterParam(0,0) = cluster->GetX();
  clusterParam(2,0) = cluster->GetY();

  // Compute the current parameter weight (W)
  TMatrixD paramWeight(trackParamAtCluster.GetCovariances());
  if (paramWeight.Determinant() != 0) {
    paramWeight.Invert();
  } else {
    Warning("RunKalmanFilter"," Determinant = 0");
    return 1.e10;
  }
  
  // Compute the new cluster weight (U)
  TMatrixD clusterWeight(5,5);
  clusterWeight.Zero();
  clusterWeight(0,0) = 1. / cluster->GetErrX2();
  clusterWeight(2,2) = 1. / cluster->GetErrY2();

  // Compute the new parameters covariance matrix ( (W+U)^-1 )
  TMatrixD newParamCov(paramWeight,TMatrixD::kPlus,clusterWeight);
  if (newParamCov.Determinant() != 0) {
    newParamCov.Invert();
  } 
  else {
    Warning("RunKalmanFilter"," Determinant = 0");
    return 1.e10;
  }
  
  // Save the new parameters covariance matrix
  trackParamAtCluster.SetCovariances(newParamCov);
  
  // Compute the new parameters (p' = ((W+U)^-1)U(m-p) + p)
  TMatrixD tmp(clusterParam,TMatrixD::kMinus,param);
  TMatrixD tmp2(clusterWeight,TMatrixD::kMult,tmp);    // U(m-p)
  TMatrixD newParam(newParamCov,TMatrixD::kMult,tmp2); // ((W+U)^-1)U(m-p)
  newParam += param;                                   // ((W+U)^-1)U(m-p) + p

  // Save the new parameters
  trackParamAtCluster.SetParameters(newParam);
  
  // Compute the additional chi2 (= ((p'-p)^-1)W(p'-p) + ((p'-m)^-1)U(p'-m))
  tmp = newParam; // p'
  tmp -= param;   // (p'-p)
  TMatrixD tmp3(paramWeight,TMatrixD::kMult,tmp);           // W(p'-p)
  TMatrixD addChi2Track(tmp,TMatrixD::kTransposeMult,tmp3); // ((p'-p)^-1)W(p'-p)
  tmp = newParam;      // p'
  tmp -= clusterParam; // (p'-m)
  TMatrixD tmp4(clusterWeight,TMatrixD::kMult,tmp);            // U(p'-m)
  addChi2Track += TMatrixD(tmp,TMatrixD::kTransposeMult,tmp4); // ((p'-p)^-1)W(p'-p) + ((p'-m)^-1)U(p'-m)
  
  AliDebug(1,Form("Adding Kalman chi2 = %f",addChi2Track(0,0)));

  return addChi2Track(0,0);
  
}

//====================================================================================================================================================

Double_t AliMuonForwardTrack::GetWeightedOffset(Double_t x, Double_t y, Double_t z) {

  AliMUONTrackParam *param = GetTrackParamAtMFTCluster(0);
  AliMUONTrackExtrap::ExtrapToZCov(param, z);

  TMatrixD cov(5,5);
  cov = param->GetCovariances();

  TMatrixD covCoordinates(2,2);
  covCoordinates(0,0) = cov(0,0);
  covCoordinates(0,1) = cov(0,2);
  covCoordinates(1,0) = cov(2,0);
  covCoordinates(1,1) = cov(2,2);
  
  TMatrixD covCoordinatesInverse = covCoordinates.Invert();

  Double_t dX = param->GetNonBendingCoor() - x;
  Double_t dY = param->GetBendingCoor()    - y;
  
  Double_t weightedOffset = TMath::Sqrt(0.5*(dX*dX*covCoordinatesInverse(0,0) + 
					     dY*dY*covCoordinatesInverse(1,1) + 
					     2.*dX*dY*covCoordinatesInverse(0,1)));

  return weightedOffset;

}

//====================================================================================================================================================

Double_t AliMuonForwardTrack::GetOffsetX(Double_t x, Double_t z) {

  AliMUONTrackParam *param = GetTrackParamAtMFTCluster(0);
  AliMUONTrackExtrap::ExtrapToZCov(param, z);
  Double_t dX = param->GetNonBendingCoor() - x;
  return dX;

}

//====================================================================================================================================================

Double_t AliMuonForwardTrack::GetOffsetY(Double_t y, Double_t z) {

  AliMUONTrackParam *param = GetTrackParamAtMFTCluster(0);
  AliMUONTrackExtrap::ExtrapToZCov(param, z);
  Double_t dY = param->GetBendingCoor() - y;
  return dY;

}

//====================================================================================================================================================

Double_t AliMuonForwardTrack::GetOffset(Double_t x, Double_t y, Double_t z) {

  AliMUONTrackParam *param = GetTrackParamAtMFTCluster(0);
  AliMUONTrackExtrap::ExtrapToZCov(param, z);
  Double_t dX = param->GetNonBendingCoor() - x;
  Double_t dY = param->GetBendingCoor()    - y;
  return TMath::Sqrt(dX*dX + dY*dY);

}

//====================================================================================================================================================

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 = (*((AliMUONTrackParam*)(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 = (*((AliMUONTrackParam*)(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 = (*((AliMUONTrackParam*)(GetTrackParamAtMUONCluster(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::IsFromDirectResonance() {

  if (!IsMuon()) return kFALSE;

  for (Int_t i=GetFirstMotherID(); i>=0; i--) if (!IsPDGResonance(GetParentPDGCode(i))) return kFALSE;  // the decay chain finds a non-resonance particle

  return kTRUE; 
  
}

//====================================================================================================================================================

Bool_t AliMuonForwardTrack::IsFromChainResonance() {

  if (!IsMuon()) return kFALSE;

  if (GetFirstMotherID() == 0) return kFALSE;   // it is not a chain

  if (!IsPDGResonance(GetParentPDGCode(GetFirstMotherID()))) return kFALSE;  // primordial is not a resonance

  for (Int_t i=GetFirstMotherID()-1; i>=0; i--) if (!IsPDGResonance(GetParentPDGCode(i))) return kTRUE;  // the decay chain finds a non-resonance particle

  return kFALSE;
  
}

//====================================================================================================================================================

Bool_t AliMuonForwardTrack::IsFromDirectCharm() {

  if (!IsMuon()) return kFALSE;

  for (Int_t i=GetFirstMotherID(); i>=0; i--) if (!IsPDGCharm(GetParentPDGCode(i))) return kFALSE;  // the decay chain finds a non-charmed particle

  return kTRUE; 

}

//====================================================================================================================================================

Bool_t AliMuonForwardTrack::IsFromChainCharm() {

  if (!IsMuon()) return kFALSE;

  if (GetFirstMotherID() == 0) return kFALSE;   // it is not a chain

  if (!IsPDGCharm(GetParentPDGCode(GetFirstMotherID()))) return kFALSE;  // primordial is not a charmed hadron

  for (Int_t i=GetFirstMotherID()-1; i>=0; i--) if (!IsPDGCharm(GetParentPDGCode(i))) return kTRUE;  // the decay chain finds a non-charmed particle

  return kFALSE;

}

//====================================================================================================================================================

Bool_t AliMuonForwardTrack::IsFromDirectBeauty() {

  if (!IsMuon()) return kFALSE;

  for (Int_t i=GetFirstMotherID(); i>=0; i--) if (!IsPDGBeauty(GetParentPDGCode(i))) return kFALSE;  // the decay chain finds a non-beauty particle

  return kTRUE; 

}

//====================================================================================================================================================

Bool_t AliMuonForwardTrack::IsFromChainBeauty() {

  if (!IsMuon()) return kFALSE;

  if (GetFirstMotherID() == 0) return kFALSE;   // it is not a chain

  if (!IsPDGBeauty(GetParentPDGCode(GetFirstMotherID()))) return kFALSE;  // primordial is not a beauty hadron

  for (Int_t i=GetFirstMotherID()-1; i>=0; i--) if (!IsPDGBeauty(GetParentPDGCode(i))) return kTRUE;  // the decay chain finds a non-beauty particle

  return kFALSE;

}

//====================================================================================================================================================

Bool_t AliMuonForwardTrack::IsMuon() {

  if (IsFake()) return kFALSE;

  if (TMath::Abs(fMCTrackRef->GetPdgCode())==13) return kTRUE;

  return kFALSE;

}

//====================================================================================================================================================

Bool_t AliMuonForwardTrack::IsFake() {

  if (!fMCTrackRef) return kTRUE;

  return kFALSE;

}

//====================================================================================================================================================

Bool_t AliMuonForwardTrack::IsPDGResonance(Int_t pdg) {

  // if (pdg<10) return kFALSE; 
  // Int_t id = pdg%100000; 
  // return (!((id-id%10)%110));

  Bool_t result = kFALSE;

  if ( pdg ==    113 ||
       pdg ==    221 ||
       pdg ==    223 ||
       pdg ==    331 ||
       pdg ==    333 ||
       pdg ==    443 ||
       pdg == 100443 ||
       pdg ==    553 ||
       pdg == 100553 ) result = kTRUE;
  
  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::IsMuonFromBackground() {

  Bool_t result = kFALSE;

  if (!IsMuon()) return result;

  if (!IsFromDirectResonance() && !IsFromChainResonance() && !IsFromDirectCharm() && !IsFromChainCharm() && !IsFromDirectBeauty() && !IsFromChainBeauty()) 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();

}

//====================================================================================================================================================

Int_t AliMuonForwardTrack::GetFirstMotherID() {

  Int_t motherLevel = 0; 
  Int_t motherMCLabel = GetParentMCLabel(motherLevel); 
  while (motherMCLabel >= 0) { 
    motherLevel++; 
    motherMCLabel = GetParentMCLabel(motherLevel); 
  }
  return motherLevel-1;

}

//====================================================================================================================================================

void AliMuonForwardTrack::PrintHistory() {

  if (IsFake()) printf("Track is a fake MUON\n");
  else {
    TString history = "";
    for (Int_t i=GetFirstMotherID(); i>=0; i--) {
      history += TDatabasePDG::Instance()->GetParticle(GetParentPDGCode(i))->GetName();
      history += " -> ";
    }
    history += TDatabasePDG::Instance()->GetParticle(fMCTrackRef->GetPdgCode())->GetName();
    printf("%s\n",history.Data());
  }

}

//====================================================================================================================================================
 AliMuonForwardTrack.cxx:1
 AliMuonForwardTrack.cxx:2
 AliMuonForwardTrack.cxx:3
 AliMuonForwardTrack.cxx:4
 AliMuonForwardTrack.cxx:5
 AliMuonForwardTrack.cxx:6
 AliMuonForwardTrack.cxx:7
 AliMuonForwardTrack.cxx:8
 AliMuonForwardTrack.cxx:9
 AliMuonForwardTrack.cxx:10
 AliMuonForwardTrack.cxx:11
 AliMuonForwardTrack.cxx:12
 AliMuonForwardTrack.cxx:13
 AliMuonForwardTrack.cxx:14
 AliMuonForwardTrack.cxx:15
 AliMuonForwardTrack.cxx:16
 AliMuonForwardTrack.cxx:17
 AliMuonForwardTrack.cxx:18
 AliMuonForwardTrack.cxx:19
 AliMuonForwardTrack.cxx:20
 AliMuonForwardTrack.cxx:21
 AliMuonForwardTrack.cxx:22
 AliMuonForwardTrack.cxx:23
 AliMuonForwardTrack.cxx:24
 AliMuonForwardTrack.cxx:25
 AliMuonForwardTrack.cxx:26
 AliMuonForwardTrack.cxx:27
 AliMuonForwardTrack.cxx:28
 AliMuonForwardTrack.cxx:29
 AliMuonForwardTrack.cxx:30
 AliMuonForwardTrack.cxx:31
 AliMuonForwardTrack.cxx:32
 AliMuonForwardTrack.cxx:33
 AliMuonForwardTrack.cxx:34
 AliMuonForwardTrack.cxx:35
 AliMuonForwardTrack.cxx:36
 AliMuonForwardTrack.cxx:37
 AliMuonForwardTrack.cxx:38
 AliMuonForwardTrack.cxx:39
 AliMuonForwardTrack.cxx:40
 AliMuonForwardTrack.cxx:41
 AliMuonForwardTrack.cxx:42
 AliMuonForwardTrack.cxx:43
 AliMuonForwardTrack.cxx:44
 AliMuonForwardTrack.cxx:45
 AliMuonForwardTrack.cxx:46
 AliMuonForwardTrack.cxx:47
 AliMuonForwardTrack.cxx:48
 AliMuonForwardTrack.cxx:49
 AliMuonForwardTrack.cxx:50
 AliMuonForwardTrack.cxx:51
 AliMuonForwardTrack.cxx:52
 AliMuonForwardTrack.cxx:53
 AliMuonForwardTrack.cxx:54
 AliMuonForwardTrack.cxx:55
 AliMuonForwardTrack.cxx:56
 AliMuonForwardTrack.cxx:57
 AliMuonForwardTrack.cxx:58
 AliMuonForwardTrack.cxx:59
 AliMuonForwardTrack.cxx:60
 AliMuonForwardTrack.cxx:61
 AliMuonForwardTrack.cxx:62
 AliMuonForwardTrack.cxx:63
 AliMuonForwardTrack.cxx:64
 AliMuonForwardTrack.cxx:65
 AliMuonForwardTrack.cxx:66
 AliMuonForwardTrack.cxx:67
 AliMuonForwardTrack.cxx:68
 AliMuonForwardTrack.cxx:69
 AliMuonForwardTrack.cxx:70
 AliMuonForwardTrack.cxx:71
 AliMuonForwardTrack.cxx:72
 AliMuonForwardTrack.cxx:73
 AliMuonForwardTrack.cxx:74
 AliMuonForwardTrack.cxx:75
 AliMuonForwardTrack.cxx:76
 AliMuonForwardTrack.cxx:77
 AliMuonForwardTrack.cxx:78
 AliMuonForwardTrack.cxx:79
 AliMuonForwardTrack.cxx:80
 AliMuonForwardTrack.cxx:81
 AliMuonForwardTrack.cxx:82
 AliMuonForwardTrack.cxx:83
 AliMuonForwardTrack.cxx:84
 AliMuonForwardTrack.cxx:85
 AliMuonForwardTrack.cxx:86
 AliMuonForwardTrack.cxx:87
 AliMuonForwardTrack.cxx:88
 AliMuonForwardTrack.cxx:89
 AliMuonForwardTrack.cxx:90
 AliMuonForwardTrack.cxx:91
 AliMuonForwardTrack.cxx:92
 AliMuonForwardTrack.cxx:93
 AliMuonForwardTrack.cxx:94
 AliMuonForwardTrack.cxx:95
 AliMuonForwardTrack.cxx:96
 AliMuonForwardTrack.cxx:97
 AliMuonForwardTrack.cxx:98
 AliMuonForwardTrack.cxx:99
 AliMuonForwardTrack.cxx:100
 AliMuonForwardTrack.cxx:101
 AliMuonForwardTrack.cxx:102
 AliMuonForwardTrack.cxx:103
 AliMuonForwardTrack.cxx:104
 AliMuonForwardTrack.cxx:105
 AliMuonForwardTrack.cxx:106
 AliMuonForwardTrack.cxx:107
 AliMuonForwardTrack.cxx:108
 AliMuonForwardTrack.cxx:109
 AliMuonForwardTrack.cxx:110
 AliMuonForwardTrack.cxx:111
 AliMuonForwardTrack.cxx:112
 AliMuonForwardTrack.cxx:113
 AliMuonForwardTrack.cxx:114
 AliMuonForwardTrack.cxx:115
 AliMuonForwardTrack.cxx:116
 AliMuonForwardTrack.cxx:117
 AliMuonForwardTrack.cxx:118
 AliMuonForwardTrack.cxx:119
 AliMuonForwardTrack.cxx:120
 AliMuonForwardTrack.cxx:121
 AliMuonForwardTrack.cxx:122
 AliMuonForwardTrack.cxx:123
 AliMuonForwardTrack.cxx:124
 AliMuonForwardTrack.cxx:125
 AliMuonForwardTrack.cxx:126
 AliMuonForwardTrack.cxx:127
 AliMuonForwardTrack.cxx:128
 AliMuonForwardTrack.cxx:129
 AliMuonForwardTrack.cxx:130
 AliMuonForwardTrack.cxx:131
 AliMuonForwardTrack.cxx:132
 AliMuonForwardTrack.cxx:133
 AliMuonForwardTrack.cxx:134
 AliMuonForwardTrack.cxx:135
 AliMuonForwardTrack.cxx:136
 AliMuonForwardTrack.cxx:137
 AliMuonForwardTrack.cxx:138
 AliMuonForwardTrack.cxx:139
 AliMuonForwardTrack.cxx:140
 AliMuonForwardTrack.cxx:141
 AliMuonForwardTrack.cxx:142
 AliMuonForwardTrack.cxx:143
 AliMuonForwardTrack.cxx:144
 AliMuonForwardTrack.cxx:145
 AliMuonForwardTrack.cxx:146
 AliMuonForwardTrack.cxx:147
 AliMuonForwardTrack.cxx:148
 AliMuonForwardTrack.cxx:149
 AliMuonForwardTrack.cxx:150
 AliMuonForwardTrack.cxx:151
 AliMuonForwardTrack.cxx:152
 AliMuonForwardTrack.cxx:153
 AliMuonForwardTrack.cxx:154
 AliMuonForwardTrack.cxx:155
 AliMuonForwardTrack.cxx:156
 AliMuonForwardTrack.cxx:157
 AliMuonForwardTrack.cxx:158
 AliMuonForwardTrack.cxx:159
 AliMuonForwardTrack.cxx:160
 AliMuonForwardTrack.cxx:161
 AliMuonForwardTrack.cxx:162
 AliMuonForwardTrack.cxx:163
 AliMuonForwardTrack.cxx:164
 AliMuonForwardTrack.cxx:165
 AliMuonForwardTrack.cxx:166
 AliMuonForwardTrack.cxx:167
 AliMuonForwardTrack.cxx:168
 AliMuonForwardTrack.cxx:169
 AliMuonForwardTrack.cxx:170
 AliMuonForwardTrack.cxx:171
 AliMuonForwardTrack.cxx:172
 AliMuonForwardTrack.cxx:173
 AliMuonForwardTrack.cxx:174
 AliMuonForwardTrack.cxx:175
 AliMuonForwardTrack.cxx:176
 AliMuonForwardTrack.cxx:177
 AliMuonForwardTrack.cxx:178
 AliMuonForwardTrack.cxx:179
 AliMuonForwardTrack.cxx:180
 AliMuonForwardTrack.cxx:181
 AliMuonForwardTrack.cxx:182
 AliMuonForwardTrack.cxx:183
 AliMuonForwardTrack.cxx:184
 AliMuonForwardTrack.cxx:185
 AliMuonForwardTrack.cxx:186
 AliMuonForwardTrack.cxx:187
 AliMuonForwardTrack.cxx:188
 AliMuonForwardTrack.cxx:189
 AliMuonForwardTrack.cxx:190
 AliMuonForwardTrack.cxx:191
 AliMuonForwardTrack.cxx:192
 AliMuonForwardTrack.cxx:193
 AliMuonForwardTrack.cxx:194
 AliMuonForwardTrack.cxx:195
 AliMuonForwardTrack.cxx:196
 AliMuonForwardTrack.cxx:197
 AliMuonForwardTrack.cxx:198
 AliMuonForwardTrack.cxx:199
 AliMuonForwardTrack.cxx:200
 AliMuonForwardTrack.cxx:201
 AliMuonForwardTrack.cxx:202
 AliMuonForwardTrack.cxx:203
 AliMuonForwardTrack.cxx:204
 AliMuonForwardTrack.cxx:205
 AliMuonForwardTrack.cxx:206
 AliMuonForwardTrack.cxx:207
 AliMuonForwardTrack.cxx:208
 AliMuonForwardTrack.cxx:209
 AliMuonForwardTrack.cxx:210
 AliMuonForwardTrack.cxx:211
 AliMuonForwardTrack.cxx:212
 AliMuonForwardTrack.cxx:213
 AliMuonForwardTrack.cxx:214
 AliMuonForwardTrack.cxx:215
 AliMuonForwardTrack.cxx:216
 AliMuonForwardTrack.cxx:217
 AliMuonForwardTrack.cxx:218
 AliMuonForwardTrack.cxx:219
 AliMuonForwardTrack.cxx:220
 AliMuonForwardTrack.cxx:221
 AliMuonForwardTrack.cxx:222
 AliMuonForwardTrack.cxx:223
 AliMuonForwardTrack.cxx:224
 AliMuonForwardTrack.cxx:225
 AliMuonForwardTrack.cxx:226
 AliMuonForwardTrack.cxx:227
 AliMuonForwardTrack.cxx:228
 AliMuonForwardTrack.cxx:229
 AliMuonForwardTrack.cxx:230
 AliMuonForwardTrack.cxx:231
 AliMuonForwardTrack.cxx:232
 AliMuonForwardTrack.cxx:233
 AliMuonForwardTrack.cxx:234
 AliMuonForwardTrack.cxx:235
 AliMuonForwardTrack.cxx:236
 AliMuonForwardTrack.cxx:237
 AliMuonForwardTrack.cxx:238
 AliMuonForwardTrack.cxx:239
 AliMuonForwardTrack.cxx:240
 AliMuonForwardTrack.cxx:241
 AliMuonForwardTrack.cxx:242
 AliMuonForwardTrack.cxx:243
 AliMuonForwardTrack.cxx:244
 AliMuonForwardTrack.cxx:245
 AliMuonForwardTrack.cxx:246
 AliMuonForwardTrack.cxx:247
 AliMuonForwardTrack.cxx:248
 AliMuonForwardTrack.cxx:249
 AliMuonForwardTrack.cxx:250
 AliMuonForwardTrack.cxx:251
 AliMuonForwardTrack.cxx:252
 AliMuonForwardTrack.cxx:253
 AliMuonForwardTrack.cxx:254
 AliMuonForwardTrack.cxx:255
 AliMuonForwardTrack.cxx:256
 AliMuonForwardTrack.cxx:257
 AliMuonForwardTrack.cxx:258
 AliMuonForwardTrack.cxx:259
 AliMuonForwardTrack.cxx:260
 AliMuonForwardTrack.cxx:261
 AliMuonForwardTrack.cxx:262
 AliMuonForwardTrack.cxx:263
 AliMuonForwardTrack.cxx:264
 AliMuonForwardTrack.cxx:265
 AliMuonForwardTrack.cxx:266
 AliMuonForwardTrack.cxx:267
 AliMuonForwardTrack.cxx:268
 AliMuonForwardTrack.cxx:269
 AliMuonForwardTrack.cxx:270
 AliMuonForwardTrack.cxx:271
 AliMuonForwardTrack.cxx:272
 AliMuonForwardTrack.cxx:273
 AliMuonForwardTrack.cxx:274
 AliMuonForwardTrack.cxx:275
 AliMuonForwardTrack.cxx:276
 AliMuonForwardTrack.cxx:277
 AliMuonForwardTrack.cxx:278
 AliMuonForwardTrack.cxx:279
 AliMuonForwardTrack.cxx:280
 AliMuonForwardTrack.cxx:281
 AliMuonForwardTrack.cxx:282
 AliMuonForwardTrack.cxx:283
 AliMuonForwardTrack.cxx:284
 AliMuonForwardTrack.cxx:285
 AliMuonForwardTrack.cxx:286
 AliMuonForwardTrack.cxx:287
 AliMuonForwardTrack.cxx:288
 AliMuonForwardTrack.cxx:289
 AliMuonForwardTrack.cxx:290
 AliMuonForwardTrack.cxx:291
 AliMuonForwardTrack.cxx:292
 AliMuonForwardTrack.cxx:293
 AliMuonForwardTrack.cxx:294
 AliMuonForwardTrack.cxx:295
 AliMuonForwardTrack.cxx:296
 AliMuonForwardTrack.cxx:297
 AliMuonForwardTrack.cxx:298
 AliMuonForwardTrack.cxx:299
 AliMuonForwardTrack.cxx:300
 AliMuonForwardTrack.cxx:301
 AliMuonForwardTrack.cxx:302
 AliMuonForwardTrack.cxx:303
 AliMuonForwardTrack.cxx:304
 AliMuonForwardTrack.cxx:305
 AliMuonForwardTrack.cxx:306
 AliMuonForwardTrack.cxx:307
 AliMuonForwardTrack.cxx:308
 AliMuonForwardTrack.cxx:309
 AliMuonForwardTrack.cxx:310
 AliMuonForwardTrack.cxx:311
 AliMuonForwardTrack.cxx:312
 AliMuonForwardTrack.cxx:313
 AliMuonForwardTrack.cxx:314
 AliMuonForwardTrack.cxx:315
 AliMuonForwardTrack.cxx:316
 AliMuonForwardTrack.cxx:317
 AliMuonForwardTrack.cxx:318
 AliMuonForwardTrack.cxx:319
 AliMuonForwardTrack.cxx:320
 AliMuonForwardTrack.cxx:321
 AliMuonForwardTrack.cxx:322
 AliMuonForwardTrack.cxx:323
 AliMuonForwardTrack.cxx:324
 AliMuonForwardTrack.cxx:325
 AliMuonForwardTrack.cxx:326
 AliMuonForwardTrack.cxx:327
 AliMuonForwardTrack.cxx:328
 AliMuonForwardTrack.cxx:329
 AliMuonForwardTrack.cxx:330
 AliMuonForwardTrack.cxx:331
 AliMuonForwardTrack.cxx:332
 AliMuonForwardTrack.cxx:333
 AliMuonForwardTrack.cxx:334
 AliMuonForwardTrack.cxx:335
 AliMuonForwardTrack.cxx:336
 AliMuonForwardTrack.cxx:337
 AliMuonForwardTrack.cxx:338
 AliMuonForwardTrack.cxx:339
 AliMuonForwardTrack.cxx:340
 AliMuonForwardTrack.cxx:341
 AliMuonForwardTrack.cxx:342
 AliMuonForwardTrack.cxx:343
 AliMuonForwardTrack.cxx:344
 AliMuonForwardTrack.cxx:345
 AliMuonForwardTrack.cxx:346
 AliMuonForwardTrack.cxx:347
 AliMuonForwardTrack.cxx:348
 AliMuonForwardTrack.cxx:349
 AliMuonForwardTrack.cxx:350
 AliMuonForwardTrack.cxx:351
 AliMuonForwardTrack.cxx:352
 AliMuonForwardTrack.cxx:353
 AliMuonForwardTrack.cxx:354
 AliMuonForwardTrack.cxx:355
 AliMuonForwardTrack.cxx:356
 AliMuonForwardTrack.cxx:357
 AliMuonForwardTrack.cxx:358
 AliMuonForwardTrack.cxx:359
 AliMuonForwardTrack.cxx:360
 AliMuonForwardTrack.cxx:361
 AliMuonForwardTrack.cxx:362
 AliMuonForwardTrack.cxx:363
 AliMuonForwardTrack.cxx:364
 AliMuonForwardTrack.cxx:365
 AliMuonForwardTrack.cxx:366
 AliMuonForwardTrack.cxx:367
 AliMuonForwardTrack.cxx:368
 AliMuonForwardTrack.cxx:369
 AliMuonForwardTrack.cxx:370
 AliMuonForwardTrack.cxx:371
 AliMuonForwardTrack.cxx:372
 AliMuonForwardTrack.cxx:373
 AliMuonForwardTrack.cxx:374
 AliMuonForwardTrack.cxx:375
 AliMuonForwardTrack.cxx:376
 AliMuonForwardTrack.cxx:377
 AliMuonForwardTrack.cxx:378
 AliMuonForwardTrack.cxx:379
 AliMuonForwardTrack.cxx:380
 AliMuonForwardTrack.cxx:381
 AliMuonForwardTrack.cxx:382
 AliMuonForwardTrack.cxx:383
 AliMuonForwardTrack.cxx:384
 AliMuonForwardTrack.cxx:385
 AliMuonForwardTrack.cxx:386
 AliMuonForwardTrack.cxx:387
 AliMuonForwardTrack.cxx:388
 AliMuonForwardTrack.cxx:389
 AliMuonForwardTrack.cxx:390
 AliMuonForwardTrack.cxx:391
 AliMuonForwardTrack.cxx:392
 AliMuonForwardTrack.cxx:393
 AliMuonForwardTrack.cxx:394
 AliMuonForwardTrack.cxx:395
 AliMuonForwardTrack.cxx:396
 AliMuonForwardTrack.cxx:397
 AliMuonForwardTrack.cxx:398
 AliMuonForwardTrack.cxx:399
 AliMuonForwardTrack.cxx:400
 AliMuonForwardTrack.cxx:401
 AliMuonForwardTrack.cxx:402
 AliMuonForwardTrack.cxx:403
 AliMuonForwardTrack.cxx:404
 AliMuonForwardTrack.cxx:405
 AliMuonForwardTrack.cxx:406
 AliMuonForwardTrack.cxx:407
 AliMuonForwardTrack.cxx:408
 AliMuonForwardTrack.cxx:409
 AliMuonForwardTrack.cxx:410
 AliMuonForwardTrack.cxx:411
 AliMuonForwardTrack.cxx:412
 AliMuonForwardTrack.cxx:413
 AliMuonForwardTrack.cxx:414
 AliMuonForwardTrack.cxx:415
 AliMuonForwardTrack.cxx:416
 AliMuonForwardTrack.cxx:417
 AliMuonForwardTrack.cxx:418
 AliMuonForwardTrack.cxx:419
 AliMuonForwardTrack.cxx:420
 AliMuonForwardTrack.cxx:421
 AliMuonForwardTrack.cxx:422
 AliMuonForwardTrack.cxx:423
 AliMuonForwardTrack.cxx:424
 AliMuonForwardTrack.cxx:425
 AliMuonForwardTrack.cxx:426
 AliMuonForwardTrack.cxx:427
 AliMuonForwardTrack.cxx:428
 AliMuonForwardTrack.cxx:429
 AliMuonForwardTrack.cxx:430
 AliMuonForwardTrack.cxx:431
 AliMuonForwardTrack.cxx:432
 AliMuonForwardTrack.cxx:433
 AliMuonForwardTrack.cxx:434
 AliMuonForwardTrack.cxx:435
 AliMuonForwardTrack.cxx:436
 AliMuonForwardTrack.cxx:437
 AliMuonForwardTrack.cxx:438
 AliMuonForwardTrack.cxx:439
 AliMuonForwardTrack.cxx:440
 AliMuonForwardTrack.cxx:441
 AliMuonForwardTrack.cxx:442
 AliMuonForwardTrack.cxx:443
 AliMuonForwardTrack.cxx:444
 AliMuonForwardTrack.cxx:445
 AliMuonForwardTrack.cxx:446
 AliMuonForwardTrack.cxx:447
 AliMuonForwardTrack.cxx:448
 AliMuonForwardTrack.cxx:449
 AliMuonForwardTrack.cxx:450
 AliMuonForwardTrack.cxx:451
 AliMuonForwardTrack.cxx:452
 AliMuonForwardTrack.cxx:453
 AliMuonForwardTrack.cxx:454
 AliMuonForwardTrack.cxx:455
 AliMuonForwardTrack.cxx:456
 AliMuonForwardTrack.cxx:457
 AliMuonForwardTrack.cxx:458
 AliMuonForwardTrack.cxx:459
 AliMuonForwardTrack.cxx:460
 AliMuonForwardTrack.cxx:461
 AliMuonForwardTrack.cxx:462
 AliMuonForwardTrack.cxx:463
 AliMuonForwardTrack.cxx:464
 AliMuonForwardTrack.cxx:465
 AliMuonForwardTrack.cxx:466
 AliMuonForwardTrack.cxx:467
 AliMuonForwardTrack.cxx:468
 AliMuonForwardTrack.cxx:469
 AliMuonForwardTrack.cxx:470
 AliMuonForwardTrack.cxx:471
 AliMuonForwardTrack.cxx:472
 AliMuonForwardTrack.cxx:473
 AliMuonForwardTrack.cxx:474
 AliMuonForwardTrack.cxx:475
 AliMuonForwardTrack.cxx:476
 AliMuonForwardTrack.cxx:477
 AliMuonForwardTrack.cxx:478
 AliMuonForwardTrack.cxx:479
 AliMuonForwardTrack.cxx:480
 AliMuonForwardTrack.cxx:481
 AliMuonForwardTrack.cxx:482
 AliMuonForwardTrack.cxx:483
 AliMuonForwardTrack.cxx:484
 AliMuonForwardTrack.cxx:485
 AliMuonForwardTrack.cxx:486
 AliMuonForwardTrack.cxx:487
 AliMuonForwardTrack.cxx:488
 AliMuonForwardTrack.cxx:489
 AliMuonForwardTrack.cxx:490
 AliMuonForwardTrack.cxx:491
 AliMuonForwardTrack.cxx:492
 AliMuonForwardTrack.cxx:493
 AliMuonForwardTrack.cxx:494
 AliMuonForwardTrack.cxx:495
 AliMuonForwardTrack.cxx:496
 AliMuonForwardTrack.cxx:497
 AliMuonForwardTrack.cxx:498
 AliMuonForwardTrack.cxx:499
 AliMuonForwardTrack.cxx:500
 AliMuonForwardTrack.cxx:501
 AliMuonForwardTrack.cxx:502
 AliMuonForwardTrack.cxx:503
 AliMuonForwardTrack.cxx:504
 AliMuonForwardTrack.cxx:505
 AliMuonForwardTrack.cxx:506
 AliMuonForwardTrack.cxx:507
 AliMuonForwardTrack.cxx:508
 AliMuonForwardTrack.cxx:509
 AliMuonForwardTrack.cxx:510
 AliMuonForwardTrack.cxx:511
 AliMuonForwardTrack.cxx:512
 AliMuonForwardTrack.cxx:513
 AliMuonForwardTrack.cxx:514
 AliMuonForwardTrack.cxx:515
 AliMuonForwardTrack.cxx:516
 AliMuonForwardTrack.cxx:517
 AliMuonForwardTrack.cxx:518
 AliMuonForwardTrack.cxx:519
 AliMuonForwardTrack.cxx:520
 AliMuonForwardTrack.cxx:521
 AliMuonForwardTrack.cxx:522
 AliMuonForwardTrack.cxx:523
 AliMuonForwardTrack.cxx:524
 AliMuonForwardTrack.cxx:525
 AliMuonForwardTrack.cxx:526
 AliMuonForwardTrack.cxx:527
 AliMuonForwardTrack.cxx:528
 AliMuonForwardTrack.cxx:529
 AliMuonForwardTrack.cxx:530
 AliMuonForwardTrack.cxx:531
 AliMuonForwardTrack.cxx:532
 AliMuonForwardTrack.cxx:533
 AliMuonForwardTrack.cxx:534
 AliMuonForwardTrack.cxx:535
 AliMuonForwardTrack.cxx:536
 AliMuonForwardTrack.cxx:537
 AliMuonForwardTrack.cxx:538
 AliMuonForwardTrack.cxx:539
 AliMuonForwardTrack.cxx:540
 AliMuonForwardTrack.cxx:541
 AliMuonForwardTrack.cxx:542
 AliMuonForwardTrack.cxx:543
 AliMuonForwardTrack.cxx:544
 AliMuonForwardTrack.cxx:545
 AliMuonForwardTrack.cxx:546
 AliMuonForwardTrack.cxx:547
 AliMuonForwardTrack.cxx:548
 AliMuonForwardTrack.cxx:549
 AliMuonForwardTrack.cxx:550
 AliMuonForwardTrack.cxx:551
 AliMuonForwardTrack.cxx:552
 AliMuonForwardTrack.cxx:553
 AliMuonForwardTrack.cxx:554
 AliMuonForwardTrack.cxx:555
 AliMuonForwardTrack.cxx:556
 AliMuonForwardTrack.cxx:557
 AliMuonForwardTrack.cxx:558
 AliMuonForwardTrack.cxx:559
 AliMuonForwardTrack.cxx:560
 AliMuonForwardTrack.cxx:561
 AliMuonForwardTrack.cxx:562
 AliMuonForwardTrack.cxx:563
 AliMuonForwardTrack.cxx:564
 AliMuonForwardTrack.cxx:565
 AliMuonForwardTrack.cxx:566
 AliMuonForwardTrack.cxx:567
 AliMuonForwardTrack.cxx:568
 AliMuonForwardTrack.cxx:569
 AliMuonForwardTrack.cxx:570
 AliMuonForwardTrack.cxx:571
 AliMuonForwardTrack.cxx:572
 AliMuonForwardTrack.cxx:573
 AliMuonForwardTrack.cxx:574
 AliMuonForwardTrack.cxx:575
 AliMuonForwardTrack.cxx:576
 AliMuonForwardTrack.cxx:577
 AliMuonForwardTrack.cxx:578
 AliMuonForwardTrack.cxx:579
 AliMuonForwardTrack.cxx:580
 AliMuonForwardTrack.cxx:581
 AliMuonForwardTrack.cxx:582
 AliMuonForwardTrack.cxx:583
 AliMuonForwardTrack.cxx:584
 AliMuonForwardTrack.cxx:585
 AliMuonForwardTrack.cxx:586
 AliMuonForwardTrack.cxx:587
 AliMuonForwardTrack.cxx:588
 AliMuonForwardTrack.cxx:589
 AliMuonForwardTrack.cxx:590
 AliMuonForwardTrack.cxx:591
 AliMuonForwardTrack.cxx:592
 AliMuonForwardTrack.cxx:593
 AliMuonForwardTrack.cxx:594
 AliMuonForwardTrack.cxx:595
 AliMuonForwardTrack.cxx:596
 AliMuonForwardTrack.cxx:597
 AliMuonForwardTrack.cxx:598
 AliMuonForwardTrack.cxx:599
 AliMuonForwardTrack.cxx:600
 AliMuonForwardTrack.cxx:601
 AliMuonForwardTrack.cxx:602
 AliMuonForwardTrack.cxx:603
 AliMuonForwardTrack.cxx:604
 AliMuonForwardTrack.cxx:605
 AliMuonForwardTrack.cxx:606
 AliMuonForwardTrack.cxx:607
 AliMuonForwardTrack.cxx:608
 AliMuonForwardTrack.cxx:609
 AliMuonForwardTrack.cxx:610
 AliMuonForwardTrack.cxx:611
 AliMuonForwardTrack.cxx:612
 AliMuonForwardTrack.cxx:613
 AliMuonForwardTrack.cxx:614
 AliMuonForwardTrack.cxx:615
 AliMuonForwardTrack.cxx:616
 AliMuonForwardTrack.cxx:617
 AliMuonForwardTrack.cxx:618
 AliMuonForwardTrack.cxx:619
 AliMuonForwardTrack.cxx:620
 AliMuonForwardTrack.cxx:621
 AliMuonForwardTrack.cxx:622
 AliMuonForwardTrack.cxx:623
 AliMuonForwardTrack.cxx:624
 AliMuonForwardTrack.cxx:625
 AliMuonForwardTrack.cxx:626
 AliMuonForwardTrack.cxx:627
 AliMuonForwardTrack.cxx:628
 AliMuonForwardTrack.cxx:629
 AliMuonForwardTrack.cxx:630
 AliMuonForwardTrack.cxx:631
 AliMuonForwardTrack.cxx:632
 AliMuonForwardTrack.cxx:633
 AliMuonForwardTrack.cxx:634
 AliMuonForwardTrack.cxx:635
 AliMuonForwardTrack.cxx:636
 AliMuonForwardTrack.cxx:637
 AliMuonForwardTrack.cxx:638
 AliMuonForwardTrack.cxx:639
 AliMuonForwardTrack.cxx:640
 AliMuonForwardTrack.cxx:641
 AliMuonForwardTrack.cxx:642
 AliMuonForwardTrack.cxx:643
 AliMuonForwardTrack.cxx:644
 AliMuonForwardTrack.cxx:645
 AliMuonForwardTrack.cxx:646
 AliMuonForwardTrack.cxx:647
 AliMuonForwardTrack.cxx:648
 AliMuonForwardTrack.cxx:649
 AliMuonForwardTrack.cxx:650
 AliMuonForwardTrack.cxx:651
 AliMuonForwardTrack.cxx:652
 AliMuonForwardTrack.cxx:653
 AliMuonForwardTrack.cxx:654
 AliMuonForwardTrack.cxx:655
 AliMuonForwardTrack.cxx:656
 AliMuonForwardTrack.cxx:657
 AliMuonForwardTrack.cxx:658
 AliMuonForwardTrack.cxx:659
 AliMuonForwardTrack.cxx:660
 AliMuonForwardTrack.cxx:661
 AliMuonForwardTrack.cxx:662
 AliMuonForwardTrack.cxx:663
 AliMuonForwardTrack.cxx:664
 AliMuonForwardTrack.cxx:665
 AliMuonForwardTrack.cxx:666
 AliMuonForwardTrack.cxx:667
 AliMuonForwardTrack.cxx:668
 AliMuonForwardTrack.cxx:669
 AliMuonForwardTrack.cxx:670
 AliMuonForwardTrack.cxx:671
 AliMuonForwardTrack.cxx:672
 AliMuonForwardTrack.cxx:673
 AliMuonForwardTrack.cxx:674
 AliMuonForwardTrack.cxx:675
 AliMuonForwardTrack.cxx:676
 AliMuonForwardTrack.cxx:677
 AliMuonForwardTrack.cxx:678
 AliMuonForwardTrack.cxx:679
 AliMuonForwardTrack.cxx:680
 AliMuonForwardTrack.cxx:681
 AliMuonForwardTrack.cxx:682
 AliMuonForwardTrack.cxx:683
 AliMuonForwardTrack.cxx:684
 AliMuonForwardTrack.cxx:685
 AliMuonForwardTrack.cxx:686
 AliMuonForwardTrack.cxx:687
 AliMuonForwardTrack.cxx:688
 AliMuonForwardTrack.cxx:689
 AliMuonForwardTrack.cxx:690
 AliMuonForwardTrack.cxx:691
 AliMuonForwardTrack.cxx:692
 AliMuonForwardTrack.cxx:693
 AliMuonForwardTrack.cxx:694
 AliMuonForwardTrack.cxx:695
 AliMuonForwardTrack.cxx:696
 AliMuonForwardTrack.cxx:697
 AliMuonForwardTrack.cxx:698
 AliMuonForwardTrack.cxx:699
 AliMuonForwardTrack.cxx:700
 AliMuonForwardTrack.cxx:701
 AliMuonForwardTrack.cxx:702
 AliMuonForwardTrack.cxx:703
 AliMuonForwardTrack.cxx:704
 AliMuonForwardTrack.cxx:705
 AliMuonForwardTrack.cxx:706
 AliMuonForwardTrack.cxx:707
 AliMuonForwardTrack.cxx:708
 AliMuonForwardTrack.cxx:709
 AliMuonForwardTrack.cxx:710
 AliMuonForwardTrack.cxx:711
 AliMuonForwardTrack.cxx:712
 AliMuonForwardTrack.cxx:713
 AliMuonForwardTrack.cxx:714
 AliMuonForwardTrack.cxx:715
 AliMuonForwardTrack.cxx:716
 AliMuonForwardTrack.cxx:717
 AliMuonForwardTrack.cxx:718
 AliMuonForwardTrack.cxx:719
 AliMuonForwardTrack.cxx:720
 AliMuonForwardTrack.cxx:721
 AliMuonForwardTrack.cxx:722
 AliMuonForwardTrack.cxx:723
 AliMuonForwardTrack.cxx:724
 AliMuonForwardTrack.cxx:725
 AliMuonForwardTrack.cxx:726
 AliMuonForwardTrack.cxx:727
 AliMuonForwardTrack.cxx:728
 AliMuonForwardTrack.cxx:729
 AliMuonForwardTrack.cxx:730
 AliMuonForwardTrack.cxx:731
 AliMuonForwardTrack.cxx:732
 AliMuonForwardTrack.cxx:733
 AliMuonForwardTrack.cxx:734
 AliMuonForwardTrack.cxx:735
 AliMuonForwardTrack.cxx:736
 AliMuonForwardTrack.cxx:737
 AliMuonForwardTrack.cxx:738
 AliMuonForwardTrack.cxx:739
 AliMuonForwardTrack.cxx:740
 AliMuonForwardTrack.cxx:741