ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/DataTree/interface/Track.h
Revision: 1.45
Committed: Thu Dec 10 15:02:59 2009 UTC (15 years, 4 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_012g, Mit_012f, Mit_012e
Changes since 1.44: +20 -3 lines
Log Message:
Add PixelHits functions

File Contents

# User Rev Content
1 loizides 1.1 //--------------------------------------------------------------------------------------------------
2 bendavid 1.45 // $Id: Track.h,v 1.44 2009/07/20 04:57:27 loizides 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 loizides 1.44 enum ETrackAlgorithm { //taken from DataFormats/TrackReco/interface/TrackBase.h
138 bendavid 1.43 undefAlgorithm=0,
139     ctf=1,
140     rs=2,
141     cosmics=3,
142     iter0=4,
143     iter1=5,
144     iter2=6,
145     iter3=7,
146     iter4=8,
147     iter5=9,
148     iter6=10,
149     iter7=11,
150     iter8=12,
151     iter9=13,
152     iter10=14,
153     outInEcalSeededConv=15,
154     inOutEcalSeededConv=16,
155     nuclInter=17,
156     standAloneMuon=18,
157     globalMuon=19,
158     cosmicStandAloneMuon=20,
159     cosmicGlobalMuon=21,
160     iter1LargeD0=22,
161     iter2LargeD0=23,
162     iter3LargeD0=24,
163     iter4LargeD0=25,
164     iter5LargeD0=26,
165     bTagGhostTracks=27,
166     beamhalo=28,
167     algoSize=29
168     };
169    
170    
171     Track() : fAlgo(undefAlgorithm), fIsGsf(0), fQOverP(0), fQOverPErr(0),
172     fLambda(0), fLambdaErr(0), fPhi0(0), fPhi0Err(0),
173     fDxy(0), fDxyErr(0), fDsz(0), fDszErr(0), fChi2(0),
174     fNdof(0), fEtaEcal(0), fPhiEcal(0) {}
175 bendavid 1.15 Track(Double_t qOverP, Double_t lambda, Double_t phi0, Double_t dxy, Double_t dsz) :
176 bendavid 1.43 fAlgo(undefAlgorithm), fIsGsf(0), fQOverP(qOverP), fQOverPErr(0),
177     fLambda(lambda), fLambdaErr(0), fPhi0(phi0), fPhi0Err(0),
178     fDxy(dxy), fDxyErr(0), fDsz(dsz), fDszErr(0), fChi2(0),
179     fNdof(0), fEtaEcal(0), fPhiEcal(0) {}
180 loizides 1.1 ~Track() {}
181    
182 bendavid 1.43 ETrackAlgorithm Algo() const { return fAlgo; }
183 loizides 1.34 Int_t Charge() const { return (fQOverP>0) ? 1 : -1; }
184     Double_t Chi2() const { return fChi2; }
185     void ClearHit(EHitLayer l) { fHits.ClearBit(l); }
186     Double_t D0() const { return -fDxy; }
187     Double_t D0Corrected(const BaseVertex &iVertex) const;
188     Double_t D0Err() const { return fDxyErr; }
189     Double_t Dsz() const { return fDsz; }
190     Double_t DszErr() const { return fDszErr; }
191     Double_t Dxy() const { return fDxy; }
192     Double_t DxyErr() const { return fDxyErr; }
193     Double_t E(Double_t m) const { return TMath::Sqrt(E2(m)); }
194     Double_t E2(Double_t m) const { return P2()+m*m; }
195     Double_t Eta() const { return Mom().Eta(); }
196     Double_t EtaEcal() const { return fEtaEcal; }
197     Bool_t Hit(EHitLayer l) const { return fHits.TestBit(l); }
198     const BitMask48 &Hits() const { return fHits; }
199 bendavid 1.43 Bool_t IsGsf() const { return fIsGsf; }
200 loizides 1.34 Double_t Lambda() const { return fLambda; }
201     Double_t LambdaErr() const { return fLambdaErr; }
202     const MCParticle *MCPart() const { return fMCParticleRef.Obj(); }
203     const ThreeVectorC &Mom() const;
204 pharris 1.41 FourVectorM Mom4(Double_t m) const { return FourVectorM(Pt(),Eta(),Phi(),m); }
205 loizides 1.38 UShort_t Ndof() const { return fNdof; }
206 loizides 1.34 UInt_t NHits() const { return fHits.NBitsSet(); }
207     UInt_t NStereoHits() const { return StereoHits().NBitsSet(); }
208 bendavid 1.45 UInt_t NPixelHits() const { return PixelHits().NBitsSet(); }
209 loizides 1.34 EObjType ObjType() const { return kTrack; }
210     Double_t P2() const { return 1./fQOverP/fQOverP; }
211     Double_t P() const { return TMath::Abs(1./fQOverP); }
212     Double_t Phi() const { return fPhi0; }
213     Double_t Phi0() const { return fPhi0; }
214     Double_t Phi0Err() const { return fPhi0Err; }
215     Double_t PhiEcal() const { return fPhiEcal; }
216     Double_t Prob() const { return TMath::Prob(fChi2,fNdof); }
217     Double_t Pt() const { return Mom().Rho(); }
218     Double_t Px() const { return Mom().X(); }
219     Double_t Py() const { return Mom().Y(); }
220     Double_t Pz() const { return Mom().Z(); }
221     Double_t QOverP() const { return fQOverP; }
222     Double_t QOverPErr() const { return fQOverPErr; }
223 loizides 1.37 Double_t RChi2() const { return fChi2/(Double_t)fNdof; }
224 loizides 1.34 Double_t Theta() const { return (TMath::PiOver2() - fLambda); }
225     const SuperCluster *SCluster() const { return fSuperClusterRef.Obj(); }
226 bendavid 1.45 const BitMask48 PixelHits() const { return (fHits & PixelLayers()); }
227 loizides 1.34 const BitMask48 StereoHits() const { return (fHits & StereoLayers()); }
228 bendavid 1.43 void SetAlgo(ETrackAlgorithm e) { fAlgo = e; }
229 loizides 1.34 void SetChi2(Double_t chi2) { fChi2 = chi2; }
230     void SetErrors(Double_t qOverPErr, Double_t lambdaErr, Double_t phi0Err,
231     Double_t dXyErr, Double_t dSzErr);
232     void SetEtaEcal(Double_t eta) { fEtaEcal = eta; }
233     void SetHelix (Double_t qOverP, Double_t lambda, Double_t phi0,
234     Double_t dXy, Double_t dSz);
235     void SetHit(EHitLayer l) { fHits.SetBit(l); }
236     void SetHits(const BitMask48 &hits) { fHits = hits; }
237 bendavid 1.43 void SetIsGsf(Bool_t b) { fIsGsf = b; }
238 loizides 1.38 void SetNdof(UShort_t dof) { fNdof = dof; }
239 loizides 1.34 void SetMCPart(const MCParticle *p) { fMCParticleRef = p; }
240     void SetPhiEcal(Double_t phi) { fPhiEcal = phi; }
241     void SetSCluster(const SuperCluster* sc) { fSuperClusterRef = sc; }
242 loizides 1.37 Double_t Z0() const { return fDsz/TMath::Cos(fLambda); }
243 loizides 1.30
244 bendavid 1.45
245     static const BitMask48 StereoLayers();
246     static const BitMask48 PixelLayers();
247 loizides 1.18
248 paus 1.4 protected:
249 loizides 1.34 void ClearMom() const { fCacheMomFlag.ClearCache(); }
250     void GetMom() const;
251    
252     BitMask48 fHits; //storage for mostly hit information
253 bendavid 1.43 ETrackAlgorithm fAlgo; //track algorithm
254     Bool_t fIsGsf; //flag to identify gsf tracks
255 loizides 1.38 Double32_t fQOverP; //[0,0,14]signed inverse of momentum [1/GeV]
256     Double32_t fQOverPErr; //[0,0,14]error of q/p
257     Double32_t fLambda; //[0,0,14]pi/2 - polar angle at the reference point
258     Double32_t fLambdaErr; //[0,0,14]error of lambda
259     Double32_t fPhi0; //[0,0,14]azimuth angle at the given point
260     Double32_t fPhi0Err; //[0,0,14]error of azimuthal angle
261     Double32_t fDxy; //[0,0,14]trans. distance to reference point [cm]
262     Double32_t fDxyErr; //[0,0,14]error of transverse distance
263     Double32_t fDsz; //[0,0,14]long. distance to reference point [cm]
264     Double32_t fDszErr; //[0,0,14]error of longitudinal distance
265     Double32_t fChi2; //[0,0,12]chi squared of track fit
266     UShort_t fNdof; //degree-of-freedom of track fit
267 loizides 1.40 Double32_t fEtaEcal; //[0,0,12]eta of track at Ecal front face
268     Double32_t fPhiEcal; //[0,0,12]phi of track at Ecal front face
269 loizides 1.34 Ref<SuperCluster> fSuperClusterRef; //superCluster crossed by track
270     Ref<MCParticle> fMCParticleRef; //reference to sim particle (for monte carlo)
271     mutable CacheFlag fCacheMomFlag; //||cache validity flag for momentum
272     mutable ThreeVectorC fCachedMom; //!cached momentum vector
273 loizides 1.5
274 bendavid 1.43 ClassDef(Track, 2) // Track class
275 loizides 1.1 };
276 loizides 1.5 }
277 loizides 1.1
278 loizides 1.5 //--------------------------------------------------------------------------------------------------
279 loizides 1.34 inline void mithep::Track::GetMom() const
280     {
281     // Compute three momentum.
282    
283     Double_t pt = TMath::Abs(TMath::Cos(fLambda)/fQOverP);
284     Double_t eta = - TMath::Log(TMath::Tan(Theta()/2.));
285     fCachedMom.SetCoordinates(pt,eta,Phi());
286     }
287    
288     //--------------------------------------------------------------------------------------------------
289     inline const mithep::ThreeVectorC &mithep::Track::Mom() const
290     {
291     // Return cached momentum value.
292    
293     if (!fCacheMomFlag.IsValid()) {
294     GetMom();
295     fCacheMomFlag.SetValid();
296     }
297     return fCachedMom;
298     }
299    
300     //--------------------------------------------------------------------------------------------------
301     inline Double_t mithep::Track::D0Corrected(const BaseVertex &iVertex) const
302 bendavid 1.28 {
303 loizides 1.30 // Return corrected d0 with respect to primary vertex or beamspot.
304 bendavid 1.28
305     Double_t lXM = -TMath::Sin(Phi()) * D0();
306     Double_t lYM = TMath::Cos(Phi()) * D0();
307 loizides 1.34 Double_t lDX = (lXM + iVertex.X());
308     Double_t lDY = (lYM + iVertex.Y());
309 bendavid 1.28 Double_t d0Corr = (Px()*lDY - Py()*lDX)/Pt();
310    
311     return d0Corr;
312     }
313    
314     //--------------------------------------------------------------------------------------------------
315 loizides 1.44 inline void mithep::Track::SetHelix(Double_t qOverP, Double_t lambda, Double_t phi0,
316     Double_t dxy, Double_t dsz)
317 loizides 1.5 {
318 loizides 1.13 // Set helix parameters.
319    
320 bendavid 1.15 fQOverP = qOverP;
321     fLambda = lambda;
322     fPhi0 = phi0;
323     fDxy = dxy;
324     fDsz = dsz;
325 loizides 1.34 ClearMom();
326 paus 1.4 }
327    
328 loizides 1.5 //--------------------------------------------------------------------------------------------------
329 loizides 1.44 inline void mithep::Track::SetErrors(Double_t qOverPErr, Double_t lambdaErr, Double_t phi0Err,
330     Double_t dxyErr, Double_t dszErr)
331 loizides 1.5 {
332 loizides 1.13 // Set helix errors.
333    
334 bendavid 1.15 fQOverPErr = qOverPErr;
335     fLambdaErr = lambdaErr;
336     fPhi0Err = phi0Err;
337     fDxyErr = dxyErr;
338     fDszErr = dszErr;
339 paus 1.4 }
340 loizides 1.13
341     //--------------------------------------------------------------------------------------------------
342 loizides 1.44 inline const mithep::BitMask48 mithep::Track::StereoLayers()
343 bendavid 1.26 {
344 loizides 1.35 // Build and return BitMask of stereo layers.
345 bendavid 1.26
346     mithep::BitMask48 stereoLayers;
347     stereoLayers.SetBit(mithep::Track::TIB1S);
348     stereoLayers.SetBit(mithep::Track::TIB2S);
349     stereoLayers.SetBit(mithep::Track::TID1S);
350     stereoLayers.SetBit(mithep::Track::TID2S);
351     stereoLayers.SetBit(mithep::Track::TID3S);
352     stereoLayers.SetBit(mithep::Track::TOB1S);
353     stereoLayers.SetBit(mithep::Track::TOB2S);
354     stereoLayers.SetBit(mithep::Track::TEC1S);
355     stereoLayers.SetBit(mithep::Track::TEC2S);
356     stereoLayers.SetBit(mithep::Track::TEC3S);
357     stereoLayers.SetBit(mithep::Track::TEC4S);
358     stereoLayers.SetBit(mithep::Track::TEC5S);
359     stereoLayers.SetBit(mithep::Track::TEC6S);
360     stereoLayers.SetBit(mithep::Track::TEC7S);
361     stereoLayers.SetBit(mithep::Track::TEC8S);
362     stereoLayers.SetBit(mithep::Track::TEC9S);
363     return stereoLayers;
364     }
365 bendavid 1.45
366     //--------------------------------------------------------------------------------------------------
367     inline const mithep::BitMask48 mithep::Track::PixelLayers()
368     {
369     // Build and return BitMask of stereo layers.
370    
371     mithep::BitMask48 pixelLayers;
372     pixelLayers.SetBit(mithep::Track::PXB1);
373     pixelLayers.SetBit(mithep::Track::PXB2);
374     pixelLayers.SetBit(mithep::Track::PXB3);
375     pixelLayers.SetBit(mithep::Track::PXF1);
376     pixelLayers.SetBit(mithep::Track::PXF2);
377     return pixelLayers;
378     }
379 loizides 1.5 #endif