9#include <pxd/modules/pxdUnpacking/PXDReadRawONSEN.h>
10#include <framework/dataobjects/EventMetaData.h>
11#include <rawdata/dataobjects/RawPXD.h>
12#include <pxd/unpacking/PXDRawDataDefinitions.h>
14#include <framework/datastore/StoreArray.h>
16#include <boost/endian/arithmetic.hpp>
22using ulittle16_t = boost::endian::little_uint16_t;
23using ulittle32_t = boost::endian::little_uint32_t;
24using ubig16_t = boost::endian::big_uint16_t;
25using ubig32_t = boost::endian::big_uint32_t;
41 setDescription(
"Read a Raw PXD-Data Dump from ONSEN (or a simulator) and stores it as RawPXD in Data Store");
52 B2DEBUG(29,
"PXDReadRawONSENModule: Constructor done.");
67 B2INFO(
"Read Raw ONSEN Data from " <<
m_filename);
69 B2ERROR(
"Could not open Raw ONSEN Data: " <<
m_filename);
82 B2DEBUG(29,
"PXDReadRawONSENModule: initialized.");
88 if (
fh) l = fread(data, 1, len,
fh);
89 if (l != len)
return 0;
96 int len = MAXEVTSIZE *
sizeof(int);
98#define MAX_PXD_FRAMES 256
99 const int headerlen = 8;
102 int framenr = 0, tablelen = 0, datalen = 0;
104 if (br <= 0)
return br;
105 if (pxdheader[0] != 0xCAFEBABEu) {
106 B2FATAL(Form(
"pxdheader wrong : Magic %X , Frames %X \n", (
unsigned int) pxdheader[0], (
unsigned int) pxdheader[1]));
109 framenr = pxdheader[1];
110 if (framenr > MAX_PXD_FRAMES) {
111 B2FATAL(Form(
"MAX_PXD_FRAMES too small : %d(%d) \n", framenr, MAX_PXD_FRAMES));
114 tablelen = 4 * framenr;
115 br =
read_data((
char*)&data[headerlen], tablelen);
116 if (br <= 0)
return br;
117 for (
int i = 0; i < framenr; i++) {
118 datalen += (pxdheadertable[i] + 3) & 0xFFFFFFFC;
121 if (datalen + headerlen + tablelen > len) {
122 B2FATAL(Form(
"buffer too small : %d %d %d(%d) \n", headerlen, tablelen, datalen, len));
125 br =
read_data(data + headerlen + tablelen, datalen);
126 if (br <= 0)
return br;
127 return (headerlen + tablelen + br);
133 B2ERROR(
"Unexpected close of dump file.");
158 for (
auto& it : rawpxdary) {
181 if (px.
size() <= 0 || px.
size() > 16 * 1024 * 1024) {
182 B2ERROR(
"PXD Trigger Shifter --> invalid packet size (32bit words) " << hex << px.
size());
185 std::vector<unsigned int> data(px.
size());
186 fullsize = px.
size() * 4;
187 std::copy_n(px.
data(), px.
size(), data.begin());
191 B2ERROR(
"Data is to small to hold a valid Header! Will not unpack anything. Size:" << fullsize);
195 if (data[0] != 0xCAFEBABE && data[0] != 0xBEBAFECA) {
196 B2ERROR(
"Magic invalid: Will not unpack anything. Header corrupted! " << hex << data[0]);
200 Frames_in_event = ((
ubig32_t*)data.data())[1];
201 if (Frames_in_event < 1 || Frames_in_event > 250) {
202 B2ERROR(
"Number of Frames invalid: Will not unpack anything. Header corrupted! Frames in event: " << Frames_in_event);
206 unsigned int* tableptr;
209 unsigned int* dataptr;
210 dataptr = &tableptr[Frames_in_event];
211 datafullsize = fullsize - 2 * 4 - Frames_in_event * 4;
214 for (
int j = 0; j < Frames_in_event; j++) {
218 B2ERROR(
"size of frame invalid: " << j <<
"size " << lo <<
" at byte offset in dataptr " << ll);
221 if (ll + lo > datafullsize) {
222 B2ERROR(
"frames exceed packet size: " << j <<
" size " << lo <<
" at byte offset in dataptr " << ll <<
" of datafullsize " <<
223 datafullsize <<
" of fullsize " << fullsize);
227 B2ERROR(
"SKIP Frame with Data with not MOD 4 length " <<
" ( $" << hex << lo <<
" ) ");
228 ll += (lo + 3) & 0xFFFFFFFC;
239 switch (((*(
ubig16_t*)data) & 0x7800) >> 11) {
240 case EDHCFrameHeaderDataType::c_ONSEN_TRG: {
241 unsigned int trignr = ((
ubig32_t*)data)[2];
242 unsigned int tag = ((
ubig32_t*)data)[3];
244 B2INFO(
"Set event and exp/run from ONSEN: $" << hex << trignr <<
", $" << hex << tag);
252 case EDHCFrameHeaderDataType::c_DHC_START: {
253 unsigned int time_tag_lo_and_type = ((
ubig16_t*)data)[3];
254 unsigned int time_tag_mid = ((
ubig16_t*)data)[4];
255 unsigned int time_tag_hi = ((
ubig16_t*)data)[5];
256 B2INFO(
"Set time tag from DHC: $" << hex << time_tag_mid <<
", $" << hex << time_tag_lo_and_type);
257 uint32_t tt = ((time_tag_mid & 0x7FFF) << 12) | (time_tag_lo_and_type >> 4);
260 m_eventMetaDataPtr->setTime((
unsigned long long int)((time_tag_hi << 1) + ((time_tag_mid & 0x8000) ? 1 : 0)) * 1000000000 +
261 (
int)std::round(tt / 0.127216));
void setDescription(const std::string &description)
Sets the description of the module.
A class to encode/decode an EvtMessage.
void initialize() override final
Initialize.
bool getTrigNr(RawPXD &px)
get the trigger number
int m_nread
No. of sent events.
int read_data(char *data, size_t len)
Read amount of data (len bytes) from file to ptr data.
PXDReadRawONSENModule()
Constructor / Destructor.
~PXDReadRawONSENModule()
Destructor.
bool m_setEvtMeta
Set Event Meta Info.
void terminate() override final
Terminate.
void event() override final
Event.
MsgHandler * m_msghandler
Message handler.
bool unpack_dhc_frame(void *data)
unpack the dhc frame
std::string m_filename
File Name.
int m_compressionLevel
Compression Level.
int readOneEvent(void)
Read data of one Event from File.
StoreObjPtr< EventMetaData > m_eventMetaDataPtr
Event Meta Data.
virtual int * data(void)
get pointer to data
virtual int size() const
get size of buffer in 32 Bit words
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
T * appendNew()
Construct a new T object at the end of the array.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#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.