ROOT logo
#ifndef AliESDMuonGlobalTrack_H
#define AliESDMuonGlobalTrack_H

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

//====================================================================================================================================================
//
//      ESD 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 "TMath.h"
#include "TMatrixD.h"
#include "TDatabasePDG.h"
#include "TArrayI.h"
#include "TLorentzVector.h"
#include "AliESDVertex.h"
#include "TRef.h"

#include "AliVParticle.h"

class AliESDEvent;
class TClonesArray;

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

class AliESDMuonGlobalTrack : public AliVParticle {

public:

  AliESDMuonGlobalTrack();
  AliESDMuonGlobalTrack(Double_t px, Double_t py, Double_t pz);
  virtual ~AliESDMuonGlobalTrack() {;}
  AliESDMuonGlobalTrack(const AliESDMuonGlobalTrack& esdTrack);
  AliESDMuonGlobalTrack& operator=(const AliESDMuonGlobalTrack& esdTrack);
  virtual void Copy(TObject &obj) const;

  void  SetCharge(Int_t charge) { fCharge = charge; } 
  Short_t GetCharge() const { return fCharge; }

  /* Double_t GetOffset(Double_t x, Double_t y, Double_t z); */
  /* Double_t GetOffsetX(Double_t x, Double_t z); */
  /* Double_t GetOffsetY(Double_t y, Double_t z); */

  // Set and Get methods for kinematics at primary vertex
  void SetPxPyPz(Double_t px, Double_t py, Double_t pz);

  // Get and Set methods for global tracking info
  Double_t GetChi2OverNdf() const { return fChi2OverNdf; }            // chi2/ndf
  void     SetChi2OverNdf(Double_t chi2) { fChi2OverNdf = chi2; }     // chi2/ndf

  Double_t GetChi2MatchTrigger() const { return fChi2MatchTrigger; }
  void     SetChi2MatchTrigger(Double_t chi2MatchTrigger) { fChi2MatchTrigger = chi2MatchTrigger; }

