CMS 3D CMS Logo

IsolationComputer.cc
Go to the documentation of this file.
3 
4 #include <algorithm>
5 namespace {
6  struct ByEta {
7  bool operator()(const pat::PackedCandidate *c1, const pat::PackedCandidate *c2) const {
8  return c1->eta() < c2->eta();
9  }
10  bool operator()(float c1eta, const pat::PackedCandidate *c2) const { return c1eta < c2->eta(); }
11  bool operator()(const pat::PackedCandidate *c1, float c2eta) const { return c1->eta() < c2eta; }
12  };
13 } // namespace
14 void heppy::IsolationComputer::setPackedCandidates(const std::vector<pat::PackedCandidate> &all,
15  int fromPV_thresh,
16  float dz_thresh,
17  float dxy_thresh,
18  bool also_leptons) {
19  allcands_ = &all;
20  charged_.clear();
21  neutral_.clear();
22  pileup_.clear();
23 
24  for (const pat::PackedCandidate &p : all) {
25  if (p.charge() == 0) {
26  neutral_.push_back(&p);
27  } else {
28  if ((abs(p.pdgId()) == 211) || (also_leptons && ((abs(p.pdgId()) == 11) || (abs(p.pdgId()) == 13)))) {
29  if (p.fromPV() > fromPV_thresh && fabs(p.dz()) < dz_thresh && fabs(p.dxy()) < dxy_thresh) {
30  charged_.push_back(&p);
31  } else {
32  pileup_.push_back(&p);
33  }
34  }
35  }
36  }
37  if (weightCone_ > 0)
38  weights_.resize(neutral_.size());
39  std::fill(weights_.begin(), weights_.end(), -1.f);
40  std::sort(charged_.begin(), charged_.end(), ByEta());
41  std::sort(neutral_.begin(), neutral_.end(), ByEta());
42  std::sort(pileup_.begin(), pileup_.end(), ByEta());
43  clearVetos();
44 }
45 
48  for (unsigned int i = 0, n = cand.numberOfSourceCandidatePtrs(); i < n; ++i) {
49  const reco::CandidatePtr &cp = cand.sourceCandidatePtr(i);
50  if (cp.isNonnull() && cp.isAvailable())
51  vetos_.push_back(&*cp);
52  }
53 }
54 
56 void heppy::IsolationComputer::clearVetos() { vetos_.clear(); }
57 
60  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto) const {
61  return isoSumRaw(charged_, cand, dR, innerR, threshold, selfVeto);
62 }
63 
66  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto) const {
67  return isoSumRaw(pileup_, cand, dR, innerR, threshold, selfVeto);
68 }
69 
71  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto) const {
72  return isoSumRaw(neutral_, cand, dR, innerR, threshold, selfVeto);
73 }
74 
76  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto) const {
77  return isoSumNeutralsWeighted(cand, dR, innerR, threshold, selfVeto);
78 }
79 
81  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto) const {
82  return isoSumRaw(neutral_, cand, dR, innerR, threshold, selfVeto, 130);
83 }
84 
86  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto) const {
87  return isoSumNeutralsWeighted(cand, dR, innerR, threshold, selfVeto, 130);
88 }
89 
91  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto) const {
92  return isoSumRaw(neutral_, cand, dR, innerR, threshold, selfVeto, 22);
93 }
94 
96  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto) const {
97  return isoSumNeutralsWeighted(cand, dR, innerR, threshold, selfVeto, 22);
98 }
99 
100 float heppy::IsolationComputer::isoSumRaw(const std::vector<const pat::PackedCandidate *> &cands,
101  const reco::Candidate &cand,
102  float dR,
103  float innerR,
104  float threshold,
105  SelfVetoPolicy selfVeto,
106  int pdgId) const {
107  float dR2 = dR * dR, innerR2 = innerR * innerR;
108 
109  std::vector<const reco::Candidate *> vetos(vetos_);
110  for (unsigned int i = 0, n = cand.numberOfSourceCandidatePtrs(); i < n; ++i) {
111  if (selfVeto == selfVetoNone)
112  break;
113  const reco::CandidatePtr &cp = cand.sourceCandidatePtr(i);
114  if (cp.isNonnull() && cp.isAvailable()) {
115  vetos.push_back(&*cp);
116  if (selfVeto == selfVetoFirst)
117  break;
118  }
119  }
120 
121  typedef std::vector<const pat::PackedCandidate *>::const_iterator IT;
122  IT candsbegin = std::lower_bound(cands.begin(), cands.end(), cand.eta() - dR, ByEta());
123  IT candsend = std::upper_bound(candsbegin, cands.end(), cand.eta() + dR, ByEta());
124 
125  double isosum = 0;
126  for (IT icharged = candsbegin; icharged < candsend; ++icharged) {
127  // pdgId
128  if (pdgId > 0 && abs((*icharged)->pdgId()) != pdgId)
129  continue;
130  // threshold
131  if (threshold > 0 && (*icharged)->pt() < threshold)
132  continue;
133  // cone
134  float mydr2 = reco::deltaR2(**icharged, cand);
135  if (mydr2 >= dR2 || mydr2 < innerR2)
136  continue;
137  // veto
138  if (std::find(vetos.begin(), vetos.end(), *icharged) != vetos.end()) {
139  continue;
140  }
141  // add to sum
142  isosum += (*icharged)->pt();
143  }
144  return isosum;
145 }
146 
148  const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto, int pdgId) const {
149  if (weightCone_ <= 0)
150  throw cms::Exception("LogicError", "you must set a valid weight cone to use this method");
151  float dR2 = dR * dR, innerR2 = innerR * innerR, weightCone2 = weightCone_ * weightCone_;
152 
153  std::vector<const reco::Candidate *> vetos(vetos_);
154  for (unsigned int i = 0, n = cand.numberOfSourceCandidatePtrs(); i < n; ++i) {
155  if (selfVeto == selfVetoNone)
156  break;
157  const reco::CandidatePtr &cp = cand.sourceCandidatePtr(i);
158  if (cp.isNonnull() && cp.isAvailable()) {
159  vetos.push_back(&*cp);
160  if (selfVeto == selfVetoFirst)
161  break;
162  }
163  }
164 
165  typedef std::vector<const pat::PackedCandidate *>::const_iterator IT;
166  IT charged_begin = std::lower_bound(charged_.begin(), charged_.end(), cand.eta() - dR - weightCone_, ByEta());
167  IT charged_end = std::upper_bound(charged_begin, charged_.end(), cand.eta() + dR + weightCone_, ByEta());
168  IT pileup_begin = std::lower_bound(pileup_.begin(), pileup_.end(), cand.eta() - dR - weightCone_, ByEta());
169  IT pileup_end = std::upper_bound(pileup_begin, pileup_.end(), cand.eta() + dR + weightCone_, ByEta());
170  IT neutral_begin = std::lower_bound(neutral_.begin(), neutral_.end(), cand.eta() - dR, ByEta());
171  IT neutral_end = std::upper_bound(neutral_begin, neutral_.end(), cand.eta() + dR, ByEta());
172 
173  double isosum = 0.0;
174  for (IT ineutral = neutral_begin; ineutral < neutral_end; ++ineutral) {
175  // pdgId
176  if (pdgId > 0 && abs((*ineutral)->pdgId()) != pdgId)
177  continue;
178  // threshold
179  if (threshold > 0 && (*ineutral)->pt() < threshold)
180  continue;
181  // cone
182  float mydr2 = reco::deltaR2(**ineutral, cand);
183  if (mydr2 >= dR2 || mydr2 < innerR2)
184  continue;
185  // veto
186  if (std::find(vetos.begin(), vetos.end(), *ineutral) != vetos.end()) {
187  continue;
188  }
189  // weight
190  float &w = weights_[ineutral - neutral_.begin()];
191  if (w == -1.f) {
192  double sumc = 0, sump = 0.0;
193  for (IT icharged = charged_begin; icharged < charged_end; ++icharged) {
194  float hisdr2 = std::max<float>(reco::deltaR2(**icharged, **ineutral), 0.01f);
195  if (hisdr2 > weightCone2)
196  continue;
197  if (std::find(vetos_.begin(), vetos_.end(), *icharged) != vetos_.end()) {
198  continue;
199  }
200  sumc += std::log((*icharged)->pt() / std::sqrt(hisdr2));
201  }
202  for (IT ipileup = pileup_begin; ipileup < pileup_end; ++ipileup) {
203  float hisdr2 = std::max<float>(reco::deltaR2(**ipileup, **ineutral), 0.01f);
204  if (hisdr2 > weightCone2)
205  continue;
206  if (std::find(vetos_.begin(), vetos_.end(), *ipileup) != vetos_.end()) {
207  continue;
208  }
209  sumc += std::log((*ipileup)->pt() / std::sqrt(hisdr2));
210  }
211  w = (sump == 0 ? 1 : sumc / (sump + sumc));
212  }
213  // add to sum
214  isosum += w * (*ineutral)->pt();
215  }
216  return isosum;
217 }
def all(container)
workaround iterator generators for ROOT classes
Definition: cmstools.py:25
T w() const
std::vector< const pat::PackedCandidate * > neutral_
void clearVetos()
clear all vetos
float puAbsIso(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from charged from PU.
const std::vector< pat::PackedCandidate > * allcands_
void addVetos(const reco::Candidate &cand)
veto footprint from this candidate, for the isolation of all candidates and also for calculation of n...
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
double eta() const override
momentum pseudorapidity
T sqrt(T t)
Definition: SSEVec.h:19
float photonAbsIsoWeighted(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from photons (with weights)
SelfVetoPolicy
Self-veto policy.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
std::vector< const pat::PackedCandidate * > charged_
std::vector< LinkConnSpec >::const_iterator IT
float isoSumRaw(const std::vector< const pat::PackedCandidate *> &cands, const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto, int pdgId=-1) const
float neutralHadAbsIsoWeighted(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from neutral hadrons (with weights)
std::vector< const pat::PackedCandidate * > pileup_
float isoSumNeutralsWeighted(const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto, int pdgId=-1) const
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
float neutralAbsIsoWeighted(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from all neutrals (with weights)
float photonAbsIsoRaw(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from photons (uncorrected)
float neutralHadAbsIsoRaw(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from neutral hadrons (uncorrected)
float neutralAbsIsoRaw(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from all neutrals (uncorrected)
std::vector< float > weights_
float chargedAbsIso(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from charged from the PV.
void setPackedCandidates(const std::vector< pat::PackedCandidate > &all, int fromPV_thresh=1, float dz_thresh=9999., float dxy_thresh=9999., bool also_leptons=false)
Initialize with the list of packed candidates (note: clears also all vetos)