ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/DataTree/interface/Track.h
Revision: 1.28
Committed: Mon Nov 17 18:56:07 2008 UTC (16 years, 5 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_006
Changes since 1.27: +18 -1 lines
Log Message:
Added D0Corrected accessor for impact parameter wrt primary vertex or beamspot

File Contents

# User Rev Content
1 loizides 1.1 //--------------------------------------------------------------------------------------------------
2 bendavid 1.28 // $Id: Track.h,v 1.27 2008/11/03 11:21:11 bendavid 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     #include "MitAna/DataTree/interface/DataObject.h"
81 bendavid 1.27 #include "MitAna/DataTree/interface/SuperCluster.h"
82 bendavid 1.14 #include "MitAna/DataTree/interface/MCParticle.h"
83 loizides 1.18 #include "MitAna/DataTree/interface/BitMask.h"
84 bendavid 1.28 #include "MitAna/DataTree/interface/BaseVertex.h"
85 loizides 1.9 #include "MitAna/DataTree/interface/Types.h"
86 loizides 1.1
87     namespace mithep
88     {
89     class Track : public DataObject
90     {
91     public:
92 loizides 1.18 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 bendavid 1.23 TID3S,
110 loizides 1.18 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 bendavid 1.23 TEC3S,
124 loizides 1.18 TEC4,
125 bendavid 1.23 TEC4S,
126 loizides 1.18 TEC5,
127     TEC5S,
128     TEC6,
129 bendavid 1.23 TEC6S,
130 loizides 1.18 TEC7,
131 bendavid 1.23 TEC7S,
132 loizides 1.18 TEC8,
133 bendavid 1.23 TEC8S,
134     TEC9,
135     TEC9S
136 loizides 1.18 };
137    
138 bendavid 1.15 Track() : fQOverP(0), fQOverPErr(0), fLambda(0), fLambdaErr(0),
139     fPhi0(0), fPhi0Err(0), fDxy(0), fDxyErr(0), fDsz(0), fDszErr(0),
140 bendavid 1.27 fChi2(0), fNdof(0), fEtaEcal(0), fPhiEcal(0) {}
141 bendavid 1.15 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 bendavid 1.27 fChi2(0), fNdof(0), fEtaEcal(0), fPhiEcal(0) {}
145 loizides 1.1 ~Track() {}
146    
147 loizides 1.18 Int_t Charge() const { return (fQOverP>0) ? 1 : -1; }
148     Double_t Chi2() const { return fChi2; }
149 bendavid 1.20 Double_t RChi2() const { return fChi2/(Double_t)fNdof; }
150 loizides 1.18 void ClearHit(EHitLayer l) { fHits.ClearBit(l); }
151     Double_t D0() const { return -fDxy; }
152 bendavid 1.28 Double_t D0Corrected(const BaseVertex *iVertex) const;
153 loizides 1.18 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 sixie 1.21 Double_t Eta() const { return Mom().Eta(); }
161 bendavid 1.27 Double_t EtaEcal() const { return fEtaEcal; }
162 loizides 1.18 Bool_t Hit(EHitLayer l) const { return fHits.TestBit(l); }
163 bendavid 1.26 const BitMask48 &Hits() const { return fHits; }
164 loizides 1.18 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 bendavid 1.24 UInt_t NStereoHits() const { return StereoHits().NBitsSet(); }
172 loizides 1.18 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 bendavid 1.27 Double_t PhiEcal() const { return fPhiEcal; }
178 bendavid 1.19 Double_t Prob() const { return TMath::Prob(fChi2,fNdof); }
179 loizides 1.18 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     void SetChi2(Double_t chi2) { fChi2 = chi2; }
188     void SetErrors(Double_t qOverPErr, Double_t lambdaErr, Double_t phi0Err,
189     Double_t dXyErr, Double_t dSzErr);
190 bendavid 1.27 void SetEtaEcal(Double_t eta) { fEtaEcal = eta; }
191 bendavid 1.15 void SetHelix (Double_t qOverP, Double_t lambda, Double_t phi0,
192     Double_t dXy, Double_t dSz);
193 loizides 1.18 void SetHit(EHitLayer l) { fHits.SetBit(l); }
194 bendavid 1.26 void SetHits(const BitMask48 &hits) { fHits = hits; }
195 loizides 1.18 void SetNdof(UInt_t dof) { fNdof = dof; }
196     void SetMCPart(MCParticle *p) { fMCParticleRef = p; }
197 bendavid 1.27 void SetPhiEcal(Double_t phi) { fPhiEcal = phi; }
198     void SetSCluster(SuperCluster* sc) { fSuperClusterRef = sc; }
199     const SuperCluster *SCluster() const;
200 bendavid 1.26 const BitMask48 StereoHits() const { return (fHits & StereoLayers()); }
201 bendavid 1.27 static const BitMask48 StereoLayers();
202 loizides 1.18
203 paus 1.4 protected:
204 bendavid 1.26 BitMask48 fHits; //storage for mostly hit information
205 loizides 1.18 Double_t fQOverP; //signed inverse of momentum [1/GeV]
206     Double_t fQOverPErr; //error of q/p
207     Double_t fLambda; //pi/2 - polar angle at the reference point
208     Double_t fLambdaErr; //error of lambda
209     Double_t fPhi0; //azimuth angle at the given point
210     Double_t fPhi0Err; //error of azimuthal angle
211     Double_t fDxy; //transverse distance to reference point [cm]
212     Double_t fDxyErr; //error of transverse distance
213     Double_t fDsz; //longitudinal distance to reference point [cm]
214     Double_t fDszErr; //error of longitudinal distance
215 loizides 1.17 Double_t fChi2; //chi squared of track fit
216 loizides 1.18 UInt_t fNdof; //degree-of-freedom of track fit
217 bendavid 1.27 Double32_t fEtaEcal; //Eta of track at Ecal front face
218     Double32_t fPhiEcal; //phi of track at Ecal front face
219     TRef fSuperClusterRef; //superCluster crossed by track
220 loizides 1.17 TRef fMCParticleRef; //reference to sim particle (for monte carlo)
221 loizides 1.5
222 bendavid 1.27 ClassDef(Track, 2) // Track class
223 loizides 1.1 };
224 loizides 1.5 }
225 loizides 1.1
226 loizides 1.5 //--------------------------------------------------------------------------------------------------
227 bendavid 1.28 inline Double_t mithep::Track::D0Corrected(const BaseVertex *iVertex) const
228     {
229     // Return corrected d0 with respect to primary vertex or beamspot
230    
231     Double_t lXM = -TMath::Sin(Phi()) * D0();
232     Double_t lYM = TMath::Cos(Phi()) * D0();
233     Double_t lDX = (lXM + iVertex->X());
234     Double_t lDY = (lYM + iVertex->Y());
235     Double_t d0Corr = (Px()*lDY - Py()*lDX)/Pt();
236    
237     return d0Corr;
238    
239     }
240    
241     //--------------------------------------------------------------------------------------------------
242 paus 1.4 inline
243 bendavid 1.15 void mithep::Track::SetHelix(Double_t qOverP, Double_t lambda, Double_t phi0,
244     Double_t dxy, Double_t dsz)
245 loizides 1.5 {
246 loizides 1.13 // Set helix parameters.
247    
248 bendavid 1.15 fQOverP = qOverP;
249     fLambda = lambda;
250     fPhi0 = phi0;
251     fDxy = dxy;
252     fDsz = dsz;
253 paus 1.4 }
254    
255 loizides 1.5 //--------------------------------------------------------------------------------------------------
256 paus 1.4 inline
257 bendavid 1.15 void mithep::Track::SetErrors(Double_t qOverPErr, Double_t lambdaErr, Double_t phi0Err,
258     Double_t dxyErr, Double_t dszErr)
259 loizides 1.5 {
260 loizides 1.13 // Set helix errors.
261    
262 bendavid 1.15 fQOverPErr = qOverPErr;
263     fLambdaErr = lambdaErr;
264     fPhi0Err = phi0Err;
265     fDxyErr = dxyErr;
266     fDszErr = dszErr;
267 paus 1.4 }
268 loizides 1.13
269     //--------------------------------------------------------------------------------------------------
270     inline
271 bendavid 1.14 const mithep::MCParticle *mithep::Track::MCPart() const
272 loizides 1.13 {
273     // Get reference to simulated particle.
274    
275 bendavid 1.14 return static_cast<const MCParticle*>(fMCParticleRef.GetObject());
276 loizides 1.13 }
277 bendavid 1.26
278     //--------------------------------------------------------------------------------------------------
279 bendavid 1.27 inline const mithep::SuperCluster *mithep::Track::SCluster() const
280     {
281     // Return Super cluster
282    
283     return static_cast<const SuperCluster*>(fSuperClusterRef.GetObject());
284     }
285    
286     //--------------------------------------------------------------------------------------------------
287 bendavid 1.26 inline
288 bendavid 1.27 const mithep::BitMask48 mithep::Track::StereoLayers()
289 bendavid 1.26 {
290     // Build and return BitMask of stereo layers
291    
292     mithep::BitMask48 stereoLayers;
293    
294     stereoLayers.SetBit(mithep::Track::TIB1S);
295     stereoLayers.SetBit(mithep::Track::TIB2S);
296     stereoLayers.SetBit(mithep::Track::TID1S);
297     stereoLayers.SetBit(mithep::Track::TID2S);
298     stereoLayers.SetBit(mithep::Track::TID3S);
299     stereoLayers.SetBit(mithep::Track::TOB1S);
300     stereoLayers.SetBit(mithep::Track::TOB2S);
301     stereoLayers.SetBit(mithep::Track::TEC1S);
302     stereoLayers.SetBit(mithep::Track::TEC2S);
303     stereoLayers.SetBit(mithep::Track::TEC3S);
304     stereoLayers.SetBit(mithep::Track::TEC4S);
305     stereoLayers.SetBit(mithep::Track::TEC5S);
306     stereoLayers.SetBit(mithep::Track::TEC6S);
307     stereoLayers.SetBit(mithep::Track::TEC7S);
308     stereoLayers.SetBit(mithep::Track::TEC8S);
309     stereoLayers.SetBit(mithep::Track::TEC9S);
310    
311     return stereoLayers;
312     }
313 loizides 1.5 #endif