CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Classes | Public Types | Public Member Functions | Private Member Functions | Private Attributes
GsfElectronAlgo Class Reference

#include <GsfElectronAlgo.h>

Classes

struct  CutsConfiguration
 
struct  EcalRecHitsConfiguration
 
struct  ElectronData
 
struct  EventData
 
struct  EventSetupData
 
struct  GeneralData
 
struct  InputTagsConfiguration
 
struct  IsolationConfiguration
 
struct  StrategyConfiguration
 

Public Types

typedef std::list
< reco::GsfElectron * > 
GsfElectronPtrCollection
 

Public Member Functions

void addPflowInfo ()
 
void beginEvent (edm::Event &)
 
void checkSetup (const edm::EventSetup &)
 
void clonePreviousElectrons ()
 
void completeElectrons ()
 
void copyElectrons (reco::GsfElectronCollection &)
 
void displayInternalElectrons (const std::string &title) const
 
void endEvent ()
 
 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)
 
void removeAmbiguousElectrons ()
 
void removeNotPreselectedElectrons ()
 
void setAmbiguityData (bool ignoreNotPreselected=true)
 
 ~GsfElectronAlgo ()
 

Private Member Functions

void calculateShowerShape (const reco::SuperClusterRef &, bool pflow, reco::GsfElectron::ShowerShape &)
 
void createElectron ()
 
const reco::SuperClusterRef getTrSuperCluster (const reco::GsfTrackRef &trackRef)
 
bool isPreselected (reco::GsfElectron *ele)
 
void setCutBasedPreselectionFlag (reco::GsfElectron *ele, const reco::BeamSpot &)
 
void setPflowPreselectionFlag (reco::GsfElectron *ele)
 

Private Attributes

ElectronDataelectronData_
 
EventDataeventData_
 
EventSetupDataeventSetupData_
 
GeneralDatageneralData_
 

Detailed Description

Definition at line 49 of file GsfElectronAlgo.h.

Member Typedef Documentation

Definition at line 192 of file GsfElectronAlgo.h.

Constructor & Destructor Documentation

GsfElectronAlgo::GsfElectronAlgo ( const InputTagsConfiguration inputCfg,
const StrategyConfiguration strategyCfg,
const CutsConfiguration cutsCfg,
const CutsConfiguration cutsCfgPflow,
const ElectronHcalHelper::Configuration hcalCfg,
const ElectronHcalHelper::Configuration hcalCfgPflow,
const IsolationConfiguration isoCfg,
const EcalRecHitsConfiguration recHitsCfg,
EcalClusterFunctionBaseClass superClusterErrorFunction,
EcalClusterFunctionBaseClass crackCorrectionFunction 
)

Definition at line 573 of file GsfElectronAlgo.cc.

584  : generalData_(new GeneralData(inputCfg,strategyCfg,cutsCfg,cutsCfgPflow,hcalCfg,hcalCfgPflow,isoCfg,recHitsCfg,superClusterErrorFunction,crackCorrectionFunction)),
585  eventSetupData_(new EventSetupData),
587  {}
GeneralData * generalData_
EventSetupData * eventSetupData_
EventData * eventData_
ElectronData * electronData_
GsfElectronAlgo::~GsfElectronAlgo ( )

Definition at line 589 of file GsfElectronAlgo.cc.

References electronData_, eventData_, eventSetupData_, and generalData_.

590  {
591  delete generalData_ ;
592  delete eventSetupData_ ;
593  delete eventData_ ;
594  delete electronData_ ;
595  }
GeneralData * generalData_
EventSetupData * eventSetupData_
EventData * eventData_
ElectronData * electronData_

Member Function Documentation

void GsfElectronAlgo::addPflowInfo ( )

Definition at line 825 of file GsfElectronAlgo.cc.

References calculateShowerShape(), GsfElectronAlgo::EventData::electrons, eventData_, edm::hlt::Exception, funct::false, first, newFWLiteAna::found, edm::Ref< C, T, F >::isNull(), pfElectrons_cff::pfElectrons, GsfElectronAlgo::EventData::pflowElectrons, edm::Handle< T >::product(), ElectronClassification::refineWithPflow(), setPflowPreselectionFlag(), and funct::true.

Referenced by GsfElectronProducer::produce().

826  {
827  bool found ;
829  GsfElectronCollection::const_iterator pfElectron ;
830 
831  GsfElectronPtrCollection::iterator el ;
832  for
833  ( el = eventData_->electrons->begin() ;
834  el != eventData_->electrons->end() ;
835  el++ )
836  {
837 // // MVA
838 // // we check that the value is never inferior to the no-cut value
839 // // we generally use in the configuration file for minMVA.
840 // GsfTrackRef gsfTrackRef = (*el)->gsfTrack() ;
841 // float mva = (*eventData_->pfMva.product())[gsfTrackRef] ;
842 // if (mva<noCutMin) { throw cms::Exception("GsfElectronAlgo|UnexpectedMvaValue")<<"unexpected MVA value: "<<mva ; }
843 //
844 // // Mva Output
845 // GsfElectron::MvaOutput mvaOutput ;
846 // mvaOutput.mva = mva ;
847 // (*el)->setMvaOutput(mvaOutput) ;
848 
849  // Retreive info from pflow electrons
850  found = false ;
851  for
852  ( pfElectron = pfElectrons->begin() ; pfElectron != pfElectrons->end() ; pfElectron++ )
853  {
854  if (pfElectron->gsfTrack()==(*el)->gsfTrack())
855  {
856  if (found)
857  {
858  edm::LogWarning("GsfElectronProducer")<<"associated pfGsfElectron already found" ;
859  }
860  else
861  {
862  found = true ;
863  (*el)->setPfIsolationVariables(pfElectron->pfIsolationVariables()) ;
864  (*el)->setMvaInput(pfElectron->mvaInput()) ;
865  (*el)->setMvaOutput(pfElectron->mvaOutput()) ;
866  if ((*el)->ecalDrivenSeed())
867  { (*el)->setP4(GsfElectron::P4_PFLOW_COMBINATION,pfElectron->p4(GsfElectron::P4_PFLOW_COMBINATION),pfElectron->p4Error(GsfElectron::P4_PFLOW_COMBINATION),false) ; }
868  else
869  { (*el)->setP4(GsfElectron::P4_PFLOW_COMBINATION,pfElectron->p4(GsfElectron::P4_PFLOW_COMBINATION),pfElectron->p4Error(GsfElectron::P4_PFLOW_COMBINATION),true) ; }
870  double noCutMin = -999999999. ;
871  if ((*el)->mva()<noCutMin) { throw cms::Exception("GsfElectronAlgo|UnexpectedMvaValue")<<"unexpected MVA value: "<<(*el)->mva() ; }
872  }
873  }
874  }
875 
876  // Preselection
878 
879  // Shower Shape of pflow cluster
880  if (!((*el)->pflowSuperCluster().isNull()))
881  {
882  reco::GsfElectron::ShowerShape pflowShowerShape ;
883  calculateShowerShape((*el)->pflowSuperCluster(),true,pflowShowerShape) ;
884  (*el)->setPfShowerShape(pflowShowerShape) ;
885  }
886  else if ((*el)->passingPflowPreselection())
887  { edm::LogError("GsfElectronCoreProducer")<<"Preselected tracker driven GsfTrack with no associated pflow SuperCluster." ; }
888 
889  // PfBrem
890  SuperClusterRef sc = (*el)->pflowSuperCluster() ;
891  if (!(sc.isNull()))
892  {
893 
894  if (sc->clustersSize()>1)
895  {
896  CaloCluster_iterator first = sc->clustersBegin() ;
897  (*el)->setPfSuperClusterFbrem((sc->energy()-(*first)->energy())/sc->energy()) ;
898  }
899  else
900  { (*el)->setPfSuperClusterFbrem(0.) ; }
901  ElectronClassification theClassifier ;
902  theClassifier.refineWithPflow(**el) ;
903  }
904  }
905  }
void calculateShowerShape(const reco::SuperClusterRef &, bool pflow, reco::GsfElectron::ShowerShape &)
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
bool isNull() const
Checks for null.
Definition: Ref.h:247
GsfElectronPtrCollection * electrons
bool first
Definition: L1TdeRCT.cc:94
edm::Handle< reco::GsfElectronCollection > pflowElectrons
void setPflowPreselectionFlag(reco::GsfElectron *ele)
T const * product() const
Definition: Handle.h:74
void refineWithPflow(reco::GsfElectron &)
EventData * eventData_
void GsfElectronAlgo::beginEvent ( edm::Event event)

