CMS 3D CMS Logo

PhotonIDValueMapProducer.cc
Go to the documentation of this file.
3 
6 
8 
11 
14 
17 
19 
21 
22 #include <memory>
23 #include <vector>
24 
25 // Introduce these two types for brevity of casting
28 
29 // This template function finds whether theCandidate is in thefootprint
30 // collection. It is templated to be able to handle both reco and pat
31 // photons (from AOD and miniAOD, respectively).
32 template <class T, class U>
33 bool isInFootprint(const T& thefootprint, const U& theCandidate) {
34  for ( auto itr = thefootprint.begin(); itr != thefootprint.end(); ++itr ) {
35  if( itr->key() == theCandidate.key() ) return true;
36  }
37  return false;
38 }
39 
41 
42  public:
43 
45  ~PhotonIDValueMapProducer() override;
46 
47  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
48 
49  private:
50 
51  void produce(edm::Event&, const edm::EventSetup&) override;
52 
55  const std::vector<float> & values,
56  const std::string & label) const ;
57 
58  // This function computes charged hadron isolation
59  // with respect to multiple PVs and returns the worst
60  // of the found isolation values.
61  // The function implements the computation method taken directly
62  // from Run 1 code of H->gamma gamma, specifically from
63  // the class CiCPhotonID of the HiggsTo2photons anaysis code.
64  // Template is introduced to handle reco/pat photons and aod/miniAOD
65  // PF candidates collections
66  template <class T, class U>
68  const U& pfCandidates,
70  bool isAOD, bool isPVConstraint,const reco::Vertex& pv,
71  float dRmax, float dxyMax, float dzMax,
72  float dRvetoBarrel, float dRvetoEndcap, float ptMin);
73 
74  // Some helper functions that are needed to access info in
75  // AOD vs miniAOD
77  candidatePdgId(const edm::Ptr<reco::Candidate> candidate, bool isAOD);
78 
79  const reco::Track* getTrackPointer(const edm::Ptr<reco::Candidate> candidate, bool isAOD);
80  void getImpactParameters(const edm::Ptr<reco::Candidate>& candidate,
81  bool isAOD, const reco::Vertex& pv, float &dxy, float &dz);
82 
83 
84 
85  // The object that will compute 5x5 quantities
86  std::unique_ptr<noZS::EcalClusterLazyTools> lazyToolnoZS;
87 
88  // for AOD case
96 
97  // for miniAOD case
105 
106  // check whether a non-null preshower is there
107  bool usesES_;
108 
109  // Cluster shapes
110  constexpr static char phoFull5x5SigmaIEtaIEta_[] = "phoFull5x5SigmaIEtaIEta";
111  constexpr static char phoFull5x5SigmaIEtaIPhi_[] = "phoFull5x5SigmaIEtaIPhi";
112  constexpr static char phoFull5x5E1x3_[] = "phoFull5x5E1x3";
113  constexpr static char phoFull5x5E2x2_[] = "phoFull5x5E2x2";
114  constexpr static char phoFull5x5E2x5Max_[] = "phoFull5x5E2x5Max";
115  constexpr static char phoFull5x5E5x5_[] = "phoFull5x5E5x5";
116  constexpr static char phoESEffSigmaRR_[] = "phoESEffSigmaRR";
117  // Isolations
118  constexpr static char phoChargedIsolation_[] = "phoChargedIsolation";
119  constexpr static char phoNeutralHadronIsolation_[] = "phoNeutralHadronIsolation";
120  constexpr static char phoPhotonIsolation_[] = "phoPhotonIsolation";
121  constexpr static char phoWorstChargedIsolation_[] = "phoWorstChargedIsolation";
122  constexpr static char phoWorstChargedIsolationWithConeVeto_[] = "phoWorstChargedIsolationWithConeVeto";
123  constexpr static char phoWorstChargedIsolationWithPVConstraint_[] = "phoWorstChargedIsolationWithPVConstraint";
124  constexpr static char phoWorstChargedIsolationWithConeVetoWithPVConstraint_[] = "phoWorstChargedIsolationWithConeVetoWithPVConstraint";
125 
126  //PFCluster Isolation
127  constexpr static char phoTrkIsolation_[] = "phoTrkIsolation";
128  constexpr static char phoHcalPFClIsolation_[] = "phoHcalPFClIsolation";
129  constexpr static char phoEcalPFClIsolation_[] = "phoEcalPFClIsolation";
130 
131 };
132 
133 // Cluster shapes
141 // Isolations
149 
150 //PFCluster Isolation
154 
155 
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 }
228 
230 }
231 
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 }
518 
521  const std::vector<float> & values,
522  const std::string & label) const
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 }
532 
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 }
540 
541 // Charged isolation with respect to the worst vertex. See more
542 // comments above at the function declaration.
543 template <class T, class U>
547  bool isAOD, bool isPVConstraint,const reco::Vertex& pv,
548  float dRmax, float dxyMax, float dzMax,
549  float dRvetoBarrel, float dRvetoEndcap, float ptMin){
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 }
608 
609 
612  bool isAOD){
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 }
630 
631 const reco::Track*
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 }
642 
644  bool isAOD, const reco::Vertex& pv,
645  float &dxy, float &dz){
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 }
661 
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
void writeValueMap(edm::Event &iEvent, const edm::Handle< edm::View< reco::Photon > > &handle, const std::vector< float > &values, const std::string &label) const
T getParameter(std::string const &) const
edm::EDGetTokenT< EcalRecHitCollection > esReducedRecHitCollectionMiniAOD_
const reco::Track * getTrackPointer(const edm::Ptr< reco::Candidate > candidate, bool isAOD)
edm::EDGetTokenT< reco::VertexCollection > vtxToken_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:136
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_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
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_
PhotonIDValueMapProducer(const edm::ParameterSet &)
edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > particleBasedIsolationToken_
edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > particleBasedIsolationTokenMiniAOD_
edm::EDGetTokenT< EcalRecHitCollection > ebReducedRecHitCollectionMiniAOD_
const Point & position() const
position
Definition: Vertex.h:109
#define constexpr
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
int iEvent
Definition: GenABIO.cc:230
edm::EDGetTokenT< edm::View< reco::Candidate > > pfCandidatesTokenMiniAOD_
void addDefault(ParameterSetDescription const &psetDescription)
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)
edm::Ptr< pat::PackedCandidate > patCandPtr
def pv(vc)
Definition: MetAnalyzer.py:6
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double z() const
z coordinate
Definition: Vertex.h:115
edm::EDGetTokenT< edm::View< reco::Candidate > > pfCandidatesToken_
void produce(edm::Event &, const edm::EventSetup &) override
double f[11][100]
bool isValid() const
Definition: HandleBase.h:74
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
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
std::string const & label() const
Definition: InputTag.h:36
edm::Ptr< pat::Photon > patPhotonPtr
static char phoWorstChargedIsolationWithPVConstraint_[]
HLT enums.
virtual float dxy() const
dxy with respect to the PV ref
void getImpactParameters(const edm::Ptr< reco::Candidate > &candidate, bool isAOD, const reco::Vertex &pv, float &dxy, float &dz)
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
long double T
edm::Ptr< reco::PFCandidate > recoCandPtr
static char phoWorstChargedIsolationWithConeVeto_[]
def move(src, dest)
Definition: eostools.py:510