File indexing completed on 2024-04-06 12:24:47
0001 #include "RecoEgamma/EgammaElectronAlgos/interface/ElectronHcalHelper.h"
0002 #include "Geometry/Records/interface/CaloGeometryRecord.h"
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004 #include "FWCore/Framework/interface/ConsumesCollector.h"
0005
0006 using namespace reco;
0007
0008 ElectronHcalHelper::ElectronHcalHelper(const Configuration& cfg, edm::ConsumesCollector&& cc) : cfg_(cfg) {
0009 if (cfg_.hOverEConeSize == 0. and !cfg_.onlyBehindCluster) {
0010 return;
0011 }
0012
0013 caloGeometryToken_ = cc.esConsumes();
0014 hcalTopologyToken_ = cc.esConsumes();
0015 hcalChannelQualityToken_ = cc.esConsumes(edm::ESInputTag("", "withTopo"));
0016 hcalSevLvlComputerToken_ = cc.esConsumes();
0017 towerMapToken_ = cc.esConsumes();
0018 }
0019
0020 void ElectronHcalHelper::beginEvent(const edm::Event& evt, const edm::EventSetup& eventSetup) {
0021 if (cfg_.hOverEConeSize == 0. and !cfg_.onlyBehindCluster) {
0022 return;
0023 }
0024
0025 hcalTopology_ = &eventSetup.getData(hcalTopologyToken_);
0026 hcalChannelQuality_ = &eventSetup.getData(hcalChannelQualityToken_);
0027 hcalSevLvlComputer_ = &eventSetup.getData(hcalSevLvlComputerToken_);
0028 towerMap_ = &eventSetup.getData(towerMapToken_);
0029
0030 if (cfg_.onlyBehindCluster) {
0031 hcalIso_ = std::make_unique<EgammaHcalIsolation>(EgammaHcalIsolation::InclusionRule::isBehindClusterSeed,
0032 0.,
0033 EgammaHcalIsolation::InclusionRule::withinConeAroundCluster,
0034 0.,
0035 cfg_.eThresHB,
0036 EgammaHcalIsolation::arrayHB{{0., 0., 0., 0.}},
0037 cfg_.maxSeverityHB,
0038 cfg_.eThresHE,
0039 EgammaHcalIsolation::arrayHE{{0., 0., 0., 0., 0., 0., 0.}},
0040 cfg_.maxSeverityHE,
0041 evt.get(cfg_.hbheRecHits),
0042 eventSetup.getHandle(caloGeometryToken_),
0043 eventSetup.getHandle(hcalTopologyToken_),
0044 eventSetup.getHandle(hcalChannelQualityToken_),
0045 eventSetup.getHandle(hcalSevLvlComputerToken_),
0046 towerMap_);
0047 } else {
0048 hcalIso_ = std::make_unique<EgammaHcalIsolation>(EgammaHcalIsolation::InclusionRule::withinConeAroundCluster,
0049 cfg_.hOverEConeSize,
0050 EgammaHcalIsolation::InclusionRule::withinConeAroundCluster,
0051 0.,
0052 cfg_.eThresHB,
0053 EgammaHcalIsolation::arrayHB{{0., 0., 0., 0.}},
0054 cfg_.maxSeverityHB,
0055 cfg_.eThresHE,
0056 EgammaHcalIsolation::arrayHE{{0., 0., 0., 0., 0., 0., 0.}},
0057 cfg_.maxSeverityHE,
0058 evt.get(cfg_.hbheRecHits),
0059 eventSetup.getHandle(caloGeometryToken_),
0060 eventSetup.getHandle(hcalTopologyToken_),
0061 eventSetup.getHandle(hcalChannelQualityToken_),
0062 eventSetup.getHandle(hcalSevLvlComputerToken_),
0063 towerMap_);
0064 }
0065 }
0066
0067 bool ElectronHcalHelper::hasActiveHcal(const reco::SuperCluster& sc) const {
0068 return (cfg_.checkHcalStatus)
0069 ? egamma::hasActiveHcal(hcalTowersBehindClusters(sc), *towerMap_, *hcalChannelQuality_, *hcalTopology_)
0070 : true;
0071 }
0072
0073 double ElectronHcalHelper::hcalESum(const SuperCluster& sc, int depth, const HcalPFCuts* hcalCuts) const {
0074 return (cfg_.onlyBehindCluster) ? hcalIso_->getHcalESumBc(&sc, depth, hcalCuts)
0075 : (cfg_.hOverEConeSize > 0.) ? hcalIso_->getHcalESum(&sc, depth, hcalCuts)
0076 : 0.;
0077 }