CMS 3D CMS Logo

CMGMuonCleanerBySegmentsAlgo.cc
Go to the documentation of this file.
2 
3 namespace heppy {
4 
6 
7  std::vector<bool> CMGMuonCleanerBySegmentsAlgo::clean(const std::vector<pat::Muon> &src) const {
8  unsigned int nsrc = src.size();
9  std::vector<bool> good(nsrc, true);
10  for (unsigned int i = 0; i < nsrc; ++i) {
11  const pat::Muon &mu1 = src[i];
12  if (!preselection_(mu1))
13  good[i] = false;
14  if (!good[i])
15  continue;
16  int nSegments1 = mu1.numberOfMatches(reco::Muon::SegmentArbitration);
17  for (unsigned int j = i + 1; j < nsrc; ++j) {
18  const pat::Muon &mu2 = src[j];
19  if (isSameMuon(mu1, mu2))
20  continue;
21  if (!good[j] || !preselection_(mu2))
22  continue;
23  int nSegments2 = mu2.numberOfMatches(reco::Muon::SegmentArbitration);
24  if (nSegments2 == 0 || nSegments1 == 0)
25  continue;
26  double sf = muon::sharedSegments(mu1, mu2) / std::min<double>(nSegments1, nSegments2);
27  if (sf > sharedFraction_) {
28  if (isBetterMuon(mu1, mu1.isPFMuon(), mu2, mu2.isPFMuon())) {
29  good[j] = false;
30  } else {
31  good[i] = false;
32  }
33  }
34  }
35  }
36 
37  for (unsigned int i = 0; i < nsrc; ++i) {
38  const pat::Muon &mu1 = src[i];
39  if (passthrough_(mu1))
40  good[i] = true;
41  }
42 
43  return good;
44  }
45 
46  bool CMGMuonCleanerBySegmentsAlgo::isSameMuon(const pat::Muon &mu1, const pat::Muon &mu2) const {
47  return (&mu1 == &mu2) || (mu1.originalObjectRef() == mu2.originalObjectRef()) ||
48  (mu1.reco::Muon::innerTrack().isNonnull() ? mu1.reco::Muon::innerTrack() == mu2.reco::Muon::innerTrack()
49  : mu1.reco::Muon::outerTrack() == mu2.reco::Muon::outerTrack());
50  }
51 
53  bool mu1PF,
54  const pat::Muon &mu2,
55  bool mu2PF) const {
56  if (mu2.track().isNull())
57  return true;
58  if (mu1.track().isNull())
59  return false;
60  if (mu1PF != mu2PF)
61  return mu1PF;
62  if (mu1.isGlobalMuon() != mu2.isGlobalMuon())
63  return mu1.isGlobalMuon();
64  if (mu1.charge() == mu2.charge() && deltaR2(mu1, mu2) < 0.0009) {
65  return mu1.track()->ptError() / mu1.track()->pt() < mu2.track()->ptError() / mu2.track()->pt();
66  } else {
69  return (nm1 != nm2 ? nm1 > nm2 : mu1.pt() > mu2.pt());
70  }
71  }
72 } // namespace heppy
double sharedFraction_
Fraction of shared segments.
double pt() const final
transverse momentum
bool isSameMuon(const pat::Muon &mu1, const pat::Muon &mu2) const
Methods.
bool isBetterMuon(const pat::Muon &mu1, bool mu1PF, const pat::Muon &mu2, bool mu2PF) const
StringCutObjectSelector< pat::Muon > passthrough_
Always-accept cut.
std::vector< bool > clean(const std::vector< pat::Muon > &muons) const
Return a vector of boolean marking the muons to be considered clean.
bool isPFMuon() const
Definition: Muon.h:307
TAKEN FROM http://cmssw.cvs.cern.ch/cgi-bin/cmssw.cgi/CMSSW/ElectroWeakAnalysis/Utilities/src/PdfWeig...
Definition: AlphaT.h:16
bool isNull() const
Checks for null.
Definition: Ref.h:235
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
int sharedSegments(const reco::Muon &muon1, const reco::Muon &muon2, unsigned int segmentArbitrationMask=reco::MuonSegmentMatch::BestInChamberByDR)
reco::TrackRef track() const override
reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
StringCutObjectSelector< pat::Muon > preselection_
Preselection cut.
const edm::Ptr< reco::Candidate > & originalObjectRef() const
reference to original object. Returns a null reference if not available
Definition: PATObject.h:537
Analysis-level muon class.
Definition: Muon.h:51
bool isGlobalMuon() const override
Definition: Muon.h:303
int charge() const final
electric charge