1 #ifndef _sdet_UUBDownsampleFilter_h_
2 #define _sdet_UUBDownsampleFilter_h_
5 #include <utl/TimeDistribution.h>
6 #include <utl/AugerUnits.h>
30 constexpr
int kFirCoefficients[] = { 5, 0, 12, 22, 0, -61, -96, 0, 256, 551, 681, 551, 256, 0, -96, -61, 0, 22, 12, 0, 5 };
33 constexpr
int kFirNormalizationBitShift = 11;
37 constexpr
int kADCSaturation = 4095;
46 return std::max(0, std::min(i, kADCSaturation));
61 const int m = utl::Length(kFirCoefficients);
66 for (
int i = m2; i; --i)
67 t.push_back(trace[i]);
69 for (
int i = 0; i < n; ++i)
70 t.push_back(trace[i]);
72 for (
int i = 1; i <=
m2; ++i)
73 t.push_back(trace[n-1-i]);
76 for (
int k = 0; k < n3; ++k) {
78 const int i = 3*k + phase;
79 for (
int j = 0; j <
m; ++j)
80 v += t[i + j] * kFirCoefficients[j];
81 v >>= kFirNormalizationBitShift;
96 const int m = utl::Length(kFirCoefficients);
102 for (
int i = m2; i; --i)
103 t.push_back(trace.
At(start + i));
105 const int stop = trace.
GetStop();
106 for (
int i = start; i <= stop; ++i)
107 t.push_back(trace.
At(i));
109 for (
int i = 1; i <=
m2; ++i)
110 t.push_back(trace.
At(stop - i));
114 for (
int k = startIndex; k < stopIndex; ++k) {
116 const int i = 3*k + phase - start;
117 for (
int j = 0; j <
m; ++j)
118 v += t[i + j] * kFirCoefficients[j];
119 v >>= kFirNormalizationBitShift;
128 template<
class Trace>
133 std::vector<Trace> r;
134 r.reserve(traces.size());
135 for (
const auto& t : traces)
141 template<
class Trace>
146 std::vector<Trace> r;
147 r.reserve(traces.size());
148 for (
const auto t : traces)
T At(const double time) const
int GetStart() const
First slot with data.
Histogram class for time distributions with suppressed empty bins.
constexpr double nanosecond
utl::TraceI UUBDownsampleFilter(const utl::TraceI &trace, const int phase=1)
int GetStop() const
Last slot with data (1 less than First slot if no data)
constexpr int FloorDiv(const int num, const int den)
int GetNumSlots() const
Number of slots from first slot with data up to last slot with data, including empty slots...
TimeDistribution< int > TimeDistributionI