11 #include <tracking/modules/pxdDataReduction/ROISenderModule.h>
29 Module(), m_messageQueueNameCstring(NULL)
32 setDescription(
"Send the ROI payload to the external ring buffer");
34 addParam(
"MessageQueueName", m_messageQueueName,
"name of the output message queue", std::string(
"/roi"));
35 addParam(
"ROIpayloadName", m_ROIpayloadName,
"name of the payload of ROIs", std::string(
""));
36 addParam(
"MessageQueueDepth", m_messageQueueDepth,
"depth of the output message queue", 10);
37 addParam(
"MessageSize", m_messageQueueMsgSize,
"max size of themessage", 8192);
39 B2INFO(
"ROI Sender created");
44 ROISenderModule::initialize()
47 m_eventMetaData.isRequired();
48 m_roiPayload.isRequired(m_ROIpayloadName);
50 m_messageQueueNameCstring = m_messageQueueName.c_str();
52 bool slashFree = (NULL == strchr(m_messageQueueNameCstring + 1 ,
'/'));
54 if (! slashFree || m_messageQueueNameCstring[0] !=
'/')
55 B2FATAL(__FILE__ <<
":" << __LINE__ <<
56 m_messageQueueName <<
" invalid. cfr: man mq_overview ");
58 m_histo.resize(101, 0);
61 openMessageQueue(
"on initialize");
67 ROISenderModule::event()
70 int length = m_roiPayload->getPacketLengthByte();
71 const char* data = (
const char*) m_roiPayload->getRootdata();
75 if (length <= m_messageQueueMsgSize) {
76 ret = mq_send(m_messageQueue, data, length, 0 );
78 if (ret == (mqd_t) - 1) {
79 B2FATAL(std::string(__FILE__) <<
":" << __LINE__ <<
85 B2FATAL(std::string(__FILE__) <<
":" << __LINE__ <<
86 "ROI payload too long." << endl <<
87 "Payload length = " << length << endl <<
88 "Message max length = " << m_messageQueueMsgSize << endl <<
89 "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"
96 unsigned long long int meta_time = m_eventMetaData->getTime();
98 using namespace std::chrono;
99 nanoseconds ns = duration_cast< nanoseconds >(system_clock::now().time_since_epoch());
100 Float_t deltaT = (std::chrono::duration_cast<seconds> (ns - (nanoseconds)meta_time)).count();
103 }
else if (deltaT < 100) {
104 m_histo[int(deltaT)]++;
109 B2ERROR(
"Event took too long on HLT, PXD data for Event might be lost!" <<
LogVar(
"deltaT in s", deltaT));
110 }
else if (deltaT > 30) {
111 B2WARNING(
"Event took too long on HLT, PXD data for Event might be lost!" <<
LogVar(
"deltaT in s", deltaT));
119 ROISenderModule::terminate()
121 closeMessageQueue(
"on terminate");
123 string str =
"HLT Delay time distribution: ( ";
124 for (
auto& a : m_histo) str += to_string(a) +
";";
130 ROISenderModule::openMessageQueue(
const char* log_string)
134 attr.mq_maxmsg = m_messageQueueDepth;
135 attr.mq_msgsize = m_messageQueueMsgSize;
137 int oflags = O_WRONLY ;
138 mode_t mode = S_IRUSR | S_IWUSR | S_IROTH | S_IRGRP ;
141 mqd_t ret = mq_open(m_messageQueueNameCstring, oflags, mode, &attr);
144 if (ret == (mqd_t) - 1)
145 B2FATAL(std::string(__FILE__) <<
":" <<
146 __LINE__ <<
": error: " <<
148 " on mq_open " << log_string);
150 m_messageQueue = ret;
155 ROISenderModule::closeMessageQueue(
const char* log_string)
159 ret = mq_close(m_messageQueue);
160 if (ret == (mqd_t) - 1)
161 B2WARNING(std::string(__FILE__) <<
":" <<
162 __LINE__ <<
": error: " <<
164 " on mq_close " << log_string);
171 ROISenderModule::unlinkMessageQueue(
const char* log_string)
174 ret = mq_unlink(m_messageQueueNameCstring);
175 if (ret == (mqd_t) - 1)
176 B2WARNING(std::string(__FILE__) <<
":" <<
177 __LINE__ <<
": error: " <<
179 " on mq_unlink " << log_string);