8 return c1->
eta() < c2->
eta();
25 if (
p.charge() == 0) {
26 neutral_.push_back(&
p);
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);
32 pileup_.push_back(&
p);
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());
51 vetos_.push_back(&*cp);
61 return isoSumRaw(charged_, cand, dR, innerR, threshold, selfVeto);
67 return isoSumRaw(pileup_, cand, dR, innerR, threshold, selfVeto);
72 return isoSumRaw(neutral_, cand, dR, innerR, threshold, selfVeto);
77 return isoSumNeutralsWeighted(cand, dR, innerR, threshold, selfVeto);
82 return isoSumRaw(neutral_, cand, dR, innerR, threshold, selfVeto, 130);
87 return isoSumNeutralsWeighted(cand, dR, innerR, threshold, selfVeto, 130);
92 return isoSumRaw(neutral_, cand, dR, innerR, threshold, selfVeto, 22);
97 return isoSumNeutralsWeighted(cand, dR, innerR, threshold, selfVeto, 22);
107 float dR2 = dR *
dR, innerR2 = innerR * innerR;
109 std::vector<const reco::Candidate *>
vetos(vetos_);
111 if (selfVeto == selfVetoNone)
115 vetos.push_back(&*cp);
116 if (selfVeto == selfVetoFirst)
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());
126 for (IT icharged = candsbegin; icharged < candsend; ++icharged) {
128 if (pdgId > 0 &&
abs((*icharged)->pdgId()) != pdgId)
131 if (threshold > 0 && (*icharged)->pt() <
threshold)
135 if (mydr2 >= dR2 || mydr2 < innerR2)
138 if (
std::find(vetos.begin(), vetos.end(), *icharged) != vetos.end()) {
142 isosum += (*icharged)->pt();
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_;
153 std::vector<const reco::Candidate *>
vetos(vetos_);
155 if (selfVeto == selfVetoNone)
159 vetos.push_back(&*cp);
160 if (selfVeto == selfVetoFirst)
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());
174 for (IT ineutral = neutral_begin; ineutral < neutral_end; ++ineutral) {
176 if (pdgId > 0 &&
abs((*ineutral)->pdgId()) != pdgId)
179 if (threshold > 0 && (*ineutral)->pt() <
threshold)
183 if (mydr2 >= dR2 || mydr2 < innerR2)
186 if (
std::find(vetos.begin(), vetos.end(), *ineutral) != vetos.end()) {
190 float &
w = weights_[ineutral - neutral_.begin()];
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)
197 if (
std::find(vetos_.begin(), vetos_.end(), *icharged) != vetos_.end()) {
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)
206 if (
std::find(vetos_.begin(), vetos_.end(), *ipileup) != vetos_.end()) {
211 w = (sump == 0 ? 1 : sumc / (sump + sumc));
214 isosum += w * (*ineutral)->pt();
float isoSumNeutralsWeighted(const reco::Candidate &cand, float dR, float innerR, float threshold, SelfVetoPolicy selfVeto, int pdgId=-1) const
virtual CandidatePtr sourceCandidatePtr(size_type i) const
void clearVetos()
clear all vetos
void addVetos(const reco::Candidate &cand)
veto footprint from this candidate, for the isolation of all candidates and also for calculation of n...
float neutralAbsIsoWeighted(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from all neutrals (with weights)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
virtual size_t numberOfSourceCandidatePtrs() const =0
float neutralHadAbsIsoWeighted(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from neutral hadrons (with weights)
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 chargedAbsIso(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from charged from the PV.
SelfVetoPolicy
Self-veto policy.
Abs< T >::type abs(const T &t)
std::vector< LinkConnSpec >::const_iterator IT
bool isNonnull() const
Checks for non-null.
float neutralHadAbsIsoRaw(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from neutral hadrons (uncorrected)
double eta() const override
momentum pseudorapidity
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
virtual double eta() const =0
momentum pseudorapidity
float neutralAbsIsoRaw(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from all neutrals (uncorrected)
float photonAbsIsoRaw(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from photons (uncorrected)
float puAbsIso(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from charged from PU.
float photonAbsIsoWeighted(const reco::Candidate &cand, float dR, float innerR=0, float threshold=0, SelfVetoPolicy selfVeto=selfVetoAll) const
Isolation from photons (with weights)
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)