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
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 }
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
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
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
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 }