9#include <pxd/unpacking/PXDRawDataStructs.h>
10#include <pxd/unpacking/PXDRawDataDefinitions.h>
11#include <framework/logging/Logger.h>
13#include <boost/crc.hpp>
31 using ubig16_t = boost::endian::big_uint16_t;
32 using ubig32_t = boost::endian::big_uint32_t;
33 using namespace Belle2::PXD::PXDError;
40 const char* dhc_type_name[16] = {
59 <<
") data " <<
data);
64 if (
word0.data != 0x5800)
return false;
72 if (
crc32 != 0x4829214d)
return false;
85 <<
" CRC $" << std::hex <<
crc32);
94 <<
" DHEID $" << std::hex <<
getDHEId()
98 <<
" CRC " << std::hex <<
crc32);
104 B2DEBUG(99,
"DHC Direct Readout (Raw|ZSD|ONS) Frame TNRLO $" << std::hex <<
trigger_nr_lo <<
" DHE ID $" <<
getDHEId() <<
111 B2DEBUG(99,
"ONSEN Trigger Frame TNRLO $" << std::hex <<
trignr0);
115 bool ignore_hltroi_magic_flag,
116 bool ignore_merger_mm_flag)
const
118 if ((
magic1 & 0xFFFF0000) != 0xCAFE0000) {
119 if (!ignore_hltroi_magic_flag) B2WARNING(
"ONSEN Trigger Magic 1 error $" << std::hex <<
magic1);
120 errorMask[c_nrHLTROI_MAGIC] =
true;
122 if ((
magic2 & 0xFFFF0000) != 0xCAFE0000) {
123 if (!ignore_hltroi_magic_flag) B2WARNING(
"ONSEN Trigger Magic 2 error $" << std::hex <<
magic2);
124 errorMask[c_nrHLTROI_MAGIC] =
true;
127 if (!ignore_datcon_flag) B2INFO(
"ONSEN Trigger Frame: No DATCON data $" << std::hex <<
trignr1 <<
"!=$" <<
trignr2);
128 errorMask[c_nrNO_DATCON] =
true;
131 if (!ignore_merger_mm_flag) B2WARNING(
"ONSEN Trigger Frame Trigger Nr Mismatch $" << std::hex <<
trignr1 <<
"!=$" <<
trignr2);
132 errorMask[c_nrMERGER_TRIGNR] =
true;
141 if (!ignore_inv_size_flag) B2WARNING(
"DHC ONSEN HLT/ROI Frame too small to hold any ROIs!");
142 errorMask[c_nrROI_PACKET_INV_SIZE] =
true;
143 }
else if ((length -
getMinSize()) % 8 != 0) {
144 if (!ignore_inv_size_flag) B2WARNING(
"DHC ONSEN HLT/ROI Frame holds fractional ROIs, last ROI might not be saved!");
145 errorMask[c_nrROI_PACKET_INV_SIZE] =
true;
151 B2DEBUG(99,
"DHC HLT/ROI Frame");
163 unsigned short value = (
word0.data & 0xC) >> 2;
164 if (
word0.data & 0x0400) value |= 0x4;
170 if (
word0.data != 0x6000)
return false;
174 if (
crc32 != 0xF7BCA507)
return false;
180 B2DEBUG(99,
"DHC End Frame TNRLO $" << std::hex <<
trigger_nr_lo <<
" WIEVT $" << std::hex <<
wordsinevent <<
" ERR $" << std::hex
195 case 0:
return ((uint32_t)
errorinfo >> 24) & 0xFF;
196 case 1:
return ((uint32_t)
errorinfo >> 16) & 0xFF;
197 case 2:
return ((uint32_t)
errorinfo >> 8) & 0xFF;
206 case 0:
return ((uint32_t)
errorinfo >> 24) & 0xF;
207 case 1:
return ((uint32_t)
errorinfo >> 16) & 0xF;
208 case 2:
return ((uint32_t)
errorinfo >> 8) & 0xF;
217 case 0:
return ((uint32_t)
errorinfo >> 28) & 0xF;
218 case 1:
return ((uint32_t)
errorinfo >> 20) & 0xF;
219 case 2:
return ((uint32_t)
errorinfo >> 12) & 0xF;
220 case 3:
return ((uint32_t)
errorinfo >> 4) & 0xF;
227 unsigned int crc = *
reinterpret_cast<const ubig32_t*
>(((
reinterpret_cast<const unsigned char*
>(
data)) +
length - 4));
228 if ((crc & 0xFFFF0000) == 0 || (crc & 0xFFFF) == 0) {
230 B2INFO(
"Suspicious Padding $" << std::hex << crc);
231 errorMask[c_nrSUSP_PADDING] =
true;
239 if (
length > 65536 * 16) {
240 if (!ignore_crc_flag) B2WARNING(
"DHC Data Frame CRC not calculated because of too large packet (>1MB)!");
246 c = bocrc.checksum();
249 crc32 = *
reinterpret_cast<const ubig32_t*
>(((
reinterpret_cast<const unsigned char*
>(
data)) +
length - 4));
252 if (!ignore_crc_flag) {
253 B2WARNING(
"DHC Data Frame CRC FAIL");
254 B2DEBUG(1,
"DHC Data Frame CRC FAIL: " << std::hex << c <<
"!=" << crc32 <<
" data "
255 << *
reinterpret_cast<const unsigned int*
>((
reinterpret_cast<const unsigned char*
>(
data)) +
length - 8) <<
" "
256 << *
reinterpret_cast<const unsigned int*
>((
reinterpret_cast<const unsigned char*
>(
data)) +
length - 6) <<
" "
257 << *
reinterpret_cast<const unsigned int*
>((
reinterpret_cast<const unsigned char*
>(
data)) +
length - 4) <<
" len $" <<
length);
259 errorMask[c_nrDHE_CRC] =
true;
268 case EDHCFrameHeaderDataType::c_DHP_RAW:
271 case EDHCFrameHeaderDataType::c_ONSEN_DHP:
272 case EDHCFrameHeaderDataType::c_DHP_ZSD:
275 case EDHCFrameHeaderDataType::c_ONSEN_FCE:
276 case EDHCFrameHeaderDataType::c_FCE_RAW:
279 case EDHCFrameHeaderDataType::c_COMMODE:
282 case EDHCFrameHeaderDataType::c_GHOST:
285 case EDHCFrameHeaderDataType::c_DHE_START:
288 case EDHCFrameHeaderDataType::c_DHE_END:
291 case EDHCFrameHeaderDataType::c_DHC_START:
294 case EDHCFrameHeaderDataType::c_DHC_END:
297 case EDHCFrameHeaderDataType::c_ONSEN_ROI:
300 case EDHCFrameHeaderDataType::c_ONSEN_TRG:
304 B2INFO(
"Error: not a valid data frame!");
const dhc_ghost_frame * data_ghost_frame
data_ghost_frame
const dhc_end_frame * data_dhc_end_frame
data_dhc_end_frame
unsigned int getFixedSize(void)
get fixed size
int getFrameType(void)
get type of frame
const dhc_dhe_start_frame * data_dhe_start_frame
data_dhe_start_frame
const dhc_start_frame * data_dhc_start_frame
data_dhc_start_frame
const dhc_dhe_end_frame * data_dhe_end_frame
data_dhe_end_frame
void check_padding(PXDErrorFlags &errormask)
check padding and return it
const dhc_commode_frame * data_commode_frame
data_commode_frame
void check_crc(PXDErrorFlags &errormask, bool ignore_crc_flag=false)
check crc and return it
unsigned int datasize
datasize
const dhc_onsen_trigger_frame * data_onsen_trigger_frame
data_onsen_trigger_frame
Namespace to encapsulate code needed for simulation and reconstrucion of the PXD.
boost::endian::big_uint16_t ubig16_t
define alias ubig16_t
EDHCFrameHeaderDataType
Enums for DHC data frame types.
boost::crc_optimal< 32, 0x04C11DB7, 0, 0, false, false > dhc_crc_32_type
define our CRC function
boost::endian::big_uint32_t ubig32_t
define alias ubig32_t
Abstract base class for different kinds of events.
void print(void) const
print
const dhc_frame_header_word0 word0
word0
const unsigned int crc32
crc32
const ubig16_t trigger_nr_lo
trigger_nr_lo
unsigned int getErrorStateMachineStartDHP(int dhpid) const
get error state machine start DHP
const ubig16_t wordsineventhi
wordsineventhi
unsigned int getErrorStateMachineDHP(int dhpid) const
get error state machine DHP
const ubig16_t wordsineventlo
words swapped... because of DHE 16 bit handling
unsigned int getErrorStateMachineEndDHP(int dhpid) const
get error state machine end DHP
const ubig32_t errorinfo
not well defined yet
const ubig16_t dhe_time_tag_hi
dhe_time_tag_hi
void print(void) const
print
const dhc_frame_header_word0 word0
word0
const ubig16_t dhe_time_tag_lo
dhe_time_tag_lo
const unsigned int crc32
crc32
const ubig16_t trigger_nr_lo
trigger_nr_lo
unsigned int getDHEId(void) const
get DHE Id (from word0)
unsigned short getTriggerGate(void) const
trigger gate (updated to 8 bit, before 10!)
unsigned short getStartFrameNr(void) const
last DHP frame before trigger
unsigned int getActiveDHPMask(void) const
get Active DHP Mask (from word0)
void print(void) const
print
const dhc_frame_header_word0 word0
word0
const ubig16_t trigger_nr_lo
trigger_nr_lo
unsigned short getDHEId(void) const
get DHE Id (from word0)
unsigned short getDHPPort(void) const
get DHP Port (from word0)
void print(void) const
print
const dhc_frame_header_word0 word0
word0
const unsigned int crc32
crc32
const ubig16_t trigger_nr_lo
trigger_nr_lo
bool isFakedData(void) const
is faked data
const ubig32_t wordsinevent
wordsinevent
const ubig32_t errorinfo
errorinfo
void print(void) const
print
const dhc_frame_header_word0 word0
word0
const ubig16_t trigger_nr_lo
trigger_nr_lo
unsigned short getErrorBits(void) const
get Error Bits
unsigned short getDHEId(void) const
get DHE Id (from word0)
unsigned short getDHPPort(void) const
get DDHP port (from word0)
void print(void) const
print
const dhc_frame_header_word0 word0
mainly empty
static int getMinSize(void)
4 byte header, ROIS (n*8), 4 byte copy of inner CRC, 4 byte outer CRC
static void check_error(PXDErrorFlags &errormask, int length, bool ignore_inv_size_flag=false)
check error and return error mask
void print(void) const
print
const dhc_frame_header_word0 word0
word0
const ubig32_t trignr2
redundant, DATCON Trigger/Tag part 1
const ubig32_t magic1
CAFExxxx , redundant.
const ubig16_t trignr0
trignr0
void check_error(PXDErrorFlags &errormask, bool ignore_datcon_flag=false, bool ignore_hltroi_magic_flag=false, bool ignore_merger_mm_flag=false) const
check error and return error mask
const ubig32_t trignr1
HLT Trigger/Tag part 1.
bool is_fake_datcon(void) const
is fake datcon
const ubig32_t magic2
CAFExxxx, redundant.
void print(void) const
print
const ubig16_t trigger_nr_hi
trigger_nr_hi
const dhc_frame_header_word0 word0
word0
const ubig16_t exp_run
exp_run
const unsigned int crc32
crc32
const ubig16_t trigger_nr_lo
trigger_nr_lo
const ubig16_t time_tag_hi
time_tag_hi
const ubig16_t time_tag_mid
time_tag_mid
bool isFakedData(void) const
isFakedData
const ubig16_t run_subrun
run_subrun
const ubig16_t time_tag_lo_and_type
time_tag_lo_and_type