ROOT logo
#ifndef AliMuonForwardTrack_H
#define AliMuonForwardTrack_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

//====================================================================================================================================================
//
//      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 "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;   ///< maximum number of parents

  AliMuonForwardTrack();
  AliMuonForwardTrack(AliMUONTrack *MUONTrack);

  AliMuonForwardTrack(const AliMuonForwardTrack&);
  AliMuonForwardTrack &operator=(const AliMuonForwardTrack&);
  
  virtual ~AliMuonForwardTrack(); 
  virtual void Clear(const Option_t* /*opt*/);

  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); };   // chi2/ndf

  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;        // max number of MFT planes

  Bool_t fPlaneExists[fNMaxPlanes];

  AliMUONTrack *fMUONTrack;
  TParticle *fMCTrackRef;

  TClonesArray *fMFTClusters;

  Int_t fParentMCLabel[fgkNParentsMax];    ///< MC label of parents and grandparents
  Int_t fParentPDGCode[fgkNParentsMax];    ///< PDG code of parents and grandparents 

  Int_t fNWrongClustersMC;    // number of wrong associated MC clusters

  Int_t fTrackMCId;   // this number will identify the track within a MC simulation: run, event, MUON track

  TLorentzVector fKinem;

  TMatrixD fParamCovMatrix;

  Double_t fRAtAbsorberEnd;

  ClassDef(AliMuonForwardTrack,2)
    
};

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

#endif



 AliMuonForwardTrack.h:1
 AliMuonForwardTrack.h:2
 AliMuonForwardTrack.h:3
 AliMuonForwardTrack.h:4
 AliMuonForwardTrack.h:5
 AliMuonForwardTrack.h:6
 AliMuonForwardTrack.h:7
 AliMuonForwardTrack.h:8
 AliMuonForwardTrack.h:9
 AliMuonForwardTrack.h:10
 AliMuonForwardTrack.h:11
 AliMuonForwardTrack.h:12
 AliMuonForwardTrack.h:13
 AliMuonForwardTrack.h:14
 AliMuonForwardTrack.h:15
 AliMuonForwardTrack.h:16
 AliMuonForwardTrack.h:17
 AliMuonForwardTrack.h:18
 AliMuonForwardTrack.h:19
 AliMuonForwardTrack.h:20
 AliMuonForwardTrack.h:21
 AliMuonForwardTrack.h:22
 AliMuonForwardTrack.h:23
 AliMuonForwardTrack.h:24
 AliMuonForwardTrack.h:25
 AliMuonForwardTrack.h:26
 AliMuonForwardTrack.h:27
 AliMuonForwardTrack.h:28
 AliMuonForwardTrack.h:29
 AliMuonForwardTrack.h:30
 AliMuonForwardTrack.h:31
 AliMuonForwardTrack.h:32
 AliMuonForwardTrack.h:33
 AliMuonForwardTrack.h:34
 AliMuonForwardTrack.h:35
 AliMuonForwardTrack.h:36
 AliMuonForwardTrack.h:37
 AliMuonForwardTrack.h:38
 AliMuonForwardTrack.h:39
 AliMuonForwardTrack.h:40
 AliMuonForwardTrack.h:41
 AliMuonForwardTrack.h:42
 AliMuonForwardTrack.h:43
 AliMuonForwardTrack.h:44
 AliMuonForwardTrack.h:45
 AliMuonForwardTrack.h:46
 AliMuonForwardTrack.h:47
 AliMuonForwardTrack.h:48
 AliMuonForwardTrack.h:49
 AliMuonForwardTrack.h:50
 AliMuonForwardTrack.h:51
 AliMuonForwardTrack.h:52
 AliMuonForwardTrack.h:53
 AliMuonForwardTrack.h:54
 AliMuonForwardTrack.h:55
 AliMuonForwardTrack.h:56
 AliMuonForwardTrack.h:57
 AliMuonForwardTrack.h:58
 AliMuonForwardTrack.h:59
 AliMuonForwardTrack.h:60
 AliMuonForwardTrack.h:61
 AliMuonForwardTrack.h:62
 AliMuonForwardTrack.h:63
 AliMuonForwardTrack.h:64
 AliMuonForwardTrack.h:65
 AliMuonForwardTrack.h:66
 AliMuonForwardTrack.h:67
 AliMuonForwardTrack.h:68
 AliMuonForwardTrack.h:69
 AliMuonForwardTrack.h:70
 AliMuonForwardTrack.h:71
 AliMuonForwardTrack.h:72
 AliMuonForwardTrack.h:73
 AliMuonForwardTrack.h:74
 AliMuonForwardTrack.h:75
 AliMuonForwardTrack.h:76
 AliMuonForwardTrack.h:77
 AliMuonForwardTrack.h:78
 AliMuonForwardTrack.h:79
 AliMuonForwardTrack.h:80
 AliMuonForwardTrack.h:81
 AliMuonForwardTrack.h:82
 AliMuonForwardTrack.h:83
 AliMuonForwardTrack.h:84
 AliMuonForwardTrack.h:85
 AliMuonForwardTrack.h:86
 AliMuonForwardTrack.h:87
 AliMuonForwardTrack.h:88
 AliMuonForwardTrack.h:89
 AliMuonForwardTrack.h:90
 AliMuonForwardTrack.h:91
 AliMuonForwardTrack.h:92
 AliMuonForwardTrack.h:93
 AliMuonForwardTrack.h:94
 AliMuonForwardTrack.h:95
 AliMuonForwardTrack.h:96
 AliMuonForwardTrack.h:97
 AliMuonForwardTrack.h:98
 AliMuonForwardTrack.h:99
 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