CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes
PhotonIDValueMapProducer Class Reference
Inheritance diagram for PhotonIDValueMapProducer:
edm::stream::EDProducer<>

Public Member Functions

 PhotonIDValueMapProducer (const edm::ParameterSet &)
 
 ~PhotonIDValueMapProducer () override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 

Private Member Functions

reco::PFCandidate::ParticleType candidatePdgId (const edm::Ptr< reco::Candidate > candidate, bool isAOD)
 
template<class T , class U >
float computeWorstPFChargedIsolation (const T &photon, const U &pfCandidates, const edm::Handle< reco::VertexCollection > vertices, bool isAOD, bool isPVConstraint, const reco::Vertex &pv, float dRmax, float dxyMax, float dzMax, float dRvetoBarrel, float dRvetoEndcap, float ptMin)
 
void getImpactParameters (const edm::Ptr< reco::Candidate > &candidate, bool isAOD, const reco::Vertex &pv, float &dxy, float &dz)
 
const reco::TrackgetTrackPointer (const edm::Ptr< reco::Candidate > candidate, bool isAOD)
 
void produce (edm::Event &, const edm::EventSetup &) override
 
void writeValueMap (edm::Event &iEvent, const edm::Handle< edm::View< reco::Photon > > &handle, const std::vector< float > &values, const std::string &label) const
 

Private Attributes

edm::EDGetTokenT< EcalRecHitCollectionebReducedRecHitCollection_
 
edm::EDGetTokenT< EcalRecHitCollectionebReducedRecHitCollectionMiniAOD_
 
edm::EDGetTokenT< EcalRecHitCollectioneeReducedRecHitCollection_
 
edm::EDGetTokenT< EcalRecHitCollectioneeReducedRecHitCollectionMiniAOD_
 
edm::EDGetTokenT< EcalRecHitCollectionesReducedRecHitCollection_
 
edm::EDGetTokenT< EcalRecHitCollectionesReducedRecHitCollectionMiniAOD_
 
std::unique_ptr< noZS::EcalClusterLazyToolslazyToolnoZS
 
edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > particleBasedIsolationToken_
 
edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > particleBasedIsolationTokenMiniAOD_
 
edm::EDGetTokenT< edm::View< reco::Candidate > > pfCandidatesToken_
 
edm::EDGetTokenT< edm::View< reco::Candidate > > pfCandidatesTokenMiniAOD_
 
edm::EDGetToken src_
 
edm::EDGetToken srcMiniAOD_
 
bool usesES_
 
edm::EDGetTokenT< reco::VertexCollectionvtxToken_
 
edm::EDGetTokenT< reco::VertexCollectionvtxTokenMiniAOD_
 

Static Private Attributes

static char phoChargedIsolation_ [] = "phoChargedIsolation"
 
static char phoEcalPFClIsolation_ [] = "phoEcalPFClIsolation"
 
static char phoESEffSigmaRR_ [] = "phoESEffSigmaRR"
 
static char phoFull5x5E1x3_ [] = "phoFull5x5E1x3"
 
static char phoFull5x5E2x2_ [] = "phoFull5x5E2x2"
 
static char phoFull5x5E2x5Max_ [] = "phoFull5x5E2x5Max"
 
static char phoFull5x5E5x5_ [] = "phoFull5x5E5x5"
 
static char phoFull5x5SigmaIEtaIEta_ [] = "phoFull5x5SigmaIEtaIEta"
 
static char phoFull5x5SigmaIEtaIPhi_ [] = "phoFull5x5SigmaIEtaIPhi"
 
static char phoHcalPFClIsolation_ [] = "phoHcalPFClIsolation"
 
static char phoNeutralHadronIsolation_ [] = "phoNeutralHadronIsolation"
 
static char phoPhotonIsolation_ [] = "phoPhotonIsolation"
 
static char phoTrkIsolation_ [] = "phoTrkIsolation"
 
static char phoWorstChargedIsolation_ [] = "phoWorstChargedIsolation"
 
static char phoWorstChargedIsolationWithConeVeto_ [] = "phoWorstChargedIsolationWithConeVeto"
 
static char phoWorstChargedIsolationWithConeVetoWithPVConstraint_ [] = "phoWorstChargedIsolationWithConeVetoWithPVConstraint"
 
static char phoWorstChargedIsolationWithPVConstraint_ [] = "phoWorstChargedIsolationWithPVConstraint"
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
typedef CacheContexts< T... > CacheTypes
 
typedef CacheTypes::GlobalCache GlobalCache
 
typedef AbilityChecker< T... > HasAbility
 
typedef CacheTypes::LuminosityBlockCache LuminosityBlockCache
 
typedef LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCacheLuminosityBlockContext
 
typedef CacheTypes::LuminosityBlockSummaryCache LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache, GlobalCacheRunContext
 
typedef CacheTypes::RunSummaryCache RunSummaryCache
 

Detailed Description

Definition at line 40 of file PhotonIDValueMapProducer.cc.

Constructor & Destructor Documentation

PhotonIDValueMapProducer::PhotonIDValueMapProducer ( const edm::ParameterSet iConfig)
explicit

Definition at line 156 of file PhotonIDValueMapProducer.cc.

