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

Public Member Functions

 CustomBinAxis (const std::string &name, size_t nbins, double start, double end)
 
virtual ~CustomBinAxis ()
 
CustomBinAxisclone () const
 
Bin1D getBin (size_t index) const
 
std::vector< double > getBinCenters () const
 
CustomBinAxiscreateClippedAxis (double left, double right) const
 
size_t size () const
 
double operator[] (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 > getBinBoundaries () 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

void print (std::ostream &ostr) const
 
bool equals (const IAxis &other) const
 
void setBinBoundaries (const std::vector< double > &bin_boundaries)
 

Protected Attributes

double m_start
 
double m_end
 
std::vector< double > m_bin_centers
 
size_t m_nbins
 

Private Attributes

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

Detailed Description

Axis with fixed bin size in sin(angle) space used for numerical comparison with IsGisaxs.

The main feature of the axis is that it produces zero bin sizes.

Definition at line 24 of file CustomBinAxis.h.

Constructor & Destructor Documentation

◆ CustomBinAxis()

CustomBinAxis::CustomBinAxis ( const std::string &  name,
size_t  nbins,
double  start,
double  end 
)

CustomBinAxis constructor.

Parameters
nameAxis name
nbinsnumber of bins
startcenter of first bin (IsGisaxs convention)
endcenter of last bin (IsGisaxs convention)

Definition at line 21 of file CustomBinAxis.cpp.

22  : VariableBinAxis(name, nbins), m_start(start), m_end(end)
23 {
24  if (m_start >= m_end)
25  throw Exceptions::LogicErrorException("CustomBinAxis::CustomBinAxis() -> Error."
26  " start >= end is not allowed.");
27 
28  double start_sin = std::sin(start);
29  double end_sin = std::sin(end);
30  double step = (end_sin - start_sin) / (m_nbins - 1); // m_nbins-1 is intentionally
31 
32  m_bin_centers.resize(m_nbins, 0.0);
33  for (size_t i = 0; i < m_bin_centers.size(); ++i) {
34  m_bin_centers[i] = std::asin(start_sin + i * step);
35  }
36 
37  std::vector<double> bin_boundaries;
38  bin_boundaries.resize(m_nbins + 1, 0.0);
39  for (size_t i = 0; i < bin_boundaries.size(); ++i) {
40  bin_boundaries[i] = std::asin(start_sin - step / 2. + step * i);
41  }
42  setBinBoundaries(bin_boundaries);
43 }
std::vector< double > m_bin_centers
Definition: CustomBinAxis.h:49
void setBinBoundaries(const std::vector< double > &bin_boundaries)
VariableBinAxis(const std::string &name, size_t nbins, const std::vector< double > &bin_boundaries)
VariableBinAxis constructor.

References m_bin_centers, m_end, VariableBinAxis::m_nbins, m_start, and VariableBinAxis::setBinBoundaries().

Referenced by clone().

Here is the call graph for this function:

◆ ~CustomBinAxis()

virtual CustomBinAxis::~CustomBinAxis ( )
inlinevirtual

Definition at line 33 of file CustomBinAxis.h.

33 {}

Member Function Documentation

◆ clone()

CustomBinAxis * CustomBinAxis::clone ( ) const
virtual

clone function

Implements IAxis.

Definition at line 45 of file CustomBinAxis.cpp.

46 {
47  return new CustomBinAxis(getName(), m_nbins, m_start, m_end);
48 }
CustomBinAxis(const std::string &name, size_t nbins, double start, double end)
CustomBinAxis constructor.
std::string getName() const
retrieve the label of the axis
Definition: IAxis.h:40

References CustomBinAxis(), IAxis::getName(), m_end, VariableBinAxis::m_nbins, and m_start.

Here is the call graph for this function:

◆ getBin()

Bin1D CustomBinAxis::getBin ( size_t  index) const
virtual

retrieve a 1d bin for the given index

Implements IAxis.

Definition at line 50 of file CustomBinAxis.cpp.

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

References m_bin_centers, and VariableBinAxis::m_nbins.

◆ getBinCenters()

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

Reimplemented from IAxis.

Definition at line 59 of file CustomBinAxis.cpp.

60 {
61  return m_bin_centers;
62 }

References m_bin_centers.

◆ createClippedAxis()

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

Creates a new clipped axis.

Reimplemented from VariableBinAxis.

Definition at line 64 of file CustomBinAxis.cpp.

65 {
66  throw Exceptions::NotImplementedException("VariableBinAxis::CustomBinAxis() -> Error."
67  " Not implemented.");
68 }

◆ print()

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

Reimplemented from VariableBinAxis.

Definition at line 70 of file CustomBinAxis.cpp.

71 {
72  ostr << "CustomBinAxis(\"" << getName() << "\", " << size() << ", "
73  << std::setprecision(std::numeric_limits<double>::digits10 + 2) << m_start << ", " << m_end
74  << ")";
75 }
size_t size() const
retrieve the number of bins

References IAxis::getName(), m_end, m_start, and VariableBinAxis::size().

Here is the call graph for this function:

◆ equals()

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

Reimplemented from VariableBinAxis.

Definition at line 77 of file CustomBinAxis.cpp.

78 {
79  if (!IAxis::equals(other))
80  return false;
81  if (const CustomBinAxis* otherAxis = dynamic_cast<const CustomBinAxis*>(&other)) {
82  if (size() != otherAxis->size())
83  return false;
84  if (!algo::almostEqual(m_start, otherAxis->m_start))
85  return false;
86  if (!algo::almostEqual(m_end, otherAxis->m_end))
87  return false;
88  return true;
89  }
90  return false;
91 }
Axis with fixed bin size in sin(angle) space used for numerical comparison with IsGisaxs.
Definition: CustomBinAxis.h:25
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_end, m_start, and VariableBinAxis::size().

Here is the call graph for this function:

◆ size()

size_t VariableBinAxis::size ( ) const
inlinevirtualinherited

◆ operator[]()

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

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 VariableBinAxis::getBin(), and Bin1D::getMidPoint().

Here is the call graph for this function:

◆ getMin()

double VariableBinAxis::getMin ( ) const
virtualinherited

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 }
std::vector< double > m_bin_boundaries
vector containing the bin limits

