Belle II Software  release-05-01-25
PXDRawDumper.cc
1 //+
2 // File : PXDRawDumperModule.cc
3 // Description : Dump Raw Desy 2016 ONSEN event data
4 //
5 // Author : Bjoern Spruck
6 // Date : Updated on 20 - Jun - 2016
7 //-
8 
9 #include <pxd/modules/pxdHelper/PXDRawDumper.h>
10 #include <boost/format.hpp>
11 #include <boost/spirit/home/support/detail/endian.hpp>
12 
13 using namespace std;
14 using namespace Belle2;
15 using namespace PXD;
16 
17 using namespace boost::spirit::endian;
18 
19 //-----------------------------------------------------------------
20 // Register the Module
21 //-----------------------------------------------------------------
22 REG_MODULE(PXDRawDumper)
23 
24 void PXDRawDumperModule::initialize(void)
25 {
26  m_storeRaw.isRequired();
27 }
28 
29 void PXDRawDumperModule::event(void)
30 {
31  // erst mal muss man die beiden trigger nummern finden ...
32 
33  unsigned int pxdTriggerNr = 0x0, tag = 0x0;
34  for (auto& it : m_storeRaw) {
35  if (getTrigNr(it, pxdTriggerNr, tag)) break; // only first (valid) one
36  }
37 
38  if (pxdTriggerNr != 0x0 && tag != 0x0) {
39  } else { // else if put same upcounter in
40  static int nr1 = 1000, nr2 = 1000;
41  pxdTriggerNr = nr1++;
42  tag = nr2++;
43  }
44  {
45  int i = 0;
46  for (auto& it : m_storeRaw) {
47  FILE* fh;
48  string name = boost::str(boost::format("%08X_%08X_%d.pxd.dump") % tag % pxdTriggerNr % i);
49  B2ERROR("PXDRawDumper: Dump to " << name);
50  fh = fopen(name.c_str(), "wt+");
51  if (fh) {
52  fwrite(it.data(), 4, it.size(), fh);
53  fclose(fh);
54  }
55  i++;
56  }
57  }
58 }
59 
60 
61 bool PXDRawDumperModule::getTrigNr(RawPXD& px, unsigned int& innerDHH, unsigned int& tag)
62 {
63  int Frames_in_event;
64  int fullsize;
65  int datafullsize;
66 
67  if (px.size() <= 0 || px.size() > 16 * 1024 * 1024) {
68  B2ERROR("PXD Unpacker --> invalid packet size (32bit words) " << hex << px.size());
69  return false;
70  }
71  std::vector<unsigned int> data(px.size());
72  fullsize = px.size() * 4;
73  std::copy_n(px.data(), px.size(), data.begin());
74 
75 
76  if (fullsize < 8) {
77  B2ERROR("Data is to small to hold a valid Header! Will not unpack anything. Size:" << fullsize);
78  return false;
79  }
80 
81  if (data[0] != 0xCAFEBABE && data[0] != 0xBEBAFECA) {
82  B2ERROR("Magic invalid: Will not unpack anything. Header corrupted! " << hex << data[0]);
83  return false;
84  }
85 
86  Frames_in_event = ((ubig32_t*)data.data())[1];
87  if (Frames_in_event < 0 || Frames_in_event > 256) {
88  B2ERROR("Number of Frames invalid: Will not unpack anything. Header corrupted! Frames in event: " << Frames_in_event);
89  return false;
90  }
91 
92  unsigned int* tableptr;
93  tableptr = &data[2]; // skip header!!!
94 
95  unsigned int* dataptr;
96  dataptr = &tableptr[Frames_in_event];
97  datafullsize = fullsize - 2 * 4 - Frames_in_event * 4; // minus header, minus table
98 
99  int ll = 0; // Offset in dataptr in bytes
100  for (int j = 0; j < Frames_in_event; j++) {
101  int lo;
102  lo = ((ubig32_t*)tableptr)[j];
103  if (lo <= 0) {
104  B2ERROR("size of frame invalid: " << j << "size " << lo << " at byte offset in dataptr " << ll);
105  return false;
106  }
107  if (ll + lo > datafullsize) {
108  B2ERROR("frames exceed packet size: " << j << " size " << lo << " at byte offset in dataptr " << ll << " of datafullsize " <<
109  datafullsize << " of fullsize " << fullsize);
110  return false;
111  }
112  if (lo & 0x3) {
113  B2ERROR("SKIP Frame with Data with not MOD 4 length " << " ( $" << hex << lo << " ) ");
114  ll += (lo + 3) & 0xFFFFFFFC;
115  } else {
116  B2INFO("unpack DHE(C) frame: " << j << " with size " << lo << " at byte offset in dataptr " << ll);
117  if (unpack_dhc_frame(ll + (char*)dataptr, innerDHH, tag)) return true;
118  ll += lo;
119  }
120  }
121  return false;
122 }
123 
124 bool PXDRawDumperModule::unpack_dhc_frame(void* data, unsigned int& innerDHH, unsigned int& tag)
125 {
126 // DHC envelope, new
127 #define DHC_FRAME_HEADER_DATA_TYPE_DHC_START 0xB
128 #define DHC_FRAME_HEADER_DATA_TYPE_DHC_END 0xC
129 
130  switch (((*(ubig16_t*)data) & 0x7800) >> 11) {
131  case DHC_FRAME_HEADER_DATA_TYPE_DHC_START: {
132  unsigned int hi = ((ubig16_t*)data)[2];
133  innerDHH = (hi << 16) | ((ubig16_t*)data)[1];
134  tag = ((ubig32_t*)data)[3];
135  return true;
136  }
137  default:
138  break;
139 
140  }
141  return false;
142 }
Belle2::RawPXD::size
virtual int size() const
get size of buffer in 32 Bit words
Definition: RawPXD.cc:76
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::RawPXD
The Raw PXD class.
Definition: RawPXD.h:28
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::PXD::PXDRawDumperModule
Dump Raw PXD/ ONSEN event data.
Definition: PXDRawDumper.h:25
Belle2::RawPXD::data
virtual int * data(void)
get pointer to data
Definition: RawPXD.cc:81