CMS 3D CMS Logo

PATPhotonProducer.cc
Go to the documentation of this file.
1 
46 
47 namespace pat {
48 
50  public:
51  explicit PATPhotonProducer(const edm::ParameterSet& iConfig);
52  ~PATPhotonProducer() override;
53 
54  void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
55 
56  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
57 
58  private:
59  // configurables
64 
70 
75 
77 
82 
85  std::vector<edm::EDGetTokenT<edm::Association<reco::GenParticleCollection>>> genMatchTokens_;
86 
87  // tools
89 
90  typedef std::vector<edm::Handle<edm::ValueMap<IsoDeposit>>> IsoDepositMaps;
91  typedef std::vector<edm::Handle<edm::ValueMap<double>>> IsolationValueMaps;
92  typedef std::pair<pat::IsolationKeys, edm::InputTag> IsolationLabel;
93  typedef std::vector<IsolationLabel> IsolationLabels;
94 
96  pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_; // better here than recreate at each event
97  std::vector<edm::EDGetTokenT<edm::ValueMap<IsoDeposit>>> isoDepositTokens_;
98  std::vector<edm::EDGetTokenT<edm::ValueMap<double>>> isolationValueTokens_;
99 
102 
105  template <typename T>
106  void readIsolationLabels(const edm::ParameterSet& iConfig,
107  const char* psetName,
110 
113 
116 
118  typedef std::pair<std::string, edm::InputTag> NameTag;
119  std::vector<NameTag> photIDSrcs_;
120  std::vector<edm::EDGetTokenT<edm::ValueMap<Bool_t>>> photIDTokens_;
121 
123  //PUPPI isolation tokens
128 
131 
133 
136  };
137 
138 } // namespace pat
139 
140 template <typename T>
142  const char* psetName,
145  labels.clear();
146 
147  if (iConfig.exists(psetName)) {
149 
150  if (depconf.exists("tracker"))
151  labels.push_back(std::make_pair(pat::TrackIso, depconf.getParameter<edm::InputTag>("tracker")));
152  if (depconf.exists("ecal"))
153  labels.push_back(std::make_pair(pat::EcalIso, depconf.getParameter<edm::InputTag>("ecal")));
154  if (depconf.exists("hcal"))
155  labels.push_back(std::make_pair(pat::HcalIso, depconf.getParameter<edm::InputTag>("hcal")));
156  if (depconf.exists("pfAllParticles")) {
157  labels.push_back(std::make_pair(pat::PfAllParticleIso, depconf.getParameter<edm::InputTag>("pfAllParticles")));
158  }
159  if (depconf.exists("pfChargedHadrons")) {
160  labels.push_back(
161  std::make_pair(pat::PfChargedHadronIso, depconf.getParameter<edm::InputTag>("pfChargedHadrons")));
162  }
163  if (depconf.exists("pfChargedAll")) {
164  labels.push_back(std::make_pair(pat::PfChargedAllIso, depconf.getParameter<edm::InputTag>("pfChargedAll")));
165  }
166  if (depconf.exists("pfPUChargedHadrons")) {
167  labels.push_back(
168  std::make_pair(pat::PfPUChargedHadronIso, depconf.getParameter<edm::InputTag>("pfPUChargedHadrons")));
169  }
170  if (depconf.exists("pfNeutralHadrons")) {
171  labels.push_back(
172  std::make_pair(pat::PfNeutralHadronIso, depconf.getParameter<edm::InputTag>("pfNeutralHadrons")));
173  }
174  if (depconf.exists("pfPhotons")) {
175  labels.push_back(std::make_pair(pat::PfGammaIso, depconf.getParameter<edm::InputTag>("pfPhotons")));
176  }
177  if (depconf.exists("user")) {
178  std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag>>("user");
179  std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
181  for (; it != ed; ++it, ++key) {
182  labels.push_back(std::make_pair(pat::IsolationKeys(key), *it));
183  }
184  }
185 
186  tokens = edm::vector_transform(
187  labels, [this](IsolationLabel const& label) { return consumes<edm::ValueMap<T>>(label.second); });
188  }
189  tokens = edm::vector_transform(
190  labels, [this](IsolationLabel const& label) { return consumes<edm::ValueMap<T>>(label.second); });
191 }
192 
193 using namespace pat;
194 
196  : ecalClusterToolsESGetTokens_{consumesCollector()},
197  isolator_(iConfig.getParameter<edm::ParameterSet>("userIsolation"), consumesCollector(), false),
198  useUserData_(iConfig.exists("userData")),
199  ecalTopologyToken_{esConsumes()},
200  ecalGeometryToken_{esConsumes()} {
201  // initialize the configurables
202  photonToken_ = consumes<edm::View<reco::Photon>>(iConfig.getParameter<edm::InputTag>("photonSource"));
203  electronToken_ = consumes<reco::GsfElectronCollection>(iConfig.getParameter<edm::InputTag>("electronSource"));
204  hConversionsToken_ = consumes<reco::ConversionCollection>(iConfig.getParameter<edm::InputTag>("conversionSource"));
205  beamLineToken_ = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamLineSrc"));
206  embedSuperCluster_ = iConfig.getParameter<bool>("embedSuperCluster");
207  embedSeedCluster_ = iConfig.getParameter<bool>("embedSeedCluster");
208  embedBasicClusters_ = iConfig.getParameter<bool>("embedBasicClusters");
209  embedPreshowerClusters_ = iConfig.getParameter<bool>("embedPreshowerClusters");
210  embedRecHits_ = iConfig.getParameter<bool>("embedRecHits");
211  reducedBarrelRecHitCollection_ = iConfig.getParameter<edm::InputTag>("reducedBarrelRecHitCollection");
212  reducedBarrelRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedBarrelRecHitCollection_);
213  reducedEndcapRecHitCollection_ = iConfig.getParameter<edm::InputTag>("reducedEndcapRecHitCollection");
214  reducedEndcapRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedEndcapRecHitCollection_);
215  // MC matching configurables
216  addGenMatch_ = iConfig.getParameter<bool>("addGenMatch");
217  if (addGenMatch_) {
218  embedGenMatch_ = iConfig.getParameter<bool>("embedGenMatch");
219  genMatchTokens_.push_back(consumes<edm::Association<reco::GenParticleCollection>>(
220  iConfig.getParameter<edm::InputTag>("genParticleMatch")));
221  }
222  // Efficiency configurables
223  addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
224  if (addEfficiencies_) {
225  efficiencyLoader_ =
226  pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"), consumesCollector());
227  }
228  // PFCluster Isolation maps
229  addPuppiIsolation_ = iConfig.getParameter<bool>("addPuppiIsolation");
230  if (addPuppiIsolation_) {
231  PUPPIIsolation_charged_hadrons_ =
232  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationChargedHadrons"));
233  PUPPIIsolation_neutral_hadrons_ =
234  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationNeutralHadrons"));
235  PUPPIIsolation_photons_ =
236  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationPhotons"));
237  }
238  addPFClusterIso_ = iConfig.getParameter<bool>("addPFClusterIso");
239  if (addPFClusterIso_) {
240  ecalPFClusterIsoT_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("ecalPFClusterIsoMap"));
241  auto hcPFC = iConfig.getParameter<edm::InputTag>("hcalPFClusterIsoMap");
242  if (not hcPFC.label().empty())
243  hcalPFClusterIsoT_ = consumes<edm::ValueMap<float>>(hcPFC);
244  }
245 
246  // photon ID configurables
247  addPhotonID_ = iConfig.getParameter<bool>("addPhotonID");
248  if (addPhotonID_) {
249  // it might be a single photon ID
250  if (iConfig.existsAs<edm::InputTag>("photonIDSource")) {
251  photIDSrcs_.push_back(NameTag("", iConfig.getParameter<edm::InputTag>("photonIDSource")));
252  }
253  // or there might be many of them
254  if (iConfig.existsAs<edm::ParameterSet>("photonIDSources")) {
255  // please don't configure me twice
256  if (!photIDSrcs_.empty()) {
257  throw cms::Exception("Configuration")
258  << "PATPhotonProducer: you can't specify both 'photonIDSource' and 'photonIDSources'\n";
259  }
260  // read the different photon ID names
261  edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("photonIDSources");
262  std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
263  for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
264  photIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
265  }
266  }
267  // but in any case at least once
268  if (photIDSrcs_.empty())
269  throw cms::Exception("Configuration") << "PATPhotonProducer: id addPhotonID is true, you must specify either:\n"
270  << "\tInputTag photonIDSource = <someTag>\n"
271  << "or\n"
272  << "\tPSet photonIDSources = { \n"
273  << "\t\tInputTag <someName> = <someTag> // as many as you want \n "
274  << "\t}\n";
275  }
276  photIDTokens_ = edm::vector_transform(
277  photIDSrcs_, [this](NameTag const& tag) { return mayConsume<edm::ValueMap<Bool_t>>(tag.second); });
278  // Resolution configurables
279  addResolutions_ = iConfig.getParameter<bool>("addResolutions");
280  if (addResolutions_) {
281  resolutionLoader_ =
282  pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"), consumesCollector());
283  }
284  // Check to see if the user wants to add user data
285  if (useUserData_) {
286  userDataHelper_ =
287  PATUserDataHelper<Photon>(iConfig.getParameter<edm::ParameterSet>("userData"), consumesCollector());
288  }
289  // produces vector of photons
290  produces<std::vector<Photon>>();
291 
292  // read isoDeposit labels, for direct embedding
293  readIsolationLabels(iConfig, "isoDeposits", isoDepositLabels_, isoDepositTokens_);
294  // read isolation value labels, for direct embedding
295  readIsolationLabels(iConfig, "isolationValues", isolationValueLabels_, isolationValueTokens_);
296 
297  saveRegressionData_ = iConfig.getParameter<bool>("saveRegressionData");
298 }
299 
301 
303  // switch off embedding (in unschedules mode)
304  if (iEvent.isRealData()) {
305  addGenMatch_ = false;
306  embedGenMatch_ = false;
307  }
308 
311 
312  // Get the vector of Photon's from the event
314  iEvent.getByToken(photonToken_, photons);
315 
316  // for conversion veto selection
318  iEvent.getByToken(hConversionsToken_, hConversions);
319 
320  // Get the collection of electrons from the event
322  iEvent.getByToken(electronToken_, hElectrons);
323 
324  // Get the beamspot
325  edm::Handle<reco::BeamSpot> beamSpotHandle;
326  iEvent.getByToken(beamLineToken_, beamSpotHandle);
327 
328  EcalClusterLazyTools lazyTools(iEvent,
332 
333  // prepare the MC matching
334  std::vector<edm::Handle<edm::Association<reco::GenParticleCollection>>> genMatches(genMatchTokens_.size());
335  if (addGenMatch_) {
336  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
337  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
338  }
339  }
340 
341  if (isolator_.enabled())
342  isolator_.beginEvent(iEvent, iSetup);
343 
348 
350  for (size_t j = 0, nd = isoDepositTokens_.size(); j < nd; ++j) {
351  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
352  }
353 
355  for (size_t j = 0; j < isolationValueTokens_.size(); ++j) {
357  }
358 
359  // prepare ID extraction
360  std::vector<edm::Handle<edm::ValueMap<Bool_t>>> idhandles;
361  std::vector<pat::Photon::IdPair> ids;
362  if (addPhotonID_) {
363  idhandles.resize(photIDSrcs_.size());
364  ids.resize(photIDSrcs_.size());
365  for (size_t i = 0; i < photIDSrcs_.size(); ++i) {
366  iEvent.getByToken(photIDTokens_[i], idhandles[i]);
367  ids[i].first = photIDSrcs_[i].first;
368  }
369  }
370 
371  //value maps for puppi isolation
372  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_charged_hadrons;
373  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_neutral_hadrons;
374  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_photons;
375  if (addPuppiIsolation_) {
376  iEvent.getByToken(PUPPIIsolation_charged_hadrons_, PUPPIIsolation_charged_hadrons);
377  iEvent.getByToken(PUPPIIsolation_neutral_hadrons_, PUPPIIsolation_neutral_hadrons);
378  iEvent.getByToken(PUPPIIsolation_photons_, PUPPIIsolation_photons);
379  }
380 
381  // loop over photons
382  std::vector<Photon>* PATPhotons = new std::vector<Photon>();
383  for (edm::View<reco::Photon>::const_iterator itPhoton = photons->begin(); itPhoton != photons->end(); itPhoton++) {
384  // construct the Photon from the ref -> save ref to original object
385  unsigned int idx = itPhoton - photons->begin();
386  edm::RefToBase<reco::Photon> photonRef = photons->refAt(idx);
387  edm::Ptr<reco::Photon> photonPtr = photons->ptrAt(idx);
388  Photon aPhoton(photonRef);
389  auto phoPtr = photons->ptrAt(idx);
390  if (embedSuperCluster_)
391  aPhoton.embedSuperCluster();
392  if (embedSeedCluster_)
393  aPhoton.embedSeedCluster();
395  aPhoton.embedBasicClusters();
397  aPhoton.embedPreshowerClusters();
398 
399  std::vector<DetId> selectedCells;
400  bool barrel = itPhoton->isEB();
401  //loop over sub clusters
402  if (embedBasicClusters_) {
403  for (reco::CaloCluster_iterator clusIt = itPhoton->superCluster()->clustersBegin();
404  clusIt != itPhoton->superCluster()->clustersEnd();
405  ++clusIt) {
406  //get seed (max energy xtal)
407  DetId seed = lazyTools.getMaximum(**clusIt).first;
408  //get all xtals in 5x5 window around the seed
409  std::vector<DetId> dets5x5 =
412  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
413 
414  //get all xtals belonging to cluster
415  for (const std::pair<DetId, float>& hit : (*clusIt)->hitsAndFractions()) {
416  selectedCells.push_back(hit.first);
417  }
418  }
419  }
420 
421  //remove duplicates
422  std::sort(selectedCells.begin(), selectedCells.end());
423  std::unique(selectedCells.begin(), selectedCells.end());
424 
425  // Retrieve the corresponding RecHits
426 
427  edm::Handle<EcalRecHitCollection> recHitsEBHandle;
428  iEvent.getByToken(reducedBarrelRecHitCollectionToken_, recHitsEBHandle);
429  edm::Handle<EcalRecHitCollection> recHitsEEHandle;
430  iEvent.getByToken(reducedEndcapRecHitCollectionToken_, recHitsEEHandle);
431 
432  //orginal code would throw an exception via the handle not being valid but now it'll just have a null pointer error
433  //should have little effect, if its not barrel or endcap, something very bad has happened elsewhere anyways
434  const EcalRecHitCollection* recHits = nullptr;
435  if (photonRef->superCluster()->seed()->hitsAndFractions().at(0).first.subdetId() == EcalBarrel)
436  recHits = recHitsEBHandle.product();
437  else if (photonRef->superCluster()->seed()->hitsAndFractions().at(0).first.subdetId() == EcalEndcap)
438  recHits = recHitsEEHandle.product();
439 
440  EcalRecHitCollection selectedRecHits;
441 
442  unsigned nSelectedCells = selectedCells.size();
443  for (unsigned icell = 0; icell < nSelectedCells; ++icell) {
444  EcalRecHitCollection::const_iterator it = recHits->find(selectedCells[icell]);
445  if (it != recHits->end()) {
446  selectedRecHits.push_back(*it);
447  }
448  }
449  selectedRecHits.sort();
450  if (embedRecHits_)
451  aPhoton.embedRecHits(&selectedRecHits);
452 
453  // store the match to the generated final state muons
454  if (addGenMatch_) {
455  for (size_t i = 0, n = genMatches.size(); i < n; ++i) {
456  reco::GenParticleRef genPhoton = (*genMatches[i])[photonRef];
457  aPhoton.addGenParticleRef(genPhoton);
458  }
459  if (embedGenMatch_)
460  aPhoton.embedGenParticle();
461  }
462 
463  if (efficiencyLoader_.enabled()) {
464  efficiencyLoader_.setEfficiencies(aPhoton, photonRef);
465  }
466 
467  if (resolutionLoader_.enabled()) {
469  }
470 
471  // here comes the extra functionality
472  if (isolator_.enabled()) {
474  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
475  // better to loop backwards, so the vector is resized less times
476  for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(),
477  ed = isolatorTmpStorage_.rend();
478  it != ed;
479  ++it) {
480  aPhoton.setIsolation(it->first, it->second);
481  }
482  }
483 
484  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
485  aPhoton.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[photonRef]);
486  }
487 
488  for (size_t j = 0; j < isolationValues.size(); ++j) {
489  aPhoton.setIsolation(isolationValueLabels_[j].first, (*isolationValues[j])[photonRef]);
490  }
491 
492  // add photon ID info
493  if (addPhotonID_) {
494  for (size_t i = 0; i < photIDSrcs_.size(); ++i) {
495  ids[i].second = (*idhandles[i])[photonRef];
496  }
497  aPhoton.setPhotonIDs(ids);
498  }
499 
500  if (useUserData_) {
501  userDataHelper_.add(aPhoton, iEvent, iSetup);
502  }
503 
504  // set conversion veto selection
505  bool passelectronveto = false;
506  if (hConversions.isValid()) {
507  // this is recommended method
508  passelectronveto = !ConversionTools::hasMatchedPromptElectron(
509  photonRef->superCluster(), *hElectrons, *hConversions, beamSpotHandle->position());
510  }
511  aPhoton.setPassElectronVeto(passelectronveto);
512 
513  // set electron veto using pixel seed (not recommended but many analysis groups are still using since it is powerful method to remove electrons)
514  aPhoton.setHasPixelSeed(photonRef->hasPixelSeed());
515 
516  // set seed energy
517  aPhoton.setSeedEnergy(photonRef->superCluster()->seed()->energy());
518 
519  // set input variables for regression energy correction
520  if (saveRegressionData_) {
521  EcalRegressionData ecalRegData;
522  ecalRegData.fill(*(photonRef->superCluster()),
523  recHitsEBHandle.product(),
524  recHitsEEHandle.product(),
527  -1);
528 
529  aPhoton.setEMax(ecalRegData.eMax());
530  aPhoton.setE2nd(ecalRegData.e2nd());
531  aPhoton.setE3x3(ecalRegData.e3x3());
532  aPhoton.setETop(ecalRegData.eTop());
533  aPhoton.setEBottom(ecalRegData.eBottom());
534  aPhoton.setELeft(ecalRegData.eLeft());
535  aPhoton.setERight(ecalRegData.eRight());
536  aPhoton.setSee(ecalRegData.sigmaIEtaIEta());
537  aPhoton.setSep(
538  ecalRegData.sigmaIEtaIPhi() * ecalRegData.sigmaIEtaIEta() *
539  ecalRegData
540  .sigmaIPhiIPhi()); //there is a conflict on what sigmaIEtaIPhi actually is, regression and ID have it differently, this may change in later releases
541  aPhoton.setSpp(ecalRegData.sigmaIPhiIPhi());
542 
543  aPhoton.setMaxDR(ecalRegData.maxSubClusDR());
544  aPhoton.setMaxDRDPhi(ecalRegData.maxSubClusDRDPhi());
545  aPhoton.setMaxDRDEta(ecalRegData.maxSubClusDRDEta());
546  aPhoton.setMaxDRRawEnergy(ecalRegData.maxSubClusDRRawEnergy());
556 
557  aPhoton.setCryPhi(ecalRegData.seedCrysPhiOrY());
558  aPhoton.setCryEta(ecalRegData.seedCrysEtaOrX());
559  aPhoton.setIEta(ecalRegData.seedCrysIEtaOrIX());
560  aPhoton.setIPhi(ecalRegData.seedCrysIPhiOrIY());
561  } else {
562  aPhoton.setEMax(0);
563  aPhoton.setE2nd(0);
564  aPhoton.setE3x3(0);
565  aPhoton.setETop(0);
566  aPhoton.setEBottom(0);
567  aPhoton.setELeft(0);
568  aPhoton.setERight(0);
569  aPhoton.setSee(0);
570  aPhoton.setSep(0);
571  aPhoton.setSpp(0);
572 
573  aPhoton.setMaxDR(0);
574  aPhoton.setMaxDRDPhi(0);
575  aPhoton.setMaxDRDEta(0);
576  aPhoton.setMaxDRRawEnergy(0);
577  aPhoton.setSubClusRawE1(0);
578  aPhoton.setSubClusRawE2(0);
579  aPhoton.setSubClusRawE3(0);
580  aPhoton.setSubClusDPhi1(0);
581  aPhoton.setSubClusDPhi2(0);
582  aPhoton.setSubClusDPhi3(0);
583  aPhoton.setSubClusDEta1(0);
584  aPhoton.setSubClusDEta2(0);
585  aPhoton.setSubClusDEta3(0);
586 
587  aPhoton.setCryPhi(0);
588  aPhoton.setCryEta(0);
589  aPhoton.setIEta(0);
590  aPhoton.setIPhi(0);
591  }
592 
593  if (addPuppiIsolation_)
594  aPhoton.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[phoPtr],
595  (*PUPPIIsolation_neutral_hadrons)[phoPtr],
596  (*PUPPIIsolation_photons)[phoPtr]);
597  else
598  aPhoton.setIsolationPUPPI(-999., -999., -999.);
599 
600  // Get PFCluster Isolation
601  if (addPFClusterIso_) {
603  edm::Handle<edm::ValueMap<float>> ecalPFClusterIsoMapH;
604  iEvent.getByToken(ecalPFClusterIsoT_, ecalPFClusterIsoMapH);
605  newPFIsol.sumEcalClusterEt = (*ecalPFClusterIsoMapH)[photonRef];
606  edm::Handle<edm::ValueMap<float>> hcalPFClusterIsoMapH;
608  iEvent.getByToken(hcalPFClusterIsoT_, hcalPFClusterIsoMapH);
609  newPFIsol.sumHcalClusterEt = (*hcalPFClusterIsoMapH)[photonRef];
610  } else {
611  newPFIsol.sumHcalClusterEt = -999.;
612  }
613  aPhoton.setPflowIsolationVariables(newPFIsol);
614  }
615 
616  // add the Photon to the vector of Photons
617  PATPhotons->push_back(aPhoton);
618  }
619 
620  // sort Photons in ET
621  std::sort(PATPhotons->begin(), PATPhotons->end(), eTComparator_);
622 
623  // put genEvt object in Event
624  std::unique_ptr<std::vector<Photon>> myPhotons(PATPhotons);
625  iEvent.put(std::move(myPhotons));
626  if (isolator_.enabled())
628 }
629 
630 // ParameterSet description for module
633  iDesc.setComment("PAT photon producer module");
634 
635  // input source
636  iDesc.add<edm::InputTag>("photonSource", edm::InputTag("no default"))->setComment("input collection");
637  iDesc.add<edm::InputTag>("electronSource", edm::InputTag("no default"))->setComment("input collection");
638  iDesc.add<edm::InputTag>("conversionSource", edm::InputTag("allConversions"))->setComment("input collection");
639 
640  iDesc.add<edm::InputTag>("reducedBarrelRecHitCollection", edm::InputTag("reducedEcalRecHitsEB"));
641  iDesc.add<edm::InputTag>("reducedEndcapRecHitCollection", edm::InputTag("reducedEcalRecHitsEE"));
642 
643  iDesc.ifValue(
644  edm::ParameterDescription<bool>("addPFClusterIso", false, true),
646  "ecalPFClusterIsoMap", edm::InputTag("photonEcalPFClusterIsolationProducer"), true) and
648  "hcalPFClusterIsoMap", edm::InputTag("photonHcalPFClusterIsolationProducer"), true)) or
649  false >> (edm::ParameterDescription<edm::InputTag>("ecalPFClusterIsoMap", edm::InputTag(""), true) and
650  edm::ParameterDescription<edm::InputTag>("hcalPFClusterIsoMap", edm::InputTag(""), true)));
651 
652  iDesc.ifValue(
653  edm::ParameterDescription<bool>("addPuppiIsolation", false, true),
655  "puppiIsolationChargedHadrons", edm::InputTag("egmPhotonPUPPIIsolation", "h+-DR030-"), true) and
657  "puppiIsolationNeutralHadrons", edm::InputTag("egmPhotonPUPPIIsolation", "h0-DR030-"), true) and
659  "puppiIsolationPhotons", edm::InputTag("egmPhotonPUPPIIsolation", "gamma-DR030-"), true)) or
660  false >> edm::EmptyGroupDescription());
661 
662  iDesc.add<bool>("embedSuperCluster", true)->setComment("embed external super cluster");
663  iDesc.add<bool>("embedSeedCluster", true)->setComment("embed external seed cluster");
664  iDesc.add<bool>("embedBasicClusters", true)->setComment("embed external basic clusters");
665  iDesc.add<bool>("embedPreshowerClusters", true)->setComment("embed external preshower clusters");
666  iDesc.add<bool>("embedRecHits", true)->setComment("embed external RecHits");
667 
668  // MC matching configurables
669  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
670  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
671  std::vector<edm::InputTag> emptySourceVector;
672  iDesc
673  .addNode(edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
674  edm::ParameterDescription<std::vector<edm::InputTag>>("genParticleMatch", emptySourceVector, true))
675  ->setComment("input with MC match information");
676 
678 
679  // photon ID configurables
680  iDesc.add<bool>("addPhotonID", true)->setComment("add photon ID variables");
681  edm::ParameterSetDescription photonIDSourcesPSet;
682  photonIDSourcesPSet.setAllowAnything();
683  iDesc
684  .addNode(edm::ParameterDescription<edm::InputTag>("photonIDSource", edm::InputTag(), true) xor
685  edm::ParameterDescription<edm::ParameterSetDescription>("photonIDSources", photonIDSourcesPSet, true))
686  ->setComment("input with photon ID variables");
687 
688  // IsoDeposit configurables
689  edm::ParameterSetDescription isoDepositsPSet;
690  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
691  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
692  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
693  isoDepositsPSet.addOptional<edm::InputTag>("pfAllParticles");
694  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadrons");
695  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedAll");
696  isoDepositsPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
697  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
698  isoDepositsPSet.addOptional<edm::InputTag>("pfPhotons");
699  isoDepositsPSet.addOptional<std::vector<edm::InputTag>>("user");
700  iDesc.addOptional("isoDeposits", isoDepositsPSet);
701 
702  // isolation values configurables
703  edm::ParameterSetDescription isolationValuesPSet;
704  isolationValuesPSet.addOptional<edm::InputTag>("tracker");
705  isolationValuesPSet.addOptional<edm::InputTag>("ecal");
706  isolationValuesPSet.addOptional<edm::InputTag>("hcal");
707  isolationValuesPSet.addOptional<edm::InputTag>("pfAllParticles");
708  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedHadrons");
709  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedAll");
710  isolationValuesPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
711  isolationValuesPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
712  isolationValuesPSet.addOptional<edm::InputTag>("pfPhotons");
713  isolationValuesPSet.addOptional<std::vector<edm::InputTag>>("user");
714  iDesc.addOptional("isolationValues", isolationValuesPSet);
715 
716  // Efficiency configurables
717  edm::ParameterSetDescription efficienciesPSet;
718  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
719  iDesc.add("efficiencies", efficienciesPSet);
720  iDesc.add<bool>("addEfficiencies", false);
721 
722  // Check to see if the user wants to add user data
723  edm::ParameterSetDescription userDataPSet;
725  iDesc.addOptional("userData", userDataPSet);
726 
727  edm::ParameterSetDescription isolationPSet;
728  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
729  iDesc.add("userIsolation", isolationPSet);
730 
731  iDesc.addNode(edm::ParameterDescription<edm::InputTag>("beamLineSrc", edm::InputTag(), true))
732  ->setComment("input with high level selection");
733 
734  iDesc.add<bool>("saveRegressionData", true)->setComment("save regression input variables");
735 
736  descriptions.add("PATPhotonProducer", iDesc);
737 }
738 
float maxSubClusDRDEta() const
bool hasPixelSeed() const
Bool flagging photons having a non-zero size vector of Ref to electornPixel seeds.
Definition: Photon.h:79
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void setPflowIsolationVariables(const PflowIsolationVariables &pfisol)
Set Particle Flow Isolation variables.
Definition: Photon.h:560
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
void setSpp(float s)
Definition: Photon.h:266
void setComment(std::string const &value)
float sigmaIPhiIPhi() const
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T >> cases)
void newEvent(const edm::Event &event)
To be called for each new event, reads in the ValueMaps for efficiencies.
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
float seedCrysPhiOrY() const
void setIEta(float i)
Definition: Photon.h:308
pat::PATUserDataHelper< pat::Photon > userDataHelper_
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
Definition: Photon.py:1
edm::EDGetTokenT< EcalRecHitCollection > reducedEndcapRecHitCollectionToken_
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
float maxSubClusDRDPhi() const
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:55
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
void setSubClusDPhi3(float s)
Definition: Photon.h:291
std::pair< std::string, edm::InputTag > NameTag
const Point & position() const
position
Definition: BeamSpot.h:59
float seedCrysIPhiOrIY() const
void readIsolationLabels(const edm::ParameterSet &iConfig, const char *psetName, IsolationLabels &labels, std::vector< edm::EDGetTokenT< edm::ValueMap< T >>> &tokens)
void setE2nd(float e)
Definition: Photon.h:251
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
void setAllowAnything()
allow any parameter label/value pairs
void setSee(float s)
Definition: Photon.h:264
std::vector< edm::EDGetTokenT< edm::ValueMap< Bool_t > > > photIDTokens_
void fill(const reco::SuperCluster &superClus, const EcalRecHitCollection *ebRecHits, const EcalRecHitCollection *eeRecHits, const CaloGeometry *geom, const CaloTopology *topology, const reco::VertexCollection *vertices)
size_type size() const
float maxSubClusDRRawEnergy() const
void setMaxDRRawEnergy(float m)
Definition: Photon.h:277
static bool hasMatchedPromptElectron(const reco::SuperClusterRef &sc, const reco::GsfElectronCollection &eleCol, const reco::ConversionCollection &convCol, const math::XYZPoint &beamspot, bool allowCkfMatch=true, float lxyMin=2.0, float probMin=1e-6, unsigned int nHitsBeforeVtxMax=0)
bool exists(std::string const &parameterName) const
checks if a parameter exists
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
void embedSeedCluster()
method to store the electron&#39;s seedcluster internally
T const * product() const
Definition: Handle.h:70
constexpr bool isUninitialized() const noexcept
Definition: EDGetToken.h:104
edm::EDGetTokenT< edm::View< reco::Photon > > photonToken_
std::vector< EcalRecHit >::const_iterator const_iterator
void setSubClusDPhi2(float s)
Definition: Photon.h:289
edm::EDGetTokenT< edm::ValueMap< float > > ecalPFClusterIsoT_
void push_back(T const &t)
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
void embedRecHits(const EcalRecHitCollection *rechits)
method to store the RecHits internally - can be called from the PATElectronProducer ...
float seedCrysEtaOrX() const
void setIsolationPUPPI(float chargedhadrons_, float neutralhadrons_, float photons_)
Sets PUPPI isolation.
Definition: Photon.h:193
pat::helper::KinResolutionsLoader resolutionLoader_
edm::EDGetTokenT< edm::ValueMap< float > > hcalPFClusterIsoT_
GreaterByEt< Photon > eTComparator_
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
IsolationKeys
Enum defining isolation keys.
Definition: Isolation.h:9
const CaloGeometry * ecalGeometry_
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
void setIPhi(float i)
Definition: Photon.h:306
const std::string names[nVars_]
edm::InputTag reducedEndcapRecHitCollection_
float seedCrysIEtaOrIX() const
std::vector< IsolationLabel > IsolationLabels
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:84
Definition: HeavyIon.h:7
static void fillDescription(edm::ParameterSetDescription &iDesc)
IsolationLabels isoDepositLabels_
char const * label
void setIsolation(IsolationKeys key, float value)
Definition: Photon.h:171
const std::vector< float > & subClusDEta() const
void setComment(std::string const &value)
ESData get(edm::EventSetup const &eventSetup) const
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
void setELeft(float e)
Definition: Photon.h:259
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
Definition: Photon.h:217
int iEvent
Definition: GenABIO.cc:224
const std::vector< float > & subClusDPhi() const
void setEMax(float e)
Definition: Photon.h:249
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
const CaloTopology * ecalTopology_
reco::SuperClusterRef superCluster() const override
Ref to SuperCluster.
void setERight(float e)
Definition: Photon.h:261
IsolationLabels isolationValueLabels_
void setMaxDRDEta(float m)
Definition: Photon.h:275
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
void embedGenParticle()
Definition: PATObject.h:768
pat::helper::EfficiencyLoader efficiencyLoader_
void newEvent(const edm::Event &event, const edm::EventSetup &setup)
To be called for each new event, reads in the EventSetup object.
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
def unique(seq, keepstr=True)
Definition: tier0.py:24
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
void setPhotonIDs(const std::vector< IdPair > &ids)
Definition: Photon.h:106
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:179
void embedBasicClusters()
method to store the electron&#39;s basic clusters
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_photons_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void setPassElectronVeto(bool flag)
Definition: Photon.h:239
void setETop(float e)
Definition: Photon.h:255
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
void setSeedEnergy(float e)
Definition: Photon.h:246
void setSubClusDPhi1(float s)
Definition: Photon.h:287
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::vector< NameTag > photIDSrcs_
void setSubClusDEta1(float s)
Definition: Photon.h:294
pat::helper::MultiIsolator isolator_
void add(ObjectType &patObject, edm::Event const &iEvent, edm::EventSetup const &iSetup)
void embedPreshowerClusters()
method to store the electron&#39;s preshower clusters
void setCryEta(float c)
Definition: Photon.h:303
float sigmaIEtaIEta() const
void embedSuperCluster()
method to store the photon&#39;s supercluster internally
Definition: DetId.h:17
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:17
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:751
void setCryPhi(float c)
Definition: Photon.h:301
float sigmaIEtaIPhi() const
void setHasPixelSeed(bool flag)
Definition: Photon.h:242
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_charged_hadrons_
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
Definition: CaloTopology.cc:17
void setSubClusDEta2(float s)
Definition: Photon.h:296
void setMaxDR(float m)
Definition: Photon.h:271
void setSubClusRawE2(float s)
Definition: Photon.h:282
void add(std::string const &label, ParameterSetDescription const &psetDescription)
float maxSubClusDR() const
bool isValid() const
Definition: HandleBase.h:70
void setEBottom(float e)
Definition: Photon.h:257
void setMaxDRDPhi(float m)
Definition: Photon.h:273
const EcalClusterLazyTools::ESGetTokens ecalClusterToolsESGetTokens_
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
void setSubClusDEta3(float s)
Definition: Photon.h:298
const edm::ESGetToken< CaloTopology, CaloTopologyRecord > ecalTopologyToken_
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_neutral_hadrons_
void setSubClusRawE1(float s)
Definition: Photon.h:280
std::pair< pat::IsolationKeys, edm::InputTag > IsolationLabel
PATPhotonProducer(const edm::ParameterSet &iConfig)
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > ecalGeometryToken_
void setSubClusRawE3(float s)
Definition: Photon.h:284
edm::EDGetTokenT< EcalRecHitCollection > reducedBarrelRecHitCollectionToken_
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
const PflowIsolationVariables & getPflowIsolationVariables() const
Get Particle Flow Isolation variables block.
Definition: Photon.h:557
edm::InputTag reducedBarrelRecHitCollection_
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
const std::vector< float > & subClusRawEnergy() const
def move(src, dest)
Definition: eostools.py:511
void setE3x3(float e)
Definition: Photon.h:253
edm::EDGetTokenT< reco::ConversionCollection > hConversionsToken_
void setSep(float s)
Definition: Photon.h:268
Produces the pat::Photon.
edm::EDGetTokenT< reco::GsfElectronCollection > electronToken_