40 std::vector<Digit>&
digits = *outDigits;
41 std::vector<unsigned int> _ADC = {};
43 gsl::span<const ZeroSuppressedContainer8kb>& z0input = *z0in;
45 for (
auto inputPage : z0input) {
46 unsigned char* pageStart =
reinterpret_cast<unsigned char*
>(&inputPage);
47 unsigned char* startPtr = pageStart;
51 unsigned int _adcBits = (z0Container->
hdr.
version == 1) ? 10 : ((z0Container->
hdr.
version == 2) ? 12 : 0);
54 std::cout <<
"unsupported zero suppressed version" << std::endl;
60 uint16_t _CRUID = z0Container->
hdr.
cruID;
62 unsigned int mask =
static_cast<unsigned int>(pow(2, _adcBits)) - 1;
63 float decodeFactor = 1.0 / (1 << (_adcBits - 10));
66 auto orbit = o2::raw::RDHUtils::getHeartBeatOrbit(rdh);
70 startPtr += (
sizeof(z0Container->
rdh) +
sizeof(z0Container->
hdr));
73 startPtr += (startPtr - pageStart) % 2;
75 unsigned int numberRows = __builtin_popcount((tbHdr->
rowMask & 0x7FFF));
76 if (startPtr > nextPage) {
77 throw std::runtime_error(
"pointer for time bin outside current zs page");
80 unsigned int _timeBin = timeBin + tb;
83 if ((numberRows != 0)) {
84 startPtr += 2 * numberRows;
85 for (
unsigned int pos = 0;
pos < 15;
pos++) {
87 unsigned int _row =
pos + rowUpperOffset;
88 uint8_t numberSequences = *startPtr;
89 uint8_t numberADCs = *(startPtr + (2 * numberSequences));
91 unsigned char* _adcstart = startPtr + 2 * numberSequences + 1;
92 unsigned int length = (numberADCs * _adcBits + 7) / 8;
93 unsigned int temp = 0;
95 unsigned int shift = 0;
97 unsigned int count = 0;
98 if (_adcstart +
length > nextPage) {
99 throw std::runtime_error(
"pointer for current sequence outside current zs page");
101 for (
unsigned int a = 0;
a <
length;
a++) {
102 temp = (*_adcstart) << shift;
106 while (shift >= _adcBits) {
114 for (
unsigned int nADC = 0; nADC < numberADCs; nADC++) {
115 for (
unsigned int seq = 0; seq < numberSequences; seq++) {
116 unsigned int seqLength = seq ? startPtr[2 * (seq + 1)] - startPtr[2 * seq] : startPtr[2];
117 for (
unsigned int s = 0; s < seqLength; s++) {
118 digits.emplace_back(
Digit((
int)_CRUID, (
float)(_ADC[nADC] * decodeFactor), (
int)(_row + mapper.
getGlobalRowOffsetRegion(_CRUID % 10)), (
int)(*(startPtr + 2 * seq + 1) + s), _timeBin));
123 startPtr += (numberSequences * 2) +
length + 1;