ATLAS Offline Software
Loading...
Searching...
No Matches
ByteStreamMergeOutputSvc Class Reference

This class provides the services for merging FullEventFragment with existing bytestream input. More...

#include <ByteStreamMergeOutputSvc.h>

Inheritance diagram for ByteStreamMergeOutputSvc:
Collaboration diagram for ByteStreamMergeOutputSvc:

Public Member Functions

 ByteStreamMergeOutputSvc (const std::string &name, ISvcLocator *svcloc)
 Constructors:
virtual ~ByteStreamMergeOutputSvc ()=default
 Destructor.
virtual StatusCode initialize () override
virtual bool putEvent (const RawEvent *re) override
 Implementation of the IByteStreamOutputSvc interface methods.
virtual bool putEvent (const RawEvent *re, const EventContext &ctx) override

Private Member Functions

uint32_t reducedROBid (uint32_t)

Private Attributes

ServiceHandle< IByteStreamInputSvcm_inSvc {this, "ByteStreamInputSvc", {}}
ServiceHandle< IByteStreamOutputSvcm_outSvc {this, "ByteStreamOutputSvc", {}}
Gaudi::Property< std::string > m_bsOutputStreamName {this, "BSOutputStreamName", {}, "stream name for multiple output"}
Gaudi::Property< bool > m_overwriteHeader {this, "overWriteHeader", false}

Detailed Description

This class provides the services for merging FullEventFragment with existing bytestream input.

Mostly meant for adding new L2+EF results

Definition at line 22 of file ByteStreamMergeOutputSvc.h.

Constructor & Destructor Documentation

◆ ByteStreamMergeOutputSvc()

ByteStreamMergeOutputSvc::ByteStreamMergeOutputSvc ( const std::string & name,
ISvcLocator * svcloc )

Constructors:

Definition at line 20 of file ByteStreamMergeOutputSvc.cxx.

20 :
21 base_class(name,svcloc)
22{
23 // cppcheck-suppress useInitializationList; deprecated Property constructor
25}
Gaudi::Property< std::string > m_bsOutputStreamName

◆ ~ByteStreamMergeOutputSvc()

virtual ByteStreamMergeOutputSvc::~ByteStreamMergeOutputSvc ( )
virtualdefault

Destructor.

Member Function Documentation

◆ initialize()

StatusCode ByteStreamMergeOutputSvc::initialize ( )
overridevirtual

Definition at line 28 of file ByteStreamMergeOutputSvc.cxx.

28 {
29 ATH_CHECK( m_outSvc.retrieve() );
30 ATH_CHECK( m_inSvc.retrieve() );
31
32 return StatusCode::SUCCESS;
33}
#define ATH_CHECK
Evaluate an expression and check for errors.
ServiceHandle< IByteStreamInputSvc > m_inSvc
ServiceHandle< IByteStreamOutputSvc > m_outSvc

◆ putEvent() [1/2]

bool ByteStreamMergeOutputSvc::putEvent ( const RawEvent * re)
overridevirtual

Implementation of the IByteStreamOutputSvc interface methods.

Definition at line 48 of file ByteStreamMergeOutputSvc.cxx.

48 {
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 // get all the ROBFragments
57 const size_t MAX_ROBFRAGMENTS = 2048;
58 std::vector<OFFLINE_FRAGMENTS_NAMESPACE::PointerType> orgRobF(MAX_ROBFRAGMENTS);
59 std::vector<OFFLINE_FRAGMENTS_NAMESPACE::PointerType> newRobF(MAX_ROBFRAGMENTS);
60 size_t orgrobcount = orgEvent->children(orgRobF.data(), MAX_ROBFRAGMENTS);
61 if (orgrobcount == MAX_ROBFRAGMENTS) {
62 ATH_MSG_ERROR("ROB buffer overflow");
63 return false;
64 }
65 size_t newrobcount = newEvent->children(newRobF.data(),MAX_ROBFRAGMENTS);
66 if (newrobcount == MAX_ROBFRAGMENTS) {
67 ATH_MSG_ERROR("ROB buffer overflow");
68 return false;
69 }
70
71 ROBMAP robsToAdd;
72 // loop over all ROBs
73 for (size_t irob = 0; irob < orgrobcount; ++irob) {
74 ROBF* rob = new ROBF(orgRobF[irob]);
75 robsToAdd[reducedROBid(rob->source_id())] = rob;
76 ATH_MSG_DEBUG("original ROBFragment, src ID = " << std::hex << rob->source_id());
77 }
78 // now add/overwrite with newly created robs
79 for (size_t irob = 0; irob < newrobcount; ++irob) {
80 ROBF* rob = new ROBF(newRobF[irob]);
81 ROBMAP::const_iterator it = robsToAdd.find(reducedROBid(rob->source_id()));
82 if (it != robsToAdd.end()) {
83 delete it->second;
84 ATH_MSG_DEBUG("overwriting ROBFragment with src ID = " << std::hex << rob->source_id());
85 }
86 robsToAdd[reducedROBid(rob->source_id())] = rob;
87 ATH_MSG_DEBUG("new ROBFragment, src ID = " << std::hex << rob->source_id());
88 }
89 RawEventWrite* mergedEventWrite = new RawEventWrite();
90 // copy header
91 const RawEvent *event = orgEvent;
93 event = newEvent;
94 }
95 mergedEventWrite->source_id(event->source_id());
96 mergedEventWrite->bc_time_seconds(event->bc_time_seconds());
97 mergedEventWrite->bc_time_nanoseconds(event->bc_time_nanoseconds());
98 mergedEventWrite->global_id(event->global_id());
99 mergedEventWrite->run_type(event->run_type());
100 mergedEventWrite->run_no(event->run_no());
101 mergedEventWrite->lumi_block(event->lumi_block());
102 mergedEventWrite->lvl1_id(event->lvl1_id());
103 mergedEventWrite->bc_id(event->bc_id());
104 mergedEventWrite->lvl1_trigger_type(event->lvl1_trigger_type());
106 event->status(tmp);
107 mergedEventWrite->status(event->nstatus(), tmp);
108 event->lvl1_trigger_info(tmp);
109 mergedEventWrite->lvl1_trigger_info(event->nlvl1_trigger_info(), tmp);
110 event->lvl2_trigger_info(tmp);
111 mergedEventWrite->lvl2_trigger_info(event->nlvl2_trigger_info(), tmp);
112 event->event_filter_info(tmp);
113 mergedEventWrite->event_filter_info(event->nevent_filter_info(), tmp);
114 event->stream_tag(tmp);
115 mergedEventWrite->stream_tag(event->nstream_tag(), tmp);
116 mergedEventWrite->checksum_type(event->checksum_type());
117 // copy robs
118 for(ROBMAP::iterator it = robsToAdd.begin(), itEnd = robsToAdd.end(); it != itEnd; ++it) {
119 mergedEventWrite->append(it->second);
120 }
121 // convert RawEventWrite to RawEvent
122 uint32_t rawSize = mergedEventWrite->size_word();
124 uint32_t count = eformat::write::copy(*(mergedEventWrite->bind()), buffer, rawSize);
125 if (count != rawSize) {
126 ATH_MSG_ERROR("Memcopy failed " << count << " " << rawSize);
127 return false;
128 }
129 RawEvent newRawEvent(buffer);
130 StatusCode sc = m_outSvc->putEvent(&newRawEvent) ? StatusCode::SUCCESS : StatusCode::FAILURE;
131 for(ROBMAP::iterator it = robsToAdd.begin(), itEnd = robsToAdd.end(); it != itEnd; ++it) {
132 delete it->second; it->second = nullptr;
133 }
134 delete mergedEventWrite; mergedEventWrite = nullptr;
135 delete [] buffer;
136 if (sc != StatusCode::SUCCESS) {
137 ATH_MSG_ERROR("Failed to put RawEvent");
138 }
139 return(true);
140}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
std::map< uint32_t, ROBF * > ROBMAP
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment ROBF
static const size_t MAX_ROBFRAGMENTS
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
Gaudi::Property< bool > m_overwriteHeader
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
::StatusCode StatusCode
StatusCode definition for legacy code.
setEventNumber uint32_t

◆ putEvent() [2/2]

bool ByteStreamMergeOutputSvc::putEvent ( const RawEvent * re,
const EventContext & ctx )
overridevirtual

Definition at line 142 of file ByteStreamMergeOutputSvc.cxx.

142 {
143 ATH_MSG_FATAL(name() << " does not implement the context-aware putEvent method");
144 return false;
145}
#define ATH_MSG_FATAL(x)

◆ reducedROBid()

uint32_t ByteStreamMergeOutputSvc::reducedROBid ( uint32_t source_id)
private

Definition at line 38 of file ByteStreamMergeOutputSvc.cxx.

38 {
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}

Member Data Documentation

◆ m_bsOutputStreamName

Gaudi::Property<std::string> ByteStreamMergeOutputSvc::m_bsOutputStreamName {this, "BSOutputStreamName", {}, "stream name for multiple output"}
private

Definition at line 41 of file ByteStreamMergeOutputSvc.h.

41{this, "BSOutputStreamName", {}, "stream name for multiple output"};

◆ m_inSvc

ServiceHandle<IByteStreamInputSvc> ByteStreamMergeOutputSvc::m_inSvc {this, "ByteStreamInputSvc", {}}
private

Definition at line 38 of file ByteStreamMergeOutputSvc.h.

38{this, "ByteStreamInputSvc", {}};

◆ m_outSvc

ServiceHandle<IByteStreamOutputSvc> ByteStreamMergeOutputSvc::m_outSvc {this, "ByteStreamOutputSvc", {}}
private

Definition at line 39 of file ByteStreamMergeOutputSvc.h.

39{this, "ByteStreamOutputSvc", {}};

◆ m_overwriteHeader

Gaudi::Property<bool> ByteStreamMergeOutputSvc::m_overwriteHeader {this, "overWriteHeader", false}
private

Definition at line 42 of file ByteStreamMergeOutputSvc.h.

42{this, "overWriteHeader", false};

The documentation for this class was generated from the following files: