CMS 3D CMS Logo

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