Belle II Software  release-06-00-14
PXDPostErrorCheckerModule.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/pxdUnpacking/PXDPostErrorCheckerModule.h>
10 
11 using namespace Belle2;
12 using namespace Belle2::PXD;
13 using namespace Belle2::PXD::PXDError;
14 
15 //-----------------------------------------------------------------
16 // Register the Module
17 //-----------------------------------------------------------------
18 REG_MODULE(PXDPostErrorChecker)
19 
20 //-----------------------------------------------------------------
21 // Implementation
22 //-----------------------------------------------------------------
23 
25 {
26  //Set module properties
27  setDescription("PXD: Check Post Unpacking for DAQ errors");
28  setPropertyFlags(c_ParallelProcessingCertified);
29 
30  PXDError::PXDErrorFlags defaulterrormask;
31  defaulterrormask[c_nrEVENT_STRUCT ] = 1;
32  defaulterrormask[c_nrFRAME_TNR_MM ] = 1;
33  defaulterrormask[c_nrMETA_MM ] = 1;
34  defaulterrormask[c_nrONSEN_TRG_FIRST ] = 1;
35  //
36  defaulterrormask[c_nrDHC_END_MISS ] = 1;
37  defaulterrormask[c_nrNR_FRAMES_TO_SMALL ] = 1;
38  // defaulterrormask[c_nrROI_PACKET_INV_SIZE ] = 1; // does not affect pixel data
39  defaulterrormask[c_nrDATA_OUTSIDE ] = 1;
40  //
41  defaulterrormask[c_nrDHC_START_SECOND ] = 1;
42  // defaulterrormask[c_nrDHE_WRONG_ID_SEQ ] = 1; // until this is fixed in FW, we have to live with this
43  defaulterrormask[c_nrFIX_SIZE ] = 1;
44  defaulterrormask[c_nrDHE_CRC ] = 1;
45  //
46  defaulterrormask[c_nrDHC_UNKNOWN ] = 1;
47  defaulterrormask[c_nrHEADERTYPE_INV ] = 1;
48  defaulterrormask[c_nrPACKET_SIZE ] = 1;
49  defaulterrormask[c_nrMAGIC ] = 1;
50  //
51  defaulterrormask[c_nrFRAME_NR ] = 1;
52  defaulterrormask[c_nrFRAME_SIZE ] = 1;
53  defaulterrormask[c_nrHLTROI_MAGIC ] = 1;
54  defaulterrormask[c_nrMERGER_TRIGNR ] = 1;
55  //
56  defaulterrormask[c_nrDHP_SIZE ] = 1;
57  defaulterrormask[c_nrDHE_DHP_DHEID ] = 1;
58  defaulterrormask[c_nrDHE_DHP_PORT ] = 1;
59  // defaulterrormask[c_nrDHP_PIX_WO_ROW ] = 1; // FIXME this should not be needed
60  //
61  defaulterrormask[c_nrDHE_START_END_ID ] = 1;
62  defaulterrormask[c_nrDHE_START_ID ] = 1;
63  defaulterrormask[c_nrDHE_START_WO_END ] = 1;
64  // defaulterrormask[c_nrNO_PXD ] = 1; // THEN we anyway have no data
65  //
66  // defaulterrormask[c_nrNO_DATCON ] = 1; // does not affect pixel data
67  // defaulterrormask[c_nrFAKE_NO_DATA_TRIG ] = 1; // this will trigger always!!!!
68  defaulterrormask[c_nrDHE_ACTIVE ] = 1;
69  // defaulterrormask[c_nrDHP_ACTIVE ] = 1; // GHOST problem ... bit always set
70  //
71  defaulterrormask[c_nrSENDALL_TYPE ] = 1;
72  defaulterrormask[c_nrNOTSENDALL_TYPE ] = 1;
73  defaulterrormask[c_nrDHP_DBL_HEADER ] = 1;
74  defaulterrormask[c_nrHEADER_ERR ] = 1;
75  //
76  defaulterrormask[c_nrHEADER_ERR_GHOST ] = 1;
77  defaulterrormask[c_nrSUSP_PADDING ] = 1;
78  defaulterrormask[c_nrDHC_WIE ] = 1;
79  defaulterrormask[c_nrDHE_WIE ] = 1;
80  //
81  defaulterrormask[c_nrROW_OVERFLOW ] = 1;
82  // defaulterrormask[c_nrDHP_NOT_CONT ] = 1; // GHOST problem
83  defaulterrormask[c_nrDHP_DHP_FRAME_DIFFER ] = 1;
84  defaulterrormask[c_nrDHP_DHE_FRAME_DIFFER ] = 1;
85  //
86  defaulterrormask[c_nrDHE_ID_INVALID ] = 1;
87  defaulterrormask[c_nrDHC_DHCID_START_END_MM ] = 1;
88  defaulterrormask[c_nrDHE_END_WO_START ] = 1;
89  defaulterrormask[c_nrDHC_END_DBL ] = 1;
90  //
91  defaulterrormask[c_nrMETA_MM_DHC ] = 1;
92  defaulterrormask[c_nrMETA_MM_DHE ] = 1;
93  // defaulterrormask[c_nrCOL_OVERFLOW ] = 1; // we might get that for unconnected lines -> "DHPT fix"
94  defaulterrormask[c_nrUNEXPECTED_FRAME_TYPE ] = 1;
95  //
96  defaulterrormask[c_nrMETA_MM_DHC_ERS ] = 1;
97  // defaulterrormask[c_nrMETA_MM_DHC_TT ] = 1; // time tag is not set correctly in EvtMeta
98  defaulterrormask[c_nrMETA_MM_ONS_HLT ] = 1;
99  // defaulterrormask[c_nrMETA_MM_ONS_DC ] = 1; // problem with NO-DATCON
100  //
101  // defaulterrormask[c_nrEVT_TRG_GATE_DIFFER ] = 1; // still a bug in DHE FW
102  // defaulterrormask[c_nrEVT_TRG_FRM_NR_DIFFER ] = 1; // still a bug in DHE FW
103  // defaulterrormask[c_nrDHP_ROW_WO_PIX ] = 1; // still a bug in DHE FW?
104  defaulterrormask[c_nrDHE_START_THIRD ] = 1;
105  //
106  defaulterrormask[c_nrFAKE_NO_FAKE_DATA ] = 1;
107  // other bits not used yet
108 
109  addParam("PXDDAQEvtStatsName", m_PXDDAQEvtStatsName, "The name of the StoreObjPtr of input PXDDAQEvtStats", std::string(""));
110  addParam("PXDRawHitsName", m_PXDRawHitsName, "The name of the StoreArray of input PXDRawHits", std::string(""));
111  addParam("PXDRawAdcsName", m_PXDRawAdcsName, "The name of the StoreArray of input PXDRawAdcs", std::string(""));
112  addParam("PXDRawROIsName", m_PXDRawROIsName, "The name of the StoreArray of input PXDRawROIs", std::string(""));
113 
114  int crit = 0;
115  addParam("CriticalErrorMask", crit, "Set error mask for which data is removed (0=none, 1=default, other undefined yet)", 1);
116  switch (crit) {
117  case 0:
118  m_criticalErrorMask = 0;
119  B2INFO("Disabling critical error mask");
120  break;
121  case 1:
122  m_criticalErrorMask = defaulterrormask;
123  break;
124  default:
125  B2FATAL("Undefined value for criticalErrorMaskSet");
126  break;
127  }
128  // B2DEBUG(25, "The default error mask is $" << std::hex << defaulterrormask);
129 
130  addParam("IgnoreTriggerGate", m_ignoreTriggerGate, "Ignore different triggergate between DHEs", true);
131  addParam("IgnoreDHPFrame", m_ignoreDHPFrame, "Ignore different dhp frame between DHEs", true);
132 
133 
134 }
135 
137 {
138  m_storeDAQEvtStats.isRequired();
139 
140  // Needed if we need to Clear them on detected Error
141  m_storeRawHits.isOptional(m_PXDRawHitsName);
142  m_storeRawAdc.isOptional(m_PXDRawAdcsName);
143  m_storeROIs.isOptional(m_PXDRawROIsName);
144 
145  B2DEBUG(25, "The set error mask is $" << std::hex << m_criticalErrorMask);
146 }
147 
149 {
161  bool had_dhe = false;
162  unsigned short triggergate = 0;
163  unsigned short dheframenr = 0;
164  std::map <int, int> found_dhe;
165  PXDErrorFlags mask{};// construct to no error
166  B2DEBUG(25, "Iterate PXD Packets for this Event");
167  for (auto& pkt : *m_storeDAQEvtStats) {
168  B2DEBUG(25, "Iterate DHC in Pkt " << pkt.getPktIndex());
169  for (auto& dhc : pkt) {
170  B2DEBUG(25, "Iterate DHE in DHC " << dhc.getDHCID());
171  for (auto& dhe : dhc) {
172  B2DEBUG(25, "Iterate DHP in DHE " << dhe.getDHEID() << " TrigGate " << dhe.getTriggerGate() << " FrameNr " << dhe.getFrameNr());
173  found_dhe[dhe.getDHEID()]++;
174  if (had_dhe) {
175  if (dhe.getTriggerGate() != triggergate) {
176  if (!m_ignoreTriggerGate) B2WARNING("Trigger Gate of DHEs not identical" << LogVar("Triggergate 1",
177  triggergate) << LogVar("TriggerGate 2", dhe.getTriggerGate()));
178  mask [c_nrEVT_TRG_GATE_DIFFER] = true;
179  }
180  if (dhe.getFrameNr() != dheframenr) {
181  if (!m_ignoreDHPFrame) B2WARNING("Frame Nr of DHEs not identical" << LogVar("FrameNr 1", dheframenr) << LogVar("FrameNr 2",
182  dhe.getFrameNr()));
183  mask [c_nrEVT_TRG_FRM_NR_DIFFER] = true;
184  }
185  } else {
186  triggergate = dhe.getTriggerGate();
187  dheframenr = dhe.getFrameNr();
188  had_dhe = true;
189  }
190  for (auto& dhp : dhe) {
191  B2DEBUG(25, "DHP " << dhp.getChipID() << " Framenr " << dhp.getFrameNr());
192  // TODO check against other DHP (full bits) and DHE (limited bits)
193  // TODO We know that this will fail with current firmware and most likely will not be fixed...
194  }
195  bool error = false;
196  for (auto it = dhe.cm_begin(); it < dhe.cm_end(); ++it) {
197  if (std::get<2>(*it) == 63) {
198  // TODO Check that we dont have CM=63 indicating fifo overflow, check and set bits
199  // mask |= c_DHH_MISC_ERROR; // unpacker should set this already, anyway we would want it set only on the DHP/DHE level...
200  B2DEBUG(25, "DHP data loss (CM=63) in " << LogVar("DHE", dhe.getDHEID()) << LogVar("DHP", int(std::get<0>(*it))) << LogVar("Row",
201  std::get<1>(*it)));
202  error = true;
203  }
204  }
205  if (error) B2WARNING("DHP data loss (CM=63) in " << LogVar("DHE", dhe.getDHEID()));
206  }
207  }
208  }
209 
212  for (auto& a : found_dhe) {
213  if (a.second > 1) B2WARNING("More than one packet for same DHE ID " << a.first);
214  }
216 // for (auto& a : found_dhe) {
217 // if (!m_dhe_expected[a.first]) B2ERROR("This DHE ID was not expected " << a.first);
218 // }
219 // for (auto& a : m_dhe_expected) {
220 // if (a.second) {
221 // if (found_dhe[a.first] == 0) B2ERROR("DHE packet missing for DHE ID " << a.first);
222 // } else {
223 // if (found_dhe[a.first] > 0) B2ERROR("This DHE ID was not expected " << a.first);
224 // }
225 // }
226  m_storeDAQEvtStats->addErrorMask(mask);
227  m_storeDAQEvtStats->setCritErrorMask(m_criticalErrorMask);
228  m_storeDAQEvtStats->Decide();
229  if (!m_storeDAQEvtStats->isUsable()) {
230  // Clear all PXD related data but Raw and DaqEvtStats!
231  m_storeRawHits.clear();
232  m_storeROIs.clear();
233  m_storeRawAdc.clear();
234  setReturnValue(false); // allows special processing in case
235  } else {
236  // setReturnValue(true); // default, it is not needed
237  }
238 }
Base class for Modules.
Definition: Module.h:72
The PXD DAQ Post Unpacking Error Check.
void initialize() override final
Initialize.
Class to store variables with their name which were sent to the logging service.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Namespace to encapsulate code needed for simulation and reconstrucion of the PXD.
Abstract base class for different kinds of events.