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,
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  std::pair<float,float> getTrackDxyDz(const edm::Ptr<reco::Candidate> & candidate, const reco::Particle::Point & vtxpos, bool isAOD);
80 
81 
82  // The object that will compute 5x5 quantities
83  std::unique_ptr<noZS::EcalClusterLazyTools> lazyToolnoZS;
84 
85  // for AOD case
93 
94  // for miniAOD case
102 
103  // check whether a non-null preshower is there
104  bool usesES_;
105 
106  // Cluster shapes
107  constexpr static char phoFull5x5SigmaIEtaIEta_[] = "phoFull5x5SigmaIEtaIEta";
108  constexpr static char phoFull5x5SigmaIEtaIPhi_[] = "phoFull5x5SigmaIEtaIPhi";
109  constexpr static char phoFull5x5E1x3_[] = "phoFull5x5E1x3";
110  constexpr static char phoFull5x5E2x2_[] = "phoFull5x5E2x2";
111  constexpr static char phoFull5x5E2x5Max_[] = "phoFull5x5E2x5Max";
112  constexpr static char phoFull5x5E5x5_[] = "phoFull5x5E5x5";
113  constexpr static char phoESEffSigmaRR_[] = "phoESEffSigmaRR";
114  // Isolations
115  constexpr static char phoChargedIsolation_[] = "phoChargedIsolation";
116  constexpr static char phoNeutralHadronIsolation_[] = "phoNeutralHadronIsolation";
117  constexpr static char phoPhotonIsolation_[] = "phoPhotonIsolation";
118  constexpr static char phoWorstChargedIsolation_[] = "phoWorstChargedIsolation";
119  constexpr static char phoWorstChargedIsolationWithConeVeto_[] = "phoWorstChargedIsolationWithConeVeto";
120 
121 };
122 
123 // Cluster shapes
131 // Isolations
137 
139 
140  //
141  // Declare consummables, handle both AOD and miniAOD case
142  //
143  ebReducedRecHitCollection_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
144  ("ebReducedRecHitCollection"));
145  ebReducedRecHitCollectionMiniAOD_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
146  ("ebReducedRecHitCollectionMiniAOD"));
147 
148  eeReducedRecHitCollection_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
149  ("eeReducedRecHitCollection"));
150  eeReducedRecHitCollectionMiniAOD_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
151  ("eeReducedRecHitCollectionMiniAOD"));
152 
153  if (!iConfig.getParameter<edm::InputTag>("esReducedRecHitCollection").label().empty() ||
154  !iConfig.getParameter<edm::InputTag>("esReducedRecHitCollectionMiniAOD").label().empty()) {
155  usesES_ = true;
156  esReducedRecHitCollection_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
157  ("esReducedRecHitCollection"));
158  esReducedRecHitCollectionMiniAOD_ = mayConsume<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>
159  ("esReducedRecHitCollectionMiniAOD"));
160 
161  } else {
162  usesES_ = false;
163  }
164 
165  vtxToken_ = mayConsume<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("vertices"));
166  vtxTokenMiniAOD_ = mayConsume<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("verticesMiniAOD"));
167 
168  // reco photons are castable into pat photons, so no need to handle reco/pat seprately
169  src_ = mayConsume<edm::View<reco::Photon> >(iConfig.getParameter<edm::InputTag>("src"));
170  srcMiniAOD_ = mayConsume<edm::View<reco::Photon> >(iConfig.getParameter<edm::InputTag>("srcMiniAOD"));
171 
172  // The particleBasedIsolation object is relevant only for AOD, RECO format
173  particleBasedIsolationToken_ = mayConsume<edm::ValueMap<std::vector<reco::PFCandidateRef > > >
174  (iConfig.getParameter<edm::InputTag>("particleBasedIsolation"));
175 
176  // AOD has reco::PFCandidate vector, and miniAOD has pat::PackedCandidate vector.
177  // Both inherit from reco::Candidate, so we go to the base class. We can cast into
178  // the full type later if needed. Since the collection names are different, we
179  // introduce both collections
180  pfCandidatesToken_ = mayConsume< edm::View<reco::Candidate> >(iConfig.getParameter<edm::InputTag>("pfCandidates"));
181  pfCandidatesTokenMiniAOD_ = mayConsume< edm::View<reco::Candidate> >(iConfig.getParameter<edm::InputTag>("pfCandidatesMiniAOD"));
182 
183  //
184  // Declare producibles
185  //
186  // Cluster shapes
187  produces<edm::ValueMap<float> >(phoFull5x5SigmaIEtaIEta_);
188  produces<edm::ValueMap<float> >(phoFull5x5SigmaIEtaIPhi_);
189  produces<edm::ValueMap<float> >(phoFull5x5E1x3_);
190  produces<edm::ValueMap<float> >(phoFull5x5E2x2_);
191  produces<edm::ValueMap<float> >(phoFull5x5E2x5Max_);
192  produces<edm::ValueMap<float> >(phoFull5x5E5x5_);
193  produces<edm::ValueMap<float> >(phoESEffSigmaRR_);
194  // Isolations
195  produces<edm::ValueMap<float> >(phoChargedIsolation_);
196  produces<edm::ValueMap<float> >(phoNeutralHadronIsolation_);
197  produces<edm::ValueMap<float> >(phoPhotonIsolation_);
198  produces<edm::ValueMap<float> >(phoWorstChargedIsolation_);
199  produces<edm::ValueMap<float> >(phoWorstChargedIsolationWithConeVeto_);
200 
201 }
202 
204 }
205 
207 
208  using namespace edm;
209 
210  // Constants
211  const float coneSizeDR = 0.3;
212  const float dxyMax = 0.1;
213  const float dzMax = 0.2;
214 
216 
217  bool isAOD = true;
218  iEvent.getByToken(src_, src);
219  if( !src.isValid() ){
220  isAOD = false;
221  iEvent.getByToken(srcMiniAOD_,src);
222  }
223  if( !src.isValid() ) {
224  throw cms::Exception("IllDefinedDataTier")
225  << "DataFormat does not contain a photon source!";
226  }
227 
228  // Configure Lazy Tools
229  if (usesES_) {
230  if( isAOD )
231  lazyToolnoZS = std::make_unique<noZS::EcalClusterLazyTools>(iEvent, iSetup,
235  else
236  lazyToolnoZS = std::make_unique<noZS::EcalClusterLazyTools>(iEvent, iSetup,
240  } else {
241  if( isAOD )
242  lazyToolnoZS = std::make_unique<noZS::EcalClusterLazyTools>(iEvent, iSetup,
245  else
246  lazyToolnoZS = std::make_unique<noZS::EcalClusterLazyTools>(iEvent, iSetup,
249 
250  }
251 
252  // Get PV
254  iEvent.getByToken(vtxToken_, vertices);
255  if( !vertices.isValid() )
256  iEvent.getByToken(vtxTokenMiniAOD_, vertices);
257  if (vertices->empty()) return; // skip the event if no PV found
258  const reco::Vertex &pv = vertices->front();
259 
261  if( isAOD ){
262  // this exists only in AOD
263  iEvent.getByToken(particleBasedIsolationToken_, particleBasedIsolationMap);
264  }
265 
266  edm::Handle< edm::View<reco::Candidate> > pfCandidatesHandle;
267 
268  iEvent.getByToken(pfCandidatesToken_, pfCandidatesHandle);
269  if( !pfCandidatesHandle.isValid() )
270  iEvent.getByToken(pfCandidatesTokenMiniAOD_, pfCandidatesHandle);
271 
272  if( !isAOD && !src->empty() ) {
273  edm::Ptr<pat::Photon> test(src->ptrAt(0));
274  if( test.isNull() || !test.isAvailable() ) {
275  throw cms::Exception("InvalidConfiguration")
276  <<"DataFormat is detected as miniAOD but cannot cast to pat::Photon!";
277  }
278  }
279 
280  // size_t n = src->size();
281  // Cluster shapes
282  std::vector<float> phoFull5x5SigmaIEtaIEta;
283  std::vector<float> phoFull5x5SigmaIEtaIPhi;
284  std::vector<float> phoFull5x5E1x3;
285  std::vector<float> phoFull5x5E2x2;
286  std::vector<float> phoFull5x5E2x5Max;
287  std::vector<float> phoFull5x5E5x5;
288  std::vector<float> phoESEffSigmaRR;
289  // Isolations
290  std::vector<float> phoChargedIsolation;
291  std::vector<float> phoNeutralHadronIsolation;
292  std::vector<float> phoPhotonIsolation;
293  std::vector<float> phoWorstChargedIsolation;
294  std::vector<float> phoWorstChargedIsolationWithConeVeto;
295 
296  // reco::Photon::superCluster() is virtual so we can exploit polymorphism
297  for (unsigned idxpho = 0; idxpho < src->size(); ++idxpho) {
298  const auto& iPho = src->ptrAt(idxpho);
299 
300  //
301  // Compute full 5x5 quantities
302  //
303  const auto& theseed = *(iPho->superCluster()->seed());
304 
305  // For full5x5_sigmaIetaIeta, for 720 we use: lazy tools for AOD,
306  // and userFloats or lazy tools for miniAOD. From some point in 72X and on, one can
307  // retrieve the full5x5 directly from the object with ->full5x5_sigmaIetaIeta()
308  // for both formats.
309  float see = -999;
310  std::vector<float> vCov = lazyToolnoZS->localCovariances( theseed );
311  see = (isnan(vCov[0]) ? 0. : sqrt(vCov[0]));
312  float sep = vCov[1];
313  phoFull5x5SigmaIEtaIEta.push_back(see);
314  phoFull5x5SigmaIEtaIPhi.push_back(sep);
315 
316  phoFull5x5E1x3 .push_back(lazyToolnoZS-> e1x3 (theseed) );
317  phoFull5x5E2x2 .push_back(lazyToolnoZS-> e2x2 (theseed) );
318  phoFull5x5E2x5Max.push_back(lazyToolnoZS-> e2x5Max(theseed) );
319  phoFull5x5E5x5 .push_back(lazyToolnoZS-> e5x5 (theseed) );
320 
321  phoESEffSigmaRR .push_back(lazyToolnoZS->eseffsirir( *(iPho->superCluster()) ) );
322 
323  //
324  // Compute absolute uncorrected isolations with footprint removal
325  //
326 
327  // First, find photon direction with respect to the good PV
328  math::XYZVector photon_directionWrtVtx(iPho->superCluster()->x() - pv.x(),
329  iPho->superCluster()->y() - pv.y(),
330  iPho->superCluster()->z() - pv.z());
331 
332  // Zero the isolation sums
333  float chargedIsoSum = 0;
334  float neutralHadronIsoSum = 0;
335  float photonIsoSum = 0;
336 
337  // Loop over all PF candidates
338  for (unsigned idxcand = 0; idxcand < pfCandidatesHandle->size(); ++idxcand ){
339 
340  // Here, the type will be a simple reco::Candidate. We cast it
341  // for full PFCandidate or PackedCandidate below as necessary
342  const auto& iCand = pfCandidatesHandle->ptrAt(idxcand);
343 
344  // One would think that we should check that this iCand from
345  // the generic PF collection is not identical to the iPho photon
346  // for which we are computing the isolations. However, it turns out
347  // to be unnecessary. Below, in the function isInFootprint(), we drop
348  // this iCand if it is in the footprint, and this always removes
349  // the iCand if it matches the iPho.
350  // The explicit check at this point is not totally trivial because
351  // of non-triviality of implementation of this check for miniAOD (PackedCandidates
352  // of the PF collection do not contain the supercluser link, so can't use that).
353  // if( isAOD ){
354  // if( ((const recoCandPtr)iCand)->superClusterRef() == iPho->superCluster() ) continue;
355  // }
356 
357 
358  // Check if this candidate is within the isolation cone
359  float dR2 = deltaR2(photon_directionWrtVtx.Eta(),photon_directionWrtVtx.Phi(),
360  iCand->eta(), iCand->phi());
361  if( dR2 > coneSizeDR*coneSizeDR ) continue;
362 
363  // Check if this candidate is not in the footprint
364  bool inFootprint = false;
365  if(isAOD) {
366  inFootprint = isInFootprint( (*particleBasedIsolationMap)[iPho], iCand );
367  } else {
368  edm::Ptr<pat::Photon> patPhotonPtr(src->ptrAt(idxpho));
369  inFootprint = isInFootprint(patPhotonPtr->associatedPackedPFCandidates(), iCand);
370  }
371 
372  if( inFootprint ) continue;
373 
374  // Find candidate type
375  reco::PFCandidate::ParticleType thisCandidateType = candidatePdgId(iCand, isAOD);
376 
377  // Increment the appropriate isolation sum
378  if( thisCandidateType == reco::PFCandidate::h ){
379  // for charged hadrons, additionally check consistency
380  // with the PV
381 
382  auto dxydz = getTrackDxyDz(iCand, pv.position(), isAOD);
383  if ( fabs(dxydz.first) > dxyMax) continue;
384  if ( fabs(dxydz.second) > dzMax) continue;
385 
386  // The candidate is eligible, increment the isolaiton
387  chargedIsoSum += iCand->pt();
388  }
389 
390  if( thisCandidateType == reco::PFCandidate::h0 )
391  neutralHadronIsoSum += iCand->pt();
392 
393  if( thisCandidateType == reco::PFCandidate::gamma )
394  photonIsoSum += iCand->pt();
395  }
396 
397  phoChargedIsolation .push_back( chargedIsoSum );
398  phoNeutralHadronIsolation.push_back( neutralHadronIsoSum );
399  phoPhotonIsolation .push_back( photonIsoSum );
400 
401  // Worst isolation computed with no vetos or ptMin cut, as in
402  // Run 1 Hgg code.
403  float dRvetoBarrel = 0.0;
404  float dRvetoEndcap = 0.0;
405  float ptMin = 0.0;
406  float worstChargedIso =
407  computeWorstPFChargedIsolation(iPho, pfCandidatesHandle, vertices,
408  isAOD, coneSizeDR, dxyMax, dzMax,
409  dRvetoBarrel, dRvetoEndcap, ptMin);
410  phoWorstChargedIsolation .push_back( worstChargedIso );
411 
412  // Worst isolation computed with cone vetos and a ptMin cut, as in
413  // Run 2 Hgg code.
414  dRvetoBarrel = 0.02;
415  dRvetoEndcap = 0.02;
416  ptMin = 0.1;
417  float worstChargedIsoWithConeVeto =
418  computeWorstPFChargedIsolation(iPho, pfCandidatesHandle, vertices,
419  isAOD, coneSizeDR, dxyMax, dzMax,
420  dRvetoBarrel, dRvetoEndcap, ptMin);
421  phoWorstChargedIsolationWithConeVeto .push_back( worstChargedIsoWithConeVeto );
422 
423 
424 
425  }
426 
427  // Cluster shapes
428  writeValueMap(iEvent, src, phoFull5x5SigmaIEtaIEta, phoFull5x5SigmaIEtaIEta_);
429  writeValueMap(iEvent, src, phoFull5x5SigmaIEtaIPhi, phoFull5x5SigmaIEtaIPhi_);
430  writeValueMap(iEvent, src, phoFull5x5E1x3 , phoFull5x5E1x3_);
431  writeValueMap(iEvent, src, phoFull5x5E2x2 , phoFull5x5E2x2_);
432  writeValueMap(iEvent, src, phoFull5x5E2x5Max, phoFull5x5E2x5Max_);
433  writeValueMap(iEvent, src, phoFull5x5E5x5 , phoFull5x5E5x5_);
434  writeValueMap(iEvent, src, phoESEffSigmaRR , phoESEffSigmaRR_);
435  // IsolationsOB
436  writeValueMap(iEvent, src, phoChargedIsolation, phoChargedIsolation_);
437  writeValueMap(iEvent, src, phoNeutralHadronIsolation, phoNeutralHadronIsolation_);
438  writeValueMap(iEvent, src, phoPhotonIsolation, phoPhotonIsolation_);
439  writeValueMap(iEvent, src, phoWorstChargedIsolation, phoWorstChargedIsolation_);
440  writeValueMap(iEvent, src, phoWorstChargedIsolationWithConeVeto, phoWorstChargedIsolationWithConeVeto_);
441 }
442 
445  const std::vector<float> & values,
446  const std::string & label) const
447 {
448  using namespace edm;
449  using namespace std;
450  auto valMap = std::make_unique<ValueMap<float>>();
452  filler.insert(handle, values.begin(), values.end());
453  filler.fill();
454  iEvent.put(std::move(valMap), label);
455 }
456 
458  //The following says we do not know what parameters are allowed so do no validation
459  // Please change this to state exactly what you do use, even if it is no parameters
461  desc.setUnknown();
462  descriptions.addDefault(desc);
463 }
464 
465 // Charged isolation with respect to the worst vertex. See more
466 // comments above at the function declaration.
467 template <class T, class U>
471  bool isAOD,
472  float dRmax, float dxyMax, float dzMax,
473  float dRvetoBarrel, float dRvetoEndcap, float ptMin){
474 
475 
476  float worstIsolation = 999;
477  std::vector<float> allIsolations;
478 
479  float dRveto;
480  if (photon->isEB())
481  dRveto = dRvetoBarrel;
482  else
483  dRveto = dRvetoEndcap;
484 
485  //Calculate isolation sum separately for each vertex
486  for(unsigned int ivtx=0; ivtx<vertices->size(); ++ivtx) {
487 
488  // Shift the photon according to the vertex
489  reco::VertexRef vtx(vertices, ivtx);
490  math::XYZVector photon_directionWrtVtx(photon->superCluster()->x() - vtx->x(),
491  photon->superCluster()->y() - vtx->y(),
492  photon->superCluster()->z() - vtx->z());
493 
494  float sum = 0;
495  // Loop over the PFCandidates
496  for(unsigned i=0; i<pfCandidates->size(); i++) {
497 
498  const auto& iCand = pfCandidates->ptrAt(i);
499 
500  //require that PFCandidate is a charged hadron
501  reco::PFCandidate::ParticleType thisCandidateType = candidatePdgId(iCand, isAOD);
502  if (thisCandidateType != reco::PFCandidate::h)
503  continue;
504 
505  if (iCand->pt() < ptMin)
506  continue;
507 
508  auto dxydz = getTrackDxyDz(iCand, vtx->position(), isAOD);
509  if ( fabs(dxydz.first) > dxyMax) continue;
510  if ( fabs(dxydz.second) > dzMax) continue;
511 
512  float dR2 = deltaR2(photon_directionWrtVtx.Eta(), photon_directionWrtVtx.Phi(),
513  iCand->eta(), iCand->phi());
514  if(dR2 > dRmax*dRmax || dR2 < dRveto*dRveto) continue;
515 
516  sum += iCand->pt();
517  }
518 
519  allIsolations.push_back(sum);
520  }
521 
522  if( !allIsolations.empty() )
523  worstIsolation = * std::max_element( allIsolations.begin(), allIsolations.end() );
524 
525  return worstIsolation;
526 }
527 
530  bool isAOD){
531 
533  if( isAOD )
534  thisCandidateType = ( (const recoCandPtr)candidate)->particleId();
535  else {
536  // the neutral hadrons and charged hadrons can be of pdgId types
537  // only 130 (K0L) and +-211 (pi+-) in packed candidates
538  const int pdgId = ( (const patCandPtr)candidate)->pdgId();
539  if( pdgId == 22 )
540  thisCandidateType = reco::PFCandidate::gamma;
541  else if( abs(pdgId) == 130) // PDG ID for K0L
542  thisCandidateType = reco::PFCandidate::h0;
543  else if( abs(pdgId) == 211) // PDG ID for pi+-
544  thisCandidateType = reco::PFCandidate::h;
545  }
546  return thisCandidateType;
547 }
548 
549 std::pair<float,float>
551 
552  if( isAOD ) {
553  const reco::Track & theTrack = *recoCandPtr(candidate)->trackRef();
554  return std::make_pair(theTrack.dxy(vtxpos),theTrack.dz(vtxpos));
555  } else {
556  const pat::PackedCandidate & theCand = *(patCandPtr(candidate));
557  return std::make_pair(theCand.dxy(vtxpos),theCand.dz(vtxpos));
558  }
559 
560 }
561 
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_
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_
float computeWorstPFChargedIsolation(const T &photon, const U &pfCandidates, const edm::Handle< reco::VertexCollection > vertices, bool isAOD, float dRmax, float dxyMax, float dzMax, float dRvetoBarrel, float dRvetoEndcap, float ptMin)
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
math::XYZPoint Point
point in the space
Definition: Particle.h:25
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
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_
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
HLT enums.
std::pair< float, float > getTrackDxyDz(const edm::Ptr< reco::Candidate > &candidate, const reco::Particle::Point &vtxpos, bool isAOD)
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
long double T
edm::Ptr< reco::PFCandidate > recoCandPtr
static char phoWorstChargedIsolationWithConeVeto_[]
def move(src, dest)
Definition: eostools.py:510