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