Belle II Software  release-05-01-25
ParticleWeightingKeyMap.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2018 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Ilya Komarov *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <analysis/dbobjects/ParticleWeightingKeyMap.h>
12 #include <framework/logging/Logger.h>
13 
14 #include <utility>
15 
16 using namespace Belle2;
17 
18 void ParticleWeightingKeyMap::addAxis(const std::string& name)
19 {
20  auto* axis = new ParticleWeightingAxis();;
21  axis->setName(name);
22  // Note: map is sorted by keys (C++ standards)
23  m_axes.insert(std::make_pair(name, axis));
24 }
25 
26 
28 {
29  // Note: it is only possible to add axes to an empty key map
30  if (key_ID == m_outOfRangeBin) {
31  B2FATAL("You are trying create bin with ID identical to out-of-range Bin : " << m_outOfRangeBin);
32  return -1;
33  }
34 
35  if (m_axes.size() == 0) {
36  for (const auto& i_1dbin : bin) {
37  this->addAxis(i_1dbin.first);
38  }
39  }
40 
41  if (bin.size() != m_axes.size()) {
42  B2FATAL("Inconsistent dimensionality of added bin");
43  return -1;
44  }
45 
46  std::vector<int> bin_id_collection;
47  for (auto i_axis : m_axes) {
48  auto it = bin.find(i_axis.first);
49  if (it != bin.end()) {
50  bin_id_collection.push_back(i_axis.second->addBin(it->second));
51  } else {
52  B2FATAL("Names of bin and existing axes don't match");
53  return -1;
54  }
55  }
56 
57  for (auto i_bin : m_bins) {
58  if (std::equal(i_bin.first.begin(), i_bin.first.end(), bin_id_collection.begin())) {
59  B2FATAL("You tried to overwrite existing bin " + std::to_string(i_bin.second) + " with new ID " + std::to_string(key_ID));
60  return -1;
61  }
62  }
63 
64  m_bins.emplace_back(bin_id_collection, key_ID);
65  return key_ID;
66 }
67 
68 
70 {
71  return this->addKey(std::move(bin), m_bins.size());
72 }
73 
74 
75 double ParticleWeightingKeyMap::getKey(std::map<std::string, double> values) const
76 {
77  if (values.size() != m_axes.size()) {
78  B2FATAL("Inconsistent dimensionality of requested value map");
79  return -1;
80  }
81  std::vector<int> bin_id_collection;
82  for (auto i_axis : m_axes) {
83  auto it = values.find(i_axis.first);
84  if (it != values.end()) {
85  bin_id_collection.push_back(i_axis.second->findBin(it->second));
86  } else {
87  B2FATAL("Names of bin and existing axes don't match");
88  return -1;
89  }
90  }
91  for (auto i_bin : m_bins) {
92  if (std::equal(i_bin.first.begin(), i_bin.first.end(), bin_id_collection.begin())) {
93  return i_bin.second;
94  }
95  }
96  return m_outOfRangeBin;
97 }
98 
99 
100 std::vector<std::string> ParticleWeightingKeyMap::getNames() const
101 {
102  std::vector<std::string> names;
103  for (const auto& i_axis : m_axes) {
104  names.push_back(i_axis.first);
105  }
106  return names;
107 }
108 
109 
111 {
112  std::string axes_names = "";
113  for (auto i_axis : m_axes) {
114  axes_names += "'" + i_axis.first + "' bin;";
115  i_axis.second->printAxis();
116  }
117  B2INFO("Bin map \n <" + axes_names + "> : <gobal ID>");
118  for (const auto& i_bin : m_bins) {
119  std::string binIDs = "";
120  for (auto i_binid : i_bin.first) {
121  binIDs += std::to_string(i_binid) + "; ";
122  }
123  B2INFO(binIDs + " : " + std::to_string(i_bin.second));
124  }
125 
126 }
127 
128 
Belle2::ParticleWeightingKeyMap::getKey
double getKey(std::map< std::string, double > values) const
Get global bin ID for given observable values.
Definition: ParticleWeightingKeyMap.cc:75
Belle2::ParticleWeightingKeyMap::m_axes
std::map< std::string, ParticleWeightingAxis * > m_axes
Axes mapped with their names.
Definition: ParticleWeightingKeyMap.h:52
Belle2::ParticleWeightingKeyMap::addAxis
void addAxis(const std::string &name)
Add axis.
Definition: ParticleWeightingKeyMap.cc:18
Belle2::ParticleWeightingKeyMap::getNames
std::vector< std::string > getNames() const
Get vector of names ParticleWeightingKeyMap.
Definition: ParticleWeightingKeyMap.cc:100
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::ParticleWeightingKeyMap::m_outOfRangeBin
const int m_outOfRangeBin
We assign unique bin ID for out-of-range bin.
Definition: ParticleWeightingKeyMap.h:61
Belle2::NDBin
std::map< std::string, ParticleWeightingBinLimits * > NDBin
N-dim bin: pairs of bin limits with name of the axis variable.
Definition: ParticleWeightingKeyMap.h:42
Belle2::ParticleWeightingKeyMap::addKey
int addKey(NDBin bin, int key_ID)
Adding predefined ID to the table.
Definition: ParticleWeightingKeyMap.cc:27
Belle2::ParticleWeightingAxis
Class for handling LookUp tables.
Definition: ParticleWeightingAxis.h:36
Belle2::ParticleWeightingKeyMap::printKeyMap
void printKeyMap() const
Print content of the key map.
Definition: ParticleWeightingKeyMap.cc:110
Belle2::ParticleWeightingKeyMap::m_bins
std::vector< MultiDimBin > m_bins
Vector of keys.
Definition: ParticleWeightingKeyMap.h:56