BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
VariableBinAxis Class Reference
Inheritance diagram for VariableBinAxis:
Collaboration diagram for VariableBinAxis:

Public Member Functions

 VariableBinAxis (const std::string &name, size_t nbins, const std::vector< double > &bin_boundaries)
 
virtual ~VariableBinAxis ()
 
VariableBinAxisclone () const
 
size_t size () const
 
double operator[] (size_t index) const
 
Bin1D getBin (size_t index) const
 
double getMin () const
 
double getMax () const
 
double getBinCenter (size_t index) const
 
size_t findClosestIndex (double value) const
 
std::vector< double > getBinCenters () const
 
std::vector< double > getBinBoundaries () const
 
virtual VariableBinAxiscreateClippedAxis (double left, double right) const
 
std::string pyString (const std::string &units, size_t offset) const final
 
std::string getName () const
 
void setName (std::string name)
 
bool operator== (const IAxis &right) const
 
bool operator!= (const IAxis &right) const
 
virtual bool contains (double value) const
 

Protected Member Functions

 VariableBinAxis (const std::string &name, size_t nbins=0)
 
void setBinBoundaries (const std::vector< double > &bin_boundaries)
 
virtual void print (std::ostream &ostr) const
 
virtual bool equals (const IAxis &other) const
 

Protected Attributes

size_t m_nbins
 

Private Attributes

std::vector< double > m_bin_boundaries
 
std::string m_name
 

Detailed Description

Axis with variable bin size.

Definition at line 23 of file VariableBinAxis.h.

Constructor & Destructor Documentation

◆ VariableBinAxis() [1/2]

VariableBinAxis::VariableBinAxis ( const std::string &  name,
size_t  nbins,
const std::vector< double > &  bin_boundaries 
)

VariableBinAxis constructor.

Parameters
nameAxis name
nbinsnumber of bins
bin_boundariesArray of size nbins+1 containing low-edges for each bin and upper edge of last bin.

Definition at line 21 of file VariableBinAxis.cpp.

23  : IAxis(name), m_nbins(nbins)
24 {
25  if (m_nbins != bin_boundaries.size() - 1)
27  "VariableBinAxis::VariableBinAxis() -> Error! "
28  "The size of bin_boundaries should be of size [nbins+1].");
29 
30  setBinBoundaries(bin_boundaries);
31 }
IAxis(const std::string &name)
constructors
Definition: IAxis.h:28
void setBinBoundaries(const std::vector< double > &bin_boundaries)

References m_nbins, and setBinBoundaries().

Referenced by clone(), and createClippedAxis().

Here is the call graph for this function:

◆ ~VariableBinAxis()

virtual VariableBinAxis::~VariableBinAxis ( )
inlinevirtual

Definition at line 33 of file VariableBinAxis.h.

33 {}

◆ VariableBinAxis() [2/2]

VariableBinAxis::VariableBinAxis ( const std::string &  name,
size_t  nbins = 0 
)
protected

Definition at line 33 of file VariableBinAxis.cpp.

34  : IAxis(name), m_nbins(nbins)
35 {
36 }

Member Function Documentation

◆ clone()

VariableBinAxis * VariableBinAxis::clone ( ) const
virtual

clone function

Implements IAxis.

Definition at line 38 of file VariableBinAxis.cpp.

39 {
41  return result;
42 }
std::string getName() const
retrieve the label of the axis
Definition: IAxis.h:40
Axis with variable bin size.
VariableBinAxis(const std::string &name, size_t nbins, const std::vector< double > &bin_boundaries)
VariableBinAxis constructor.
std::vector< double > m_bin_boundaries
vector containing the bin limits

References IAxis::getName(), m_bin_boundaries, m_nbins, and VariableBinAxis().

Here is the call graph for this function:

◆ size()

size_t VariableBinAxis::size ( ) const
inlinevirtual

◆ operator[]()

double VariableBinAxis::operator[] ( size_t  index) const
virtual

indexed accessor retrieves a sample

Implements IAxis.

Definition at line 44 of file VariableBinAxis.cpp.

45 {
46  return getBin(index).getMidPoint();
47 }
Bin1D getBin(size_t index) const
retrieve a 1d bin for the given index
double getMidPoint() const
Definition: Bin.h:25

References getBin(), and Bin1D::getMidPoint().

Here is the call graph for this function:

◆ getBin()

Bin1D VariableBinAxis::getBin ( size_t  index) const
virtual

retrieve a 1d bin for the given index

Implements IAxis.

Definition at line 49 of file VariableBinAxis.cpp.

50 {
51  if (index >= m_nbins)
52  throw Exceptions::OutOfBoundsException("VariableBinAxis::getBin() -> Error. Wrong index.");
53 
54  Bin1D result(m_bin_boundaries[index], m_bin_boundaries[index + 1]);
55  return result;
56 }
Definition: Bin.h:20

References m_bin_boundaries, and m_nbins.

Referenced by createClippedAxis(), ConstKBinAxis::createClippedAxis(), getBinCenter(), getBinCenters(), and operator[]().

◆ getMin()

double VariableBinAxis::getMin ( ) const
virtual

Returns value of first point of axis.

Implements IAxis.

Definition at line 58 of file VariableBinAxis.cpp.

59 {
60  return m_bin_boundaries.front();
61 }

References m_bin_boundaries.

Referenced by createClippedAxis(), ConstKBinAxis::createClippedAxis(), and findClosestIndex().

◆ getMax()

double VariableBinAxis::getMax ( ) const
virtual

Returns value of last point of axis.

Implements IAxis.

Definition at line 63 of file VariableBinAxis.cpp.

64 {
65  return m_bin_boundaries.back();
66 }

References m_bin_boundaries.

Referenced by createClippedAxis(), ConstKBinAxis::createClippedAxis(), and findClosestIndex().

◆ getBinCenter()

double VariableBinAxis::getBinCenter ( size_t  index) const
virtual

Implements IAxis.

Definition at line 68 of file VariableBinAxis.cpp.

69 {
70  return getBin(index).getMidPoint();
71 }

References getBin(), and Bin1D::getMidPoint().

Here is the call graph for this function:

◆ findClosestIndex()

size_t VariableBinAxis::findClosestIndex ( double  value) const
virtual

find bin index which is best match for given value

Implements IAxis.

Definition at line 73 of file VariableBinAxis.cpp.

74 {
75  if (m_bin_boundaries.size() < 2)
77  "VariableBinAxis::findClosestIndex() -> Error! "
78  "VariableBinAxis not correctly initialized");
79  if (value < getMin()) {
80  return 0;
81  } else if (value >= getMax()) {
82  return m_nbins - 1;
83  }
84 
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)
88  --top_limit;
89  size_t nbin = top_limit - m_bin_boundaries.begin();
90  return nbin;
91 }
double getMax() const
Returns value of last point of axis.
double getMin() const
Returns value of first point of axis.

References getMax(), getMin(), m_bin_boundaries, and m_nbins.

Referenced by createClippedAxis(), and ConstKBinAxis::createClippedAxis().

Here is the call graph for this function:

◆ getBinCenters()

std::vector< double > VariableBinAxis::getBinCenters ( ) const
virtual

Reimplemented from IAxis.

Definition at line 93 of file VariableBinAxis.cpp.

94 {
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();
99  }
100  return result;
101 }
size_t size() const
retrieve the number of bins

References getBin(), Bin1D::getMidPoint(), and size().

Here is the call graph for this function:

◆ getBinBoundaries()

std::vector<double> VariableBinAxis::getBinBoundaries ( ) const
inlinevirtual

Reimplemented from IAxis.

Definition at line 51 of file VariableBinAxis.h.

51 { return m_bin_boundaries; }

References m_bin_boundaries.

Referenced by ConstKBinAxis::createClippedAxis().

◆ createClippedAxis()

VariableBinAxis * VariableBinAxis::createClippedAxis ( double  left,
double  right 
) const
virtual

Creates a new clipped axis.

Reimplemented from IAxis.

Reimplemented in ConstKBinAxis, and CustomBinAxis.

Definition at line 103 of file VariableBinAxis.cpp.

104 {
105 
106  if (left >= right)
107  throw Exceptions::LogicErrorException("VariableBinAxis::createClippedAxis() -> Error. "
108  "'left'' should be smaller than 'right'");
109 
110  if (left < getMin())
111  left = getBin(0).getMidPoint();
112  if (right >= getMax())
113  right = getBin(size() - 1).getMidPoint();
114 
115  size_t nbin1 = findClosestIndex(left);
116  size_t nbin2 = findClosestIndex(right);
117 
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]);
122  }
123 
124  return new VariableBinAxis(getName(), new_nbins, new_boundaries);
125 }
size_t findClosestIndex(double value) const
find bin index which is best match for given value

References findClosestIndex(), getBin(), getMax(), Bin1D::getMidPoint(), getMin(), IAxis::getName(), m_bin_boundaries, size(), and VariableBinAxis().

