CMS 3D CMS Logo

BadParticleFilter.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 #include <iostream>
4 
5 // user include files
8 
11 
13 
25 
26 //
27 // class declaration
28 //
29 
31 public:
32  explicit BadParticleFilter(const edm::ParameterSet&);
33  ~BadParticleFilter() override;
34  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
35 
36 private:
37  bool filter(edm::StreamID iID, edm::Event&, const edm::EventSetup&) const override;
38 
39  // ----------member data ---------------------------
40 
44 
45  const bool taggingMode_;
46  int algo_;
47  const double maxDR_;
48  const double minPtDiffRel_;
49  const double minMuonTrackRelErr_;
50  const double innerTrackRelErr_;
51  const double minDzBestTrack_;
52  const double minMuPt_;
53  const double segmentCompatibility_;
54 
55  double maxDR2_;
56 
59 };
60 
61 //
62 // constructors and destructor
63 //
65  : tokenPFCandidates_(consumes<edm::View<reco::Candidate>>(iConfig.getParameter<edm::InputTag>("PFCandidates"))),
66  tokenMuons_(consumes<edm::View<reco::Muon>>(iConfig.getParameter<edm::InputTag>("muons"))),
67  vtx_(consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("vtx"))),
68  taggingMode_(iConfig.getParameter<bool>("taggingMode")),
69  maxDR_(iConfig.getParameter<double>("maxDR")),
70  minPtDiffRel_(iConfig.getParameter<double>("minPtDiffRel")),
71  minMuonTrackRelErr_(iConfig.getParameter<double>("minMuonTrackRelErr")),
72  innerTrackRelErr_(iConfig.getParameter<double>("innerTrackRelErr")),
73  minDzBestTrack_(iConfig.getParameter<double>("minDzBestTrack")),
74  minMuPt_(iConfig.getParameter<double>("minMuonPt")),
75  segmentCompatibility_(iConfig.getParameter<double>("segmentCompatibility")) {
76  maxDR2_ = maxDR_ * maxDR_;
77 
78  std::string filterName = iConfig.getParameter<std::string>("filterType");
79  if (filterName == "BadPFMuon")
81  else if (filterName == "BadPFMuonSummer16")
83  else if (filterName == "BadChargedCandidate")
85  else if (filterName == "BadChargedCandidateSummer16")
87  else if (filterName == "BadPFMuonDz")
89  else {
90  throw cms::Exception("BadParticleFilter") << " Filter " << filterName << " is not available, please check name \n";
91  }
92 
93  algo_ = 0;
95  algo_ = iConfig.getParameter<int>("algo");
96  }
97 
98  produces<bool>();
99 }
100 
102 
103 //
104 // member functions
105 //
106 
107 // ------------ method called on each new Event ------------
109  using namespace std;
110  using namespace edm;
111 
112  typedef View<reco::Candidate> CandidateView;
114  iEvent.getByToken(tokenPFCandidates_, pfCandidates);
115 
116  typedef View<reco::Muon> MuonView;
118  iEvent.getByToken(tokenMuons_, muons);
119 
120  auto const& aPV = iEvent.get(vtx_).at(0).position();
121 
122  bool foundBadCandidate = false;
123 
124  for (unsigned i = 0; i < muons->size(); ++i) { // loop over all muons
125 
126  const reco::Muon& muon = (*muons)[i];
127 
128  reco::TrackRef innerMuonTrack = muon.innerTrack();
129  reco::TrackRef bestMuonTrack = muon.muonBestTrack();
130 
131  if (innerMuonTrack.isNull()) {
132  continue;
133  }
134 
136  if (muon.pt() < minMuPt_ && innerMuonTrack->pt() < minMuPt_)
137  continue;
138  }
140  if (muon.pt() < minMuPt_)
141  continue;
142  }
144  if (innerMuonTrack->pt() < minMuPt_)
145  continue;
146  }
147 
148  // Consider only Global Muons
150  if (muon.isGlobalMuon() == 0)
151  continue;
152  }
153 
155  if (!(innerMuonTrack->originalAlgo() == algo_ && innerMuonTrack->algo() == algo_))
156  continue;
157  }
158 
161  bestMuonTrack->ptError() / bestMuonTrack->pt() < minMuonTrackRelErr_ &&
162  innerMuonTrack->ptError() / innerMuonTrack->pt() < innerTrackRelErr_) {
164  continue;
165  }
166 
167  if (filterType_ == kBadPFMuonDz) {
168  if (fabs(bestMuonTrack->dz(aPV)) < minDzBestTrack_) {
169  continue;
170  }
171  }
172  }
173  }
174 
176  if (innerMuonTrack->quality(reco::TrackBase::highPurity))
177  continue;
178  if (!(innerMuonTrack->ptError() / innerMuonTrack->pt() > minMuonTrackRelErr_))
179  continue;
180  }
181 
182  for (unsigned j = 0; j < pfCandidates->size(); ++j) {
183  const reco::Candidate& pfCandidate = (*pfCandidates)[j];
184 
185  float dr2 = 1000;
187  if (!(std::abs(pfCandidate.pdgId()) == 211))
188  continue;
189  dr2 = deltaR2(innerMuonTrack->eta(), innerMuonTrack->phi(), pfCandidate.eta(), pfCandidate.phi());
190  float dpt = (pfCandidate.pt() - innerMuonTrack->pt()) / (0.5 * (innerMuonTrack->pt() + pfCandidate.pt()));
191  if ((dr2 < maxDR2_) && (std::abs(dpt) < minPtDiffRel_) &&
192  (filterType_ == kBadChargedCandidateSummer16 || muon.isPFMuon() == 0)) {
193  foundBadCandidate = true;
194  break;
195  }
196  }
197 
199  if (!((std::abs(pfCandidate.pdgId()) == 13) && (pfCandidate.pt() > minMuPt_)))
200  continue;
201  dr2 = deltaR2(muon.eta(), muon.phi(), pfCandidate.eta(), pfCandidate.phi());
202  if (dr2 < maxDR2_) {
203  foundBadCandidate = true;
204  break;
205  }
206  }
207 
208  if (foundBadCandidate)
209  break;
210  }
211  } // end loop over muonss
212 
213  bool pass = !foundBadCandidate;
214 
215  iEvent.put(std::unique_ptr<bool>(new bool(pass)));
216 
217  return taggingMode_ || pass;
218 }
219 
221  // BadPFMuonFilter
223  desc.add<double>("innerTrackRelErr", 1.0);
224  desc.add<double>("minDzBestTrack", -1.0);
225  desc.add<edm::InputTag>("PFCandidates", edm::InputTag("particleFlow"));
226  desc.add<std::string>("filterType", "BadPFMuon");
227  desc.add<double>("segmentCompatibility", 0.3);
228  desc.add<double>("minMuonPt", 100);
229  desc.add<int>("algo", 14);
230  desc.add<bool>("taggingMode", false);
231  desc.add<edm::InputTag>("vtx", edm::InputTag("offlinePrimaryVertices"));
232  desc.add<double>("minMuonTrackRelErr", 2.0);
233  desc.add<double>("maxDR", 0.001);
234  desc.add<edm::InputTag>("muons", edm::InputTag("muons"));
235  desc.add<double>("minPtDiffRel", 0.0);
236  descriptions.add("BadPFMuonFilter", desc);
237  descriptions.addWithDefaultLabel(desc);
238 }
239 
240 //define this as a plug-in
T getParameter(std::string const &) const
edm::EDGetTokenT< std::vector< reco::Vertex > > vtx_
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
double eta() const final
momentum pseudorapidity
edm::View< reco::Muon > MuonView
Definition: SoftLepton.cc:55
edm::EDGetTokenT< edm::View< reco::Candidate > > tokenPFCandidates_
bool filter(edm::StreamID iID, edm::Event &, const edm::EventSetup &) const override
virtual TrackRef innerTrack() const
Definition: Muon.h:48
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
const double minMuonTrackRelErr_
const double segmentCompatibility_
size_type size() const
double pt() const final
transverse momentum
~BadParticleFilter() override
const double innerTrackRelErr_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
BadParticleFilter(const edm::ParameterSet &)
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
virtual TrackRef muonBestTrack() const
Definition: Muon.h:63
Definition: Muon.py:1
bool isGlobalMuon() const override
Definition: Muon.h:291
virtual int pdgId() const =0
PDG identifier.
const double minDzBestTrack_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool get(ProductID const &oid, Handle< PROD > &result) const
Definition: Event.h:326
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isNull() const
Checks for null.
Definition: Ref.h:248
edm::EDGetTokenT< edm::View< reco::Muon > > tokenMuons_
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
virtual double eta() const =0
momentum pseudorapidity
virtual double pt() const =0
transverse momentum
void add(std::string const &label, ParameterSetDescription const &psetDescription)
fixed size matrix
HLT enums.
const double minPtDiffRel_
bool isPFMuon() const
Definition: Muon.h:295
double phi() const final
momentum azimuthal angle
virtual double phi() const =0
momentum azimuthal angle
edm::View< Candidate > CandidateView
view of a collection containing candidates
Definition: CandidateFwd.h:23