Belle II Software  release-05-01-25
TOPASICPedestals.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Marko Staric *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <top/dbobjects/TOPASICPedestals.h>
12 #include <framework/logging/Logger.h>
13 
14 #include <set>
15 #include <iostream>
16 
17 using namespace std;
18 
19 namespace Belle2 {
25  int TOPASICPedestals::setPedestals(const TProfile* profile, double average)
26  {
27  int bad = c_WindowSize;
28 
29  if (!profile) return bad;
30 
31  if (profile->GetNbinsX() != c_WindowSize) {
32  B2ERROR("TOPASICPedestals::setPedestals: TProfile with wrong number of bins");
33  return bad;
34  }
35 
36  if (profile->GetEntries() == 0) {
37  B2WARNING("TOPASICPedestals::setPedestals: TProfile with no entries");
38  return bad;
39  }
40 
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));
46  }
47 
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);
51 
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);
59  bad--;
60  }
61 
62  return bad;
63 
64  }
65 
66 
67  unsigned TOPASICPedestals::getOptimizedOffset(const std::vector<unsigned>& values,
68  const std::vector<unsigned>& errors,
69  unsigned maxDif,
70  unsigned maxErr)
71  {
72 
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]);
77  }
78 
79  unsigned nprev = sortedValues.size();
80  unsigned nl = 0;
81  for (auto it = sortedValues.begin(); it != sortedValues.end(); ++it) {
82  unsigned nr = 0;
83  for (auto back = sortedValues.crbegin(); *back - *it > maxDif; ++back) {
84  nr++;
85  }
86  unsigned nbad = nl + nr;
87  if (nbad == 0) return *it;
88  if (nbad >= nprev) return *(--it);
89  nprev = nbad;
90  nl++;
91  }
92 
93  return *sortedValues.begin();
94 
95  }
96 
98 } // end Belle2 namespace
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19