** Warning **

Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle dbname=lxr at /lxr/lib/LXR/Common.pm line 1113.

Last-Modified: Tue, 5 Jun 2023 01:26:39 GMT Content-Type: text/html; charset=utf-8 /CMSSW_13_2_X_2023-06-04-2300/RecoParticleFlow/PFClusterProducer/plugins/PFRecHitProducer.cc
Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 11:21:04

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   //The following says we do not know what parameters are allowed so do no validation
0104   // Please change this to state exactly what you do use, even if it is no parameters
0105   edm::ParameterSetDescription desc;
0106   desc.setUnknown();
0107   descriptions.addDefault(desc);
0108 }