1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
|
#ifndef MuonReco_Muon_h
#define MuonReco_Muon_h
/** \class reco::Muon Muon.h DataFormats/MuonReco/interface/Muon.h
*
* A reconstructed Muon.
* contains reference to three fits:
* - tracker alone
* - muon detector alone
* - combined muon plus tracker
*
* \author Luca Lista, Claudio Campagnari, Dmytro Kovalskyi, Jake Ribnik, Riccardo Bellan, Michalis Bachtis
*
*
*/
#include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
#include "DataFormats/MuonReco/interface/MuonChamberMatch.h"
#include "DataFormats/MuonReco/interface/MuonIsolation.h"
#include "DataFormats/MuonReco/interface/MuonPFIsolation.h"
#include "DataFormats/MuonReco/interface/MuonEnergy.h"
#include "DataFormats/MuonReco/interface/MuonTime.h"
#include "DataFormats/MuonReco/interface/MuonQuality.h"
#include "DataFormats/TrackReco/interface/TrackFwd.h"
#include "DataFormats/TrackReco/interface/Track.h"
namespace reco {
class Muon : public RecoCandidate {
public:
Muon();
/// constructor from values
Muon(Charge, const LorentzVector&, const Point& = Point(0, 0, 0));
/// create a clone
Muon* clone() const override;
/// map for Global Muon refitters
enum MuonTrackType { None, InnerTrack, OuterTrack, CombinedTrack, TPFMS, Picky, DYT };
typedef std::map<MuonTrackType, reco::TrackRef> MuonTrackRefMap;
typedef std::pair<TrackRef, Muon::MuonTrackType> MuonTrackTypePair;
///
/// ====================== TRACK BLOCK ===========================
///
/// reference to Track reconstructed in the tracker only
using reco::RecoCandidate::track;
virtual TrackRef innerTrack() const { return innerTrack_; }
TrackRef track() const override { return innerTrack(); }
/// reference to Track reconstructed in the muon detector only
virtual TrackRef outerTrack() const { return outerTrack_; }
TrackRef standAloneMuon() const override { return outerTrack(); }
/// reference to Track reconstructed in both tracked and muon detector
virtual TrackRef globalTrack() const { return globalTrack_; }
TrackRef combinedMuon() const override { return globalTrack(); }
virtual TrackRef tpfmsTrack() const { return muonTrackFromMap(TPFMS); }
virtual TrackRef pickyTrack() const { return muonTrackFromMap(Picky); }
virtual TrackRef dytTrack() const { return muonTrackFromMap(DYT); }
const Track* bestTrack() const override { return muonTrack(bestTrackType_).get(); }
TrackBaseRef bestTrackRef() const override { return reco::TrackBaseRef(muonTrack(bestTrackType_)); }
virtual TrackRef muonBestTrack() const { return muonTrack(bestTrackType_); }
virtual MuonTrackType muonBestTrackType() const { return bestTrackType_; }
virtual TrackRef tunePMuonBestTrack() const { return muonTrack(bestTunePTrackType_); }
virtual MuonTrackType tunePMuonBestTrackType() const { return bestTunePTrackType_; }
bool isAValidMuonTrack(const MuonTrackType& type) const;
TrackRef muonTrack(const MuonTrackType&) const;
TrackRef muonTrackFromMap(const MuonTrackType& type) const {
MuonTrackRefMap::const_iterator iter = refittedTrackMap_.find(type);
if (iter != refittedTrackMap_.end())
return iter->second;
else
return TrackRef();
}
/// set reference to Track
virtual void setInnerTrack(const TrackRef& t);
virtual void setTrack(const TrackRef& t);
/// set reference to Track
virtual void setOuterTrack(const TrackRef& t);
virtual void setStandAlone(const TrackRef& t);
/// set reference to Track
virtual void setGlobalTrack(const TrackRef& t);
virtual void setCombined(const TrackRef& t);
// set reference to the Best Track
virtual void setBestTrack(MuonTrackType muonType) { bestTrackType_ = muonType; }
// set reference to the Best Track by PF
virtual void setTunePBestTrack(MuonTrackType muonType) { bestTunePTrackType_ = muonType; }
void setMuonTrack(const MuonTrackType&, const TrackRef&);
///set reference to PFCandidate
///
/// ====================== PF BLOCK ===========================
///
reco::Candidate::LorentzVector pfP4() const { return pfP4_; }
virtual void setPFP4(const reco::Candidate::LorentzVector& p4_);
///
/// ====================== ENERGY BLOCK ===========================
///
/// energy deposition
bool isEnergyValid() const { return energyValid_; }
/// get energy deposition information
MuonEnergy calEnergy() const { return calEnergy_; }
/// set energy deposition information
void setCalEnergy(const MuonEnergy& calEnergy) {
calEnergy_ = calEnergy;
energyValid_ = true;
}
///
/// ====================== Quality BLOCK ===========================
///
/// energy deposition
bool isQualityValid() const { return qualityValid_; }
/// get energy deposition information
MuonQuality combinedQuality() const { return combinedQuality_; }
/// set energy deposition information
void setCombinedQuality(const MuonQuality& combinedQuality) {
combinedQuality_ = combinedQuality;
qualityValid_ = true;
}
///
/// ====================== TIMING BLOCK ===========================
///
/// timing information
bool isTimeValid() const { return (time_.nDof > 0); }
/// get DT/CSC combined timing information
MuonTime time() const { return time_; }
/// set DT/CSC combined timing information
void setTime(const MuonTime& time) { time_ = time; }
/// get RPC timing information
MuonTime rpcTime() const { return rpcTime_; }
/// set RPC timing information
void setRPCTime(const MuonTime& time) { rpcTime_ = time; }
///
/// ====================== MUON MATCH BLOCK ===========================
///
bool isMatchesValid() const { return matchesValid_; }
/// get muon matching information
std::vector<MuonChamberMatch>& matches() { return muMatches_; }
const std::vector<MuonChamberMatch>& matches() const { return muMatches_; }
/// set muon matching information
void setMatches(const std::vector<MuonChamberMatch>& matches) {
muMatches_ = matches;
matchesValid_ = true;
}
///
/// ====================== MUON COMPATIBILITY BLOCK ===========================
///
/// Relative likelihood based on ECAL, HCAL, HO energy defined as
/// L_muon/(L_muon+L_not_muon)
float caloCompatibility() const { return caloCompatibility_; }
void setCaloCompatibility(float input) { caloCompatibility_ = input; }
bool isCaloCompatibilityValid() const { return caloCompatibility_ >= 0; }
///
/// ====================== ISOLATION BLOCK ===========================
///
/// Summary of muon isolation information
const MuonIsolation& isolationR03() const { return isolationR03_; }
const MuonIsolation& isolationR05() const { return isolationR05_; }
const MuonPFIsolation& pfIsolationR03() const { return pfIsolationR03_; }
const MuonPFIsolation& pfMeanDRIsoProfileR03() const { return pfIsoMeanDRR03_; }
const MuonPFIsolation& pfSumDRIsoProfileR03() const { return pfIsoSumDRR03_; }
const MuonPFIsolation& pfIsolationR04() const { return pfIsolationR04_; }
const MuonPFIsolation& pfMeanDRIsoProfileR04() const { return pfIsoMeanDRR04_; }
const MuonPFIsolation& pfSumDRIsoProfileR04() const { return pfIsoSumDRR04_; }
void setIsolation(const MuonIsolation& isoR03, const MuonIsolation& isoR05);
bool isIsolationValid() const { return isolationValid_; }
void setPFIsolation(const std::string& label, const reco::MuonPFIsolation& deposit);
bool isPFIsolationValid() const { return pfIsolationValid_; }
/// define arbitration schemes
// WARNING: There can be not more than 7 arbritration types. If
// have more it will break the matching logic for types
// defined in MuonSegmentMatch
enum ArbitrationType {
NoArbitration,
SegmentArbitration,
SegmentAndTrackArbitration,
SegmentAndTrackArbitrationCleaned,
RPCHitAndTrackArbitration,
GEMSegmentAndTrackArbitration,
ME0SegmentAndTrackArbitration,
GEMHitAndTrackArbitration
};
///
/// ====================== STANDARD SELECTORS ===========================
///
// When adding new selectors, also update DataFormats/MuonReco/interface/MuonSelectors.h string to enum map
enum Selector {
CutBasedIdLoose = 0,
CutBasedIdMedium = 1,
CutBasedIdMediumPrompt = 2, // medium with IP cuts
CutBasedIdTight = 3,
CutBasedIdGlobalHighPt = 4, // high pt muon for Z',W' (better momentum resolution)
CutBasedIdTrkHighPt = 5, // high pt muon for boosted Z (better efficiency)
PFIsoVeryLoose = 6, // reliso<0.40
PFIsoLoose = 7, // reliso<0.25
PFIsoMedium = 8, // reliso<0.20
PFIsoTight = 9, // reliso<0.15
PFIsoVeryTight = 10, // reliso<0.10
TkIsoLoose = 11, // reliso<0.10
TkIsoTight = 12, // reliso<0.05
SoftCutBasedId = 13,
SoftMvaId = 14,
MvaLoose = 15,
MvaMedium = 16,
MvaTight = 17,
MiniIsoLoose = 18, // reliso<0.40
MiniIsoMedium = 19, // reliso<0.20
MiniIsoTight = 20, // reliso<0.10
MiniIsoVeryTight = 21, // reliso<0.05
TriggerIdLoose = 22, // robust selector for HLT
InTimeMuon = 23,
PFIsoVeryVeryTight = 24, // reliso<0.05
MultiIsoLoose = 25, // miniIso with ptRatio and ptRel
MultiIsoMedium = 26, // miniIso with ptRatio and ptRel
PuppiIsoLoose = 27,
PuppiIsoMedium = 28,
PuppiIsoTight = 29,
MvaVTight = 30,
MvaVVTight = 31,
LowPtMvaLoose = 32,
LowPtMvaMedium = 33,
MvaIDwpMedium = 34,
MvaIDwpTight = 35,
};
bool passed(uint64_t selection) const { return (selectors_ & selection) == selection; }
bool passed(Selector selection) const { return passed(static_cast<uint64_t>(1UL << selection)); }
uint64_t selectors() const { return selectors_; }
void setSelectors(uint64_t selectors) { selectors_ = selectors; }
void setSelector(Selector selector, bool passed) {
auto selector64 = 1UL << selector;
if (passed)
selectors_ |= selector64;
else
selectors_ &= ~selector64;
}
///
/// ====================== USEFUL METHODs ===========================
///
/// number of chambers (MuonChamberMatches include RPC rolls, GEM and ME0 segments)
int numberOfChambers() const { return muMatches_.size(); }
/// number of chambers CSC or DT matches only (MuonChamberMatches include RPC rolls)
int numberOfChambersCSCorDT() const;
/// get number of chambers with matched segments
int numberOfMatches(ArbitrationType type = SegmentAndTrackArbitration) const;
/// get number of stations with matched segments
/// just adds the bits returned by stationMask
int numberOfMatchedStations(ArbitrationType type = SegmentAndTrackArbitration) const;
/// expected number of stations with matching segments based on the absolute
/// distance from the edge of a chamber
unsigned int expectedNnumberOfMatchedStations(float minDistanceFromEdge = 10.0) const;
/// get bit map of stations with matched segments
/// bits 0-1-2-3 = DT stations 1-2-3-4
/// bits 4-5-6-7 = CSC stations 1-2-3-4
unsigned int stationMask(ArbitrationType type = SegmentAndTrackArbitration) const;
/// get bit map of stations with tracks within
/// given distance (in cm) of chamber edges
/// bit assignments are same as above
int numberOfMatchedRPCLayers(ArbitrationType type = RPCHitAndTrackArbitration) const;
unsigned int RPClayerMask(ArbitrationType type = RPCHitAndTrackArbitration) const;
unsigned int stationGapMaskDistance(float distanceCut = 10.) const;
/// same as above for given number of sigmas
unsigned int stationGapMaskPull(float sigmaCut = 3.) const;
/// # of digis in a given station layer
int nDigisInStation(int station, int muonSubdetId) const;
/// tag a shower in a given station layer
bool hasShowerInStation(int station, int muonSubdetId, int nDtDigisCut = 20, int nCscDigisCut = 36) const;
/// count the number of showers along a muon track
int numberOfShowers(int nDtDigisCut = 20, int nCscDigisCut = 36) const;
/// muon type - type of the algorithm that reconstructed this muon
/// multiple algorithms can reconstruct the same muon
static const unsigned int GlobalMuon = 1 << 1;
static const unsigned int TrackerMuon = 1 << 2;
static const unsigned int StandAloneMuon = 1 << 3;
static const unsigned int CaloMuon = 1 << 4;
static const unsigned int PFMuon = 1 << 5;
static const unsigned int RPCMuon = 1 << 6;
static const unsigned int GEMMuon = 1 << 7;
static const unsigned int ME0Muon = 1 << 8;
void setType(unsigned int type) { type_ = type; }
unsigned int type() const { return type_; }
// override of method in base class reco::Candidate
bool isMuon() const override { return true; }
bool isGlobalMuon() const override { return type_ & GlobalMuon; }
bool isTrackerMuon() const override { return type_ & TrackerMuon; }
bool isStandAloneMuon() const override { return type_ & StandAloneMuon; }
bool isCaloMuon() const override { return type_ & CaloMuon; }
bool isPFMuon() const { return type_ & PFMuon; } //fix me ! Has to go to type
bool isRPCMuon() const { return type_ & RPCMuon; }
bool isGEMMuon() const { return type_ & GEMMuon; }
bool isME0Muon() const { return type_ & ME0Muon; }
private:
/// check overlap with another candidate
bool overlap(const Candidate&) const override;
/// reference to Track reconstructed in the tracker only
TrackRef innerTrack_;
/// reference to Track reconstructed in the muon detector only
TrackRef outerTrack_;
/// reference to Track reconstructed in both tracked and muon detector
TrackRef globalTrack_;
/// reference to the Global Track refitted with dedicated TeV reconstructors
MuonTrackRefMap refittedTrackMap_;
/// reference to the Track chosen to assign the momentum value to the muon
MuonTrackType bestTrackType_;
/// reference to the Track chosen to assign the momentum value to the muon by PF
MuonTrackType bestTunePTrackType_;
/// energy deposition
MuonEnergy calEnergy_;
/// quality block
MuonQuality combinedQuality_;
/// Information on matching between tracks and segments
std::vector<MuonChamberMatch> muMatches_;
/// timing
MuonTime time_;
MuonTime rpcTime_;
bool energyValid_;
bool matchesValid_;
bool isolationValid_;
bool pfIsolationValid_;
bool qualityValid_;
/// muon hypothesis compatibility with observer calorimeter energy
float caloCompatibility_;
/// Isolation information for two cones with dR=0.3 and dR=0.5
MuonIsolation isolationR03_;
MuonIsolation isolationR05_;
/// PF Isolation information for two cones with dR=0.3 and dR=0.4
MuonPFIsolation pfIsolationR03_;
MuonPFIsolation pfIsoMeanDRR03_;
MuonPFIsolation pfIsoSumDRR03_;
MuonPFIsolation pfIsolationR04_;
MuonPFIsolation pfIsoMeanDRR04_;
MuonPFIsolation pfIsoSumDRR04_;
/// muon type mask
unsigned int type_;
//PF muon p4
reco::Candidate::LorentzVector pfP4_;
// FixMe: Still missing trigger information
/// get vector of muon chambers for given station and detector
const std::vector<const MuonChamberMatch*> chambers(int station, int muonSubdetId) const;
/// get pointers to best segment and corresponding chamber in vector of chambers
std::pair<const MuonChamberMatch*, const MuonSegmentMatch*> pair(
const std::vector<const MuonChamberMatch*>&, ArbitrationType type = SegmentAndTrackArbitration) const;
/// selector bitmap
uint64_t selectors_;
public:
/// get number of segments
int numberOfSegments(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
/// get deltas between (best) segment and track
/// If no chamber or no segment returns 999999
float dX(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float dY(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float dDxDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float dDyDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float pullX(int station,
int muonSubdetId,
ArbitrationType type = SegmentAndTrackArbitration,
bool includeSegmentError = true) const;
float pullY(int station,
int muonSubdetId,
ArbitrationType type = SegmentAndTrackArbitration,
bool includeSegmentError = true) const;
float pullDxDz(int station,
int muonSubdetId,
ArbitrationType type = SegmentAndTrackArbitration,
bool includeSegmentError = true) const;
float pullDyDz(int station,
int muonSubdetId,
ArbitrationType type = SegmentAndTrackArbitration,
bool includeSegmentError = true) const;
/// get (best) segment information
/// If no segment returns 999999
float segmentX(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float segmentY(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float segmentDxDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float segmentDyDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float segmentXErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float segmentYErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float segmentDxDzErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float segmentDyDzErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
/// get track information in chamber that contains (best) segment
/// If no segment, get track information in chamber that has the most negative distance between the track
/// and the nearest chamber edge (the chamber with the deepest track)
/// If no chamber returns 999999
float trackEdgeX(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackEdgeY(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackX(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackY(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackDxDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackDyDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackXErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackYErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackDxDzErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackDyDzErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackDist(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float trackDistErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
float t0(int n = 0) {
int i = 0;
for (auto& chamber : muMatches_) {
int segmentMatchesSize = (int)chamber.segmentMatches.size();
if (i + segmentMatchesSize < n) {
i += segmentMatchesSize;
continue;
}
return chamber.segmentMatches[n - i].t0;
}
return 0;
}
};
} // namespace reco
#endif
|