1 |
mschen |
1.1 |
#ifndef Muon_h
|
2 |
|
|
#define Muon_h
|
3 |
|
|
|
4 |
|
|
#include <TLorentzVector.h>
|
5 |
|
|
|
6 |
|
|
#include "init.h"
|
7 |
|
|
#include "mcParticle.h"
|
8 |
|
|
#include "track.h"
|
9 |
|
|
#include <fstream>
|
10 |
|
|
|
11 |
|
|
using namespace std;
|
12 |
|
|
|
13 |
|
|
struct Segment{
|
14 |
|
|
float phi, eta, x, y, z;
|
15 |
|
|
uint32_t det;
|
16 |
|
|
Segment(){}
|
17 |
|
|
Segment(float a, float b, float c, float d, float e, uint32_t f):phi(a), eta(b), x(c), y(d), z(e), det(f){}
|
18 |
|
|
Segment(const Segment& seg):phi(seg.phi),eta(seg.eta),x(seg.x),y(seg.y), z(seg.z), det(seg.det){}
|
19 |
|
|
};
|
20 |
|
|
|
21 |
|
|
class Muon:public mcParticle {
|
22 |
|
|
|
23 |
|
|
private:
|
24 |
|
|
double ecalIso_, hcalIso_, trkIso_;
|
25 |
|
|
int type_, typeTrk_;
|
26 |
|
|
double calEm_, calHm_, compat_, d0_, Chi2N_;
|
27 |
|
|
int nHit_;
|
28 |
|
|
double outZ_, outR_;
|
29 |
|
|
|
30 |
|
|
double parentDR_;
|
31 |
|
|
int parentI_, parentI2_, parentClass, parentPDG;
|
32 |
|
|
|
33 |
|
|
bool globalMuonPromptTight_;
|
34 |
|
|
TLorentzVector staMom;
|
35 |
|
|
TLorentzVector trkMom;
|
36 |
|
|
int staCharge, trkCharge;
|
37 |
|
|
float staNdof, trkNdof;
|
38 |
|
|
bool isTrackValid, isStandAloneValid;
|
39 |
|
|
|
40 |
|
|
bool GlobalMuon_, TrackerMuon_, CaloMuon_, StandAloneMuon_, GlobalMuonPromptTight_, TM2DCompatibilityLoose_, TMOneStationLoose_;
|
41 |
|
|
bool TMLastStationOptimizedLowPtLoose_, TMLastStationOptimizedLowPtTight_;
|
42 |
|
|
bool TM2DCompatibilityTight_;
|
43 |
|
|
bool Good_;
|
44 |
|
|
bool TMLastStationAngTight_;
|
45 |
|
|
bool TMOneStationAngTight_;
|
46 |
|
|
bool TMOneStationAngLoose_;
|
47 |
|
|
|
48 |
|
|
double ndof_;
|
49 |
|
|
double trkChi2N, trkD0, trkNHit;
|
50 |
|
|
|
51 |
|
|
short numberOfValidMuonHits_;
|
52 |
|
|
|
53 |
|
|
float caloCompatibility_;
|
54 |
|
|
float segmentCompatibility_;
|
55 |
|
|
bool TrackerMuonArbitrated_;
|
56 |
|
|
bool AllArbitrated_;
|
57 |
|
|
|
58 |
|
|
|
59 |
|
|
int numberOfChambers_;
|
60 |
|
|
int numberOfMatches_;
|
61 |
|
|
|
62 |
|
|
Track track_;
|
63 |
|
|
|
64 |
|
|
float weight_;
|
65 |
|
|
|
66 |
|
|
// --- need FIXME put Arbitrated bits on the muon collection
|
67 |
|
|
|
68 |
|
|
vector<Segment> segments_;
|
69 |
|
|
|
70 |
|
|
float gen_pt, gen_eta, gen_phi;
|
71 |
|
|
int gen_q, gen_index;
|
72 |
|
|
|
73 |
|
|
double d0PV_;
|
74 |
|
|
|
75 |
|
|
public:
|
76 |
|
|
//Muon() {};
|
77 |
|
|
Muon(
|
78 |
|
|
int index,
|
79 |
|
|
int q,
|
80 |
|
|
TLorentzVector mom,
|
81 |
|
|
TLorentzVector vtx,
|
82 |
|
|
|
83 |
|
|
double ecalIso,
|
84 |
|
|
double hcalIso,
|
85 |
|
|
double trkIso,
|
86 |
|
|
|
87 |
|
|
int type,
|
88 |
|
|
int typeTrk,
|
89 |
|
|
double calEm,
|
90 |
|
|
double calHm,
|
91 |
|
|
double compat,
|
92 |
|
|
|
93 |
|
|
double d0,
|
94 |
|
|
double Chi2N,
|
95 |
|
|
int nHit,
|
96 |
|
|
double outZ,
|
97 |
|
|
double outR
|
98 |
|
|
)
|
99 |
|
|
:mcParticle(
|
100 |
|
|
index,
|
101 |
|
|
13,
|
102 |
|
|
q,
|
103 |
|
|
mom,
|
104 |
|
|
0,
|
105 |
|
|
vtx
|
106 |
|
|
),
|
107 |
|
|
ecalIso_(ecalIso),
|
108 |
|
|
hcalIso_(hcalIso),
|
109 |
|
|
trkIso_(trkIso),
|
110 |
|
|
|
111 |
|
|
type_(type),
|
112 |
|
|
typeTrk_(typeTrk),
|
113 |
|
|
calEm_(calEm),
|
114 |
|
|
calHm_(calHm),
|
115 |
|
|
compat_(compat),
|
116 |
|
|
d0_(d0),
|
117 |
|
|
Chi2N_(Chi2N),
|
118 |
|
|
nHit_(nHit),
|
119 |
|
|
outZ_(outZ),
|
120 |
|
|
outR_(outR)
|
121 |
|
|
{
|
122 |
|
|
parentDR_ = -1;
|
123 |
|
|
parentI_ = -1;
|
124 |
|
|
parentI2_ = -1;
|
125 |
|
|
parentClass = -1;
|
126 |
|
|
parentPDG = -1;
|
127 |
|
|
isTrackValid=false;
|
128 |
|
|
isStandAloneValid=false;
|
129 |
|
|
caloCompatibility_=-1;
|
130 |
|
|
segmentCompatibility_=-1;
|
131 |
|
|
weight_=1; // if it's a pseudo muon, then we will assign weight for it
|
132 |
|
|
// FIXME dirty coding here...
|
133 |
|
|
segments_.clear();
|
134 |
|
|
numberOfValidMuonHits_ = 0;
|
135 |
|
|
gen_pt = -1; gen_eta = -99.0; gen_phi=-99.0; gen_q = -99; gen_index = -1;
|
136 |
|
|
};
|
137 |
|
|
~Muon() {};
|
138 |
|
|
|
139 |
|
|
|
140 |
|
|
double ecalIso() const {return ecalIso_;};
|
141 |
|
|
double hcalIso() const {return hcalIso_;};
|
142 |
|
|
double trkIso() const {return trkIso_;};
|
143 |
|
|
double isolSumNorm(int type=1) const
|
144 |
|
|
{
|
145 |
|
|
if(type==1){ return (trkIso_ + ecalIso_ + hcalIso_)/pt();}
|
146 |
|
|
else { return (trkIso_ + ecalIso_ + hcalIso_)/(pt()>20?pt():20); }
|
147 |
|
|
};
|
148 |
|
|
double isolSum() const
|
149 |
|
|
{
|
150 |
|
|
return (trkIso_ + ecalIso_ + hcalIso_);
|
151 |
|
|
};
|
152 |
|
|
|
153 |
|
|
void putParentDR(double dr) {parentDR_ = dr;};
|
154 |
|
|
void putParentI(int i) {parentI_ = i;};//i from full PYTHIA list
|
155 |
|
|
void putParentI2(int i) {parentI2_ = i;};//same; or i from genMu list if matched
|
156 |
|
|
void putParentPDGid(int i) {parentPDG = i;};
|
157 |
|
|
void defineParent(int i) {parentClass = defineParentClass(i);};
|
158 |
|
|
void putParentClass(int i) {parentClass = i;};
|
159 |
|
|
|
160 |
|
|
int getParentClass() {return parentClass;};
|
161 |
|
|
int getParentPDG() {return parentPDG;};
|
162 |
|
|
int getMatchedIndex() {return parentI_;};
|
163 |
|
|
double getDr() {return parentDR_;};
|
164 |
|
|
|
165 |
|
|
int type() {return type_;};
|
166 |
|
|
double calEm() {return calEm_;};
|
167 |
|
|
double calHm() {return calHm_;};
|
168 |
|
|
double compat() {return compat_;};
|
169 |
|
|
double d0() {return d0_;};
|
170 |
|
|
double Chi2N() {return Chi2N_;};
|
171 |
|
|
double nHit() {return nHit_;};
|
172 |
|
|
double outZ() {return outZ_;};
|
173 |
|
|
double outR() {return outR_;};
|
174 |
|
|
|
175 |
|
|
|
176 |
|
|
|
177 |
|
|
void Set_staMom(TLorentzVector pp){staMom=pp; isStandAloneValid=true;};
|
178 |
|
|
void Set_trkMom(TLorentzVector pp){trkMom=pp; isTrackValid=true;};
|
179 |
|
|
TLorentzVector getStaMom(){return staMom;};
|
180 |
|
|
TLorentzVector getTrkMom(){return trkMom;};
|
181 |
|
|
void Set_staCharge(int c){staCharge=c;};
|
182 |
|
|
void Set_trkCharge(int c){trkCharge=c;};
|
183 |
|
|
int getStaCharge(){return staCharge;};
|
184 |
|
|
int getTrkCharge(){return trkCharge;};
|
185 |
|
|
bool getTrackValid(){return isTrackValid;};
|
186 |
|
|
bool getStandAloneValid(){return isStandAloneValid;};
|
187 |
|
|
|
188 |
|
|
void printRec();
|
189 |
|
|
void printRec(ofstream &fout);
|
190 |
|
|
|
191 |
|
|
bool isGlobalMuon(){return GlobalMuon_;};
|
192 |
|
|
bool isTrackerMuon(){return TrackerMuon_;};
|
193 |
|
|
bool isCaloMuon(){return CaloMuon_;}
|
194 |
|
|
bool isStandAloneMuon(){return StandAloneMuon_;};
|
195 |
|
|
bool isGlobalMuonPromptTight(){return GlobalMuonPromptTight_;};
|
196 |
|
|
bool isTM2DCompatibilityLoose(){TM2DCompatibilityLoose_;};
|
197 |
|
|
bool isTM2DCompatibilityTight(){TM2DCompatibilityTight_;};
|
198 |
|
|
bool isTMOneStationLoose(){return TMOneStationLoose_;};
|
199 |
|
|
void setGlobalMuon(bool b){ GlobalMuon_=b;};
|
200 |
|
|
void setTrackerMuon(bool b){ TrackerMuon_=b;};
|
201 |
|
|
void setCaloMuon(bool b){ CaloMuon_=b;}
|
202 |
|
|
void setStandAloneMuon(bool b){ StandAloneMuon_=b;};
|
203 |
|
|
void setGlobalMuonPromptTight(bool b){ GlobalMuonPromptTight_=b;};
|
204 |
|
|
void setTM2DCompatibilityLoose(bool b){TM2DCompatibilityLoose_=b;};
|
205 |
|
|
void setTM2DCompatibilityTight(bool b){TM2DCompatibilityTight_=b;};
|
206 |
|
|
void setTMOneStationLoose(bool b){ TMOneStationLoose_=b;};
|
207 |
|
|
void setTMLastStationOptimizedLowPtLoose(bool b){ TMLastStationOptimizedLowPtLoose_=b;};
|
208 |
|
|
void setTMLastStationOptimizedLowPtTight(bool b){ TMLastStationOptimizedLowPtTight_=b;};
|
209 |
|
|
bool isTMLastStationOptimizedLowPtTight(){return TMLastStationOptimizedLowPtTight_;};
|
210 |
|
|
bool isTMLastStationOptimizedLowPtLoose(){return TMLastStationOptimizedLowPtLoose_;};
|
211 |
|
|
void setTMLastStationAngTight(bool b){ TMLastStationAngTight_=b;};
|
212 |
|
|
bool isTMLastStationAngTight(){return TMLastStationAngTight_;};
|
213 |
|
|
void setTMOneStationAngTight(bool b){ TMOneStationAngTight_=b;};
|
214 |
|
|
bool isTMOneStationAngTight(){return TMOneStationAngTight_;};
|
215 |
|
|
void setTMOneStationAngLoose(bool b){ TMOneStationAngLoose_=b;};
|
216 |
|
|
bool isTMOneStationAngLoose(){return TMOneStationAngLoose_;};
|
217 |
|
|
|
218 |
|
|
double ndof(){return ndof_;};
|
219 |
|
|
void set_ndof(double n){ndof_=n;};
|
220 |
|
|
double getStaNdof(){return staNdof;};
|
221 |
|
|
double getTrkNdof(){return trkNdof;};
|
222 |
|
|
void Set_staNdof(float n){staNdof=n;};
|
223 |
|
|
void Set_trkNdof(float n){trkNdof=n;};
|
224 |
|
|
void setTrackQuantities(int charge, TLorentzVector mom, double d0, double Chi2N, int nHit, double ndof){
|
225 |
|
|
trkMom=mom; trkD0=d0; trkChi2N=Chi2N; trkNHit=nHit; trkNdof=ndof; trkCharge=charge; isTrackValid=true;
|
226 |
|
|
};
|
227 |
|
|
double getTrkChi2N(){return trkChi2N;};
|
228 |
|
|
|
229 |
|
|
void Set_numberOfValidMuonHits(short n) {numberOfValidMuonHits_ = n;};
|
230 |
|
|
short numberOfValidMuonHits(){return numberOfValidMuonHits_;};
|
231 |
|
|
|
232 |
|
|
float caloCompatibility(){return caloCompatibility_;};
|
233 |
|
|
void setCaloCompatibility(float input){caloCompatibility_=input;};
|
234 |
|
|
float segmentCompatibility(){return segmentCompatibility_;};
|
235 |
|
|
bool TrackerMuonArbitrated(){return TrackerMuonArbitrated_;};
|
236 |
|
|
bool AllArbitrated(){return AllArbitrated_;};
|
237 |
|
|
void setSegmentCompatibility(float c){segmentCompatibility_=c;};
|
238 |
|
|
void setTrackerMuonArbitrated(bool b){TrackerMuonArbitrated_=b;};
|
239 |
|
|
void setAllArbitrated(bool b){AllArbitrated_=b;};
|
240 |
|
|
|
241 |
|
|
void setTrack(Track& trk){track_=trk; isTrackValid=true;};
|
242 |
|
|
Track track(){return track_;};
|
243 |
|
|
|
244 |
|
|
void setWeight(float w){weight_=w;};
|
245 |
|
|
float weight(){return weight_;};
|
246 |
|
|
|
247 |
|
|
void setGood(bool b) {Good_=b;};
|
248 |
|
|
bool isGood(){return Good_;};
|
249 |
|
|
|
250 |
|
|
void setD0PV(double d){d0PV_=d;};
|
251 |
|
|
double d0PV(){return d0PV_;};
|
252 |
|
|
|
253 |
|
|
void setNumberOfMatches(int n){numberOfMatches_=n;};
|
254 |
|
|
void setNumberOfChambers(int n){numberOfChambers_=n;};
|
255 |
|
|
int numberOfMatches(){return numberOfMatches_;};
|
256 |
|
|
int numberOfChambers(){return numberOfChambers_;};
|
257 |
|
|
|
258 |
|
|
void setSegments(vector<Segment> segs){segments_=segs;};
|
259 |
|
|
vector<Segment> getSegments(){return segments_;};
|
260 |
|
|
|
261 |
|
|
static const int kDetOffset = 28;
|
262 |
|
|
static const int kSubdetOffset = 25;
|
263 |
|
|
static const int DT= 1;
|
264 |
|
|
static const int CSC=2;
|
265 |
|
|
static const int RPC=3;
|
266 |
|
|
enum Detector { Tracker=1,MuonDet=2,Ecal=3,Hcal=4,Calo=5 };
|
267 |
|
|
|
268 |
|
|
// The maximum numbers of various parts
|
269 |
|
|
enum eMaxNum{ MAX_ENDCAP=2, MAX_STATION=4, MAX_RING=4, MAX_CHAMBER=36, MAX_LAYER=6 };
|
270 |
|
|
// // We count from 1
|
271 |
|
|
enum eMinNum{ MIN_ENDCAP=1, MIN_STATION=1, MIN_RING=1, MIN_CHAMBER=1, MIN_LAYER=1 };
|
272 |
|
|
//
|
273 |
|
|
// // BITS_det is no. of binary bits required to label 'det' but allow 0 as a wild-card character
|
274 |
|
|
// // Keep as multiples of 3 so that number can be easily decodable from octal
|
275 |
|
|
enum eNumBitDet{ BITS_ENDCAP=3, BITS_STATION=3, BITS_RING=3, BITS_CHAMBER=6, BITS_LAYER=3 };
|
276 |
|
|
//
|
277 |
|
|
// // MASK_det is binary bits set to pick off the bits for 'det' (defined as octal)
|
278 |
|
|
enum eMaskBitDet{ MASK_ENDCAP=07, MASK_STATION=07, MASK_RING=07, MASK_CHAMBER=077, MASK_LAYER=07 };
|
279 |
|
|
//
|
280 |
|
|
// // START_det is bit position (counting from zero) at which bits for 'det' start in 'rawId' word
|
281 |
|
|
enum eStartBitDet{ START_CHAMBER=BITS_LAYER, START_RING=START_CHAMBER+BITS_CHAMBER,
|
282 |
|
|
START_STATION=START_RING+BITS_RING, START_ENDCAP=START_STATION+BITS_STATION };
|
283 |
|
|
|
284 |
|
|
/**
|
285 |
|
|
* * Return Chamber label.
|
286 |
|
|
* *
|
287 |
|
|
* */
|
288 |
|
|
int chamber(uint32_t id_) const {
|
289 |
|
|
return ( (id_>>START_CHAMBER) & MASK_CHAMBER ); };
|
290 |
|
|
|
291 |
|
|
/**
|
292 |
|
|
* * Return Ring label.
|
293 |
|
|
* *
|
294 |
|
|
* */
|
295 |
|
|
int ring(uint32_t id_) const {
|
296 |
|
|
if (((id_>>START_STATION) & MASK_STATION) == 1)
|
297 |
|
|
return ( detIdToInt((id_>>START_RING) & MASK_RING ));
|
298 |
|
|
else
|
299 |
|
|
return (((id_>>START_RING) & MASK_RING ));
|
300 |
|
|
};
|
301 |
|
|
|
302 |
|
|
/**
|
303 |
|
|
* * Return Station label.
|
304 |
|
|
* *
|
305 |
|
|
* */
|
306 |
|
|
int station(uint32_t id_) const {
|
307 |
|
|
return ( (id_>>START_STATION) & MASK_STATION ); };
|
308 |
|
|
|
309 |
|
|
/**
|
310 |
|
|
* * Return Endcap label. 1=forward (+Z); 2=backward (-Z)
|
311 |
|
|
* *
|
312 |
|
|
* */
|
313 |
|
|
int endcap(uint32_t id_) const {
|
314 |
|
|
return ( (id_>>START_ENDCAP) & MASK_ENDCAP ); };
|
315 |
|
|
|
316 |
|
|
static int detIdToInt(int iring) {
|
317 |
|
|
// reverse intToDetId: change 1, 2, 3, 4 inside the DetId to 4, 1, 2, 3 for external use
|
318 |
|
|
// // i.e. output ring # 1, 2, 3, 4 in ME1 means ME1b, ME12, ME13, ME1a as usual in the offline software.
|
319 |
|
|
int i = (iring-1);
|
320 |
|
|
if (i == 0)
|
321 |
|
|
i = 4;
|
322 |
|
|
return i;
|
323 |
|
|
};
|
324 |
|
|
|
325 |
|
|
|
326 |
|
|
|
327 |
|
|
/// get the detector field from this detid
|
328 |
|
|
Detector det(uint32_t id_) const { return Detector((id_>>kDetOffset)&0xF); };
|
329 |
|
|
/// get the contents of the subdetector field (not cast into any detector's numbering enum)
|
330 |
|
|
int subdetId(uint32_t id_) const { return ((id_>>kSubdetOffset)&0x7); };
|
331 |
|
|
|
332 |
|
|
|
333 |
|
|
void SetGenPt(float a) {gen_pt=a;};
|
334 |
|
|
void SetGenEta(float a) {gen_eta=a;};
|
335 |
|
|
void SetGenPhi(float a) {gen_phi=a;};
|
336 |
|
|
void SetGenQ(int a) {gen_q = a;};
|
337 |
|
|
void SetGenIndex(int a){gen_index=a;};
|
338 |
|
|
|
339 |
|
|
float GetGenPt() {return gen_pt;};
|
340 |
|
|
float GetGenEta() {return gen_eta;};
|
341 |
|
|
float GetGenPhi() {return gen_phi;};
|
342 |
|
|
int GetGenQ() {return gen_q;};
|
343 |
|
|
int GetGenIndex(){return gen_index;};
|
344 |
|
|
};
|
345 |
|
|
|
346 |
|
|
|
347 |
|
|
|
348 |
|
|
#endif // #ifdef Muon_cxx
|