File indexing completed on 2025-04-30 22:24:33
0001
0002
0003
0004
0005 #include "FWCore/Framework/interface/ESHandle.h"
0006 #include "FWCore/Framework/interface/Event.h"
0007 #include "FWCore/Framework/interface/Frameworkfwd.h"
0008 #include "FWCore/Framework/interface/MakerMacros.h"
0009 #include "FWCore/Framework/interface/stream/EDProducer.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0013 #include "FWCore/Utilities/interface/ESGetToken.h"
0014
0015 #include "DataFormats/ParticleFlowReco/interface/PFCluster.h"
0016 #include "RecoLocalCalo/HGCalRecAlgos/interface/RecHitTools.h"
0017
0018 #include "ClusterFilterFactory.h"
0019 #include "ClusterFilterBase.h"
0020
0021 #include <string>
0022
0023 class FilteredLayerClustersProducer : public edm::stream::EDProducer<> {
0024 public:
0025 FilteredLayerClustersProducer(const edm::ParameterSet&);
0026 ~FilteredLayerClustersProducer() override {}
0027 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0028 void beginRun(edm::Run const&, edm::EventSetup const&) override;
0029 void produce(edm::Event&, const edm::EventSetup&) override;
0030
0031 private:
0032 edm::EDGetTokenT<std::vector<reco::CaloCluster>> clusters_token_;
0033 edm::EDGetTokenT<std::vector<float>> clustersMask_token_;
0034 edm::ESGetToken<CaloGeometry, CaloGeometryRecord> caloGeometry_token_;
0035 std::string clusterFilter_;
0036 std::string iteration_label_;
0037 std::unique_ptr<const ticl::ClusterFilterBase> theFilter_;
0038 hgcal::RecHitTools rhtools_;
0039 };
0040
0041 DEFINE_FWK_MODULE(FilteredLayerClustersProducer);
0042
0043 FilteredLayerClustersProducer::FilteredLayerClustersProducer(const edm::ParameterSet& ps) {
0044 clusters_token_ = consumes<std::vector<reco::CaloCluster>>(ps.getParameter<edm::InputTag>("LayerClusters"));
0045 clustersMask_token_ = consumes<std::vector<float>>(ps.getParameter<edm::InputTag>("LayerClustersInputMask"));
0046 caloGeometry_token_ = esConsumes<CaloGeometry, CaloGeometryRecord, edm::Transition::BeginRun>();
0047 clusterFilter_ = ps.getParameter<std::string>("clusterFilter");
0048 theFilter_ = ClusterFilterFactory::get()->create(clusterFilter_, ps);
0049 iteration_label_ = ps.getParameter<std::string>("iteration_label");
0050 produces<std::vector<float>>(iteration_label_);
0051 }
0052
0053 void FilteredLayerClustersProducer::beginRun(edm::Run const&, edm::EventSetup const& es) {
0054 edm::ESHandle<CaloGeometry> geom = es.getHandle(caloGeometry_token_);
0055 rhtools_.setGeometry(*geom);
0056 }
0057
0058 void FilteredLayerClustersProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0059 edm::ParameterSetDescription desc;
0060 desc.add<edm::InputTag>("LayerClusters", edm::InputTag("hgcalMergeLayerClusters"));
0061 desc.add<edm::InputTag>("LayerClustersInputMask",
0062 edm::InputTag("hgcalMergeLayerClusters", "InitialLayerClustersMask"));
0063 desc.add<std::string>("iteration_label", "iterationLabelGoesHere");
0064 desc.add<std::string>("clusterFilter", "ClusterFilterByAlgoAndSize");
0065 desc.add<std::vector<int>>(
0066 "algo_number",
0067 {reco::CaloCluster::hgcal_em, reco::CaloCluster::hgcal_had, reco::CaloCluster::hgcal_scintillator});
0068 desc.add<int>("min_cluster_size", 0);
0069 desc.add<int>("max_cluster_size", 9999);
0070 desc.add<int>("min_layerId", 0);
0071 desc.add<int>("max_layerId", 9999);
0072 descriptions.add("filteredLayerClustersProducer", desc);
0073 }
0074
0075 void FilteredLayerClustersProducer::produce(edm::Event& evt, const edm::EventSetup& es) {
0076 edm::Handle<std::vector<reco::CaloCluster>> clusterHandle;
0077 edm::Handle<std::vector<float>> inputClustersMaskHandle;
0078 evt.getByToken(clusters_token_, clusterHandle);
0079 evt.getByToken(clustersMask_token_, inputClustersMaskHandle);
0080
0081
0082 if (!clusterHandle.isValid() || !inputClustersMaskHandle.isValid()) {
0083 edm::LogWarning("FilteredLayerClustersProducer") << "Missing input collections. Producing an empty mask.";
0084
0085
0086 auto emptyMask = std::make_unique<std::vector<float>>();
0087 evt.put(std::move(emptyMask), iteration_label_);
0088 return;
0089 }
0090
0091 const auto& inputClusterMask = *inputClustersMaskHandle;
0092
0093
0094 auto layerClustersMask = std::make_unique<std::vector<float>>(inputClusterMask);
0095
0096 const auto& layerClusters = *clusterHandle;
0097 if (theFilter_) {
0098 theFilter_->filter(layerClusters, *layerClustersMask, rhtools_);
0099 }
0100
0101 evt.put(std::move(layerClustersMask), iteration_label_);
0102 }