#ifndef AliMuonForwardTrack_H
#define AliMuonForwardTrack_H
#include "AliLog.h"
#include "AliMUONTrack.h"
#include "AliMFTCluster.h"
#include "AliMUONVCluster.h"
#include "AliMUONTrackParam.h"
#include "TMatrixD.h"
#include "TClonesArray.h"
#include "TParticle.h"
#include "AliMFTConstants.h"
#include "TLorentzVector.h"
class AliMuonForwardTrack : public AliMUONTrack {
public:
static const Int_t fgkNParentsMax = 5;
AliMuonForwardTrack();
AliMuonForwardTrack(AliMUONTrack *MUONTrack);
AliMuonForwardTrack(const AliMuonForwardTrack&);
AliMuonForwardTrack &operator=(const AliMuonForwardTrack&);
virtual ~AliMuonForwardTrack();
virtual void Clear(const Option_t* );
void SetMUONTrack(AliMUONTrack *MUONTrack);
void SetMCTrackRef(TParticle *MCTrackRef);
AliMUONTrack* GetMUONTrack() { return fMUONTrack; }
TParticle* GetMCTrackRef() { return fMCTrackRef; }
Int_t GetCharge() { return TMath::Nint(GetTrackParamAtMUONCluster(0)->GetCharge()); }
AliMUONVCluster* GetMUONCluster(Int_t iMUONCluster);
AliMFTCluster* GetMFTCluster(Int_t iMFTCluster);
AliMUONTrackParam* GetTrackParamAtMUONCluster(Int_t iMUONCluster);
AliMUONTrackParam* GetTrackParamAtMFTCluster(Int_t iMFTCluster);
void SetPlaneExists(Int_t iPlane, Bool_t value=kTRUE) { fPlaneExists[iPlane] = value; }
Bool_t PlaneExists(Int_t iPlane) { return fPlaneExists[iPlane]; }
Int_t GetNMUONClusters() { return fMUONTrack->GetNClusters(); }
Int_t GetNMFTClusters() { return fMFTClusters->GetEntries(); }
Int_t GetMCLabelMUONTrack() { return fMUONTrack->GetMCLabel(); }
void AddTrackParamAtMFTCluster(AliMUONTrackParam &trackParam, AliMFTCluster &mftCluster);
Double_t RunKalmanFilter(AliMUONTrackParam &trackParamAtCluster);
Double_t GetWeightedOffset(Double_t x, Double_t y, Double_t z);
Double_t GetOffset(Double_t x, Double_t y, Double_t z);
Double_t GetDCA(Double_t x, Double_t y, Double_t z);
Double_t GetMomentumSpectrometer(Double_t z);
Double_t GetOffsetX(Double_t x, Double_t z);
Double_t GetOffsetY(Double_t y, Double_t z);
Double_t GetThetaAbs();
Double_t GetRAtAbsorberEnd() { return fRAtAbsorberEnd; }
void SetRAtAbsorberEnd(Double_t rAtAbsorberEnd) { fRAtAbsorberEnd = rAtAbsorberEnd; }
Double_t GetChi2OverNdf() { return GetGlobalChi2()/Double_t(2*(GetNMUONClusters()+GetNMFTClusters())-5); };
void SetParentMCLabel(Int_t iParent, Int_t MClabel) { if (0<=iParent && iParent<fgkNParentsMax) fParentMCLabel[iParent] = MClabel; }
void SetParentPDGCode(Int_t iParent, Int_t PDGCode) { if (0<=iParent && iParent<fgkNParentsMax) fParentPDGCode[iParent] = PDGCode; }
Int_t GetParentMCLabel(Int_t iParent) { if (0<=iParent && iParent<fgkNParentsMax) return fParentMCLabel[iParent]; else return -1; }
Int_t GetParentPDGCode(Int_t iParent) { if (0<=iParent && iParent<fgkNParentsMax) return fParentPDGCode[iParent]; else return 0; }
void SetNWrongClustersMC(Int_t nClusters) { fNWrongClustersMC = nClusters; }
Int_t GetNWrongClustersMC() { return fNWrongClustersMC; }
Double_t Pt() { return fKinem.Pt(); }
Double_t Eta() { return fKinem.Eta(); }
Double_t Rapidity() { return fKinem.Rapidity(); }
Double_t Px() { return fKinem.Px(); }
Double_t Py() { return fKinem.Py(); }
Double_t Pz() { return fKinem.Pz(); }
Double_t P() { return fKinem.P(); }
TMatrixD GetParamCovMatrix() { return fParamCovMatrix; }
void EvalKinem(Double_t z);
void SetTrackMCId(Int_t id) { fTrackMCId = id; }
Int_t GetTrackMCId() { return fTrackMCId; }
Bool_t IsFromDirectResonance();
Bool_t IsFromDirectCharm();
Bool_t IsFromDirectBeauty();
Bool_t IsFromChainResonance();
Bool_t IsFromChainCharm();
Bool_t IsFromChainBeauty();
Bool_t IsFromCharm() { return IsFromDirectCharm() || IsFromChainCharm(); }
Bool_t IsFromBeauty() { return IsFromDirectBeauty() || IsFromChainBeauty(); }
Bool_t IsMuon();
Bool_t IsFake();
Bool_t IsPDGResonance(Int_t pdg);
Bool_t IsPDGCharm(Int_t pdg);
Bool_t IsPDGBeauty(Int_t pdg);
Bool_t IsMuonFromBackground();
Int_t GetFirstMotherID();
void PrintHistory();
protected:
static const Int_t fNMaxPlanes = AliMFTConstants::fNMaxPlanes;
Bool_t fPlaneExists[fNMaxPlanes];
AliMUONTrack *fMUONTrack;
TParticle *fMCTrackRef;
TClonesArray *fMFTClusters;
Int_t fParentMCLabel[fgkNParentsMax];
Int_t fParentPDGCode[fgkNParentsMax];
Int_t fNWrongClustersMC;
Int_t fTrackMCId;
TLorentzVector fKinem;
TMatrixD fParamCovMatrix;
Double_t fRAtAbsorberEnd;
ClassDef(AliMuonForwardTrack,2)
};
#endif
AliMuonForwardTrack.h:100 AliMuonForwardTrack.h:101 AliMuonForwardTrack.h:102 AliMuonForwardTrack.h:103 AliMuonForwardTrack.h:104 AliMuonForwardTrack.h:105 AliMuonForwardTrack.h:106 AliMuonForwardTrack.h:107 AliMuonForwardTrack.h:108 AliMuonForwardTrack.h:109 AliMuonForwardTrack.h:110 AliMuonForwardTrack.h:111 AliMuonForwardTrack.h:112 AliMuonForwardTrack.h:113 AliMuonForwardTrack.h:114 AliMuonForwardTrack.h:115 AliMuonForwardTrack.h:116 AliMuonForwardTrack.h:117 AliMuonForwardTrack.h:118 AliMuonForwardTrack.h:119 AliMuonForwardTrack.h:120 AliMuonForwardTrack.h:121 AliMuonForwardTrack.h:122 AliMuonForwardTrack.h:123 AliMuonForwardTrack.h:124 AliMuonForwardTrack.h:125 AliMuonForwardTrack.h:126 AliMuonForwardTrack.h:127 AliMuonForwardTrack.h:128 AliMuonForwardTrack.h:129 AliMuonForwardTrack.h:130 AliMuonForwardTrack.h:131 AliMuonForwardTrack.h:132 AliMuonForwardTrack.h:133 AliMuonForwardTrack.h:134 AliMuonForwardTrack.h:135 AliMuonForwardTrack.h:136 AliMuonForwardTrack.h:137 AliMuonForwardTrack.h:138 AliMuonForwardTrack.h:139 AliMuonForwardTrack.h:140 AliMuonForwardTrack.h:141 AliMuonForwardTrack.h:142 AliMuonForwardTrack.h:143 AliMuonForwardTrack.h:144 AliMuonForwardTrack.h:145 AliMuonForwardTrack.h:146 AliMuonForwardTrack.h:147 AliMuonForwardTrack.h:148 AliMuonForwardTrack.h:149 AliMuonForwardTrack.h:150 AliMuonForwardTrack.h:151 AliMuonForwardTrack.h:152 AliMuonForwardTrack.h:153 AliMuonForwardTrack.h:154 AliMuonForwardTrack.h:155 AliMuonForwardTrack.h:156 AliMuonForwardTrack.h:157