References ebReducedRecHitCollection_, ebReducedRecHitCollectionMiniAOD_, eeReducedRecHitCollection_, eeReducedRecHitCollectionMiniAOD_, esReducedRecHitCollection_, esReducedRecHitCollectionMiniAOD_, edm::ParameterSet::getParameter(), edm::InputTag::label(), diffTwoXMLs::label, particleBasedIsolationToken_, pfCandidatesToken_, pfCandidatesTokenMiniAOD_, phoChargedIsolation_, phoEcalPFClIsolation_, phoESEffSigmaRR_, phoFull5x5E1x3_, phoFull5x5E2x2_, phoFull5x5E2x5Max_, phoFull5x5E5x5_, phoFull5x5SigmaIEtaIEta_, phoFull5x5SigmaIEtaIPhi_, phoHcalPFClIsolation_, phoNeutralHadronIsolation_, phoPhotonIsolation_, phoTrkIsolation_, phoWorstChargedIsolation_, phoWorstChargedIsolationWithConeVeto_, phoWorstChargedIsolationWithConeVetoWithPVConstraint_, phoWorstChargedIsolationWithPVConstraint_, src_, srcMiniAOD_, usesES_, vtxToken_, and vtxTokenMiniAOD_.

156  {
157 
158  //
159  // Declare consummables, handle both AOD and miniAOD case
160  //
161  ebReducedRecHitCollection_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
162  ("ebReducedRecHitCollection"));
163  ebReducedRecHitCollectionMiniAOD_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
164  ("ebReducedRecHitCollectionMiniAOD"));
165 
166  eeReducedRecHitCollection_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
167  ("eeReducedRecHitCollection"));
168  eeReducedRecHitCollectionMiniAOD_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
169  ("eeReducedRecHitCollectionMiniAOD"));
170 
171  if (!iConfig.getParameter<edm::InputTag>("esReducedRecHitCollection").label().empty() ||
172  !iConfig.getParameter<edm::InputTag>("esReducedRecHitCollectionMiniAOD").label().empty()) {
173  usesES_ = true;
174  esReducedRecHitCollection_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
175  ("esReducedRecHitCollection"));
176  esReducedRecHitCollectionMiniAOD_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
177  ("esReducedRecHitCollectionMiniAOD"));
178 
179  } else {
180  usesES_ = false;
181  }
182 
183  vtxToken_ = mayConsume<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("vertices"));
184  vtxTokenMiniAOD_ = mayConsume<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("verticesMiniAOD"));
185 
186  // reco photons are castable into pat photons, so no need to handle reco/pat seprately
187  src_ = mayConsume<edm::View<reco::Photon> >(iConfig.getParameter<edm::InputTag>("src"));
188  srcMiniAOD_ = mayConsume<edm::View<reco::Photon> >(iConfig.getParameter<edm::InputTag>("srcMiniAOD"));
189 
190  // The particleBasedIsolation object is relevant only for AOD, RECO format
191  particleBasedIsolationToken_ = mayConsume<edm::ValueMap<std::vector<reco::PFCandidateRef > > >
192  (iConfig.getParameter<edm::InputTag>("particleBasedIsolation"));
193 
194  // AOD has reco::PFCandidate vector, and miniAOD has pat::PackedCandidate vector.
195  // Both inherit from reco::Candidate, so we go to the base class. We can cast into
196  // the full type later if needed. Since the collection names are different, we
197  // introduce both collections
198  pfCandidatesToken_ = mayConsume< edm::View<reco::Candidate> >(iConfig.getParameter<edm::InputTag>("pfCandidates"));
199  pfCandidatesTokenMiniAOD_ = mayConsume< edm::View<reco::Candidate> >(iConfig.getParameter<edm::InputTag>("pfCandidatesMiniAOD"));
200 
201  //
202  // Declare producibles
203  //
204  // Cluster shapes
205  produces<edm::ValueMap<float> >(phoFull5x5SigmaIEtaIEta_);
206  produces<edm::ValueMap<float> >(phoFull5x5SigmaIEtaIPhi_);
207  produces<edm::ValueMap<float> >(phoFull5x5E1x3_);
208  produces<edm::ValueMap<float> >(phoFull5x5E2x2_);
209  produces<edm::ValueMap<float> >(phoFull5x5E2x5Max_);
210  produces<edm::ValueMap<float> >(phoFull5x5E5x5_);
211  produces<edm::ValueMap<float> >(phoESEffSigmaRR_);
212  // Isolations
213  produces<edm::ValueMap<float> >(phoChargedIsolation_);
214  produces<edm::ValueMap<float> >(phoNeutralHadronIsolation_);
215  produces<edm::ValueMap<float> >(phoPhotonIsolation_);
216  produces<edm::ValueMap<float> >(phoWorstChargedIsolation_);
217  produces<edm::ValueMap<float> >(phoWorstChargedIsolationWithConeVeto_);
218  produces<edm::ValueMap<float> >(phoWorstChargedIsolationWithPVConstraint_);
219  produces<edm::ValueMap<float> >(phoWorstChargedIsolationWithConeVetoWithPVConstraint_);
220 
221  //PFCluster Isolations
222  produces<edm::ValueMap<float> >(phoTrkIsolation_);
223  produces<edm::ValueMap<float> >(phoHcalPFClIsolation_);
224  produces<edm::ValueMap<float> >(phoEcalPFClIsolation_);
225 
226 
227 }
T getParameter(std::string const &) const
edm::EDGetTokenT< EcalRecHitCollection > esReducedRecHitCollectionMiniAOD_
edm::EDGetTokenT< reco::VertexCollection > vtxToken_
edm::EDGetTokenT< reco::VertexCollection > vtxTokenMiniAOD_
edm::EDGetTokenT< EcalRecHitCollection > eeReducedRecHitCollectionMiniAOD_
edm::EDGetTokenT< EcalRecHitCollection > ebReducedRecHitCollection_
edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > particleBasedIsolationToken_
edm::EDGetTokenT< EcalRecHitCollection > ebReducedRecHitCollectionMiniAOD_
edm::EDGetTokenT< edm::View< reco::Candidate > > pfCandidatesTokenMiniAOD_
edm::EDGetTokenT< EcalRecHitCollection > eeReducedRecHitCollection_
edm::EDGetTokenT< edm::View< reco::Candidate > > pfCandidatesToken_
edm::EDGetTokenT< EcalRecHitCollection > esReducedRecHitCollection_
static char phoWorstChargedIsolationWithConeVetoWithPVConstraint_[]
std::string const & label() const
Definition: InputTag.h:36
static char phoWorstChargedIsolationWithPVConstraint_[]
static char phoWorstChargedIsolationWithConeVeto_[]
PhotonIDValueMapProducer::~PhotonIDValueMapProducer ( )
override

