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  initImpactParameters();
100  initSimInfo();
101 }
102 
104 Muon::Muon(const edm::Ptr<reco::Muon>& aMuonRef)
105  : Lepton<reco::Muon>(aMuonRef),
106  embeddedMuonBestTrack_(false),
107  embeddedTunePMuonBestTrack_(false),
108  embeddedTrack_(false),
109  embeddedStandAloneMuon_(false),
110  embeddedCombinedMuon_(false),
111  embeddedTCMETMuonCorrs_(false),
112  embeddedCaloMETMuonCorrs_(false),
113  embeddedPickyMuon_(false),
114  embeddedTpfmsMuon_(false),
115  embeddedDytMuon_(false),
116  embeddedPFCandidate_(false),
117  pfCandidateRef_(),
118  cachedNormChi2_(false),
119  normChi2_(0.0),
120  cachedNumberOfValidHits_(false),
121  numberOfValidHits_(0),
122  pfEcalEnergy_(0),
123  jetPtRatio_(0),
124  jetPtRel_(0),
125  mvaValue_(0),
126  lowptMvaValue_(0),
127  softMvaValue_(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  simProdRho_ = 0.0;
164  simProdZ_ = 0.0;
165  simPt_ = 0.0;
166  simEta_ = 0.0;
167  simPhi_ = 0.0;
168 }
169 
171 reco::TrackRef Muon::track() const {
172  if (embeddedTrack_) {
173  return reco::TrackRef(&track_, 0);
174  } else {
175  return reco::Muon::innerTrack();
176  }
177 }
178 
181  if (embeddedStandAloneMuon_) {
182  return reco::TrackRef(&standAloneMuon_, 0);
183  } else {
184  return reco::Muon::outerTrack();
185  }
186 }
187 
189 reco::TrackRef Muon::combinedMuon() const {
190  if (embeddedCombinedMuon_) {
191  return reco::TrackRef(&combinedMuon_, 0);
192  } else {
193  return reco::Muon::globalTrack();
194  }
195 }
196 
198 reco::TrackRef Muon::pickyTrack() const {
199  if (embeddedPickyMuon_) {
200  return reco::TrackRef(&pickyMuon_, 0);
201  } else {
202  return reco::Muon::pickyTrack();
203  }
204 }
205 
207 reco::TrackRef Muon::tpfmsTrack() const {
208  if (embeddedTpfmsMuon_) {
209  return reco::TrackRef(&tpfmsMuon_, 0);
210  } else {
211  return reco::Muon::tpfmsTrack();
212  }
213 }
214 
216 reco::TrackRef Muon::dytTrack() const {
217  if (embeddedDytMuon_) {
218  return reco::TrackRef(&dytMuon_, 0);
219  } else {
220  return reco::Muon::dytTrack();
221  }
222 }
223 
225 reco::TrackRef Muon::muonBestTrack() const {
226  if (!muonBestTrack_.empty()) {
227  return reco::TrackRef(&muonBestTrack_, 0);
228  } else {
229  return reco::Muon::muonBestTrack();
230  }
231 }
232 
234 reco::TrackRef Muon::tunePMuonBestTrack() const {
235  if (!tunePMuonBestTrack_.empty()) {
236  return reco::TrackRef(&tunePMuonBestTrack_, 0);
237  } else if (muonBestTrackType() == tunePMuonBestTrackType()) {
238  return muonBestTrack();
239  } else {
241  }
242 }
243 
245 reco::PFCandidateRef Muon::pfCandidateRef() const {
246  if (embeddedPFCandidate_) {
248  } else {
249  return pfCandidateRef_;
250  }
251 }
252 
255  if (pfCandidateRef_.isNonnull() && i == 0)
256  return reco::CandidatePtr(edm::refToPtr(pfCandidateRef_));
257  if (refToOrig_.isNonnull() && pfCandidateRef_.isNonnull() && i == 1)
258  return refToOrig_;
259  if (refToOrig_.isNonnull() && !pfCandidateRef_.isNonnull() && i == 0)
260  return refToOrig_;
261  return reco::CandidatePtr();
262 }
263 
265 void Muon::embedMuonBestTrack(bool force) {
266  muonBestTrack_.clear();
267  embeddedMuonBestTrack_ = false;
268  bool alreadyEmbedded = false;
269  if (!force) {
270  switch (muonBestTrackType()) {
271  case None:
272  alreadyEmbedded = true;
273  break;
274  case InnerTrack:
275  if (embeddedTrack_)
276  alreadyEmbedded = true;
277  break;
278  case OuterTrack:
279  if (embeddedStandAloneMuon_)
280  alreadyEmbedded = true;
281  break;
282  case CombinedTrack:
283  if (embeddedCombinedMuon_)
284  alreadyEmbedded = true;
285  break;
286  case TPFMS:
287  if (embeddedTpfmsMuon_)
288  alreadyEmbedded = true;
289  break;
290  case Picky:
291  if (embeddedPickyMuon_)
292  alreadyEmbedded = true;
293  break;
294  case DYT:
295  if (embeddedDytMuon_)
296  alreadyEmbedded = true;
297  break;
298  }
299  }
300  if (force || !alreadyEmbedded) {
301  muonBestTrack_.push_back(*reco::Muon::muonBestTrack());
302  embeddedMuonBestTrack_ = true;
303  }
304 }
305 
308  tunePMuonBestTrack_.clear();
309  bool alreadyEmbedded = false;
310  embeddedTunePMuonBestTrack_ = false;
311  if (!force) {
312  switch (tunePMuonBestTrackType()) {
313  case None:
314  alreadyEmbedded = true;
315  break;
316  case InnerTrack:
317  if (embeddedTrack_)
318  alreadyEmbedded = true;
319  break;
320  case OuterTrack:
321  if (embeddedStandAloneMuon_)
322  alreadyEmbedded = true;
323  break;
324  case CombinedTrack:
325  if (embeddedCombinedMuon_)
326  alreadyEmbedded = true;
327  break;
328  case TPFMS:
329  if (embeddedTpfmsMuon_)
330  alreadyEmbedded = true;
331  break;
332  case Picky:
333  if (embeddedPickyMuon_)
334  alreadyEmbedded = true;
335  break;
336  case DYT:
337  if (embeddedDytMuon_)
338  alreadyEmbedded = true;
339  break;
340  }
341  if (muonBestTrackType() == tunePMuonBestTrackType()) {
342  if (embeddedMuonBestTrack_)
343  alreadyEmbedded = true;
344  }
345  }
346  if (force || !alreadyEmbedded) {
347  tunePMuonBestTrack_.push_back(*reco::Muon::tunePMuonBestTrack());
348  embeddedTunePMuonBestTrack_ = true;
349  }
350 }
351 
353 void Muon::embedTrack() {
354  track_.clear();
355  if (reco::Muon::innerTrack().isNonnull()) {
356  track_.push_back(*reco::Muon::innerTrack());
357  embeddedTrack_ = true;
358  }
359 }
360 
363  standAloneMuon_.clear();
364  if (reco::Muon::outerTrack().isNonnull()) {
365  standAloneMuon_.push_back(*reco::Muon::outerTrack());
366  embeddedStandAloneMuon_ = true;
367  }
368 }
369 
372  combinedMuon_.clear();
373  if (reco::Muon::globalTrack().isNonnull()) {
374  combinedMuon_.push_back(*reco::Muon::globalTrack());
375  embeddedCombinedMuon_ = true;
376  }
377 }
378 
381  caloMETMuonCorrs_.clear();
382  caloMETMuonCorrs_.push_back(t);
383  embeddedCaloMETMuonCorrs_ = true;
384 }
385 
388  tcMETMuonCorrs_.clear();
389  tcMETMuonCorrs_.push_back(t);
390  embeddedTCMETMuonCorrs_ = true;
391 }
392 
394 void Muon::embedPickyMuon() {
395  pickyMuon_.clear();
397  if (tk.isNonnull()) {
398  pickyMuon_.push_back(*tk);
399  embeddedPickyMuon_ = true;
400  }
401 }
402 
404 void Muon::embedTpfmsMuon() {
405  tpfmsMuon_.clear();
407  if (tk.isNonnull()) {
408  tpfmsMuon_.push_back(*tk);
409  embeddedTpfmsMuon_ = true;
410  }
411 }
412 
414 void Muon::embedDytMuon() {
415  dytMuon_.clear();
417  if (tk.isNonnull()) {
418  dytMuon_.push_back(*tk);
419  embeddedDytMuon_ = true;
420  }
421 }
422 
424 void Muon::readTimeExtra(const reco::MuonTimeExtra& t) {
425  inverseBeta_ = t.inverseBeta();
426  inverseBetaErr_ = t.inverseBetaErr();
427 }
428 
430 void Muon::embedPFCandidate() {
431  pfCandidate_.clear();
432  if (pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
433  pfCandidate_.push_back(*pfCandidateRef_);
434  embeddedPFCandidate_ = true;
435  }
436 }
437 
438 bool Muon::muonID(const std::string& name) const {
440  return muon::isGoodMuon(*this, st);
441 }
442 
447 double Muon::normChi2() const {
448  if (cachedNormChi2_) {
449  return normChi2_;
450  } else {
452  return t->chi2() / t->ndof();
453  }
454 }
455 
460 unsigned int Muon::numberOfValidHits() const {
461  if (cachedNumberOfValidHits_) {
462  return numberOfValidHits_;
463  } else {
465  return t->numberOfValidHits();
466  }
467 }
468 
469 // embed various impact parameters with errors
470 // IpType defines the type of the impact parameter
471 double Muon::dB(IpType type_) const {
472  // more IP types (new)
473  if (cachedIP_ & (1 << int(type_))) {
474  return ip_[type_];
475  } else {
477  }
478 }
479 
480 // embed various impact parameters with errors
481 // IpType defines the type of the impact parameter
482 double Muon::edB(IpType type_) const {
483  // more IP types (new)
484  if (cachedIP_ & (1 << int(type_))) {
485  return eip_[type_];
486  } else {
488  }
489 }
490 
491 double Muon::segmentCompatibility(reco::Muon::ArbitrationType arbitrationType) const {
492  return muon::segmentCompatibility(*this, arbitrationType);
493 }
494 
495 // Selectors
496 bool Muon::isTightMuon(const reco::Vertex& vtx) const { return muon::isTightMuon(*this, vtx); }
497 
498 bool Muon::isLooseMuon() const { return muon::isLooseMuon(*this); }
499 
500 bool Muon::isMediumMuon() const { return muon::isMediumMuon(*this); }
501 
502 bool Muon::isSoftMuon(const reco::Vertex& vtx) const { return muon::isSoftMuon(*this, vtx); }
503 
504 bool Muon::isHighPtMuon(const reco::Vertex& vtx) const { return muon::isHighPtMuon(*this, vtx); }
float inverseBetaErr() const
Definition: MuonTimeExtra.h:28
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
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:45
reco::CandidatePtr pfCandidate_
CandidatePtr sourceCandidatePtr(size_type i) const override
embedDytMuon
embed in AOD externally stored TeV-refit TPFMS muon track
double pt() const final
transverse momentum
virtual TrackRef tpfmsTrack() const
Definition: Muon.h:54
bool isLooseMuon(const reco::Muon &)
SelectionType
Selector type.
Definition: MuonSelectors.h:19
Definition: HeavyIon.h:7
virtual TrackRef muonBestTrack() const
Definition: Muon.h:60
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
double energy() const final
energy
virtual TrackRef pickyTrack() const
Definition: Muon.h:55
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:48
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: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
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
virtual TrackRef dytTrack() const
Definition: Muon.h:56
fixed size matrix
embedTunePMuonBestTrack
embed in AOD externally stored muon best track from global pflow
virtual TrackRef tunePMuonBestTrack() const
Definition: Muon.h:62
Definition: Lepton.py:1
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
~Muon() override
Definition: Muon.cc:87
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:51