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"
namespace {
size_t product_size(const std::vector<const Scale*>& axes)
{
size_t result = 1;
for (const Scale* ax : axes)
result *= ax->size();
return result;
}
} // namespace
Frame::Frame(const std::vector<const Scale*>& 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;
size_t Frame::rank() const
{
return m_axes.size();
}
double Frame::projectedCoord(size_t i_flat, size_t k_axis) const
{
return projectedBin(i_flat, k_axis).center();
}
const 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);

Wuttke, Joachim
committed
size_t Frame::projectedIndex(size_t i, size_t k_axis) const

Wuttke, Joachim
committed
return i;

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

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

Wuttke, Joachim
committed
}
bool Frame::operator==(const Frame& o) const
{
return false;
return true;
}
bool Frame::hasSameSizes(const Frame& o) const
{
if (axis(k).size() != o.axis(k).size())
return false;
return true;
}
Frame Frame::plottableFrame() const
{
std::vector<const Scale*> outaxes;
for (size_t k = 0; k < rank(); ++k) {
auto* s = new Scale(axis(k).plottableScale());
Frame Frame::angularFrame(double lambda, double alpha_i) const
{
ASSERT(rank() == 2);
auto* phi_f_scale = new Scale(xAxis().phi_f_Scale(lambda));
auto* alpha_f_scale = new Scale(yAxis().alpha_f_Scale(lambda, alpha_i));
return Frame(phi_f_scale, alpha_f_scale);
Frame Frame::qSpaceFrame(double lambda, double alpha_i) const
{
ASSERT(rank() == 2);
auto* qy_scale = new Scale(xAxis().qy_Scale(lambda));
auto* qz_scale = new Scale(yAxis().qz_Scale(lambda, alpha_i));
{
std::vector<const Scale*> outaxes;
for (const Scale* s : m_axes)
if (s->size() > 1)
outaxes.emplace_back(s->clone());