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"
Frame::Frame(CloneableVector<const Scale> axes, CloneableVector<const FrameTrafo> trafos)

Wuttke, Joachim
committed
, m_size(FrameUtil::product_size(m_axes.reference()))
Frame::Frame(CloneableVector<const Scale> axes)
: Frame(axes, {})
{
}
Frame::Frame(const Scale* ax0)
: Frame(std::vector<const Scale*>{ax0})
Frame::Frame(const Scale* ax0, const Scale* ax1)
: Frame(std::vector<const Scale*>{ax0, ax1})
Frame::Frame(const Frame&) = default;
Frame::~Frame() = default;
void Frame::setAxes(CloneableVector<const Scale> axes)
{
std::swap(m_axes, axes);
m_size = FrameUtil::product_size(m_axes.reference());
}
void Frame::addTrafo(FrameTrafo* trafo)
{
m_trafos.emplace_back(trafo);
}
const FrameTrafo& Frame::findTrafo(const std::string& name) const
{
for (const FrameTrafo* trafo : m_trafos)
if (trafo->name == name)
return *trafo;
throw std::runtime_error("Requested unavailable trafo '" + name
+ "' ; available: " + Base::String::join(availableTrafos(), ", "));
}
size_t Frame::rank() const
{
return m_axes.size();
}
size_t Frame::size() const
{
return m_size;
}
double Frame::projectedCoord(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

Wuttke, Joachim
committed
return i_flat;

Wuttke, Joachim
committed
return (i_flat / m_axes[1]->size()) % m_axes[0]->size();

Wuttke, Joachim
committed
}
}
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;
}
bool Frame::operator==(const Frame& o) const
{
if (axis(k) != o.axis(k))
return false;
return true;
}
std::vector<const Scale*> Frame::clonedAxes() const
{
return m_axes.cloned_vector();
}
bool Frame::hasSameSizes(const Frame& o) const
{
if (axis(k).size() != o.axis(k).size())
return false;
return true;
}
std::vector<std::string> Frame::availableTrafos() const
{
std::vector<std::string> result;
for (const FrameTrafo* trafo : m_trafos)
result.push_back(trafo->name);
return result;
}
Frame* Frame::transformedFrame(const std::string& key) const
ASSERT(trafo.coords.size() == rank());
std::vector<const Scale*> outaxes;
for (size_t k = 0; k < rank(); ++k) {
Scale* s = new Scale(axis(k).plottableScale(trafo.coords[k], trafo.axTrafos[k]));
outaxes.emplace_back(s);
}
return new Frame(std::move(outaxes));
}
Frame* Frame::plottableFrame(std::vector<std::string> labels) const
ASSERT(labels.size() == rank() || labels.size() == 0);
for (size_t k = 0; k < rank(); ++k) {
Scale* s =
new Scale(labels.size() ? axis(k).plottableScale(labels[k]) : axis(k).plottableScale());
outaxes.emplace_back(s);
}