Skip to content
Snippets Groups Projects
Commit 23431f9d authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

[j.2] cleanup and prepare refactoring in MasksSet context ()

Merging branch 'j.2'  into 'main'.

See merge request !2370
parents e93f55c1 ee5bb52b
No related branches found
No related tags found
1 merge request!2370cleanup and prepare refactoring in MasksSet context
Pipeline #130350 passed
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
Frame::Frame(const CloneableVector<const Scale>& axes) Frame::Frame(const CloneableVector<const Scale>& axes)
: m_axes(axes) : m_axes(axes)
, m_size(FrameUtil::product_size(m_axes.const_vector())) , m_size(FrameUtil::product_size(m_axes.shared()))
{ {
} }
...@@ -46,7 +46,7 @@ Frame* Frame::clone() const ...@@ -46,7 +46,7 @@ Frame* Frame::clone() const
void Frame::setAxes(CloneableVector<const Scale> axes) void Frame::setAxes(CloneableVector<const Scale> axes)
{ {
std::swap(m_axes, axes); std::swap(m_axes, axes);
m_size = FrameUtil::product_size(m_axes.const_vector()); m_size = FrameUtil::product_size(m_axes.shared());
} }
size_t Frame::rank() const size_t Frame::rank() const
...@@ -149,5 +149,5 @@ Frame* Frame::flat() const ...@@ -149,5 +149,5 @@ Frame* Frame::flat() const
void Frame::setScale(size_t k_axis, Scale* scale) void Frame::setScale(size_t k_axis, Scale* scale)
{ {
m_axes.replace_at(k_axis, scale); m_axes.replace_at(k_axis, scale);
m_size = FrameUtil::product_size(m_axes.const_vector()); m_size = FrameUtil::product_size(m_axes.shared());
} }
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#define BORNAGAIN_BASE_TYPES_OWNINGVECTOR_H #define BORNAGAIN_BASE_TYPES_OWNINGVECTOR_H
#include "Base/Util/Assert.h" #include "Base/Util/Assert.h"
#include <algorithm>
#include <cstddef> #include <cstddef>
#include <utility> #include <utility>
#include <vector> #include <vector>
...@@ -58,6 +59,13 @@ public: ...@@ -58,6 +59,13 @@ public:
T* const& at(int i) const { return m_v.at(i); } T* const& at(int i) const { return m_v.at(i); }
T* const& front() const { return m_v.front(); } T* const& front() const { return m_v.front(); }
T* const& back() const { return m_v.back(); } T* const& back() const { return m_v.back(); }
int index_of(const T* t) const
{
for (size_t i = 0; i < m_v.size(); i++)
if (m_v[i] == t)
return int(i);
return -1;
}
void delete_element(T* e) void delete_element(T* e)
{ {
...@@ -113,12 +121,16 @@ public: ...@@ -113,12 +121,16 @@ public:
return result; return result;
} }
const std::vector<const T*>& reference() const { return m_v; } void swap(size_t fromIndex, size_t toIndex)
std::vector<const T*> const_vector() const
{ {
const std::vector<const T*> result(m_v.begin(), m_v.end()); if (fromIndex > toIndex)
return result; std::rotate(m_v.rend() - fromIndex - 1, m_v.rend() - fromIndex, m_v.rend() - toIndex);
else
std::rotate(m_v.begin() + fromIndex, m_v.begin() + fromIndex + 1,
m_v.begin() + toIndex + 1);
} }
const std::vector<T*>& shared() const { return m_v; }
std::vector<T*> cloned_vector() const std::vector<T*> cloned_vector() const
{ {
std::vector<T*> result; std::vector<T*> result;
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// //
// BornAgain: simulate and fit reflection and scattering // BornAgain: simulate and fit reflection and scattering
// //
//! @file Base/Util/VectorUtil.cpp //! @file Base/Util/Vec.h
//! @brief Implements namespace VectorUtil. //! @brief Defines namespace Vec.
//! //!
//! @homepage http://www.bornagainproject.org //! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING) //! @license GNU General Public License v3 or higher (see COPYING)
...@@ -12,12 +12,21 @@ ...@@ -12,12 +12,21 @@
// //
// ************************************************************************************************ // ************************************************************************************************
#include "Base/Util/VectorUtil.h" #ifndef BORNAGAIN_BASE_UTIL_VEC_H
#define BORNAGAIN_BASE_UTIL_VEC_H
std::vector<double> VectorUtil::real(const std::vector<complex_t>& v) #include <vector>
namespace Vec {
template <class T, class S> int indexOfPtr(const T* t, const std::vector<S*>& v)
{ {
std::vector<double> result(v.size());
for (size_t i = 0; i < v.size(); i++) for (size_t i = 0; i < v.size(); i++)
result[i] = real(v[i]); if (v[i] == t)
return result; return int(i);
return -1;
} }
} // namespace Vec
#endif // BORNAGAIN_BASE_UTIL_VEC_H
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file Base/Util/VectorUtil.h
//! @brief Defines namespace VectorUtil.
//!
//! @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)
//
// ************************************************************************************************
#ifndef BORNAGAIN_BASE_UTIL_VECTORUTIL_H
#define BORNAGAIN_BASE_UTIL_VECTORUTIL_H
#include <heinz/Complex.h>
#include <vector>
namespace VectorUtil {
//! Returns vector of real parts.
std::vector<double> real(const std::vector<complex_t>& v);
} // namespace VectorUtil
#endif // BORNAGAIN_BASE_UTIL_VECTORUTIL_H
...@@ -365,16 +365,20 @@ Datafield* Data2DItem::createMaskedField() const ...@@ -365,16 +365,20 @@ Datafield* Data2DItem::createMaskedField() const
std::unique_ptr<IShape2D> roi; std::unique_ptr<IShape2D> roi;
Datafield* result = c_field()->clone(); Datafield* result = c_field()->clone();
MaskStack detectorMask; MaskStack detectorMask;
const QVector<const MaskItem*> maskItems = masksSet()->maskItems(); const auto& maskItems = masksSet()->maskItems();
for (auto maskIter = maskItems.rbegin(); maskIter != maskItems.rend(); maskIter++)
if ((*maskIter)->isVisible()) { // reverse loop (waiting for C++ ranges)
if (auto* roiItem = dynamic_cast<const RegionOfInterestItem*>((*maskIter))) for (auto maskIter = maskItems.crbegin(); maskIter != maskItems.crend(); maskIter++) {
const MaskItem* t = *maskIter;
if (t->isVisible()) {
if (auto* roiItem = dynamic_cast<const RegionOfInterestItem*>(t))
roi = roiItem->createShape(); roi = roiItem->createShape();
else { else {
std::unique_ptr<IShape2D> shape((*maskIter)->createShape()); std::unique_ptr<IShape2D> shape(t->createShape());
detectorMask.pushMask(*shape, (*maskIter)->maskValue(), false); detectorMask.pushMask(*shape, t->maskValue(), false);
} }
} }
}
// ROI mask has to be the last one, it can not be "unmasked" by other shapes // ROI mask has to be the last one, it can not be "unmasked" by other shapes
if (roi) if (roi)
......
...@@ -68,14 +68,17 @@ std::unique_ptr<IDetector> DetectorItem::createDetector() const ...@@ -68,14 +68,17 @@ std::unique_ptr<IDetector> DetectorItem::createDetector() const
auto result = std::make_unique<Detector2D>(x_wid, y_wid, n_x, n_y, x_cen, y_cen); auto result = std::make_unique<Detector2D>(x_wid, y_wid, n_x, n_y, x_cen, y_cen);
if (m_masks) { if (m_masks) {
const QVector<const MaskItem*> maskItems = m_masks->maskItems(); const auto& maskItems = m_masks->maskItems();
for (auto maskIter = maskItems.rbegin(); maskIter != maskItems.rend(); maskIter++) {
if ((*maskIter)->isVisible()) { // reverse loop (waiting for C++ ranges)
if (auto* ii = dynamic_cast<const RegionOfInterestItem*>(*maskIter)) { for (auto maskIter = maskItems.crbegin(); maskIter != maskItems.crend(); maskIter++) {
const MaskItem* m = *maskIter;
if (m->isVisible()) {
if (auto* ii = dynamic_cast<const RegionOfInterestItem*>(m)) {
result->setRegionOfInterest(ii->xLow(), ii->yLow(), ii->xUp(), ii->yUp()); result->setRegionOfInterest(ii->xLow(), ii->yLow(), ii->xUp(), ii->yUp());
} else { } else {
std::unique_ptr<IShape2D> shape((*maskIter)->createShape()); std::unique_ptr<IShape2D> shape(m->createShape());
result->addBinMask(*shape, (*maskIter)->maskValue()); result->addBinMask(*shape, m->maskValue());
} }
} }
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#ifndef BORNAGAIN_GUI_MODEL_MASK_MASKSSET_H #ifndef BORNAGAIN_GUI_MODEL_MASK_MASKSSET_H
#define BORNAGAIN_GUI_MODEL_MASK_MASKSSET_H #define BORNAGAIN_GUI_MODEL_MASK_MASKSSET_H
#include "Base/Types/OwningVector.h"
#include "GUI/Model/Descriptor/PolyVector.h" #include "GUI/Model/Descriptor/PolyVector.h"
#include "GUI/Model/Mask/MasksCatalog.h" #include "GUI/Model/Mask/MasksCatalog.h"
#include <QModelIndex> #include <QModelIndex>
...@@ -28,20 +29,20 @@ class RegionOfInterestItem; ...@@ -28,20 +29,20 @@ class RegionOfInterestItem;
class MasksSet { class MasksSet {
public: public:
MasksSet(); MasksSet();
~MasksSet(); virtual ~MasksSet();
QVector<MaskItem*> modifiableMaskItems() const; QVector<MaskItem*> modifiableMaskItems() const;
QVector<const MaskItem*> maskItems() const; QVector<const MaskItem*> maskItems() const;
//! Insert mask at given row. //! Insert mask at given row.
virtual void insertMask(int row, MaskItem* maskItem); void insertMask(int row, MaskItem* maskItem);
virtual void addMaskItem(MaskItem* maskItem); void addMaskItem(MaskItem* maskItem);
//! Move mask to a given row //! Move mask to a given row
virtual void moveMask(int from_row, int to_row); void moveMask(int from_row, int to_row);
virtual void removeMaskAt(int row); void removeMaskAt(int row);
//! Can be nullptr. //! Can be nullptr.
RegionOfInterestItem* regionOfInterestItem() const; RegionOfInterestItem* regionOfInterestItem() const;
......
...@@ -47,6 +47,16 @@ CompoundItem::CompoundItem(const MaterialsSet* materials) ...@@ -47,6 +47,16 @@ CompoundItem::CompoundItem(const MaterialsSet* materials)
ASSERT(m_materials); ASSERT(m_materials);
} }
void CompoundItem::addItemWithParticleSelection(ItemWithParticles* particle)
{
m_particles.emplace_item_back(particle);
}
void CompoundItem::removeItemWithParticle(ItemWithParticles* particle)
{
m_particles.erase_item(particle);
}
void CompoundItem::writeTo(QXmlStreamWriter* w) const void CompoundItem::writeTo(QXmlStreamWriter* w) const
{ {
XML::writeAttribute(w, XML::Attrib::version, uint(1)); XML::writeAttribute(w, XML::Attrib::version, uint(1));
...@@ -134,16 +144,6 @@ QVector<ItemWithParticles*> CompoundItem::itemsWithParticles() const ...@@ -134,16 +144,6 @@ QVector<ItemWithParticles*> CompoundItem::itemsWithParticles() const
return m_particles.toModifiableQVector(); return m_particles.toModifiableQVector();
} }
void CompoundItem::addItemWithParticleSelection(ItemWithParticles* particle)
{
m_particles.emplace_item_back(particle);
}
void CompoundItem::removeItemWithParticle(ItemWithParticles* particle)
{
m_particles.erase_item(particle);
}
QVector<ItemWithParticles*> CompoundItem::containedItemsWithParticles() const QVector<ItemWithParticles*> CompoundItem::containedItemsWithParticles() const
{ {
QVector<ItemWithParticles*> result; QVector<ItemWithParticles*> result;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#ifndef BORNAGAIN_GUI_MODEL_SAMPLE_COMPOUNDITEM_H #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_COMPOUNDITEM_H
#define BORNAGAIN_GUI_MODEL_SAMPLE_COMPOUNDITEM_H #define BORNAGAIN_GUI_MODEL_SAMPLE_COMPOUNDITEM_H
#include "Base/Types/OwningVector.h"
#include "GUI/Model/Descriptor/PolyVector.h" #include "GUI/Model/Descriptor/PolyVector.h"
#include "GUI/Model/Sample/ItemWithParticles.h" #include "GUI/Model/Sample/ItemWithParticles.h"
#include "GUI/Model/Sample/ParticlesCatalog.h" #include "GUI/Model/Sample/ParticlesCatalog.h"
...@@ -27,16 +28,14 @@ class CompoundItem : public ItemWithParticles { ...@@ -27,16 +28,14 @@ class CompoundItem : public ItemWithParticles {
public: public:
CompoundItem(const MaterialsSet* materials); CompoundItem(const MaterialsSet* materials);
void writeTo(QXmlStreamWriter* w) const override; void addItemWithParticleSelection(ItemWithParticles* particle);
void removeItemWithParticle(ItemWithParticles* particle);
void readFrom(QXmlStreamReader* r) override; void readFrom(QXmlStreamReader* r) override;
void writeTo(QXmlStreamWriter* w) const override;
std::unique_ptr<Compound> createCompound() const; std::unique_ptr<Compound> createCompound() const;
QVector<ItemWithParticles*> itemsWithParticles() const; QVector<ItemWithParticles*> itemsWithParticles() const;
void addItemWithParticleSelection(ItemWithParticles* particle);
void removeItemWithParticle(ItemWithParticles* particle);
QVector<ItemWithParticles*> containedItemsWithParticles() const override; QVector<ItemWithParticles*> containedItemsWithParticles() const override;
bool expandCompound = true; bool expandCompound = true;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#ifndef BORNAGAIN_GUI_MODEL_SAMPLE_PARTICLELAYOUTITEM_H #ifndef BORNAGAIN_GUI_MODEL_SAMPLE_PARTICLELAYOUTITEM_H
#define BORNAGAIN_GUI_MODEL_SAMPLE_PARTICLELAYOUTITEM_H #define BORNAGAIN_GUI_MODEL_SAMPLE_PARTICLELAYOUTITEM_H
#include "Base/Types/OwningVector.h"
#include "GUI/Model/Descriptor/DoubleProperty.h" #include "GUI/Model/Descriptor/DoubleProperty.h"
#include "GUI/Model/Descriptor/PolyVector.h" #include "GUI/Model/Descriptor/PolyVector.h"
#include "GUI/Model/Sample/InterferenceItemCatalog.h" #include "GUI/Model/Sample/InterferenceItemCatalog.h"
......
...@@ -309,7 +309,7 @@ void MaskGraphicsScene::updateScene() ...@@ -309,7 +309,7 @@ void MaskGraphicsScene::updateScene()
updateOverlays(); updateOverlays();
// update Z-values of all IMaskView to reflect stacking order // update Z-values of all IMaskView to reflect stacking order
int z = m_masks_qmodel->masksSet()->maskItems().size(); int z = m_masks_qmodel->masksSet()->size();
for (const MaskItem* maskItem : m_masks_qmodel->masksSet()->maskItems()) { for (const MaskItem* maskItem : m_masks_qmodel->masksSet()->maskItems()) {
if (IOverlay* overlay = m_mask2overlay[maskItem]) if (IOverlay* overlay = m_mask2overlay[maskItem])
overlay->setZValue(z); overlay->setZValue(z);
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include "Resample/Slice/ProfileHelper.h" #include "Resample/Slice/ProfileHelper.h"
#include "Base/Util/Assert.h" #include "Base/Util/Assert.h"
#include "Base/Util/VectorUtil.h"
#include "Sample/Interface/LayerRoughness.h" #include "Sample/Interface/LayerRoughness.h"
#include <numbers> #include <numbers>
...@@ -54,6 +53,14 @@ complex_t quantity(const Material& mat, std::string q) ...@@ -54,6 +53,14 @@ complex_t quantity(const Material& mat, std::string q)
ASSERT_NEVER; ASSERT_NEVER;
} }
std::vector<double> vec2real(const std::vector<complex_t>& v)
{
std::vector<double> result(v.size());
for (size_t i = 0; i < v.size(); i++)
result[i] = real(v[i]);
return result;
}
} // namespace } // namespace
...@@ -99,7 +106,7 @@ ProfileHelper::calculateMagnetizationProfile(const std::vector<double>& z_values ...@@ -99,7 +106,7 @@ ProfileHelper::calculateMagnetizationProfile(const std::vector<double>& z_values
throw std::runtime_error("Incorrect magnetization component \"" + xyz + "\".\nOnly \"" + X throw std::runtime_error("Incorrect magnetization component \"" + xyz + "\".\nOnly \"" + X
+ "\", \"" + Y + "\" or \"" + Z + "\" are allowed."); + "\", \"" + Y + "\" or \"" + Z + "\" are allowed.");
return VectorUtil::real(profile(z_values, xyz)); return ::vec2real(profile(z_values, xyz));
} }
std::pair<double, double> ProfileHelper::defaultLimits() const std::pair<double, double> ProfileHelper::defaultLimits() const
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment