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