From 7abe0a51468c7d2f77cf7d60730cf567da6fd921 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 14:47:35 +0000 Subject: [PATCH 01/33] Move common ui file to base Data analysis tab class --- .../Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp | 3 +-- .../Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h | 2 -- .../Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp | 4 +--- .../Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h | 3 --- .../Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp | 3 +-- .../Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h | 2 -- .../Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp | 4 +--- .../Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h | 3 --- .../Inelastic/Analysis/IndirectDataAnalysisTab.cpp | 4 +++- .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 3 +++ 10 files changed, 10 insertions(+), 21 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 9b478e74d2ff..a9bcead7c0d8 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -25,8 +25,7 @@ std::vector CONVFIT_HIDDEN_PROPS = std::vector( namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new ConvFitModel, parent), m_uiForm(new Ui::IndirectFitTab) { - m_uiForm->setupUi(parent); + : IndirectDataAnalysisTab(new ConvFitModel, parent) { setOutputOptionsView(m_uiForm->ovOutputOptionsView); m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(new ConvTemplateBrowser); setFitPropertyBrowser(m_uiForm->dockArea->m_fitPropertyBrowser); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h index 250b449a9568..ccbeddefaf3d 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h @@ -12,7 +12,6 @@ #include "MantidAPI/CompositeFunction.h" #include "MantidAPI/MatrixWorkspace_fwd.h" -#include "ui_IndirectFitTab.h" namespace MantidQt { namespace CustomInterfaces { @@ -32,7 +31,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisConvFitTab : public IndirectDat void addDataToModel(IAddWorkspaceDialog const *dialog) override; std::string getFitTypeString() const override; - std::unique_ptr m_uiForm; // ShortHand Naming for fit functions std::unordered_map m_fitStrings; }; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index 656a316cc658..b0ac40013d92 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -31,9 +31,7 @@ std::vector FQFIT_HIDDEN_PROPS = "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new FqFitModel, parent), m_uiForm(new Ui::IndirectFitTab) { - m_uiForm->setupUi(parent); - + : IndirectDataAnalysisTab(new FqFitModel, parent) { auto parameterEstimation = createParameterEstimation(); auto templateBrowser = new SingleFunctionTemplateBrowser( widthFits, std::make_unique(parameterEstimation)); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h index 02bbae96bfc0..485168a34ac6 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h @@ -7,7 +7,6 @@ #pragma once #include "IndirectDataAnalysisTab.h" -#include "ui_IndirectFitTab.h" #include "IFQFitObserver.h" #include "MantidAPI/IFunction.h" @@ -35,8 +34,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisFqFitTab : public IndirectDataA void addDataToModel(IAddWorkspaceDialog const *dialog) override; void setActiveWorkspaceIDToCurrentWorkspace(IAddWorkspaceDialog const *dialog); void setModelSpectrum(int index, const std::string ¶mType); - - std::unique_ptr m_uiForm; }; } // namespace IDA } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index 0ef2236bce5d..9b7d72ecf3df 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -25,8 +25,7 @@ std::vector IQTFIT_HIDDEN_PROPS = namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new IqtFitModel, parent), m_uiForm(new Ui::IndirectFitTab) { - m_uiForm->setupUi(parent); + : IndirectDataAnalysisTab(new IqtFitModel, parent) { m_uiForm->dockArea->setFitDataView(new IndirectFitDataView(m_uiForm->dockArea)); setFitDataPresenter( std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h index c511898013b0..b69f47a1e088 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h @@ -10,7 +10,6 @@ #include "MantidAPI/CompositeFunction.h" #include "MantidAPI/MatrixWorkspace_fwd.h" -#include "ui_IndirectFitTab.h" #include @@ -40,7 +39,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisIqtFitTab : public IndirectData EstimationDataSelector getEstimationDataSelector() const override; void addDataToModel(IAddWorkspaceDialog const *dialog) override; - std::unique_ptr m_uiForm; QString m_tiedParameter; }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index f40fb1e6c3d6..f2ba5132f715 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -42,9 +42,7 @@ auto msdFunctionStrings = "Sigma>0)"}}); IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new MSDFitModel, parent), m_uiForm(new Ui::IndirectFitTab) { - m_uiForm->setupUi(parent); - + : IndirectDataAnalysisTab(new MSDFitModel, parent) { m_uiForm->dockArea->setFitDataView(new IndirectFitDataView(m_uiForm->dockArea)); setFitDataPresenter( std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h index 359f2ef06934..afb810f15740 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h @@ -7,7 +7,6 @@ #pragma once #include "IndirectDataAnalysisTab.h" -#include "ui_IndirectFitTab.h" #include "MantidAPI/IFunction.h" @@ -31,8 +30,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisMSDFitTab : public IndirectData std::string getFitTypeString() const override; IDAFunctionParameterEstimation createParameterEstimation() const; void addDataToModel(IAddWorkspaceDialog const *dialog) override; - - std::unique_ptr m_uiForm; }; } // namespace IDA } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 8bed109b28e2..b3fa281f9fa8 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -68,7 +68,9 @@ size_t IndirectDataAnalysisTab::getNumberOfSpecificFunctionContained(const std:: } IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, QWidget *parent) - : IndirectTab(parent), m_fittingModel(model), m_runButton() {} + : IndirectTab(parent), m_fittingModel(model), m_runButton(), m_uiForm(new Ui::IndirectFitTab) { + m_uiForm->setupUi(parent); +} void IndirectDataAnalysisTab::setup() { connect(m_runButton, SIGNAL(clicked()), this, SLOT(runTab())); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index bc92010645a4..29f440d8fdbe 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -13,6 +13,7 @@ #include "IndirectFitPropertyBrowser.h" #include "IndirectFittingModel.h" #include "IndirectTab.h" +#include "ui_IndirectFitTab.h" #include "MantidQtWidgets/Common/FunctionModelDataset.h" @@ -81,6 +82,8 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { WorkspaceID m_activeWorkspaceID; WorkspaceIndex m_activeSpectrumIndex; + std::unique_ptr m_uiForm; + private: void setup() override; bool validate() override; From ed5eef4b76f8365cb6fe2cf546dcba8fb3c4a76a Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 15:25:11 +0000 Subject: [PATCH 02/33] Set FitPropertyBrowser in Base tab class --- .../Inelastic/Analysis/FqFitDataPresenter.cpp | 6 +----- .../Inelastic/Analysis/FqFitDataPresenter.h | 4 +--- .../IndirectDataAnalysisConvFitTab.cpp | 5 +---- .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 18 ++++++++---------- .../Analysis/IndirectDataAnalysisIqtFitTab.cpp | 7 ++----- .../Analysis/IndirectDataAnalysisMSDFitTab.cpp | 13 ++++++------- .../Analysis/IndirectDataAnalysisTab.cpp | 13 +++++++------ .../Analysis/IndirectDataAnalysisTab.h | 4 ++-- .../Inelastic/test/FqFitDataPresenterTest.h | 5 +---- 9 files changed, 29 insertions(+), 46 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp index b39b807ee811..148137012425 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp @@ -197,14 +197,10 @@ boost::optional> getParameterSpectrum(const FqFitParame namespace MantidQt::CustomInterfaces::IDA { -FqFitDataPresenter::FqFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view, - IFQFitObserver *SingleFunctionTemplateBrowser) +FqFitDataPresenter::FqFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view) : IndirectFitDataPresenter(model, view), m_activeParameterType("Width"), m_activeWorkspaceID(WorkspaceID{0}), m_adsInstance(Mantid::API::AnalysisDataService::Instance()) { connect(this, SIGNAL(requestedAddWorkspaceDialog()), this, SLOT(updateActiveWorkspaceID())); - - m_notifier = Notifier(); - m_notifier.subscribe(SingleFunctionTemplateBrowser); } void FqFitDataPresenter::addWorkspace(const std::string &workspaceName, const std::string ¶mType, diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h index c365e196ec98..96f631b00eca 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h @@ -32,8 +32,7 @@ namespace IDA { class MANTIDQT_INELASTIC_DLL FqFitDataPresenter : public IndirectFitDataPresenter { Q_OBJECT public: - FqFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view, - IFQFitObserver *SingleFunctionTemplateBrowser); + FqFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view); void addWorkspace(const std::string &workspaceName, const std::string ¶mType, const int &spectrum_index) override; void setActiveWidth(std::size_t widthIndex, WorkspaceID dataIndex, bool single = true) override; void setActiveEISF(std::size_t eisfIndex, WorkspaceID dataIndex, bool single = true) override; @@ -61,7 +60,6 @@ private slots: std::string m_activeParameterType; WorkspaceID m_activeWorkspaceID; - Notifier m_notifier; Mantid::API::AnalysisDataServiceImpl &m_adsInstance; }; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index a9bcead7c0d8..5c9d0b6a4eaa 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -25,11 +25,8 @@ std::vector CONVFIT_HIDDEN_PROPS = std::vector( namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new ConvFitModel, parent) { + : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, CONVFIT_HIDDEN_PROPS, parent) { setOutputOptionsView(m_uiForm->ovOutputOptionsView); - m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(new ConvTemplateBrowser); - setFitPropertyBrowser(m_uiForm->dockArea->m_fitPropertyBrowser); - m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(CONVFIT_HIDDEN_PROPS); m_uiForm->dockArea->setFitDataView(new ConvFitDataView(m_uiForm->dockArea)); auto dataPresenter = diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index b0ac40013d92..94215ae070bf 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -31,22 +31,20 @@ std::vector FQFIT_HIDDEN_PROPS = "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new FqFitModel, parent) { - auto parameterEstimation = createParameterEstimation(); - auto templateBrowser = new SingleFunctionTemplateBrowser( - widthFits, std::make_unique(parameterEstimation)); + : IndirectDataAnalysisTab( + new FqFitModel, + new SingleFunctionTemplateBrowser( + widthFits, std::make_unique(createParameterEstimation())), + FQFIT_HIDDEN_PROPS, parent) { + // m_fitPropertyBrowser->updateAvailableFunctions(availableFits.at(DataType::ALL)); m_uiForm->dockArea->setFitDataView(new FqFitDataView(m_uiForm->dockArea)); - setFitDataPresenter(std::make_unique(m_fittingModel->getFitDataModel(), - m_uiForm->dockArea->m_fitDataView, templateBrowser)); + setFitDataPresenter( + std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); setPlotView(m_uiForm->dockArea->m_fitPlotView); m_plotPresenter->setXBounds({0.0, 2.0}); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser); - templateBrowser->updateAvailableFunctions(availableFits.at(DataType::ALL)); - setFitPropertyBrowser(m_uiForm->dockArea->m_fitPropertyBrowser); - m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(FQFIT_HIDDEN_PROPS); setRunButton(m_uiForm->pbRun); setEditResultVisible(false); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index 9b7d72ecf3df..aa047492bdb0 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -25,16 +25,13 @@ std::vector IQTFIT_HIDDEN_PROPS = namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new IqtFitModel, parent) { + : IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, IQTFIT_HIDDEN_PROPS, parent) { m_uiForm->dockArea->setFitDataView(new IndirectFitDataView(m_uiForm->dockArea)); setFitDataPresenter( std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); setPlotView(m_uiForm->dockArea->m_fitPlotView); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - auto templateBrowser = new IqtTemplateBrowser; - m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser); - setFitPropertyBrowser(m_uiForm->dockArea->m_fitPropertyBrowser); - m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(IQTFIT_HIDDEN_PROPS); + setRunButton(m_uiForm->pbRun); setEditResultVisible(true); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index f2ba5132f715..be7079975a95 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -42,18 +42,17 @@ auto msdFunctionStrings = "Sigma>0)"}}); IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new MSDFitModel, parent) { + : IndirectDataAnalysisTab( + new MSDFitModel, + new SingleFunctionTemplateBrowser( + msdFunctionStrings, std::make_unique(createParameterEstimation())), + MSDFIT_HIDDEN_PROPS, parent) { m_uiForm->dockArea->setFitDataView(new IndirectFitDataView(m_uiForm->dockArea)); setFitDataPresenter( std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); setPlotView(m_uiForm->dockArea->m_fitPlotView); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - auto parameterEstimation = createParameterEstimation(); - auto templateBrowser = new SingleFunctionTemplateBrowser( - msdFunctionStrings, std::make_unique(parameterEstimation)); - m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser); - setFitPropertyBrowser(m_uiForm->dockArea->m_fitPropertyBrowser); - m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(MSDFIT_HIDDEN_PROPS); + setRunButton(m_uiForm->pbRun); setEditResultVisible(false); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index b3fa281f9fa8..cf1f158ee67e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -67,9 +67,15 @@ size_t IndirectDataAnalysisTab::getNumberOfSpecificFunctionContained(const std:: } } -IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, QWidget *parent) +IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, + std::vector const &hiddenProperties, QWidget *parent) : IndirectTab(parent), m_fittingModel(model), m_runButton(), m_uiForm(new Ui::IndirectFitTab) { m_uiForm->setupUi(parent); + + m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser); + m_uiForm->dockArea->m_fitPropertyBrowser->init(); + m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(hiddenProperties); + m_fitPropertyBrowser = m_uiForm->dockArea->m_fitPropertyBrowser; } void IndirectDataAnalysisTab::setup() { @@ -130,11 +136,6 @@ void IndirectDataAnalysisTab::setOutputOptionsView(IIndirectFitOutputOptionsView m_outOptionsPresenter = std::make_unique(view); } -void IndirectDataAnalysisTab::setFitPropertyBrowser(IndirectFitPropertyBrowser *browser) { - browser->init(); - m_fitPropertyBrowser = browser; -} - void IndirectDataAnalysisTab::setRunButton(QPushButton *runButton) { m_runButton = runButton; } void IndirectDataAnalysisTab::setRunIsRunning(bool running) { m_runButton->setText(running ? "Running..." : "Run"); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index 29f440d8fdbe..8ae82463e746 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -36,13 +36,13 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { Q_OBJECT public: - IndirectDataAnalysisTab(IndirectFittingModel *model, QWidget *parent = nullptr); + IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, + std::vector const &hiddenProperties, QWidget *parent = nullptr); virtual ~IndirectDataAnalysisTab() override = default; void setFitDataPresenter(std::unique_ptr presenter); void setPlotView(IIndirectFitPlotView *view); void setOutputOptionsView(IIndirectFitOutputOptionsView *view); - void setFitPropertyBrowser(IndirectFitPropertyBrowser *browser); WorkspaceID getSelectedDataIndex() const; WorkspaceIndex getSelectedSpectrum() const; bool isRangeCurrentlySelected(WorkspaceID workspaceID, WorkspaceIndex spectrum) const; diff --git a/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h b/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h index e868558231e9..808f3fa390f5 100644 --- a/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h +++ b/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h @@ -139,12 +139,10 @@ class FqFitDataPresenterTest : public CxxTest::TestSuite { m_model = std::make_unique>(); m_dataTable = createEmptyTableWidget(6, 5); - m_SingleFunctionTemplateBrowser = std::make_unique(); ON_CALL(*m_view, getDataTable()).WillByDefault(Return(m_dataTable.get())); - m_presenter = std::make_unique(std::move(m_model.get()), std::move(m_view.get()), - m_SingleFunctionTemplateBrowser.get()); + m_presenter = std::make_unique(std::move(m_model.get()), std::move(m_view.get())); m_workspace = createWorkspaceWithTextAxis(6, getTextAxisLabels()); m_ads = std::make_unique("WorkspaceName", m_workspace); } @@ -201,7 +199,6 @@ class FqFitDataPresenterTest : public CxxTest::TestSuite { private: std::unique_ptr m_dataTable; - std::unique_ptr m_SingleFunctionTemplateBrowser; std::unique_ptr m_view; std::unique_ptr m_model; From 78f61bcd5a4cba337c7a0a3c30bc6e74af0ff811 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 15:32:50 +0000 Subject: [PATCH 03/33] Remove setting run button for each individual tab --- .../Analysis/IndirectDataAnalysisConvFitTab.cpp | 1 - .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 2 -- .../Analysis/IndirectDataAnalysisIqtFitTab.cpp | 2 -- .../Analysis/IndirectDataAnalysisMSDFitTab.cpp | 2 -- .../Inelastic/Analysis/IndirectDataAnalysisTab.cpp | 12 ++++++------ .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 2 -- 6 files changed, 6 insertions(+), 15 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 5c9d0b6a4eaa..8dcaab4a1f9e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -33,7 +33,6 @@ IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); setFitDataPresenter(std::move(dataPresenter)); setPlotView(m_uiForm->dockArea->m_fitPlotView); - setRunButton(m_uiForm->pbRun); setEditResultVisible(true); setConvolveMembers(true); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index 94215ae070bf..cbbfefbc4480 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -45,8 +45,6 @@ IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) m_plotPresenter->setXBounds({0.0, 2.0}); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - setRunButton(m_uiForm->pbRun); - setEditResultVisible(false); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index aa047492bdb0..b37a99ce1a19 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -32,8 +32,6 @@ IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) setPlotView(m_uiForm->dockArea->m_fitPlotView); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - setRunButton(m_uiForm->pbRun); - setEditResultVisible(true); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index be7079975a95..3514e22c81f6 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -53,8 +53,6 @@ IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) setPlotView(m_uiForm->dockArea->m_fitPlotView); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - setRunButton(m_uiForm->pbRun); - setEditResultVisible(false); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index cf1f158ee67e..6207ee5a0336 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -69,7 +69,7 @@ size_t IndirectDataAnalysisTab::getNumberOfSpecificFunctionContained(const std:: IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, std::vector const &hiddenProperties, QWidget *parent) - : IndirectTab(parent), m_fittingModel(model), m_runButton(), m_uiForm(new Ui::IndirectFitTab) { + : IndirectTab(parent), m_fittingModel(model), m_uiForm(new Ui::IndirectFitTab) { m_uiForm->setupUi(parent); m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser); @@ -79,7 +79,7 @@ IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, Fu } void IndirectDataAnalysisTab::setup() { - connect(m_runButton, SIGNAL(clicked()), this, SLOT(runTab())); + connect(m_uiForm->pbRun, SIGNAL(clicked()), this, SLOT(runTab())); updateResultOptions(); connect(m_outOptionsPresenter.get(), SIGNAL(plotSpectra()), this, SLOT(plotSelectedSpectra())); @@ -136,11 +136,11 @@ void IndirectDataAnalysisTab::setOutputOptionsView(IIndirectFitOutputOptionsView m_outOptionsPresenter = std::make_unique(view); } -void IndirectDataAnalysisTab::setRunButton(QPushButton *runButton) { m_runButton = runButton; } - -void IndirectDataAnalysisTab::setRunIsRunning(bool running) { m_runButton->setText(running ? "Running..." : "Run"); } +void IndirectDataAnalysisTab::setRunIsRunning(bool running) { + m_uiForm->pbRun->setText(running ? "Running..." : "Run"); +} -void IndirectDataAnalysisTab::setRunEnabled(bool enable) { m_runButton->setEnabled(enable); } +void IndirectDataAnalysisTab::setRunEnabled(bool enable) { m_uiForm->pbRun->setEnabled(enable); } void IndirectDataAnalysisTab::setFileExtensionsByName(bool filter) { auto const tab = getTabName(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index 8ae82463e746..eac7dc7b5a8f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -57,7 +57,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { void setFileExtensionsByName(bool filter); protected: - void setRunButton(QPushButton *runButton); IndirectFittingModel *getFittingModel() const; void run() override; void setSampleWSSuffixes(const QStringList &suffices); @@ -106,7 +105,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { std::unique_ptr m_outOptionsPresenter; Mantid::API::IAlgorithm_sptr m_fittingAlgorithm; - QPushButton *m_runButton; protected slots: void setModelFitFunction(); From f1476946cd6f3dcdcf8a15d8bf5a7ec63600afaf Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 15:37:52 +0000 Subject: [PATCH 04/33] Set Edit Result button hidden by default --- .../Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp | 1 - .../Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp | 2 -- .../Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp | 2 -- .../Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp | 2 -- .../Inelastic/Analysis/IndirectFitOutputOptionsView.cpp | 2 ++ 5 files changed, 2 insertions(+), 7 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 8dcaab4a1f9e..54557638b7a6 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -34,7 +34,6 @@ IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) setFitDataPresenter(std::move(dataPresenter)); setPlotView(m_uiForm->dockArea->m_fitPlotView); - setEditResultVisible(true); setConvolveMembers(true); // Initialise fitTypeStrings diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index cbbfefbc4480..4384dd544133 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -44,8 +44,6 @@ IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) setPlotView(m_uiForm->dockArea->m_fitPlotView); m_plotPresenter->setXBounds({0.0, 2.0}); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - - setEditResultVisible(false); } std::string IndirectDataAnalysisFqFitTab::getFitTypeString() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index b37a99ce1a19..83579a804de5 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -31,8 +31,6 @@ IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); setPlotView(m_uiForm->dockArea->m_fitPlotView); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - - setEditResultVisible(true); } EstimationDataSelector IndirectDataAnalysisIqtFitTab::getEstimationDataSelector() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index 3514e22c81f6..fb9dc991822f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -52,8 +52,6 @@ IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); setPlotView(m_uiForm->dockArea->m_fitPlotView); setOutputOptionsView(m_uiForm->ovOutputOptionsView); - - setEditResultVisible(false); } EstimationDataSelector IndirectDataAnalysisMSDFitTab::getEstimationDataSelector() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitOutputOptionsView.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitOutputOptionsView.cpp index c9a5c7d8ec10..3cdc4ee7bd6f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitOutputOptionsView.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitOutputOptionsView.cpp @@ -20,6 +20,8 @@ IndirectFitOutputOptionsView::IndirectFitOutputOptionsView(QWidget *parent) connect(m_outputOptions->pbPlot, SIGNAL(clicked()), this, SLOT(emitPlotClicked())); connect(m_outputOptions->pbSave, SIGNAL(clicked()), this, SLOT(emitSaveClicked())); connect(m_outputOptions->pbEditResult, SIGNAL(clicked()), this, SLOT(emitEditResultClicked())); + + m_outputOptions->pbEditResult->setVisible(false); } IndirectFitOutputOptionsView::~IndirectFitOutputOptionsView() = default; From 2b441115bb1b830a17096c3f937101d434d18c85 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 15:41:11 +0000 Subject: [PATCH 05/33] Remove set Output options for each tab individually --- .../Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp | 2 -- .../Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp | 1 - .../Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp | 1 - .../Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp | 1 - .../Inelastic/Analysis/IndirectDataAnalysisTab.cpp | 6 ++---- .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 1 - 6 files changed, 2 insertions(+), 10 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 54557638b7a6..e3a31764803b 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -26,8 +26,6 @@ namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, CONVFIT_HIDDEN_PROPS, parent) { - setOutputOptionsView(m_uiForm->ovOutputOptionsView); - m_uiForm->dockArea->setFitDataView(new ConvFitDataView(m_uiForm->dockArea)); auto dataPresenter = std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index 4384dd544133..b5d407b9115a 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -43,7 +43,6 @@ IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); setPlotView(m_uiForm->dockArea->m_fitPlotView); m_plotPresenter->setXBounds({0.0, 2.0}); - setOutputOptionsView(m_uiForm->ovOutputOptionsView); } std::string IndirectDataAnalysisFqFitTab::getFitTypeString() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index 83579a804de5..cd3996e4b80e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -30,7 +30,6 @@ IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) setFitDataPresenter( std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); setPlotView(m_uiForm->dockArea->m_fitPlotView); - setOutputOptionsView(m_uiForm->ovOutputOptionsView); } EstimationDataSelector IndirectDataAnalysisIqtFitTab::getEstimationDataSelector() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index fb9dc991822f..bda8c90701ad 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -51,7 +51,6 @@ IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) setFitDataPresenter( std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); setPlotView(m_uiForm->dockArea->m_fitPlotView); - setOutputOptionsView(m_uiForm->ovOutputOptionsView); } EstimationDataSelector IndirectDataAnalysisMSDFitTab::getEstimationDataSelector() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 6207ee5a0336..8d3a2fa05940 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -76,6 +76,8 @@ IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, Fu m_uiForm->dockArea->m_fitPropertyBrowser->init(); m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(hiddenProperties); m_fitPropertyBrowser = m_uiForm->dockArea->m_fitPropertyBrowser; + + m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); } void IndirectDataAnalysisTab::setup() { @@ -132,10 +134,6 @@ void IndirectDataAnalysisTab::setPlotView(IIndirectFitPlotView *view) { m_plotPresenter->updatePlots(); } -void IndirectDataAnalysisTab::setOutputOptionsView(IIndirectFitOutputOptionsView *view) { - m_outOptionsPresenter = std::make_unique(view); -} - void IndirectDataAnalysisTab::setRunIsRunning(bool running) { m_uiForm->pbRun->setText(running ? "Running..." : "Run"); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index eac7dc7b5a8f..c5f655d46a69 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -42,7 +42,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { void setFitDataPresenter(std::unique_ptr presenter); void setPlotView(IIndirectFitPlotView *view); - void setOutputOptionsView(IIndirectFitOutputOptionsView *view); WorkspaceID getSelectedDataIndex() const; WorkspaceIndex getSelectedSpectrum() const; bool isRangeCurrentlySelected(WorkspaceID workspaceID, WorkspaceIndex spectrum) const; From 39f3fc306c2aa91ad5df831a8ed293360876b8d5 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 16:17:32 +0000 Subject: [PATCH 06/33] Move last few presenter creations to base tab class --- .../Analysis/IndirectDataAnalysisConvFitTab.cpp | 9 ++------- .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 6 +----- .../Analysis/IndirectDataAnalysisIqtFitTab.cpp | 8 ++------ .../Analysis/IndirectDataAnalysisMSDFitTab.cpp | 7 +------ .../Analysis/IndirectDataAnalysisTab.cpp | 15 +++++++++++---- .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 7 ++++--- 6 files changed, 21 insertions(+), 31 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index e3a31764803b..102f42695b46 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -25,13 +25,8 @@ std::vector CONVFIT_HIDDEN_PROPS = std::vector( namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, CONVFIT_HIDDEN_PROPS, parent) { - m_uiForm->dockArea->setFitDataView(new ConvFitDataView(m_uiForm->dockArea)); - auto dataPresenter = - std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); - setFitDataPresenter(std::move(dataPresenter)); - setPlotView(m_uiForm->dockArea->m_fitPlotView); - + : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, CONVFIT_HIDDEN_PROPS, + parent) { setConvolveMembers(true); // Initialise fitTypeStrings diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index b5d407b9115a..9518467995dd 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -35,13 +35,9 @@ IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) new FqFitModel, new SingleFunctionTemplateBrowser( widthFits, std::make_unique(createParameterEstimation())), - FQFIT_HIDDEN_PROPS, parent) { + new FqFitDataView, FQFIT_HIDDEN_PROPS, parent) { // m_fitPropertyBrowser->updateAvailableFunctions(availableFits.at(DataType::ALL)); - m_uiForm->dockArea->setFitDataView(new FqFitDataView(m_uiForm->dockArea)); - setFitDataPresenter( - std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); - setPlotView(m_uiForm->dockArea->m_fitPlotView); m_plotPresenter->setXBounds({0.0, 2.0}); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index cd3996e4b80e..8341223de9d5 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -25,12 +25,8 @@ std::vector IQTFIT_HIDDEN_PROPS = namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, IQTFIT_HIDDEN_PROPS, parent) { - m_uiForm->dockArea->setFitDataView(new IndirectFitDataView(m_uiForm->dockArea)); - setFitDataPresenter( - std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); - setPlotView(m_uiForm->dockArea->m_fitPlotView); -} + : IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, IQTFIT_HIDDEN_PROPS, + parent) {} EstimationDataSelector IndirectDataAnalysisIqtFitTab::getEstimationDataSelector() const { return diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index bda8c90701ad..8e1289cc5ed2 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -46,12 +46,7 @@ IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) new MSDFitModel, new SingleFunctionTemplateBrowser( msdFunctionStrings, std::make_unique(createParameterEstimation())), - MSDFIT_HIDDEN_PROPS, parent) { - m_uiForm->dockArea->setFitDataView(new IndirectFitDataView(m_uiForm->dockArea)); - setFitDataPresenter( - std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView)); - setPlotView(m_uiForm->dockArea->m_fitPlotView); -} + new IndirectFitDataView, MSDFIT_HIDDEN_PROPS, parent) {} EstimationDataSelector IndirectDataAnalysisMSDFitTab::getEstimationDataSelector() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 8d3a2fa05940..8e08f1efbd5f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -68,6 +68,7 @@ size_t IndirectDataAnalysisTab::getNumberOfSpecificFunctionContained(const std:: } IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, + IndirectFitDataView *fitDataView, std::vector const &hiddenProperties, QWidget *parent) : IndirectTab(parent), m_fittingModel(model), m_uiForm(new Ui::IndirectFitTab) { m_uiForm->setupUi(parent); @@ -77,6 +78,11 @@ IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, Fu m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(hiddenProperties); m_fitPropertyBrowser = m_uiForm->dockArea->m_fitPropertyBrowser; + fitDataView->setParent(m_uiForm->dockArea); + m_uiForm->dockArea->setFitDataView(fitDataView); + setupFitDataPresenter(); + setupPlotView(); + m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); } @@ -123,12 +129,13 @@ void IndirectDataAnalysisTab::connectFitPropertyBrowser() { connect(m_fitPropertyBrowser, SIGNAL(functionChanged()), this, SLOT(respondToFunctionChanged())); } -void IndirectDataAnalysisTab::setFitDataPresenter(std::unique_ptr presenter) { - m_dataPresenter = std::move(presenter); +void IndirectDataAnalysisTab::setupFitDataPresenter() { + m_dataPresenter = + std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); } -void IndirectDataAnalysisTab::setPlotView(IIndirectFitPlotView *view) { - m_plotPresenter = std::make_unique(view); +void IndirectDataAnalysisTab::setupPlotView() { + m_plotPresenter = std::make_unique(m_uiForm->dockArea->m_fitPlotView); m_plotPresenter->setFittingData(m_dataPresenter->getFittingData()); m_plotPresenter->setFitOutput(m_fittingModel->getFitOutput()); m_plotPresenter->updatePlots(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index c5f655d46a69..24d15ab4013c 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -37,11 +37,10 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { public: IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, - std::vector const &hiddenProperties, QWidget *parent = nullptr); + IndirectFitDataView *fitDataView, std::vector const &hiddenProperties, + QWidget *parent = nullptr); virtual ~IndirectDataAnalysisTab() override = default; - void setFitDataPresenter(std::unique_ptr presenter); - void setPlotView(IIndirectFitPlotView *view); WorkspaceID getSelectedDataIndex() const; WorkspaceIndex getSelectedSpectrum() const; bool isRangeCurrentlySelected(WorkspaceID workspaceID, WorkspaceIndex spectrum) const; @@ -85,6 +84,8 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { private: void setup() override; bool validate() override; + void setupFitDataPresenter(); + void setupPlotView(); virtual EstimationDataSelector getEstimationDataSelector() const = 0; void connectPlotPresenter(); void connectFitPropertyBrowser(); From 6a89a176c52b23b68d497e6dbf8c5fa855bda672 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 16:27:41 +0000 Subject: [PATCH 07/33] Remove default implementations of addDataToModel --- .../Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp | 7 ------- .../Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h | 1 - .../Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp | 7 ------- .../Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h | 1 - .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 2 +- 5 files changed, 1 insertion(+), 17 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index 8341223de9d5..8ad11a24fa88 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -39,13 +39,6 @@ EstimationDataSelector IndirectDataAnalysisIqtFitTab::getEstimationDataSelector( }; } -void IndirectDataAnalysisIqtFitTab::addDataToModel(IAddWorkspaceDialog const *dialog) { - if (const auto indirectDialog = dynamic_cast(dialog)) { - m_dataPresenter->addWorkspace(indirectDialog->workspaceName(), indirectDialog->workspaceIndices()); - m_fittingModel->addDefaultParameters(); - } -} - std::string IndirectDataAnalysisIqtFitTab::getFitTypeString() const { const auto numberOfExponential = getNumberOfCustomFunctions("ExpDecay"); const auto numberOfStretched = getNumberOfCustomFunctions("StretchExp"); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h index b69f47a1e088..c922cc85ee03 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h @@ -37,7 +37,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisIqtFitTab : public IndirectData private: std::string getFitTypeString() const override; EstimationDataSelector getEstimationDataSelector() const override; - void addDataToModel(IAddWorkspaceDialog const *dialog) override; QString m_tiedParameter; }; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index 8e1289cc5ed2..723080d7aff2 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -122,13 +122,6 @@ IDAFunctionParameterEstimation IndirectDataAnalysisMSDFitTab::createParameterEst return parameterEstimation; } -void IndirectDataAnalysisMSDFitTab::addDataToModel(IAddWorkspaceDialog const *dialog) { - if (const auto indirectDialog = dynamic_cast(dialog)) { - m_dataPresenter->addWorkspace(indirectDialog->workspaceName(), indirectDialog->workspaceIndices()); - m_fittingModel->addDefaultParameters(); - } -} - } // namespace IDA } // namespace CustomInterfaces } // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h index afb810f15740..cfc7c66755c9 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h @@ -29,7 +29,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisMSDFitTab : public IndirectData EstimationDataSelector getEstimationDataSelector() const override; std::string getFitTypeString() const override; IDAFunctionParameterEstimation createParameterEstimation() const; - void addDataToModel(IAddWorkspaceDialog const *dialog) override; }; } // namespace IDA } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index 24d15ab4013c..3367ba885fed 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -100,7 +100,7 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { void enableOutputOptions(bool enable); void setPDFWorkspace(std::string const &workspaceName); void updateParameterEstimationData(); - virtual void addDataToModel(IAddWorkspaceDialog const *dialog) = 0; + virtual void addDataToModel(IAddWorkspaceDialog const *dialog); virtual std::string getFitTypeString() const = 0; std::unique_ptr m_outOptionsPresenter; From c8779ed9d66720f619ec3861a15107997d3ea13e Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 16:44:34 +0000 Subject: [PATCH 08/33] Tidy up annonymous namespaces in individual fit tab files --- .../IndirectDataAnalysisConvFitTab.cpp | 45 +++---- .../Analysis/IndirectDataAnalysisConvFitTab.h | 3 - .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 117 +++++++++--------- .../IndirectDataAnalysisIqtFitTab.cpp | 20 ++- .../IndirectDataAnalysisMSDFitTab.cpp | 21 ++-- 5 files changed, 94 insertions(+), 112 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 102f42695b46..679760e9ca9a 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -10,16 +10,29 @@ #include "FunctionBrowser/ConvTemplateBrowser.h" #include "IndirectFitPlotView.h" -#include "MantidAPI/FunctionFactory.h" - -using namespace Mantid; using namespace Mantid::API; namespace { -Mantid::Kernel::Logger g_log("ConvFit"); std::vector CONVFIT_HIDDEN_PROPS = std::vector( {"CreateOutput", "LogValue", "PassWSIndexToFunction", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); + +auto FUNCTION_STRINGS = std::unordered_map({{"Lorentzian", "L"}, + {"StretchedExpFT", "SFT"}, + {"TeixeiraWaterSQE", "TxWater"}, + {"FickDiffusionSQE", "FickDiff"}, + {"ChudleyElliotSQE", "ChudElliot"}, + {"HallRossSQE", "HallRoss"}, + {"DiffRotDiscreteCircle", "DC"}, + {"ElasticDiffRotDiscreteCircle", "EDC"}, + {"InelasticDiffRotDiscreteCircle", "IDC"}, + {"DiffSphere", "DS"}, + {"ElasticDiffSphere", "EDS"}, + {"InelasticDiffSphere", "IDS"}, + {"IsoRotDiff", "IRD"}, + {"ElasticIsoRotDiff", "EIRD"}, + {"InelasticIsoRotDiff", "IIRD"}}); + } // namespace namespace MantidQt::CustomInterfaces::IDA { @@ -28,29 +41,11 @@ IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, CONVFIT_HIDDEN_PROPS, parent) { setConvolveMembers(true); - - // Initialise fitTypeStrings - m_fitStrings["Lorentzian"] = "L"; - m_fitStrings["StretchedExpFT"] = "SFT"; - m_fitStrings["TeixeiraWaterSQE"] = "TxWater"; - m_fitStrings["FickDiffusionSQE"] = "FickDiff"; - m_fitStrings["ChudleyElliotSQE"] = "ChudElliot"; - m_fitStrings["HallRossSQE"] = "HallRoss"; - m_fitStrings["DiffRotDiscreteCircle"] = "DC"; - m_fitStrings["ElasticDiffRotDiscreteCircle"] = "EDC"; - m_fitStrings["InelasticDiffRotDiscreteCircle"] = "IDC"; - m_fitStrings["DiffSphere"] = "DS"; - m_fitStrings["ElasticDiffSphere"] = "EDS"; - m_fitStrings["InelasticDiffSphere"] = "IDS"; - m_fitStrings["IsoRotDiff"] = "IRD"; - m_fitStrings["ElasticIsoRotDiff"] = "EIRD"; - m_fitStrings["InelasticIsoRotDiff"] = "IIRD"; } EstimationDataSelector IndirectDataAnalysisConvFitTab::getEstimationDataSelector() const { - return [](const MantidVec &, const MantidVec &, const std::pair) -> DataForParameterEstimation { - return DataForParameterEstimation{}; - }; + return [](const Mantid::MantidVec &, const Mantid::MantidVec &, + const std::pair) -> DataForParameterEstimation { return DataForParameterEstimation{}; }; } void IndirectDataAnalysisConvFitTab::addDataToModel(IAddWorkspaceDialog const *dialog) { @@ -72,7 +67,7 @@ void IndirectDataAnalysisConvFitTab::addDataToModel(IAddWorkspaceDialog const *d */ std::string IndirectDataAnalysisConvFitTab::getFitTypeString() const { std::string fitType; - for (auto fitFunctionName : m_fitStrings) { + for (auto fitFunctionName : FUNCTION_STRINGS) { auto occurances = getNumberOfCustomFunctions(fitFunctionName.first); if (occurances > 0) { fitType += std::to_string(occurances) + fitFunctionName.second; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h index ccbeddefaf3d..e86f3e1b1c9d 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h @@ -30,9 +30,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisConvFitTab : public IndirectDat EstimationDataSelector getEstimationDataSelector() const override; void addDataToModel(IAddWorkspaceDialog const *dialog) override; std::string getFitTypeString() const override; - - // ShortHand Naming for fit functions - std::unordered_map m_fitStrings; }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index 9518467995dd..98362948c891 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -11,7 +11,6 @@ #include "IDAFunctionParameterEstimation.h" #include "FunctionBrowser/SingleFunctionTemplateBrowser.h" -#include "MantidAPI/FunctionFactory.h" #include "MantidAPI/IFunction.h" #include "MantidAPI/MultiDomainFunction.h" #include "MantidKernel/PhysicalConstants.h" @@ -19,17 +18,72 @@ #include using namespace Mantid::API; - -namespace MantidQt::CustomInterfaces::IDA { +using namespace MantidQt::CustomInterfaces::IDA; namespace { constexpr double HBAR = Mantid::PhysicalConstants::h / Mantid::PhysicalConstants::meV * 1e12 / (2 * M_PI); -} std::vector FQFIT_HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); +void estimateChudleyElliot(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + + double L = 1.5; + double tau = (HBAR / y[1]) * (1 - sin(x[1] * L) / (L * x[1])); + + function->setParameter("L", L); + function->setParameter("Tau", tau); +} +void estimateHallRoss(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + + double L = 0.2; + double tau = (HBAR / y[1]) * (1 - exp((-x[1] * x[1] * L * L) / 2)); + + function->setParameter("L", L); + function->setParameter("Tau", tau); +} +void estimateTeixeiraWater(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + + double L = 1.5; + double QL = x[1] * L; + double tau = (HBAR / y[1]) * ((QL * QL) / (6 + QL * QL)); + + function->setParameter("L", L); + function->setParameter("Tau", tau); +} +void estimateFickDiffusion(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + + function->setParameter("D", y[1] / (x[1] * x[1])); +} + +} // namespace + +namespace MantidQt::CustomInterfaces::IDA { + IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) : IndirectDataAnalysisTab( new FqFitModel, @@ -115,61 +169,6 @@ void IndirectDataAnalysisFqFitTab::setModelSpectrum(int index, const std::string m_dataPresenter->setActiveEISF(static_cast(index), m_activeWorkspaceID, false); } -namespace { -void estimateChudleyElliot(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - double L = 1.5; - double tau = (HBAR / y[1]) * (1 - sin(x[1] * L) / (L * x[1])); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateHallRoss(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - double L = 0.2; - double tau = (HBAR / y[1]) * (1 - exp((-x[1] * x[1] * L * L) / 2)); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateTeixeiraWater(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - double L = 1.5; - double QL = x[1] * L; - double tau = (HBAR / y[1]) * ((QL * QL) / (6 + QL * QL)); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateFickDiffusion(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - function->setParameter("D", y[1] / (x[1] * x[1])); -} -} // namespace - IDAFunctionParameterEstimation IndirectDataAnalysisFqFitTab::createParameterEstimation() const { IDAFunctionParameterEstimation parameterEstimation; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index 8ad11a24fa88..2cb996826838 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -10,13 +10,9 @@ #include "IndirectFitPlotView.h" #include "IqtFitModel.h" -#include "MantidAPI/FunctionFactory.h" - -using namespace Mantid; using namespace Mantid::API; namespace { -Mantid::Kernel::Logger g_log("IqtFit"); std::vector IQTFIT_HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); @@ -29,14 +25,14 @@ IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) parent) {} EstimationDataSelector IndirectDataAnalysisIqtFitTab::getEstimationDataSelector() const { - return - [](const MantidVec &x, const MantidVec &y, const std::pair range) -> DataForParameterEstimation { - (void)range; - size_t const n = 4; - if (y.size() < n + 1) - return DataForParameterEstimation{{}, {}}; - return DataForParameterEstimation{{x[0], x[n]}, {y[0], y[n]}}; - }; + return [](const Mantid::MantidVec &x, const Mantid::MantidVec &y, + const std::pair range) -> DataForParameterEstimation { + (void)range; + size_t const n = 4; + if (y.size() < n + 1) + return DataForParameterEstimation{{}, {}}; + return DataForParameterEstimation{{x[0], x[n]}, {y[0], y[n]}}; + }; } std::string IndirectDataAnalysisIqtFitTab::getFitTypeString() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index 723080d7aff2..524aa48662a3 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -11,14 +11,9 @@ #include "FunctionBrowser/SingleFunctionTemplateBrowser.h" -#include "MantidQtWidgets/Common/UserInputValidator.h" - -#include "MantidAPI/FunctionFactory.h" - using namespace Mantid::API; namespace { -Mantid::Kernel::Logger g_log("MSDFit"); std::vector MSDFIT_HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); @@ -27,13 +22,7 @@ const std::string MSDGAUSSFUNC{"MsdGauss"}; const std::string MSDPETERSFUNC{"MsdPeters"}; const std::string MSDYIFUNC{"MsdYi"}; -} // namespace - -namespace MantidQt { -namespace CustomInterfaces { -namespace IDA { - -auto msdFunctionStrings = +auto MSD_FUNCTION_STRINGS = std::map({{"None", ""}, {"Gauss", "name=MsdGauss,Height=1,Msd=0.05,constraints=(Height>0, Msd>0)"}, {"Peters", "name=MsdPeters,Height=1,Msd=0.05,Beta=1,constraints=(Height>0, " @@ -41,11 +30,17 @@ auto msdFunctionStrings = {"Yi", "name=MsdYi,Height=1,Msd=0.05,Sigma=1,constraints=(Height>0, Msd>0, " "Sigma>0)"}}); +} // namespace + +namespace MantidQt { +namespace CustomInterfaces { +namespace IDA { + IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) : IndirectDataAnalysisTab( new MSDFitModel, new SingleFunctionTemplateBrowser( - msdFunctionStrings, std::make_unique(createParameterEstimation())), + MSD_FUNCTION_STRINGS, std::make_unique(createParameterEstimation())), new IndirectFitDataView, MSDFIT_HIDDEN_PROPS, parent) {} EstimationDataSelector IndirectDataAnalysisMSDFitTab::getEstimationDataSelector() const { From ff67879f94aed096af7527a9a1f3b2676ae54b22 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 8 Nov 2023 17:25:24 +0000 Subject: [PATCH 09/33] Move Fit type string creation into base tab class --- .../IndirectDataAnalysisConvFitTab.cpp | 41 ---------------- .../Analysis/IndirectDataAnalysisConvFitTab.h | 1 - .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 13 ----- .../Analysis/IndirectDataAnalysisFqFitTab.h | 1 - .../IndirectDataAnalysisIqtFitTab.cpp | 13 ----- .../Analysis/IndirectDataAnalysisIqtFitTab.h | 1 - .../IndirectDataAnalysisMSDFitTab.cpp | 22 --------- .../Analysis/IndirectDataAnalysisMSDFitTab.h | 1 - .../Analysis/IndirectDataAnalysisTab.cpp | 49 +++++++++++++++++++ .../Analysis/IndirectDataAnalysisTab.h | 2 +- 10 files changed, 50 insertions(+), 94 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 679760e9ca9a..37511368908d 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -17,22 +17,6 @@ namespace { std::vector CONVFIT_HIDDEN_PROPS = std::vector( {"CreateOutput", "LogValue", "PassWSIndexToFunction", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); -auto FUNCTION_STRINGS = std::unordered_map({{"Lorentzian", "L"}, - {"StretchedExpFT", "SFT"}, - {"TeixeiraWaterSQE", "TxWater"}, - {"FickDiffusionSQE", "FickDiff"}, - {"ChudleyElliotSQE", "ChudElliot"}, - {"HallRossSQE", "HallRoss"}, - {"DiffRotDiscreteCircle", "DC"}, - {"ElasticDiffRotDiscreteCircle", "EDC"}, - {"InelasticDiffRotDiscreteCircle", "IDC"}, - {"DiffSphere", "DS"}, - {"ElasticDiffSphere", "EDS"}, - {"InelasticDiffSphere", "IDS"}, - {"IsoRotDiff", "IRD"}, - {"ElasticIsoRotDiff", "EIRD"}, - {"InelasticIsoRotDiff", "IIRD"}}); - } // namespace namespace MantidQt::CustomInterfaces::IDA { @@ -56,29 +40,4 @@ void IndirectDataAnalysisConvFitTab::addDataToModel(IAddWorkspaceDialog const *d } } -/** - * Generate a string to describe the fit type selected by the user. - * Used when naming the resultant workspaces. - * - * Assertions used to guard against any future changes that don't take - * workspace naming into account. - * - * @returns the generated string. - */ -std::string IndirectDataAnalysisConvFitTab::getFitTypeString() const { - std::string fitType; - for (auto fitFunctionName : FUNCTION_STRINGS) { - auto occurances = getNumberOfCustomFunctions(fitFunctionName.first); - if (occurances > 0) { - fitType += std::to_string(occurances) + fitFunctionName.second; - } - } - - if (getNumberOfCustomFunctions("DeltaFunction") > 0) { - fitType += "Delta"; - } - - return fitType; -} - } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h index e86f3e1b1c9d..e236e5766a2f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h @@ -29,7 +29,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisConvFitTab : public IndirectDat private: EstimationDataSelector getEstimationDataSelector() const override; void addDataToModel(IAddWorkspaceDialog const *dialog) override; - std::string getFitTypeString() const override; }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index 98362948c891..c034dd47232d 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -95,19 +95,6 @@ IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) m_plotPresenter->setXBounds({0.0, 2.0}); } -std::string IndirectDataAnalysisFqFitTab::getFitTypeString() const { - if (!m_fittingModel->getFitFunction() || m_fittingModel->getFitFunction()->nFunctions() == 0) { - return "NoCurrentFunction"; - } - - auto fun = m_fittingModel->getFitFunction()->getFunction(0); - if (fun->nFunctions() == 0) { - return fun->name(); - } else { - return "UserDefinedCompositeFunction"; - } -} - EstimationDataSelector IndirectDataAnalysisFqFitTab::getEstimationDataSelector() const { return [](const std::vector &x, const std::vector &y, const std::pair range) -> DataForParameterEstimation { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h index 485168a34ac6..f78d582a38fb 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h @@ -29,7 +29,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisFqFitTab : public IndirectDataA private: EstimationDataSelector getEstimationDataSelector() const override; - std::string getFitTypeString() const override; IDAFunctionParameterEstimation createParameterEstimation() const; void addDataToModel(IAddWorkspaceDialog const *dialog) override; void setActiveWorkspaceIDToCurrentWorkspace(IAddWorkspaceDialog const *dialog); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index 2cb996826838..7677d468ec19 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -35,17 +35,4 @@ EstimationDataSelector IndirectDataAnalysisIqtFitTab::getEstimationDataSelector( }; } -std::string IndirectDataAnalysisIqtFitTab::getFitTypeString() const { - const auto numberOfExponential = getNumberOfCustomFunctions("ExpDecay"); - const auto numberOfStretched = getNumberOfCustomFunctions("StretchExp"); - std::string functionType{""}; - if (numberOfExponential > 0) - functionType += std::to_string(numberOfExponential) + "E"; - - if (numberOfStretched > 0) - functionType += std::to_string(numberOfStretched) + "S"; - - return functionType; -} - } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h index c922cc85ee03..77bdcd2910d1 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h @@ -35,7 +35,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisIqtFitTab : public IndirectData bool hasResolution() const override { return false; } private: - std::string getFitTypeString() const override; EstimationDataSelector getEstimationDataSelector() const override; QString m_tiedParameter; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index 524aa48662a3..def84c26afac 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -69,28 +69,6 @@ EstimationDataSelector IndirectDataAnalysisMSDFitTab::getEstimationDataSelector( }; } -std::string IndirectDataAnalysisMSDFitTab::getFitTypeString() const { - // This function attempts to work out which fit type is being done. It will - // currently only recognise the three default types. - const auto numberOfGauss = getNumberOfCustomFunctions("MsdGauss"); - const auto numberOfPeters = getNumberOfCustomFunctions("MsdPeters"); - const auto numberOfYi = getNumberOfCustomFunctions("MsdYi"); - - if (numberOfGauss + numberOfPeters + numberOfYi != 1) { - return "UserDefined"; - } - - if (numberOfGauss == 1) - return "Gauss"; - - if (numberOfPeters == 1) - return "Peters"; - - if (numberOfYi == 1) - return "Yi"; - - return "UserDefined"; -} // Create parameter estimation functions // These function rely on the data returned from getEstimationDataSelector, // which should be appropriately configured. diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h index cfc7c66755c9..5b4f906f96f5 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h @@ -27,7 +27,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisMSDFitTab : public IndirectData private: EstimationDataSelector getEstimationDataSelector() const override; - std::string getFitTypeString() const override; IDAFunctionParameterEstimation createParameterEstimation() const; }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 8e08f1efbd5f..84b30c875ea0 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -30,6 +30,34 @@ namespace { /// Logger Mantid::Kernel::Logger g_log("IndirectDataAnalysisTab"); +auto FUNCTION_STRINGS = std::unordered_map({{"ExpDecay", "E"}, + {"StretchExp", "S"}, + {"Lorentzian", "L"}, + {"StretchedExpFT", "SFT"}, + {"TeixeiraWater", "TxWater"}, + {"TeixeiraWaterSQE", "TxWater"}, + {"FickDiffusionSQE", "FickDiff"}, + {"ChudleyElliotSQE", "ChudElliot"}, + {"HallRoss", "HallRoss"}, + {"HallRossSQE", "HallRoss"}, + {"DiffRotDiscreteCircle", "DC"}, + {"ElasticDiffRotDiscreteCircle", "EDC"}, + {"InelasticDiffRotDiscreteCircle", "IDC"}, + {"DiffSphere", "DS"}, + {"ElasticDiffSphere", "EDS"}, + {"InelasticDiffSphere", "IDS"}, + {"IsoRotDiff", "IRD"}, + {"ElasticIsoRotDiff", "EIRD"}, + {"InelasticIsoRotDiff", "IIRD"}, + {"MsdGauss", "Gauss"}, + {"MsdPeters", "Peters"}, + {"MsdYi", "Yi"}, + {"FickDiffusion", "FickDiffusion"}, + {"ChudleyElliot", "ChudleyElliot"}, + {"EISFDiffCylinder", "EISFDiffCylinder"}, + {"EISFDiffSphere", "EISFDiffSphere"}, + {"EISFDiffSphereAlkyl", "EISFDiffSphereAlkyl"}}); + bool doesExistInADS(std::string const &workspaceName) { return AnalysisDataService::Instance().doesExist(workspaceName); } @@ -692,6 +720,27 @@ void IndirectDataAnalysisTab::addDataToModel(IAddWorkspaceDialog const *dialog) } } +std::string IndirectDataAnalysisTab::getFitTypeString() const { + auto const multiDomainFunction = m_fittingModel->getFitFunction(); + if (!multiDomainFunction || multiDomainFunction->nFunctions() == 0) { + return "NoCurrentFunction"; + } + + std::string fitType{""}; + for (auto fitFunctionName : FUNCTION_STRINGS) { + auto occurances = getNumberOfCustomFunctions(fitFunctionName.first); + if (occurances > 0) { + fitType += std::to_string(occurances) + fitFunctionName.second; + } + } + + if (getNumberOfCustomFunctions("DeltaFunction") > 0) { + fitType += "Delta"; + } + + return fitType; +} + } // namespace IDA } // namespace CustomInterfaces } // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index 3367ba885fed..f9fa84bd9ae1 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -101,7 +101,7 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { void setPDFWorkspace(std::string const &workspaceName); void updateParameterEstimationData(); virtual void addDataToModel(IAddWorkspaceDialog const *dialog); - virtual std::string getFitTypeString() const = 0; + std::string getFitTypeString() const; std::unique_ptr m_outOptionsPresenter; Mantid::API::IAlgorithm_sptr m_fittingAlgorithm; From 9084357f1449957d545b6ec874c491887160952d Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 10:33:17 +0000 Subject: [PATCH 10/33] Instantiate different fit data presenters depending on tab --- .../Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp | 1 + .../Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp | 1 + .../Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp | 4 +++- .../Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp | 4 +++- .../Inelastic/Analysis/IndirectDataAnalysisTab.cpp | 7 ------- .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 6 +++++- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 37511368908d..5426f5c1b386 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -24,6 +24,7 @@ namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, CONVFIT_HIDDEN_PROPS, parent) { + setupFitDataPresenter(); setConvolveMembers(true); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index c034dd47232d..c526c07958b1 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -92,6 +92,7 @@ IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) new FqFitDataView, FQFIT_HIDDEN_PROPS, parent) { // m_fitPropertyBrowser->updateAvailableFunctions(availableFits.at(DataType::ALL)); + setupFitDataPresenter(); m_plotPresenter->setXBounds({0.0, 2.0}); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index 7677d468ec19..d2a9009e7d98 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -22,7 +22,9 @@ namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) : IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, IQTFIT_HIDDEN_PROPS, - parent) {} + parent) { + setupFitDataPresenter(); +} EstimationDataSelector IndirectDataAnalysisIqtFitTab::getEstimationDataSelector() const { return [](const Mantid::MantidVec &x, const Mantid::MantidVec &y, diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index def84c26afac..8e5e5cff634e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -41,7 +41,9 @@ IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) new MSDFitModel, new SingleFunctionTemplateBrowser( MSD_FUNCTION_STRINGS, std::make_unique(createParameterEstimation())), - new IndirectFitDataView, MSDFIT_HIDDEN_PROPS, parent) {} + new IndirectFitDataView, MSDFIT_HIDDEN_PROPS, parent) { + setupFitDataPresenter(); +} EstimationDataSelector IndirectDataAnalysisMSDFitTab::getEstimationDataSelector() const { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 84b30c875ea0..8a91e22b8a3a 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -108,8 +108,6 @@ IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, Fu fitDataView->setParent(m_uiForm->dockArea); m_uiForm->dockArea->setFitDataView(fitDataView); - setupFitDataPresenter(); - setupPlotView(); m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); } @@ -157,11 +155,6 @@ void IndirectDataAnalysisTab::connectFitPropertyBrowser() { connect(m_fitPropertyBrowser, SIGNAL(functionChanged()), this, SLOT(respondToFunctionChanged())); } -void IndirectDataAnalysisTab::setupFitDataPresenter() { - m_dataPresenter = - std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); -} - void IndirectDataAnalysisTab::setupPlotView() { m_plotPresenter = std::make_unique(m_uiForm->dockArea->m_fitPlotView); m_plotPresenter->setFittingData(m_dataPresenter->getFittingData()); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index f9fa84bd9ae1..b5cd6dad38bf 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -55,6 +55,11 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { void setFileExtensionsByName(bool filter); protected: + template void setupFitDataPresenter() { + m_dataPresenter = + std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); + setupPlotView(); + } IndirectFittingModel *getFittingModel() const; void run() override; void setSampleWSSuffixes(const QStringList &suffices); @@ -84,7 +89,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { private: void setup() override; bool validate() override; - void setupFitDataPresenter(); void setupPlotView(); virtual EstimationDataSelector getEstimationDataSelector() const = 0; void connectPlotPresenter(); From 10f0beb2ab65402347be67efea0402ae6e7e6809 Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 11:29:34 +0000 Subject: [PATCH 11/33] Move addDataToModel to the FitDataPresenter's --- .../Analysis/ConvFitDataPresenter.cpp | 9 +++++ .../Inelastic/Analysis/ConvFitDataPresenter.h | 2 ++ .../Inelastic/Analysis/FqFitDataPresenter.cpp | 20 +++++++++++ .../Inelastic/Analysis/FqFitDataPresenter.h | 1 + .../IndirectDataAnalysisConvFitTab.cpp | 10 ------ .../Analysis/IndirectDataAnalysisConvFitTab.h | 1 - .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 34 ------------------- .../Analysis/IndirectDataAnalysisFqFitTab.h | 3 -- .../IndirectDataAnalysisIqtFitTab.cpp | 2 -- .../IndirectDataAnalysisMSDFitTab.cpp | 1 - .../Analysis/IndirectDataAnalysisTab.cpp | 11 ++---- .../Analysis/IndirectDataAnalysisTab.h | 1 - .../Analysis/IndirectFitDataPresenter.cpp | 8 +++++ .../Analysis/IndirectFitDataPresenter.h | 1 + 14 files changed, 44 insertions(+), 60 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.cpp index f7a93274212e..24c90554d8d2 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.cpp @@ -14,6 +14,15 @@ namespace MantidQt::CustomInterfaces::IDA { ConvFitDataPresenter::ConvFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view) : IndirectFitDataPresenter(model, view) {} +bool ConvFitDataPresenter::addWorkspace(IAddWorkspaceDialog const *dialog) { + if (const auto convDialog = dynamic_cast(dialog)) { + IndirectFitDataPresenter::addWorkspace(convDialog->workspaceName(), convDialog->workspaceIndices()); + setResolution(convDialog->resolutionName()); + return true; + } + return false; +} + std::unique_ptr ConvFitDataPresenter::getAddWorkspaceDialog(QWidget *parent) const { auto dialog = std::make_unique(parent); dialog->setResolutionWSSuffices(getResolutionWSSuffices()); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.h index 5adf4a14e474..8e6c3dc7f13e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.h @@ -20,6 +20,8 @@ class MANTIDQT_INELASTIC_DLL ConvFitDataPresenter : public IndirectFitDataPresen public: ConvFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view); + bool addWorkspace(IAddWorkspaceDialog const *dialog) override; + signals: void modelResolutionAdded(std::string const &name, WorkspaceID const &workspaceID); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp index 148137012425..a13506e0b0cf 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp @@ -203,6 +203,26 @@ FqFitDataPresenter::FqFitDataPresenter(IIndirectFitDataModel *model, IIndirectFi connect(this, SIGNAL(requestedAddWorkspaceDialog()), this, SLOT(updateActiveWorkspaceID())); } +bool FqFitDataPresenter::addWorkspace(IAddWorkspaceDialog const *dialog) { + if (const auto fqFitDialog = dynamic_cast(dialog)) { + addWorkspace(fqFitDialog->workspaceName(), fqFitDialog->parameterType(), fqFitDialog->parameterNameIndex()); + setActiveWorkspaceIDToCurrentWorkspace(fqFitDialog); + + auto const parameterIndex = fqFitDialog->parameterNameIndex(); + if (parameterIndex < 0) { + throw std::runtime_error("No valid parameter was selected."); + } else if (fqFitDialog->parameterType() == "Width") { + setActiveWidth(static_cast(parameterIndex), m_activeWorkspaceID, false); + } else { + setActiveEISF(static_cast(parameterIndex), m_activeWorkspaceID, false); + } + + updateActiveWorkspaceID(getNumberOfWorkspaces()); + return true; + } + return false; +} + void FqFitDataPresenter::addWorkspace(const std::string &workspaceName, const std::string ¶mType, const int &spectrum_index) { auto workspace = Mantid::API::AnalysisDataService::Instance().retrieveWS(workspaceName); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h index 96f631b00eca..e53219b75c58 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h @@ -33,6 +33,7 @@ class MANTIDQT_INELASTIC_DLL FqFitDataPresenter : public IndirectFitDataPresente Q_OBJECT public: FqFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view); + bool addWorkspace(IAddWorkspaceDialog const *dialog) override; void addWorkspace(const std::string &workspaceName, const std::string ¶mType, const int &spectrum_index) override; void setActiveWidth(std::size_t widthIndex, WorkspaceID dataIndex, bool single = true) override; void setActiveEISF(std::size_t eisfIndex, WorkspaceID dataIndex, bool single = true) override; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 5426f5c1b386..b6a81698da3b 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -5,10 +5,8 @@ // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectDataAnalysisConvFitTab.h" -#include "ConvFitAddWorkspaceDialog.h" #include "ConvFitDataPresenter.h" #include "FunctionBrowser/ConvTemplateBrowser.h" -#include "IndirectFitPlotView.h" using namespace Mantid::API; @@ -33,12 +31,4 @@ EstimationDataSelector IndirectDataAnalysisConvFitTab::getEstimationDataSelector const std::pair) -> DataForParameterEstimation { return DataForParameterEstimation{}; }; } -void IndirectDataAnalysisConvFitTab::addDataToModel(IAddWorkspaceDialog const *dialog) { - if (const auto convDialog = dynamic_cast(dialog)) { - m_dataPresenter->addWorkspace(convDialog->workspaceName(), convDialog->workspaceIndices()); - m_dataPresenter->setResolution(convDialog->resolutionName()); - m_fittingModel->addDefaultParameters(); - } -} - } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h index e236e5766a2f..f33193af6534 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h @@ -28,7 +28,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisConvFitTab : public IndirectDat private: EstimationDataSelector getEstimationDataSelector() const override; - void addDataToModel(IAddWorkspaceDialog const *dialog) override; }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index c526c07958b1..b532c45d9d8b 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -123,40 +123,6 @@ EstimationDataSelector IndirectDataAnalysisFqFitTab::getEstimationDataSelector() }; } -void IndirectDataAnalysisFqFitTab::addDataToModel(IAddWorkspaceDialog const *dialog) { - if (const auto fqFitDialog = dynamic_cast(dialog)) { - m_dataPresenter->addWorkspace(fqFitDialog->workspaceName(), fqFitDialog->parameterType(), - fqFitDialog->parameterNameIndex()); - m_fittingModel->addDefaultParameters(); - setActiveWorkspaceIDToCurrentWorkspace(fqFitDialog); - setModelSpectrum(fqFitDialog->parameterNameIndex(), fqFitDialog->parameterType()); - m_activeWorkspaceID = m_dataPresenter->getNumberOfWorkspaces(); - } -} - -void IndirectDataAnalysisFqFitTab::setActiveWorkspaceIDToCurrentWorkspace(IAddWorkspaceDialog const *dialog) { - // update active data index with correct index based on the workspace name - // and the vector in m_fitDataModel which is in the base class - // indirectFittingModel get table workspace index - const auto wsName = dialog->workspaceName().append("_HWHM"); - // This a vector of workspace names currently loaded - auto wsVector = m_fittingModel->getFitDataModel()->getWorkspaceNames(); - // this is an iterator pointing to the current wsName in wsVector - auto wsIt = std::find(wsVector.begin(), wsVector.end(), wsName); - // this is the index of the workspace. - const auto index = WorkspaceID(std::distance(wsVector.begin(), wsIt)); - m_activeWorkspaceID = index; -} - -void IndirectDataAnalysisFqFitTab::setModelSpectrum(int index, const std::string ¶mType) { - if (index < 0) - throw std::runtime_error("No valid parameter was selected."); - else if (paramType == "Width") - m_dataPresenter->setActiveWidth(static_cast(index), m_activeWorkspaceID, false); - else - m_dataPresenter->setActiveEISF(static_cast(index), m_activeWorkspaceID, false); -} - IDAFunctionParameterEstimation IndirectDataAnalysisFqFitTab::createParameterEstimation() const { IDAFunctionParameterEstimation parameterEstimation; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h index f78d582a38fb..9cf5ac9fe4ca 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h @@ -30,9 +30,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisFqFitTab : public IndirectDataA private: EstimationDataSelector getEstimationDataSelector() const override; IDAFunctionParameterEstimation createParameterEstimation() const; - void addDataToModel(IAddWorkspaceDialog const *dialog) override; - void setActiveWorkspaceIDToCurrentWorkspace(IAddWorkspaceDialog const *dialog); - void setModelSpectrum(int index, const std::string ¶mType); }; } // namespace IDA } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index d2a9009e7d98..1ab2005d2077 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -6,8 +6,6 @@ // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectDataAnalysisIqtFitTab.h" #include "FunctionBrowser/IqtTemplateBrowser.h" -#include "IndirectAddWorkspaceDialog.h" -#include "IndirectFitPlotView.h" #include "IqtFitModel.h" using namespace Mantid::API; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index 8e5e5cff634e..00e14f87df42 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -6,7 +6,6 @@ // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectDataAnalysisMSDFitTab.h" #include "IDAFunctionParameterEstimation.h" -#include "IndirectAddWorkspaceDialog.h" #include "MSDFitModel.h" #include "FunctionBrowser/SingleFunctionTemplateBrowser.h" diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 8a91e22b8a3a..136ae71660c7 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -665,7 +665,9 @@ void IndirectDataAnalysisTab::respondToDataChanged() { } void IndirectDataAnalysisTab::respondToDataAdded(IAddWorkspaceDialog const *dialog) { - addDataToModel(dialog); + if (m_dataPresenter->addWorkspace(dialog)) { + m_fittingModel->addDefaultParameters(); + } updateDataReferences(); auto displayNames = m_dataPresenter->createDisplayNames(); m_plotPresenter->appendLastDataToSelection(displayNames); @@ -706,13 +708,6 @@ void IndirectDataAnalysisTab::respondToFunctionChanged() { m_fittingModel->setFitTypeString(getFitTypeString()); } -void IndirectDataAnalysisTab::addDataToModel(IAddWorkspaceDialog const *dialog) { - if (const auto indirectDialog = dynamic_cast(dialog)) { - m_dataPresenter->addWorkspace(indirectDialog->workspaceName(), indirectDialog->workspaceIndices()); - m_fittingModel->addDefaultParameters(); - } -} - std::string IndirectDataAnalysisTab::getFitTypeString() const { auto const multiDomainFunction = m_fittingModel->getFitFunction(); if (!multiDomainFunction || multiDomainFunction->nFunctions() == 0) { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index b5cd6dad38bf..a672b76ee5ce 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -104,7 +104,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { void enableOutputOptions(bool enable); void setPDFWorkspace(std::string const &workspaceName); void updateParameterEstimationData(); - virtual void addDataToModel(IAddWorkspaceDialog const *dialog); std::string getFitTypeString() const; std::unique_ptr m_outOptionsPresenter; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.cpp index 9a60ce8c3cad..247da4699d73 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.cpp @@ -49,6 +49,14 @@ std::vector *IndirectFitDataPresenter::getFittingData() { retur IIndirectFitDataView const *IndirectFitDataPresenter::getView() const { return m_view; } +bool IndirectFitDataPresenter::addWorkspace(IAddWorkspaceDialog const *dialog) { + if (const auto indirectDialog = dynamic_cast(dialog)) { + addWorkspace(indirectDialog->workspaceName(), indirectDialog->workspaceIndices()); + return true; + } + return false; +} + void IndirectFitDataPresenter::addWorkspace(const std::string &workspaceName, const std::string &spectra) { m_model->addWorkspace(workspaceName, spectra); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.h index ec83976a99a6..cc454fea5601 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.h @@ -29,6 +29,7 @@ class MANTIDQT_INELASTIC_DLL IndirectFitDataPresenter : public QObject, public A IndirectFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view); ~IndirectFitDataPresenter(); std::vector *getFittingData(); + virtual bool addWorkspace(IAddWorkspaceDialog const *dialog); void addWorkspace(const std::string &workspaceName, const std::string &spectra); void setResolution(const std::string &name); void setSampleWSSuffices(const QStringList &suffices); From 846be92964b1e797eeb58e1c087f128c86d53ff7 Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 12:05:19 +0000 Subject: [PATCH 12/33] Move default parameter estimation code into FqTemplateBrowser --- .../FunctionBrowser/FqTemplateBrowser.cpp | 93 +++++++++++++++++++ .../FunctionBrowser/FqTemplateBrowser.h | 25 +++++ .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 78 +--------------- .../Analysis/IndirectDataAnalysisFqFitTab.h | 6 -- .../Inelastic/CMakeLists.txt | 2 + 5 files changed, 122 insertions(+), 82 deletions(-) create mode 100644 qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp create mode 100644 qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp new file mode 100644 index 000000000000..9b092d7645f6 --- /dev/null +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp @@ -0,0 +1,93 @@ +// Mantid Repository : https://github.com/mantidproject/mantid +// +// Copyright © 2023 ISIS Rutherford Appleton Laboratory UKRI, +// NScD Oak Ridge National Laboratory, European Spallation Source, +// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS +// SPDX - License - Identifier: GPL - 3.0 + +#include "FqTemplateBrowser.h" + +#include "Analysis/FQFitConstants.h" +#include "Analysis/IDAFunctionParameterEstimation.h" +#include "MantidAPI/IFunction.h" +#include "MantidKernel/PhysicalConstants.h" + +#include + +namespace { +using namespace MantidQt::CustomInterfaces::IDA; + +constexpr double HBAR = Mantid::PhysicalConstants::h / Mantid::PhysicalConstants::meV * 1e12 / (2 * M_PI); + +void estimateChudleyElliot(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + + double L = 1.5; + double tau = (HBAR / y[1]) * (1 - sin(x[1] * L) / (L * x[1])); + + function->setParameter("L", L); + function->setParameter("Tau", tau); +} +void estimateHallRoss(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + + double L = 0.2; + double tau = (HBAR / y[1]) * (1 - exp((-x[1] * x[1] * L * L) / 2)); + + function->setParameter("L", L); + function->setParameter("Tau", tau); +} +void estimateTeixeiraWater(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + + double L = 1.5; + double QL = x[1] * L; + double tau = (HBAR / y[1]) * ((QL * QL) / (6 + QL * QL)); + + function->setParameter("L", L); + function->setParameter("Tau", tau); +} +void estimateFickDiffusion(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + + function->setParameter("D", y[1] / (x[1] * x[1])); +} + +IDAFunctionParameterEstimation createParameterEstimation() { + + IDAFunctionParameterEstimation parameterEstimation; + parameterEstimation.addParameterEstimationFunction("ChudleyElliot", estimateChudleyElliot); + parameterEstimation.addParameterEstimationFunction("HallRoss", estimateHallRoss); + parameterEstimation.addParameterEstimationFunction("TeixeiraWater", estimateTeixeiraWater); + parameterEstimation.addParameterEstimationFunction("FickDiffusion", estimateFickDiffusion); + + return parameterEstimation; +} + +} // namespace + +namespace MantidQt::CustomInterfaces::IDA { + +FqTemplateBrowser::FqTemplateBrowser() + : SingleFunctionTemplateBrowser(widthFits, + std::make_unique(createParameterEstimation())) {} + +} // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h new file mode 100644 index 000000000000..74f9c52894ef --- /dev/null +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h @@ -0,0 +1,25 @@ +// Mantid Repository : https://github.com/mantidproject/mantid +// +// Copyright © 2023 ISIS Rutherford Appleton Laboratory UKRI, +// NScD Oak Ridge National Laboratory, European Spallation Source, +// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS +// SPDX - License - Identifier: GPL - 3.0 + +#pragma once + +#include "Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h" +#include "DllConfig.h" + +namespace MantidQt { +namespace CustomInterfaces { +namespace IDA { + +class MANTIDQT_INELASTIC_DLL FqTemplateBrowser : public SingleFunctionTemplateBrowser { + Q_OBJECT + +public: + FqTemplateBrowser(); +}; + +} // namespace IDA +} // namespace CustomInterfaces +} // namespace MantidQt \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index b532c45d9d8b..e006d9dfde59 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -8,88 +8,25 @@ #include "FQFitConstants.h" #include "FqFitDataPresenter.h" #include "FqFitModel.h" -#include "IDAFunctionParameterEstimation.h" -#include "FunctionBrowser/SingleFunctionTemplateBrowser.h" -#include "MantidAPI/IFunction.h" -#include "MantidAPI/MultiDomainFunction.h" -#include "MantidKernel/PhysicalConstants.h" +#include "FunctionBrowser/FqTemplateBrowser.h" #include using namespace Mantid::API; -using namespace MantidQt::CustomInterfaces::IDA; namespace { -constexpr double HBAR = Mantid::PhysicalConstants::h / Mantid::PhysicalConstants::meV * 1e12 / (2 * M_PI); std::vector FQFIT_HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); -void estimateChudleyElliot(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - double L = 1.5; - double tau = (HBAR / y[1]) * (1 - sin(x[1] * L) / (L * x[1])); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateHallRoss(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - double L = 0.2; - double tau = (HBAR / y[1]) * (1 - exp((-x[1] * x[1] * L * L) / 2)); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateTeixeiraWater(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - double L = 1.5; - double QL = x[1] * L; - double tau = (HBAR / y[1]) * ((QL * QL) / (6 + QL * QL)); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateFickDiffusion(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - function->setParameter("D", y[1] / (x[1] * x[1])); -} - } // namespace namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) - : IndirectDataAnalysisTab( - new FqFitModel, - new SingleFunctionTemplateBrowser( - widthFits, std::make_unique(createParameterEstimation())), - new FqFitDataView, FQFIT_HIDDEN_PROPS, parent) { + : IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, FQFIT_HIDDEN_PROPS, parent) { // m_fitPropertyBrowser->updateAvailableFunctions(availableFits.at(DataType::ALL)); setupFitDataPresenter(); @@ -123,15 +60,4 @@ EstimationDataSelector IndirectDataAnalysisFqFitTab::getEstimationDataSelector() }; } -IDAFunctionParameterEstimation IndirectDataAnalysisFqFitTab::createParameterEstimation() const { - - IDAFunctionParameterEstimation parameterEstimation; - parameterEstimation.addParameterEstimationFunction("ChudleyElliot", estimateChudleyElliot); - parameterEstimation.addParameterEstimationFunction("HallRoss", estimateHallRoss); - parameterEstimation.addParameterEstimationFunction("TeixeiraWater", estimateTeixeiraWater); - parameterEstimation.addParameterEstimationFunction("FickDiffusion", estimateFickDiffusion); - - return parameterEstimation; -} - } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h index 9cf5ac9fe4ca..dc4b6dee75bc 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h @@ -8,14 +8,9 @@ #include "IndirectDataAnalysisTab.h" -#include "IFQFitObserver.h" -#include "MantidAPI/IFunction.h" -#include "MantidAPI/TextAxis.h" - namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class IDAFunctionParameterEstimation; class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisFqFitTab : public IndirectDataAnalysisTab { Q_OBJECT @@ -29,7 +24,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisFqFitTab : public IndirectDataA private: EstimationDataSelector getEstimationDataSelector() const override; - IDAFunctionParameterEstimation createParameterEstimation() const; }; } // namespace IDA } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Inelastic/CMakeLists.txt b/qt/scientific_interfaces/Inelastic/CMakeLists.txt index e1b77abd19c7..7ebc1e8efb1c 100644 --- a/qt/scientific_interfaces/Inelastic/CMakeLists.txt +++ b/qt/scientific_interfaces/Inelastic/CMakeLists.txt @@ -37,6 +37,7 @@ set(SRC_FILES Analysis/FunctionBrowser/ConvFunctionModel.cpp Analysis/FunctionBrowser/ConvTemplateBrowser.cpp Analysis/FunctionBrowser/ConvTemplatePresenter.cpp + Analysis/FunctionBrowser/FqTemplateBrowser.cpp Analysis/FunctionBrowser/IqtFunctionModel.cpp Analysis/FunctionBrowser/IqtTemplateBrowser.cpp Analysis/FunctionBrowser/IqtTemplatePresenter.cpp @@ -91,6 +92,7 @@ set(MOC_FILES Analysis/IndirectFitPropertyBrowser.h Analysis/FunctionBrowser/ConvTemplateBrowser.h Analysis/FunctionBrowser/ConvTemplatePresenter.h + Analysis/FunctionBrowser/FqTemplateBrowser.h Analysis/FunctionBrowser/IqtTemplateBrowser.h Analysis/FunctionBrowser/IqtTemplatePresenter.h Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h From a4316e8fc7e56631274fd23dafda191638b01c5d Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 12:21:29 +0000 Subject: [PATCH 13/33] Move default parameter estimation code into MSDTemplateBrowser --- .../FunctionBrowser/MSDTemplateBrowser.cpp | 55 +++++++++++++++++++ .../FunctionBrowser/MSDTemplateBrowser.h | 25 +++++++++ .../IndirectDataAnalysisMSDFitTab.cpp | 48 +--------------- .../Inelastic/CMakeLists.txt | 2 + 4 files changed, 85 insertions(+), 45 deletions(-) create mode 100644 qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp create mode 100644 qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp new file mode 100644 index 000000000000..87974ebac750 --- /dev/null +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp @@ -0,0 +1,55 @@ +// Mantid Repository : https://github.com/mantidproject/mantid +// +// Copyright © 2023 ISIS Rutherford Appleton Laboratory UKRI, +// NScD Oak Ridge National Laboratory, European Spallation Source, +// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS +// SPDX - License - Identifier: GPL - 3.0 + +#include "MSDTemplateBrowser.h" + +#include "Analysis/IDAFunctionParameterEstimation.h" +#include "MantidAPI/IFunction.h" + +#include + +namespace { +using namespace MantidQt::CustomInterfaces::IDA; + +auto MSD_FUNCTION_STRINGS = + std::map({{"None", ""}, + {"Gauss", "name=MsdGauss,Height=1,Msd=0.05,constraints=(Height>0, Msd>0)"}, + {"Peters", "name=MsdPeters,Height=1,Msd=0.05,Beta=1,constraints=(Height>0, " + "Msd>0, Beta>0)"}, + {"Yi", "name=MsdYi,Height=1,Msd=0.05,Sigma=1,constraints=(Height>0, Msd>0, " + "Sigma>0)"}}); + +IDAFunctionParameterEstimation createParameterEstimation() { + auto estimateMsd = [](::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + auto y = estimationData.y; + auto x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + double Msd = 6 * log(y[0] / y[1]) / (x[1] * x[1]); + // If MSD less than zero, reject the estimate and set to default value of + // 0.05, which leads to a (roughly) flat line + Msd = Msd > 0 ? Msd : 0.05; + function->setParameter("Msd", Msd); + function->setParameter("Height", y[0]); + }; + IDAFunctionParameterEstimation parameterEstimation; + parameterEstimation.addParameterEstimationFunction("MsdGauss", estimateMsd); + parameterEstimation.addParameterEstimationFunction("MsdPeters", estimateMsd); + parameterEstimation.addParameterEstimationFunction("MsdYi", estimateMsd); + + return parameterEstimation; +} + +} // namespace + +namespace MantidQt::CustomInterfaces::IDA { + +MSDTemplateBrowser::MSDTemplateBrowser() + : SingleFunctionTemplateBrowser(MSD_FUNCTION_STRINGS, + std::make_unique(createParameterEstimation())) {} + +} // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h new file mode 100644 index 000000000000..23a10b8fb0b4 --- /dev/null +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h @@ -0,0 +1,25 @@ +// Mantid Repository : https://github.com/mantidproject/mantid +// +// Copyright © 2023 ISIS Rutherford Appleton Laboratory UKRI, +// NScD Oak Ridge National Laboratory, European Spallation Source, +// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS +// SPDX - License - Identifier: GPL - 3.0 + +#pragma once + +#include "Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h" +#include "DllConfig.h" + +namespace MantidQt { +namespace CustomInterfaces { +namespace IDA { + +class MANTIDQT_INELASTIC_DLL MSDTemplateBrowser : public SingleFunctionTemplateBrowser { + Q_OBJECT + +public: + MSDTemplateBrowser(); +}; + +} // namespace IDA +} // namespace CustomInterfaces +} // namespace MantidQt \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index 00e14f87df42..b75d78fe43da 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -5,10 +5,9 @@ // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectDataAnalysisMSDFitTab.h" -#include "IDAFunctionParameterEstimation.h" #include "MSDFitModel.h" -#include "FunctionBrowser/SingleFunctionTemplateBrowser.h" +#include "FunctionBrowser/MSDTemplateBrowser.h" using namespace Mantid::API; @@ -17,18 +16,6 @@ std::vector MSDFIT_HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); -const std::string MSDGAUSSFUNC{"MsdGauss"}; -const std::string MSDPETERSFUNC{"MsdPeters"}; -const std::string MSDYIFUNC{"MsdYi"}; - -auto MSD_FUNCTION_STRINGS = - std::map({{"None", ""}, - {"Gauss", "name=MsdGauss,Height=1,Msd=0.05,constraints=(Height>0, Msd>0)"}, - {"Peters", "name=MsdPeters,Height=1,Msd=0.05,Beta=1,constraints=(Height>0, " - "Msd>0, Beta>0)"}, - {"Yi", "name=MsdYi,Height=1,Msd=0.05,Sigma=1,constraints=(Height>0, Msd>0, " - "Sigma>0)"}}); - } // namespace namespace MantidQt { @@ -36,11 +23,8 @@ namespace CustomInterfaces { namespace IDA { IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) - : IndirectDataAnalysisTab( - new MSDFitModel, - new SingleFunctionTemplateBrowser( - MSD_FUNCTION_STRINGS, std::make_unique(createParameterEstimation())), - new IndirectFitDataView, MSDFIT_HIDDEN_PROPS, parent) { + : IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, MSDFIT_HIDDEN_PROPS, + parent) { setupFitDataPresenter(); } @@ -70,32 +54,6 @@ EstimationDataSelector IndirectDataAnalysisMSDFitTab::getEstimationDataSelector( }; } -// Create parameter estimation functions -// These function rely on the data returned from getEstimationDataSelector, -// which should be appropriately configured. -IDAFunctionParameterEstimation IndirectDataAnalysisMSDFitTab::createParameterEstimation() const { - auto estimateMsd = [](::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - double Msd = 6 * log(y[0] / y[1]) / (x[1] * x[1]); - // If MSD less than zero, reject the estimate and set to default value of - // 0.05, which leads to a (roughly) flat line - Msd = Msd > 0 ? Msd : 0.05; - function->setParameter("Msd", Msd); - function->setParameter("Height", y[0]); - }; - IDAFunctionParameterEstimation parameterEstimation; - - parameterEstimation.addParameterEstimationFunction(MSDGAUSSFUNC, estimateMsd); - parameterEstimation.addParameterEstimationFunction(MSDPETERSFUNC, estimateMsd); - parameterEstimation.addParameterEstimationFunction(MSDYIFUNC, estimateMsd); - - return parameterEstimation; -} - } // namespace IDA } // namespace CustomInterfaces } // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/CMakeLists.txt b/qt/scientific_interfaces/Inelastic/CMakeLists.txt index 7ebc1e8efb1c..68d76c0f0acd 100644 --- a/qt/scientific_interfaces/Inelastic/CMakeLists.txt +++ b/qt/scientific_interfaces/Inelastic/CMakeLists.txt @@ -41,6 +41,7 @@ set(SRC_FILES Analysis/FunctionBrowser/IqtFunctionModel.cpp Analysis/FunctionBrowser/IqtTemplateBrowser.cpp Analysis/FunctionBrowser/IqtTemplatePresenter.cpp + Analysis/FunctionBrowser/MSDTemplateBrowser.cpp Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp @@ -95,6 +96,7 @@ set(MOC_FILES Analysis/FunctionBrowser/FqTemplateBrowser.h Analysis/FunctionBrowser/IqtTemplateBrowser.h Analysis/FunctionBrowser/IqtTemplatePresenter.h + Analysis/FunctionBrowser/MSDTemplateBrowser.h Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h Manipulation/InelasticDataManipulation.h From 0d6caddea8dc677634e7071bfad46eb5f91bc202 Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 12:40:00 +0000 Subject: [PATCH 14/33] Move constant fit tab properties into one file --- .../{FQFitConstants.h => FitTabConstants.h} | 45 ++++++++++++++----- .../FunctionBrowser/FqTemplateBrowser.cpp | 4 +- .../IndirectDataAnalysisConvFitTab.cpp | 12 +---- .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 16 +------ .../IndirectDataAnalysisIqtFitTab.cpp | 11 +---- .../IndirectDataAnalysisMSDFitTab.cpp | 12 +---- .../Inelastic/CMakeLists.txt | 2 +- 7 files changed, 45 insertions(+), 57 deletions(-) rename qt/scientific_interfaces/Inelastic/Analysis/{FQFitConstants.h => FitTabConstants.h} (60%) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FQFitConstants.h b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h similarity index 60% rename from qt/scientific_interfaces/Inelastic/Analysis/FQFitConstants.h rename to qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h index a6b0ef98cf32..976c6b3802bd 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FQFitConstants.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h @@ -1,6 +1,6 @@ // Mantid Repository : https://github.com/mantidproject/mantid // -// Copyright © 2020 ISIS Rutherford Appleton Laboratory UKRI, +// Copyright © 2023 ISIS Rutherford Appleton Laboratory UKRI, // NScD Oak Ridge National Laboratory, European Spallation Source, // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + @@ -10,24 +10,43 @@ #include #include -namespace MantidQt { -namespace CustomInterfaces { -namespace IDA { +namespace MantidQt::CustomInterfaces::IDA { +namespace MSDFit { +static const auto HIDDEN_PROPS = + std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", + "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); + +} + +namespace IqtFit { +static const auto HIDDEN_PROPS = + std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", + "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); + +} + +namespace ConvFit { +static const auto HIDDEN_PROPS = std::vector( + {"CreateOutput", "LogValue", "PassWSIndexToFunction", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); + +} + +namespace FqFit { enum class DataType { WIDTH, EISF, ALL, }; -static const std::map widthFits{ +static const std::map WIDTH_FITS{ {{"None", ""}, {std::string("ChudleyElliot"), std::string("name=ChudleyElliot, Tau=1, L=1.5, constraints=(Tau>0, L>0)")}, {std::string("HallRoss"), std::string("name=Hallross, Tau=1, L=0.2, constraints=(Tau>0, L>0)")}, {std::string("FickDiffusion"), std::string("name=FickDiffusion, D=1, constraints=(D>0)")}, {std::string("TeixeiraWater"), std::string("name=TeixeiraWater, Tau=1, L=1.5, constraints=(Tau>0, L>0)")}}}; -static const std::map EISFFits{ +static const std::map EISF_FITS{ {{"None", ""}, {std::string("EISFDiffCylinder"), std::string("name=EISFDiffCylinder, A=1, R=1, L=2, constraints=(A>0, R>0, L>0)")}, @@ -35,7 +54,7 @@ static const std::map EISFFits{ {std::string("EISFDiffSphereAlkyl"), std::string("name=EISFDiffSphereAlkyl, A=1, Rmin=1, Rmax=2, " "constraints=(A>0, Rmin>0, Rmax>0)")}}}; -static const std::map AllFits{ +static const std::map ALL_FITS{ {{"None", ""}, {std::string("ChudleyElliot"), std::string("name=ChudleyElliot, Tau=1, L=1.5, constraints=(Tau>0, L>0)")}, {std::string("HallRoss"), std::string("name=Hallross, Tau=1, L=0.2, constraints=(Tau>0, L>0)")}, @@ -48,7 +67,11 @@ static const std::map AllFits{ "constraints=(A>0, Rmin>0, Rmax>0)")}}}; static const std::unordered_map> availableFits{ - {{DataType::WIDTH, widthFits}, {DataType::EISF, EISFFits}, {DataType::ALL, AllFits}}}; -} // namespace IDA -} // namespace CustomInterfaces -} // namespace MantidQt + {{DataType::WIDTH, WIDTH_FITS}, {DataType::EISF, EISF_FITS}, {DataType::ALL, ALL_FITS}}}; + +static const auto HIDDEN_PROPS = + std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", + "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); +} // namespace FqFit + +} // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp index 9b092d7645f6..984949a5821c 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp @@ -6,7 +6,7 @@ // SPDX - License - Identifier: GPL - 3.0 + #include "FqTemplateBrowser.h" -#include "Analysis/FQFitConstants.h" +#include "Analysis/FitTabConstants.h" #include "Analysis/IDAFunctionParameterEstimation.h" #include "MantidAPI/IFunction.h" #include "MantidKernel/PhysicalConstants.h" @@ -87,7 +87,7 @@ IDAFunctionParameterEstimation createParameterEstimation() { namespace MantidQt::CustomInterfaces::IDA { FqTemplateBrowser::FqTemplateBrowser() - : SingleFunctionTemplateBrowser(widthFits, + : SingleFunctionTemplateBrowser(FqFit::WIDTH_FITS, std::make_unique(createParameterEstimation())) {} } // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index b6a81698da3b..6d100edbb1d6 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -6,21 +6,13 @@ // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectDataAnalysisConvFitTab.h" #include "ConvFitDataPresenter.h" +#include "FitTabConstants.h" #include "FunctionBrowser/ConvTemplateBrowser.h" -using namespace Mantid::API; - -namespace { - -std::vector CONVFIT_HIDDEN_PROPS = std::vector( - {"CreateOutput", "LogValue", "PassWSIndexToFunction", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); - -} // namespace - namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, CONVFIT_HIDDEN_PROPS, + : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, ConvFit::HIDDEN_PROPS, parent) { setupFitDataPresenter(); setConvolveMembers(true); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index e006d9dfde59..2891153f75c3 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -5,28 +5,16 @@ // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectDataAnalysisFqFitTab.h" -#include "FQFitConstants.h" +#include "FitTabConstants.h" #include "FqFitDataPresenter.h" #include "FqFitModel.h" #include "FunctionBrowser/FqTemplateBrowser.h" -#include - -using namespace Mantid::API; - -namespace { - -std::vector FQFIT_HIDDEN_PROPS = - std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", - "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); - -} // namespace - namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, FQFIT_HIDDEN_PROPS, parent) { + : IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, FqFit::HIDDEN_PROPS, parent) { // m_fitPropertyBrowser->updateAvailableFunctions(availableFits.at(DataType::ALL)); setupFitDataPresenter(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index 1ab2005d2077..ccaf0b191690 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -5,21 +5,14 @@ // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectDataAnalysisIqtFitTab.h" +#include "FitTabConstants.h" #include "FunctionBrowser/IqtTemplateBrowser.h" #include "IqtFitModel.h" -using namespace Mantid::API; - -namespace { -std::vector IQTFIT_HIDDEN_PROPS = - std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", - "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); -} // namespace - namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, IQTFIT_HIDDEN_PROPS, + : IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, IqtFit::HIDDEN_PROPS, parent) { setupFitDataPresenter(); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index b75d78fe43da..b2fff3e07997 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -5,25 +5,17 @@ // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectDataAnalysisMSDFitTab.h" +#include "FitTabConstants.h" #include "MSDFitModel.h" #include "FunctionBrowser/MSDTemplateBrowser.h" -using namespace Mantid::API; - -namespace { -std::vector MSDFIT_HIDDEN_PROPS = - std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", - "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); - -} // namespace - namespace MantidQt { namespace CustomInterfaces { namespace IDA { IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, MSDFIT_HIDDEN_PROPS, + : IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, MSDFit::HIDDEN_PROPS, parent) { setupFitDataPresenter(); } diff --git a/qt/scientific_interfaces/Inelastic/CMakeLists.txt b/qt/scientific_interfaces/Inelastic/CMakeLists.txt index 68d76c0f0acd..e8ca055ba196 100644 --- a/qt/scientific_interfaces/Inelastic/CMakeLists.txt +++ b/qt/scientific_interfaces/Inelastic/CMakeLists.txt @@ -122,7 +122,7 @@ set(INC_FILES Analysis/IqtFitModel.h Analysis/MSDFitModel.h Analysis/ConvFitModel.h - Analysis/FQFitConstants.h + Analysis/FitTabConstants.h Analysis/IIndirectFitDataModel.h Analysis/IndirectFitDataModel.h Analysis/IIndirectFitOutput.h From 245b97326f351a5f1467cb3a3fcc7b6b4c72711d Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 12:48:29 +0000 Subject: [PATCH 15/33] Set available Fq functions to be all when interface first opened --- .../Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp | 2 +- .../Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp index 984949a5821c..28e4308fb1d9 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp @@ -87,7 +87,7 @@ IDAFunctionParameterEstimation createParameterEstimation() { namespace MantidQt::CustomInterfaces::IDA { FqTemplateBrowser::FqTemplateBrowser() - : SingleFunctionTemplateBrowser(FqFit::WIDTH_FITS, + : SingleFunctionTemplateBrowser(FqFit::ALL_FITS, std::make_unique(createParameterEstimation())) {} } // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index 2891153f75c3..c6437dc60ef2 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -15,8 +15,6 @@ namespace MantidQt::CustomInterfaces::IDA { IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) : IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, FqFit::HIDDEN_PROPS, parent) { - // m_fitPropertyBrowser->updateAvailableFunctions(availableFits.at(DataType::ALL)); - setupFitDataPresenter(); m_plotPresenter->setXBounds({0.0, 2.0}); } From 6d168eddc258aa00f932d79e1465e586bbaf2fdb Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 14:10:20 +0000 Subject: [PATCH 16/33] Move data estimation selector to relevant function model files --- .../FunctionBrowser/ConvFunctionModel.cpp | 5 ++++ .../FunctionBrowser/ConvFunctionModel.h | 1 + .../FunctionBrowser/ConvTemplateBrowser.cpp | 4 +++ .../FunctionBrowser/ConvTemplateBrowser.h | 1 + .../FunctionBrowser/ConvTemplatePresenter.cpp | 4 +++ .../FunctionBrowser/ConvTemplatePresenter.h | 1 + .../FunctionBrowser/IqtFunctionModel.cpp | 11 ++++++++ .../FunctionBrowser/IqtFunctionModel.h | 1 + .../FunctionBrowser/IqtTemplateBrowser.cpp | 4 +++ .../FunctionBrowser/IqtTemplateBrowser.h | 1 + .../FunctionBrowser/IqtTemplatePresenter.cpp | 4 +++ .../FunctionBrowser/IqtTemplatePresenter.h | 1 + .../SingleFunctionTemplateBrowser.cpp | 4 +++ .../SingleFunctionTemplateBrowser.h | 1 + .../SingleFunctionTemplateModel.cpp | 25 +++++++++++++++++ .../SingleFunctionTemplateModel.h | 1 + .../SingleFunctionTemplatePresenter.cpp | 4 +++ .../SingleFunctionTemplatePresenter.h | 1 + .../Analysis/FunctionTemplateBrowser.h | 1 + .../IndirectDataAnalysisConvFitTab.cpp | 5 ---- .../Analysis/IndirectDataAnalysisConvFitTab.h | 3 --- .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 27 ------------------- .../Analysis/IndirectDataAnalysisFqFitTab.h | 3 --- .../IndirectDataAnalysisIqtFitTab.cpp | 11 -------- .../Analysis/IndirectDataAnalysisIqtFitTab.h | 2 -- .../IndirectDataAnalysisMSDFitTab.cpp | 26 ------------------ .../Analysis/IndirectDataAnalysisMSDFitTab.h | 4 --- .../Analysis/IndirectDataAnalysisTab.cpp | 2 +- .../Analysis/IndirectDataAnalysisTab.h | 1 - .../Analysis/IndirectFitPropertyBrowser.cpp | 4 +++ .../Analysis/IndirectFitPropertyBrowser.h | 1 + .../test/IndirectFitPropertyBrowserTest.h | 1 + 32 files changed, 82 insertions(+), 83 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvFunctionModel.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvFunctionModel.cpp index 876477c338f9..2e77b8dbb06f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvFunctionModel.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvFunctionModel.cpp @@ -246,6 +246,11 @@ void ConvFunctionModel::removeBackground() { bool ConvFunctionModel::hasBackground() const { return m_backgroundType != BackgroundType::None; } +EstimationDataSelector ConvFunctionModel::getEstimationDataSelector() const { + return [](const Mantid::MantidVec &, const Mantid::MantidVec &, + const std::pair) -> DataForParameterEstimation { return DataForParameterEstimation{}; }; +} + void ConvFunctionModel::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { m_estimationData = std::move(data); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvFunctionModel.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvFunctionModel.h index 0c5c08b96666..db2c5bc74cd7 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvFunctionModel.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvFunctionModel.h @@ -86,6 +86,7 @@ class MANTIDQT_INELASTIC_DLL ConvFunctionModel : public IFunctionModel { void setBackground(BackgroundType bgType); void removeBackground(); bool hasBackground() const; + EstimationDataSelector getEstimationDataSelector() const; void updateParameterEstimationData(DataForParameterEstimationCollection &&data); void setResolution(const std::vector> &fitResolutions); void setQValues(const std::vector &qValues); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.cpp index 14b87ebdc0c2..60c82d714fb3 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.cpp @@ -323,6 +323,10 @@ void ConvTemplateBrowser::setParameterValueQuiet(ParamID id, double value, doubl m_parameterManager->setError(prop, error); } +EstimationDataSelector ConvTemplateBrowser::getEstimationDataSelector() const { + return m_presenter.getEstimationDataSelector(); +} + void ConvTemplateBrowser::updateParameterEstimationData(DataForParameterEstimationCollection &&) {} void ConvTemplateBrowser::estimateFunctionParameters() {} diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.h index f70db9cd3490..692fccdd4848 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.h @@ -47,6 +47,7 @@ class MANTIDQT_INELASTIC_DLL ConvTemplateBrowser : public FunctionTemplateBrowse void updateParameterNames(const QMap ¶meterNames) override; void setErrorsEnabled(bool enabled) override; void clear() override; + EstimationDataSelector getEstimationDataSelector() const override; void updateParameterEstimationData(DataForParameterEstimationCollection &&data) override; void estimateFunctionParameters() override; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.cpp index 0aab103dfa04..f54de9b2e195 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.cpp @@ -288,4 +288,8 @@ void ConvTemplatePresenter::viewChangedParameterValue(const QString &parName, do emit functionStructureChanged(); } +EstimationDataSelector ConvTemplatePresenter::getEstimationDataSelector() const { + return m_model.getEstimationDataSelector(); +} + } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.h index af620f1ee2bb..033f1c0f5365 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.h @@ -54,6 +54,7 @@ class MANTIDQT_INELASTIC_DLL ConvTemplatePresenter : public QObject { void setResolution(const std::vector> &fitResolutions); void setBackgroundA0(double value); void setQValues(const std::vector &qValues); + EstimationDataSelector getEstimationDataSelector() const; signals: void functionStructureChanged(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtFunctionModel.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtFunctionModel.cpp index 918b0cd29199..e9b7ba3fb385 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtFunctionModel.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtFunctionModel.cpp @@ -218,6 +218,17 @@ void IqtFunctionModel::tieIntensities(bool on) { } } +EstimationDataSelector IqtFunctionModel::getEstimationDataSelector() const { + return [](const Mantid::MantidVec &x, const Mantid::MantidVec &y, + const std::pair range) -> DataForParameterEstimation { + (void)range; + size_t const n = 4; + if (y.size() < n + 1) + return DataForParameterEstimation{{}, {}}; + return DataForParameterEstimation{{x[0], x[n]}, {y[0], y[n]}}; + }; +} + void IqtFunctionModel::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { m_estimationData = std::move(data); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtFunctionModel.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtFunctionModel.h index 97617bb58a76..16d1e5417b3d 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtFunctionModel.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtFunctionModel.h @@ -77,6 +77,7 @@ class MANTIDQT_INELASTIC_DLL IqtFunctionModel : public IFunctionModel { void removeBackground(); bool hasBackground() const; void tieIntensities(bool on); + EstimationDataSelector getEstimationDataSelector() const; void updateParameterEstimationData(DataForParameterEstimationCollection &&data); enum class ParamID { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.cpp index 960476329044..5d8e214965d3 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.cpp @@ -294,6 +294,10 @@ void IqtTemplateBrowser::clear() { removeExponentialOne(); } +EstimationDataSelector IqtTemplateBrowser::getEstimationDataSelector() const { + return m_presenter.getEstimationDataSelector(); +} + void IqtTemplateBrowser::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { m_presenter.updateParameterEstimationData(std::move(data)); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.h index f818dbe0078d..5579392397b7 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.h @@ -64,6 +64,7 @@ class MANTIDQT_INELASTIC_DLL IqtTemplateBrowser : public FunctionTemplateBrowser void updateParameterDescriptions(const QMap ¶meterNames); // override; void setErrorsEnabled(bool enabled) override; void clear() override; + EstimationDataSelector getEstimationDataSelector() const override; void updateParameterEstimationData(DataForParameterEstimationCollection &&data) override; void estimateFunctionParameters() override; void setBackgroundA0(double value) override; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.cpp index 98cd85743f24..e85d9ddcc09f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.cpp @@ -180,6 +180,10 @@ bool IqtTemplatePresenter::canTieIntensities() const { return (m_model.hasStretchExponential() || m_model.getNumberOfExponentials() > 0) && m_model.hasBackground(); } +EstimationDataSelector IqtTemplatePresenter::getEstimationDataSelector() const { + return m_model.getEstimationDataSelector(); +} + void IqtTemplatePresenter::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { m_model.updateParameterEstimationData(std::move(data)); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.h index 38ab7e6b2cf9..545c0b4d033c 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.h @@ -54,6 +54,7 @@ class MANTIDQT_INELASTIC_DLL IqtTemplatePresenter : public QObject { void setErrorsEnabled(bool enabled); void tieIntensities(bool on); bool canTieIntensities() const; + EstimationDataSelector getEstimationDataSelector() const; void updateParameterEstimationData(DataForParameterEstimationCollection &&data); void setBackgroundA0(double value); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp index e25bace83e0c..f77b5b2a07db 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp @@ -169,6 +169,10 @@ void SingleFunctionTemplateBrowser::clear() { m_parameterNames.clear(); } +EstimationDataSelector SingleFunctionTemplateBrowser::getEstimationDataSelector() const { + return m_presenter.getEstimationDataSelector(); +} + void SingleFunctionTemplateBrowser::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { m_presenter.updateParameterEstimationData(std::move(data)); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h index 90c526ea2446..024767e3d71e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h @@ -51,6 +51,7 @@ class MANTIDQT_INELASTIC_DLL SingleFunctionTemplateBrowser : public FunctionTemp void updateParameterDescriptions(const QMap ¶meterNames); void setErrorsEnabled(bool enabled) override; void clear() override; + EstimationDataSelector getEstimationDataSelector() const override; void updateParameterEstimationData(DataForParameterEstimationCollection &&data) override; void estimateFunctionParameters() override; void setBackgroundA0(double) override; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp index 4f0b203efb23..936a451b9875 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp @@ -95,6 +95,31 @@ void SingleFunctionTemplateModel::setFitType(const QString &type) { QString SingleFunctionTemplateModel::getFitType() { return m_fitType; } +EstimationDataSelector SingleFunctionTemplateModel::getEstimationDataSelector() const { + return [](const std::vector &x, const std::vector &y, + const std::pair range) -> DataForParameterEstimation { + // Find data thats within range + double xmin = range.first; + double xmax = range.second; + if (fabs(xmin - xmax) < 1e-5) { + return DataForParameterEstimation{}; + } + + const auto startItr = + std::find_if(x.cbegin(), x.cend(), [xmin](const double &val) -> bool { return val >= (xmin - 1e-5); }); + const auto endItr = std::find_if(x.cbegin(), x.cend(), [xmax](const double &val) -> bool { return val > xmax; }); + + if (std::distance(startItr, endItr - 1) < 2) + return DataForParameterEstimation{}; + + size_t first = std::distance(x.cbegin(), startItr); + size_t end = std::distance(x.cbegin(), endItr); + size_t m = first + (end - first) / 2; + + return DataForParameterEstimation{{x[first], x[m]}, {y[first], y[m]}}; + }; +} + void SingleFunctionTemplateModel::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { m_estimationData = std::move(data); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.h index 0ac4291c573d..6d86cc783f4e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.h @@ -41,6 +41,7 @@ class MANTIDQT_INELASTIC_DLL SingleFunctionTemplateModel : public FunctionModel int getEnumIndex(); void setGlobal(const QString &name, bool isGlobal); + EstimationDataSelector getEstimationDataSelector() const; void updateParameterEstimationData(DataForParameterEstimationCollection &&data); void estimateFunctionParameters(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp index 20ba3710b466..c6be8750ae6a 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp @@ -114,6 +114,10 @@ void SingleFunctionTemplatePresenter::setDatasets(const QListsetErrorsEnabled(enabled); } +EstimationDataSelector SingleFunctionTemplatePresenter::getEstimationDataSelector() const { + return m_model.getEstimationDataSelector(); +} + void SingleFunctionTemplatePresenter::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { m_model.updateParameterEstimationData(std::move(data)); updateView(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h index 0702eeab6628..3a1e81aaf774 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h @@ -56,6 +56,7 @@ class MANTIDQT_INELASTIC_DLL SingleFunctionTemplatePresenter : public QObject { void setCurrentDataset(int i); void setDatasets(const QList &datasets); void setErrorsEnabled(bool enabled); + EstimationDataSelector getEstimationDataSelector() const; void updateParameterEstimationData(DataForParameterEstimationCollection &&data); void estimateFunctionParameters(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionTemplateBrowser.h index 8d77b89c677d..bd35e8828970 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionTemplateBrowser.h @@ -64,6 +64,7 @@ class MANTIDQT_INELASTIC_DLL FunctionTemplateBrowser : public QWidget { virtual void updateParameterNames(const QMap ¶meterNames) = 0; virtual void setErrorsEnabled(bool enabled) = 0; virtual void clear() = 0; + virtual EstimationDataSelector getEstimationDataSelector() const = 0; virtual void updateParameterEstimationData(DataForParameterEstimationCollection &&data) = 0; virtual void estimateFunctionParameters() = 0; virtual void setBackgroundA0(double value) = 0; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp index 6d100edbb1d6..ac024b94045f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp @@ -18,9 +18,4 @@ IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) setConvolveMembers(true); } -EstimationDataSelector IndirectDataAnalysisConvFitTab::getEstimationDataSelector() const { - return [](const Mantid::MantidVec &, const Mantid::MantidVec &, - const std::pair) -> DataForParameterEstimation { return DataForParameterEstimation{}; }; -} - } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h index f33193af6534..2d16c31e090f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h @@ -25,9 +25,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisConvFitTab : public IndirectDat std::string getTabName() const override { return "ConvFit"; } bool hasResolution() const override { return true; } - -private: - EstimationDataSelector getEstimationDataSelector() const override; }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp index c6437dc60ef2..e1fc7badb4a8 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp @@ -19,31 +19,4 @@ IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) m_plotPresenter->setXBounds({0.0, 2.0}); } -EstimationDataSelector IndirectDataAnalysisFqFitTab::getEstimationDataSelector() const { - return [](const std::vector &x, const std::vector &y, - const std::pair range) -> DataForParameterEstimation { - // Find data thats within range - double xmin = range.first; - double xmax = range.second; - - // If the two points are equal return empty data - if (fabs(xmin - xmax) < 1e-7) { - return DataForParameterEstimation{}; - } - - const auto startItr = - std::find_if(x.cbegin(), x.cend(), [xmin](const double &val) -> bool { return val >= (xmin - 1e-7); }); - auto endItr = std::find_if(x.cbegin(), x.cend(), [xmax](const double &val) -> bool { return val > xmax; }); - - if (std::distance(startItr, endItr - 1) < 2) - return DataForParameterEstimation{}; - - size_t first = std::distance(x.cbegin(), startItr); - size_t end = std::distance(x.cbegin(), endItr); - size_t m = first + (end - first) / 2; - - return DataForParameterEstimation{{x[first], x[m]}, {y[first], y[m]}}; - }; -} - } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h index dc4b6dee75bc..fde0b1b837a9 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h @@ -21,9 +21,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisFqFitTab : public IndirectDataA std::string getTabName() const override { return "FQFit"; } bool hasResolution() const override { return false; } - -private: - EstimationDataSelector getEstimationDataSelector() const override; }; } // namespace IDA } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp index ccaf0b191690..d3e7e4e498ca 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp @@ -17,15 +17,4 @@ IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) setupFitDataPresenter(); } -EstimationDataSelector IndirectDataAnalysisIqtFitTab::getEstimationDataSelector() const { - return [](const Mantid::MantidVec &x, const Mantid::MantidVec &y, - const std::pair range) -> DataForParameterEstimation { - (void)range; - size_t const n = 4; - if (y.size() < n + 1) - return DataForParameterEstimation{{}, {}}; - return DataForParameterEstimation{{x[0], x[n]}, {y[0], y[n]}}; - }; -} - } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h index 77bdcd2910d1..e00570f9d60d 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h @@ -35,8 +35,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisIqtFitTab : public IndirectData bool hasResolution() const override { return false; } private: - EstimationDataSelector getEstimationDataSelector() const override; - QString m_tiedParameter; }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp index b2fff3e07997..b9644e186ca6 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp @@ -20,32 +20,6 @@ IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) setupFitDataPresenter(); } -EstimationDataSelector IndirectDataAnalysisMSDFitTab::getEstimationDataSelector() const { - - return [](const std::vector &x, const std::vector &y, - const std::pair range) -> DataForParameterEstimation { - // Find data thats within range - double xmin = range.first; - double xmax = range.second; - if (xmin > xmax) { - return DataForParameterEstimation{}; - } - - const auto startItr = - std::find_if(x.cbegin(), x.cend(), [xmin](const double &val) -> bool { return val >= (xmin - 1e-5); }); - auto endItr = std::find_if(x.cbegin(), x.cend(), [xmax](const double &val) -> bool { return val > xmax; }); - - size_t first = std::distance(x.cbegin(), startItr); - size_t end = std::distance(x.cbegin(), endItr); - size_t m = first + (end - first) / 2; - - if (std::distance(startItr, endItr - 1) < 2) - return DataForParameterEstimation{}; - - return DataForParameterEstimation{{x[first], x[m]}, {y[first], y[m]}}; - }; -} - } // namespace IDA } // namespace CustomInterfaces } // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h index 5b4f906f96f5..b3a460456c88 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h @@ -24,10 +24,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisMSDFitTab : public IndirectData std::string getTabName() const override { return "MSDFit"; } bool hasResolution() const override { return false; } - -private: - EstimationDataSelector getEstimationDataSelector() const override; - IDAFunctionParameterEstimation createParameterEstimation() const; }; } // namespace IDA } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 136ae71660c7..6acf955444ba 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -554,7 +554,7 @@ void IndirectDataAnalysisTab::setPDFWorkspace(std::string const &workspaceName) void IndirectDataAnalysisTab::updateParameterEstimationData() { m_fitPropertyBrowser->updateParameterEstimationData( - m_dataPresenter->getDataForParameterEstimation(getEstimationDataSelector())); + m_dataPresenter->getDataForParameterEstimation(m_fitPropertyBrowser->getEstimationDataSelector())); const bool isFit = m_fittingModel->isPreviouslyFit(getSelectedDataIndex(), getSelectedSpectrum()); // If we haven't fit the data yet we may update the guess if (!isFit) { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index a672b76ee5ce..1046df376ee6 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -90,7 +90,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { void setup() override; bool validate() override; void setupPlotView(); - virtual EstimationDataSelector getEstimationDataSelector() const = 0; void connectPlotPresenter(); void connectFitPropertyBrowser(); void connectDataPresenter(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitPropertyBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitPropertyBrowser.cpp index 9c8b44c9407c..79e97a14000c 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitPropertyBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitPropertyBrowser.cpp @@ -328,6 +328,10 @@ void IndirectFitPropertyBrowser::setErrorsEnabled(bool enabled) { m_templateBrowser->setErrorsEnabled(enabled); } +EstimationDataSelector IndirectFitPropertyBrowser::getEstimationDataSelector() const { + return m_templateBrowser->getEstimationDataSelector(); +} + void IndirectFitPropertyBrowser::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { m_templateBrowser->updateParameterEstimationData(std::move(data)); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitPropertyBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitPropertyBrowser.h index 6e5e373d85f9..ad2050ca2991 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitPropertyBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitPropertyBrowser.h @@ -79,6 +79,7 @@ class MANTIDQT_INELASTIC_DLL IndirectFitPropertyBrowser : public QDockWidget { const std::vector> &fitResolutions); void updatePlotGuess(const MatrixWorkspace_const_sptr &sampleWorkspace); void setErrorsEnabled(bool enabled); + EstimationDataSelector getEstimationDataSelector() const; void updateParameterEstimationData(DataForParameterEstimationCollection &&data); void estimateFunctionParameters(); void setBackgroundA0(double value); diff --git a/qt/scientific_interfaces/Inelastic/test/IndirectFitPropertyBrowserTest.h b/qt/scientific_interfaces/Inelastic/test/IndirectFitPropertyBrowserTest.h index e3bde825b34c..c8c0c85cd853 100644 --- a/qt/scientific_interfaces/Inelastic/test/IndirectFitPropertyBrowserTest.h +++ b/qt/scientific_interfaces/Inelastic/test/IndirectFitPropertyBrowserTest.h @@ -60,6 +60,7 @@ class MockFunctionTemplateBrowser : public FunctionTemplateBrowser { MOCK_METHOD1(updateParameterNames, void(const QMap ¶meterNames)); MOCK_METHOD1(setErrorsEnabled, void(bool enabled)); MOCK_METHOD0(clear, void()); + MOCK_CONST_METHOD0(getEstimationDataSelector, EstimationDataSelector()); MOCK_METHOD1(updateParameterEstimationData, void(DataForParameterEstimationCollection &&data)); MOCK_METHOD0(estimateFunctionParameters, void()); MOCK_METHOD1(setBackgroundA0, void(double value)); From 360492f7a68a2a3c35b7c48aa3f02e148973c759 Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 15:52:51 +0000 Subject: [PATCH 17/33] Create TabFactory and remove old tab files --- .../Analysis/DataAnalysisTabFactory.cpp | 55 +++++++++++++++++++ .../Analysis/DataAnalysisTabFactory.h | 27 +++++++++ .../Analysis/IndirectDataAnalysis.cpp | 20 +++---- .../IndirectDataAnalysisConvFitTab.cpp | 21 ------- .../Analysis/IndirectDataAnalysisConvFitTab.h | 32 ----------- .../Analysis/IndirectDataAnalysisFqFitTab.cpp | 22 -------- .../Analysis/IndirectDataAnalysisFqFitTab.h | 27 --------- .../IndirectDataAnalysisIqtFitTab.cpp | 20 ------- .../Analysis/IndirectDataAnalysisIqtFitTab.h | 42 -------------- .../IndirectDataAnalysisMSDFitTab.cpp | 25 --------- .../Analysis/IndirectDataAnalysisMSDFitTab.h | 30 ---------- .../Analysis/IndirectDataAnalysisTab.cpp | 6 +- .../Analysis/IndirectDataAnalysisTab.h | 22 +++++--- .../Inelastic/CMakeLists.txt | 10 +--- 14 files changed, 108 insertions(+), 251 deletions(-) create mode 100644 qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp create mode 100644 qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.h delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h diff --git a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp new file mode 100644 index 000000000000..943e56c0a891 --- /dev/null +++ b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp @@ -0,0 +1,55 @@ +// Mantid Repository : https://github.com/mantidproject/mantid +// +// Copyright © 2023 ISIS Rutherford Appleton Laboratory UKRI, +// NScD Oak Ridge National Laboratory, European Spallation Source, +// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS +// SPDX - License - Identifier: GPL - 3.0 + +#include "DataAnalysisTabFactory.h" + +#include "ConvFitDataPresenter.h" +#include "FitTabConstants.h" +#include "FqFitDataPresenter.h" +#include "FqFitModel.h" +#include "FunctionBrowser/ConvTemplateBrowser.h" +#include "FunctionBrowser/FqTemplateBrowser.h" +#include "FunctionBrowser/IqtTemplateBrowser.h" +#include "FunctionBrowser/MSDTemplateBrowser.h" +#include "IndirectDataAnalysisTab.h" +#include "IndirectFitDataPresenter.h" +#include "IqtFitModel.h" +#include "MSDFitModel.h" + +namespace MantidQt::CustomInterfaces::IDA { + +DataAnalysisTabFactory::DataAnalysisTabFactory(QTabWidget *tabWidget) : m_tabWidget(tabWidget) {} + +IndirectDataAnalysisTab *DataAnalysisTabFactory::makeMSDFitTab(int const index) const { + auto tab = new IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, "MSDFit", + false, MSDFit::HIDDEN_PROPS, m_tabWidget->widget(index)); + tab->setupFitDataPresenter(); + return tab; +} + +IndirectDataAnalysisTab *DataAnalysisTabFactory::makeIqtFitTab(int const index) const { + auto tab = new IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, "IqtFit", + false, IqtFit::HIDDEN_PROPS, m_tabWidget->widget(index)); + tab->setupFitDataPresenter(); + return tab; +} + +IndirectDataAnalysisTab *DataAnalysisTabFactory::makeConvFitTab(int const index) const { + auto tab = new IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, "ConvFit", + true, ConvFit::HIDDEN_PROPS, m_tabWidget->widget(index)); + tab->setupFitDataPresenter(); + return tab; +} + +IndirectDataAnalysisTab *DataAnalysisTabFactory::makeFqFitTab(int const index) const { + auto tab = new IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, "FQFit", false, + FqFit::HIDDEN_PROPS, m_tabWidget->widget(index)); + tab->setupFitDataPresenter(); + // m_plotPresenter->setXBounds({0.0, 2.0}); + return tab; +} + +} // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.h b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.h new file mode 100644 index 000000000000..a74b3894eff3 --- /dev/null +++ b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.h @@ -0,0 +1,27 @@ +// Mantid Repository : https://github.com/mantidproject/mantid +// +// Copyright © 2023 ISIS Rutherford Appleton Laboratory UKRI, +// NScD Oak Ridge National Laboratory, European Spallation Source, +// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS +// SPDX - License - Identifier: GPL - 3.0 + +#pragma once + +#include + +namespace MantidQt::CustomInterfaces::IDA { + +class IndirectDataAnalysisTab; + +class DataAnalysisTabFactory { +public: + explicit DataAnalysisTabFactory(QTabWidget *tabWidget); + IndirectDataAnalysisTab *makeMSDFitTab(int const index) const; + IndirectDataAnalysisTab *makeIqtFitTab(int const index) const; + IndirectDataAnalysisTab *makeConvFitTab(int const index) const; + IndirectDataAnalysisTab *makeFqFitTab(int const index) const; + +private: + QTabWidget *m_tabWidget; +}; + +} // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysis.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysis.cpp index a50a9df0c6b6..773bc6cc6699 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysis.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysis.cpp @@ -7,10 +7,8 @@ #include "IndirectDataAnalysis.h" #include "IndirectSettings.h" -#include "IndirectDataAnalysisConvFitTab.h" -#include "IndirectDataAnalysisFqFitTab.h" -#include "IndirectDataAnalysisIqtFitTab.h" -#include "IndirectDataAnalysisMSDFitTab.h" +#include "DataAnalysisTabFactory.h" +#include "IndirectDataAnalysisTab.h" namespace MantidQt::CustomInterfaces::IDA { DECLARE_SUBWINDOW(IndirectDataAnalysis) @@ -20,15 +18,11 @@ IndirectDataAnalysis::IndirectDataAnalysis(QWidget *parent) m_uiForm.setupUi(this); m_uiForm.pbSettings->setIcon(IndirectSettings::icon()); - // Allows us to get a handle on a tab using an enum, for example - // "m_tabs[ELWIN]". - // All tabs MUST appear here to be shown in interface. - // We make the assumption that each map key corresponds to the order in which - // the tabs appear. - m_tabs.emplace(MSD_FIT, new IndirectDataAnalysisMSDFitTab(m_uiForm.twIDATabs->widget(MSD_FIT))); - m_tabs.emplace(IQT_FIT, new IndirectDataAnalysisIqtFitTab(m_uiForm.twIDATabs->widget(IQT_FIT))); - m_tabs.emplace(CONV_FIT, new IndirectDataAnalysisConvFitTab(m_uiForm.twIDATabs->widget(CONV_FIT))); - m_tabs.emplace(FQ_FIT, new IndirectDataAnalysisFqFitTab(m_uiForm.twIDATabs->widget(FQ_FIT))); + auto const tabFactory = std::make_unique(m_uiForm.twIDATabs); + m_tabs.emplace(MSD_FIT, tabFactory->makeMSDFitTab(MSD_FIT)); + m_tabs.emplace(IQT_FIT, tabFactory->makeIqtFitTab(IQT_FIT)); + m_tabs.emplace(CONV_FIT, tabFactory->makeConvFitTab(CONV_FIT)); + m_tabs.emplace(FQ_FIT, tabFactory->makeFqFitTab(FQ_FIT)); } void IndirectDataAnalysis::applySettings(std::map const &settings) { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp deleted file mode 100644 index ac024b94045f..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#include "IndirectDataAnalysisConvFitTab.h" -#include "ConvFitDataPresenter.h" -#include "FitTabConstants.h" -#include "FunctionBrowser/ConvTemplateBrowser.h" - -namespace MantidQt::CustomInterfaces::IDA { - -IndirectDataAnalysisConvFitTab::IndirectDataAnalysisConvFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, ConvFit::HIDDEN_PROPS, - parent) { - setupFitDataPresenter(); - setConvolveMembers(true); -} - -} // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h deleted file mode 100644 index 2d16c31e090f..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisConvFitTab.h +++ /dev/null @@ -1,32 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#pragma once - -#include "DllConfig.h" -#include "IndirectDataAnalysisTab.h" -#include "ParameterEstimation.h" - -#include "MantidAPI/CompositeFunction.h" -#include "MantidAPI/MatrixWorkspace_fwd.h" - -namespace MantidQt { -namespace CustomInterfaces { -namespace IDA { -class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisConvFitTab : public IndirectDataAnalysisTab { - Q_OBJECT - -public: - IndirectDataAnalysisConvFitTab(QWidget *parent = nullptr); - - std::string getTabName() const override { return "ConvFit"; } - - bool hasResolution() const override { return true; } -}; - -} // namespace IDA -} // namespace CustomInterfaces -} // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp deleted file mode 100644 index e1fc7badb4a8..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#include "IndirectDataAnalysisFqFitTab.h" -#include "FitTabConstants.h" -#include "FqFitDataPresenter.h" -#include "FqFitModel.h" - -#include "FunctionBrowser/FqTemplateBrowser.h" - -namespace MantidQt::CustomInterfaces::IDA { - -IndirectDataAnalysisFqFitTab::IndirectDataAnalysisFqFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, FqFit::HIDDEN_PROPS, parent) { - setupFitDataPresenter(); - m_plotPresenter->setXBounds({0.0, 2.0}); -} - -} // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h deleted file mode 100644 index fde0b1b837a9..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisFqFitTab.h +++ /dev/null @@ -1,27 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#pragma once - -#include "IndirectDataAnalysisTab.h" - -namespace MantidQt { -namespace CustomInterfaces { -namespace IDA { - -class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisFqFitTab : public IndirectDataAnalysisTab { - Q_OBJECT - -public: - IndirectDataAnalysisFqFitTab(QWidget *parent = nullptr); - - std::string getTabName() const override { return "FQFit"; } - - bool hasResolution() const override { return false; } -}; -} // namespace IDA -} // namespace CustomInterfaces -} // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp deleted file mode 100644 index d3e7e4e498ca..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#include "IndirectDataAnalysisIqtFitTab.h" -#include "FitTabConstants.h" -#include "FunctionBrowser/IqtTemplateBrowser.h" -#include "IqtFitModel.h" - -namespace MantidQt::CustomInterfaces::IDA { - -IndirectDataAnalysisIqtFitTab::IndirectDataAnalysisIqtFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, IqtFit::HIDDEN_PROPS, - parent) { - setupFitDataPresenter(); -} - -} // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h deleted file mode 100644 index e00570f9d60d..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisIqtFitTab.h +++ /dev/null @@ -1,42 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#pragma once - -#include "IndirectDataAnalysisTab.h" - -#include "MantidAPI/CompositeFunction.h" -#include "MantidAPI/MatrixWorkspace_fwd.h" - -#include - -namespace Mantid { -namespace API { -class IFunction; -class CompositeFunction; -} // namespace API -} // namespace Mantid - -namespace MantidQt { -namespace CustomInterfaces { -namespace IDA { - -class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisIqtFitTab : public IndirectDataAnalysisTab { - Q_OBJECT - -public: - IndirectDataAnalysisIqtFitTab(QWidget *parent = nullptr); - - std::string getTabName() const override { return "IqtFit"; } - - bool hasResolution() const override { return false; } - -private: - QString m_tiedParameter; -}; -} // namespace IDA -} // namespace CustomInterfaces -} // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp deleted file mode 100644 index b9644e186ca6..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#include "IndirectDataAnalysisMSDFitTab.h" -#include "FitTabConstants.h" -#include "MSDFitModel.h" - -#include "FunctionBrowser/MSDTemplateBrowser.h" - -namespace MantidQt { -namespace CustomInterfaces { -namespace IDA { - -IndirectDataAnalysisMSDFitTab::IndirectDataAnalysisMSDFitTab(QWidget *parent) - : IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, MSDFit::HIDDEN_PROPS, - parent) { - setupFitDataPresenter(); -} - -} // namespace IDA -} // namespace CustomInterfaces -} // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h deleted file mode 100644 index b3a460456c88..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisMSDFitTab.h +++ /dev/null @@ -1,30 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#pragma once - -#include "IndirectDataAnalysisTab.h" - -#include "MantidAPI/IFunction.h" - -namespace MantidQt { -namespace CustomInterfaces { -namespace IDA { -class IDAFunctionParameterEstimation; - -class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisMSDFitTab : public IndirectDataAnalysisTab { - Q_OBJECT - -public: - IndirectDataAnalysisMSDFitTab(QWidget *parent = nullptr); - - std::string getTabName() const override { return "MSDFit"; } - - bool hasResolution() const override { return false; } -}; -} // namespace IDA -} // namespace CustomInterfaces -} // namespace MantidQt diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 6acf955444ba..e436a54c55e7 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -96,9 +96,11 @@ size_t IndirectDataAnalysisTab::getNumberOfSpecificFunctionContained(const std:: } IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, - IndirectFitDataView *fitDataView, + IndirectFitDataView *fitDataView, std::string const &tabName, + bool const hasResolution, std::vector const &hiddenProperties, QWidget *parent) - : IndirectTab(parent), m_fittingModel(model), m_uiForm(new Ui::IndirectFitTab) { + : IndirectTab(parent), m_fittingModel(model), m_uiForm(new Ui::IndirectFitTab), m_tabName(tabName), + m_hasResolution(hasResolution) { m_uiForm->setupUi(parent); m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index 1046df376ee6..9c5e1296b2d6 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -37,10 +37,16 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { public: IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, - IndirectFitDataView *fitDataView, std::vector const &hiddenProperties, - QWidget *parent = nullptr); + IndirectFitDataView *fitDataView, std::string const &tabName, bool const hasResolution, + std::vector const &hiddenProperties, QWidget *parent = nullptr); virtual ~IndirectDataAnalysisTab() override = default; + template void setupFitDataPresenter() { + m_dataPresenter = + std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); + setupPlotView(); + } + WorkspaceID getSelectedDataIndex() const; WorkspaceIndex getSelectedSpectrum() const; bool isRangeCurrentlySelected(WorkspaceID workspaceID, WorkspaceIndex spectrum) const; @@ -50,16 +56,11 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { static size_t getNumberOfSpecificFunctionContained(const std::string &functionName, const IFunction *compositeFunction); - virtual std::string getTabName() const = 0; - virtual bool hasResolution() const = 0; + std::string getTabName() const noexcept { return m_tabName; } + bool hasResolution() const noexcept { return m_hasResolution; } void setFileExtensionsByName(bool filter); protected: - template void setupFitDataPresenter() { - m_dataPresenter = - std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); - setupPlotView(); - } IndirectFittingModel *getFittingModel() const; void run() override; void setSampleWSSuffixes(const QStringList &suffices); @@ -105,6 +106,9 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { void updateParameterEstimationData(); std::string getFitTypeString() const; + std::string m_tabName; + bool m_hasResolution; + std::unique_ptr m_outOptionsPresenter; Mantid::API::IAlgorithm_sptr m_fittingAlgorithm; diff --git a/qt/scientific_interfaces/Inelastic/CMakeLists.txt b/qt/scientific_interfaces/Inelastic/CMakeLists.txt index e8ca055ba196..d3e6a766fc7b 100644 --- a/qt/scientific_interfaces/Inelastic/CMakeLists.txt +++ b/qt/scientific_interfaces/Inelastic/CMakeLists.txt @@ -3,12 +3,9 @@ set(SRC_FILES Analysis/ConvFitModel.cpp Analysis/ConvFitDataView.cpp Analysis/ConvFitDataPresenter.cpp + Analysis/DataAnalysisTabFactory.cpp Analysis/IndirectDataAnalysis.cpp Analysis/IndirectDataAnalysisTab.cpp - Analysis/IndirectDataAnalysisMSDFitTab.cpp - Analysis/IndirectDataAnalysisIqtFitTab.cpp - Analysis/IndirectDataAnalysisConvFitTab.cpp - Analysis/IndirectDataAnalysisFqFitTab.cpp Analysis/FqFitAddWorkspaceDialog.cpp Analysis/FqFitDataPresenter.cpp Analysis/FqFitDataView.cpp @@ -70,10 +67,6 @@ set(MOC_FILES Analysis/ConvFitDataPresenter.h Analysis/IndirectDataAnalysis.h Analysis/IndirectDataAnalysisTab.h - Analysis/IndirectDataAnalysisMSDFitTab.h - Analysis/IndirectDataAnalysisIqtFitTab.h - Analysis/IndirectDataAnalysisConvFitTab.h - Analysis/IndirectDataAnalysisFqFitTab.h Analysis/FqFitAddWorkspaceDialog.h Analysis/FqFitDataPresenter.h Analysis/FqFitDataView.h @@ -116,6 +109,7 @@ set(MOC_FILES set(INC_FILES DllConfig.h PrecompiledHeader.h + Analysis/DataAnalysisTabFactory.h Analysis/IDAFunctionParameterEstimation.h Analysis/FqFitModel.h Analysis/IFQFitObserver.h From d6c2d648e3581029bd9e563f2ead5592bb65292d Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 16:00:07 +0000 Subject: [PATCH 18/33] Clean up analysis tab factory file --- .../Analysis/DataAnalysisTabFactory.cpp | 19 ++++++++++------- .../Inelastic/Analysis/FitTabConstants.h | 21 +++++++++++++------ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp index 943e56c0a891..a11e25bd0932 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp @@ -24,29 +24,32 @@ namespace MantidQt::CustomInterfaces::IDA { DataAnalysisTabFactory::DataAnalysisTabFactory(QTabWidget *tabWidget) : m_tabWidget(tabWidget) {} IndirectDataAnalysisTab *DataAnalysisTabFactory::makeMSDFitTab(int const index) const { - auto tab = new IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, "MSDFit", - false, MSDFit::HIDDEN_PROPS, m_tabWidget->widget(index)); + auto tab = + new IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, MSDFit::TAB_NAME, + MSDFit::HAS_RESOLUTION, MSDFit::HIDDEN_PROPS, m_tabWidget->widget(index)); tab->setupFitDataPresenter(); return tab; } IndirectDataAnalysisTab *DataAnalysisTabFactory::makeIqtFitTab(int const index) const { - auto tab = new IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, "IqtFit", - false, IqtFit::HIDDEN_PROPS, m_tabWidget->widget(index)); + auto tab = + new IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, IqtFit::TAB_NAME, + IqtFit::HAS_RESOLUTION, IqtFit::HIDDEN_PROPS, m_tabWidget->widget(index)); tab->setupFitDataPresenter(); return tab; } IndirectDataAnalysisTab *DataAnalysisTabFactory::makeConvFitTab(int const index) const { - auto tab = new IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, "ConvFit", - true, ConvFit::HIDDEN_PROPS, m_tabWidget->widget(index)); + auto tab = + new IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, ConvFit::TAB_NAME, + ConvFit::HAS_RESOLUTION, ConvFit::HIDDEN_PROPS, m_tabWidget->widget(index)); tab->setupFitDataPresenter(); return tab; } IndirectDataAnalysisTab *DataAnalysisTabFactory::makeFqFitTab(int const index) const { - auto tab = new IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, "FQFit", false, - FqFit::HIDDEN_PROPS, m_tabWidget->widget(index)); + auto tab = new IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, FqFit::TAB_NAME, + FqFit::HAS_RESOLUTION, FqFit::HIDDEN_PROPS, m_tabWidget->widget(index)); tab->setupFitDataPresenter(); // m_plotPresenter->setXBounds({0.0, 2.0}); return tab; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h index 976c6b3802bd..366236e5348a 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h @@ -13,26 +13,38 @@ namespace MantidQt::CustomInterfaces::IDA { namespace MSDFit { +static const auto TAB_NAME = "MSDFit"; +static const auto HAS_RESOLUTION = false; static const auto HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); -} +} // namespace MSDFit namespace IqtFit { +static const auto TAB_NAME = "IqtFit"; +static const auto HAS_RESOLUTION = false; static const auto HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); -} +} // namespace IqtFit namespace ConvFit { +static const auto TAB_NAME = "ConvFit"; +static const auto HAS_RESOLUTION = true; static const auto HIDDEN_PROPS = std::vector( {"CreateOutput", "LogValue", "PassWSIndexToFunction", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); -} +} // namespace ConvFit namespace FqFit { +static const auto TAB_NAME = "FQFit"; +static const auto HAS_RESOLUTION = false; +static const auto HIDDEN_PROPS = + std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", + "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); + enum class DataType { WIDTH, EISF, @@ -69,9 +81,6 @@ static const std::map ALL_FITS{ static const std::unordered_map> availableFits{ {{DataType::WIDTH, WIDTH_FITS}, {DataType::EISF, EISF_FITS}, {DataType::ALL, ALL_FITS}}}; -static const auto HIDDEN_PROPS = - std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", - "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); } // namespace FqFit } // namespace MantidQt::CustomInterfaces::IDA From 23085b62a91c1102461ffd2d55a3a0fc003d2370 Mon Sep 17 00:00:00 2001 From: Applin Date: Thu, 9 Nov 2023 16:42:40 +0000 Subject: [PATCH 19/33] Store X bounds in tab constants file --- .../Inelastic/Analysis/DataAnalysisTabFactory.cpp | 9 ++++----- .../Inelastic/Analysis/FitTabConstants.h | 1 + .../Inelastic/Analysis/IndirectDataAnalysisTab.cpp | 5 ++++- .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 8 +++++--- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp index a11e25bd0932..f69ea1cd888f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp @@ -27,7 +27,7 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeMSDFitTab(int const index) auto tab = new IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, MSDFit::TAB_NAME, MSDFit::HAS_RESOLUTION, MSDFit::HIDDEN_PROPS, m_tabWidget->widget(index)); - tab->setupFitDataPresenter(); + tab->setUpTab(); return tab; } @@ -35,7 +35,7 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeIqtFitTab(int const index) auto tab = new IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, IqtFit::TAB_NAME, IqtFit::HAS_RESOLUTION, IqtFit::HIDDEN_PROPS, m_tabWidget->widget(index)); - tab->setupFitDataPresenter(); + tab->setUpTab(); return tab; } @@ -43,15 +43,14 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeConvFitTab(int const index) auto tab = new IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, ConvFit::TAB_NAME, ConvFit::HAS_RESOLUTION, ConvFit::HIDDEN_PROPS, m_tabWidget->widget(index)); - tab->setupFitDataPresenter(); + tab->setUpTab(); return tab; } IndirectDataAnalysisTab *DataAnalysisTabFactory::makeFqFitTab(int const index) const { auto tab = new IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, FqFit::TAB_NAME, FqFit::HAS_RESOLUTION, FqFit::HIDDEN_PROPS, m_tabWidget->widget(index)); - tab->setupFitDataPresenter(); - // m_plotPresenter->setXBounds({0.0, 2.0}); + tab->setUpTab(FqFit::X_BOUNDS); return tab; } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h index 366236e5348a..59bea9e3b558 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h @@ -44,6 +44,7 @@ static const auto HAS_RESOLUTION = false; static const auto HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); +static const auto X_BOUNDS = std::pair{0.0, 2.0}; enum class DataType { WIDTH, diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index e436a54c55e7..7253a1611db6 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -157,10 +157,13 @@ void IndirectDataAnalysisTab::connectFitPropertyBrowser() { connect(m_fitPropertyBrowser, SIGNAL(functionChanged()), this, SLOT(respondToFunctionChanged())); } -void IndirectDataAnalysisTab::setupPlotView() { +void IndirectDataAnalysisTab::setupPlotView(std::optional> const &xPlotBounds) { m_plotPresenter = std::make_unique(m_uiForm->dockArea->m_fitPlotView); m_plotPresenter->setFittingData(m_dataPresenter->getFittingData()); m_plotPresenter->setFitOutput(m_fittingModel->getFitOutput()); + if (xPlotBounds) { + m_plotPresenter->setXBounds(*xPlotBounds); + } m_plotPresenter->updatePlots(); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index 9c5e1296b2d6..e02126c8079f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -41,10 +42,11 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { std::vector const &hiddenProperties, QWidget *parent = nullptr); virtual ~IndirectDataAnalysisTab() override = default; - template void setupFitDataPresenter() { + template + void setUpTab(std::optional> const &xPlotBounds = std::nullopt) { m_dataPresenter = std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); - setupPlotView(); + setupPlotView(xPlotBounds); } WorkspaceID getSelectedDataIndex() const; @@ -90,7 +92,7 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { private: void setup() override; bool validate() override; - void setupPlotView(); + void setupPlotView(std::optional> const &xPlotBounds); void connectPlotPresenter(); void connectFitPropertyBrowser(); void connectDataPresenter(); From 8e33724613ab017044a2440079d6209aac5791a9 Mon Sep 17 00:00:00 2001 From: Applin Date: Fri, 10 Nov 2023 17:57:13 +0000 Subject: [PATCH 20/33] Set convolve members true for ConvFit --- .../Inelastic/Analysis/DataAnalysisTabFactory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp index f69ea1cd888f..99b44e99d621 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp @@ -44,6 +44,7 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeConvFitTab(int const index) new IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, ConvFit::TAB_NAME, ConvFit::HAS_RESOLUTION, ConvFit::HIDDEN_PROPS, m_tabWidget->widget(index)); tab->setUpTab(); + tab->setConvolveMembers(true); return tab; } From 3f604a016db48aa2575837e169d34afd16e1b577 Mon Sep 17 00:00:00 2001 From: Applin Date: Fri, 10 Nov 2023 18:14:39 +0000 Subject: [PATCH 21/33] Move MSD function strings into constants file --- .../Inelastic/Analysis/FitTabConstants.h | 46 ++++++++++--------- .../FunctionBrowser/MSDTemplateBrowser.cpp | 11 +---- 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h index 59bea9e3b558..771a91dada40 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h @@ -19,6 +19,13 @@ static const auto HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); +static const auto ALL_FITS = + std::map({{"None", ""}, + {"Gauss", "name=MsdGauss,Height=1,Msd=0.05,constraints=(Height>0, Msd>0)"}, + {"Peters", "name=MsdPeters,Height=1,Msd=0.05,Beta=1,constraints=(Height>0, " + "Msd>0, Beta>0)"}, + {"Yi", "name=MsdYi,Height=1,Msd=0.05,Sigma=1,constraints=(Height>0, Msd>0, " + "Sigma>0)"}}); } // namespace MSDFit namespace IqtFit { @@ -27,7 +34,6 @@ static const auto HAS_RESOLUTION = false; static const auto HIDDEN_PROPS = std::vector({"CreateOutput", "LogValue", "PassWSIndexToFunction", "ConvolveMembers", "OutputCompositeMembers", "OutputWorkspace", "Output", "PeakRadius", "PlotParameter"}); - } // namespace IqtFit namespace ConvFit { @@ -52,32 +58,28 @@ enum class DataType { ALL, }; -static const std::map WIDTH_FITS{ +static const auto WIDTH_FITS = std::map( {{"None", ""}, - {std::string("ChudleyElliot"), std::string("name=ChudleyElliot, Tau=1, L=1.5, constraints=(Tau>0, L>0)")}, - {std::string("HallRoss"), std::string("name=Hallross, Tau=1, L=0.2, constraints=(Tau>0, L>0)")}, - {std::string("FickDiffusion"), std::string("name=FickDiffusion, D=1, constraints=(D>0)")}, - {std::string("TeixeiraWater"), std::string("name=TeixeiraWater, Tau=1, L=1.5, constraints=(Tau>0, L>0)")}}}; + {"ChudleyElliot", "name=ChudleyElliot, Tau=1, L=1.5, constraints=(Tau>0, L>0)"}, + {"HallRoss", "name=Hallross, Tau=1, L=0.2, constraints=(Tau>0, L>0)"}, + {"FickDiffusion", "name=FickDiffusion, D=1, constraints=(D>0)"}, + {"TeixeiraWater", "name=TeixeiraWater, Tau=1, L=1.5, constraints=(Tau>0, L>0)"}}); -static const std::map EISF_FITS{ +static const auto EISF_FITS = std::map( {{"None", ""}, - {std::string("EISFDiffCylinder"), - std::string("name=EISFDiffCylinder, A=1, R=1, L=2, constraints=(A>0, R>0, L>0)")}, - {std::string("EISFDiffSphere"), std::string("name=EISFDiffSphere, A=1, R=1, constraints=(A>0, R>0)")}, - {std::string("EISFDiffSphereAlkyl"), std::string("name=EISFDiffSphereAlkyl, A=1, Rmin=1, Rmax=2, " - "constraints=(A>0, Rmin>0, Rmax>0)")}}}; + {"EISFDiffCylinder", "name=EISFDiffCylinder, A=1, R=1, L=2, constraints=(A>0, R>0, L>0)"}, + {"EISFDiffSphere", "name=EISFDiffSphere, A=1, R=1, constraints=(A>0, R>0)"}, + {"EISFDiffSphereAlkyl", "name=EISFDiffSphereAlkyl, A=1, Rmin=1, Rmax=2, constraints=(A>0, Rmin>0, Rmax>0)"}}); -static const std::map ALL_FITS{ +static const auto ALL_FITS = std::map( {{"None", ""}, - {std::string("ChudleyElliot"), std::string("name=ChudleyElliot, Tau=1, L=1.5, constraints=(Tau>0, L>0)")}, - {std::string("HallRoss"), std::string("name=Hallross, Tau=1, L=0.2, constraints=(Tau>0, L>0)")}, - {std::string("FickDiffusion"), std::string("name=FickDiffusion, D=1, constraints=(D>0)")}, - {std::string("TeixeiraWater"), std::string("name=TeixeiraWater, Tau=1, L=1.5, constraints=(Tau>0, L>0)")}, - {std::string("EISFDiffCylinder"), - std::string("name=EISFDiffCylinder, A=1, R=1, L=2, constraints=(A>0, R>0, L>0)")}, - {std::string("EISFDiffSphere"), std::string("name=EISFDiffSphere, A=1, R=1, constraints=(A>0, R>0)")}, - {std::string("EISFDiffSphereAlkyl"), std::string("name=EISFDiffSphereAlkyl, A=1, Rmin=1, Rmax=2, " - "constraints=(A>0, Rmin>0, Rmax>0)")}}}; + {"ChudleyElliot", "name=ChudleyElliot, Tau=1, L=1.5, constraints=(Tau>0, L>0)"}, + {"HallRoss", "name=Hallross, Tau=1, L=0.2, constraints=(Tau>0, L>0)"}, + {"FickDiffusion", "name=FickDiffusion, D=1, constraints=(D>0)"}, + {"TeixeiraWater", "name=TeixeiraWater, Tau=1, L=1.5, constraints=(Tau>0, L>0)"}, + {"EISFDiffCylinder", "name=EISFDiffCylinder, A=1, R=1, L=2, constraints=(A>0, R>0, L>0)"}, + {"EISFDiffSphere", "name=EISFDiffSphere, A=1, R=1, constraints=(A>0, R>0)"}, + {"EISFDiffSphereAlkyl", "name=EISFDiffSphereAlkyl, A=1, Rmin=1, Rmax=2, constraints=(A>0, Rmin>0, Rmax>0)"}}); static const std::unordered_map> availableFits{ {{DataType::WIDTH, WIDTH_FITS}, {DataType::EISF, EISF_FITS}, {DataType::ALL, ALL_FITS}}}; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp index 87974ebac750..f9edac63e356 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp @@ -6,6 +6,7 @@ // SPDX - License - Identifier: GPL - 3.0 + #include "MSDTemplateBrowser.h" +#include "Analysis/FitTabConstants.h" #include "Analysis/IDAFunctionParameterEstimation.h" #include "MantidAPI/IFunction.h" @@ -14,14 +15,6 @@ namespace { using namespace MantidQt::CustomInterfaces::IDA; -auto MSD_FUNCTION_STRINGS = - std::map({{"None", ""}, - {"Gauss", "name=MsdGauss,Height=1,Msd=0.05,constraints=(Height>0, Msd>0)"}, - {"Peters", "name=MsdPeters,Height=1,Msd=0.05,Beta=1,constraints=(Height>0, " - "Msd>0, Beta>0)"}, - {"Yi", "name=MsdYi,Height=1,Msd=0.05,Sigma=1,constraints=(Height>0, Msd>0, " - "Sigma>0)"}}); - IDAFunctionParameterEstimation createParameterEstimation() { auto estimateMsd = [](::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { auto y = estimationData.y; @@ -49,7 +42,7 @@ IDAFunctionParameterEstimation createParameterEstimation() { namespace MantidQt::CustomInterfaces::IDA { MSDTemplateBrowser::MSDTemplateBrowser() - : SingleFunctionTemplateBrowser(MSD_FUNCTION_STRINGS, + : SingleFunctionTemplateBrowser(MSDFit::ALL_FITS, std::make_unique(createParameterEstimation())) {} } // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file From d298dc2bd2efedd628b633e6774e7152eda758c7 Mon Sep 17 00:00:00 2001 From: Applin Date: Fri, 10 Nov 2023 18:18:45 +0000 Subject: [PATCH 22/33] Move function strings to fit tab constants file --- .../Inelastic/Analysis/FitTabConstants.h | 29 ++++++++++++++++++ .../Analysis/IndirectDataAnalysisTab.cpp | 30 +------------------ 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h index 771a91dada40..d7e978fd9b31 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FitTabConstants.h @@ -12,6 +12,35 @@ namespace MantidQt::CustomInterfaces::IDA { +static const auto FUNCTION_STRINGS = + std::unordered_map({{"ExpDecay", "E"}, + {"StretchExp", "S"}, + {"Lorentzian", "L"}, + {"StretchedExpFT", "SFT"}, + {"TeixeiraWater", "TxWater"}, + {"TeixeiraWaterSQE", "TxWater"}, + {"FickDiffusionSQE", "FickDiff"}, + {"ChudleyElliotSQE", "ChudElliot"}, + {"HallRoss", "HallRoss"}, + {"HallRossSQE", "HallRoss"}, + {"DiffRotDiscreteCircle", "DC"}, + {"ElasticDiffRotDiscreteCircle", "EDC"}, + {"InelasticDiffRotDiscreteCircle", "IDC"}, + {"DiffSphere", "DS"}, + {"ElasticDiffSphere", "EDS"}, + {"InelasticDiffSphere", "IDS"}, + {"IsoRotDiff", "IRD"}, + {"ElasticIsoRotDiff", "EIRD"}, + {"InelasticIsoRotDiff", "IIRD"}, + {"MsdGauss", "Gauss"}, + {"MsdPeters", "Peters"}, + {"MsdYi", "Yi"}, + {"FickDiffusion", "FickDiffusion"}, + {"ChudleyElliot", "ChudleyElliot"}, + {"EISFDiffCylinder", "EISFDiffCylinder"}, + {"EISFDiffSphere", "EISFDiffSphere"}, + {"EISFDiffSphereAlkyl", "EISFDiffSphereAlkyl"}}); + namespace MSDFit { static const auto TAB_NAME = "MSDFit"; static const auto HAS_RESOLUTION = false; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 7253a1611db6..e82a9885c113 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -7,7 +7,7 @@ #include "IndirectDataAnalysisTab.h" #include "IndirectSettingsHelper.h" -#include "IndirectAddWorkspaceDialog.h" +#include "FitTabConstants.h" #include "MantidAPI/FunctionFactory.h" #include "MantidAPI/MultiDomainFunction.h" #include "MantidAPI/TextAxis.h" @@ -30,34 +30,6 @@ namespace { /// Logger Mantid::Kernel::Logger g_log("IndirectDataAnalysisTab"); -auto FUNCTION_STRINGS = std::unordered_map({{"ExpDecay", "E"}, - {"StretchExp", "S"}, - {"Lorentzian", "L"}, - {"StretchedExpFT", "SFT"}, - {"TeixeiraWater", "TxWater"}, - {"TeixeiraWaterSQE", "TxWater"}, - {"FickDiffusionSQE", "FickDiff"}, - {"ChudleyElliotSQE", "ChudElliot"}, - {"HallRoss", "HallRoss"}, - {"HallRossSQE", "HallRoss"}, - {"DiffRotDiscreteCircle", "DC"}, - {"ElasticDiffRotDiscreteCircle", "EDC"}, - {"InelasticDiffRotDiscreteCircle", "IDC"}, - {"DiffSphere", "DS"}, - {"ElasticDiffSphere", "EDS"}, - {"InelasticDiffSphere", "IDS"}, - {"IsoRotDiff", "IRD"}, - {"ElasticIsoRotDiff", "EIRD"}, - {"InelasticIsoRotDiff", "IIRD"}, - {"MsdGauss", "Gauss"}, - {"MsdPeters", "Peters"}, - {"MsdYi", "Yi"}, - {"FickDiffusion", "FickDiffusion"}, - {"ChudleyElliot", "ChudleyElliot"}, - {"EISFDiffCylinder", "EISFDiffCylinder"}, - {"EISFDiffSphere", "EISFDiffSphere"}, - {"EISFDiffSphereAlkyl", "EISFDiffSphereAlkyl"}}); - bool doesExistInADS(std::string const &workspaceName) { return AnalysisDataService::Instance().doesExist(workspaceName); } From e6b59555969632a15ddf0235024d603a33d87712 Mon Sep 17 00:00:00 2001 From: Applin Date: Fri, 10 Nov 2023 19:38:12 +0000 Subject: [PATCH 23/33] Refactor parameter estimation code in FqTemplateBrowser --- .../FunctionBrowser/FqTemplateBrowser.cpp | 79 +++++-------------- .../FunctionBrowser/FqTemplateBrowser.h | 3 +- .../FunctionBrowser/MSDTemplateBrowser.cpp | 35 +++----- .../FunctionBrowser/MSDTemplateBrowser.h | 3 +- .../IDAFunctionParameterEstimation.cpp | 31 +++++++- .../Analysis/IDAFunctionParameterEstimation.h | 15 ++-- 6 files changed, 71 insertions(+), 95 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp index 28e4308fb1d9..70fe54b01525 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp @@ -8,7 +8,6 @@ #include "Analysis/FitTabConstants.h" #include "Analysis/IDAFunctionParameterEstimation.h" -#include "MantidAPI/IFunction.h" #include "MantidKernel/PhysicalConstants.h" #include @@ -16,78 +15,40 @@ namespace { using namespace MantidQt::CustomInterfaces::IDA; -constexpr double HBAR = Mantid::PhysicalConstants::h / Mantid::PhysicalConstants::meV * 1e12 / (2 * M_PI); - -void estimateChudleyElliot(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } +constexpr double HBAR = Mantid::PhysicalConstants::h_bar / Mantid::PhysicalConstants::meV * 1e12; +auto const chudleyElliot = [](Mantid::MantidVec const &x, Mantid::MantidVec const &y) { double L = 1.5; - double tau = (HBAR / y[1]) * (1 - sin(x[1] * L) / (L * x[1])); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateHallRoss(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } + return std::unordered_map{{"L", L}, {"Tau", (HBAR / y[1]) * (1 - sin(x[1] * L) / (L * x[1]))}}; +}; +auto const hallRoss = [](Mantid::MantidVec const &x, Mantid::MantidVec const &y) { double L = 0.2; - double tau = (HBAR / y[1]) * (1 - exp((-x[1] * x[1] * L * L) / 2)); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateTeixeiraWater(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } + return std::unordered_map{{"L", L}, + {"Tau", (HBAR / y[1]) * (1 - exp((-x[1] * x[1] * L * L) / 2))}}; +}; +auto const teixeiraWater = [](Mantid::MantidVec const &x, Mantid::MantidVec const &y) { double L = 1.5; double QL = x[1] * L; - double tau = (HBAR / y[1]) * ((QL * QL) / (6 + QL * QL)); - - function->setParameter("L", L); - function->setParameter("Tau", tau); -} -void estimateFickDiffusion(::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - - function->setParameter("D", y[1] / (x[1] * x[1])); -} - -IDAFunctionParameterEstimation createParameterEstimation() { + return std::unordered_map{{"L", L}, {"Tau", (HBAR / y[1]) * ((QL * QL) / (6 + QL * QL))}}; +}; - IDAFunctionParameterEstimation parameterEstimation; - parameterEstimation.addParameterEstimationFunction("ChudleyElliot", estimateChudleyElliot); - parameterEstimation.addParameterEstimationFunction("HallRoss", estimateHallRoss); - parameterEstimation.addParameterEstimationFunction("TeixeiraWater", estimateTeixeiraWater); - parameterEstimation.addParameterEstimationFunction("FickDiffusion", estimateFickDiffusion); +auto const fickDiffusion = [](Mantid::MantidVec const &x, Mantid::MantidVec const &y) { + return std::unordered_map{{"D", y[1] / (x[1] * x[1])}}; +}; - return parameterEstimation; -} +auto const estimators = std::unordered_map{ + {"ChudleyElliot", chudleyElliot}, + {"HallRoss", hallRoss}, + {"TeixeiraWater", teixeiraWater}, + {"FickDiffusion", fickDiffusion}}; } // namespace namespace MantidQt::CustomInterfaces::IDA { FqTemplateBrowser::FqTemplateBrowser() - : SingleFunctionTemplateBrowser(FqFit::ALL_FITS, - std::make_unique(createParameterEstimation())) {} + : SingleFunctionTemplateBrowser(FqFit::ALL_FITS, std::make_unique(estimators)) {} } // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h index 74f9c52894ef..93bbf3550365 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h @@ -7,13 +7,12 @@ #pragma once #include "Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h" -#include "DllConfig.h" namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class MANTIDQT_INELASTIC_DLL FqTemplateBrowser : public SingleFunctionTemplateBrowser { +class FqTemplateBrowser : public SingleFunctionTemplateBrowser { Q_OBJECT public: diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp index f9edac63e356..f5d14fd2b46f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp @@ -8,41 +8,28 @@ #include "Analysis/FitTabConstants.h" #include "Analysis/IDAFunctionParameterEstimation.h" -#include "MantidAPI/IFunction.h" #include namespace { using namespace MantidQt::CustomInterfaces::IDA; -IDAFunctionParameterEstimation createParameterEstimation() { - auto estimateMsd = [](::Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { - auto y = estimationData.y; - auto x = estimationData.x; - if (x.size() != 2 || y.size() != 2) { - return; - } - double Msd = 6 * log(y[0] / y[1]) / (x[1] * x[1]); - // If MSD less than zero, reject the estimate and set to default value of - // 0.05, which leads to a (roughly) flat line - Msd = Msd > 0 ? Msd : 0.05; - function->setParameter("Msd", Msd); - function->setParameter("Height", y[0]); - }; - IDAFunctionParameterEstimation parameterEstimation; - parameterEstimation.addParameterEstimationFunction("MsdGauss", estimateMsd); - parameterEstimation.addParameterEstimationFunction("MsdPeters", estimateMsd); - parameterEstimation.addParameterEstimationFunction("MsdYi", estimateMsd); - - return parameterEstimation; -} +auto const msd = [](Mantid::MantidVec const &x, Mantid::MantidVec const &y) { + double Msd = 6 * log(y[0] / y[1]) / (x[1] * x[1]); + // If MSD less than zero, reject the estimate and set to default value of + // 0.05, which leads to a (roughly) flat line + Msd = Msd > 0 ? Msd : 0.05; + return std::unordered_map{{"Msd", Msd}, {"Height", y[0]}}; +}; + +auto const estimators = std::unordered_map{ + {"MsdGauss", msd}, {"MsdPeters", msd}, {"MsdYi", msd}}; } // namespace namespace MantidQt::CustomInterfaces::IDA { MSDTemplateBrowser::MSDTemplateBrowser() - : SingleFunctionTemplateBrowser(MSDFit::ALL_FITS, - std::make_unique(createParameterEstimation())) {} + : SingleFunctionTemplateBrowser(MSDFit::ALL_FITS, std::make_unique(estimators)) {} } // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h index 23a10b8fb0b4..a2511de7980f 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h @@ -7,13 +7,12 @@ #pragma once #include "Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h" -#include "DllConfig.h" namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class MANTIDQT_INELASTIC_DLL MSDTemplateBrowser : public SingleFunctionTemplateBrowser { +class MSDTemplateBrowser : public SingleFunctionTemplateBrowser { Q_OBJECT public: diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IDAFunctionParameterEstimation.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IDAFunctionParameterEstimation.cpp index 3de24a167d5b..f2eb71b988ee 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IDAFunctionParameterEstimation.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IDAFunctionParameterEstimation.cpp @@ -8,16 +8,41 @@ #include "MantidAPI/IFunction.h" #include + namespace MantidQt::CustomInterfaces::IDA { +IDAFunctionParameterEstimation::ParameterEstimateSetter +parameterEstimateSetter(IDAFunctionParameterEstimation::ParameterEstimator estimator) { + return [estimator](Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { + auto const y = estimationData.y; + auto const x = estimationData.x; + if (x.size() != 2 || y.size() != 2) { + return; + } + auto const parameterValues = estimator(x, y); + + for (auto it = parameterValues.cbegin(); it != parameterValues.cend(); ++it) { + function->setParameter(it->first, it->second); + } + }; +} + +IDAFunctionParameterEstimation::IDAFunctionParameterEstimation( + std::unordered_map estimators) { + for (auto it = estimators.cbegin(); it != estimators.cend(); ++it) { + addParameterEstimationFunction(it->first, parameterEstimateSetter(it->second)); + } +} + // Add function name and estimation function to the stored function map. -void IDAFunctionParameterEstimation::addParameterEstimationFunction(std::string name, EstimationFunction function) { - m_funcMap.insert(std::make_pair(std::move(name), std::move(function))); +void IDAFunctionParameterEstimation::addParameterEstimationFunction(std::string const &functionName, + ParameterEstimateSetter function) { + m_funcMap.insert(std::make_pair(functionName, std::move(function))); } // Estimate the function parameters for the input function // If the input function exists in the stored map it will update the function // parameters in-place. -void IDAFunctionParameterEstimation::estimateFunctionParameters(::Mantid::API::IFunction_sptr &function, +void IDAFunctionParameterEstimation::estimateFunctionParameters(Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData) { if (function) { std::string functionName = function->name(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IDAFunctionParameterEstimation.h b/qt/scientific_interfaces/Inelastic/Analysis/IDAFunctionParameterEstimation.h index 2b25db3f4baa..900caf2cf4e8 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IDAFunctionParameterEstimation.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IDAFunctionParameterEstimation.h @@ -14,17 +14,22 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { class MANTIDQT_INELASTIC_DLL IDAFunctionParameterEstimation { - using EstimationFunction = - std::function; public: - void addParameterEstimationFunction(std::string functionName, EstimationFunction function); - void estimateFunctionParameters(::Mantid::API::IFunction_sptr &function, + using ParameterEstimateSetter = + std::function; + using ParameterEstimator = + std::function(Mantid::MantidVec const &, Mantid::MantidVec const &)>; + + IDAFunctionParameterEstimation(std::unordered_map estimators); + void addParameterEstimationFunction(std::string const &functionName, ParameterEstimateSetter function); + void estimateFunctionParameters(Mantid::API::IFunction_sptr &function, const DataForParameterEstimation &estimationData); private: - std::map m_funcMap; + std::map m_funcMap; }; + } // namespace IDA } // namespace CustomInterfaces } // namespace MantidQt From 2b46c00734d6c4b44f7013c053167016c801cc93 Mon Sep 17 00:00:00 2001 From: Applin Date: Sat, 11 Nov 2023 12:18:36 +0000 Subject: [PATCH 24/33] Separate setup into templated functions for easier customization --- .../Analysis/DataAnalysisTabFactory.cpp | 44 ++++++++++++------- .../Analysis/IndirectDataAnalysisTab.cpp | 16 +------ .../Analysis/IndirectDataAnalysisTab.h | 30 ++++++++++--- 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp index 99b44e99d621..37fc95634d5a 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp @@ -24,34 +24,46 @@ namespace MantidQt::CustomInterfaces::IDA { DataAnalysisTabFactory::DataAnalysisTabFactory(QTabWidget *tabWidget) : m_tabWidget(tabWidget) {} IndirectDataAnalysisTab *DataAnalysisTabFactory::makeMSDFitTab(int const index) const { - auto tab = - new IndirectDataAnalysisTab(new MSDFitModel, new MSDTemplateBrowser, new IndirectFitDataView, MSDFit::TAB_NAME, - MSDFit::HAS_RESOLUTION, MSDFit::HIDDEN_PROPS, m_tabWidget->widget(index)); - tab->setUpTab(); + auto tab = new IndirectDataAnalysisTab(MSDFit::TAB_NAME, MSDFit::HAS_RESOLUTION, m_tabWidget->widget(index)); + tab->setupFittingModel(); + tab->setupFitPropertyBrowser(MSDFit::HIDDEN_PROPS); + tab->setupFitDataView(); + tab->setupOutputOptionsPresenter(); + tab->setUpFitDataPresenter(); + tab->setupPlotView(); return tab; } IndirectDataAnalysisTab *DataAnalysisTabFactory::makeIqtFitTab(int const index) const { - auto tab = - new IndirectDataAnalysisTab(new IqtFitModel, new IqtTemplateBrowser, new IndirectFitDataView, IqtFit::TAB_NAME, - IqtFit::HAS_RESOLUTION, IqtFit::HIDDEN_PROPS, m_tabWidget->widget(index)); - tab->setUpTab(); + auto tab = new IndirectDataAnalysisTab(IqtFit::TAB_NAME, IqtFit::HAS_RESOLUTION, m_tabWidget->widget(index)); + tab->setupFittingModel(); + tab->setupFitPropertyBrowser(IqtFit::HIDDEN_PROPS); + tab->setupFitDataView(); + tab->setupOutputOptionsPresenter(); + tab->setUpFitDataPresenter(); + tab->setupPlotView(); return tab; } IndirectDataAnalysisTab *DataAnalysisTabFactory::makeConvFitTab(int const index) const { - auto tab = - new IndirectDataAnalysisTab(new ConvFitModel, new ConvTemplateBrowser, new ConvFitDataView, ConvFit::TAB_NAME, - ConvFit::HAS_RESOLUTION, ConvFit::HIDDEN_PROPS, m_tabWidget->widget(index)); - tab->setUpTab(); - tab->setConvolveMembers(true); + auto tab = new IndirectDataAnalysisTab(ConvFit::TAB_NAME, ConvFit::HAS_RESOLUTION, m_tabWidget->widget(index)); + tab->setupFittingModel(); + tab->setupFitPropertyBrowser(ConvFit::HIDDEN_PROPS, true); + tab->setupFitDataView(); + tab->setupOutputOptionsPresenter(); + tab->setUpFitDataPresenter(); + tab->setupPlotView(); return tab; } IndirectDataAnalysisTab *DataAnalysisTabFactory::makeFqFitTab(int const index) const { - auto tab = new IndirectDataAnalysisTab(new FqFitModel, new FqTemplateBrowser, new FqFitDataView, FqFit::TAB_NAME, - FqFit::HAS_RESOLUTION, FqFit::HIDDEN_PROPS, m_tabWidget->widget(index)); - tab->setUpTab(FqFit::X_BOUNDS); + auto tab = new IndirectDataAnalysisTab(FqFit::TAB_NAME, FqFit::HAS_RESOLUTION, m_tabWidget->widget(index)); + tab->setupFittingModel(); + tab->setupFitPropertyBrowser(FqFit::HIDDEN_PROPS); + tab->setupFitDataView(); + tab->setupOutputOptionsPresenter(); + tab->setUpFitDataPresenter(); + tab->setupPlotView(FqFit::X_BOUNDS); return tab; } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index e82a9885c113..8ccb26197eb4 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -67,22 +67,10 @@ size_t IndirectDataAnalysisTab::getNumberOfSpecificFunctionContained(const std:: } } -IndirectDataAnalysisTab::IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, - IndirectFitDataView *fitDataView, std::string const &tabName, - bool const hasResolution, - std::vector const &hiddenProperties, QWidget *parent) - : IndirectTab(parent), m_fittingModel(model), m_uiForm(new Ui::IndirectFitTab), m_tabName(tabName), - m_hasResolution(hasResolution) { +IndirectDataAnalysisTab::IndirectDataAnalysisTab(std::string const &tabName, bool const hasResolution, QWidget *parent) + : IndirectTab(parent), m_uiForm(new Ui::IndirectFitTab), m_tabName(tabName), m_hasResolution(hasResolution) { m_uiForm->setupUi(parent); - m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser); - m_uiForm->dockArea->m_fitPropertyBrowser->init(); - m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(hiddenProperties); - m_fitPropertyBrowser = m_uiForm->dockArea->m_fitPropertyBrowser; - - fitDataView->setParent(m_uiForm->dockArea); - m_uiForm->dockArea->setFitDataView(fitDataView); - m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index e02126c8079f..061715212c2a 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -37,18 +37,35 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { Q_OBJECT public: - IndirectDataAnalysisTab(IndirectFittingModel *model, FunctionTemplateBrowser *templateBrowser, - IndirectFitDataView *fitDataView, std::string const &tabName, bool const hasResolution, - std::vector const &hiddenProperties, QWidget *parent = nullptr); + IndirectDataAnalysisTab(std::string const &tabName, bool const hasResolution, QWidget *parent = nullptr); virtual ~IndirectDataAnalysisTab() override = default; - template - void setUpTab(std::optional> const &xPlotBounds = std::nullopt) { + template void setupFittingModel() { m_fittingModel = std::make_unique(); } + + template + void setupFitPropertyBrowser(std::vector const &hiddenProperties, bool const convolveMembers = false) { + m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(new TemplateBrowser()); + m_uiForm->dockArea->m_fitPropertyBrowser->init(); + m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(hiddenProperties); + m_fitPropertyBrowser = m_uiForm->dockArea->m_fitPropertyBrowser; + setConvolveMembers(convolveMembers); + } + + template void setupFitDataView() { + m_uiForm->dockArea->setFitDataView(new FitDataView(m_uiForm->dockArea)); + } + + void setupOutputOptionsPresenter() { + m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); + } + + template void setUpFitDataPresenter() { m_dataPresenter = std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); - setupPlotView(xPlotBounds); } + void setupPlotView(std::optional> const &xPlotBounds = std::nullopt); + WorkspaceID getSelectedDataIndex() const; WorkspaceIndex getSelectedSpectrum() const; bool isRangeCurrentlySelected(WorkspaceID workspaceID, WorkspaceIndex spectrum) const; @@ -92,7 +109,6 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { private: void setup() override; bool validate() override; - void setupPlotView(std::optional> const &xPlotBounds); void connectPlotPresenter(); void connectFitPropertyBrowser(); void connectDataPresenter(); From e82904c5a7d633c3c7ac94af2d8d0624dbb39048 Mon Sep 17 00:00:00 2001 From: Applin Date: Sat, 11 Nov 2023 12:27:26 +0000 Subject: [PATCH 25/33] Remove unused IFQFitObserver --- .../Inelastic/Analysis/FqFitDataPresenter.h | 1 - .../SingleFunctionTemplateBrowser.cpp | 5 ----- .../SingleFunctionTemplateBrowser.h | 4 +--- .../SingleFunctionTemplateModel.h | 1 - .../SingleFunctionTemplatePresenter.h | 1 - .../Inelastic/Analysis/IFQFitObserver.h | 16 ---------------- .../Inelastic/CMakeLists.txt | 1 - .../Inelastic/test/FqFitDataPresenterTest.h | 4 ---- 8 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 qt/scientific_interfaces/Inelastic/Analysis/IFQFitObserver.h diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h index e53219b75c58..b8715302df5c 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h @@ -9,7 +9,6 @@ #include "FqFitAddWorkspaceDialog.h" #include "FqFitDataView.h" #include "FunctionBrowser/SingleFunctionTemplateBrowser.h" -#include "IFQFitObserver.h" #include "IndirectFitDataPresenter.h" #include "Notifier.h" diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp index f77b5b2a07db..81904582627b 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp @@ -43,11 +43,6 @@ SingleFunctionTemplateBrowser::SingleFunctionTemplateBrowser( connect(&m_presenter, SIGNAL(functionStructureChanged()), this, SIGNAL(functionStructureChanged())); } -void SingleFunctionTemplateBrowser::updateAvailableFunctions( - const std::map &functionInitialisationStrings) { - m_presenter.updateAvailableFunctions(functionInitialisationStrings); -} - void SingleFunctionTemplateBrowser::createProperties() { m_parameterManager->blockSignals(true); m_boolManager->blockSignals(true); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h index 024767e3d71e..00ea818ae057 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h @@ -7,7 +7,6 @@ #pragma once #include "Analysis/FunctionTemplateBrowser.h" -#include "Analysis/IFQFitObserver.h" #include "DllConfig.h" #include "SingleFunctionTemplatePresenter.h" @@ -26,14 +25,13 @@ class IDAFunctionParameterEstimation; * and set properties that can be used to generate a fit function. * */ -class MANTIDQT_INELASTIC_DLL SingleFunctionTemplateBrowser : public FunctionTemplateBrowser, public IFQFitObserver { +class MANTIDQT_INELASTIC_DLL SingleFunctionTemplateBrowser : public FunctionTemplateBrowser { Q_OBJECT public: explicit SingleFunctionTemplateBrowser(const std::map &functionInitialisationStrings, std::unique_ptr parameterEstimation, QWidget *parent = nullptr); virtual ~SingleFunctionTemplateBrowser() = default; - void updateAvailableFunctions(const std::map &functionInitialisationStrings) override; void setFunction(const QString &funStr) override; IFunction_sptr getGlobalFunction() const override; IFunction_sptr getFunction() const override; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.h index 6d86cc783f4e..85da1ca4b276 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.h @@ -6,7 +6,6 @@ // SPDX - License - Identifier: GPL - 3.0 + #pragma once -#include "Analysis/IFQFitObserver.h" #include "Analysis/ParameterEstimation.h" #include "DllConfig.h" #include "MantidAPI/IFunction_fwd.h" diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h index 3a1e81aaf774..c016a3221447 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h @@ -7,7 +7,6 @@ #pragma once #include "Analysis/IDAFunctionParameterEstimation.h" -#include "Analysis/IFQFitObserver.h" #include "Analysis/ParameterEstimation.h" #include "DllConfig.h" #include "SingleFunctionTemplateModel.h" diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IFQFitObserver.h b/qt/scientific_interfaces/Inelastic/Analysis/IFQFitObserver.h deleted file mode 100644 index 93b9c5ac4bba..000000000000 --- a/qt/scientific_interfaces/Inelastic/Analysis/IFQFitObserver.h +++ /dev/null @@ -1,16 +0,0 @@ -// Mantid Repository : https://github.com/mantidproject/mantid -// -// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, -// NScD Oak Ridge National Laboratory, European Spallation Source, -// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS -// SPDX - License - Identifier: GPL - 3.0 + -#pragma once - -#include -#include - -class IFQFitObserver { -public: - virtual ~IFQFitObserver() = default; - virtual void updateAvailableFunctions(const std::map &functionInitialisationStrings) = 0; -}; diff --git a/qt/scientific_interfaces/Inelastic/CMakeLists.txt b/qt/scientific_interfaces/Inelastic/CMakeLists.txt index d3e6a766fc7b..a84611084e88 100644 --- a/qt/scientific_interfaces/Inelastic/CMakeLists.txt +++ b/qt/scientific_interfaces/Inelastic/CMakeLists.txt @@ -112,7 +112,6 @@ set(INC_FILES Analysis/DataAnalysisTabFactory.h Analysis/IDAFunctionParameterEstimation.h Analysis/FqFitModel.h - Analysis/IFQFitObserver.h Analysis/IqtFitModel.h Analysis/MSDFitModel.h Analysis/ConvFitModel.h diff --git a/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h b/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h index 808f3fa390f5..e4600578d54e 100644 --- a/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h +++ b/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h @@ -116,10 +116,6 @@ class MockIndirectFitDataModel : public IIndirectFitDataModel { MOCK_CONST_METHOD1(getExcludeRegionVector, std::vector(FitDomainIndex index)); }; -class SingleFunctionTemplateBrowserMock : public IFQFitObserver { - MOCK_METHOD1(updateAvailableFunctions, void(const std::map &functionInitialisationStrings)); -}; - /// Mock object to mock the model class MockFqFitModel : public FqFitModel {}; From 98b8f1c41d6f06a68a8065cdb19976e8e9d05137 Mon Sep 17 00:00:00 2001 From: Applin Date: Sat, 11 Nov 2023 12:46:12 +0000 Subject: [PATCH 26/33] Update IDAFunctionParameterEstimation test --- .../test/IDAFunctionParameterEstimationTest.h | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/test/IDAFunctionParameterEstimationTest.h b/qt/scientific_interfaces/Inelastic/test/IDAFunctionParameterEstimationTest.h index 38f75e5d19fd..932cbcf44f52 100644 --- a/qt/scientific_interfaces/Inelastic/test/IDAFunctionParameterEstimationTest.h +++ b/qt/scientific_interfaces/Inelastic/test/IDAFunctionParameterEstimationTest.h @@ -16,46 +16,45 @@ using namespace Mantid::API; using namespace MantidQt::CustomInterfaces::IDA; namespace { -DataForParameterEstimation createEstimationData() { - std::vector x(10, 1); - std::vector y(10, 0.981); +DataForParameterEstimation createEstimationData(int const size) { + std::vector x(size, 1); + std::vector y(size, 0.981); return DataForParameterEstimation{x, y}; } -void estimationFunctionForLinearBackground(IFunction_sptr &function, const DataForParameterEstimation &) { - - function->setParameter("A0", 2.00); - function->setParameter("A1", 3.00); -} } // namespace class IDAFunctionParameterEstimationTest : public CxxTest::TestSuite { public: - IDAFunctionParameterEstimationTest() { m_estimationData = createEstimationData(); } + IDAFunctionParameterEstimationTest() { + m_fitFunction = [](Mantid::MantidVec const &x, Mantid::MantidVec const &y) { + (void)x; + return std::unordered_map{{"A0", 2.0}, {"A1", 3.0}}; + }; + } - void test_estimateFunctionParameters_does_nothing_if_fit_esimate_does_not_exist() { - IDAFunctionParameterEstimation parameterEstimation; + void test_estimateFunctionParameters_does_nothing_if_estimate_data_is_too_small() { + IDAFunctionParameterEstimation parameterEstimation({{"LinearBackground", m_fitFunction}}); auto fun = FunctionFactory::Instance().createInitialized("name=LinearBackground,A0=0,A1=0"); auto funCopy = fun->clone(); - parameterEstimation.estimateFunctionParameters(fun, m_estimationData); + parameterEstimation.estimateFunctionParameters(fun, createEstimationData(1)); TS_ASSERT_EQUALS(fun->getParameter("A0"), funCopy->getParameter("A0")) TS_ASSERT_EQUALS(fun->getParameter("A1"), funCopy->getParameter("A1")) } void test_estimateFunctionParameters_correctly_updates_function() { - IDAFunctionParameterEstimation parameterEstimation; + IDAFunctionParameterEstimation parameterEstimation({{"LinearBackground", m_fitFunction}}); auto fun = FunctionFactory::Instance().createInitialized("name=LinearBackground,A0=0,A1=0"); - parameterEstimation.addParameterEstimationFunction("LinearBackground", estimationFunctionForLinearBackground); - parameterEstimation.estimateFunctionParameters(fun, m_estimationData); + parameterEstimation.estimateFunctionParameters(fun, createEstimationData(2)); TS_ASSERT_EQUALS(fun->getParameter("A0"), 2.00) TS_ASSERT_EQUALS(fun->getParameter("A1"), 3.00) } private: - DataForParameterEstimation m_estimationData; + IDAFunctionParameterEstimation::ParameterEstimator m_fitFunction; }; From 46fc5e25f8c54541fdc1d5b9dca6a7387193b16e Mon Sep 17 00:00:00 2001 From: Applin Date: Sat, 11 Nov 2023 13:40:42 +0000 Subject: [PATCH 27/33] Switch Fq and MSD Template Browsers for Function Models --- .../Analysis/DataAnalysisTabFactory.cpp | 14 ++- .../FunctionBrowser/ConvTemplateBrowser.cpp | 3 +- .../FunctionBrowser/ConvTemplateBrowser.h | 2 +- .../FunctionBrowser/ConvTemplatePresenter.cpp | 104 +++++++++--------- .../FunctionBrowser/ConvTemplatePresenter.h | 4 +- ...emplateBrowser.cpp => FqFunctionModel.cpp} | 8 +- ...{FqTemplateBrowser.h => FqFunctionModel.h} | 7 +- .../FunctionBrowser/IqtTemplateBrowser.cpp | 3 +- .../FunctionBrowser/IqtTemplateBrowser.h | 2 +- .../FunctionBrowser/IqtTemplatePresenter.cpp | 95 ++++++++-------- .../FunctionBrowser/IqtTemplatePresenter.h | 4 +- ...mplateBrowser.cpp => MSDFunctionModel.cpp} | 8 +- ...SDTemplateBrowser.h => MSDFunctionModel.h} | 7 +- .../SingleFunctionTemplateBrowser.cpp | 8 +- .../SingleFunctionTemplateBrowser.h | 3 +- .../SingleFunctionTemplatePresenter.cpp | 99 ++++++++--------- .../SingleFunctionTemplatePresenter.h | 5 +- .../Analysis/IndirectDataAnalysisTab.h | 5 +- .../Inelastic/CMakeLists.txt | 8 +- 19 files changed, 196 insertions(+), 193 deletions(-) rename qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/{FqTemplateBrowser.cpp => FqFunctionModel.cpp} (90%) rename qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/{FqTemplateBrowser.h => FqFunctionModel.h} (74%) rename qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/{MSDTemplateBrowser.cpp => MSDFunctionModel.cpp} (84%) rename qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/{MSDTemplateBrowser.h => MSDFunctionModel.h} (74%) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp index 37fc95634d5a..938f2f8080f8 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp @@ -10,10 +10,12 @@ #include "FitTabConstants.h" #include "FqFitDataPresenter.h" #include "FqFitModel.h" +#include "FunctionBrowser/ConvFunctionModel.h" #include "FunctionBrowser/ConvTemplateBrowser.h" -#include "FunctionBrowser/FqTemplateBrowser.h" +#include "FunctionBrowser/FqFunctionModel.h" +#include "FunctionBrowser/IqtFunctionModel.h" #include "FunctionBrowser/IqtTemplateBrowser.h" -#include "FunctionBrowser/MSDTemplateBrowser.h" +#include "FunctionBrowser/MSDFunctionModel.h" #include "IndirectDataAnalysisTab.h" #include "IndirectFitDataPresenter.h" #include "IqtFitModel.h" @@ -26,7 +28,7 @@ DataAnalysisTabFactory::DataAnalysisTabFactory(QTabWidget *tabWidget) : m_tabWid IndirectDataAnalysisTab *DataAnalysisTabFactory::makeMSDFitTab(int const index) const { auto tab = new IndirectDataAnalysisTab(MSDFit::TAB_NAME, MSDFit::HAS_RESOLUTION, m_tabWidget->widget(index)); tab->setupFittingModel(); - tab->setupFitPropertyBrowser(MSDFit::HIDDEN_PROPS); + tab->setupFitPropertyBrowser(MSDFit::HIDDEN_PROPS); tab->setupFitDataView(); tab->setupOutputOptionsPresenter(); tab->setUpFitDataPresenter(); @@ -37,7 +39,7 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeMSDFitTab(int const index) IndirectDataAnalysisTab *DataAnalysisTabFactory::makeIqtFitTab(int const index) const { auto tab = new IndirectDataAnalysisTab(IqtFit::TAB_NAME, IqtFit::HAS_RESOLUTION, m_tabWidget->widget(index)); tab->setupFittingModel(); - tab->setupFitPropertyBrowser(IqtFit::HIDDEN_PROPS); + tab->setupFitPropertyBrowser(IqtFit::HIDDEN_PROPS); tab->setupFitDataView(); tab->setupOutputOptionsPresenter(); tab->setUpFitDataPresenter(); @@ -48,7 +50,7 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeIqtFitTab(int const index) IndirectDataAnalysisTab *DataAnalysisTabFactory::makeConvFitTab(int const index) const { auto tab = new IndirectDataAnalysisTab(ConvFit::TAB_NAME, ConvFit::HAS_RESOLUTION, m_tabWidget->widget(index)); tab->setupFittingModel(); - tab->setupFitPropertyBrowser(ConvFit::HIDDEN_PROPS, true); + tab->setupFitPropertyBrowser(ConvFit::HIDDEN_PROPS, true); tab->setupFitDataView(); tab->setupOutputOptionsPresenter(); tab->setUpFitDataPresenter(); @@ -59,7 +61,7 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeConvFitTab(int const index) IndirectDataAnalysisTab *DataAnalysisTabFactory::makeFqFitTab(int const index) const { auto tab = new IndirectDataAnalysisTab(FqFit::TAB_NAME, FqFit::HAS_RESOLUTION, m_tabWidget->widget(index)); tab->setupFittingModel(); - tab->setupFitPropertyBrowser(FqFit::HIDDEN_PROPS); + tab->setupFitPropertyBrowser(FqFit::HIDDEN_PROPS); tab->setupFitDataView(); tab->setupOutputOptionsPresenter(); tab->setUpFitDataPresenter(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.cpp index 60c82d714fb3..4bdcbb0f4c40 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.cpp @@ -39,7 +39,8 @@ class ScopedFalse { } // namespace -ConvTemplateBrowser::ConvTemplateBrowser(QWidget *parent) : FunctionTemplateBrowser(parent), m_presenter(this) { +ConvTemplateBrowser::ConvTemplateBrowser(std::unique_ptr functionModel, QWidget *parent) + : FunctionTemplateBrowser(parent), m_presenter(this, std::move(functionModel)) { m_templateSubTypes.emplace_back(std::make_unique()); m_templateSubTypes.emplace_back(std::make_unique()); m_templateSubTypes.emplace_back(std::make_unique()); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.h index 692fccdd4848..4f6684d72f5e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplateBrowser.h @@ -29,7 +29,7 @@ using namespace ConvTypes; class MANTIDQT_INELASTIC_DLL ConvTemplateBrowser : public FunctionTemplateBrowser { Q_OBJECT public: - explicit ConvTemplateBrowser(QWidget *parent = nullptr); + explicit ConvTemplateBrowser(std::unique_ptr functionModel, QWidget *parent = nullptr); void setFunction(const QString &funStr) override; IFunction_sptr getGlobalFunction() const override; IFunction_sptr getFunction() const override; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.cpp index f54de9b2e195..7cede1c0bdd9 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.cpp @@ -31,7 +31,9 @@ using namespace MantidWidgets; * Constructor * @param parent :: The parent widget. */ -ConvTemplatePresenter::ConvTemplatePresenter(ConvTemplateBrowser *view) : QObject(view), m_view(view) { +ConvTemplatePresenter::ConvTemplatePresenter(ConvTemplateBrowser *view, + std::unique_ptr functionModel) + : QObject(view), m_view(view), m_model(std::move(functionModel)) { connect(m_view, SIGNAL(localParameterButtonClicked(const QString &)), this, SLOT(editLocalParameter(const QString &))); connect(m_view, SIGNAL(parameterValueChanged(const QString &, double)), this, @@ -44,11 +46,11 @@ ConvTemplatePresenter::ConvTemplatePresenter(ConvTemplateBrowser *view) : QObjec // itself due to an internal timer occurring within the class void ConvTemplatePresenter::setSubType(size_t subTypeIndex, int typeIndex) { if (subTypeIndex == SubTypeIndex::Fit) { - m_model.setFitType(static_cast(typeIndex)); + m_model->setFitType(static_cast(typeIndex)); } else if (subTypeIndex == SubTypeIndex::Lorentzian) { - m_model.setLorentzianType(static_cast(typeIndex)); + m_model->setLorentzianType(static_cast(typeIndex)); } else { - m_model.setBackground(static_cast(typeIndex)); + m_model->setBackground(static_cast(typeIndex)); } m_view->setSubType(subTypeIndex, typeIndex); setErrorsEnabled(false); @@ -58,9 +60,9 @@ void ConvTemplatePresenter::setSubType(size_t subTypeIndex, int typeIndex) { } void ConvTemplatePresenter::setDeltaFunction(bool on) { - if (on == m_model.hasDeltaFunction()) + if (on == m_model->hasDeltaFunction()) return; - m_model.setDeltaFunction(on); + m_model->setDeltaFunction(on); if (on) m_view->addDeltaFunction(); else @@ -73,9 +75,9 @@ void ConvTemplatePresenter::setDeltaFunction(bool on) { } void ConvTemplatePresenter::setTempCorrection(bool on) { - if (on == m_model.hasTempCorrection()) + if (on == m_model->hasTempCorrection()) return; - double temp = m_model.getTempValue(); + double temp = m_model->getTempValue(); if (on) { bool ok; temp = QInputDialog::getDouble(m_view, "Temperature", "Set Temperature", temp, 0.0, @@ -83,7 +85,7 @@ void ConvTemplatePresenter::setTempCorrection(bool on) { if (!ok) return; } - m_model.setTempCorrection(on, temp); + m_model->setTempCorrection(on, temp); if (on) m_view->addTempCorrection(temp); else @@ -95,22 +97,22 @@ void ConvTemplatePresenter::setTempCorrection(bool on) { emit functionStructureChanged(); } -void ConvTemplatePresenter::setNumberOfDatasets(int n) { m_model.setNumberDomains(n); } +void ConvTemplatePresenter::setNumberOfDatasets(int n) { m_model->setNumberDomains(n); } -int ConvTemplatePresenter::getNumberOfDatasets() const { return m_model.getNumberDomains(); } +int ConvTemplatePresenter::getNumberOfDatasets() const { return m_model->getNumberDomains(); } void ConvTemplatePresenter::setFunction(const QString &funStr) { - m_model.setFunctionString(funStr); + m_model->setFunctionString(funStr); - m_view->updateTemperatureCorrectionAndDelta(m_model.hasTempCorrection(), m_model.hasDeltaFunction()); + m_view->updateTemperatureCorrectionAndDelta(m_model->hasTempCorrection(), m_model->hasDeltaFunction()); - m_view->setSubType(SubTypeIndex::Lorentzian, static_cast(m_model.getLorentzianType())); - m_view->setSubType(SubTypeIndex::Fit, static_cast(m_model.getFitType())); - m_view->setSubType(SubTypeIndex::Background, static_cast(m_model.getBackgroundType())); + m_view->setSubType(SubTypeIndex::Lorentzian, static_cast(m_model->getLorentzianType())); + m_view->setSubType(SubTypeIndex::Fit, static_cast(m_model->getFitType())); + m_view->setSubType(SubTypeIndex::Background, static_cast(m_model->getBackgroundType())); - m_view->setInt(SubTypeIndex::Lorentzian, static_cast(m_model.getLorentzianType())); - m_view->setEnum(SubTypeIndex::Fit, static_cast(m_model.getFitType())); - m_view->setEnum(SubTypeIndex::Background, static_cast(m_model.getBackgroundType())); + m_view->setInt(SubTypeIndex::Lorentzian, static_cast(m_model->getLorentzianType())); + m_view->setEnum(SubTypeIndex::Fit, static_cast(m_model->getFitType())); + m_view->setEnum(SubTypeIndex::Background, static_cast(m_model->getBackgroundType())); setErrorsEnabled(false); updateViewParameterNames(); @@ -118,20 +120,20 @@ void ConvTemplatePresenter::setFunction(const QString &funStr) { emit functionStructureChanged(); } -int ConvTemplatePresenter::getCurrentDataset() { return m_model.currentDomainIndex(); } +int ConvTemplatePresenter::getCurrentDataset() { return m_model->currentDomainIndex(); } -IFunction_sptr ConvTemplatePresenter::getGlobalFunction() const { return m_model.getFitFunction(); } +IFunction_sptr ConvTemplatePresenter::getGlobalFunction() const { return m_model->getFitFunction(); } -IFunction_sptr ConvTemplatePresenter::getFunction() const { return m_model.getCurrentFunction(); } +IFunction_sptr ConvTemplatePresenter::getFunction() const { return m_model->getCurrentFunction(); } -QStringList ConvTemplatePresenter::getGlobalParameters() const { return m_model.getGlobalParameters(); } +QStringList ConvTemplatePresenter::getGlobalParameters() const { return m_model->getGlobalParameters(); } -QStringList ConvTemplatePresenter::getLocalParameters() const { return m_model.getLocalParameters(); } +QStringList ConvTemplatePresenter::getLocalParameters() const { return m_model->getLocalParameters(); } -void ConvTemplatePresenter::setGlobalParameters(const QStringList &globals) { m_model.setGlobalParameters(globals); } +void ConvTemplatePresenter::setGlobalParameters(const QStringList &globals) { m_model->setGlobalParameters(globals); } void ConvTemplatePresenter::setGlobal(const QString &parName, bool on) { - auto globals = m_model.getGlobalParameters(); + auto globals = m_model->getGlobalParameters(); if (on) { if (!globals.contains(parName)) { globals.push_back(parName); @@ -143,80 +145,80 @@ void ConvTemplatePresenter::setGlobal(const QString &parName, bool on) { } void ConvTemplatePresenter::updateMultiDatasetParameters(const IFunction &fun) { - m_model.updateMultiDatasetParameters(fun); + m_model->updateMultiDatasetParameters(fun); updateViewParameters(); } void ConvTemplatePresenter::updateMultiDatasetParameters(const ITableWorkspace ¶mTable) { - m_model.updateMultiDatasetParameters(paramTable); + m_model->updateMultiDatasetParameters(paramTable); updateViewParameters(); } void ConvTemplatePresenter::updateParameters(const IFunction &fun) { - m_model.updateParameters(fun); + m_model->updateParameters(fun); updateViewParameters(); } void ConvTemplatePresenter::setCurrentDataset(int i) { - m_model.setCurrentDomainIndex(i); + m_model->setCurrentDomainIndex(i); updateViewParameters(); } -void ConvTemplatePresenter::setDatasets(const QList &datasets) { m_model.setDatasets(datasets); } +void ConvTemplatePresenter::setDatasets(const QList &datasets) { m_model->setDatasets(datasets); } void ConvTemplatePresenter::setBackgroundA0(double value) { - m_model.setBackgroundA0(value); + m_model->setBackgroundA0(value); updateViewParameters(); } -void ConvTemplatePresenter::setQValues(const std::vector &qValues) { m_model.setQValues(qValues); } +void ConvTemplatePresenter::setQValues(const std::vector &qValues) { m_model->setQValues(qValues); } void ConvTemplatePresenter::setErrorsEnabled(bool enabled) { m_view->setErrorsEnabled(enabled); } void ConvTemplatePresenter::setResolution(const std::vector> &fitResolutions) { - m_model.setResolution(fitResolutions); + m_model->setResolution(fitResolutions); } void ConvTemplatePresenter::updateViewParameters() { - auto values = m_model.getCurrentValues(); - auto errors = m_model.getCurrentErrors(); + auto values = m_model->getCurrentValues(); + auto errors = m_model->getCurrentErrors(); for (auto const id : values.keys()) { m_view->setParameterValueQuiet(id, values[id], errors[id]); } } -QStringList ConvTemplatePresenter::getDatasetNames() const { return m_model.getDatasetNames(); } +QStringList ConvTemplatePresenter::getDatasetNames() const { return m_model->getDatasetNames(); } -QStringList ConvTemplatePresenter::getDatasetDomainNames() const { return m_model.getDatasetDomainNames(); } +QStringList ConvTemplatePresenter::getDatasetDomainNames() const { return m_model->getDatasetDomainNames(); } double ConvTemplatePresenter::getLocalParameterValue(const QString &parName, int i) const { - return m_model.getLocalParameterValue(parName, i); + return m_model->getLocalParameterValue(parName, i); } bool ConvTemplatePresenter::isLocalParameterFixed(const QString &parName, int i) const { - return m_model.isLocalParameterFixed(parName, i); + return m_model->isLocalParameterFixed(parName, i); } QString ConvTemplatePresenter::getLocalParameterTie(const QString &parName, int i) const { - return m_model.getLocalParameterTie(parName, i); + return m_model->getLocalParameterTie(parName, i); } QString ConvTemplatePresenter::getLocalParameterConstraint(const QString &parName, int i) const { - return m_model.getLocalParameterConstraint(parName, i); + return m_model->getLocalParameterConstraint(parName, i); } void ConvTemplatePresenter::setLocalParameterValue(const QString &parName, int i, double value) { - m_model.setLocalParameterValue(parName, i, value); + m_model->setLocalParameterValue(parName, i, value); } void ConvTemplatePresenter::setLocalParameterTie(const QString &parName, int i, const QString &tie) { - m_model.setLocalParameterTie(parName, i, tie); + m_model->setLocalParameterTie(parName, i, tie); } -void ConvTemplatePresenter::updateViewParameterNames() { m_view->updateParameterNames(m_model.getParameterNameMap()); } +void ConvTemplatePresenter::updateViewParameterNames() { m_view->updateParameterNames(m_model->getParameterNameMap()); } void ConvTemplatePresenter::setLocalParameterFixed(const QString &parName, int i, bool fixed) { - m_model.setLocalParameterFixed(parName, i, fixed); + m_model->setLocalParameterFixed(parName, i, fixed); } void ConvTemplatePresenter::editLocalParameter(const QString &parName) { @@ -261,7 +263,7 @@ void ConvTemplatePresenter::editLocalParameterFinish(int result) { } else { setLocalParameterTie(parName, i, ""); } - m_model.setLocalParameterConstraint(parName, i, constraints[i]); + m_model->setLocalParameterConstraint(parName, i, constraints[i]); } } m_editLocalParameterDialog = nullptr; @@ -272,14 +274,14 @@ void ConvTemplatePresenter::editLocalParameterFinish(int result) { void ConvTemplatePresenter::viewChangedParameterValue(const QString &parName, double value) { if (parName.isEmpty()) return; - if (m_model.isGlobal(parName)) { + if (m_model->isGlobal(parName)) { auto const n = getNumberOfDatasets(); for (int i = 0; i < n; ++i) { setLocalParameterValue(parName, i, value); } } else { - auto const i = m_model.currentDomainIndex(); - auto const oldValue = m_model.getLocalParameterValue(parName, i); + auto const i = m_model->currentDomainIndex(); + auto const oldValue = m_model->getLocalParameterValue(parName, i); if (fabs(value - oldValue) > 1e-6) { setErrorsEnabled(false); } @@ -289,7 +291,7 @@ void ConvTemplatePresenter::viewChangedParameterValue(const QString &parName, do } EstimationDataSelector ConvTemplatePresenter::getEstimationDataSelector() const { - return m_model.getEstimationDataSelector(); + return m_model->getEstimationDataSelector(); } } // namespace MantidQt::CustomInterfaces::IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.h index 033f1c0f5365..a5e544e944f1 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/ConvTemplatePresenter.h @@ -31,7 +31,7 @@ class ConvTemplateBrowser; class MANTIDQT_INELASTIC_DLL ConvTemplatePresenter : public QObject { Q_OBJECT public: - explicit ConvTemplatePresenter(ConvTemplateBrowser *view); + explicit ConvTemplatePresenter(ConvTemplateBrowser *view, std::unique_ptr functionModel); void setSubType(size_t subTypeIndex, int typeIndex); void setDeltaFunction(bool); void setTempCorrection(bool); @@ -77,7 +77,7 @@ private slots: void setLocalParameterTie(const QString &parName, int i, const QString &tie); void updateViewParameterNames(); ConvTemplateBrowser *m_view; - ConvFunctionModel m_model; + std::unique_ptr m_model; EditLocalParameterDialog *m_editLocalParameterDialog; }; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqFunctionModel.cpp similarity index 90% rename from qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp rename to qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqFunctionModel.cpp index 70fe54b01525..e11fc54c4cfd 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqFunctionModel.cpp @@ -4,7 +4,7 @@ // NScD Oak Ridge National Laboratory, European Spallation Source, // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + -#include "FqTemplateBrowser.h" +#include "FqFunctionModel.h" #include "Analysis/FitTabConstants.h" #include "Analysis/IDAFunctionParameterEstimation.h" @@ -48,7 +48,9 @@ auto const estimators = std::unordered_map(estimators)) {} +FqFunctionModel::FqFunctionModel() + : SingleFunctionTemplateModel(std::make_unique(estimators)) { + updateAvailableFunctions(FqFit::ALL_FITS); +} } // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqFunctionModel.h similarity index 74% rename from qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h rename to qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqFunctionModel.h index 93bbf3550365..6b9e03288323 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/FqFunctionModel.h @@ -6,17 +6,16 @@ // SPDX - License - Identifier: GPL - 3.0 + #pragma once -#include "Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h" +#include "Analysis/FunctionBrowser/SingleFunctionTemplateModel.h" namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class FqTemplateBrowser : public SingleFunctionTemplateBrowser { - Q_OBJECT +class FqFunctionModel : public SingleFunctionTemplateModel { public: - FqTemplateBrowser(); + FqFunctionModel(); }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.cpp index 5d8e214965d3..2903cfa11c8b 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.cpp @@ -34,7 +34,8 @@ namespace MantidQt::CustomInterfaces::IDA { * Constructor * @param parent :: The parent widget. */ -IqtTemplateBrowser::IqtTemplateBrowser(QWidget *parent) : FunctionTemplateBrowser(parent), m_presenter(this) { +IqtTemplateBrowser::IqtTemplateBrowser(std::unique_ptr functionModel, QWidget *parent) + : FunctionTemplateBrowser(parent), m_presenter(this, std::move(functionModel)) { connect(&m_presenter, SIGNAL(functionStructureChanged()), this, SIGNAL(functionStructureChanged())); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.h index 5579392397b7..bf32c3643157 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplateBrowser.h @@ -27,7 +27,7 @@ namespace IDA { class MANTIDQT_INELASTIC_DLL IqtTemplateBrowser : public FunctionTemplateBrowser { Q_OBJECT public: - explicit IqtTemplateBrowser(QWidget *parent = nullptr); + explicit IqtTemplateBrowser(std::unique_ptr functionModel, QWidget *parent = nullptr); void addExponentialOne(); void removeExponentialOne(); void addExponentialTwo(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.cpp index e85d9ddcc09f..9d474c225921 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.cpp @@ -18,7 +18,8 @@ using namespace MantidWidgets; * Constructor * @param parent :: The parent widget. */ -IqtTemplatePresenter::IqtTemplatePresenter(IqtTemplateBrowser *view) : QObject(view), m_view(view) { +IqtTemplatePresenter::IqtTemplatePresenter(IqtTemplateBrowser *view, std::unique_ptr functionModel) + : QObject(view), m_view(view), m_model(std::move(functionModel)) { connect(m_view, SIGNAL(localParameterButtonClicked(const QString &)), this, SLOT(editLocalParameter(const QString &))); connect(m_view, SIGNAL(parameterValueChanged(const QString &, double)), this, @@ -32,7 +33,7 @@ void IqtTemplatePresenter::setNumberOfExponentials(int n) { if (n > 2) { throw std::logic_error("The number of exponents is limited to 2."); } - auto nCurrent = m_model.getNumberOfExponentials(); + auto nCurrent = m_model->getNumberOfExponentials(); if (n == 0) { if (nCurrent == 2) { m_view->removeExponentialTwo(); @@ -61,21 +62,21 @@ void IqtTemplatePresenter::setNumberOfExponentials(int n) { } } assert(nCurrent == n); - m_model.setNumberOfExponentials(n); + m_model->setNumberOfExponentials(n); setErrorsEnabled(false); updateView(); emit functionStructureChanged(); } void IqtTemplatePresenter::setStretchExponential(bool on) { - if (on == m_model.hasStretchExponential()) + if (on == m_model->hasStretchExponential()) return; if (on) { m_view->addStretchExponential(); } else { m_view->removeStretchExponential(); } - m_model.setStretchExponential(on); + m_model->setStretchExponential(on); setErrorsEnabled(false); updateView(); emit functionStructureChanged(); @@ -84,10 +85,10 @@ void IqtTemplatePresenter::setStretchExponential(bool on) { void IqtTemplatePresenter::setBackground(const QString &name) { if (name == "None") { m_view->removeBackground(); - m_model.removeBackground(); + m_model->removeBackground(); } else if (name == "FlatBackground") { m_view->addFlatBackground(); - m_model.setBackground(name); + m_model->setBackground(name); } else { throw std::logic_error("Browser doesn't support background " + name.toStdString()); } @@ -96,21 +97,21 @@ void IqtTemplatePresenter::setBackground(const QString &name) { emit functionStructureChanged(); } -void IqtTemplatePresenter::setNumberOfDatasets(int n) { m_model.setNumberDomains(n); } +void IqtTemplatePresenter::setNumberOfDatasets(int n) { m_model->setNumberDomains(n); } -int IqtTemplatePresenter::getNumberOfDatasets() const { return m_model.getNumberDomains(); } +int IqtTemplatePresenter::getNumberOfDatasets() const { return m_model->getNumberDomains(); } void IqtTemplatePresenter::setFunction(const QString &funStr) { - m_model.setFunctionString(funStr); + m_model->setFunctionString(funStr); m_view->clear(); setErrorsEnabled(false); - if (m_model.hasBackground()) { + if (m_model->hasBackground()) { m_view->addFlatBackground(); } - if (m_model.hasStretchExponential()) { + if (m_model->hasStretchExponential()) { m_view->addStretchExponential(); } - auto const nExp = m_model.getNumberOfExponentials(); + auto const nExp = m_model->getNumberOfExponentials(); if (nExp > 0) { m_view->addExponentialOne(); } @@ -121,50 +122,50 @@ void IqtTemplatePresenter::setFunction(const QString &funStr) { emit functionStructureChanged(); } -IFunction_sptr IqtTemplatePresenter::getGlobalFunction() const { return m_model.getFitFunction(); } +IFunction_sptr IqtTemplatePresenter::getGlobalFunction() const { return m_model->getFitFunction(); } -IFunction_sptr IqtTemplatePresenter::getFunction() const { return m_model.getCurrentFunction(); } +IFunction_sptr IqtTemplatePresenter::getFunction() const { return m_model->getCurrentFunction(); } -QStringList IqtTemplatePresenter::getGlobalParameters() const { return m_model.getGlobalParameters(); } +QStringList IqtTemplatePresenter::getGlobalParameters() const { return m_model->getGlobalParameters(); } -QStringList IqtTemplatePresenter::getLocalParameters() const { return m_model.getLocalParameters(); } +QStringList IqtTemplatePresenter::getLocalParameters() const { return m_model->getLocalParameters(); } void IqtTemplatePresenter::setGlobalParameters(const QStringList &globals) { - m_model.setGlobalParameters(globals); + m_model->setGlobalParameters(globals); m_view->setGlobalParametersQuiet(globals); } void IqtTemplatePresenter::setGlobal(const QString &parName, bool on) { - m_model.setGlobal(parName, on); - m_view->setGlobalParametersQuiet(m_model.getGlobalParameters()); + m_model->setGlobal(parName, on); + m_view->setGlobalParametersQuiet(m_model->getGlobalParameters()); } void IqtTemplatePresenter::updateMultiDatasetParameters(const IFunction &fun) { - m_model.updateMultiDatasetParameters(fun); + m_model->updateMultiDatasetParameters(fun); updateViewParameters(); } void IqtTemplatePresenter::updateMultiDatasetParameters(const ITableWorkspace ¶mTable) { - m_model.updateMultiDatasetParameters(paramTable); + m_model->updateMultiDatasetParameters(paramTable); updateViewParameters(); } void IqtTemplatePresenter::updateParameters(const IFunction &fun) { - m_model.updateParameters(fun); + m_model->updateParameters(fun); updateViewParameters(); } void IqtTemplatePresenter::setCurrentDataset(int i) { - m_model.setCurrentDomainIndex(i); + m_model->setCurrentDomainIndex(i); updateViewParameters(); } -int IqtTemplatePresenter::getCurrentDataset() { return m_model.currentDomainIndex(); } +int IqtTemplatePresenter::getCurrentDataset() { return m_model->currentDomainIndex(); } -void IqtTemplatePresenter::setDatasets(const QList &datasets) { m_model.setDatasets(datasets); } +void IqtTemplatePresenter::setDatasets(const QList &datasets) { m_model->setDatasets(datasets); } void IqtTemplatePresenter::setViewParameterDescriptions() { - m_view->updateParameterDescriptions(m_model.getParameterDescriptionMap()); + m_view->updateParameterDescriptions(m_model->getParameterDescriptionMap()); } void IqtTemplatePresenter::setErrorsEnabled(bool enabled) { m_view->setErrorsEnabled(enabled); } @@ -172,24 +173,24 @@ void IqtTemplatePresenter::setErrorsEnabled(bool enabled) { m_view->setErrorsEna void IqtTemplatePresenter::tieIntensities(bool on) { if (on && !canTieIntensities()) return; - m_model.tieIntensities(on); + m_model->tieIntensities(on); emit functionStructureChanged(); } bool IqtTemplatePresenter::canTieIntensities() const { - return (m_model.hasStretchExponential() || m_model.getNumberOfExponentials() > 0) && m_model.hasBackground(); + return (m_model->hasStretchExponential() || m_model->getNumberOfExponentials() > 0) && m_model->hasBackground(); } EstimationDataSelector IqtTemplatePresenter::getEstimationDataSelector() const { - return m_model.getEstimationDataSelector(); + return m_model->getEstimationDataSelector(); } void IqtTemplatePresenter::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { - m_model.updateParameterEstimationData(std::move(data)); + m_model->updateParameterEstimationData(std::move(data)); } void IqtTemplatePresenter::setBackgroundA0(double value) { - m_model.setBackgroundA0(value); + m_model->setBackgroundA0(value); m_view->setA0(value, 0.0); } @@ -203,42 +204,42 @@ void IqtTemplatePresenter::updateViewParameters() { {IqtFunctionModel::ParamID::STRETCH_LIFETIME, &IqtTemplateBrowser::setStretchLifetime}, {IqtFunctionModel::ParamID::STRETCH_STRETCHING, &IqtTemplateBrowser::setStretchStretching}, {IqtFunctionModel::ParamID::BG_A0, &IqtTemplateBrowser::setA0}}; - auto values = m_model.getCurrentValues(); - auto errors = m_model.getCurrentErrors(); + auto values = m_model->getCurrentValues(); + auto errors = m_model->getCurrentErrors(); for (auto const name : values.keys()) { (m_view->*setters.at(name))(values[name], errors[name]); } } -QStringList IqtTemplatePresenter::getDatasetNames() const { return m_model.getDatasetNames(); } +QStringList IqtTemplatePresenter::getDatasetNames() const { return m_model->getDatasetNames(); } -QStringList IqtTemplatePresenter::getDatasetDomainNames() const { return m_model.getDatasetDomainNames(); } +QStringList IqtTemplatePresenter::getDatasetDomainNames() const { return m_model->getDatasetDomainNames(); } double IqtTemplatePresenter::getLocalParameterValue(const QString &parName, int i) const { - return m_model.getLocalParameterValue(parName, i); + return m_model->getLocalParameterValue(parName, i); } bool IqtTemplatePresenter::isLocalParameterFixed(const QString &parName, int i) const { - return m_model.isLocalParameterFixed(parName, i); + return m_model->isLocalParameterFixed(parName, i); } QString IqtTemplatePresenter::getLocalParameterTie(const QString &parName, int i) const { - return m_model.getLocalParameterTie(parName, i); + return m_model->getLocalParameterTie(parName, i); } QString IqtTemplatePresenter::getLocalParameterConstraint(const QString &parName, int i) const { - return m_model.getLocalParameterConstraint(parName, i); + return m_model->getLocalParameterConstraint(parName, i); } void IqtTemplatePresenter::setLocalParameterValue(const QString &parName, int i, double value) { - m_model.setLocalParameterValue(parName, i, value); + m_model->setLocalParameterValue(parName, i, value); } void IqtTemplatePresenter::setLocalParameterTie(const QString &parName, int i, const QString &tie) { - m_model.setLocalParameterTie(parName, i, tie); + m_model->setLocalParameterTie(parName, i, tie); } -void IqtTemplatePresenter::updateViewParameterNames() { m_view->updateParameterNames(m_model.getParameterNameMap()); } +void IqtTemplatePresenter::updateViewParameterNames() { m_view->updateParameterNames(m_model->getParameterNameMap()); } void IqtTemplatePresenter::updateView() { updateViewParameterNames(); @@ -247,7 +248,7 @@ void IqtTemplatePresenter::updateView() { } void IqtTemplatePresenter::setLocalParameterFixed(const QString &parName, int i, bool fixed) { - m_model.setLocalParameterFixed(parName, i, fixed); + m_model->setLocalParameterFixed(parName, i, fixed); } void IqtTemplatePresenter::editLocalParameter(const QString &parName) { @@ -301,14 +302,14 @@ void IqtTemplatePresenter::editLocalParameterFinish(int result) { void IqtTemplatePresenter::viewChangedParameterValue(const QString &parName, double value) { if (parName.isEmpty()) return; - if (m_model.isGlobal(parName)) { + if (m_model->isGlobal(parName)) { auto const n = getNumberOfDatasets(); for (int i = 0; i < n; ++i) { setLocalParameterValue(parName, i, value); } } else { - auto const i = m_model.currentDomainIndex(); - auto const oldValue = m_model.getLocalParameterValue(parName, i); + auto const i = m_model->currentDomainIndex(); + auto const oldValue = m_model->getLocalParameterValue(parName, i); if (fabs(value - oldValue) > 1e-6) { setErrorsEnabled(false); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.h index 545c0b4d033c..a1fd753e5ead 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/IqtTemplatePresenter.h @@ -31,7 +31,7 @@ class IqtTemplateBrowser; class MANTIDQT_INELASTIC_DLL IqtTemplatePresenter : public QObject { Q_OBJECT public: - explicit IqtTemplatePresenter(IqtTemplateBrowser *view); + explicit IqtTemplatePresenter(IqtTemplateBrowser *view, std::unique_ptr functionModel); void setNumberOfExponentials(int); void setStretchExponential(bool); void setBackground(const QString &name); @@ -80,7 +80,7 @@ private slots: void updateViewParameterNames(); void updateView(); IqtTemplateBrowser *m_view; - IqtFunctionModel m_model; + std::unique_ptr m_model; EditLocalParameterDialog *m_editLocalParameterDialog; }; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDFunctionModel.cpp similarity index 84% rename from qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp rename to qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDFunctionModel.cpp index f5d14fd2b46f..9d560c6622ed 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDFunctionModel.cpp @@ -4,7 +4,7 @@ // NScD Oak Ridge National Laboratory, European Spallation Source, // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + -#include "MSDTemplateBrowser.h" +#include "MSDFunctionModel.h" #include "Analysis/FitTabConstants.h" #include "Analysis/IDAFunctionParameterEstimation.h" @@ -29,7 +29,9 @@ auto const estimators = std::unordered_map(estimators)) {} +MSDFunctionModel::MSDFunctionModel() + : SingleFunctionTemplateModel(std::make_unique(estimators)) { + updateAvailableFunctions(MSDFit::ALL_FITS); +} } // namespace MantidQt::CustomInterfaces::IDA \ No newline at end of file diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDFunctionModel.h similarity index 74% rename from qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h rename to qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDFunctionModel.h index a2511de7980f..20dc7e1ebde5 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/MSDFunctionModel.h @@ -6,17 +6,16 @@ // SPDX - License - Identifier: GPL - 3.0 + #pragma once -#include "Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h" +#include "Analysis/FunctionBrowser/SingleFunctionTemplateModel.h" namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class MSDTemplateBrowser : public SingleFunctionTemplateBrowser { - Q_OBJECT +class MSDFunctionModel : public SingleFunctionTemplateModel { public: - MSDTemplateBrowser(); + MSDFunctionModel(); }; } // namespace IDA diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp index 81904582627b..f166f6ea05c5 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp @@ -35,11 +35,9 @@ namespace MantidQt::CustomInterfaces::IDA { * Constructor * @param parent :: The parent widget. */ -SingleFunctionTemplateBrowser::SingleFunctionTemplateBrowser( - const std::map &functionInitialisationStrings, - std::unique_ptr parameterEstimation, QWidget *parent) - : FunctionTemplateBrowser(parent), - m_presenter(this, functionInitialisationStrings, std::move(parameterEstimation)) { +SingleFunctionTemplateBrowser::SingleFunctionTemplateBrowser(std::unique_ptr functionModel, + QWidget *parent) + : FunctionTemplateBrowser(parent), m_presenter(this, std::move(functionModel)) { connect(&m_presenter, SIGNAL(functionStructureChanged()), this, SIGNAL(functionStructureChanged())); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h index 00ea818ae057..f7e785408b07 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h @@ -28,8 +28,7 @@ class IDAFunctionParameterEstimation; class MANTIDQT_INELASTIC_DLL SingleFunctionTemplateBrowser : public FunctionTemplateBrowser { Q_OBJECT public: - explicit SingleFunctionTemplateBrowser(const std::map &functionInitialisationStrings, - std::unique_ptr parameterEstimation, + explicit SingleFunctionTemplateBrowser(std::unique_ptr functionModel, QWidget *parent = nullptr); virtual ~SingleFunctionTemplateBrowser() = default; void setFunction(const QString &funStr) override; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp index c6be8750ae6a..05f54b009ddd 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp @@ -18,154 +18,151 @@ using namespace MantidWidgets; * @param parent :: The parent widget. */ SingleFunctionTemplatePresenter::SingleFunctionTemplatePresenter( - SingleFunctionTemplateBrowser *view, const std::map &functionInitialisationStrings, - std::unique_ptr parameterEstimation) - : QObject(view), m_view(view), m_model(std::move(parameterEstimation)) { + SingleFunctionTemplateBrowser *view, std::unique_ptr functionModel) + : QObject(view), m_view(view), m_model(std::move(functionModel)) { connect(m_view, SIGNAL(localParameterButtonClicked(const QString &)), this, SLOT(editLocalParameter(const QString &))); connect(m_view, SIGNAL(parameterValueChanged(const QString &, double)), this, SLOT(viewChangedParameterValue(const QString &, double))); - - m_model.updateAvailableFunctions(functionInitialisationStrings); } void SingleFunctionTemplatePresenter::init() { - m_view->setDataType(m_model.getFunctionList()); - setFitType(m_model.getFitType()); + m_view->setDataType(m_model->getFunctionList()); + setFitType(m_model->getFitType()); } void SingleFunctionTemplatePresenter::updateAvailableFunctions( const std::map &functionInitialisationStrings) { - m_model.updateAvailableFunctions(functionInitialisationStrings); - m_view->setDataType(m_model.getFunctionList()); - setFitType(m_model.getFitType()); + m_model->updateAvailableFunctions(functionInitialisationStrings); + m_view->setDataType(m_model->getFunctionList()); + setFitType(m_model->getFitType()); } void SingleFunctionTemplatePresenter::setFitType(const QString &name) { m_view->clear(); - m_model.setFitType(name); - auto functionParameters = m_model.getParameterNames(); + m_model->setFitType(name); + auto functionParameters = m_model->getParameterNames(); for (auto ¶meter : functionParameters) { - m_view->addParameter(parameter, m_model.getParameterDescription(parameter)); + m_view->addParameter(parameter, m_model->getParameterDescription(parameter)); } setErrorsEnabled(false); updateView(); emit functionStructureChanged(); } -void SingleFunctionTemplatePresenter::setNumberOfDatasets(int n) { m_model.setNumberDomains(n); } +void SingleFunctionTemplatePresenter::setNumberOfDatasets(int n) { m_model->setNumberDomains(n); } -int SingleFunctionTemplatePresenter::getNumberOfDatasets() const { return m_model.getNumberDomains(); } +int SingleFunctionTemplatePresenter::getNumberOfDatasets() const { return m_model->getNumberDomains(); } -int SingleFunctionTemplatePresenter::getCurrentDataset() { return m_model.currentDomainIndex(); } +int SingleFunctionTemplatePresenter::getCurrentDataset() { return m_model->currentDomainIndex(); } void SingleFunctionTemplatePresenter::setFunction(const QString &funStr) { m_view->clear(); - m_model.setFunctionString(funStr); + m_model->setFunctionString(funStr); - if (m_model.getFitType() == "None") + if (m_model->getFitType() == "None") return; - auto functionParameters = m_model.getParameterNames(); + auto functionParameters = m_model->getParameterNames(); for (auto ¶meter : functionParameters) { - m_view->addParameter(parameter, m_model.getParameterDescription(parameter)); + m_view->addParameter(parameter, m_model->getParameterDescription(parameter)); } - m_view->setEnumValue(m_model.getEnumIndex()); + m_view->setEnumValue(m_model->getEnumIndex()); setErrorsEnabled(false); updateView(); emit functionStructureChanged(); } -IFunction_sptr SingleFunctionTemplatePresenter::getGlobalFunction() const { return m_model.getFitFunction(); } +IFunction_sptr SingleFunctionTemplatePresenter::getGlobalFunction() const { return m_model->getFitFunction(); } -IFunction_sptr SingleFunctionTemplatePresenter::getFunction() const { return m_model.getCurrentFunction(); } +IFunction_sptr SingleFunctionTemplatePresenter::getFunction() const { return m_model->getCurrentFunction(); } -QStringList SingleFunctionTemplatePresenter::getGlobalParameters() const { return m_model.getGlobalParameters(); } +QStringList SingleFunctionTemplatePresenter::getGlobalParameters() const { return m_model->getGlobalParameters(); } -QStringList SingleFunctionTemplatePresenter::getLocalParameters() const { return m_model.getLocalParameters(); } +QStringList SingleFunctionTemplatePresenter::getLocalParameters() const { return m_model->getLocalParameters(); } void SingleFunctionTemplatePresenter::setGlobalParameters(const QStringList &globals) { - m_model.setGlobalParameters(globals); + m_model->setGlobalParameters(globals); m_view->setGlobalParametersQuiet(globals); } void SingleFunctionTemplatePresenter::setGlobal(const QString &parName, bool on) { - m_model.setGlobal(parName, on); - m_view->setGlobalParametersQuiet(m_model.getGlobalParameters()); + m_model->setGlobal(parName, on); + m_view->setGlobalParametersQuiet(m_model->getGlobalParameters()); } void SingleFunctionTemplatePresenter::updateMultiDatasetParameters(const IFunction &fun) { - m_model.updateMultiDatasetParameters(fun); + m_model->updateMultiDatasetParameters(fun); updateView(); } void SingleFunctionTemplatePresenter::updateParameters(const IFunction &fun) { - m_model.updateParameters(fun); + m_model->updateParameters(fun); updateView(); } void SingleFunctionTemplatePresenter::setCurrentDataset(int i) { - m_model.setCurrentDomainIndex(i); + m_model->setCurrentDomainIndex(i); updateView(); } void SingleFunctionTemplatePresenter::setDatasets(const QList &datasets) { - m_model.setDatasets(datasets); + m_model->setDatasets(datasets); } void SingleFunctionTemplatePresenter::setErrorsEnabled(bool enabled) { m_view->setErrorsEnabled(enabled); } EstimationDataSelector SingleFunctionTemplatePresenter::getEstimationDataSelector() const { - return m_model.getEstimationDataSelector(); + return m_model->getEstimationDataSelector(); } void SingleFunctionTemplatePresenter::updateParameterEstimationData(DataForParameterEstimationCollection &&data) { - m_model.updateParameterEstimationData(std::move(data)); + m_model->updateParameterEstimationData(std::move(data)); updateView(); } void SingleFunctionTemplatePresenter::estimateFunctionParameters() { - m_model.estimateFunctionParameters(); + m_model->estimateFunctionParameters(); updateView(); } -QStringList SingleFunctionTemplatePresenter::getDatasetNames() const { return m_model.getDatasetNames(); } +QStringList SingleFunctionTemplatePresenter::getDatasetNames() const { return m_model->getDatasetNames(); } -QStringList SingleFunctionTemplatePresenter::getDatasetDomainNames() const { return m_model.getDatasetDomainNames(); } +QStringList SingleFunctionTemplatePresenter::getDatasetDomainNames() const { return m_model->getDatasetDomainNames(); } double SingleFunctionTemplatePresenter::getLocalParameterValue(const QString &parName, int i) const { - return m_model.getLocalParameterValue(parName, i); + return m_model->getLocalParameterValue(parName, i); } bool SingleFunctionTemplatePresenter::isLocalParameterFixed(const QString &parName, int i) const { - return m_model.isLocalParameterFixed(parName, i); + return m_model->isLocalParameterFixed(parName, i); } QString SingleFunctionTemplatePresenter::getLocalParameterTie(const QString &parName, int i) const { - return m_model.getLocalParameterTie(parName, i); + return m_model->getLocalParameterTie(parName, i); } QString SingleFunctionTemplatePresenter::getLocalParameterConstraint(const QString &parName, int i) const { - return m_model.getLocalParameterConstraint(parName, i); + return m_model->getLocalParameterConstraint(parName, i); } void SingleFunctionTemplatePresenter::setLocalParameterValue(const QString &parName, int i, double value) { - m_model.setLocalParameterValue(parName, i, value); + m_model->setLocalParameterValue(parName, i, value); } void SingleFunctionTemplatePresenter::setLocalParameterTie(const QString &parName, int i, const QString &tie) { - m_model.setLocalParameterTie(parName, i, tie); + m_model->setLocalParameterTie(parName, i, tie); } void SingleFunctionTemplatePresenter::updateView() { - if (m_model.getFitType() == "None") + if (m_model->getFitType() == "None") return; - for (auto ¶meterName : m_model.getParameterNames()) { - m_view->setParameterValueQuietly(parameterName, m_model.getParameter(parameterName), - m_model.getParameterError(parameterName)); + for (auto ¶meterName : m_model->getParameterNames()) { + m_view->setParameterValueQuietly(parameterName, m_model->getParameter(parameterName), + m_model->getParameterError(parameterName)); } } void SingleFunctionTemplatePresenter::setLocalParameterFixed(const QString &parName, int i, bool fixed) { - m_model.setLocalParameterFixed(parName, i, fixed); + m_model->setLocalParameterFixed(parName, i, fixed); } void SingleFunctionTemplatePresenter::editLocalParameter(const QString &parName) { @@ -219,14 +216,14 @@ void SingleFunctionTemplatePresenter::editLocalParameterFinish(int result) { void SingleFunctionTemplatePresenter::viewChangedParameterValue(const QString &parName, double value) { if (parName.isEmpty()) return; - if (m_model.isGlobal(parName)) { + if (m_model->isGlobal(parName)) { const auto n = getNumberOfDatasets(); for (int i = 0; i < n; ++i) { setLocalParameterValue(parName, i, value); } } else { - const auto i = m_model.currentDomainIndex(); - const auto oldValue = m_model.getLocalParameterValue(parName, i); + const auto i = m_model->currentDomainIndex(); + const auto oldValue = m_model->getLocalParameterValue(parName, i); if (fabs(value - oldValue) > 1e-6) { setErrorsEnabled(false); } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h index c016a3221447..399cce54a695 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h @@ -33,8 +33,7 @@ class MANTIDQT_INELASTIC_DLL SingleFunctionTemplatePresenter : public QObject { Q_OBJECT public: explicit SingleFunctionTemplatePresenter(SingleFunctionTemplateBrowser *view, - const std::map &functionInitialisationStrings, - std::unique_ptr parameterEstimation); + std::unique_ptr functionModel); void updateAvailableFunctions(const std::map &functionInitialisationStrings); void setFitType(const QString &name); @@ -79,7 +78,7 @@ private slots: void setLocalParameterTie(const QString &parName, int i, const QString &tie); void updateView(); SingleFunctionTemplateBrowser *m_view; - SingleFunctionTemplateModel m_model; + std::unique_ptr m_model; EditLocalParameterDialog *m_editLocalParameterDialog; }; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index 061715212c2a..b51ad18e9c89 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -42,9 +42,10 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { template void setupFittingModel() { m_fittingModel = std::make_unique(); } - template + template void setupFitPropertyBrowser(std::vector const &hiddenProperties, bool const convolveMembers = false) { - m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(new TemplateBrowser()); + auto functionModel = std::make_unique(); + m_uiForm->dockArea->m_fitPropertyBrowser->setFunctionTemplateBrowser(new TemplateBrowser(std::move(functionModel))); m_uiForm->dockArea->m_fitPropertyBrowser->init(); m_uiForm->dockArea->m_fitPropertyBrowser->setHiddenProperties(hiddenProperties); m_fitPropertyBrowser = m_uiForm->dockArea->m_fitPropertyBrowser; diff --git a/qt/scientific_interfaces/Inelastic/CMakeLists.txt b/qt/scientific_interfaces/Inelastic/CMakeLists.txt index a84611084e88..0bd693c1f33c 100644 --- a/qt/scientific_interfaces/Inelastic/CMakeLists.txt +++ b/qt/scientific_interfaces/Inelastic/CMakeLists.txt @@ -34,11 +34,11 @@ set(SRC_FILES Analysis/FunctionBrowser/ConvFunctionModel.cpp Analysis/FunctionBrowser/ConvTemplateBrowser.cpp Analysis/FunctionBrowser/ConvTemplatePresenter.cpp - Analysis/FunctionBrowser/FqTemplateBrowser.cpp + Analysis/FunctionBrowser/FqFunctionModel.cpp Analysis/FunctionBrowser/IqtFunctionModel.cpp Analysis/FunctionBrowser/IqtTemplateBrowser.cpp Analysis/FunctionBrowser/IqtTemplatePresenter.cpp - Analysis/FunctionBrowser/MSDTemplateBrowser.cpp + Analysis/FunctionBrowser/MSDFunctionModel.cpp Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.cpp Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.cpp @@ -86,10 +86,8 @@ set(MOC_FILES Analysis/IndirectFitPropertyBrowser.h Analysis/FunctionBrowser/ConvTemplateBrowser.h Analysis/FunctionBrowser/ConvTemplatePresenter.h - Analysis/FunctionBrowser/FqTemplateBrowser.h Analysis/FunctionBrowser/IqtTemplateBrowser.h Analysis/FunctionBrowser/IqtTemplatePresenter.h - Analysis/FunctionBrowser/MSDTemplateBrowser.h Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h Analysis/FunctionBrowser/SingleFunctionTemplatePresenter.h Manipulation/InelasticDataManipulation.h @@ -128,6 +126,8 @@ set(INC_FILES Analysis/IndirectFittingModel.h Analysis/ParameterEstimation.h Analysis/FunctionBrowser/ConvFunctionModel.h + Analysis/FunctionBrowser/FqFunctionModel.h + Analysis/FunctionBrowser/MSDFunctionModel.h Manipulation/InelasticDataManipulationElwinTabModel.h Manipulation/InelasticDataManipulationIqtTabModel.h Manipulation/InelasticDataManipulationMomentsTabModel.h From 6cee8a5f20445983c43d50db859033f51da121c0 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 14 Nov 2023 11:14:31 +0000 Subject: [PATCH 28/33] Remove creation of output options presenter from tab constructor --- .../Inelastic/Analysis/IndirectDataAnalysisTab.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 8ccb26197eb4..9ed914bcbcf1 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -70,8 +70,6 @@ size_t IndirectDataAnalysisTab::getNumberOfSpecificFunctionContained(const std:: IndirectDataAnalysisTab::IndirectDataAnalysisTab(std::string const &tabName, bool const hasResolution, QWidget *parent) : IndirectTab(parent), m_uiForm(new Ui::IndirectFitTab), m_tabName(tabName), m_hasResolution(hasResolution) { m_uiForm->setupUi(parent); - - m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); } void IndirectDataAnalysisTab::setup() { From eb8bfa86da736bbd990160e4553c86eb1c8d45d3 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 14 Nov 2023 11:24:36 +0000 Subject: [PATCH 29/33] Rename function to addWorkspaceFromDialog --- .../Inelastic/Analysis/ConvFitDataPresenter.cpp | 4 ++-- .../Inelastic/Analysis/ConvFitDataPresenter.h | 2 +- .../Inelastic/Analysis/FqFitDataPresenter.cpp | 2 +- .../Inelastic/Analysis/FqFitDataPresenter.h | 2 +- .../Inelastic/Analysis/IndirectDataAnalysisTab.cpp | 2 +- .../Inelastic/Analysis/IndirectFitDataPresenter.cpp | 2 +- .../Inelastic/Analysis/IndirectFitDataPresenter.h | 2 +- .../Inelastic/test/IDAFunctionParameterEstimationTest.h | 1 + 8 files changed, 9 insertions(+), 8 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.cpp index 24c90554d8d2..17ea1ab3e842 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.cpp @@ -14,9 +14,9 @@ namespace MantidQt::CustomInterfaces::IDA { ConvFitDataPresenter::ConvFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view) : IndirectFitDataPresenter(model, view) {} -bool ConvFitDataPresenter::addWorkspace(IAddWorkspaceDialog const *dialog) { +bool ConvFitDataPresenter::addWorkspaceFromDialog(IAddWorkspaceDialog const *dialog) { if (const auto convDialog = dynamic_cast(dialog)) { - IndirectFitDataPresenter::addWorkspace(convDialog->workspaceName(), convDialog->workspaceIndices()); + addWorkspace(convDialog->workspaceName(), convDialog->workspaceIndices()); setResolution(convDialog->resolutionName()); return true; } diff --git a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.h index 8e6c3dc7f13e..f72b530fa4a5 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitDataPresenter.h @@ -20,7 +20,7 @@ class MANTIDQT_INELASTIC_DLL ConvFitDataPresenter : public IndirectFitDataPresen public: ConvFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view); - bool addWorkspace(IAddWorkspaceDialog const *dialog) override; + bool addWorkspaceFromDialog(IAddWorkspaceDialog const *dialog) override; signals: void modelResolutionAdded(std::string const &name, WorkspaceID const &workspaceID); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp index a13506e0b0cf..2e9f4411afbc 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.cpp @@ -203,7 +203,7 @@ FqFitDataPresenter::FqFitDataPresenter(IIndirectFitDataModel *model, IIndirectFi connect(this, SIGNAL(requestedAddWorkspaceDialog()), this, SLOT(updateActiveWorkspaceID())); } -bool FqFitDataPresenter::addWorkspace(IAddWorkspaceDialog const *dialog) { +bool FqFitDataPresenter::addWorkspaceFromDialog(IAddWorkspaceDialog const *dialog) { if (const auto fqFitDialog = dynamic_cast(dialog)) { addWorkspace(fqFitDialog->workspaceName(), fqFitDialog->parameterType(), fqFitDialog->parameterNameIndex()); setActiveWorkspaceIDToCurrentWorkspace(fqFitDialog); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h index b8715302df5c..2b4545db103b 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FqFitDataPresenter.h @@ -32,7 +32,7 @@ class MANTIDQT_INELASTIC_DLL FqFitDataPresenter : public IndirectFitDataPresente Q_OBJECT public: FqFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view); - bool addWorkspace(IAddWorkspaceDialog const *dialog) override; + bool addWorkspaceFromDialog(IAddWorkspaceDialog const *dialog) override; void addWorkspace(const std::string &workspaceName, const std::string ¶mType, const int &spectrum_index) override; void setActiveWidth(std::size_t widthIndex, WorkspaceID dataIndex, bool single = true) override; void setActiveEISF(std::size_t eisfIndex, WorkspaceID dataIndex, bool single = true) override; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 9ed914bcbcf1..7512215613c1 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -628,7 +628,7 @@ void IndirectDataAnalysisTab::respondToDataChanged() { } void IndirectDataAnalysisTab::respondToDataAdded(IAddWorkspaceDialog const *dialog) { - if (m_dataPresenter->addWorkspace(dialog)) { + if (m_dataPresenter->addWorkspaceFromDialog(dialog)) { m_fittingModel->addDefaultParameters(); } updateDataReferences(); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.cpp index 247da4699d73..cee42fc5d217 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.cpp @@ -49,7 +49,7 @@ std::vector *IndirectFitDataPresenter::getFittingData() { retur IIndirectFitDataView const *IndirectFitDataPresenter::getView() const { return m_view; } -bool IndirectFitDataPresenter::addWorkspace(IAddWorkspaceDialog const *dialog) { +bool IndirectFitDataPresenter::addWorkspaceFromDialog(IAddWorkspaceDialog const *dialog) { if (const auto indirectDialog = dynamic_cast(dialog)) { addWorkspace(indirectDialog->workspaceName(), indirectDialog->workspaceIndices()); return true; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.h index cc454fea5601..57037046b8da 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitDataPresenter.h @@ -29,7 +29,7 @@ class MANTIDQT_INELASTIC_DLL IndirectFitDataPresenter : public QObject, public A IndirectFitDataPresenter(IIndirectFitDataModel *model, IIndirectFitDataView *view); ~IndirectFitDataPresenter(); std::vector *getFittingData(); - virtual bool addWorkspace(IAddWorkspaceDialog const *dialog); + virtual bool addWorkspaceFromDialog(IAddWorkspaceDialog const *dialog); void addWorkspace(const std::string &workspaceName, const std::string &spectra); void setResolution(const std::string &name); void setSampleWSSuffices(const QStringList &suffices); diff --git a/qt/scientific_interfaces/Inelastic/test/IDAFunctionParameterEstimationTest.h b/qt/scientific_interfaces/Inelastic/test/IDAFunctionParameterEstimationTest.h index 932cbcf44f52..9c295c6af3f7 100644 --- a/qt/scientific_interfaces/Inelastic/test/IDAFunctionParameterEstimationTest.h +++ b/qt/scientific_interfaces/Inelastic/test/IDAFunctionParameterEstimationTest.h @@ -30,6 +30,7 @@ class IDAFunctionParameterEstimationTest : public CxxTest::TestSuite { IDAFunctionParameterEstimationTest() { m_fitFunction = [](Mantid::MantidVec const &x, Mantid::MantidVec const &y) { (void)x; + (void)y; return std::unordered_map{{"A0", 2.0}, {"A1", 3.0}}; }; } From f0c05b976015618e7e21463fd485cd9fefb9d4c2 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 15 Nov 2023 12:44:51 +0000 Subject: [PATCH 30/33] Add tests for addWorkspaceFromDialog function --- .../Indirect/IndirectAddWorkspaceDialog.ui | 35 +------------------ .../Analysis/ConvFitAddWorkspaceDialog.h | 3 +- .../Analysis/FqFitAddWorkspaceDialog.h | 3 +- .../Inelastic/test/ConvFitDataPresenterTest.h | 12 +++++++ .../Inelastic/test/FqFitDataPresenterTest.h | 7 ++++ .../test/IndirectFitDataPresenterTest.h | 23 ++++++++++++ 6 files changed, 47 insertions(+), 36 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/IndirectAddWorkspaceDialog.ui b/qt/scientific_interfaces/Indirect/IndirectAddWorkspaceDialog.ui index 17cd5c058891..9299bee69d5c 100644 --- a/qt/scientific_interfaces/Indirect/IndirectAddWorkspaceDialog.ui +++ b/qt/scientific_interfaces/Indirect/IndirectAddWorkspaceDialog.ui @@ -132,40 +132,7 @@ - - - pbAdd - clicked() - IndirectAddWorkspaceDialog - addData() - - - 283 - 157 - - - 248 - 294 - - - - - pbClose - clicked() - IndirectAddWorkspaceDialog - closeDialog() - - - 358 - 160 - - - 354 - 227 - - - - + addData() closeDialog() diff --git a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitAddWorkspaceDialog.h b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitAddWorkspaceDialog.h index 28823935c865..8dae44777076 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/ConvFitAddWorkspaceDialog.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/ConvFitAddWorkspaceDialog.h @@ -5,6 +5,7 @@ // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS // SPDX - License - Identifier: GPL - 3.0 + #pragma once +#include "DllConfig.h" #include "IAddWorkspaceDialog.h" #include "ui_ConvFitAddWorkspaceDialog.h" @@ -12,7 +13,7 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class ConvFitAddWorkspaceDialog : public IAddWorkspaceDialog { +class MANTIDQT_INELASTIC_DLL ConvFitAddWorkspaceDialog : public IAddWorkspaceDialog { Q_OBJECT public: explicit ConvFitAddWorkspaceDialog(QWidget *parent); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FqFitAddWorkspaceDialog.h b/qt/scientific_interfaces/Inelastic/Analysis/FqFitAddWorkspaceDialog.h index 0a75d3b0cfa0..1d802e4b65d4 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FqFitAddWorkspaceDialog.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/FqFitAddWorkspaceDialog.h @@ -6,6 +6,7 @@ // SPDX - License - Identifier: GPL - 3.0 + #pragma once +#include "DllConfig.h" #include "IAddWorkspaceDialog.h" #include "ui_FqFitAddWorkspaceDialog.h" @@ -13,7 +14,7 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class FqFitAddWorkspaceDialog : public IAddWorkspaceDialog { +class MANTIDQT_INELASTIC_DLL FqFitAddWorkspaceDialog : public IAddWorkspaceDialog { Q_OBJECT public: explicit FqFitAddWorkspaceDialog(QWidget *parent); diff --git a/qt/scientific_interfaces/Inelastic/test/ConvFitDataPresenterTest.h b/qt/scientific_interfaces/Inelastic/test/ConvFitDataPresenterTest.h index 82ca511fbfb1..b3ce10521e49 100644 --- a/qt/scientific_interfaces/Inelastic/test/ConvFitDataPresenterTest.h +++ b/qt/scientific_interfaces/Inelastic/test/ConvFitDataPresenterTest.h @@ -9,9 +9,11 @@ #include #include +#include "Analysis/ConvFitAddWorkspaceDialog.h" #include "Analysis/ConvFitDataPresenter.h" #include "Analysis/ConvFitModel.h" #include "Analysis/IIndirectFitDataView.h" +#include "IndirectAddWorkspaceDialog.h" #include "MantidAPI/FrameworkManager.h" #include "MantidFrameworkTestHelpers/IndirectFitDataCreationHelper.h" @@ -160,6 +162,16 @@ class ConvFitDataPresenterTest : public CxxTest::TestSuite { TS_ASSERT_EQUALS(m_dataTable->columnCount(), 6); } + void test_addWorkspaceFromDialog_returns_false_if_the_dialog_is_not_convfit() { + auto dialog = new IndirectAddWorkspaceDialog(nullptr); + TS_ASSERT(!m_presenter->addWorkspaceFromDialog(dialog)); + } + + void test_addWorkspaceFromDialog_returns_true_for_a_valid_dialog() { + auto dialog = new ConvFitAddWorkspaceDialog(nullptr); + TS_ASSERT(m_presenter->addWorkspaceFromDialog(dialog)); + } + void test_updateTableFromModel_clears_table_and_adds_new_row_for_each_entry() { EXPECT_CALL(*m_view, clearTable()).Times(Exactly(1)); EXPECT_CALL(*m_model, getNumberOfDomains()).Times(Exactly(4)).WillRepeatedly(Return(3)); diff --git a/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h b/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h index e4600578d54e..2293652efca6 100644 --- a/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h +++ b/qt/scientific_interfaces/Inelastic/test/FqFitDataPresenterTest.h @@ -9,10 +9,12 @@ #include #include +#include "Analysis/FqFitAddWorkspaceDialog.h" #include "Analysis/FqFitDataPresenter.h" #include "Analysis/FqFitModel.h" #include "Analysis/FunctionBrowser/SingleFunctionTemplateBrowser.h" #include "Analysis/IndirectFitDataView.h" +#include "IndirectAddWorkspaceDialog.h" #include "MantidAPI/FrameworkManager.h" #include "MantidFrameworkTestHelpers/IndirectFitDataCreationHelper.h" @@ -162,6 +164,11 @@ class FqFitDataPresenterTest : public CxxTest::TestSuite { TS_ASSERT(m_view); } + void test_addWorkspaceFromDialog_returns_false_if_the_dialog_is_not_fqfit() { + auto dialog = new IndirectAddWorkspaceDialog(nullptr); + TS_ASSERT(!m_presenter->addWorkspaceFromDialog(dialog)); + } + void test_addWorkspace_does_not_throw_with_width() { EXPECT_CALL(*m_model, addWorkspace("WorkspaceName_HWHM", FunctionModelSpectra("0"))).Times(Exactly(1)); m_presenter->addWorkspace("WorkspaceName", "Width", 0); diff --git a/qt/scientific_interfaces/Inelastic/test/IndirectFitDataPresenterTest.h b/qt/scientific_interfaces/Inelastic/test/IndirectFitDataPresenterTest.h index f5d449ddd399..5e56caa99051 100644 --- a/qt/scientific_interfaces/Inelastic/test/IndirectFitDataPresenterTest.h +++ b/qt/scientific_interfaces/Inelastic/test/IndirectFitDataPresenterTest.h @@ -15,6 +15,7 @@ #include "Analysis/IndirectFitDataView.h" #include "Analysis/IndirectFittingModel.h" #include "Analysis/ParameterEstimation.h" +#include "IndirectAddWorkspaceDialog.h" #include "MantidAPI/FrameworkManager.h" #include "MantidFrameworkTestHelpers/IndirectFitDataCreationHelper.h" @@ -50,6 +51,18 @@ struct TableItem { std::string m_str; double m_dbl; }; + +class FakeDialog : public IAddWorkspaceDialog { + +public: + FakeDialog() : IAddWorkspaceDialog(nullptr) {} + virtual std::string workspaceName() const override { return "Name"; } + virtual void setWSSuffices(const QStringList &suffices) override { (void)suffices; } + virtual void setFBSuffices(const QStringList &suffices) override { (void)suffices; } + + virtual void updateSelectedSpectra() override {} +}; + } // namespace GNU_DIAG_OFF_SUGGEST_OVERRIDE @@ -187,6 +200,16 @@ class IndirectFitDataPresenterTest : public CxxTest::TestSuite { /// Unit Tests that test the signals, methods and slots of the presenter ///---------------------------------------------------------------------- + void test_addWorkspaceFromDialog_returns_false_if_the_dialog_is_not_indirect() { + auto dialog = new FakeDialog(); + TS_ASSERT(!m_presenter->addWorkspaceFromDialog(dialog)); + } + + void test_addWorkspaceFromDialog_returns_true_for_a_valid_dialog() { + auto dialog = new IndirectAddWorkspaceDialog(nullptr); + TS_ASSERT(m_presenter->addWorkspaceFromDialog(dialog)); + } + void test_addWorkspace_with_spectra_calls_to_model() { EXPECT_CALL(*m_model, addWorkspace("WorkspaceName", "0-3")).Times(Exactly(1)); m_presenter->addWorkspace("WorkspaceName", "0-3"); From 273128413caa96414e465fb47cbf9fbf506e7d62 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 29 Nov 2023 11:00:09 +0000 Subject: [PATCH 31/33] Check if xmin is larger than xmax --- .../Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp index 936a451b9875..66bb47a9b649 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/FunctionBrowser/SingleFunctionTemplateModel.cpp @@ -101,7 +101,7 @@ EstimationDataSelector SingleFunctionTemplateModel::getEstimationDataSelector() // Find data thats within range double xmin = range.first; double xmax = range.second; - if (fabs(xmin - xmax) < 1e-5) { + if (xmax - xmin < 1e-5) { return DataForParameterEstimation{}; } From 5371cda74c130a267626cff3618bb2f8cc23b082 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 29 Nov 2023 11:42:00 +0000 Subject: [PATCH 32/33] Show Edit Result button for IqtFit and ConvFit --- .../Inelastic/Analysis/DataAnalysisTabFactory.cpp | 4 ++-- .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 3 ++- .../Inelastic/Analysis/IndirectFitOutputOptionsView.cpp | 2 -- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp index 938f2f8080f8..e18ce05efc07 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/DataAnalysisTabFactory.cpp @@ -41,7 +41,7 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeIqtFitTab(int const index) tab->setupFittingModel(); tab->setupFitPropertyBrowser(IqtFit::HIDDEN_PROPS); tab->setupFitDataView(); - tab->setupOutputOptionsPresenter(); + tab->setupOutputOptionsPresenter(true); tab->setUpFitDataPresenter(); tab->setupPlotView(); return tab; @@ -52,7 +52,7 @@ IndirectDataAnalysisTab *DataAnalysisTabFactory::makeConvFitTab(int const index) tab->setupFittingModel(); tab->setupFitPropertyBrowser(ConvFit::HIDDEN_PROPS, true); tab->setupFitDataView(); - tab->setupOutputOptionsPresenter(); + tab->setupOutputOptionsPresenter(true); tab->setUpFitDataPresenter(); tab->setupPlotView(); return tab; diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index b51ad18e9c89..f1b4691d3c0c 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -56,8 +56,9 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { m_uiForm->dockArea->setFitDataView(new FitDataView(m_uiForm->dockArea)); } - void setupOutputOptionsPresenter() { + void setupOutputOptionsPresenter(bool const editResults = false) { m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); + m_outOptionsPresenter->setEditResultVisible(editResults); } template void setUpFitDataPresenter() { diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitOutputOptionsView.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitOutputOptionsView.cpp index 3cdc4ee7bd6f..c9a5c7d8ec10 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitOutputOptionsView.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectFitOutputOptionsView.cpp @@ -20,8 +20,6 @@ IndirectFitOutputOptionsView::IndirectFitOutputOptionsView(QWidget *parent) connect(m_outputOptions->pbPlot, SIGNAL(clicked()), this, SLOT(emitPlotClicked())); connect(m_outputOptions->pbSave, SIGNAL(clicked()), this, SLOT(emitSaveClicked())); connect(m_outputOptions->pbEditResult, SIGNAL(clicked()), this, SLOT(emitEditResultClicked())); - - m_outputOptions->pbEditResult->setVisible(false); } IndirectFitOutputOptionsView::~IndirectFitOutputOptionsView() = default; From 75e2a0731c4cbd384440321b32357d9509612ba4 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 29 Nov 2023 11:44:01 +0000 Subject: [PATCH 33/33] Move setupOutputOptionsPresenter implementation to cpp file --- .../Inelastic/Analysis/IndirectDataAnalysisTab.cpp | 5 +++++ .../Inelastic/Analysis/IndirectDataAnalysisTab.h | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp index 7512215613c1..00045ef59d3b 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.cpp @@ -115,6 +115,11 @@ void IndirectDataAnalysisTab::connectFitPropertyBrowser() { connect(m_fitPropertyBrowser, SIGNAL(functionChanged()), this, SLOT(respondToFunctionChanged())); } +void IndirectDataAnalysisTab::setupOutputOptionsPresenter(bool const editResults) { + m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); + m_outOptionsPresenter->setEditResultVisible(editResults); +} + void IndirectDataAnalysisTab::setupPlotView(std::optional> const &xPlotBounds) { m_plotPresenter = std::make_unique(m_uiForm->dockArea->m_fitPlotView); m_plotPresenter->setFittingData(m_dataPresenter->getFittingData()); diff --git a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h index f1b4691d3c0c..4885934caa8e 100644 --- a/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Inelastic/Analysis/IndirectDataAnalysisTab.h @@ -56,16 +56,12 @@ class MANTIDQT_INELASTIC_DLL IndirectDataAnalysisTab : public IndirectTab { m_uiForm->dockArea->setFitDataView(new FitDataView(m_uiForm->dockArea)); } - void setupOutputOptionsPresenter(bool const editResults = false) { - m_outOptionsPresenter = std::make_unique(m_uiForm->ovOutputOptionsView); - m_outOptionsPresenter->setEditResultVisible(editResults); - } - template void setUpFitDataPresenter() { m_dataPresenter = std::make_unique(m_fittingModel->getFitDataModel(), m_uiForm->dockArea->m_fitDataView); } + void setupOutputOptionsPresenter(bool const editResults = false); void setupPlotView(std::optional> const &xPlotBounds = std::nullopt); WorkspaceID getSelectedDataIndex() const;