Belle II Software  release-08-01-10
BackgroundPDF.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <top/reconstruction_cpp/BackgroundPDF.h>
10 #include <top/reconstruction_cpp/TOPRecoManager.h>
11 #include <framework/logging/Logger.h>
12 
13 using namespace std;
14 
15 namespace Belle2 {
20  namespace TOP {
21 
22  BackgroundPDF::BackgroundPDF(int moduleID):
23  m_moduleID(moduleID)
24  {
25  const auto* yScanner = TOPRecoManager::getYScanner(moduleID);
26  if (not yScanner) B2FATAL("TOP::BackgroundPDF: invalid slot number, moduleID = " << moduleID);
27 
28  const auto& pixelPositions = yScanner->getPixelPositions().getPixels();
29  const auto& pixelMasks = yScanner->getPixelMasks().getMasks();
30  const auto& pixelEfficiencies = yScanner->getPixelEfficiencies().getEfficiencies();
31 
32  if (pixelMasks.size() != pixelPositions.size() or pixelEfficiencies.size() != pixelPositions.size()) {
33  B2FATAL("TOP::BackgroundPDF: pixel positions, masks and efficiencies have different sizes for slot " << moduleID
34  << LogVar("pixelPositions.size()", pixelPositions.size())
35  << LogVar("pixelMasks.size()", pixelMasks.size())
36  << LogVar("pixelEfficiencies.size()", pixelEfficiencies.size()));
37  }
38 
39  m_pdf.resize(pixelPositions.size(), 0);
40  set();
41  }
42 
43 
45  {
46  const auto* yScanner = TOPRecoManager::getYScanner(m_moduleID);
47  const auto& pixelPositions = yScanner->getPixelPositions().getPixels();
48  const auto& pixelMasks = yScanner->getPixelMasks().getMasks();
49  const auto& pixelEfficiencies = yScanner->getPixelEfficiencies().getEfficiencies();
50 
51  double S = 0;
52  for (size_t i = 0; i < m_pdf.size(); i++) {
53  const auto& pixel = pixelPositions[i];
54  double s = pixel.Dx * pixel.Dy;
55  S += s;
56  if (pixelMasks[i]) {
57  m_pdf[i] = s * pixelEfficiencies[i];
58  } else {
59  m_pdf[i] = 0;
60  }
61  }
62 
63  double sum = 0;
64  for (auto pdf : m_pdf) sum += pdf;
65  if (sum == 0) return;
66 
67  for (auto& pdf : m_pdf) pdf /= sum;
68  m_effi = sum / S;
69  }
70 
71 
72  double BackgroundPDF::getPDFValue(int pixelID) const
73  {
74  unsigned k = pixelID - 1;
75  if (k < m_pdf.size()) return m_pdf[k] / TOPRecoManager::getTimeWindowSize();
76  return 0;
77  }
78 
79  } // namespace TOP
81 } // namespace Belle2
82 
83 
double getPDFValue(int pixelID) const
Returns PDF value for given pixel.
void set()
Sets the PDF.
double m_effi
average relative efficiency
Definition: BackgroundPDF.h:67
std::vector< double > m_pdf
pixel part of PDF (index = pixelID - 1)
Definition: BackgroundPDF.h:66
static double getTimeWindowSize()
Returns size of time window.
static const YScanner * getYScanner(int moduleID)
Returns y-scanner of a given module.
Class to store variables with their name which were sent to the logging service.
Abstract base class for different kinds of events.