CMS 3D CMS Logo

PATPhotonProducer.cc
Go to the documentation of this file.
1 //
2 //
3 
9 
15 
18 
22 
24 
25 #include "TVector2.h"
27 
28 
29 #include <memory>
30 
31 using namespace pat;
32 
34  isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), consumesCollector(), false) ,
35  useUserData_(iConfig.exists("userData"))
36 {
37  // initialize the configurables
38  photonToken_ = consumes<edm::View<reco::Photon> >(iConfig.getParameter<edm::InputTag>("photonSource"));
39  electronToken_ = consumes<reco::GsfElectronCollection>(iConfig.getParameter<edm::InputTag>("electronSource"));
40 hConversionsToken_ = consumes<reco::ConversionCollection>(iConfig.getParameter<edm::InputTag>("conversionSource"));
41  beamLineToken_ = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamLineSrc"));
42  embedSuperCluster_ = iConfig.getParameter<bool>("embedSuperCluster");
43  embedSeedCluster_ = iConfig.getParameter<bool>( "embedSeedCluster" );
44  embedBasicClusters_ = iConfig.getParameter<bool>( "embedBasicClusters" );
45  embedPreshowerClusters_ = iConfig.getParameter<bool>( "embedPreshowerClusters" );
46  embedRecHits_ = iConfig.getParameter<bool>( "embedRecHits" );
47  reducedBarrelRecHitCollection_ = iConfig.getParameter<edm::InputTag>("reducedBarrelRecHitCollection");
48  reducedBarrelRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedBarrelRecHitCollection_);
49  reducedEndcapRecHitCollection_ = iConfig.getParameter<edm::InputTag>("reducedEndcapRecHitCollection");
50  reducedEndcapRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedEndcapRecHitCollection_);
51  // MC matching configurables
52  addGenMatch_ = iConfig.getParameter<bool>( "addGenMatch" );
53  if (addGenMatch_) {
54  embedGenMatch_ = iConfig.getParameter<bool>( "embedGenMatch" );
55  if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
57  }
58  else {
59  genMatchTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >( "genParticleMatch" ), [this](edm::InputTag const & tag){return consumes<edm::Association<reco::GenParticleCollection> >(tag);});
60  }
61  }
62  // Efficiency configurables
63  addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
64  if (addEfficiencies_) {
66  }
67  // PFCluster Isolation maps
68  addPuppiIsolation_ = iConfig.getParameter<bool>("addPuppiIsolation");
69  if (addPuppiIsolation_){
70  PUPPIIsolation_charged_hadrons_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationChargedHadrons"));
71  PUPPIIsolation_neutral_hadrons_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationNeutralHadrons"));
72  PUPPIIsolation_photons_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationPhotons"));
73  }
74  addPFClusterIso_ = iConfig.getParameter<bool>("addPFClusterIso");
75  if (addPFClusterIso_)
76  {
77  ecalPFClusterIsoT_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("ecalPFClusterIsoMap"));
78  auto hcPFC = iConfig.getParameter<edm::InputTag>("hcalPFClusterIsoMap");
79  if (not hcPFC.label().empty())
81  }
82 
83  // photon ID configurables
84  addPhotonID_ = iConfig.getParameter<bool>( "addPhotonID" );
85  if (addPhotonID_) {
86  // it might be a single photon ID
87  if (iConfig.existsAs<edm::InputTag>("photonIDSource")) {
88  photIDSrcs_.push_back(NameTag("", iConfig.getParameter<edm::InputTag>("photonIDSource")));
89  }
90  // or there might be many of them
91  if (iConfig.existsAs<edm::ParameterSet>("photonIDSources")) {
92  // please don't configure me twice
93  if (!photIDSrcs_.empty()){
94  throw cms::Exception("Configuration") << "PATPhotonProducer: you can't specify both 'photonIDSource' and 'photonIDSources'\n";
95  }
96  // read the different photon ID names
97  edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("photonIDSources");
98  std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
99  for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
100  photIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
101  }
102  }
103  // but in any case at least once
104  if (photIDSrcs_.empty()) throw cms::Exception("Configuration") <<
105  "PATPhotonProducer: id addPhotonID is true, you must specify either:\n" <<
106  "\tInputTag photonIDSource = <someTag>\n" << "or\n" <<
107  "\tPSet photonIDSources = { \n" <<
108  "\t\tInputTag <someName> = <someTag> // as many as you want \n " <<
109  "\t}\n";
110  }
111  photIDTokens_ = edm::vector_transform(photIDSrcs_, [this](NameTag const & tag){return mayConsume<edm::ValueMap<Bool_t> >(tag.second);});
112  // Resolution configurables
113  addResolutions_ = iConfig.getParameter<bool>("addResolutions");
114  if (addResolutions_) {
116  }
117  // Check to see if the user wants to add user data
118  if ( useUserData_ ) {
120  }
121  // produces vector of photons
122  produces<std::vector<Photon> >();
123 
124  // read isoDeposit labels, for direct embedding
125  readIsolationLabels(iConfig, "isoDeposits", isoDepositLabels_, isoDepositTokens_);
126  // read isolation value labels, for direct embedding
128 
129  saveRegressionData_ = iConfig.getParameter<bool>("saveRegressionData");
130 }
131 
133 }
134 
136 {
137  // switch off embedding (in unschedules mode)
138  if (iEvent.isRealData()){
139  addGenMatch_ = false;
140  embedGenMatch_ = false;
141  }
142 
143  edm::ESHandle<CaloTopology> theCaloTopology;
144  iSetup.get<CaloTopologyRecord>().get(theCaloTopology);
145  ecalTopology_ = & (*theCaloTopology);
146 
147  edm::ESHandle<CaloGeometry> theCaloGeometry;
148  iSetup.get<CaloGeometryRecord>().get(theCaloGeometry);
149  ecalGeometry_ = & (*theCaloGeometry);
150 
151  // Get the vector of Photon's from the event
153  iEvent.getByToken(photonToken_, photons);
154 
155  // for conversion veto selection
157  iEvent.getByToken(hConversionsToken_, hConversions);
158 
159  // Get the collection of electrons from the event
161  iEvent.getByToken(electronToken_, hElectrons);
162 
163  // Get the beamspot
164  edm::Handle<reco::BeamSpot> beamSpotHandle;
165  iEvent.getByToken(beamLineToken_, beamSpotHandle);
166 
168 
169  // prepare the MC matching
170  std::vector<edm::Handle<edm::Association<reco::GenParticleCollection> > >genMatches(genMatchTokens_.size());
171  if (addGenMatch_) {
172  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
173  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
174  }
175  }
176 
177  if (isolator_.enabled()) isolator_.beginEvent(iEvent,iSetup);
178 
180  if (resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
181 
183  for (size_t j = 0, nd = isoDepositTokens_.size(); j < nd; ++j) {
184  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
185  }
186 
188  for (size_t j = 0; j<isolationValueTokens_.size(); ++j) {
190  }
191 
192 
193  // prepare ID extraction
194  std::vector<edm::Handle<edm::ValueMap<Bool_t> > > idhandles;
195  std::vector<pat::Photon::IdPair> ids;
196  if (addPhotonID_) {
197  idhandles.resize(photIDSrcs_.size());
198  ids.resize(photIDSrcs_.size());
199  for (size_t i = 0; i < photIDSrcs_.size(); ++i) {
200  iEvent.getByToken(photIDTokens_[i], idhandles[i]);
201  ids[i].first = photIDSrcs_[i].first;
202  }
203  }
204 
205  //value maps for puppi isolation
206  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_charged_hadrons;
207  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_neutral_hadrons;
208  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_photons;
209  if (addPuppiIsolation_){
210  iEvent.getByToken(PUPPIIsolation_charged_hadrons_, PUPPIIsolation_charged_hadrons);
211  iEvent.getByToken(PUPPIIsolation_neutral_hadrons_, PUPPIIsolation_neutral_hadrons);
212  iEvent.getByToken(PUPPIIsolation_photons_, PUPPIIsolation_photons);
213  }
214 
215  // loop over photons
216  std::vector<Photon> * PATPhotons = new std::vector<Photon>();
217  for (edm::View<reco::Photon>::const_iterator itPhoton = photons->begin(); itPhoton != photons->end(); itPhoton++) {
218  // construct the Photon from the ref -> save ref to original object
219  unsigned int idx = itPhoton - photons->begin();
220  edm::RefToBase<reco::Photon> photonRef = photons->refAt(idx);
221  edm::Ptr<reco::Photon> photonPtr = photons->ptrAt(idx);
222  Photon aPhoton(photonRef);
223  auto phoPtr = photons -> ptrAt(idx);
224  if (embedSuperCluster_) aPhoton.embedSuperCluster();
225  if (embedSeedCluster_) aPhoton.embedSeedCluster();
228 
229  std::vector<DetId> selectedCells;
230  bool barrel = itPhoton->isEB();
231  //loop over sub clusters
232  if (embedBasicClusters_) {
233  for (reco::CaloCluster_iterator clusIt = itPhoton->superCluster()->clustersBegin(); clusIt!=itPhoton->superCluster()->clustersEnd(); ++clusIt) {
234  //get seed (max energy xtal)
235  DetId seed = lazyTools.getMaximum(**clusIt).first;
236  //get all xtals in 5x5 window around the seed
237  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
239  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
240 
241  //get all xtals belonging to cluster
242  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
243  selectedCells.push_back(hit.first);
244  }
245  }
246  }
247 
248  //remove duplicates
249  std::sort(selectedCells.begin(),selectedCells.end());
250  std::unique(selectedCells.begin(),selectedCells.end());
251 
252  // Retrieve the corresponding RecHits
253 
254 
255  edm::Handle< EcalRecHitCollection > recHitsEBHandle;
256  iEvent.getByToken(reducedBarrelRecHitCollectionToken_,recHitsEBHandle);
257  edm::Handle< EcalRecHitCollection > recHitsEEHandle;
258  iEvent.getByToken(reducedEndcapRecHitCollectionToken_,recHitsEEHandle);
259 
260 
261  //orginal code would throw an exception via the handle not being valid but now it'll just have a null pointer error
262  //should have little effect, if its not barrel or endcap, something very bad has happened elsewhere anyways
263  const EcalRecHitCollection *recHits = nullptr;
264  if(photonRef->superCluster()->seed()->hitsAndFractions().at(0).first.subdetId()==EcalBarrel ) recHits = recHitsEBHandle.product();
265  else if( photonRef->superCluster()->seed()->hitsAndFractions().at(0).first.subdetId()==EcalEndcap ) recHits = recHitsEEHandle.product();
266 
267 
268  EcalRecHitCollection selectedRecHits;
269 
270 
271  unsigned nSelectedCells = selectedCells.size();
272  for (unsigned icell = 0 ; icell < nSelectedCells ; ++icell) {
273  EcalRecHitCollection::const_iterator it = recHits->find( selectedCells[icell] );
274  if ( it != recHits->end() ) {
275  selectedRecHits.push_back(*it);
276  }
277  }
278  selectedRecHits.sort();
279  if (embedRecHits_) aPhoton.embedRecHits(& selectedRecHits);
280 
281  // store the match to the generated final state muons
282  if (addGenMatch_) {
283  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
284  reco::GenParticleRef genPhoton = (*genMatches[i])[photonRef];
285  aPhoton.addGenParticleRef(genPhoton);
286  }
287  if (embedGenMatch_) aPhoton.embedGenParticle();
288  }
289 
290  if (efficiencyLoader_.enabled()) {
291  efficiencyLoader_.setEfficiencies( aPhoton, photonRef );
292  }
293 
294  if (resolutionLoader_.enabled()) {
296  }
297 
298  // here comes the extra functionality
299  if (isolator_.enabled()) {
300  isolator_.fill(*photons, idx, isolatorTmpStorage_);
301  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
302  // better to loop backwards, so the vector is resized less times
303  for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(), ed = isolatorTmpStorage_.rend(); it != ed; ++it) {
304  aPhoton.setIsolation(it->first, it->second);
305  }
306  }
307 
308  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
309  aPhoton.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[photonRef]);
310  }
311 
312  for (size_t j = 0; j<isolationValues.size(); ++j) {
313  aPhoton.setIsolation(isolationValueLabels_[j].first,(*isolationValues[j])[photonRef]);
314  }
315 
316  // add photon ID info
317  if (addPhotonID_) {
318  for (size_t i = 0; i < photIDSrcs_.size(); ++i) {
319  ids[i].second = (*idhandles[i])[photonRef];
320  }
321  aPhoton.setPhotonIDs(ids);
322  }
323 
324  if ( useUserData_ ) {
325  userDataHelper_.add( aPhoton, iEvent, iSetup );
326  }
327 
328 
329  // set conversion veto selection
330  bool passelectronveto = false;
331  if( hConversions.isValid()){
332  // this is recommended method
333  passelectronveto = !ConversionTools::hasMatchedPromptElectron(photonRef->superCluster(), hElectrons, hConversions, beamSpotHandle->position());
334  }
335  aPhoton.setPassElectronVeto( passelectronveto );
336 
337 
338  // set electron veto using pixel seed (not recommended but many analysis groups are still using since it is powerful method to remove electrons)
339  aPhoton.setHasPixelSeed( photonRef->hasPixelSeed() );
340 
341  // set seed energy
342  aPhoton.setSeedEnergy( photonRef->superCluster()->seed()->energy() );
343 
344  EcalRegressionData ecalRegData;
345  ecalRegData.fill(*(photonRef->superCluster()),
346  recHitsEBHandle.product(),recHitsEEHandle.product(),
348 
349 
350  // set input variables for regression energy correction
351  if (saveRegressionData_) {
352  aPhoton.setEMax( ecalRegData.eMax() );
353  aPhoton.setE2nd( ecalRegData.e2nd() );
354  aPhoton.setE3x3( ecalRegData.e3x3() );
355  aPhoton.setETop( ecalRegData.eTop() );
356  aPhoton.setEBottom( ecalRegData.eBottom() );
357  aPhoton.setELeft( ecalRegData.eLeft() );
358  aPhoton.setERight( ecalRegData.eRight() );
359  aPhoton.setSee( ecalRegData.sigmaIEtaIEta() );
360  aPhoton.setSep( ecalRegData.sigmaIEtaIPhi()*ecalRegData.sigmaIEtaIEta()*ecalRegData.sigmaIPhiIPhi() ); //there is a conflict on what sigmaIEtaIPhi actually is, regression and ID have it differently, this may change in later releases
361  aPhoton.setSpp( ecalRegData.sigmaIPhiIPhi() );
362 
363  aPhoton.setMaxDR( ecalRegData.maxSubClusDR() );
364  aPhoton.setMaxDRDPhi( ecalRegData.maxSubClusDRDPhi() );
365  aPhoton.setMaxDRDEta( ecalRegData.maxSubClusDRDEta() );
366  aPhoton.setMaxDRRawEnergy( ecalRegData.maxSubClusDRRawEnergy() );
376 
377  aPhoton.setCryPhi( ecalRegData.seedCrysPhiOrY() );
378  aPhoton.setCryEta( ecalRegData.seedCrysEtaOrX() );
379  aPhoton.setIEta( ecalRegData.seedCrysIEtaOrIX() );
380  aPhoton.setIPhi( ecalRegData.seedCrysIPhiOrIY() );
381  } else {
382  aPhoton.setEMax(0);
383  aPhoton.setE2nd(0);
384  aPhoton.setE3x3(0);
385  aPhoton.setETop(0);
386  aPhoton.setEBottom(0);
387  aPhoton.setELeft(0);
388  aPhoton.setERight(0);
389  aPhoton.setSee(0);
390  aPhoton.setSep(0);
391  aPhoton.setSpp(0);
392 
393  aPhoton.setMaxDR(0);
394  aPhoton.setMaxDRDPhi(0);
395  aPhoton.setMaxDRDEta(0);
396  aPhoton.setMaxDRRawEnergy(0);
397  aPhoton.setSubClusRawE1(0);
398  aPhoton.setSubClusRawE2(0);
399  aPhoton.setSubClusRawE3(0);
400  aPhoton.setSubClusDPhi1(0);
401  aPhoton.setSubClusDPhi2(0);
402  aPhoton.setSubClusDPhi3(0);
403  aPhoton.setSubClusDEta1(0);
404  aPhoton.setSubClusDEta2(0);
405  aPhoton.setSubClusDEta3(0);
406 
407  aPhoton.setCryPhi(0);
408  aPhoton.setCryEta(0);
409  aPhoton.setIEta(0);
410  aPhoton.setIPhi(0);
411  }
412 
413  if (addPuppiIsolation_)aPhoton.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[phoPtr], (*PUPPIIsolation_neutral_hadrons)[phoPtr], (*PUPPIIsolation_photons)[phoPtr]);
414  else aPhoton.setIsolationPUPPI(-999., -999.,-999.);
415 
416  // Get PFCluster Isolation
417  if (addPFClusterIso_) {
418  edm::Handle<edm::ValueMap<float> > ecalPFClusterIsoMapH;
419  iEvent.getByToken(ecalPFClusterIsoT_, ecalPFClusterIsoMapH);
420  aPhoton.setEcalPFClusterIso((*ecalPFClusterIsoMapH)[photonRef]);
421  edm::Handle<edm::ValueMap<float> > hcalPFClusterIsoMapH;
423  iEvent.getByToken(hcalPFClusterIsoT_, hcalPFClusterIsoMapH);
424  aPhoton.setHcalPFClusterIso((*hcalPFClusterIsoMapH)[photonRef]);
425  }
426  else
427  {
428  aPhoton.setHcalPFClusterIso(-999.);
429  }
430  } else {
431  aPhoton.setEcalPFClusterIso(-999.);
432  aPhoton.setHcalPFClusterIso(-999.);
433  }
434 
435  // add the Photon to the vector of Photons
436  PATPhotons->push_back(aPhoton);
437  }
438 
439  // sort Photons in ET
440  std::sort(PATPhotons->begin(), PATPhotons->end(), eTComparator_);
441 
442  // put genEvt object in Event
443  std::unique_ptr<std::vector<Photon> > myPhotons(PATPhotons);
444  iEvent.put(std::move(myPhotons));
446 
447 }
448 
449 // ParameterSet description for module
451 {
453  iDesc.setComment("PAT photon producer module");
454 
455  // input source
456  iDesc.add<edm::InputTag>("photonSource", edm::InputTag("no default"))->setComment("input collection");
457  iDesc.add<edm::InputTag>("electronSource", edm::InputTag("no default"))->setComment("input collection");
458  iDesc.add<edm::InputTag>("conversionSource", edm::InputTag("allConversions"))->setComment("input collection");
459 
460  iDesc.add<edm::InputTag>("reducedBarrelRecHitCollection", edm::InputTag("reducedEcalRecHitsEB"));
461  iDesc.add<edm::InputTag>("reducedEndcapRecHitCollection", edm::InputTag("reducedEcalRecHitsEE"));
462 
463  iDesc.ifValue(edm::ParameterDescription<bool>("addPFClusterIso", false, true),
464  true >> (edm::ParameterDescription<edm::InputTag>("ecalPFClusterIsoMap", edm::InputTag("photonEcalPFClusterIsolationProducer"), true) and
465  edm::ParameterDescription<edm::InputTag>("hcalPFClusterIsoMap", edm::InputTag("photonHcalPFClusterIsolationProducer"),true)) or
466  false >> (edm::ParameterDescription<edm::InputTag>("ecalPFClusterIsoMap", edm::InputTag(""), true) and
467  edm::ParameterDescription<edm::InputTag>("hcalPFClusterIsoMap", edm::InputTag(""),true)));
468 
469  iDesc.ifValue(edm::ParameterDescription<bool>("addPuppiIsolation", false, true),
470  true >> (edm::ParameterDescription<edm::InputTag>("puppiIsolationChargedHadrons", edm::InputTag("egmPhotonPUPPIIsolation","h+-DR030-"), true) and
471  edm::ParameterDescription<edm::InputTag>("puppiIsolationNeutralHadrons", edm::InputTag("egmPhotonPUPPIIsolation","h0-DR030-"), true) and
472  edm::ParameterDescription<edm::InputTag>("puppiIsolationPhotons", edm::InputTag("egmPhotonPUPPIIsolation","gamma-DR030-"), true)) or
473  false >> edm::EmptyGroupDescription());
474 
475  iDesc.add<bool>("embedSuperCluster", true)->setComment("embed external super cluster");
476  iDesc.add<bool>("embedSeedCluster", true)->setComment("embed external seed cluster");
477  iDesc.add<bool>("embedBasicClusters", true)->setComment("embed external basic clusters");
478  iDesc.add<bool>("embedPreshowerClusters", true)->setComment("embed external preshower clusters");
479  iDesc.add<bool>("embedRecHits", true)->setComment("embed external RecHits");
480 
481  // MC matching configurables
482  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
483  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
484  std::vector<edm::InputTag> emptySourceVector;
485  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
486  edm::ParameterDescription<std::vector<edm::InputTag> >("genParticleMatch", emptySourceVector, true)
487  )->setComment("input with MC match information");
488 
490 
491  // photon ID configurables
492  iDesc.add<bool>("addPhotonID",true)->setComment("add photon ID variables");
493  edm::ParameterSetDescription photonIDSourcesPSet;
494  photonIDSourcesPSet.setAllowAnything();
495  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("photonIDSource", edm::InputTag(), true) xor
496  edm::ParameterDescription<edm::ParameterSetDescription>("photonIDSources", photonIDSourcesPSet, true)
497  )->setComment("input with photon ID variables");
498 
499  // IsoDeposit configurables
500  edm::ParameterSetDescription isoDepositsPSet;
501  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
502  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
503  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
504  isoDepositsPSet.addOptional<edm::InputTag>("pfAllParticles");
505  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadrons");
506  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedAll");
507  isoDepositsPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
508  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
509  isoDepositsPSet.addOptional<edm::InputTag>("pfPhotons");
510  isoDepositsPSet.addOptional<std::vector<edm::InputTag> >("user");
511  iDesc.addOptional("isoDeposits", isoDepositsPSet);
512 
513  // isolation values configurables
514  edm::ParameterSetDescription isolationValuesPSet;
515  isolationValuesPSet.addOptional<edm::InputTag>("tracker");
516  isolationValuesPSet.addOptional<edm::InputTag>("ecal");
517  isolationValuesPSet.addOptional<edm::InputTag>("hcal");
518  isolationValuesPSet.addOptional<edm::InputTag>("pfAllParticles");
519  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedHadrons");
520  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedAll");
521  isolationValuesPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
522  isolationValuesPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
523  isolationValuesPSet.addOptional<edm::InputTag>("pfPhotons");
524  isolationValuesPSet.addOptional<std::vector<edm::InputTag> >("user");
525  iDesc.addOptional("isolationValues", isolationValuesPSet);
526 
527  // Efficiency configurables
528  edm::ParameterSetDescription efficienciesPSet;
529  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
530  iDesc.add("efficiencies", efficienciesPSet);
531  iDesc.add<bool>("addEfficiencies", false);
532 
533  // Check to see if the user wants to add user data
534  edm::ParameterSetDescription userDataPSet;
536  iDesc.addOptional("userData", userDataPSet);
537 
538  edm::ParameterSetDescription isolationPSet;
539  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
540  iDesc.add("userIsolation", isolationPSet);
541 
542  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("beamLineSrc", edm::InputTag(), true)
543  )->setComment("input with high level selection");
544 
545  iDesc.add<bool>("saveRegressionData", true)->setComment("save regression input variables");
546 
547  descriptions.add("PATPhotonProducer", iDesc);
548 
549 }
550 
552 
virtual void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
float sigmaIPhiIPhi() const
T getParameter(std::string const &) const
void setSpp(float s)
Definition: Photon.h:271
void setComment(std::string const &value)
Assists in assimilating all pat::UserData into pat objects.
void newEvent(const edm::Event &event)
To be called for each new event, reads in the ValueMaps for efficiencies.
const std::vector< float > & subClusRawEnergy() const
void setIEta(float i)
Definition: Photon.h:313
pat::PATUserDataHelper< pat::Photon > userDataHelper_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
float maxSubClusDRRawEnergy() const
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
float maxSubClusDRDEta() const
Definition: Photon.py:1
edm::EDGetTokenT< EcalRecHitCollection > reducedEndcapRecHitCollectionToken_
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:186
void setSubClusDPhi3(float s)
Definition: Photon.h:296
static const HistoName names[]
reco::SuperClusterRef superCluster() const
Ref to SuperCluster.
std::pair< std::string, edm::InputTag > NameTag
void setE2nd(float e)
Definition: Photon.h:256
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:460
void setAllowAnything()
allow any parameter label/value pairs
void setSee(float s)
Definition: Photon.h:269
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
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)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void setMaxDRRawEnergy(float m)
Definition: Photon.h:282
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
void embedSeedCluster()
method to store the electron&#39;s seedcluster internally
static bool hasMatchedPromptElectron(const reco::SuperClusterRef &sc, const edm::Handle< reco::GsfElectronCollection > &eleCol, const edm::Handle< reco::ConversionCollection > &convCol, const math::XYZPoint &beamspot, bool allowCkfMatch=true, float lxyMin=2.0, float probMin=1e-6, unsigned int nHitsBeforeVtxMax=0)
edm::EDGetTokenT< edm::View< reco::Photon > > photonToken_
std::vector< EcalRecHit >::const_iterator const_iterator
void setSubClusDPhi2(float s)
Definition: Photon.h:294
float eLeft() const
edm::EDGetTokenT< edm::ValueMap< float > > ecalPFClusterIsoT_
void push_back(T const &t)
float seedCrysPhiOrY() const
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 ...
void setIsolationPUPPI(float chargedhadrons_, float neutralhadrons_, float photons_)
Sets PUPPI isolation.
Definition: Photon.h:200
pat::helper::KinResolutionsLoader resolutionLoader_
float sigmaIEtaIEta() const
edm::EDGetTokenT< edm::ValueMap< float > > hcalPFClusterIsoT_
GreaterByEt< Photon > eTComparator_
const CaloGeometry * ecalGeometry_
float sigmaIEtaIPhi() const
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:311
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
bool isRealData() const
Definition: EventBase.h:64
edm::InputTag reducedEndcapRecHitCollection_
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Definition: HeavyIon.h:7
static void fillDescription(edm::ParameterSetDescription &iDesc)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:194
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:50
IsolationLabels isoDepositLabels_
void setIsolation(IsolationKeys key, float value)
Definition: Photon.h:179
void setComment(std::string const &value)
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
void setELeft(float e)
Definition: Photon.h:264
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:227
int iEvent
Definition: GenABIO.cc:230
void setEMax(float e)
Definition: Photon.h:254
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
const CaloTopology * ecalTopology_
void setERight(float e)
Definition: Photon.h:266
float seedCrysIPhiOrIY() const
IsolationLabels isolationValueLabels_
void setMaxDRDEta(float m)
Definition: Photon.h:280
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
void embedGenParticle()
Definition: PATObject.h:694
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.
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
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
float maxSubClusDR() const
def unique(seq, keepstr=True)
Definition: tier0.py:24
void setPhotonIDs(const std::vector< IdPair > &ids)
Definition: Photon.h:110
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T > > cases)
float seedCrysIEtaOrIX() const
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:244
void setETop(float e)
Definition: Photon.h:260
float maxSubClusDRDPhi() const
void setSeedEnergy(float e)
Definition: Photon.h:251
void setSubClusDPhi1(float s)
Definition: Photon.h:292
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::vector< NameTag > photIDSrcs_
bool isValid() const
Definition: HandleBase.h:74
void setSubClusDEta1(float s)
Definition: Photon.h:299
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
pat::helper::MultiIsolator isolator_
float seedCrysEtaOrX() const
void embedPreshowerClusters()
method to store the electron&#39;s preshower clusters
void setCryEta(float c)
Definition: Photon.h:308
const_iterator end() const
void readIsolationLabels(const edm::ParameterSet &iConfig, const char *psetName, IsolationLabels &labels, std::vector< edm::EDGetTokenT< edm::ValueMap< T > > > &tokens)
void embedSuperCluster()
method to store the photon&#39;s supercluster internally
Definition: DetId.h:18
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:678
void setCryPhi(float c)
Definition: Photon.h:306
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
void setHasPixelSeed(bool flag)
Definition: Photon.h:247
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_charged_hadrons_
T const * product() const
Definition: Handle.h:81
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
void setSubClusDEta2(float s)
Definition: Photon.h:301
void setMaxDR(float m)
Definition: Photon.h:276
bool hasPixelSeed() const
Bool flagging photons having a non-zero size vector of Ref to electornPixel seeds.
Definition: Photon.h:76
const T & get() const
Definition: EventSetup.h:55
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
void setSubClusRawE2(float s)
Definition: Photon.h:287
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
Definition: CaloTopology.cc:25
const std::vector< float > & subClusDEta() const
void setEBottom(float e)
Definition: Photon.h:262
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:16
void setMaxDRDPhi(float m)
Definition: Photon.h:278
iterator find(key_type k)
const std::vector< float > & subClusDPhi() const
HLT enums.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
void setSubClusDEta3(float s)
Definition: Photon.h:303
size_type size() const
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_neutral_hadrons_
float eRight() const
void setSubClusRawE1(float s)
Definition: Photon.h:285
PATPhotonProducer(const edm::ParameterSet &iConfig)
bool isUninitialized() const
Definition: EDGetToken.h:73
const Point & position() const
position
Definition: BeamSpot.h:62
void setSubClusRawE3(float s)
Definition: Photon.h:289
edm::EDGetTokenT< EcalRecHitCollection > reducedBarrelRecHitCollectionToken_
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
edm::InputTag reducedBarrelRecHitCollection_
def move(src, dest)
Definition: eostools.py:510
void setHcalPFClusterIso(float hcalPFClus)
Definition: Photon.h:131
void setE3x3(float e)
Definition: Photon.h:258
float eBottom() const
edm::EDGetTokenT< reco::ConversionCollection > hConversionsToken_
void setSep(float s)
Definition: Photon.h:273
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:82
Produces the pat::Photon.
edm::EDGetTokenT< reco::GsfElectronCollection > electronToken_
void setEcalPFClusterIso(float ecalPFClus)
Definition: Photon.h:130