Newer
Older
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file Base/Axis/Frame.cpp
//! @brief Implements class Frame.
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
// ************************************************************************************************
#include "Base/Axis/Frame.h"
#include "Base/Axis/Bin.h"
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "Base/Util/Assert.h"
Frame::Frame(const std::vector<IAxis*>& axes)
: m_axes(axes)
{
}
const IAxis& Frame::axis(size_t serial_number) const
{
return *m_axes[serial_number];
}
double Frame::getAxisValue(size_t global_index, size_t i_selected_axis) const
{
auto axis_index = getAxisBinIndex(global_index, i_selected_axis);
return (*m_axes[i_selected_axis])[axis_index];
}
Bin1D Frame::getAxisBin(size_t global_index, size_t i_selected_axis) const
{
auto axis_index = getAxisBinIndex(global_index, i_selected_axis);
return m_axes[i_selected_axis]->bin(axis_index);
}
std::vector<int> Frame::getAxesBinIndices(size_t global_index) const
{
size_t remainder = global_index;
std::vector<int> result;
result.resize(rank());
for (size_t i = 0; i < rank(); ++i) {
result[rank() - 1 - i] = (int)(remainder % m_axes[rank() - 1 - i]->size());
remainder /= m_axes[rank() - 1 - i]->size();
}
return result;
}
size_t Frame::getAxisBinIndex(size_t global_index, size_t i_selected_axis) const
{
size_t remainder(global_index);
for (size_t i = 0; i < rank(); ++i) {
size_t i_axis = rank() - 1 - i;
size_t result = remainder % m_axes[i_axis]->size();
if (i_selected_axis == i_axis)
return result;
remainder /= m_axes[i_axis]->size();
}
ASSERT(0);
}
size_t Frame::toGlobalIndex(const std::vector<unsigned>& axes_indices) const
{
ASSERT(axes_indices.size() == rank());
size_t result = 0;
size_t step_size = 1;
for (size_t i = rank(); i > 0; --i) {
ASSERT(axes_indices[i - 1] < m_axes[i - 1]->size());
result += axes_indices[i - 1] * step_size;
step_size *= m_axes[i - 1]->size();
}
return result;
}
size_t Frame::findGlobalIndex(const std::vector<double>& coordinates) const
{
ASSERT(coordinates.size() == rank());
std::vector<unsigned> axes_indexes;
axes_indexes.resize(rank());
for (size_t i = 0; i < rank(); ++i)
axes_indexes[i] = static_cast<unsigned>(m_axes[i]->findClosestIndex(coordinates[i]));
return toGlobalIndex(axes_indexes);
}