11 #include <ecl/digitization/ECLCompress.h>
12 #include <ecl/digitization/EclConfiguration.h>
18 unsigned int Belle2::ECL::ilog2(
unsigned int v)
20 static const unsigned char MultiplyDeBruijnBitPosition[32] = {
21 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
22 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
31 return MultiplyDeBruijnBitPosition[(v * 0x07C4ACDDU) >> 27];
36 int amin = adc[0], amax = adc[0];
38 amax = std::max(amax, adc[i]);
39 amin = std::min(amin, adc[i]);
43 out.putNBits(amin, 18);
44 unsigned int w = ilog2(amax - amin) + 1;
49 unsigned int d = adc[i] - amin;
56 unsigned int amin = out.getNBits(18), w = out.getNBits(5);
58 adc[i] = amin + out.getNBits(w);
63 int a0 = adc[0], dmin = 0, dmax = 0;
66 dmin = std::min(dmin, d);
67 dmax = std::max(dmax, d);
71 unsigned int w = ilog2(std::max(2 * dmax, -2 * dmin)) + 1;
75 a0 = adc[0] & 0x3ffff;
78 unsigned int base = 1 << (w - 1);
80 unsigned int d = int(adc[i]) - a0 + base;
88 unsigned int w = out.getNBits(4);
89 adc[0] = out.getNBits(18);
90 unsigned int base = 1 << (w - 1);
92 adc[i] = adc[i - 1] + out.getNBits(w) - base;
141 width_t widths_phs2_scale10[] = {
184 int ax = abs(x), m0 = 1 << (w.w0 - 1), m1 = 1 << (w.w1 - 1), m2 = 1 << (w.w2 - 1);
187 }
else if (ax < m1) {
188 OUT.
putNBits((x << w.w0) | m0, w.w1 + w.w0);
189 }
else if (ax < m2) {
190 OUT.
putNBits((m1 << w.w0) | m0, w.w1 + w.w0);
193 OUT.
putNBits((m1 << w.w0) | m0, w.w1 + w.w0);
206 int m0 = 1 << (w.w0 - 1), m1 = 1 << (w.w1 - 1), m2 = 1 << (w.w2 - 1);
215 t = (t << (32 - w.w2)) >> (32 - w.w2);
218 t = (t << (32 - w.w1)) >> (32 - w.w1);
221 t = (t << (32 - w.w0)) >> (32 - w.w0);
231 void e10_31(
const double* I,
double* O);
237 void e01_31(
const double* I,
double* O);
245 double buf[N], out[N];
246 for (
int k = 0; k < N; k++) buf[k] = a[k];
248 for (
int k = 0; k < N; k++) out[k] *= 1.0 / (2 * N);
251 for (; km > 16; --km)
if (lrint(out[km - 1]*
m_scale) != 0)
break;
254 for (
int k = 0; k < km; k++) {
255 int t = lrint(out[k] *
m_scale);
262 const double iscale = 1 /
m_scale;
265 for (
int i = 0; i < N - nz; i++) adc[i] = fetch_int(in,
m_widths[i]);
266 for (
int i = N - nz; i < N; i++) adc[i] = 0;
269 for (
int k = 0; k < N; k++) c[k] = adc[k] * iscale;
274 for (
int k = 0; k < N; k++) adc[k] = lrint(out[k]);
282 }
else if (compAlgo == 2) {
284 }
else if (compAlgo == 3) {
286 }
else if (compAlgo == 4) {