From e12628b2521a418359f27c81ecc68988ffdc586f Mon Sep 17 00:00:00 2001 From: Rafal Bielski Date: Thu, 17 Oct 2019 18:54:40 +0200 Subject: [PATCH 1/2] Add more online monitoring histograms in TrigByteStreamCnvSvc and TrigByteStreamInputSvc --- .../python/TrigByteStreamCnvSvcConfig.py | 3 + .../src/TrigByteStreamCnvSvc.cxx | 59 +++++++++++++++++-- .../src/TrigByteStreamCnvSvc.h | 6 ++ .../src/TrigByteStreamInputSvc.cxx | 12 +++- 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/HLT/Event/TrigByteStreamCnvSvc/python/TrigByteStreamCnvSvcConfig.py b/HLT/Event/TrigByteStreamCnvSvc/python/TrigByteStreamCnvSvcConfig.py index c376ea9f826..86856b418e2 100644 --- a/HLT/Event/TrigByteStreamCnvSvc/python/TrigByteStreamCnvSvcConfig.py +++ b/HLT/Event/TrigByteStreamCnvSvc/python/TrigByteStreamCnvSvcConfig.py @@ -18,3 +18,6 @@ class TrigByteStreamInputSvc(_TrigByteStreamInputSvc): self.MonTool.defineHistogram('L1Result_FullEvFragSize', path='EXPERT', type='TH1F', title='Size of L1 result FullEventFragment;Size [kB];N events', xbins=100, xmin=0, xmax=100) + self.MonTool.defineHistogram('L1Result_SubDets', path='EXPERT', type='TH1F', + title='Source of ROBs in L1 result passed to HLT;;Total number of ROBs', + xbins=1, xmin=0, xmax=1) diff --git a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamCnvSvc.cxx b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamCnvSvc.cxx index bc9d0d2eb42..36491d98206 100644 --- a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamCnvSvc.cxx +++ b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamCnvSvc.cxx @@ -259,10 +259,18 @@ void TrigByteStreamCnvSvc::monitorRawEvent(const std::unique_ptr& ra return; } - // Associate result sizes to streams + // Associate result sizes to streams and fill histograms + m_histStreamTagsNum->Fill(streamTags.size()); std::unordered_map resultSizesByStream; for (const eformat::helper::StreamTag& st : streamTags) { std::string typeName = st.type + "_" + st.name; + m_histStreamTags->Fill(typeName.data(), 1.0); + m_histStreamTagsType->Fill(st.type.data(), 1.0); + if (st.robs.size() > 0 || st.dets.size() >0) { // PEB stream tag + m_histPebRobsNum->Fill(st.robs.size()); + m_histPebSubDetsNum->Fill(st.dets.size()); + } + bool hasHLTSubDet = st.dets.find(eformat::SubDetector::TDAQ_HLT) != st.dets.end(); bool includeAll = st.robs.empty() && (st.dets.empty() || hasHLTSubDet); if (includeAll) { @@ -270,8 +278,14 @@ void TrigByteStreamCnvSvc::monitorRawEvent(const std::unique_ptr& ra continue; } uint32_t size = 0; + std::set sdFromRobList; + std::set sdFromSubDetList; + for (const eformat::SubDetector sd : st.dets) { + sdFromSubDetList.insert(eformat::helper::SubDetectorDictionary.string(sd)); + } for (uint32_t robid : st.robs) { eformat::helper::SourceIdentifier sid(robid); + sdFromRobList.insert(sid.human_detector()); if (sid.subdetector_id() != eformat::SubDetector::TDAQ_HLT) continue; if (resultSizes.find(sid.module_id()) == resultSizes.end()) { @@ -282,11 +296,16 @@ void TrigByteStreamCnvSvc::monitorRawEvent(const std::unique_ptr& ra size += resultSizes[sid.module_id()]; } resultSizesByStream[typeName] = size; + for (const std::string& sdName : sdFromRobList) { + m_histPebSubDetsFromRobList->Fill(sdName.data(), 1.0); + } + for (const std::string& sdName : sdFromSubDetList) { + m_histPebSubDetsFromSubDetList->Fill(sdName.data(), 1.0); + } } - // Fill stream tag and result size histograms + // Fill result size and stream tag correlation histograms for (const auto& [typeName, size] : resultSizesByStream) { - m_histStreamTags->Fill(typeName.data(), 1.0); m_histResultSizeByStream->Fill(typeName.data(), size*wordsToKiloBytes, 1.0); for (const auto& [typeName2, size2] : resultSizesByStream) { m_histStreamTagsCorr->Fill(typeName.data(), typeName2.data(), 1.0); @@ -390,6 +409,39 @@ void TrigByteStreamCnvSvc::bookHistograms() { m_histStreamTagsCorr->SetCanExtend(TH1::kAllAxes); regHist(m_histStreamTagsCorr); + m_histStreamTagsNum = new TH1F( + "StreamTagsNum", "Number of Stream Tags produced by HLT;Number of Stream Tags;Events", 20, 0, 20); + regHist(m_histStreamTagsNum); + + m_histStreamTagsType = new TH1F( + "StreamTagsType", "Type of Stream Tags produced by HLT;;Events", 7, 0, 7); + m_histStreamTagsType->GetXaxis()->SetBinLabel(1, "physics"); + m_histStreamTagsType->GetXaxis()->SetBinLabel(2, "calibration"); + m_histStreamTagsType->GetXaxis()->SetBinLabel(3, "express"); + m_histStreamTagsType->GetXaxis()->SetBinLabel(4, "monitoring"); + m_histStreamTagsType->GetXaxis()->SetBinLabel(5, "debug"); + m_histStreamTagsType->GetXaxis()->SetBinLabel(6, "reserved"); + m_histStreamTagsType->GetXaxis()->SetBinLabel(7, "unknown"); + regHist(m_histStreamTagsType); + + m_histPebRobsNum = new TH1F( + "StreamTagsPebRobsNum", "Number of ROBs in PEB stream tags;Number of ROBs;Entries", 200, 0, 200); + regHist(m_histPebRobsNum); + + m_histPebSubDetsNum = new TH1F( + "StreamTagsPebSubDetsNum", "Number of SubDetectors in PEB stream tags;Number of SubDetectors;Entries", 100, 0, 100); + regHist(m_histPebSubDetsNum); + + m_histPebSubDetsFromRobList = new TH1F( + "StreamTagsPebSubDetsFromRobList", "SubDetectors in PEB stream tags ROB list;;Entries", 1, 0, 1); + m_histPebSubDetsFromRobList->SetCanExtend(TH1::kXaxis); + regHist(m_histPebSubDetsFromRobList); + + m_histPebSubDetsFromSubDetList = new TH1F( + "StreamTagsPebSubDetsFromSubDetList", "SubDetectors in PEB stream tags SubDetector list;;Entries", 1, 0, 1); + m_histPebSubDetsFromSubDetList->SetCanExtend(TH1::kXaxis); + regHist(m_histPebSubDetsFromSubDetList); + m_histResultSizeByModule = new TH2F( "ResultSizeByModule", "HLT result size by module;Module ID;Size [kB]", 1, 0, 1, 100, 0, 1000); m_histResultSizeByModule->SetCanExtend(TH1::kXaxis); @@ -402,7 +454,6 @@ void TrigByteStreamCnvSvc::bookHistograms() { m_histResultSizeTotal = new TH1F( "ResultSizeTotal", "HLT result total size (sum of all modules);Size [kB];Events", 100, 0, 1000); - m_histResultSizeTotal->SetCanExtend(TH1::kXaxis); regHist(m_histResultSizeTotal); m_histResultSizeFullEvFrag = new TH1F( diff --git a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamCnvSvc.h b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamCnvSvc.h index 5b195c67c5f..419c0df8b72 100644 --- a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamCnvSvc.h +++ b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamCnvSvc.h @@ -63,6 +63,12 @@ private: TH1I* m_histPscErrorCode{nullptr}; //< Histogram of PSC error codes TH1F* m_histStreamTags{nullptr}; //< Histogram of stream tags TH2F* m_histStreamTagsCorr{nullptr}; //< Histogram of stream tags correlation + TH1F* m_histStreamTagsNum{nullptr}; //< Histogram of number of stream tags + TH1F* m_histStreamTagsType{nullptr}; //< Histogram of stream tags type + TH1F* m_histPebRobsNum{nullptr}; //< Histogram of the number of ROBs in PEB stream tag + TH1F* m_histPebSubDetsNum{nullptr}; //< Histogram of the number of SubDetectors in PEB stream tag + TH1F* m_histPebSubDetsFromRobList{nullptr}; //< Histogram of SubDetectors from ROB list in PEB stream tag + TH1F* m_histPebSubDetsFromSubDetList{nullptr}; //< Histogram of SubDetectors from SubDetector list in PEB stream tag TH2F* m_histResultSizeByModule{nullptr}; //< Histogram of HLT result size per module ID TH2F* m_histResultSizeByStream{nullptr}; //< Histogram of HLT result size per stream TH1F* m_histResultSizeTotal{nullptr}; //< Histogram of total HLT result size (all modules) diff --git a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.cxx b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.cxx index fa87c8cb3a1..606b5f87f89 100644 --- a/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.cxx +++ b/HLT/Event/TrigByteStreamCnvSvc/src/TrigByteStreamInputSvc.cxx @@ -12,7 +12,6 @@ // TDAQ includes #include "hltinterface/DataCollector.h" -#include "eformat/write/FullEventFragment.h" namespace { constexpr float wordsToKiloBytes = 0.001*sizeof(uint32_t); @@ -129,11 +128,20 @@ const RawEvent* TrigByteStreamInputSvc::nextEvent() { // Create a cached FullEventFragment object from the cached raw data cache->fullEventFragment.reset(new RawEvent(cache->rawData.get())); + // Monitor the input auto numROBs = Monitored::Scalar("L1Result_NumROBs", cache->fullEventFragment->nchildren()); auto fragSize = Monitored::Scalar("L1Result_FullEvFragSize", cache->fullEventFragment->fragment_size_word()*wordsToKiloBytes); - auto mon = Monitored::Group(m_monTool, numROBs, fragSize); + std::vector robVec; + cache->fullEventFragment->robs(robVec); + std::vector subdetNameVec; + for (const eformat::read::ROBFragment& rob : robVec) { + eformat::helper::SourceIdentifier sid(rob.rob_source_id()); + subdetNameVec.push_back(sid.human_detector()); + } + auto subdets = Monitored::Collection>("L1Result_SubDets", subdetNameVec); + auto mon = Monitored::Group(m_monTool, numROBs, fragSize, subdets); // Give the FullEventFragment pointer to ROBDataProviderSvc and also return it m_robDataProviderSvc->setNextEvent(*eventContext, cache->fullEventFragment.get()); -- GitLab From ce28142473ed0e2b823b4a89dade929bd9c1e042 Mon Sep 17 00:00:00 2001 From: Rafal Bielski Date: Fri, 18 Oct 2019 14:20:08 +0200 Subject: [PATCH 2/2] TrigOpMonitor: add Subdetectors histogram --- .../TrigOnlineMonitor/src/TrigOpMonitor.cxx | 84 ++++++++++++++++++- .../TrigOnlineMonitor/src/TrigOpMonitor.h | 2 + 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.cxx b/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.cxx index 9533012388a..b2b2b5311b8 100644 --- a/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.cxx +++ b/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.cxx @@ -6,7 +6,12 @@ #include "AthenaKernel/IOVRange.h" #include "AthenaMonitoringKernel/OHLockedHist.h" +#include "ByteStreamData/ByteStreamMetadata.h" +#include "ByteStreamData/ByteStreamMetadataContainer.h" #include "StoreGate/ReadCondHandle.h" +#include "GaudiKernel/IJobOptionsSvc.h" +#include "eformat/DetectorMask.h" +#include "eformat/SourceIdentifier.h" #include #include @@ -75,6 +80,8 @@ StatusCode TrigOpMonitor::execute() after all other services have been setup. */ fillMagFieldHist(); fillIOVDbHist(); + // This one needs to run after prepareForRun, which is currently called after Alg's start() + fillSubDetHist(); } /* Per-LB fills */ @@ -118,13 +125,19 @@ StatusCode TrigOpMonitor::bookHists() m_releaseHist = new TH1I("GeneralOpInfo", "General operational info;;Applications", 1, 0, 1); + 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"); + m_subdetHist->GetYaxis()->SetBinLabel(2, "off"); + m_subdetHist->GetYaxis()->SetBinLabel(3, "on"); + m_lumiHist = new TProfile("Luminosity", "Luminosity;Lumiblock;Luminosity [10^{33} cm^{-2}s^{-1}]", m_maxLB, 0, m_maxLB); m_muHist = new TProfile("Pileup", "Pileup;Lumiblock;Interactions per BX", m_maxLB, 0, m_maxLB); // Register histograms - TH1* hist[] = {m_releaseHist, m_iovChangeHist, m_magFieldHist, m_lumiHist, m_muHist}; + TH1* hist[] = {m_releaseHist, 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)); } @@ -351,3 +364,72 @@ void TrigOpMonitor::fillReleaseDataHist() m_releaseHist->Fill((result["project name"] + " " + result["release"]).c_str(), 1); } } + +void TrigOpMonitor::fillSubDetHist() +{ + // Retrieve the enabled ROBs/SubDets list from DataFlowConfig which is a special object + // used online to hold DF properties passed from TDAQ to HLT as run parameters + SmartIF jobOptionsSvc = service("JobOptionsSvc", /*createIf=*/ false); + if (!jobOptionsSvc.isValid()) { + ATH_MSG_WARNING("Could not retrieve JobOptionsSvc, will not fill SubDetectors histogram"); + return; + } + const Gaudi::Details::PropertyBase* prop = jobOptionsSvc->getClientProperty("DataFlowConfig", "DF_Enabled_ROB_IDs"); + Gaudi::Property> enabledROBsProp("EnabledROBs",{}); + std::set enabledROBs; + if (prop && enabledROBsProp.assign(*prop)) { + enabledROBs.insert(enabledROBsProp.value().begin(), enabledROBsProp.value().end()); + ATH_MSG_DEBUG("Retrieved a list of " << enabledROBs.size() + << " ROBs from DataFlowConfig.DF_Enabled_ROB_IDs"); + } + else { + ATH_MSG_DEBUG("Could not retrieve DataFlowConfig.DF_Enabled_ROB_IDs from JobOptionsSvc. This is fine if running " + << "offline, but should not happen online"); + } + + // Retrieve detector mask from detector store + SmartIF inputMetaDataStore = service("InputMetaDataStore", /*createIf=*/ false); + if (!inputMetaDataStore.isValid()) { + ATH_MSG_WARNING("Could not retrieve InputMetaDataStore, will not fill SubDetectors histogram"); + return; + } + const ByteStreamMetadataContainer* metadatacont{nullptr}; + if (inputMetaDataStore->retrieve(metadatacont, "ByteStreamMetadata").isFailure()) { + ATH_MSG_WARNING("Could not retrieve ByteStreamMetadata, will not fill SubDetectors histogram"); + return; + } + + const ByteStreamMetadata* metadata = *(metadatacont->begin()); + uint64_t detMaskLeast = metadata->getDetectorMask(); + uint64_t detMaskMost = metadata->getDetectorMask2(); + + // Decode subdetector masks + std::vector subDetOn; + std::vector subDetOff; + std::vector subDetAll; + eformat::helper::DetectorMask(detMaskLeast, detMaskMost).sub_detectors(subDetOn); + eformat::helper::DetectorMask(~detMaskLeast, ~detMaskMost).sub_detectors(subDetOff); + eformat::helper::DetectorMask(~std::bitset<128>()).sub_detectors(subDetAll); + + // Add bins with labels for every subdetector name + for (const eformat::SubDetector sd : subDetAll) { + m_subdetHist->GetXaxis()->FindBin(eformat::helper::SubDetectorDictionary.string(sd).data()); + } + m_subdetHist->LabelsDeflate("X"); + + // Fill histogram with enabled subdetectors + for (const eformat::SubDetector sd : subDetOn) { + m_subdetHist->Fill(eformat::helper::SubDetectorDictionary.string(sd).data(), "on", 1.0); + } + + // Fill histogram with disabled subdetectors + for (const eformat::SubDetector sd : subDetOff) { + m_subdetHist->Fill(eformat::helper::SubDetectorDictionary.string(sd).data(), "off", 1.0); + } + + // Fill histogram with ROB counts + for (const uint32_t robid : enabledROBs) { + const std::string sdname = eformat::helper::SourceIdentifier(robid).human_detector(); + m_subdetHist->Fill(sdname.data(), "# ROB", 1.0); + } +} \ No newline at end of file diff --git a/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.h b/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.h index 05cc482ec64..5844264af72 100644 --- a/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.h +++ b/HLT/Trigger/TrigMonitoring/TrigOnlineMonitor/src/TrigOpMonitor.h @@ -47,6 +47,7 @@ public: private: void fillMagFieldHist(); void fillReleaseDataHist(); + void fillSubDetHist(); void fillIOVDbHist(); void fillIOVDbChangeHist(const EventContext& ctx); void fillLumiHist(const EventContext& ctx); @@ -69,6 +70,7 @@ private: TH2I* m_magFieldHist{nullptr}; TH2I* m_iovChangeHist{nullptr}; TH1I* m_releaseHist{nullptr}; + TH2I* m_subdetHist{nullptr}; TProfile* m_lumiHist{nullptr}; TProfile* m_muHist{nullptr}; -- GitLab