CMS 3D CMS Logo

Muon.cc
Go to the documentation of this file.
1 //
2 //
3 
8 #include <limits>
9 
10 using namespace pat;
11 
13 Muon::Muon()
14  : Lepton<reco::Muon>(),
15  embeddedMuonBestTrack_(false),
16  embeddedTunePMuonBestTrack_(false),
17  embeddedTrack_(false),
18  embeddedStandAloneMuon_(false),
19  embeddedCombinedMuon_(false),
20  embeddedTCMETMuonCorrs_(false),
21  embeddedCaloMETMuonCorrs_(false),
22  embeddedPickyMuon_(false),
23  embeddedTpfmsMuon_(false),
24  embeddedDytMuon_(false),
25  embeddedPFCandidate_(false),
26  pfCandidateRef_(),
27  cachedNormChi2_(false),
28  normChi2_(0.0),
29  cachedNumberOfValidHits_(false),
30  numberOfValidHits_(0),
31  pfEcalEnergy_(0),
32  jetPtRatio_(0),
33  jetPtRel_(0),
34  mvaIDValue_(0),
35  softMvaValue_(0),
36  inverseBeta_(0),
37  inverseBetaErr_(0) {
38  initImpactParameters();
39  initSimInfo();
40 }
41 
43 Muon::Muon(const reco::Muon& aMuon)
44  : Lepton<reco::Muon>(aMuon),
45  embeddedMuonBestTrack_(false),
46  embeddedTunePMuonBestTrack_(false),
47  embeddedTrack_(false),
48  embeddedStandAloneMuon_(false),
49  embeddedCombinedMuon_(false),
50  embeddedTCMETMuonCorrs_(false),
51  embeddedCaloMETMuonCorrs_(false),
52  embeddedPickyMuon_(false),
53  embeddedTpfmsMuon_(false),
54  embeddedDytMuon_(false),
55  embeddedPFCandidate_(false),
56  pfCandidateRef_(),
57  cachedNormChi2_(false),
58  normChi2_(0.0),
59  cachedNumberOfValidHits_(false),
60  numberOfValidHits_(0),
61  pfEcalEnergy_(0),
62  jetPtRatio_(0),
63  jetPtRel_(0),
64  mvaIDValue_(0),
65  softMvaValue_(0),
66  inverseBeta_(0),
67  inverseBetaErr_(0) {
68  initImpactParameters();
69  initSimInfo();
70 }
71 
74  : Lepton<reco::Muon>(aMuonRef),
75  embeddedMuonBestTrack_(false),
76  embeddedTunePMuonBestTrack_(false),
77  embeddedTrack_(false),
78  embeddedStandAloneMuon_(false),
79  embeddedCombinedMuon_(false),
80  embeddedTCMETMuonCorrs_(false),
81  embeddedCaloMETMuonCorrs_(false),
82  embeddedPickyMuon_(false),
83  embeddedTpfmsMuon_(false),
84  embeddedDytMuon_(false),
85  embeddedPFCandidate_(false),
86  pfCandidateRef_(),
87  cachedNormChi2_(false),
88  normChi2_(0.0),
89  cachedNumberOfValidHits_(false),
90  numberOfValidHits_(0),
91  pfEcalEnergy_(0),
92  jetPtRatio_(0),
93  jetPtRel_(0),
94  mvaIDValue_(0),
95  softMvaValue_(0),
96  inverseBeta_(0),
97  inverseBetaErr_(0) {
98  initImpactParameters();
99  initSimInfo();
100 }
101 
103 Muon::Muon(const edm::Ptr<reco::Muon>& aMuonRef)
104  : Lepton<reco::Muon>(aMuonRef),
105  embeddedMuonBestTrack_(false),
106  embeddedTunePMuonBestTrack_(false),
107  embeddedTrack_(false),
108  embeddedStandAloneMuon_(false),
109  embeddedCombinedMuon_(false),
110  embeddedTCMETMuonCorrs_(false),
111  embeddedCaloMETMuonCorrs_(false),
112  embeddedPickyMuon_(false),
113  embeddedTpfmsMuon_(false),
114  embeddedDytMuon_(false),
115  embeddedPFCandidate_(false),
116  pfCandidateRef_(),
117  cachedNormChi2_(false),
118  normChi2_(0.0),
119  cachedNumberOfValidHits_(false),
120  numberOfValidHits_(0),
121  pfEcalEnergy_(0),
122  jetPtRatio_(0),
123  jetPtRel_(0),
124  mvaIDValue_(0),
125  softMvaValue_(0),
126  inverseBeta_(0),
127  inverseBetaErr_(0) {
128  initImpactParameters();
129  initSimInfo();
130 }
131 
133 Muon::~Muon() {}
134 
135 std::ostream& reco::operator<<(std::ostream& out, const pat::Muon& obj) {
136  if (!out)
137  return out;
138 
139  out << "\tpat::Muon: ";
140  out << std::setiosflags(std::ios::right);
141  out << std::setiosflags(std::ios::fixed);
142  out << std::setprecision(3);
143  out << " E/pT/eta/phi " << obj.energy() << "/" << obj.pt() << "/" << obj.eta() << "/" << obj.phi();
144  return out;
145 }
146 
147 // initialize impact parameter container vars
148 void Muon::initImpactParameters() {
149  std::fill(ip_, ip_ + IpTypeSize, 0.0f);
150  std::fill(eip_, eip_ + IpTypeSize, 0.0f);
151  cachedIP_ = 0;
152 }
153 
154 // initialize impact parameter container vars
155 void Muon::initSimInfo() {
156  simType_ = reco::MuonSimType::Unknown;
158  simFlavour_ = 0;
159  simHeaviestMotherFlavour_ = 0;
160  simPdgId_ = 0;
161  simMotherPdgId_ = 0;
162  simBX_ = 999;
163  simTpEvent_ = 0;
164  simProdRho_ = 0.0;
165  simProdZ_ = 0.0;
166  simPt_ = 0.0;
167  simEta_ = 0.0;
168  simPhi_ = 0.0;
169  simMatchQuality_ = 0.0;
170 }
171 
173 reco::TrackRef Muon::track() const {
174  if (embeddedTrack_) {
175  return reco::TrackRef(&track_, 0);
176  } else {
177  return reco::Muon::innerTrack();
178  }
179 }
180 
183  if (embeddedStandAloneMuon_) {
184  return reco::TrackRef(&standAloneMuon_, 0);
185  } else {
186  return reco::Muon::outerTrack();
187  }
188 }
189 
191 reco::TrackRef Muon::combinedMuon() const {
192  if (embeddedCombinedMuon_) {
193  return reco::TrackRef(&combinedMuon_, 0);
194  } else {
195  return reco::Muon::globalTrack();
196  }
197 }
198 
200 reco::TrackRef Muon::pickyTrack() const {
201  if (embeddedPickyMuon_) {
202  return reco::TrackRef(&pickyMuon_, 0);
203  } else {
204  return reco::Muon::pickyTrack();
205  }
206 }
207 
209 reco::TrackRef Muon::tpfmsTrack() const {
210  if (embeddedTpfmsMuon_) {
211  return reco::TrackRef(&tpfmsMuon_, 0);
212  } else {
213  return reco::Muon::tpfmsTrack();
214  }
215 }
216 
218 reco::TrackRef Muon::dytTrack() const {
219  if (embeddedDytMuon_) {
220  return reco::TrackRef(&dytMuon_, 0);
221  } else {
222  return reco::Muon::dytTrack();
223  }
224 }
225 
227 reco::TrackRef Muon::muonBestTrack() const {
228  if (!muonBestTrack_.empty()) {
229  return reco::TrackRef(&muonBestTrack_, 0);
230  } else {
231  return reco::Muon::muonBestTrack();
232  }
233 }
234 
236 reco::TrackRef Muon::tunePMuonBestTrack() const {
237  if (!tunePMuonBestTrack_.empty()) {
238  return reco::TrackRef(&tunePMuonBestTrack_, 0);
239  } else if (muonBestTrackType() == tunePMuonBestTrackType()) {
240  return muonBestTrack();
241  } else {
243  }
244 }
245 
247 reco::PFCandidateRef Muon::pfCandidateRef() const {
248  if (embeddedPFCandidate_) {
250  } else {
251  return pfCandidateRef_;
252  }
253 }
254 
257  if (pfCandidateRef_.isNonnull() && i == 0)
258  return reco::CandidatePtr(edm::refToPtr(pfCandidateRef_));
259  if (refToOrig_.isNonnull() && pfCandidateRef_.isNonnull() && i == 1)
260  return refToOrig_;
261  if (refToOrig_.isNonnull() && !pfCandidateRef_.isNonnull() && i == 0)
262  return refToOrig_;
263  return reco::CandidatePtr();
264 }
265 
267 void Muon::embedMuonBestTrack(bool force) {
268  muonBestTrack_.clear();
269  embeddedMuonBestTrack_ = false;
270  bool alreadyEmbedded = false;
271  if (!force) {
272  switch (muonBestTrackType()) {
273  case None:
274  alreadyEmbedded = true;
275  break;
276  case InnerTrack:
277  if (embeddedTrack_)
278  alreadyEmbedded = true;
279  break;
280  case OuterTrack:
281  if (embeddedStandAloneMuon_)
282  alreadyEmbedded = true;
283  break;
284  case CombinedTrack:
285  if (embeddedCombinedMuon_)
286  alreadyEmbedded = true;
287  break;
288  case TPFMS:
289  if (embeddedTpfmsMuon_)
290  alreadyEmbedded = true;
291  break;
292  case Picky:
293  if (embeddedPickyMuon_)
294  alreadyEmbedded = true;
295  break;
296  case DYT:
297  if (embeddedDytMuon_)
298  alreadyEmbedded = true;
299  break;
300  }
301  }
302  if (force || !alreadyEmbedded) {
303  muonBestTrack_.push_back(*reco::Muon::muonBestTrack());
304  embeddedMuonBestTrack_ = true;
305  }
306 }
307 
310  tunePMuonBestTrack_.clear();
311  bool alreadyEmbedded = false;
312  embeddedTunePMuonBestTrack_ = false;
313  if (!force) {
314  switch (tunePMuonBestTrackType()) {
315  case None:
316  alreadyEmbedded = true;
317  break;
318  case InnerTrack:
319  if (embeddedTrack_)
320  alreadyEmbedded = true;
321  break;
322  case OuterTrack:
323  if (embeddedStandAloneMuon_)
324  alreadyEmbedded = true;
325  break;
326  case CombinedTrack:
327  if (embeddedCombinedMuon_)
328  alreadyEmbedded = true;
329  break;
330  case TPFMS:
331  if (embeddedTpfmsMuon_)
332  alreadyEmbedded = true;
333  break;
334  case Picky:
335  if (embeddedPickyMuon_)
336  alreadyEmbedded = true;
337  break;
338  case DYT:
339  if (embeddedDytMuon_)
340  alreadyEmbedded = true;
341  break;
342  }
343  if (muonBestTrackType() == tunePMuonBestTrackType()) {
344  if (embeddedMuonBestTrack_)
345  alreadyEmbedded = true;
346  }
347  }
348  if (force || !alreadyEmbedded) {
349  tunePMuonBestTrack_.push_back(*reco::Muon::tunePMuonBestTrack());
350  embeddedTunePMuonBestTrack_ = true;
351  }
352 }
353 
355 void Muon::embedTrack() {
356  track_.clear();
357  if (reco::Muon::innerTrack().isNonnull()) {
358  track_.push_back(*reco::Muon::innerTrack());
359  embeddedTrack_ = true;
360  }
361 }
362 
365  standAloneMuon_.clear();
366  if (reco::Muon::outerTrack().isNonnull()) {
367  standAloneMuon_.push_back(*reco::Muon::outerTrack());
368  embeddedStandAloneMuon_ = true;
369  }
370 }
371 
374  combinedMuon_.clear();
375  if (reco::Muon::globalTrack().isNonnull()) {
376  combinedMuon_.push_back(*reco::Muon::globalTrack());
377  embeddedCombinedMuon_ = true;
378  }
379 }
380 
381 // recursively look for reassociated TrackExtraRefs in the edm::Associations and rekey
382 void Muon::rekeyEmbeddedTracks(std::vector<edm::Handle<edm::Association<reco::TrackExtraCollection>>> const& assocs) {
383  auto rekey = [&assocs](reco::Track& track) {
384  reco::TrackExtraRef trackExtra = track.extra();
385  for (auto const& assoc : assocs) {
386  if (!assoc->contains(trackExtra.id())) {
387  continue;
388  }
389  reco::TrackExtraRef const& trackExtraOut = (*assoc)[trackExtra];
390  if (trackExtraOut.isNonnull()) {
391  trackExtra = trackExtraOut;
392  }
393  }
394  track.setExtra(trackExtra);
395  };
396 
397  for (reco::Track& track : muonBestTrack_) {
398  rekey(track);
399  }
400  for (reco::Track& track : tunePMuonBestTrack_) {
401  rekey(track);
402  }
403  for (reco::Track& track : track_) {
404  rekey(track);
405  }
406  for (reco::Track& track : standAloneMuon_) {
407  rekey(track);
408  }
409  for (reco::Track& track : combinedMuon_) {
410  rekey(track);
411  }
412  for (reco::Track& track : pickyMuon_) {
413  rekey(track);
414  }
415  for (reco::Track& track : tpfmsMuon_) {
416  rekey(track);
417  }
418  for (reco::Track& track : dytMuon_) {
419  rekey(track);
420  }
421 }
422 
425  caloMETMuonCorrs_.clear();
426  caloMETMuonCorrs_.push_back(t);
427  embeddedCaloMETMuonCorrs_ = true;
428 }
429 
432  tcMETMuonCorrs_.clear();
433  tcMETMuonCorrs_.push_back(t);
434  embeddedTCMETMuonCorrs_ = true;
435 }
436 
438 void Muon::embedPickyMuon() {
439  pickyMuon_.clear();
441  if (tk.isNonnull()) {
442  pickyMuon_.push_back(*tk);
443  embeddedPickyMuon_ = true;
444  }
445 }
446 
448 void Muon::embedTpfmsMuon() {
449  tpfmsMuon_.clear();
451  if (tk.isNonnull()) {
452  tpfmsMuon_.push_back(*tk);
453  embeddedTpfmsMuon_ = true;
454  }
455 }
456 
458 void Muon::embedDytMuon() {
459  dytMuon_.clear();
461  if (tk.isNonnull()) {
462  dytMuon_.push_back(*tk);
463  embeddedDytMuon_ = true;
464  }
465 }
466 
468 void Muon::readTimeExtra(const reco::MuonTimeExtra& t) {
469  inverseBeta_ = t.inverseBeta();
470  inverseBetaErr_ = t.inverseBetaErr();
471 }
472 
474 void Muon::embedPFCandidate() {
475  pfCandidate_.clear();
476  if (pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
477  pfCandidate_.push_back(*pfCandidateRef_);
478  embeddedPFCandidate_ = true;
479  }
480 }
481 
482 bool Muon::muonID(const std::string& name) const {
484  return muon::isGoodMuon(*this, st);
485 }
486 
491 double Muon::normChi2() const {
492  if (cachedNormChi2_) {
493  return normChi2_;
494  } else {
496  return t->chi2() / t->ndof();
497  }
498 }
499 
504 unsigned int Muon::numberOfValidHits() const {
505  if (cachedNumberOfValidHits_) {
506  return numberOfValidHits_;
507  } else {
509  return t->numberOfValidHits();
510  }
511 }
512 
513 // embed various impact parameters with errors
514 // IpType defines the type of the impact parameter
515 double Muon::dB(IpType type_) const {
516  // more IP types (new)
517  if (cachedIP_ & (1 << int(type_))) {
518  return ip_[type_];
519  } else {
521  }
522 }
523 
524 // embed various impact parameters with errors
525 // IpType defines the type of the impact parameter
526 double Muon::edB(IpType type_) const {
527  // more IP types (new)
528  if (cachedIP_ & (1 << int(type_))) {
529  return eip_[type_];
530  } else {
532  }
533 }
534 
537 }
538 
539 // Selectors
540 bool Muon::isTightMuon(const reco::Vertex& vtx) const { return muon::isTightMuon(*this, vtx); }
541 
542 bool Muon::isLooseMuon() const { return muon::isLooseMuon(*this); }
543 
544 bool Muon::isMediumMuon() const { return muon::isMediumMuon(*this); }
545 
546 bool Muon::isSoftMuon(const reco::Vertex& vtx) const { return muon::isSoftMuon(*this, vtx); }
547 
548 bool Muon::isHighPtMuon(const reco::Vertex& vtx) const { return muon::isHighPtMuon(*this, vtx); }
ProductID id() const
Accessor for product ID.
Definition: Ref.h:244
Ptr< typename C::value_type > refToPtr(Ref< C, typename C::value_type, refhelper::FindUsingAdvance< C, typename C::value_type > > const &ref)
Definition: RefToPtr.h:18
bool isMediumMuon(const reco::Muon &, bool run2016_hip_mitigation=false)
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:51
reco::CandidatePtr pfCandidate_
virtual TrackRef pickyTrack() const
Definition: Muon.h:55
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
CandidatePtr sourceCandidatePtr(size_type i) const override
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
Definition: Muon.h:48
virtual TrackRef dytTrack() const
Definition: Muon.h:56
uint16_t size_type
bool isLooseMuon(const reco::Muon &)
SelectionType
Selector type.
Definition: MuonSelectors.h:18
Definition: HeavyIon.h:7
Muon()
default constructor
std::ostream & operator<<(std::ostream &, BeamSpot beam)
Definition: BeamSpot.cc:66
Definition: Muon.py:1
ArbitrationType
define arbitration schemes
Definition: Muon.h:187
virtual TrackRef tunePMuonBestTrack() const
Definition: Muon.h:62
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
double f[11][100]
virtual TrackRef innerTrack() const
Definition: Muon.h:45
edm::Ref< PFCandidateCollection > PFCandidateRef
persistent reference to a PFCandidate
bool isSoftMuon(const reco::Muon &, const reco::Vertex &, bool run2016_hip_mitigation=false)
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
embedDytMuon
embed in AOD externally stored TeV-refit TPFMS muon track
virtual TrackRef muonBestTrack() const
Definition: Muon.h:60
bool isHighPtMuon(const reco::Muon &, const reco::Vertex &)
static const int muonID
Definition: TopGenEvent.h:19
edm::Ptr< Candidate > CandidatePtr
persistent reference to an object in a collection of Candidate objects
Definition: CandidateFwd.h:25
SelectionType selectionTypeFromString(const std::string &label)
Definition: MuonSelectors.cc:9
const reco::Muon::ArbitrationType arbitrationType
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
fixed size matrix
embedTunePMuonBestTrack
embed in AOD externally stored muon best track from global pflow
Definition: Lepton.py:1
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
~Muon() override
Definition: Muon.cc:102
Analysis-level muon class.
Definition: Muon.h:51
Muon()
Definition: Muon.cc:3
virtual TrackRef tpfmsTrack() const
Definition: Muon.h:54