CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PATElectronProducer.cc
Go to the documentation of this file.
1 //
3 
7 
12 
15 
18 
21 
22 
25 
30 
39 
41 
42 #include <vector>
43 #include <memory>
44 
45 
46 using namespace pat;
47 using namespace std;
48 
49 
51  isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), consumesCollector(), false) ,
52  useUserData_(iConfig.exists("userData"))
53 {
54  // general configurables
55  electronToken_ = consumes<edm::View<reco::GsfElectron> >(iConfig.getParameter<edm::InputTag>( "electronSource" ));
56  hConversionsToken_ = consumes<reco::ConversionCollection>(edm::InputTag("allConversions"));
57  embedGsfElectronCore_ = iConfig.getParameter<bool>( "embedGsfElectronCore" );
58  embedGsfTrack_ = iConfig.getParameter<bool>( "embedGsfTrack" );
59  embedSuperCluster_ = iConfig.getParameter<bool> ( "embedSuperCluster" );
60  embedPflowSuperCluster_ = iConfig.getParameter<bool> ( "embedPflowSuperCluster" );
61  embedSeedCluster_ = iConfig.getParameter<bool>( "embedSeedCluster" );
62  embedBasicClusters_ = iConfig.getParameter<bool>( "embedBasicClusters" );
63  embedPreshowerClusters_ = iConfig.getParameter<bool>( "embedPreshowerClusters" );
64  embedPflowBasicClusters_ = iConfig.getParameter<bool>( "embedPflowBasicClusters" );
65  embedPflowPreshowerClusters_ = iConfig.getParameter<bool>( "embedPflowPreshowerClusters" );
66  embedTrack_ = iConfig.getParameter<bool>( "embedTrack" );
67  embedRecHits_ = iConfig.getParameter<bool>( "embedRecHits" );
68  // pflow configurables
69  pfElecToken_ = consumes<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag>( "pfElectronSource" ));
70  pfCandidateMapToken_ = mayConsume<edm::ValueMap<reco::PFCandidatePtr> >(iConfig.getParameter<edm::InputTag>( "pfCandidateMap" ));
71  useParticleFlow_ = iConfig.getParameter<bool>( "useParticleFlow" );
72  embedPFCandidate_ = iConfig.getParameter<bool>( "embedPFCandidate" );
73  // mva input variables
74  reducedBarrelRecHitCollection_ = iConfig.getParameter<edm::InputTag>("reducedBarrelRecHitCollection");
75  reducedBarrelRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedBarrelRecHitCollection_);
76  reducedEndcapRecHitCollection_ = iConfig.getParameter<edm::InputTag>("reducedEndcapRecHitCollection");
77  reducedEndcapRecHitCollectionToken_ = mayConsume<EcalRecHitCollection>(reducedEndcapRecHitCollection_);
78  // MC matching configurables (scheduled mode)
79  addGenMatch_ = iConfig.getParameter<bool>( "addGenMatch" );
80  if (addGenMatch_) {
81  embedGenMatch_ = iConfig.getParameter<bool>( "embedGenMatch" );
82  if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
84  }
85  else {
86  genMatchTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >( "genParticleMatch" ), [this](edm::InputTag const & tag){return consumes<edm::Association<reco::GenParticleCollection> >(tag);});
87  }
88  }
89  // resolution configurables
90  addResolutions_ = iConfig.getParameter<bool>( "addResolutions" );
91  if (addResolutions_) {
92  resolutionLoader_ = pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"));
93  }
94  // electron ID configurables
95  addElecID_ = iConfig.getParameter<bool>( "addElectronID" );
96  if (addElecID_) {
97  // it might be a single electron ID
98  if (iConfig.existsAs<edm::InputTag>("electronIDSource")) {
99  elecIDSrcs_.push_back(NameTag("", iConfig.getParameter<edm::InputTag>("electronIDSource")));
100  }
101  // or there might be many of them
102  if (iConfig.existsAs<edm::ParameterSet>("electronIDSources")) {
103  // please don't configure me twice
104  if (!elecIDSrcs_.empty()){
105  throw cms::Exception("Configuration") << "PATElectronProducer: you can't specify both 'electronIDSource' and 'electronIDSources'\n";
106  }
107  // read the different electron ID names
108  edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("electronIDSources");
109  std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
110  for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
111  elecIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
112  }
113  }
114  // but in any case at least once
115  if (elecIDSrcs_.empty()){
116  throw cms::Exception("Configuration") <<
117  "PATElectronProducer: id addElectronID is true, you must specify either:\n" <<
118  "\tInputTag electronIDSource = <someTag>\n" << "or\n" <<
119  "\tPSet electronIDSources = { \n" <<
120  "\t\tInputTag <someName> = <someTag> // as many as you want \n " <<
121  "\t}\n";
122  }
123  }
124  elecIDTokens_ = edm::vector_transform(elecIDSrcs_, [this](NameTag const & tag){return mayConsume<edm::ValueMap<float> >(tag.second);});
125  // construct resolution calculator
126 
127  // // IsoDeposit configurables
128  // if (iConfig.exists("isoDeposits")) {
129  // edm::ParameterSet depconf = iConfig.getParameter<edm::ParameterSet>("isoDeposits");
130  // if (depconf.exists("tracker")) isoDepositLabels_.push_back(std::make_pair(TrackerIso, depconf.getParameter<edm::InputTag>("tracker")));
131  // if (depconf.exists("ecal")) isoDepositLabels_.push_back(std::make_pair(ECalIso, depconf.getParameter<edm::InputTag>("ecal")));
132  // if (depconf.exists("hcal")) isoDepositLabels_.push_back(std::make_pair(HCalIso, depconf.getParameter<edm::InputTag>("hcal")));
133 
134 
135  // if (depconf.exists("user")) {
136  // std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag> >("user");
137  // std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
138  // int key = UserBaseIso;
139  // for ( ; it != ed; ++it, ++key) {
140  // isoDepositLabels_.push_back(std::make_pair(IsolationKeys(key), *it));
141  // }
142  // }
143  // }
144  // isoDepositTokens_ = edm::vector_transform(isoDepositLabels_, [this](std::pair<IsolationKeys,edm::InputTag> const & label){return consumes<edm::ValueMap<IsoDeposit> >(label.second);});
145 
146  // read isoDeposit labels, for direct embedding
147  readIsolationLabels(iConfig, "isoDeposits", isoDepositLabels_, isoDepositTokens_);
148  // read isolation value labels, for direct embedding
149  readIsolationLabels(iConfig, "isolationValues", isolationValueLabels_, isolationValueTokens_);
150  // read isolation value labels for non PF identified electron, for direct embedding
151  readIsolationLabels(iConfig, "isolationValuesNoPFId", isolationValueLabelsNoPFId_, isolationValueNoPFIdTokens_);
152  // Efficiency configurables
153  addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
154  if (addEfficiencies_) {
155  efficiencyLoader_ = pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"), consumesCollector());
156  }
157  // Check to see if the user wants to add user data
158  if ( useUserData_ ) {
159  userDataHelper_ = PATUserDataHelper<Electron>(iConfig.getParameter<edm::ParameterSet>("userData"), consumesCollector());
160  }
161  // embed high level selection variables?
162  embedHighLevelSelection_ = iConfig.getParameter<bool>("embedHighLevelSelection");
163  beamLineToken_ = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamLineSrc"));
164  if ( embedHighLevelSelection_ ) {
165  usePV_ = iConfig.getParameter<bool>("usePV");
166  pvToken_ = consumes<std::vector<reco::Vertex> >(iConfig.getParameter<edm::InputTag>("pvSrc"));
167  }
168  // produces vector of muons
169  produces<std::vector<Electron> >();
170  }
171 
172 
173  PATElectronProducer::~PATElectronProducer()
174 {
175 }
176 
177 
179 {
180  // switch off embedding (in unschedules mode)
181  if (iEvent.isRealData()){
182  addGenMatch_ = false;
183  embedGenMatch_ = false;
184  }
185 
186  edm::ESHandle<CaloTopology> theCaloTopology;
187  iSetup.get<CaloTopologyRecord>().get(theCaloTopology);
188  ecalTopology_ = & (*theCaloTopology);
189 
190  // Get the collection of electrons from the event
192  iEvent.getByToken(electronToken_, electrons);
193 
194  // for additional mva variables
195  edm::InputTag reducedEBRecHitCollection(string("reducedEcalRecHitsEB"));
196  edm::InputTag reducedEERecHitCollection(string("reducedEcalRecHitsEE"));
197  //EcalClusterLazyTools lazyTools(iEvent, iSetup, reducedEBRecHitCollection, reducedEERecHitCollection);
199 
200  // for conversion veto selection
202  iEvent.getByToken(hConversionsToken_, hConversions);
203 
204  // Get the ESHandle for the transient track builder, if needed for
205  // high level selection embedding
207 
208  if (isolator_.enabled()) isolator_.beginEvent(iEvent,iSetup);
209 
211  if (resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
212 
213  IsoDepositMaps deposits(isoDepositTokens_.size());
214  for (size_t j = 0, nd = isoDepositTokens_.size(); j < nd; ++j) {
215  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
216  }
217 
218  IsolationValueMaps isolationValues(isolationValueTokens_.size());
219  for (size_t j = 0; j<isolationValueTokens_.size(); ++j) {
220  iEvent.getByToken(isolationValueTokens_[j], isolationValues[j]);
221  }
222 
223  IsolationValueMaps isolationValuesNoPFId(isolationValueNoPFIdTokens_.size());
224  for (size_t j = 0; j<isolationValueNoPFIdTokens_.size(); ++j) {
225  iEvent.getByToken(isolationValueNoPFIdTokens_[j], isolationValuesNoPFId[j]);
226  }
227 
228  // prepare the MC matching
229  GenAssociations genMatches(genMatchTokens_.size());
230  if (addGenMatch_) {
231  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
232  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
233  }
234  }
235 
236  // prepare ID extraction
237  std::vector<edm::Handle<edm::ValueMap<float> > > idhandles;
238  std::vector<pat::Electron::IdPair> ids;
239  if (addElecID_) {
240  idhandles.resize(elecIDSrcs_.size());
241  ids.resize(elecIDSrcs_.size());
242  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
243  iEvent.getByToken(elecIDTokens_[i], idhandles[i]);
244  ids[i].first = elecIDSrcs_[i].first;
245  }
246  }
247 
248 
249  // prepare the high level selection:
250  // needs beamline
251  reco::TrackBase::Point beamPoint(0,0,0);
254  bool beamSpotIsValid = false;
255  bool primaryVertexIsValid = false;
256 
257  // Get the beamspot
258  edm::Handle<reco::BeamSpot> beamSpotHandle;
259  iEvent.getByToken(beamLineToken_, beamSpotHandle);
260 
261  if ( embedHighLevelSelection_ ) {
262  // Get the primary vertex
264  iEvent.getByToken( pvToken_, pvHandle );
265 
266  // This is needed by the IPTools methods from the tracking group
267  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder", trackBuilder);
268 
269  if ( ! usePV_ ) {
270 
271  if ( beamSpotHandle.isValid() ){
272  beamSpot = *beamSpotHandle;
273  beamSpotIsValid = true;
274  } else{
275  edm::LogError("DataNotAvailable")
276  << "No beam spot available from EventSetup, not adding high level selection \n";
277  }
278 
279  double x0 = beamSpot.x0();
280  double y0 = beamSpot.y0();
281  double z0 = beamSpot.z0();
282 
283  beamPoint = reco::TrackBase::Point ( x0, y0, z0 );
284  } else {
285  if ( pvHandle.isValid() && !pvHandle->empty() ) {
286  primaryVertex = pvHandle->at(0);
287  primaryVertexIsValid = true;
288  } else {
289  edm::LogError("DataNotAvailable")
290  << "No primary vertex available from EventSetup, not adding high level selection \n";
291  }
292  }
293  }
294 
295  std::vector<Electron> * patElectrons = new std::vector<Electron>();
296 
297  if( useParticleFlow_ ) {
299  iEvent.getByToken(pfElecToken_, pfElectrons);
300  unsigned index=0;
301 
302  for( reco::PFCandidateConstIterator i = pfElectrons->begin();
303  i != pfElectrons->end(); ++i, ++index) {
304 
305  reco::PFCandidateRef pfRef(pfElectrons, index);
306  reco::PFCandidatePtr ptrToPFElectron(pfElectrons,index);
307 // reco::CandidateBaseRef pfBaseRef( pfRef );
308 
309  reco::GsfTrackRef PfTk= i->gsfTrackRef();
310 
311  bool Matched=false;
312  bool MatchedToAmbiguousGsfTrack=false;
313  for (edm::View<reco::GsfElectron>::const_iterator itElectron = electrons->begin(); itElectron != electrons->end(); ++itElectron) {
314  unsigned int idx = itElectron - electrons->begin();
315  if (Matched || MatchedToAmbiguousGsfTrack) continue;
316 
317  reco::GsfTrackRef EgTk= itElectron->gsfTrack();
318 
319  if (itElectron->gsfTrack()==i->gsfTrackRef()){
320  Matched=true;
321  }
322  else {
323  for( reco::GsfTrackRefVector::const_iterator it = itElectron->ambiguousGsfTracksBegin() ;
324  it!=itElectron->ambiguousGsfTracksEnd(); it++ ){
325  MatchedToAmbiguousGsfTrack |= (bool)(i->gsfTrackRef()==(*it));
326  }
327  }
328 
329  if (Matched || MatchedToAmbiguousGsfTrack){
330 
331  // ptr needed for finding the matched gen particle
332  reco::CandidatePtr ptrToGsfElectron(electrons,idx);
333 
334  // ref to base needed for the construction of the pat object
335  const edm::RefToBase<reco::GsfElectron>& elecsRef = electrons->refAt(idx);
336  Electron anElectron(elecsRef);
337  anElectron.setPFCandidateRef( pfRef );
338 
339  //it should be always true when particleFlow electrons are used.
340  anElectron.setIsPF( true );
341 
342  if( embedPFCandidate_ ) anElectron.embedPFCandidate();
343 
344  if ( useUserData_ ) {
345  userDataHelper_.add( anElectron, iEvent, iSetup );
346  }
347 
348  double ip3d = -999; // for mva variable
349 
350  // embed high level selection
351  if ( embedHighLevelSelection_ ) {
352  // get the global track
353  reco::GsfTrackRef track = PfTk;
354 
355  // Make sure the collection it points to is there
356  if ( track.isNonnull() && track.isAvailable() ) {
357 
358  reco::TransientTrack tt = trackBuilder->build(track);
359  embedHighLevel( anElectron,
360  track,
361  tt,
362  primaryVertex,
363  primaryVertexIsValid,
364  beamSpot,
365  beamSpotIsValid );
366 
367  std::pair<bool,Measurement1D> ip3dpv = IPTools::absoluteImpactParameter3D(tt, primaryVertex);
368  ip3d = ip3dpv.second.value(); // for mva variable
369 
370  if ( !usePV_ ) {
371  double corr_d0 = track->dxy( beamPoint );
372  anElectron.setDB( corr_d0, -1.0 );
373  } else {
374  std::pair<bool,Measurement1D> result = IPTools::absoluteTransverseImpactParameter(tt, primaryVertex);
375  double d0_corr = result.second.value();
376  double d0_err = result.second.error();
377  anElectron.setDB( d0_corr, d0_err );
378  }
379  }
380  }
381 
382  //Electron Id
383 
384  if (addElecID_) {
385  //STANDARD EL ID
386  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
387  ids[i].second = (*idhandles[i])[elecsRef];
388  }
389  //SPECIFIC PF ID
390  ids.push_back(std::make_pair("pf_evspi",pfRef->mva_e_pi()));
391  ids.push_back(std::make_pair("pf_evsmu",pfRef->mva_e_mu()));
392  anElectron.setElectronIDs(ids);
393  }
394 
395  // add missing mva variables
396  std::vector<float> vCov = lazyTools.localCovariances(*( itElectron->superCluster()->seed()));
397  anElectron.setMvaVariables(vCov[1], ip3d);
398 
399  std::vector<DetId> selectedCells;
400  bool barrel = itElectron->isEB();
401  //loop over sub clusters
402  if (embedBasicClusters_) {
403  for (reco::CaloCluster_iterator clusIt = itElectron->superCluster()->clustersBegin(); clusIt!=itElectron->superCluster()->clustersEnd(); ++clusIt) {
404  //get seed (max energy xtal)
405  DetId seed = lazyTools.getMaximum(**clusIt).first;
406  //get all xtals in 5x5 window around the seed
407  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
409  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
410 
411  //get all xtals belonging to cluster
412  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
413  selectedCells.push_back(hit.first);
414  }
415  }
416  }
417 
418  if (embedPflowBasicClusters_ && itElectron->parentSuperCluster().isNonnull()) {
419  for (reco::CaloCluster_iterator clusIt = itElectron->parentSuperCluster()->clustersBegin(); clusIt!=itElectron->parentSuperCluster()->clustersEnd(); ++clusIt) {
420  //get seed (max energy xtal)
421  DetId seed = lazyTools.getMaximum(**clusIt).first;
422  //get all xtals in 5x5 window around the seed
423  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
425  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
426 
427  //get all xtals belonging to cluster
428  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
429  selectedCells.push_back(hit.first);
430  }
431  }
432  }
433 
434  //remove duplicates
435  std::sort(selectedCells.begin(),selectedCells.end());
436  std::unique(selectedCells.begin(),selectedCells.end());
437 
438 
439  // Retrieve the corresponding RecHits
440 
442  if(barrel)
444  else
446 
447  EcalRecHitCollection selectedRecHits;
448  const EcalRecHitCollection *recHits = rechitsH.product();
449 
450  unsigned nSelectedCells = selectedCells.size();
451  for (unsigned icell = 0 ; icell < nSelectedCells ; ++icell) {
452  EcalRecHitCollection::const_iterator it = recHits->find( selectedCells[icell] );
453  if ( it != recHits->end() ) {
454  selectedRecHits.push_back(*it);
455  }
456  }
457  selectedRecHits.sort();
458  if (embedRecHits_) anElectron.embedRecHits(& selectedRecHits);
459 
460  // set conversion veto selection
461  bool passconversionveto = false;
462  if( hConversions.isValid()){
463  // this is recommended method
464  passconversionveto = !ConversionTools::hasMatchedConversion( *itElectron, hConversions, beamSpotHandle->position());
465  }else{
466  // use missing hits without vertex fit method
467  passconversionveto = itElectron->gsfTrack()->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS) < 1;
468  }
469 
470  anElectron.setPassConversionVeto( passconversionveto );
471 
472 
473 // fillElectron(anElectron,elecsRef,pfBaseRef,
474 // genMatches, deposits, isolationValues);
475 
476  //COLIN small warning !
477  // we are currently choosing to take the 4-momentum of the PFCandidate;
478  // the momentum of the GsfElectron is saved though
479  // we must therefore match the GsfElectron.
480  // because of this, we should not change the source of the electron matcher
481  // to the collection of PFElectrons in the python configuration
482  // I don't know what to do with the efficiencyLoader, since I don't know
483  // what this class is for.
484  fillElectron2( anElectron,
485  ptrToPFElectron,
486  ptrToGsfElectron,
487  ptrToGsfElectron,
488  genMatches, deposits, isolationValues );
489 
490  //COLIN need to use fillElectron2 in the non-pflow case as well, and to test it.
491 
492  patElectrons->push_back(anElectron);
493  }
494  }
495  //if( !Matched && !MatchedToAmbiguousGsfTrack) std::cout << "!!!!A pf electron could not be matched to a gsf!!!!" << std::endl;
496  }
497  }
498 
499  else{
500  // Try to access PF electron collection
502  bool valMapPresent = iEvent.getByToken(pfCandidateMapToken_,ValMapH);
503  // Try to access a PFCandidate collection, as supplied by the user
505  bool pfCandsPresent = iEvent.getByToken(pfElecToken_, pfElectrons);
506 
507  for (edm::View<reco::GsfElectron>::const_iterator itElectron = electrons->begin(); itElectron != electrons->end(); ++itElectron) {
508  // construct the Electron from the ref -> save ref to original object
509  //FIXME: looks like a lot of instances could be turned into const refs
510  unsigned int idx = itElectron - electrons->begin();
511  edm::RefToBase<reco::GsfElectron> elecsRef = electrons->refAt(idx);
512  reco::CandidateBaseRef elecBaseRef(elecsRef);
513  Electron anElectron(elecsRef);
514 
515  // Is this GsfElectron also identified as an e- in the particle flow?
516  bool pfId = false;
517 
518  if ( pfCandsPresent ) {
519  // PF electron collection not available.
520  const reco::GsfTrackRef& trkRef = itElectron->gsfTrack();
521  int index = 0;
522  for( reco::PFCandidateConstIterator ie = pfElectrons->begin();
523  ie != pfElectrons->end(); ++ie, ++index) {
524  if(ie->particleId()!=reco::PFCandidate::e) continue;
525  const reco::GsfTrackRef& pfTrkRef= ie->gsfTrackRef();
526  if( trkRef == pfTrkRef ) {
527  pfId = true;
528  reco::PFCandidateRef pfRef(pfElectrons, index);
529  anElectron.setPFCandidateRef( pfRef );
530  break;
531  }
532  }
533  }
534  else if( valMapPresent ) {
535  // use value map if PF collection not available
536  const edm::ValueMap<reco::PFCandidatePtr> & myValMap(*ValMapH);
537  // Get the PFCandidate
538  const reco::PFCandidatePtr& pfElePtr(myValMap[elecsRef]);
539  pfId= pfElePtr.isNonnull();
540  }
541  // set PFId function
542  anElectron.setIsPF( pfId );
543 
544  // add resolution info
545 
546  // Isolation
547  if (isolator_.enabled()) {
548  isolator_.fill(*electrons, idx, isolatorTmpStorage_);
549  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
550  // better to loop backwards, so the vector is resized less times
551  for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(), ed = isolatorTmpStorage_.rend(); it != ed; ++it) {
552  anElectron.setIsolation(it->first, it->second);
553  }
554  }
555 
556  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
557  anElectron.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[elecsRef]);
558  }
559 
560  // add electron ID info
561  if (addElecID_) {
562  for (size_t i = 0; i < elecIDSrcs_.size(); ++i) {
563  ids[i].second = (*idhandles[i])[elecsRef];
564  }
565  anElectron.setElectronIDs(ids);
566  }
567 
568 
569  if ( useUserData_ ) {
570  userDataHelper_.add( anElectron, iEvent, iSetup );
571  }
572 
573 
574  double ip3d = -999; //for mva variable
575 
576  // embed high level selection
577  if ( embedHighLevelSelection_ ) {
578  // get the global track
579  reco::GsfTrackRef track = itElectron->gsfTrack();
580 
581  // Make sure the collection it points to is there
582  if ( track.isNonnull() && track.isAvailable() ) {
583 
584  reco::TransientTrack tt = trackBuilder->build(track);
585  embedHighLevel( anElectron,
586  track,
587  tt,
588  primaryVertex,
589  primaryVertexIsValid,
590  beamSpot,
591  beamSpotIsValid );
592 
593  std::pair<bool,Measurement1D> ip3dpv = IPTools::absoluteImpactParameter3D(tt, primaryVertex);
594  ip3d = ip3dpv.second.value(); // for mva variable
595 
596  if ( !usePV_ ) {
597  double corr_d0 = track->dxy( beamPoint );
598  anElectron.setDB( corr_d0, -1.0 );
599  } else {
600  std::pair<bool,Measurement1D> result = IPTools::absoluteTransverseImpactParameter(tt, primaryVertex);
601  double d0_corr = result.second.value();
602  double d0_err = result.second.error();
603  anElectron.setDB( d0_corr, d0_err );
604  }
605  }
606  }
607 
608  // add mva variables
609  std::vector<float> vCov = lazyTools.localCovariances(*( itElectron->superCluster()->seed()));
610  anElectron.setMvaVariables(vCov[1], ip3d);
611 
612  std::vector<DetId> selectedCells;
613  bool barrel = itElectron->isEB();
614  //loop over sub clusters
615  if (embedBasicClusters_) {
616  for (reco::CaloCluster_iterator clusIt = itElectron->superCluster()->clustersBegin(); clusIt!=itElectron->superCluster()->clustersEnd(); ++clusIt) {
617  //get seed (max energy xtal)
618  DetId seed = lazyTools.getMaximum(**clusIt).first;
619  //get all xtals in 5x5 window around the seed
620  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
622  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
623 
624  //get all xtals belonging to cluster
625  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
626  selectedCells.push_back(hit.first);
627  }
628  }
629  }
630 
631  if (embedPflowBasicClusters_ && itElectron->parentSuperCluster().isNonnull()) {
632  for (reco::CaloCluster_iterator clusIt = itElectron->parentSuperCluster()->clustersBegin(); clusIt!=itElectron->parentSuperCluster()->clustersEnd(); ++clusIt) {
633  //get seed (max energy xtal)
634  DetId seed = lazyTools.getMaximum(**clusIt).first;
635  //get all xtals in 5x5 window around the seed
636  std::vector<DetId> dets5x5 = (barrel) ? ecalTopology_->getSubdetectorTopology(DetId::Ecal,EcalBarrel)->getWindow(seed,5,5):
638  selectedCells.insert(selectedCells.end(), dets5x5.begin(), dets5x5.end());
639 
640  //get all xtals belonging to cluster
641  for (const std::pair<DetId, float> &hit : (*clusIt)->hitsAndFractions()) {
642  selectedCells.push_back(hit.first);
643  }
644  }
645  }
646 
647  //remove duplicates
648  std::sort(selectedCells.begin(),selectedCells.end());
649  std::unique(selectedCells.begin(),selectedCells.end());
650 
651  // Retrieve the corresponding RecHits
652 
654  if(barrel)
656  else
658 
659  EcalRecHitCollection selectedRecHits;
660  const EcalRecHitCollection *recHits = rechitsH.product();
661 
662  unsigned nSelectedCells = selectedCells.size();
663  for (unsigned icell = 0 ; icell < nSelectedCells ; ++icell) {
664  EcalRecHitCollection::const_iterator it = recHits->find( selectedCells[icell] );
665  if ( it != recHits->end() ) {
666  selectedRecHits.push_back(*it);
667  }
668  }
669  selectedRecHits.sort();
670  if (embedRecHits_) anElectron.embedRecHits(& selectedRecHits);
671 
672  // set conversion veto selection
673  bool passconversionveto = false;
674  if( hConversions.isValid()){
675  // this is recommended method
676  passconversionveto = !ConversionTools::hasMatchedConversion( *itElectron, hConversions, beamSpotHandle->position());
677  }else{
678  // use missing hits without vertex fit method
679  passconversionveto = itElectron->gsfTrack()->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS) < 1;
680  }
681  anElectron.setPassConversionVeto( passconversionveto );
682 
683  // add sel to selected
684  fillElectron( anElectron, elecsRef,elecBaseRef,
685  genMatches, deposits, pfId, isolationValues, isolationValuesNoPFId);
686  patElectrons->push_back(anElectron);
687  }
688  }
689 
690  // sort electrons in pt
691  std::sort(patElectrons->begin(), patElectrons->end(), pTComparator_);
692 
693  // add the electrons to the event output
694  std::auto_ptr<std::vector<Electron> > ptr(patElectrons);
695  iEvent.put(ptr);
696 
697  // clean up
699 
700 }
701 
703  const edm::RefToBase<reco::GsfElectron>& elecRef,
704  const reco::CandidateBaseRef& baseRef,
705  const GenAssociations& genMatches,
706  const IsoDepositMaps& deposits,
707  const bool pfId,
708  const IsolationValueMaps& isolationValues,
709  const IsolationValueMaps& isolationValuesNoPFId
710  ) const {
711 
712  //COLIN: might want to use the PFCandidate 4-mom. Which one is in use now?
713  // if (useParticleFlow_)
714  // aMuon.setP4( aMuon.pfCandidateRef()->p4() );
715 
716  //COLIN:
717  //In the embedding case, the reference cannot be used to look into a value map.
718  //therefore, one has to had the PFCandidateRef to this function, which becomes a bit
719  //too much specific.
720 
721  // in fact, this function needs a baseref or ptr for genmatch
722  // and a baseref or ptr for isodeposits and isolationvalues.
723  // baseref is not needed
724  // the ptrForIsolation and ptrForMatching should be defined upstream.
725 
726  // is the concrete elecRef needed for the efficiency loader? what is this loader?
727  // how can we make it compatible with the particle flow electrons?
728 
730  if (embedGsfTrack_) anElectron.embedGsfTrack();
731  if (embedSuperCluster_) anElectron.embedSuperCluster();
733  if (embedSeedCluster_) anElectron.embedSeedCluster();
734  if (embedBasicClusters_) anElectron.embedBasicClusters();
738  if (embedTrack_) anElectron.embedTrack();
739 
740  // store the match to the generated final state muons
741  if (addGenMatch_) {
742  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
743  if(useParticleFlow_) {
744  reco::GenParticleRef genElectron = (*genMatches[i])[anElectron.pfCandidateRef()];
745  anElectron.addGenParticleRef(genElectron);
746  }
747  else {
748  reco::GenParticleRef genElectron = (*genMatches[i])[elecRef];
749  anElectron.addGenParticleRef(genElectron);
750  }
751  }
752  if (embedGenMatch_) anElectron.embedGenParticle();
753  }
754 
755  if (efficiencyLoader_.enabled()) {
756  efficiencyLoader_.setEfficiencies( anElectron, elecRef );
757  }
758 
759  if (resolutionLoader_.enabled()) {
760  resolutionLoader_.setResolutions(anElectron);
761  }
762 
763  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
764  if(useParticleFlow_) {
765 
766  reco::PFCandidateRef pfcandref = anElectron.pfCandidateRef();
767  assert(!pfcandref.isNull());
768  reco::CandidatePtr source = pfcandref->sourceCandidatePtr(0);
770  (*deposits[j])[source]);
771  }
772  else
774  (*deposits[j])[elecRef]);
775  }
776 
777  for (size_t j = 0; j<isolationValues.size(); ++j) {
778  if(useParticleFlow_) {
779  reco::CandidatePtr source = anElectron.pfCandidateRef()->sourceCandidatePtr(0);
781  (*isolationValues[j])[source]);
782  }
783  else
784  if(pfId){
785  anElectron.setIsolation(isolationValueLabels_[j].first,(*isolationValues[j])[elecRef]);
786  }
787  }
788 
789  //for electrons not identified as PF electrons
790  for (size_t j = 0; j<isolationValuesNoPFId.size(); ++j) {
791  if( !pfId) {
792  anElectron.setIsolation(isolationValueLabelsNoPFId_[j].first,(*isolationValuesNoPFId[j])[elecRef]);
793  }
794  }
795 
796 }
797 
799  const reco::CandidatePtr& candPtrForIsolation,
800  const reco::CandidatePtr& candPtrForGenMatch,
801  const reco::CandidatePtr& candPtrForLoader,
802  const GenAssociations& genMatches,
803  const IsoDepositMaps& deposits,
804  const IsolationValueMaps& isolationValues) const {
805 
806  //COLIN/Florian: use the PFCandidate 4-mom.
807  anElectron.setEcalDrivenMomentum(anElectron.p4()) ;
808  anElectron.setP4( anElectron.pfCandidateRef()->p4() );
809 
810 
811  // is the concrete elecRef needed for the efficiency loader? what is this loader?
812  // how can we make it compatible with the particle flow electrons?
813 
815  if (embedGsfTrack_) anElectron.embedGsfTrack();
816  if (embedSuperCluster_) anElectron.embedSuperCluster();
818  if (embedSeedCluster_) anElectron.embedSeedCluster();
819  if (embedBasicClusters_) anElectron.embedBasicClusters();
823  if (embedTrack_) anElectron.embedTrack();
824 
825  // store the match to the generated final state muons
826 
827  if (addGenMatch_) {
828  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
829  reco::GenParticleRef genElectron = (*genMatches[i])[candPtrForGenMatch];
830  anElectron.addGenParticleRef(genElectron);
831  }
832  if (embedGenMatch_) anElectron.embedGenParticle();
833  }
834 
835  //COLIN what's this? does it have to be GsfElectron specific?
836  if (efficiencyLoader_.enabled()) {
837  efficiencyLoader_.setEfficiencies( anElectron, candPtrForLoader );
838  }
839 
840  if (resolutionLoader_.enabled()) {
841  resolutionLoader_.setResolutions(anElectron);
842  }
843 
844  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
848  deposits[j]->contains(candPtrForGenMatch.id())) {
850  (*deposits[j])[candPtrForGenMatch]);
851  }
852  else if (deposits[j]->contains(candPtrForIsolation.id())) {
854  (*deposits[j])[candPtrForIsolation]);
855  }
856  else {
858  (*deposits[j])[candPtrForIsolation->sourceCandidatePtr(0)]);
859  }
860  }
861 
862  for (size_t j = 0; j<isolationValues.size(); ++j) {
866  isolationValues[j]->contains(candPtrForGenMatch.id())) {
868  (*isolationValues[j])[candPtrForGenMatch]);
869  }
870  else if (isolationValues[j]->contains(candPtrForIsolation.id())) {
872  (*isolationValues[j])[candPtrForIsolation]);
873  }
874  else {
876  (*isolationValues[j])[candPtrForIsolation->sourceCandidatePtr(0)]);
877  }
878  }
879 }
880 
881 
882 // ParameterSet description for module
884 {
886  iDesc.setComment("PAT electron producer module");
887 
888  // input source
889  iDesc.add<edm::InputTag>("pfCandidateMap", edm::InputTag("no default"))->setComment("input collection");
890  iDesc.add<edm::InputTag>("electronSource", edm::InputTag("no default"))->setComment("input collection");
891 
892  // embedding
893  iDesc.add<bool>("embedGsfElectronCore", true)->setComment("embed external gsf electron core");
894  iDesc.add<bool>("embedGsfTrack", true)->setComment("embed external gsf track");
895  iDesc.add<bool>("embedSuperCluster", true)->setComment("embed external super cluster");
896  iDesc.add<bool>("embedPflowSuperCluster", true)->setComment("embed external super cluster");
897  iDesc.add<bool>("embedSeedCluster", true)->setComment("embed external seed cluster");
898  iDesc.add<bool>("embedBasicClusters", true)->setComment("embed external basic clusters");
899  iDesc.add<bool>("embedPreshowerClusters", true)->setComment("embed external preshower clusters");
900  iDesc.add<bool>("embedPflowBasicClusters", true)->setComment("embed external pflow basic clusters");
901  iDesc.add<bool>("embedPflowPreshowerClusters", true)->setComment("embed external pflow preshower clusters");
902  iDesc.add<bool>("embedTrack", false)->setComment("embed external track");
903  iDesc.add<bool>("embedRecHits", true)->setComment("embed external RecHits");
904 
905  // pf specific parameters
906  iDesc.add<edm::InputTag>("pfElectronSource", edm::InputTag("pfElectrons"))->setComment("particle flow input collection");
907  iDesc.add<bool>("useParticleFlow", false)->setComment("whether to use particle flow or not");
908  iDesc.add<bool>("embedPFCandidate", false)->setComment("embed external particle flow object");
909 
910  // MC matching configurables
911  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
912  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
913  std::vector<edm::InputTag> emptySourceVector;
914  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
915  edm::ParameterDescription<std::vector<edm::InputTag> >("genParticleMatch", emptySourceVector, true)
916  )->setComment("input with MC match information");
917 
918  // electron ID configurables
919  iDesc.add<bool>("addElectronID",true)->setComment("add electron ID variables");
920  edm::ParameterSetDescription electronIDSourcesPSet;
921  electronIDSourcesPSet.setAllowAnything();
922  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("electronIDSource", edm::InputTag(), true) xor
923  edm::ParameterDescription<edm::ParameterSetDescription>("electronIDSources", electronIDSourcesPSet, true)
924  )->setComment("input with electron ID variables");
925 
926 
927  // IsoDeposit configurables
928  edm::ParameterSetDescription isoDepositsPSet;
929  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
930  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
931  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
932  isoDepositsPSet.addOptional<edm::InputTag>("pfAllParticles");
933  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadrons");
934  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedAll");
935  isoDepositsPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
936  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
937  isoDepositsPSet.addOptional<edm::InputTag>("pfPhotons");
938  isoDepositsPSet.addOptional<std::vector<edm::InputTag> >("user");
939  iDesc.addOptional("isoDeposits", isoDepositsPSet);
940 
941  // isolation values configurables
942  edm::ParameterSetDescription isolationValuesPSet;
943  isolationValuesPSet.addOptional<edm::InputTag>("tracker");
944  isolationValuesPSet.addOptional<edm::InputTag>("ecal");
945  isolationValuesPSet.addOptional<edm::InputTag>("hcal");
946  isolationValuesPSet.addOptional<edm::InputTag>("pfAllParticles");
947  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedHadrons");
948  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedAll");
949  isolationValuesPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
950  isolationValuesPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
951  isolationValuesPSet.addOptional<edm::InputTag>("pfPhotons");
952  isolationValuesPSet.addOptional<std::vector<edm::InputTag> >("user");
953  iDesc.addOptional("isolationValues", isolationValuesPSet);
954 
955  // isolation values configurables
956  edm::ParameterSetDescription isolationValuesNoPFIdPSet;
957  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("tracker");
958  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("ecal");
959  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("hcal");
960  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfAllParticles");
961  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfChargedHadrons");
962  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfChargedAll");
963  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
964  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
965  isolationValuesNoPFIdPSet.addOptional<edm::InputTag>("pfPhotons");
966  isolationValuesNoPFIdPSet.addOptional<std::vector<edm::InputTag> >("user");
967  iDesc.addOptional("isolationValuesNoPFId", isolationValuesNoPFIdPSet);
968 
969  // Efficiency configurables
970  edm::ParameterSetDescription efficienciesPSet;
971  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
972  iDesc.add("efficiencies", efficienciesPSet);
973  iDesc.add<bool>("addEfficiencies", false);
974 
975  // Check to see if the user wants to add user data
976  edm::ParameterSetDescription userDataPSet;
978  iDesc.addOptional("userData", userDataPSet);
979 
980  // electron shapes
981  iDesc.add<bool>("addElectronShapes", true);
982  iDesc.add<edm::InputTag>("reducedBarrelRecHitCollection", edm::InputTag("reducedEcalRecHitsEB"));
983  iDesc.add<edm::InputTag>("reducedEndcapRecHitCollection", edm::InputTag("reducedEcalRecHitsEE"));
984 
985  edm::ParameterSetDescription isolationPSet;
986  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
987  iDesc.add("userIsolation", isolationPSet);
988 
989  // Resolution configurables
991 
992  iDesc.add<bool>("embedHighLevelSelection", true)->setComment("embed high level selection");
993  edm::ParameterSetDescription highLevelPSet;
994  highLevelPSet.setAllowAnything();
995  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("beamLineSrc", edm::InputTag(), true)
996  )->setComment("input with high level selection");
998  )->setComment("input with high level selection");
999  iDesc.addNode( edm::ParameterDescription<bool>("usePV", bool(), true)
1000  )->setComment("input with high level selection, use primary vertex (true) or beam line (false)");
1001 
1002  descriptions.add("PATElectronProducer", iDesc);
1003 
1004 }
1005 
1006 
1007 // embed various impact parameters with errors
1008 // embed high level selection
1010  reco::GsfTrackRef track,
1013  bool primaryVertexIsValid,
1014  reco::BeamSpot & beamspot,
1015  bool beamspotIsValid
1016  )
1017 {
1018  // Correct to PV
1019 
1020  // PV2D
1021  std::pair<bool,Measurement1D> result =
1023  GlobalVector(track->px(),
1024  track->py(),
1025  track->pz()),
1026  primaryVertex);
1027  double d0_corr = result.second.value();
1028  double d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
1029  anElectron.setDB( d0_corr, d0_err, pat::Electron::PV2D);
1030 
1031 
1032  // PV3D
1033  result =
1035  GlobalVector(track->px(),
1036  track->py(),
1037  track->pz()),
1038  primaryVertex);
1039  d0_corr = result.second.value();
1040  d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
1041  anElectron.setDB( d0_corr, d0_err, pat::Electron::PV3D);
1042 
1043 
1044  // Correct to beam spot
1045  // make a fake vertex out of beam spot
1046  reco::Vertex vBeamspot(beamspot.position(), beamspot.covariance3D());
1047 
1048  // BS2D
1049  result =
1051  GlobalVector(track->px(),
1052  track->py(),
1053  track->pz()),
1054  vBeamspot);
1055  d0_corr = result.second.value();
1056  d0_err = beamspotIsValid ? result.second.error() : -1.0;
1057  anElectron.setDB( d0_corr, d0_err, pat::Electron::BS2D);
1058 
1059  // BS3D
1060  result =
1062  GlobalVector(track->px(),
1063  track->py(),
1064  track->pz()),
1065  vBeamspot);
1066  d0_corr = result.second.value();
1067  d0_err = beamspotIsValid ? result.second.error() : -1.0;
1068  anElectron.setDB( d0_corr, d0_err, pat::Electron::BS3D);
1069 }
1070 
1072 
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
bool isAvailable() const
Definition: Ref.h:276
T getParameter(std::string const &) const
void setComment(std::string const &value)
double z0() const
z coordinate
Definition: BeamSpot.h:68
Assists in assimilating all pat::UserData into pat objects.
int i
Definition: DBlmapReader.cc:9
void setP4(P4Kind kind, const LorentzVector &p4, float p4Error, bool setCandidate)
Definition: GsfElectron.cc:197
void embedTrack()
method to store the electron&#39;s Track internally
Definition: Electron.cc:314
void embedSeedCluster()
method to store the electron&#39;s seedcluster internally
Definition: Electron.cc:257
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
void setIsolation(IsolationKeys key, float value)
Definition: Lepton.h:98
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
void embedGsfElectronCore()
method to store the electron&#39;s core internally
Definition: Electron.cc:220
bool contains(EventRange const &lh, EventID const &rh)
Definition: EventRange.cc:38
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:146
void embedPflowBasicClusters()
method to store the electron&#39;s pflow basic clusters
Definition: Electron.cc:290
static const HistoName names[]
Covariance3DMatrix covariance3D() const
return only 3D position covariance matrix
Definition: BeamSpot.h:118
const LorentzVector & p4(P4Kind kind) const
Definition: GsfElectron.cc:223
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
void embedSuperCluster()
method to store the electron&#39;s SuperCluster internally
Definition: Electron.cc:239
void setAllowAnything()
allow any parameter label/value pairs
void embedPFCandidate()
embed the PFCandidate pointed to by pfCandidateRef_
Definition: Electron.cc:377
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void setDB(double dB, double edB, IpType type=None)
Set impact parameter of a certain type and its uncertainty.
Definition: Electron.cc:460
edm::EDGetTokenT< edm::View< reco::GsfElectron > > electronToken_
std::pair< bool, Measurement1D > signedTransverseImpactParameter(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:50
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:37
void setPFCandidateRef(const reco::PFCandidateRef &ref)
add a reference to the source IsolatedPFCandidate
Definition: Electron.h:165
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
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:71
void setPassConversionVeto(bool flag)
Definition: Electron.h:235
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:188
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
std::vector< edm::EDGetTokenT< edm::ValueMap< float > > > elecIDTokens_
bool isRealData() const
Definition: EventBase.h:60
void embedPreshowerClusters()
method to store the electron&#39;s preshower clusters
Definition: Electron.cc:278
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
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:175
static void fillDescription(edm::ParameterSetDescription &iDesc)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:192
void embedBasicClusters()
method to store the electron&#39;s basic clusters
Definition: Electron.cc:266
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:50
void setComment(std::string const &value)
GreaterByPt< Electron > pTComparator_
pat::helper::MultiIsolator isolator_
std::vector< edm::Handle< edm::Association< reco::GenParticleCollection > > > GenAssociations
int iEvent
Definition: GenABIO.cc:230
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
Produces pat::Electron&#39;s.
PATElectronProducer(const edm::ParameterSet &iConfig)
edm::EDGetTokenT< EcalRecHitCollection > reducedEndcapRecHitCollectionToken_
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
void embedRecHits(const EcalRecHitCollection *rechits)
method to store the RecHits internally - can be called from the PATElectronProducer ...
Definition: Electron.cc:323
void embedGenParticle()
Definition: PATObject.h:677
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
tuple result
Definition: query.py:137
edm::InputTag reducedEndcapRecHitCollection_
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
int j
Definition: DBlmapReader.cc:9
edm::InputTag reducedBarrelRecHitCollection_
mva input variables
edm::EDGetTokenT< reco::ConversionCollection > hConversionsToken_
reco::PFCandidateRef pfCandidateRef() const
reference to the source PFCandidates; null if this has been built from a standard electron ...
Definition: Electron.cc:368
math::XYZPoint Point
point in the space
Definition: TrackBase.h:82
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool embedHighLevelSelection_
embed high level selection variables?
bool first
Definition: L1TdeRCT.cc:75
bool isValid() const
Definition: HandleBase.h:76
static bool hasMatchedConversion(const reco::GsfElectron &ele, 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)
bool isNull() const
Checks for null.
Definition: Ref.h:247
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
virtual void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void embedGsfTrack()
method to store the electron&#39;s GsfTrack internally
Definition: Electron.cc:229
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:152
const_iterator end() const
Definition: DetId.h:18
edm::EDGetTokenT< EcalRecHitCollection > reducedBarrelRecHitCollectionToken_
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
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:661
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueNoPFIdTokens_
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
pat::helper::EfficiencyLoader efficiencyLoader_
void setIsPF(bool hasPFCandidate)
Definition: Electron.h:160
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
const T & get() const
Definition: EventSetup.h:55
pat::PATUserDataHelper< pat::Electron > userDataHelper_
void embedPflowSuperCluster()
method to store the electron&#39;s PflowSuperCluster internally
Definition: Electron.cc:248
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
bool useParticleFlow_
pflow specific
Analysis-level electron class.
Definition: Electron.h:52
const CaloTopology * ecalTopology_
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
ProductID id() const
Accessor for product ID.
Definition: Ptr.h:164
IsolationLabels isolationValueLabelsNoPFId_
edm::EDGetTokenT< edm::ValueMap< reco::PFCandidatePtr > > pfCandidateMapToken_
std::pair< bool, Measurement1D > absoluteTransverseImpactParameter(const reco::TransientTrack &transientTrack, const reco::Vertex &vertex)
Definition: IPTools.cc:43
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:16
iterator find(key_type k)
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
IsolationLabels isolationValueLabels_
size_type size() const
double y0() const
y coordinate
Definition: BeamSpot.h:66
pat::helper::KinResolutionsLoader resolutionLoader_
const Point & position() const
position
Definition: BeamSpot.h:62
volatile std::atomic< bool > shutdown_flag false
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
void newEvent(const edm::Event &event, const edm::EventSetup &setup) const
To be called for each new event, reads in the EventSetup object.
edm::EDGetTokenT< reco::PFCandidateCollection > pfElecToken_
void setMvaVariables(double sigmaIetaIphi, double ip3d)
set missing mva input variables
Definition: Electron.cc:472
static std::string const source
Definition: EdmProvDump.cc:43
void embedPflowPreshowerClusters()
method to store the electron&#39;s pflow preshower clusters
Definition: Electron.cc:302
void newEvent(const edm::Event &event) const
To be called for each new event, reads in the ValueMaps for efficiencies.
edm::EDGetTokenT< std::vector< reco::Vertex > > pvToken_
Global3DVector GlobalVector
Definition: GlobalVector.h:10
std::vector< NameTag > elecIDSrcs_
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:82
double x0() const
x coordinate
Definition: BeamSpot.h:64
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps