11 #include <top/dbobjects/TOPASICPedestals.h>
12 #include <framework/logging/Logger.h>
25 int TOPASICPedestals::setPedestals(
const TProfile* profile,
double average)
27 int bad = c_WindowSize;
29 if (!profile)
return bad;
31 if (profile->GetNbinsX() != c_WindowSize) {
32 B2ERROR(
"TOPASICPedestals::setPedestals: TProfile with wrong number of bins");
36 if (profile->GetEntries() == 0) {
37 B2WARNING(
"TOPASICPedestals::setPedestals: TProfile with no entries");
41 std::vector<unsigned> values;
42 std::vector<unsigned> errors;
43 for (
int i = 0; i < c_WindowSize; i++) {
44 values.push_back(
int(profile->GetBinContent(i + 1) + average + 0.5));
45 errors.push_back(
int(profile->GetBinError(i + 1) + 0.5));
48 unsigned maxDif = 1 << c_Bits; maxDif--;
49 unsigned maxErr = 1 << (
sizeof(
unsigned short) * 8 - c_Bits); maxErr--;
50 m_offset = getOptimizedOffset(values, errors, maxDif, maxErr);
52 for (
int i = 0; i < c_WindowSize; i++) {
53 unsigned dif = values[i] - m_offset;
54 if (dif > maxDif)
continue;
55 unsigned err = errors[i];
56 if (err > maxErr)
continue;
57 if (err == 0) err = 1;
58 m_pedestals[i] = dif + (err << c_Bits);
67 unsigned TOPASICPedestals::getOptimizedOffset(
const std::vector<unsigned>& values,
68 const std::vector<unsigned>& errors,
73 std::set<unsigned> sortedValues;
74 for (
unsigned i = 0; i < values.size(); i++) {
75 if (errors[i] > maxErr)
continue;
76 sortedValues.insert(values[i]);
79 unsigned nprev = sortedValues.size();
81 for (
auto it = sortedValues.begin(); it != sortedValues.end(); ++it) {
83 for (
auto back = sortedValues.crbegin(); *back - *it > maxDif; ++back) {
86 unsigned nbad = nl + nr;
87 if (nbad == 0)
return *it;
88 if (nbad >= nprev)
return *(--it);
93 return *sortedValues.begin();