diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx index 4c66982eb6fa0da7c92d35287e1ae4ab185a3c57..8d12be750c08fb9f4eb81ef9c34006be91bb8923 100644 --- a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx +++ b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx @@ -382,18 +382,42 @@ void HltROBDataProviderSvc::getROBData(const EventContext& context, monitorData.requested_ROBs[robFrag->source_id()] = robmap_getRobData(*robFrag, robmonitor::HLT_CACHED); } + // Add the ROBs to the cache/rob map and collect ignored robs + std::set<uint32_t> robIds_ignored; + eventCache_addRobData(cache, robFragments_missing, robIds_ignored); + // Monitor DCM ROBs for (const hltinterface::DCM_ROBInfo& robInfo : vRobInfos) { - monitorData.requested_ROBs[robInfo.robFragment.source_id()] = robmap_getRobData(robInfo.robFragment, - robInfo.robIsCached ? robmonitor::DCM_CACHED : robmonitor::RETRIEVED); + robmonitor::ROBHistory status; + + // Check ROB history + if (robIds_ignored.find(robInfo.robFragment.source_id()) != robIds_ignored.end()) { + status = robmonitor::IGNORED; + } + else { + status = robInfo.robIsCached ? robmonitor::DCM_CACHED : robmonitor::RETRIEVED; + } + + monitorData.requested_ROBs[robInfo.robFragment.source_id()] = robmap_getRobData(robInfo.robFragment, status); } - } - // add the ROBs to the cache/rob map - eventCache_addRobData(cache, robFragments_missing) ; + // Return all the requested ROB fragments from the cache and collect disabled ROBs + std::set<uint32_t> robIds_disabled; + eventCache_checkRobListToCache(cache, robIds, robFragments, robIds_missing, robIds_disabled); - // return all the requested ROB fragments from the cache - eventCache_checkRobListToCache(cache, robIds, robFragments, robIds_missing) ; + // Fill disabled ROBs + for (uint32_t robId : robIds_disabled) { + monitorData.requested_ROBs[robId] = robmonitor::ROBDataStruct(robId); + monitorData.requested_ROBs[robId].rob_history = robmonitor::DISABLED; + } + } + else { + // add the ROBs to the cache/rob map + eventCache_addRobData(cache, robFragments_missing) ; + + // return all the requested ROB fragments from the cache + eventCache_checkRobListToCache(cache, robIds, robFragments, robIds_missing) ; + } // Save ROS processing time and pass ROS data to CostMonitor if (m_doCostMonitoring && m_trigCostSvcHandle->isMonitoredEvent(context, /*includeMultiSlot =*/ false)) { @@ -414,8 +438,8 @@ robmonitor::ROBDataStruct HltROBDataProviderSvc::robmap_getRobData(const ROBF& r { auto robData = robmonitor::ROBDataStruct(robFrag.source_id()); robData.rob_size = robFrag.fragment_size_word(); - robData.rob_history = robStatus; robData.rob_status_word = robFrag.nstatus() ? robFrag.status()[0] : 0; + robData.rob_history = robStatus; return robData; } @@ -579,7 +603,8 @@ void HltROBDataProviderSvc::eventCache_clear(EventCache* cache) void HltROBDataProviderSvc::eventCache_checkRobListToCache(EventCache* cache, const std::vector<uint32_t>& robIds_toCheck, std::vector<const ROBF*>& robFragments_inCache, - std::vector<uint32_t>& robIds_missing ) + std::vector<uint32_t>& robIds_missing, + std::optional<std::reference_wrapper<std::set<uint32_t>>> robIds_disabled ) { ATH_MSG_VERBOSE("start of " << __FUNCTION__ << " number of ROB Ids to check = " << robIds_toCheck.size()); @@ -613,12 +638,15 @@ void HltROBDataProviderSvc::eventCache_checkRobListToCache(EventCache* cache, co // check if ROB is actually enabled for readout if (m_enabledROBs.value().size() != 0) { - std::vector<uint32_t>::const_iterator rob_enabled_it = - std::find(m_enabledROBs.value().begin(), m_enabledROBs.value().end(),id); + std::vector<uint32_t>::const_iterator rob_enabled_it = + std::find(m_enabledROBs.value().begin(), m_enabledROBs.value().end(),id); if(rob_enabled_it == m_enabledROBs.value().end()) { - ATH_MSG_VERBOSE(__FUNCTION__ << " ROB Id : 0x" << MSG::hex << id << MSG::dec - << " will be not added, since it is not on the list of enabled ROBs."); - continue; + ATH_MSG_VERBOSE(__FUNCTION__ << " ROB Id : 0x" << MSG::hex << id << MSG::dec + << " will be not added, since it is not on the list of enabled ROBs."); + if (robIds_disabled) { + robIds_disabled->get().insert(id); + } + continue; } } @@ -628,7 +656,8 @@ void HltROBDataProviderSvc::eventCache_checkRobListToCache(EventCache* cache, co } // end loop over input ROB Ids to check } -void HltROBDataProviderSvc::eventCache_addRobData(EventCache* cache, const std::vector<ROBF>& robFragments) +void HltROBDataProviderSvc::eventCache_addRobData(EventCache* cache, const std::vector<ROBF>& robFragments, + std::optional<std::reference_wrapper<std::set<uint32_t>>> robIds_ignored) { ATH_MSG_VERBOSE("start of " << __FUNCTION__ << " number of ROB fragments to add = " << robFragments.size()); @@ -679,6 +708,9 @@ void HltROBDataProviderSvc::eventCache_addRobData(EventCache* cache, const std:: << " and Specific Status Code = 0x" << std::setw(4) << tmpstatus.specific() << MSG::dec << " removed for (global Id, L1 Id) = (" << cache->globalEventNumber << "," << cache->currentLvl1ID <<")" ); } + if (robIds_ignored) { + robIds_ignored->get().insert(id); + } continue; } diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.h b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.h index 72ae025fffbcb89bf9f6894cb92f2f967a2fabef..bdf1a69f3fe686f9b527a0dc319299dc1f7f917f 100644 --- a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.h +++ b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.h @@ -203,14 +203,19 @@ private: /// output: /// vector of ROB fragments available already in cache /// vector of ROB Ids missing in cache + /// set of disabled ROBs void eventCache_checkRobListToCache(EventCache*, const std::vector<uint32_t>&, - std::vector<const ROBF*>&, std::vector<uint32_t>& ); + std::vector<const ROBF*>&, std::vector<uint32_t>&, + std::optional<std::reference_wrapper<std::set<uint32_t>>> robIds_disabled = std::nullopt); /// method to add ROB fragments to an event cache in a slot /// input: /// pointer to cache /// vector of ROB fragments to add to the cache - void eventCache_addRobData(EventCache*, const std::vector<ROBF>&) ; + /// output: + /// set of ignored ROBs + void eventCache_addRobData(EventCache*, const std::vector<ROBF>&, + std::optional<std::reference_wrapper<std::set<uint32_t>>> robIds_ignored = std::nullopt) ; /// Monitoring tool ToolHandle<GenericMonitoringTool> m_monTool{this, "MonTool", "", "Monitoring tool"};