CMS 3D CMS Logo

RecoTauQualityCuts.cc
Go to the documentation of this file.
8 
9 namespace reco::tau {
10 
11  namespace {
12  const reco::Track* getTrack(const Candidate& cand) {
13  const PFCandidate* pfCandPtr = dynamic_cast<const PFCandidate*>(&cand);
14  if (pfCandPtr) {
15  // Get the KF track if it exists. Otherwise, see if PFCandidate has a GSF track.
16  if (pfCandPtr->trackRef().isNonnull())
17  return pfCandPtr->trackRef().get();
18  else if (pfCandPtr->gsfTrackRef().isNonnull())
19  return pfCandPtr->gsfTrackRef().get();
20  else
21  return nullptr;
22  }
23 
24  const pat::PackedCandidate* packedCand = dynamic_cast<const pat::PackedCandidate*>(&cand);
25  if (packedCand && packedCand->hasTrackDetails())
26  return &packedCand->pseudoTrack();
27 
28  return nullptr;
29  }
30 
31  const reco::TrackRef getTrackRef(const Candidate& cand) {
32  const PFCandidate* pfCandPtr = dynamic_cast<const PFCandidate*>(&cand);
33  if (pfCandPtr)
34  return pfCandPtr->trackRef();
35 
36  return reco::TrackRef();
37  }
38 
39  const reco::TrackBaseRef getGsfTrackRef(const Candidate& cand) {
40  const PFCandidate* pfCandPtr = dynamic_cast<const PFCandidate*>(&cand);
41  if (pfCandPtr) {
42  return reco::TrackBaseRef(pfCandPtr->gsfTrackRef());
43  }
44  return reco::TrackBaseRef();
45  }
46 
47  // Translate GsfTrackRef to TrackBaseRef
48  template <typename T>
49  reco::TrackBaseRef convertRef(const T& ref) {
50  return reco::TrackBaseRef(ref);
51  }
52  } // namespace
53 
54  // Quality cut implementations
55  namespace qcuts {
56 
57  bool ptMin(const TrackBaseRef& track, double cut) {
58  LogDebug("TauQCuts") << "<ptMin>: Pt = " << track->pt() << ", cut = " << cut;
59  return (track->pt() > cut);
60  }
61 
62  bool ptMin_cand(const Candidate& cand, double cut) {
63  LogDebug("TauQCuts") << "<ptMin_cand>: Pt = " << cand.pt() << ", cut = " << cut;
64  return (cand.pt() > cut);
65  }
66 
67  bool etMin_cand(const Candidate& cand, double cut) {
68  LogDebug("TauQCuts") << "<etMin_cand>: Et = " << cand.et() << ", cut = " << cut;
69  return (cand.et() > cut);
70  }
71 
72  bool trkPixelHits(const Track* track, int cut) {
73  // For some reason, the number of hits is signed
74  LogDebug("TauQCuts") << "<trkPixelHits>: #Pxl hits = " << track->hitPattern().numberOfValidPixelHits()
75  << ", cut = " << cut;
76  return (track->hitPattern().numberOfValidPixelHits() >= cut);
77  }
78 
79  bool trkPixelHits_cand(const Candidate& cand, int cut) {
80  // For some reason, the number of hits is signed
81  auto track = getTrack(cand);
82  if (track) {
83  LogDebug("TauQCuts") << "<trkPixelHits_cand>: #Pxl hits = " << trkPixelHits(track, cut) << ", cut = " << cut;
84  return trkPixelHits(track, cut);
85  } else {
86  LogDebug("TauQCuts") << "<trkPixelHits_cand>: #Pxl hits = N/A, cut = " << cut;
87  return false;
88  }
89  }
90 
91  bool trkTrackerHits(const Track* track, int cut) {
92  LogDebug("TauQCuts") << "<trkTrackerHits>: #Trk hits = " << track->hitPattern().numberOfValidHits()
93  << ", cut = " << cut;
94  return (track->hitPattern().numberOfValidHits() >= cut);
95  }
96 
97  bool trkTrackerHits_cand(const Candidate& cand, int cut) {
98  auto track = getTrack(cand);
99  if (track) {
100  LogDebug("TauQCuts") << "<trkTrackerHits>: #Trk hits = " << track->hitPattern().numberOfValidHits()
101  << ", cut = " << cut;
102  return trkTrackerHits(track, cut);
103  } else {
104  LogDebug("TauQCuts") << "<trkTrackerHits>: #Trk hits = N/A, cut = " << cut;
105  return false;
106  }
107  }
108 
110  if (pv->isNull()) {
111  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in "
112  << "RecoTauQualityCuts is invalid. - trkTransverseImpactParameter";
113  return false;
114  }
115  LogDebug("TauQCuts") << " track: Pt = " << track->pt() << ", eta = " << track->eta()
116  << ", phi = " << track->phi();
117  LogDebug("TauQCuts") << " vertex: x = " << (*pv)->position().x() << ", y = " << (*pv)->position().y()
118  << ", z = " << (*pv)->position().z();
119  LogDebug("TauQCuts") << "--> dxy = " << std::fabs(track->dxy((*pv)->position())) << " (cut = " << cut << ")";
120  return (std::fabs(track->dxy((*pv)->position())) <= cut);
121  }
122 
124  auto track = getTrack(cand);
125  if (track) {
126  return trkTransverseImpactParameter(track, pv, cut);
127  } else {
128  LogDebug("TauQCuts") << "<trkTransverseImpactParameter_cand>: dXY = N/A, cut = " << cut;
129  return false;
130  }
131  }
132 
134  if (pv->isNull()) {
135  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in "
136  << "RecoTauQualityCuts is invalid. - trkLongitudinalImpactParameter";
137  return false;
138  }
139  LogDebug("TauQCuts") << " track: Pt = " << track->pt() << ", eta = " << track->eta()
140  << ", phi = " << track->phi();
141  LogDebug("TauQCuts") << " vertex: x = " << (*pv)->position().x() << ", y = " << (*pv)->position().y()
142  << ", z = " << (*pv)->position().z();
143  LogDebug("TauQCuts") << "--> dz = " << std::fabs(track->dz((*pv)->position())) << " (cut = " << cut << ")";
144  return (std::fabs(track->dz((*pv)->position())) <= cut);
145  }
146 
148  auto track = getTrack(cand);
149  if (track) {
150  return trkLongitudinalImpactParameter(track, pv, cut);
151  } else {
152  LogDebug("TauQCuts") << "<trkLongitudinalImpactParameter_cand>: dZ = N/A, cut = " << cut;
153  return false;
154  }
155  }
156 
159  const Track* leadTrack,
160  const reco::VertexRef* pv,
161  double cut) {
162  if (!leadTrack) {
163  edm::LogError("QCutsNoValidLeadTrack")
164  << "Lead track Ref in "
165  << "RecoTauQualityCuts is invalid. - trkLongitudinalImpactParameterWrtTrack";
166  return false;
167  }
168  return (std::fabs(track->dz((*pv)->position()) - leadTrack->dz((*pv)->position())) <= cut);
169  }
170 
172  const reco::Track* leadTrack,
173  const reco::VertexRef* pv,
174  double cut) {
175  auto track = getTrack(cand);
176  if (track)
177  return trkLongitudinalImpactParameterWrtTrack(track, leadTrack, pv, cut);
178  else
179  return false;
180  }
181 
183  if (pv->isNull()) {
184  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in "
185  << "RecoTauQualityCuts is invalid. - minTrackVertexWeight";
186  return false;
187  }
188  LogDebug("TauQCuts") << " track: Pt = " << track->pt() << ", eta = " << track->eta()
189  << ", phi = " << track->phi();
190  LogDebug("TauQCuts") << " vertex: x = " << (*pv)->position().x() << ", y = " << (*pv)->position().y()
191  << ", z = " << (*pv)->position().z();
192  LogDebug("TauQCuts") << "--> trackWeight = " << (*pv)->trackWeight(track) << " (cut = " << cut << ")";
193  return ((*pv)->trackWeight(track) >= cut);
194  }
195 
196  bool minTrackVertexWeight(const TrackRef& track, const reco::VertexRef* pv, double cut) {
197  if (pv->isNull()) {
198  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in "
199  << "RecoTauQualityCuts is invalid. - minTrackVertexWeight";
200  return false;
201  }
202  LogDebug("TauQCuts") << " track: Pt = " << track->pt() << ", eta = " << track->eta()
203  << ", phi = " << track->phi();
204  LogDebug("TauQCuts") << " vertex: x = " << (*pv)->position().x() << ", y = " << (*pv)->position().y()
205  << ", z = " << (*pv)->position().z();
206  LogDebug("TauQCuts") << "--> trackWeight = " << (*pv)->trackWeight(track) << " (cut = " << cut << ")";
207  return ((*pv)->trackWeight(track) >= cut);
208  }
209 
211  if (pv->isNull()) {
212  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in "
213  << "RecoTauQualityCuts is invalid. - minPackedCandVertexWeight";
214  return false;
215  }
216  //there is some low granular information on track weight in the vertex available with packed cands
217  double weight = -9.9;
218  if (pCand.vertexRef().isNonnull() && pCand.vertexRef().key() == pv->key()) {
219  int quality = pCand.pvAssociationQuality();
221  weight = 0.6; //0.6 as proxy for weight above 0.5
222  else if (quality == pat::PackedCandidate::UsedInFitLoose)
223  weight = 0.1; //0.6 as proxy for weight below 0.5
224  }
225  LogDebug("TauQCuts") << " packedCand: Pt = " << pCand.pt() << ", eta = " << pCand.eta()
226  << ", phi = " << pCand.phi();
227  LogDebug("TauQCuts") << " vertex: x = " << (*pv)->position().x() << ", y = " << (*pv)->position().y()
228  << ", z = " << (*pv)->position().z();
229  LogDebug("TauQCuts") << "--> trackWeight from packedCand = " << weight << " (cut = " << cut << ")";
230  return (weight >= cut);
231  }
232 
233  bool minTrackVertexWeight_cand(const Candidate& cand, const reco::VertexRef* pv, double cut) {
234  auto track = getTrackRef(cand);
235  if (track.isNonnull()) {
236  return minTrackVertexWeight(track, pv, cut);
237  }
238  auto gsfTrack = getGsfTrackRef(cand);
239  if (gsfTrack.isNonnull()) {
240  return minTrackVertexWeight(gsfTrack, pv, cut);
241  }
242 
243  const pat::PackedCandidate* pCand = dynamic_cast<const pat::PackedCandidate*>(&cand);
244  if (pCand != nullptr && cand.charge() != 0) {
245  return minPackedCandVertexWeight(*pCand, pv, cut);
246  }
247  LogDebug("TauQCuts") << "<minTrackVertexWeight_cand>: weight = N/A, cut = " << cut;
248  return false;
249  }
250 
251  bool trkChi2(const Track* track, double cut) {
252  LogDebug("TauQCuts") << "<trkChi2>: chi^2 = " << track->normalizedChi2() << ", cut = " << cut;
253  return (track->normalizedChi2() <= cut);
254  }
255 
256  bool trkChi2_cand(const Candidate& cand, double cut) {
257  auto track = getTrack(cand);
258  if (track) {
259  LogDebug("TauQCuts") << "<trkChi2_cand>: chi^2 = " << track->normalizedChi2() << ", cut = " << cut;
260  return trkChi2(track, cut);
261  } else {
262  LogDebug("TauQCuts") << "<trkChi2_cand>: chi^2 = N/A, cut = " << cut;
263  return false;
264  }
265  }
266 
267  // And a set of qcuts
269  for (auto const& func : cuts) {
270  if (!func(track))
271  return false;
272  }
273  return true;
274  }
275 
277  for (auto const& func : cuts) {
278  if (!func(cand))
279  return false;
280  }
281  return true;
282  }
283 
284  // Get the set of Q cuts for a given type (i.e. gamma)
286  // Find the cuts that for this particle type
287  RecoTauQualityCuts::CandQCutFuncMap::const_iterator cuts = funcMap.find(std::abs(cand.pdgId()));
288  // Return false if we dont' know how to deal with this particle type
289  if (cuts == funcMap.end())
290  return false;
291  return AND_cand(cand, cuts->second); // Otherwise AND all the cuts
292  }
293 
294  } // namespace qcuts
295 
297  // Setup all of our predicates
298  CandQCutFuncCollection chargedHadronCuts;
299  CandQCutFuncCollection gammaCuts;
300  CandQCutFuncCollection neutralHadronCuts;
301 
302  // Make sure there are no extra passed options
303  std::set<std::string> passedOptionSet;
304  std::vector<std::string> passedOptions = qcuts.getParameterNames();
305 
306  for (auto const& option : passedOptions) {
307  passedOptionSet.insert(option);
308  }
309 
310  unsigned int nCuts = 0;
311  auto getDouble = [&qcuts, &passedOptionSet, &nCuts](const std::string& name) {
312  if (qcuts.exists(name)) {
313  ++nCuts;
314  passedOptionSet.erase(name);
315  return qcuts.getParameter<double>(name);
316  }
317  return -1.0;
318  };
319  auto getUint = [&qcuts, &passedOptionSet, &nCuts](const std::string& name) -> unsigned int {
320  if (qcuts.exists(name)) {
321  ++nCuts;
322  passedOptionSet.erase(name);
323  return qcuts.getParameter<unsigned int>(name);
324  }
325  return 0;
326  };
327 
328  // Build all the QCuts for tracks
329  minTrackPt_ = getDouble("minTrackPt");
330  maxTrackChi2_ = getDouble("maxTrackChi2");
331  minTrackPixelHits_ = getUint("minTrackPixelHits");
332  minTrackHits_ = getUint("minTrackHits");
333  maxTransverseImpactParameter_ = getDouble("maxTransverseImpactParameter");
334  maxDeltaZ_ = getDouble("maxDeltaZ");
335  maxDeltaZToLeadTrack_ = getDouble("maxDeltaZToLeadTrack");
336  // Require tracks to contribute a minimum weight to the associated vertex.
337  minTrackVertexWeight_ = getDouble("minTrackVertexWeight");
338 
339  // Use bit-wise & to avoid conditional code
340  checkHitPattern_ = (minTrackHits_ > 0) || (minTrackPixelHits_ > 0);
341  checkPV_ = (maxTransverseImpactParameter_ >= 0) || (maxDeltaZ_ >= 0) || (maxDeltaZToLeadTrack_ >= 0) ||
342  (minTrackVertexWeight_ >= 0);
343 
344  // Build the QCuts for gammas
345  minGammaEt_ = getDouble("minGammaEt");
346 
347  // Build QCuts for netural hadrons
348  minNeutralHadronEt_ = getDouble("minNeutralHadronEt");
349 
350  // Check if there are any remaining unparsed QCuts
351  if (!passedOptionSet.empty()) {
352  std::string unParsedOptions;
353  bool thereIsABadParameter = false;
354  for (auto const& option : passedOptionSet) {
355  // Workaround for HLT - TODO FIXME
356  if (option == "useTracksInsteadOfPFHadrons") {
357  // Crash if true - no one should have this option enabled.
358  if (qcuts.getParameter<bool>("useTracksInsteadOfPFHadrons")) {
359  throw cms::Exception("DontUseTracksInQcuts") << "The obsolete exception useTracksInsteadOfPFHadrons "
360  << "is set to true in the quality cut config." << std::endl;
361  }
362  continue;
363  }
364 
365  // If we get to this point, there is a real unknown parameter
366  thereIsABadParameter = true;
367 
368  unParsedOptions += option;
369  unParsedOptions += "\n";
370  }
371  if (thereIsABadParameter) {
372  throw cms::Exception("BadQualityCutConfig") << " The PSet passed to the RecoTauQualityCuts class had"
373  << " the following unrecognized options: " << std::endl
374  << unParsedOptions;
375  }
376  }
377 
378  // Make sure there are at least some quality cuts
379  if (!nCuts) {
380  throw cms::Exception("BadQualityCutConfig") << " No options were passed to the quality cut class!" << std::endl;
381  }
382  }
383 
384  std::pair<edm::ParameterSet, edm::ParameterSet> factorizePUQCuts(const edm::ParameterSet& input) {
385  edm::ParameterSet puCuts;
386  edm::ParameterSet nonPUCuts;
387 
388  std::vector<std::string> inputNames = input.getParameterNames();
389  for (auto const& cut : inputNames) {
390  if (cut == "minTrackVertexWeight" || cut == "maxDeltaZ" || cut == "maxDeltaZToLeadTrack") {
391  puCuts.copyFrom(input, cut);
392  } else {
393  nonPUCuts.copyFrom(input, cut);
394  }
395  }
396  return std::make_pair(puCuts, nonPUCuts);
397  }
398 
400  if (!filterTrack_(track.get()))
401  return false;
402  if (minTrackVertexWeight_ >= 0. && !(pv_->trackWeight(convertRef(track)) >= minTrackVertexWeight_))
403  return false;
404  return true;
405  }
406 
408  if (!filterTrack_(track.get()))
409  return false;
410  if (minTrackVertexWeight_ >= 0. && !(pv_->trackWeight(convertRef(track)) >= minTrackVertexWeight_))
411  return false;
412  return true;
413  }
414 
415  bool RecoTauQualityCuts::filterTrack(const reco::Track& track) const { return filterTrack_(&track); }
416 
418  if (minTrackPt_ >= 0 && !(track->pt() > minTrackPt_))
419  return false;
420  if (maxTrackChi2_ >= 0 && !(track->normalizedChi2() <= maxTrackChi2_))
421  return false;
422  if (checkHitPattern_) {
423  const reco::HitPattern& hitPattern = track->hitPattern();
424  if (minTrackPixelHits_ > 0 && !(hitPattern.numberOfValidPixelHits() >= minTrackPixelHits_))
425  return false;
426  if (minTrackHits_ > 0 && !(hitPattern.numberOfValidHits() >= minTrackHits_))
427  return false;
428  }
429  if (checkPV_ && pv_.isNull()) {
430  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in "
431  << "RecoTauQualityCuts is invalid. - filterTrack";
432  return false;
433  }
434 
435  if (maxTransverseImpactParameter_ >= 0 &&
436  !(std::fabs(track->dxy(pv_->position())) <= maxTransverseImpactParameter_))
437  return false;
438  if (maxDeltaZ_ >= 0 && !(std::fabs(track->dz(pv_->position())) <= maxDeltaZ_))
439  return false;
440  if (maxDeltaZToLeadTrack_ >= 0) {
441  if (!leadTrack_) {
442  edm::LogError("QCutsNoValidLeadTrack") << "Lead track Ref in "
443  << "RecoTauQualityCuts is invalid. - filterTrack";
444  return false;
445  }
446 
447  if (!(std::fabs(track->dz(pv_->position()) - leadTrack_->dz(pv_->position())) <= maxDeltaZToLeadTrack_))
448  return false;
449  }
450 
451  return true;
452  }
453 
455  if (cand.charge() == 0)
456  return true;
457  const pat::PackedCandidate* pCand = dynamic_cast<const pat::PackedCandidate*>(&cand);
458  if (pCand == nullptr)
459  return true;
460 
461  //Get track, it should be present for cands with pT(charged)>0.5GeV
462  //and check track quality critera other than vertex weight
463  auto track = getTrack(cand);
464  if (track != nullptr) {
465  if (!filterTrack(*track))
466  return false;
467  } else { //Candidates without track (pT(charged)<0.5GeV): Can still check pT and calculate dxy and dz
468  if (minTrackPt_ >= 0 && !(pCand->pt() > minTrackPt_))
469  return false;
470  if (checkPV_ && pv_.isNull()) {
471  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in "
472  << "RecoTauQualityCuts is invalid. - filterChargedCand";
473  return false;
474  }
475 
476  if (maxTransverseImpactParameter_ >= 0 &&
477  !(std::fabs(pCand->dxy(pv_->position())) <= maxTransverseImpactParameter_))
478  return false;
479  if (maxDeltaZ_ >= 0 && !(std::fabs(pCand->dz(pv_->position())) <= maxDeltaZ_))
480  return false;
481  if (maxDeltaZToLeadTrack_ >= 0) {
482  if (leadTrack_ == nullptr) {
483  edm::LogError("QCutsNoValidLeadTrack") << "Lead track Ref in "
484  << "RecoTauQualityCuts is invalid. - filterChargedCand";
485  return false;
486  }
487 
488  if (!(std::fabs(pCand->dz(pv_->position()) - leadTrack_->dz(pv_->position())) <= maxDeltaZToLeadTrack_))
489  return false;
490  }
491  }
492  if (minTrackVertexWeight_ >= 0. && !(qcuts::minPackedCandVertexWeight(*pCand, &pv_, minTrackVertexWeight_)))
493  return false;
494 
495  return true;
496  }
497 
499  if (minGammaEt_ >= 0 && !(cand.et() > minGammaEt_))
500  return false;
501  return true;
502  }
503 
505  if (minNeutralHadronEt_ >= 0 && !(cand.et() > minNeutralHadronEt_))
506  return false;
507  return true;
508  }
509 
511  switch (std::abs(cand.pdgId())) {
512  case 22:
513  return filterGammaCand(cand);
514  case 130:
515  return filterNeutralHadronCand(cand);
516  // We use the same qcuts for muons/electrons and charged hadrons.
517  case 211:
518  case 11:
519  case 13:
520  // no cuts ATM (track cuts applied in filterCand)
521  return true;
522  // Return false if we dont' know how to deal with this particle type
523  default:
524  return false;
525  };
526  return false;
527  }
528 
530  auto trackRef = getTrackRef(cand);
531  bool result = true;
532 
533  if (trackRef.isNonnull()) {
534  result = filterTrack(trackRef);
535  } else {
536  auto gsfTrackRef = getGsfTrackRef(cand);
537  if (gsfTrackRef.isNonnull())
538  result = filterTrack(gsfTrackRef);
539  else if (cand.charge() != 0) {
540  result = filterChargedCand(cand);
541  }
542  }
543 
544  if (result)
545  result = filterCandByType(cand);
546 
547  return result;
548  }
549 
551 
552  void RecoTauQualityCuts::setLeadTrack(const reco::Candidate& leadCand) { leadTrack_ = getTrack(leadCand); }
553 
555  if (leadCand.isNonnull()) {
556  leadTrack_ = getTrack(*leadCand);
557  } else {
558  // Set null
559  leadTrack_ = nullptr;
560  }
561  }
562 
563 } // end namespace reco::tau
#define LogDebug(id)
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
std::map< int, CandQCutFuncCollection > CandQCutFuncMap
value_type const * get() const
Definition: RefToBase.h:209
T getParameter(std::string const &) const
bool minTrackVertexWeight(const TrackBaseRef &track, const reco::VertexRef *pv, double cut)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
bool AND_cand(const Candidate &cand, const RecoTauQualityCuts::CandQCutFuncCollection &cuts)
bool trkLongitudinalImpactParameterWrtTrack(const Track *track, const Track *leadTrack, const reco::VertexRef *pv, double cut)
DZ cut, with respect to the current lead rack.
RecoTauQualityCuts(const edm::ParameterSet &qcuts)
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
Definition: TrackBase.h:572
int numberOfValidHits() const
Definition: HitPattern.h:787
bool exists(std::string const &parameterName) const
checks if a parameter exists
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:614
Definition: weight.py:1
key_type key() const
Accessor for product key.
Definition: Ref.h:250
bool filterCand(const reco::Candidate &cand) const
Filter a single Candidate.
const reco::VertexRef vertexRef() const
InputIterator leadCand(InputIterator begin, InputIterator end)
bool trkPixelHits_cand(const Candidate &cand, int cut)
static std::string const input
Definition: EdmProvDump.cc:48
std::vector< CandQCutFunc > CandQCutFuncCollection
virtual double et() const =0
transverse energy
void copyFrom(ParameterSet const &from, std::string const &name)
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:617
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
Definition: TrackFwd.h:35
const PVAssociationQuality pvAssociationQuality() const
virtual int pdgId() const =0
PDG identifier.
bool trkTrackerHits_cand(const Candidate &cand, int cut)
bool filterCandByType(const reco::Candidate &cand) const
double pt() const
track transverse momentum
Definition: TrackBase.h:602
bool ptMin_cand(const Candidate &cand, double cut)
def pv(vc)
Definition: MetAnalyzer.py:7
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool trkChi2_cand(const Candidate &cand, double cut)
virtual const reco::Track & pseudoTrack() const
bool trkChi2(const Track *track, double cut)
double pt() const override
transverse momentum
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:232
std::pair< edm::ParameterSet, edm::ParameterSet > factorizePUQCuts(const edm::ParameterSet &inputSet)
bool trkLongitudinalImpactParameter_cand(const Candidate &cand, const reco::VertexRef *pv, double cut)
std::vector< TrackQCutFunc > TrackQCutFuncCollection
std::vector< std::string > getParameterNames() const
bool etMin_cand(const Candidate &cand, double cut)
bool ptMin(const TrackBaseRef &track, double cut)
bool isNull() const
Checks for null.
Definition: Ref.h:235
bool filterTrack_(const reco::Track *track) const
bool mapAndCutByType(const Candidate &cand, const RecoTauQualityCuts::CandQCutFuncMap &funcMap)
bool hasTrackDetails() const
Return true if a bestTrack can be extracted from this Candidate.
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
Definition: TrackBase.h:596
double eta() const override
momentum pseudorapidity
double phi() const override
momentum azimuthal angle
static const TrackGhostTrackState * getTrack(const BasicGhostTrackState *basic)
bool trkTransverseImpactParameter(const Track *track, const reco::VertexRef *pv, double cut)
bool filterChargedCand(const reco::Candidate &cand) const
or a single charged candidate
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:483
virtual double pt() const =0
transverse momentum
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
bool filterNeutralHadronCand(const reco::Candidate &cand) const
bool trkTrackerHits(const Track *track, int cut)
virtual int charge() const =0
electric charge
bool trkLongitudinalImpactParameterWrtTrack_cand(const Candidate &cand, const reco::Track *leadTrack, const reco::VertexRef *pv, double cut)
bool trkPixelHits(const Track *track, int cut)
bool AND(const TrackBaseRef &track, const RecoTauQualityCuts::TrackQCutFuncCollection &cuts)
int numberOfValidPixelHits() const
Definition: HitPattern.h:801
bool filterGammaCand(const reco::Candidate &cand) const
void setLeadTrack(const reco::Track &leadTrack)
Update the leading track.
virtual float dxy() const
dxy with respect to the PV ref
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Definition: TrackBase.h:587
long double T
bool trkLongitudinalImpactParameter(const TrackBase *track, const reco::VertexRef *pv, double cut)
bool minPackedCandVertexWeight(const pat::PackedCandidate &pCand, const reco::VertexRef *pv, double cut)
bool filterTrack(const reco::TrackBaseRef &track) const
Filter a single Track.
bool minTrackVertexWeight_cand(const Candidate &cand, const reco::VertexRef *pv, double cut)
bool trkTransverseImpactParameter_cand(const Candidate &cand, const reco::VertexRef *pv, double cut)