Definition at line 660 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::InputTagsConfiguration::barrelRecHitCollection, GsfElectronAlgo::EventData::barrelRecHits, GsfElectronAlgo::EventData::beamspot, GsfElectronAlgo::InputTagsConfiguration::beamSpotTag, GsfElectronAlgo::EventSetupData::caloGeom, GsfElectronAlgo::EventData::coreElectrons, GsfElectronAlgo::InputTagsConfiguration::ctfTracks, GsfElectronAlgo::EventData::currentCtfTracks, EgammaRecHitIsolation::doFlagChecks(), EgammaRecHitIsolation::doSeverityChecks(), DetId::Ecal, GsfElectronAlgo::EventData::ecalBarrelHitsMeta, GsfElectronAlgo::EventData::ecalBarrelIsol03, GsfElectronAlgo::EventData::ecalBarrelIsol04, GsfElectronAlgo::EventData::ecalEndcapHitsMeta, GsfElectronAlgo::EventData::ecalEndcapIsol03, GsfElectronAlgo::EventData::ecalEndcapIsol04, GsfElectronAlgo::IsolationConfiguration::eMinBarrel, GsfElectronAlgo::IsolationConfiguration::eMinEndcaps, GsfElectronAlgo::InputTagsConfiguration::endcapRecHitCollection, GsfElectronAlgo::EventData::endcapRecHits, GsfElectronAlgo::IsolationConfiguration::etMinBarrel, GsfElectronAlgo::IsolationConfiguration::etMinEndcaps, GsfElectronAlgo::IsolationConfiguration::etMinHcal, event(), GsfElectronAlgo::EventData::event, eventData_, eventSetupData_, edm::hlt::Exception, generalData_, GsfElectronAlgo::InputTagsConfiguration::gsfElectronCores, GsfElectronAlgo::EventData::gsfPfRecTracks, GsfElectronAlgo::InputTagsConfiguration::gsfPfRecTracksTag, GsfElectronAlgo::EventData::hadDepth1Isolation03, GsfElectronAlgo::EventData::hadDepth1Isolation03Bc, GsfElectronAlgo::EventData::hadDepth1Isolation04, GsfElectronAlgo::EventData::hadDepth1Isolation04Bc, GsfElectronAlgo::EventData::hadDepth2Isolation03, GsfElectronAlgo::EventData::hadDepth2Isolation03Bc, GsfElectronAlgo::EventData::hadDepth2Isolation04, GsfElectronAlgo::EventData::hadDepth2Isolation04Bc, GsfElectronAlgo::GeneralData::hcalHelper, GsfElectronAlgo::GeneralData::hcalHelperPflow, GsfElectronAlgo::InputTagsConfiguration::hcalTowersTag, GsfElectronAlgo::GeneralData::inputCfg, GsfElectronAlgo::IsolationConfiguration::intRadiusBarrelTk, GsfElectronAlgo::IsolationConfiguration::intRadiusEcalBarrel, GsfElectronAlgo::IsolationConfiguration::intRadiusEcalEndcaps, GsfElectronAlgo::IsolationConfiguration::intRadiusEndcapTk, GsfElectronAlgo::IsolationConfiguration::intRadiusHcal, GsfElectronAlgo::GeneralData::isoCfg, GsfElectronAlgo::IsolationConfiguration::jurassicWidth, GsfElectronAlgo::IsolationConfiguration::maxDrbTk, GsfElectronAlgo::IsolationConfiguration::maxVtxDistTk, GsfElectronAlgo::EventData::pflowElectrons, GsfElectronAlgo::InputTagsConfiguration::pflowGsfElectronsTag, GsfElectronAlgo::InputTagsConfiguration::pfMVA, GsfElectronAlgo::EventData::pfMva, reco::BeamSpot::position(), GsfElectronAlgo::EventData::previousElectrons, GsfElectronAlgo::InputTagsConfiguration::previousGsfElectrons, edm::Handle< T >::product(), edm::ESHandle< class >::product(), PtMinSelector_cfg::ptMin, GsfElectronAlgo::IsolationConfiguration::ptMinTk, ElectronHcalHelper::readEvent(), GsfElectronAlgo::EcalRecHitsConfiguration::recHitFlagsToBeExcludedBarrel, GsfElectronAlgo::EcalRecHitsConfiguration::recHitFlagsToBeExcludedEndcaps, GsfElectronAlgo::GeneralData::recHitsCfg, GsfElectronAlgo::EcalRecHitsConfiguration::recHitSeverityToBeExcludedBarrel, GsfElectronAlgo::EcalRecHitsConfiguration::recHitSeverityToBeExcludedEndcaps, GsfElectronAlgo::EventData::seeds, GsfElectronAlgo::InputTagsConfiguration::seedsTag, EgammaRecHitIsolation::setUseNumCrystals(), EgammaRecHitIsolation::setVetoClustered(), GsfElectronAlgo::EventSetupData::sevLevel, GsfElectronAlgo::GeneralData::strategyCfg, GsfElectronAlgo::IsolationConfiguration::stripBarrelTk, GsfElectronAlgo::IsolationConfiguration::stripEndcapTk, GsfElectronAlgo::EventData::tkIsolation03, GsfElectronAlgo::EventData::tkIsolation04, GsfElectronAlgo::EventData::towers, GsfElectronAlgo::StrategyConfiguration::useGsfPfRecTracks, GsfElectronAlgo::IsolationConfiguration::useNumCrystals, and GsfElectronAlgo::IsolationConfiguration::vetoClustered.

Referenced by GsfElectronBaseProducer::beginEvent().

661  {
662  if (eventData_!=0)
663  { throw cms::Exception("GsfElectronAlgo|InternalError")<<"unexpected event data" ; }
664  eventData_ = new EventData ;
665 
666  // init the handles linked to the current event
667  eventData_->event = &event ;
674  event.getByLabel(generalData_->inputCfg.hcalTowersTag,eventData_->towers) ;
675  event.getByLabel(generalData_->inputCfg.pfMVA,eventData_->pfMva) ;
676  event.getByLabel(generalData_->inputCfg.seedsTag,eventData_->seeds) ;
679 
680  // get the beamspot from the Event:
681  edm::Handle<reco::BeamSpot> recoBeamSpotHandle ;
682  event.getByLabel(generalData_->inputCfg.beamSpotTag,recoBeamSpotHandle) ;
683  eventData_->beamspot = recoBeamSpotHandle.product() ;
684 
685  // prepare access to hcal data
688 
689  // Isolation algos
690  float extRadiusSmall=0.3, extRadiusLarge=0.4 ;
691  float intRadiusBarrel=generalData_->isoCfg.intRadiusBarrelTk, intRadiusEndcap=generalData_->isoCfg.intRadiusEndcapTk, stripBarrel=generalData_->isoCfg.stripBarrelTk, stripEndcap=generalData_->isoCfg.stripEndcapTk ;
693  eventData_->tkIsolation03 = new ElectronTkIsolation(extRadiusSmall,intRadiusBarrel,intRadiusEndcap,stripBarrel,stripEndcap,ptMin,maxVtxDist,drb,eventData_->currentCtfTracks.product(),eventData_->beamspot->position()) ;
694  eventData_->tkIsolation04 = new ElectronTkIsolation(extRadiusLarge,intRadiusBarrel,intRadiusEndcap,stripBarrel,stripEndcap,ptMin,maxVtxDist,drb,eventData_->currentCtfTracks.product(),eventData_->beamspot->position()) ;
695 
696  float egHcalIsoConeSizeOutSmall=0.3, egHcalIsoConeSizeOutLarge=0.4;
697  float egHcalIsoConeSizeIn=generalData_->isoCfg.intRadiusHcal,egHcalIsoPtMin=generalData_->isoCfg.etMinHcal;
698  int egHcalDepth1=1, egHcalDepth2=2;
699  eventData_->hadDepth1Isolation03 = new EgammaTowerIsolation(egHcalIsoConeSizeOutSmall,egHcalIsoConeSizeIn,egHcalIsoPtMin,egHcalDepth1,eventData_->towers.product()) ;
700  eventData_->hadDepth2Isolation03 = new EgammaTowerIsolation(egHcalIsoConeSizeOutSmall,egHcalIsoConeSizeIn,egHcalIsoPtMin,egHcalDepth2,eventData_->towers.product()) ;
701  eventData_->hadDepth1Isolation04 = new EgammaTowerIsolation(egHcalIsoConeSizeOutLarge,egHcalIsoConeSizeIn,egHcalIsoPtMin,egHcalDepth1,eventData_->towers.product()) ;
702  eventData_->hadDepth2Isolation04 = new EgammaTowerIsolation(egHcalIsoConeSizeOutLarge,egHcalIsoConeSizeIn,egHcalIsoPtMin,egHcalDepth2,eventData_->towers.product()) ;
703  eventData_->hadDepth1Isolation03Bc = new EgammaTowerIsolation(egHcalIsoConeSizeOutSmall,0.,egHcalIsoPtMin,egHcalDepth1,eventData_->towers.product()) ;
704  eventData_->hadDepth2Isolation03Bc = new EgammaTowerIsolation(egHcalIsoConeSizeOutSmall,0.,egHcalIsoPtMin,egHcalDepth2,eventData_->towers.product()) ;
705  eventData_->hadDepth1Isolation04Bc = new EgammaTowerIsolation(egHcalIsoConeSizeOutLarge,0.,egHcalIsoPtMin,egHcalDepth1,eventData_->towers.product()) ;
706  eventData_->hadDepth2Isolation04Bc = new EgammaTowerIsolation(egHcalIsoConeSizeOutLarge,0.,egHcalIsoPtMin,egHcalDepth2,eventData_->towers.product()) ;
707 
708  float egIsoConeSizeOutSmall=0.3, egIsoConeSizeOutLarge=0.4, egIsoJurassicWidth=generalData_->isoCfg.jurassicWidth;
709  float egIsoPtMinBarrel=generalData_->isoCfg.etMinBarrel,egIsoEMinBarrel=generalData_->isoCfg.eMinBarrel, egIsoConeSizeInBarrel=generalData_->isoCfg.intRadiusEcalBarrel;
710  float egIsoPtMinEndcap=generalData_->isoCfg.etMinEndcaps,egIsoEMinEndcap=generalData_->isoCfg.eMinEndcaps, egIsoConeSizeInEndcap=generalData_->isoCfg.intRadiusEcalEndcaps;
713  eventData_->ecalBarrelIsol03 = new EgammaRecHitIsolation(egIsoConeSizeOutSmall,egIsoConeSizeInBarrel,egIsoJurassicWidth,egIsoPtMinBarrel,egIsoEMinBarrel,eventSetupData_->caloGeom,eventData_->ecalBarrelHitsMeta,eventSetupData_->sevLevel.product(),DetId::Ecal);
714  eventData_->ecalBarrelIsol04 = new EgammaRecHitIsolation(egIsoConeSizeOutLarge,egIsoConeSizeInBarrel,egIsoJurassicWidth,egIsoPtMinBarrel,egIsoEMinBarrel,eventSetupData_->caloGeom,eventData_->ecalBarrelHitsMeta,eventSetupData_->sevLevel.product(),DetId::Ecal);
715  eventData_->ecalEndcapIsol03 = new EgammaRecHitIsolation(egIsoConeSizeOutSmall,egIsoConeSizeInEndcap,egIsoJurassicWidth,egIsoPtMinEndcap,egIsoEMinEndcap,eventSetupData_->caloGeom,eventData_->ecalEndcapHitsMeta,eventSetupData_->sevLevel.product(),DetId::Ecal);
716  eventData_->ecalEndcapIsol04 = new EgammaRecHitIsolation(egIsoConeSizeOutLarge,egIsoConeSizeInEndcap,egIsoJurassicWidth,egIsoPtMinEndcap,egIsoEMinEndcap,eventSetupData_->caloGeom,eventData_->ecalEndcapHitsMeta,eventSetupData_->sevLevel.product(),DetId::Ecal);
733  }
ElectronHcalHelper * hcalHelperPflow
edm::Handle< reco::ElectronSeedCollection > seeds
edm::Handle< edm::ValueMap< float > > pfMva
GeneralData * generalData_
EgammaTowerIsolation * hadDepth1Isolation04Bc
void readEvent(const edm::Event &)
EgammaTowerIsolation * hadDepth1Isolation03Bc
void doSeverityChecks(const EcalRecHitCollection *const recHits, const std::vector< int > v)
const IsolationConfiguration isoCfg
const EcalRecHitsConfiguration recHitsCfg
EventSetupData * eventSetupData_
edm::Handle< EcalRecHitCollection > endcapRecHits
const InputTagsConfiguration inputCfg
edm::ESHandle< EcalSeverityLevelAlgo > sevLevel
void doFlagChecks(const std::vector< int > v)
EgammaTowerIsolation * hadDepth1Isolation03
const StrategyConfiguration strategyCfg
EgammaRecHitIsolation * ecalBarrelIsol04
EgammaTowerIsolation * hadDepth2Isolation03
EgammaTowerIsolation * hadDepth1Isolation04
ElectronTkIsolation * tkIsolation03
void setUseNumCrystals(bool b=true)
EgammaRecHitIsolation * ecalEndcapIsol03
EgammaTowerIsolation * hadDepth2Isolation03Bc
edm::Handle< EcalRecHitCollection > barrelRecHits
ElectronHcalHelper * hcalHelper
const reco::BeamSpot * beamspot
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
EgammaTowerIsolation * hadDepth2Isolation04Bc
edm::Handle< reco::GsfElectronCollection > previousElectrons
EgammaRecHitIsolation * ecalBarrelIsol03
edm::Handle< reco::GsfElectronCollection > pflowElectrons
EcalRecHitMetaCollection * ecalBarrelHitsMeta
T const * product() const
Definition: ESHandle.h:62
T const * product() const
Definition: Handle.h:74
EgammaTowerIsolation * hadDepth2Isolation04
void setVetoClustered(bool b=true)
SimpleCaloRecHitMetaCollection< EcalRecHitCollection > EcalRecHitMetaCollection
edm::Handle< reco::TrackCollection > currentCtfTracks
edm::ESHandle< CaloGeometry > caloGeom
EgammaRecHitIsolation * ecalEndcapIsol04
const Point & position() const
position
Definition: BeamSpot.h:63
EventData * eventData_
ElectronTkIsolation * tkIsolation04
edm::Handle< reco::GsfElectronCoreCollection > coreElectrons
edm::Handle< CaloTowerCollection > towers
EcalRecHitMetaCollection * ecalEndcapHitsMeta
edm::Handle< reco::GsfPFRecTrackCollection > gsfPfRecTracks
void GsfElectronAlgo::calculateShowerShape ( const reco::SuperClusterRef theClus,
bool  pflow,
reco::GsfElectron::ShowerShape showerShape 
)
private

