26 bool isInFootprint(
const T& footprint,
29 for (
auto& it : footprint) {
30 if (it.key() == candidate.
key())
36 struct CachingPtrCandidate {
40 packed(isAOD?
nullptr : static_cast<const
pat::PackedCandidate*>(cPtr))
48 void getImpactParameters(
const CachingPtrCandidate& candidate,
const reco::Vertex&
pv,
float&
dxy,
float&
dz)
50 if (candidate.track !=
nullptr) {
51 dxy = candidate.track->dxy(pv.
position());
52 dz = candidate.track->dz(pv.
position());
54 dxy = candidate.packed->dxy(pv.
position());
55 dz = candidate.packed->dz(pv.
position());
71 else if (
abs(pdgId) == 130)
73 else if (
abs(pdgId) == 211)
98 float computeWorstPFChargedIsolation(
103 unsigned char options,
bool isAOD)
const;
123 "phoFull5x5SigmaIEtaIEta",
124 "phoFull5x5SigmaIEtaIPhi",
131 "phoFull5x5E1x3byE5x5",
132 "phoFull5x5E2x2byE5x5",
133 "phoFull5x5E2x5byE5x5",
135 "phoChargedIsolation",
136 "phoNeutralHadronIsolation",
137 "phoPhotonIsolation",
138 "phoWorstChargedIsolation",
139 "phoWorstChargedIsolationConeVeto",
140 "phoWorstChargedIsolationConeVetoPVConstr",
143 "phoHcalPFClIsolation",
144 "phoEcalPFClIsolation" 160 : usesES_(!cfg.getParameter<
edm::InputTag>(
"esReducedRecHitCollection").
label().
empty()
161 || !cfg.getParameter<
edm::InputTag>(
"esReducedRecHitCollectionMiniAOD").
label().
empty())
162 , src_( consumesCollector(), cfg,
"src",
"srcMiniAOD")
163 , ebRecHits_ (src_, consumesCollector(), cfg,
"ebReducedRecHitCollection",
"ebReducedRecHitCollectionMiniAOD")
164 , eeRecHits_ (src_, consumesCollector(), cfg,
"eeReducedRecHitCollection",
"eeReducedRecHitCollectionMiniAOD")
165 , esRecHits_ (src_, consumesCollector(), cfg,
"esReducedRecHitCollection",
"esReducedRecHitCollectionMiniAOD")
166 , vtxToken_ (src_, consumesCollector(), cfg,
"vertices",
"verticesMiniAOD")
167 , pfCandsToken_(src_, consumesCollector(), cfg,
"pfCandidates",
"pfCandidatesMiniAOD")
169 cfg.getParameter<
edm::InputTag>(
"particleBasedIsolation")) )
188 }
else if (!
src->empty()) {
190 if (
test.isNull() || !
test.isAvailable()) {
192 <<
"DataFormat is detected as miniAOD but cannot cast to pat::Photon!";
210 for(
auto const& iPho :
src->ptrs())
215 const auto&
seed = *(iPho->superCluster()->seed());
221 std::vector<float> vCov = lazyToolnoZS.localCovariances(
seed);
223 vars[1].push_back(vCov[1]);
224 vars[2].push_back(lazyToolnoZS.e1x3(
seed));
225 vars[3].push_back(lazyToolnoZS.e2x2(
seed));
226 vars[4].push_back(lazyToolnoZS.e2x5Max(
seed));
227 vars[5].push_back(lazyToolnoZS.e5x5(
seed));
228 vars[6].push_back(lazyToolnoZS.eseffsirir(*(iPho->superCluster())));
229 vars[7].push_back(vars[2].back() / vars[5].back());
230 vars[8].push_back(vars[3].back() / vars[5].back());
231 vars[9].push_back(vars[4].back() / vars[5].back());
239 iPho->superCluster()->x() - pv.
x(), iPho->superCluster()->y() - pv.
y(), iPho->superCluster()->z() - pv.
z());
242 float chargedIsoSum = 0.;
243 float neutralHadronIsoSum = 0.;
244 float photonIsoSum = 0.;
247 for(
auto const& iCand : pfCandsHandle->ptrs())
269 float dR2 =
deltaR2(phoWrtVtx.Eta(), phoWrtVtx.Phi(), iCand->eta(), iCand->phi());
270 if (dR2 > coneSizeDR2)
275 if(isInFootprint((*particleBasedIsolationMap)[iPho], iCand))
293 getImpactParameters(CachingPtrCandidate(&*iCand, isAOD), pv, dxy, dz);
295 if (fabs(dxy) > dxyMax || fabs(dz) > dzMax)
299 chargedIsoSum += iCand->pt();
303 neutralHadronIsoSum += iCand->pt();
306 photonIsoSum += iCand->pt();
309 vars[10].push_back(chargedIsoSum);
310 vars[11].push_back(neutralHadronIsoSum);
311 vars[12].push_back(photonIsoSum);
318 options |= PT_MIN_THRESH |
DR_VETO;
326 vars[16].push_back(iPho->trkSumPtSolidConeDR04());
328 vars[17].push_back(0.
f);
329 vars[18].push_back(0.
f);
359 descriptions.
add(
"photonIDValueMapProducer", desc);
368 float worstIsolation = 0.0;
372 std::vector<CachingPtrCandidate> chargedCands;
373 chargedCands.reserve(pfCands.
size());
374 for (
auto const& aCand : pfCands){
381 if ((options & PT_MIN_THRESH) && aCand.pt() <
ptMin)
384 chargedCands.emplace_back(&aCand, isAOD);
388 for (
unsigned int ivtx = 0; ivtx < vertices.size(); ++ivtx) {
395 const float phoWrtVtxPhi = phoWrtVtx.phi();
396 const float phoWrtVtxEta = phoWrtVtx.eta();
400 for (
auto const& aCCand : chargedCands) {
402 auto iCand = aCCand.candidate;
403 float dR2 =
deltaR2(phoWrtVtxEta, phoWrtVtxPhi, iCand->eta(), iCand->phi());
404 if (dR2 > coneSizeDR2 ||
405 (options & DR_VETO && dR2 < dRveto2))
410 if (options & PV_CONSTRAINT)
411 getImpactParameters(aCCand, pv, dxy, dz);
413 getImpactParameters(aCCand, *vtx, dxy, dz);
415 if (fabs(dxy) > dxyMax || fabs(dz) > dzMax)
422 worstIsolation =
std::max(sum, worstIsolation);
425 return worstIsolation;
BranchAliasSetterT< ProductType > produces()
declare what type of product will make and with which optional label
~PhotonIDValueMapProducer() override
const unsigned char DR_VETO
float computeWorstPFChargedIsolation(const reco::Photon &photon, const edm::View< reco::Candidate > &pfCands, const reco::VertexCollection &vertices, const reco::Vertex &pv, unsigned char options, bool isAOD) const
ParticleType
particle types
const unsigned char PV_CONSTRAINT
const MultiTokenT< EcalRecHitCollection > esRecHits_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
constexpr bool isNotFinite(T x)
double y() const
y coordinate
edm::RefVector< pat::PackedCandidateCollection > associatedPackedPFCandidates() const
References to PFCandidates linked to this object (e.g. for isolation vetos or masking before jet recl...
PhotonIDValueMapProducer(const edm::ParameterSet &)
const MultiTokenT< EcalRecHitCollection > ebRecHits_
std::vector< Vertex > VertexCollection
collection of Vertex objects
reco::SuperClusterRef superCluster() const override
Ref to SuperCluster.
const MultiTokenT< edm::View< reco::Photon > > src_
EcalClusterLazyToolsT< noZS::EcalClusterTools > EcalClusterLazyTools
const Point & position() const
position
const std::string names[nVars_]
const MultiTokenT< EcalRecHitCollection > eeRecHits_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const unsigned char PT_MIN_THRESH
#define DEFINE_FWK_MODULE(type)
Abs< T >::type abs(const T &t)
double z() const
z coordinate
edm::Handle< T > getValidHandle(const edm::Event &iEvent) const
edm::Ref< PFCandidateCollection > PFCandidateRef
persistent reference to a PFCandidate
ParameterDescriptionBase * add(U const &iLabel, T const &value)
double x() const
x coordinate
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
XYZVectorD XYZVector
spatial vector with cartesian internal representation
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
edm::Ptr< pat::Photon > patPhotonPtr
Particle reconstructed by the particle flow algorithm.
int getGoodTokenIndex() const
const edm::EDGetToken particleBasedIsolationToken_
const MultiTokenT< edm::View< reco::Candidate > > pfCandsToken_
const MultiTokenT< reco::VertexCollection > vtxToken_