From c038bc87d2c539a233f705a662fc8d00d50f9978 Mon Sep 17 00:00:00 2001
From: Aleksandra Poreba <aleksandra.poreba@cern.ch>
Date: Mon, 30 Nov 2020 12:04:14 +0100
Subject: [PATCH 1/5] Handle DISABLED flag

---
 .../TrigServices/src/HltROBDataProviderSvc.cxx    | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
index 4c66982eb6fa..9b200bcb6127 100644
--- a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
+++ b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
@@ -414,9 +414,22 @@ 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;
 
+  // Check if ROB is enabled
+  if (m_enabledROBs.value().size() != 0 && std::find(m_enabledROBs.begin(), m_enabledROBs.end(), robData.rob_id) == m_enabledROBs.end()){
+    robData.rob_history = robmonitor::DISABLED;
+  }
+  else {
+    robData.rob_history = robStatus;
+
+    // All enabled ROBs for ROS are prefetched if the flag is on - see setNextEvent
+    //if (m_prefetchAllROBsfromROS.value()) {
+    //  robData.rob_history |= robmonitor::SCHEDULED;
+    //}
+  }
+
   return robData;
 }
 
-- 
GitLab


From d516bc7d847f37cdb2e583a5237c56145a6e8a34 Mon Sep 17 00:00:00 2001
From: Aleksandra Poreba <aleksandra.poreba@cern.ch>
Date: Tue, 1 Dec 2020 17:51:40 +0100
Subject: [PATCH 2/5] Add DISABLED and IGNORED flag handling

---
 .../src/HltROBDataProviderSvc.cxx             | 24 +++++++++++--------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
index 9b200bcb6127..41db750dd971 100644
--- a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
+++ b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
@@ -387,6 +387,17 @@ void HltROBDataProviderSvc::getROBData(const EventContext& context,
       monitorData.requested_ROBs[robInfo.robFragment.source_id()] = robmap_getRobData(robInfo.robFragment, 
         robInfo.robIsCached ? robmonitor::DCM_CACHED : robmonitor::RETRIEVED);
     }
+
+    // Find not enabled ROBs
+    std::vector<uint32_t> disabledROBs;
+    std::set_difference(robIds.begin(), robIds.end(), 
+        m_enabledROBs.begin(), m_enabledROBs.end(),
+        std::inserter(disabledROBs, disabledROBs.begin()));
+
+    for (uint32_t robId : disabledROBs) {
+      monitorData.requested_ROBs[robId] = robmonitor::ROBDataStruct(robId);
+      monitorData.requested_ROBs[robId].rob_history = robmonitor::DISABLED;
+    }
   }
 
   // add the ROBs to the cache/rob map
