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

Public Member Functions

 ConstKBinAxis (const std::string &name, size_t nbins, double start, double end)
 
 ~ConstKBinAxis () final
 
ConstKBinAxisclone () const final
 
ConstKBinAxiscreateClippedAxis (double left, double right) const final
 
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
 
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

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

Protected Attributes

double m_start
 
double m_end
 
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.

Definition at line 23 of file ConstKBinAxis.h.

Constructor & Destructor Documentation

◆ ConstKBinAxis() [1/2]

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

ConstKBinAxis constructor.

Parameters
nameAxis name
nbinsnumber of bins
startlow edge of first bin
endupper edge of last bin

Definition at line 25 of file ConstKBinAxis.cpp.

26  : VariableBinAxis(name, nbins), m_start(start), m_end(end)
27 {
28  if (m_start >= m_end)
30  "ConstKBinAxis::ConstKBinAxis() -> Error. start >= end is not allowed.");
31 
32  double start_sin = std::sin(m_start);
33  double end_sin = std::sin(m_end);
34  double step = (end_sin - start_sin) / (m_nbins);
35 
36  std::vector<double> bin_boundaries;
37  bin_boundaries.resize(m_nbins + 1, 0.0);
38  for (size_t i = 0; i < bin_boundaries.size(); ++i) {
39  bin_boundaries[i] = std::asin(start_sin + step * i);
40  }
41  setBinBoundaries(bin_boundaries);
42 }
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_end, VariableBinAxis::m_nbins, m_start, and VariableBinAxis::setBinBoundaries().

Referenced by clone(), and createClippedAxis().

Here is the call graph for this function:

◆ ~ConstKBinAxis()

ConstKBinAxis::~ConstKBinAxis ( )
inlinefinal

Definition at line 32 of file ConstKBinAxis.h.

32 {}

◆ ConstKBinAxis() [2/2]

ConstKBinAxis::ConstKBinAxis ( const std::string &  name,
size_t  nbins 
)
protected

Definition at line 20 of file ConstKBinAxis.cpp.

21  : VariableBinAxis(name, nbins), m_start(0), m_end(0)
22 {
23 }

Member Function Documentation

◆ clone()

ConstKBinAxis * ConstKBinAxis::clone ( ) const
finalvirtual

clone function

Implements IAxis.

Definition at line 44 of file ConstKBinAxis.cpp.

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

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

Here is the call graph for this function:

◆ createClippedAxis()

ConstKBinAxis * ConstKBinAxis::createClippedAxis ( double  left,
double  right 
) const
finalvirtual

Creates a new clipped axis.

Reimplemented from VariableBinAxis.

Definition at line 49 of file ConstKBinAxis.cpp.

50 {
51  if (left >= right)
53  "ConstKBinAxis::createClippedAxis() -> Error. 'left'' should be smaller than 'right'");
54 
55  if (left < getMin())
56  left = getBin(0).getMidPoint();
57  if (right >= getMax())
58  right = getBin(size() - 1).getMidPoint();
59 
60  size_t nbin1 = findClosestIndex(left);
61  size_t nbin2 = findClosestIndex(right);
62 
63  size_t new_nbins = nbin2 - nbin1 + 1;
64  std::vector<double> new_boundaries;
65  std::vector<double> old_boundaries = getBinBoundaries();
66  for (size_t i = 0; i < new_nbins + 1; ++i) {
67  new_boundaries.push_back(old_boundaries[nbin1 + i]);
68  }
69 
70  ConstKBinAxis* result = new ConstKBinAxis(getName(), new_nbins);
71  result->m_start = new_boundaries.front();
72  result->m_end = new_boundaries.back();
73  result->setBinBoundaries(new_boundaries);
74  return result;
75 }
Axis with fixed bin size in sin(angle) space.
Definition: ConstKBinAxis.h:24
double getMax() const
Returns value of last point of axis.
size_t size() const
retrieve the number of bins
Bin1D getBin(size_t index) const
retrieve a 1d bin for the given index
double getMin() const
Returns value of first point of axis.
std::vector< double > getBinBoundaries() const
size_t findClosestIndex(double value) const
find bin index which is best match for given value
double getMidPoint() const
Definition: Bin.h:25

References ConstKBinAxis(), VariableBinAxis::findClosestIndex(), VariableBinAxis::getBin(), VariableBinAxis::getBinBoundaries(), VariableBinAxis::getMax(), Bin1D::getMidPoint(), VariableBinAxis::getMin(), IAxis::getName(), m_end, m_start, VariableBinAxis::setBinBoundaries(), and VariableBinAxis::size().

Here is the call graph for this function:

◆ print()

void ConstKBinAxis::print ( std::ostream &  ostr) const
finalprotectedvirtual

Reimplemented from VariableBinAxis.

Definition at line 93 of file ConstKBinAxis.cpp.

94 {
95  ostr << "ConstKBinAxis(\"" << getName() << "\", " << size() << ", "
96  << std::setprecision(std::numeric_limits<double>::digits10 + 2) << m_start << ", " << m_end
97  << ")";
98 }

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

Here is the call graph for this function:

◆ equals()

bool ConstKBinAxis::equals ( const IAxis other) const
finalprotectedvirtual

Reimplemented from VariableBinAxis.

Definition at line 77 of file ConstKBinAxis.cpp.

78 {
79  if (!IAxis::equals(other))
80  return false;
81  if (const ConstKBinAxis* otherAxis = dynamic_cast<const ConstKBinAxis*>(&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 }
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 }

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

Here is the call graph for this function:

◆ getBin()

Bin1D VariableBinAxis::getBin ( size_t  index) const
virtualinherited

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 }
std::vector< double > m_bin_boundaries
vector containing the bin limits
Definition: Bin.h:20

References VariableBinAxis::m_bin_boundaries, and VariableBinAxis::m_nbins.

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

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

References VariableBinAxis::m_bin_boundaries.

Referenced by VariableBinAxis::createClippedAxis(), 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(), 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 }

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

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

Here is the call graph for this function:

◆ getBinCenters()

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

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 }

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

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 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(), createClippedAxis(), CustomBinAxis::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 ConstKBinAxis::m_start
protected

Definition at line 44 of file ConstKBinAxis.h.

Referenced by clone(), ConstKBinAxis(), createClippedAxis(), equals(), and print().

◆ m_end

double ConstKBinAxis::m_end
protected

Definition at line 45 of file ConstKBinAxis.h.

Referenced by clone(), ConstKBinAxis(), createClippedAxis(), equals(), and print().

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