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