@@ -414,20 +425,13 @@ robmonitor::ROBDataStruct HltROBDataProviderSvc::robmap_getRobData(const ROBF& r
 {
   auto robData = robmonitor::ROBDataStruct(robFrag.source_id());
   robData.rob_size = robFrag.fragment_size_word();
-  
   robData.rob_status_word = robFrag.nstatus() ? robFrag.status()[0] : 0;
 
-  // Check if ROB is enabled
-  if (m_enabledROBs.value().size() != 0 && std::find(m_enabledROBs.begin(), m_enabledROBs.end(), robData.rob_id) == m_enabledROBs.end()){
-    robData.rob_history = robmonitor::DISABLED;
-  }
+  if (robmap_filterRobWithStatus(&robFrag)){
+    robData.rob_history = robmonitor::IGNORED;
+  } 
   else {
     robData.rob_history = robStatus;
-
-    // All enabled ROBs for ROS are prefetched if the flag is on - see setNextEvent
-    //if (m_prefetchAllROBsfromROS.value()) {
-    //  robData.rob_history |= robmonitor::SCHEDULED;
-    //}
   }
 
   return robData;
-- 
GitLab


From e5d688b9a0526fbb0db50ffdb4f37b4fc2d9aa53 Mon Sep 17 00:00:00 2001
From: Aleksandra Poreba <aleksandra.poreba@cern.ch>
Date: Wed, 2 Dec 2020 09:29:27 +0100
Subject: [PATCH 3/5] Fix finding disabled ROBs

---
 .../TrigServices/src/HltROBDataProviderSvc.cxx      | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
index 41db750dd971..70ca973c344c 100644
--- a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
+++ b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
@@ -389,14 +389,11 @@ void HltROBDataProviderSvc::getROBData(const EventContext& context,
     }
 
     // Find not enabled ROBs
-    std::vector<uint32_t> disabledROBs;
-    std::set_difference(robIds.begin(), robIds.end(), 
-        m_enabledROBs.begin(), m_enabledROBs.end(),
-        std::inserter(disabledROBs, disabledROBs.begin()));
-
-    for (uint32_t robId : disabledROBs) {
-      monitorData.requested_ROBs[robId] = robmonitor::ROBDataStruct(robId);
-      monitorData.requested_ROBs[robId].rob_history = robmonitor::DISABLED;
+    for (uint32_t robId : robIds) {
+      if (std::find(m_enabledROBs.begin(), m_enabledROBs.end(), robId) !=  m_enabledROBs.end()) {
+        monitorData.requested_ROBs[robId] = robmonitor::ROBDataStruct(robId);
+        monitorData.requested_ROBs[robId].rob_history = robmonitor::DISABLED;
+      }
     }
   }
 
-- 
GitLab


From 063aaa2c1fa016645b725ce79914e662728103d8 Mon Sep 17 00:00:00 2001
From: Aleksandra Poreba <aleksandra.poreba@cern.ch>
Date: Wed, 2 Dec 2020 10:04:15 +0100
Subject: [PATCH 4/5] Check IGNORED just for DCM retrieved ROBs

---
 .../src/HltROBDataProviderSvc.cxx             | 21 +++++++++++--------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
index 70ca973c344c..f34f3021509a 100644
--- a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
+++ b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
@@ -384,8 +384,17 @@ void HltROBDataProviderSvc::getROBData(const EventContext& context,
 
     // 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 if ROB was cached
+      if (robmap_filterRobWithStatus(&robInfo.robFragment)){
+        status = robmonitor::IGNORED;
+      }
+      else {
+        status = robInfo.robIsCached ? robmonitor::DCM_CACHED : robmonitor::RETRIEVED;
+      }
+
+      monitorData.requested_ROBs[robInfo.robFragment.source_id()] = robmap_getRobData(robInfo.robFragment, status);
     }
 
     // Find not enabled ROBs
@@ -423,13 +432,7 @@ robmonitor::ROBDataStruct HltROBDataProviderSvc::robmap_getRobData(const ROBF& r
   auto robData = robmonitor::ROBDataStruct(robFrag.source_id());
   robData.rob_size = robFrag.fragment_size_word();
   robData.rob_status_word = robFrag.nstatus() ? robFrag.status()[0] : 0;
-
-  if (robmap_filterRobWithStatus(&robFrag)){
-    robData.rob_history = robmonitor::IGNORED;
-  } 
-  else {
-    robData.rob_history = robStatus;
-  }
+  robData.rob_history = robStatus;
 
   return robData;
 }
-- 
GitLab


From b1fc7cd2574353cfb95036abb97f7cd79550ce23 Mon Sep 17 00:00:00 2001
From: Aleksandra Poreba <aleksandra.poreba@cern.ch>
Date: Wed, 2 Dec 2020 16:47:35 +0100
Subject: [PATCH 5/5] Pass list of ignored/disabled rob ids as optional set

---
 .../src/HltROBDataProviderSvc.cxx             | 51 ++++++++++++-------
 .../TrigServices/src/HltROBDataProviderSvc.h  |  9 +++-
 2 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
index f34f3021509a..8d12be750c08 100644
--- a/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
+++ b/HLT/Trigger/TrigControl/TrigServices/src/HltROBDataProviderSvc.cxx
@@ -382,12 +382,16 @@ 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) {
       robmonitor::ROBHistory status;
 
-      // Check if ROB was cached
-      if (robmap_filterRobWithStatus(&robInfo.robFragment)){
+      // Check ROB history
+      if (robIds_ignored.find(robInfo.robFragment.source_id()) != robIds_ignored.end()) {
         status = robmonitor::IGNORED;
       }
       else {
@@ -397,20 +401,23 @@ void HltROBDataProviderSvc::getROBData(const EventContext& context,
       monitorData.requested_ROBs[robInfo.robFragment.source_id()] = robmap_getRobData(robInfo.robFragment, status);
     }
 
-    // Find not enabled ROBs
-    for (uint32_t robId : robIds) {
-      if (std::find(m_enabledROBs.begin(), m_enabledROBs.end(), robId) !=  m_enabledROBs.end()) {
+    // 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);
+
+    // 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) ;
 
-  // 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) ;
+    // 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)) {
@@ -596,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());
 
@@ -630,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;
       }
     }
 
@@ -645,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());
 
@@ -696,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 72ae025fffbc..bdf1a69f3fe6 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"};
-- 
GitLab