145 B2WARNING(
"Unpacking SVDShaperDigits to a non-empty pre-existing \n"
146 <<
"StoreArray. This can lead to undesired behaviour. At least\n"
147 <<
"remember to use SVDShaperDigitSorter in your path and \n"
148 <<
"set the silentlyAppend parameter of SVDUnpacker to true.");
151 vector<SVDDAQDiagnostic*> vDiagnostic_ptr;
153 map<SVDShaperDigit, SVDDAQDiagnostic*> diagnosticMap;
155 map<unsigned short, set<pair<unsigned short, unsigned short> > > apvsByPipeline;
158 B2ERROR(
"Missing valid EventMetaData." << std::endl <<
"No SVDShaperDigit produced for this event!");
162 bool nAPVmatch =
true;
163 bool badMapping =
false;
164 bool badHeader =
false;
165 bool badTrailer =
false;
166 bool missedHeader =
false;
167 bool missedTrailer =
false;
170 bool isSetEventInfo =
false;
173 bool isSetNAPVsamples =
false;
175 unsigned short nAPVheaders = 999;
176 set<short> seenAPVHeaders = {};
178 unsigned short nEntries_rawSVD =
m_rawSVD.getEntries();
181 short fadc = 255, apv = 63;
183 unsigned short cntFADCboards = 0;
184 for (
unsigned int i = 0; i < nEntries_rawSVD; i++) {
186 unsigned int numEntries_rawSVD =
m_rawSVD[ i ]->GetNumEntries();
187 for (
unsigned int j = 0; j < numEntries_rawSVD; j++) {
189 const unsigned short maxNumOfCh =
m_rawSVD[i]->GetMaxNumOfCh(j);
191 std::vector<unsigned short> nWords;
192 nWords.reserve(maxNumOfCh);
193 std::vector<uint32_t*> data32tab(maxNumOfCh);
194 for (
unsigned int k = 0; k < maxNumOfCh; k++) {
195 nWords.push_back(
m_rawSVD[i]->GetDetectorNwords(j, k));
196 data32tab[k] = (uint32_t*)
m_rawSVD[i]->GetDetectorBuffer(j, k);
199 unsigned short ftbError = 0;
200 unsigned short trgType = 0;
201 unsigned short trgNumber = 0;
202 unsigned short daqMode = -1;
203 unsigned short daqType = 0;
206 unsigned short apvErrors;
207 unsigned short pipAddr;
208 unsigned short ftbFlags = 0;
209 unsigned short apvErrorsOR = 0;
211 bool is3sampleData =
false;
212 bool is6sampleData =
false;
214 for (
unsigned int buf = 0; buf < maxNumOfCh; buf++) {
216 if (data32tab[buf] ==
nullptr || nWords.at(buf) == 0) {
217 if (data32tab[buf] !=
nullptr || nWords.at(buf) != 0) {
218 B2WARNING(
"Invalid combination of buffer pointer and nWords:" <<
219 LogVar(
"COPPER/PCIe40 ID", i) <<
220 LogVar(
"COPPER/PCIe40 Entry", j) <<
221 LogVar(
"COPPER/PCIe40 Channel", buf) <<
222 LogVar(
"data32tab[buf]", data32tab[buf]) <<
223 LogVar(
"nWords[buf]", nWords.at(buf)));
227 if (
m_printRaw)
printB2Debug(data32tab[buf], data32tab[buf], &data32tab[buf][nWords.at(buf) - 1], nWords.at(buf));
231 missedHeader =
false;
232 missedTrailer =
false;
234 uint32_t* data32_it = data32tab[buf];
235 short strip, sample[6];
236 vector<uint32_t> crc16vec;
241 for (; data32_it != &data32tab[buf][nWords.at(buf)]; data32_it++) {
251 crc16vec.push_back(*data32_it);
257 if (ftbError != 240) {
261 switch (ftbError - 240) {
263 B2ERROR(
"FADC Event Number is different from (FTB & TTD) Event Numbers");
266 B2ERROR(
"TTD Event Number is different from (FTB & FADC) Event Numbers");
269 B2ERROR(
"FTB Event Number is different from (TTD & FADC) Event Numbers");
272 B2ERROR(
"(FTB, TTD & FADC) Event Numbers are different from each other");
275 B2ERROR(
"Problem with errorsField variable in FTB Header" <<
LogVar(
"abnormal value", ftbError));
281 (eventNo & 0xFFFFFF)) {
285 B2ERROR(
"Event number mismatch detected! The event number given by EventMetaData object is different from the one in the FTB Header."
286 <<
LogVar(
"Expected event number & 0xFFFFFF",
287 (eventNo & 0xFFFFFF)) <<
LogVar(
"Event number in the FTB",
m_FTBHeader.eventNumber));
307 if (daqType) daqMode = 3;
315 is3sampleData =
false;
316 is6sampleData =
false;
318 if (daqMode == 0) B2ERROR(
"SVDDataFormatCheck: the event " << eventNo <<
319 " is apparently taken with 1-sample mode, this is not expected.");
320 if (daqMode == 1) is3sampleData =
true;
321 if (daqMode == 2) is6sampleData =
true;
329 B2ERROR(
"Event number mismatch detected! The event number given by EventMetaData object is different from the one in the FADC Header. "
330 <<
LogVar(
"Event number", eventNo) <<
LogVar(
"FADC", fadc) <<
LogVar(
"Trigger number LSByte reported by the FADC",
339 if (!isSetEventInfo) {
351 isSetEventInfo =
true;
362 seenAPVHeaders.insert(apv);
369 if (apvErrors != 0) {
376 currentDAQDiagnostic =
m_storeDAQDiagnostics.appendNew(trgNumber, trgType, pipAddr, cmc1, cmc2, apvErrors, ftbError,
true,
378 badHeader, missedHeader, missedTrailer,
380 vDiagnostic_ptr.push_back(currentDAQDiagnostic);
382 apvsByPipeline[pipAddr].insert(make_pair(fadc, apv));
385 if (pipAddr == 255) {
388 if (
m_data_A.check == 0) B2ERROR(
"The strip data frame is detected for the special SEU recovery mode. " <<
LogVar(
"pipline address",
389 pipAddr) <<
"This is unexpected!");
413 if (!isSetNAPVsamples) {
415 isSetNAPVsamples =
true;
418 B2ERROR(
"DAQMode value (indicating 3-sample acquisition mode) doesn't correspond to the actual number of samples (6) in the data! The data might be corrupted!");
432 if (!isSetNAPVsamples) {
434 isSetNAPVsamples =
true;
437 B2ERROR(
"DAQMode value (indicating 6-sample acquisition mode) doesn't correspond to the actual number of samples (3) in the data! The data might be corrupted!");
443 if (newShaperDigit) {
444 diagnosticMap.insert(make_pair(*newShaperDigit, currentDAQDiagnostic));
445 delete newShaperDigit;
447 B2FATAL(
"Respective FADC/APV combination not found -->> incorrect payload in the database! ");
460 if (
APVmap->find(fadc) ==
APVmap->end()) badMapping =
true;
463 unsigned short nAPVs =
APVmap->count(fadc);
465 if (nAPVheaders == 0) {
466 currentDAQDiagnostic =
m_storeDAQDiagnostics.appendNew(0, 0, 0, 0, 0, 0, ftbError,
true, nAPVmatch, badHeader, 0, 0, fadc, 0);
467 vDiagnostic_ptr.push_back(currentDAQDiagnostic);
470 if (nAPVs != nAPVheaders) {
472 for (
const auto& fadcApv : *
APVmap) {
473 if (fadcApv.first != fadc)
continue;
474 if (seenAPVHeaders.find(fadcApv.second) == seenAPVHeaders.end()) {
476 auto missingRec =
m_missingAPVs.find(make_pair(fadcApv.first, fadcApv.second));
479 if (missingRec->second.first > eventNo)
480 missingRec->second.first = eventNo;
481 if (missingRec->second.second < eventNo)
482 missingRec->second.second = eventNo;
487 make_pair(fadcApv.first, fadcApv.second),
488 make_pair(eventNo, eventNo)
491 int(fadcApv.second)) <<
LogVar(
"FADC",
492 int(fadcApv.first)));
499 seenAPVHeaders.clear();
502 if ((ftbFlags >> 5) != 0) badTrailer =
true;
506 B2ERROR(
" FTB Flags variable has an active error bit(s)" <<
LogVar(
"on FADC number", fadc));
508 if (ftbFlags & 16) B2ERROR(
"----> CRC error has been detected. Data might be corrupted!");
509 if (ftbFlags & 8) B2ERROR(
"----> Bad Event indication has been detected. Data might be corrupted!");
510 if (ftbFlags & 4) B2ERROR(
"----> Double Header has been detected. Data might be corrupted!");
511 if (ftbFlags & 2) B2ERROR(
"----> Time Out has been detected. Data might be corrupted!");
512 if (ftbFlags & 1) B2ERROR(
"----> Event Too Long! Data might be corrupted!");
527 unsigned short iCRC = crc16vec.size();
528 std::vector<uint32_t> crc16input;
529 crc16input.reserve(iCRC);
531 for (
unsigned short icrc = 0; icrc < iCRC; icrc++)
532 crc16input.push_back(htonl(crc16vec.at(icrc)));
535 boost::crc_basic<16> bcrc(0x8005, 0xffff, 0,
false,
false);
536 bcrc.process_bytes(crc16input.data(), crc16input.size() *
sizeof(uint32_t));
537 unsigned int checkCRC = bcrc.checksum();
540 B2WARNING(
"FTB CRC16 checksum DOES NOT MATCH" <<
LogVar(
"for FADC no.", fadc));
550 if (!(
seenHeadersAndTrailers & 1)) {B2ERROR(
"Missing FTB Header is detected. SVD data might be corrupted!" <<
LogVar(
"Event number", eventNo) <<
LogVar(
"FADC", fadc)); missedHeader =
true;}
551 if (!(
seenHeadersAndTrailers & 2)) {B2ERROR(
"Missing FADC Header is detected -> related FADC number couldn't be retrieved. SVD data might be corrupted! " <<
LogVar(
"Event number", eventNo) <<
LogVar(
"previous FADC", fadc)); missedHeader =
true;}
552 if (!(
seenHeadersAndTrailers & 4)) {B2ERROR(
"Missing FADC Trailer is detected. SVD data might be corrupted!" <<
LogVar(
"Event number", eventNo) <<
LogVar(
"FADC", fadc)); missedTrailer =
true;}
553 if (!(
seenHeadersAndTrailers & 8)) {B2ERROR(
"Missing FTB Trailer is detected. SVD data might be corrupted!" <<
LogVar(
"Event number", eventNo) <<
LogVar(
"FADC", fadc)); missedTrailer =
true;}
556 for (
auto p : vDiagnostic_ptr) {
558 p->setFTBFlags(ftbFlags);
559 p->setApvErrorOR(apvErrorsOR);
560 p->setAPVMatch(nAPVmatch);
561 p->setBadMapping(badMapping);
562 p->setBadTrailer(badTrailer);
563 p->setMissedHeader(missedHeader);
564 p->setMissedTrailer(missedTrailer);
567 vDiagnostic_ptr.clear();
579 LogVar(
"# of data objects in rawSVD",
584 p.setFADCMatch(
false);
591 auto itPtr = apvsByPipeline.find(255);
592 if (itPtr != apvsByPipeline.end()) {
593 for (
const auto& fadcApv : itPtr->second) {
595 auto seuRec =
m_seuRecMap.find(make_pair(fadcApv.first, fadcApv.second));
597 if (seuRec->second.first > eventNo)
598 seuRec->second.first = eventNo;
599 if (seuRec->second.second < eventNo)
600 seuRec->second.second = eventNo;
604 make_pair(fadcApv.first, fadcApv.second),
605 make_pair(eventNo, eventNo)
608 B2ERROR(
"Special Recovery Data (Dummy APV Header) found due to the detection of Single Event Upset (SEU)!!!" <<
LogVar(
"APV",
609 int(fadcApv.second)) <<
LogVar(
"FADC",
int(fadcApv.first)) <<
LogVar(
"Event number", eventNo));
613 if (pp.getFADCNumber() == fadcApv.first and pp.getAPVNumber() == fadcApv.second)
614 pp.setSEURecoData(
true);
621 auto majorAPV = max_element(apvsByPipeline.begin(), apvsByPipeline.end(),
622 [](
const decltype(apvsByPipeline)::value_type & p1,
623 const decltype(apvsByPipeline)::value_type & p2) ->
bool
624 { return p1.second.size() < p2.second.size(); }
629 p.setEmuPipelineAddress(majorAPV->first);
631 unsigned short apvsByPipelineSize = apvsByPipeline.size();
632 if (majorAPV->first == 255) apvsByPipelineSize = 1;
635 if (apvsByPipelineSize > 1)
636 for (
const auto& p : apvsByPipeline) {
637 if (p.first == majorAPV->first or p.first == 255)
continue;
638 for (
const auto& fadcApv : p.second) {
640 auto upsetRec =
m_upsetAPVs.find(make_pair(fadcApv.first, fadcApv.second));
643 if (upsetRec->second.first > eventNo)
644 upsetRec->second.first = eventNo;
645 if (upsetRec->second.second < eventNo)
646 upsetRec->second.second = eventNo;
651 make_pair(fadcApv.first, fadcApv.second),
652 make_pair(eventNo, eventNo)
656 int(fadcApv.first)) <<
LogVar(
"Event number", eventNo));
661 if (pp.getFADCNumber() == fadcApv.first and pp.getAPVNumber() == fadcApv.second)
662 pp.setUpsetAPV(
true);
670 for (
auto& p : diagnosticMap) {
672 if ((
m_killUpsetDigits && p.second->getPipelineAddress() != p.second->getEmuPipelineAddress()) || p.second->getFTBError() != 240
673 || p.second->getFTBFlags() || p.second->getAPVError() || !(p.second->getAPVMatch()) || !(p.second->getFADCMatch())
674 || p.second->getBadHeader()
675 || p.second->getBadMapping() || p.second->getUpsetAPV() || p.second->getMissedHeader() || p.second->getMissedTrailer())
continue;