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  mvaIDValue_(0),
37  softMvaValue_(0),
38  inverseBeta_(0),
39  inverseBetaErr_(0) {
40  initImpactParameters();
41  initSimInfo();
42 }
43 
45 Muon::Muon(const reco::Muon& aMuon)
46  : Lepton<reco::Muon>(aMuon),
47  embeddedMuonBestTrack_(false),
48  embeddedTunePMuonBestTrack_(false),
49  embeddedTrack_(false),
50  embeddedStandAloneMuon_(false),
51  embeddedCombinedMuon_(false),
52  embeddedTCMETMuonCorrs_(false),
53  embeddedCaloMETMuonCorrs_(false),
54  embeddedPickyMuon_(false),
55  embeddedTpfmsMuon_(false),
56  embeddedDytMuon_(false),
57  embeddedPFCandidate_(false),
58  pfCandidateRef_(),
59  cachedNormChi2_(false),
60  normChi2_(0.0),
61  cachedNumberOfValidHits_(false),
62  numberOfValidHits_(0),
63  pfEcalEnergy_(0),
64  jetPtRatio_(0),
65  jetPtRel_(0),
66  mvaValue_(0),
67  lowptMvaValue_(0),
68  mvaIDValue_(0),
69  softMvaValue_(0),
70  inverseBeta_(0),
71  inverseBetaErr_(0) {
72  initImpactParameters();
73  initSimInfo();
74 }
75 
78  : Lepton<reco::Muon>(aMuonRef),
79  embeddedMuonBestTrack_(false),
80  embeddedTunePMuonBestTrack_(false),
81  embeddedTrack_(false),
82  embeddedStandAloneMuon_(false),
83  embeddedCombinedMuon_(false),
84  embeddedTCMETMuonCorrs_(false),
85  embeddedCaloMETMuonCorrs_(false),
86  embeddedPickyMuon_(false),
87  embeddedTpfmsMuon_(false),
88  embeddedDytMuon_(false),
89  embeddedPFCandidate_(false),
90  pfCandidateRef_(),
91  cachedNormChi2_(false),
92  normChi2_(0.0),
93  cachedNumberOfValidHits_(false),
94  numberOfValidHits_(0),
95  pfEcalEnergy_(0),
96  jetPtRatio_(0),
97  jetPtRel_(0),
98  mvaValue_(0),
99  lowptMvaValue_(0),
100  mvaIDValue_(0),
101  softMvaValue_(0),
102  inverseBeta_(0),
103  inverseBetaErr_(0) {
104  initImpactParameters();
105  initSimInfo();
106 }
107 
109 Muon::Muon(const edm::Ptr<reco::Muon>& aMuonRef)
110  : Lepton<reco::Muon>(aMuonRef),
111  embeddedMuonBestTrack_(false),
112  embeddedTunePMuonBestTrack_(false),
113  embeddedTrack_(false),
114  embeddedStandAloneMuon_(false),
115  embeddedCombinedMuon_(false),
116  embeddedTCMETMuonCorrs_(false),
117  embeddedCaloMETMuonCorrs_(false),
118  embeddedPickyMuon_(false),
119  embeddedTpfmsMuon_(false),
120  embeddedDytMuon_(false),
121  embeddedPFCandidate_(false),
122  pfCandidateRef_(),
123  cachedNormChi2_(false),
124  normChi2_(0.0),
125  cachedNumberOfValidHits_(false),
126  numberOfValidHits_(0),
127  pfEcalEnergy_(0),
128  jetPtRatio_(0),
129  jetPtRel_(0),
130  mvaValue_(0),
131  lowptMvaValue_(0),
132  mvaIDValue_(0),
133  softMvaValue_(0),
134  inverseBeta_(0),
135  inverseBetaErr_(0) {
136  initImpactParameters();
137  initSimInfo();
138 }
139 
141 Muon::~Muon() {}
142 
143 std::ostream& reco::operator<<(std::ostream& out, const pat::Muon& obj) {
144  if (!out)
145  return out;
146 
147  out << "\tpat::Muon: ";
148  out << std::setiosflags(std::ios::right);
149  out << std::setiosflags(std::ios::fixed);
150  out << std::setprecision(3);
151  out << " E/pT/eta/phi " << obj.energy() << "/" << obj.pt() << "/" << obj.eta() << "/" << obj.phi();
152  return out;
153 }
154 
155 // initialize impact parameter container vars
156 void Muon::initImpactParameters() {
157  std::fill(ip_, ip_ + IpTypeSize, 0.0f);
158  std::fill(eip_, eip_ + IpTypeSize, 0.0f);
159  cachedIP_ = 0;
160 }
161 
162 // initialize impact parameter container vars
163 void Muon::initSimInfo() {
164  simType_ = reco::MuonSimType::Unknown;
166  simFlavour_ = 0;
167  simHeaviestMotherFlavour_ = 0;
168  simPdgId_ = 0;
169  simMotherPdgId_ = 0;
170  simBX_ = 999;
171  simTpEvent_ = 0;
172  simProdRho_ = 0.0;
173  simProdZ_ = 0.0;
174  simPt_ = 0.0;
175  simEta_ = 0.0;
176  simPhi_ = 0.0;
177  simMatchQuality_ = 0.0;
178 }
179 
181 reco::TrackRef Muon::track() const {
182  if (embeddedTrack_) {
183  return reco::TrackRef(&track_, 0);
184  } else {
185  return reco::Muon::innerTrack();
186  }
187 }
188 
191  if (embeddedStandAloneMuon_) {
192  return reco::TrackRef(&standAloneMuon_, 0);
193  } else {
194  return reco::Muon::outerTrack();
195  }
196 }
197 
199 reco::TrackRef Muon::combinedMuon() const {
200  if (embeddedCombinedMuon_) {
201  return reco::TrackRef(&combinedMuon_, 0);
202  } else {
203  return reco::Muon::globalTrack();
204  }
205 }
206 
208 reco::TrackRef Muon::pickyTrack() const {
209  if (embeddedPickyMuon_) {
210  return reco::TrackRef(&pickyMuon_, 0);
211  } else {
212  return reco::Muon::pickyTrack();
213  }
214 }
215 
217 reco::TrackRef Muon::tpfmsTrack() const {
218  if (embeddedTpfmsMuon_) {
219  return reco::TrackRef(&tpfmsMuon_, 0);
220  } else {
221  return reco::Muon::tpfmsTrack();
222  }
223 }
224 
226 reco::TrackRef Muon::dytTrack() const {
227  if (embeddedDytMuon_) {
228  return reco::TrackRef(&dytMuon_, 0);
229  } else {
230  return reco::Muon::dytTrack();
231  }
232 }
233 
235 reco::TrackRef Muon::muonBestTrack() const {
236  if (!muonBestTrack_.empty()) {
237  return reco::TrackRef(&muonBestTrack_, 0);
238  } else {
239  return reco::Muon::muonBestTrack();
240  }
241 }
242 
244 reco::TrackRef Muon::tunePMuonBestTrack() const {
245  if (!tunePMuonBestTrack_.empty()) {
246  return reco::TrackRef(&tunePMuonBestTrack_, 0);
247  } else if (muonBestTrackType() == tunePMuonBestTrackType()) {
248  return muonBestTrack();
249  } else {
251  }
252 }
253 
255 reco::PFCandidateRef Muon::pfCandidateRef() const {
256  if (embeddedPFCandidate_) {
258  } else {
259  return pfCandidateRef_;
260  }
261 }
262 
265  if (pfCandidateRef_.isNonnull() && i == 0)
266  return reco::CandidatePtr(edm::refToPtr(pfCandidateRef_));
267  if (refToOrig_.isNonnull() && pfCandidateRef_.isNonnull() && i == 1)
268  return refToOrig_;
269  if (refToOrig_.isNonnull() && !pfCandidateRef_.isNonnull() && i == 0)
270  return refToOrig_;
271  return reco::CandidatePtr();
272 }
273 
275 void Muon::embedMuonBestTrack(bool force) {
276  muonBestTrack_.clear();
277  embeddedMuonBestTrack_ = false;
278  bool alreadyEmbedded = false;
279  if (!force) {
280  switch (muonBestTrackType()) {
281  case None:
282  alreadyEmbedded = true;
283  break;
284  case InnerTrack:
285  if (embeddedTrack_)
286  alreadyEmbedded = true;
287  break;
288  case OuterTrack:
289  if (embeddedStandAloneMuon_)
290  alreadyEmbedded = true;
291  break;
292  case CombinedTrack:
293  if (embeddedCombinedMuon_)
294  alreadyEmbedded = true;
295  break;
296  case TPFMS:
297  if (embeddedTpfmsMuon_)
298  alreadyEmbedded = true;
299  break;
300  case Picky:
301  if (embeddedPickyMuon_)
302  alreadyEmbedded = true;
303  break;
304  case DYT:
305  if (embeddedDytMuon_)
306  alreadyEmbedded = true;
307  break;
308  }
309  }
310  if (force || !alreadyEmbedded) {
311  muonBestTrack_.push_back(*reco::Muon::muonBestTrack());
312  embeddedMuonBestTrack_ = true;
313  }
314 }
315 
318  tunePMuonBestTrack_.clear();
319  bool alreadyEmbedded = false;
320  embeddedTunePMuonBestTrack_ = false;
321  if (!force) {
322  switch (tunePMuonBestTrackType()) {
323  case None:
324  alreadyEmbedded = true;
325  break;
326  case InnerTrack:
327  if (embeddedTrack_)
328  alreadyEmbedded = true;
329  break;
330  case OuterTrack:
331  if (embeddedStandAloneMuon_)
332  alreadyEmbedded = true;
333  break;
334  case CombinedTrack:
335  if (embeddedCombinedMuon_)
336  alreadyEmbedded = true;
337  break;
338  case TPFMS:
339  if (embeddedTpfmsMuon_)
340  alreadyEmbedded = true;
341  break;
342  case Picky:
343  if (embeddedPickyMuon_)
344  alreadyEmbedded = true;
345  break;
346  case DYT:
347  if (embeddedDytMuon_)
348  alreadyEmbedded = true;
349  break;
350  }
351  if (muonBestTrackType() == tunePMuonBestTrackType()) {
352  if (embeddedMuonBestTrack_)
353  alreadyEmbedded = true;
354  }
355  }
356  if (force || !alreadyEmbedded) {
357  tunePMuonBestTrack_.push_back(*reco::Muon::tunePMuonBestTrack());
358  embeddedTunePMuonBestTrack_ = true;
359  }
360 }
361 
363 void Muon::embedTrack() {
364  track_.clear();
365  if (reco::Muon::innerTrack().isNonnull()) {
366  track_.push_back(*reco::Muon::innerTrack());
367  embeddedTrack_ = true;
368  }
369 }
370 
373  standAloneMuon_.clear();
374  if (reco::Muon::outerTrack().isNonnull()) {
375  standAloneMuon_.push_back(*reco::Muon::outerTrack());
376  embeddedStandAloneMuon_ = true;
377  }
378 }
379 
382  combinedMuon_.clear();
383  if (reco::Muon::globalTrack().isNonnull()) {
384  combinedMuon_.push_back(*reco::Muon::globalTrack());
385  embeddedCombinedMuon_ = true;
386  }
387 }
388 
389 // recursively look for reassociated TrackExtraRefs in the edm::Associations and rekey
390 void Muon::rekeyEmbeddedTracks(std::vector<edm::Handle<edm::Association<reco::TrackExtraCollection>>> const& assocs) {
391  auto rekey = [&assocs](reco::Track& track) {
392  reco::TrackExtraRef trackExtra = track.extra();
393  for (auto const& assoc : assocs) {
394  if (!assoc->contains(trackExtra.id())) {
395  continue;
396  }
397  reco::TrackExtraRef const& trackExtraOut = (*assoc)[trackExtra];
398  if (trackExtraOut.isNonnull()) {
399  trackExtra = trackExtraOut;
400  }
401  }
402  track.setExtra(trackExtra);
403  };
404 
405  for (reco::Track& track : muonBestTrack_) {
406  rekey(track);
407  }
408  for (reco::Track& track : tunePMuonBestTrack_) {
409  rekey(track);
410  }
411  for (reco::Track& track : track_) {
412  rekey(track);
413  }
414  for (reco::Track& track : standAloneMuon_) {
415  rekey(track);
416  }
417  for (reco::Track& track : combinedMuon_) {
418  rekey(track);
419  }
420  for (reco::Track& track : pickyMuon_) {
421  rekey(track);
422  }
423  for (reco::Track& track : tpfmsMuon_) {
424  rekey(track);
425  }
426  for (reco::Track& track : dytMuon_) {
427  rekey(track);
428  }
429 }
430 
433  caloMETMuonCorrs_.clear();
434  caloMETMuonCorrs_.push_back(t);
435  embeddedCaloMETMuonCorrs_ = true;
436 }
437 
440  tcMETMuonCorrs_.clear();
441  tcMETMuonCorrs_.push_back(t);
442  embeddedTCMETMuonCorrs_ = true;
443 }
444 
446 void Muon::embedPickyMuon() {
447  pickyMuon_.clear();
449  if (tk.isNonnull()) {
450  pickyMuon_.push_back(*tk);
451  embeddedPickyMuon_ = true;
452  }
453 }
454 
456 void Muon::embedTpfmsMuon() {
457  tpfmsMuon_.clear();
459  if (tk.isNonnull()) {
460  tpfmsMuon_.push_back(*tk);
461  embeddedTpfmsMuon_ = true;
462  }
463 }
464 
466 void Muon::embedDytMuon() {
467  dytMuon_.clear();
469  if (tk.isNonnull()) {
470  dytMuon_.push_back(*tk);
471  embeddedDytMuon_ = true;
472  }
473 }
474 
476 void Muon::readTimeExtra(const reco::MuonTimeExtra& t) {
477  inverseBeta_ = t.inverseBeta();
478  inverseBetaErr_ = t.inverseBetaErr();
479 }
480 
482 void Muon::embedPFCandidate() {
483  pfCandidate_.clear();
484  if (pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
485  pfCandidate_.push_back(*pfCandidateRef_);
486  embeddedPFCandidate_ = true;
487  }
488 }
489 
490 bool Muon::muonID(const std::string& name) const {
492  return muon::isGoodMuon(*this, st);
493 }
494 
499 double Muon::normChi2() const {
500  if (cachedNormChi2_) {
501  return normChi2_;
502  } else {
504  return t->chi2() / t->ndof();
505  }
506 }
507 
512 unsigned int Muon::numberOfValidHits() const {
513  if (cachedNumberOfValidHits_) {
514  return numberOfValidHits_;
515  } else {
517  return t->numberOfValidHits();
518  }
519 }
520 
521 // embed various impact parameters with errors
522 // IpType defines the type of the impact parameter
523 double Muon::dB(IpType type_) const {
524  // more IP types (new)
525  if (cachedIP_ & (1 << int(type_))) {
526  return ip_[type_];
527  } else {
529  }
530 }
531 
532 // embed various impact parameters with errors
533 // IpType defines the type of the impact parameter
534 double Muon::edB(IpType type_) const {
535  // more IP types (new)
536  if (cachedIP_ & (1 << int(type_))) {
537  return eip_[type_];
538  } else {
540  }
541 }
542 
545 }
546 
547 // Selectors
548 bool Muon::isTightMuon(const reco::Vertex& vtx) const { return muon::isTightMuon(*this, vtx); }
549 
550 bool Muon::isLooseMuon() const { return muon::isLooseMuon(*this); }
551 
552 bool Muon::isMediumMuon() const { return muon::isMediumMuon(*this); }
553 
554 bool Muon::isSoftMuon(const reco::Vertex& vtx) const { return muon::isSoftMuon(*this, vtx); }
555 
556 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