CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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  cachedDB_(false),
30  cachedNumberOfValidHits_(0),
31  normChi2_(0.0),
32  dB_(0.0),
33  edB_(0.0),
34  numberOfValidHits_(0)
35 {
36  initImpactParameters();
37 }
38 
40 Muon::Muon(const reco::Muon & aMuon) :
41  Lepton<reco::Muon>(aMuon),
42  embeddedMuonBestTrack_(false),
43  embeddedTunePMuonBestTrack_(false),
44  embeddedTrack_(false),
45  embeddedStandAloneMuon_(false),
46  embeddedCombinedMuon_(false),
47  embeddedTCMETMuonCorrs_(false),
48  embeddedCaloMETMuonCorrs_(false),
49  embeddedPickyMuon_(false),
50  embeddedTpfmsMuon_(false),
51  embeddedDytMuon_(false),
52  embeddedPFCandidate_(false),
53  pfCandidateRef_(),
54  cachedNormChi2_(false),
55  cachedDB_(false),
56  cachedNumberOfValidHits_(0),
57  normChi2_(0.0),
58  dB_(0.0),
59  edB_(0.0),
60  numberOfValidHits_(0)
61 {
62  initImpactParameters();
63 }
64 
66 Muon::Muon(const edm::RefToBase<reco::Muon> & aMuonRef) :
67  Lepton<reco::Muon>(aMuonRef),
68  embeddedMuonBestTrack_(false),
69  embeddedTunePMuonBestTrack_(false),
70  embeddedTrack_(false),
71  embeddedStandAloneMuon_(false),
72  embeddedCombinedMuon_(false),
73  embeddedTCMETMuonCorrs_(false),
74  embeddedCaloMETMuonCorrs_(false),
75  embeddedPickyMuon_(false),
76  embeddedTpfmsMuon_(false),
77  embeddedDytMuon_(false),
78  embeddedPFCandidate_(false),
79  pfCandidateRef_(),
80  cachedNormChi2_(false),
81  cachedDB_(false),
82  cachedNumberOfValidHits_(0),
83  normChi2_(0.0),
84  dB_(0.0),
85  edB_(0.0),
86  numberOfValidHits_(0)
87 {
88  initImpactParameters();
89 }
90 
92 Muon::Muon(const edm::Ptr<reco::Muon> & aMuonRef) :
93  Lepton<reco::Muon>(aMuonRef),
94  embeddedMuonBestTrack_(false),
95  embeddedTunePMuonBestTrack_(false),
96  embeddedTrack_(false),
97  embeddedStandAloneMuon_(false),
98  embeddedCombinedMuon_(false),
99  embeddedTCMETMuonCorrs_(false),
100  embeddedCaloMETMuonCorrs_(false),
101  embeddedPickyMuon_(false),
102  embeddedTpfmsMuon_(false),
103  embeddedDytMuon_(false),
104  embeddedPFCandidate_(false),
105  pfCandidateRef_(),
106  cachedNormChi2_(false),
107  cachedDB_(false),
108  cachedNumberOfValidHits_(0),
109  normChi2_(0.0),
110  dB_(0.0),
111  edB_(0.0),
112  numberOfValidHits_(0)
113 {
114  initImpactParameters();
115 }
116 
118 Muon::~Muon() {
119 }
120 
121 std::ostream&
122 reco::operator<<(std::ostream& out, const pat::Muon& obj)
123 {
124  if(!out) return out;
125 
126  out << "\tpat::Muon: ";
127  out << std::setiosflags(std::ios::right);
128  out << std::setiosflags(std::ios::fixed);
129  out << std::setprecision(3);
130  out << " E/pT/eta/phi "
131  << obj.energy()<<"/"
132  << obj.pt()<<"/"
133  << obj.eta()<<"/"
134  << obj.phi();
135  return out;
136 }
137 
138 // initialize impact parameter container vars
139 void Muon::initImpactParameters() {
140  for (int i_ = 0; i_<5; ++i_){
141  ip_.push_back(0.0);
142  eip_.push_back(0.0);
143  cachedIP_.push_back(false);
144  }
145 }
146 
147 
149 reco::TrackRef Muon::track() const {
150  if (embeddedTrack_) {
151  return reco::TrackRef(&track_, 0);
152  } else {
153  return reco::Muon::innerTrack();
154  }
155 }
156 
157 
160  if (embeddedStandAloneMuon_) {
161  return reco::TrackRef(&standAloneMuon_, 0);
162  } else {
163  return reco::Muon::outerTrack();
164  }
165 }
166 
167 
169 reco::TrackRef Muon::combinedMuon() const {
170  if (embeddedCombinedMuon_) {
171  return reco::TrackRef(&combinedMuon_, 0);
172  } else {
173  return reco::Muon::globalTrack();
174  }
175 }
176 
178 reco::TrackRef Muon::pickyTrack() const {
179  if (embeddedPickyMuon_) {
180  return reco::TrackRef(&pickyMuon_, 0);
181  } else {
182  return reco::Muon::pickyTrack();
183  }
184 }
185 
187 reco::TrackRef Muon::tpfmsTrack() const {
188  if (embeddedTpfmsMuon_) {
189  return reco::TrackRef(&tpfmsMuon_, 0);
190  } else {
191  return reco::Muon::tpfmsTrack();
192  }
193 }
194 
196 reco::TrackRef Muon::dytTrack() const {
197  if (embeddedDytMuon_) {
198  return reco::TrackRef(&dytMuon_, 0);
199  } else {
200  return reco::Muon::dytTrack();
201  }
202 }
203 
205 reco::TrackRef Muon::muonBestTrack() const {
206  if (!muonBestTrack_.empty()) {
207  return reco::TrackRef(&muonBestTrack_, 0);
208  } else {
209  return reco::Muon::muonBestTrack();
210  }
211 }
212 
214 reco::TrackRef Muon::tunePMuonBestTrack() const {
215  if (!tunePMuonBestTrack_.empty()) {
216  return reco::TrackRef(&tunePMuonBestTrack_, 0);
217  } else if (muonBestTrackType() == tunePMuonBestTrackType()) {
218  return muonBestTrack();
219  } else {
221  }
222 }
223 
224 
225 
226 
228 reco::PFCandidateRef Muon::pfCandidateRef() const {
229  if (embeddedPFCandidate_) {
231  } else {
232  return pfCandidateRef_;
233  }
234 }
235 
238  if(pfCandidateRef_.isNonnull() && i==0 ) return reco::CandidatePtr(edm::refToPtr(pfCandidateRef_) );
239  if(refToOrig_.isNonnull() && pfCandidateRef_.isNonnull() && i==1 ) return refToOrig_;
240  if(refToOrig_.isNonnull() && ! pfCandidateRef_.isNonnull() && i==0 ) return refToOrig_;
241  return reco::CandidatePtr();
242 }
243 
245 void Muon::embedMuonBestTrack(bool force) {
246  muonBestTrack_.clear();
247  embeddedMuonBestTrack_ = false;
248  bool alreadyEmbedded = force;
249  if (!force) {
250  switch (muonBestTrackType()) {
251  case None: alreadyEmbedded = true; break;
252  case InnerTrack: if (embeddedTrack_) alreadyEmbedded = true; break;
253  case OuterTrack: if (embeddedStandAloneMuon_) alreadyEmbedded = true; break;
254  case CombinedTrack: if (embeddedCombinedMuon_) alreadyEmbedded = true; break;
255  case TPFMS: if (embeddedTpfmsMuon_) alreadyEmbedded = true; break;
256  case Picky: if (embeddedPickyMuon_) alreadyEmbedded = true; break;
257  case DYT: if (embeddedDytMuon_) alreadyEmbedded = true; break;
258  }
259  }
260  if (!alreadyEmbedded) {
261  muonBestTrack_.push_back(*reco::Muon::muonBestTrack());
262  embeddedMuonBestTrack_ = true;
263  }
264 }
265 
267 void Muon::embedTunePMuonBestTrack(bool force) {
268  tunePMuonBestTrack_.clear();
269  bool alreadyEmbedded = force;
270  embeddedTunePMuonBestTrack_ = false;
271  if (!force) {
272  switch (muonBestTrackType()) {
273  case None: alreadyEmbedded = true; break;
274  case InnerTrack: if (embeddedTrack_) alreadyEmbedded = true; break;
275  case OuterTrack: if (embeddedStandAloneMuon_) alreadyEmbedded = true; break;
276  case CombinedTrack: if (embeddedCombinedMuon_) alreadyEmbedded = true; break;
277  case TPFMS: if (embeddedTpfmsMuon_) alreadyEmbedded = true; break;
278  case Picky: if (embeddedPickyMuon_) alreadyEmbedded = true; break;
279  case DYT: if (embeddedDytMuon_) alreadyEmbedded = true; break;
280  }
281  if (muonBestTrackType() == tunePMuonBestTrackType()) {
282  if (embeddedMuonBestTrack_) alreadyEmbedded = true;
283  }
284  }
285  if (!alreadyEmbedded) {
286  tunePMuonBestTrack_.push_back(*reco::Muon::tunePMuonBestTrack());
287  embeddedTunePMuonBestTrack_ = true;
288  }
289 }
290 
291 
293 void Muon::embedTrack() {
294  track_.clear();
295  if (reco::Muon::innerTrack().isNonnull()) {
296  track_.push_back(*reco::Muon::innerTrack());
297  embeddedTrack_ = true;
298  }
299 }
300 
301 
303 void Muon::embedStandAloneMuon() {
304  standAloneMuon_.clear();
305  if (reco::Muon::outerTrack().isNonnull()) {
306  standAloneMuon_.push_back(*reco::Muon::outerTrack());
307  embeddedStandAloneMuon_ = true;
308  }
309 }
310 
311 
313 void Muon::embedCombinedMuon() {
314  combinedMuon_.clear();
315  if (reco::Muon::globalTrack().isNonnull()) {
316  combinedMuon_.push_back(*reco::Muon::globalTrack());
317  embeddedCombinedMuon_ = true;
318  }
319 }
320 
322 void Muon::embedCaloMETMuonCorrs(const reco::MuonMETCorrectionData& t) {
323  caloMETMuonCorrs_.clear();
324  caloMETMuonCorrs_.push_back(t);
325  embeddedCaloMETMuonCorrs_ = true;
326 }
327 
329 void Muon::embedTcMETMuonCorrs(const reco::MuonMETCorrectionData& t) {
330  tcMETMuonCorrs_.clear();
331  tcMETMuonCorrs_.push_back(t);
332  embeddedTCMETMuonCorrs_ = true;
333 }
334 
336 void Muon::embedPickyMuon() {
337  pickyMuon_.clear();
339  if (tk.isNonnull()) {
340  pickyMuon_.push_back(*tk);
341  embeddedPickyMuon_ = true;
342  }
343 }
344 
346 void Muon::embedTpfmsMuon() {
347  tpfmsMuon_.clear();
349  if (tk.isNonnull()) {
350  tpfmsMuon_.push_back(*tk);
351  embeddedTpfmsMuon_ = true;
352  }
353 }
354 
356 void Muon::embedDytMuon() {
357  dytMuon_.clear();
359  if (tk.isNonnull()) {
360  dytMuon_.push_back(*tk);
361  embeddedDytMuon_ = true;
362  }
363 }
364 
366 void Muon::embedPFCandidate() {
367  pfCandidate_.clear();
368  if ( pfCandidateRef_.isAvailable() && pfCandidateRef_.isNonnull()) {
369  pfCandidate_.push_back( *pfCandidateRef_ );
370  embeddedPFCandidate_ = true;
371  }
372 }
373 
374 bool Muon::muonID(const std::string& name) const {
376  return muon::isGoodMuon(*this, st);
377 }
378 
379 
384 double Muon::normChi2() const {
385  if ( cachedNormChi2_ ) {
386  return normChi2_;
387  } else {
388  reco::TrackRef t = globalTrack();
389  return t->chi2() / t->ndof();
390  }
391 }
392 
397 unsigned int Muon::numberOfValidHits() const {
398  if ( cachedNumberOfValidHits_ ) {
399  return numberOfValidHits_;
400  } else {
402  return t->numberOfValidHits();
403  }
404 }
405 
406 // embed various impact parameters with errors
407 // IpType defines the type of the impact parameter
408 // None is default and reverts to old behavior controlled by
409 // patMuons.usePV = True/False
410 double Muon::dB(IpType type_) const {
411 
412  // preserve old functionality exactly
413  if (type_ == None){
414  if ( cachedDB_ ) {
415  return dB_;
416  }
417  else {
419  }
420  }
421 
422  // more IP types (new)
423  else if ( cachedIP_[type_] ) {
424  return ip_[type_];
425  } else {
427  }
428 }
429 
430 
431 // embed various impact parameters with errors
432 // IpType defines the type of the impact parameter
433 // None is default and reverts to old behavior controlled by
434 // patMuons.usePV = True/False
435 double Muon::edB(IpType type_) const {
436 
437  // preserve old functionality exactly
438  if (type_ == None){
439  if ( cachedDB_ ) {
440  return edB_;
441  }
442  else {
444  }
445  }
446 
447  // more IP types (new)
448  else if ( cachedIP_[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::isSoftMuon(const reco::Vertex& vtx) const {
471  return muon::isSoftMuon(*this, vtx);
472 }
473 
474 
475 bool Muon::isHighPtMuon(const reco::Vertex& vtx) const{
476  return muon::isHighPtMuon(*this, vtx);
477 }
478 
int i
Definition: DBlmapReader.cc:9
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
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
virtual float pt() const
transverse momentum
virtual TrackRef innerTrack() const
Definition: Muon.h:48
virtual float phi() const
momentum azimuthal angle
~Muon()
Definition: Muon.cc:23
reco::PFCandidatePtr pfCandidate_
virtual TrackRef tpfmsTrack() const
Definition: Muon.h:57
uint16_t size_type
bool isLooseMuon(const reco::Muon &)
SelectionType
Selector type.
Definition: MuonSelectors.h:17
bool isSoftMuon(const reco::Muon &, const reco::Vertex &)
virtual double energy() const
energy
virtual TrackRef muonBestTrack() const
Definition: Muon.h:63
Muon()
default constructor
std::ostream & operator<<(std::ostream &, BeamSpot beam)
Definition: BeamSpot.cc:71
virtual float eta() const
momentum pseudorapidity
ArbitrationType
define arbitration schemes
Definition: Muon.h:178
Analysis-level lepton class.
Definition: Lepton.h:30
virtual CandidatePtr sourceCandidatePtr(size_type i) const
virtual TrackRef pickyTrack() const
Definition: Muon.h:58
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
edm::Ref< PFCandidateCollection > PFCandidateRef
persistent reference to a PFCandidate
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
tuple out
Definition: dbtoconf.py:99
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
SelectionType selectionTypeFromString(const std::string &label)
Definition: MuonSelectors.cc:9
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:19
virtual TrackRef dytTrack() const
Definition: Muon.h:59
virtual TrackRef tunePMuonBestTrack() const
Definition: Muon.h:65
volatile std::atomic< bool > shutdown_flag false
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
Analysis-level muon class.
Definition: Muon.h:50
Muon()
Definition: Muon.h:15
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54