35 const int dataFormat = subBlock.
format();
40 if (sliceL != 1 || sliceF != 5)
return false;
46 std::vector<uint32_t> compStats(
s_formats);
47 std::vector<int> fadcDout(sliceF-1);
48 std::vector<int> fadcLens(sliceF-1);
49 for (
int chan = 0; chan < channels; ++chan) {
50 std::vector<int> lutData;
51 std::vector<int> lutBcid;
52 std::vector<int> fadcData;
53 std::vector<int> fadcBcid;
54 subBlock.
ppmData(chan, lutData, fadcData, lutBcid, fadcBcid);
56 int dataPresent = lutData[0] || lutBcid[0];
58 for (
int sl = 0; sl < sliceF; ++sl) {
59 if (fadcData[sl] >= fadcThreshold || fadcBcid[sl]) {
65 subBlock.
packer(dataPresent, 1);
66 if ( !dataPresent )
continue;
68 const int lutLen = subBlock.
minBits(lutData[0]);
72 for (
int sl = 0; sl < sliceF; ++sl) {
73 if (sl == 0) minFadc = fadcData[sl];
74 if (fadcData[sl] < minFadc) {
75 minFadc = fadcData[sl];
78 if (fadcData[sl] != fadcData[0] || fadcBcid[sl] != 0) fadcSame =
false;
80 if (minOffset)
std::swap(fadcData[0], fadcData[minOffset]);
83 if (lutData[0] == 0 && lutBcid[0] == 0 && fadcSame) {
89 }
else subBlock.
packer(0, 1);
92 const bool minFadcInRange = minFadc >= fadcBaseline &&
97 for (
int sl = 0; sl < sliceF; ++sl) {
99 fadcDout[idx] = fadcData[sl] - minFadc;
100 fadcLens[idx] = subBlock.
minBits(fadcDout[idx]);
101 if (idx == 0 || fadcLens[idx] > maxFadcLen) {
102 maxFadcLen = fadcLens[idx];
106 if (sl != trigOffset) anyFadcBcid |= fadcBcid[sl];
107 else if (fadcBcid[sl] != (lutBcid[0] & 0x1)) anyFadcBcid |= 1;
109 if (lutData[0] == 0 && lutBcid[0] == 0 &&
110 !anyFadcBcid && minFadcInRange && maxFadcLen < 4) {
113 if (maxFadcLen == 3)
header += 5;
115 minFadc -= fadcBaseline;
116 subBlock.
packer(minFadc, 4);
117 if (maxFadcLen < 2) maxFadcLen = 2;
118 for (
int idx = 0; idx < sliceF-1; ++idx) {
119 subBlock.
packer(fadcDout[idx], maxFadcLen);
121 format = maxFadcLen - 2;
122 }
else if (lutLen <= 3 && ((lutData[0] == 0 && lutBcid[0] == 0) ||
124 && !anyFadcBcid && minFadcInRange && maxFadcLen <= 4) {
126 const int header = minOffset + 10;
129 subBlock.
packer(format - 2, 2);
132 subBlock.
packer(lutData[0], 3);
133 }
else subBlock.
packer(0, 1);
134 minFadc -= fadcBaseline;
135 subBlock.
packer(minFadc, 4);
136 for (
int idx = 0; idx < sliceF-1; ++idx) {
137 subBlock.
packer(fadcDout[idx], 4);
141 const int header = minOffset + 10;
143 if ( !minFadcInRange) {
144 const int minFadcLen = subBlock.
minBits(minFadc);
145 if (minFadcLen > maxFadcLen) maxFadcLen = minFadcLen;
148 if (maxFadcLen <= 8) format = 4;
149 if (maxFadcLen <= 6) format = 3;
150 subBlock.
packer(format - 2, 2);
151 if (lutData[0] || lutBcid[0]) subBlock.
packer(1, 1);
152 else subBlock.
packer(0, 1);
153 subBlock.
packer(anyFadcBcid, 1);
154 if (lutData[0] || lutBcid[0]) {
159 for (
int idx = 0; idx < sliceF; ++idx) {
160 subBlock.
packer(fadcBcid[idx], 1);
163 if (minFadcInRange) {
165 minFadc -= fadcBaseline;
166 subBlock.
packer(minFadc, 4);
169 subBlock.
packer(minFadc, format * 2);
171 for (
int idx = 0; idx < sliceF-1; ++idx) {
172 if (fadcLens[idx] <= 4) {
174 subBlock.
packer(fadcDout[idx], 4);
177 subBlock.
packer(fadcDout[idx], format * 2);
193 if (status[pin]) statusBit = 1;
194 if (
error[pin]) errorBit = 1;
196 subBlock.
packer(statusBit, 1);
197 subBlock.
packer(errorBit, 1);
198 if (statusBit || errorBit) {
200 if (status[pin] ||
error[pin]) subBlock.
packer(1, 1);
201 else subBlock.
packer(0, 1);
204 if (status[pin] ||
error[pin]) {
250 if (sliceL != 1 || sliceF != 5) {
255 const int pedestal = subBlock.
pedestal();
260 std::vector<int> lutData;
261 std::vector<int> lutBcid;
262 std::vector<int> fadcData;
263 std::vector<int> fadcBcid;
264 for (
int chan = 0; chan < channels; ++chan) {
273 const int minOffset =
header % 5;
276 lutData.push_back(0);
277 lutBcid.push_back(0);
280 for (
int sl = 0; sl < sliceF; ++sl) {
281 if (sl == minOffset) fadcData.push_back(minFadc);
282 else fadcData.push_back(subBlock.
unpacker(format + 2) + minFadc);
283 fadcBcid.push_back(0);
287 const int minOffset =
header - 10;
289 const int anyLut = subBlock.
unpacker(1);
298 lutData.push_back(lut);
299 lutBcid.push_back(bcid);
302 for (
int sl = 0; sl < sliceF; ++sl) {
303 if (sl == minOffset) fadcData.push_back(minFadc);
304 else fadcData.push_back(subBlock.
unpacker(format + 2) + minFadc);
305 fadcBcid.push_back(0);
309 const int anyBcid = subBlock.
unpacker(1);
315 lutData.push_back(lut);
316 lutBcid.push_back(bcid);
318 for (
int sl = 0; sl < sliceF; ++sl) {
320 if (sl == trigOffset) fbcid = bcid & 0x1;
321 else if (anyBcid) fbcid = subBlock.
unpacker(1);
322 fadcBcid.push_back(fbcid);
327 for (
int sl = 0; sl < sliceF; ++sl) {
329 if (sl != minOffset) {
333 fadcData.push_back(fadc);
337 subBlock.
fillPpmData(chan, lutData, fadcData, lutBcid, fadcBcid);
356 if (sliceL != 1 || sliceF != 5) {
361 const int pedestal = subBlock.
pedestal();
365 std::vector<uint32_t> compStats(
s_formats);
366 std::vector<int> lutData;
367 std::vector<int> lutBcid;
368 std::vector<int> fadcData;
369 std::vector<int> fadcBcid;
370 for (
int chan = 0; chan < channels; ++chan) {
379 const int minOffset =
header % 5;
382 lutData.push_back(0);
383 lutBcid.push_back(0);
386 fadcData.push_back(minFadc);
387 fadcBcid.push_back(0);
388 for (
int sl = 1; sl < sliceF; ++sl) {
389 fadcData.push_back(subBlock.
unpacker(format + 2) + minFadc);
390 fadcBcid.push_back(0);
392 if (minOffset)
std::swap(fadcData[0], fadcData[minOffset]);
395 const int minOffset =
header - 10;
397 const int anyLut = subBlock.
unpacker(1);
406 lutData.push_back(lut);
407 lutBcid.push_back(bcid);
410 fadcData.push_back(minFadc);
411 fadcBcid.push_back(0);
412 for (
int sl = 1; sl < sliceF; ++sl) {
413 fadcData.push_back(subBlock.
unpacker(format + 2) + minFadc);
414 fadcBcid.push_back(0);
416 if (minOffset)
std::swap(fadcData[0], fadcData[minOffset]);
419 const int anyBcid = subBlock.
unpacker(1);
425 lutData.push_back(lut);
426 lutBcid.push_back(bcid);
428 for (
int sl = 0; sl < sliceF; ++sl) {
430 if (sl == trigOffset) fbcid = bcid & 0x1;
431 else if (anyBcid) fbcid = subBlock.
unpacker(1);
432 fadcBcid.push_back(fbcid);
437 fadcData.push_back(minFadc);
438 for (
int sl = 1; sl < sliceF; ++sl) {
440 if (subBlock.
unpacker(1)) len = format * 2;
441 fadcData.push_back(subBlock.
unpacker(len) + minFadc);
443 if (minOffset)
std::swap(fadcData[0], fadcData[minOffset]);
449 lutData.push_back(0);
450 lutBcid.push_back(0);
454 for (
int sl = 0; sl < sliceF; ++sl) {
455 fadcData.push_back(fadc);
456 fadcBcid.push_back(0);
459 subBlock.
fillPpmData(chan, lutData, fadcData, lutBcid, fadcBcid);
463 const int statusBit = subBlock.
unpacker(1);
464 const int errorBit = subBlock.
unpacker(1);
465 if (statusBit || errorBit) {
490 const int dataFormat = subBlock.
format();
496 const int compressionVersion = subBlock.
seqno();
501 if (compressionVersion == 5) {
503 if (run < 88701 || run > 88724) {
510 if (sliceL != 1 || sliceF != 5) {
519 std::vector<uint32_t> compStats(
s_formats);
520 std::vector<int> lutData;
521 std::vector<int> lutBcid;
522 std::vector<int> fadcData;
523 std::vector<int> fadcBcid;
524 for (
int chan = 0; chan < channels; ++chan) {
526 if ( !subBlock.
unpacker(1) )
continue;
536 const int minOffset =
header % 5;
539 lutData.push_back(0);
540 lutBcid.push_back(0);
542 const int minFadc = subBlock.
unpacker(4) + fadcBaseline;
543 fadcData.push_back(minFadc);
544 fadcBcid.push_back(0);
545 for (
int sl = 1; sl < sliceF; ++sl) {
546 fadcData.push_back(subBlock.
unpacker(format + 2) + minFadc);
547 fadcBcid.push_back(0);
549 if (minOffset)
std::swap(fadcData[0], fadcData[minOffset]);
552 const int minOffset =
header - 10;
554 const int anyLut = subBlock.
unpacker(1);
563 lutData.push_back(lut);
564 lutBcid.push_back(bcid);
566 const int minFadc = subBlock.
unpacker(4) + fadcBaseline;
567 fadcData.push_back(minFadc);
568 fadcBcid.push_back(0);
569 for (
int sl = 1; sl < sliceF; ++sl) {
570 fadcData.push_back(subBlock.
unpacker(format + 2) + minFadc);
571 fadcBcid.push_back(0);
573 if (minOffset)
std::swap(fadcData[0], fadcData[minOffset]);
576 const int anyBcid = subBlock.
unpacker(1);
582 lutData.push_back(lut);
583 lutBcid.push_back(bcid);
585 for (
int sl = 0; sl < sliceF; ++sl) {
587 if (anyBcid) fbcid = subBlock.
unpacker(1);
588 else if (sl == trigOffset) fbcid = bcid & 0x1;
589 fadcBcid.push_back(fbcid);
593 else minFadc = subBlock.
unpacker(4) + fadcBaseline;
594 fadcData.push_back(minFadc);
595 for (
int sl = 1; sl < sliceF; ++sl) {
597 if (subBlock.
unpacker(1)) len = format * 2;
598 fadcData.push_back(subBlock.
unpacker(len) + minFadc);
600 if (minOffset)
std::swap(fadcData[0], fadcData[minOffset]);
606 lutData.push_back(0);
607 lutBcid.push_back(0);
611 for (
int sl = 0; sl < sliceF; ++sl) {
612 fadcData.push_back(fadc);
613 fadcBcid.push_back(0);
616 subBlock.
fillPpmData(chan, lutData, fadcData, lutBcid, fadcBcid);
620 const int statusBit = subBlock.
unpacker(1);
621 const int errorBit = subBlock.
unpacker(1);
622 const bool mcmAbsentIsError = compressionVersion < 4;
625 if (statusBit || errorBit) {
634 if (statusBit) status = subBlock.
unpacker(sBits);
void fillPpmData(int chan, const std::vector< int > &lut, const std::vector< int > &fadc, const std::vector< int > &bcidLut, const std::vector< int > &bcidFadc)
Store PPM data for later packing.
void ppmData(int chan, std::vector< int > &lut, std::vector< int > &fadc, std::vector< int > &bcidLut, std::vector< int > &bcidFadc)
Return unpacked data for given channel.