diff --git a/RecoEgamma/EgammaHLTProducers/plugins/BuildFile.xml b/RecoEgamma/EgammaHLTProducers/plugins/BuildFile.xml
index 7ccea71c41574..62fe9ec9b516c 100644
--- a/RecoEgamma/EgammaHLTProducers/plugins/BuildFile.xml
+++ b/RecoEgamma/EgammaHLTProducers/plugins/BuildFile.xml
@@ -4,6 +4,7 @@
+
diff --git a/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTHGCalIDVarProducer.cc b/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTHGCalIDVarProducer.cc
new file mode 100644
index 0000000000000..11e5242e1a6e8
--- /dev/null
+++ b/RecoEgamma/EgammaHLTProducers/plugins/EgammaHLTHGCalIDVarProducer.cc
@@ -0,0 +1,139 @@
+
+
+#include "FWCore/Framework/interface/Frameworkfwd.h"
+#include "FWCore/Framework/interface/stream/EDProducer.h"
+#include "FWCore/Framework/interface/Event.h"
+#include "FWCore/Framework/interface/MakerMacros.h"
+#include "FWCore/ParameterSet/interface/ParameterSet.h"
+
+#include "DataFormats/RecoCandidate/interface/RecoEcalCandidateIsolation.h"
+#include "DataFormats/EgammaReco/interface/SuperCluster.h"
+#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
+#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
+
+#include "DataFormats/CaloRecHit/interface/CaloCluster.h"
+#include "DataFormats/CaloRecHit/interface/CaloClusterFwd.h"
+
+#include "DataFormats/EgammaReco/interface/SuperCluster.h"
+#include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
+
+#include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
+#include "DataFormats/RecoCandidate/interface/RecoEcalCandidateFwd.h"
+
+#include "DataFormats/ParticleFlowReco/interface/PFRecHit.h"
+
+#include "RecoEgamma/EgammaTools/interface/HGCalShowerShapeHelper.h"
+#include "RecoEgamma/EgammaTools/interface/HGCalClusterTools.h"
+
+class EgammaHLTHGCalIDVarProducer : public edm::stream::EDProducer<> {
+public:
+ explicit EgammaHLTHGCalIDVarProducer(const edm::ParameterSet&);
+ ~EgammaHLTHGCalIDVarProducer() override;
+
+ static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
+ void produce(edm::Event&, const edm::EventSetup&) override;
+
+ class PCAAssocMap {
+ public:
+ PCAAssocMap(double HGCalShowerShapeHelper::ShowerWidths::*var, const std::string& name) : var_(var), name_(name) {}
+
+ std::unique_ptr& initMap(
+ const edm::Handle& candHandle) {
+ assocMap_ = std::make_unique(candHandle);
+ return assocMap_;
+ }
+
+ void insert(reco::RecoEcalCandidateRef& ref, const HGCalShowerShapeHelper::ShowerWidths& showerWidths) {
+ assocMap_->insert(ref, showerWidths.*var_);
+ }
+
+ std::unique_ptr& operator()() { return assocMap_; }
+ const std::string& name() const { return name_; }
+
+ private:
+ double HGCalShowerShapeHelper::ShowerWidths::*var_;
+ std::string name_;
+ std::unique_ptr assocMap_;
+ };
+
+private:
+ // ----------member data ---------------------------
+ float rCylinder_;
+ float hOverECone_;
+ std::vector pcaAssocMaps_;
+ const edm::EDGetTokenT recoEcalCandidateToken_;
+ const edm::EDGetTokenT hgcalRecHitToken_;
+ const edm::EDGetTokenT layerClusterToken_;
+};
+
+EgammaHLTHGCalIDVarProducer::EgammaHLTHGCalIDVarProducer(const edm::ParameterSet& config)
+ : rCylinder_(config.getParameter("rCylinder")),
+ hOverECone_(config.getParameter("hOverECone")),
+ recoEcalCandidateToken_(
+ consumes(config.getParameter("recoEcalCandidateProducer"))),
+ hgcalRecHitToken_(consumes(config.getParameter("hgcalRecHits"))),
+ layerClusterToken_(consumes(config.getParameter("layerClusters"))) {
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2xx, "sigma2xx"));
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2yy, "sigma2yy"));
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2zz, "sigma2zz"));
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2xy, "sigma2xy"));
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2yz, "sigma2yz"));
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2zx, "sigma2zx"));
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2uu, "sigma2uu"));
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2vv, "sigma2vv"));
+ pcaAssocMaps_.emplace_back(PCAAssocMap(&HGCalShowerShapeHelper::ShowerWidths::sigma2ww, "sigma2ww"));
+
+ produces("rVar");
+ produces("hForHOverE");
+ for (auto& var : pcaAssocMaps_) {
+ produces(var.name());
+ }
+}
+
+EgammaHLTHGCalIDVarProducer::~EgammaHLTHGCalIDVarProducer() {}
+
+void EgammaHLTHGCalIDVarProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
+ edm::ParameterSetDescription desc;
+ desc.add("recoEcalCandidateProducer", edm::InputTag("hltL1SeededRecoEcalCandidate"));
+ desc.add("hgcalRecHits", edm::InputTag("hgcalRecHits"));
+ desc.add("layerClusters", edm::InputTag("layerClusters"));
+ desc.add("rCylinder", 2.8);
+ desc.add("hOverECone", 0.15);
+ descriptions.add(("hltEgammaHLTHGCalIDVarProducer"), desc);
+}
+
+void EgammaHLTHGCalIDVarProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
+ auto recoEcalCandHandle = iEvent.getHandle(recoEcalCandidateToken_);
+ auto hgcalRecHitHandle = iEvent.getHandle(hgcalRecHitToken_);
+ auto layerClustersHandle = iEvent.getHandle(layerClusterToken_);
+
+ HGCalShowerShapeHelper ssCalc;
+ ssCalc.initPerEvent(iSetup, *hgcalRecHitHandle);
+
+ auto rVarMap = std::make_unique(recoEcalCandHandle);
+ auto hForHoverEMap = std::make_unique(recoEcalCandHandle);
+ for (auto& pcaMap : pcaAssocMaps_) {
+ pcaMap.initMap(recoEcalCandHandle);
+ }
+
+ for (size_t candNr = 0; candNr < recoEcalCandHandle->size(); candNr++) {
+ reco::RecoEcalCandidateRef candRef(recoEcalCandHandle, candNr);
+ ssCalc.initPerObject(candRef->superCluster()->hitsAndFractions());
+ rVarMap->insert(candRef, ssCalc.getRvar(rCylinder_, candRef->superCluster()->energy()));
+
+ float hForHoverE = HGCalClusterTools::hadEnergyInCone(
+ candRef->superCluster()->eta(), candRef->superCluster()->phi(), *layerClustersHandle, 0., hOverECone_, 0., 0.);
+ hForHoverEMap->insert(candRef, hForHoverE);
+ auto pcaWidths = ssCalc.getPCAWidths(rCylinder_);
+ for (auto& pcaMap : pcaAssocMaps_) {
+ pcaMap.insert(candRef, pcaWidths);
+ }
+ }
+ iEvent.put(std::move(rVarMap), "rVar");
+ iEvent.put(std::move(hForHoverEMap), "hForHOverE");
+ for (auto& pcaMap : pcaAssocMaps_) {
+ iEvent.put(std::move(pcaMap()), pcaMap.name());
+ }
+}
+
+DEFINE_FWK_MODULE(EgammaHLTHGCalIDVarProducer);
diff --git a/RecoEgamma/EgammaTools/interface/HGCalClusterTools.h b/RecoEgamma/EgammaTools/interface/HGCalClusterTools.h
new file mode 100644
index 0000000000000..bfb94fa14d8e2
--- /dev/null
+++ b/RecoEgamma/EgammaTools/interface/HGCalClusterTools.h
@@ -0,0 +1,44 @@
+#ifndef RecoEgamma_EgammaTools_HGCalClusterTools_h
+#define RecoEgamma_EgammaTools_HGCalClusterTools_h
+
+#include "DataFormats/CaloRecHit/interface/CaloClusterFwd.h"
+#include
+
+class HGCalClusterTools {
+public:
+ enum class EType { ET, ENERGY };
+
+ static float energyInCone(const float eta,
+ const float phi,
+ const std::vector& layerClusters,
+ const float minDR,
+ const float maxDR,
+ const float minEt,
+ const float minEnergy,
+ const std::vector& subDets,
+ const HGCalClusterTools::EType& eType = EType::ENERGY);
+
+ static float hadEnergyInCone(const float eta,
+ const float phi,
+ const std::vector& layerClusters,
+ const float minDR,
+ const float maxDR,
+ const float minEt,
+ const float minEnergy,
+ const HGCalClusterTools::EType& eType = EType::ENERGY) {
+ return energyInCone(
+ eta, phi, layerClusters, minDR, maxDR, minEt, minEnergy, {DetId::HGCalHSi, DetId::HGCalHSc}, eType);
+ }
+ static float emEnergyInCone(const float eta,
+ const float phi,
+ const std::vector& layerClusters,
+ const float minDR,
+ const float maxDR,
+ const float minEt,
+ const float minEnergy,
+ const HGCalClusterTools::EType& eType = EType::ENERGY) {
+ return energyInCone(eta, phi, layerClusters, minDR, maxDR, minEt, minEnergy, {DetId::HGCalEE}, eType);
+ }
+};
+
+#endif
diff --git a/RecoEgamma/EgammaTools/interface/HGCalShowerShapeHelper.h b/RecoEgamma/EgammaTools/interface/HGCalShowerShapeHelper.h
new file mode 100644
index 0000000000000..a86e084a4b838
--- /dev/null
+++ b/RecoEgamma/EgammaTools/interface/HGCalShowerShapeHelper.h
@@ -0,0 +1,131 @@
+#ifndef RecoEgamma_EgammaTools_HGCalShowerShapeHelper_h
+#define RecoEgamma_EgammaTools_HGCalShowerShapeHelper_h
+
+// system include files
+#include
+
+// user include files
+#include "DataFormats/CaloRecHit/interface/CaloCluster.h"
+#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
+#include "DataFormats/FWLite/interface/ESHandle.h"
+#include "DataFormats/ForwardDetId/interface/HGCEEDetId.h"
+#include "DataFormats/ForwardDetId/interface/HGCalDetId.h"
+#include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
+#include "DataFormats/HGCRecHit/interface/HGCRecHit.h"
+#include "DataFormats/Math/interface/LorentzVector.h"
+#include "DataFormats/ParticleFlowReco/interface/PFRecHit.h"
+#include "DataFormats/ParticleFlowReco/interface/PFRecHitFraction.h"
+#include "DataFormats/TrackReco/interface/Track.h"
+#include "DataFormats/TrackReco/interface/TrackFwd.h"
+#include "FWCore/Framework/interface/Event.h"
+#include "FWCore/Framework/interface/Frameworkfwd.h"
+#include "FWCore/Framework/interface/MakerMacros.h"
+#include "FWCore/Framework/interface/stream/EDProducer.h"
+#include "FWCore/ParameterSet/interface/ParameterSet.h"
+#include "FWCore/Utilities/interface/StreamID.h"
+#include "Geometry/CaloTopology/interface/HGCalTopology.h"
+#include "Geometry/Records/interface/IdealGeometryRecord.h"
+#include "RecoLocalCalo/HGCalRecAlgos/interface/RecHitTools.h"
+#include "RecoParticleFlow/PFClusterProducer/interface/InitialClusteringStepBase.h"
+
+#include
+
+#include
+#include
+#include
+#include