Definition at line 229 of file PhotonIDValueMapProducer.cc.

229  {
230 }

Member Function Documentation

reco::PFCandidate::ParticleType PhotonIDValueMapProducer::candidatePdgId ( const edm::Ptr< reco::Candidate candidate,
bool  isAOD 
)
private

Definition at line 611 of file PhotonIDValueMapProducer.cc.

References funct::abs(), reco::PFCandidate::gamma, reco::PFCandidate::h, reco::PFCandidate::h0, common_cff::pdgId, and reco::PFCandidate::X.

Referenced by computeWorstPFChargedIsolation(), and produce().

612  {
613 
615  if( isAOD )
616  thisCandidateType = ( (const recoCandPtr)candidate)->particleId();
617  else {
618  // the neutral hadrons and charged hadrons can be of pdgId types
619  // only 130 (K0L) and +-211 (pi+-) in packed candidates
620  const int pdgId = ( (const patCandPtr)candidate)->pdgId();
621  if( pdgId == 22 )
622  thisCandidateType = reco::PFCandidate::gamma;
623  else if( abs(pdgId) == 130) // PDG ID for K0L
624  thisCandidateType = reco::PFCandidate::h0;
625  else if( abs(pdgId) == 211) // PDG ID for pi+-
626  thisCandidateType = reco::PFCandidate::h;
627  }
628  return thisCandidateType;
629 }
ParticleType
particle types
Definition: PFCandidate.h:45
edm::Ptr< pat::PackedCandidate > patCandPtr
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
edm::Ptr< reco::PFCandidate > recoCandPtr
template<class T , class U >
float PhotonIDValueMapProducer::computeWorstPFChargedIsolation ( const T photon,
const U &  pfCandidates,
const edm::Handle< reco::VertexCollection vertices,
bool  isAOD,
bool  isPVConstraint,
const reco::Vertex pv,
float  dRmax,
float  dxyMax,
float  dzMax,
float  dRvetoBarrel,
float  dRvetoEndcap,
float  ptMin 
)
private

Definition at line 545 of file PhotonIDValueMapProducer.cc.

References candidatePdgId(), reco::deltaR2(), PVValHelper::dxy, PVValHelper::dz, getImpactParameters(), reco::PFCandidate::h, mps_fire::i, ALCARECOTkAlBeamHalo_cff::ptMin, and badGlobalMuonTaggersAOD_cff::vtx.

Referenced by fillDescriptions(), and produce().

549  {
550 
551 
552  float worstIsolation = 999;
553  std::vector<float> allIsolations;
554 
555  float dRveto;
556  if (photon->isEB())
557  dRveto = dRvetoBarrel;
558  else
559  dRveto = dRvetoEndcap;
560 
561  //Calculate isolation sum separately for each vertex
562  for(unsigned int ivtx=0; ivtx<vertices->size(); ++ivtx) {
563 
564  // Shift the photon according to the vertex
565  reco::VertexRef vtx(vertices, ivtx);
566  math::XYZVector photon_directionWrtVtx(photon->superCluster()->x() - vtx->x(),
567  photon->superCluster()->y() - vtx->y(),
568  photon->superCluster()->z() - vtx->z());
569 
570  float sum = 0;
571  // Loop over the PFCandidates
572  for(unsigned i=0; i<pfCandidates->size(); i++) {
573 
574  const auto& iCand = pfCandidates->ptrAt(i);
575 
576  //require that PFCandidate is a charged hadron
577  reco::PFCandidate::ParticleType thisCandidateType = candidatePdgId(iCand, isAOD);
578  if (thisCandidateType != reco::PFCandidate::h)
579  continue;
580 
581  if (iCand->pt() < ptMin)
582  continue;
583 
584  float dxy=-999, dz=-999;
585  if(isPVConstraint) getImpactParameters(iCand, isAOD, pv, dxy, dz);
586  else getImpactParameters(iCand, isAOD, *vtx, dxy, dz);
587 
588 
589 
590  if( fabs(dxy) > dxyMax) continue;
591  if ( fabs(dz) > dzMax) continue;
592 
593  float dR2 = deltaR2(photon_directionWrtVtx.Eta(), photon_directionWrtVtx.Phi(),
594  iCand->eta(), iCand->phi());
595  if(dR2 > dRmax*dRmax || dR2 < dRveto*dRveto) continue;
596 
597  sum += iCand->pt();
598  }
599 
600  allIsolations.push_back(sum);
601  }
602 
603  if( !allIsolations.empty() )
604  worstIsolation = * std::max_element( allIsolations.begin(), allIsolations.end() );
605 
606  return worstIsolation;
607 }
ParticleType
particle types
Definition: PFCandidate.h:45
reco::PFCandidate::ParticleType candidatePdgId(const edm::Ptr< reco::Candidate > candidate, bool isAOD)
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
T1 deltaR2(T1 eta1, T2 phi1, T3 eta2, T4 phi2)
Definition: deltaR.h:36
void getImpactParameters(const edm::Ptr< reco::Candidate > &candidate, bool isAOD, const reco::Vertex &pv, float &dxy, float &dz)
void PhotonIDValueMapProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 533 of file PhotonIDValueMapProducer.cc.

