9 #include <tracking/modules/pxdDataReduction/ROISenderModule.h>
27 Module(), m_messageQueueNameCstring(
nullptr)
30 setDescription(
"Send the ROI payload to the external ring buffer");
32 addParam(
"MessageQueueName", m_messageQueueName,
"name of the output message queue", std::string(
"/roi"));
33 addParam(
"ROIpayloadName", m_ROIpayloadName,
"name of the payload of ROIs", std::string(
""));
34 addParam(
"MessageQueueDepth", m_messageQueueDepth,
"depth of the output message queue", 10);
35 addParam(
"MessageSize", m_messageQueueMsgSize,
"max size of themessage", 8192);
37 B2INFO(
"ROI Sender created");
42 ROISenderModule::initialize()
45 m_eventMetaData.isRequired();
46 m_roiPayload.isRequired(m_ROIpayloadName);
48 m_messageQueueNameCstring = m_messageQueueName.c_str();
50 bool slashFree = (
nullptr == strchr(m_messageQueueNameCstring + 1 ,
'/'));
52 if (! slashFree || m_messageQueueNameCstring[0] !=
'/')
53 B2FATAL(__FILE__ <<
":" << __LINE__ <<
54 m_messageQueueName <<
" invalid. cfr: man mq_overview ");
56 m_histo.resize(101, 0);
59 openMessageQueue(
"on initialize");
65 ROISenderModule::event()
68 int length = m_roiPayload->getPacketLengthByte();
69 const char* data = (
const char*) m_roiPayload->getRootdata();
73 if (length <= m_messageQueueMsgSize) {
74 ret = mq_send(m_messageQueue, data, length, 0 );
76 if (ret == (mqd_t) - 1) {
77 B2FATAL(std::string(__FILE__) <<
":" << __LINE__ <<
83 B2FATAL(std::string(__FILE__) <<
":" << __LINE__ <<
84 "ROI payload too long." << endl <<
85 "Payload length = " << length << endl <<
86 "Message max length = " << m_messageQueueMsgSize << endl <<
87 "We stop here, as this will result in event mismatch on EB! Please increase mqueue message length on HLT and/or check size limit in ROIPayload Assembler"
94 unsigned long long int meta_time = m_eventMetaData->getTime();
96 using namespace std::chrono;
97 nanoseconds ns = duration_cast< nanoseconds >(system_clock::now().time_since_epoch());
98 Float_t deltaT = (std::chrono::duration_cast<seconds> (ns - (nanoseconds)meta_time)).count();
101 }
else if (deltaT < 100) {
102 m_histo[int(deltaT)]++;
107 B2ERROR(
"Event took too long on HLT, PXD data for Event might be lost!" <<
LogVar(
"deltaT in s", deltaT));
108 }
else if (deltaT > 30) {
109 B2WARNING(
"Event took too long on HLT, PXD data for Event might be lost!" <<
LogVar(
"deltaT in s", deltaT));
117 ROISenderModule::terminate()
119 closeMessageQueue(
"on terminate");
121 string str =
"HLT Delay time distribution: ( ";
122 for (
auto& a : m_histo) str += to_string(a) +
";";
128 ROISenderModule::openMessageQueue(
const char* log_string)
132 attr.mq_maxmsg = m_messageQueueDepth;
133 attr.mq_msgsize = m_messageQueueMsgSize;
135 int oflags = O_WRONLY ;
136 mode_t mode = S_IRUSR | S_IWUSR | S_IROTH | S_IRGRP ;
139 mqd_t ret = mq_open(m_messageQueueNameCstring, oflags, mode, &attr);
142 if (ret == (mqd_t) - 1)
143 B2FATAL(std::string(__FILE__) <<
":" <<
144 __LINE__ <<
": error: " <<
146 " on mq_open " << log_string);
148 m_messageQueue = ret;
153 ROISenderModule::closeMessageQueue(
const char* log_string)
157 ret = mq_close(m_messageQueue);
158 if (ret == (mqd_t) - 1)
159 B2WARNING(std::string(__FILE__) <<
":" <<
160 __LINE__ <<
": error: " <<
162 " on mq_close " << log_string);
169 ROISenderModule::unlinkMessageQueue(
const char* log_string)
172 ret = mq_unlink(m_messageQueueNameCstring);
173 if (ret == (mqd_t) - 1)
174 B2WARNING(std::string(__FILE__) <<
":" <<
175 __LINE__ <<
": error: " <<
177 " on mq_unlink " << log_string);
Class to store variables with their name which were sent to the logging service.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.