ATLAS Offline Software
Loading...
Searching...
No Matches
ByteStreamMergeOutputSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
7
8#include "GaudiKernel/GenericAddress.h"
9#include "GaudiKernel/MsgStream.h"
10#include "GaudiKernel/ISvcLocator.h"
11
12#include "eformat/SourceIdentifier.h"
13
14#include <map>
15
17using ROBMAP = std::map<uint32_t, ROBF*>;
18
19// Constructor.
20ByteStreamMergeOutputSvc::ByteStreamMergeOutputSvc(const std::string& name, ISvcLocator* svcloc) :
21 base_class(name,svcloc)
22{
23 // cppcheck-suppress useInitializationList; deprecated Property constructor
25}
26
27// setup input and output paths
29 ATH_CHECK( m_outSvc.retrieve() );
30 ATH_CHECK( m_inSvc.retrieve() );
31
32 return StatusCode::SUCCESS;
33}
34
35// ROBs from the L2 and event filter needs to be treated specially since the module id
36// is used online to identify which node processed an event and it therefore varies from
37// event to event - here we remap it to have module id 0, since there should only be one per event
38uint32_t ByteStreamMergeOutputSvc::reducedROBid(uint32_t source_id) {
39 eformat::helper::SourceIdentifier id = eformat::helper::SourceIdentifier(source_id);
40 if (id.subdetector_id() == eformat::TDAQ_LVL2 || id.subdetector_id() == eformat::TDAQ_EVENT_FILTER) {
41 return(eformat::helper::SourceIdentifier(id.subdetector_id(), 0).code());
42 } else {
43 return(source_id);
44 }
45}
46
47// Read the next event.
49 // get original event
50 const RawEvent* orgEvent = m_inSvc->currentEvent();
51
52 ATH_MSG_DEBUG("original BS size = " << 4 * orgEvent->fragment_size_word());
53 ATH_MSG_DEBUG("athena BS size = " << 4 * newEvent->fragment_size_word());
54
55 // do the merge...
56
57 ROBMAP robsToAdd;
58 // loop over all ROBs
59 auto orgIter = orgEvent->child_iter();
60 while (OFFLINE_FRAGMENTS_NAMESPACE::PointerType fp = orgIter.next()) {
61 ROBF* rob = new ROBF(fp);
62 robsToAdd[reducedROBid(rob->source_id())] = rob;
63 ATH_MSG_DEBUG("original ROBFragment, src ID = " << std::hex << rob->source_id());
64 }
65 // now add/overwrite with newly created robs
66 auto newIter = newEvent->child_iter();
67 while (OFFLINE_FRAGMENTS_NAMESPACE::PointerType fp = newIter.next()) {
68 ROBF* rob = new ROBF(fp);
69 ROBMAP::const_iterator it = robsToAdd.find(reducedROBid(rob->source_id()));
70 if (it != robsToAdd.end()) {
71 delete it->second;
72 ATH_MSG_DEBUG("overwriting ROBFragment with src ID = " << std::hex << rob->source_id());
73 }
74 robsToAdd[reducedROBid(rob->source_id())] = rob;
75 ATH_MSG_DEBUG("new ROBFragment, src ID = " << std::hex << rob->source_id());
76 }
77 RawEventWrite* mergedEventWrite = new RawEventWrite();
78 // copy header
79 const RawEvent *event = orgEvent;
81 event = newEvent;
82 }
83 mergedEventWrite->source_id(event->source_id());
84 mergedEventWrite->bc_time_seconds(event->bc_time_seconds());
85 mergedEventWrite->bc_time_nanoseconds(event->bc_time_nanoseconds());
86 mergedEventWrite->global_id(event->global_id());
87 mergedEventWrite->run_type(event->run_type());
88 mergedEventWrite->run_no(event->run_no());
89 mergedEventWrite->lumi_block(event->lumi_block());
90 mergedEventWrite->lvl1_id(event->lvl1_id());
91 mergedEventWrite->bc_id(event->bc_id());
92 mergedEventWrite->lvl1_trigger_type(event->lvl1_trigger_type());
94 event->status(tmp);
95 mergedEventWrite->status(event->nstatus(), tmp);
96 event->lvl1_trigger_info(tmp);
97 mergedEventWrite->lvl1_trigger_info(event->nlvl1_trigger_info(), tmp);
98 event->lvl2_trigger_info(tmp);
99 mergedEventWrite->lvl2_trigger_info(event->nlvl2_trigger_info(), tmp);
100 event->event_filter_info(tmp);
101 mergedEventWrite->event_filter_info(event->nevent_filter_info(), tmp);
102 event->stream_tag(tmp);
103 mergedEventWrite->stream_tag(event->nstream_tag(), tmp);
104 mergedEventWrite->checksum_type(event->checksum_type());
105 // copy robs
106 for(ROBMAP::iterator it = robsToAdd.begin(), itEnd = robsToAdd.end(); it != itEnd; ++it) {
107 mergedEventWrite->append(it->second);
108 }
109 // convert RawEventWrite to RawEvent
110 uint32_t rawSize = mergedEventWrite->size_word();
112 uint32_t count = eformat::write::copy(*(mergedEventWrite->bind()), buffer, rawSize);
113 if (count != rawSize) {
114 ATH_MSG_ERROR("Memcopy failed " << count << " " << rawSize);
115 return false;
116 }
117 RawEvent newRawEvent(buffer);
118 StatusCode sc = m_outSvc->putEvent(&newRawEvent) ? StatusCode::SUCCESS : StatusCode::FAILURE;
119 for(ROBMAP::iterator it = robsToAdd.begin(), itEnd = robsToAdd.end(); it != itEnd; ++it) {
120 delete it->second; it->second = nullptr;
121 }
122 delete mergedEventWrite; mergedEventWrite = nullptr;
123 delete [] buffer;
124 if (sc != StatusCode::SUCCESS) {
125 ATH_MSG_ERROR("Failed to put RawEvent");
126 }
127 return(true);
128}
129
130bool ByteStreamMergeOutputSvc::putEvent(const RawEvent* /*re*/, const EventContext& /*ctx*/) {
131 ATH_MSG_FATAL(name() << " does not implement the context-aware putEvent method");
132 return false;
133}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_DEBUG(x)
std::map< uint32_t, ROBF * > ROBMAP
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment ROBF
This file contains the class definition for the ByteStreamMergeOutputSvc class.
static Double_t sc
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::FullEventFragment RawEventWrite
data type for writing raw event
Definition RawEvent.h:39
OFFLINE_FRAGMENTS_NAMESPACE::FullEventFragment RawEvent
data type for reading raw event
Definition RawEvent.h:37
ByteStreamMergeOutputSvc(const std::string &name, ISvcLocator *svcloc)
Constructors:
virtual StatusCode initialize() override
Gaudi::Property< bool > m_overwriteHeader
virtual bool putEvent(const RawEvent *re) override
Implementation of the IByteStreamOutputSvc interface methods.
ServiceHandle< IByteStreamInputSvc > m_inSvc
ServiceHandle< IByteStreamOutputSvc > m_outSvc
Gaudi::Property< std::string > m_bsOutputStreamName
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:148
eformat::write::ROBFragment ROBFragment
Definition RawEvent.h:33
const DataType * PointerType
Definition RawEvent.h:25