9 #include "Gaudi/Interfaces/IOptionsSvc.h"
12 #include "hltinterface/DataCollector.h"
15 #include "eformat/Status.h"
23 static const size_t MAX_ROBFRAGMENTS = 4096;
26 base_class(
name, pSvcLocator)
32 ATH_MSG_INFO(
"HltROBDataProviderSvc::" << __FUNCTION__ <<
": name = " <<
name());
64 if (tmpsrc.human_detector() !=
"UNKNOWN") {
72 if (tmpsrc.human_detector() !=
"UNKNOWN") {
81 eformat::helper::SourceIdentifier tmpsrc(
it.first);
82 ATH_MSG_INFO(
" RobId=0x" << MSG::hex <<
it.first <<
" -> in Sub Det = " << tmpsrc.human_detector());
84 for (
auto it_status:
it.second) {
87 << MSG::hex << std::setfill(
'0' ) << std::setw(8) << tmpstatus.code()
88 <<
" Generic Part=0x" << std::setw(4) << tmpstatus.generic()
89 <<
" Specific Part=0x" << std::setw(4) << tmpstatus.specific() << MSG::dec);
96 eformat::helper::SourceIdentifier tmpsrc(
it.first, 0);
97 ATH_MSG_INFO(
" SubDetId=0x" << MSG::hex <<
it.first <<
" -> " << tmpsrc.human_detector());
98 for (
auto it_status :
it.second) {
101 << MSG::hex << std::setfill(
'0' ) << std::setw(8) << tmpstatus.code()
102 <<
" Generic Part=0x" << std::setw(4) << tmpstatus.generic()
103 <<
" Specific Part=0x" << std::setw(4) << tmpstatus.specific() << MSG::dec);
108 bool robOKSconfigFound =
false;
112 if ((jobOptionsSvc.retrieve()).isFailure()) {
115 if (jobOptionsSvc->has(
"DataFlowConfig.DF_Enabled_ROB_IDs") &&
116 m_enabledROBs.fromString(jobOptionsSvc->get(
"DataFlowConfig.DF_Enabled_ROB_IDs")).isSuccess()) {
117 robOKSconfigFound =
true;
119 << MSG::dec <<
m_enabledROBs.value().size() <<
" enabled ROB IDs.");
129 ATH_MSG_INFO(
" ---> The list of enabled ROBs has size = 0. No check will be performed ");
133 <<
". It was read from the partition database." );
136 <<
". It was read from job options." );
152 ATH_MSG_INFO(
" The following sub-detectors or sub-detector groups are configured for prefetching : Number = "
156 eformat::SubDetector
sd(
static_cast<eformat::SubDetector
>(
it));
157 eformat::helper::SourceIdentifier tmpsrc(
sd, 0);
158 ATH_MSG_INFO(
" SubDetId = 0x" << MSG::hex << std::setw(2) << (
int)
it << MSG::dec <<
" -> Group : "
159 << tmpsrc.human_group()
160 <<
" -> SubDetector : " << tmpsrc.human_detector() );
162 eformat::SubDetectorGroup sg(
static_cast<eformat::SubDetectorGroup
>(
it));
163 ATH_MSG_INFO(
" SubDetGroup = 0x" << MSG::hex << std::setw(1) << (
int)
it << MSG::dec <<
" -> Group : "
164 << eformat::helper::SubDetectorGroupDictionary.
string(sg));
170 eformat::helper::SourceIdentifier tmpsrc(rob);
189 return(StatusCode::SUCCESS);
195 return StatusCode::SUCCESS;
202 const std::string_view callerName)
204 ATH_MSG_VERBOSE(
"start of " << __FUNCTION__ <<
": Number of ROB Ids to add = " << robIds.size()
205 <<
" caller name = " << callerName);
209 std::vector<uint32_t> robIds_missing ;
212 std::vector<const ROBF*> robFragments_inCache ;
218 if (!robIds_missing.empty()) {
219 ATH_MSG_DEBUG( __FUNCTION__ <<
": Number of ROB Ids to reserve with DCM = " << robIds_missing.size());
226 auto mon_robres_nROBs =
Monitored::Scalar(
"NUMBER_ROBReserveData",robIds_missing.size());
230 <<
"Failed to reserve ROB data, caught an unexpected exception: " << ex.what());
233 <<
"Failed to reserve ROB data, caught an unexpected exception.");
241 ATH_MSG_FATAL(
"Obsolete method HltROBDataProviderSvc::setNextEvent(const EventContext& context, const std::vector<ROBF>& result) called "
242 <<
"\n context = " << context <<
" number of ROB fragments = " <<
result.size() );
273 size_t number_robs =
re->children(robF,MAX_ROBFRAGMENTS);
274 if (number_robs == MAX_ROBFRAGMENTS) {
275 ATH_MSG_ERROR(
"ROB buffer overflow: ROBs found = " << number_robs
276 <<
" Max. number of ROBs allowed = " << MAX_ROBFRAGMENTS);
278 std::vector<ROBF> rob_fragments;
279 rob_fragments.reserve(number_robs);
281 for (
size_t irob = 0; irob < number_robs; irob++) {
282 rob_fragments.push_back(
ROBF(robF[irob]));
289 ATH_MSG_DEBUG(
" number of received ROBs = " << rob_fragments.size() );
305 const std::vector<uint32_t>& robIds, std::vector<const ROBF*>& robFragments,
306 const std::string_view callerName)
315 ATH_MSG_VERBOSE(
"start of " << __FUNCTION__ <<
": Number of ROB Ids to get = " << robIds.size()
316 <<
" caller name = " << callerName);
319 std::vector<uint32_t> robIds_missing ;
325 if (robIds_missing.empty()) {
326 ATH_MSG_DEBUG( __FUNCTION__ <<
": All requested ROB Ids were found in the cache. ");
331 ATH_MSG_DEBUG( __FUNCTION__ <<
": Number of ROB Ids to retrieve with DCM = " << robIds_missing.size());
333 typedef std::vector<hltinterface::DCM_ROBInfo> ROBInfoVec;
334 ROBInfoVec vRobInfos;
337 vRobInfos.reserve( robIds_missing.size() ) ;
347 <<
"Failed to collect ROBs, caught an unexpected exception: " << ex.what()
348 <<
". Throwing hltonl::Exception::EventSourceCorrupted" );
352 <<
"Failed to collect ROBs, caught an unexpected exception. "
353 <<
"Throwing hltonl::Exception::EventSourceCorrupted" );
358 std::vector<ROBF> robFragments_missing;
359 robFragments_missing.reserve( vRobInfos.size() );
360 for(ROBInfoVec::const_iterator
it=vRobInfos.begin();
it!=vRobInfos.end(); ++
it) {
361 ATH_MSG_DEBUG(__FUNCTION__ <<
" ROB Id = 0x" << MSG::hex <<
it->robFragment.source_id() << MSG::dec
363 robFragments_missing.push_back(
it->robFragment );
370 for (
const ROBF* robFrag : robFragments) {
375 std::set<uint32_t> robIds_ignored;
379 for (
const hltinterface::DCM_ROBInfo& robInfo : vRobInfos) {
383 if (robIds_ignored.find(robInfo.robFragment.source_id()) != robIds_ignored.end()) {
394 std::set<uint32_t> robIds_disabled;
398 for (
uint32_t robId : robIds_disabled) {
429 robData.rob_size = robFrag.fragment_size_word();
430 robData.rob_status_word = robFrag.nstatus() ? robFrag.status()[0] : 0;
431 robData.rob_history = robStatus;
477 ATH_MSG_VERBOSE(
"start of " << __FUNCTION__ <<
" caller name = " << callerName);
487 typedef std::vector<hltinterface::DCM_ROBInfo> ROBInfoVec;
488 ROBInfoVec vRobInfos ;
492 vRobInfos.reserve( MAX_ROBFRAGMENTS ) ;
500 ATH_MSG_DEBUG( __FUNCTION__ <<
": Number of received ROB Ids = " << vRobInfos.size() );
502 auto mon_col_nROBs =
Monitored::Scalar(
"NUMBER_CollectAllROBs",vRobInfos.size());
506 <<
"Failed to collect complete event, caught an unexpected exception: " << ex.what()
507 <<
". Throwing hltonl::Exception::EventSourceCorrupted" );
511 <<
"Failed to collect complete event, caught an unexpected exception. "
512 <<
"Throwing hltonl::Exception::EventSourceCorrupted" );
517 std::vector<ROBF> robFragments_missing;
518 robFragments_missing.reserve( vRobInfos.size() );
519 for(ROBInfoVec::const_iterator
it=vRobInfos.begin();
it!=vRobInfos.end(); ++
it) {
520 ATH_MSG_VERBOSE(__FUNCTION__ <<
" ROB Id = 0x" << MSG::hex <<
it->robFragment.source_id() << MSG::dec
522 robFragments_missing.push_back(
it->robFragment );
530 return vRobInfos.size();
547 if (rob->nstatus() == 0) {
548 rob_it_status = &null_status;
551 rob->status(rob_it_status);
555 eformat::helper::SourceIdentifier tmpsrc(rob->rob_source_id());
560 for (
auto it_status: (*map_it_rob).second) {
561 if (*rob_it_status == it_status) {
562 ATH_MSG_VERBOSE(__FUNCTION__ <<
" ROB Id = 0x" << MSG::hex << tmpsrc.code()
563 <<
" with status = 0x" << *rob_it_status << MSG::dec
564 <<
" removed due to ROB filter rule.");
573 for (
auto it_status: (*map_it_subdet).second) {
574 if (*rob_it_status == it_status) {
575 ATH_MSG_VERBOSE(__FUNCTION__ <<
" ROB Id = 0x" << MSG::hex << tmpsrc.code()
576 <<
" with status = 0x" << *rob_it_status << MSG::dec
577 <<
" removed due to SubDet filter rule.");
588 cache->
event =
nullptr;
593 { cache->
robmap.clear(); }
597 std::vector<const ROBF*>& robFragments_inCache,
598 std::vector<uint32_t>& robIds_missing,
599 std::optional<std::reference_wrapper<std::set<uint32_t>>> robIds_disabled )
601 ATH_MSG_VERBOSE(
"start of " << __FUNCTION__ <<
" number of ROB Ids to check = " << robIds_toCheck.size());
604 robFragments_inCache.clear();
605 robIds_missing.clear();
608 robFragments_inCache.reserve( robIds_toCheck.size() );
609 robIds_missing.reserve( robIds_toCheck.size() );
612 for (
uint32_t id : robIds_toCheck) {
616 if (missing_it != robIds_missing.end()) {
617 ATH_MSG_VERBOSE(__FUNCTION__ <<
" ROB Id : 0x" << MSG::hex <<
id << MSG::dec <<
" is already on the list of missing IDs.");
622 { ROBMAP::const_iterator map_it = cache->
robmap.find(
id);
623 if (map_it != cache->
robmap.end()) {
624 ATH_MSG_VERBOSE(__FUNCTION__ <<
" ROB Id 0x" << MSG::hex <<
id << MSG::dec
626 robFragments_inCache.push_back( &(map_it->second) );
633 std::vector<uint32_t>::const_iterator rob_enabled_it =
636 ATH_MSG_VERBOSE(__FUNCTION__ <<
" ROB Id : 0x" << MSG::hex <<
id << MSG::dec
637 <<
" will be not added, since it is not on the list of enabled ROBs.");
638 if (robIds_disabled) {
639 robIds_disabled->get().insert(
id);
646 ATH_MSG_VERBOSE(__FUNCTION__ <<
" ROB Id : 0x" << MSG::hex <<
id << MSG::dec <<
" is missing ");
647 robIds_missing.push_back(
id ) ;
652 std::optional<std::reference_wrapper<std::set<uint32_t>>> robIds_ignored)
654 ATH_MSG_VERBOSE(
"start of " << __FUNCTION__ <<
" number of ROB fragments to add = " << robFragments.size());
656 for (
const ROBF& rob : robFragments) {
660 ATH_MSG_VERBOSE(__FUNCTION__ <<
" Id = 0x" << std::hex <<
id << std::dec );
663 if ( (eformat::helper::SourceIdentifier(
id).module_id() != 0) &&
664 (eformat::helper::SourceIdentifier(
id).subdetector_id() == eformat::TDAQ_LVL2) ) {
665 id = eformat::helper::SourceIdentifier(eformat::helper::SourceIdentifier(
id).subdetector_id(),0).code();
667 ATH_MSG_ERROR(__FUNCTION__ <<
" Inconsistent flag for masking L2/EF module IDs");
670 }
else if ( (eformat::helper::SourceIdentifier(
id).module_id() != 0) &&
671 (eformat::helper::SourceIdentifier(
id).subdetector_id() == eformat::TDAQ_EVENT_FILTER) &&
673 id = eformat::helper::SourceIdentifier(eformat::helper::SourceIdentifier(
id).subdetector_id(),0).code();
677 { ROBMAP::const_iterator
it = cache->
robmap.find(
id);
679 ATH_MSG_VERBOSE(__FUNCTION__ <<
" Duplicate ROB Id 0x" << MSG::hex <<
id << MSG::dec
687 if (rob.nstatus() > 0) {
689 rob.status(it_status);
691 ATH_MSG_VERBOSE(__FUNCTION__ <<
" ROB Id = 0x" << MSG::hex <<
id << std::setfill(
'0')
692 <<
" with Generic Status Code = 0x" << std::setw(4) << tmpstatus.generic()
693 <<
" and Specific Status Code = 0x" << std::setw(4) << tmpstatus.specific() << MSG::dec
696 if (robIds_ignored) {
697 robIds_ignored->get().insert(
id);
704 ATH_MSG_VERBOSE(__FUNCTION__ <<
" Empty ROB Id = 0x" << MSG::hex <<
id << MSG::dec
710 { cache->
robmap.insert(std::make_pair(
id,std::move(rob))); }