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  lowptMvaValue_(0),
37  softMvaValue_(0)
38 {
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 {
69  initImpactParameters();
70  initSimInfo();
71 }
72 
74 Muon::Muon(const edm::RefToBase<reco::Muon> & aMuonRef) :
75  Lepton<reco::Muon>(aMuonRef),
76  embeddedMuonBestTrack_(false),
77  embeddedTunePMuonBestTrack_(false),
78  embeddedTrack_(false),
79  embeddedStandAloneMuon_(false),
80  embeddedCombinedMuon_(false),
81  embeddedTCMETMuonCorrs_(false),
82  embeddedCaloMETMuonCorrs_(false),
83  embeddedPickyMuon_(false),
84  embeddedTpfmsMuon_(false),
85  embeddedDytMuon_(false),
86  embeddedPFCandidate_(false),
87  pfCandidateRef_(),
88  cachedNormChi2_(false),
89  normChi2_(0.0),
90  cachedNumberOfValidHits_(false),
91  numberOfValidHits_(0),
92  pfEcalEnergy_(0),
93  jetPtRatio_(0),
94  jetPtRel_(0),
95  mvaValue_(0),
96  lowptMvaValue_(0),
97  softMvaValue_(0)
98 {
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 {
129  initImpactParameters();
130  initSimInfo();
131 }
132 
134 Muon::~Muon() {
135 }
136 
137 std::ostream&
138 reco::operator<<(std::ostream& out, const pat::Muon& obj)
139 {
140  if(!out) return out;
141 
142  out << "\tpat::Muon: ";
143  out << std::setiosflags(std::ios::right);
144  out << std::setiosflags(std::ios::fixed);
145  out << std::setprecision(3);
146  out << " E/pT/eta/phi "
147  << obj.energy()<<"/"
148  << obj.pt()<<"/"
149  << obj.eta()<<"/"
150  << obj.phi();
151  return out;
152 }
153 
154 // initialize impact parameter container vars
155 void Muon::initImpactParameters() {
156  std::fill(ip_, ip_+IpTypeSize, 0.0f);
157  std::fill(eip_, eip_+IpTypeSize, 0.0f);
158  cachedIP_ = 0;
159 }
160 
161 // initialize impact parameter container vars
162 void Muon::initSimInfo() {
163  simType_ = reco::MuonSimType::Unknown;
165  simFlavour_ = 0;
166  simHeaviestMotherFlavour_ = 0;
167  simPdgId_ = 0;
168  simMotherPdgId_ = 0;
169  simBX_ = 999;
170  simProdRho_ = 0.0;
171  simProdZ_ = 0.0;
172  simPt_ = 0.0;
173  simEta_ = 0.0;
174  simPhi_ = 0.0;
175 }
176 
177 
179 reco::TrackRef Muon::track() const {
180  if (embeddedTrack_) {
181  return reco::TrackRef(&track_, 0);
182  } else {
183  return reco::Muon::innerTrack();
184  }
185 }
186 
187 
190  if (embeddedStandAloneMuon_) {
191  return reco::TrackRef(&standAloneMuon_, 0);
192  } else {
193  return reco::Muon::outerTrack();
194  }
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 
254 
255 
256 
258 reco::PFCandidateRef Muon::pfCandidateRef() const {
259  if (embeddedPFCandidate_) {
261  } else {
262  return pfCandidateRef_;
263  }
264 }
265 
268  if(pfCandidateRef_.isNonnull() && i==0 ) return reco::CandidatePtr(edm::refToPtr(pfCandidateRef_) );
269  if(refToOrig_.isNonnull() && pfCandidateRef_.isNonnull() && i==1 ) return refToOrig_;
270  if(refToOrig_.isNonnull() && ! pfCandidateRef_.isNonnull() && i==0 ) 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: alreadyEmbedded = true; break;
282  case InnerTrack: if (embeddedTrack_) alreadyEmbedded = true; break;
283  case OuterTrack: if (embeddedStandAloneMuon_) alreadyEmbedded = true; break;
284  case CombinedTrack: if (embeddedCombinedMuon_) alreadyEmbedded = true; break;
285  case TPFMS: if (embeddedTpfmsMuon_) alreadyEmbedded = true; break;
286  case Picky: if (embeddedPickyMuon_) alreadyEmbedded = true; break;
287  case DYT: if (embeddedDytMuon_) alreadyEmbedded = true; break;
288  }
289  }
290  if (force || !alreadyEmbedded) {
291  muonBestTrack_.push_back(*reco::Muon::muonBestTrack());
292  embeddedMuonBestTrack_ = true;
293  }
294 }
295 
298  tunePMuonBestTrack_.clear();
299  bool alreadyEmbedded = false;
300  embeddedTunePMuonBestTrack_ = false;
301  if (!force) {
302  switch (tunePMuonBestTrackType()) {
303  case None: alreadyEmbedded = true; break;
304  case InnerTrack: if (embeddedTrack_) alreadyEmbedded = true; break;
305  case OuterTrack: if (embeddedStandAloneMuon_) alreadyEmbedded = true; break;
306  case CombinedTrack: if (embeddedCombinedMuon_) alreadyEmbedded = true; break;
307  case TPFMS: if (embeddedTpfmsMuon_) alreadyEmbedded = true; break;
308  case Picky: if (embeddedPickyMuon_) alreadyEmbedded = true; break;
309  case DYT: if (embeddedDytMuon_) alreadyEmbedded = true; break;
310  }
311  if (muonBestTrackType() == tunePMuonBestTrackType()) {
312  if (embeddedMuonBestTrack_) alreadyEmbedded = true;
313  }
314  }
315  if (force || !alreadyEmbedded) {
316  tunePMuonBestTrack_.push_back(*reco::Muon::tunePMuonBestTrack());
317  embeddedTunePMuonBestTrack_ = true;
318  }
319 }
320 
321 
323 void Muon::embedTrack() {
324  track_.clear();
325  if (reco::Muon::innerTrack().isNonnull()) {
326  track_.push_back(*reco::Muon::innerTrack());
327  embeddedTrack_ = true;
328  }
329 }
330 
331 
334  standAloneMuon_.clear();
335  if (reco::Muon::outerTrack().isNonnull()) {
336  standAloneMuon_.push_back(*reco::Muon::outerTrack());
337  embeddedStandAloneMuon_ = true;
338  }
339 }
340 
341 
344  combinedMuon_.clear();
345  if (reco::Muon::globalTrack().isNonnull()) {
346  combinedMuon_.push_back(*reco::Muon::globalTrack());
347  embeddedCombinedMuon_ = true;
348  }
349 }
350 
353  caloMETMuonCorrs_.clear();
354  caloMETMuonCorrs_.push_back(t);
355  embeddedCaloMETMuonCorrs_ = true;
356 }
357 
360  tcMETMuonCorrs_.clear();
361  tcMETMuonCorrs_.push_back(t);
362  embeddedTCMETMuonCorrs_ = true;
363 }
364 
366 void Muon::embedPickyMuon() {
367  pickyMuon_.clear();
369  if (tk.isNonnull()) {
370  pickyMuon_.push_back(*tk);
371  embeddedPickyMuon_ = true;
372  }
373 }
374 
376 void Muon::embedTpfmsMuon() {
377  tpfmsMuon_.clear();
379  if (tk.isNonnull()) {
380  tpfmsMuon_.push_back(*tk);
381  embeddedTpfmsMuon_ = true;
382  }
383 }
384 
386 void Muon::embedDytMuon() {
387  dytMuon_.clear();
389  if (tk.isNonnull()) {
390  dytMuon_.push_back(*tk);
391  embeddedDytMuon_ = true;
392  }
393 }
394 
396 void Muon::embedPFCandidate() {
397  pfCandidate_.clear();
398  if ( pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
399  pfCandidate_.push_back( *pfCandidateRef_ );
400  embeddedPFCandidate_ = true;
401  }
402 }
403 
404 bool Muon::muonID(const std::string& name) const {
406  return muon::isGoodMuon(*this, st);
407 }
408 
409 
414 double Muon::normChi2() const {
415  if ( cachedNormChi2_ ) {
416  return normChi2_;
417  } else {
419  return t->chi2() / t->ndof();
420  }
421 }
422 
427 unsigned int Muon::numberOfValidHits() const {
428  if ( cachedNumberOfValidHits_ ) {
429  return numberOfValidHits_;
430  } else {
432  return t->numberOfValidHits();
433  }
434 }
435 
436 // embed various impact parameters with errors
437 // IpType defines the type of the impact parameter
438 double Muon::dB(IpType type_) const {
439  // more IP types (new)
440  if ( cachedIP_ & (1 << int(type_))) {
441  return ip_[type_];
442  } else {
444  }
445 }
446 
447 
448 // embed various impact parameters with errors
449 // IpType defines the type of the impact parameter
450 double Muon::edB(IpType type_) const {
451  // more IP types (new)
452  if ( cachedIP_ & (1 << int(type_))) {
453  return eip_[type_];
454  } else {
456  }
457 }
458 
459 
460 double Muon::segmentCompatibility(reco::Muon::ArbitrationType arbitrationType) const {
461  return muon::segmentCompatibility(*this, arbitrationType);
462 }
463 
464 // Selectors
465 bool Muon::isTightMuon(const reco::Vertex&vtx) const {
466  return muon::isTightMuon(*this, vtx);
467 }
468 
469 bool Muon::isLooseMuon() const {
470  return muon::isLooseMuon(*this);
471 
472 }
473 
474 bool Muon::isMediumMuon() const {
475  return muon::isMediumMuon(*this);
476 
477 }
478 
479 bool Muon::isSoftMuon(const reco::Vertex& vtx) const {
480  return muon::isSoftMuon(*this, vtx);
481 }
482 
483 
484 bool Muon::isHighPtMuon(const reco::Vertex& vtx) const{
485  return muon::isHighPtMuon(*this, vtx);
486 }
487 
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: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)
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:50
Muon()
Definition: Muon.cc:3
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54