diff --git a/Core/Algorithms/inc/Mask.h b/Core/Algorithms/inc/Mask.h new file mode 100644 index 0000000000000000000000000000000000000000..4ea92419ba62c7876f437f9f2ced66ebde9799b0 --- /dev/null +++ b/Core/Algorithms/inc/Mask.h @@ -0,0 +1,60 @@ +#ifndef MASK_H_ +#define MASK_H_ +#include <cstddef> +// ******************************************************************** +// * The BornAgain project * +// * Simulation of neutron and x-ray scattering at grazing incidence * +// * * +// * LICENSE AND DISCLAIMER * +// * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris * +// * eget quam orci. Quisque porta varius dui, quis posuere nibh * +// * mollis quis. Mauris commodo rhoncus porttitor. * +// ******************************************************************** +//! @file Mask.h +//! @brief Definition of mask classes for OutputData masking +//! @author Scientific Computing Group at FRM II +//! @date Nov 15, 2012 + +//- ------------------------------------------------------------------- +//! @class Mask +//! @brief Definition of base class for masking OutputData elements +//- ------------------------------------------------------------------- +class Mask +{ +public: + Mask(Mask *p_submask=0); + virtual ~Mask() { delete mp_submask; } + virtual Mask *clone() const; + + size_t getFirstValidIndex(); + size_t getNextIndex(size_t total_index); + void setMaxIndex(size_t max_index); + +protected: + virtual bool isMasked(size_t total_index) const; + size_t m_mask_index; + size_t m_end_index; + Mask *mp_submask; +private: + size_t nextSubIndex(size_t total_index); +}; + +//- ------------------------------------------------------------------- +//! @class MaskIndexModulus +//! @brief Mask based on the index modulo a given number +//- ------------------------------------------------------------------- +class MaskIndexModulus : public Mask +{ +public: + MaskIndexModulus(size_t modulus, size_t remainder, Mask *p_submask=0) + : Mask(p_submask), m_modulus(modulus), m_remainder(remainder) {} + virtual ~MaskIndexModulus() {} + virtual MaskIndexModulus *clone() const; + +private: + virtual bool isMasked(size_t total_index) const; + size_t m_modulus; + size_t m_remainder; +}; + +#endif /* MASK_H_ */ diff --git a/Core/Algorithms/src/Mask.cpp b/Core/Algorithms/src/Mask.cpp new file mode 100644 index 0000000000000000000000000000000000000000..18b44fd482cf055896798175578910503832efa7 --- /dev/null +++ b/Core/Algorithms/src/Mask.cpp @@ -0,0 +1,80 @@ +#include "Mask.h" + +Mask::Mask(Mask* p_submask) +: m_mask_index(0), m_end_index(0), mp_submask(p_submask) +{ +} + +Mask* Mask::clone() const +{ + Mask *p_new_submask = mp_submask ? mp_submask->clone() : 0; + Mask *p_new = new Mask(p_new_submask); + p_new->m_mask_index = m_mask_index; + p_new->setMaxIndex(m_end_index); + return p_new; +} + +size_t Mask::getFirstValidIndex() +{ + m_mask_index = 0; + size_t result = 0; + if (mp_submask) result = mp_submask->getFirstValidIndex(); + while (isMasked(result)) { + result = nextSubIndex(result); + if (result >= m_end_index) { + return m_end_index; + } + } + return result; +} + +size_t Mask::getNextIndex(size_t total_index) +{ + size_t result = nextSubIndex(total_index); + while (isMasked(result)) { + result = nextSubIndex(result); + if (result >= m_end_index) { + return m_end_index; + } + } + return result; +} + +void Mask::setMaxIndex(size_t max_index) +{ + m_end_index = max_index; + if (mp_submask) mp_submask->setMaxIndex(max_index); +} + +bool Mask::isMasked(size_t total_index) const +{ + (void)total_index; + return false; +} + +size_t Mask::nextSubIndex(size_t total_index) +{ + size_t result=0; + if (!mp_submask) { + result = total_index+1; + } + else { + result = mp_submask->getNextIndex(total_index); + } + ++m_mask_index; + return result; +} + +MaskIndexModulus* MaskIndexModulus::clone() const +{ + Mask *p_new_submask = mp_submask ? mp_submask->clone() : 0; + MaskIndexModulus *p_new = new MaskIndexModulus(m_modulus, m_remainder, p_new_submask); + p_new->m_mask_index = m_mask_index; + p_new->setMaxIndex(m_end_index); + return p_new; +} + +bool MaskIndexModulus::isMasked(size_t total_index) const +{ + return m_mask_index % m_modulus == m_remainder; +} diff --git a/Core/Core.pro b/Core/Core.pro index 2d105eb1786d23a64f67a78ebd45a069337b2c05..9dda300728bb6e31f8372462700e6ed789f91685 100644 --- a/Core/Core.pro +++ b/Core/Core.pro @@ -34,6 +34,7 @@ SOURCES += \ Algorithms/src/LayerDecoratorDWBASimulation.cpp \ Algorithms/src/LayerDWBASimulation.cpp \ Algorithms/src/LocalMonodisperseApproximationStrategy.cpp \ + Algorithms/src/Mask.cpp \ Algorithms/src/MultiLayerDWBASimulation.cpp \ Algorithms/src/MultiLayerRoughnessDWBASimulation.cpp \ Algorithms/src/OpticalFresnel.cpp \ @@ -143,6 +144,7 @@ HEADERS += \ Algorithms/inc/LayerDecoratorDWBASimulation.h \ Algorithms/inc/LayerDWBASimulation.h \ Algorithms/inc/LocalMonodisperseApproximationStrategy.h \ + Algorithms/inc/Mask.h \ Algorithms/inc/MultiLayerDWBASimulation.h \ Algorithms/inc/MultiLayerRoughnessDWBASimulation.h \ Algorithms/inc/OpticalFresnel.h \