22 const std::vector<double>& bin_boundaries)
23 :
IAxis(name), m_nbins(nbins)
25 if (m_nbins != bin_boundaries.size() - 1)
27 "VariableBinAxis::VariableBinAxis() -> Error! "
28 "The size of bin_boundaries should be of size [nbins+1].");
30 setBinBoundaries(bin_boundaries);
34 :
IAxis(name), m_nbins(nbins)
46 return getBin(index).getMidPoint();
54 Bin1D result(m_bin_boundaries[index], m_bin_boundaries[index + 1]);
60 return m_bin_boundaries.front();
65 return m_bin_boundaries.back();
68 double VariableBinAxis::getBinCenter(
size_t index)
const
70 return getBin(index).getMidPoint();
75 if (m_bin_boundaries.size() < 2)
77 "VariableBinAxis::findClosestIndex() -> Error! "
78 "VariableBinAxis not correctly initialized");
81 }
else if (value >=
getMax()) {
85 std::vector<double>::const_iterator top_limit =
86 std::lower_bound(m_bin_boundaries.begin(), m_bin_boundaries.end(), value);
87 if (*top_limit != value)
89 size_t nbin = top_limit - m_bin_boundaries.begin();
93 std::vector<double> VariableBinAxis::getBinCenters()
const
95 std::vector<double> result;
96 result.resize(
size(), 0.0);
97 for (
size_t i = 0; i <
size(); ++i) {
98 result[i] =
getBin(i).getMidPoint();
108 "'left'' should be smaller than 'right'");
111 left =
getBin(0).getMidPoint();
118 size_t new_nbins = nbin2 - nbin1 + 1;
119 std::vector<double> new_boundaries;
120 for (
size_t i = 0; i < new_nbins + 1; ++i) {
121 new_boundaries.push_back(m_bin_boundaries[nbin1 + i]);
127 std::string VariableBinAxis::pyString(
const std::string&,
size_t)
const
129 throw std::runtime_error(
"VariableBinAxis::pyString not yet implemented");
132 void VariableBinAxis::print(std::ostream& ostr)
const
134 ostr <<
"VariableBinAxis(\"" <<
getName() <<
"\", " <<
size() <<
", [";
135 for (
size_t i = 0; i < m_bin_boundaries.size(); ++i) {
136 ostr << std::setprecision(std::numeric_limits<double>::digits10 + 2) << m_bin_boundaries[i];
137 if (i != m_bin_boundaries.size() - 1)
143 bool VariableBinAxis::equals(
const IAxis& other)
const
145 if (!IAxis::equals(other))
148 if (
size() != p_other_cast->size())
150 for (
size_t i = 0; i < m_bin_boundaries.size(); ++i) {
151 if (!
algo::almostEqual(m_bin_boundaries[i], p_other_cast->m_bin_boundaries[i])) {
160 void VariableBinAxis::setBinBoundaries(
const std::vector<double>& bin_boundaries)
163 std::vector<double> vec_sorted = bin_boundaries;
164 std::sort(vec_sorted.begin(), vec_sorted.end());
165 for (
size_t i = 0; i < bin_boundaries.size(); ++i) {
166 if (vec_sorted[i] != bin_boundaries[i])
168 "Array with bin edges is not sorted.");
171 std::vector<double> vec = bin_boundaries;
172 vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
174 if (vec.size() != bin_boundaries.size())
176 "Array with bin edges contains repeating values.");
178 m_bin_boundaries = bin_boundaries;
Defines and implements namespace algo with some algorithms.
Defines many exception classes in namespace Exceptionss.
Defines class VariableBinAxis.
Interface for one-dimensional axes.
std::string getName() const
retrieve the label of the axis
Axis with variable bin size.
double getMax() const
Returns value of last point of axis.
size_t size() const
retrieve the number of bins
double operator[](size_t index) const
indexed accessor retrieves a sample
Bin1D getBin(size_t index) const
retrieve a 1d bin for the given index
double getMin() const
Returns value of first point of axis.
VariableBinAxis(const std::string &name, size_t nbins, const std::vector< double > &bin_boundaries)
VariableBinAxis constructor.
virtual VariableBinAxis * createClippedAxis(double left, double right) const
Creates a new clipped axis.
size_t findClosestIndex(double value) const
find bin index which is best match for given value
VariableBinAxis * clone() const
clone function
bool almostEqual(double a, double b)
Returns true if two doubles agree within machine epsilon.