ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/DataTree/interface/Track.h
Revision: 1.42
Committed: Mon Jul 13 11:00:32 2009 UTC (15 years, 9 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.41: +1 -2 lines
Log Message:
Include files checked.

File Contents

# User Rev Content
1 loizides 1.1 //--------------------------------------------------------------------------------------------------
2 loizides 1.42 // $Id: Track.h,v 1.41 2009/04/28 10:05:57 pharris Exp $
3 loizides 1.1 //
4     // Track
5     //
6 bendavid 1.15 // 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 loizides 1.18 // (See http://cmslxr.fnal.gov/lxr/source/DataFormats/TrackReco/interface/TrackBase.h)
16 bendavid 1.15 //
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 bendavid 1.25 // (TIB L1,L2, TID L1,L2,L3, TOB L1,L2, TEC L1,L2,L3,L4,L5,L6,L7,L8,L9).
23 bendavid 1.15 //
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 loizides 1.16 // but muon chamber information will likely be added as well.
28 bendavid 1.15 //
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 loizides 1.16 // Bit 11: TID L1 r-phi
42 bendavid 1.15 // Bit 12: TID L1 stereo
43 loizides 1.16 // Bit 13: TID L2 r-phi
44 bendavid 1.15 // Bit 14: TID L2 stereo
45 loizides 1.16 // Bit 15: TID L3 r-phi
46 bendavid 1.23 // 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 loizides 1.1 //
74 loizides 1.5 // Authors: C.Loizides, J.Bendavid, C.Paus
75 loizides 1.1 //--------------------------------------------------------------------------------------------------
76 loizides 1.7
77 loizides 1.17 #ifndef MITANA_DATATREE_TRACK_H
78     #define MITANA_DATATREE_TRACK_H
79 paus 1.6
80 loizides 1.36 #include "MitAna/DataCont/interface/BitMask.h"
81 loizides 1.35 #include "MitAna/DataTree/interface/BaseVertex.h"
82 paus 1.6 #include "MitAna/DataTree/interface/DataObject.h"
83 loizides 1.35 #include "MitAna/DataTree/interface/MCParticle.h"
84 bendavid 1.27 #include "MitAna/DataTree/interface/SuperCluster.h"
85 loizides 1.1
86     namespace mithep
87     {
88     class Track : public DataObject
89     {
90     public:
91 loizides 1.18 enum EHitLayer {
92     PXB1,
93     PXB2,
94     PXB3,
95     PXF1,
96     PXF2,
97     TIB1,
98     TIB1S,
99     TIB2,
100     TIB2S,
101     TIB3,
102     TIB4,
103     TID1,
104     TID1S,
105     TID2,
106     TID2S,
107     TID3,
108 bendavid 1.23 TID3S,
109 loizides 1.18 TOB1,
110     TOB1S,
111     TOB2,
112     TOB2S,
113     TOB3,
114     TOB4,
115     TOB5,
116     TOB6,
117     TEC1,
118     TEC1S,
119     TEC2,
120     TEC2S,
121     TEC3,
122 bendavid 1.23 TEC3S,
123 loizides 1.18 TEC4,
124 bendavid 1.23 TEC4S,
125 loizides 1.18 TEC5,
126     TEC5S,
127     TEC6,
128 bendavid 1.23 TEC6S,
129 loizides 1.18 TEC7,
130 bendavid 1.23 TEC7S,
131 loizides 1.18 TEC8,
132 bendavid 1.23 TEC8S,
133     TEC9,
134     TEC9S
135 loizides 1.18 };
136    
137 bendavid 1.15 Track() : fQOverP(0), fQOverPErr(0), fLambda(0), fLambdaErr(0),
138     fPhi0(0), fPhi0Err(0), fDxy(0), fDxyErr(0), fDsz(0), fDszErr(0),
139 bendavid 1.27 fChi2(0), fNdof(0), fEtaEcal(0), fPhiEcal(0) {}
140 bendavid 1.15 Track(Double_t qOverP, Double_t lambda, Double_t phi0, Double_t dxy, Double_t dsz) :
141     fQOverP(qOverP), fQOverPErr(0), fLambda(lambda), fLambdaErr(0),
142     fPhi0(phi0), fPhi0Err(0), fDxy(dxy), fDxyErr(0), fDsz(dsz), fDszErr(0),
143 bendavid 1.27 fChi2(0), fNdof(0), fEtaEcal(0), fPhiEcal(0) {}
144 loizides 1.1 ~Track() {}
145    
146 loizides 1.34 Int_t Charge() const { return (fQOverP>0) ? 1 : -1; }
147     Double_t Chi2() const { return fChi2; }
148     void ClearHit(EHitLayer l) { fHits.ClearBit(l); }
149     Double_t D0() const { return -fDxy; }
150     Double_t D0Corrected(const BaseVertex &iVertex) const;
151     Double_t D0Err() const { return fDxyErr; }
152     Double_t Dsz() const { return fDsz; }
153     Double_t DszErr() const { return fDszErr; }
154     Double_t Dxy() const { return fDxy; }
155     Double_t DxyErr() const { return fDxyErr; }
156     Double_t E(Double_t m) const { return TMath::Sqrt(E2(m)); }
157     Double_t E2(Double_t m) const { return P2()+m*m; }
158     Double_t Eta() const { return Mom().Eta(); }
159     Double_t EtaEcal() const { return fEtaEcal; }
160     Bool_t Hit(EHitLayer l) const { return fHits.TestBit(l); }
161     const BitMask48 &Hits() const { return fHits; }
162     Double_t Lambda() const { return fLambda; }
163     Double_t LambdaErr() const { return fLambdaErr; }
164     const MCParticle *MCPart() const { return fMCParticleRef.Obj(); }
165     const ThreeVectorC &Mom() const;
166 pharris 1.41 FourVectorM Mom4(Double_t m) const { return FourVectorM(Pt(),Eta(),Phi(),m); }
167 loizides 1.38 UShort_t Ndof() const { return fNdof; }
168 loizides 1.34 UInt_t NHits() const { return fHits.NBitsSet(); }
169     UInt_t NStereoHits() const { return StereoHits().NBitsSet(); }
170     EObjType ObjType() const { return kTrack; }
171     Double_t P2() const { return 1./fQOverP/fQOverP; }
172     Double_t P() const { return TMath::Abs(1./fQOverP); }
173     Double_t Phi() const { return fPhi0; }
174     Double_t Phi0() const { return fPhi0; }
175     Double_t Phi0Err() const { return fPhi0Err; }
176     Double_t PhiEcal() const { return fPhiEcal; }
177     Double_t Prob() const { return TMath::Prob(fChi2,fNdof); }
178     Double_t Pt() const { return Mom().Rho(); }
179     Double_t Px() const { return Mom().X(); }
180     Double_t Py() const { return Mom().Y(); }
181     Double_t Pz() const { return Mom().Z(); }
182     Double_t QOverP() const { return fQOverP; }
183     Double_t QOverPErr() const { return fQOverPErr; }
184 loizides 1.37 Double_t RChi2() const { return fChi2/(Double_t)fNdof; }
185 loizides 1.34 Double_t Theta() const { return (TMath::PiOver2() - fLambda); }
186     const SuperCluster *SCluster() const { return fSuperClusterRef.Obj(); }
187     const BitMask48 StereoHits() const { return (fHits & StereoLayers()); }
188     void SetChi2(Double_t chi2) { fChi2 = chi2; }
189     void SetErrors(Double_t qOverPErr, Double_t lambdaErr, Double_t phi0Err,
190     Double_t dXyErr, Double_t dSzErr);
191     void SetEtaEcal(Double_t eta) { fEtaEcal = eta; }
192     void SetHelix (Double_t qOverP, Double_t lambda, Double_t phi0,
193     Double_t dXy, Double_t dSz);
194     void SetHit(EHitLayer l) { fHits.SetBit(l); }
195     void SetHits(const BitMask48 &hits) { fHits = hits; }
196 loizides 1.38 void SetNdof(UShort_t dof) { fNdof = dof; }
197 loizides 1.34 void SetMCPart(const MCParticle *p) { fMCParticleRef = p; }
198     void SetPhiEcal(Double_t phi) { fPhiEcal = phi; }
199     void SetSCluster(const SuperCluster* sc) { fSuperClusterRef = sc; }
200 loizides 1.37 Double_t Z0() const { return fDsz/TMath::Cos(fLambda); }
201 loizides 1.30
202     static
203 loizides 1.34 const BitMask48 StereoLayers();
204 loizides 1.18
205 paus 1.4 protected:
206 loizides 1.34 void ClearMom() const { fCacheMomFlag.ClearCache(); }
207     void GetMom() const;
208    
209     BitMask48 fHits; //storage for mostly hit information
210 loizides 1.38 Double32_t fQOverP; //[0,0,14]signed inverse of momentum [1/GeV]
211     Double32_t fQOverPErr; //[0,0,14]error of q/p
212     Double32_t fLambda; //[0,0,14]pi/2 - polar angle at the reference point
213     Double32_t fLambdaErr; //[0,0,14]error of lambda
214     Double32_t fPhi0; //[0,0,14]azimuth angle at the given point
215     Double32_t fPhi0Err; //[0,0,14]error of azimuthal angle
216     Double32_t fDxy; //[0,0,14]trans. distance to reference point [cm]
217     Double32_t fDxyErr; //[0,0,14]error of transverse distance
218     Double32_t fDsz; //[0,0,14]long. distance to reference point [cm]
219     Double32_t fDszErr; //[0,0,14]error of longitudinal distance
220     Double32_t fChi2; //[0,0,12]chi squared of track fit
221     UShort_t fNdof; //degree-of-freedom of track fit
222 loizides 1.40 Double32_t fEtaEcal; //[0,0,12]eta of track at Ecal front face
223     Double32_t fPhiEcal; //[0,0,12]phi of track at Ecal front face
224 loizides 1.34 Ref<SuperCluster> fSuperClusterRef; //superCluster crossed by track
225     Ref<MCParticle> fMCParticleRef; //reference to sim particle (for monte carlo)
226     mutable CacheFlag fCacheMomFlag; //||cache validity flag for momentum
227     mutable ThreeVectorC fCachedMom; //!cached momentum vector
228 loizides 1.5
229 loizides 1.34 ClassDef(Track, 1) // Track class
230 loizides 1.1 };
231 loizides 1.5 }
232 loizides 1.1
233 loizides 1.5 //--------------------------------------------------------------------------------------------------
234 loizides 1.34 inline void mithep::Track::GetMom() const
235     {
236     // Compute three momentum.
237    
238     Double_t pt = TMath::Abs(TMath::Cos(fLambda)/fQOverP);
239     Double_t eta = - TMath::Log(TMath::Tan(Theta()/2.));
240     fCachedMom.SetCoordinates(pt,eta,Phi());
241     }
242    
243     //--------------------------------------------------------------------------------------------------
244     inline const mithep::ThreeVectorC &mithep::Track::Mom() const
245     {
246     // Return cached momentum value.
247    
248     if (!fCacheMomFlag.IsValid()) {
249     GetMom();
250     fCacheMomFlag.SetValid();
251     }
252     return fCachedMom;
253     }
254    
255     //--------------------------------------------------------------------------------------------------
256     inline Double_t mithep::Track::D0Corrected(const BaseVertex &iVertex) const
257 bendavid 1.28 {
258 loizides 1.30 // Return corrected d0 with respect to primary vertex or beamspot.
259 bendavid 1.28
260     Double_t lXM = -TMath::Sin(Phi()) * D0();
261     Double_t lYM = TMath::Cos(Phi()) * D0();
262 loizides 1.34 Double_t lDX = (lXM + iVertex.X());
263     Double_t lDY = (lYM + iVertex.Y());
264 bendavid 1.28 Double_t d0Corr = (Px()*lDY - Py()*lDX)/Pt();
265    
266     return d0Corr;
267     }
268    
269     //--------------------------------------------------------------------------------------------------
270 paus 1.4 inline
271 bendavid 1.15 void mithep::Track::SetHelix(Double_t qOverP, Double_t lambda, Double_t phi0,
272 loizides 1.39 Double_t dxy, Double_t dsz)
273 loizides 1.5 {
274 loizides 1.13 // Set helix parameters.
275    
276 bendavid 1.15 fQOverP = qOverP;
277     fLambda = lambda;
278     fPhi0 = phi0;
279     fDxy = dxy;
280     fDsz = dsz;
281 loizides 1.34 ClearMom();
282 paus 1.4 }
283    
284 loizides 1.5 //--------------------------------------------------------------------------------------------------
285 paus 1.4 inline
286 bendavid 1.15 void mithep::Track::SetErrors(Double_t qOverPErr, Double_t lambdaErr, Double_t phi0Err,
287 loizides 1.39 Double_t dxyErr, Double_t dszErr)
288 loizides 1.5 {
289 loizides 1.13 // Set helix errors.
290    
291 bendavid 1.15 fQOverPErr = qOverPErr;
292     fLambdaErr = lambdaErr;
293     fPhi0Err = phi0Err;
294     fDxyErr = dxyErr;
295     fDszErr = dszErr;
296 paus 1.4 }
297 loizides 1.13
298     //--------------------------------------------------------------------------------------------------
299     inline
300 bendavid 1.27 const mithep::BitMask48 mithep::Track::StereoLayers()
301 bendavid 1.26 {
302 loizides 1.35 // Build and return BitMask of stereo layers.
303 bendavid 1.26
304     mithep::BitMask48 stereoLayers;
305     stereoLayers.SetBit(mithep::Track::TIB1S);
306     stereoLayers.SetBit(mithep::Track::TIB2S);
307     stereoLayers.SetBit(mithep::Track::TID1S);
308     stereoLayers.SetBit(mithep::Track::TID2S);
309     stereoLayers.SetBit(mithep::Track::TID3S);
310     stereoLayers.SetBit(mithep::Track::TOB1S);
311     stereoLayers.SetBit(mithep::Track::TOB2S);
312     stereoLayers.SetBit(mithep::Track::TEC1S);
313     stereoLayers.SetBit(mithep::Track::TEC2S);
314     stereoLayers.SetBit(mithep::Track::TEC3S);
315     stereoLayers.SetBit(mithep::Track::TEC4S);
316     stereoLayers.SetBit(mithep::Track::TEC5S);
317     stereoLayers.SetBit(mithep::Track::TEC6S);
318     stereoLayers.SetBit(mithep::Track::TEC7S);
319     stereoLayers.SetBit(mithep::Track::TEC8S);
320     stereoLayers.SetBit(mithep::Track::TEC9S);
321     return stereoLayers;
322     }
323 loizides 1.5 #endif