diff --git a/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.cxx b/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.cxx index 16ba506264e42264289b75bb52a195fbeacf01c2..8c529f4b1d0a22ac605cb142a83bdb943c10e4d4 100644 --- a/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.cxx +++ b/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.cxx @@ -76,6 +76,8 @@ void TrigOpMonitor::handle( const Incident& incident ) { fillMagFieldHist(); fillIOVDbHist(); fillSubDetHist(); + const AthenaInterprocess::UpdateAfterFork& updinc = dynamic_cast<const AthenaInterprocess::UpdateAfterFork&>(incident); + fillProcThreadHist(updinc.workerID()); } } @@ -128,6 +130,14 @@ StatusCode TrigOpMonitor::bookHists() m_releaseHist = new TH1I("GeneralOpInfo", "General operational info;;Applications", 1, 0, 1); + m_mtConfigHist = new TH2I("MTConfig", "Multi-threading configuration", 2, 0, 2, 10, 0, 10); + m_mtConfigHist->SetCanExtend(TH1::kYaxis); + m_mtConfigHist->GetXaxis()->SetBinLabel(1, "N threads"); + m_mtConfigHist->GetXaxis()->SetBinLabel(2, "N slots"); + + m_workersHist = new TH1I("MPWorkers", "Worker IDs;Worker ID;Number of workers", 10, 0, 10); + m_workersHist->SetCanExtend(TH1::kXaxis); + m_subdetHist = new TH2I("Subdetectors", "State of subdetectors", 1, 0, 1, 3, 0, 3); m_subdetHist->SetCanExtend(TH1::kXaxis); m_subdetHist->GetYaxis()->SetBinLabel(1, "# ROB"); @@ -140,7 +150,10 @@ StatusCode TrigOpMonitor::bookHists() m_muHist = new TProfile("Pileup", "Pileup;Lumiblock;Interactions per BX", m_maxLB, 0, m_maxLB); // Register histograms - TH1* hist[] = {m_releaseHist, m_subdetHist, m_iovChangeHist, m_magFieldHist, m_lumiHist, m_muHist}; + TH1* hist[] = { + m_releaseHist, m_mtConfigHist, m_workersHist, m_subdetHist, + m_iovChangeHist, m_magFieldHist, m_lumiHist, m_muHist + }; for (TH1* h : hist) { if (h) ATH_CHECK(m_histSvc->regHist(m_histPath + h->GetName(), h)); } @@ -347,6 +360,38 @@ void TrigOpMonitor::fillReleaseDataHist() } } +void TrigOpMonitor::fillProcThreadHist(const int workerID) +{ + m_workersHist->Fill(workerID, 1); + + auto getIntProp = [this](std::string_view name, const std::string& prop) -> std::optional<int> { + IProperty* svc = serviceLocator()->service(name).as<IProperty>(); + if (svc == nullptr) return std::nullopt; + try { + return std::stoi(svc->getProperty(prop).toString()); + } + catch (...) { + return std::nullopt; + } + }; + + const std::optional<int> numThreads = getIntProp("AvalancheSchedulerSvc","ThreadPoolSize"); + if (numThreads.has_value()) { + m_mtConfigHist->Fill("N threads", numThreads.value(), 1.0); + } + else { + ATH_MSG_WARNING("Could not retrieve the number of threads to fill the monitoring histogram"); + } + + const std::optional<int> numSlots = getIntProp("EventDataSvc","NSlots"); + if (numSlots.has_value()) { + m_mtConfigHist->Fill("N slots", numSlots.value(), 1.0); + } + else { + ATH_MSG_WARNING("Could not retrieve the number of slots to fill the monitoring histogram"); + } +} + void TrigOpMonitor::fillSubDetHist() { // Retrieve the enabled ROBs/SubDets list from DataFlowConfig which is a special object diff --git a/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.h b/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.h index de316dcc928a99255373e145ed266cac6087f349..5f4442dd04219a2f038aa42df434c9d3350a6077 100644 --- a/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.h +++ b/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.h @@ -51,6 +51,7 @@ public: private: void fillMagFieldHist(); void fillReleaseDataHist(); + void fillProcThreadHist(int workerID); void fillSubDetHist(); void fillIOVDbHist(); void fillIOVDbChangeHist(const EventContext& ctx); @@ -75,6 +76,8 @@ private: TH2I* m_magFieldHist{nullptr}; TH2I* m_iovChangeHist{nullptr}; TH1I* m_releaseHist{nullptr}; + TH2I* m_mtConfigHist{nullptr}; + TH1I* m_workersHist{nullptr}; TH2I* m_subdetHist{nullptr}; TProfile* m_lumiHist{nullptr}; TProfile* m_muHist{nullptr};