Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-04-30 22:24:33

0001 // Author: Felice Pantaleo, Marco Rovere - felice.pantaleo@cern.ch, marco.rovere@cern.ch
0002 // Date: 09/2018
0003 
0004 // user include files
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});  // 6,7,8
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   // Protection against missing input collections
0082   if (!clusterHandle.isValid() || !inputClustersMaskHandle.isValid()) {
0083     edm::LogWarning("FilteredLayerClustersProducer") << "Missing input collections. Producing an empty mask.";
0084 
0085     // Produce an empty mask and exit
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   // Transfer input mask in output
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 }