ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/DataTree/interface/Track.h
Revision: 1.30
Committed: Thu Dec 4 07:22:57 2008 UTC (16 years, 5 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.29: +78 -77 lines
Log Message:
Coding conventions.

File Contents

# Content
1 //--------------------------------------------------------------------------------------------------
2 // $Id: Track.h,v 1.29 2008/12/03 16:58:17 bendavid Exp $
3 //
4 // Track
5 //
6 // We store the CMSSW track parameterization
7 // Parameters associated to the 5D curvilinear covariance matrix:
8 // (qoverp, lambda, phi, dxy, dsz)
9 // defined as:
10 // qoverp = q / abs(p) = signed inverse of momentum [1/GeV]
11 // lambda = pi/2 - polar angle at the given point
12 // phi = azimuth angle at the given point
13 // dxy = -vx*sin(phi) + vy*cos(phi) [cm]
14 // dsz = vz*cos(lambda) - (vx*cos(phi)+vy*sin(phi))*sin(lambda) [cm]
15 // (See http://cmslxr.fnal.gov/lxr/source/DataFormats/TrackReco/interface/TrackBase.h)
16 //
17 // Format for fHits: (We do not use anything resembling reco::HitPattern from CMSSW because that
18 // data format requires 800 bits per track!)
19 // There is a one to one mapping between bits and tracker layers, where layers are enumerated
20 // seperately in the PXB, PXF, TIB, TID, TOB, TEC and r-phi and stereo modules are treated as
21 // seperate layers in those detectors which have them
22 // (TIB L1,L2, TID L1,L2,L3, TOB L1,L2, TEC L1,L2,L3,L4,L5,L6,L7,L8,L9).
23 //
24 // A bit value of 1 indicates a hit in the corresponding layer, and 0 indicates no hit.
25 //
26 // Note that currently this only stores information about hits in the Tracker,
27 // but muon chamber information will likely be added as well.
28 //
29 // Bit-Layer assignments (starting from bit 0):
30 // Bit 0: PXB L1
31 // Bit 1: PXB L2
32 // Bit 2: PXB L3
33 // Bit 3: PXF L1
34 // Bit 4: PXF L2
35 // Bit 5: TIB L1 r-phi
36 // Bit 6: TIB L1 stereo
37 // Bit 7: TIB L2 r-phi
38 // Bit 8: TIB L2 stereo
39 // Bit 9: TIB L3 r-phi
40 // Bit 10: TIB L4 r-phi
41 // Bit 11: TID L1 r-phi
42 // Bit 12: TID L1 stereo
43 // Bit 13: TID L2 r-phi
44 // Bit 14: TID L2 stereo
45 // Bit 15: TID L3 r-phi
46 // Bit 16: TID L3 stereo
47 // Bit 17: TOB L1 r-phi
48 // Bit 18: TOB L1 stereo
49 // Bit 19: TOB L2 r-phi
50 // Bit 20: TOB L2 stereo
51 // Bit 21: TOB L3 r-phi
52 // Bit 22: TOB L4 r-phi
53 // Bit 23: TOB L5 r-phi
54 // Bit 24: TOB L6 r-phi
55 // Bit 25: TEC L1 r-phi
56 // Bit 26: TEC L1 stereo
57 // Bit 27: TEC L2 r-phi
58 // Bit 28: TEC L2 stereo
59 // Bit 29: TEC L3 r-phi
60 // Bit 30: TEC L3 stereo
61 // Bit 31: TEC L4 r-phi
62 // Bit 32: TEC L4 stereo
63 // Bit 33: TEC L5 r-phi
64 // Bit 34: TEC L5 stereo
65 // Bit 35: TEC L6 r-phi
66 // Bit 36: TEC L6 stereo
67 // Bit 37: TEC L7 r-phi
68 // Bit 38: TEC L7 stereo
69 // Bit 39: TEC L8 r-phi
70 // Bit 40: TEC L8 stereo
71 // Bit 41: TEC L9 r-phi
72 // Bit 42: TEC L9 stereo
73 //
74 // Authors: C.Loizides, J.Bendavid, C.Paus
75 //--------------------------------------------------------------------------------------------------
76
77 #ifndef MITANA_DATATREE_TRACK_H
78 #define MITANA_DATATREE_TRACK_H
79
80 #include "MitAna/DataTree/interface/DataObject.h"
81 #include "MitAna/DataTree/interface/SuperCluster.h"
82 #include "MitAna/DataTree/interface/MCParticle.h"
83 #include "MitAna/DataTree/interface/BitMask.h"
84 #include "MitAna/DataTree/interface/BaseVertex.h"
85 #include "MitAna/DataTree/interface/Types.h"
86
87 namespace mithep
88 {
89 class Track : public DataObject
90 {
91 public:
92 enum EHitLayer {
93 PXB1,
94 PXB2,
95 PXB3,
96 PXF1,
97 PXF2,
98 TIB1,
99 TIB1S,
100 TIB2,
101 TIB2S,
102 TIB3,
103 TIB4,
104 TID1,
105 TID1S,
106 TID2,
107 TID2S,
108 TID3,
109 TID3S,
110 TOB1,
111 TOB1S,
112 TOB2,
113 TOB2S,
114 TOB3,
115 TOB4,
116 TOB5,
117 TOB6,
118 TEC1,
119 TEC1S,
120 TEC2,
121 TEC2S,
122 TEC3,
123 TEC3S,
124 TEC4,
125 TEC4S,
126 TEC5,
127 TEC5S,
128 TEC6,
129 TEC6S,
130 TEC7,
131 TEC7S,
132 TEC8,
133 TEC8S,
134 TEC9,
135 TEC9S
136 };
137
138 Track() : fQOverP(0), fQOverPErr(0), fLambda(0), fLambdaErr(0),
139 fPhi0(0), fPhi0Err(0), fDxy(0), fDxyErr(0), fDsz(0), fDszErr(0),
140 fChi2(0), fNdof(0), fEtaEcal(0), fPhiEcal(0) {}
141 Track(Double_t qOverP, Double_t lambda, Double_t phi0, Double_t dxy, Double_t dsz) :
142 fQOverP(qOverP), fQOverPErr(0), fLambda(lambda), fLambdaErr(0),
143 fPhi0(phi0), fPhi0Err(0), fDxy(dxy), fDxyErr(0), fDsz(dsz), fDszErr(0),
144 fChi2(0), fNdof(0), fEtaEcal(0), fPhiEcal(0) {}
145 ~Track() {}
146
147 Int_t Charge() const { return (fQOverP>0) ? 1 : -1; }
148 Double_t Chi2() const { return fChi2; }
149 Double_t RChi2() const { return fChi2/(Double_t)fNdof; }
150 void ClearHit(EHitLayer l) { fHits.ClearBit(l); }
151 Double_t D0() const { return -fDxy; }
152 Double_t D0Corrected(const BaseVertex *iVertex) const;
153 Double_t D0Err() const { return fDxyErr; }
154 Double_t Dsz() const { return fDsz; }
155 Double_t DszErr() const { return fDszErr; }
156 Double_t Dxy() const { return fDxy; }
157 Double_t DxyErr() const { return fDxyErr; }
158 Double_t E(Double_t m) const { return TMath::Sqrt(E2(m)); }
159 Double_t E2(Double_t m) const { return P2()+m*m; }
160 Double_t Eta() const { return Mom().Eta(); }
161 Double_t EtaEcal() const { return fEtaEcal; }
162 Bool_t Hit(EHitLayer l) const { return fHits.TestBit(l); }
163 const BitMask48 &Hits() const { return fHits; }
164 Double_t Lambda() const { return fLambda; }
165 Double_t LambdaErr() const { return fLambdaErr; }
166 const MCParticle *MCPart() const;
167 ThreeVector Mom() const { return ThreeVector(Px(),Py(),Pz()); }
168 FourVector Mom4(Double_t m) const { return FourVector(Px(),Py(),Pz(),E(m)); }
169 UInt_t Ndof() const { return fNdof; }
170 UInt_t NHits() const { return fHits.NBitsSet(); }
171 UInt_t NStereoHits() const { return StereoHits().NBitsSet(); }
172 Double_t P2() const { return P()*P(); }
173 Double_t P() const { return TMath::Abs(1./fQOverP); }
174 Double_t Phi() const { return fPhi0; }
175 Double_t Phi0() const { return fPhi0; }
176 Double_t Phi0Err() const { return fPhi0Err; }
177 Double_t PhiEcal() const { return fPhiEcal; }
178 Double_t Prob() const { return TMath::Prob(fChi2,fNdof); }
179 Double_t Pt() const { return TMath::Abs(TMath::Cos(fLambda)/fQOverP); }
180 Double_t Px() const { return Pt()*TMath::Cos(fPhi0); }
181 Double_t Py() const { return Pt()*TMath::Sin(fPhi0); }
182 Double_t Pz() const { return P()*TMath::Sin(fLambda); }
183 Double_t QOverP() const { return fQOverP; }
184 Double_t QOverPErr() const { return fQOverPErr; }
185 Double_t Theta() const { return (TMath::PiOver2() - fLambda); }
186 Double_t Z0() const { return fDsz/TMath::Cos(fLambda); }
187 const SuperCluster *SCluster() const;
188 const BitMask48 StereoHits() const { return (fHits & StereoLayers()); }
189 void SetChi2(Double_t chi2) { fChi2 = chi2; }
190 void SetErrors(Double_t qOverPErr, Double_t lambdaErr, Double_t phi0Err,
191 Double_t dXyErr, Double_t dSzErr);
192 void SetEtaEcal(Double_t eta) { fEtaEcal = eta; }
193 void SetHelix (Double_t qOverP, Double_t lambda, Double_t phi0,
194 Double_t dXy, Double_t dSz);
195 void SetHit(EHitLayer l) { fHits.SetBit(l); }
196 void SetHits(const BitMask48 &hits) { fHits = hits; }
197 void SetNdof(UInt_t dof) { fNdof = dof; }
198 void SetMCPart(const MCParticle *p)
199 { fMCParticleRef = const_cast<MCParticle*>(p); }
200 void SetPhiEcal(Double_t phi) { fPhiEcal = phi; }
201 void SetSCluster(const SuperCluster* sc)
202 { fSuperClusterRef = const_cast<SuperCluster*>(sc); }
203
204 static
205 const BitMask48 StereoLayers();
206
207 protected:
208 BitMask48 fHits; //storage for mostly hit information
209 Double_t fQOverP; //signed inverse of momentum [1/GeV]
210 Double_t fQOverPErr; //error of q/p
211 Double_t fLambda; //pi/2 - polar angle at the reference point
212 Double_t fLambdaErr; //error of lambda
213 Double_t fPhi0; //azimuth angle at the given point
214 Double_t fPhi0Err; //error of azimuthal angle
215 Double_t fDxy; //transverse distance to reference point [cm]
216 Double_t fDxyErr; //error of transverse distance
217 Double_t fDsz; //longitudinal distance to reference point [cm]
218 Double_t fDszErr; //error of longitudinal distance
219 Double_t fChi2; //chi squared of track fit
220 UInt_t fNdof; //degree-of-freedom of track fit
221 Double32_t fEtaEcal; //eta of track at Ecal front face
222 Double32_t fPhiEcal; //phi of track at Ecal front face
223 TRef fSuperClusterRef; //superCluster crossed by track
224 TRef fMCParticleRef; //reference to sim particle (for monte carlo)
225
226 ClassDef(Track, 2) // Track class
227 };
228 }
229
230 //--------------------------------------------------------------------------------------------------
231 inline Double_t mithep::Track::D0Corrected(const BaseVertex *iVertex) const
232 {
233 // Return corrected d0 with respect to primary vertex or beamspot.
234
235 Double_t lXM = -TMath::Sin(Phi()) * D0();
236 Double_t lYM = TMath::Cos(Phi()) * D0();
237 Double_t lDX = (lXM + iVertex->X());
238 Double_t lDY = (lYM + iVertex->Y());
239 Double_t d0Corr = (Px()*lDY - Py()*lDX)/Pt();
240
241 return d0Corr;
242 }
243
244 //--------------------------------------------------------------------------------------------------
245 inline
246 void mithep::Track::SetHelix(Double_t qOverP, Double_t lambda, Double_t phi0,
247 Double_t dxy, Double_t dsz)
248 {
249 // Set helix parameters.
250
251 fQOverP = qOverP;
252 fLambda = lambda;
253 fPhi0 = phi0;
254 fDxy = dxy;
255 fDsz = dsz;
256 }
257
258 //--------------------------------------------------------------------------------------------------
259 inline
260 void mithep::Track::SetErrors(Double_t qOverPErr, Double_t lambdaErr, Double_t phi0Err,
261 Double_t dxyErr, Double_t dszErr)
262 {
263 // Set helix errors.
264
265 fQOverPErr = qOverPErr;
266 fLambdaErr = lambdaErr;
267 fPhi0Err = phi0Err;
268 fDxyErr = dxyErr;
269 fDszErr = dszErr;
270 }
271
272 //--------------------------------------------------------------------------------------------------
273 inline
274 const mithep::MCParticle *mithep::Track::MCPart() const
275 {
276 // Get reference to simulated particle.
277
278 return static_cast<const MCParticle*>(fMCParticleRef.GetObject());
279 }
280
281 //--------------------------------------------------------------------------------------------------
282 inline const mithep::SuperCluster *mithep::Track::SCluster() const
283 {
284 // Return Super cluster
285
286 return static_cast<const SuperCluster*>(fSuperClusterRef.GetObject());
287 }
288
289 //--------------------------------------------------------------------------------------------------
290 inline
291 const mithep::BitMask48 mithep::Track::StereoLayers()
292 {
293 // Build and return BitMask of stereo layers
294
295 mithep::BitMask48 stereoLayers;
296 stereoLayers.SetBit(mithep::Track::TIB1S);
297 stereoLayers.SetBit(mithep::Track::TIB2S);
298 stereoLayers.SetBit(mithep::Track::TID1S);
299 stereoLayers.SetBit(mithep::Track::TID2S);
300 stereoLayers.SetBit(mithep::Track::TID3S);
301 stereoLayers.SetBit(mithep::Track::TOB1S);
302 stereoLayers.SetBit(mithep::Track::TOB2S);
303 stereoLayers.SetBit(mithep::Track::TEC1S);
304 stereoLayers.SetBit(mithep::Track::TEC2S);
305 stereoLayers.SetBit(mithep::Track::TEC3S);
306 stereoLayers.SetBit(mithep::Track::TEC4S);
307 stereoLayers.SetBit(mithep::Track::TEC5S);
308 stereoLayers.SetBit(mithep::Track::TEC6S);
309 stereoLayers.SetBit(mithep::Track::TEC7S);
310 stereoLayers.SetBit(mithep::Track::TEC8S);
311 stereoLayers.SetBit(mithep::Track::TEC9S);
312 return stereoLayers;
313 }
314 #endif