LCOV - code coverage report
Current view: top level - STEER/ESD - AliESDMuonTrack.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 51 106 48.1 %
Date: 2016-06-14 17:26:59 Functions: 52 109 47.7 %

          Line data    Source code
       1             : #ifndef ALIESDMUONTRACK_H
       2             : #define ALIESDMUONTRACK_H
       3             : 
       4             : /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       5             : * See cxx source for full Copyright notice                               */
       6             : 
       7             : /* $Id$ */
       8             : 
       9             : /// \class AliESDMuonTrack
      10             : /// \brief Class to describe the MUON tracks in the Event Summary Data class
      11             : //  Author: G.Martinez
      12             : 
      13             : 
      14             : #include <TMath.h>
      15             : #include <TMatrixD.h>
      16             : #include <TDatabasePDG.h>
      17             : #include <TArrayI.h>
      18             : 
      19             : #include "AliVParticle.h"
      20             : 
      21             : class AliESDEvent;
      22             : class TClonesArray;
      23             : class TLorentzVector;
      24             : 
      25             : class AliESDMuonTrack : public AliVParticle {
      26             : public:
      27             :   AliESDMuonTrack(); //Constructor
      28             :   virtual ~AliESDMuonTrack(); // Destructor
      29             :   AliESDMuonTrack(const AliESDMuonTrack& esdm);
      30             :   AliESDMuonTrack& operator=(const AliESDMuonTrack& esdm);
      31             :   virtual void Copy(TObject &obj) const;
      32             : 
      33             :   virtual void Clear(Option_t* opt = "");
      34             :   
      35             :   void Reset();
      36             :   
      37             :   // Return kTRUE if the track contain tracker data
      38           0 :   Bool_t ContainTrackerData() const {return (fMuonClusterMap>0) ? kTRUE : kFALSE;}
      39             :   // Return kTRUE if the track contain trigger data
      40           0 :   Bool_t ContainTriggerData() const {return (LoCircuit()>0) ? kTRUE : kFALSE;}
      41             :   
      42             :   // Get and Set methods for data at vertex
      43         136 :   Double_t GetInverseBendingMomentum(void) const {return fInverseBendingMomentum;}
      44             :   void     SetInverseBendingMomentum(Double_t InverseBendingMomentum) 
      45          32 :                 {fInverseBendingMomentum = InverseBendingMomentum;}
      46          36 :   Double_t GetThetaX(void) const {return fThetaX;}
      47          32 :   void     SetThetaX(Double_t ThetaX) {fThetaX = ThetaX;}
      48          36 :   Double_t GetThetaY(void) const {return fThetaY;}
      49          32 :   void     SetThetaY(Double_t ThetaY) {fThetaY = ThetaY;}
      50          36 :   Double_t GetZ(void) const {return fZ;}
      51          32 :   void     SetZ(Double_t Z) {fZ = Z;}
      52          36 :   Double_t GetBendingCoor(void) const {return fBendingCoor;}
      53          32 :   void     SetBendingCoor(Double_t BendingCoor) {fBendingCoor = BendingCoor;}
      54          36 :   Double_t GetNonBendingCoor(void) const {return fNonBendingCoor;}
      55          32 :   void     SetNonBendingCoor(Double_t NonBendingCoor) {fNonBendingCoor = NonBendingCoor;}
      56             :   
      57             :   // Get and Set methods for data at Distance of Closest Approach in the vertex plane
      58           0 :   Double_t GetInverseBendingMomentumAtDCA(void) const {return fInverseBendingMomentumAtDCA;}
      59             :   void     SetInverseBendingMomentumAtDCA(Double_t InverseBendingMomentum) 
      60          32 :                 {fInverseBendingMomentumAtDCA = InverseBendingMomentum;}
      61           0 :   Double_t GetThetaXAtDCA(void) const {return fThetaXAtDCA;}
      62          32 :   void     SetThetaXAtDCA(Double_t ThetaX) {fThetaXAtDCA = ThetaX;}
      63           0 :   Double_t GetThetaYAtDCA(void) const {return fThetaYAtDCA;}
      64          32 :   void     SetThetaYAtDCA(Double_t ThetaY) {fThetaYAtDCA = ThetaY;}
      65           0 :   Double_t GetBendingCoorAtDCA(void) const {return fBendingCoorAtDCA;}
      66          32 :   void     SetBendingCoorAtDCA(Double_t BendingCoor) {fBendingCoorAtDCA = BendingCoor;}
      67           0 :   Double_t GetNonBendingCoorAtDCA(void) const {return fNonBendingCoorAtDCA;}
      68          32 :   void     SetNonBendingCoorAtDCA(Double_t NonBendingCoor) {fNonBendingCoorAtDCA = NonBendingCoor;}
      69           0 :   Double_t GetDCA(void) const {return TMath::Sqrt(fNonBendingCoorAtDCA*fNonBendingCoorAtDCA +
      70           0 :                                                   fBendingCoorAtDCA*fBendingCoorAtDCA);}
      71             :   
      72             :   // Get and Set methods for data at first station
      73           0 :   Double_t GetInverseBendingMomentumUncorrected(void) const {return fInverseBendingMomentumUncorrected;}
      74             :   void     SetInverseBendingMomentumUncorrected(Double_t InverseBendingMomentum) 
      75          32 :                 {fInverseBendingMomentumUncorrected = InverseBendingMomentum;}
      76           0 :   Double_t GetThetaXUncorrected(void) const {return fThetaXUncorrected;}
      77          36 :   void     SetThetaXUncorrected(Double_t ThetaX) {fThetaXUncorrected = ThetaX;}
      78           0 :   Double_t GetThetaYUncorrected(void) const {return fThetaYUncorrected;}
      79          36 :   void     SetThetaYUncorrected(Double_t ThetaY) {fThetaYUncorrected = ThetaY;}
      80           0 :   Double_t GetZUncorrected(void) const {return fZUncorrected;}
      81          36 :   void     SetZUncorrected(Double_t Z) {fZUncorrected = Z;}
      82           0 :   Double_t GetBendingCoorUncorrected(void) const {return fBendingCoorUncorrected;}
      83          36 :   void     SetBendingCoorUncorrected(Double_t BendingCoor) {fBendingCoorUncorrected = BendingCoor;}
      84           0 :   Double_t GetNonBendingCoorUncorrected(void) const {return fNonBendingCoorUncorrected;}
      85          36 :   void     SetNonBendingCoorUncorrected(Double_t NonBendingCoor) {fNonBendingCoorUncorrected = NonBendingCoor;}
      86             :   
      87             :   // Get and Set methods for covariance matrix of data at first station
      88             :   void     GetCovariances(TMatrixD& cov) const;
      89             :   void     SetCovariances(const TMatrixD& cov);
      90             :   void     GetCovarianceXYZPxPyPz(Double_t cov[21]) const;
      91             :   
      92             :   // Get and Set methods for the transverse position r of the track at the end of the absorber
      93           0 :   Double_t GetRAtAbsorberEnd() const { return fRAtAbsorberEnd; }
      94          32 :   void     SetRAtAbsorberEnd(Double_t r) { fRAtAbsorberEnd = r; }
      95             :   
      96             :   // Get and Set methods for global tracking info
      97          36 :   Double_t GetChi2(void) const {return fChi2;}
      98          32 :   void     SetChi2(Double_t Chi2) {fChi2 = Chi2;}
      99          36 :   UChar_t  GetNHit(void) const {return fNHit;}
     100             :   Int_t    GetNDF() const;
     101             :   Double_t GetNormalizedChi2() const;
     102             :   
     103             :   // Get and Set methods for trigger matching
     104             :   Int_t    GetMatchTrigger() const;
     105             :   Bool_t   MatchTriggerDigits(Bool_t fromTrack) const;
     106           0 :   Double_t GetChi2MatchTrigger() const {return fChi2MatchTrigger;}
     107          36 :   void     SetChi2MatchTrigger(Double_t Chi2MatchTrigger) {fChi2MatchTrigger = Chi2MatchTrigger;}
     108           0 :   UShort_t GetHitsPatternInTrigCh() const {return fHitsPatternInTrigCh;}
     109          36 :   void     SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh) {fHitsPatternInTrigCh = hitsPatternInTrigCh;}
     110           0 :   UInt_t   GetHitsPatternInTrigChTrk() const {return fHitsPatternInTrigChTrk;}
     111          36 :   void     SetHitsPatternInTrigChTrk(UInt_t hitsPatternInTrigChTrk) {fHitsPatternInTrigChTrk = hitsPatternInTrigChTrk;}
     112          36 :   void     SetLocalTrigger(Int_t locTrig) { fLocalTrigger = locTrig; }
     113          68 :   Int_t    LoCircuit(void) const { return fLocalTrigger & 0xFF;       }
     114           0 :   Int_t    LoStripX(void) const  { return fLocalTrigger >>  8 & 0x1F; }
     115           0 :   Int_t    LoStripY(void) const  { return fLocalTrigger >> 13 & 0x0F; }
     116          32 :   Int_t    LoDev(void)    const  { return fLocalTrigger >> 17 & 0x1F; }
     117         104 :   Int_t    LoLpt(void)    const  { return fLocalTrigger >> 22 & 0x03; }
     118          52 :   Int_t    LoHpt(void)    const  { return fLocalTrigger >> 24 & 0x03; }
     119           0 :   Int_t    GetTriggerWithoutChamber(void) const { return fLocalTrigger >> 26 & 0xF; }
     120           0 :   Bool_t TriggerFiredWithoutChamber(Int_t ich) const { return GetTriggerWithoutChamber() >> (3 - ich) & 0x1; }
     121             :   Int_t GetMuonTrigDevSign() const;
     122             : 
     123             :   // Get and Set methods for the hit strips pattern in the trigger chambers
     124           0 :   UShort_t GetTriggerX1Pattern() const { return fX1Pattern; }
     125           0 :   UShort_t GetTriggerY1Pattern() const { return fY1Pattern; }
     126           0 :   UShort_t GetTriggerX2Pattern() const { return fX2Pattern; }
     127           0 :   UShort_t GetTriggerY2Pattern() const { return fY2Pattern; }
     128           0 :   UShort_t GetTriggerX3Pattern() const { return fX3Pattern; }
     129           0 :   UShort_t GetTriggerY3Pattern() const { return fY3Pattern; }
     130           0 :   UShort_t GetTriggerX4Pattern() const { return fX4Pattern; }
     131           0 :   UShort_t GetTriggerY4Pattern() const { return fY4Pattern; }
     132          36 :   void     SetTriggerX1Pattern(UShort_t pat) { fX1Pattern = pat; }
     133          36 :   void     SetTriggerY1Pattern(UShort_t pat) { fY1Pattern = pat; }
     134          36 :   void     SetTriggerX2Pattern(UShort_t pat) { fX2Pattern = pat; }
     135          36 :   void     SetTriggerY2Pattern(UShort_t pat) { fY2Pattern = pat; }
     136          36 :   void     SetTriggerX3Pattern(UShort_t pat) { fX3Pattern = pat; }
     137          36 :   void     SetTriggerY3Pattern(UShort_t pat) { fY3Pattern = pat; }
     138          36 :   void     SetTriggerX4Pattern(UShort_t pat) { fX4Pattern = pat; }
     139          36 :   void     SetTriggerY4Pattern(UShort_t pat) { fY4Pattern = pat; }
     140             : 
     141             :   // Get and Set methods for muon cluster map
     142           0 :   UInt_t   GetMuonClusterMap() const {return fMuonClusterMap;}
     143          32 :   void     SetMuonClusterMap(UInt_t muonClusterMap) {fMuonClusterMap = muonClusterMap;}
     144         324 :   void     AddInMuonClusterMap(Int_t chamber) {fMuonClusterMap |= BIT(chamber);}
     145           0 :   Bool_t   IsInMuonClusterMap(Int_t chamber) const {return (Bool_t) ((fMuonClusterMap & BIT(chamber)) != 0);}
     146             :   
     147             :   // Identify the tracks sharing cluster(s) with another (use the last bit of fMuonClusterMap)
     148          48 :   void     Connected(Bool_t flag = kTRUE) {flag ? SETBIT(fMuonClusterMap,31) : CLRBIT(fMuonClusterMap,31);}
     149           0 :   Bool_t   IsConnected() const {return TESTBIT(fMuonClusterMap,31);}
     150             :   
     151             :   // Methods to fill and get the Id of associated clusters
     152             :   void     AddClusterId(UInt_t clusterId);
     153           0 :   Int_t    GetNClusters() const {return static_cast<Int_t>(fNHit);}
     154           0 :   UInt_t   GetClusterId(Int_t i) const {return (fClustersId && i >= 0 && i < fNHit) ? static_cast<UInt_t>(fClustersId->At(i)) : 0;}
     155             :   
     156             :   // Method to transfer clusters to the new ESD structure
     157           0 :   Bool_t   IsOldTrack() {return (fClusters);}
     158             :   void     MoveClustersToESD(AliESDEvent &esd);
     159             :   
     160             :   // Methods to compute track momentum
     161             :   Double_t Px() const;
     162             :   Double_t Py() const;
     163             :   Double_t Pz() const;
     164             :   Double_t P() const;
     165           0 :   Bool_t   PxPyPz(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
     166             :   void     LorentzP(TLorentzVector& vP) const;
     167             :   Double_t PxAtDCA() const;
     168             :   Double_t PyAtDCA() const;
     169             :   Double_t PzAtDCA() const;
     170             :   Double_t PAtDCA() const;
     171           0 :   Bool_t   PxPyPzAtDCA(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
     172             :   void     LorentzPAtDCA(TLorentzVector& vP) const;
     173             :   Double_t PxUncorrected() const;
     174             :   Double_t PyUncorrected() const;
     175             :   Double_t PzUncorrected() const;
     176             :   Double_t PUncorrected() const;
     177           0 :   Bool_t   PxPyPzUncorrected(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
     178             :   void     LorentzPUncorrected(TLorentzVector& vP) const;
     179             :   
     180             :   // additional methods to comply with AliVParticle
     181           0 :   Double_t Xv() const {return -999.;} // put reasonable values here
     182           0 :   Double_t Yv() const {return -999.;} //
     183           0 :   Double_t Zv() const {return -999.;} //
     184           0 :   Bool_t   XvYvZv(Double_t x[3]) const { x[0] = Xv(); x[1] = Yv(); x[2] = Zv(); return kTRUE; }  
     185           0 :   Double_t Pt() const { return TMath::Sqrt(Px()*Px() + Py()*Py()); }
     186           0 :   Double_t OneOverPt() const { return (Pt() != 0.) ? 1./Pt() : FLT_MAX; }
     187           0 :   Double_t Phi() const { return TMath::Pi()+TMath::ATan2(-Py(), -Px()); }
     188           0 :   Double_t Theta() const { return TMath::ATan2(Pt(), Pz()); }
     189           0 :   Double_t E() const { return TMath::Sqrt(M()*M() + P()*P()); }
     190           0 :   Double_t M() const { return TDatabasePDG::Instance()->GetParticle("mu-")->Mass(); }
     191           0 :   Double_t Eta() const { return -TMath::Log(TMath::Tan(0.5 * Theta()));}
     192           0 :   Double_t Y() const { return (Pz()/E() != 1.) ? TMath::ATanH(Pz()/E()) : FLT_MAX; }
     193          64 :   Short_t  Charge() const { return (Short_t)TMath::Sign(1., GetInverseBendingMomentum()); }
     194             : 
     195             : 
     196             :   // Dummy
     197           0 :   const Double_t *PID() const { return (Double_t*)0x0; }
     198           0 :   Int_t    PdgCode() const {return 0;}
     199             :   
     200             :   /// Set the corresponding MC track number
     201          32 :   void  SetLabel(Int_t label) {fLabel = label;}
     202             :   /// Return the corresponding MC track number
     203          48 :   Int_t GetLabel() const {return fLabel;}
     204             : 
     205             :   /// Additional methods to decode hit pattern
     206             :   /// The hit pattern is a UShort_t with:
     207             :   /// <pre>
     208             :   ///   0    |   1 0 0 0 1  |  1 1  |   1  1  0  1  |   1  1  0  1   
     209             :   ///        |              |       |               | 
     210             :   /// unused |  RPC (0-17)  |  flag |  Bend plane   | Non-bend plane
     211             :   ///        |      or      |       | Match chamber | Match chamber
     212             :   ///        | further info |       |  11 12 13 14  |  11 12 13 14
     213             :   ///        |    (20-24)   |       |               |
     214             :   /// </pre>
     215             :   enum EAliTriggerChPatternFlag {
     216             :     kNoEff,    ///< Track is not good for chamber efficiency evaluation
     217             :     kChEff,    ///< Track crosses different RPCs
     218             :     kSlatEff,  ///< Track crosses the same RPC in all planes
     219             :     kBoardEff  ///< Track crosses the same board in all planes
     220             :   };
     221             :   enum EAliTriggerChPatternInfo {
     222             :     kCrossDifferentSlats  = 20, ///< The RPC cannot be univoquely determined
     223             :     kTrackMatchesManyPads = 21, ///< Track not good for effciency calculation since it matches many pads
     224             :     kTrackMatchesFewPads  = 22, ///< Track not good for effciency calculation since it matches pads in less than 3/4 chambers
     225             :     kTrackOutsideGeometry = 23, ///< Problems in pattern determination since track extrapolation is outside trigger chambers
     226             :     kTrackerTrackPattern  = 24, ///< The pattern was calculated from a tracker track not matching trigger track
     227             :     kTrackMatchesMasks    = 25  ///< Track not good for effciency calculation since it matches masked pads
     228             :   };
     229             :   /// Set hits pattern
     230             :   static void SetFiredChamber(UInt_t& pattern, Int_t cathode, Int_t chamber);
     231             :   /// Add efficiency flag and crossed RPC or info on rejected track
     232             :   static void AddEffInfo(UInt_t& pattern, Int_t slatOrInfo, Int_t board = 0, EAliTriggerChPatternFlag effType = kNoEff);
     233             :   /// Chamber was hit
     234             :   static Bool_t IsChamberHit(UInt_t pattern, Int_t cathode, Int_t chamber);
     235             :   /// Get Efficiency flag
     236             :   static Int_t GetEffFlag(UInt_t pattern);
     237             :   /// Getting crossed slat or info
     238             :   static Int_t GetSlatOrInfo(UInt_t pattern);
     239             :   /// Getting crossed board
     240             :   static Int_t GetCrossedBoard(UInt_t pattern);
     241             : 
     242             :   void AddMuonTrigDevSignInfo(UInt_t& pattern) const;
     243             : 
     244           0 :   AliESDEvent* GetESDEvent() const {return fESDEvent;}
     245         108 :   void         SetESDEvent(AliESDEvent* evt) {fESDEvent = evt;}  
     246             :   
     247             : protected:
     248             :   // parameters at vertex
     249             :   Double32_t fInverseBendingMomentum; ///< Inverse bending momentum (GeV/c ** -1) times the charge 
     250             :   Double32_t fThetaX;                 ///< Angle of track at vertex in X direction (rad)
     251             :   Double32_t fThetaY;                 ///< Angle of track at vertex in Y direction (rad)
     252             :   Double32_t fZ;                      ///< Z coordinate (cm)
     253             :   Double32_t fBendingCoor;            ///< bending coordinate (cm)
     254             :   Double32_t fNonBendingCoor;         ///< non bending coordinate (cm)
     255             :   
     256             :   // parameters at Distance of Closest Approach in the vertex plane
     257             :   Double32_t fInverseBendingMomentumAtDCA; ///< Inverse bending momentum (GeV/c ** -1) times the charge 
     258             :   Double32_t fThetaXAtDCA;                 ///< Angle of track at vertex in X direction (rad)
     259             :   Double32_t fThetaYAtDCA;                 ///< Angle of track at vertex in Y direction (rad)
     260             :   Double32_t fBendingCoorAtDCA;            ///< bending coordinate (cm)
     261             :   Double32_t fNonBendingCoorAtDCA;         ///< non bending coordinate (cm)
     262             :   
     263             :   // parameters at first tracking station
     264             :   Double32_t fInverseBendingMomentumUncorrected; ///< Inverse bending momentum (GeV/c ** -1) times the charge 
     265             :   Double32_t fThetaXUncorrected;                 ///< Angle of track at vertex in X direction (rad)
     266             :   Double32_t fThetaYUncorrected;                 ///< Angle of track at vertex in Y direction (rad)
     267             :   Double32_t fZUncorrected;                      ///< Z coordinate (cm)
     268             :   Double32_t fBendingCoorUncorrected;            ///< bending coordinate (cm)
     269             :   Double32_t fNonBendingCoorUncorrected;         ///< non bending coordinate (cm)
     270             :   
     271             :   /// reduced covariance matrix of UNCORRECTED track parameters, ordered as follow:      <pre>
     272             :   /// [0] =  <X,X>
     273             :   /// [1] =<X,ThetaX>  [2] =<ThetaX,ThetaX>
     274             :   /// [3] =  <X,Y>     [4] =  <Y,ThetaX>     [5] =  <Y,Y>
     275             :   /// [6] =<X,ThetaY>  [7] =<ThetaX,ThetaY>  [8] =<Y,ThetaY>  [9] =<ThetaY,ThetaY>
     276             :   /// [10]=<X,InvP_yz> [11]=<ThetaX,InvP_yz> [12]=<Y,InvP_yz> [13]=<ThetaY,InvP_yz> [14]=<InvP_yz,InvP_yz>  </pre>
     277             :   Double32_t fCovariances[15]; ///< \brief reduced covariance matrix of parameters AT FIRST CHAMBER
     278             :   
     279             :   Double32_t fRAtAbsorberEnd; ///< transverse position r of the track at the end of the absorber
     280             :   
     281             :   // global tracking info
     282             :   Double32_t fChi2;                ///< chi2 in the MUON track fit
     283             :   Double32_t fChi2MatchTrigger;    ///< chi2 of trigger/track matching
     284             :   Int_t      fLocalTrigger;        ///< packed local trigger information
     285             : 
     286             :   // hit strips pattern in the trigger chambers
     287             :   UShort_t fX1Pattern;             ///< x-strips pattern in st6/ch1
     288             :   UShort_t fY1Pattern;             ///< y-strips pattern in st6/ch1
     289             :   UShort_t fX2Pattern;             ///< x-strips pattern in st6/ch2
     290             :   UShort_t fY2Pattern;             ///< y-strips pattern in st6/ch2
     291             :   UShort_t fX3Pattern;             ///< x-strips pattern in st7/ch1
     292             :   UShort_t fY3Pattern;             ///< y-strips pattern in st7/ch1
     293             :   UShort_t fX4Pattern;             ///< x-strips pattern in st7/ch2
     294             :   UShort_t fY4Pattern;             ///< y-strips pattern in st7/ch2
     295             :   
     296             :   UInt_t   fMuonClusterMap;        ///< Map of clusters in tracking chambers
     297             :   UShort_t fHitsPatternInTrigCh;   ///< Word containing info on the hits left in trigger chambers
     298             :   UInt_t  fHitsPatternInTrigChTrk; ///< Trigger hit map from tracker track extrapolation
     299             :   UChar_t  fNHit;                  ///< number of clusters attached to the track
     300             :   
     301             :   mutable TClonesArray* fClusters; ///< Array of clusters attached to the track -- deprecated
     302             :   
     303             :   TArrayI* fClustersId;            ///< Array of clusters'Id attached to the track
     304             :   
     305             :   Int_t fLabel;                    ///< point to the corresponding MC track
     306             : 
     307             :   AliESDEvent*   fESDEvent; //!Pointer back to event to which the track belongs
     308             :   
     309         180 :   ClassDef(AliESDMuonTrack,15) // MUON ESD track class 
     310             : };
     311             : 
     312             : #endif 

Generated by: LCOV version 1.11