diff --git a/interface/Analyzer.h b/interface/Analyzer.h index 3b7fcfd..d3590de 100644 --- a/interface/Analyzer.h +++ b/interface/Analyzer.h @@ -20,17 +20,22 @@ #include class CategoryManager; +class AnalyzersManager; +class ExTreeMaker; namespace Framework { class Analyzer { + friend class ::ExTreeMaker; + public: + Analyzer(const std::string& name, const ROOT::TreeGroup& tree_, const edm::ParameterSet& config): m_name(name), tree(tree_) { } - virtual void analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager&, const CategoryManager&) = 0; + virtual void analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager&, const AnalyzersManager&, const CategoryManager&) = 0; virtual void doConsumes(const edm::ParameterSet&, edm::ConsumesCollector&& collector) {} virtual void registerCategories(CategoryManager& manager, const edm::ParameterSet& config) {} @@ -47,6 +52,17 @@ namespace Framework { protected: std::string m_name; ROOT::TreeGroup tree; + + private: + bool hasRun() const { + return m_run; + } + + void setRun(bool run) { + m_run = run; + } + + bool m_run; //< A flag indicating if the analyzer has already been run for this event }; } diff --git a/interface/BTagsAnalyzer.h b/interface/BTagsAnalyzer.h index 07b7d4e..865fec5 100644 --- a/interface/BTagsAnalyzer.h +++ b/interface/BTagsAnalyzer.h @@ -14,7 +14,7 @@ class BTagsAnalyzer: public Framework::Analyzer { m_discr_name(config.getUntrackedParameter("discr_name")) { } - virtual void analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager&, const CategoryManager&) override; + virtual void analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager&, const AnalyzersManager&, const CategoryManager&) override; BRANCH(indices, std::vector); diff --git a/interface/DileptonAnalyzer.h b/interface/DileptonAnalyzer.h index 1c2cde4..d7d34c4 100644 --- a/interface/DileptonAnalyzer.h +++ b/interface/DileptonAnalyzer.h @@ -22,7 +22,7 @@ class DileptonAnalyzer: public Framework::Analyzer { m_electron_tight_wp_name = config.getUntrackedParameter("electrons_tight_wp_name", "cutBasedElectronID-Spring15-50ns-V1-standalone-tight"); } - virtual void analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager&, const CategoryManager&) override; + virtual void analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager&, const AnalyzersManager&, const CategoryManager&) override; virtual void registerCategories(CategoryManager& manager, const edm::ParameterSet&) override; diff --git a/interface/Producer.h b/interface/Producer.h index ff0af61..a6a4893 100644 --- a/interface/Producer.h +++ b/interface/Producer.h @@ -17,9 +17,13 @@ #include #include +class ExTreeMaker; + namespace Framework { class Producer { + friend class ::ExTreeMaker; + public: Producer(const std::string& name, const ROOT::TreeGroup& tree_, const edm::ParameterSet& config): m_name(name), @@ -41,6 +45,17 @@ namespace Framework { protected: std::string m_name; ROOT::TreeGroup tree; + + private: + bool hasRun() const { + return m_run; + } + + void setRun(bool run) { + m_run = run; + } + + bool m_run; //< A flag indicating if the analyzer has already been run for this event }; } diff --git a/interface/TestAnalyzer.h b/interface/TestAnalyzer.h index e7b2794..c84e902 100644 --- a/interface/TestAnalyzer.h +++ b/interface/TestAnalyzer.h @@ -38,7 +38,7 @@ class TestAnalyzer: public Framework::Analyzer { } - virtual void analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager&, const CategoryManager&) override; + virtual void analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager&, const AnalyzersManager&, const CategoryManager&) override; virtual void registerCategories(CategoryManager& manager, const edm::ParameterSet& config) { manager.new_category("two_muons", "At least two muons category", config); diff --git a/plugins/TestAnalyzer.cc b/plugins/TestAnalyzer.cc index e6681a4..fa63084 100644 --- a/plugins/TestAnalyzer.cc +++ b/plugins/TestAnalyzer.cc @@ -3,11 +3,15 @@ #include #include +#include -void TestAnalyzer::analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager& producers, const CategoryManager& categories) { + +void TestAnalyzer::analyze(const edm::Event&, const edm::EventSetup&, const ProducersManager& producers, const AnalyzersManager& analyzers, const CategoryManager& categories) { const JetsProducer& jets = producers.get("jets"); + const DileptonAnalyzer& di = analyzers.get("dilepton"); + /* if (producers.exists("gen_particles")) { const GenParticlesProducer& gp = dynamic_cast(producers.get("gen_particles")); diff --git a/src/BTagsAnalyzer.cc b/src/BTagsAnalyzer.cc index 624b610..1b7a55a 100644 --- a/src/BTagsAnalyzer.cc +++ b/src/BTagsAnalyzer.cc @@ -2,7 +2,7 @@ #include -void BTagsAnalyzer::analyze(const edm::Event& event, const edm::EventSetup&, const ProducersManager& producers, const CategoryManager& categories) { +void BTagsAnalyzer::analyze(const edm::Event& event, const edm::EventSetup&, const ProducersManager& producers, const AnalyzersManager& analyzers, const CategoryManager& categories) { const JetsProducer& jets = producers.get("jets"); diff --git a/src/DileptonAnalyzer.cc b/src/DileptonAnalyzer.cc index 197b85d..c8b1192 100644 --- a/src/DileptonAnalyzer.cc +++ b/src/DileptonAnalyzer.cc @@ -41,7 +41,7 @@ void DileptonAnalyzer::registerCategories(CategoryManager& manager, const edm::P } } -void DileptonAnalyzer::analyze(const edm::Event& event, const edm::EventSetup&, const ProducersManager& producers, const CategoryManager& categories) { +void DileptonAnalyzer::analyze(const edm::Event& event, const edm::EventSetup&, const ProducersManager& producers, const AnalyzersManager& analyzers, const CategoryManager& categories) { // ***** ***** ***** // Get all dilepton objects out of the event diff --git a/src/Framework.cc b/src/Framework.cc index 43f5fb1..1e7329c 100644 --- a/src/Framework.cc +++ b/src/Framework.cc @@ -179,8 +179,10 @@ void ExTreeMaker::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { if (! should_continue) return; - for (auto& producer: m_producers) + for (auto& producer: m_producers) { producer.second->produce(iEvent, iSetup); + producer.second->setRun(true); + } should_continue = m_categories->evaluate_pre_analyzers(*m_producers_manager); if (! should_continue) { @@ -189,8 +191,10 @@ void ExTreeMaker::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { return; } - for (auto& analyzer: m_analyzers) - analyzer->analyze(iEvent, iSetup, *m_producers_manager, *m_categories); + for (auto& analyzer: m_analyzers) { + analyzer->analyze(iEvent, iSetup, *m_producers_manager, *m_analyzers_manager, *m_categories); + analyzer->setRun(true); + } if (m_categories->evaluate_post_analyzers(*m_producers_manager, *m_analyzers_manager)) m_wrapper->fill(); @@ -198,6 +202,12 @@ void ExTreeMaker::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { m_wrapper->reset(); m_categories->reset(); + + for (auto& analyzer: m_analyzers) + analyzer->setRun(false); + + for (auto& producer: m_producers) + producer.second->setRun(false); } @@ -289,7 +299,14 @@ const Framework::Producer& ExTreeMaker::getProducer(const std::string& name) con throw edm::Exception(edm::errors::NotFound, details.str()); } - return *producer->second; + Framework::Producer& p = *producer->second; + if (! p.hasRun()) { + std::stringstream details; + details << "Producer '" << name << "' has not been run yet for this event. Please check the scheduling of your producers"; + throw edm::Exception(edm::errors::NotFound, details.str()); + } + + return p; } bool ExTreeMaker::producerExists(const std::string& name) const { @@ -305,7 +322,14 @@ const Framework::Analyzer& ExTreeMaker::getAnalyzer(const std::string& name) con throw edm::Exception(edm::errors::NotFound, details.str()); } - return *m_analyzers[std::distance(m_analyzers_name.begin(), it)]; + Framework::Analyzer& analyzer = *m_analyzers[std::distance(m_analyzers_name.begin(), it)]; + if (! analyzer.hasRun()) { + std::stringstream details; + details << "Analyzer '" << name << "' has not been run yet for this event. Please check the scheduling of your analyzers"; + throw edm::Exception(edm::errors::NotFound, details.str()); + } + + return analyzer; } bool ExTreeMaker::analyzerExists(const std::string& name) const {