21 feHeader_ = std::unique_ptr<FEDFEHeader>();
76 uint16_t offsetBeginningOfChannel = 0;
91 LogDebug(
"FEDBuffer") <<
"Channel " << uint16_t(
i) <<
" (FE unit " <<
key.feUnit() <<
" channel "
92 <<
key.feChan() <<
" according to external numbering scheme) "
93 <<
"does not fit into buffer. "
94 <<
"Channel starts at " << uint16_t(offsetBeginningOfChannel) <<
" in payload. "
102 uint16_t channelLength =
channels_.back().length();
106 UNLIKELY(channelLength < minLength) {
108 LogDebug(
"FEDBuffer") <<
"Channel " << uint16_t(
i) <<
" (FE unit " <<
key.feUnit() <<
" channel "
109 <<
key.feChan() <<
" according to external numbering scheme)"
111 <<
"Channel starts at " << uint16_t(offsetBeginningOfChannel) <<
" in payload. "
112 <<
"Channel length is " << uint16_t(channelLength) <<
". "
113 <<
"Min length is " << uint16_t(minLength) <<
". ";
120 LogDebug(
"FEDBuffer") <<
"Channel " << uint16_t(
i) <<
" (FE unit " <<
key.feUnit() <<
" channel "
121 <<
key.feChan() <<
" according to external numbering scheme)"
122 <<
"does not fit into buffer. "
123 <<
"Channel starts at " << uint16_t(offsetBeginningOfChannel) <<
" in payload. "
124 <<
"Channel length is " << uint16_t(channelLength) <<
". "
131 const uint16_t offsetEndOfChannel = offsetBeginningOfChannel + channelLength;
134 uint8_t numPaddingBytes = 8 - (offsetEndOfChannel % 8);
135 if (numPaddingBytes == 8)
137 offsetBeginningOfChannel = offsetEndOfChannel + numPaddingBytes;
139 offsetBeginningOfChannel = offsetEndOfChannel;
203 uint8_t lastEnabledFeUnit = 7;
204 while (!(
fePresent(lastEnabledFeUnit) &&
feEnabled(lastEnabledFeUnit)) && lastEnabledFeUnit != 0)
208 const uint16_t offsetLastChannel = lastChannel.
offset();
209 const uint16_t offsetEndOfChannelData = offsetLastChannel + lastChannel.
length();
210 const uint16_t channelDataLength = offsetEndOfChannelData;
212 uint16_t channelDataLengthInWords = channelDataLength / 8;
213 if (channelDataLength % 8)
214 channelDataLengthInWords++;
217 if (channelDataLengthInWords == payloadLengthInWords) {
227 if (!correctPacketCode)
250 if (goldenAddress == 0x00)
286 uint16_t lengthFromChannels = 0;
290 return lengthFromChannels;
307 summary <<
"FE units missing payloads: ";
310 summary << uint16_t(iFE) <<
" ";
316 unsigned int badChannels = 0;
330 summary <<
"Channels with errors: ";
335 summary << uint16_t(iCh) <<
" ";
341 summary <<
"Number of channels with bad status bits: " << badChannels << std::endl;
343 summary <<
"Check channel lengths match buffer length: "
347 summary <<
"Channels with bad packet codes: ";
352 summary << uint16_t(iCh) <<
" ";
359 summary <<
"Bad FE units:" << std::endl;
364 uint16_t lengthFromHeader = fdHeader->
feUnitLength(iFE);
365 if (lengthFromHeader != lengthFromChannels) {
366 summary <<
"FE unit: " << uint16_t(iFE) <<
" length in header: " << lengthFromHeader
367 <<
" length from channel lengths: " << lengthFromChannels << std::endl;
378 summary <<
"Address from APVe:" << uint16_t(goldenAddress) << std::endl;
379 summary <<
"Bad FE units:" << std::endl;
384 summary <<
"FE unit: " << uint16_t(iFE)
405 os <<
"FE units with data: " << uint16_t(
nFEUnitsPresent()) << std::endl;
406 os <<
"BE status register flags: ";
407 dynamic_cast<const FEDFullDebugHeader*>(
feHeader())->beStatusRegister().printFlags(os);
418 return "Channel length is invalid.";
420 return "First strip of new cluster is not greater than last strip of previous cluster.";
422 return "Invalid packet code.";
424 return "Invalid packet code 0 for zero-suppressed data.";