11 #include <pxd/modules/pxdUnpacking/PXDPostErrorCheckerModule.h>
15 using namespace Belle2::PXD::PXDError;
29 setDescription(
"PXD: Check Post Unpacking for DAQ errors");
30 setPropertyFlags(c_ParallelProcessingCertified);
32 constexpr uint64_t defaulterrormask =
39 c_NR_FRAMES_TO_SMALL |
85 c_DHP_DHP_FRAME_DIFFER |
86 c_DHP_DHE_FRAME_DIFFER |
89 c_DHC_DHCID_START_END_MM |
96 c_UNEXPECTED_FRAME_TYPE |
108 c_FAKE_NO_FAKE_DATA ;
112 addParam(
"PXDDAQEvtStatsName", m_PXDDAQEvtStatsName,
"The name of the StoreObjPtr of input PXDDAQEvtStats", std::string(
""));
113 addParam(
"PXDRawHitsName", m_PXDRawHitsName,
"The name of the StoreArray of input PXDRawHits", std::string(
""));
114 addParam(
"PXDRawAdcsName", m_PXDRawAdcsName,
"The name of the StoreArray of input PXDRawAdcs", std::string(
""));
115 addParam(
"PXDRawROIsName", m_PXDRawROIsName,
"The name of the StoreArray of input PXDRawROIs", std::string(
""));
117 addParam(
"CriticalErrorMask", m_criticalErrorMask,
"Set error mask for which data is removed", defaulterrormask);
118 B2DEBUG(25,
"The default error mask is $" << std::hex << defaulterrormask);
120 addParam(
"IgnoreTriggerGate", m_ignoreTriggerGate,
"Ignore different triggergate between DHEs",
true);
121 addParam(
"IgnoreDHPFrame", m_ignoreDHPFrame,
"Ignore different dhp frame between DHEs",
true);
128 m_storeDAQEvtStats.isRequired();
131 m_storeRawHits.isOptional(m_PXDRawHitsName);
132 m_storeRawAdc.isOptional(m_PXDRawAdcsName);
133 m_storeROIs.isOptional(m_PXDRawROIsName);
135 B2DEBUG(25,
"The set error mask is $" << std::hex << m_criticalErrorMask);
151 bool had_dhe =
false;
152 unsigned short triggergate = 0;
153 unsigned short dheframenr = 0;
154 PXDErrorFlags mask = EPXDErrMask::c_NO_ERROR;
155 B2DEBUG(25,
"Iterate PXD Packets for this Event");
156 for (
auto& pkt : *m_storeDAQEvtStats) {
157 B2DEBUG(25,
"Iterate DHC in Pkt " << pkt.getPktIndex());
158 for (
auto& dhc : pkt) {
159 B2DEBUG(25,
"Iterate DHE in DHC " << dhc.getDHCID());
160 for (
auto& dhe : dhc) {
161 B2DEBUG(25,
"Iterate DHP in DHE " << dhe.getDHEID() <<
" TrigGate " << dhe.getTriggerGate() <<
" FrameNr " << dhe.getFrameNr());
163 if (dhe.getTriggerGate() != triggergate) {
164 if (!m_ignoreTriggerGate) B2WARNING(
"Trigger Gate of DHEs not identical" <<
LogVar(
"Triggergate 1",
165 triggergate) <<
LogVar(
"TriggerGate 2", dhe.getTriggerGate()));
166 mask |= EPXDErrMask::c_EVT_TRG_GATE_DIFFER;
168 if (dhe.getFrameNr() != dheframenr) {
169 if (!m_ignoreDHPFrame) B2WARNING(
"Frame Nr of DHEs not identical" <<
LogVar(
"FrameNr 1", dheframenr) <<
LogVar(
"FrameNr 2",
171 mask |= EPXDErrMask::c_EVT_TRG_FRM_NR_DIFFER;
174 triggergate = dhe.getTriggerGate();
175 dheframenr = dhe.getFrameNr();
178 for (
auto& dhp : dhe) {
179 B2DEBUG(25,
"DHP " << dhp.getChipID() <<
" Framenr " << dhp.getFrameNr());
184 for (
auto it = dhe.cm_begin(); it < dhe.cm_end(); ++it) {
185 if (std::get<2>(*it) == 63) {
188 B2DEBUG(25,
"DHP data loss (CM=63) in " <<
LogVar(
"DHE", dhe.getDHEID()) <<
LogVar(
"DHP",
int(std::get<0>(*it))) <<
LogVar(
"Row",
193 if (error) B2WARNING(
"DHP data loss (CM=63) in " <<
LogVar(
"DHE", dhe.getDHEID()));
197 m_storeDAQEvtStats->addErrorMask(mask);
198 m_storeDAQEvtStats->setCritErrorMask(m_criticalErrorMask);
199 m_storeDAQEvtStats->Decide();
200 if (!m_storeDAQEvtStats->isUsable()) {
202 m_storeRawHits.clear();
204 m_storeRawAdc.clear();
205 setReturnValue(
false);