CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RecoTauQualityCuts.cc
Go to the documentation of this file.
4 
5 #include <boost/bind.hpp>
6 
7 namespace reco { namespace tau {
8 
9 // Quality cut implementations
10 namespace qcuts {
11 
12 bool ptMin(const PFCandidate& cand, double cut) {
13  return cand.pt() > cut;
14 }
15 
16 bool etMin(const PFCandidate& cand, double cut) {
17  return cand.et() > cut;
18 }
19 
20 bool trkPixelHits(const PFCandidate& cand, int cut) {
21  // For some reason, the number of hits is signed
22  TrackRef trk = cand.trackRef();
23  if (!trk) return false;
24  return trk->hitPattern().numberOfValidPixelHits() >= cut;
25 }
26 
27 bool trkTrackerHits(const PFCandidate& cand, int cut) {
28  TrackRef trk = cand.trackRef();
29  if (!trk) return false;
30  return trk->hitPattern().numberOfValidHits() >= cut;
31 }
32 
34  const reco::VertexRef* pv,
35  double cut) {
36  if (pv->isNull()) {
37  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in " <<
38  "RecoTauQualityCuts is invalid. - trkTransverseImpactParameter";
39  return false;
40  }
41  TrackRef trk = cand.trackRef();
42  if (!trk) return false;
43  return std::abs(trk->dxy((*pv)->position())) <= cut;
44 }
45 
47  const reco::VertexRef* pv,
48  double cut) {
49  if (pv->isNull()) {
50  edm::LogError("QCutsNoPrimaryVertex") << "Primary vertex Ref in " <<
51  "RecoTauQualityCuts is invalid. - trkLongitudinalImpactParameter";
52  return false;
53  }
54  TrackRef trk = cand.trackRef();
55  if (!trk) return false;
56  return std::abs(trk->dz((*pv)->position())) <= cut;
57 }
58 
59 bool trkChi2(const PFCandidate& cand, double cut) {
60  TrackRef trk = cand.trackRef();
61  if (!trk) return false;
62  return trk->normalizedChi2() <= cut;
63 }
64 
65 // And a set of qcuts
66 bool AND(const PFCandidate& cand,
68  BOOST_FOREACH(const RecoTauQualityCuts::QCutFunc& func, cuts) {
69  if (!func(cand))
70  return false;
71  }
72  return true;
73 }
74 
75 // Get the set of Q cuts for a given type (i.e. gamma)
76 bool mapAndCutByType(const PFCandidate& cand,
77  const RecoTauQualityCuts::QCutFuncMap& funcMap) {
78  // Find the cuts that for this particle type
79  RecoTauQualityCuts::QCutFuncMap::const_iterator cuts =
80  funcMap.find(cand.particleId());
81  // Return false if we dont' know how to deal w/ this particle type
82  if (cuts == funcMap.end())
83  return false;
84  else
85  // Otherwise AND all the cuts
86  return AND(cand, cuts->second);
87 }
88 
89 } // end qcuts implementation namespace
90 
92  // Setup all of our predicates
93  QCutFuncCollection chargedHadronCuts;
94  QCutFuncCollection gammaCuts;
95  QCutFuncCollection neutralHadronCuts;
96 
97  // Build all the QCuts for tracks
98  if (qcuts.exists("minTrackPt"))
99  chargedHadronCuts.push_back(
100  boost::bind(qcuts::ptMin, _1,
101  qcuts.getParameter<double>("minTrackPt")));
102 
103  if (qcuts.exists("maxTrackChi2"))
104  chargedHadronCuts.push_back(
105  boost::bind(qcuts::trkChi2, _1,
106  qcuts.getParameter<double>("maxTrackChi2")));
107 
108  if (qcuts.exists("minTrackPixelHits"))
109  chargedHadronCuts.push_back(boost::bind(
111  qcuts.getParameter<uint32_t>("minTrackPixelHits")));
112 
113  if (qcuts.exists("minTrackHits"))
114  chargedHadronCuts.push_back(boost::bind(
116  qcuts.getParameter<uint32_t>("minTrackHits")));
117 
118  // The impact parameter functions are bound to our member PV, since they
119  // need it to compute the discriminant value.
120  if (qcuts.exists("maxTransverseImpactParameter"))
121  chargedHadronCuts.push_back(boost::bind(
123  qcuts.getParameter<double>("maxTransverseImpactParameter")));
124 
125  if (qcuts.exists("maxDeltaZ"))
126  chargedHadronCuts.push_back(boost::bind(
128  qcuts.getParameter<double>("maxDeltaZ")));
129 
130  // Build the QCuts for gammas
131  if (qcuts.exists("minGammaEt"))
132  gammaCuts.push_back(boost::bind(
133  qcuts::etMin, _1, qcuts.getParameter<double>("minGammaEt")));
134 
135  // Build QCuts for netural hadrons
136  if (qcuts.exists("minNeutralHadronEt"))
137  neutralHadronCuts.push_back(boost::bind(
138  qcuts::etMin, _1,
139  qcuts.getParameter<double>("minNeutralHadronEt")));
140 
141  // Map our QCut collections to the particle Ids they are associated to.
142  qcuts_[PFCandidate::h] = chargedHadronCuts;
143  qcuts_[PFCandidate::gamma] = gammaCuts;
144  qcuts_[PFCandidate::h0] = neutralHadronCuts;
145  // We use the same qcuts for muons/electrons and charged hadrons.
146  qcuts_[PFCandidate::e] = chargedHadronCuts;
147  qcuts_[PFCandidate::mu] = chargedHadronCuts;
148 
149  // Build a final level predicate that works on any PFCand
150  predicate_ = boost::bind(qcuts::mapAndCutByType, _1, boost::cref(qcuts_));
151 }
152 
153 }} // end namespace reco::tau
bool ptMin(const PFCandidate &cand, double cut)
T getParameter(std::string const &) const
bool AND(const PFCandidate &cand, const RecoTauQualityCuts::QCutFuncCollection &cuts)
bool trkChi2(const PFCandidate &cand, double cut)
RecoTauQualityCuts(const edm::ParameterSet &qcuts)
virtual double et() const
transverse energy
boost::function< bool(const PFCandidate &)> QCutFunc
bool exists(std::string const &parameterName) const
checks if a parameter exists
#define abs(x)
Definition: mlp_lapack.h:159
bool isNull() const
Checks for null.
Definition: Ref.h:244
bool trkPixelHits(const PFCandidate &cand, int cut)
std::map< PFCandidate::ParticleType, QCutFuncCollection > QCutFuncMap
bool mapAndCutByType(const PFCandidate &cand, const RecoTauQualityCuts::QCutFuncMap &funcMap)
bool trkLongitudinalImpactParameter(const PFCandidate &cand, const reco::VertexRef *pv, double cut)
bool etMin(const PFCandidate &cand, double cut)
tuple cut
Definition: align_tpl.py:88
bool trkTransverseImpactParameter(const PFCandidate &cand, const reco::VertexRef *pv, double cut)
virtual double pt() const
transverse momentum
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:34
bool trkTrackerHits(const PFCandidate &cand, int cut)
virtual ParticleType particleId() const
Definition: PFCandidate.h:299
std::vector< QCutFunc > QCutFuncCollection
reco::TrackRef trackRef() const
Definition: PFCandidate.h:134