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  addPFClusterIso_ = iConfig.getParameter<bool>("addPFClusterIso");
69  addPuppiIsolation_ = iConfig.getParameter<bool>("addPuppiIsolation");
70  if (addPuppiIsolation_){
71  PUPPIIsolation_charged_hadrons_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationChargedHadrons"));
72  PUPPIIsolation_neutral_hadrons_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationNeutralHadrons"));
73  PUPPIIsolation_photons_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationPhotons"));
74  }
75  ecalPFClusterIsoT_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("ecalPFClusterIsoMap"));
76  hcalPFClusterIsoT_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("hcalPFClusterIsoMap"));
77  // photon ID configurables
78  addPhotonID_ = iConfig.getParameter<bool>( "addPhotonID" );
79  if (addPhotonID_) {
80  // it might be a single photon ID
81  if (iConfig.existsAs<edm::InputTag>("photonIDSource")) {
82  photIDSrcs_.push_back(NameTag("", iConfig.getParameter<edm::InputTag>("photonIDSource")));
83  }
84  // or there might be many of them
85  if (iConfig.existsAs<edm::ParameterSet>("photonIDSources")) {
86  // please don't configure me twice
87  if (!photIDSrcs_.empty()){
88  throw cms::Exception("Configuration") << "PATPhotonProducer: you can't specify both 'photonIDSource' and 'photonIDSources'\n";
89  }
90  // read the different photon ID names
91  edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("photonIDSources");
92  std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
93  for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
94  photIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
95  }
96  }
97  // but in any case at least once
98  if (photIDSrcs_.empty()) throw cms::Exception("Configuration") <<
99  "PATPhotonProducer: id addPhotonID is true, you must specify either:\n" <<
100  "\tInputTag photonIDSource = <someTag>\n" << "or\n" <<
101  "\tPSet photonIDSources = { \n" <<
102  "\t\tInputTag <someName> = <someTag> // as many as you want \n " <<
103  "\t}\n";
104  }
105  photIDTokens_ = edm::vector_transform(photIDSrcs_, [this](NameTag const & tag){return mayConsume<edm::ValueMap<Bool_t> >(tag.second);});
106  // Resolution configurables
107  addResolutions_ = iConfig.getParameter<bool>("addResolutions");
108  if (addResolutions_) {
110  }
111  // Check to see if the user wants to add user data
112  if ( useUserData_ ) {
114  }
115  // produces vector of photons
116  produces<std::vector<Photon> >();
117 
118  // read isoDeposit labels, for direct embedding
119  readIsolationLabels(iConfig, "isoDeposits", isoDepositLabels_, isoDepositTokens_);
120  // read isolation value labels, for direct embedding
122 
123  saveRegressionData_ = iConfig.getParameter<bool>("saveRegressionData");
124 }
125 
127 }
128 
130 {
131  // switch off embedding (in unschedules mode)
132  if (iEvent.isRealData()){
133  addGenMatch_ = false;
134  embedGenMatch_ = false;
135  }
136 
137  edm::ESHandle<CaloTopology> theCaloTopology;
138  iSetup.get<CaloTopologyRecord>().get(theCaloTopology);
139  ecalTopology_ = & (*theCaloTopology);
140 
141  edm::ESHandle<CaloGeometry> theCaloGeometry;
142  iSetup.get<CaloGeometryRecord>().get(theCaloGeometry);
143  ecalGeometry_ = & (*theCaloGeometry);
144 
145  // Get the vector of Photon's from the event
147  iEvent.getByToken(photonToken_, photons);
148 
149  // for conversion veto selection
151  iEvent.getByToken(hConversionsToken_, hConversions);
152 
153  // Get the collection of electrons from the event
155  iEvent.getByToken(electronToken_, hElectrons);
156 
157  // Get the beamspot
158  edm::Handle<reco::BeamSpot> beamSpotHandle;
159  iEvent.getByToken(beamLineToken_, beamSpotHandle);
160 
162 
163  // prepare the MC matching
164  std::vector<edm::Handle<edm::Association<reco::GenParticleCollection> > >genMatches(genMatchTokens_.size());
165  if (addGenMatch_) {
166  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
167  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
168  }
169  }
170 
171  if (isolator_.enabled()) isolator_.beginEvent(iEvent,iSetup);
172 
174  if (resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
175 
177  for (size_t j = 0, nd = isoDepositTokens_.size(); j < nd; ++j) {
178  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
179  }
180 
182  for (size_t j = 0; j<isolationValueTokens_.size(); ++j) {
184  }
185 
186 
187  // prepare ID extraction
188  std::vector<edm::Handle<edm::ValueMap<Bool_t> > > idhandles;
189  std::vector<pat::Photon::IdPair> ids;
190  if (addPhotonID_) {
191  idhandles.resize(photIDSrcs_.size());
192  ids.resize(photIDSrcs_.size());
193  for (size_t i = 0; i < photIDSrcs_.size(); ++i) {
194  iEvent.getByToken(photIDTokens_[i], idhandles[i]);
195  ids[i].first = photIDSrcs_[i].first;
196  }
197  }
198 
199  //value maps for puppi isolation
200  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_charged_hadrons;
201  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_neutral_hadrons;
202  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_photons;
203  if (addPuppiIsolation_){
204  iEvent.getByToken(PUPPIIsolation_charged_hadrons_, PUPPIIsolation_charged_hadrons);
205  iEvent.getByToken(PUPPIIsolation_neutral_hadrons_, PUPPIIsolation_neutral_hadrons);
206  iEvent.getByToken(PUPPIIsolation_photons_, PUPPIIsolation_photons);
207  }
208 
209  // loop over photons
210  std::vector<Photon> * PATPhotons = new std::vector<Photon>();
211  for (edm::View<reco::Photon>::const_iterator itPhoton = photons->begin(); itPhoton != photons->end(); itPhoton++) {
212  // construct the Photon from the ref -> save ref to original object
213  unsigned int idx = itPhoton - photons->begin();
214  edm::RefToBase<reco::Photon> photonRef = photons->refAt(idx);
215  edm::Ptr<reco::Photon> photonPtr = photons->ptrAt(idx);
216  Photon aPhoton(photonRef);
217  auto phoPtr = photons -> ptrAt(idx);
218  if (embedSuperCluster_) aPhoton.embedSuperCluster();
219  if (embedSeedCluster_) aPhoton.embedSeedCluster();
222 
223  std::vector<DetId> selectedCells;
224  bool barrel = itPhoton->isEB();
225  //loop over sub clusters
226  if (embedBasicClusters_) {
227  for (reco::CaloCluster_iterator clusIt = itPhoton->superCluster()->clustersBegin(); clusIt!=itPhoton->superCluster()->clustersEnd(); ++clusIt) {
228  //get seed (max energy xtal)
229  DetId seed = lazyTools.getMaximum(**clusIt).first;
230  //get all xtals in 5x5 window around the seed
231  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
233  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
234 
235  //get all xtals belonging to cluster
236  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
237  selectedCells.push_back(hit.first);
238  }
239  }
240  }
241 
242  //remove duplicates
243  std::sort(selectedCells.begin(),selectedCells.end());
244  std::unique(selectedCells.begin(),selectedCells.end());
245 
246  // Retrieve the corresponding RecHits
247 
248 
249  edm::Handle< EcalRecHitCollection > recHitsEBHandle;
250  iEvent.getByToken(reducedBarrelRecHitCollectionToken_,recHitsEBHandle);
251  edm::Handle< EcalRecHitCollection > recHitsEEHandle;
252  iEvent.getByToken(reducedEndcapRecHitCollectionToken_,recHitsEEHandle);
253 
254 
255  //orginal code would throw an exception via the handle not being valid but now it'll just have a null pointer error
256  //should have little effect, if its not barrel or endcap, something very bad has happened elsewhere anyways
257  const EcalRecHitCollection *recHits = nullptr;
258  if(photonRef->superCluster()->seed()->hitsAndFractions().at(0).first.subdetId()==EcalBarrel ) recHits = recHitsEBHandle.product();
259  else if( photonRef->superCluster()->seed()->hitsAndFractions().at(0).first.subdetId()==EcalEndcap ) recHits = recHitsEEHandle.product();
260 
261 
262  EcalRecHitCollection selectedRecHits;
263 
264 
265  unsigned nSelectedCells = selectedCells.size();
266  for (unsigned icell = 0 ; icell < nSelectedCells ; ++icell) {
267  EcalRecHitCollection::const_iterator it = recHits->find( selectedCells[icell] );
268  if ( it != recHits->end() ) {
269  selectedRecHits.push_back(*it);
270  }
271  }
272  selectedRecHits.sort();
273  if (embedRecHits_) aPhoton.embedRecHits(& selectedRecHits);
274 
275  // store the match to the generated final state muons
276  if (addGenMatch_) {
277  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
278  reco::GenParticleRef genPhoton = (*genMatches[i])[photonRef];
279  aPhoton.addGenParticleRef(genPhoton);
280  }
281  if (embedGenMatch_) aPhoton.embedGenParticle();
282  }
283 
284  if (efficiencyLoader_.enabled()) {
285  efficiencyLoader_.setEfficiencies( aPhoton, photonRef );
286  }
287 
288  if (resolutionLoader_.enabled()) {
290  }
291 
292  // here comes the extra functionality
293  if (isolator_.enabled()) {
294  isolator_.fill(*photons, idx, isolatorTmpStorage_);
295  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
296  // better to loop backwards, so the vector is resized less times
297  for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(), ed = isolatorTmpStorage_.rend(); it != ed; ++it) {
298  aPhoton.setIsolation(it->first, it->second);
299  }
300  }
301 
302  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
303  aPhoton.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[photonRef]);
304  }
305 
306  for (size_t j = 0; j<isolationValues.size(); ++j) {
307  aPhoton.setIsolation(isolationValueLabels_[j].first,(*isolationValues[j])[photonRef]);
308  }
309 
310  // add photon ID info
311  if (addPhotonID_) {
312  for (size_t i = 0; i < photIDSrcs_.size(); ++i) {
313  ids[i].second = (*idhandles[i])[photonRef];
314  }
315  aPhoton.setPhotonIDs(ids);
316  }
317 
318  if ( useUserData_ ) {
319  userDataHelper_.add( aPhoton, iEvent, iSetup );
320  }
321 
322 
323  // set conversion veto selection
324  bool passelectronveto = false;
325  if( hConversions.isValid()){
326  // this is recommended method
327  passelectronveto = !ConversionTools::hasMatchedPromptElectron(photonRef->superCluster(), hElectrons, hConversions, beamSpotHandle->position());
328  }
329  aPhoton.setPassElectronVeto( passelectronveto );
330 
331 
332  // set electron veto using pixel seed (not recommended but many analysis groups are still using since it is powerful method to remove electrons)
333  aPhoton.setHasPixelSeed( photonRef->hasPixelSeed() );
334 
335  // set seed energy
336  aPhoton.setSeedEnergy( photonRef->superCluster()->seed()->energy() );
337 
338  EcalRegressionData ecalRegData;
339  ecalRegData.fill(*(photonRef->superCluster()),
340  recHitsEBHandle.product(),recHitsEEHandle.product(),
342 
343 
344  // set input variables for regression energy correction
345  if (saveRegressionData_) {
346  aPhoton.setEMax( ecalRegData.eMax() );
347  aPhoton.setE2nd( ecalRegData.e2nd() );
348  aPhoton.setE3x3( ecalRegData.e3x3() );
349  aPhoton.setETop( ecalRegData.eTop() );
350  aPhoton.setEBottom( ecalRegData.eBottom() );
351  aPhoton.setELeft( ecalRegData.eLeft() );
352  aPhoton.setERight( ecalRegData.eRight() );
353  aPhoton.setSee( ecalRegData.sigmaIEtaIEta() );
354  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
355  aPhoton.setSpp( ecalRegData.sigmaIPhiIPhi() );
356 
357  aPhoton.setMaxDR( ecalRegData.maxSubClusDR() );
358  aPhoton.setMaxDRDPhi( ecalRegData.maxSubClusDRDPhi() );
359  aPhoton.setMaxDRDEta( ecalRegData.maxSubClusDRDEta() );
360  aPhoton.setMaxDRRawEnergy( ecalRegData.maxSubClusDRRawEnergy() );
370 
371  aPhoton.setCryPhi( ecalRegData.seedCrysPhiOrY() );
372  aPhoton.setCryEta( ecalRegData.seedCrysEtaOrX() );
373  aPhoton.setIEta( ecalRegData.seedCrysIEtaOrIX() );
374  aPhoton.setIPhi( ecalRegData.seedCrysIPhiOrIY() );
375  } else {
376  aPhoton.setEMax(0);
377  aPhoton.setE2nd(0);
378  aPhoton.setE3x3(0);
379  aPhoton.setETop(0);
380  aPhoton.setEBottom(0);
381  aPhoton.setELeft(0);
382  aPhoton.setERight(0);
383  aPhoton.setSee(0);
384  aPhoton.setSep(0);
385  aPhoton.setSpp(0);
386 
387  aPhoton.setMaxDR(0);
388  aPhoton.setMaxDRDPhi(0);
389  aPhoton.setMaxDRDEta(0);
390  aPhoton.setMaxDRRawEnergy(0);
391  aPhoton.setSubClusRawE1(0);
392  aPhoton.setSubClusRawE2(0);
393  aPhoton.setSubClusRawE3(0);
394  aPhoton.setSubClusDPhi1(0);
395  aPhoton.setSubClusDPhi2(0);
396  aPhoton.setSubClusDPhi3(0);
397  aPhoton.setSubClusDEta1(0);
398  aPhoton.setSubClusDEta2(0);
399  aPhoton.setSubClusDEta3(0);
400 
401  aPhoton.setCryPhi(0);
402  aPhoton.setCryEta(0);
403  aPhoton.setIEta(0);
404  aPhoton.setIPhi(0);
405  }
406 
407  if (addPuppiIsolation_)aPhoton.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[phoPtr], (*PUPPIIsolation_neutral_hadrons)[phoPtr], (*PUPPIIsolation_photons)[phoPtr]);
408  else aPhoton.setIsolationPUPPI(-999., -999.,-999.);
409 
410  // Get PFCluster Isolation
411  if (addPFClusterIso_) {
412  edm::Handle<edm::ValueMap<float> > ecalPFClusterIsoMapH;
413  iEvent.getByToken(ecalPFClusterIsoT_, ecalPFClusterIsoMapH);
414  edm::Handle<edm::ValueMap<float> > hcalPFClusterIsoMapH;
415  iEvent.getByToken(hcalPFClusterIsoT_, hcalPFClusterIsoMapH);
416  aPhoton.setEcalPFClusterIso((*ecalPFClusterIsoMapH)[photonRef]);
417  aPhoton.setHcalPFClusterIso((*hcalPFClusterIsoMapH)[photonRef]);
418  } else {
419  aPhoton.setEcalPFClusterIso(-999.);
420  aPhoton.setHcalPFClusterIso(-999.);
421  }
422 
423  // add the Photon to the vector of Photons
424  PATPhotons->push_back(aPhoton);
425  }
426 
427  // sort Photons in ET
428  std::sort(PATPhotons->begin(), PATPhotons->end(), eTComparator_);
429 
430  // put genEvt object in Event
431  std::unique_ptr<std::vector<Photon> > myPhotons(PATPhotons);
432  iEvent.put(std::move(myPhotons));
434 
435 }
436 
437 // ParameterSet description for module
439 {
441  iDesc.setComment("PAT photon producer module");
442 
443  // input source
444  iDesc.add<edm::InputTag>("photonSource", edm::InputTag("no default"))->setComment("input collection");
445  iDesc.add<edm::InputTag>("electronSource", edm::InputTag("no default"))->setComment("input collection");
446  iDesc.add<edm::InputTag>("conversionSource", edm::InputTag("allConversions"))->setComment("input collection");
447 
448  iDesc.add<edm::InputTag>("reducedBarrelRecHitCollection", edm::InputTag("reducedEcalRecHitsEB"));
449  iDesc.add<edm::InputTag>("reducedEndcapRecHitCollection", edm::InputTag("reducedEcalRecHitsEE"));
450 
451  iDesc.ifValue(edm::ParameterDescription<bool>("addPFClusterIso", false, true),
452  true >> (edm::ParameterDescription<edm::InputTag>("ecalPFClusterIsoMap", edm::InputTag("photonEcalPFClusterIsolationProducer"), true) and
453  edm::ParameterDescription<edm::InputTag>("hcalPFClusterIsoMap", edm::InputTag("photonHcalPFClusterIsolationProducer"),true)) or
454  false >> (edm::ParameterDescription<edm::InputTag>("ecalPFClusterIsoMap", edm::InputTag(""), true) and
455  edm::ParameterDescription<edm::InputTag>("hcalPFClusterIsoMap", edm::InputTag(""),true)));
456 
457  iDesc.ifValue(edm::ParameterDescription<bool>("addPuppiIsolation", false, true),
458  true >> (edm::ParameterDescription<edm::InputTag>("puppiIsolationChargedHadrons", edm::InputTag("egmPhotonPUPPIIsolation","h+-DR030-"), true) and
459  edm::ParameterDescription<edm::InputTag>("puppiIsolationNeutralHadrons", edm::InputTag("egmPhotonPUPPIIsolation","h0-DR030-"), true) and
460  edm::ParameterDescription<edm::InputTag>("puppiIsolationPhotons", edm::InputTag("egmPhotonPUPPIIsolation","gamma-DR030-"), true)) or
461  false >> edm::EmptyGroupDescription());
462 
463  iDesc.add<bool>("embedSuperCluster", true)->setComment("embed external super cluster");
464  iDesc.add<bool>("embedSeedCluster", true)->setComment("embed external seed cluster");
465  iDesc.add<bool>("embedBasicClusters", true)->setComment("embed external basic clusters");
466  iDesc.add<bool>("embedPreshowerClusters", true)->setComment("embed external preshower clusters");
467  iDesc.add<bool>("embedRecHits", true)->setComment("embed external RecHits");
468 
469  // MC matching configurables
470  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
471  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
472  std::vector<edm::InputTag> emptySourceVector;
473  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
474  edm::ParameterDescription<std::vector<edm::InputTag> >("genParticleMatch", emptySourceVector, true)
475  )->setComment("input with MC match information");
476 
478 
479  // photon ID configurables
480  iDesc.add<bool>("addPhotonID",true)->setComment("add photon ID variables");
481  edm::ParameterSetDescription photonIDSourcesPSet;
482  photonIDSourcesPSet.setAllowAnything();
483  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("photonIDSource", edm::InputTag(), true) xor
484  edm::ParameterDescription<edm::ParameterSetDescription>("photonIDSources", photonIDSourcesPSet, true)
485  )->setComment("input with photon ID variables");
486 
487  // IsoDeposit configurables
488  edm::ParameterSetDescription isoDepositsPSet;
489  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
490  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
491  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
492  isoDepositsPSet.addOptional<edm::InputTag>("pfAllParticles");
493  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadrons");
494  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedAll");
495  isoDepositsPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
496  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
497  isoDepositsPSet.addOptional<edm::InputTag>("pfPhotons");
498  isoDepositsPSet.addOptional<std::vector<edm::InputTag> >("user");
499  iDesc.addOptional("isoDeposits", isoDepositsPSet);
500 
501  // isolation values configurables
502  edm::ParameterSetDescription isolationValuesPSet;
503  isolationValuesPSet.addOptional<edm::InputTag>("tracker");
504  isolationValuesPSet.addOptional<edm::InputTag>("ecal");
505  isolationValuesPSet.addOptional<edm::InputTag>("hcal");
506  isolationValuesPSet.addOptional<edm::InputTag>("pfAllParticles");
507  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedHadrons");
508  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedAll");
509  isolationValuesPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
510  isolationValuesPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
511  isolationValuesPSet.addOptional<edm::InputTag>("pfPhotons");
512  isolationValuesPSet.addOptional<std::vector<edm::InputTag> >("user");
513  iDesc.addOptional("isolationValues", isolationValuesPSet);
514 
515  // Efficiency configurables
516  edm::ParameterSetDescription efficienciesPSet;
517  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
518  iDesc.add("efficiencies", efficienciesPSet);
519  iDesc.add<bool>("addEfficiencies", false);
520 
521  // Check to see if the user wants to add user data
522  edm::ParameterSetDescription userDataPSet;
524  iDesc.addOptional("userData", userDataPSet);
525 
526  edm::ParameterSetDescription isolationPSet;
527  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
528  iDesc.add("userIsolation", isolationPSet);
529 
530  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("beamLineSrc", edm::InputTag(), true)
531  )->setComment("input with high level selection");
532 
533  iDesc.add<bool>("saveRegressionData", true)->setComment("save regression input variables");
534 
535  descriptions.add("PATPhotonProducer", iDesc);
536 
537 }
538 
540 
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:56
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:26
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)
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