10 #include <pxd/modules/pxdUnpacking/PXDReadRawONSEN.h>
11 #include <pxd/unpacking/PXDRawDataDefinitions.h>
13 #include <framework/datastore/StoreArray.h>
15 #include <boost/spirit/home/support/detail/endian.hpp>
21 using namespace boost::spirit::endian;
37 setDescription(
"Read a Raw PXD-Data Dump from ONSEN (or a simulator) and stores it as RawPXD in Data Store");
41 addParam(
"FileName", m_filename,
"file name");
42 addParam(
"SetEvtMeta", m_setEvtMeta,
"Set Event MEta Info from DHE",
true);
45 m_compressionLevel = 0;
46 m_buffer =
new int[MAXEVTSIZE];
48 B2DEBUG(29,
"PXDReadRawONSENModule: Constructor done.");
52 PXDReadRawONSENModule::~PXDReadRawONSENModule()
57 void PXDReadRawONSENModule::initialize()
61 fh = fopen(m_filename.c_str(),
"rb");
63 B2INFO(
"Read Raw ONSEN Data from " << m_filename);
65 B2ERROR(
"Could not open Raw ONSEN Data: " << m_filename);
69 m_msghandler =
new MsgHandler(m_compressionLevel);
72 m_eventMetaDataPtr.registerInDataStore();
76 storeRawPIDs.registerInDataStore();
78 B2DEBUG(29,
"PXDReadRawONSENModule: initialized.");
81 int PXDReadRawONSENModule::read_data(
char* data,
size_t len)
84 if (fh) l = fread(data, 1, len, fh);
85 if (l != len)
return 0;
89 int PXDReadRawONSENModule::readOneEvent()
91 char* data = (
char*)m_buffer;
92 int len = MAXEVTSIZE *
sizeof(int);
94 #define MAX_PXD_FRAMES 256
95 const int headerlen = 8;
96 ubig32_t* pxdheader = (ubig32_t*) data;
97 ubig32_t* pxdheadertable = (ubig32_t*) &data[headerlen];
98 int framenr = 0, tablelen = 0, datalen = 0;
99 int br = read_data(data, headerlen);
100 if (br <= 0)
return br;
101 if (pxdheader[0] != 0xCAFEBABEu) {
102 B2FATAL(Form(
"pxdheader wrong : Magic %X , Frames %X \n", (
unsigned int) pxdheader[0], (
unsigned int) pxdheader[1]));
105 framenr = pxdheader[1];
106 if (framenr > MAX_PXD_FRAMES) {
107 B2FATAL(Form(
"MAX_PXD_FRAMES too small : %d(%d) \n", framenr, MAX_PXD_FRAMES));
110 tablelen = 4 * framenr;
111 br = read_data((
char*)&data[headerlen], tablelen);
112 if (br <= 0)
return br;
113 for (
int i = 0; i < framenr; i++) {
114 datalen += (pxdheadertable[i] + 3) & 0xFFFFFFFC;
117 if (datalen + headerlen + tablelen > len) {
118 B2FATAL(Form(
"buffer too small : %d %d %d(%d) \n", headerlen, tablelen, datalen, len));
121 int bcount = read_data(data + headerlen + tablelen, datalen);
122 if (br <= 0)
return br;
123 return (headerlen + tablelen + bcount);
126 void PXDReadRawONSENModule::event()
129 B2ERROR(
"Unexpected close of dump file.");
139 stat = readOneEvent();
153 m_eventMetaDataPtr.create();
154 for (
auto& it : rawpxdary) {
155 if (getTrigNr(it))
break;
164 void PXDReadRawONSENModule::terminate()
171 bool PXDReadRawONSENModule::getTrigNr(
RawPXD& px)
177 if (px.
size() <= 0 || px.
size() > 16 * 1024 * 1024) {
178 B2ERROR(
"PXD Trigger Shifter --> invalid packet size (32bit words) " << hex << px.
size());
181 std::vector<unsigned int> data(px.
size());
182 fullsize = px.
size() * 4;
183 std::copy_n(px.
data(), px.
size(), data.begin());
187 B2ERROR(
"Data is to small to hold a valid Header! Will not unpack anything. Size:" << fullsize);
191 if (data[0] != 0xCAFEBABE && data[0] != 0xBEBAFECA) {
192 B2ERROR(
"Magic invalid: Will not unpack anything. Header corrupted! " << hex << data[0]);
196 Frames_in_event = ((ubig32_t*)data.data())[1];
197 if (Frames_in_event < 1 || Frames_in_event > 250) {
198 B2ERROR(
"Number of Frames invalid: Will not unpack anything. Header corrupted! Frames in event: " << Frames_in_event);
202 unsigned int* tableptr;
205 unsigned int* dataptr;
206 dataptr = &tableptr[Frames_in_event];
207 datafullsize = fullsize - 2 * 4 - Frames_in_event * 4;
210 for (
int j = 0; j < Frames_in_event; j++) {
212 lo = ((ubig32_t*)tableptr)[j];
214 B2ERROR(
"size of frame invalid: " << j <<
"size " << lo <<
" at byte offset in dataptr " << ll);
217 if (ll + lo > datafullsize) {
218 B2ERROR(
"frames exceed packet size: " << j <<
" size " << lo <<
" at byte offset in dataptr " << ll <<
" of datafullsize " <<
219 datafullsize <<
" of fullsize " << fullsize);
223 B2ERROR(
"SKIP Frame with Data with not MOD 4 length " <<
" ( $" << hex << lo <<
" ) ");
224 ll += (lo + 3) & 0xFFFFFFFC;
226 if (unpack_dhc_frame(ll + (
char*)dataptr))
return true;
233 bool PXDReadRawONSENModule::unpack_dhc_frame(
void* data)
235 switch (((*(ubig16_t*)data) & 0x7800) >> 11) {
236 case EDHCFrameHeaderDataType::c_ONSEN_TRG: {
237 unsigned int trignr = ((ubig32_t*)data)[2];
238 unsigned int tag = ((ubig32_t*)data)[3];
240 B2INFO(
"Set event and exp/run from ONSEN: $" << hex << trignr <<
", $" << hex << tag);
241 m_eventMetaDataPtr->setEvent(trignr);
242 m_eventMetaDataPtr->setRun((tag & 0x003FFF00) >> 8);
243 m_eventMetaDataPtr->setSubrun(tag & 0xFF);
244 m_eventMetaDataPtr->setExperiment((tag & 0xFFC00000) >> 22);
245 m_eventMetaDataPtr->setTime(0);
248 case EDHCFrameHeaderDataType::c_DHC_START: {
249 unsigned int time_tag_lo_and_type = ((ubig16_t*)data)[3];
250 unsigned int time_tag_mid = ((ubig16_t*)data)[4];
251 unsigned int time_tag_hi = ((ubig16_t*)data)[5];
252 B2INFO(
"Set time tag from DHC: $" << hex << time_tag_mid <<
", $" << hex << time_tag_lo_and_type);
253 uint32_t tt = ((time_tag_mid & 0x7FFF) << 12) | (time_tag_lo_and_type >> 4);
256 m_eventMetaDataPtr->setTime((
unsigned long long int)((time_tag_hi << 1) + ((time_tag_mid & 0x8000) ? 1 : 0)) * 1000000000 +
257 (int)std::round(tt / 0.127216));