Here is the call graph for this function:

◆ pyString()

std::string VariableBinAxis::pyString ( const std::string &  units,
size_t  offset 
) const
finalvirtual

Implements IAxis.

Definition at line 127 of file VariableBinAxis.cpp.

128 {
129  throw std::runtime_error("VariableBinAxis::pyString not yet implemented"); // TODO
130 }

◆ setBinBoundaries()

void VariableBinAxis::setBinBoundaries ( const std::vector< double > &  bin_boundaries)
protected

Definition at line 160 of file VariableBinAxis.cpp.

161 {
162  // checking that values are sorted
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])
167  throw Exceptions::LogicErrorException("VariableBinAxis::VariableBinAxis() -> Error. "
168  "Array with bin edges is not sorted.");
169  }
170 
171  std::vector<double> vec = bin_boundaries;
172  vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
173 
174  if (vec.size() != bin_boundaries.size())
175  throw Exceptions::LogicErrorException("VariableBinAxis::VariableBinAxis() -> Error. "
176  "Array with bin edges contains repeating values.");
177 
178  m_bin_boundaries = bin_boundaries;
179 }

References m_bin_boundaries.

Referenced by ConstKBinAxis::ConstKBinAxis(), ConstKBinAxis::createClippedAxis(), CustomBinAxis::CustomBinAxis(), and VariableBinAxis().

◆ print()

void VariableBinAxis::print ( std::ostream &  ostr) const
protectedvirtual

Implements IAxis.

Reimplemented in ConstKBinAxis, and CustomBinAxis.

Definition at line 132 of file VariableBinAxis.cpp.

133 {
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)
138  ostr << ", ";
139  }
140  ostr << "])";
141 }

References IAxis::getName(), m_bin_boundaries, and size().

Here is the call graph for this function:

◆ equals()

bool VariableBinAxis::equals ( const IAxis other) const
protectedvirtual

Reimplemented from IAxis.

Reimplemented in ConstKBinAxis, and CustomBinAxis.

Definition at line 143 of file VariableBinAxis.cpp.

144 {
145  if (!IAxis::equals(other))
146  return false;
147  if (const VariableBinAxis* p_other_cast = dynamic_cast<const VariableBinAxis*>(&other)) {
148  if (size() != p_other_cast->size())
149  return false;
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])) {
152  return false;
153  }
154  }
155  return true;
156  }
157  return false;
158 }
virtual bool equals(const IAxis &other) const
Definition: IAxis.cpp:18
bool almostEqual(double a, double b)
Returns true if two doubles agree within machine epsilon.
Definition: Algorithms.h:30

References algo::almostEqual(), IAxis::equals(), m_bin_boundaries, and size().

Here is the call graph for this function:

◆ getName()

◆ setName()

void IAxis::setName ( std::string  name)
inlineinherited

Sets the axis label.

Definition at line 43 of file IAxis.h.

43 { m_name = name; }

References IAxis::m_name.

◆ operator==()

bool IAxis::operator== ( const IAxis right) const
inlineinherited

test for equality

Definition at line 63 of file IAxis.h.

63 { return equals(right); }

References IAxis::equals().

Here is the call graph for this function:

◆ operator!=()

bool IAxis::operator!= ( const IAxis right) const
inlineinherited

Definition at line 64 of file IAxis.h.

64 { return !(*this == right); }

◆ contains()

bool IAxis::contains ( double  value) const
virtualinherited

Returns true if axis contains given point.

Definition at line 40 of file IAxis.cpp.

41 {
42  return value >= getMin() && value < getMax();
43 }
virtual double getMin() const =0
Returns value of first point of axis.
virtual double getMax() const =0
Returns value of last point of axis.

References IAxis::getMax(), and IAxis::getMin().

Referenced by Histogram1D::crop(), Histogram2D::crop(), RectangularDetector::indexOfSpecular(), and SphericalDetector::indexOfSpecular().

Here is the call graph for this function:

Member Data Documentation

◆ m_nbins

◆ m_bin_boundaries

std::vector<double> VariableBinAxis::m_bin_boundaries
private

vector containing the bin limits

Definition at line 66 of file VariableBinAxis.h.

Referenced by clone(), createClippedAxis(), equals(), findClosestIndex(), getBin(), getBinBoundaries(), getMax(), getMin(), print(), and setBinBoundaries().

◆ m_name

std::string IAxis::m_name
privateinherited

axis name

Definition at line 92 of file IAxis.h.

Referenced by IAxis::getName(), and IAxis::setName().


The documentation for this class was generated from the following files: