diff --git a/GUI/Model/Beam/#BeamAngleItems.cpp# b/GUI/Model/Beam/#BeamAngleItems.cpp# new file mode 100644 index 0000000000000000000000000000000000000000..e5c09ba52c0033d76ec2232d8de5f995aba18a2f --- /dev/null +++ b/GUI/Model/Beam/#BeamAngleItems.cpp# @@ -0,0 +1,78 @@ +// ************************************************************************************************ +// +// BornAgain: simulate and fit reflection and scattering +// +//! @file GUI/Model/Beam/BeamAngleItems.cpp +//! @brief Implements class BeamAngleItems. +//! +//! @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 "GUI/Model/Beam/BeamAngleItems.h" +#include "Base/Const/Units.h" +#include "Base/Util/Assert.h" +#include "GUI/Model/Beam/DistributionItems.h" + +BeamAzimuthalAngleItem::BeamAzimuthalAngleItem() +{ + m_distribution.simpleInit("Distribution", "", DistributionCatalog::types(), + initDistribution); +} + +void BeamAzimuthalAngleItem::readFrom(QXmlStreamReader* r) +{ + BeamDistributionItem::readFrom(r); +} + +void BeamAzimuthalAngleItem::initDistribution(DistributionItem* new_distribution, + const DistributionItem* old_distribution) +{ + ASSERT(new_distribution); + new_distribution->center().setDVal(old_distribution ? old_distribution->center().dVal() : 0.); + new_distribution->center().setDecimals(3); +} + +double BeamAzimuthalAngleItem::azimuthalAngle() const +{ + return BeamDistributionItem::meanValue(); +} + +double BeamAzimuthalAngleItem::scaleFactor() const +{ + return Units::deg; +} + +// ------------------------------------------------------------------------------------------------ + +BeamInclinationAngleItem::BeamInclinationAngleItem() +{ + m_distribution.initWithInitializer("Distribution", "", DistributionCatalog::types(), + initDistribution); +} + +void BeamInclinationAngleItem::readFrom(QXmlStreamReader* r) +{ + BeamDistributionItem::readFrom(r); +} + +double BeamInclinationAngleItem::inclinationAngle() const +{ + return BeamDistributionItem::meanValue(); +} + +double BeamInclinationAngleItem::scaleFactor() const +{ + return Units::deg; +} + +void BeamInclinationAngleItem::initDistribution(DistributionItem* new_distribution, + const DistributionItem* old_distribution) +{ + ASSERT(new_distribution); + new_distribution->center().setDVal(old_distribution ? old_distribution->center().dVal() : 0.2); + new_distribution->center().setDecimals(3); +} diff --git a/GUI/Model/Beam/BeamAngleItems.cpp b/GUI/Model/Beam/BeamAngleItems.cpp index 49812b3eccac1c81a8501e9a17a4f922dd02c022..19a9e6ca5df79b81c5f893fdf99e5d232bb78538 100644 --- a/GUI/Model/Beam/BeamAngleItems.cpp +++ b/GUI/Model/Beam/BeamAngleItems.cpp @@ -19,8 +19,7 @@ BeamAzimuthalAngleItem::BeamAzimuthalAngleItem() { - m_distribution.initWithInitializer("Distribution", "", DistributionCatalog::types(), - initDistribution); + m_distribution.simpleInit("Distribution", "", DistributionCatalog::Type::None); } void BeamAzimuthalAngleItem::readFrom(QXmlStreamReader* r) @@ -28,14 +27,6 @@ void BeamAzimuthalAngleItem::readFrom(QXmlStreamReader* r) BeamDistributionItem::readFrom(r); } -void BeamAzimuthalAngleItem::initDistribution(DistributionItem* new_distribution, - const DistributionItem* old_distribution) -{ - ASSERT(new_distribution); - new_distribution->center().setDVal(old_distribution ? old_distribution->center().dVal() : 0.); - new_distribution->center().setDecimals(3); -} - double BeamAzimuthalAngleItem::azimuthalAngle() const { return BeamDistributionItem::meanValue(); @@ -50,8 +41,7 @@ double BeamAzimuthalAngleItem::scaleFactor() const BeamInclinationAngleItem::BeamInclinationAngleItem() { - m_distribution.initWithInitializer("Distribution", "", DistributionCatalog::types(), - initDistribution); + m_distribution.simpleInit("Distribution", "", DistributionCatalog::Type::None); } void BeamInclinationAngleItem::readFrom(QXmlStreamReader* r) @@ -68,11 +58,3 @@ double BeamInclinationAngleItem::scaleFactor() const { return Units::deg; } - -void BeamInclinationAngleItem::initDistribution(DistributionItem* new_distribution, - const DistributionItem* old_distribution) -{ - ASSERT(new_distribution); - new_distribution->center().setDVal(old_distribution ? old_distribution->center().dVal() : 0.2); - new_distribution->center().setDecimals(3); -} diff --git a/GUI/Model/Beam/BeamAngleItems.h b/GUI/Model/Beam/BeamAngleItems.h index be238d6597c315b23c9093c06ef19b7a627afa81..e68e58d773ac0811441ccd9e3efcf39fc0b42fe4 100644 --- a/GUI/Model/Beam/BeamAngleItems.h +++ b/GUI/Model/Beam/BeamAngleItems.h @@ -25,10 +25,6 @@ public: double azimuthalAngle() const; double scaleFactor() const override; - -private: - static void initDistribution(DistributionItem* newDistribution, - const DistributionItem* currentDistribution); }; class BeamInclinationAngleItem : public BeamDistributionItem { @@ -39,10 +35,6 @@ public: double inclinationAngle() const; double scaleFactor() const override; - -private: - static void initDistribution(DistributionItem* newDistribution, - const DistributionItem* currentDistribution); }; #endif // BORNAGAIN_GUI_MODEL_BEAM_BEAMANGLEITEMS_H diff --git a/GUI/Model/Beam/BeamDistributionItem.cpp b/GUI/Model/Beam/BeamDistributionItem.cpp index a6a04b6c1badf20ad6bd7926e378e96c6af3330c..442185f16208fc010a8a32f193bafe6b176c6e54 100644 --- a/GUI/Model/Beam/BeamDistributionItem.cpp +++ b/GUI/Model/Beam/BeamDistributionItem.cpp @@ -49,7 +49,7 @@ double BeamDistributionItem::meanValue() const std::unique_ptr<IDistribution1D> domainDistr = createDistribution1D(); if (domainDistr) return domainDistr->mean() / scaleFactor(); - return dynamic_cast<SymmetricResolutionItem*>(distributionItem())->mean().dVal(); + return dynamic_cast<SymmetricDistributionItem*>(distributionItem())->mean().dVal(); } void BeamDistributionItem::resetToValue(double value) diff --git a/GUI/Model/Beam/BeamWavelengthItem.cpp b/GUI/Model/Beam/BeamWavelengthItem.cpp index 0015b76ef2ee289a7b8f7d4c09b1217020f39805..cb47d67589b6967a7de8072fbf845d8ed9f64e8a 100644 --- a/GUI/Model/Beam/BeamWavelengthItem.cpp +++ b/GUI/Model/Beam/BeamWavelengthItem.cpp @@ -16,22 +16,9 @@ #include "Base/Util/Assert.h" #include "GUI/Model/Beam/DistributionItems.h" -namespace { - -void initDistribution(DistributionItem* new_distribution, const DistributionItem* old_distribution) -{ - ASSERT(new_distribution); - new_distribution->center().setDVal(old_distribution ? old_distribution->center().dVal() : 0.1); - new_distribution->center().setDecimals(4); - new_distribution->center().setLimits(RealLimits::positive()); -}; - -} // namespace - BeamWavelengthItem::BeamWavelengthItem() { - m_distribution.initWithInitializer("Distribution", "", DistributionCatalog::types(), - initDistribution); + m_distribution.simpleInit("Distribution", "", DistributionCatalog::Type::None); } void BeamWavelengthItem::readFrom(QXmlStreamReader* r) diff --git a/GUI/Model/Beam/DistributionItems.cpp b/GUI/Model/Beam/DistributionItems.cpp index 8054c535ccaf338588223ea141755863bfcb838b..11c6754a56fbfcd588ab496a43d2bbb61ed6b0fc 100644 --- a/GUI/Model/Beam/DistributionItems.cpp +++ b/GUI/Model/Beam/DistributionItems.cpp @@ -68,13 +68,13 @@ void DistributionItem::readFrom(QXmlStreamReader* r) // --------------------------------------------------------------------------------------------- // -SymmetricResolutionItem::SymmetricResolutionItem(double mean, int decimals, - const QString& meanLabel) +SymmetricDistributionItem::SymmetricDistributionItem(double mean, int decimals, + const QString& meanLabel) { m_mean.init(meanLabel, "", mean, decimals, RealLimits::limitless(), "mean"); } -void SymmetricResolutionItem::writeTo(QXmlStreamWriter* w) const +void SymmetricDistributionItem::writeTo(QXmlStreamWriter* w) const { XML::writeBaseElement<DistributionItem>(w, XML::Tag::BaseData, this); @@ -82,7 +82,7 @@ void SymmetricResolutionItem::writeTo(QXmlStreamWriter* w) const m_mean.writeTo2(w, Tag::Mean); } -void SymmetricResolutionItem::readFrom(QXmlStreamReader* r) +void SymmetricDistributionItem::readFrom(QXmlStreamReader* r) { while (r->readNextStartElement()) { QString tag = r->name().toString(); @@ -98,7 +98,7 @@ void SymmetricResolutionItem::readFrom(QXmlStreamReader* r) // --------------------------------------------------------------------------------------------- // DistributionNoneItem::DistributionNoneItem() - : SymmetricResolutionItem(0.1, 3, "Value") + : SymmetricDistributionItem(0., 3, "Value") { } @@ -157,7 +157,7 @@ DoubleProperties DistributionGateItem::distributionValues(bool /*withMean*/) // --------------------------------------------------------------------------------------------- // DistributionLorentzItem::DistributionLorentzItem() - : SymmetricResolutionItem(1.0) + : SymmetricDistributionItem(1.0) { m_hwhm.init("HWHM", "", 1.0, "hwhm"); } @@ -170,7 +170,7 @@ std::unique_ptr<IDistribution1D> DistributionLorentzItem::createDistribution(dou void DistributionLorentzItem::writeTo(QXmlStreamWriter* w) const { - XML::writeBaseElement<SymmetricResolutionItem>(w, XML::Tag::BaseData, this); + XML::writeBaseElement<SymmetricDistributionItem>(w, XML::Tag::BaseData, this); // half width at half maximum m_hwhm.writeTo2(w, Tag::HWHM); @@ -181,7 +181,7 @@ void DistributionLorentzItem::readFrom(QXmlStreamReader* r) while (r->readNextStartElement()) { QString tag = r->name().toString(); if (tag == Tag::BaseData) - XML::readBaseElement<SymmetricResolutionItem>(r, tag, this); + XML::readBaseElement<SymmetricDistributionItem>(r, tag, this); else if (tag == Tag::HWHM) m_hwhm.readFrom2(r, tag); else @@ -198,7 +198,7 @@ DoubleProperties DistributionLorentzItem::distributionValues(bool withMean) // --------------------------------------------------------------------------------------------- // DistributionGaussianItem::DistributionGaussianItem() - : SymmetricResolutionItem(1.0) + : SymmetricDistributionItem(1.0) { m_standard_deviation.init("StdDev", "", 1.0, 3, RealLimits::lowerLimited(0.0), "stdDev"); } @@ -212,7 +212,7 @@ std::unique_ptr<IDistribution1D> DistributionGaussianItem::createDistribution(do void DistributionGaussianItem::writeTo(QXmlStreamWriter* w) const { - XML::writeBaseElement<SymmetricResolutionItem>(w, XML::Tag::BaseData, this); + XML::writeBaseElement<SymmetricDistributionItem>(w, XML::Tag::BaseData, this); // standard deviation m_standard_deviation.writeTo2(w, Tag::StandardDeviation); @@ -223,7 +223,7 @@ void DistributionGaussianItem::readFrom(QXmlStreamReader* r) while (r->readNextStartElement()) { QString tag = r->name().toString(); if (tag == Tag::BaseData) - XML::readBaseElement<SymmetricResolutionItem>(r, tag, this); + XML::readBaseElement<SymmetricDistributionItem>(r, tag, this); else if (tag == Tag::StandardDeviation) m_standard_deviation.readFrom2(r, tag); else @@ -286,7 +286,7 @@ DoubleProperties DistributionLogNormalItem::distributionValues(bool /*withMean*/ // --------------------------------------------------------------------------------------------- // DistributionCosineItem::DistributionCosineItem() - : SymmetricResolutionItem(1.0) + : SymmetricDistributionItem(1.0) { m_hwhm.init("HWHM", "", 1.0, 3, RealLimits::lowerLimited(0.0), "hwhm"); } @@ -299,7 +299,7 @@ std::unique_ptr<IDistribution1D> DistributionCosineItem::createDistribution(doub void DistributionCosineItem::writeTo(QXmlStreamWriter* w) const { - XML::writeBaseElement<SymmetricResolutionItem>(w, XML::Tag::BaseData, this); + XML::writeBaseElement<SymmetricDistributionItem>(w, XML::Tag::BaseData, this); // sigma m_hwhm.writeTo2(w, Tag::Sigma); @@ -310,7 +310,7 @@ void DistributionCosineItem::readFrom(QXmlStreamReader* r) while (r->readNextStartElement()) { QString tag = r->name().toString(); if (tag == Tag::BaseData) - XML::readBaseElement<SymmetricResolutionItem>(r, tag, this); + XML::readBaseElement<SymmetricDistributionItem>(r, tag, this); else if (tag == Tag::Sigma) m_hwhm.readFrom2(r, tag); else diff --git a/GUI/Model/Beam/DistributionItems.h b/GUI/Model/Beam/DistributionItems.h index fecfabf440a4912bbb5a2072cbae5576e3dfd4b5..773632e332a55eaec17af7706f7f3c2a0bfcd303 100644 --- a/GUI/Model/Beam/DistributionItems.h +++ b/GUI/Model/Beam/DistributionItems.h @@ -54,9 +54,9 @@ protected: DoubleProperty m_rel_sampling_width; }; -class SymmetricResolutionItem : public DistributionItem { +class SymmetricDistributionItem : public DistributionItem { public: - SymmetricResolutionItem(double mean, int decimals = 3, const QString& meanLabel = "Mean"); + SymmetricDistributionItem(double mean, int decimals = 3, const QString& meanLabel = "Mean"); DoubleProperty& mean() { return m_mean; } const DoubleProperty& mean() const { return m_mean; } @@ -71,7 +71,7 @@ protected: DoubleProperty m_mean; }; -class DistributionNoneItem : public SymmetricResolutionItem { +class DistributionNoneItem : public SymmetricDistributionItem { public: DistributionNoneItem(); @@ -102,7 +102,7 @@ private: DoubleProperty m_halfwidth; }; -class DistributionLorentzItem : public SymmetricResolutionItem { +class DistributionLorentzItem : public SymmetricDistributionItem { public: DistributionLorentzItem(); @@ -120,7 +120,7 @@ private: DoubleProperty m_hwhm; }; -class DistributionGaussianItem : public SymmetricResolutionItem { +class DistributionGaussianItem : public SymmetricDistributionItem { public: DistributionGaussianItem(); @@ -163,7 +163,7 @@ private: DoubleProperty m_scale_parameter; }; -class DistributionCosineItem : public SymmetricResolutionItem { +class DistributionCosineItem : public SymmetricDistributionItem { public: DistributionCosineItem(); diff --git a/GUI/Model/Beam/GrazingScanItem.cpp b/GUI/Model/Beam/GrazingScanItem.cpp index 3a2b3786efc1be60d6d5ea49530bb382667f2a96..9e63956f9c82dea898ec7e81acec342a2c61e882 100644 --- a/GUI/Model/Beam/GrazingScanItem.cpp +++ b/GUI/Model/Beam/GrazingScanItem.cpp @@ -44,14 +44,6 @@ void setAxisPresentationDefaults(BasicAxisItem* axisItem) axisItem->resize(500); } -void initDistribution(DistributionItem* new_distribution, const DistributionItem* old_distribution) -{ - ASSERT(new_distribution); - new_distribution->center().setDVal(old_distribution ? old_distribution->center().dVal() : 0.); - new_distribution->center().setDecimals(4); - new_distribution->center().setLimits(RealLimits::positive()); -}; - } // namespace @@ -59,8 +51,7 @@ GrazingScanItem::GrazingScanItem() : BeamDistributionItem() , m_current_axis_is_uniform_axis(true) { - m_distribution.initWithInitializer("Distribution", "", DistributionCatalog::types(), - initDistribution); + m_distribution.simpleInit("Distribution", "", DistributionCatalog::Type::None); m_uniform_alpha_axis = std::make_unique<BasicAxisItem>(); setAxisPresentationDefaults(m_uniform_alpha_axis.get()); diff --git a/GUI/Model/Descriptor/PolyItem.h b/GUI/Model/Descriptor/PolyItem.h index 99ec86bda0958cef45bd8248da62cbaac2fdac83..ded0d48f75355954561ba2e38ed8436c8138a4c6 100644 --- a/GUI/Model/Descriptor/PolyItem.h +++ b/GUI/Model/Descriptor/PolyItem.h @@ -26,10 +26,6 @@ public: void simpleInit(const QString& label, const QString& tooltip, typename Catalog::Type currentType); - void initWithInitializer( - const QString& label, const QString& tooltip, const QVector<typename Catalog::Type>& types, - std::function<void(BaseItem* newItem, const BaseItem* oldItem)> initializer); - BaseItem* operator->() const { return m_item.get(); } BaseItem* certainItem() const { return m_item.get(); } @@ -63,12 +59,6 @@ private: //! Reimplementable function to set currently selected option. std::function<void(int)> currentIndexSetter = nullptr; - //! Initializer function. Can be empty. - //! The first argument is the new item, the second is the old one if present; can be null. - //! This is intended to maybe copy values from the old to the new selection. oldItem also can be - //! ignored if not relevant, - std::function<void(BaseItem* newItem, const BaseItem* oldItem)> m_initializer; - std::unique_ptr<BaseItem> m_item; //!< Current selection QString m_label; //!< A label text (short, no trailing colon) @@ -90,35 +80,10 @@ template <typename C> void PolyItem<C>::simpleInit(const QString& label, const Q setCurrentIndex(index); } -//! Initialize by means of a catalog class, a subsection of allowed types and an initializer -//! function. -//! -//! Same as before, but only a subset of types available in a catalog shall be used. -//! The current selection will be initialized with the first type in the given types subset. -//! Each newly created item can be initialized with the given initializer method. Note that the -//! item creation will take place also after a call to this method, so take care that the given -//! initializer stays valid throughout the lifetime of this PolyItem instance. -//! -//! The initializer function takes two arguments: The first is the new item, the second is the -//! old one (if present; can be null). This is intended to maybe copy values from the old to the -//! new selection. The old item also can be ignored, always according to the current needs. -template <typename C> void PolyItem<C>::initWithInitializer( - const QString& label, const QString& tooltip, const QVector<typename C::Type>& types, - std::function<void(BaseItem* newItem, const BaseItem* oldItem)> initializer) -{ - m_initializer = initializer; - m_types = types; - - initFieldsAndSetter(label, tooltip); - setCurrentIndex(0); -} - //! Directly set the new item. template <typename C> template <typename S> S* PolyItem<C>::createCertainItem() { auto* t = new S; - if (t != nullptr && m_initializer) - m_initializer(t, m_item.get()); m_item.reset(t); return t; } @@ -130,11 +95,8 @@ C::BaseItem* PolyItem<C>::readItemFrom(QXmlStreamReader* r, Args... args) const QString kind = XML::readString(r, XML::Attrib::kind); const auto type = static_cast<typename C::Type>(typeIndex); BaseItem* t = C::create(type, args...); - if (t) { - if (m_initializer) - m_initializer(t, m_item.get()); + if (t) t->readFrom(r); - } return t; } @@ -149,8 +111,6 @@ void PolyItem<C>::initFieldsAndSetter(const QString& label, const QString& toolt currentIndexSetter = [this](int current) { BaseItem* t = C::create(m_types[current]); - if (m_initializer) - m_initializer(t, m_item.get()); m_item.reset(t); }; } diff --git a/GUI/Model/Sim/InstrumentItems.cpp b/GUI/Model/Sim/InstrumentItems.cpp index 592d51ceb52a80693ee0b61cd92093e143ffd2b7..0d0a86399f34646235da471a3ca5014487353f4e 100644 --- a/GUI/Model/Sim/InstrumentItems.cpp +++ b/GUI/Model/Sim/InstrumentItems.cpp @@ -202,7 +202,7 @@ std::unique_ptr<PhysicalScan> ScanningInstrumentItem::createScan(const Scale& ax const BeamWavelengthItem* it = scanItem()->wavelengthItem(); ASSERT(it); const auto* distr_item = - dynamic_cast<const SymmetricResolutionItem*>(it->distributionItem()); + dynamic_cast<const SymmetricDistributionItem*>(it->distributionItem()); ASSERT(distr_item); const double scale = it->scaleFactor(); @@ -214,7 +214,7 @@ std::unique_ptr<PhysicalScan> ScanningInstrumentItem::createScan(const Scale& ax const GrazingScanItem* it = scanItem()->grazingScanItem(); ASSERT(it); const auto* distr_item = - dynamic_cast<const SymmetricResolutionItem*>(it->distributionItem()); + dynamic_cast<const SymmetricDistributionItem*>(it->distributionItem()); ASSERT(distr_item); const double scale = it->scaleFactor(); diff --git a/Tests/ReferenceData/Suite/Testing/Temporary/CTestCostData.txt b/Tests/ReferenceData/Suite/Testing/Temporary/CTestCostData.txt new file mode 100644 index 0000000000000000000000000000000000000000..ed97d539c095cf1413af30cc23dea272095b97dd --- /dev/null +++ b/Tests/ReferenceData/Suite/Testing/Temporary/CTestCostData.txt @@ -0,0 +1 @@ +---