From 3e36d3e18f7fab11b45e912bf238f1ab9d5a868a Mon Sep 17 00:00:00 2001 From: Gennady Pospelov <g.pospelov@fz-juelich.de> Date: Thu, 6 Dec 2018 17:58:45 +0100 Subject: [PATCH] Introduce VarianceFunctionItems for GUI minimizer --- GUI/coregui/Models/GroupInfoCatalogue.cpp | 6 +++ GUI/coregui/Models/ItemCatalogue.cpp | 4 ++ GUI/coregui/Models/MinimizerItem.cpp | 11 +++++ GUI/coregui/Models/MinimizerItem.h | 3 ++ GUI/coregui/Models/VarianceFunctionItems.cpp | 51 ++++++++++++++++++++ GUI/coregui/Models/VarianceFunctionItems.h | 49 +++++++++++++++++++ GUI/coregui/Models/item_constants.h | 4 ++ 7 files changed, 128 insertions(+) create mode 100644 GUI/coregui/Models/VarianceFunctionItems.cpp create mode 100644 GUI/coregui/Models/VarianceFunctionItems.h diff --git a/GUI/coregui/Models/GroupInfoCatalogue.cpp b/GUI/coregui/Models/GroupInfoCatalogue.cpp index 9a21034ce22..62fc4cbea9e 100644 --- a/GUI/coregui/Models/GroupInfoCatalogue.cpp +++ b/GUI/coregui/Models/GroupInfoCatalogue.cpp @@ -185,6 +185,12 @@ GroupInfoCatalogue::GroupInfoCatalogue() info.add(Constants::PointwiseAxisType, "Non-uniform axis"); info.setDefaultType(Constants::BasicAxisType); addInfo(info); + + info = GroupInfo(Constants::VarianceFunctionGroup); + info.add(Constants::VarianceDefaultFunctionType, "Default"); + info.add(Constants::VarianceSimFunctionType, "Sim error"); + info.setDefaultType(Constants::VarianceDefaultFunctionType); + addInfo(info); } GroupInfo GroupInfoCatalogue::groupInfo(const QString& groupType) const diff --git a/GUI/coregui/Models/ItemCatalogue.cpp b/GUI/coregui/Models/ItemCatalogue.cpp index 65bb5891d99..a178b7b50a1 100644 --- a/GUI/coregui/Models/ItemCatalogue.cpp +++ b/GUI/coregui/Models/ItemCatalogue.cpp @@ -65,6 +65,7 @@ #include "TransformationItem.h" #include "VectorItem.h" #include "DepthProbeInstrumentItem.h" +#include "VarianceFunctionItems.h" ItemCatalogue::ItemCatalogue() { @@ -242,6 +243,9 @@ ItemCatalogue::ItemCatalogue() add(Constants::ProjectionContainerType, create_new<ProjectionContainerItem>); add(Constants::DepthProbeInstrumentType, create_new<DepthProbeInstrumentItem>); + + add(Constants::VarianceDefaultFunctionType, create_new<VarianceDefaultFunctionItem>); + add(Constants::VarianceSimFunctionType, create_new<VarianceSimFunctionItem>); } bool ItemCatalogue::contains(const QString& modelType) const { return m_data.contains(modelType); } diff --git a/GUI/coregui/Models/MinimizerItem.cpp b/GUI/coregui/Models/MinimizerItem.cpp index 7ab36fdeb11..11e130ac802 100644 --- a/GUI/coregui/Models/MinimizerItem.cpp +++ b/GUI/coregui/Models/MinimizerItem.cpp @@ -22,6 +22,8 @@ #include "SimAnMinimizer.h" #include "TestMinimizer.h" #include "IIntensityFunction.h" +#include "VarianceFunctions.h" +#include "VarianceFunctionItems.h" namespace { const QString none_fun = "None"; @@ -39,6 +41,7 @@ MinimizerItem::MinimizerItem(const QString &model_type) : SessionItem(model_type const QString MinimizerContainerItem::P_MINIMIZERS = "Minimizer"; const QString MinimizerContainerItem::P_INTENSITY_FUNCTION = "Intensity function"; +const QString MinimizerContainerItem::P_VARIANCE_FUNCTIONS = "Variance"; MinimizerContainerItem::MinimizerContainerItem() : MinimizerItem(Constants::MinimizerContainerType) { @@ -50,6 +53,8 @@ MinimizerContainerItem::MinimizerContainerItem() : MinimizerItem(Constants::Mini "Function to apply for both simulated and experimental intensities \n" "before calculating the value of residual."); + addGroupProperty(P_VARIANCE_FUNCTIONS, Constants::VarianceFunctionGroup) + ->setToolTip(QStringLiteral("Variance functions for residual normalization")); } @@ -71,6 +76,12 @@ std::unique_ptr<IIntensityFunction> MinimizerContainerItem::createIntensityFunct } } +std::unique_ptr<IVarianceFunction> MinimizerContainerItem::createVarianceFunction() const +{ + auto& variance_item = groupItem<IVarianceFunctionItem>(P_VARIANCE_FUNCTIONS); + return variance_item.createVarianceFunction(); +} + // ---------------------------------------------------------------------------- const QString MinuitMinimizerItem::P_ALGORITHMS = "Algorithms"; diff --git a/GUI/coregui/Models/MinimizerItem.h b/GUI/coregui/Models/MinimizerItem.h index 3a88c9115e8..d78e681555f 100644 --- a/GUI/coregui/Models/MinimizerItem.h +++ b/GUI/coregui/Models/MinimizerItem.h @@ -19,6 +19,7 @@ class IMinimizer; class IIntensityFunction; +class IVarianceFunction; //! The MinimizerItem class is the base item to hold minimizer settings. @@ -36,10 +37,12 @@ class BA_CORE_API_ MinimizerContainerItem : public MinimizerItem public: static const QString P_MINIMIZERS; static const QString P_INTENSITY_FUNCTION; + static const QString P_VARIANCE_FUNCTIONS; MinimizerContainerItem(); std::unique_ptr<IMinimizer> createMinimizer() const; std::unique_ptr<IIntensityFunction> createIntensityFunction() const; + std::unique_ptr<IVarianceFunction> createVarianceFunction() const; }; //! The MinuitMinimizerItem class represents settings for ROOT Minuit2 minimizer. diff --git a/GUI/coregui/Models/VarianceFunctionItems.cpp b/GUI/coregui/Models/VarianceFunctionItems.cpp new file mode 100644 index 00000000000..4ec856e9329 --- /dev/null +++ b/GUI/coregui/Models/VarianceFunctionItems.cpp @@ -0,0 +1,51 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file GUI/coregui/Models/VarianceFunctionItems.cpp +//! @brief Implements classes VarianceFunctionItems +//! +//! @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 "VarianceFunctionItems.h" +#include "item_constants.h" +#include "VarianceFunctions.h" + +IVarianceFunctionItem::IVarianceFunctionItem(const QString& model_type) + : SessionItem(model_type) +{ + +} + +VarianceDefaultFunctionItem::VarianceDefaultFunctionItem() + : IVarianceFunctionItem(Constants::VarianceDefaultFunctionType) +{ + setToolTip("Provides default residual normalization (i.e. leaves unnormalized)"); + +} + +std::unique_ptr<IVarianceFunction> VarianceDefaultFunctionItem::createVarianceFunction() const +{ + return std::make_unique<VarianceDefaultFunction>(); +} + +const QString VarianceSimFunctionItem::P_EPSILON = "epsilon"; + +VarianceSimFunctionItem::VarianceSimFunctionItem() + : IVarianceFunctionItem(Constants::VarianceSimFunctionType) +{ + setToolTip("Normalizes residual on max(sim, epsilon)"); + addProperty(P_EPSILON, 1.0) + ->setToolTip(QStringLiteral("Defines threshold on simulated amplitude max(sim, epsilon)")); + +} + +std::unique_ptr<IVarianceFunction> VarianceSimFunctionItem::createVarianceFunction() const +{ + return std::make_unique<VarianceSimFunction>(getItemValue(P_EPSILON).toDouble()); +} diff --git a/GUI/coregui/Models/VarianceFunctionItems.h b/GUI/coregui/Models/VarianceFunctionItems.h new file mode 100644 index 00000000000..f83ac99625b --- /dev/null +++ b/GUI/coregui/Models/VarianceFunctionItems.h @@ -0,0 +1,49 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file GUI/coregui/Models/VarianceFunctionItems.h +//! @brief Defines classes VarianceFunctionItems +//! +//! @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 VARIANTFUNCTIONITEMS_H +#define VARIANTFUNCTIONITEMS_H + +#include "SessionItem.h" +#include <QString> +#include <memory> + +class IVarianceFunction; + +class BA_CORE_API_ IVarianceFunctionItem : public SessionItem +{ +public: + virtual std::unique_ptr<IVarianceFunction> createVarianceFunction() const = 0; +protected: + IVarianceFunctionItem(const QString& model_type); +}; + +class BA_CORE_API_ VarianceDefaultFunctionItem : public IVarianceFunctionItem +{ +public: + VarianceDefaultFunctionItem(); + + std::unique_ptr<IVarianceFunction> createVarianceFunction() const; +}; + +class BA_CORE_API_ VarianceSimFunctionItem : public IVarianceFunctionItem +{ +public: + static const QString P_EPSILON; + VarianceSimFunctionItem(); + + std::unique_ptr<IVarianceFunction> createVarianceFunction() const; +}; + +#endif // VARIANTFUNCTIONITEMS_H diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h index b8edf210fbb..daebed04d3d 100644 --- a/GUI/coregui/Models/item_constants.h +++ b/GUI/coregui/Models/item_constants.h @@ -200,6 +200,9 @@ const ModelType FootprintNoneType = "NoFootprint"; const ModelType FootprintGaussianType = "GaussianFootrpint"; const ModelType FootprintSquareType = "SquareFootprint"; +const ModelType VarianceDefaultFunctionType = "VarianceDefaultFunction"; +const ModelType VarianceSimFunctionType = "VarianceSimFunction"; + // --- Groups ------------------------------------------------------------------ const ModelType FormFactorGroup = "Form Factor"; @@ -222,6 +225,7 @@ const ModelType BackgroundGroup = "Background group"; const ModelType MaterialDataGroup = "Material data group"; const ModelType FootprintGroup = "Footprint group"; const ModelType AxesGroup = "Axes group"; +const ModelType VarianceFunctionGroup = "Variance group"; // --- Units&Constants---------------------------------------------------------- -- GitLab