test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
GsfElectronAlgo.cc
Go to the documentation of this file.
1 
9 
12 
25 
29 
32 
33 
35 
38 
41 
42 
45 
46 
47 #include <Math/Point3D.h>
48 #include <sstream>
49 #include <algorithm>
50 
51 
52 using namespace edm ;
53 using namespace std ;
54 using namespace reco ;
55 
56 
57 //===================================================================
58 // GsfElectronAlgo::GeneralData
59 //===================================================================
60 
61 // general data and helpers
63  {
64  // constructors
66  ( const InputTagsConfiguration &,
67  const StrategyConfiguration &,
68  const CutsConfiguration & cutsCfg,
69  const CutsConfiguration & cutsCfgPflow,
70  const ElectronHcalHelper::Configuration & hcalCfg,
71  const ElectronHcalHelper::Configuration & hcalCfgPflow,
72  const IsolationConfiguration &,
74  EcalClusterFunctionBaseClass * superClusterErrorFunction,
75  EcalClusterFunctionBaseClass * crackCorrectionFunction,
76  const SoftElectronMVAEstimator::Configuration & mva_NIso_Cfg ,
77  const ElectronMVAEstimator::Configuration & mva_Iso_Cfg ,
79  ~GeneralData() ;
80 
81  // configurables
88 
89  // additional configuration and helpers
93  //SoftElectronMVAEstimator *sElectronMVAEstimator;
94  //ElectronMVAEstimator *iElectronMVAEstimator;
97  } ;
98 
100  ( const InputTagsConfiguration & inputConfig,
101  const StrategyConfiguration & strategyConfig,
102  const CutsConfiguration & cutsConfig,
103  const CutsConfiguration & cutsConfigPflow,
104  const ElectronHcalHelper::Configuration & hcalConfig,
105  const ElectronHcalHelper::Configuration & hcalConfigPflow,
106  const IsolationConfiguration & isoConfig,
107  const EcalRecHitsConfiguration & recHitsConfig,
108  EcalClusterFunctionBaseClass * superClusterErrorFunc,
109  EcalClusterFunctionBaseClass * crackCorrectionFunc,
110  const SoftElectronMVAEstimator::Configuration & /*mva_NIso_Config*/,
111  const ElectronMVAEstimator::Configuration & /*mva_Iso_Config*/,
112  const RegressionHelper::Configuration & regConfig
113  )
114  : inputCfg(inputConfig),
115  strategyCfg(strategyConfig),
116  cutsCfg(cutsConfig),
117  cutsCfgPflow(cutsConfigPflow),
118  isoCfg(isoConfig),
119  recHitsCfg(recHitsConfig),
120  hcalHelper(new ElectronHcalHelper(hcalConfig)),
121  hcalHelperPflow(new ElectronHcalHelper(hcalConfigPflow)),
122  superClusterErrorFunction(superClusterErrorFunc),
123  crackCorrectionFunction(crackCorrectionFunc),
124  //sElectronMVAEstimator(new SoftElectronMVAEstimator(mva_NIso_Config)),
125  //iElectronMVAEstimator(new ElectronMVAEstimator(mva_Iso_Config)),
126  regCfg(regConfig),
127  regHelper(new RegressionHelper(regConfig))
128  {}
129 
131  {
132  delete hcalHelper ;
133  delete hcalHelperPflow ;
134  //delete sElectronMVAEstimator;
135  //delete iElectronMVAEstimator;
136  delete regHelper;
137  }
138 
139 //===================================================================
140 // GsfElectronAlgo::EventSetupData
141 //===================================================================
142 
144  {
145  EventSetupData() ;
146  ~EventSetupData() ;
147 
148  unsigned long long cacheIDGeom ;
149  unsigned long long cacheIDTopo ;
150  unsigned long long cacheIDTDGeom ;
151  unsigned long long cacheIDMagField ;
152  //unsigned long long cacheChStatus ;
153  unsigned long long cacheSevLevel ;
154 
159  //edm::ESHandle<EcalChannelStatus> chStatus ;
161 
165 } ;
166 
168  : cacheIDGeom(0), cacheIDTopo(0), cacheIDTDGeom(0), cacheIDMagField(0),/*cacheChStatus(0),*/
169  cacheSevLevel(0), mtsTransform(0), constraintAtVtx(0), mtsMode(new MultiTrajectoryStateMode)
170  {}
171 
173  {
174  delete mtsMode ;
175  delete constraintAtVtx ;
176  delete mtsTransform ;
177  }
178 
179 
180 //===================================================================
181 // GsfElectronAlgo::EventData
182 //===================================================================
183 
185  {
186  // general
190 
191  EventData() ;
192  ~EventData() ;
193 
194  // utilities
195  void retreiveOriginalTrackCollections
196  ( const reco::TrackRef &, const reco::GsfTrackRef & ) ;
197 
198  // input collections
214 
215  // isolation helpers
216  ElectronTkIsolation * tkIsolation03, * tkIsolation04 ;
217  EgammaTowerIsolation * hadDepth1Isolation03, * hadDepth1Isolation04 ;
218  EgammaTowerIsolation * hadDepth2Isolation03, * hadDepth2Isolation04 ;
219  EgammaTowerIsolation * hadDepth1Isolation03Bc, * hadDepth1Isolation04Bc ;
220  EgammaTowerIsolation * hadDepth2Isolation03Bc, * hadDepth2Isolation04Bc ;
221  EgammaRecHitIsolation * ecalBarrelIsol03, * ecalBarrelIsol04 ;
222  EgammaRecHitIsolation * ecalEndcapIsol03, * ecalEndcapIsol04 ;
223 
224  //Isolation Value Maps for PF and EcalDriven electrons
225  typedef std::vector< edm::Handle< edm::ValueMap<double> > > IsolationValueMaps;
228  } ;
229 
231  : event(0), beamspot(0),
232  originalCtfTrackCollectionRetreived(false),
233  originalGsfTrackCollectionRetreived(false),
234  tkIsolation03(0), tkIsolation04(0),
235  hadDepth1Isolation03(0), hadDepth1Isolation04(0),
236  hadDepth2Isolation03(0), hadDepth2Isolation04(0),
237  hadDepth1Isolation03Bc(0), hadDepth1Isolation04Bc(0),
238  hadDepth2Isolation03Bc(0), hadDepth2Isolation04Bc(0),
239  ecalBarrelIsol03(0), ecalBarrelIsol04(0),
240  ecalEndcapIsol03(0), ecalEndcapIsol04(0)
241  {
243  }
244 
246  {
247  delete tkIsolation03 ;
248  delete tkIsolation04 ;
249  delete hadDepth1Isolation03 ;
250  delete hadDepth1Isolation04 ;
251  delete hadDepth2Isolation03 ;
252  delete hadDepth2Isolation04 ;
253  delete hadDepth1Isolation03Bc ;
254  delete hadDepth1Isolation04Bc ;
255  delete hadDepth2Isolation03Bc ;
256  delete hadDepth2Isolation04Bc ;
257  delete ecalBarrelIsol03 ;
258  delete ecalBarrelIsol04 ;
259  delete ecalEndcapIsol03 ;
260  delete ecalEndcapIsol04 ;
261 
262  GsfElectronPtrCollection::const_iterator it ;
263  for ( it = electrons->begin() ; it != electrons->end() ; it++ )
264  { delete (*it) ; }
265  delete electrons ;
266  }
267 
269  ( const reco::TrackRef & ctfTrack, const reco::GsfTrackRef & gsfTrack )
270  {
271  if ((!originalCtfTrackCollectionRetreived)&&(ctfTrack.isNonnull()))
272  {
273  event->get(ctfTrack.id(),originalCtfTracks) ;
274  originalCtfTrackCollectionRetreived = true ;
275  }
276  if ((!originalGsfTrackCollectionRetreived)&&(gsfTrack.isNonnull()))
277  {
278  event->get(gsfTrack.id(),originalGsfTracks) ;
279  originalGsfTrackCollectionRetreived = true ;
280  }
281  }
282 
283 
284 //===================================================================
285 // GsfElectronAlgo::ElectronData
286 //===================================================================
287 
289  {
290  // Refs to subproducts
297 
298  // constructors
300  ( const reco::GsfElectronCoreRef & core,
301  const reco::BeamSpot & bs ) ;
302  ~ElectronData() ;
303 
304  // utilities
305  void checkCtfTrack( edm::Handle<reco::TrackCollection> currentCtfTracks ) ;
306  void computeCharge( int & charge, reco::GsfElectron::ChargeInfo & info ) ;
307  CaloClusterPtr getEleBasicCluster( const MultiTrajectoryStateTransform * ) ;
308  bool calculateTSOS( const MultiTrajectoryStateTransform *, GsfConstraintAtVertex * ) ;
309  void calculateMode( const MultiTrajectoryStateMode * mtsMode ) ;
310  Candidate::LorentzVector calculateMomentum() ;
311 
312  // TSOS
320 
321  // mode
322  GlobalVector innMom, seedMom, eleMom, sclMom, vtxMom, outMom ;
323  GlobalPoint innPos, seedPos, elePos, sclPos, vtxPos, outPos ;
325  } ;
326 
328  ( const reco::GsfElectronCoreRef & core,
329  const reco::BeamSpot & bs )
330  : coreRef(core),
331  gsfTrackRef(coreRef->gsfTrack()),
332  superClusterRef(coreRef->superCluster()),
333  ctfTrackRef(coreRef->ctfTrack()), shFracInnerHits(coreRef->ctfGsfOverlap()),
334  beamSpot(bs)
335  {}
336 
338  {}
339 
341 {
342  if (!ctfTrackRef.isNull()) return ;
343 
344  // Code below from Puneeth Kalavase
345 
346  shFracInnerHits = 0 ;
347  const TrackCollection * ctfTrackCollection = currentCtfTracks.product() ;
348 
349  // get the Hit Pattern for the gsfTrack
350  const HitPattern &gsfHitPattern = gsfTrackRef->hitPattern() ;
351 
352  unsigned int counter ;
353  TrackCollection::const_iterator ctfTkIter ;
354  for (ctfTkIter = ctfTrackCollection->begin(), counter = 0;
355  ctfTkIter != ctfTrackCollection->end(); ctfTkIter++, counter++)
356  {
357  double dEta = gsfTrackRef->eta() - ctfTkIter->eta() ;
358  double dPhi = gsfTrackRef->phi() - ctfTkIter->phi() ;
359  double pi = acos(-1.);
360  if(std::abs(dPhi) > pi) dPhi = 2*pi - std::abs(dPhi) ;
361 
362  // dont want to look at every single track in the event!
363  if (sqrt(dEta*dEta + dPhi*dPhi) > 0.3) continue ;
364 
365  unsigned int shared = 0 ;
366  int gsfHitCounter = 0 ;
367  int numGsfInnerHits = 0 ;
368  int numCtfInnerHits = 0 ;
369 
370  // get the CTF Track Hit Pattern
371  const HitPattern &ctfHitPattern = ctfTkIter->hitPattern() ;
372 
373  trackingRecHit_iterator elHitsIt;
374  for (elHitsIt = gsfTrackRef->recHitsBegin();
375  elHitsIt != gsfTrackRef->recHitsEnd();
376  elHitsIt++, gsfHitCounter++)
377  {
378  if (!((**elHitsIt).isValid())) //count only valid Hits
379  { continue ; }
380 
381  // look only in the pixels/TIB/TID
382  uint32_t gsfHit = gsfHitPattern.getHitPattern(HitPattern::TRACK_HITS, gsfHitCounter) ;
383  if (!(HitPattern::pixelHitFilter(gsfHit)
384  || HitPattern::stripTIBHitFilter(gsfHit)
385  || HitPattern::stripTIDHitFilter(gsfHit))){
386  continue;
387  }
388 
389  numGsfInnerHits++ ;
390 
391  int ctfHitsCounter = 0 ;
392  numCtfInnerHits = 0 ;
393  trackingRecHit_iterator ctfHitsIt ;
394  for (ctfHitsIt = ctfTkIter->recHitsBegin();
395  ctfHitsIt != ctfTkIter->recHitsEnd();
396  ctfHitsIt++, ctfHitsCounter++ )
397  {
398  if(!((**ctfHitsIt).isValid())) //count only valid Hits!
399  { continue; }
400 
401  uint32_t ctfHit = ctfHitPattern.getHitPattern(HitPattern::TRACK_HITS, ctfHitsCounter);
402  if(!(HitPattern::pixelHitFilter(ctfHit)
403  || HitPattern::stripTIBHitFilter(ctfHit)
404  || HitPattern::stripTIDHitFilter(ctfHit)))
405  {
406  continue;
407  }
408 
409  numCtfInnerHits++ ;
410 
411  if((**elHitsIt).sharesInput(&(**ctfHitsIt), TrackingRecHit::all))
412  {
413  shared++ ;
414  break ;
415  }
416 
417  } //ctfHits iterator
418 
419  } //gsfHits iterator
420 
421  if ((numGsfInnerHits==0)||(numCtfInnerHits==0))
422  { continue ; }
423 
424  if ( static_cast<float>(shared)/min(numGsfInnerHits,numCtfInnerHits) > shFracInnerHits )
425  {
426  shFracInnerHits = static_cast<float>(shared)/min(numGsfInnerHits, numCtfInnerHits);
427  ctfTrackRef = TrackRef(currentCtfTracks,counter);
428  }
429  } //ctfTrack iterator
430 }
431 
434  {
435  // determine charge from SC
436  GlobalPoint orig, scpos ;
437  ele_convert(beamSpot.position(),orig) ;
438  ele_convert(superClusterRef->position(),scpos) ;
439  GlobalVector scvect(scpos-orig) ;
440  GlobalPoint inntkpos = innTSOS.globalPosition() ;
441  GlobalVector inntkvect = GlobalVector(inntkpos-orig) ;
442  float dPhiInnEle=normalized_phi(scvect.barePhi()-inntkvect.barePhi()) ;
443  if(dPhiInnEle>0) info.scPixCharge = -1 ;
444  else info.scPixCharge = 1 ;
445 
446  // flags
447  int chargeGsf = gsfTrackRef->charge() ;
448  info.isGsfScPixConsistent = ((chargeGsf*info.scPixCharge)>0) ;
449  info.isGsfCtfConsistent = (ctfTrackRef.isNonnull()&&((chargeGsf*ctfTrackRef->charge())>0)) ;
451 
452  // default charge
453  if (info.isGsfScPixConsistent||ctfTrackRef.isNull())
454  { charge = info.scPixCharge ; }
455  else
456  { charge = ctfTrackRef->charge() ; }
457  }
458 
460  ( const MultiTrajectoryStateTransform * mtsTransform )
461  {
462  CaloClusterPtr eleRef ;
463  TrajectoryStateOnSurface tempTSOS ;
464  TrajectoryStateOnSurface outTSOS = mtsTransform->outerStateOnSurface(*gsfTrackRef) ;
465  float dphimin = 1.e30 ;
466  for (CaloCluster_iterator bc=superClusterRef->clustersBegin(); bc!=superClusterRef->clustersEnd(); bc++)
467  {
468  GlobalPoint posclu((*bc)->position().x(),(*bc)->position().y(),(*bc)->position().z()) ;
469  tempTSOS = mtsTransform->extrapolatedState(outTSOS,posclu) ;
470  if (!tempTSOS.isValid()) tempTSOS=outTSOS ;
471  GlobalPoint extrap = tempTSOS.globalPosition() ;
472  float dphi = EleRelPointPair(posclu,extrap,beamSpot.position()).dPhi() ;
473  if (std::abs(dphi)<dphimin)
474  {
475  dphimin = std::abs(dphi) ;
476  eleRef = (*bc);
477  eleTSOS = tempTSOS ;
478  }
479  }
480  return eleRef ;
481  }
482 
484  ( const MultiTrajectoryStateTransform * mtsTransform, GsfConstraintAtVertex * constraintAtVtx )
485  {
486  //at innermost point
487  innTSOS = mtsTransform->innerStateOnSurface(*gsfTrackRef);
488  if (!innTSOS.isValid()) return false;
489 
490  //at vertex
491  // innermost state propagation to the beam spot position
492  GlobalPoint bsPos ;
493  ele_convert(beamSpot.position(),bsPos) ;
494  vtxTSOS = mtsTransform->extrapolatedState(innTSOS,bsPos) ;
495  if (!vtxTSOS.isValid()) vtxTSOS=innTSOS;
496 
497  //at seed
498  outTSOS = mtsTransform->outerStateOnSurface(*gsfTrackRef);
499  if (!outTSOS.isValid()) return false;
500 
501  // TrajectoryStateOnSurface seedTSOS
502  seedTSOS = mtsTransform->extrapolatedState(outTSOS,
503  GlobalPoint(superClusterRef->seed()->position().x(),
504  superClusterRef->seed()->position().y(),
505  superClusterRef->seed()->position().z()));
506  if (!seedTSOS.isValid()) seedTSOS=outTSOS;
507 
508  // at scl
509  sclTSOS = mtsTransform->extrapolatedState(innTSOS,GlobalPoint(superClusterRef->x(),superClusterRef->y(),superClusterRef->z()));
510  if (!sclTSOS.isValid()) sclTSOS=outTSOS;
511 
512  // constrained momentum
513  constrainedVtxTSOS = constraintAtVtx->constrainAtBeamSpot(*gsfTrackRef,beamSpot);
514 
515  return true ;
516  }
517 
519  {
520  mtsMode->momentumFromModeCartesian(innTSOS,innMom) ;
521  mtsMode->positionFromModeCartesian(innTSOS,innPos) ;
522  mtsMode->momentumFromModeCartesian(seedTSOS,seedMom) ;
523  mtsMode->positionFromModeCartesian(seedTSOS,seedPos) ;
524  mtsMode->momentumFromModeCartesian(eleTSOS,eleMom) ;
525  mtsMode->positionFromModeCartesian(eleTSOS,elePos) ;
526  mtsMode->momentumFromModeCartesian(sclTSOS,sclMom) ;
527  mtsMode->positionFromModeCartesian(sclTSOS,sclPos) ;
528  mtsMode->momentumFromModeCartesian(vtxTSOS,vtxMom) ;
529  mtsMode->positionFromModeCartesian(vtxTSOS,vtxPos) ;
530  mtsMode->momentumFromModeCartesian(outTSOS,outMom);
531  mtsMode->positionFromModeCartesian(outTSOS,outPos) ;
532  mtsMode->momentumFromModeCartesian(constrainedVtxTSOS,vtxMomWithConstraint);
533  }
534 
536  {
537  double scale = superClusterRef->energy()/vtxMom.mag() ;
539  ( vtxMom.x()*scale,vtxMom.y()*scale,vtxMom.z()*scale,
540  superClusterRef->energy() ) ;
541  }
542 
544  reco::GsfElectron::ShowerShape & showerShape )
545  {
546  const reco::CaloCluster & seedCluster = *(theClus->seed()) ;
547  // temporary, till CaloCluster->seed() is made available
548  DetId seedXtalId = seedCluster.hitsAndFractions()[0].first ;
549  int detector = seedXtalId.subdetId() ;
550 
553  const EcalRecHitCollection * recHits = 0 ;
554  std::vector<int> recHitFlagsToBeExcluded ;
555  std::vector<int> recHitSeverityToBeExcluded ;
556  if (detector==EcalBarrel)
557  {
558  recHits = eventData_->barrelRecHits.product() ;
559  recHitFlagsToBeExcluded = generalData_->recHitsCfg.recHitFlagsToBeExcludedBarrel ;
560  recHitSeverityToBeExcluded = generalData_->recHitsCfg.recHitSeverityToBeExcludedBarrel ;
561  }
562  else
563  {
564  recHits = eventData_->endcapRecHits.product() ;
565  recHitFlagsToBeExcluded = generalData_->recHitsCfg.recHitFlagsToBeExcludedEndcaps ;
566  recHitSeverityToBeExcluded = generalData_->recHitsCfg.recHitSeverityToBeExcludedEndcaps ;
567  }
568 
569  std::vector<float> covariances = EcalClusterTools::covariances(seedCluster,recHits,topology,geometry) ;
570  std::vector<float> localCovariances = EcalClusterTools::localCovariances(seedCluster,recHits,topology) ;
571  showerShape.sigmaEtaEta = sqrt(covariances[0]) ;
572  showerShape.sigmaIetaIeta = sqrt(localCovariances[0]) ;
573  if (!edm::isNotFinite(localCovariances[2])) showerShape.sigmaIphiIphi = sqrt(localCovariances[2]) ;
574  showerShape.e1x5 = EcalClusterTools::e1x5(seedCluster,recHits,topology) ;
575  showerShape.e2x5Max = EcalClusterTools::e2x5Max(seedCluster,recHits,topology) ;
576  showerShape.e5x5 = EcalClusterTools::e5x5(seedCluster,recHits,topology) ;
577  showerShape.r9 = EcalClusterTools::e3x3(seedCluster,recHits,topology)/theClus->rawEnergy() ;
578 
579  if (pflow)
580  {
581  showerShape.hcalDepth1OverEcal = generalData_->hcalHelperPflow->hcalESumDepth1(*theClus)/theClus->energy() ;
582  showerShape.hcalDepth2OverEcal = generalData_->hcalHelperPflow->hcalESumDepth2(*theClus)/theClus->energy() ;
586  }
587  else
588  {
589  showerShape.hcalDepth1OverEcal = generalData_->hcalHelper->hcalESumDepth1(*theClus)/theClus->energy() ;
590  showerShape.hcalDepth2OverEcal = generalData_->hcalHelper->hcalESumDepth2(*theClus)/theClus->energy() ;
594  }
595 
596  // extra shower shapes
597  const float see_by_spp = showerShape.sigmaIetaIeta*showerShape.sigmaIphiIphi;
598  if( see_by_spp > 0 ) {
599  showerShape.sigmaIetaIphi = localCovariances[1] / see_by_spp;
600  } else if ( localCovariances[1] > 0 ) {
601  showerShape.sigmaIetaIphi = 1.f;
602  } else {
603  showerShape.sigmaIetaIphi = -1.f;
604  }
605  showerShape.eMax = EcalClusterTools::eMax(seedCluster,recHits);
606  showerShape.e2nd = EcalClusterTools::e2nd(seedCluster,recHits);
607  showerShape.eTop = EcalClusterTools::eTop(seedCluster,recHits,topology);
608  showerShape.eLeft = EcalClusterTools::eLeft(seedCluster,recHits,topology);
609  showerShape.eRight = EcalClusterTools::eRight(seedCluster,recHits,topology);
610  showerShape.eBottom = EcalClusterTools::eBottom(seedCluster,recHits,topology);
611  }
612 
614  reco::GsfElectron::ShowerShape & showerShape )
615  {
616  const reco::CaloCluster & seedCluster = *(theClus->seed()) ;
617  // temporary, till CaloCluster->seed() is made available
618  DetId seedXtalId = seedCluster.hitsAndFractions()[0].first ;
619  int detector = seedXtalId.subdetId() ;
620 
623  const EcalRecHitCollection * recHits = 0 ;
624  std::vector<int> recHitFlagsToBeExcluded ;
625  std::vector<int> recHitSeverityToBeExcluded ;
626  if (detector==EcalBarrel)
627  {
628  recHits = eventData_->barrelRecHits.product() ;
629  recHitFlagsToBeExcluded = generalData_->recHitsCfg.recHitFlagsToBeExcludedBarrel ;
630  recHitSeverityToBeExcluded = generalData_->recHitsCfg.recHitSeverityToBeExcludedBarrel ;
631  }
632  else
633  {
634  recHits = eventData_->endcapRecHits.product() ;
635  recHitFlagsToBeExcluded = generalData_->recHitsCfg.recHitFlagsToBeExcludedEndcaps ;
636  recHitSeverityToBeExcluded = generalData_->recHitsCfg.recHitSeverityToBeExcludedEndcaps ;
637  }
638 
639  std::vector<float> covariances = noZS::EcalClusterTools::covariances(seedCluster,recHits,topology,geometry) ;
640  std::vector<float> localCovariances = noZS::EcalClusterTools::localCovariances(seedCluster,recHits,topology) ;
641  showerShape.sigmaEtaEta = sqrt(covariances[0]) ;
642  showerShape.sigmaIetaIeta = sqrt(localCovariances[0]) ;
643  if (!edm::isNotFinite(localCovariances[2])) showerShape.sigmaIphiIphi = sqrt(localCovariances[2]) ;
644  showerShape.e1x5 = noZS::EcalClusterTools::e1x5(seedCluster,recHits,topology) ;
645  showerShape.e2x5Max = noZS::EcalClusterTools::e2x5Max(seedCluster,recHits,topology) ;
646  showerShape.e5x5 = noZS::EcalClusterTools::e5x5(seedCluster,recHits,topology) ;
647  showerShape.r9 = noZS::EcalClusterTools::e3x3(seedCluster,recHits,topology)/theClus->rawEnergy() ;
648 
649  if (pflow)
650  {
651  showerShape.hcalDepth1OverEcal = generalData_->hcalHelperPflow->hcalESumDepth1(*theClus)/theClus->energy() ;
652  showerShape.hcalDepth2OverEcal = generalData_->hcalHelperPflow->hcalESumDepth2(*theClus)/theClus->energy() ;
656  }
657  else
658  {
659  showerShape.hcalDepth1OverEcal = generalData_->hcalHelper->hcalESumDepth1(*theClus)/theClus->energy() ;
660  showerShape.hcalDepth2OverEcal = generalData_->hcalHelper->hcalESumDepth2(*theClus)/theClus->energy() ;
664  }
665 
666  // extra shower shapes
667  const float see_by_spp = showerShape.sigmaIetaIeta*showerShape.sigmaIphiIphi;
668  if( see_by_spp > 0 ) {
669  showerShape.sigmaIetaIphi = localCovariances[1] / see_by_spp;
670  } else if ( localCovariances[1] > 0 ) {
671  showerShape.sigmaIetaIphi = 1.f;
672  } else {
673  showerShape.sigmaIetaIphi = -1.f;
674  }
675  showerShape.eMax = noZS::EcalClusterTools::eMax(seedCluster,recHits);
676  showerShape.e2nd = noZS::EcalClusterTools::e2nd(seedCluster,recHits);
677  showerShape.eTop = noZS::EcalClusterTools::eTop(seedCluster,recHits,topology);
678  showerShape.eLeft = noZS::EcalClusterTools::eLeft(seedCluster,recHits,topology);
679  showerShape.eRight = noZS::EcalClusterTools::eRight(seedCluster,recHits,topology);
680  showerShape.eBottom = noZS::EcalClusterTools::eBottom(seedCluster,recHits,topology);
681  }
682 
683 
684 //===================================================================
685 // GsfElectronAlgo
686 //===================================================================
687 
689  ( const InputTagsConfiguration & inputCfg,
690  const StrategyConfiguration & strategyCfg,
691  const CutsConfiguration & cutsCfg,
692  const CutsConfiguration & cutsCfgPflow,
693  const ElectronHcalHelper::Configuration & hcalCfg,
694  const ElectronHcalHelper::Configuration & hcalCfgPflow,
695  const IsolationConfiguration & isoCfg,
696  const EcalRecHitsConfiguration & recHitsCfg,
697  EcalClusterFunctionBaseClass * superClusterErrorFunction,
698  EcalClusterFunctionBaseClass * crackCorrectionFunction,
699  const SoftElectronMVAEstimator::Configuration & mva_NIso_Cfg,
700  const ElectronMVAEstimator::Configuration & mva_Iso_Cfg,
701  const RegressionHelper::Configuration & regCfg
702  )
703  : generalData_(new GeneralData(inputCfg,strategyCfg,cutsCfg,cutsCfgPflow,hcalCfg,hcalCfgPflow,isoCfg,recHitsCfg,superClusterErrorFunction,crackCorrectionFunction,mva_NIso_Cfg,mva_Iso_Cfg,regCfg)),
706  {}
707 
709  {
710  delete generalData_ ;
711  delete eventSetupData_ ;
712  delete eventData_ ;
713  delete electronData_ ;
714  }
715 
717  {
718  // get EventSetupRecords if needed
719  bool updateField(false);
721  updateField = true;
724  }
725 
726  bool updateGeometry(false);
728  updateGeometry = true;
731  }
732 
733  if ( updateField || updateGeometry ) {
734  delete eventSetupData_->mtsTransform ;
738  }
739 
741  eventSetupData_->cacheIDGeom=es.get<CaloGeometryRecord>().cacheIdentifier();
743  }
744 
746  eventSetupData_->cacheIDTopo=es.get<CaloTopologyRecord>().cacheIdentifier();
748  }
749 
754 
755 
760 
761  //if(eventSetupData_->cacheChStatus!=es.get<EcalChannelStatusRcd>().cacheIdentifier()){
762  // eventSetupData_->cacheChStatus=es.get<EcalChannelStatusRcd>().cacheIdentifier();
763  // es.get<EcalChannelStatusRcd>().get(eventSetupData_->chStatus);
764  //}
765 
767  eventSetupData_->cacheSevLevel = es.get<EcalSeverityLevelAlgoRcd>().cacheIdentifier();
769  }
770  }
771 
772 
774  {
775  GsfElectronPtrCollection::const_iterator it ;
776  for
777  ( it = eventData_->electrons->begin() ;
778  it != eventData_->electrons->end() ;
779  it++ )
780  { outEle.push_back(**it) ; }
781  }
782 
784  {
785  if (eventData_!=0)
786  { throw cms::Exception("GsfElectronAlgo|InternalError")<<"unexpected event data" ; }
787  eventData_ = new EventData ;
788 
789  // init the handles linked to the current event
790  eventData_->event = &event ;
797  event.getByToken(generalData_->inputCfg.hcalTowersTag,eventData_->towers) ;
798  event.getByToken(generalData_->inputCfg.pfMVA,eventData_->pfMva) ;
799  event.getByToken(generalData_->inputCfg.seedsTag,eventData_->seeds) ;
803 
804  // get the beamspot from the Event:
805  edm::Handle<reco::BeamSpot> recoBeamSpotHandle ;
806  event.getByToken(generalData_->inputCfg.beamSpotTag,recoBeamSpotHandle) ;
807  eventData_->beamspot = recoBeamSpotHandle.product() ;
808 
809  // prepare access to hcal data
812 
813  // Isolation algos
814  float extRadiusSmall=0.3, extRadiusLarge=0.4 ;
815  float intRadiusBarrel=generalData_->isoCfg.intRadiusBarrelTk, intRadiusEndcap=generalData_->isoCfg.intRadiusEndcapTk, stripBarrel=generalData_->isoCfg.stripBarrelTk, stripEndcap=generalData_->isoCfg.stripEndcapTk ;
817  eventData_->tkIsolation03 = new ElectronTkIsolation(extRadiusSmall,intRadiusBarrel,intRadiusEndcap,stripBarrel,stripEndcap,ptMin,maxVtxDist,drb,eventData_->currentCtfTracks.product(),eventData_->beamspot->position()) ;
818  eventData_->tkIsolation04 = new ElectronTkIsolation(extRadiusLarge,intRadiusBarrel,intRadiusEndcap,stripBarrel,stripEndcap,ptMin,maxVtxDist,drb,eventData_->currentCtfTracks.product(),eventData_->beamspot->position()) ;
819 
820  float egHcalIsoConeSizeOutSmall=0.3, egHcalIsoConeSizeOutLarge=0.4;
821  float egHcalIsoConeSizeIn=generalData_->isoCfg.intRadiusHcal,egHcalIsoPtMin=generalData_->isoCfg.etMinHcal;
822  int egHcalDepth1=1, egHcalDepth2=2;
823  eventData_->hadDepth1Isolation03 = new EgammaTowerIsolation(egHcalIsoConeSizeOutSmall,egHcalIsoConeSizeIn,egHcalIsoPtMin,egHcalDepth1,eventData_->towers.product()) ;
824  eventData_->hadDepth2Isolation03 = new EgammaTowerIsolation(egHcalIsoConeSizeOutSmall,egHcalIsoConeSizeIn,egHcalIsoPtMin,egHcalDepth2,eventData_->towers.product()) ;
825  eventData_->hadDepth1Isolation04 = new EgammaTowerIsolation(egHcalIsoConeSizeOutLarge,egHcalIsoConeSizeIn,egHcalIsoPtMin,egHcalDepth1,eventData_->towers.product()) ;
826  eventData_->hadDepth2Isolation04 = new EgammaTowerIsolation(egHcalIsoConeSizeOutLarge,egHcalIsoConeSizeIn,egHcalIsoPtMin,egHcalDepth2,eventData_->towers.product()) ;
827  eventData_->hadDepth1Isolation03Bc = new EgammaTowerIsolation(egHcalIsoConeSizeOutSmall,0.,egHcalIsoPtMin,egHcalDepth1,eventData_->towers.product()) ;
828  eventData_->hadDepth2Isolation03Bc = new EgammaTowerIsolation(egHcalIsoConeSizeOutSmall,0.,egHcalIsoPtMin,egHcalDepth2,eventData_->towers.product()) ;
829  eventData_->hadDepth1Isolation04Bc = new EgammaTowerIsolation(egHcalIsoConeSizeOutLarge,0.,egHcalIsoPtMin,egHcalDepth1,eventData_->towers.product()) ;
830  eventData_->hadDepth2Isolation04Bc = new EgammaTowerIsolation(egHcalIsoConeSizeOutLarge,0.,egHcalIsoPtMin,egHcalDepth2,eventData_->towers.product()) ;
831 
832  float egIsoConeSizeOutSmall=0.3, egIsoConeSizeOutLarge=0.4, egIsoJurassicWidth=generalData_->isoCfg.jurassicWidth;
833  float egIsoPtMinBarrel=generalData_->isoCfg.etMinBarrel,egIsoEMinBarrel=generalData_->isoCfg.eMinBarrel, egIsoConeSizeInBarrel=generalData_->isoCfg.intRadiusEcalBarrel;
834  float egIsoPtMinEndcap=generalData_->isoCfg.etMinEndcaps,egIsoEMinEndcap=generalData_->isoCfg.eMinEndcaps, egIsoConeSizeInEndcap=generalData_->isoCfg.intRadiusEcalEndcaps;
835  eventData_->ecalBarrelIsol03 = new EgammaRecHitIsolation(egIsoConeSizeOutSmall,egIsoConeSizeInBarrel,egIsoJurassicWidth,egIsoPtMinBarrel,egIsoEMinBarrel,eventSetupData_->caloGeom,*(eventData_->barrelRecHits),eventSetupData_->sevLevel.product(),DetId::Ecal);
836  eventData_->ecalBarrelIsol04 = new EgammaRecHitIsolation(egIsoConeSizeOutLarge,egIsoConeSizeInBarrel,egIsoJurassicWidth,egIsoPtMinBarrel,egIsoEMinBarrel,eventSetupData_->caloGeom,*(eventData_->barrelRecHits),eventSetupData_->sevLevel.product(),DetId::Ecal);
837  eventData_->ecalEndcapIsol03 = new EgammaRecHitIsolation(egIsoConeSizeOutSmall,egIsoConeSizeInEndcap,egIsoJurassicWidth,egIsoPtMinEndcap,egIsoEMinEndcap,eventSetupData_->caloGeom,*(eventData_->endcapRecHits),eventSetupData_->sevLevel.product(),DetId::Ecal);
838  eventData_->ecalEndcapIsol04 = new EgammaRecHitIsolation(egIsoConeSizeOutLarge,egIsoConeSizeInEndcap,egIsoJurassicWidth,egIsoPtMinEndcap,egIsoEMinEndcap,eventSetupData_->caloGeom,*(eventData_->endcapRecHits),eventSetupData_->sevLevel.product(),DetId::Ecal);
855 
856  //Fill in the Isolation Value Maps for PF and EcalDriven electrons
857  std::vector<edm::InputTag> inputTagIsoVals;
859  inputTagIsoVals.push_back(generalData_->inputCfg.pfIsoVals.getParameter<edm::InputTag>("pfSumChargedHadronPt"));
860  inputTagIsoVals.push_back(generalData_->inputCfg.pfIsoVals.getParameter<edm::InputTag>("pfSumPhotonEt"));
861  inputTagIsoVals.push_back(generalData_->inputCfg.pfIsoVals.getParameter<edm::InputTag>("pfSumNeutralHadronEt"));
862 
863  eventData_->pfIsolationValues.resize(inputTagIsoVals.size());
864 
865  for (size_t j = 0; j<inputTagIsoVals.size(); ++j) {
866  event.getByLabel(inputTagIsoVals[j], eventData_->pfIsolationValues[j]);
867  }
868 
869  }
870 
872  inputTagIsoVals.clear();
873  inputTagIsoVals.push_back(generalData_->inputCfg.edIsoVals.getParameter<edm::InputTag>("edSumChargedHadronPt"));
874  inputTagIsoVals.push_back(generalData_->inputCfg.edIsoVals.getParameter<edm::InputTag>("edSumPhotonEt"));
875  inputTagIsoVals.push_back(generalData_->inputCfg.edIsoVals.getParameter<edm::InputTag>("edSumNeutralHadronEt"));
876 
877  eventData_->edIsolationValues.resize(inputTagIsoVals.size());
878 
879  for (size_t j = 0; j<inputTagIsoVals.size(); ++j) {
880  event.getByLabel(inputTagIsoVals[j], eventData_->edIsolationValues[j]);
881  }
882  }
883  }
884 
886  {
887  if (eventData_==0)
888  { throw cms::Exception("GsfElectronAlgo|InternalError")<<"lacking event data" ; }
889  delete eventData_ ;
890  eventData_ = 0 ;
891  }
892 
894  {
895  LogTrace("GsfElectronAlgo") << "========== " << title << " ==========";
896  LogTrace("GsfElectronAlgo") << "Event: " << eventData_->event->id();
897  LogTrace("GsfElectronAlgo") << "Number of electrons: " << eventData_->electrons->size() ;
898  GsfElectronPtrCollection::const_iterator it ;
899  for ( it = eventData_->electrons->begin(); it != eventData_->electrons->end(); it++ )
900  {
901  LogTrace("GsfElectronAlgo") << "Electron with charge, pt, eta, phi: " << (*it)->charge() << " , "
902  << (*it)->pt() << " , " << (*it)->eta() << " , " << (*it)->phi();
903  }
904  LogTrace("GsfElectronAlgo") << "=================================================";
905  }
906 
908  {
909  if (electronData_!=0)
910  { throw cms::Exception("GsfElectronAlgo|InternalError")<<"unexpected electron data" ; }
911 
912  const GsfElectronCoreCollection * coreCollection = eventData_->coreElectrons.product() ;
913  for ( unsigned int i=0 ; i<coreCollection->size() ; ++i )
914  {
915  // check there is no existing electron with this core
917  bool coreFound = false ;
918  GsfElectronPtrCollection::const_iterator itrEle ;
919  for
920  ( itrEle = eventData_->electrons->begin() ;
921  itrEle != eventData_->electrons->end() ;
922  itrEle++ )
923  {
924  if ((*itrEle)->core()==coreRef)
925  {
926  coreFound = true ;
927  break ;
928  }
929  }
930  if (coreFound) continue ;
931 
932  // check there is a super-cluster
933  if (coreRef->superCluster().isNull()) continue ;
934 
935  // prepare internal structure for electron specific data
936  delete electronData_ ;
937  electronData_ = new ElectronData(coreRef,*eventData_->beamspot) ;
938 
939  // calculate and check Trajectory StatesOnSurface....
941 
942  createElectron(hoc) ;
943 
944  } // loop over tracks
945 
946  delete electronData_ ;
947  electronData_ = 0 ;
948  }
949 
951  {
952  const GsfElectronCollection * oldElectrons = eventData_->previousElectrons.product() ;
954  GsfElectronCollection::const_iterator oldElectron ;
955  for
956  ( oldElectron = oldElectrons->begin() ;
957  oldElectron != oldElectrons->end() ;
958  ++oldElectron )
959  {
960  const GsfElectronCoreRef oldCoreRef = oldElectron->core() ;
961  const GsfTrackRef oldElectronGsfTrackRef = oldCoreRef->gsfTrack() ;
962  unsigned int icore ;
963  for ( icore=0 ; icore<newCores->size() ; ++icore )
964  {
965  if (oldElectronGsfTrackRef==(*newCores)[icore].gsfTrack())
966  {
968  eventData_->electrons->push_back(new GsfElectron(*oldElectron,coreRef)) ;
969  break ;
970  }
971  }
972  }
973  }
974 
975 
976 // now deprecated
978  {
979  bool found ;
980  const GsfElectronCollection * edElectrons = eventData_->previousElectrons.product() ;
982  GsfElectronCollection::const_iterator pfElectron, edElectron ;
983  unsigned int edIndex, pfIndex ;
984 
985  GsfElectronPtrCollection::iterator el ;
986  for
987  ( el = eventData_->electrons->begin() ;
988  el != eventData_->electrons->end() ;
989  el++ )
990  {
991 
992  // Retreive info from pflow electrons
993  found = false ;
994  for
995  ( pfIndex = 0, pfElectron = pfElectrons->begin() ; pfElectron != pfElectrons->end() ; pfIndex++, pfElectron++ )
996  {
997  if (pfElectron->gsfTrack()==(*el)->gsfTrack())
998  {
999  if (found)
1000  {
1001  edm::LogWarning("GsfElectronProducer")<<"associated pfGsfElectron already found" ;
1002  }
1003  else
1004  {
1005  found = true ;
1006 
1007  // Isolation Values
1008  if( (eventData_->pfIsolationValues).size() != 0 )
1009  {
1011  pfElectronRef(eventData_->pflowElectrons, pfIndex);
1013  isoVariables.sumChargedHadronPt =(*(eventData_->pfIsolationValues)[0])[pfElectronRef];
1014  isoVariables.sumPhotonEt =(*(eventData_->pfIsolationValues)[1])[pfElectronRef];
1015  isoVariables.sumNeutralHadronEt =(*(eventData_->pfIsolationValues)[2])[pfElectronRef];
1016  (*el)->setPfIsolationVariables(isoVariables);
1017  }
1018 
1019 // (*el)->setPfIsolationVariables(pfElectron->pfIsolationVariables()) ;
1020  (*el)->setMvaInput(pfElectron->mvaInput()) ;
1021  (*el)->setMvaOutput(pfElectron->mvaOutput()) ;
1022  if ((*el)->ecalDrivenSeed())
1023  { (*el)->setP4(GsfElectron::P4_PFLOW_COMBINATION,pfElectron->p4(GsfElectron::P4_PFLOW_COMBINATION),pfElectron->p4Error(GsfElectron::P4_PFLOW_COMBINATION),false) ; }
1024  else
1025  { (*el)->setP4(GsfElectron::P4_PFLOW_COMBINATION,pfElectron->p4(GsfElectron::P4_PFLOW_COMBINATION),pfElectron->p4Error(GsfElectron::P4_PFLOW_COMBINATION),true) ; }
1026  double noCutMin = -999999999. ;
1027  if ((*el)->mva_e_pi()<noCutMin) { throw cms::Exception("GsfElectronAlgo|UnexpectedMvaValue")<<"unexpected MVA value: "<<(*el)->mva_e_pi() ; }
1028  }
1029  }
1030  }
1031 
1032  // Isolation Values
1033  // Retreive not found info from ed electrons
1034  if( (eventData_->edIsolationValues).size() != 0 )
1035  {
1036  edIndex = 0, edElectron = edElectrons->begin() ;
1037  while ((found == false)&&(edElectron != edElectrons->end()))
1038  {
1039  if (edElectron->gsfTrack()==(*el)->gsfTrack())
1040  {
1041  found = true ;
1042 
1043  // CONSTRUCTION D UNE REF dans le handle eventData_->previousElectrons avec l'indice edIndex,
1044  // puis recuperation dans la ValueMap ED
1045 
1047  edElectronRef(eventData_->previousElectrons, edIndex);
1049  isoVariables.sumChargedHadronPt =(*(eventData_->edIsolationValues)[0])[edElectronRef];
1050  isoVariables.sumPhotonEt =(*(eventData_->edIsolationValues)[1])[edElectronRef];
1051  isoVariables.sumNeutralHadronEt =(*(eventData_->edIsolationValues)[2])[edElectronRef];
1052  (*el)->setPfIsolationVariables(isoVariables);
1053  }
1054 
1055  edIndex++ ;
1056  edElectron++ ;
1057  }
1058  }
1059 
1060  // Preselection
1062 
1063  }
1064  }
1065 
1067  {
1068  bool passCutBased=ele->passingCutBasedPreselection();
1069  bool passPF=ele->passingPflowPreselection(); //it is worth nothing for gedGsfElectrons, this does nothing as its not set till GedGsfElectron finaliser, this is always false
1071  bool passmva=ele->passingMvaPreselection();
1072  if(!ele->ecalDrivenSeed()){
1074  return passmva && passCutBased;
1075  else
1076  return passmva;
1077  }
1078  else{
1079  return passCutBased || passPF || passmva;
1080  }
1081  }
1082  else{
1083  return passCutBased || passPF;
1084  }
1085 
1086  return true;
1087  }
1088 
1090  {
1091  GsfElectronPtrCollection::size_type ei = 1, emax = eventData_->electrons->size() ;
1092  GsfElectronPtrCollection::iterator eitr = eventData_->electrons->begin() ;
1093  while (eitr!=eventData_->electrons->end())
1094  {
1095  LogTrace("GsfElectronAlgo")<<"========== removed not preselected "<<ei<<"/"<<emax<<"==========" ;
1096  if (isPreselected(*eitr))
1097  { ++eitr ; ++ei ; }
1098  else
1099  { delete (*eitr) ; eitr = eventData_->electrons->erase(eitr) ; ++ei ; }
1100  }
1101  }
1102 
1103 
1105  {
1106  // default value
1107  ele->setPassCutBasedPreselection(false) ;
1108 
1109  // kind of seeding
1110  bool eg = ele->core()->ecalDrivenSeed() ;
1111  bool pf = ele->core()->trackerDrivenSeed() && !ele->core()->ecalDrivenSeed() ;
1112  bool gedMode = generalData_->strategyCfg.gedElectronMode;
1113  if (eg&&pf) { throw cms::Exception("GsfElectronAlgo|BothEcalAndPureTrackerDriven")<<"An electron cannot be both egamma and purely pflow" ; }
1114  if ((!eg)&&(!pf)) { throw cms::Exception("GsfElectronAlgo|NeitherEcalNorPureTrackerDriven")<<"An electron cannot be neither egamma nor purely pflow" ; }
1115 
1116  const CutsConfiguration * cfg = ((eg||gedMode)?&generalData_->cutsCfg:&generalData_->cutsCfgPflow);
1117 
1118  // Et cut
1119  double etaValue = EleRelPoint(ele->superCluster()->position(),bs.position()).eta() ;
1120  double etValue = ele->superCluster()->energy()/cosh(etaValue) ;
1121  LogTrace("GsfElectronAlgo") << "Et : " << etValue ;
1122  if (ele->isEB() && (etValue < cfg->minSCEtBarrel)) return ;
1123  if (ele->isEE() && (etValue < cfg->minSCEtEndcaps)) return ;
1124  LogTrace("GsfElectronAlgo") << "Et criteria are satisfied";
1125 
1126  // E/p cut
1127  double eopValue = ele->eSuperClusterOverP() ;
1128  LogTrace("GsfElectronAlgo") << "E/p : " << eopValue ;
1129  if (ele->isEB() && (eopValue > cfg->maxEOverPBarrel)) return ;
1130  if (ele->isEE() && (eopValue > cfg->maxEOverPEndcaps)) return ;
1131  if (ele->isEB() && (eopValue < cfg->minEOverPBarrel)) return ;
1132  if (ele->isEE() && (eopValue < cfg->minEOverPEndcaps)) return ;
1133  LogTrace("GsfElectronAlgo") << "E/p criteria are satisfied";
1134 
1135  // HoE cuts
1136  LogTrace("GsfElectronAlgo") << "HoE1 : " << ele->hcalDepth1OverEcal() << ", HoE2 : " << ele->hcalDepth2OverEcal();
1137  double had = ele->hcalOverEcal()*ele->superCluster()->energy() ;
1138  const reco::CaloCluster & seedCluster = *(ele->superCluster()->seed()) ;
1139  int detector = seedCluster.hitsAndFractions()[0].first.subdetId() ;
1140  bool HoEveto = false ;
1141  if (detector==EcalBarrel && (had<cfg->maxHBarrel || (had/ele->superCluster()->energy())<cfg->maxHOverEBarrel)) HoEveto=true;
1142  else if (detector==EcalEndcap && (had<cfg->maxHEndcaps || (had/ele->superCluster()->energy())<cfg->maxHOverEEndcaps)) HoEveto=true;
1143  if ( !HoEveto ) return ;
1144  LogTrace("GsfElectronAlgo") << "H/E criteria are satisfied";
1145 
1146  // delta eta criteria
1147  double deta = ele->deltaEtaSuperClusterTrackAtVtx() ;
1148  LogTrace("GsfElectronAlgo") << "delta eta : " << deta ;
1149  if (ele->isEB() && (std::abs(deta) > cfg->maxDeltaEtaBarrel)) return ;
1150  if (ele->isEE() && (std::abs(deta) > cfg->maxDeltaEtaEndcaps)) return ;
1151  LogTrace("GsfElectronAlgo") << "Delta eta criteria are satisfied";
1152 
1153  // delta phi criteria
1154  double dphi = ele->deltaPhiSuperClusterTrackAtVtx();
1155  LogTrace("GsfElectronAlgo") << "delta phi : " << dphi;
1156  if (ele->isEB() && (std::abs(dphi) > cfg->maxDeltaPhiBarrel)) return ;
1157  if (ele->isEE() && (std::abs(dphi) > cfg->maxDeltaPhiEndcaps)) return ;
1158  LogTrace("GsfElectronAlgo") << "Delta phi criteria are satisfied";
1159 
1160  // sigma ieta ieta
1161  LogTrace("GsfElectronAlgo") << "sigma ieta ieta : " << ele->sigmaIetaIeta();
1162  if (ele->isEB() && (ele->sigmaIetaIeta() > cfg->maxSigmaIetaIetaBarrel)) return ;
1163  if (ele->isEE() && (ele->sigmaIetaIeta() > cfg->maxSigmaIetaIetaEndcaps)) return ;
1164  LogTrace("GsfElectronAlgo") << "Sigma ieta ieta criteria are satisfied";
1165 
1166  // fiducial
1167  if (!ele->isEB() && cfg->isBarrel) return ;
1168  if (!ele->isEE() && cfg->isEndcaps) return ;
1169  if (cfg->isFiducial && (ele->isEBEEGap()||ele->isEBEtaGap()||ele->isEBPhiGap()||ele->isEERingGap()||ele->isEEDeeGap())) return ;
1170  LogTrace("GsfElectronAlgo") << "Fiducial flags criteria are satisfied";
1171 
1172  // seed in TEC
1173  edm::RefToBase<TrajectorySeed> seed = ele->gsfTrack()->extra()->seedRef() ;
1174  ElectronSeedRef elseed = seed.castTo<ElectronSeedRef>() ;
1175  if (eg && !generalData_->cutsCfg.seedFromTEC)
1176  {
1177  if (elseed.isNull())
1178  { throw cms::Exception("GsfElectronAlgo|NotElectronSeed")<<"The GsfTrack seed is not an ElectronSeed ?!" ; }
1179  else
1180  { if (elseed->subDet2()==6) return ; }
1181  }
1182 
1183  // transverse impact parameter
1184  if (std::abs(ele->gsfTrack()->dxy(bs.position()))>cfg->maxTIP) return ;
1185  LogTrace("GsfElectronAlgo") << "TIP criterion is satisfied" ;
1186 
1187  LogTrace("GsfElectronAlgo") << "All cut based criteria are satisfied" ;
1188  ele->setPassCutBasedPreselection(true) ;
1189  }
1190 
1192  {
1193  ele->setPassMvaPreselection(false) ;
1194 
1195  if (ele->core()->ecalDrivenSeed())
1196  { if (ele->mvaOutput().mva_e_pi>=generalData_->cutsCfg.minMVA) ele->setPassMvaPreselection(true) ; }
1197  else
1199 
1200  if (ele->passingMvaPreselection())
1201  { LogTrace("GsfElectronAlgo") << "Main mva criterion is satisfied" ; }
1202 
1204 
1205  }
1206 
1207 void GsfElectronAlgo::setMVAInputs(const std::map<reco::GsfTrackRef,reco::GsfElectron::MvaInput> & mvaInputs)
1208 {
1209  GsfElectronPtrCollection::iterator el ;
1210  for
1211  ( el = eventData_->electrons->begin() ;
1212  el != eventData_->electrons->end() ;
1213  el++ )
1214  {
1215  std::map<reco::GsfTrackRef,reco::GsfElectron::MvaInput>::const_iterator itcheck=mvaInputs.find((*el)->gsfTrack());
1216  (*el)->setMvaInput(itcheck->second);
1217  }
1218 }
1219 
1221  const std::map<reco::GsfTrackRef,reco::GsfElectron::MvaOutput> & mvaOutputs)
1222 {
1223  GsfElectronPtrCollection::iterator el ;
1224  for
1225  ( el = eventData_->electrons->begin() ;
1226  el != eventData_->electrons->end() ;
1227  el++ )
1228  {
1230  float mva_NIso_Value= hoc->sElectronMVAEstimator->mva( *(*el), *(eventData_->vertices));
1231  float mva_Iso_Value = hoc->iElectronMVAEstimator->mva( *(*el), eventData_->vertices->size() );
1232  GsfElectron::MvaOutput mvaOutput ;
1233  mvaOutput.mva_e_pi = mva_NIso_Value ;
1234  mvaOutput.mva_Isolated = mva_Iso_Value ;
1235  (*el)->setMvaOutput(mvaOutput);
1236  }
1237  else{
1238  std::map<reco::GsfTrackRef,reco::GsfElectron::MvaOutput>::const_iterator itcheck=mvaOutputs.find((*el)->gsfTrack());
1239  (*el)->setMvaOutput(itcheck->second);
1240  }
1241  }
1242 }
1243 
1245  {
1246  // eventually check ctf track
1249 
1250  // charge ID
1251  int eleCharge ;
1252  GsfElectron::ChargeInfo eleChargeInfo ;
1253  electronData_->computeCharge(eleCharge,eleChargeInfo) ;
1254 
1255  // electron basic cluster
1257 
1258  // Seed cluster
1259  const reco::CaloCluster & seedCluster = *(electronData_->superClusterRef->seed()) ;
1260 
1261  // seed Xtal
1262  // temporary, till CaloCluster->seed() is made available
1263  DetId seedXtalId = seedCluster.hitsAndFractions()[0].first ;
1264 
1266 
1267 
1268  //====================================================
1269  // Candidate attributes
1270  //====================================================
1271 
1273 
1274 
1275  //====================================================
1276  // Track-Cluster Matching
1277  //====================================================
1278 
1280  tcMatching.electronCluster = elbcRef ;
1281  tcMatching.eSuperClusterOverP = (electronData_->vtxMom.mag()>0)?(electronData_->superClusterRef->energy()/electronData_->vtxMom.mag()):(-1.) ;
1282  tcMatching.eSeedClusterOverP = (electronData_->vtxMom.mag()>0.)?(seedCluster.energy()/electronData_->vtxMom.mag()):(-1) ;
1283  tcMatching.eSeedClusterOverPout = (electronData_->seedMom.mag()>0.)?(seedCluster.energy()/electronData_->seedMom.mag()):(-1.) ;
1284  tcMatching.eEleClusterOverPout = (electronData_->eleMom.mag()>0.)?(elbcRef->energy()/electronData_->eleMom.mag()):(-1.) ;
1285 
1287  tcMatching.deltaEtaSuperClusterAtVtx = scAtVtx.dEta() ;
1288  tcMatching.deltaPhiSuperClusterAtVtx = scAtVtx.dPhi() ;
1289 
1290  EleRelPointPair seedAtCalo(seedCluster.position(),electronData_->seedPos,eventData_->beamspot->position()) ;
1291  tcMatching.deltaEtaSeedClusterAtCalo = seedAtCalo.dEta() ;
1292  tcMatching.deltaPhiSeedClusterAtCalo = seedAtCalo.dPhi() ;
1293 
1294  EleRelPointPair ecAtCalo(elbcRef->position(),electronData_->elePos,eventData_->beamspot->position()) ;
1295  tcMatching.deltaEtaEleClusterAtCalo = ecAtCalo.dEta() ;
1296  tcMatching.deltaPhiEleClusterAtCalo = ecAtCalo.dPhi() ;
1297 
1298 
1299  //=======================================================
1300  // Track extrapolations
1301  //=======================================================
1302 
1311 
1312 
1313  //=======================================================
1314  // Closest Ctf Track
1315  //=======================================================
1316 
1318  ctfInfo.ctfTrack = electronData_->ctfTrackRef ;
1320 
1321 
1322  //====================================================
1323  // FiducialFlags, using nextToBoundary definition of gaps
1324  //====================================================
1325 
1326  reco::GsfElectron::FiducialFlags fiducialFlags ;
1327  int region = seedXtalId.det();
1328  int detector = seedXtalId.subdetId() ;
1329  double feta=std::abs(electronData_->superClusterRef->position().eta()) ;
1330  if (detector==EcalBarrel)
1331  {
1332  fiducialFlags.isEB = true ;
1333  EBDetId ebdetid(seedXtalId);
1334  if (EBDetId::isNextToEtaBoundary(ebdetid))
1335  {
1336  if (ebdetid.ietaAbs()==85)
1337  { fiducialFlags.isEBEEGap = true ; }
1338  else
1339  { fiducialFlags.isEBEtaGap = true ; }
1340  }
1341  if (EBDetId::isNextToPhiBoundary(ebdetid))
1342  { fiducialFlags.isEBPhiGap = true ; }
1343  }
1344  else if (detector==EcalEndcap)
1345  {
1346  fiducialFlags.isEE = true ;
1347  EEDetId eedetid(seedXtalId);
1348  if (EEDetId::isNextToRingBoundary(eedetid))
1349  {
1350  if (std::abs(feta)<2.)
1351  { fiducialFlags.isEBEEGap = true ; }
1352  else
1353  { fiducialFlags.isEERingGap = true ; }
1354  }
1355  if (EEDetId::isNextToDBoundary(eedetid))
1356  { fiducialFlags.isEEDeeGap = true ; }
1357  }
1358  else if ( region==DetId::Forward || region == DetId::Hcal )
1359  {
1360  fiducialFlags.isEE = true ;
1361  //HGCalDetId eeDetid(seedXtalId);
1362  // fill in fiducial information when we know how to use it...
1363  }
1364  else
1365  { throw cms::Exception("GsfElectronAlgo|UnknownXtalRegion")<<"createElectron(): do not know if it is a barrel or endcap seed cluster !!!!" ; }
1366 
1367 
1368  //====================================================
1369  // ShowerShape
1370  //====================================================
1371 
1372  reco::GsfElectron::ShowerShape showerShape;
1373  reco::GsfElectron::ShowerShape full5x5_showerShape;
1374  if( !(region==DetId::Forward || region == DetId::Hcal) ) {
1375  calculateShowerShape(electronData_->superClusterRef,!(electronData_->coreRef->ecalDrivenSeed()),showerShape) ;
1376  calculateShowerShape_full5x5(electronData_->superClusterRef,!(electronData_->coreRef->ecalDrivenSeed()),full5x5_showerShape) ;
1377  }
1378 
1379  //====================================================
1380  // ConversionRejection
1381  //====================================================
1382 
1384 
1385  ConversionFinder conversionFinder ;
1386  double BInTesla = eventSetupData_->magField->inTesla(GlobalPoint(0.,0.,0.)).z() ;
1388  if (!ctfTracks.isValid()) { ctfTracks = eventData_->currentCtfTracks ; }
1389 
1390  // values of conversionInfo.flag()
1391  // -9999 : Partner track was not found
1392  // 0 : Partner track found in the CTF collection using
1393  // 1 : Partner track found in the CTF collection using
1394  // 2 : Partner track found in the GSF collection using
1395  // 3 : Partner track found in the GSF collection using the electron's GSF track
1396  ConversionInfo conversionInfo = conversionFinder.getConversionInfo
1397  (*electronData_->coreRef,ctfTracks,eventData_->originalGsfTracks,BInTesla) ;
1398 
1400  conversionVars.flags = conversionInfo.flag() ;
1401  conversionVars.dist = conversionInfo.dist() ;
1402  conversionVars.dcot = conversionInfo.dcot() ;
1403  conversionVars.radius = conversionInfo.radiusOfConversion() ;
1404  if ((conversionVars.flags==0)or(conversionVars.flags==1))
1405  conversionVars.partner = TrackBaseRef(conversionInfo.conversionPartnerCtfTk()) ;
1406  else if ((conversionVars.flags==2)or(conversionVars.flags==3))
1407  conversionVars.partner = TrackBaseRef(conversionInfo.conversionPartnerGsfTk()) ;
1408 
1409 
1410  //====================================================
1411  // Go !
1412  //====================================================
1413 
1414  GsfElectron * ele = new
1415  GsfElectron
1416  ( eleCharge,eleChargeInfo,electronData_->coreRef,
1417  tcMatching, tkExtra, ctfInfo,
1418  fiducialFlags,showerShape, full5x5_showerShape,
1419  conversionVars ) ;
1420  // Will be overwritten later in the case of the regression
1422  ele->setP4(GsfElectron::P4_FROM_SUPER_CLUSTER,momentum,0,true) ;
1423 
1424  //====================================================
1425  // brems fractions
1426  //====================================================
1427 
1428  if (electronData_->innMom.mag()>0.)
1430 
1431  // the supercluster is the refined one The seed is not necessarily the first cluster
1432  // hence the use of the electronCluster
1433  SuperClusterRef sc = ele->superCluster() ;
1434  if (!(sc.isNull()))
1435  {
1436  CaloClusterPtr cl = ele->electronCluster() ;
1437  if (sc->clustersSize()>1)
1438  {
1439  float pf_fbrem =( sc->energy() - cl->energy() ) / sc->energy();
1440  ele->setSuperClusterFbrem( pf_fbrem ) ;
1441  }
1442  else
1443  {
1444  ele->setSuperClusterFbrem(0) ;
1445  }
1446  }
1447 
1448  //====================================================
1449  // classification and corrections
1450  //====================================================
1451  // classification
1452  ElectronClassification theClassifier ;
1453  theClassifier.classify(*ele) ;
1454  theClassifier.refineWithPflow(*ele) ;
1455  // ecal energy
1458  {
1463  }
1464  else // original implementation
1465  {
1466  if( region!=DetId::Forward && region != DetId::Hcal ) {
1467  if (ele->core()->ecalDrivenSeed())
1468  {
1470  { theEnCorrector.classBasedParameterizationEnergy(*ele,*eventData_->beamspot) ; }
1472  { theEnCorrector.classBasedParameterizationUncertainty(*ele) ; }
1473  }
1474  else
1475  {
1477  { theEnCorrector.simpleParameterizationUncertainty(*ele) ; }
1478  }
1479  }
1480  }
1481 
1482  // momentum
1483  // Keep the default correction running first. The track momentum error is computed in there
1484  if (ele->core()->ecalDrivenSeed())
1485  {
1486  ElectronMomentumCorrector theMomCorrector;
1487  theMomCorrector.correct(*ele,electronData_->vtxTSOS);
1488  }
1490  {
1492  }
1493 
1494  //====================================================
1495  // now isolation variables
1496  //====================================================
1497 
1501  if( !(region==DetId::Forward || region == DetId::Hcal) ) {
1514  }
1515  ele->setIsolation03(dr03);
1516  ele->setIsolation04(dr04);
1517 
1518 
1519  //====================================================
1520  // preselection flag
1521  //====================================================
1522 
1524  //setting mva flag, currently GedGsfElectron and GsfElectron pre-selection flags have desynced
1525  //this is for GedGsfElectrons, GsfElectrons (ie old pre 7X std reco) resets this later on
1526  //in the function "addPfInfo"
1527  //yes this is awful, we'll fix it once we work out how to...
1528  float mvaValue = hoc->sElectronMVAEstimator->mva( *(ele),*(eventData_->vertices));
1530 
1531  //====================================================
1532  // Pixel match variables
1533  //====================================================
1535 
1536  LogTrace("GsfElectronAlgo")<<"Constructed new electron with energy "<< ele->p4().e() ;
1537 
1538  eventData_->electrons->push_back(ele) ;
1539  }
1540 
1541 
1542 //=======================================================================================
1543 // Ambiguity solving
1544 //=======================================================================================
1545 
1546 //bool better_electron( const reco::GsfElectron * e1, const reco::GsfElectron * e2 )
1547 // { return (std::abs(e1->eSuperClusterOverP()-1)<std::abs(e2->eSuperClusterOverP()-1)) ; }
1548 
1549 void GsfElectronAlgo::setAmbiguityData( bool ignoreNotPreselected )
1550  {
1551  GsfElectronPtrCollection::iterator e1, e2 ;
1556  else
1557  { throw cms::Exception("GsfElectronAlgo|UnknownAmbiguitySortingStrategy")<<"value of generalData_->strategyCfg.ambSortingStrategy is : "<<generalData_->strategyCfg.ambSortingStrategy ; }
1558 
1559  // init
1560  for
1561  ( e1 = eventData_->electrons->begin() ;
1562  e1 != eventData_->electrons->end() ;
1563  ++e1 )
1564  {
1565  (*e1)->clearAmbiguousGsfTracks() ;
1566  (*e1)->setAmbiguous(false) ;
1567  }
1568 
1569  // get ambiguous from GsfPfRecTracks
1571  {
1572  for
1573  ( e1 = eventData_->electrons->begin() ;
1574  e1 != eventData_->electrons->end() ;
1575  ++e1 )
1576  {
1577  bool found = false ;
1578  const GsfPFRecTrackCollection * gsfPfRecTrackCollection = eventData_->gsfPfRecTracks.product() ;
1579  GsfPFRecTrackCollection::const_iterator gsfPfRecTrack ;
1580  for ( gsfPfRecTrack=gsfPfRecTrackCollection->begin() ;
1581  gsfPfRecTrack!=gsfPfRecTrackCollection->end() ;
1582  ++gsfPfRecTrack )
1583  {
1584  if (gsfPfRecTrack->gsfTrackRef()==(*e1)->gsfTrack())
1585  {
1586  if (found)
1587  {
1588  edm::LogWarning("GsfElectronAlgo")<<"associated gsfPfRecTrack already found" ;
1589  }
1590  else
1591  {
1592  found = true ;
1593  const std::vector<reco::GsfPFRecTrackRef> & duplicates(gsfPfRecTrack->convBremGsfPFRecTrackRef()) ;
1594  std::vector<reco::GsfPFRecTrackRef>::const_iterator duplicate ;
1595  for ( duplicate = duplicates.begin() ; duplicate != duplicates.end() ; duplicate ++ )
1596  { (*e1)->addAmbiguousGsfTrack((*duplicate)->gsfTrackRef()) ; }
1597  }
1598  }
1599  }
1600  }
1601  }
1602  // or search overlapping clusters
1603  else
1604  {
1605  for
1606  ( e1 = eventData_->electrons->begin() ;
1607  e1 != eventData_->electrons->end() ;
1608  ++e1 )
1609  {
1610  if ((*e1)->ambiguous()) continue ;
1611  if ( ignoreNotPreselected && !isPreselected(*e1) ) continue ;
1612 
1613  SuperClusterRef scRef1 = (*e1)->superCluster();
1614  CaloClusterPtr eleClu1 = (*e1)->electronCluster();
1615  LogDebug("GsfElectronAlgo")
1616  << "Blessing electron with E/P " << (*e1)->eSuperClusterOverP()
1617  << ", cluster " << scRef1.get()
1618  << " & track " << (*e1)->gsfTrack().get() ;
1619 
1620  for
1621  ( e2 = e1, ++e2 ;
1622  e2 != eventData_->electrons->end() ;
1623  ++e2 )
1624  {
1625  if ((*e2)->ambiguous()) continue ;
1626  if ( ignoreNotPreselected && !isPreselected(*e2) ) continue ;
1627 
1628  SuperClusterRef scRef2 = (*e2)->superCluster();
1629  CaloClusterPtr eleClu2 = (*e2)->electronCluster();
1630 
1631  // search if same cluster
1632  bool sameCluster = false ;
1634  { sameCluster = (scRef1==scRef2) ; }
1636  {
1637  float eMin = 1. ;
1638  float threshold = eMin*cosh(EleRelPoint(scRef1->position(),eventData_->beamspot->position()).eta()) ;
1639  sameCluster =
1641  (EgAmbiguityTools::sharedEnergy(&(*scRef1->seed()),&(*eleClu2),eventData_->barrelRecHits,eventData_->endcapRecHits)>=threshold) ||
1643  (EgAmbiguityTools::sharedEnergy(&(*scRef1->seed()),&(*scRef2->seed()),eventData_->barrelRecHits,eventData_->endcapRecHits)>=threshold) ) ;
1644  }
1645  else
1646  { throw cms::Exception("GsfElectronAlgo|UnknownAmbiguityClustersOverlapStrategy")<<"value of generalData_->strategyCfg.ambClustersOverlapStrategy is : "<<generalData_->strategyCfg.ambClustersOverlapStrategy ; }
1647 
1648  // main instructions
1649  if (sameCluster)
1650  {
1651  LogDebug("GsfElectronAlgo")
1652  << "Discarding electron with E/P " << (*e2)->eSuperClusterOverP()
1653  << ", cluster " << scRef2.get()
1654  << " and track " << (*e2)->gsfTrack().get() ;
1655  (*e1)->addAmbiguousGsfTrack((*e2)->gsfTrack()) ;
1656  (*e2)->setAmbiguous(true) ;
1657  }
1658  else if ((*e1)->gsfTrack()==(*e2)->gsfTrack())
1659  {
1660  edm::LogWarning("GsfElectronAlgo")
1661  << "Forgetting electron with E/P " << (*e2)->eSuperClusterOverP()
1662  << ", cluster " << scRef2.get()
1663  << " and track " << (*e2)->gsfTrack().get() ;
1664  (*e2)->setAmbiguous(true) ;
1665  }
1666  }
1667  }
1668  }
1669  }
1670 
1672  {
1673  GsfElectronPtrCollection::size_type ei = 1, emax = eventData_->electrons->size() ;
1674  GsfElectronPtrCollection::iterator eitr = eventData_->electrons->begin() ;
1675  while (eitr!=eventData_->electrons->end())
1676  {
1677  LogTrace("GsfElectronAlgo")<<"========== remove ambiguous "<<ei<<"/"<<emax<<"==========" ;
1678  if ((*eitr)->ambiguous())
1679  { delete (*eitr) ; eitr = eventData_->electrons->erase(eitr) ; ++ei ; }
1680  else
1681  { ++eitr ; ++ei ; }
1682  }
1683  }
1684 
1685 
1686 // Pixel match variables
1688  int sd1 = 0 ;
1689  int sd2 = 0 ;
1690  float dPhi1 = 0 ;
1691  float dPhi2 = 0 ;
1692  float dRz1 = 0 ;
1693  float dRz2 = 0 ;
1694  edm::RefToBase<TrajectorySeed> seed = ele->gsfTrack()->extra()->seedRef();
1695  ElectronSeedRef elseed = seed.castTo<ElectronSeedRef>();
1696  if(seed.isNull()){}
1697  else{
1698  if(elseed.isNull()){}
1699  else{
1700  sd1 = elseed->subDet1() ;
1701  sd2 = elseed->subDet2() ;
1702  dPhi1 = (ele->charge()>0) ? elseed->dPhi1Pos() : elseed->dPhi1() ;
1703  dPhi2 = (ele->charge()>0) ? elseed->dPhi2Pos() : elseed->dPhi2() ;
1704  dRz1 = (ele->charge()>0) ? elseed->dRz1Pos () : elseed->dRz1 () ;
1705  dRz2 = (ele->charge()>0) ? elseed->dRz2Pos () : elseed->dRz2 () ;
1706  }
1707  }
1708  ele->setPixelMatchSubdetectors(sd1,sd2) ;
1709  ele->setPixelMatchDPhi1(dPhi1) ;
1710  ele->setPixelMatchDPhi2(dPhi2) ;
1711  ele->setPixelMatchDRz1 (dRz1 ) ;
1712  ele->setPixelMatchDRz2 (dRz2 ) ;
1713 }
#define LogDebug(id)
TrajectoryStateOnSurface constrainAtBeamSpot(const reco::GsfTrack &, const reco::BeamSpot &) const
(multi)TSOS after including the beamspot
CaloClusterPtr electronCluster() const
Definition: GsfElectron.h:242
ElectronHcalHelper * hcalHelperPflow
void setPixelMatchInfomation(reco::GsfElectron *)
edm::Handle< reco::TrackCollection > originalCtfTracks
T getParameter(std::string const &) const
unsigned long long cacheIdentifier() const
edm::Handle< reco::ElectronSeedCollection > seeds
bool empty() const
Definition: ParameterSet.h:218
const MultiTrajectoryStateMode * mtsMode
bool isPreselected(reco::GsfElectron *ele)
const math::XYZPoint & position() const
cluster centroid position
Definition: CaloCluster.h:126
void applyCombinationRegression(reco::GsfElectron &ele) const
void setMVAOutputs(const gsfAlgoHelpers::HeavyObjectCache *, const std::map< reco::GsfTrackRef, reco::GsfElectron::MvaOutput > &mvaOutputs)
void setTrackFbrem(float fbrem)
Definition: GsfElectron.h:701
int i
Definition: DBlmapReader.cc:9
edm::Handle< edm::ValueMap< float > > pfMva
std::unique_ptr< const SoftElectronMVAEstimator > sElectronMVAEstimator
void setP4(P4Kind kind, const LorentzVector &p4, float p4Error, bool setCandidate)
Definition: GsfElectron.cc:198
GeneralData * generalData_
const CutsConfiguration cutsCfgPflow
GeneralData(const InputTagsConfiguration &, const StrategyConfiguration &, const CutsConfiguration &cutsCfg, const CutsConfiguration &cutsCfgPflow, const ElectronHcalHelper::Configuration &hcalCfg, const ElectronHcalHelper::Configuration &hcalCfgPflow, const IsolationConfiguration &, const EcalRecHitsConfiguration &, EcalClusterFunctionBaseClass *superClusterErrorFunction, EcalClusterFunctionBaseClass *crackCorrectionFunction, const SoftElectronMVAEstimator::Configuration &mva_NIso_Cfg, const ElectronMVAEstimator::Configuration &mva_Iso_Cfg, const RegressionHelper::Configuration &)
static bool isNextToEtaBoundary(EBDetId id)
Definition: EBDetId.cc:125
EgammaTowerIsolation * hadDepth1Isolation04Bc
reco::GsfTrackRef conversionPartnerGsfTk() const
static const TGPicture * info(bool iBackgroundIsBlack)
void setPassCutBasedPreselection(bool flag)
Definition: GsfElectron.h:654
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:252
bool positionFromModeCartesian(const TrajectoryStateOnSurface tsos, GlobalPoint &position) const
tuple cfg
Definition: looper.py:293
void setPixelMatchDRz2(float dRz2)
Definition: GsfElectron.h:829
edm::EDGetTokenT< reco::GsfElectronCoreCollection > gsfElectronCores
bool isEBEtaGap() const
Definition: GsfElectron.h:355
void readEvent(const edm::Event &)
EgammaTowerIsolation * hadDepth1Isolation03Bc
double radiusOfConversion() const
static std::vector< float > covariances(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology, const CaloGeometry *geometry, float w0=4.7)
void clonePreviousElectrons()
const LorentzVector & p4(P4Kind kind) const
Definition: GsfElectron.cc:224
float eSuperClusterOverP() const
Definition: GsfElectron.h:243
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
bool isBetter(const reco::GsfElectron *, const reco::GsfElectron *)
CaloTopology const * topology(0)
void retreiveOriginalTrackCollections(const reco::TrackRef &, const reco::GsfTrackRef &)
void setPixelMatchDPhi1(float dPhi1)
Definition: GsfElectron.h:826
bool isEBEEGap() const
Definition: GsfElectron.h:353
float hcalDepth2OverEcal() const
Definition: GsfElectron.h:423
static float eMax(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits)
edm::EDGetTokenT< reco::GsfElectronCollection > previousGsfElectrons
double getEtSum(const reco::Candidate *emObject) const
const IsolationConfiguration isoCfg
edm::EDGetTokenT< reco::VertexCollection > vtxCollectionTag
void calculateShowerShape(const reco::SuperClusterRef &, bool pflow, reco::GsfElectron::ShowerShape &)
void beginEvent(edm::Event &)
TrajectoryStateOnSurface sclTSOS
const EcalRecHitsConfiguration recHitsCfg
EventSetupData * eventSetupData_
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
edm::Handle< EcalRecHitCollection > endcapRecHits
double hcalESumDepth2BehindClusters(const std::vector< CaloTowerDetId > &towers)
double dist() const
std::vector< CaloTowerDetId > hcalTowersBehindClusters(const reco::SuperCluster &sc)
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:192
void checkSetup(const edm::EventSetup &)
void setMVAInputs(const std::map< reco::GsfTrackRef, reco::GsfElectron::MvaInput > &mvaInputs)
bool isEERingGap() const
Definition: GsfElectron.h:359
bool passingCutBasedPreselection() const
Definition: GsfElectron.h:646
bool passingMvaPreselection() const
Definition: GsfElectron.h:662
edm::EDGetTokenT< EcalRecHitCollection > endcapRecHitCollection
void computeCharge(int &charge, reco::GsfElectron::ChargeInfo &info)
bool momentumFromModeCartesian(const TrajectoryStateOnSurface tsos, GlobalVector &momentum) const
void checkCtfTrack(edm::Handle< reco::TrackCollection > currentCtfTracks)
void completeElectrons(const gsfAlgoHelpers::HeavyObjectCache *)
double hcalESumDepth1BehindClusters(const std::vector< CaloTowerDetId > &towers)
const InputTagsConfiguration inputCfg
edm::ESHandle< EcalSeverityLevelAlgo > sevLevel
TrajectoryStateOnSurface innTSOS
uint16_t size_type
bool isEEDeeGap() const
Definition: GsfElectron.h:358
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
EgammaTowerIsolation * hadDepth1Isolation03
edm::EDGetTokenT< reco::GsfElectronCollection > pflowGsfElectronsTag
const StrategyConfiguration strategyCfg
bool isEE() const
Definition: GsfElectron.h:351
ProductID id() const
Accessor for product ID.
Definition: Ref.h:258
bool isEB() const
Definition: GsfElectron.h:350
TrajectoryStateOnSurface outerStateOnSurface(const reco::GsfTrack &tk) const
void setPixelMatchSubdetectors(int sd1, int sd2)
Definition: GsfElectron.h:825
edm::EDGetTokenT< EcalRecHitCollection > barrelRecHitCollection
edm::ESHandle< CaloTopology > caloTopo
void doFlagChecks(const std::vector< int > &v)
edm::EDGetTokenT< reco::GsfPFRecTrackCollection > gsfPfRecTracksTag
reco::TrackRef conversionPartnerCtfTk() const
const Double_t pi
void createElectron(const gsfAlgoHelpers::HeavyObjectCache *)
void setSuperClusterFbrem(float fbrem)
Definition: GsfElectron.h:702
EgammaRecHitIsolation * ecalBarrelIsol04
TrajectoryStateOnSurface constrainedVtxTSOS
virtual float getValue(const reco::BasicCluster &, const EcalRecHitCollection &) const =0
const RegressionHelper::Configuration regCfg
T barePhi() const
Definition: PV3DBase.h:68
EgammaTowerIsolation * hadDepth2Isolation03
EgammaTowerIsolation * hadDepth1Isolation04
edm::EDGetTokenT< reco::BeamSpot > beamSpotTag
ElectronTkIsolation * tkIsolation03
void setUseNumCrystals(bool b=true)
float deltaEtaSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:247
void setCorrectedEcalEnergyError(float newEnergyError)
Definition: GsfElectron.cc:178
T mag() const
Definition: PV3DBase.h:67
float sigmaIetaIeta() const
Definition: GsfElectron.h:416
bool isNotFinite(T x)
Definition: isFinite.h:10
void calculateShowerShape_full5x5(const reco::SuperClusterRef &, bool pflow, reco::GsfElectron::ShowerShape &)
uint16_t hitPattern[ARRAY_LENGTH]
Definition: HitPattern.h:472
void simpleParameterizationUncertainty(reco::GsfElectron &)
TrajectoryStateOnSurface extrapolatedState(const TrajectoryStateOnSurface tsos, const GlobalPoint &point) const
void setCutBasedPreselectionFlag(reco::GsfElectron *ele, const reco::BeamSpot &)
double dPhi(double phi1, double phi2)
Definition: JetUtil.h:30
std::vector< GsfPFRecTrack > GsfPFRecTrackCollection
collection of GsfPFRecTrack objects
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
Definition: TrackFwd.h:32
EgammaRecHitIsolation * ecalEndcapIsol03
float sharedEnergy(const reco::CaloCluster *, const reco::CaloCluster *, edm::Handle< EcalRecHitCollection > &barrelRecHits, edm::Handle< EcalRecHitCollection > &endcapRecHits)
EgammaTowerIsolation * hadDepth2Isolation03Bc
RealType normalized_phi(RealType phi)
T sqrt(T t)
Definition: SSEVec.h:18
virtual SuperClusterRef superCluster() const
reference to a SuperCluster
Definition: GsfElectron.h:182
GsfConstraintAtVertex * constraintAtVtx
static bool isNextToPhiBoundary(EBDetId id)
Definition: EBDetId.cc:130
float sumPhotonEt
sum pt of PF photons // old float photonIso ;
Definition: GsfElectron.h:575
edm::Handle< EcalRecHitCollection > barrelRecHits
float deltaPhiSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:250
std::vector< GsfElectronCore > GsfElectronCoreCollection
void correct(reco::GsfElectron &, TrajectoryStateOnSurface &)
virtual int charge() const final
electric charge
Definition: LeafCandidate.h:91
static float e2nd(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits)
float hcalOverEcal() const
Definition: GsfElectron.h:424
void setPassMvaPreselection(bool flag)
Definition: GsfElectron.h:661
IsolationValueMaps pfIsolationValues
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< CaloTowerDetId > hcalTowersBehindClusters
Definition: GsfElectron.h:386
const MultiTrajectoryStateTransform * mtsTransform
int j
Definition: DBlmapReader.cc:9
static bool isNextToRingBoundary(EEDetId id)
Definition: EEDetId.cc:375
std::list< reco::GsfElectron * > GsfElectronPtrCollection
static float e2x5Max(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
double hcalESumDepth2(const reco::SuperCluster &, const std::vector< CaloTowerDetId > *excludeTowers=0)
static float eBottom(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
double energy() const
cluster energy
Definition: CaloCluster.h:121
const CutsConfiguration cutsCfg
ElectronHcalHelper * hcalHelper
float sumNeutralHadronEt
sum pt of neutral hadrons // old float neutralHadronIso ;
Definition: GsfElectron.h:574
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:244
edm::EDGetTokenT< reco::ElectronSeedCollection > seedsTag
const reco::BeamSpot * beamspot
T min(T a, T b)
Definition: MathUtil.h:58
edm::ESHandle< MagneticField > magField
GsfElectronPtrCollection * electrons
CaloClusterPtr getEleBasicCluster(const MultiTrajectoryStateTransform *)
static bool isNextToDBoundary(EEDetId id)
Definition: EEDetId.cc:367
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
edm::EDGetTokenT< edm::ValueMap< float > > pfMVA
bool isValid() const
Definition: HandleBase.h:75
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
bool isNull() const
Checks for null.
Definition: Ref.h:249
void setIsolation04(const IsolationVariables &dr04)
Definition: GsfElectron.h:518
#define LogTrace(id)
void doSeverityChecks(const EcalRecHitCollection *const recHits, const std::vector< int > &v)
edm::EDGetTokenT< CaloTowerCollection > hcalTowersTag
void classify(reco::GsfElectron &)
EgammaTowerIsolation * hadDepth2Isolation04Bc
edm::EDGetTokenT< reco::TrackCollection > ctfTracks
edm::Handle< reco::GsfElectronCollection > previousElectrons
float hcalDepth1OverEcal() const
Definition: GsfElectron.h:422
void setPixelMatchDPhi2(float dPhi2)
Definition: GsfElectron.h:827
GsfElectronAlgo(const InputTagsConfiguration &, const StrategyConfiguration &, const CutsConfiguration &cutsCfg, const CutsConfiguration &cutsCfgPflow, const ElectronHcalHelper::Configuration &hcalCfg, const ElectronHcalHelper::Configuration &hcalCfgPflow, const IsolationConfiguration &, const EcalRecHitsConfiguration &, EcalClusterFunctionBaseClass *superClusterErrorFunction, EcalClusterFunctionBaseClass *crackCorrectionFunction, const SoftElectronMVAEstimator::Configuration &mva_NIso_Cfg, const ElectronMVAEstimator::Configuration &mva_Iso_Cfg, const RegressionHelper::Configuration &regCfg)
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
Float e1
Definition: deltaR.h:20
static float eTop(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
Definition: DetId.h:18
void classBasedParameterizationEnergy(reco::GsfElectron &, const reco::BeamSpot &bs)
edm::Handle< reco::VertexCollection > vertices
EgammaRecHitIsolation * ecalBarrelIsol03
edm::Handle< reco::GsfElectronCollection > pflowElectrons
int flag() const
T const * product() const
Definition: Handle.h:81
EcalClusterFunctionBaseClass * superClusterErrorFunction
REF castTo() const
Definition: RefToBase.h:286
bool isNull() const
Checks for null.
Definition: RefToBase.h:328
const T & get() const
Definition: EventSetup.h:56
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
void setPflowPreselectionFlag(reco::GsfElectron *ele)
const MvaOutput & mvaOutput() const
Definition: GsfElectron.h:620
T const * product() const
Definition: ESHandle.h:86
const reco::GsfTrackRef gsfTrackRef
void ele_convert(const Type1 &obj1, Type2 &obj2)
bool calculateTSOS(const MultiTrajectoryStateTransform *, GsfConstraintAtVertex *)
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:37
virtual GsfElectronCoreRef core() const
Definition: GsfElectron.cc:8
Float e2
Definition: deltaR.h:21
return(e1-e2)*(e1-e2)+dp *dp
math::XYZVectorF momentumAtVtxWithConstraint
Definition: GsfElectron.h:283
double getPtTracks(const reco::GsfElectron *) const
TrajectoryStateOnSurface innerStateOnSurface(const reco::GsfTrack &tk) const
TrajectoryStateOnSurface seedTSOS
void refineWithPflow(reco::GsfElectron &)
void setIsolation03(const IsolationVariables &dr03)
Definition: GsfElectron.h:517
ESHandle< TrackerGeometry > geometry
edm::EventID id() const
Definition: EventBase.h:58
edm::Handle< reco::GsfTrackCollection > originalGsfTracks
void applyEcalRegression(reco::GsfElectron &electron, const edm::Handle< reco::VertexCollection > &vertices, const edm::Handle< EcalRecHitCollection > &rechitsEB, const edm::Handle< EcalRecHitCollection > &rechitsEE) const
EgammaTowerIsolation * hadDepth2Isolation04
void setVetoClustered(bool b=true)
static std::atomic< unsigned int > counter
const reco::GsfElectronCoreRef coreRef
bool isEBPhiGap() const
Definition: GsfElectron.h:356
edm::Handle< reco::TrackCollection > currentCtfTracks
double getTowerEtSum(const reco::Candidate *cand, const std::vector< CaloTowerDetId > *detIdToExclude=0) const
edm::ESHandle< CaloGeometry > caloGeom
EcalClusterFunctionBaseClass * crackCorrectionFunction
void removeAmbiguousElectrons()
double hcalESumDepth1(const reco::SuperCluster &, const std::vector< CaloTowerDetId > *excludeTowers=0)
void displayInternalElectrons(const std::string &title) const
void setPassPflowPreselection(bool flag)
Definition: GsfElectron.h:655
EgammaRecHitIsolation * ecalEndcapIsol04
static float eRight(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
void removeNotPreselectedElectrons()
const reco::SuperClusterRef superClusterRef
TrajectoryStateOnSurface eleTSOS
const Point & position() const
position
Definition: BeamSpot.h:62
EventData * eventData_
static float e3x3(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
double dcot() const
TrajectoryStateOnSurface outTSOS
RegressionHelper * regHelper
ElectronData(const reco::GsfElectronCoreRef &core, const reco::BeamSpot &bs)
void copyElectrons(reco::GsfElectronCollection &)
ElectronTkIsolation * tkIsolation04
volatile std::atomic< bool > shutdown_flag false
ElectronData * electronData_
uint16_t getHitPattern(HitCategory category, int position) const
Definition: HitPattern.h:515
edm::ESHandle< TrackerGeometry > trackerHandle
void setAmbiguityData(bool ignoreNotPreselected=true)
IsolationValueMaps edIsolationValues
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
float sumChargedHadronPt
sum-pt of charged Hadron // old float chargedHadronIso ;
Definition: GsfElectron.h:573
virtual void init(const edm::EventSetup &es)=0
edm::Handle< reco::GsfElectronCoreCollection > coreElectrons
int ietaAbs() const
get the absolute value of the crystal ieta
Definition: EBDetId.h:49
void classBasedParameterizationUncertainty(reco::GsfElectron &)
static float eLeft(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
static std::vector< float > localCovariances(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology, float w0=4.7)
void checkSetup(const edm::EventSetup &)
void setPixelMatchDRz1(float dRz1)
Definition: GsfElectron.h:828
static float e1x5(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
edm::Handle< CaloTowerCollection > towers
std::unique_ptr< const ElectronMVAEstimator > iElectronMVAEstimator
void calculateMode(const MultiTrajectoryStateMode *mtsMode)
TrackingRecHitCollection::base::const_iterator trackingRecHit_iterator
iterator over a vector of reference to TrackingRecHit in the same collection
math::PtEtaPhiELorentzVectorF LorentzVector
Global3DVector GlobalVector
Definition: GlobalVector.h:10
void checkSetup(const edm::EventSetup &)
edm::Handle< reco::GsfPFRecTrackCollection > gsfPfRecTracks
TrajectoryStateOnSurface vtxTSOS
virtual GsfTrackRef gsfTrack() const
reference to a GsfTrack
Definition: GsfElectron.h:183
virtual double pt() const final
transverse momentum
static float e5x5(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
bool ecalDrivenSeed() const
Definition: GsfElectron.h:186
Candidate::LorentzVector calculateMomentum()
bool passingPflowPreselection() const
Definition: GsfElectron.h:647
const reco::BeamSpot beamSpot