Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-06-22 02:24:05

0001 #include "FWCore/Framework/interface/Event.h"
0002 #include "FWCore/Framework/interface/Frameworkfwd.h"
0003 #include "FWCore/Framework/interface/MakerMacros.h"
0004 #include "FWCore/Framework/interface/stream/EDProducer.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "FWCore/Utilities/interface/RunningAverage.h"
0007 #include "RecoParticleFlow/PFClusterProducer/interface/PFRecHitCreatorBase.h"
0008 #include "RecoParticleFlow/PFClusterProducer/interface/PFRecHitNavigatorBase.h"
0009 
0010 #include <memory>
0011 
0012 //
0013 // class declaration
0014 //
0015 
0016 class PFRecHitProducer final : public edm::stream::EDProducer<> {
0017 public:
0018   explicit PFRecHitProducer(const edm::ParameterSet& iConfig);
0019   ~PFRecHitProducer() override;
0020 
0021   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0022 
0023 private:
0024   void produce(edm::Event&, const edm::EventSetup&) override;
0025   void beginRun(edm::Run const&, const edm::EventSetup&) override;
0026   std::vector<std::unique_ptr<PFRecHitCreatorBase>> creators_;
0027   std::unique_ptr<PFRecHitNavigatorBase> navigator_;
0028   bool init_;
0029 };
0030 
0031 #include "FWCore/Framework/interface/MakerMacros.h"
0032 DEFINE_FWK_MODULE(PFRecHitProducer);
0033 
0034 namespace {
0035   bool sortByDetId(const reco::PFRecHit& a, const reco::PFRecHit& b) { return a.detId() < b.detId(); }
0036 
0037   edm::RunningAverage localRA1;
0038   edm::RunningAverage localRA2;
0039 }  // namespace
0040 
0041 PFRecHitProducer::PFRecHitProducer(const edm::ParameterSet& iConfig) {
0042   produces<reco::PFRecHitCollection>();
0043   produces<reco::PFRecHitCollection>("Cleaned");
0044 
0045   edm::ConsumesCollector cc = consumesCollector();
0046 
0047   std::vector<edm::ParameterSet> creators = iConfig.getParameter<std::vector<edm::ParameterSet>>("producers");
0048   for (auto& creator : creators) {
0049     std::string name = creator.getParameter<std::string>("name");
0050     creators_.emplace_back(PFRecHitFactory::get()->create(name, creator, cc));
0051   }
0052 
0053   edm::ParameterSet navSet = iConfig.getParameter<edm::ParameterSet>("navigator");
0054   navigator_ = PFRecHitNavigationFactory::get()->create(navSet.getParameter<std::string>("name"), navSet, cc);
0055 }
0056 
0057 PFRecHitProducer::~PFRecHitProducer() = default;
0058 
0059 //
0060 // member functions
0061 //
0062 
0063 void PFRecHitProducer::beginRun(edm::Run const& iRun, const edm::EventSetup& iSetup) {
0064   for (const auto& creator : creators_) {
0065     creator->init(iSetup);
0066   }
0067   navigator_->init(iSetup);
0068 }
0069 
0070 // ------------ method called to produce the data  ------------
0071 void PFRecHitProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0072   using namespace edm;
0073   auto out = std::make_unique<reco::PFRecHitCollection>();
0074   auto cleaned = std::make_unique<reco::PFRecHitCollection>();
0075 
0076   out->reserve(localRA1.upper());
0077   cleaned->reserve(localRA2.upper());
0078 
0079   for (const auto& creator : creators_) {
0080     creator->importRecHits(out, cleaned, iEvent, iSetup);
0081   }
0082 
0083   if (out->capacity() > 2 * out->size())
0084     out->shrink_to_fit();
0085   if (cleaned->capacity() > 2 * cleaned->size())
0086     cleaned->shrink_to_fit();
0087   localRA1.update(out->size());
0088   localRA2.update(cleaned->size());
0089   std::sort(out->begin(), out->end(), sortByDetId);
0090 
0091   //create a refprod here
0092   edm::RefProd<reco::PFRecHitCollection> refProd = iEvent.getRefBeforePut<reco::PFRecHitCollection>();
0093 
0094   for (auto& pfrechit : *out) {
0095     navigator_->associateNeighbours(pfrechit, out, refProd);
0096   }
0097 
0098   iEvent.put(std::move(out), "");
0099   iEvent.put(std::move(cleaned), "Cleaned");
0100 }
0101 
0102 void PFRecHitProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0103   edm::ParameterSetDescription desc;
0104   {
0105     edm::ParameterSetDescription pset;
0106     pset.add<std::string>("name", "");
0107     pset.add<std::vector<int>>("hcalEnums", {});
0108     pset.add<edm::ParameterSetDescription>("barrel", {});
0109     pset.add<edm::ParameterSetDescription>("endcap", {});
0110     {
0111       edm::ParameterSetDescription pset2;
0112       pset2.add<std::string>("name", "");
0113       pset2.add<std::string>("topologySource", "");
0114       pset.add<edm::ParameterSetDescription>("hgcee", pset2);
0115       pset.add<edm::ParameterSetDescription>("hgcheb", pset2);
0116       pset.add<edm::ParameterSetDescription>("hgchef", pset2);
0117     }
0118     desc.add<edm::ParameterSetDescription>("navigator", pset);
0119   }
0120   {
0121     edm::ParameterSetDescription psd;
0122     psd.add<std::string>("name", "");
0123     psd.add<edm::InputTag>("src", {});
0124     {
0125       edm::ParameterSetDescription psd2;
0126       psd2.add<std::string>("name", "");
0127       psd2.add<std::vector<int>>("maxSeverities", {});
0128       psd2.add<std::vector<double>>("cleaningThresholds", {});
0129       psd2.add<std::vector<std::string>>("flags", {});
0130       psd2.add<bool>("usePFThresholdsFromDB", false);
0131       {
0132         edm::ParameterSetDescription psd3;
0133         psd3.add<std::vector<int>>("depth", {});
0134         psd3.add<std::vector<double>>("threshold", {});
0135         psd3.add<int>("detectorEnum", 0);
0136         psd2.addVPSet("cuts", psd3, {});
0137       }
0138       psd2.add<double>("thresholdSNR", 0);
0139       psd2.add<bool>("applySelectionsToAllCrystals", false);
0140       psd2.add<double>("cleaningThreshold", 0);
0141       psd2.add<bool>("timingCleaning", false);
0142       psd2.add<bool>("topologicalCleaning", false);
0143       psd2.add<bool>("skipTTRecoveredHits", false);
0144       psd2.add<double>("threshold", 0);
0145       psd2.add<double>("threshold_ring0", 0);
0146       psd2.add<double>("threshold_ring12", 0);
0147       psd.addVPSet("qualityTests", psd2, {});
0148     }
0149     psd.add<double>("EMDepthCorrection", 0);
0150     psd.add<double>("HADDepthCorrection", 0);
0151     psd.add<double>("thresh_HF", 0);
0152     psd.add<double>("ShortFibre_Cut", 0);
0153     psd.add<double>("LongFibre_Fraction", 0);
0154     psd.add<double>("LongFibre_Cut", 0);
0155     psd.add<double>("ShortFibre_Fraction", 0);
0156     psd.add<double>("HFCalib29", 0);
0157     psd.add<edm::InputTag>("srFlags", {});
0158     psd.add<std::string>("geometryInstance", "");
0159     desc.addVPSet("producers", psd, {});
0160   }
0161   descriptions.addWithDefaultLabel(desc);
0162 }