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 
385  caloMETMuonCorrs_.clear();
386  caloMETMuonCorrs_.push_back(t);
387  embeddedCaloMETMuonCorrs_ = true;
388 }
389 
392  tcMETMuonCorrs_.clear();
393  tcMETMuonCorrs_.push_back(t);
394  embeddedTCMETMuonCorrs_ = true;
395 }
396 
398 void Muon::embedPickyMuon() {
399  pickyMuon_.clear();
401  if (tk.isNonnull()) {
402  pickyMuon_.push_back(*tk);
403  embeddedPickyMuon_ = true;
404  }
405 }
406 
408 void Muon::embedTpfmsMuon() {
409  tpfmsMuon_.clear();
411  if (tk.isNonnull()) {
412  tpfmsMuon_.push_back(*tk);
413  embeddedTpfmsMuon_ = true;
414  }
415 }
416 
418 void Muon::embedDytMuon() {
419  dytMuon_.clear();
421  if (tk.isNonnull()) {
422  dytMuon_.push_back(*tk);
423  embeddedDytMuon_ = true;
424  }
425 }
426 
428 void Muon::readTimeExtra(const reco::MuonTimeExtra& t) {
429  inverseBeta_ = t.inverseBeta();
430  inverseBetaErr_ = t.inverseBetaErr();
431 }
432 
434 void Muon::embedPFCandidate() {
435  pfCandidate_.clear();
436  if (pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
437  pfCandidate_.push_back(*pfCandidateRef_);
438  embeddedPFCandidate_ = true;
439  }
440 }
441 
442 bool Muon::muonID(const std::string& name) const {
444  return muon::isGoodMuon(*this, st);
445 }
446 
451 double Muon::normChi2() const {
452  if (cachedNormChi2_) {
453  return normChi2_;
454  } else {
456  return t->chi2() / t->ndof();
457  }
458 }
459 
464 unsigned int Muon::numberOfValidHits() const {
465  if (cachedNumberOfValidHits_) {
466  return numberOfValidHits_;
467  } else {
469  return t->numberOfValidHits();
470  }
471 }
472 
473 // embed various impact parameters with errors
474 // IpType defines the type of the impact parameter
475 double Muon::dB(IpType type_) const {
476  // more IP types (new)
477  if (cachedIP_ & (1 << int(type_))) {
478  return ip_[type_];
479  } else {
481  }
482 }
483 
484 // embed various impact parameters with errors
485 // IpType defines the type of the impact parameter
486 double Muon::edB(IpType type_) const {
487  // more IP types (new)
488  if (cachedIP_ & (1 << int(type_))) {
489  return eip_[type_];
490  } else {
492  }
493 }
494 
495 double Muon::segmentCompatibility(reco::Muon::ArbitrationType arbitrationType) const {
496  return muon::segmentCompatibility(*this, arbitrationType);
497 }
498 
499 // Selectors
500 bool Muon::isTightMuon(const reco::Vertex& vtx) const { return muon::isTightMuon(*this, vtx); }
501 
502 bool Muon::isLooseMuon() const { return muon::isLooseMuon(*this); }
503 
504 bool Muon::isMediumMuon() const { return muon::isMediumMuon(*this); }
505 
506 bool Muon::isSoftMuon(const reco::Vertex& vtx) const { return muon::isSoftMuon(*this, vtx); }
507 
508 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
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