References edm::ConfigurationDescriptions::addDefault(), computeWorstPFChargedIsolation(), and edm::ParameterSetDescription::setUnknown().

533  {
534  //The following says we do not know what parameters are allowed so do no validation
535  // Please change this to state exactly what you do use, even if it is no parameters
537  desc.setUnknown();
538  descriptions.addDefault(desc);
539 }
void addDefault(ParameterSetDescription const &psetDescription)
void PhotonIDValueMapProducer::getImpactParameters ( const edm::Ptr< reco::Candidate > &  candidate,
bool  isAOD,
const reco::Vertex pv,
float &  dxy,
float &  dz 
)
private

Definition at line 643 of file PhotonIDValueMapProducer.cc.

References DEFINE_FWK_MODULE, reco::TrackBase::dxy(), pat::PackedCandidate::dxy(), reco::TrackBase::dz(), pat::PackedCandidate::dz(), and reco::Vertex::position().

Referenced by computeWorstPFChargedIsolation(), and produce().

645  {
646 
647  dxy=-999;
648  dz=-999;
649  if( isAOD ) {
650  const reco::Track *theTrack = &*( ((const recoCandPtr) candidate)->trackRef());
651  dxy = theTrack->dxy(pv.position());
652  dz = theTrack->dz(pv.position());
653  } else {
654  const pat::PackedCandidate & aCand = *(patCandPtr(candidate));
655  dxy = aCand.dxy(pv.position());
656  dz = aCand.dz(pv.position());
657 
658  }
659 
660 }
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
const Point & position() const
position
Definition: Vertex.h:109
edm::Ptr< pat::PackedCandidate > patCandPtr
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:609
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:591
edm::Ptr< reco::PFCandidate > recoCandPtr
const reco::Track * PhotonIDValueMapProducer::getTrackPointer ( const edm::Ptr< reco::Candidate candidate,
bool  isAOD 
)
private

Definition at line 632 of file PhotonIDValueMapProducer.cc.

632  {
633 
634  const reco::Track* theTrack = nullptr;
635  if( isAOD )
636  theTrack = &*( ((const recoCandPtr) candidate)->trackRef());
637  else
638  theTrack = &( ((const patCandPtr) candidate)->pseudoTrack());
639 
640  return theTrack;
641 }
edm::Ptr< pat::PackedCandidate > patCandPtr
edm::Ptr< reco::PFCandidate > recoCandPtr
void PhotonIDValueMapProducer::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivate

Definition at line 232 of file PhotonIDValueMapProducer.cc.

References candidatePdgId(), computeWorstPFChargedIsolation(), reco::deltaR2(), PVValHelper::dxy, PVValHelper::dz, AlignmentTrackSelector_cfi::dzMax, heepElectronID_HEEPV50_CSA14_25ns_cff::e5x5, ebReducedRecHitCollection_, ebReducedRecHitCollectionMiniAOD_, eeReducedRecHitCollection_, eeReducedRecHitCollectionMiniAOD_, esReducedRecHitCollection_, esReducedRecHitCollectionMiniAOD_, Exception, f, reco::PFCandidate::gamma, edm::Event::getByToken(), getImpactParameters(), reco::PFCandidate::h, reco::PFCandidate::h0, iEvent, isInFootprint(), edm::detail::isnan(), edm::HandleBase::isValid(), lazyToolnoZS, particleBasedIsolationToken_, pfCandidatesToken_, pfCandidatesTokenMiniAOD_, egammaObjectModificationsInMiniAOD_cff::phoChargedIsolation, phoChargedIsolation_, phoEcalPFClIsolation_, phoESEffSigmaRR_, phoFull5x5E1x3_, phoFull5x5E2x2_, phoFull5x5E2x5Max_, phoFull5x5E5x5_, phoFull5x5SigmaIEtaIEta_, phoFull5x5SigmaIEtaIPhi_, phoHcalPFClIsolation_, egammaObjectModificationsInMiniAOD_cff::phoNeutralHadronIsolation, phoNeutralHadronIsolation_, egammaObjectModificationsInMiniAOD_cff::phoPhotonIsolation, phoPhotonIsolation_, phoTrkIsolation_, egammaObjectModificationsInMiniAOD_cff::phoWorstChargedIsolation, phoWorstChargedIsolation_, phoWorstChargedIsolationWithConeVeto_, phoWorstChargedIsolationWithConeVetoWithPVConstraint_, phoWorstChargedIsolationWithPVConstraint_, ALCARECOTkAlBeamHalo_cff::ptMin, MetAnalyzer::pv(), mathSSE::sqrt(), TrackRefitter_38T_cff::src, src_, srcMiniAOD_, PFTauMVAInputDiscriminatorTranslator_cfi::test, usesES_, electrons_cff::vertices, vtxToken_, vtxTokenMiniAOD_, writeValueMap(), reco::Vertex::x(), reco::Vertex::y(), and reco::Vertex::z().

