diff --git a/Device/Detector/IDetector2D.cpp b/Device/Detector/IDetector2D.cpp index 35b074e3a210f4263e5a474de6aff9ff922083e2..b307ceecf6916f45480085b0f0e442c29351c6c7 100644 --- a/Device/Detector/IDetector2D.cpp +++ b/Device/Detector/IDetector2D.cpp @@ -14,11 +14,13 @@ #include "Device/Detector/IDetector2D.h" #include "Base/Const/Units.h" +#include "Base/Axis/IAxis.h" #include "Device/Beam/Beam.h" #include "Device/Detector/DetectorContext.h" #include "Device/Mask/DetectorMask.h" #include "Device/Mask/InfinitePlane.h" #include "Resample/Element/DiffuseElement.h" +#include "Base/Util/Assert.h" namespace { diff --git a/Device/Mask/DetectorMask.cpp b/Device/Mask/DetectorMask.cpp index 4dd25500440da79a4a69c100ed47a127dc4b129b..17fba6427aab546f78f107acc3a470b5e5239470 100644 --- a/Device/Mask/DetectorMask.cpp +++ b/Device/Mask/DetectorMask.cpp @@ -17,6 +17,7 @@ #include "Device/Histo/Histogram2D.h" #include "Device/Mask/IShape2D.h" #include "Base/Types/ICloneable.h" +#include "Device/Data/Powerfield.h" class MaskPattern : public ICloneable { public: @@ -29,16 +30,20 @@ public: DetectorMask::DetectorMask() - : m_number_of_masked_channels(0) + : m_masked(new Powerfield<bool>) + , m_number_of_masked_channels(0) { } DetectorMask::DetectorMask(const IAxis& xAxis, const IAxis& yAxis) + : DetectorMask() { - m_masked.clear(); + m_masked->clear(); - m_masked.addAxis(xAxis); - m_masked.addAxis(yAxis); + m_masked->addAxis(xAxis); + m_masked->addAxis(yAxis); + +// m_masked.reset(new Powerfield<bool>(xAxis, yAxis)); process_masks(); } @@ -47,16 +52,17 @@ DetectorMask::~DetectorMask() = default; DetectorMask::DetectorMask(const DetectorMask& other) : m_stack(other.m_stack) + , m_masked(other.m_masked->clone()) , m_number_of_masked_channels(other.m_number_of_masked_channels) { - m_masked.copyFrom(other.m_masked); + m_masked->copyFrom(*other.m_masked); } DetectorMask& DetectorMask::operator=(const DetectorMask& other) { if (this != &other) { m_stack = other.m_stack; - m_masked.copyFrom(other.m_masked); + m_masked.reset(other.m_masked->clone()); m_number_of_masked_channels = other.m_number_of_masked_channels; } return *this; @@ -65,31 +71,31 @@ DetectorMask& DetectorMask::operator=(const DetectorMask& other) void DetectorMask::addMask(const IShape2D& shape, bool mask_value) { m_stack.emplace_back(new MaskPattern(shape.clone(), mask_value)); - m_masked.clear(); + m_masked->clear(); m_number_of_masked_channels = 0; } void DetectorMask::initMaskData(const IAxis& xAxis, const IAxis& yAxis) { - m_masked.clear(); + m_masked->clear(); - m_masked.addAxis(xAxis); - m_masked.addAxis(yAxis); + m_masked->addAxis(xAxis); + m_masked->addAxis(yAxis); process_masks(); } bool DetectorMask::isMasked(size_t index) const { - return m_number_of_masked_channels == 0 ? false : m_masked[index]; + return m_number_of_masked_channels == 0 ? false : (*m_masked)[index]; } Histogram2D* DetectorMask::createHistogram() const { Powerfield<double> data; - data.copyShapeFrom(m_masked); - for (size_t i = 0; i < m_masked.getAllocatedSize(); ++i) - data[i] = static_cast<double>(m_masked[i]); + data.copyShapeFrom(*m_masked); + for (size_t i = 0; i < m_masked->getAllocatedSize(); ++i) + data[i] = static_cast<double>((*m_masked)[i]); return dynamic_cast<Histogram2D*>(IHistogram::createHistogram(data)); } @@ -113,14 +119,14 @@ const IShape2D* DetectorMask::getMaskShape(size_t mask_index, bool& mask_value) void DetectorMask::process_masks() { - m_masked.setAllTo(false); + m_masked->setAllTo(false); if (!!m_stack.empty()) return; m_number_of_masked_channels = 0; - for (size_t index = 0; index < m_masked.getAllocatedSize(); ++index) { - Bin1D binx = m_masked.getAxisBin(index, 0); - Bin1D biny = m_masked.getAxisBin(index, 1); + for (size_t index = 0; index < m_masked->getAllocatedSize(); ++index) { + Bin1D binx = m_masked->getAxisBin(index, 0); + Bin1D biny = m_masked->getAxisBin(index, 1); // setting mask to the data starting from last shape added bool is_masked(false); for (size_t k = m_stack.size(); k > 0; --k) { @@ -128,7 +134,7 @@ void DetectorMask::process_masks() if (pat->shape->contains(binx, biny)) { if (pat->doMask) is_masked = true; - m_masked[index] = pat->doMask; + (*m_masked)[index] = pat->doMask; break; // index is covered by the shape, stop looking further } } diff --git a/Device/Mask/DetectorMask.h b/Device/Mask/DetectorMask.h index a0b1822131855684b08671f087feee64e88360fd..014cabc64dc9357e8f8c0e080febd8c3ce5fb1e8 100644 --- a/Device/Mask/DetectorMask.h +++ b/Device/Mask/DetectorMask.h @@ -15,7 +15,8 @@ #ifndef BORNAGAIN_DEVICE_MASK_DETECTORMASK_H #define BORNAGAIN_DEVICE_MASK_DETECTORMASK_H -#include "Device/Data/Powerfield.h" +#include <memory> + #ifndef SWIG #include "Base/Types/OwningVector.h" #endif @@ -50,7 +51,7 @@ public: bool isMasked(size_t index) const; - const Powerfield<bool>* getMaskData() const { return &m_masked; } + const Powerfield<bool>* getMaskData() const { return m_masked.get(); } Histogram2D* createHistogram() const; @@ -72,7 +73,7 @@ private: #endif // cached secondary data: - Powerfield<bool> m_masked; + std::unique_ptr<Powerfield<bool>> m_masked; int m_number_of_masked_channels; }; diff --git a/Tests/Unit/Device/DetectorMaskTest.cpp b/Tests/Unit/Device/DetectorMaskTest.cpp index 25c7b4bf4b1800fbbf0a271e84b25daf3b170f19..540de4a0724f45f895051e250ea03199d61a8515 100644 --- a/Tests/Unit/Device/DetectorMaskTest.cpp +++ b/Tests/Unit/Device/DetectorMaskTest.cpp @@ -2,6 +2,7 @@ #include "Device/Detector/SphericalDetector.h" #include "Device/Mask/Polygon.h" #include "Tests/GTestWrapper/google_test.h" +#include "Device/Data/Powerfield.h" #include <memory> class DetectorMaskTest : public ::testing::Test {