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"
#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::projectedCoord(size_t i_flat, size_t k_axis) const
auto axis_index = projectedIndex(i_flat, k_axis);
Bin1D Frame::projectedBin(size_t i_flat, size_t k_axis) const
auto axis_index = projectedIndex(i_flat, k_axis);
std::vector<int> Frame::allIndices(size_t i_flat) const
for (size_t k = 0; k < rank(); ++k)
result[k] = projectedIndex(i_flat, k);
size_t Frame::projectedIndex(size_t i_flat, size_t k_axis) const
size_t result = remainder % m_axes[k]->size();
if (k_axis == k)
}
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 (int k = rank() - 1; k >= 0; --k) {
ASSERT(axes_indices[k] < m_axes[k]->size());
result += axes_indices[k] * step_size;
step_size *= m_axes[k]->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 k = 0; k < rank(); ++k)
axes_indexes[k] = static_cast<unsigned>(m_axes[k]->findClosestIndex(coordinates[k]));
return toGlobalIndex(axes_indexes);
}