11 #include <pxd/unpacking/PXDRawDataDefinitions.h>
12 #include <pxd/modules/pxdUnpacking/PXDPackerErrModule.h>
13 #include <framework/datastore/DataStore.h>
14 #include <framework/logging/Logger.h>
15 #include <framework/dataobjects/EventMetaData.h>
16 #include <framework/datastore/StoreObjPtr.h>
17 #include <framework/core/ModuleParam.templateDetails.h>
19 #include <boost/crc.hpp>
28 using namespace Belle2::PXD::PXDError;
36 using boost::crc_optimal;
37 typedef crc_optimal<32, 0x04C11DB7, 0, 0, false, false> dhc_crc_32_type;
42 std::vector <PXDErrorFlags> PXDPackerErrModule::m_errors = {
50 c_META_MM | c_META_MM_DHC | c_META_MM_DHE | c_META_MM_ONS_HLT | c_META_MM_ONS_DC,
51 c_META_MM | c_META_MM_DHC | c_META_MM_DHE | c_META_MM_ONS_HLT | c_META_MM_ONS_DC,
52 c_META_MM_DHC_ERS | c_META_MM_ONS_HLT | c_META_MM_ONS_DC,
53 c_META_MM_DHC_ERS | c_META_MM_ONS_HLT | c_META_MM_ONS_DC,
54 c_META_MM_DHC_ERS | c_META_MM_ONS_HLT | c_META_MM_ONS_DC,
71 c_ONSEN_TRG_FIRST | c_DHC_START_SECOND | c_DHE_START_THIRD | c_EVENT_STRUCT,
74 c_DHE_END_WO_START | c_DHE_START_THIRD,
81 c_ONSEN_TRG_FIRST | c_DHC_START_SECOND | c_DHE_START_THIRD | c_EVENT_STRUCT,
82 c_DHC_START_SECOND | c_DHE_START_THIRD,
84 c_DHE_WRONG_ID_SEQ | c_DHE_START_WO_END,
90 c_DHE_END_WO_START | c_DHE_START_END_ID,
91 c_MERGER_TRIGNR | c_META_MM_ONS_DC,
94 c_NO_ERROR | c_NOTSENDALL_TYPE,
100 c_MERGER_TRIGNR | c_META_MM_ONS_HLT,
103 c_DHE_START_THIRD | c_DHE_ACTIVE,
110 c_DHC_DHCID_START_END_MM,
120 c_META_MM_ONS_HLT | c_MERGER_TRIGNR,
140 c_UNEXPECTED_FRAME_TYPE,
141 c_UNEXPECTED_FRAME_TYPE,
142 c_UNEXPECTED_FRAME_TYPE,
152 c_NR_FRAMES_TO_SMALL,
163 c_FRAME_TNR_MM | c_META_MM | c_META_MM_DHC,
164 c_FRAME_TNR_MM | c_META_MM | c_META_MM_DHE,
170 c_FRAME_TNR_MM | c_META_MM,
172 c_DHE_START_ID | c_DHE_DHP_DHEID,
205 c_ROI_PACKET_INV_SIZE,
206 c_ROI_PACKET_INV_SIZE,
211 bool PXDPackerErrModule::CheckErrorMaskInEvent(
unsigned int eventnr, PXDErrorFlags mask)
215 PXDErrorFlags expected = c_NO_ERROR;
216 if (eventnr > 0 && eventnr < m_errors.size()) {
217 expected = m_errors[eventnr];
219 B2INFO(
"-- PXD Packer Error Check for Event Nr: " << eventnr);
220 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
223 if ((m & (mask | expected)) == m) {
224 if ((m & expected) == m && (m & mask) != m) {
225 B2ERROR(
"Bit " << i <<
": Was NOT Set: " << getPXDBitErrorName(i));
226 m_found_fatal =
true;
227 }
else if ((m & expected) != m && (m & mask) == m) {
228 B2RESULT(
"Bit " << i <<
": Optional : " << getPXDBitErrorName(i));
229 }
else if ((m & expected) == m && (m & mask) == m) {
230 B2INFO(
"Bit " << i <<
": As Expected: " << getPXDBitErrorName(i));
234 bool flag = (mask & expected) == expected;
235 if (expected == EPXDErrMask::c_NO_ERROR) {
237 if (mask != EPXDErrMask::c_NO_ERROR) {
238 B2ERROR(
"There should be no error in this event, but there were (see above)!");
239 m_found_fatal =
true;
241 flag = (mask == EPXDErrMask::c_NO_ERROR);
243 B2INFO(
"-- PXD Packer Error Check END --- ");
245 if (m_found_fatal) B2FATAL(
"This check failed (see details above)!");
249 PXDPackerErrModule::PXDPackerErrModule() :
258 setDescription(
"Create 'broken' PXD raw data to challenge Unpacker");
261 addParam(
"RawPXDsName",
m_RawPXDsName,
"The name of the StoreArray of generated RawPXDs", std::string(
""));
262 addParam(
"dhe_to_dhc",
m_dhe_to_dhc,
"DHE to DHC mapping (DHC_ID, DHE1, DHE2, ..., DHE5) ; -1 disable port");
263 addParam(
"InvertMapping",
m_InvertMapping,
"Use invers mapping to DHP row/col instead of \"remapped\" coordinates",
false);
273 B2DEBUG(27,
"PXD Packer Err --> Init");
275 B2WARNING(
"=== Important! A lot of intentional errors will follow. To find the reason for a failing test, check the lines before the FATAL. ====");
288 B2DEBUG(27,
"PXD Packer Err --> DHC/DHE");
290 if (it.size() != 6) {
292 B2WARNING(
"PXD Packer Err --> DHC/DHE maps 1 dhc to 5 dhe (1+5 values), but I found " << it.size());
294 for (
auto& it2 : it) {
298 B2DEBUG(27,
"PXD Packer Err --> ... DHE " << it2);
299 if (it2 < -1 || it2 >= 64) {
300 if (it2 != -1) B2ERROR(
"PXD Packer Err --> DHC id " << it2 <<
" is out of range (0-64 or -1)! disable channel.");
306 B2DEBUG(27,
"PXD Packer Err --> DHC .. " << it2);
307 if (dhc_id < 0 || dhc_id >= 16) {
308 B2ERROR(
"PXD Packer Err --> DHC id " << it2 <<
" is out of range (0-15)! skip");
315 B2DEBUG(27,
"PXD Packer Err --> DHC/DHE done");
319 B2DEBUG(27,
"PXD Packer Err --> DHC " << it.first);
320 for (
auto& it2 : it.second) {
321 B2DEBUG(27,
"PXD Packer Err --> .. connects to DHE " << it2 <<
" port " << port);
332 if (
m_found_fatal) B2FATAL(
"At least one of the checks failed (see details above)!");
334 B2INFO(
"Check Test coverage:");
335 PXDErrorFlags mask = c_NO_ERROR;
336 mask = std::accumulate(
m_errors.begin(),
m_errors.end(), mask, std::bit_or<PXDErrorFlags>());
337 for (
int i = 0; i < ONSEN_MAX_TYPE_ERR; i++) {
340 if ((m & mask) == 0) {
341 B2WARNING(
"Bit " << i <<
": Not Covered : " << getPXDBitErrorName(i));
349 B2DEBUG(27,
"PXD Packer Err --> Event");
367 uint32_t run = evtPtr->getRun();
368 uint32_t exp = evtPtr->getExperiment();
369 uint32_t sub = evtPtr->getSubrun();
379 B2INFO(
"Pack Event : " << evtPtr->getEvent() <<
"," << evtPtr->getRun() <<
"," << evtPtr->getSubrun() <<
"," <<
380 evtPtr->getExperiment() <<
"," << evtPtr->getTime() <<
" (MetaInfo)");
391 int dhe_ids[5] = {0, 0, 0, 0, 0};
392 B2DEBUG(27,
"PXD Packer Err --> pack_event");
397 int port = 1, port_inx = 0;
400 for (
auto& it2 : it.second) {
401 if (it2 >= 0) act_port += port;
403 dhe_ids[port_inx] = it2;
405 if (port_inx == 5)
break;
418 append_int32(EDHCFrameHeaderDataType::c_DHC_START << 27);
441 append_int32(EDHCFrameHeaderDataType::c_DHC_START << 27);
458 objptr->data()[0] = 0xDEADBEAF;
461 objptr->data()[1] = 0x00110000;
464 objptr->data()[1] = 0x00010000;
467 objptr->data()[2] = 0x01010101;
476 B2WARNING(
"Frame is not 32bit aligned!!! Unsupported by Unpacker!");
531 B2DEBUG(27,
"PXD Packer Err --> pack_dhc ID " << dhc_id <<
" DHE act: " << dhe_active);
533 bool m_send_all =
true;
534 bool m_send_roi =
false;
545 append_int32(0xCAFE8000 | (m_send_all ? 0x4000 : 0) | (m_send_roi ? 0x2000 : 0));
586 append_int32(EDHCFrameHeaderDataType::c_DHC_START << 27);
596 uint32_t header = (EDHCFrameHeaderDataType::c_DHC_START << 27) | ((dhc_id & 0xF) << 21) | ((dhe_active & 0x1F) << 16) |
603 uint32_t mm = (
unsigned int)std::round((
m_meta_time % 1000000000ull) * 0.127216);
604 uint32_t ss = (
unsigned int)(
m_meta_time / 1000000000ull) ;
608 append_int16(((mm >> 12) & 0x7FFF) | ((ss & 1) ? 0x8000 : 0x0));
626 for (
int i = 0; i < 5; i++) {
680 append_int32(EDHCFrameHeaderDataType::c_DHC_START << 27);
700 B2DEBUG(27,
"PXD Packer Err --> pack_dhe ID " << dhe_id <<
" DHP act: " << dhp_active);
707 B2FATAL(
"Inverse Mapping not implemented in Packer");
714 uint32_t header = (EDHCFrameHeaderDataType::c_DHE_START << 27) | ((dhe_id & 0x3F) << 20) | ((dhp_active & 0xF) << 16) |
775 if (dhp_active != 0) {
786 unsigned short sensor, ladder, layer;
787 sensor = (dhe_id & 0x1) + 1;
788 ladder = (dhe_id & 0x1E) >> 1;
789 layer = ((dhe_id & 0x20) >> 5) + 1;
791 B2DEBUG(27,
"pack_dhe: VxdId: " <<
VxdID(layer, ladder, sensor) <<
" " << (
int)
VxdID(layer, ladder, sensor));
794 for (
auto j = 0; j < 10; j++) {
795 unsigned int row, col;
796 unsigned char charge;
800 if (!dhe_has_remapped) {
801 do_the_reverse_mapping(row, col, layer, sensor);
808 B2FATAL(
"Clusterizer not supported in Packer");
810 for (
int i = 0; i < 4; i++) {
811 if ((dhp_active & 0x1) or
isErrorIn(37)) {
812 pack_dhp(i, dhe_id, dhe_has_remapped ? 1 : 0);
829 header = (EDHCFrameHeaderDataType::c_DHE_END << 27) | ((dhe_id & 0x3F) << 20) | (
m_trigger_nr & 0xFFFF);
845 void PXDPackerErrModule::do_the_reverse_mapping(
unsigned int& ,
unsigned int& ,
unsigned short ,
848 B2FATAL(
"code needs to be written");
857 B2DEBUG(27,
"PXD Packer Err --> pack_dhp Raw Chip " << chip_id <<
" of DHE id: " << dhe_id);
860 append_int32((EDHCFrameHeaderDataType::c_DHP_RAW << 27) | ((dhe_id & 0x3F) << 20) | ((chip_id & 0x03) << 16) |
862 append_int32((EDHPFrameHeaderDataType::c_RAW << 29) | ((dhe_id & 0x3F) << 18) | ((chip_id & 0x03) << 16) |
868 if (c2 >= PACKER_NUM_COLS) c2 = PACKER_NUM_COLS;
871 for (
int row = 0; row < PACKER_NUM_ROWS; row++) {
872 for (
int col = c1; col < c2; col++) {
876 for (
int col = c2; col < c1 + 64; col++) {
886 B2DEBUG(27,
"PXD Packer Err --> pack_dhp Chip " << chip_id <<
" of DHE id: " << dhe_id);
889 unsigned short last_rowstart = 0;
890 bool error_done =
false;
892 if (dhe_has_remapped == 0) {
895 assert(dhe_has_remapped == 0);
900 uint32_t header = (EDHCFrameHeaderDataType::c_DHP_ZSD << 27) | ((dhe_id & 0x3F) << 20) | ((dhe_has_remapped & 0x1) << 19) | ((
912 header = (EDHPFrameHeaderDataType::c_ZSD << 29) | ((dhe_id & 0x3F) << 18) | ((chip_id & 0x03) << 16) |
921 for (
int row = 0; row < PACKER_NUM_ROWS; row++) {
923 if (
isErrorIn(43) && !error_done) rowstart =
false;
924 else rowstart =
true;
928 if (c2 >= PACKER_NUM_COLS) c2 = PACKER_NUM_COLS;
929 for (
int col = c1; col < c2; col++) {
931 unsigned char charge;
933 if (
isErrorIn(41) and row == PACKER_NUM_ROWS - 1 and col == PACKER_NUM_COLS - 1 and !error_done) {
934 row = PACKER_NUM_ROWS;
938 if (
isErrorIn(42) and row == PACKER_NUM_ROWS - 1 and col == PACKER_NUM_COLS - 1 and !error_done) {
939 col = PACKER_NUM_COLS;
943 last_rowstart = ((row & 0x3FE) << (6 - 1)) | 0;
954 B2DEBUG(27,
"Repeat last rowstart to align to 32bit.");
960 B2DEBUG(27,
"Found no data for halfladder! DHEID: " << dhe_id <<
" Chip: " << chip_id);
966 append_int32((EDHCFrameHeaderDataType::c_GHOST << 27) | ((dhe_id & 0x3F) << 20) | ((chip_id & 0x03) << 16) |