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 
12 
14 Muon::Muon() :
15  Lepton<reco::Muon>(),
16  embeddedMuonBestTrack_(false),
17  embeddedTunePMuonBestTrack_(false),
18  embeddedTrack_(false),
19  embeddedStandAloneMuon_(false),
20  embeddedCombinedMuon_(false),
21  embeddedTCMETMuonCorrs_(false),
22  embeddedCaloMETMuonCorrs_(false),
23  embeddedPickyMuon_(false),
24  embeddedTpfmsMuon_(false),
25  embeddedDytMuon_(false),
26  embeddedPFCandidate_(false),
27  pfCandidateRef_(),
28  cachedNormChi2_(false),
29  normChi2_(0.0),
30  cachedNumberOfValidHits_(false),
31  numberOfValidHits_(0),
32  pfEcalEnergy_(0),
33  jetPtRatio_(0),
34  jetPtRel_(0),
35  mvaValue_(0),
36  softMvaValue_(0)
37 {
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  mvaValue_(0),
65  softMvaValue_(0)
66 {
67  initImpactParameters();
68  initSimInfo();
69 }
70 
72 Muon::Muon(const edm::RefToBase<reco::Muon> & aMuonRef) :
73  Lepton<reco::Muon>(aMuonRef),
74  embeddedMuonBestTrack_(false),
75  embeddedTunePMuonBestTrack_(false),
76  embeddedTrack_(false),
77  embeddedStandAloneMuon_(false),
78  embeddedCombinedMuon_(false),
79  embeddedTCMETMuonCorrs_(false),
80  embeddedCaloMETMuonCorrs_(false),
81  embeddedPickyMuon_(false),
82  embeddedTpfmsMuon_(false),
83  embeddedDytMuon_(false),
84  embeddedPFCandidate_(false),
85  pfCandidateRef_(),
86  cachedNormChi2_(false),
87  normChi2_(0.0),
88  cachedNumberOfValidHits_(false),
89  numberOfValidHits_(0),
90  pfEcalEnergy_(0),
91  jetPtRatio_(0),
92  jetPtRel_(0),
93  mvaValue_(0),
94  softMvaValue_(0)
95 {
96  initImpactParameters();
97  initSimInfo();
98 }
99 
101 Muon::Muon(const edm::Ptr<reco::Muon> & aMuonRef) :
102  Lepton<reco::Muon>(aMuonRef),
103  embeddedMuonBestTrack_(false),
104  embeddedTunePMuonBestTrack_(false),
105  embeddedTrack_(false),
106  embeddedStandAloneMuon_(false),
107  embeddedCombinedMuon_(false),
108  embeddedTCMETMuonCorrs_(false),
109  embeddedCaloMETMuonCorrs_(false),
110  embeddedPickyMuon_(false),
111  embeddedTpfmsMuon_(false),
112  embeddedDytMuon_(false),
113  embeddedPFCandidate_(false),
114  pfCandidateRef_(),
115  cachedNormChi2_(false),
116  normChi2_(0.0),
117  cachedNumberOfValidHits_(false),
118  numberOfValidHits_(0),
119  pfEcalEnergy_(0),
120  jetPtRatio_(0),
121  jetPtRel_(0),
122  mvaValue_(0),
123  softMvaValue_(0)
124 {
125  initImpactParameters();
126  initSimInfo();
127 }
128 
130 Muon::~Muon() {
131 }
132 
133 std::ostream&
134 reco::operator<<(std::ostream& out, const pat::Muon& obj)
135 {
136  if(!out) return out;
137 
138  out << "\tpat::Muon: ";
139  out << std::setiosflags(std::ios::right);
140  out << std::setiosflags(std::ios::fixed);
141  out << std::setprecision(3);
142  out << " E/pT/eta/phi "
143  << obj.energy()<<"/"
144  << obj.pt()<<"/"
145  << obj.eta()<<"/"
146  << obj.phi();
147  return out;
148 }
149 
150 // initialize impact parameter container vars
151 void Muon::initImpactParameters() {
152  std::fill(ip_, ip_+IpTypeSize, 0.0f);
153  std::fill(eip_, eip_+IpTypeSize, 0.0f);
154  cachedIP_ = 0;
155 }
156 
157 // initialize impact parameter container vars
158 void Muon::initSimInfo() {
159  simType_ = reco::MuonSimType::Unknown;
161  simFlavour_ = 0;
162  simHeaviestMotherFlavour_ = 0;
163  simPdgId_ = 0;
164  simMotherPdgId_ = 0;
165  simBX_ = 999;
166  simProdRho_ = 0.0;
167  simProdZ_ = 0.0;
168  simPt_ = 0.0;
169  simEta_ = 0.0;
170  simPhi_ = 0.0;
171 }
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 
183 
186  if (embeddedStandAloneMuon_) {
187  return reco::TrackRef(&standAloneMuon_, 0);
188  } else {
189  return reco::Muon::outerTrack();
190  }
191 }
192 
193 
195 reco::TrackRef Muon::combinedMuon() const {
196  if (embeddedCombinedMuon_) {
197  return reco::TrackRef(&combinedMuon_, 0);
198  } else {
199  return reco::Muon::globalTrack();
200  }
201 }
202 
204 reco::TrackRef Muon::pickyTrack() const {
205  if (embeddedPickyMuon_) {
206  return reco::TrackRef(&pickyMuon_, 0);
207  } else {
208  return reco::Muon::pickyTrack();
209  }
210 }
211 
213 reco::TrackRef Muon::tpfmsTrack() const {
214  if (embeddedTpfmsMuon_) {
215  return reco::TrackRef(&tpfmsMuon_, 0);
216  } else {
217  return reco::Muon::tpfmsTrack();
218  }
219 }
220 
222 reco::TrackRef Muon::dytTrack() const {
223  if (embeddedDytMuon_) {
224  return reco::TrackRef(&dytMuon_, 0);
225  } else {
226  return reco::Muon::dytTrack();
227  }
228 }
229 
231 reco::TrackRef Muon::muonBestTrack() const {
232  if (!muonBestTrack_.empty()) {
233  return reco::TrackRef(&muonBestTrack_, 0);
234  } else {
235  return reco::Muon::muonBestTrack();
236  }
237 }
238 
240 reco::TrackRef Muon::tunePMuonBestTrack() const {
241  if (!tunePMuonBestTrack_.empty()) {
242  return reco::TrackRef(&tunePMuonBestTrack_, 0);
243  } else if (muonBestTrackType() == tunePMuonBestTrackType()) {
244  return muonBestTrack();
245  } else {
247  }
248 }
249 
250 
251 
252 
254 reco::PFCandidateRef Muon::pfCandidateRef() const {
255  if (embeddedPFCandidate_) {
257  } else {
258  return pfCandidateRef_;
259  }
260 }
261 
264  if(pfCandidateRef_.isNonnull() && i==0 ) return reco::CandidatePtr(edm::refToPtr(pfCandidateRef_) );
265  if(refToOrig_.isNonnull() && pfCandidateRef_.isNonnull() && i==1 ) return refToOrig_;
266  if(refToOrig_.isNonnull() && ! pfCandidateRef_.isNonnull() && i==0 ) return refToOrig_;
267  return reco::CandidatePtr();
268 }
269 
271 void Muon::embedMuonBestTrack(bool force) {
272  muonBestTrack_.clear();
273  embeddedMuonBestTrack_ = false;
274  bool alreadyEmbedded = false;
275  if (!force) {
276  switch (muonBestTrackType()) {
277  case None: alreadyEmbedded = true; break;
278  case InnerTrack: if (embeddedTrack_) alreadyEmbedded = true; break;
279  case OuterTrack: if (embeddedStandAloneMuon_) alreadyEmbedded = true; break;
280  case CombinedTrack: if (embeddedCombinedMuon_) alreadyEmbedded = true; break;
281  case TPFMS: if (embeddedTpfmsMuon_) alreadyEmbedded = true; break;
282  case Picky: if (embeddedPickyMuon_) alreadyEmbedded = true; break;
283  case DYT: if (embeddedDytMuon_) alreadyEmbedded = true; break;
284  }
285  }
286  if (force || !alreadyEmbedded) {
287  muonBestTrack_.push_back(*reco::Muon::muonBestTrack());
288  embeddedMuonBestTrack_ = true;
289  }
290 }
291 
294  tunePMuonBestTrack_.clear();
295  bool alreadyEmbedded = false;
296  embeddedTunePMuonBestTrack_ = false;
297  if (!force) {
298  switch (tunePMuonBestTrackType()) {
299  case None: alreadyEmbedded = true; break;
300  case InnerTrack: if (embeddedTrack_) alreadyEmbedded = true; break;
301  case OuterTrack: if (embeddedStandAloneMuon_) alreadyEmbedded = true; break;
302  case CombinedTrack: if (embeddedCombinedMuon_) alreadyEmbedded = true; break;
303  case TPFMS: if (embeddedTpfmsMuon_) alreadyEmbedded = true; break;
304  case Picky: if (embeddedPickyMuon_) alreadyEmbedded = true; break;
305  case DYT: if (embeddedDytMuon_) alreadyEmbedded = true; break;
306  }
307  if (muonBestTrackType() == tunePMuonBestTrackType()) {
308  if (embeddedMuonBestTrack_) alreadyEmbedded = true;
309  }
310  }
311  if (force || !alreadyEmbedded) {
312  tunePMuonBestTrack_.push_back(*reco::Muon::tunePMuonBestTrack());
313  embeddedTunePMuonBestTrack_ = true;
314  }
315 }
316 
317 
319 void Muon::embedTrack() {
320  track_.clear();
321  if (reco::Muon::innerTrack().isNonnull()) {
322  track_.push_back(*reco::Muon::innerTrack());
323  embeddedTrack_ = true;
324  }
325 }
326 
327 
330  standAloneMuon_.clear();
331  if (reco::Muon::outerTrack().isNonnull()) {
332  standAloneMuon_.push_back(*reco::Muon::outerTrack());
333  embeddedStandAloneMuon_ = true;
334  }
335 }
336 
337 
340  combinedMuon_.clear();
341  if (reco::Muon::globalTrack().isNonnull()) {
342  combinedMuon_.push_back(*reco::Muon::globalTrack());
343  embeddedCombinedMuon_ = true;
344  }
345 }
346 
349  caloMETMuonCorrs_.clear();
350  caloMETMuonCorrs_.push_back(t);
351  embeddedCaloMETMuonCorrs_ = true;
352 }
353 
356  tcMETMuonCorrs_.clear();
357  tcMETMuonCorrs_.push_back(t);
358  embeddedTCMETMuonCorrs_ = true;
359 }
360 
362 void Muon::embedPickyMuon() {
363  pickyMuon_.clear();
365  if (tk.isNonnull()) {
366  pickyMuon_.push_back(*tk);
367  embeddedPickyMuon_ = true;
368  }
369 }
370 
372 void Muon::embedTpfmsMuon() {
373  tpfmsMuon_.clear();
375  if (tk.isNonnull()) {
376  tpfmsMuon_.push_back(*tk);
377  embeddedTpfmsMuon_ = true;
378  }
379 }
380 
382 void Muon::embedDytMuon() {
383  dytMuon_.clear();
385  if (tk.isNonnull()) {
386  dytMuon_.push_back(*tk);
387  embeddedDytMuon_ = true;
388  }
389 }
390 
392 void Muon::embedPFCandidate() {
393  pfCandidate_.clear();
394  if ( pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
395  pfCandidate_.push_back( *pfCandidateRef_ );
396  embeddedPFCandidate_ = true;
397  }
398 }
399 
400 bool Muon::muonID(const std::string& name) const {
402  return muon::isGoodMuon(*this, st);
403 }
404 
405 
410 double Muon::normChi2() const {
411  if ( cachedNormChi2_ ) {
412  return normChi2_;
413  } else {
415  return t->chi2() / t->ndof();
416  }
417 }
418 
423 unsigned int Muon::numberOfValidHits() const {
424  if ( cachedNumberOfValidHits_ ) {
425  return numberOfValidHits_;
426  } else {
428  return t->numberOfValidHits();
429  }
430 }
431 
432 // embed various impact parameters with errors
433 // IpType defines the type of the impact parameter
434 double Muon::dB(IpType type_) const {
435  // more IP types (new)
436  if ( cachedIP_ & (1 << int(type_))) {
437  return ip_[type_];
438  } else {
440  }
441 }
442 
443 
444 // embed various impact parameters with errors
445 // IpType defines the type of the impact parameter
446 double Muon::edB(IpType type_) const {
447  // more IP types (new)
448  if ( cachedIP_ & (1 << int(type_))) {
449  return eip_[type_];
450  } else {
452  }
453 }
454 
455 
456 double Muon::segmentCompatibility(reco::Muon::ArbitrationType arbitrationType) const {
457  return muon::segmentCompatibility(*this, arbitrationType);
458 }
459 
460 // Selectors
461 bool Muon::isTightMuon(const reco::Vertex&vtx) const {
462  return muon::isTightMuon(*this, vtx);
463 }
464 
465 bool Muon::isLooseMuon() const {
466  return muon::isLooseMuon(*this);
467 
468 }
469 
470 bool Muon::isMediumMuon() const {
471  return muon::isMediumMuon(*this);
472 
473 }
474 
475 bool Muon::isSoftMuon(const reco::Vertex& vtx) const {
476  return muon::isSoftMuon(*this, vtx);
477 }
478 
479 
480 bool Muon::isHighPtMuon(const reco::Vertex& vtx) const{
481  return muon::isHighPtMuon(*this, vtx);
482 }
483 
embedCombinedMuon
whether to embed in AOD externally stored standalone muon track
embedPFCandidate
embed in AOD externally stored the electron&#39;s pflow preshower clusters
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:253
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)
virtual TrackRef innerTrack() const
Definition: Muon.h:48
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
reco::PFCandidatePtr pfCandidate_
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:20
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:50
Muon()
Definition: Muon.cc:3
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54