  // Get and Set methods for various info copied and pasted from the MUON track
  UShort_t GetHitsPatternInTrigCh() const {return fHitsPatternInTrigCh;}
  void     SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh) {fHitsPatternInTrigCh = hitsPatternInTrigCh;}
  UInt_t   GetHitsPatternInTrigChTrk() const {return fHitsPatternInTrigChTrk;}
  void     SetHitsPatternInTrigChTrk(UInt_t hitsPatternInTrigChTrk) {fHitsPatternInTrigChTrk = hitsPatternInTrigChTrk;}
  UInt_t   GetMuonClusterMap() const {return fMuonClusterMap;}
  void     SetMuonClusterMap(UInt_t muonClusterMap) {fMuonClusterMap = muonClusterMap;}
  Int_t    GetLoCircuit() const { return fLoCircuit; }
  void     SetLoCircuit(Int_t loCircuit) { fLoCircuit = loCircuit; }
  Bool_t   IsConnected() const { return fIsConnected; }
  void     Connected(Bool_t flag) { fIsConnected = flag; }

  // Get and Set methods for trigger matching
  void  SetMatchTrigger(Int_t matchTrigger) { fMatchTrigger = matchTrigger; }
  Int_t GetMatchTrigger() { return fMatchTrigger; }

  void SetNMFTClusters(Int_t nMFTClusters) { fNMFTClusters = nMFTClusters; }
  Short_t GetNMFTClusters() { return fNMFTClusters; }

  void SetNWrongMFTClustersMC(Int_t nWrongMFTClustersMC) { fNWrongMFTClustersMC = nWrongMFTClustersMC; }
  Short_t GetNWrongMFTClustersMC() { return fNWrongMFTClustersMC; }

  void SetMFTClusterPattern(ULong_t mftClusterPattern) { fMFTClusterPattern = mftClusterPattern; }
  ULong_t GetMFTClusterPattern() { return fMFTClusterPattern; }

  // Kinematics
  Double_t Pt()       const { return fPt;  }
  Double_t Eta()      const { return fEta; }
  Double_t Rapidity() const { return fRapidity; }
  Double_t Px()       const { return fPx; }
  Double_t Py()       const { return fPy; }
  Double_t Pz()       const { return fPz; }
  Double_t P()        const { return fP;  }

  Bool_t   PxPyPz(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }

  void SetFirstTrackingPoint(Double_t x, Double_t y, Double_t z) {fFirstTrackingPointX = x; fFirstTrackingPointY = y; fFirstTrackingPointZ = z; }
  void GetFirstTrackingPoint(Double_t x[3]) { x[0] = fFirstTrackingPointX; x[1] = fFirstTrackingPointY; x[2] = fFirstTrackingPointZ; }

  void SetXYAtVertex(Double_t x, Double_t y) { fXAtVertex = x; fYAtVertex = y; }
  void GetXYAtVertex(Double_t x[2]) { x[0] = fXAtVertex; x[1] = fYAtVertex; }

  Double_t GetRAtAbsorberEnd() { return fRAtAbsorberEnd; }
  void SetRAtAbsorberEnd(Double_t r) { fRAtAbsorberEnd = r; }

  // Additional methods to comply with AliVParticle
  Double_t Xv() const {return -999.;} // put reasonable values here
  Double_t Yv() const {return -999.;} //
  Double_t Zv() const {return -999.;} //
  Bool_t   XvYvZv(Double_t x[3]) const { x[0] = Xv(); x[1] = Yv(); x[2] = Zv(); return kTRUE; }  
  Double_t OneOverPt() const { return (Pt() != 0.) ? 1./Pt() : FLT_MAX; }
  Double_t Phi() const { return TMath::Pi()+TMath::ATan2(-Py(), -Px()); }
  Double_t Theta() const { return TMath::ATan2(Pt(), Pz()); }
  Double_t E() const { return TMath::Sqrt(M()*M() + P()*P()); }
  Double_t M() const { return TDatabasePDG::Instance()->GetParticle("mu-")->Mass(); }
  Double_t Y() const { return Rapidity(); }
  Short_t  Charge() const { return fCharge; }

  // Return kTRUE if the track contain tracker data
  Bool_t ContainTrackerData() const {return (fMuonClusterMap>0) ? kTRUE : kFALSE;}

  // Dummy
  const Double_t *PID() const { return (Double_t*)0x0; }
  Int_t PdgCode() const { return 0; }
  
  // Set the corresponding MC track number
  void  SetLabel(Int_t label) { fLabel = label; }
  // Return the corresponding MC track number
  Int_t GetLabel() const { return fLabel; }

  void SetProdVertexXYZ(Double_t x, Double_t y, Double_t z) { fProdVertexXYZ[0]=x; fProdVertexXYZ[1]=y; fProdVertexXYZ[2]=z; }
  void GetProdVertexXYZ(Double_t *vertex) { vertex[0]=fProdVertexXYZ[0]; vertex[1]=fProdVertexXYZ[1]; vertex[2]=fProdVertexXYZ[2]; }

  const TMatrixD& GetCovariances() const;
  void            SetCovariances(const TMatrixD& covariances);

  AliESDEvent* GetESDEvent() const { return fESDEvent; }
  void         SetESDEvent(AliESDEvent* evt) { fESDEvent = evt; }  
  
protected:

  Short_t fCharge, fMatchTrigger, fNMFTClusters, fNWrongMFTClustersMC;
  ULong_t fMFTClusterPattern;  // Tells us which MFT clusters are contained in the track, and which one is a good one (if MC)

  // kinematics at vertex
  Double_t fPx, fPy, fPz, fPt, fP, fEta, fRapidity;

  // coordinates of the first tracking point
  Double_t fFirstTrackingPointX, fFirstTrackingPointY, fFirstTrackingPointZ;

  // transverse coordinates at DCA to the primary vertex (offset)
  Double_t fXAtVertex, fYAtVertex;

  Double_t fRAtAbsorberEnd;

  mutable TMatrixD *fCovariances; // Covariance matrix of track parameters (see AliMUONTrackParam)

  // global tracking info
  Double_t fChi2OverNdf;            //  chi2/ndf in the MUON+MFT track fit
  Double_t fChi2MatchTrigger;       //  chi2 of trigger/track matching

  Int_t fLabel;                     //  point to the corresponding MC track

  UInt_t   fMuonClusterMap;         // Map of clusters in MUON tracking chambers
  UShort_t fHitsPatternInTrigCh;    // Word containing info on the hits left in trigger chambers
  UInt_t   fHitsPatternInTrigChTrk; // Trigger hit map from tracker track extrapolation
  Int_t    fLoCircuit;
  Bool_t   fIsConnected;
  
  Double_t fProdVertexXYZ[3];       // vertex of origin

  AliESDEvent *fESDEvent;           //! Pointer back to event to which the track belongs
  
  ClassDef(AliESDMuonGlobalTrack,4) // MUON+MFT ESD track class 

};

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

