Skip to content
Snippets Groups Projects
Frame.cpp 2.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • //  ************************************************************************************************
    //
    //  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"
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
    #include "Base/Axis/IAxis.h"
    
    #include "Base/Util/Assert.h"
    
    Frame::Frame(const std::vector<IAxis*>& axes)
        : m_axes(axes)
    {
    
        m_size = 1;
    
        for (size_t k = 0; k < rank(); ++k) {
            ASSERT(axis(k).size() > 0);
    
            m_size *= axis(k).size();
    
        }
    }
    
    Frame::~Frame() = default;
    
    std::vector<IAxis*> Frame::cloned_axes() const
    {
        return m_axes.cloned_vector();
    
    Wuttke, Joachim's avatar
    ..  
    Wuttke, Joachim committed
    size_t Frame::projectedSize(size_t k_axis) const
    {
        return m_axes[k_axis]->size();
    
    double Frame::projectedCoord(size_t i_flat, size_t k_axis) const
    
        auto axis_index = projectedIndex(i_flat, k_axis);
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        return (*m_axes[k_axis])[axis_index];
    
    std::vector<int> Frame::allIndices(size_t i_flat) const
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        std::vector<int> result(rank());
    
        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's avatar
    Wuttke, Joachim committed
        if (rank() == 1) {
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        } else if (rank() == 2) {
            if (k_axis == 0)
    
                return (i_flat / m_axes[1]->size()) % m_axes[0]->size();
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
            if (k_axis == 1)
                return i_flat % m_axes[1]->size();
    
            ASSERT(0);
        }
        ASSERT(0);
        /* // generic code for rank>2 currently unused
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        size_t remainder(i_flat);
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        for (int k = rank() - 1; k >= 0; --k) {
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
            size_t result = remainder % m_axes[k]->size();
            if (k_axis == k)
    
                return result;
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
            remainder /= m_axes[k]->size();
    
    }
    
    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;
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        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();
    
    bool Frame::operator==(const Frame& o) const
    {
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        if (rank() != o.rank())
    
            return false;
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        for (size_t k = 0; k < rank(); ++k)
    
            if (axis(k) != o.axis(k))
                return false;
        return true;
    }
    
    bool Frame::hasSameSizes(const Frame& o) const
    {
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        if (rank() != o.rank())
    
            return false;
    
    Wuttke, Joachim's avatar
    Wuttke, Joachim committed
        for (size_t k = 0; k < rank(); ++k)
    
            if (axis(k).size() != o.axis(k).size())
                return false;
        return true;
    }