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 <analysis/dbobjects/ParticleWeightingAxis.h>
11#include <analysis/dbobjects/ParticleWeightingBinLimits.h>
12#include <framework/logging/Logger.h>
13
14#include <utility>
15
16using namespace Belle2;
17
18void 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
75double 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
100std::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 + "> : <global 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
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.