Belle II Software development
PXDRawDumper.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <pxd/modules/pxdHelper/PXDRawDumper.h>
10#include <rawdata/dataobjects/RawPXD.h>
11#include <boost/format.hpp>
12#include <boost/endian/arithmetic.hpp>
13
14using namespace std;
15using namespace Belle2;
16using namespace PXD;
17
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;
22
23//-----------------------------------------------------------------
24// Register the Module
25//-----------------------------------------------------------------
26REG_MODULE(PXDRawDumper);
27
29{
30 m_storeRaw.isRequired();
31}
32
34{
35 // erst mal muss man die beiden trigger nummern finden ...
36
37 unsigned int pxdTriggerNr = 0x0, tag = 0x0;
38 for (auto& it : m_storeRaw) {
39 if (getTrigNr(it, pxdTriggerNr, tag)) break; // only first (valid) one
40 }
41
42 if (pxdTriggerNr != 0x0 && tag != 0x0) {
43 } else { // else if put same upcounter in
44 static int nr1 = 1000, nr2 = 1000;
45 pxdTriggerNr = nr1++;
46 tag = nr2++;
47 }
48 {
49 int i = 0;
50 for (auto& it : m_storeRaw) {
51 FILE* fh;
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+");
55 if (fh) {
56 fwrite(it.data(), 4, it.size(), fh);
57 fclose(fh);
58 }
59 i++;
60 }
61 }
62}
63
64
65bool PXDRawDumperModule::getTrigNr(RawPXD& px, unsigned int& innerDHH, unsigned int& tag)
66{
67 int Frames_in_event;
68 int fullsize;
69 int datafullsize;
70
71 if (px.size() <= 0 || px.size() > 16 * 1024 * 1024) {
72 B2ERROR("PXD Unpacker --> invalid packet size (32bit words) " << hex << px.size());
73 return false;
74 }
75 std::vector<unsigned int> data(px.size());
76 fullsize = px.size() * 4;
77 std::copy_n(px.data(), px.size(), data.begin());
78
79
80 if (fullsize < 8) {
81 B2ERROR("Data is to small to hold a valid Header! Will not unpack anything. Size:" << fullsize);
82 return false;
83 }
84
85 if (data[0] != 0xCAFEBABE && data[0] != 0xBEBAFECA) {
86 B2ERROR("Magic invalid: Will not unpack anything. Header corrupted! " << hex << data[0]);
87 return false;
88 }
89
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));
93 return false;
94 }
95
96 unsigned int* tableptr;
97 tableptr = &data[2]; // skip header!!!
98
99 unsigned int* dataptr;
100 dataptr = &tableptr[Frames_in_event];
101 datafullsize = fullsize - 2 * 4 - Frames_in_event * 4; // minus header, minus table
102
103 int ll = 0; // Offset in dataptr in bytes
104 for (int j = 0; j < Frames_in_event; j++) {
105 int lo;
106 lo = ((ubig32_t*)tableptr)[j];
107 if (lo <= 0) {
108 B2ERROR("size of frame invalid: " << j << "size " << lo << " at byte offset in dataptr " << ll);
109 return false;
110 }
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);
114 return false;
115 }
116 if (lo & 0x3) {
117 B2ERROR("SKIP Frame with Data with not MOD 4 length " << " ( $" << hex << lo << " ) ");
118 ll += (lo + 3) & 0xFFFFFFFC;
119 } else {
120 B2INFO("unpack DHE(C) frame: " << j << " with size " << lo << " at byte offset in dataptr " << ll);
121 if (unpack_dhc_frame(ll + (char*)dataptr, innerDHH, tag)) return true;
122 ll += lo;
123 }
124 }
125 return false;
126}
127
128bool PXDRawDumperModule::unpack_dhc_frame(void* data, unsigned int& innerDHH, unsigned int& tag)
129{
130// DHC envelope, new
131#define DHC_FRAME_HEADER_DATA_TYPE_DHC_START 0xB
132#define DHC_FRAME_HEADER_DATA_TYPE_DHC_END 0xC
133
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];
138 tag = ((ubig32_t*)data)[3];
139 return true;
140 }
141 default:
142 break;
143
144 }
145 return false;
146}
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.
The Raw PXD class.
Definition RawPXD.h:27
virtual int * data(void)
get pointer to data
Definition RawPXD.cc:81
virtual int size() const
get size of buffer in 32 Bit words
Definition RawPXD.cc:76
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
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.
STL namespace.