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