Definition at line 513 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::EventData::barrelRecHits, GsfElectronAlgo::EventSetupData::caloGeom, GsfElectronAlgo::EventSetupData::caloTopo, EcalClusterTools::covariances(), EcalClusterTools::e1x5(), reco::GsfElectron::ShowerShape::e1x5, EcalClusterTools::e2x5Max(), reco::GsfElectron::ShowerShape::e2x5Max, EcalClusterTools::e3x3(), EcalClusterTools::e5x5(), reco::GsfElectron::ShowerShape::e5x5, EcalBarrel, GsfElectronAlgo::EventData::endcapRecHits, eventData_, eventSetupData_, generalData_, geometry, reco::GsfElectron::ShowerShape::hcalDepth1OverEcal, reco::GsfElectron::ShowerShape::hcalDepth1OverEcalBc, reco::GsfElectron::ShowerShape::hcalDepth2OverEcal, reco::GsfElectron::ShowerShape::hcalDepth2OverEcalBc, ElectronHcalHelper::hcalESumDepth1(), ElectronHcalHelper::hcalESumDepth1BehindClusters(), ElectronHcalHelper::hcalESumDepth2(), ElectronHcalHelper::hcalESumDepth2BehindClusters(), GsfElectronAlgo::GeneralData::hcalHelper, GsfElectronAlgo::GeneralData::hcalHelperPflow, ElectronHcalHelper::hcalTowersBehindClusters(), reco::GsfElectron::ShowerShape::hcalTowersBehindClusters, reco::CaloCluster::hitsAndFractions(), edm::detail::isnan(), EcalClusterTools::localCovariances(), edm::ESHandle< class >::product(), reco::GsfElectron::ShowerShape::r9, GsfElectronAlgo::EcalRecHitsConfiguration::recHitFlagsToBeExcludedBarrel, GsfElectronAlgo::EcalRecHitsConfiguration::recHitFlagsToBeExcludedEndcaps, GsfElectronAlgo::GeneralData::recHitsCfg, GsfElectronAlgo::EcalRecHitsConfiguration::recHitSeverityToBeExcludedBarrel, GsfElectronAlgo::EcalRecHitsConfiguration::recHitSeverityToBeExcludedEndcaps, GsfElectronAlgo::EventSetupData::sevLevel, reco::GsfElectron::ShowerShape::sigmaEtaEta, reco::GsfElectron::ShowerShape::sigmaIetaIeta, reco::GsfElectron::ShowerShape::sigmaIphiIphi, mathSSE::sqrt(), and DetId::subdetId().

Referenced by addPflowInfo(), and createElectron().

514  {
515  const reco::CaloCluster & seedCluster = *(theClus->seed()) ;
516  // temporary, till CaloCluster->seed() is made available
517  DetId seedXtalId = seedCluster.hitsAndFractions()[0].first ;
518  int detector = seedXtalId.subdetId() ;
519 
520  const CaloTopology * topology = eventSetupData_->caloTopo.product() ;
522  const EcalRecHitCollection * recHits = 0 ;
523  std::vector<int> recHitFlagsToBeExcluded ;
524  std::vector<int> recHitSeverityToBeExcluded ;
525  const EcalSeverityLevelAlgo * severityLevelAlgo = eventSetupData_->sevLevel.product() ;
526  if (detector==EcalBarrel)
527  {
528  recHits = eventData_->barrelRecHits.product() ;
529  recHitFlagsToBeExcluded = generalData_->recHitsCfg.recHitFlagsToBeExcludedBarrel ;
530  recHitSeverityToBeExcluded = generalData_->recHitsCfg.recHitSeverityToBeExcludedBarrel ;
531  }
532  else
533  {
534  recHits = eventData_->endcapRecHits.product() ;
535  recHitFlagsToBeExcluded = generalData_->recHitsCfg.recHitFlagsToBeExcludedEndcaps ;
536  recHitSeverityToBeExcluded = generalData_->recHitsCfg.recHitSeverityToBeExcludedEndcaps ;
537  }
538 
539  std::vector<float> covariances = EcalClusterTools::covariances(seedCluster,recHits,topology,geometry,recHitFlagsToBeExcluded,recHitSeverityToBeExcluded,severityLevelAlgo) ;
540  std::vector<float> localCovariances = EcalClusterTools::localCovariances(seedCluster,recHits,topology,recHitFlagsToBeExcluded,recHitSeverityToBeExcluded,severityLevelAlgo) ;
541  showerShape.sigmaEtaEta = sqrt(covariances[0]) ;
542  showerShape.sigmaIetaIeta = sqrt(localCovariances[0]) ;
543  if (!isnan(localCovariances[2])) showerShape.sigmaIphiIphi = sqrt(localCovariances[2]) ;
544  showerShape.e1x5 = EcalClusterTools::e1x5(seedCluster,recHits,topology,recHitFlagsToBeExcluded,recHitSeverityToBeExcluded,severityLevelAlgo) ;
545  showerShape.e2x5Max = EcalClusterTools::e2x5Max(seedCluster,recHits,topology,recHitFlagsToBeExcluded,recHitSeverityToBeExcluded,severityLevelAlgo) ;
546  showerShape.e5x5 = EcalClusterTools::e5x5(seedCluster,recHits,topology,recHitFlagsToBeExcluded,recHitSeverityToBeExcluded,severityLevelAlgo) ;
547  showerShape.r9 = EcalClusterTools::e3x3(seedCluster,recHits,topology,recHitFlagsToBeExcluded,recHitSeverityToBeExcluded,severityLevelAlgo)/theClus->rawEnergy() ;
548 
549  if (pflow)
550  {
551  showerShape.hcalDepth1OverEcal = generalData_->hcalHelperPflow->hcalESumDepth1(*theClus)/theClus->energy() ;
552  showerShape.hcalDepth2OverEcal = generalData_->hcalHelperPflow->hcalESumDepth2(*theClus)/theClus->energy() ;
556  }
557  else
558  {
559  showerShape.hcalDepth1OverEcal = generalData_->hcalHelper->hcalESumDepth1(*theClus)/theClus->energy() ;
560  showerShape.hcalDepth2OverEcal = generalData_->hcalHelper->hcalESumDepth2(*theClus)/theClus->energy() ;
564  }
565  }
ElectronHcalHelper * hcalHelperPflow
GeneralData * generalData_
const EcalRecHitsConfiguration recHitsCfg
EventSetupData * eventSetupData_
edm::Handle< EcalRecHitCollection > endcapRecHits
double hcalESumDepth2BehindClusters(const std::vector< CaloTowerDetId > &towers)
std::vector< CaloTowerDetId > hcalTowersBehindClusters(const reco::SuperCluster &sc)
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:189
double hcalESumDepth1BehindClusters(const std::vector< CaloTowerDetId > &towers)
edm::ESHandle< EcalSeverityLevelAlgo > sevLevel
edm::ESHandle< CaloTopology > caloTopo
static std::vector< float > covariances(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology, const CaloGeometry *geometry, float w0=4.7)
static std::vector< float > localCovariances(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology, float w0=4.7)
bool isnan(float x)
Definition: math.h:13
T sqrt(T t)
Definition: SSEVec.h:46
edm::Handle< EcalRecHitCollection > barrelRecHits
static float e3x3(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
std::vector< CaloTowerDetId > hcalTowersBehindClusters
Definition: GsfElectron.h:366
double hcalESumDepth2(const reco::SuperCluster &, const std::vector< CaloTowerDetId > *excludeTowers=0)
ElectronHcalHelper * hcalHelper
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:39
Definition: DetId.h:20
T const * product() const
Definition: ESHandle.h:62
ESHandle< TrackerGeometry > geometry
static float e2x5Max(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
edm::ESHandle< CaloGeometry > caloGeom
static float e5x5(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
double hcalESumDepth1(const reco::SuperCluster &, const std::vector< CaloTowerDetId > *excludeTowers=0)
static float e1x5(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
EventData * eventData_
void GsfElectronAlgo::checkSetup ( const edm::EventSetup es)

Definition at line 597 of file GsfElectronAlgo.cc.

References edm::eventsetup::EventSetupRecord::cacheIdentifier(), GsfElectronAlgo::EventSetupData::cacheIDGeom, GsfElectronAlgo::EventSetupData::cacheIDMagField, GsfElectronAlgo::EventSetupData::cacheIDTDGeom, GsfElectronAlgo::EventSetupData::cacheIDTopo, GsfElectronAlgo::EventSetupData::cacheSevLevel, GsfElectronAlgo::EventSetupData::caloGeom, GsfElectronAlgo::EventSetupData::caloTopo, ElectronHcalHelper::checkSetup(), GsfElectronAlgo::EventSetupData::constraintAtVtx, GsfElectronAlgo::GeneralData::crackCorrectionFunction, eventSetupData_, generalData_, edm::EventSetup::get(), GsfElectronAlgo::GeneralData::hcalHelper, GsfElectronAlgo::GeneralData::hcalHelperPflow, EcalClusterFunctionBaseClass::init(), GsfElectronAlgo::EventSetupData::magField, GsfElectronAlgo::EventSetupData::mtsTransform, edm::ESHandle< class >::product(), GsfElectronAlgo::EventSetupData::sevLevel, GsfElectronAlgo::GeneralData::superClusterErrorFunction, and GsfElectronAlgo::EventSetupData::trackerHandle.

Referenced by GsfElectronBaseProducer::beginEvent().

598  {
599  // get EventSetupRecords if needed
600  bool updateField(false);
602  updateField = true;
605  }
606 
607  bool updateGeometry(false);
609  updateGeometry = true;
612  }
613 
614  if ( updateField || updateGeometry ) {
615  delete eventSetupData_->mtsTransform ;
619  }
620 
622  eventSetupData_->cacheIDGeom=es.get<CaloGeometryRecord>().cacheIdentifier();
624  }
625 
627  eventSetupData_->cacheIDTopo=es.get<CaloTopologyRecord>().cacheIdentifier();
629  }
630 
633 
638 
639  //if(eventSetupData_->cacheChStatus!=es.get<EcalChannelStatusRcd>().cacheIdentifier()){
640  // eventSetupData_->cacheChStatus=es.get<EcalChannelStatusRcd>().cacheIdentifier();
641  // es.get<EcalChannelStatusRcd>().get(eventSetupData_->chStatus);
642  //}
643 
645  eventSetupData_->cacheSevLevel = es.get<EcalSeverityLevelAlgoRcd>().cacheIdentifier();
647  }
648  }
ElectronHcalHelper * hcalHelperPflow
unsigned long long cacheIdentifier() const
GeneralData * generalData_
EventSetupData * eventSetupData_
void checkSetup(const edm::EventSetup &)
edm::ESHandle< EcalSeverityLevelAlgo > sevLevel
edm::ESHandle< CaloTopology > caloTopo
GsfConstraintAtVertex * constraintAtVtx
const MultiTrajectoryStateTransform * mtsTransform
ElectronHcalHelper * hcalHelper
edm::ESHandle< MagneticField > magField
EcalClusterFunctionBaseClass * superClusterErrorFunction
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
edm::ESHandle< CaloGeometry > caloGeom
EcalClusterFunctionBaseClass * crackCorrectionFunction
edm::ESHandle< TrackerGeometry > trackerHandle
virtual void init(const edm::EventSetup &es)=0
void GsfElectronAlgo::clonePreviousElectrons ( )

Definition at line 800 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::EventData::coreElectrons, GsfElectronAlgo::EventData::electrons, eventData_, GsfElectronAlgo::EventData::previousElectrons, and edm::Handle< T >::product().

Referenced by GsfElectronProducer::produce().

801  {
802  const GsfElectronCollection * oldElectrons = eventData_->previousElectrons.product() ;
804  GsfElectronCollection::const_iterator oldElectron ;
805  for
806  ( oldElectron = oldElectrons->begin() ;
807  oldElectron != oldElectrons->end() ;
808  ++oldElectron )
809  {
810  const GsfElectronCoreRef oldCoreRef = oldElectron->core() ;
811  const GsfTrackRef oldElectronGsfTrackRef = oldCoreRef->gsfTrack() ;
812  unsigned int icore ;
813  for ( icore=0 ; icore<newCores->size() ; ++icore )
814  {
815  if (oldElectronGsfTrackRef==(*newCores)[icore].gsfTrack())
816  {
818  eventData_->electrons->push_back(new GsfElectron(*oldElectron,coreRef)) ;
819  break ;
820  }
821  }
822  }
823  }
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
std::vector< GsfElectronCore > GsfElectronCoreCollection
GsfElectronPtrCollection * electrons
edm::Handle< reco::GsfElectronCollection > previousElectrons
T const * product() const
Definition: Handle.h:74
EventData * eventData_
edm::Handle< reco::GsfElectronCoreCollection > coreElectrons
void GsfElectronAlgo::completeElectrons ( )

Definition at line 757 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::EventData::beamspot, GsfElectronAlgo::ElectronData::calculateTSOS(), GsfElectronAlgo::EventSetupData::constraintAtVtx, GsfElectronAlgo::EventData::coreElectrons, createElectron(), electronData_, GsfElectronAlgo::EventData::electrons, eventData_, eventSetupData_, edm::hlt::Exception, funct::false, i, edm::Ref< C, T, F >::isNull(), GsfElectronAlgo::EventSetupData::mtsTransform, edm::Handle< T >::product(), and funct::true.

Referenced by GsfElectronEcalDrivenProducer::produce(), and GsfElectronProducer::produce().

758  {
759  if (electronData_!=0)
760  { throw cms::Exception("GsfElectronAlgo|InternalError")<<"unexpected electron data" ; }
761 
762  const GsfElectronCoreCollection * coreCollection = eventData_->coreElectrons.product() ;
763  for ( unsigned int i=0 ; i<coreCollection->size() ; ++i )
764  {
765  // check there is no existing electron with this core
767  bool coreFound = false ;
768  GsfElectronPtrCollection::const_iterator itrEle ;
769  for
770  ( itrEle = eventData_->electrons->begin() ;
771  itrEle != eventData_->electrons->end() ;
772  itrEle++ )
773  {
774  if ((*itrEle)->core()==coreRef)
775  {
776  coreFound = true ;
777  break ;
778  }
779  }
780  if (coreFound) continue ;
781 
782  // check there is a super-cluster
783  if (coreRef->superCluster().isNull()) continue ;
784 
785  // prepare internal structure for electron specific data
786  delete electronData_ ;
787  electronData_ = new ElectronData(coreRef,*eventData_->beamspot) ;
788 
789  // calculate and check Trajectory StatesOnSurface....
791 
792  createElectron() ;
793 
794  } // loop over tracks
795 
796  delete electronData_ ;
797  electronData_ = 0 ;
798  }
int i
Definition: DBlmapReader.cc:9
EventSetupData * eventSetupData_
bool isNull() const
Checks for null.
Definition: Ref.h:247
GsfConstraintAtVertex * constraintAtVtx
std::vector< GsfElectronCore > GsfElectronCoreCollection
const MultiTrajectoryStateTransform * mtsTransform
const reco::BeamSpot * beamspot
GsfElectronPtrCollection * electrons
T const * product() const
Definition: Handle.h:74
bool calculateTSOS(const MultiTrajectoryStateTransform *, GsfConstraintAtVertex *)
EventData * eventData_
ElectronData * electronData_
edm::Handle< reco::GsfElectronCoreCollection > coreElectrons
void GsfElectronAlgo::copyElectrons ( reco::GsfElectronCollection outEle)

Definition at line 650 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::EventData::electrons, and eventData_.

Referenced by GsfElectronBaseProducer::fillEvent().

651  {
652  GsfElectronPtrCollection::const_iterator it ;
653  for
654  ( it = eventData_->electrons->begin() ;
655  it != eventData_->electrons->end() ;
656  it++ )
657  { outEle.push_back(**it) ; }
658  }
GsfElectronPtrCollection * electrons
EventData * eventData_
void GsfElectronAlgo::createElectron ( )
private

Definition at line 1040 of file GsfElectronAlgo.cc.

References abs, GsfElectronAlgo::EventData::beamspot, GsfElectronAlgo::ElectronData::calculateMode(), GsfElectronAlgo::ElectronData::calculateMomentum(), calculateShowerShape(), GsfElectronAlgo::ElectronData::checkCtfTrack(), cl, ElectronEnergyCorrector::classBasedParameterizationEnergy(), ElectronEnergyCorrector::classBasedParameterizationUncertainty(), ElectronClassification::classify(), GsfElectronAlgo::ElectronData::computeCharge(), ConversionInfo::conversionPartnerCtfTk(), ConversionInfo::conversionPartnerGsfTk(), reco::GsfElectron::core(), GsfElectronAlgo::ElectronData::coreRef, ElectronMomentumCorrector::correct(), GsfElectronAlgo::GeneralData::crackCorrectionFunction, reco::GsfElectron::ClosestCtfTrack::ctfTrack, GsfElectronAlgo::ElectronData::ctfTrackRef, GsfElectronAlgo::StrategyConfiguration::ctfTracksCheck, GsfElectronAlgo::EventData::currentCtfTracks, ConversionInfo::dcot(), reco::GsfElectron::ConversionRejection::dcot, reco::GsfElectron::TrackClusterMatching::deltaEtaEleClusterAtCalo, reco::GsfElectron::TrackClusterMatching::deltaEtaSeedClusterAtCalo, reco::GsfElectron::TrackClusterMatching::deltaEtaSuperClusterAtVtx, reco::GsfElectron::TrackClusterMatching::deltaPhiEleClusterAtCalo, reco::GsfElectron::TrackClusterMatching::deltaPhiSeedClusterAtCalo, reco::GsfElectron::TrackClusterMatching::deltaPhiSuperClusterAtVtx, ConversionInfo::dist(), reco::GsfElectron::ConversionRejection::dist, EcalBarrel, GsfElectronAlgo::EventData::ecalBarrelIsol03, GsfElectronAlgo::EventData::ecalBarrelIsol04, GsfElectronAlgo::StrategyConfiguration::ecalDrivenEcalEnergyFromClassBasedParameterization, GsfElectronAlgo::StrategyConfiguration::ecalDrivenEcalErrorFromClassBasedParameterization, EcalEndcap, GsfElectronAlgo::EventData::ecalEndcapIsol03, GsfElectronAlgo::EventData::ecalEndcapIsol04, reco::GsfElectron::IsolationVariables::ecalRecHitSumEt, reco::GsfElectron::TrackClusterMatching::eEleClusterOverPout, ele_convert(), reco::GsfElectron::TrackClusterMatching::electronCluster, reco::GsfElectron::electronCluster(), electronData_, GsfElectronAlgo::EventData::electrons, GsfElectronAlgo::ElectronData::eleMom, GsfElectronAlgo::ElectronData::elePos, reco::CaloCluster::energy(), reco::GsfElectron::TrackClusterMatching::eSeedClusterOverP, reco::GsfElectron::TrackClusterMatching::eSeedClusterOverPout, reco::GsfElectron::TrackClusterMatching::eSuperClusterOverP, eventData_, eventSetupData_, edm::hlt::Exception, ConversionInfo::flag(), reco::GsfElectron::ConversionRejection::flags, generalData_, GsfElectronAlgo::ElectronData::getEleBasicCluster(), EgammaRecHitIsolation::getEtSum(), ElectronTkIsolation::getPtTracks(), EgammaTowerIsolation::getTowerEtSum(), EcalClusterFunctionBaseClass::getValue(), GsfElectronAlgo::EventData::hadDepth1Isolation03, GsfElectronAlgo::EventData::hadDepth1Isolation03Bc, GsfElectronAlgo::EventData::hadDepth1Isolation04, GsfElectronAlgo::EventData::hadDepth1Isolation04Bc, GsfElectronAlgo::EventData::hadDepth2Isolation03, GsfElectronAlgo::EventData::hadDepth2Isolation03Bc, GsfElectronAlgo::EventData::hadDepth2Isolation04, GsfElectronAlgo::EventData::hadDepth2Isolation04Bc, reco::GsfElectron::IsolationVariables::hcalDepth1TowerSumEt, reco::GsfElectron::IsolationVariables::hcalDepth1TowerSumEtBc, reco::GsfElectron::IsolationVariables::hcalDepth2TowerSumEt, reco::GsfElectron::IsolationVariables::hcalDepth2TowerSumEtBc, reco::GsfElectron::ShowerShape::hcalTowersBehindClusters, reco::CaloCluster::hitsAndFractions(), EBDetId::ietaAbs(), GsfElectronAlgo::ElectronData::innMom, reco::GsfElectron::FiducialFlags::isEB, reco::GsfElectron::FiducialFlags::isEBEEGap, reco::GsfElectron::FiducialFlags::isEBEtaGap, reco::GsfElectron::FiducialFlags::isEBPhiGap, reco::GsfElectron::FiducialFlags::isEE, reco::GsfElectron::FiducialFlags::isEEDeeGap, reco::GsfElectron::FiducialFlags::isEERingGap, EEDetId::isNextToDBoundary(), EBDetId::isNextToEtaBoundary(), EBDetId::isNextToPhiBoundary(), EEDetId::isNextToRingBoundary(), edm::Ref< C, T, F >::isNull(), edm::HandleBase::isValid(), LogTrace, PV3DBase< T, PVType, FrameType >::mag(), GsfElectronAlgo::EventSetupData::magField, reco::GsfElectron::TrackExtrapolations::momentumAtCalo, reco::GsfElectron::TrackExtrapolations::momentumAtEleClus, reco::GsfElectron::TrackExtrapolations::momentumAtVtx, reco::GsfElectron::TrackExtrapolations::momentumAtVtxWithConstraint, reco::GsfElectron::TrackExtrapolations::momentumOut, GsfElectronAlgo::EventSetupData::mtsMode, GsfElectronAlgo::EventSetupData::mtsTransform, or, GsfElectronAlgo::EventData::originalCtfTracks, GsfElectronAlgo::EventData::originalGsfTracks, GsfElectronAlgo::ElectronData::outMom, reco::GsfElectron::p4(), reco::GsfElectron::ConversionRejection::partner, reco::BeamSpot::position(), reco::CaloCluster::position(), reco::GsfElectron::TrackExtrapolations::positionAtCalo, reco::GsfElectron::TrackExtrapolations::positionAtVtx, GsfElectronAlgo::StrategyConfiguration::pureTrackerDrivenEcalErrorFromSimpleParameterization, reco::GsfElectron::ConversionRejection::radius, ConversionInfo::radiusOfConversion(), GsfElectronAlgo::EventData::retreiveOriginalTrackCollections(), GsfElectronAlgo::ElectronData::sclMom, GsfElectronAlgo::ElectronData::sclPos, GsfElectronAlgo::ElectronData::seedMom, GsfElectronAlgo::ElectronData::seedPos, reco::GsfElectron::setCorrectedEcalEnergyError(), setCutBasedPreselectionFlag(), reco::GsfElectron::setIsolation03(), reco::GsfElectron::setIsolation04(), reco::GsfElectron::setP4(), reco::GsfElectron::setSuperClusterFbrem(), reco::GsfElectron::setTrackFbrem(), reco::GsfElectron::ClosestCtfTrack::shFracInnerHits, GsfElectronAlgo::ElectronData::shFracInnerHits, ElectronEnergyCorrector::simpleParameterizationUncertainty(), GsfElectronAlgo::GeneralData::strategyCfg, DetId::subdetId(), reco::GsfElectron::superCluster(), GsfElectronAlgo::GeneralData::superClusterErrorFunction, GsfElectronAlgo::ElectronData::superClusterRef, GsfElectronAlgo::EventData::tkIsolation03, GsfElectronAlgo::EventData::tkIsolation04, reco::GsfElectron::IsolationVariables::tkSumPt, funct::true, GsfElectronAlgo::ElectronData::vtxMom, GsfElectronAlgo::ElectronData::vtxMomWithConstraint, GsfElectronAlgo::ElectronData::vtxPos, and GsfElectronAlgo::ElectronData::vtxTSOS.

Referenced by completeElectrons().

1041  {
1042  // eventually check ctf track
1045 
1046  // charge ID
1047  int eleCharge ;
1048  GsfElectron::ChargeInfo eleChargeInfo ;
1049  electronData_->computeCharge(eleCharge,eleChargeInfo) ;
1050 
1051  // electron basic cluster
1053 
1054  // Seed cluster
1055  const reco::CaloCluster & seedCluster = *(electronData_->superClusterRef->seed()) ;
1056 
1057  // seed Xtal
1058  // temporary, till CaloCluster->seed() is made available
1059  DetId seedXtalId = seedCluster.hitsAndFractions()[0].first ;
1060 
1062 
1063 
1064  //====================================================
1065  // Candidate attributes
1066  //====================================================
1067 
1069 
1070 
1071  //====================================================
1072  // Track-Cluster Matching
1073  //====================================================
1074 
1076  tcMatching.electronCluster = elbcRef ;
1077  tcMatching.eSuperClusterOverP = (electronData_->vtxMom.mag()>0)?(electronData_->superClusterRef->energy()/electronData_->vtxMom.mag()):(-1.) ;
1078  tcMatching.eSeedClusterOverP = (electronData_->vtxMom.mag()>0.)?(seedCluster.energy()/electronData_->vtxMom.mag()):(-1) ;
1079  tcMatching.eSeedClusterOverPout = (electronData_->seedMom.mag()>0.)?(seedCluster.energy()/electronData_->seedMom.mag()):(-1.) ;
1080  tcMatching.eEleClusterOverPout = (electronData_->eleMom.mag()>0.)?(elbcRef->energy()/electronData_->eleMom.mag()):(-1.) ;
1081 
1083  tcMatching.deltaEtaSuperClusterAtVtx = scAtVtx.dEta() ;
1084  tcMatching.deltaPhiSuperClusterAtVtx = scAtVtx.dPhi() ;
1085 
1086  EleRelPointPair seedAtCalo(seedCluster.position(),electronData_->seedPos,eventData_->beamspot->position()) ;
1087  tcMatching.deltaEtaSeedClusterAtCalo = seedAtCalo.dEta() ;
1088  tcMatching.deltaPhiSeedClusterAtCalo = seedAtCalo.dPhi() ;
1089 
1090  EleRelPointPair ecAtCalo(elbcRef->position(),electronData_->elePos,eventData_->beamspot->position()) ;
1091  tcMatching.deltaEtaEleClusterAtCalo = ecAtCalo.dEta() ;
1092  tcMatching.deltaPhiEleClusterAtCalo = ecAtCalo.dPhi() ;
1093 
1094 
1095  //=======================================================
1096  // Track extrapolations
1097  //=======================================================
1098 
1107 
1108 
1109  //=======================================================
1110  // Closest Ctf Track
1111  //=======================================================
1112 
1114  ctfInfo.ctfTrack = electronData_->ctfTrackRef ;
1116 
1117 
1118  //====================================================
1119  // FiducialFlags, using nextToBoundary definition of gaps
1120  //====================================================
1121 
1122  reco::GsfElectron::FiducialFlags fiducialFlags ;
1123  int detector = seedXtalId.subdetId() ;
1124  double feta=std::abs(electronData_->superClusterRef->position().eta()) ;
1125  if (detector==EcalBarrel)
1126  {
1127  fiducialFlags.isEB = true ;
1128  EBDetId ebdetid(seedXtalId);
1129  if (EBDetId::isNextToEtaBoundary(ebdetid))
1130  {
1131  if (ebdetid.ietaAbs()==85)
1132  { fiducialFlags.isEBEEGap = true ; }
1133  else
1134  { fiducialFlags.isEBEtaGap = true ; }
1135  }
1136  if (EBDetId::isNextToPhiBoundary(ebdetid))
1137  { fiducialFlags.isEBPhiGap = true ; }
1138  }
1139  else if (detector==EcalEndcap)
1140  {
1141  fiducialFlags.isEE = true ;
1142  EEDetId eedetid(seedXtalId);
1143  if (EEDetId::isNextToRingBoundary(eedetid))
1144  {
1145  if (std::abs(feta)<2.)
1146  { fiducialFlags.isEBEEGap = true ; }
1147  else
1148  { fiducialFlags.isEERingGap = true ; }
1149  }
1150  if (EEDetId::isNextToDBoundary(eedetid))
1151  { fiducialFlags.isEEDeeGap = true ; }
1152  }
1153  else
1154  { throw cms::Exception("GsfElectronAlgo|UnknownXtalRegion")<<"createElectron(): do not know if it is a barrel or endcap seed cluster !!!!" ; }
1155 
1156 
1157  //====================================================
1158  // ShowerShape
1159  //====================================================
1160 
1161  reco::GsfElectron::ShowerShape showerShape ;
1162  calculateShowerShape(electronData_->superClusterRef,!(electronData_->coreRef->ecalDrivenSeed()),showerShape) ;
1163 
1164 
1165  //====================================================
1166  // ConversionRejection
1167  //====================================================
1168 
1170 
1171  ConversionFinder conversionFinder ;
1172  double BInTesla = eventSetupData_->magField->inTesla(GlobalPoint(0.,0.,0.)).z() ;
1174  if (!ctfTracks.isValid()) { ctfTracks = eventData_->currentCtfTracks ; }
1175 
1176  // values of conversionInfo.flag()
1177  // -9999 : Partner track was not found
1178  // 0 : Partner track found in the CTF collection using
1179  // 1 : Partner track found in the CTF collection using
1180  // 2 : Partner track found in the GSF collection using
1181  // 3 : Partner track found in the GSF collection using the electron's GSF track
1182  ConversionInfo conversionInfo = conversionFinder.getConversionInfo
1183  (*electronData_->coreRef,ctfTracks,eventData_->originalGsfTracks,BInTesla) ;
1184 
1186  conversionVars.flags = conversionInfo.flag() ;
1187  conversionVars.dist = conversionInfo.dist() ;
1188  conversionVars.dcot = conversionInfo.dcot() ;
1189  conversionVars.radius = conversionInfo.radiusOfConversion() ;
1190  if ((conversionVars.flags==0)or(conversionVars.flags==1))
1191  conversionVars.partner = TrackBaseRef(conversionInfo.conversionPartnerCtfTk()) ;
1192  else if ((conversionVars.flags==2)or(conversionVars.flags==3))
1193  conversionVars.partner = TrackBaseRef(conversionInfo.conversionPartnerGsfTk()) ;
1194 
1195 
1196  //====================================================
1197  // Go !
1198  //====================================================
1199 
1200  GsfElectron * ele = new
1201  GsfElectron
1202  ( eleCharge,eleChargeInfo,electronData_->coreRef,
1203  tcMatching, tkExtra, ctfInfo,
1204  fiducialFlags,showerShape,
1205  conversionVars ) ;
1207  ele->setP4(GsfElectron::P4_FROM_SUPER_CLUSTER,momentum,0,true) ;
1208 
1209 
1210  //====================================================
1211  // brems fractions
1212  //====================================================
1213 
1214  if (electronData_->innMom.mag()>0.)
1216 
1217  SuperClusterRef sc = ele->superCluster() ;
1218  if (!(sc.isNull()))
1219  {
1220  CaloClusterPtr cl = ele->electronCluster() ;
1221  if (sc->clustersSize()>1)
1222  { ele->setSuperClusterFbrem( ( sc->energy() - cl->energy() ) / sc->energy() ) ; }
1223  else
1224  { ele->setSuperClusterFbrem(0) ; }
1225  }
1226 
1227 
1228  //====================================================
1229  // classification and corrections
1230  //====================================================
1231 
1232  // classification
1233  ElectronClassification theClassifier ;
1234  theClassifier.classify(*ele) ;
1235 
1236  // ecal energy
1238  if (ele->core()->ecalDrivenSeed())
1239  {
1241  { theEnCorrector.classBasedParameterizationEnergy(*ele,*eventData_->beamspot) ; }
1243  { theEnCorrector.classBasedParameterizationUncertainty(*ele) ; }
1244  }
1245  else
1246  {
1248  { theEnCorrector.simpleParameterizationUncertainty(*ele) ; }
1249  }
1250 
1251  // momentum
1252  if (ele->core()->ecalDrivenSeed())
1253  {
1254  ElectronMomentumCorrector theMomCorrector;
1255  theMomCorrector.correct(*ele,electronData_->vtxTSOS);
1256  }
1257 
1258 
1259  //====================================================
1260  // now isolation variables
1261  //====================================================
1262 
1276  ele->setIsolation03(dr03);
1277  ele->setIsolation04(dr04);
1278 
1279 
1280  //====================================================
1281  // preselection flag
1282  //====================================================
1283 
1285 
1286  LogTrace("GsfElectronAlgo")<<"Constructed new electron with energy "<< ele->p4().e() ;
1287 
1288  eventData_->electrons->push_back(ele) ;
1289  }
CaloClusterPtr electronCluster() const
Definition: GsfElectron.h:228
edm::Handle< reco::TrackCollection > originalCtfTracks
const MultiTrajectoryStateMode * mtsMode
const math::XYZPoint & position() const
cluster centroid position
Definition: CaloCluster.h:123
void setTrackFbrem(float fbrem)
Definition: GsfElectron.h:642
void setP4(P4Kind kind, const LorentzVector &p4, float p4Error, bool setCandidate)
Definition: GsfElectron.cc:178
GeneralData * generalData_
static bool isNextToEtaBoundary(EBDetId id)
Definition: EBDetId.cc:175
EgammaTowerIsolation * hadDepth1Isolation04Bc
reco::GsfTrackRef conversionPartnerGsfTk() const
EgammaTowerIsolation * hadDepth1Isolation03Bc
double radiusOfConversion() const
const LorentzVector & p4(P4Kind kind) const
Definition: GsfElectron.cc:204
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
void retreiveOriginalTrackCollections(const reco::TrackRef &, const reco::GsfTrackRef &)
double getEtSum(const reco::Candidate *emObject) const
void calculateShowerShape(const reco::SuperClusterRef &, bool pflow, reco::GsfElectron::ShowerShape &)
EventSetupData * eventSetupData_
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
double dist() const
#define abs(x)
Definition: mlp_lapack.h:159
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:189
void computeCharge(int &charge, reco::GsfElectron::ChargeInfo &info)
void checkCtfTrack(edm::Handle< reco::TrackCollection > currentCtfTracks)
EgammaTowerIsolation * hadDepth1Isolation03
const StrategyConfiguration strategyCfg
double getTowerEtSum(const reco::Candidate *, const std::vector< CaloTowerDetId > *detIdToExclude=0) const
reco::TrackRef conversionPartnerCtfTk() const
void setSuperClusterFbrem(float fbrem)
Definition: GsfElectron.h:643
EgammaRecHitIsolation * ecalBarrelIsol04
virtual float getValue(const reco::BasicCluster &, const EcalRecHitCollection &) const =0
EgammaTowerIsolation * hadDepth2Isolation03
EgammaTowerIsolation * hadDepth1Isolation04
ElectronTkIsolation * tkIsolation03
void setCorrectedEcalEnergyError(float newEnergyError)
Definition: GsfElectron.cc:158
bool isNull() const
Checks for null.
Definition: Ref.h:247
T mag() const
Definition: PV3DBase.h:66
void setCutBasedPreselectionFlag(reco::GsfElectron *ele, const reco::BeamSpot &)
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
Definition: TrackFwd.h:22
EgammaRecHitIsolation * ecalEndcapIsol03
EgammaTowerIsolation * hadDepth2Isolation03Bc
virtual SuperClusterRef superCluster() const
reference to a SuperCluster
Definition: GsfElectron.h:168
static bool isNextToPhiBoundary(EBDetId id)
Definition: EBDetId.cc:180
void correct(reco::GsfElectron &, TrajectoryStateOnSurface &)
std::vector< CaloTowerDetId > hcalTowersBehindClusters
Definition: GsfElectron.h:366
const MultiTrajectoryStateTransform * mtsTransform
static bool isNextToRingBoundary(EEDetId id)
Definition: EEDetId.cc:391
double energy() const
cluster energy
Definition: CaloCluster.h:120
const reco::BeamSpot * beamspot
edm::ESHandle< MagneticField > magField
GsfElectronPtrCollection * electrons
CaloClusterPtr getEleBasicCluster(const MultiTrajectoryStateTransform *)
static bool isNextToDBoundary(EEDetId id)
Definition: EEDetId.cc:383
bool isValid() const
Definition: HandleBase.h:76
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:39
void setIsolation04(const IsolationVariables &dr04)
Definition: GsfElectron.h:463
#define LogTrace(id)
float cl
Definition: Combine.cc:71
void classify(reco::GsfElectron &)
EgammaTowerIsolation * hadDepth2Isolation04Bc
Definition: DetId.h:20
EgammaRecHitIsolation * ecalBarrelIsol03
int flag() const
EcalClusterFunctionBaseClass * superClusterErrorFunction
void ele_convert(const Type1 &obj1, Type2 &obj2)
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:38
virtual GsfElectronCoreRef core() const
Definition: GsfElectron.cc:8
math::XYZVectorF momentumAtVtxWithConstraint
Definition: GsfElectron.h:266
double getPtTracks(const reco::GsfElectron *) const
void setIsolation03(const IsolationVariables &dr03)
Definition: GsfElectron.h:462
edm::Handle< reco::GsfTrackCollection > originalGsfTracks
EgammaTowerIsolation * hadDepth2Isolation04
const reco::GsfElectronCoreRef coreRef
edm::Handle< reco::TrackCollection > currentCtfTracks
EcalClusterFunctionBaseClass * crackCorrectionFunction
EgammaRecHitIsolation * ecalEndcapIsol04
const reco::SuperClusterRef superClusterRef
const Point & position() const
position
Definition: BeamSpot.h:63
EventData * eventData_
double dcot() const
ElectronTkIsolation * tkIsolation04
ElectronData * electronData_
void calculateMode(const MultiTrajectoryStateMode *mtsMode)
TrajectoryStateOnSurface vtxTSOS
Candidate::LorentzVector calculateMomentum()
void GsfElectronAlgo::displayInternalElectrons ( const std::string &  title) const

Definition at line 743 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::EventData::electrons, GsfElectronAlgo::EventData::event, eventData_, edm::EventBase::id(), and LogTrace.

Referenced by GsfElectronBaseProducer::fillEvent().

744  {
745  LogTrace("GsfElectronAlgo") << "========== " << title << " ==========";
746  LogTrace("GsfElectronAlgo") << "Event: " << eventData_->event->id();
747  LogTrace("GsfElectronAlgo") << "Number of electrons: " << eventData_->electrons->size() ;
748  GsfElectronPtrCollection::const_iterator it ;
749  for ( it = eventData_->electrons->begin(); it != eventData_->electrons->end(); it++ )
750  {
751  LogTrace("GsfElectronAlgo") << "Electron with charge, pt, eta, phi: " << (*it)->charge() << " , "
752  << (*it)->pt() << " , " << (*it)->eta() << " , " << (*it)->phi();
753  }
754  LogTrace("GsfElectronAlgo") << "=================================================";
755  }
GsfElectronPtrCollection * electrons
#define LogTrace(id)
edm::EventID id() const
Definition: EventBase.h:56
EventData * eventData_
void GsfElectronAlgo::endEvent ( )

Definition at line 735 of file GsfElectronAlgo.cc.

References eventData_, and edm::hlt::Exception.

Referenced by GsfElectronBaseProducer::endEvent().

736  {
737  if (eventData_==0)
738  { throw cms::Exception("GsfElectronAlgo|InternalError")<<"lacking event data" ; }
739  delete eventData_ ;
740  eventData_ = 0 ;
741  }
EventData * eventData_
const reco::SuperClusterRef GsfElectronAlgo::getTrSuperCluster ( const reco::GsfTrackRef trackRef)
private
bool GsfElectronAlgo::isPreselected ( reco::GsfElectron ele)
private
void GsfElectronAlgo::removeAmbiguousElectrons ( )

Definition at line 1421 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::EventData::electrons, eventData_, and LogTrace.

Referenced by GsfElectronBaseProducer::fillEvent().

1422  {
1423  GsfElectronPtrCollection::size_type ei = 1, emax = eventData_->electrons->size() ;
1424  GsfElectronPtrCollection::iterator eitr = eventData_->electrons->begin() ;
1425  while (eitr!=eventData_->electrons->end())
1426  {
1427  LogTrace("GsfElectronAlgo")<<"========== remove ambiguous "<<ei<<"/"<<emax<<"==========" ;
1428  if ((*eitr)->ambiguous())
1429  { delete (*eitr) ; eitr = eventData_->electrons->erase(eitr) ; ++ei ; }
1430  else
1431  { ++eitr ; ++ei ; }
1432  }
1433  }
uint16_t size_type
GsfElectronPtrCollection * electrons
#define LogTrace(id)
EventData * eventData_
void GsfElectronAlgo::removeNotPreselectedElectrons ( )

Definition at line 910 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::EventData::electrons, eventData_, isPreselected(), and LogTrace.

Referenced by GsfElectronBaseProducer::fillEvent().

911  {
913  GsfElectronPtrCollection::iterator eitr = eventData_->electrons->begin() ;
914  while (eitr!=eventData_->electrons->end())
915  {
916  LogTrace("GsfElectronAlgo")<<"========== removed not preselected "<<ei<<"/"<<emax<<"==========" ;
917  if (isPreselected(*eitr))
918  { ++eitr ; ++ei ; }
919  else
920  { delete (*eitr) ; eitr = eventData_->electrons->erase(eitr) ; ++ei ; }
921  }
922  }
bool isPreselected(reco::GsfElectron *ele)
uint16_t size_type
GsfElectronPtrCollection * electrons
#define LogTrace(id)
EventData * eventData_
void GsfElectronAlgo::setAmbiguityData ( bool  ignoreNotPreselected = true)

Definition at line 1299 of file GsfElectronAlgo.cc.

References GsfElectronAlgo::StrategyConfiguration::ambClustersOverlapStrategy, GsfElectronAlgo::StrategyConfiguration::ambSortingStrategy, GsfElectronAlgo::EventData::barrelRecHits, GsfElectronAlgo::EventData::beamspot, GsfElectronAlgo::EventData::electrons, GsfElectronAlgo::EventData::endcapRecHits, eta(), eventData_, eventSetupData_, edm::hlt::Exception, funct::false, newFWLiteAna::found, generalData_, edm::Ref< C, T, F >::get(), GsfElectronAlgo::EventData::gsfPfRecTracks, EgAmbiguityTools::isBetter(), isPreselected(), LogDebug, reco::BeamSpot::position(), edm::Handle< T >::product(), EgAmbiguityTools::sharedEnergy(), GsfElectronAlgo::GeneralData::strategyCfg, dtDQMClient_cfg::threshold, GsfElectronAlgo::EventSetupData::trackerHandle, funct::true, and GsfElectronAlgo::StrategyConfiguration::useGsfPfRecTracks.

Referenced by GsfElectronBaseProducer::fillEvent().

1300  {
1301  GsfElectronPtrCollection::iterator e1, e2 ;
1306  else
1307  { throw cms::Exception("GsfElectronAlgo|UnknownAmbiguitySortingStrategy")<<"value of generalData_->strategyCfg.ambSortingStrategy is : "<<generalData_->strategyCfg.ambSortingStrategy ; }
1308 
1309  // init
1310  for
1311  ( e1 = eventData_->electrons->begin() ;
1312  e1 != eventData_->electrons->end() ;
1313  ++e1 )
1314  {
1315  (*e1)->clearAmbiguousGsfTracks() ;
1316  (*e1)->setAmbiguous(false) ;
1317  }
1318 
1319  // get ambiguous from GsfPfRecTracks
1321  {
1322  for
1323  ( e1 = eventData_->electrons->begin() ;
1324  e1 != eventData_->electrons->end() ;
1325  ++e1 )
1326  {
1327  bool found = false ;
1328  const GsfPFRecTrackCollection * gsfPfRecTrackCollection = eventData_->gsfPfRecTracks.product() ;
1329  GsfPFRecTrackCollection::const_iterator gsfPfRecTrack ;
1330  for ( gsfPfRecTrack=gsfPfRecTrackCollection->begin() ;
1331  gsfPfRecTrack!=gsfPfRecTrackCollection->end() ;
1332  ++gsfPfRecTrack )
1333  {
1334  if (gsfPfRecTrack->gsfTrackRef()==(*e1)->gsfTrack())
1335  {
1336  if (found)
1337  {
1338  edm::LogWarning("GsfElectronAlgo")<<"associated gsfPfRecTrack already found" ;
1339  }
1340  else
1341  {
1342  found = true ;
1343  const std::vector<reco::GsfPFRecTrackRef> & duplicates(gsfPfRecTrack->convBremGsfPFRecTrackRef()) ;
1344  std::vector<reco::GsfPFRecTrackRef>::const_iterator duplicate ;
1345  for ( duplicate = duplicates.begin() ; duplicate != duplicates.end() ; duplicate ++ )
1346  { (*e1)->addAmbiguousGsfTrack((*duplicate)->gsfTrackRef()) ; }
1347  }
1348  }
1349  }
1350  }
1351  }
1352  // or search overlapping clusters
1353  else
1354  {
1355  for
1356  ( e1 = eventData_->electrons->begin() ;
1357  e1 != eventData_->electrons->end() ;
1358  ++e1 )
1359  {
1360  if ((*e1)->ambiguous()) continue ;
1361  if ( ignoreNotPreselected && !isPreselected(*e1) ) continue ;
1362 
1363  SuperClusterRef scRef1 = (*e1)->superCluster();
1364  CaloClusterPtr eleClu1 = (*e1)->electronCluster();
1365  LogDebug("GsfElectronAlgo")
1366  << "Blessing electron with E/P " << (*e1)->eSuperClusterOverP()
1367  << ", cluster " << scRef1.get()
1368  << " & track " << (*e1)->gsfTrack().get() ;
1369 
1370  for
1371  ( e2 = e1, ++e2 ;
1372  e2 != eventData_->electrons->end() ;
1373  ++e2 )
1374  {
1375  if ((*e2)->ambiguous()) continue ;
1376  if ( ignoreNotPreselected && !isPreselected(*e2) ) continue ;
1377 
1378  SuperClusterRef scRef2 = (*e2)->superCluster();
1379  CaloClusterPtr eleClu2 = (*e2)->electronCluster();
1380 
1381  // search if same cluster
1382  bool sameCluster = false ;
1384  { sameCluster = (scRef1==scRef2) ; }
1386  {
1387  float eMin = 1. ;
1388  float threshold = eMin*cosh(EleRelPoint(scRef1->position(),eventData_->beamspot->position()).eta()) ;
1389  sameCluster =
1391  (EgAmbiguityTools::sharedEnergy(&(*scRef1->seed()),&(*eleClu2),eventData_->barrelRecHits,eventData_->endcapRecHits)>=threshold) ||
1393  (EgAmbiguityTools::sharedEnergy(&(*scRef1->seed()),&(*scRef2->seed()),eventData_->barrelRecHits,eventData_->endcapRecHits)>=threshold) ) ;
1394  }
1395  else
1396  { throw cms::Exception("GsfElectronAlgo|UnknownAmbiguityClustersOverlapStrategy")<<"value of generalData_->strategyCfg.ambClustersOverlapStrategy is : "<<generalData_->strategyCfg.ambClustersOverlapStrategy ; }
1397 
1398  // main instructions
1399  if (sameCluster)
1400  {
1401  LogDebug("GsfElectronAlgo")
1402  << "Discarding electron with E/P " << (*e2)->eSuperClusterOverP()
1403  << ", cluster " << scRef2.get()
1404  << " and track " << (*e2)->gsfTrack().get() ;
1405  (*e1)->addAmbiguousGsfTrack((*e2)->gsfTrack()) ;
1406  (*e2)->setAmbiguous(true) ;
1407  }
1408  else if ((*e1)->gsfTrack()==(*e2)->gsfTrack())
1409  {
1410  edm::LogWarning("GsfElectronAlgo")
1411  << "Forgetting electron with E/P " << (*e2)->eSuperClusterOverP()
1412  << ", cluster " << scRef2.get()
1413  << " and track " << (*e2)->gsfTrack().get() ;
1414  (*e2)->setAmbiguous(true) ;
1415  }
1416  }
1417  }
1418  }
1419  }
#define LogDebug(id)
bool isPreselected(reco::GsfElectron *ele)
GeneralData * generalData_
bool isBetter(const reco::GsfElectron *, const reco::GsfElectron *)
EventSetupData * eventSetupData_
edm::Handle< EcalRecHitCollection > endcapRecHits
T eta() const
const StrategyConfiguration strategyCfg
std::vector< GsfPFRecTrack > GsfPFRecTrackCollection
collection of GsfPFRecTrack objects
float sharedEnergy(const reco::CaloCluster *, const reco::CaloCluster *, edm::Handle< EcalRecHitCollection > &barrelRecHits, edm::Handle< EcalRecHitCollection > &endcapRecHits)
edm::Handle< EcalRecHitCollection > barrelRecHits
const reco::BeamSpot * beamspot
GsfElectronPtrCollection * electrons
T const * product() const
Definition: Handle.h:74
const Point & position() const
position
Definition: BeamSpot.h:63
EventData * eventData_
edm::ESHandle< TrackerGeometry > trackerHandle
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:242
edm::Handle< reco::GsfPFRecTrackCollection > gsfPfRecTracks
void GsfElectronAlgo::setCutBasedPreselectionFlag ( reco::GsfElectron ele,
const reco::BeamSpot bs 
)
private

Definition at line 924 of file GsfElectronAlgo.cc.

References abs, edm::RefToBase< T >::castTo(), reco::GsfElectron::core(), GsfElectronAlgo::GeneralData::cutsCfg, GsfElectronAlgo::GeneralData::cutsCfgPflow, reco::GsfElectron::deltaEtaSuperClusterTrackAtVtx(), reco::GsfElectron::deltaPhiSuperClusterTrackAtVtx(), EcalBarrel, EcalEndcap, reco::GsfElectron::eSuperClusterOverP(), eta(), edm::hlt::Exception, funct::false, generalData_, reco::GsfElectron::gsfTrack(), reco::GsfElectron::hcalDepth1OverEcal(), reco::GsfElectron::hcalDepth2OverEcal(), reco::GsfElectron::hcalOverEcal(), reco::CaloCluster::hitsAndFractions(), GsfElectronAlgo::CutsConfiguration::isBarrel, reco::GsfElectron::isEB(), reco::GsfElectron::isEBEEGap(), reco::GsfElectron::isEBEtaGap(), reco::GsfElectron::isEBPhiGap(), reco::GsfElectron::isEE(), reco::GsfElectron::isEEDeeGap(), reco::GsfElectron::isEERingGap(), GsfElectronAlgo::CutsConfiguration::isEndcaps, GsfElectronAlgo::CutsConfiguration::isFiducial, edm::Ref< C, T, F >::isNull(), LogTrace, GsfElectronAlgo::CutsConfiguration::maxDeltaEtaBarrel, GsfElectronAlgo::CutsConfiguration::maxDeltaEtaEndcaps, GsfElectronAlgo::CutsConfiguration::maxDeltaPhiBarrel, GsfElectronAlgo::CutsConfiguration::maxDeltaPhiEndcaps, GsfElectronAlgo::CutsConfiguration::maxEOverPBarrel, GsfElectronAlgo::CutsConfiguration::maxEOverPEndcaps, GsfElectronAlgo::CutsConfiguration::maxHOverEBarrel, GsfElectronAlgo::CutsConfiguration::maxHOverEEndcaps, GsfElectronAlgo::CutsConfiguration::maxSigmaIetaIetaBarrel, GsfElectronAlgo::CutsConfiguration::maxSigmaIetaIetaEndcaps, GsfElectronAlgo::CutsConfiguration::maxTIP, GsfElectronAlgo::CutsConfiguration::minEOverPBarrel, GsfElectronAlgo::CutsConfiguration::minEOverPEndcaps, GsfElectronAlgo::CutsConfiguration::minSCEtBarrel, GsfElectronAlgo::CutsConfiguration::minSCEtEndcaps, reco::BeamSpot::position(), hitfit::return, GsfElectronAlgo::CutsConfiguration::seedFromTEC, reco::GsfElectron::setPassCutBasedPreselection(), reco::GsfElectron::sigmaIetaIeta(), and reco::GsfElectron::superCluster().

Referenced by createElectron().

925  {
926  // default value
927  ele->setPassCutBasedPreselection(false) ;
928 
929  // kind of seeding
930  bool eg = ele->core()->ecalDrivenSeed() ;
931  bool pf = ele->core()->trackerDrivenSeed() && !ele->core()->ecalDrivenSeed() ;
932  if (eg&&pf) { throw cms::Exception("GsfElectronAlgo|BothEcalAndPureTrackerDriven")<<"An electron cannot be both egamma and purely pflow" ; }
933  if ((!eg)&&(!pf)) { throw cms::Exception("GsfElectronAlgo|NeitherEcalNorPureTrackerDriven")<<"An electron cannot be neither egamma nor purely pflow" ; }
934  const CutsConfiguration * cfg = (eg?&generalData_->cutsCfg:&generalData_->cutsCfgPflow) ;
935 
936  // Et cut
937  double etaValue = EleRelPoint(ele->superCluster()->position(),bs.position()).eta() ;
938  double etValue = ele->superCluster()->energy()/cosh(etaValue) ;
939  LogTrace("GsfElectronAlgo") << "Et : " << etValue ;
940  if (ele->isEB() && (etValue < cfg->minSCEtBarrel)) return ;
941  if (ele->isEE() && (etValue < cfg->minSCEtEndcaps)) return ;
942  LogTrace("GsfElectronAlgo") << "Et criteria are satisfied";
943 
944  // E/p cut
945  double eopValue = ele->eSuperClusterOverP() ;
946  LogTrace("GsfElectronAlgo") << "E/p : " << eopValue ;
947  if (ele->isEB() && (eopValue > cfg->maxEOverPBarrel)) return ;
948  if (ele->isEE() && (eopValue > cfg->maxEOverPEndcaps)) return ;
949  if (ele->isEB() && (eopValue < cfg->minEOverPBarrel)) return ;
950  if (ele->isEE() && (eopValue < cfg->minEOverPEndcaps)) return ;
951  LogTrace("GsfElectronAlgo") << "E/p criteria are satisfied";
952 
953  // HoE cuts
954  LogTrace("GsfElectronAlgo") << "HoE1 : " << ele->hcalDepth1OverEcal() << ", HoE2 : " << ele->hcalDepth2OverEcal();
955  double had = ele->hcalOverEcal()*ele->superCluster()->energy() ;
956  const reco::CaloCluster & seedCluster = *(ele->superCluster()->seed()) ;
957  int detector = seedCluster.hitsAndFractions()[0].first.subdetId() ;
958  bool HoEveto = false ;
959  if (detector==EcalBarrel && (had<cfg->maxHBarrel || (had/ele->superCluster()->energy())<cfg->maxHOverEBarrel)) HoEveto=true;
960  else if (detector==EcalEndcap && (had<cfg->maxHEndcaps || (had/ele->superCluster()->energy())<cfg->maxHOverEEndcaps)) HoEveto=true;
961  if ( !HoEveto ) return ;
962  LogTrace("GsfElectronAlgo") << "H/E criteria are satisfied";
963 
964  // delta eta criteria
965  double deta = ele->deltaEtaSuperClusterTrackAtVtx() ;
966  LogTrace("GsfElectronAlgo") << "delta eta : " << deta ;
967  if (ele->isEB() && (std::abs(deta) > cfg->maxDeltaEtaBarrel)) return ;
968  if (ele->isEE() && (std::abs(deta) > cfg->maxDeltaEtaEndcaps)) return ;
969  LogTrace("GsfElectronAlgo") << "Delta eta criteria are satisfied";
970 
971  // delta phi criteria
972  double dphi = ele->deltaPhiSuperClusterTrackAtVtx();
973  LogTrace("GsfElectronAlgo") << "delta phi : " << dphi;
974  if (ele->isEB() && (std::abs(dphi) > cfg->maxDeltaPhiBarrel)) return ;
975  if (ele->isEE() && (std::abs(dphi) > cfg->maxDeltaPhiEndcaps)) return ;
976  LogTrace("GsfElectronAlgo") << "Delta phi criteria are satisfied";
977 
978  // sigma ieta ieta
979  LogTrace("GsfElectronAlgo") << "sigma ieta ieta : " << ele->sigmaIetaIeta();
980  if (ele->isEB() && (ele->sigmaIetaIeta() > cfg->maxSigmaIetaIetaBarrel)) return ;
981  if (ele->isEE() && (ele->sigmaIetaIeta() > cfg->maxSigmaIetaIetaEndcaps)) return ;
982  LogTrace("GsfElectronAlgo") << "Sigma ieta ieta criteria are satisfied";
983 
984  // fiducial
985  if (!ele->isEB() && cfg->isBarrel) return ;
986  if (!ele->isEE() && cfg->isEndcaps) return ;
987  if (cfg->isFiducial && (ele->isEBEEGap()||ele->isEBEtaGap()||ele->isEBPhiGap()||ele->isEERingGap()||ele->isEEDeeGap())) return ;
988  LogTrace("GsfElectronAlgo") << "Fiducial flags criteria are satisfied";
989 
990  // seed in TEC
991  edm::RefToBase<TrajectorySeed> seed = ele->gsfTrack()->extra()->seedRef() ;
992  ElectronSeedRef elseed = seed.castTo<ElectronSeedRef>() ;
993  if (eg && !generalData_->cutsCfg.seedFromTEC)
994  {
995  if (elseed.isNull())
996  { throw cms::Exception("GsfElectronAlgo|NotElectronSeed")<<"The GsfTrack seed is not an ElectronSeed ?!" ; }
997  else
998  { if (elseed->subDet2()==6) return ; }
999  }
1000 
1001  // transverse impact parameter
1002  if (std::abs(ele->gsfTrack()->dxy(bs.position()))>cfg->maxTIP) return ;
1003  LogTrace("GsfElectronAlgo") << "TIP criterion is satisfied" ;
1004 
1005  LogTrace("GsfElectronAlgo") << "All cut based criteria are satisfied" ;
1006  ele->setPassCutBasedPreselection(true) ;
1007  }
GeneralData * generalData_
const CutsConfiguration cutsCfgPflow
void setPassCutBasedPreselection(bool flag)
Definition: GsfElectron.h:593
bool isEBEtaGap() const
Definition: GsfElectron.h:335
float eSuperClusterOverP() const
Definition: GsfElectron.h:229
bool isEBEEGap() const
Definition: GsfElectron.h:333
float hcalDepth2OverEcal() const
Definition: GsfElectron.h:389
#define abs(x)
Definition: mlp_lapack.h:159
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:189
bool isEERingGap() const
Definition: GsfElectron.h:339
T eta() const
bool isEEDeeGap() const
Definition: GsfElectron.h:338
bool isEE() const
Definition: GsfElectron.h:331
bool isEB() const
Definition: GsfElectron.h:330
float deltaEtaSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:233
bool isNull() const
Checks for null.
Definition: Ref.h:247
float sigmaIetaIeta() const
Definition: GsfElectron.h:382
virtual SuperClusterRef superCluster() const
reference to a SuperCluster
Definition: GsfElectron.h:168
float deltaPhiSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:236
float hcalOverEcal() const
Definition: GsfElectron.h:390
const CutsConfiguration cutsCfg
#define LogTrace(id)
float hcalDepth1OverEcal() const
Definition: GsfElectron.h:388
REF castTo() const
cast to a concrete type
Definition: RefToBase.h:241
virtual GsfElectronCoreRef core() const
Definition: GsfElectron.cc:8
bool isEBPhiGap() const
Definition: GsfElectron.h:336
const Point & position() const
position
Definition: BeamSpot.h:63
virtual GsfTrackRef gsfTrack() const
reference to a GsfTrack
Definition: GsfElectron.h:169
void GsfElectronAlgo::setPflowPreselectionFlag ( reco::GsfElectron ele)
private

Definition at line 1009 of file GsfElectronAlgo.cc.

References reco::GsfElectron::core(), GsfElectronAlgo::GeneralData::cutsCfg, GsfElectronAlgo::GeneralData::cutsCfgPflow, generalData_, LogTrace, GsfElectronAlgo::CutsConfiguration::minMVA, reco::GsfElectron::MvaOutput::mva, reco::GsfElectron::mvaOutput(), reco::GsfElectron::passingMvaPreselection(), reco::GsfElectron::setPassMvaPreselection(), and reco::GsfElectron::setPassPflowPreselection().

Referenced by addPflowInfo().

1010  {
1011  ele->setPassMvaPreselection(false) ;
1012 
1013  if (ele->core()->ecalDrivenSeed())
1014  { if (ele->mvaOutput().mva>=generalData_->cutsCfg.minMVA) ele->setPassMvaPreselection(true) ; }
1015  else
1016  { if (ele->mvaOutput().mva>=generalData_->cutsCfgPflow.minMVA) ele->setPassMvaPreselection(true) ; }
1017 
1018  if (ele->passingMvaPreselection())
1019  { LogTrace("GsfElectronAlgo") << "Main mva criterion is satisfied" ; }
1020 
1022 
1023 // ele->setPassPflowPreselection(false) ;
1024 // if (ele->core()->ecalDrivenSeed())
1025 // {
1026 // if ((ele->mvaOutput().mva>=generalData_->cutsCfg.minMVA) ||
1027 // (ele->mvaOutput().mvaByPassForIsolated>=generalData_->cutsCfg.minMvaByPassForIsolated))
1028 // ele->setPassPflowPreselection(true) ;
1029 // }
1030 // else
1031 // {
1032 // if ((ele->mvaOutput().mva>=generalData_->cutsCfgPflow.minMVA) ||
1033 // (ele->mvaOutput().mvaByPassForIsolated>=generalData_->cutsCfgPflow.minMvaByPassForIsolated))
1034 // ele->setPassPflowPreselection(true) ;
1035 // }
1036 // if (ele->passingPflowPreselection())
1037 // { LogTrace("GsfElectronAlgo") << "Mva criteria are satisfied" ; }
1038  }
GeneralData * generalData_
const CutsConfiguration cutsCfgPflow
bool passingMvaPreselection() const
Definition: GsfElectron.h:601
void setPassMvaPreselection(bool flag)
Definition: GsfElectron.h:600
const CutsConfiguration cutsCfg
#define LogTrace(id)
const MvaOutput & mvaOutput() const
Definition: GsfElectron.h:558
virtual GsfElectronCoreRef core() const
Definition: GsfElectron.cc:8
void setPassPflowPreselection(bool flag)
Definition: GsfElectron.h:594

Member Data Documentation

ElectronData* GsfElectronAlgo::electronData_
private

Definition at line 218 of file GsfElectronAlgo.h.

Referenced by completeElectrons(), createElectron(), and ~GsfElectronAlgo().

EventData* GsfElectronAlgo::eventData_
private
EventSetupData* GsfElectronAlgo::eventSetupData_
private
GeneralData* GsfElectronAlgo::generalData_
private