Pack data.
33{
34 const int dataFormat = subBlock.
format();
39 if (sliceL != 1 || sliceF != 5) return false;
45 std::vector<uint32_t> compStats(
s_formats);
46 std::vector<int> fadcDout(sliceF-1);
47 std::vector<int> fadcLens(sliceF-1);
49 std::vector<int> lutData;
50 std::vector<int> lutBcid;
51 std::vector<int> fadcData;
52 std::vector<int> fadcBcid;
53 subBlock.
ppmData(chan, lutData, fadcData, lutBcid, fadcBcid);
55 int dataPresent = lutData[0] || lutBcid[0];
56 if ( !dataPresent ) {
57 for (int sl = 0; sl < sliceF; ++sl) {
58 if (fadcData[sl] >= fadcThreshold || fadcBcid[sl]) {
59 dataPresent = 1;
60 break;
61 }
62 }
63 }
64 subBlock.
packer(dataPresent, 1);
65 if ( !dataPresent ) continue;
66 }
68 int minFadc = 0;
69 int minOffset = 0;
70 bool fadcSame = true;
71 for (int sl = 0; sl < sliceF; ++sl) {
72 if (sl == 0) minFadc = fadcData[sl];
73 if (fadcData[sl] < minFadc) {
74 minFadc = fadcData[sl];
75 minOffset = sl;
76 }
77 if (fadcData[sl] != fadcData[0] || fadcBcid[sl] != 0) fadcSame = false;
78 }
79 if (minOffset)
std::swap(fadcData[0], fadcData[minOffset]);
80
82 if (lutData[0] == 0 && lutBcid[0] == 0 && fadcSame) {
84 subBlock.
packer(header, 4);
85 if (fadcData[0]) {
88 }
else subBlock.
packer(0, 1);
90 } else {
91 const bool minFadcInRange = minFadc >= fadcBaseline &&
93 int anyFadcBcid = 0;
94 int maxFadcLen = 0;
96 for (int sl = 0; sl < sliceF; ++sl) {
97 if (sl != 0) {
98 fadcDout[
idx] = fadcData[sl] - minFadc;
100 if (idx == 0 || fadcLens[idx] > maxFadcLen) {
101 maxFadcLen = fadcLens[
idx];
102 }
104 }
105 if (sl != trigOffset) anyFadcBcid |= fadcBcid[sl];
106 else if (fadcBcid[sl] != (lutBcid[0] & 0x1)) anyFadcBcid |= 1;
107 }
108 if (lutData[0] == 0 && lutBcid[0] == 0 &&
109 !anyFadcBcid && minFadcInRange && maxFadcLen < 4) {
110
112 if (maxFadcLen == 3)
header += 5;
113 subBlock.
packer(header, 4);
114 minFadc -= fadcBaseline;
115 subBlock.
packer(minFadc, 4);
116 if (maxFadcLen < 2) maxFadcLen = 2;
117 for (
int idx = 0;
idx < sliceF-1; ++
idx) {
118 subBlock.
packer(fadcDout[idx], maxFadcLen);
119 }
121 } else if (lutLen <= 3 && ((lutData[0] == 0 && lutBcid[0] == 0) ||
123 && !anyFadcBcid && minFadcInRange && maxFadcLen <= 4) {
124
125 const int header = minOffset + 10;
126 subBlock.
packer(header, 4);
128 subBlock.
packer(format - 2, 2);
129 if (lutData[0]) {
131 subBlock.
packer(lutData[0], 3);
132 }
else subBlock.
packer(0, 1);
133 minFadc -= fadcBaseline;
134 subBlock.
packer(minFadc, 4);
135 for (
int idx = 0;
idx < sliceF-1; ++
idx) {
136 subBlock.
packer(fadcDout[idx], 4);
137 }
138 } else {
139
140 const int header = minOffset + 10;
141 subBlock.
packer(header, 4);
142 if ( !minFadcInRange) {
144 if (minFadcLen > maxFadcLen) maxFadcLen = minFadcLen;
145 }
147 if (maxFadcLen <= 8)
format = 4;
148 if (maxFadcLen <= 6)
format = 3;
149 subBlock.
packer(format - 2, 2);
150 if (lutData[0] || lutBcid[0]) subBlock.
packer(1, 1);
151 else subBlock.
packer(0, 1);
152 subBlock.
packer(anyFadcBcid, 1);
153 if (lutData[0] || lutBcid[0]) {
156 }
157 if (anyFadcBcid) {
158 for (
int idx = 0;
idx < sliceF; ++
idx) {
159 subBlock.
packer(fadcBcid[idx], 1);
160 }
161 }
162 if (minFadcInRange) {
164 minFadc -= fadcBaseline;
165 subBlock.
packer(minFadc, 4);
166 } else {
168 subBlock.
packer(minFadc, format * 2);
169 }
170 for (
int idx = 0;
idx < sliceF-1; ++
idx) {
171 if (fadcLens[idx] <= 4) {
173 subBlock.
packer(fadcDout[idx], 4);
174 } else {
176 subBlock.
packer(fadcDout[idx], format * 2);
177 }
178 }
179 }
180 }
182 }
183
186 int statusBit = 0;
187 int errorBit = 0;
192 if (status[pin]) statusBit = 1;
193 if (error[pin]) errorBit = 1;
194 }
195 subBlock.
packer(statusBit, 1);
196 subBlock.
packer(errorBit, 1);
197 if (statusBit || errorBit) {
199 if (status[pin] || error[pin]) subBlock.
packer(1, 1);
200 else subBlock.
packer(0, 1);
201 }
203 if (status[pin] || error[pin]) {
206 }
207 }
208 }
211 return true;
212}
static const int s_fadcRange
static const int s_errorBits
static const int s_lutBcidBits
static const int s_statusMask
static const int s_statusBits
static const int s_formats
static const int s_fadcDataBits
static const int s_peakOnly
static const int s_lutDataBits
static const int s_glinkPins
void setCompStats(const std::vector< uint32_t > &stats)
Set compression stats.
int ppmPinError(int pin) const
Return the error word for a G-Link pin.
void ppmData(int chan, std::vector< int > &lut, std::vector< int > &fadc, std::vector< int > &bcidLut, std::vector< int > &bcidFadc) const
Return unpacked data for given channel.
static int channelsPerSubBlock(int version, int format)
Return the number of channels per sub-block.
int fadcThreshold() const
static int minBits(uint32_t datum)
Return the minimum number of bits needed for given data.
void packer(uint32_t datum, int nbits)
Pack given data into given number of bits.
void packerFlush()
Flush the current data word padded with zeros.
void setStreamed()
Set continuous bit streaming for compressed formats.
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)