diff --git a/GUI/coregui/Models/GroupInfoCatalogue.cpp b/GUI/coregui/Models/GroupInfoCatalogue.cpp index 9a21034ce220c8a6d854b4807db39f31da0af9ed..62fc4cbea9e22515757edb976ba123f0a8037757 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 65bb5891d99c0e2ad1f4e78bb4c21d3502b38b46..a178b7b50a16d487cf66fbd250de7e01265f8ec1 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 7ab36fdeb117be8adb968254936fafc249bbfe6b..11e130ac802eba9e64f9128d1f1c50b60b3d4a9b 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 3a88c9115e8b111e633c970e7366c56da6337ef4..d78e681555f0e59b9fdb4f702f51be87398de10d 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 0000000000000000000000000000000000000000..4ec856e9329d0d3458994d606d0c5b45386bcd6a --- /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 0000000000000000000000000000000000000000..f83ac99625b08b95a4e61d91c4166bbd94e9f9dd --- /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 b8edf210fbbde235171d665e44d08a18d17369d9..daebed04d3d571b8002e408aebddfb87051c679c 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----------------------------------------------------------