From 361c26ab9361e6f4b9d98f8cac590eda9f827cd7 Mon Sep 17 00:00:00 2001 From: Marcel Andre Schneider Date: Fri, 1 Nov 2019 14:03:03 +0100 Subject: [PATCH] Import DQMEDHarvester from new DQMStore branch. Compared to the old code, this properly uses tokens, and exposes a few more callbacks to allow porting more legacy modules. --- DQMServices/Core/interface/DQMEDHarvester.h | 147 +++++++++++++++++--- DQMServices/Core/src/DQMEDHarvester.cc | 33 ----- 2 files changed, 125 insertions(+), 55 deletions(-) delete mode 100644 DQMServices/Core/src/DQMEDHarvester.cc diff --git a/DQMServices/Core/interface/DQMEDHarvester.h b/DQMServices/Core/interface/DQMEDHarvester.h index 65c02713a3535..c14e36514a3f2 100644 --- a/DQMServices/Core/interface/DQMEDHarvester.h +++ b/DQMServices/Core/interface/DQMEDHarvester.h @@ -2,47 +2,150 @@ #define CORE_DQMED_HARVESTER_H #include "DQMServices/Core/interface/DQMStore.h" + +#include "FWCore/Framework/interface/one/EDProducer.h" + +#include "FWCore/Framework/interface/Run.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/Framework/interface/LuminosityBlock.h" -#include "FWCore/Framework/interface/Run.h" -#include "FWCore/Framework/interface/one/EDProducer.h" - +#include "FWCore/Framework/interface/InputTagMatch.h" +#include "FWCore/Framework/interface/GetterOfProducts.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/EDPutToken.h" + #include "DataFormats/Histograms/interface/DQMToken.h" -class DQMEDHarvester : public edm::one::EDProducer { +namespace edm { + class VInputTagMatch { + public: + VInputTagMatch(std::vector const &inputTags) { + for (auto &tag : inputTags) { + matchers_.emplace_back(InputTagMatch(tag)); + } + } + + bool operator()(edm::BranchDescription const &branchDescription) { + for (auto &m : matchers_) { + if (m(branchDescription)) { + return true; + } + } + return false; + } + + private: + std::vector matchers_; + }; +} // namespace edm + +class DQMEDHarvester + : public edm::one::EDProducer { public: typedef dqm::harvesting::DQMStore DQMStore; typedef dqm::harvesting::MonitorElement MonitorElement; - DQMEDHarvester(); - ~DQMEDHarvester() override = default; - void accumulate(edm::Event const &ev, edm::EventSetup const &es) final{}; +protected: + DQMStore *dqmstore_; + edm::GetterOfProducts runmegetter_; + edm::GetterOfProducts lumimegetter_; + edm::EDPutTokenT lumiToken_; + edm::EDPutTokenT runToken_; + +public: + DQMEDHarvester(edm::ParameterSet const &iConfig) { + usesResource("DQMStore"); + dqmstore_ = edm::Service().operator->(); + // TODO: Run/Lumi suffix should not be needed, complain to CMSSW core in case. + lumiToken_ = produces("DQMGenerationHarvestingLumi"); + runToken_ = produces("DQMGenerationHarvestingRun"); + + // Use explicitly specified inputs, but if there are none... + auto inputtags = + iConfig.getUntrackedParameter>("inputMEs", std::vector()); + if (inputtags.empty()) { + // ... use all RECO MEs. + inputtags.push_back(edm::InputTag("", "DQMGenerationRecoRun")); + inputtags.push_back(edm::InputTag("", "DQMGenerationRecoLumi")); + } + runmegetter_ = edm::GetterOfProducts(edm::VInputTagMatch(inputtags), this, edm::InRun); + lumimegetter_ = edm::GetterOfProducts(edm::VInputTagMatch(inputtags), this, edm::InLumi); + callWhenNewProductsRegistered([this](edm::BranchDescription const &bd) { + runmegetter_(bd); + lumimegetter_(bd); + }); + }; + + DQMEDHarvester() : DQMEDHarvester(edm::ParameterSet()){}; + + void beginJob() override{}; + + void beginRun(edm::Run const &run, edm::EventSetup const &) override { + // According to edm experts, it is never save to look at run products + // in beginRun, since they might be merged as new input files how up. + } + + void beginLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &) final { + // According to edm experts, it is never save to look at run products + // in beginRun, since they might be merged as new input files how up. + } + + void accumulate(edm::Event const &ev, edm::EventSetup const &es) final { + dqmstore_->meBookerGetter( + [this, &ev, &es](DQMStore::IBooker &b, DQMStore::IGetter &g) { this->dqmAnalyze(b, g, ev, es); }); + } + + void endLuminosityBlockProduce(edm::LuminosityBlock &lumi, edm::EventSetup const &es) final { + // No need to actually get products for now + //auto refs = std::vector>(); + //lumimegetter_.fillHandles(lumi, refs); + + dqmstore_->meBookerGetter([this, &lumi, &es](DQMStore::IBooker &b, DQMStore::IGetter &g) { + this->dqmEndLuminosityBlock(b, g, lumi, es); + }); + + lumi.put(lumiToken_, std::make_unique()); + } + + void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) final{}; + + void endRunProduce(edm::Run &run, edm::EventSetup const &es) final { + dqmstore_->meBookerGetter( + [this, &run, &es](DQMStore::IBooker &b, DQMStore::IGetter &g) { this->dqmEndRun(b, g, run, es); }); + + run.put(runToken_, std::make_unique()); + } - void beginRun(edm::Run const &, edm::EventSetup const &) override{}; void endRun(edm::Run const &, edm::EventSetup const &) override{}; - void endRunProduce(edm::Run &run, edm::EventSetup const &setup) override; - void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) final{}; - void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) final; - void endLuminosityBlockProduce(edm::LuminosityBlock &, edm::EventSetup const &) final; + void endJob() final { + dqmstore_->meBookerGetter([this](DQMStore::IBooker &b, DQMStore::IGetter &g) { this->dqmEndJob(b, g); }); + }; + + ~DQMEDHarvester() override = default; - void endJob() final; + // DQM_EXPERIMENTAL + // Could be used for niche workflows like commissioning. + // Real harvesting jobs have no events and will never call this. + virtual void dqmAnalyze(DQMStore::IBooker &, DQMStore::IGetter &, edm::Event const &, edm::EventSetup const &){}; virtual void dqmEndLuminosityBlock(DQMStore::IBooker &, DQMStore::IGetter &, edm::LuminosityBlock const &, edm::EventSetup const &){}; + // DQM_EXPERIMENTAL + // HARVESTING should happen in endJob (or endLumi, for online), but there can + // be applications for end-run harvesting. Better to have a callback than + // have unprotected DQMStore access. + virtual void dqmEndRun(DQMStore::IBooker &, DQMStore::IGetter &, edm::Run const &, edm::EventSetup const &){}; virtual void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) = 0; - -protected: - edm::EDPutTokenT lumiToken_; - edm::EDPutTokenT runToken_; }; #endif // CORE_DQMED_HARVESTER_H diff --git a/DQMServices/Core/src/DQMEDHarvester.cc b/DQMServices/Core/src/DQMEDHarvester.cc deleted file mode 100644 index dacc9bfe2d529..0000000000000 --- a/DQMServices/Core/src/DQMEDHarvester.cc +++ /dev/null @@ -1,33 +0,0 @@ -#include "DQMServices/Core/interface/DQMEDHarvester.h" -#include "FWCore/ServiceRegistry/interface/Service.h" -#include "FWCore/MessageLogger/interface/MessageLogger.h" -#include "FWCore/Framework/interface/LuminosityBlock.h" -#include "DataFormats/Histograms/interface/DQMToken.h" - -#include - -DQMEDHarvester::DQMEDHarvester() { - usesResource("DQMStore"); - lumiToken_ = produces("endLumi"); - runToken_ = produces("endRun"); -} - -void DQMEDHarvester::endJob() { - DQMStore* store = edm::Service().operator->(); - store->meBookerGetter([this](DQMStore::IBooker& b, DQMStore::IGetter& g) { this->dqmEndJob(b, g); }); -} - -void DQMEDHarvester::endLuminosityBlock(edm::LuminosityBlock const& iLumi, edm::EventSetup const& iSetup) { - DQMStore* store = edm::Service().operator->(); - store->meBookerGetter([this, &iLumi, &iSetup](DQMStore::IBooker& b, DQMStore::IGetter& g) { - this->dqmEndLuminosityBlock(b, g, iLumi, iSetup); - }); -} - -void DQMEDHarvester::endLuminosityBlockProduce(edm::LuminosityBlock& iLumi, edm::EventSetup const&) { - iLumi.put(lumiToken_, std::make_unique()); -} - -void DQMEDHarvester::endRunProduce(edm::Run& run, edm::EventSetup const& setup) { - run.put(runToken_, std::make_unique()); -}