9#include <pxd/modules/pxdHelper/PXDRawDumper.h>
10#include <rawdata/dataobjects/RawPXD.h>
11#include <boost/format.hpp>
12#include <boost/endian/arithmetic.hpp>
18using ulittle16_t = boost::endian::little_uint16_t;
19using ulittle32_t = boost::endian::little_uint32_t;
20using ubig16_t = boost::endian::big_uint16_t;
21using ubig32_t = boost::endian::big_uint32_t;
37 unsigned int pxdTriggerNr = 0x0, tag = 0x0;
39 if (
getTrigNr(it, pxdTriggerNr, tag))
break;
42 if (pxdTriggerNr != 0x0 && tag != 0x0) {
44 static int nr1 = 1000, nr2 = 1000;
52 string name = boost::str(boost::format(
"%08X_%08X_%d.pxd.dump") % tag % pxdTriggerNr % i);
53 B2ERROR(
"PXDRawDumper: Dump to " << name);
54 fh = fopen(name.c_str(),
"wt+");
56 fwrite(it.data(), 4, it.size(), fh);
71 if (px.
size() <= 0 || px.
size() > 16 * 1024 * 1024) {
72 B2ERROR(
"PXD Unpacker --> invalid packet size (32bit words) " << hex << px.
size());
75 std::vector<unsigned int> data(px.
size());
76 fullsize = px.
size() * 4;
77 std::copy_n(px.
data(), px.
size(), data.begin());
81 B2ERROR(
"Data is to small to hold a valid Header! Will not unpack anything. Size:" << fullsize);
85 if (data[0] != 0xCAFEBABE && data[0] != 0xBEBAFECA) {
86 B2ERROR(
"Magic invalid: Will not unpack anything. Header corrupted! " << hex << data[0]);
90 Frames_in_event = ((
ubig32_t*)data.data())[1];
91 if (Frames_in_event < 0 || Frames_in_event > 256) {
92 B2ERROR(
"Number of Frames invalid: Will not unpack anything. Header corrupted! Frames in event: " << to_string(Frames_in_event));
96 unsigned int* tableptr;
99 unsigned int* dataptr;
100 dataptr = &tableptr[Frames_in_event];
101 datafullsize = fullsize - 2 * 4 - Frames_in_event * 4;
104 for (
int j = 0; j < Frames_in_event; j++) {
108 B2ERROR(
"size of frame invalid: " << j <<
"size " << lo <<
" at byte offset in dataptr " << ll);
111 if (ll + lo > datafullsize) {
112 B2ERROR(
"frames exceed packet size: " << j <<
" size " << lo <<
" at byte offset in dataptr " << ll <<
" of datafullsize " <<
113 datafullsize <<
" of fullsize " << fullsize);
117 B2ERROR(
"SKIP Frame with Data with not MOD 4 length " <<
" ( $" << hex << lo <<
" ) ");
118 ll += (lo + 3) & 0xFFFFFFFC;
120 B2INFO(
"unpack DHE(C) frame: " << j <<
" with size " << lo <<
" at byte offset in dataptr " << ll);
131#define DHC_FRAME_HEADER_DATA_TYPE_DHC_START 0xB
132#define DHC_FRAME_HEADER_DATA_TYPE_DHC_END 0xC
134 switch (((*(
ubig16_t*)data) & 0x7800) >> 11) {
135 case DHC_FRAME_HEADER_DATA_TYPE_DHC_START: {
136 unsigned int hi = ((
ubig16_t*)data)[2];
137 innerDHH = (hi << 16) | ((
ubig16_t*)data)[1];
bool unpack_dhc_frame(void *data, unsigned int &innerDHH, unsigned int &outerHLT)
Unpack the DHC frame.
StoreArray< RawPXD > m_storeRaw
Store array of RawPXDs.
bool getTrigNr(RawPXD &px, unsigned int &innerDHH, unsigned int &outerHLT)
Get the trigger number.
void event(void) override
Event.
void initialize(void) override
Initialize.
virtual int * data(void)
get pointer to data
virtual int size() const
get size of buffer in 32 Bit words
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Namespace to encapsulate code needed for simulation and reconstrucion of the PXD.
boost::endian::big_uint16_t ubig16_t
define alias ubig16_t
boost::endian::big_uint32_t ubig32_t
define alias ubig32_t
Abstract base class for different kinds of events.