File indexing completed on 2025-01-31 02:19:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include "FWCore/Framework/interface/Event.h"
0020 #include "FWCore/Framework/interface/MakerMacros.h"
0021 #include "FWCore/Framework/interface/global/EDProducer.h"
0022 #include "DataFormats/Common/interface/ErrorSummaryEntry.h"
0023 #include "FWCore/MessageLogger/interface/LoggedErrorsSummary.h"
0024 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0025 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0026 #include "DataFormats/Common/interface/EndPathStatus.h"
0027 #include "DataFormats/Common/interface/PathStatus.h"
0028 #include "DataFormats/Common/interface/TriggerResults.h"
0029 #include "FWCore/Utilities/interface/EDPutToken.h"
0030
0031
0032 #include <memory>
0033 #include <unordered_set>
0034 #include <string>
0035
0036
0037
0038
0039
0040 namespace edm {
0041 class LogErrorHarvester : public global::EDProducer<> {
0042 public:
0043 explicit LogErrorHarvester(ParameterSet const&);
0044 static void fillDescriptions(ConfigurationDescriptions& descriptions);
0045
0046 private:
0047 void beginJob() override;
0048 void produce(StreamID, Event&, EventSetup const&) const override;
0049 void endJob() override;
0050 EDPutTokenT<std::vector<ErrorSummaryEntry>> token_;
0051 };
0052
0053 LogErrorHarvester::LogErrorHarvester(ParameterSet const& iPSet) : token_{produces()} {
0054 const edm::TypeID endPathStatusType{typeid(edm::EndPathStatus)};
0055 const edm::TypeID pathStatusType{typeid(edm::PathStatus)};
0056 const edm::TypeID triggerResultsType{typeid(edm::TriggerResults)};
0057
0058 auto const& ignore = iPSet.getUntrackedParameter<std::vector<std::string>>("excludeModules");
0059 const std::unordered_set<std::string> excludedModules(ignore.begin(), ignore.end());
0060
0061 auto const& includeM = iPSet.getUntrackedParameter<std::vector<std::string>>("includeModules");
0062 const std::unordered_set<std::string> includeModules(includeM.begin(), includeM.end());
0063
0064
0065 callWhenNewProductsRegistered(
0066 [this, endPathStatusType, pathStatusType, triggerResultsType, excludedModules, includeModules](
0067 edm::ProductDescription const& iBD) {
0068 if ((iBD.branchType() == edm::InEvent and moduleDescription().processName() == iBD.processName()) and
0069 ((includeModules.empty() or includeModules.end() != includeModules.find(iBD.moduleLabel())) and
0070 (iBD.unwrappedTypeID() != endPathStatusType and iBD.unwrappedTypeID() != pathStatusType and
0071 iBD.unwrappedTypeID() != triggerResultsType))) {
0072 if (excludedModules.end() == excludedModules.find(iBD.moduleLabel())) {
0073 consumes(edm::TypeToGet{iBD.unwrappedTypeID(), edm::PRODUCT_TYPE},
0074 edm::InputTag{iBD.moduleLabel(), iBD.productInstanceName(), iBD.processName()});
0075 }
0076 }
0077 });
0078 }
0079
0080 void LogErrorHarvester::produce(StreamID const sid, Event& iEvent, EventSetup const&) const {
0081 const auto index = sid.value();
0082 if (!FreshErrorsExist(index)) {
0083
0084 iEvent.emplace(token_);
0085 } else {
0086 auto mlSummary = LoggedErrorsSummary(index);
0087 std::vector<edm::ErrorSummaryEntry> summary;
0088 summary.reserve(mlSummary.size());
0089 for (auto& entry : mlSummary) {
0090 edm::ErrorSummaryEntry e;
0091 e.category = std::move(entry.category);
0092 e.module = std::move(entry.module);
0093 e.severity = edm::ELseverityLevel(entry.severity.getLevel());
0094 e.count = entry.count;
0095 summary.emplace_back(std::move(e));
0096 }
0097 iEvent.emplace(token_, summary);
0098 }
0099 }
0100
0101
0102 void LogErrorHarvester::beginJob() { EnableLoggedErrorsSummary(); }
0103
0104
0105 void LogErrorHarvester::endJob() { DisableLoggedErrorsSummary(); }
0106
0107
0108 void LogErrorHarvester::fillDescriptions(ConfigurationDescriptions& descriptions) {
0109 ParameterSetDescription desc;
0110 desc.addUntracked<std::vector<std::string>>("excludeModules", std::vector<std::string>{})
0111 ->setComment("List of module labels to exclude from consumes.");
0112 desc.addUntracked<std::vector<std::string>>("includeModules", std::vector<std::string>{})
0113 ->setComment("List of the only module labels to include in consumes. The empty list will include all.");
0114 descriptions.add("logErrorHarvester", desc);
0115 }
0116 }
0117
0118
0119 using edm::LogErrorHarvester;
0120 DEFINE_FWK_MODULE(LogErrorHarvester);