#endif 
 AliESDMuonGlobalTrack.h:1
 AliESDMuonGlobalTrack.h:2
 AliESDMuonGlobalTrack.h:3
 AliESDMuonGlobalTrack.h:4
 AliESDMuonGlobalTrack.h:5
 AliESDMuonGlobalTrack.h:6
 AliESDMuonGlobalTrack.h:7
 AliESDMuonGlobalTrack.h:8
 AliESDMuonGlobalTrack.h:9
 AliESDMuonGlobalTrack.h:10
 AliESDMuonGlobalTrack.h:11
 AliESDMuonGlobalTrack.h:12
 AliESDMuonGlobalTrack.h:13
 AliESDMuonGlobalTrack.h:14
 AliESDMuonGlobalTrack.h:15
 AliESDMuonGlobalTrack.h:16
 AliESDMuonGlobalTrack.h:17
 AliESDMuonGlobalTrack.h:18
 AliESDMuonGlobalTrack.h:19
 AliESDMuonGlobalTrack.h:20
 AliESDMuonGlobalTrack.h:21
 AliESDMuonGlobalTrack.h:22
 AliESDMuonGlobalTrack.h:23
 AliESDMuonGlobalTrack.h:24
 AliESDMuonGlobalTrack.h:25
 AliESDMuonGlobalTrack.h:26
 AliESDMuonGlobalTrack.h:27
 AliESDMuonGlobalTrack.h:28
 AliESDMuonGlobalTrack.h:29
 AliESDMuonGlobalTrack.h:30
 AliESDMuonGlobalTrack.h:31
 AliESDMuonGlobalTrack.h:32
 AliESDMuonGlobalTrack.h:33
 AliESDMuonGlobalTrack.h:34
 AliESDMuonGlobalTrack.h:35
 AliESDMuonGlobalTrack.h:36
 AliESDMuonGlobalTrack.h:37
 AliESDMuonGlobalTrack.h:38
 AliESDMuonGlobalTrack.h:39
 AliESDMuonGlobalTrack.h:40
 AliESDMuonGlobalTrack.h:41
 AliESDMuonGlobalTrack.h:42
 AliESDMuonGlobalTrack.h:43
 AliESDMuonGlobalTrack.h:44
 AliESDMuonGlobalTrack.h:45
 AliESDMuonGlobalTrack.h:46
 AliESDMuonGlobalTrack.h:47
 AliESDMuonGlobalTrack.h:48
 AliESDMuonGlobalTrack.h:49
 AliESDMuonGlobalTrack.h:50
 AliESDMuonGlobalTrack.h:51
 AliESDMuonGlobalTrack.h:52
 AliESDMuonGlobalTrack.h:53
 AliESDMuonGlobalTrack.h:54
 AliESDMuonGlobalTrack.h:55
 AliESDMuonGlobalTrack.h:56
 AliESDMuonGlobalTrack.h:57
 AliESDMuonGlobalTrack.h:58
 AliESDMuonGlobalTrack.h:59
 AliESDMuonGlobalTrack.h:60
 AliESDMuonGlobalTrack.h:61
 AliESDMuonGlobalTrack.h:62
 AliESDMuonGlobalTrack.h:63
 AliESDMuonGlobalTrack.h:64
 AliESDMuonGlobalTrack.h:65
 AliESDMuonGlobalTrack.h:66
 AliESDMuonGlobalTrack.h:67
 AliESDMuonGlobalTrack.h:68
 AliESDMuonGlobalTrack.h:69
 AliESDMuonGlobalTrack.h:70
 AliESDMuonGlobalTrack.h:71
 AliESDMuonGlobalTrack.h:72
 AliESDMuonGlobalTrack.h:73
 AliESDMuonGlobalTrack.h:74
 AliESDMuonGlobalTrack.h:75
 AliESDMuonGlobalTrack.h:76
 AliESDMuonGlobalTrack.h:77
 AliESDMuonGlobalTrack.h:78
 AliESDMuonGlobalTrack.h:79
 AliESDMuonGlobalTrack.h:80
 AliESDMuonGlobalTrack.h:81
 AliESDMuonGlobalTrack.h:82
 AliESDMuonGlobalTrack.h:83
 AliESDMuonGlobalTrack.h:84
 AliESDMuonGlobalTrack.h:85
 AliESDMuonGlobalTrack.h:86
 AliESDMuonGlobalTrack.h:87
 AliESDMuonGlobalTrack.h:88
 AliESDMuonGlobalTrack.h:89
 AliESDMuonGlobalTrack.h:90
 AliESDMuonGlobalTrack.h:91
 AliESDMuonGlobalTrack.h:92
 AliESDMuonGlobalTrack.h:93
 AliESDMuonGlobalTrack.h:94
 AliESDMuonGlobalTrack.h:95
 AliESDMuonGlobalTrack.h:96
 AliESDMuonGlobalTrack.h:97
 AliESDMuonGlobalTrack.h:98
 AliESDMuonGlobalTrack.h:99
 AliESDMuonGlobalTrack.h:100
 AliESDMuonGlobalTrack.h:101
 AliESDMuonGlobalTrack.h:102
 AliESDMuonGlobalTrack.h:103
 AliESDMuonGlobalTrack.h:104
 AliESDMuonGlobalTrack.h:105
 AliESDMuonGlobalTrack.h:106
 AliESDMuonGlobalTrack.h:107
 AliESDMuonGlobalTrack.h:108
 AliESDMuonGlobalTrack.h:109
 AliESDMuonGlobalTrack.h:110
 AliESDMuonGlobalTrack.h:111
 AliESDMuonGlobalTrack.h:112
 AliESDMuonGlobalTrack.h:113
 AliESDMuonGlobalTrack.h:114
 AliESDMuonGlobalTrack.h:115
 AliESDMuonGlobalTrack.h:116
 AliESDMuonGlobalTrack.h:117
 AliESDMuonGlobalTrack.h:118
 AliESDMuonGlobalTrack.h:119
 AliESDMuonGlobalTrack.h:120
 AliESDMuonGlobalTrack.h:121
 AliESDMuonGlobalTrack.h:122
 AliESDMuonGlobalTrack.h:123
 AliESDMuonGlobalTrack.h:124
 AliESDMuonGlobalTrack.h:125
 AliESDMuonGlobalTrack.h:126
 AliESDMuonGlobalTrack.h:127
 AliESDMuonGlobalTrack.h:128
 AliESDMuonGlobalTrack.h:129
 AliESDMuonGlobalTrack.h:130
 AliESDMuonGlobalTrack.h:131
 AliESDMuonGlobalTrack.h:132
 AliESDMuonGlobalTrack.h:133
 AliESDMuonGlobalTrack.h:134
 AliESDMuonGlobalTrack.h:135
 AliESDMuonGlobalTrack.h:136
 AliESDMuonGlobalTrack.h:137
 AliESDMuonGlobalTrack.h:138
 AliESDMuonGlobalTrack.h:139
 AliESDMuonGlobalTrack.h:140
 AliESDMuonGlobalTrack.h:141
 AliESDMuonGlobalTrack.h:142
 AliESDMuonGlobalTrack.h:143
 AliESDMuonGlobalTrack.h:144
 AliESDMuonGlobalTrack.h:145
 AliESDMuonGlobalTrack.h:146
 AliESDMuonGlobalTrack.h:147
 AliESDMuonGlobalTrack.h:148
 AliESDMuonGlobalTrack.h:149
 AliESDMuonGlobalTrack.h:150
 AliESDMuonGlobalTrack.h:151
 AliESDMuonGlobalTrack.h:152
 AliESDMuonGlobalTrack.h:153
 AliESDMuonGlobalTrack.h:154
 AliESDMuonGlobalTrack.h:155
 AliESDMuonGlobalTrack.h:156
 AliESDMuonGlobalTrack.h:157
 AliESDMuonGlobalTrack.h:158
 AliESDMuonGlobalTrack.h:159
 AliESDMuonGlobalTrack.h:160
 AliESDMuonGlobalTrack.h:161
 AliESDMuonGlobalTrack.h:162
 AliESDMuonGlobalTrack.h:163
 AliESDMuonGlobalTrack.h:164
 AliESDMuonGlobalTrack.h:165
 AliESDMuonGlobalTrack.h:166
 AliESDMuonGlobalTrack.h:167
 AliESDMuonGlobalTrack.h:168
 AliESDMuonGlobalTrack.h:169
 AliESDMuonGlobalTrack.h:170
 AliESDMuonGlobalTrack.h:171
 AliESDMuonGlobalTrack.h:172
 AliESDMuonGlobalTrack.h:173
 AliESDMuonGlobalTrack.h:174
 AliESDMuonGlobalTrack.h:175
 AliESDMuonGlobalTrack.h:176
 AliESDMuonGlobalTrack.h:177