232  {
233 
234  using namespace edm;
235 
236  // Constants
237  const float coneSizeDR = 0.3;
238  const float dxyMax = 0.1;
239  const float dzMax = 0.2;
240 
242 
243  bool isAOD = true;
244  iEvent.getByToken(src_, src);
245  if( !src.isValid() ){
246  isAOD = false;
247  iEvent.getByToken(srcMiniAOD_,src);
248  }
249  if( !src.isValid() ) {
250  throw cms::Exception("IllDefinedDataTier")
251  << "DataFormat does not contain a photon source!";
252  }
253 
254  // Configure Lazy Tools
255  if (usesES_) {
256  if( isAOD )
257  lazyToolnoZS = std::make_unique<noZS::EcalClusterLazyTools>(iEvent, iSetup,
261  else
262  lazyToolnoZS = std::make_unique<noZS::EcalClusterLazyTools>(iEvent, iSetup,
266  } else {
267  if( isAOD )
268  lazyToolnoZS = std::make_unique<noZS::EcalClusterLazyTools>(iEvent, iSetup,
271  else
272  lazyToolnoZS = std::make_unique<noZS::EcalClusterLazyTools>(iEvent, iSetup,
275 
276  }
277 
278  // Get PV
280  iEvent.getByToken(vtxToken_, vertices);
281  if( !vertices.isValid() )
282  iEvent.getByToken(vtxTokenMiniAOD_, vertices);
283  if (vertices->empty()) return; // skip the event if no PV found
284  const reco::Vertex &pv = vertices->front();
285 
287  if( isAOD ){
288  // this exists only in AOD
289  iEvent.getByToken(particleBasedIsolationToken_, particleBasedIsolationMap);
290  }
291 
292  edm::Handle< edm::View<reco::Candidate> > pfCandidatesHandle;
293 
294  iEvent.getByToken(pfCandidatesToken_, pfCandidatesHandle);
295  if( !pfCandidatesHandle.isValid() )
296  iEvent.getByToken(pfCandidatesTokenMiniAOD_, pfCandidatesHandle);
297 
298  if( !isAOD && !src->empty() ) {
299  edm::Ptr<pat::Photon> test(src->ptrAt(0));
300  if( test.isNull() || !test.isAvailable() ) {
301  throw cms::Exception("InvalidConfiguration")
302  <<"DataFormat is detected as miniAOD but cannot cast to pat::Photon!";
303  }
304  }
305 
306  // size_t n = src->size();
307  // Cluster shapes
308  std::vector<float> phoFull5x5SigmaIEtaIEta;
309  std::vector<float> phoFull5x5SigmaIEtaIPhi;
310  std::vector<float> phoFull5x5E1x3;
311  std::vector<float> phoFull5x5E2x2;
312  std::vector<float> phoFull5x5E2x5Max;
313  std::vector<float> phoFull5x5E5x5;
314  std::vector<float> phoESEffSigmaRR;
315  // Isolations
316  std::vector<float> phoChargedIsolation;
317  std::vector<float> phoNeutralHadronIsolation;
318  std::vector<float> phoPhotonIsolation;
319  std::vector<float> phoWorstChargedIsolation;
320  std::vector<float> phoWorstChargedIsolationWithConeVeto;
321  std::vector<float> phoWorstChargedIsolationWithPVConstraint;
322  std::vector<float> phoWorstChargedIsolationWithConeVetoWithPVConstraint;
323 
324  //PFCluster Isolations
325  std::vector<float> phoTrkIsolation;
326  std::vector<float> phoHcalPFClIsolation;
327  std::vector<float> phoEcalPFClIsolation;
328 
329  // reco::Photon::superCluster() is virtual so we can exploit polymorphism
330  for (unsigned idxpho = 0; idxpho < src->size(); ++idxpho) {
331  const auto& iPho = src->ptrAt(idxpho);
332 
333  //
334  // Compute full 5x5 quantities
335  //
336  const auto& theseed = *(iPho->superCluster()->seed());
337 
338  // For full5x5_sigmaIetaIeta, for 720 we use: lazy tools for AOD,
339  // and userFloats or lazy tools for miniAOD. From some point in 72X and on, one can
340  // retrieve the full5x5 directly from the object with ->full5x5_sigmaIetaIeta()
341  // for both formats.
342  float see = -999;
343  std::vector<float> vCov = lazyToolnoZS->localCovariances( theseed );
344  see = (isnan(vCov[0]) ? 0. : sqrt(vCov[0]));
345  float sep = vCov[1];
346  phoFull5x5SigmaIEtaIEta.push_back(see);
347  phoFull5x5SigmaIEtaIPhi.push_back(sep);
348 
349  phoFull5x5E1x3 .push_back(lazyToolnoZS-> e1x3 (theseed) );
350  phoFull5x5E2x2 .push_back(lazyToolnoZS-> e2x2 (theseed) );
351  phoFull5x5E2x5Max.push_back(lazyToolnoZS-> e2x5Max(theseed) );
352  phoFull5x5E5x5 .push_back(lazyToolnoZS-> e5x5 (theseed) );
353 
354  phoESEffSigmaRR .push_back(lazyToolnoZS->eseffsirir( *(iPho->superCluster()) ) );
355 
356  //
357  // Compute absolute uncorrected isolations with footprint removal
358  //
359 
360  // First, find photon direction with respect to the good PV
361  math::XYZVector photon_directionWrtVtx(iPho->superCluster()->x() - pv.x(),
362  iPho->superCluster()->y() - pv.y(),
363  iPho->superCluster()->z() - pv.z());
364 
365  //PFCluster Isolations
366  phoTrkIsolation .push_back( iPho->trkSumPtSolidConeDR04());
367  if (isAOD)
368  {
369  phoHcalPFClIsolation .push_back(0.f);
370  phoEcalPFClIsolation .push_back(0.f);
371  }
372  else
373  {
374  edm::Ptr<pat::Photon> patPhotonPtr(src->ptrAt(idxpho));
375  phoHcalPFClIsolation .push_back(patPhotonPtr->hcalPFClusterIso());
376  phoEcalPFClIsolation .push_back(patPhotonPtr->ecalPFClusterIso());
377  }
378 
379 
380  // Zero the isolation sums
381  float chargedIsoSum = 0;
382  float neutralHadronIsoSum = 0;
383  float photonIsoSum = 0;
384 
385  // Loop over all PF candidates
386  for (unsigned idxcand = 0; idxcand < pfCandidatesHandle->size(); ++idxcand ){
387 
388  // Here, the type will be a simple reco::Candidate. We cast it
389  // for full PFCandidate or PackedCandidate below as necessary
390  const auto& iCand = pfCandidatesHandle->ptrAt(idxcand);
391 
392  // One would think that we should check that this iCand from
393  // the generic PF collection is not identical to the iPho photon
394  // for which we are computing the isolations. However, it turns out
395  // to be unnecessary. Below, in the function isInFootprint(), we drop
396  // this iCand if it is in the footprint, and this always removes
397  // the iCand if it matches the iPho.
398  // The explicit check at this point is not totally trivial because
399  // of non-triviality of implementation of this check for miniAOD (PackedCandidates
400  // of the PF collection do not contain the supercluser link, so can't use that).
401  // if( isAOD ){
402  // if( ((const recoCandPtr)iCand)->superClusterRef() == iPho->superCluster() ) continue;
403  // }
404 
405 
406  // Check if this candidate is within the isolation cone
407  float dR2 = deltaR2(photon_directionWrtVtx.Eta(),photon_directionWrtVtx.Phi(),
408  iCand->eta(), iCand->phi());
409  if( dR2 > coneSizeDR*coneSizeDR ) continue;
410 
411  // Check if this candidate is not in the footprint
412  bool inFootprint = false;
413  if(isAOD) {
414  inFootprint = isInFootprint( (*particleBasedIsolationMap)[iPho], iCand );
415  } else {
416  edm::Ptr<pat::Photon> patPhotonPtr(src->ptrAt(idxpho));
417  inFootprint = isInFootprint(patPhotonPtr->associatedPackedPFCandidates(), iCand);
418  }
419 
420  if( inFootprint ) continue;
421 
422  // Find candidate type
423  reco::PFCandidate::ParticleType thisCandidateType = candidatePdgId(iCand, isAOD);
424 
425  // Increment the appropriate isolation sum
426  if( thisCandidateType == reco::PFCandidate::h ){
427  // for charged hadrons, additionally check consistency
428  // with the PV
429  float dxy = -999, dz=-999;
430  getImpactParameters(iCand, isAOD, pv, dxy, dz);
431 
432 
433  if(fabs(dxy) > dxyMax) continue;
434  if (fabs(dz) > dzMax) continue;
435 
436  // The candidate is eligible, increment the isolaiton
437  chargedIsoSum += iCand->pt();
438  }
439 
440  if( thisCandidateType == reco::PFCandidate::h0 )
441  neutralHadronIsoSum += iCand->pt();
442 
443  if( thisCandidateType == reco::PFCandidate::gamma )
444  photonIsoSum += iCand->pt();
445  }
446 
447  phoChargedIsolation .push_back( chargedIsoSum );
448  phoNeutralHadronIsolation.push_back( neutralHadronIsoSum );
449  phoPhotonIsolation .push_back( photonIsoSum );
450 
451  // Worst isolation computed with no vetos or ptMin cut, as in
452  // Run 1 Hgg code.
453  float dRvetoBarrel = 0.0;
454  float dRvetoEndcap = 0.0;
455  float ptMin = 0.0;
456  bool isPVConstraint=false;
457  float worstChargedIso =
458  computeWorstPFChargedIsolation(iPho, pfCandidatesHandle, vertices,
459  isAOD, isPVConstraint,pv,coneSizeDR, dxyMax, dzMax,
460  dRvetoBarrel, dRvetoEndcap, ptMin);
461  phoWorstChargedIsolation .push_back( worstChargedIso );
462 
463  // Worst isolation computed with cone vetos and a ptMin cut, as in
464  // Run 2 Hgg code.
465  dRvetoBarrel = 0.02;
466  dRvetoEndcap = 0.02;
467  ptMin = 0.1;
468  float worstChargedIsoWithConeVeto =
469  computeWorstPFChargedIsolation(iPho, pfCandidatesHandle, vertices,
470  isAOD, isPVConstraint,pv, coneSizeDR, dxyMax, dzMax,
471  dRvetoBarrel, dRvetoEndcap, ptMin);
472  phoWorstChargedIsolationWithConeVeto .push_back( worstChargedIsoWithConeVeto );
473 
474  isPVConstraint=true;
475  float worstChargedIsoWithPVConstraint =
476  computeWorstPFChargedIsolation(iPho, pfCandidatesHandle, vertices,
477  isAOD, isPVConstraint,pv,coneSizeDR, dxyMax, dzMax,
478  dRvetoBarrel, dRvetoEndcap, ptMin);
479  phoWorstChargedIsolationWithPVConstraint .push_back( worstChargedIsoWithPVConstraint );
480 
481  // Worst isolation computed with cone vetos and a ptMin cut, as in
482  // Run 2 Hgg code.
483  dRvetoBarrel = 0.02;
484  dRvetoEndcap = 0.02;
485  ptMin = 0.1;
486  float worstChargedIsoWithConeVetoWithPVConstraint =
487  computeWorstPFChargedIsolation(iPho, pfCandidatesHandle, vertices,
488  isAOD,isPVConstraint, pv, coneSizeDR, dxyMax, dzMax,
489  dRvetoBarrel, dRvetoEndcap, ptMin);
490  phoWorstChargedIsolationWithConeVetoWithPVConstraint .push_back( worstChargedIsoWithConeVetoWithPVConstraint );
491 
492 
493 
494  }
495 
496  // Cluster shapes
497  writeValueMap(iEvent, src, phoFull5x5SigmaIEtaIEta, phoFull5x5SigmaIEtaIEta_);
498  writeValueMap(iEvent, src, phoFull5x5SigmaIEtaIPhi, phoFull5x5SigmaIEtaIPhi_);
499  writeValueMap(iEvent, src, phoFull5x5E1x3 , phoFull5x5E1x3_);
500  writeValueMap(iEvent, src, phoFull5x5E2x2 , phoFull5x5E2x2_);
501  writeValueMap(iEvent, src, phoFull5x5E2x5Max, phoFull5x5E2x5Max_);
502  writeValueMap(iEvent, src, phoFull5x5E5x5 , phoFull5x5E5x5_);
503  writeValueMap(iEvent, src, phoESEffSigmaRR , phoESEffSigmaRR_);
504  // Isolation
505  writeValueMap(iEvent, src, phoChargedIsolation, phoChargedIsolation_);
506  writeValueMap(iEvent, src, phoNeutralHadronIsolation, phoNeutralHadronIsolation_);
507  writeValueMap(iEvent, src, phoPhotonIsolation, phoPhotonIsolation_);
508  writeValueMap(iEvent, src, phoWorstChargedIsolation, phoWorstChargedIsolation_);
509  writeValueMap(iEvent, src, phoWorstChargedIsolationWithConeVeto, phoWorstChargedIsolationWithConeVeto_);
510  writeValueMap(iEvent, src, phoWorstChargedIsolationWithPVConstraint, phoWorstChargedIsolationWithPVConstraint_);
511  writeValueMap(iEvent, src, phoWorstChargedIsolationWithConeVetoWithPVConstraint, phoWorstChargedIsolationWithConeVetoWithPVConstraint_);
512  //PFCluster Isolation
513  writeValueMap(iEvent, src, phoTrkIsolation, phoTrkIsolation_);
514  writeValueMap(iEvent, src, phoHcalPFClIsolation, phoHcalPFClIsolation_);
515  writeValueMap(iEvent, src, phoEcalPFClIsolation, phoEcalPFClIsolation_);
516 
517 }
void writeValueMap(edm::Event &iEvent, const edm::Handle< edm::View< reco::Photon > > &handle, const std::vector< float > &values, const std::string &label) const
edm::EDGetTokenT< EcalRecHitCollection > esReducedRecHitCollectionMiniAOD_
edm::EDGetTokenT< reco::VertexCollection > vtxToken_
ParticleType
particle types
Definition: PFCandidate.h:45
edm::EDGetTokenT< reco::VertexCollection > vtxTokenMiniAOD_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
std::unique_ptr< noZS::EcalClusterLazyTools > lazyToolnoZS
edm::EDGetTokenT< EcalRecHitCollection > eeReducedRecHitCollectionMiniAOD_
double y() const
y coordinate
Definition: Vertex.h:113
reco::PFCandidate::ParticleType candidatePdgId(const edm::Ptr< reco::Candidate > candidate, bool isAOD)
edm::EDGetTokenT< EcalRecHitCollection > ebReducedRecHitCollection_
edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > particleBasedIsolationToken_
edm::EDGetTokenT< EcalRecHitCollection > ebReducedRecHitCollectionMiniAOD_
int iEvent
Definition: GenABIO.cc:230
edm::EDGetTokenT< edm::View< reco::Candidate > > pfCandidatesTokenMiniAOD_
edm::EDGetTokenT< EcalRecHitCollection > eeReducedRecHitCollection_
bool isnan(float x)
Definition: math.h:13
T sqrt(T t)
Definition: SSEVec.h:18
bool isInFootprint(const T &thefootprint, const U &theCandidate)
def pv(vc)
Definition: MetAnalyzer.py:6
double z() const
z coordinate
Definition: Vertex.h:115
edm::EDGetTokenT< edm::View< reco::Candidate > > pfCandidatesToken_
double f[11][100]
bool isValid() const
Definition: HandleBase.h:74
double x() const
x coordinate
Definition: Vertex.h:111
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
edm::EDGetTokenT< EcalRecHitCollection > esReducedRecHitCollection_
static char phoWorstChargedIsolationWithConeVetoWithPVConstraint_[]
float computeWorstPFChargedIsolation(const T &photon, const U &pfCandidates, const edm::Handle< reco::VertexCollection > vertices, bool isAOD, bool isPVConstraint, const reco::Vertex &pv, float dRmax, float dxyMax, float dzMax, float dRvetoBarrel, float dRvetoEndcap, float ptMin)
T1 deltaR2(T1 eta1, T2 phi1, T3 eta2, T4 phi2)
Definition: deltaR.h:36
edm::Ptr< pat::Photon > patPhotonPtr
static char phoWorstChargedIsolationWithPVConstraint_[]
HLT enums.
void getImpactParameters(const edm::Ptr< reco::Candidate > &candidate, bool isAOD, const reco::Vertex &pv, float &dxy, float &dz)
static char phoWorstChargedIsolationWithConeVeto_[]
void PhotonIDValueMapProducer::writeValueMap ( edm::Event iEvent,
const edm::Handle< edm::View< reco::Photon > > &  handle,
const std::vector< float > &  values,
const std::string &  label 
) const
private

Definition at line 519 of file PhotonIDValueMapProducer.cc.

References objects.autophobj::filler, cmsBatch::handle, eostools::move(), and edm::Event::put().

Referenced by produce().

523 {
524  using namespace edm;
525  using namespace std;
526  auto valMap = std::make_unique<ValueMap<float>>();
528  filler.insert(handle, values.begin(), values.end());
529  filler.fill();
530  iEvent.put(std::move(valMap), label);
531 }
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:136
HLT enums.
def move(src, dest)
Definition: eostools.py:510

Member Data Documentation

edm::EDGetTokenT<EcalRecHitCollection> PhotonIDValueMapProducer::ebReducedRecHitCollection_
private

Definition at line 89 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<EcalRecHitCollection> PhotonIDValueMapProducer::ebReducedRecHitCollectionMiniAOD_
private

Definition at line 98 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<EcalRecHitCollection> PhotonIDValueMapProducer::eeReducedRecHitCollection_
private

Definition at line 90 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<EcalRecHitCollection> PhotonIDValueMapProducer::eeReducedRecHitCollectionMiniAOD_
private

Definition at line 99 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<EcalRecHitCollection> PhotonIDValueMapProducer::esReducedRecHitCollection_
private

Definition at line 91 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<EcalRecHitCollection> PhotonIDValueMapProducer::esReducedRecHitCollectionMiniAOD_
private

Definition at line 100 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

std::unique_ptr<noZS::EcalClusterLazyTools> PhotonIDValueMapProducer::lazyToolnoZS
private

Definition at line 86 of file PhotonIDValueMapProducer.cc.

Referenced by produce().

edm::EDGetTokenT<edm::ValueMap<std::vector<reco::PFCandidateRef > > > PhotonIDValueMapProducer::particleBasedIsolationToken_
private

Definition at line 93 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<edm::ValueMap<std::vector<reco::PFCandidateRef > > > PhotonIDValueMapProducer::particleBasedIsolationTokenMiniAOD_
private

Definition at line 102 of file PhotonIDValueMapProducer.cc.

edm::EDGetTokenT<edm::View<reco::Candidate> > PhotonIDValueMapProducer::pfCandidatesToken_
private

Definition at line 94 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<edm::View<reco::Candidate> > PhotonIDValueMapProducer::pfCandidatesTokenMiniAOD_
private

Definition at line 103 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoChargedIsolation_ = "phoChargedIsolation"
staticprivate

Definition at line 118 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoEcalPFClIsolation_ = "phoEcalPFClIsolation"
staticprivate

Definition at line 129 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoESEffSigmaRR_ = "phoESEffSigmaRR"
staticprivate

Definition at line 116 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoFull5x5E1x3_ = "phoFull5x5E1x3"
staticprivate

Definition at line 112 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoFull5x5E2x2_ = "phoFull5x5E2x2"
staticprivate

Definition at line 113 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoFull5x5E2x5Max_ = "phoFull5x5E2x5Max"
staticprivate

Definition at line 114 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoFull5x5E5x5_ = "phoFull5x5E5x5"
staticprivate

Definition at line 115 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoFull5x5SigmaIEtaIEta_ = "phoFull5x5SigmaIEtaIEta"
staticprivate

Definition at line 110 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoFull5x5SigmaIEtaIPhi_ = "phoFull5x5SigmaIEtaIPhi"
staticprivate

Definition at line 111 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoHcalPFClIsolation_ = "phoHcalPFClIsolation"
staticprivate

Definition at line 128 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoNeutralHadronIsolation_ = "phoNeutralHadronIsolation"
staticprivate

Definition at line 119 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoPhotonIsolation_ = "phoPhotonIsolation"
staticprivate

Definition at line 120 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoTrkIsolation_ = "phoTrkIsolation"
staticprivate

Definition at line 127 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoWorstChargedIsolation_ = "phoWorstChargedIsolation"
staticprivate

Definition at line 121 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoWorstChargedIsolationWithConeVeto_ = "phoWorstChargedIsolationWithConeVeto"
staticprivate

Definition at line 122 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoWorstChargedIsolationWithConeVetoWithPVConstraint_ = "phoWorstChargedIsolationWithConeVetoWithPVConstraint"
staticprivate

Definition at line 124 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

char PhotonIDValueMapProducer::phoWorstChargedIsolationWithPVConstraint_ = "phoWorstChargedIsolationWithPVConstraint"
staticprivate

Definition at line 123 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetToken PhotonIDValueMapProducer::src_
private

Definition at line 95 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetToken PhotonIDValueMapProducer::srcMiniAOD_
private

Definition at line 104 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

bool PhotonIDValueMapProducer::usesES_
private

Definition at line 107 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<reco::VertexCollection> PhotonIDValueMapProducer::vtxToken_
private

Definition at line 92 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().

edm::EDGetTokenT<reco::VertexCollection> PhotonIDValueMapProducer::vtxTokenMiniAOD_
private

Definition at line 101 of file PhotonIDValueMapProducer.cc.

Referenced by PhotonIDValueMapProducer(), and produce().