References VariableBinAxis::m_bin_boundaries.

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

◆ getMax()

double VariableBinAxis::getMax ( ) const
virtualinherited

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 VariableBinAxis::m_bin_boundaries.

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

◆ getBinCenter()

double VariableBinAxis::getBinCenter ( size_t  index) const
virtualinherited

Implements IAxis.

Definition at line 68 of file VariableBinAxis.cpp.

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

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

Here is the call graph for this function:

◆ findClosestIndex()

size_t VariableBinAxis::findClosestIndex ( double  value) const
virtualinherited

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 VariableBinAxis::getMax(), VariableBinAxis::getMin(), VariableBinAxis::m_bin_boundaries, and VariableBinAxis::m_nbins.

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

Here is the call graph for this function:

◆ getBinBoundaries()

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

Reimplemented from IAxis.

Definition at line 51 of file VariableBinAxis.h.

51 { return m_bin_boundaries; }

References VariableBinAxis::m_bin_boundaries.

Referenced by ConstKBinAxis::createClippedAxis().

◆ pyString()

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

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)
protectedinherited

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 VariableBinAxis::m_bin_boundaries.

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

◆ 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_start

double CustomBinAxis::m_start
protected

Definition at line 47 of file CustomBinAxis.h.

Referenced by clone(), CustomBinAxis(), equals(), and print().

◆ m_end

double CustomBinAxis::m_end
protected

Definition at line 48 of file CustomBinAxis.h.

Referenced by clone(), CustomBinAxis(), equals(), and print().

◆ m_bin_centers

std::vector<double> CustomBinAxis::m_bin_centers
protected

Definition at line 49 of file CustomBinAxis.h.

Referenced by CustomBinAxis(), getBin(), and getBinCenters().

◆ m_nbins

◆ m_bin_boundaries

◆ 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: