ATLAS Offline Software
Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | List of all members
ByteStreamMergeOutputSvc Class Reference

#include <ByteStreamMergeOutputSvc.h>

Inheritance diagram for ByteStreamMergeOutputSvc:
Collaboration diagram for ByteStreamMergeOutputSvc:

Public Member Functions

 ByteStreamMergeOutputSvc (const std::string &name, ISvcLocator *svcloc)
 Constructors: More...
 
virtual ~ByteStreamMergeOutputSvc ()
 Destructor. More...
 
virtual StatusCode initialize () override
 
virtual bool putEvent (const RawEvent *re) override
 Implementation of the ByteStreamOutputSvc interface methods. More...
 
virtual bool putEvent (const RawEvent *re, const EventContext &ctx) override
 context-aware method for writing the event More...
 
StatusCode queryInterface (const InterfaceID &riid, void **ppvInterface) override
 Required of all Gaudi services: see Gaudi documentation for details. More...
 
MsgStream & msg () const
 
MsgStream & msg (const MSG::Level lvl) const
 
bool msgLvl (const MSG::Level lvl) const
 

Static Public Member Functions

static const InterfaceID & interfaceID ()
 Retrieve interface ID. More...
 

Private Member Functions

uint32_t reducedROBid (uint32_t)
 

Private Attributes

Gaudi::Property< std::string > m_inSvcName
 
Gaudi::Property< std::string > m_outSvcName
 
ByteStreamInputSvcm_inSvc
 
ByteStreamOutputSvcm_outSvc
 
Gaudi::Property< std::string > m_bsOutputStreamName
 stream name for multiple output More...
 
Gaudi::Property< bool > m_overwriteHeader
 

Detailed Description

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  ByteStreamOutputSvc(name,svcloc),
22  m_inSvc(0),
23  m_outSvc(0)
24 {
25  declareProperty("ByteStreamOutputSvc", m_outSvcName);
26  declareProperty("ByteStreamInputSvc", m_inSvcName);
27  declareProperty("overWriteHeader", m_overwriteHeader = false);
28  declareProperty("BSOutputStreamName", m_bsOutputStreamName = name);
29 }

◆ ~ByteStreamMergeOutputSvc()

ByteStreamMergeOutputSvc::~ByteStreamMergeOutputSvc ( )
virtual

Destructor.

Definition at line 32 of file ByteStreamMergeOutputSvc.cxx.

32  {
33 }

Member Function Documentation

◆ initialize()

StatusCode ByteStreamMergeOutputSvc::initialize ( )
overridevirtual

Definition at line 36 of file ByteStreamMergeOutputSvc.cxx.

36  {
38  if (sc != StatusCode::SUCCESS) {
39  ATH_MSG_ERROR("Failed to initialize ByteStreamOutputSvc base class");
40  return(sc);
41  }
42  IService* svc;
43  sc = service(m_outSvcName.value(), svc);
44  if (sc != StatusCode::SUCCESS) {
45  ATH_MSG_ERROR("Cannot get ByteStreamOutputSvc");
46  return(sc);
47  }
48  m_outSvc = dynamic_cast<ByteStreamOutputSvc*>(svc);
49  if (m_outSvc == 0) {
50  ATH_MSG_ERROR("Cannot cast " << m_outSvcName << " to ByteStreamOutputSvc");
51  return(StatusCode::FAILURE);
52  }
53 
54  sc = service(m_inSvcName.value(), svc);
55  if (sc != StatusCode::SUCCESS) {
56  ATH_MSG_ERROR("Cannot get ByteStreamInputSvc");
57  return(sc);
58  }
59  m_inSvc = dynamic_cast<ByteStreamInputSvc*>(svc);
60  if (m_inSvc == 0) {
61  ATH_MSG_ERROR("Cannot cast " << m_inSvcName << " to ByteStreamInputSvc");
62  return(StatusCode::FAILURE);
63  }
64  return(StatusCode::SUCCESS);
65 }

◆ interfaceID()

const InterfaceID & ByteStreamOutputSvc::interfaceID ( )
inlinestaticinherited

Retrieve interface ID.

Declaration of the interface ID ( interface id, major version, minor version)

