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