CMS 3D CMS Logo

PATElectronProducer.cc
Go to the documentation of this file.
1 
57 
58 #include <memory>
59 #include <string>
60 #include <vector>
61 
62 namespace pat {
63 
64  class TrackerIsolationPt;
65  class CaloIsolationEnergy;
66  class LeptonLRCalc;
67 
69  public:
70  explicit PATElectronProducer(const edm::ParameterSet& iConfig);
71  ~PATElectronProducer() override;
72 
73  void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
74 
75  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
76 
77  private:
78  // configurables
82  const bool embedGsfTrack_;
83  const bool embedSuperCluster_;
85  const bool embedSeedCluster_;
86  const bool embedBasicClusters_;
90  const bool embedTrack_;
93  const bool embedRecHits_;
94  // for mini-iso calculation
97  std::vector<double> miniIsoParamsE_;
98  std::vector<double> miniIsoParamsB_;
99 
100  typedef std::vector<edm::Handle<edm::Association<reco::GenParticleCollection>>> GenAssociations;
101 
102  std::vector<edm::EDGetTokenT<edm::Association<reco::GenParticleCollection>>> genMatchTokens_;
103 
105  const bool useParticleFlow_;
110  const bool embedPFCandidate_;
111 
113  const bool addMVAVariables_;
119 
120  const bool addPFClusterIso_;
121  const bool addPuppiIsolation_;
124 
129 
131  typedef std::vector<edm::Handle<edm::ValueMap<IsoDeposit>>> IsoDepositMaps;
132  typedef std::vector<edm::Handle<edm::ValueMap<double>>> IsolationValueMaps;
133 
135  void fillElectron(Electron& aElectron,
136  const ElectronBaseRef& electronRef,
137  const reco::CandidateBaseRef& baseRef,
138  const GenAssociations& genMatches,
139  const IsoDepositMaps& deposits,
140  const bool pfId,
143 
144  void fillElectron2(Electron& anElectron,
145  const reco::CandidatePtr& candPtrForIsolation,
146  const reco::CandidatePtr& candPtrForGenMatch,
147  const reco::CandidatePtr& candPtrForLoader,
148  const GenAssociations& genMatches,
149  const IsoDepositMaps& deposits,
150  const IsolationValueMaps& isolationValues) const;
151 
152  // set the mini-isolation variables
154 
155  // embed various impact parameters with errors
156  // embed high level selection
157  void embedHighLevel(pat::Electron& anElectron,
161  bool primaryVertexIsValid,
163  bool beamspotIsValid);
164 
165  typedef std::pair<pat::IsolationKeys, edm::InputTag> IsolationLabel;
166  typedef std::vector<IsolationLabel> IsolationLabels;
167 
170  template <typename T>
171  void readIsolationLabels(const edm::ParameterSet& iConfig,
172  const char* psetName,
175 
176  const bool addElecID_;
177  typedef std::pair<std::string, edm::InputTag> NameTag;
178  std::vector<NameTag> elecIDSrcs_;
179  std::vector<edm::EDGetTokenT<edm::ValueMap<float>>> elecIDTokens_;
180 
181  // tools
183 
185  pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_; // better here than recreate at each event
187  std::vector<edm::EDGetTokenT<edm::ValueMap<IsoDeposit>>> isoDepositTokens_;
189  std::vector<edm::EDGetTokenT<edm::ValueMap<double>>> isolationValueTokens_;
191  std::vector<edm::EDGetTokenT<edm::ValueMap<double>>> isolationValueNoPFIdTokens_;
192 
193  const bool addEfficiencies_;
195 
196  const bool addResolutions_;
198 
199  const bool useUserData_;
200  //PUPPI isolation tokens
204  //PUPPINoLeptons isolation tokens
209 
212 
214  };
215 } // namespace pat
216 
217 template <typename T>
219  const char* psetName,
222  labels.clear();
223 
224  if (iConfig.exists(psetName)) {
226 
227  if (depconf.exists("tracker"))
228  labels.push_back(std::make_pair(pat::TrackIso, depconf.getParameter<edm::InputTag>("tracker")));
229  if (depconf.exists("ecal"))
230  labels.push_back(std::make_pair(pat::EcalIso, depconf.getParameter<edm::InputTag>("ecal")));
231  if (depconf.exists("hcal"))
232  labels.push_back(std::make_pair(pat::HcalIso, depconf.getParameter<edm::InputTag>("hcal")));
233  if (depconf.exists("pfAllParticles")) {
234  labels.push_back(std::make_pair(pat::PfAllParticleIso, depconf.getParameter<edm::InputTag>("pfAllParticles")));
235  }
236  if (depconf.exists("pfChargedHadrons")) {
237  labels.push_back(
238  std::make_pair(pat::PfChargedHadronIso, depconf.getParameter<edm::InputTag>("pfChargedHadrons")));
239  }
240  if (depconf.exists("pfChargedAll")) {
241  labels.push_back(std::make_pair(pat::PfChargedAllIso, depconf.getParameter<edm::InputTag>("pfChargedAll")));
242  }
243  if (depconf.exists("pfPUChargedHadrons")) {
244  labels.push_back(
245  std::make_pair(pat::PfPUChargedHadronIso, depconf.getParameter<edm::InputTag>("pfPUChargedHadrons")));
246  }
247  if (depconf.exists("pfNeutralHadrons")) {
248  labels.push_back(
249  std::make_pair(pat::PfNeutralHadronIso, depconf.getParameter<edm::InputTag>("pfNeutralHadrons")));
250  }
251  if (depconf.exists("pfPhotons")) {
252  labels.push_back(std::make_pair(pat::PfGammaIso, depconf.getParameter<edm::InputTag>("pfPhotons")));
253  }
254  if (depconf.exists("user")) {
255  std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag>>("user");
256  std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
258  for (; it != ed; ++it, ++key) {
259  labels.push_back(std::make_pair(pat::IsolationKeys(key), *it));
260  }
261  }
262  }
263  tokens = edm::vector_transform(
264  labels, [this](IsolationLabel const& label) { return consumes<edm::ValueMap<T>>(label.second); });
265 }
266 
267 using namespace pat;
268 using namespace std;
269 
271  : // general configurables
272  electronToken_(consumes<edm::View<reco::GsfElectron>>(iConfig.getParameter<edm::InputTag>("electronSource"))),
273  hConversionsToken_(consumes<reco::ConversionCollection>(edm::InputTag("allConversions"))),
274  embedGsfElectronCore_(iConfig.getParameter<bool>("embedGsfElectronCore")),
275  embedGsfTrack_(iConfig.getParameter<bool>("embedGsfTrack")),
276  embedSuperCluster_(iConfig.getParameter<bool>("embedSuperCluster")),
277  embedPflowSuperCluster_(iConfig.getParameter<bool>("embedPflowSuperCluster")),
278  embedSeedCluster_(iConfig.getParameter<bool>("embedSeedCluster")),
279  embedBasicClusters_(iConfig.getParameter<bool>("embedBasicClusters")),
280  embedPreshowerClusters_(iConfig.getParameter<bool>("embedPreshowerClusters")),
281  embedPflowBasicClusters_(iConfig.getParameter<bool>("embedPflowBasicClusters")),
282  embedPflowPreshowerClusters_(iConfig.getParameter<bool>("embedPflowPreshowerClusters")),
283  embedTrack_(iConfig.getParameter<bool>("embedTrack")),
284  addGenMatch_(iConfig.getParameter<bool>("addGenMatch")),
285  embedGenMatch_(addGenMatch_ ? iConfig.getParameter<bool>("embedGenMatch") : false),
286  embedRecHits_(iConfig.getParameter<bool>("embedRecHits")),
287  // pflow configurables
288  useParticleFlow_(iConfig.getParameter<bool>("useParticleFlow")),
289  usePfCandidateMultiMap_(iConfig.getParameter<bool>("usePfCandidateMultiMap")),
290  pfElecToken_(!usePfCandidateMultiMap_
291  ? consumes<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag>("pfElectronSource"))
292  : edm::EDGetTokenT<reco::PFCandidateCollection>()),
293  pfCandidateMapToken_(!usePfCandidateMultiMap_ ? mayConsume<edm::ValueMap<reco::PFCandidatePtr>>(
294  iConfig.getParameter<edm::InputTag>("pfCandidateMap"))
295  : edm::EDGetTokenT<edm::ValueMap<reco::PFCandidatePtr>>()),
296  pfCandidateMultiMapToken_(usePfCandidateMultiMap_
297  ? consumes<edm::ValueMap<std::vector<reco::PFCandidateRef>>>(
298  iConfig.getParameter<edm::InputTag>("pfCandidateMultiMap"))
299  : edm::EDGetTokenT<edm::ValueMap<std::vector<reco::PFCandidateRef>>>()),
300  embedPFCandidate_(iConfig.getParameter<bool>("embedPFCandidate")),
301  // mva input variables
302  addMVAVariables_(iConfig.getParameter<bool>("addMVAVariables")),
303  reducedBarrelRecHitCollection_(iConfig.getParameter<edm::InputTag>("reducedBarrelRecHitCollection")),
304  reducedBarrelRecHitCollectionToken_(mayConsume<EcalRecHitCollection>(reducedBarrelRecHitCollection_)),
305  reducedEndcapRecHitCollection_(iConfig.getParameter<edm::InputTag>("reducedEndcapRecHitCollection")),
306  reducedEndcapRecHitCollectionToken_(mayConsume<EcalRecHitCollection>(reducedEndcapRecHitCollection_)),
307  ecalClusterToolsESGetTokens_{consumesCollector()},
308  // PFCluster Isolation maps
309  addPFClusterIso_(iConfig.getParameter<bool>("addPFClusterIso")),
310  addPuppiIsolation_(iConfig.getParameter<bool>("addPuppiIsolation")),
311  ecalPFClusterIsoT_(consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("ecalPFClusterIsoMap"))),
312  hcalPFClusterIsoT_(consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("hcalPFClusterIsoMap"))),
313  // embed high level selection variables?
314  embedHighLevelSelection_(iConfig.getParameter<bool>("embedHighLevelSelection")),
315  beamLineToken_(consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamLineSrc"))),
316  pvToken_(mayConsume<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("pvSrc"))),
317  addElecID_(iConfig.getParameter<bool>("addElectronID")),
318  pTComparator_(),
319  isolator_(iConfig.getParameter<edm::ParameterSet>("userIsolation"), consumesCollector(), false),
320  addEfficiencies_(iConfig.getParameter<bool>("addEfficiencies")),
321  addResolutions_(iConfig.getParameter<bool>("addResolutions")),
322  useUserData_(iConfig.exists("userData")),
323  ecalTopologyToken_{esConsumes()},
324  trackBuilderToken_{esConsumes(edm::ESInputTag("", "TransientTrackBuilder"))} {
325  // MC matching configurables (scheduled mode)
326 
327  if (addGenMatch_) {
328  genMatchTokens_.push_back(consumes<edm::Association<reco::GenParticleCollection>>(
329  iConfig.getParameter<edm::InputTag>("genParticleMatch")));
330  }
331  // resolution configurables
332  if (addResolutions_) {
333  resolutionLoader_ =
334  pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"), consumesCollector());
335  }
336  if (addPuppiIsolation_) {
337  //puppi
338  PUPPIIsolation_charged_hadrons_ =
339  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationChargedHadrons"));
340  PUPPIIsolation_neutral_hadrons_ =
341  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationNeutralHadrons"));
342  PUPPIIsolation_photons_ =
343  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationPhotons"));
344  //puppiNoLeptons
345  PUPPINoLeptonsIsolation_charged_hadrons_ =
346  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiNoLeptonsIsolationChargedHadrons"));
347  PUPPINoLeptonsIsolation_neutral_hadrons_ =
348  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiNoLeptonsIsolationNeutralHadrons"));
349  PUPPINoLeptonsIsolation_photons_ =
350  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiNoLeptonsIsolationPhotons"));
351  }
352  // electron ID configurables
353  if (addElecID_) {
354  // it might be a single electron ID
355  if (iConfig.existsAs<edm::InputTag>("electronIDSource")) {
356  elecIDSrcs_.push_back(NameTag("", iConfig.getParameter<edm::InputTag>("electronIDSource")));
357  }
358  // or there might be many of them
359  if (iConfig.existsAs<edm::ParameterSet>("electronIDSources")) {
360  // please don't configure me twice
361  if (!elecIDSrcs_.empty()) {
362  throw cms::Exception("Configuration")
363  << "PATElectronProducer: you can't specify both 'electronIDSource' and 'electronIDSources'\n";
364  }
365  // read the different electron ID names
366  edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("electronIDSources");
367  std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
368  for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
369  elecIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
370  }
371  }
372  // but in any case at least once
373  if (elecIDSrcs_.empty()) {
374  throw cms::Exception("Configuration")
375  << "PATElectronProducer: id addElectronID is true, you must specify either:\n"
376  << "\tInputTag electronIDSource = <someTag>\n"
377  << "or\n"
378  << "\tPSet electronIDSources = { \n"
379  << "\t\tInputTag <someName> = <someTag> // as many as you want \n "
380  << "\t}\n";
381  }
382  }
383  elecIDTokens_ = edm::vector_transform(
384  elecIDSrcs_, [this](NameTag const& tag) { return mayConsume<edm::ValueMap<float>>(tag.second); });
385  // construct resolution calculator
386 
387  // // IsoDeposit configurables
388  // if (iConfig.exists("isoDeposits")) {
389  // edm::ParameterSet depconf = iConfig.getParameter<edm::ParameterSet>("isoDeposits");
390  // if (depconf.exists("tracker")) isoDepositLabels_.push_back(std::make_pair(TrackerIso, depconf.getParameter<edm::InputTag>("tracker")));
391  // if (depconf.exists("ecal")) isoDepositLabels_.push_back(std::make_pair(ECalIso, depconf.getParameter<edm::InputTag>("ecal")));
392  // if (depconf.exists("hcal")) isoDepositLabels_.push_back(std::make_pair(HCalIso, depconf.getParameter<edm::InputTag>("hcal")));
393 
394  // if (depconf.exists("user")) {
395  // std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag> >("user");
396  // std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
397  // int key = UserBaseIso;
398  // for ( ; it != ed; ++it, ++key) {
399  // isoDepositLabels_.push_back(std::make_pair(IsolationKeys(key), *it));
400  // }
401  // }
402  // }
403  // isoDepositTokens_ = edm::vector_transform(isoDepositLabels_, [this](std::pair<IsolationKeys,edm::InputTag> const & label){return consumes<edm::ValueMap<IsoDeposit> >(label.second);});
404 
405  // for mini-iso
406  computeMiniIso_ = iConfig.getParameter<bool>("computeMiniIso");
407  miniIsoParamsE_ = iConfig.getParameter<std::vector<double>>("miniIsoParamsE");
408  miniIsoParamsB_ = iConfig.getParameter<std::vector<double>>("miniIsoParamsB");
409  if (computeMiniIso_ && (miniIsoParamsE_.size() != 9 || miniIsoParamsB_.size() != 9)) {
410  throw cms::Exception("ParameterError") << "miniIsoParams must have exactly 9 elements.\n";
411  }
412  if (computeMiniIso_)
413  pcToken_ = consumes<pat::PackedCandidateCollection>(iConfig.getParameter<edm::InputTag>("pfCandsForMiniIso"));
414 
415  // read isoDeposit labels, for direct embedding
416  readIsolationLabels(iConfig, "isoDeposits", isoDepositLabels_, isoDepositTokens_);
417  // read isolation value labels, for direct embedding
418  readIsolationLabels(iConfig, "isolationValues", isolationValueLabels_, isolationValueTokens_);
419  // read isolation value labels for non PF identified electron, for direct embedding
420  readIsolationLabels(iConfig, "isolationValuesNoPFId", isolationValueLabelsNoPFId_, isolationValueNoPFIdTokens_);
421  // Efficiency configurables
422  if (addEfficiencies_) {
423  efficiencyLoader_ =
424  pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"), consumesCollector());
425  }
426  // Check to see if the user wants to add user data
427  if (useUserData_) {
428  userDataHelper_ =
429  PATUserDataHelper<Electron>(iConfig.getParameter<edm::ParameterSet>("userData"), consumesCollector());
430  }
431 
432  // consistency check
433  if (useParticleFlow_ && usePfCandidateMultiMap_)
434  throw cms::Exception("Configuration", "usePfCandidateMultiMap not supported when useParticleFlow is set to true");
435 
436  // produces vector of muons
437  produces<std::vector<Electron>>();
438 }
439 
441 
443  // switch off embedding (in unschedules mode)
444  if (iEvent.isRealData()) {
445  addGenMatch_ = false;
446  embedGenMatch_ = false;
447  }
448 
450 
451  // Get the collection of electrons from the event
453  iEvent.getByToken(electronToken_, electrons);
454 
456  if (computeMiniIso_)
457  iEvent.getByToken(pcToken_, pc);
458 
459  // for additional mva variables
460  edm::InputTag reducedEBRecHitCollection(string("reducedEcalRecHitsEB"));
461  edm::InputTag reducedEERecHitCollection(string("reducedEcalRecHitsEE"));
462  //EcalClusterLazyTools lazyTools(iEvent, iSetup, reducedEBRecHitCollection, reducedEERecHitCollection);
463  EcalClusterLazyTools lazyTools(iEvent,
467 
468  // for conversion veto selection
470  iEvent.getByToken(hConversionsToken_, hConversions);
471 
472  // Get the ESHandle for the transient track builder, if needed for
473  // high level selection embedding
475 
476  if (isolator_.enabled())
477  isolator_.beginEvent(iEvent, iSetup);
478 
483 
485  for (size_t j = 0, nd = isoDepositTokens_.size(); j < nd; ++j) {
486  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
487  }
488 
490  for (size_t j = 0; j < isolationValueTokens_.size(); ++j) {
492  }
493 
495  for (size_t j = 0; j < isolationValueNoPFIdTokens_.size(); ++j) {
497  }
498 
499  // prepare the MC matching
500  GenAssociations genMatches(genMatchTokens_.size());
501  if (addGenMatch_) {
502  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
503  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
504  }
505  }
506 
507  // prepare ID extraction
508  std::vector<edm::Handle<edm::ValueMap<float>>> idhandles;
509  std::vector<pat::Electron::IdPair> ids;
510  if (addElecID_) {
511  idhandles.resize(elecIDSrcs_.size());
512  ids.resize(elecIDSrcs_.size());
513  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
514  iEvent.getByToken(elecIDTokens_[i], idhandles[i]);
515  ids[i].first = elecIDSrcs_[i].first;
516  }
517  }
518 
519  // prepare the high level selection:
520  // needs beamline
521  reco::TrackBase::Point beamPoint(0, 0, 0);
524  bool beamSpotIsValid = false;
525  bool primaryVertexIsValid = false;
526 
527  // Get the beamspot
528  edm::Handle<reco::BeamSpot> beamSpotHandle;
529  iEvent.getByToken(beamLineToken_, beamSpotHandle);
530 
532  // Get the primary vertex
534  iEvent.getByToken(pvToken_, pvHandle);
535 
536  // This is needed by the IPTools methods from the tracking group
537  trackBuilder = iSetup.getHandle(trackBuilderToken_);
538 
539  if (beamSpotHandle.isValid()) {
540  beamSpot = *beamSpotHandle;
541  beamSpotIsValid = true;
542  } else {
543  edm::LogError("DataNotAvailable") << "No beam spot available from EventSetup, not adding high level selection \n";
544  }
545 
546  if (pvHandle.isValid() && !pvHandle->empty()) {
547  primaryVertex = pvHandle->at(0);
548  primaryVertexIsValid = true;
549  } else {
550  edm::LogError("DataNotAvailable")
551  << "No primary vertex available from EventSetup, not adding high level selection \n";
552  }
553  }
554  //value maps for puppi isolation
555  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_charged_hadrons;
556  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_neutral_hadrons;
557  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_photons;
558  //value maps for puppiNoLeptons isolation
559  edm::Handle<edm::ValueMap<float>> PUPPINoLeptonsIsolation_charged_hadrons;
560  edm::Handle<edm::ValueMap<float>> PUPPINoLeptonsIsolation_neutral_hadrons;
561  edm::Handle<edm::ValueMap<float>> PUPPINoLeptonsIsolation_photons;
562  if (addPuppiIsolation_) {
563  //puppi
564  iEvent.getByToken(PUPPIIsolation_charged_hadrons_, PUPPIIsolation_charged_hadrons);
565  iEvent.getByToken(PUPPIIsolation_neutral_hadrons_, PUPPIIsolation_neutral_hadrons);
566  iEvent.getByToken(PUPPIIsolation_photons_, PUPPIIsolation_photons);
567  //puppiNoLeptons
568  iEvent.getByToken(PUPPINoLeptonsIsolation_charged_hadrons_, PUPPINoLeptonsIsolation_charged_hadrons);
569  iEvent.getByToken(PUPPINoLeptonsIsolation_neutral_hadrons_, PUPPINoLeptonsIsolation_neutral_hadrons);
570  iEvent.getByToken(PUPPINoLeptonsIsolation_photons_, PUPPINoLeptonsIsolation_photons);
571  }
572 
573  std::vector<Electron>* patElectrons = new std::vector<Electron>();
574 
575  if (useParticleFlow_) {
577  iEvent.getByToken(pfElecToken_, pfElectrons);
578  unsigned index = 0;
579 
580  for (reco::PFCandidateConstIterator i = pfElectrons->begin(); i != pfElectrons->end(); ++i, ++index) {
582  reco::PFCandidatePtr ptrToPFElectron(pfElectrons, index);
583  // reco::CandidateBaseRef pfBaseRef( pfRef );
584 
585  reco::GsfTrackRef PfTk = i->gsfTrackRef();
586 
587  bool Matched = false;
588  bool MatchedToAmbiguousGsfTrack = false;
589  for (edm::View<reco::GsfElectron>::const_iterator itElectron = electrons->begin(); itElectron != electrons->end();
590  ++itElectron) {
591  unsigned int idx = itElectron - electrons->begin();
592  auto elePtr = electrons->ptrAt(idx);
593  if (Matched || MatchedToAmbiguousGsfTrack)
594  continue;
595 
596  reco::GsfTrackRef EgTk = itElectron->gsfTrack();
597 
598  if (itElectron->gsfTrack() == i->gsfTrackRef()) {
599  Matched = true;
600  } else {
601  for (auto const& it : itElectron->ambiguousGsfTracks()) {
602  MatchedToAmbiguousGsfTrack |= (bool)(i->gsfTrackRef() == it);
603  }
604  }
605 
606  if (Matched || MatchedToAmbiguousGsfTrack) {
607  // ptr needed for finding the matched gen particle
608  reco::CandidatePtr ptrToGsfElectron(electrons, idx);
609 
610  // ref to base needed for the construction of the pat object
611  const edm::RefToBase<reco::GsfElectron>& elecsRef = electrons->refAt(idx);
612  Electron anElectron(elecsRef);
613  anElectron.setPFCandidateRef(pfRef);
614  if (addPuppiIsolation_) {
615  anElectron.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[elePtr],
616  (*PUPPIIsolation_neutral_hadrons)[elePtr],
617  (*PUPPIIsolation_photons)[elePtr]);
618  anElectron.setIsolationPUPPINoLeptons((*PUPPINoLeptonsIsolation_charged_hadrons)[elePtr],
619  (*PUPPINoLeptonsIsolation_neutral_hadrons)[elePtr],
620  (*PUPPINoLeptonsIsolation_photons)[elePtr]);
621  } else {
622  anElectron.setIsolationPUPPI(-999., -999., -999.);
623  anElectron.setIsolationPUPPINoLeptons(-999., -999., -999.);
624  }
625 
626  //it should be always true when particleFlow electrons are used.
627  anElectron.setIsPF(true);
628 
629  if (embedPFCandidate_)
630  anElectron.embedPFCandidate();
631 
632  if (useUserData_) {
633  userDataHelper_.add(anElectron, iEvent, iSetup);
634  }
635 
636  double ip3d = -999; // for mva variable
637 
638  // embed high level selection
640  // get the global track
641  const reco::GsfTrackRef& track = PfTk;
642 
643  // Make sure the collection it points to is there
644  if (track.isNonnull() && track.isAvailable()) {
645  reco::TransientTrack tt = trackBuilder->build(track);
646  embedHighLevel(anElectron, track, tt, primaryVertex, primaryVertexIsValid, beamSpot, beamSpotIsValid);
647 
648  std::pair<bool, Measurement1D> ip3dpv = IPTools::absoluteImpactParameter3D(tt, primaryVertex);
649  ip3d = ip3dpv.second.value(); // for mva variable
650  }
651  }
652 
653  //Electron Id
654 
655  if (addElecID_) {
656  //STANDARD EL ID
657  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
658  ids[i].second = (*idhandles[i])[elecsRef];
659  }
660  //SPECIFIC PF ID
661  ids.push_back(std::make_pair("pf_evspi", pfRef->mva_e_pi()));
662  ids.push_back(std::make_pair("pf_evsmu", pfRef->mva_e_mu()));
663  anElectron.setElectronIDs(ids);
664  }
665 
666  if (addMVAVariables_) {
667  // add missing mva variables
668  const auto& vCov = lazyTools.localCovariances(*(itElectron->superCluster()->seed()));
669  anElectron.setMvaVariables(vCov[1], ip3d);
670  }
671  // PFClusterIso
672  if (addPFClusterIso_) {
673  // Get PFCluster Isolation
674  edm::Handle<edm::ValueMap<float>> ecalPFClusterIsoMapH;
675  iEvent.getByToken(ecalPFClusterIsoT_, ecalPFClusterIsoMapH);
676  edm::Handle<edm::ValueMap<float>> hcalPFClusterIsoMapH;
677  iEvent.getByToken(hcalPFClusterIsoT_, hcalPFClusterIsoMapH);
679  newPFIsol.sumEcalClusterEt = (*ecalPFClusterIsoMapH)[elecsRef];
680  newPFIsol.sumHcalClusterEt = (*hcalPFClusterIsoMapH)[elecsRef];
681  anElectron.setPfIsolationVariables(newPFIsol);
682  }
683 
684  std::vector<DetId> selectedCells;
685  bool barrel = itElectron->isEB();
686  //loop over sub clusters
687  if (embedBasicClusters_) {
688  for (reco::CaloCluster_iterator clusIt = itElectron->superCluster()->clustersBegin();
689  clusIt != itElectron->superCluster()->clustersEnd();
690  ++clusIt) {
691  //get seed (max energy xtal)
692  DetId seed = lazyTools.getMaximum(**clusIt).first;
693  //get all xtals in 5x5 window around the seed
694  std::vector<DetId> dets5x5 =
697  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
698 
699  //get all xtals belonging to cluster
700  for (const std::pair<DetId, float>& hit : (*clusIt)->hitsAndFractions()) {
701  selectedCells.push_back(hit.first);
702  }
703  }
704  }
705 
706  if (embedPflowBasicClusters_ && itElectron->parentSuperCluster().isNonnull()) {
707  for (reco::CaloCluster_iterator clusIt = itElectron->parentSuperCluster()->clustersBegin();
708  clusIt != itElectron->parentSuperCluster()->clustersEnd();
709  ++clusIt) {
710  //get seed (max energy xtal)
711  DetId seed = lazyTools.getMaximum(**clusIt).first;
712  //get all xtals in 5x5 window around the seed
713  std::vector<DetId> dets5x5 =
716  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
717 
718  //get all xtals belonging to cluster
719  for (const std::pair<DetId, float>& hit : (*clusIt)->hitsAndFractions()) {
720  selectedCells.push_back(hit.first);
721  }
722  }
723  }
724 
725  //remove duplicates
726  std::sort(selectedCells.begin(), selectedCells.end());
727  std::unique(selectedCells.begin(), selectedCells.end());
728 
729  // Retrieve the corresponding RecHits
730 
732  if (barrel)
733  iEvent.getByToken(reducedBarrelRecHitCollectionToken_, rechitsH);
734  else
735  iEvent.getByToken(reducedEndcapRecHitCollectionToken_, rechitsH);
736 
737  EcalRecHitCollection selectedRecHits;
738  const EcalRecHitCollection* recHits = rechitsH.product();
739 
740  unsigned nSelectedCells = selectedCells.size();
741  for (unsigned icell = 0; icell < nSelectedCells; ++icell) {
742  EcalRecHitCollection::const_iterator it = recHits->find(selectedCells[icell]);
743  if (it != recHits->end()) {
744  selectedRecHits.push_back(*it);
745  }
746  }
747  selectedRecHits.sort();
748  if (embedRecHits_)
749  anElectron.embedRecHits(&selectedRecHits);
750 
751  // set conversion veto selection
752  bool passconversionveto = false;
753  if (hConversions.isValid()) {
754  // this is recommended method
755  passconversionveto =
756  !ConversionTools::hasMatchedConversion(*itElectron, *hConversions, beamSpotHandle->position());
757  } else {
758  // use missing hits without vertex fit method
759  passconversionveto =
760  itElectron->gsfTrack()->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS) < 1;
761  }
762 
763  anElectron.setPassConversionVeto(passconversionveto);
764 
765  // fillElectron(anElectron,elecsRef,pfBaseRef,
766  // genMatches, deposits, isolationValues);
767 
768  //COLIN small warning !
769  // we are currently choosing to take the 4-momentum of the PFCandidate;
770  // the momentum of the GsfElectron is saved though
771  // we must therefore match the GsfElectron.
772  // because of this, we should not change the source of the electron matcher
773  // to the collection of PFElectrons in the python configuration
774  // I don't know what to do with the efficiencyLoader, since I don't know
775  // what this class is for.
777  anElectron, ptrToPFElectron, ptrToGsfElectron, ptrToGsfElectron, genMatches, deposits, isolationValues);
778 
779  //COLIN need to use fillElectron2 in the non-pflow case as well, and to test it.
780 
781  if (computeMiniIso_)
782  setElectronMiniIso(anElectron, pc.product());
783 
784  patElectrons->push_back(anElectron);
785  }
786  }
787  //if( !Matched && !MatchedToAmbiguousGsfTrack) std::cout << "!!!!A pf electron could not be matched to a gsf!!!!" << std::endl;
788  }
789  }
790 
791  else {
795  bool pfCandsPresent = false, valMapPresent = false;
797  iEvent.getByToken(pfCandidateMultiMapToken_, ValMultiMapH);
798  } else {
799  pfCandsPresent = iEvent.getByToken(pfElecToken_, pfElectrons);
800  valMapPresent = iEvent.getByToken(pfCandidateMapToken_, ValMapH);
801  }
802 
803  for (edm::View<reco::GsfElectron>::const_iterator itElectron = electrons->begin(); itElectron != electrons->end();
804  ++itElectron) {
805  // construct the Electron from the ref -> save ref to original object
806  //FIXME: looks like a lot of instances could be turned into const refs
807  unsigned int idx = itElectron - electrons->begin();
809  reco::CandidateBaseRef elecBaseRef(elecsRef);
810  Electron anElectron(elecsRef);
811  auto elePtr = electrons->ptrAt(idx);
812 
813  // Is this GsfElectron also identified as an e- in the particle flow?
814  bool pfId = false;
815 
817  for (const reco::PFCandidateRef& pf : (*ValMultiMapH)[elePtr]) {
818  if (pf->particleId() == reco::PFCandidate::e) {
819  pfId = true;
820  anElectron.setPFCandidateRef(pf);
821  break;
822  }
823  }
824  } else if (pfCandsPresent) {
825  // PF electron collection not available.
826  const reco::GsfTrackRef& trkRef = itElectron->gsfTrack();
827  int index = 0;
828  for (reco::PFCandidateConstIterator ie = pfElectrons->begin(); ie != pfElectrons->end(); ++ie, ++index) {
829  if (ie->particleId() != reco::PFCandidate::e)
830  continue;
831  const reco::GsfTrackRef& pfTrkRef = ie->gsfTrackRef();
832  if (trkRef == pfTrkRef) {
833  pfId = true;
835  anElectron.setPFCandidateRef(pfRef);
836  break;
837  }
838  }
839  } else if (valMapPresent) {
840  // use value map if PF collection not available
841  const edm::ValueMap<reco::PFCandidatePtr>& myValMap(*ValMapH);
842  // Get the PFCandidate
843  const reco::PFCandidatePtr& pfElePtr(myValMap[elecsRef]);
844  pfId = pfElePtr.isNonnull();
845  }
846  // set PFId function
847  anElectron.setIsPF(pfId);
848 
849  // add resolution info
850 
851  // Isolation
852  if (isolator_.enabled()) {
854  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
855  // better to loop backwards, so the vector is resized less times
856  for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(),
857  ed = isolatorTmpStorage_.rend();
858  it != ed;
859  ++it) {
860  anElectron.setIsolation(it->first, it->second);
861  }
862  }
863 
864  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
865  anElectron.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[elecsRef]);
866  }
867 
868  // add electron ID info
869  if (addElecID_) {
870  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
871  ids[i].second = (*idhandles[i])[elecsRef];
872  }
873  anElectron.setElectronIDs(ids);
874  }
875 
876  if (useUserData_) {
877  userDataHelper_.add(anElectron, iEvent, iSetup);
878  }
879 
880  double ip3d = -999; //for mva variable
881 
882  // embed high level selection
884  // get the global track
885  reco::GsfTrackRef track = itElectron->gsfTrack();
886 
887  // Make sure the collection it points to is there
888  if (track.isNonnull() && track.isAvailable()) {
889  reco::TransientTrack tt = trackBuilder->build(track);
890  embedHighLevel(anElectron, track, tt, primaryVertex, primaryVertexIsValid, beamSpot, beamSpotIsValid);
891 
892  std::pair<bool, Measurement1D> ip3dpv = IPTools::absoluteImpactParameter3D(tt, primaryVertex);
893  ip3d = ip3dpv.second.value(); // for mva variable
894  }
895  }
896 
897  if (addMVAVariables_) {
898  // add mva variables
899  const auto& vCov = lazyTools.localCovariances(*(itElectron->superCluster()->seed()));
900  anElectron.setMvaVariables(vCov[1], ip3d);
901  }
902 
903  // PFCluster Isolation
904  if (addPFClusterIso_) {
905  // Get PFCluster Isolation
906  edm::Handle<edm::ValueMap<float>> ecalPFClusterIsoMapH;
907  iEvent.getByToken(ecalPFClusterIsoT_, ecalPFClusterIsoMapH);
908  edm::Handle<edm::ValueMap<float>> hcalPFClusterIsoMapH;
909  iEvent.getByToken(hcalPFClusterIsoT_, hcalPFClusterIsoMapH);
911  newPFIsol.sumEcalClusterEt = (*ecalPFClusterIsoMapH)[elecsRef];
912  newPFIsol.sumHcalClusterEt = (*hcalPFClusterIsoMapH)[elecsRef];
913  anElectron.setPfIsolationVariables(newPFIsol);
914  }
915 
916  if (addPuppiIsolation_) {
917  anElectron.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[elePtr],
918  (*PUPPIIsolation_neutral_hadrons)[elePtr],
919  (*PUPPIIsolation_photons)[elePtr]);
920  anElectron.setIsolationPUPPINoLeptons((*PUPPINoLeptonsIsolation_charged_hadrons)[elePtr],
921  (*PUPPINoLeptonsIsolation_neutral_hadrons)[elePtr],
922  (*PUPPINoLeptonsIsolation_photons)[elePtr]);
923  } else {
924  anElectron.setIsolationPUPPI(-999., -999., -999.);
925  anElectron.setIsolationPUPPINoLeptons(-999., -999., -999.);
926  }
927 
928  std::vector<DetId> selectedCells;
929  bool barrel = itElectron->isEB();
930  //loop over sub clusters
931  if (embedBasicClusters_) {
932  for (reco::CaloCluster_iterator clusIt = itElectron->superCluster()->clustersBegin();
933  clusIt != itElectron->superCluster()->clustersEnd();
934  ++clusIt) {
935  //get seed (max energy xtal)
936  DetId seed = lazyTools.getMaximum(**clusIt).first;
937  //get all xtals in 5x5 window around the seed
938  std::vector<DetId> dets5x5 =
941  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
942 
943  //get all xtals belonging to cluster
944  for (const std::pair<DetId, float>& hit : (*clusIt)->hitsAndFractions()) {
945  selectedCells.push_back(hit.first);
946  }
947  }
948  }
949 
950  if (embedPflowBasicClusters_ && itElectron->parentSuperCluster().isNonnull()) {
951  for (reco::CaloCluster_iterator clusIt = itElectron->parentSuperCluster()->clustersBegin();
952  clusIt != itElectron->parentSuperCluster()->clustersEnd();
953  ++clusIt) {
954  //get seed (max energy xtal)
955  DetId seed = lazyTools.getMaximum(**clusIt).first;
956  //get all xtals in 5x5 window around the seed
957  std::vector<DetId> dets5x5 =
960  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
961 
962  //get all xtals belonging to cluster
963  for (const std::pair<DetId, float>& hit : (*clusIt)->hitsAndFractions()) {
964  selectedCells.push_back(hit.first);
965  }
966  }
967  }
968 
969  //remove duplicates
970  std::sort(selectedCells.begin(), selectedCells.end());
971  std::unique(selectedCells.begin(), selectedCells.end());
972 
973  // Retrieve the corresponding RecHits
974 
976  if (barrel)
977  iEvent.getByToken(reducedBarrelRecHitCollectionToken_, rechitsH);
978  else
979  iEvent.getByToken(reducedEndcapRecHitCollectionToken_, rechitsH);
980 
981  EcalRecHitCollection selectedRecHits;
982  const EcalRecHitCollection* recHits = rechitsH.product();
983 
984  unsigned nSelectedCells = selectedCells.size();
985  for (unsigned icell = 0; icell < nSelectedCells; ++icell) {
986  EcalRecHitCollection::const_iterator it = recHits->find(selectedCells[icell]);
987  if (it != recHits->end()) {
988  selectedRecHits.push_back(*it);
989  }
990  }
991  selectedRecHits.sort();
992  if (embedRecHits_)
993  anElectron.embedRecHits(&selectedRecHits);
994 
995  // set conversion veto selection
996  bool passconversionveto = false;
997  if (hConversions.isValid()) {
998  // this is recommended method
999  passconversionveto =
1000  !ConversionTools::hasMatchedConversion(*itElectron, *hConversions, beamSpotHandle->position());
1001  } else {
1002  // use missing hits without vertex fit method
1003  passconversionveto =
1004  itElectron->gsfTrack()->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS) < 1;
1005  }
1006  anElectron.setPassConversionVeto(passconversionveto);
1007 
1008  // add sel to selected
1009  fillElectron(
1010  anElectron, elecsRef, elecBaseRef, genMatches, deposits, pfId, isolationValues, isolationValuesNoPFId);
1011 
1012  if (computeMiniIso_)
1013  setElectronMiniIso(anElectron, pc.product());
1014 
1015  patElectrons->push_back(anElectron);
1016  }
1017  }
1018 
1019  // sort electrons in pt
1020  std::sort(patElectrons->begin(), patElectrons->end(), pTComparator_);
1021 
1022  // add the electrons to the event output
1023  std::unique_ptr<std::vector<Electron>> ptr(patElectrons);
1024  iEvent.put(std::move(ptr));
1025 
1026  // clean up
1027  if (isolator_.enabled())
1028  isolator_.endEvent();
1029 }
1030 
1032  const edm::RefToBase<reco::GsfElectron>& elecRef,
1033  const reco::CandidateBaseRef& baseRef,
1034  const GenAssociations& genMatches,
1035  const IsoDepositMaps& deposits,
1036  const bool pfId,
1039  //COLIN: might want to use the PFCandidate 4-mom. Which one is in use now?
1040  // if (useParticleFlow_)
1041  // aMuon.setP4( aMuon.pfCandidateRef()->p4() );
1042 
1043  //COLIN:
1044  //In the embedding case, the reference cannot be used to look into a value map.
1045  //therefore, one has to had the PFCandidateRef to this function, which becomes a bit
1046  //too much specific.
1047 
1048  // in fact, this function needs a baseref or ptr for genmatch
1049  // and a baseref or ptr for isodeposits and isolationvalues.
1050  // baseref is not needed
1051  // the ptrForIsolation and ptrForMatching should be defined upstream.
1052 
1053  // is the concrete elecRef needed for the efficiency loader? what is this loader?
1054  // how can we make it compatible with the particle flow electrons?
1055 
1057  anElectron.embedGsfElectronCore();
1058  if (embedGsfTrack_)
1059  anElectron.embedGsfTrack();
1060  if (embedSuperCluster_)
1061  anElectron.embedSuperCluster();
1063  anElectron.embedPflowSuperCluster();
1064  if (embedSeedCluster_)
1065  anElectron.embedSeedCluster();
1066  if (embedBasicClusters_)
1067  anElectron.embedBasicClusters();
1069  anElectron.embedPreshowerClusters();
1071  anElectron.embedPflowBasicClusters();
1073  anElectron.embedPflowPreshowerClusters();
1074  if (embedTrack_)
1075  anElectron.embedTrack();
1076 
1077  // store the match to the generated final state muons
1078  if (addGenMatch_) {
1079  for (size_t i = 0, n = genMatches.size(); i < n; ++i) {
1080  if (useParticleFlow_) {
1081  reco::GenParticleRef genElectron = (*genMatches[i])[anElectron.pfCandidateRef()];
1082  anElectron.addGenParticleRef(genElectron);
1083  } else {
1084  reco::GenParticleRef genElectron = (*genMatches[i])[elecRef];
1085  anElectron.addGenParticleRef(genElectron);
1086  }
1087  }
1088  if (embedGenMatch_)
1089  anElectron.embedGenParticle();
1090  }
1091 
1092  if (efficiencyLoader_.enabled()) {
1093  efficiencyLoader_.setEfficiencies(anElectron, elecRef);
1094  }
1095 
1096  if (resolutionLoader_.enabled()) {
1097  resolutionLoader_.setResolutions(anElectron);
1098  }
1099 
1100  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
1101  if (useParticleFlow_) {
1102  reco::PFCandidateRef pfcandref = anElectron.pfCandidateRef();
1103  assert(!pfcandref.isNull());
1104  reco::CandidatePtr source = pfcandref->sourceCandidatePtr(0);
1105  anElectron.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[source]);
1106  } else
1107  anElectron.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[elecRef]);
1108  }
1109 
1110  for (size_t j = 0; j < isolationValues.size(); ++j) {
1111  if (useParticleFlow_) {
1112  reco::CandidatePtr source = anElectron.pfCandidateRef()->sourceCandidatePtr(0);
1114  } else if (pfId) {
1115  anElectron.setIsolation(isolationValueLabels_[j].first, (*isolationValues[j])[elecRef]);
1116  }
1117  }
1118 
1119  //for electrons not identified as PF electrons
1120  for (size_t j = 0; j < isolationValuesNoPFId.size(); ++j) {
1121  if (!pfId) {
1123  }
1124  }
1125 }
1126 
1128  const reco::CandidatePtr& candPtrForIsolation,
1129  const reco::CandidatePtr& candPtrForGenMatch,
1130  const reco::CandidatePtr& candPtrForLoader,
1131  const GenAssociations& genMatches,
1132  const IsoDepositMaps& deposits,
1133  const IsolationValueMaps& isolationValues) const {
1134  //COLIN/Florian: use the PFCandidate 4-mom.
1135  anElectron.setEcalDrivenMomentum(anElectron.p4());
1136  anElectron.setP4(anElectron.pfCandidateRef()->p4());
1137 
1138  // is the concrete elecRef needed for the efficiency loader? what is this loader?
1139  // how can we make it compatible with the particle flow electrons?
1140 
1142  anElectron.embedGsfElectronCore();
1143  if (embedGsfTrack_)
1144  anElectron.embedGsfTrack();
1145  if (embedSuperCluster_)
1146  anElectron.embedSuperCluster();
1148  anElectron.embedPflowSuperCluster();
1149  if (embedSeedCluster_)
1150  anElectron.embedSeedCluster();
1151  if (embedBasicClusters_)
1152  anElectron.embedBasicClusters();
1154  anElectron.embedPreshowerClusters();
1156  anElectron.embedPflowBasicClusters();
1158  anElectron.embedPflowPreshowerClusters();
1159  if (embedTrack_)
1160  anElectron.embedTrack();
1161 
1162  // store the match to the generated final state muons
1163 
1164  if (addGenMatch_) {
1165  for (size_t i = 0, n = genMatches.size(); i < n; ++i) {
1166  reco::GenParticleRef genElectron = (*genMatches[i])[candPtrForGenMatch];
1167  anElectron.addGenParticleRef(genElectron);
1168  }
1169  if (embedGenMatch_)
1170  anElectron.embedGenParticle();
1171  }
1172 
1173  //COLIN what's this? does it have to be GsfElectron specific?
1174  if (efficiencyLoader_.enabled()) {
1175  efficiencyLoader_.setEfficiencies(anElectron, candPtrForLoader);
1176  }
1177 
1178  if (resolutionLoader_.enabled()) {
1179  resolutionLoader_.setResolutions(anElectron);
1180  }
1181 
1182  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
1184  isoDepositLabels_[j].first == pat::HcalIso || deposits[j]->contains(candPtrForGenMatch.id())) {
1185  anElectron.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[candPtrForGenMatch]);
1186  } else if (deposits[j]->contains(candPtrForIsolation.id())) {
1187  anElectron.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[candPtrForIsolation]);
1188  } else {
1189  anElectron.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[candPtrForIsolation->sourceCandidatePtr(0)]);
1190  }
1191  }
1192 
1193  for (size_t j = 0; j < isolationValues.size(); ++j) {
1195  isolationValueLabels_[j].first == pat::HcalIso || isolationValues[j]->contains(candPtrForGenMatch.id())) {
1196  anElectron.setIsolation(isolationValueLabels_[j].first, (*isolationValues[j])[candPtrForGenMatch]);
1197  } else if (isolationValues[j]->contains(candPtrForIsolation.id())) {
1198  anElectron.setIsolation(isolationValueLabels_[j].first, (*isolationValues[j])[candPtrForIsolation]);
1199  } else {
1201  (*isolationValues[j])[candPtrForIsolation->sourceCandidatePtr(0)]);
1202  }
1203  }
1204 }
1205 
1207  pat::PFIsolation miniiso;
1208  if (anElectron.isEE())
1209  miniiso = pat::getMiniPFIsolation(pc,
1210  anElectron.polarP4(),
1211  miniIsoParamsE_[0],
1212  miniIsoParamsE_[1],
1213  miniIsoParamsE_[2],
1214  miniIsoParamsE_[3],
1215  miniIsoParamsE_[4],
1216  miniIsoParamsE_[5],
1217  miniIsoParamsE_[6],
1218  miniIsoParamsE_[7],
1219  miniIsoParamsE_[8]);
1220  else
1221  miniiso = pat::getMiniPFIsolation(pc,
1222  anElectron.polarP4(),
1223  miniIsoParamsB_[0],
1224  miniIsoParamsB_[1],
1225  miniIsoParamsB_[2],
1226  miniIsoParamsB_[3],
1227  miniIsoParamsB_[4],
1228  miniIsoParamsB_[5],
1229  miniIsoParamsB_[6],
1230  miniIsoParamsB_[7],
1231  miniIsoParamsB_[8]);
1232  anElectron.setMiniPFIsolation(miniiso);
1233 }
1234 
1235 // ParameterSet description for module
1238  iDesc.setComment("PAT electron producer module");
1239 
1240  // input source
1241  iDesc.add<edm::InputTag>("pfCandidateMap", edm::InputTag("no default"))->setComment("input collection");
1242  iDesc.add<edm::InputTag>("electronSource", edm::InputTag("no default"))->setComment("input collection");
1243 
1244  iDesc.ifValue(
1245  edm::ParameterDescription<bool>("addPFClusterIso", false, true),
1247  "ecalPFClusterIsoMap", edm::InputTag("electronEcalPFClusterIsolationProducer"), true) and
1249  "hcalPFClusterIsoMap", edm::InputTag("electronHcalPFClusterIsolationProducer"), true)) or
1250  false >> (edm::ParameterDescription<edm::InputTag>("ecalPFClusterIsoMap", edm::InputTag(""), true) and
1251  edm::ParameterDescription<edm::InputTag>("hcalPFClusterIsoMap", edm::InputTag(""), true)));
1252 
1253  iDesc.ifValue(edm::ParameterDescription<bool>("addPuppiIsolation", false, true),
1255  "puppiIsolationChargedHadrons",
1256  edm::InputTag("egmElectronPUPPIIsolation", "h+-DR030-BarVeto000-EndVeto001"),
1257  true) and
1259  "puppiIsolationNeutralHadrons",
1260  edm::InputTag("egmElectronPUPPIIsolation", "h0-DR030-BarVeto000-EndVeto000"),
1261  true) and
1263  "puppiIsolationPhotons",
1264  edm::InputTag("egmElectronPUPPIIsolation", "gamma-DR030-BarVeto000-EndVeto008"),
1265  true) and
1267  "puppiNoLeptonsIsolationChargedHadrons",
1268  edm::InputTag("egmElectronPUPPINoLeptonsIsolation", "gamma-DR030-BarVeto000-EndVeto008"),
1269  true) and
1271  "puppiNoLeptonsIsolationNeutralHadrons",
1272  edm::InputTag("egmElectronPUPPINoLeptonsIsolation", "gamma-DR030-BarVeto000-EndVeto008"),
1273  true) and
1275  "puppiNoLeptonsIsolationPhotons",
1276  edm::InputTag("egmElectronPUPPINoLeptonsIsolation", "gamma-DR030-BarVeto000-EndVeto008"),
1277  true)) or
1278  false >> edm::EmptyGroupDescription());
1279 
1280  // embedding
1281  iDesc.add<bool>("embedGsfElectronCore", true)->setComment("embed external gsf electron core");
1282  iDesc.add<bool>("embedGsfTrack", true)->setComment("embed external gsf track");
1283  iDesc.add<bool>("embedSuperCluster", true)->setComment("embed external super cluster");
1284  iDesc.add<bool>("embedPflowSuperCluster", true)->setComment("embed external super cluster");
1285  iDesc.add<bool>("embedSeedCluster", true)->setComment("embed external seed cluster");
1286  iDesc.add<bool>("embedBasicClusters", true)->setComment("embed external basic clusters");
1287  iDesc.add<bool>("embedPreshowerClusters", true)->setComment("embed external preshower clusters");
1288  iDesc.add<bool>("embedPflowBasicClusters", true)->setComment("embed external pflow basic clusters");
1289  iDesc.add<bool>("embedPflowPreshowerClusters", true)->setComment("embed external pflow preshower clusters");
1290  iDesc.add<bool>("embedTrack", false)->setComment("embed external track");
1291  iDesc.add<bool>("embedRecHits", true)->setComment("embed external RecHits");
1292 
1293  // pf specific parameters
1294  iDesc.add<edm::InputTag>("pfElectronSource", edm::InputTag("pfElectrons"))
1295  ->setComment("particle flow input collection");
1296  auto&& usePfCandidateMultiMap = edm::ParameterDescription<bool>("usePfCandidateMultiMap", false, true);
1297  usePfCandidateMultiMap.setComment(
1298  "take ParticleFlow candidates from pfCandidateMultiMap instead of matching to pfElectrons by Gsf track "
1299  "reference");
1300  iDesc.ifValue(usePfCandidateMultiMap,
1301  true >> edm::ParameterDescription<edm::InputTag>("pfCandidateMultiMap", true) or
1302  false >> edm::EmptyGroupDescription());
1303  iDesc.add<bool>("useParticleFlow", false)->setComment("whether to use particle flow or not");
1304  iDesc.add<bool>("embedPFCandidate", false)->setComment("embed external particle flow object");
1305 
1306  // MC matching configurables
1307  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
1308  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
1309  std::vector<edm::InputTag> emptySourceVector;
1310  iDesc
1311  .addNode(edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
1312  edm::ParameterDescription<std::vector<edm::InputTag>>("genParticleMatch", emptySourceVector, true))
1313  ->setComment("input with MC match information");
1314 
1315  // electron ID configurables
1316  iDesc.add<bool>("addElectronID", true)->setComment("add electron ID variables");
1317  edm::ParameterSetDescription electronIDSourcesPSet;
1318  electronIDSourcesPSet.setAllowAnything();
1319  iDesc
1320  .addNode(
1321  edm::ParameterDescription<edm::InputTag>("electronIDSource", edm::InputTag(), true) xor
1322  edm::ParameterDescription<edm::ParameterSetDescription>("electronIDSources", electronIDSourcesPSet, true))
1323  ->setComment("input with electron ID variables");
1324 
1325  // mini-iso
1326  iDesc.add<bool>("computeMiniIso", false)->setComment("whether or not to compute and store electron mini-isolation");
1327  iDesc.add<edm::InputTag>("pfCandsForMiniIso", edm::InputTag("packedPFCandidates"))
1328  ->setComment("collection to use to compute mini-iso");
1329  iDesc.add<std::vector<double>>("miniIsoParamsE", std::vector<double>())
1330  ->setComment("mini-iso parameters to use for endcap electrons");
1331  iDesc.add<std::vector<double>>("miniIsoParamsB", std::vector<double>())
1332  ->setComment("mini-iso parameters to use for barrel electrons");
1333 
1334  // IsoDeposit configurables
1335  edm::ParameterSetDescription isoDepositsPSet;
1336  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
1337  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
1338  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
1339  isoDepositsPSet.addOptional<edm::InputTag>("pfAllParticles");
1340  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadrons");
1341  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedAll");
1342  isoDepositsPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
1343  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
1344  isoDepositsPSet.addOptional<edm::InputTag>("pfPhotons");
1345  isoDepositsPSet.addOptional<std::vector<edm::InputTag>>("user");
1346  iDesc.addOptional("isoDeposits", isoDepositsPSet);
1347 
1348  // isolation values configurables
1349  edm::ParameterSetDescription isolationValuesPSet;
1350  isolationValuesPSet.addOptional<edm::InputTag>("tracker");
1351  isolationValuesPSet.addOptional<edm::InputTag>("ecal");
1352  isolationValuesPSet.addOptional<edm::InputTag>("hcal");
1353  isolationValuesPSet.addOptional<edm::InputTag>("pfAllParticles");
1354  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedHadrons");
1355  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedAll");
1356  isolationValuesPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
1357  isolationValuesPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
1358  isolationValuesPSet.addOptional<edm::InputTag>("pfPhotons");
1359  isolationValuesPSet.addOptional<std::vector<edm::InputTag>>("user");
1360  iDesc.addOptional("isolationValues", isolationValuesPSet);
1361 
1362  // isolation values configurables
1363  edm::ParameterSetDescription isolationValuesNoPFIdPSet;
1364  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("tracker");
1365  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("ecal");
1366  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("hcal");
1367  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfAllParticles");
1368  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfChargedHadrons");
1369  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfChargedAll");
1370  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
1371  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
1372  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfPhotons");
1373  isolationValuesNoPFIdPSet.addOptional<std::vector<edm::InputTag>>("user");
1374  iDesc.addOptional("isolationValuesNoPFId", isolationValuesNoPFIdPSet);
1375 
1376  // Efficiency configurables
1377  edm::ParameterSetDescription efficienciesPSet;
1378  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
1379  iDesc.add("efficiencies", efficienciesPSet);
1380  iDesc.add<bool>("addEfficiencies", false);
1381 
1382  // Check to see if the user wants to add user data
1383  edm::ParameterSetDescription userDataPSet;
1385  iDesc.addOptional("userData", userDataPSet);
1386 
1387  // electron shapes
1388  iDesc.add<bool>("addMVAVariables", true)->setComment("embed extra variables in pat::Electron : sip3d, sigmaIEtaIPhi");
1389  iDesc.add<edm::InputTag>("reducedBarrelRecHitCollection", edm::InputTag("reducedEcalRecHitsEB"));
1390  iDesc.add<edm::InputTag>("reducedEndcapRecHitCollection", edm::InputTag("reducedEcalRecHitsEE"));
1391 
1392  edm::ParameterSetDescription isolationPSet;
1393  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
1394  iDesc.add("userIsolation", isolationPSet);
1395 
1396  // Resolution configurables
1398 
1399  iDesc.add<bool>("embedHighLevelSelection", true)->setComment("embed high level selection");
1400  edm::ParameterSetDescription highLevelPSet;
1401  highLevelPSet.setAllowAnything();
1402  iDesc.addNode(edm::ParameterDescription<edm::InputTag>("beamLineSrc", edm::InputTag(), true))
1403  ->setComment("input with high level selection");
1405  ->setComment("input with high level selection");
1406 
1407  descriptions.add("PATElectronProducer", iDesc);
1408 }
1409 
1410 // embed various impact parameters with errors
1411 // embed high level selection
1416  bool primaryVertexIsValid,
1418  bool beamspotIsValid) {
1419  // Correct to PV
1420  // PV2D
1421  anElectron.setDB(track->dxy(primaryVertex.position()),
1422  track->dxyError(primaryVertex.position(), primaryVertex.covariance()),
1424 
1425  // PV3D
1426  std::pair<bool, Measurement1D> result =
1428  double d0_corr = result.second.value();
1429  double d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
1430  anElectron.setDB(d0_corr, d0_err, pat::Electron::PV3D);
1431 
1432  // Correct to beam spot
1433  // BS2D
1434  anElectron.setDB(track->dxy(beamspot), track->dxyError(beamspot), pat::Electron::BS2D);
1435 
1436  // make a fake vertex out of beam spot
1437  reco::Vertex vBeamspot(beamspot.position(), beamspot.covariance3D());
1438 
1439  // BS3D
1440  result = IPTools::signedImpactParameter3D(tt, GlobalVector(track->px(), track->py(), track->pz()), vBeamspot);
1441  d0_corr = result.second.value();
1442  d0_err = beamspotIsValid ? result.second.error() : -1.0;
1443  anElectron.setDB(d0_corr, d0_err, pat::Electron::BS3D);
1444 
1445  // PVDZ
1446  anElectron.setDB(
1447  track->dz(primaryVertex.position()), std::hypot(track->dzError(), primaryVertex.zError()), pat::Electron::PVDZ);
1448 }
1449 
void setMvaVariables(double sigmaIetaIphi, double ip3d)
set missing mva input variables
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
void setComment(std::string const &value)
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T >> cases)
void embedRecHits(const EcalRecHitCollection *rechits)
method to store the RecHits internally - can be called from the PATElectronProducer ...
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
void setP4(P4Kind kind, const LorentzVector &p4, float p4Error, bool setCandidate)
Definition: GsfElectron.cc:194
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:616
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
const edm::EDGetTokenT< reco::ConversionCollection > hConversionsToken_
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_charged_hadrons_
std::pair< pat::IsolationKeys, edm::InputTag > IsolationLabel
void setIsolation(IsolationKeys key, float value)
Definition: Lepton.h:115
const GreaterByPt< Electron > pTComparator_
void readIsolationLabels(const edm::ParameterSet &iConfig, const char *psetName, IsolationLabels &labels, std::vector< edm::EDGetTokenT< edm::ValueMap< T >>> &tokens)
bool contains(EventRange const &lh, EventID const &rh)
Definition: EventRange.cc:37
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_charged_hadrons_
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:55
const bool useParticleFlow_
pflow specific
void setElectronIDs(const std::vector< IdPair > &ids)
Store multiple electron ID values, discarding existing ones. The first one in the list becomes the &#39;d...
Definition: Electron.h:141
ProductID id() const
Accessor for product ID.
Definition: Ptr.h:162
const edm::EDGetTokenT< reco::PFCandidateCollection > pfElecToken_
const Point & position() const
position
Definition: BeamSpot.h:59
std::vector< double > miniIsoParamsE_
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
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_neutral_hadrons_
const edm::EDGetTokenT< edm::ValueMap< float > > ecalPFClusterIsoT_
std::vector< l1t::PFCandidate > PFCandidateCollection
Definition: PFCandidate.h:86
bool exists(std::string const &parameterName) const
checks if a parameter exists
void embedSuperCluster()
method to store the electron&#39;s SuperCluster internally
T const * product() const
Definition: Handle.h:70
std::vector< pat::PackedCandidate > PackedCandidateCollection
void embedHighLevel(pat::Electron &anElectron, reco::GsfTrackRef track, reco::TransientTrack &tt, reco::Vertex &primaryVertex, bool primaryVertexIsValid, reco::BeamSpot &beamspot, bool beamspotIsValid)
std::vector< EcalRecHit >::const_iterator const_iterator
std::pair< bool, Measurement1D > absoluteImpactParameter3D(const reco::TransientTrack &transientTrack, const reco::Vertex &vertex)
Definition: IPTools.cc:38
void setPFCandidateRef(const reco::PFCandidateRef &ref)
add a reference to the source IsolatedPFCandidate
Definition: Electron.h:179
const edm::InputTag reducedBarrelRecHitCollection_
void push_back(T const &t)
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
std::pair< bool, Measurement1D > signedImpactParameter3D(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:81
void embedGsfElectronCore()
method to store the electron&#39;s core internally
void setPassConversionVeto(bool flag)
Definition: Electron.h:257
edm::RefToBase< reco::GsfElectron > ElectronBaseRef
const edm::EDGetTokenT< edm::ValueMap< float > > hcalPFClusterIsoT_
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
Log< level::Error, false > LogError
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
PFCandidateCollection::const_iterator PFCandidateConstIterator
iterator
void setEcalDrivenMomentum(const Candidate::LorentzVector &mom)
Definition: Electron.h:204
assert(be >=bs)
std::vector< edm::EDGetTokenT< edm::ValueMap< float > > > elecIDTokens_
void setPfIsolationVariables(const PflowIsolationVariables &iso)
Definition: GsfElectron.h:738
const std::string names[nVars_]
const edm::ESGetToken< CaloTopology, CaloTopologyRecord > ecalTopologyToken_
const edm::EDGetTokenT< edm::View< reco::GsfElectron > > electronToken_
const bool addMVAVariables_
mva input variables
std::vector< double > miniIsoParamsB_
void embedPflowSuperCluster()
method to store the electron&#39;s PflowSuperCluster internally
reco::PFCandidateRef pfCandidateRef() const
reference to the source PFCandidates; null if this has been built from a standard electron ...
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:84
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
Definition: Lepton.h:191
Definition: HeavyIon.h:7
static void fillDescription(edm::ParameterSetDescription &iDesc)
reco::TransientTrack build(const reco::Track *p) const
const edm::EDGetTokenT< std::vector< reco::Vertex > > pvToken_
const edm::EDGetTokenT< edm::ValueMap< reco::PFCandidatePtr > > pfCandidateMapToken_
char const * label
void setComment(std::string const &value)
ESData get(edm::EventSetup const &eventSetup) const
const PflowIsolationVariables & pfIsolationVariables() const
Definition: GsfElectron.h:729
pat::helper::MultiIsolator isolator_
std::vector< edm::Handle< edm::Association< reco::GenParticleCollection > > > GenAssociations
void setDB(double dB, double edB, IPTYPE type)
Set impact parameter of a certain type and its uncertainty.
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_photons_
int iEvent
Definition: GenABIO.cc:224
Definition: TTTypes.h:54
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
Produces pat::Electron&#39;s.
void embedSeedCluster()
method to store the electron&#39;s seedcluster internally
PATElectronProducer(const edm::ParameterSet &iConfig)
const bool embedHighLevelSelection_
embed high level selection variables?
void embedGenParticle()
Definition: PATObject.h:768
void newEvent(const edm::Event &event, const edm::EventSetup &setup)
To be called for each new event, reads in the EventSetup object.
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:148
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
static bool hasMatchedConversion(const reco::GsfElectron &ele, const reco::ConversionCollection &convCol, const math::XYZPoint &beamspot, bool allowCkfMatch=true, float lxyMin=2.0, float probMin=1e-6, unsigned int nHitsBeforeVtxMax=0)
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
const PolarLorentzVector & polarP4() const final
four-momentum Lorentz vector
void setIsolationPUPPINoLeptons(float chargedhadrons_, float neutralhadrons_, float photons_)
sets PUPPINoLeptons isolations
Definition: Electron.h:167
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:180
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_neutral_hadrons_
const EcalClusterLazyTools::ESGetTokens ecalClusterToolsESGetTokens_
const edm::EDGetTokenT< EcalRecHitCollection > reducedEndcapRecHitCollectionToken_
key
prepare the HTCondor submission files and eventually submit them
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const edm::InputTag reducedEndcapRecHitCollection_
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
math::XYZPoint Point
point in the space
Definition: TrackBase.h:80
void embedPflowBasicClusters()
method to store the electron&#39;s pflow basic clusters
const LorentzVector & p4(P4Kind kind) const
Definition: GsfElectron.cc:217
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void embedBasicClusters()
method to store the electron&#39;s basic clusters
bool isNull() const
Checks for null.
Definition: Ref.h:229
std::pair< std::string, edm::InputTag > NameTag
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_photons_
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
void embedGsfTrack()
method to store the electron&#39;s GsfTrack internally
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void add(ObjectType &patObject, edm::Event const &iEvent, edm::EventSetup const &iSetup)
std::vector< Conversion > ConversionCollection
Definition: Conversion.h:13
Definition: DetId.h:17
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:17
const edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:751
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueNoPFIdTokens_
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
pat::helper::EfficiencyLoader efficiencyLoader_
const edm::EDGetTokenT< EcalRecHitCollection > reducedBarrelRecHitCollectionToken_
const edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > trackBuilderToken_
void setIsPF(bool hasPFCandidate)
Definition: Electron.h:174
bool isEE() const
Definition: GsfElectron.h:329
const edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > pfCandidateMultiMapToken_
pat::PATUserDataHelper< pat::Electron > userDataHelper_
void fillElectron2(Electron &anElectron, const reco::CandidatePtr &candPtrForIsolation, const reco::CandidatePtr &candPtrForGenMatch, const reco::CandidatePtr &candPtrForLoader, const GenAssociations &genMatches, const IsoDepositMaps &deposits, const IsolationValueMaps &isolationValues) const
Analysis-level electron class.
Definition: Electron.h:51
const CaloTopology * ecalTopology_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void setMiniPFIsolation(PFIsolation const &iso)
Definition: Lepton.h:217
IsolationLabels isolationValueLabelsNoPFId_
void setElectronMiniIso(pat::Electron &anElectron, const pat::PackedCandidateCollection *pc)
bool isValid() const
Definition: HandleBase.h:70
void embedPreshowerClusters()
method to store the electron&#39;s preshower clusters
std::vector< IsolationLabel > IsolationLabels
fixed size matrix
HLT enums.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:88
IsolationLabels isolationValueLabels_
Calculates a lepton&#39;s calorimetric isolation energy.
pat::helper::KinResolutionsLoader resolutionLoader_
PFIsolation getMiniPFIsolation(const pat::PackedCandidateCollection *pfcands, const reco::Candidate::PolarLorentzVector &p4, float mindr=0.05, float maxdr=0.2, float kt_scale=10.0, float ptthresh=0.5, float deadcone_ch=0.0001, float deadcone_pu=0.01, float deadcone_ph=0.01, float deadcone_nh=0.01, float dZ_cut=0.0)
void embedPflowPreshowerClusters()
method to store the electron&#39;s pflow preshower clusters
edm::Ref< l1t::PFCandidateCollection > PFCandidateRef
Definition: PFCandidate.h:87
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
void embedTrack()
method to store the electron&#39;s Track internally
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
primaryVertex
hltOfflineBeamSpot for HLTMON
edm::Ptr< PFCandidate > PFCandidatePtr
persistent Ptr to a PFCandidate
void setIsolationPUPPI(float chargedhadrons_, float neutralhadrons_, float photons_)
sets PUPPI isolations
Definition: Electron.h:161
static std::string const source
Definition: EdmProvDump.cc:49
edm::EDGetTokenT< pat::PackedCandidateCollection > pcToken_
def move(src, dest)
Definition: eostools.py:511
void embedPFCandidate()
embed the PFCandidate pointed to by pfCandidateRef_
void fillElectron(Electron &aElectron, const ElectronBaseRef &electronRef, const reco::CandidateBaseRef &baseRef, const GenAssociations &genMatches, const IsoDepositMaps &deposits, const bool pfId, const IsolationValueMaps &isolationValues, const IsolationValueMaps &isolationValuesNoPFId) const
common electron filling, for both the standard and PF2PAT case
Global3DVector GlobalVector
Definition: GlobalVector.h:10
Calculates a lepton&#39;s tracker isolation pt.
std::vector< NameTag > elecIDSrcs_