Definition at line 43 of file ByteStreamOutputSvc.h.

43  {
46  static const InterfaceID IID_ByteStreamOutputSvc("ByteStreamOutputSvc", 1, 0);
47  return(IID_ByteStreamOutputSvc);
48 }

◆ msg() [1/2]

MsgStream& AthCommonMsg< Service >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24  {
25  return this->msgStream();
26  }

◆ msg() [2/2]

MsgStream& AthCommonMsg< Service >::msg ( const MSG::Level  lvl) const
inlineinherited

Definition at line 27 of file AthCommonMsg.h.

27  {
28  return this->msgStream(lvl);
29  }

◆ msgLvl()

bool AthCommonMsg< Service >::msgLvl ( const MSG::Level  lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30  {
31  return this->msgLevel(lvl);
32  }

◆ putEvent() [1/2]

bool ByteStreamMergeOutputSvc::putEvent ( const RawEvent re)
overridevirtual

Implementation of the ByteStreamOutputSvc interface methods.

Implements ByteStreamOutputSvc.

Definition at line 80 of file ByteStreamMergeOutputSvc.cxx.

80  {
81  // get original event
82  const RawEvent* orgEvent = m_inSvc->currentEvent();
83 
84  ATH_MSG_DEBUG("original BS size = " << 4 * orgEvent->fragment_size_word());
85  ATH_MSG_DEBUG("athena BS size = " << 4 * newEvent->fragment_size_word());
86 
87  // do the merge...
88  // get all the ROBFragments
89  const size_t MAX_ROBFRAGMENTS = 2048;
90  OFFLINE_FRAGMENTS_NAMESPACE::PointerType orgRobF[MAX_ROBFRAGMENTS];
91  OFFLINE_FRAGMENTS_NAMESPACE::PointerType newRobF[MAX_ROBFRAGMENTS];
92  size_t orgrobcount = orgEvent->children(orgRobF, MAX_ROBFRAGMENTS);
93  if (orgrobcount == MAX_ROBFRAGMENTS) {
94  ATH_MSG_ERROR("ROB buffer overflow");
95  return false;
96  }
97  size_t newrobcount = newEvent->children(newRobF,MAX_ROBFRAGMENTS);
98  if (newrobcount == MAX_ROBFRAGMENTS) {
99  ATH_MSG_ERROR("ROB buffer overflow");
100  return false;
101  }
102 
103  ROBMAP robsToAdd;
104  // loop over all ROBs
105  for (size_t irob = 0; irob < orgrobcount; ++irob) {
106  ROBF* rob = new ROBF(orgRobF[irob]);
107  robsToAdd[reducedROBid(rob->source_id())] = rob;
108  ATH_MSG_DEBUG("original ROBFragment, src ID = " << std::hex << rob->source_id());
109  }
110  // now add/overwrite with newly created robs
111  for (size_t irob = 0; irob < newrobcount; ++irob) {
112  ROBF* rob = new ROBF(newRobF[irob]);
113  ROBMAP::const_iterator it = robsToAdd.find(reducedROBid(rob->source_id()));
114  if (it != robsToAdd.end()) {
115  delete it->second;
116  ATH_MSG_DEBUG("overwriting ROBFragment with src ID = " << std::hex << rob->source_id());
117  }
118  robsToAdd[reducedROBid(rob->source_id())] = rob;
119  ATH_MSG_DEBUG("new ROBFragment, src ID = " << std::hex << rob->source_id());
120  }
121  RawEventWrite* mergedEventWrite = new RawEventWrite();
122  // copy header
123  const RawEvent *event = orgEvent;
124  if (m_overwriteHeader) {
125  event = newEvent;
126  }
127  mergedEventWrite->source_id(event->source_id());
128  mergedEventWrite->bc_time_seconds(event->bc_time_seconds());
129  mergedEventWrite->bc_time_nanoseconds(event->bc_time_nanoseconds());
130  mergedEventWrite->global_id(event->global_id());
131  mergedEventWrite->run_type(event->run_type());
132  mergedEventWrite->run_no(event->run_no());
133  mergedEventWrite->lumi_block(event->lumi_block());
134  mergedEventWrite->lvl1_id(event->lvl1_id());
135  mergedEventWrite->bc_id(event->bc_id());
136  mergedEventWrite->lvl1_trigger_type(event->lvl1_trigger_type());
138  event->status(tmp);
139  mergedEventWrite->status(event->nstatus(), tmp);
140  event->lvl1_trigger_info(tmp);
141  mergedEventWrite->lvl1_trigger_info(event->nlvl1_trigger_info(), tmp);
142  event->lvl2_trigger_info(tmp);
143  mergedEventWrite->lvl2_trigger_info(event->nlvl2_trigger_info(), tmp);
144  event->event_filter_info(tmp);
145  mergedEventWrite->event_filter_info(event->nevent_filter_info(), tmp);
146  event->stream_tag(tmp);
147  mergedEventWrite->stream_tag(event->nstream_tag(), tmp);
148  mergedEventWrite->checksum_type(event->checksum_type());
149  // copy robs
150  for(ROBMAP::iterator it = robsToAdd.begin(), itEnd = robsToAdd.end(); it != itEnd; ++it) {
151  mergedEventWrite->append(it->second);
152  }
153  // convert RawEventWrite to RawEvent
154  uint32_t rawSize = mergedEventWrite->size_word();
156  uint32_t count = eformat::write::copy(*(mergedEventWrite->bind()), buffer, rawSize);
157  if (count != rawSize) {
158  ATH_MSG_ERROR("Memcopy failed " << count << " " << rawSize);
159  return false;
160  }
161  RawEvent newRawEvent(buffer);
162  StatusCode sc = m_outSvc->putEvent(&newRawEvent) ? StatusCode::SUCCESS : StatusCode::FAILURE;
163  for(ROBMAP::iterator it = robsToAdd.begin(), itEnd = robsToAdd.end(); it != itEnd; ++it) {
164  delete it->second; it->second = 0;
165  }
166  delete mergedEventWrite; mergedEventWrite = 0;
167  delete [] buffer;
168  if (sc != StatusCode::SUCCESS) {
169  ATH_MSG_ERROR("Failed to put RawEvent");
170  }
171  return(true);
172 }

◆ putEvent() [2/2]

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

context-aware method for writing the event

Implements ByteStreamOutputSvc.

Definition at line 174 of file ByteStreamMergeOutputSvc.cxx.

174  {
175  ATH_MSG_FATAL(name() << " does not implement the context-aware putEvent method");
176  return false;
177 }

◆ queryInterface()

StatusCode ByteStreamMergeOutputSvc::queryInterface ( const InterfaceID &  riid,
void **  ppvInterface 
)
override

Required of all Gaudi services: see Gaudi documentation for details.

Definition at line 179 of file ByteStreamMergeOutputSvc.cxx.

179  {
180  if (ByteStreamOutputSvc::interfaceID().versionMatch(riid)) {
181  *ppvInterface = dynamic_cast<ByteStreamOutputSvc*>(this);
182  } else {
183  // Interface is not directly available: try out a base class
184  return(::AthService::queryInterface(riid, ppvInterface));
185  }
186  addRef();
187  return(StatusCode::SUCCESS);
188 }

◆ reducedROBid()

uint32_t ByteStreamMergeOutputSvc::reducedROBid ( uint32_t  source_id)
private

Definition at line 70 of file ByteStreamMergeOutputSvc.cxx.

70  {
71  eformat::helper::SourceIdentifier id = eformat::helper::SourceIdentifier(source_id);
72  if (id.subdetector_id() == eformat::TDAQ_LVL2 || id.subdetector_id() == eformat::TDAQ_EVENT_FILTER) {
73  return(eformat::helper::SourceIdentifier(id.subdetector_id(), 0).code());
74  } else {
75  return(source_id);
76  }
77 }

Member Data Documentation

◆ m_bsOutputStreamName

Gaudi::Property<std::string> ByteStreamMergeOutputSvc::m_bsOutputStreamName
private

stream name for multiple output

Definition at line 45 of file ByteStreamMergeOutputSvc.h.

◆ m_inSvc

ByteStreamInputSvc* ByteStreamMergeOutputSvc::m_inSvc
private

Definition at line 43 of file ByteStreamMergeOutputSvc.h.

◆ m_inSvcName

Gaudi::Property<std::string> ByteStreamMergeOutputSvc::m_inSvcName
private

Definition at line 41 of file ByteStreamMergeOutputSvc.h.

◆ m_outSvc

ByteStreamOutputSvc* ByteStreamMergeOutputSvc::m_outSvc
private

Definition at line 44 of file ByteStreamMergeOutputSvc.h.

◆ m_outSvcName

Gaudi::Property<std::string> ByteStreamMergeOutputSvc::m_outSvcName
private

Definition at line 42 of file ByteStreamMergeOutputSvc.h.

◆ m_overwriteHeader

Gaudi::Property<bool> ByteStreamMergeOutputSvc::m_overwriteHeader
private

Definition at line 46 of file ByteStreamMergeOutputSvc.h.


The documentation for this class was generated from the following files:
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
RawEventWrite
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::FullEventFragment RawEventWrite
data type for writing raw event
Definition: RawEvent.h:39
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
OFFLINE_FRAGMENTS_NAMESPACE::DataType
uint32_t DataType
Definition: RawEvent.h:24
ByteStreamInputSvc
This class provides the base class to services to read bytestream data. The concrete class can provid...
Definition: ByteStreamInputSvc.h:23
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
ByteStreamOutputSvc::putEvent
virtual bool putEvent(const RawEvent *re)=0
virtual method for writing the event
initialize
void initialize()
Definition: run_EoverP.cxx:894
RawEvent
OFFLINE_FRAGMENTS_NAMESPACE::FullEventFragment RawEvent
data type for reading raw event
Definition: RawEvent.h:37
skel.it
it
Definition: skel.GENtoEVGEN.py:423
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
ROBF
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment ROBF
Definition: ByteStreamMergeOutputSvc.cxx:16
OFFLINE_FRAGMENTS_NAMESPACE::PointerType
const DataType * PointerType
Definition: RawEvent.h:25
createCoolChannelIdFile.buffer
buffer
Definition: createCoolChannelIdFile.py:12
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
ByteStreamMergeOutputSvc::m_outSvc
ByteStreamOutputSvc * m_outSvc
Definition: ByteStreamMergeOutputSvc.h:44
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ByteStreamMergeOutputSvc::reducedROBid
uint32_t reducedROBid(uint32_t)
Definition: ByteStreamMergeOutputSvc.cxx:70
ByteStreamMergeOutputSvc::m_bsOutputStreamName
Gaudi::Property< std::string > m_bsOutputStreamName
stream name for multiple output
Definition: ByteStreamMergeOutputSvc.h:45
ByteStreamMergeOutputSvc::m_overwriteHeader
Gaudi::Property< bool > m_overwriteHeader
Definition: ByteStreamMergeOutputSvc.h:46
ByteStreamMergeOutputSvc::m_inSvc
ByteStreamInputSvc * m_inSvc
Definition: ByteStreamMergeOutputSvc.h:43
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
ByteStreamMergeOutputSvc::m_outSvcName
Gaudi::Property< std::string > m_outSvcName
Definition: ByteStreamMergeOutputSvc.h:42
ByteStreamOutputSvc::interfaceID
static const InterfaceID & interfaceID()
Retrieve interface ID.
Definition: ByteStreamOutputSvc.h:43
pmontree.code
code
Definition: pmontree.py:443
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ByteStreamInputSvc::currentEvent
virtual const RawEvent * currentEvent() const =0
virtual method for accessing the current event
ByteStreamOutputSvc::ByteStreamOutputSvc
ByteStreamOutputSvc(const std::string &name, ISvcLocator *svcloc)
constructor
Definition: ByteStreamOutputSvc.cxx:9
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
ByteStreamOutputSvc
This class provides the base class to services to write bytestream data. The concrete class can provi...
Definition: ByteStreamOutputSvc.h:25
calibdata.copy
bool copy
Definition: calibdata.py:27
ROBMAP
std::map< uint32_t, ROBF * > ROBMAP
Definition: ByteStreamMergeOutputSvc.cxx:17
ByteStreamMergeOutputSvc::m_inSvcName
Gaudi::Property< std::string > m_inSvcName
Definition: ByteStreamMergeOutputSvc.h:41