Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-07-09 05:00:25

0001 // Author: Marco Rovere, marco.rovere@cern.ch
0002 // Date: 05/2019
0003 //
0004 #include <memory>  // unique_ptr
0005 
0006 #include "FWCore/Framework/interface/stream/EDProducer.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0010 #include "FWCore/Utilities/interface/ESGetToken.h"
0011 
0012 #include "DataFormats/CaloRecHit/interface/CaloCluster.h"
0013 #include "DataFormats/HGCalReco/interface/TICLLayerTile.h"
0014 
0015 #include "RecoLocalCalo/HGCalRecAlgos/interface/RecHitTools.h"
0016 
0017 class TICLLayerTileProducer : public edm::stream::EDProducer<> {
0018 public:
0019   explicit TICLLayerTileProducer(const edm::ParameterSet &ps);
0020   ~TICLLayerTileProducer() override {}
0021   void beginRun(edm::Run const &, edm::EventSetup const &) override;
0022   void produce(edm::Event &, const edm::EventSetup &) override;
0023   static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
0024 
0025 private:
0026   edm::EDGetTokenT<std::vector<reco::CaloCluster>> clusters_token_;
0027   edm::EDGetTokenT<std::vector<reco::CaloCluster>> clusters_HFNose_token_;
0028   edm::ESGetToken<CaloGeometry, CaloGeometryRecord> geometry_token_;
0029   hgcal::RecHitTools rhtools_;
0030   std::string detector_;
0031   bool doNose_;
0032 };
0033 
0034 TICLLayerTileProducer::TICLLayerTileProducer(const edm::ParameterSet &ps)
0035     : detector_(ps.getParameter<std::string>("detector")) {
0036   geometry_token_ = esConsumes<CaloGeometry, CaloGeometryRecord, edm::Transition::BeginRun>();
0037 
0038   doNose_ = (detector_ == "HFNose");
0039 
0040   if (doNose_) {
0041     clusters_HFNose_token_ =
0042         consumes<std::vector<reco::CaloCluster>>(ps.getParameter<edm::InputTag>("layer_HFNose_clusters"));
0043     produces<TICLLayerTilesHFNose>();
0044   } else {
0045     clusters_token_ = consumes<std::vector<reco::CaloCluster>>(ps.getParameter<edm::InputTag>("layer_clusters"));
0046     produces<TICLLayerTiles>();
0047     produces<TICLLayerTilesBarrel>("ticlLayerTilesBarrel");
0048   }
0049 }
0050 
0051 void TICLLayerTileProducer::beginRun(edm::Run const &, edm::EventSetup const &es) {
0052   edm::ESHandle<CaloGeometry> geom = es.getHandle(geometry_token_);
0053   rhtools_.setGeometry(*geom);
0054 }
0055 
0056 void TICLLayerTileProducer::produce(edm::Event &evt, const edm::EventSetup &) {
0057   std::unique_ptr<TICLLayerTilesHFNose> resultHFNose;
0058   std::unique_ptr<TICLLayerTiles> result;
0059   std::unique_ptr<TICLLayerTilesBarrel> resultBarrel;
0060   if (doNose_) {
0061     resultHFNose = std::make_unique<TICLLayerTilesHFNose>();
0062   } else {
0063     resultBarrel = std::make_unique<TICLLayerTilesBarrel>();
0064     result = std::make_unique<TICLLayerTiles>();
0065   }
0066 
0067   edm::Handle<std::vector<reco::CaloCluster>> cluster_h;
0068   if (doNose_)
0069     evt.getByToken(clusters_HFNose_token_, cluster_h);
0070   else
0071     evt.getByToken(clusters_token_, cluster_h);
0072 
0073   const auto &layerClusters = *cluster_h;
0074   int lcId = 0;
0075   for (auto const &lc : layerClusters) {
0076     const auto firstHitDetId = lc.hitsAndFractions()[0].first;
0077     int layer = rhtools_.getLayerWithOffset(firstHitDetId);
0078     bool isBarrelLC = rhtools_.isBarrel(firstHitDetId);
0079     if (!isBarrelLC) {
0080       layer += rhtools_.lastLayer(doNose_) * ((rhtools_.zside(firstHitDetId) + 1) >> 1) - 1;
0081     }
0082     assert(layer >= 0);
0083 
0084     if (doNose_) {
0085       resultHFNose->fill(layer, lc.eta(), lc.phi(), lcId);
0086     } else if (isBarrelLC) {
0087       resultBarrel->fill(layer, lc.eta(), lc.phi(), lcId);
0088     } else {
0089       result->fill(layer, lc.eta(), lc.phi(), lcId);
0090     }
0091     LogDebug("TICLLayerTileProducer") << "Adding layerClusterId: " << lcId << " into bin [eta,phi]: [ "
0092                                       << (*result)[layer].etaBin(lc.eta()) << ", " << (*result)[layer].phiBin(lc.phi())
0093                                       << "] for layer: " << layer << std::endl;
0094     lcId++;
0095   }
0096   if (doNose_)
0097     evt.put(std::move(resultHFNose));
0098   else {
0099     evt.put(std::move(resultBarrel), "ticlLayerTilesBarrel");
0100     evt.put(std::move(result));
0101   }
0102 }
0103 
0104 void TICLLayerTileProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0105   edm::ParameterSetDescription desc;
0106   desc.add<std::string>("detector", "HGCAL");
0107   desc.add<edm::InputTag>("layer_clusters", edm::InputTag("hgcalMergeLayerClusters"));
0108   desc.add<edm::InputTag>("layer_HFNose_clusters", edm::InputTag("hgcalLayerClustersHFNose"));
0109   descriptions.add("ticlLayerTileProducer", desc);
0110 }
0111 
0112 #include "FWCore/Framework/interface/MakerMacros.h"
0113 DEFINE_FWK_MODULE(TICLLayerTileProducer);