diff --git a/qt/scientific_interfaces/Indirect/CMakeLists.txt b/qt/scientific_interfaces/Indirect/CMakeLists.txt index 29a677f9460915f2a9dedb9a196dba7cb9bace8b..351eeed04434a54ec2358e457c5c3b5f3d22a82d 100644 --- a/qt/scientific_interfaces/Indirect/CMakeLists.txt +++ b/qt/scientific_interfaces/Indirect/CMakeLists.txt @@ -24,7 +24,7 @@ set( IndirectBayesTab.cpp IndirectCorrections.cpp IndirectDataAnalysis.cpp - IndirectDataAnalysisTabLegacy.cpp + IndirectDataAnalysisTab.cpp IndirectDataAnalysisTab.cpp IndirectDataReduction.cpp IndirectDataReductionTab.cpp @@ -86,6 +86,9 @@ set( IqtFit.cpp IqtFitModel.cpp IndirectFitPropertyBrowser.cpp + IndirectFunctionBrowser/IqtFunctionModel.cpp + IndirectFunctionBrowser/IqtTemplateBrowser.cpp + IndirectFunctionBrowser/IqtTemplatePresenter.cpp JumpFit.cpp JumpFitAddWorkspaceDialog.cpp JumpFitDataPresenter.cpp @@ -155,7 +158,7 @@ set( IndirectBayesTab.h IndirectCorrections.h IndirectDataAnalysis.h - IndirectDataAnalysisTabLegacy.h + IndirectDataAnalysisTab.h IndirectDataAnalysisTab.h IndirectDataReduction.h IndirectDataReductionTab.h @@ -201,6 +204,8 @@ set( IndirectTransmissionCalc.h IndirectTransmission.h IqtFit.h + IndirectFunctionBrowser/IqtTemplateBrowser.h + IndirectFunctionBrowser/IqtTemplatePresenter.h IndirectFitPropertyBrowser.h Iqt.h ISISCalibration.h diff --git a/qt/scientific_interfaces/Indirect/Elwin.cpp b/qt/scientific_interfaces/Indirect/Elwin.cpp index c610dd8d7a0da60fa0a247af6fb9ee66925939fb..e12264f41ac6dbdbb8959e5b4ce4f5d9ed7cd1ed 100644 --- a/qt/scientific_interfaces/Indirect/Elwin.cpp +++ b/qt/scientific_interfaces/Indirect/Elwin.cpp @@ -101,7 +101,7 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { Elwin::Elwin(QWidget *parent) - : IndirectDataAnalysisTabLegacy(parent), m_elwTree(nullptr) { + : IndirectDataAnalysisTab(parent), m_elwTree(nullptr) { m_uiForm.setupUi(parent); setOutputPlotOptionsPresenter(std::make_unique<IndirectPlotOptionsPresenter>( m_uiForm.ipoPlotOptions, this, PlotWidget::Spectra)); @@ -504,8 +504,8 @@ void Elwin::newPreviewFileSelected(int index) { * Replots the preview plot. */ void Elwin::plotInput() { - IndirectDataAnalysisTabLegacy::plotInput(m_uiForm.ppPlot); - IndirectDataAnalysisTabLegacy::updatePlotRange("ElwinIntegrationRange", + IndirectDataAnalysisTab::plotInput(m_uiForm.ppPlot); + IndirectDataAnalysisTab::updatePlotRange("ElwinIntegrationRange", m_uiForm.ppPlot, "IntegrationStart", "IntegrationEnd"); diff --git a/qt/scientific_interfaces/Indirect/Elwin.h b/qt/scientific_interfaces/Indirect/Elwin.h index f977a97904f64a451144e324f66c78cd7e5eeb27..313c5c0b4a215887444466e9af80fb1343c0bbd0 100644 --- a/qt/scientific_interfaces/Indirect/Elwin.h +++ b/qt/scientific_interfaces/Indirect/Elwin.h @@ -7,14 +7,14 @@ #ifndef MANTIDQTCUSTOMINTERFACESIDA_ELWIN_H_ #define MANTIDQTCUSTOMINTERFACESIDA_ELWIN_H_ -#include "IndirectDataAnalysisTabLegacy.h" +#include "IndirectDataAnalysisTab.h" #include "MantidAPI/MatrixWorkspace_fwd.h" #include "ui_Elwin.h" namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class DLLExport Elwin : public IndirectDataAnalysisTabLegacy { +class DLLExport Elwin : public IndirectDataAnalysisTab { Q_OBJECT public: diff --git a/qt/scientific_interfaces/Indirect/IIndirectFitPlotViewLegacy.h b/qt/scientific_interfaces/Indirect/IIndirectFitPlotViewLegacy.h index 4902cae02b7aba4b355a538df5659817305aa823..1e3ac24fe916fde529eddbf8df057217d5297280 100644 --- a/qt/scientific_interfaces/Indirect/IIndirectFitPlotViewLegacy.h +++ b/qt/scientific_interfaces/Indirect/IIndirectFitPlotViewLegacy.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_IINDIRECTFITPLOTVIEW_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_IINDIRECTFITPLOTVIEW_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_IINDIRECTFITPLOTVIEWLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_IINDIRECTFITPLOTVIEWLEGACY_H_ #include "DllConfig.h" #include "MantidAPI/MatrixWorkspace.h" diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp index ef30ddbe7e89f0bcbd1cf1078003e3af84b7c12e..82f06aa89d30e1feebf26687bbc544d31e31c4ff 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp @@ -124,9 +124,7 @@ void IndirectDataAnalysis::loadSettings() { /** * Sets the active workspace in the selected tab */ -void IndirectDataAnalysis::tabChanged(int index) { - m_tabs[index]->setActiveWorkspace(); -} +void IndirectDataAnalysis::tabChanged(int index) {} std::string IndirectDataAnalysis::documentationPage() const { return "Indirect Data Analysis"; diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h index 30abd378afc2f81c5cd5a326452a54be4539c725..2b34cec3e484f258d0bba8f68c16cd75b1c4f704 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h +++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h @@ -30,20 +30,20 @@ enum IDATabChoice { ELWIN, MSD_FIT, IQT, IQT_FIT, CONV_FIT, JUMP_FIT }; static const unsigned int NUM_DECIMALS = 6; // Forward Declaration -class IndirectDataAnalysisTabLegacy; +class IndirectDataAnalysisTab; /** * The IndirectDataAnalysis class is the main class that handles the interface *and controls * its tabs. * - * Is a friend to the IndirectDataAnalysisTabLegacy class. + * Is a friend to the IndirectDataAnalysisTab class. */ class IndirectDataAnalysis : public IndirectInterface { Q_OBJECT - /// Allow IndirectDataAnalysisTabLegacy to have access. - friend class IndirectDataAnalysisTabLegacy; + /// Allow IndirectDataAnalysisTab to have access. + friend class IndirectDataAnalysisTab; public: /// The name of the interface as registered into the factory @@ -93,7 +93,7 @@ private: m_changeObserver; /// Map of unsigned int (TabChoice enum values) to tabs. - std::map<unsigned int, IndirectDataAnalysisTabLegacy *> m_tabs; + std::map<unsigned int, IndirectDataAnalysisTab *> m_tabs; }; } // namespace IDA } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h index 06412a089f6258eb22dfa9a9b5b1d680e0501fbc..3dfc281d8ccac58068649dbcc9696dcfd17a1e93 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h +++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_IDATAB_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_IDATAB_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_IDATABLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_IDATABLEGACY_H_ #include "IndirectDataAnalysis.h" #include "IndirectPlotOptionsPresenter.h" @@ -162,6 +162,7 @@ private: /// Overidden by child class. virtual void loadSettings(const QSettings &settings) = 0; virtual void setFileExtensionsByName(bool filter) = 0; + virtual void setBrowserWorkspace() {}; /// A pointer to the parent (friend) IndirectDataAnalysis object. IndirectDataAnalysis *m_parent; @@ -177,4 +178,4 @@ private: } // namespace CustomInterfaces } // namespace MantidQt -#endif /* MANTIDQTCUSTOMINTERFACESIDA_IDATAB_H_ */ +#endif /* MANTIDQTCUSTOMINTERFACESIDA_IDATABLEGACY_H_ */ diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.cpp index 3502dfc81cac24d57cc758925d91e64242bc16e6..15c8096f5bd80e80cda9df0184d5789f81c20a06 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.cpp @@ -4,7 +4,7 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#include "IndirectDataAnalysisTabLegacy.h" +#include "IndirectDataAnalysisTab.h" #include "MantidAPI/AnalysisDataService.h" #include "MantidAPI/FunctionDomain1D.h" @@ -28,7 +28,7 @@ namespace IDA { * * @param parent :: the parent widget (an IndirectDataAnalysis object). */ -IndirectDataAnalysisTabLegacy::IndirectDataAnalysisTabLegacy(QWidget *parent) +IndirectDataAnalysisTab::IndirectDataAnalysisTab(QWidget *parent) : IndirectTab(parent), m_dblEdFac(nullptr), m_blnEdFac(nullptr), m_parent(nullptr), m_inputWorkspace(), m_previewPlotWorkspace(), m_selectedSpectrum(0), m_minSpectrum(0), m_maxSpectrum(0) { @@ -39,17 +39,17 @@ IndirectDataAnalysisTabLegacy::IndirectDataAnalysisTabLegacy(QWidget *parent) m_blnEdFac = new QtCheckBoxFactory(this); } -void IndirectDataAnalysisTabLegacy::setOutputPlotOptionsPresenter( +void IndirectDataAnalysisTab::setOutputPlotOptionsPresenter( std::unique_ptr<IndirectPlotOptionsPresenter> presenter) { m_plotOptionsPresenter = std::move(presenter); } -void IndirectDataAnalysisTabLegacy::setOutputPlotOptionsWorkspaces( +void IndirectDataAnalysisTab::setOutputPlotOptionsWorkspaces( std::vector<std::string> const &outputWorkspaces) { m_plotOptionsPresenter->setWorkspaces(outputWorkspaces); } -void IndirectDataAnalysisTabLegacy::clearOutputPlotOptionsWorkspaces() { +void IndirectDataAnalysisTab::clearOutputPlotOptionsWorkspaces() { m_plotOptionsPresenter->clearWorkspaces(); } @@ -60,7 +60,7 @@ void IndirectDataAnalysisTabLegacy::clearOutputPlotOptionsWorkspaces() { * * @param settings :: the QSettings object from which to load */ -void IndirectDataAnalysisTabLegacy::loadTabSettings(const QSettings &settings) { +void IndirectDataAnalysisTab::loadTabSettings(const QSettings &settings) { loadSettings(settings); } @@ -69,26 +69,26 @@ void IndirectDataAnalysisTabLegacy::loadTabSettings(const QSettings &settings) { * * @param filter :: true if you want to allow filtering */ -void IndirectDataAnalysisTabLegacy::filterInputData(bool filter) { +void IndirectDataAnalysisTab::filterInputData(bool filter) { setFileExtensionsByName(filter); } /** * Sets the active browser workspace when the tab is changed */ -void IndirectDataAnalysisTabLegacy::setActiveWorkspace() { setBrowserWorkspace(); } +void IndirectDataAnalysisTab::setActiveWorkspace() { setBrowserWorkspace(); } /** * Slot that can be called when a user edits an input. */ -void IndirectDataAnalysisTabLegacy::inputChanged() { validate(); } +void IndirectDataAnalysisTab::inputChanged() { validate(); } /** * Retrieves the input workspace to be used in data analysis. * * @return The input workspace to be used in data analysis. */ -MatrixWorkspace_sptr IndirectDataAnalysisTabLegacy::inputWorkspace() const { +MatrixWorkspace_sptr IndirectDataAnalysisTab::inputWorkspace() const { return m_inputWorkspace; } @@ -97,7 +97,7 @@ MatrixWorkspace_sptr IndirectDataAnalysisTabLegacy::inputWorkspace() const { * * @param inputWorkspace The workspace to set. */ -void IndirectDataAnalysisTabLegacy::setInputWorkspace( +void IndirectDataAnalysisTab::setInputWorkspace( MatrixWorkspace_sptr inputWorkspace) { m_inputWorkspace = inputWorkspace; } @@ -109,7 +109,7 @@ void IndirectDataAnalysisTabLegacy::setInputWorkspace( * @return The workspace containing the data to be displayed in * the preview plot. */ -MatrixWorkspace_sptr IndirectDataAnalysisTabLegacy::previewPlotWorkspace() { +MatrixWorkspace_sptr IndirectDataAnalysisTab::previewPlotWorkspace() { return m_previewPlotWorkspace.lock(); } @@ -119,7 +119,7 @@ MatrixWorkspace_sptr IndirectDataAnalysisTabLegacy::previewPlotWorkspace() { * * @param previewPlotWorkspace The workspace to set. */ -void IndirectDataAnalysisTabLegacy::setPreviewPlotWorkspace( +void IndirectDataAnalysisTab::setPreviewPlotWorkspace( MatrixWorkspace_sptr previewPlotWorkspace) { m_previewPlotWorkspace = previewPlotWorkspace; } @@ -129,7 +129,7 @@ void IndirectDataAnalysisTabLegacy::setPreviewPlotWorkspace( * * @return The selected spectrum. */ -int IndirectDataAnalysisTabLegacy::selectedSpectrum() const { +int IndirectDataAnalysisTab::selectedSpectrum() const { return m_selectedSpectrum; } @@ -138,7 +138,7 @@ int IndirectDataAnalysisTabLegacy::selectedSpectrum() const { * * @param spectrum The spectrum to set. */ -void IndirectDataAnalysisTabLegacy::setSelectedSpectrum(int spectrum) { +void IndirectDataAnalysisTab::setSelectedSpectrum(int spectrum) { m_selectedSpectrum = spectrum; } @@ -147,14 +147,14 @@ void IndirectDataAnalysisTabLegacy::setSelectedSpectrum(int spectrum) { * * @return The selected minimum spectrum. */ -int IndirectDataAnalysisTabLegacy::minimumSpectrum() const { return m_minSpectrum; } +int IndirectDataAnalysisTab::minimumSpectrum() const { return m_minSpectrum; } /** * Sets the selected spectrum. * * @param spectrum The spectrum to set. */ -void IndirectDataAnalysisTabLegacy::setMinimumSpectrum(int spectrum) { +void IndirectDataAnalysisTab::setMinimumSpectrum(int spectrum) { m_minSpectrum = spectrum; } @@ -163,14 +163,14 @@ void IndirectDataAnalysisTabLegacy::setMinimumSpectrum(int spectrum) { * * @return The selected maximum spectrum. */ -int IndirectDataAnalysisTabLegacy::maximumSpectrum() const { return m_maxSpectrum; } +int IndirectDataAnalysisTab::maximumSpectrum() const { return m_maxSpectrum; } /** * Sets the selected maximum spectrum. * * @param spectrum The spectrum to set. */ -void IndirectDataAnalysisTabLegacy::setMaximumSpectrum(int spectrum) { +void IndirectDataAnalysisTab::setMaximumSpectrum(int spectrum) { m_maxSpectrum = spectrum; } @@ -178,7 +178,7 @@ void IndirectDataAnalysisTabLegacy::setMaximumSpectrum(int spectrum) { * Plots the current preview workspace, if none is set, plots * the selected spectrum of the current input workspace. */ -void IndirectDataAnalysisTabLegacy::plotCurrentPreview() { +void IndirectDataAnalysisTab::plotCurrentPreview() { auto previewWs = previewPlotWorkspace(); auto inputWs = inputWorkspace(); auto index = boost::numeric_cast<size_t>(m_selectedSpectrum); @@ -204,7 +204,7 @@ void IndirectDataAnalysisTabLegacy::plotCurrentPreview() { * @param previewPlot The preview plot widget in which to plot the input * input workspace. */ -void IndirectDataAnalysisTabLegacy::plotInput( +void IndirectDataAnalysisTab::plotInput( MantidQt::MantidWidgets::PreviewPlot *previewPlot) { previewPlot->clear(); auto inputWS = inputWorkspace(); @@ -221,7 +221,7 @@ void IndirectDataAnalysisTabLegacy::plotInput( * @param fitPreviewPlot The fit preview plot. * @param diffPreviewPlot The difference preview plot. */ -void IndirectDataAnalysisTabLegacy::clearAndPlotInput( +void IndirectDataAnalysisTab::clearAndPlotInput( MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot, MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) { m_previewPlotWorkspace.reset(); @@ -240,7 +240,7 @@ void IndirectDataAnalysisTabLegacy::clearAndPlotInput( * @param fitPreviewPlot The fit preview plot. * @param diffPreviewPlot The difference preview plot. */ -void IndirectDataAnalysisTabLegacy::updatePlot( +void IndirectDataAnalysisTab::updatePlot( const std::string &outputWSName, size_t index, MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot, MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) { @@ -268,7 +268,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot( * @param fitPreviewPlot The fit preview plot. * @param diffPreviewPlot The difference preview plot. */ -void IndirectDataAnalysisTabLegacy::updatePlot( +void IndirectDataAnalysisTab::updatePlot( WorkspaceGroup_sptr outputWS, size_t index, MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot, MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) { @@ -291,7 +291,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot( * @param fitPreviewPlot The fit preview plot. * @param diffPreviewPlot The difference preview plot. */ -void IndirectDataAnalysisTabLegacy::updatePlot( +void IndirectDataAnalysisTab::updatePlot( const std::string &workspaceName, MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot, MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) { @@ -324,7 +324,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot( * @param fitPreviewPlot The fit preview plot. * @param diffPreviewPlot The difference preview plot. */ -void IndirectDataAnalysisTabLegacy::updatePlot( +void IndirectDataAnalysisTab::updatePlot( WorkspaceGroup_sptr outputWS, MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot, MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) { @@ -345,7 +345,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot( * @param fitPreviewPlot The fit preview plot. * @param diffPreviewPlot The difference preview plot. */ -void IndirectDataAnalysisTabLegacy::updatePlot( +void IndirectDataAnalysisTab::updatePlot( MatrixWorkspace_sptr outputWS, MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot, MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) { @@ -373,7 +373,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot( * @parma endRangePropName The name of the property specifying the end * value for the range. */ -void IndirectDataAnalysisTabLegacy::updatePlotRange( +void IndirectDataAnalysisTab::updatePlotRange( const QString &rangeName, MantidQt::MantidWidgets::PreviewPlot *previewPlot, const QString &startRangePropName, const QString &endRangePropName) { diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.h b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.h index 537d36600d5caad18b24d1692ed222aae3a9cb5b..65441f668dfaffba7014473dc7e0e402e6527d8f 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.h @@ -53,12 +53,12 @@ class RangeSelector; namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class DLLExport IndirectDataAnalysisTabLegacy : public IndirectTab { +class DLLExport IndirectDataAnalysisTab : public IndirectTab { Q_OBJECT public: /// Constructor - IndirectDataAnalysisTabLegacy(QWidget *parent = nullptr); + IndirectDataAnalysisTab(QWidget *parent = nullptr); /// Set the presenter for the output plotting options void setOutputPlotOptionsPresenter( diff --git a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.cpp index f691570a8e67a96e7331a6593fde2b1f9abdc1e1..e1b8f2f64f72c3952f6ee3d329e0c3aa5d25c5c7 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.cpp @@ -16,7 +16,7 @@ #include <QRegExpValidator> namespace { -using MantidQt::CustomInterfaces::IDA::Spectra; +using MantidQt::CustomInterfaces::IDA::SpectraNew; using MantidQt::CustomInterfaces::IDA::WorkspaceIndex; namespace Regexes { @@ -84,13 +84,13 @@ std::string pairsToString( return boost::algorithm::join(pairStrings, ","); } -boost::optional<Spectra> pairsToSpectra( +boost::optional<SpectraNew> pairsToSpectra( const std::vector<std::pair<WorkspaceIndex, WorkspaceIndex>> &pairs) { if (pairs.empty()) return boost::none; else if (pairs.size() == 1) - return Spectra(pairs[0].first, pairs[0].second); - return Spectra(pairsToString(pairs)); + return SpectraNew(pairs[0].first, pairs[0].second); + return SpectraNew(pairsToString(pairs)); } QVariant getVariant(std::size_t i) { @@ -202,14 +202,14 @@ IndirectDataTablePresenter::getDataIndex(SpectrumRowIndex row) const { m_dataTable->item(row.value, 0)->data(Qt::UserRole).toInt()}; } -boost::optional<Spectra> +boost::optional<SpectraNew> IndirectDataTablePresenter::getSpectra(DatasetIndex dataIndex) const { if (m_dataPositions.size() > dataIndex) return getSpectra(m_dataPositions[dataIndex], getNextPosition(dataIndex)); return boost::none; } -boost::optional<Spectra> +boost::optional<SpectraNew> IndirectDataTablePresenter::getSpectra(SpectrumRowIndex start, SpectrumRowIndex end) const { std::vector<std::pair<WorkspaceIndex, WorkspaceIndex>> spectraPairs; diff --git a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.h b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.h index d9d8ea7a24e623899cc734b15d6225aa56b1cbf0..df7ebf9f3d4201057c6a7b23b58714f0d710ce25 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.h +++ b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.h @@ -96,8 +96,8 @@ private: QString getText(SpectrumRowIndex row, int column) const; SpectrumRowIndex getNextPosition(DatasetIndex index) const; DatasetIndex getDataIndex(SpectrumRowIndex row) const; - boost::optional<Spectra> getSpectra(DatasetIndex dataIndex) const; - boost::optional<Spectra> getSpectra(SpectrumRowIndex start, + boost::optional<SpectraNew> getSpectra(DatasetIndex dataIndex) const; + boost::optional<SpectraNew> getSpectra(SpectrumRowIndex start, SpectrumRowIndex end) const; boost::optional<SpectrumRowIndex> getRowIndex(DatasetIndex dataIndex, WorkspaceIndex spectrumIndex) const; diff --git a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.cpp index ed18dd84d3dcabdfeae9af0ed3253c76f19105a1..1afdd2d586f87a9fda06ad6e79cecf16a48623bc 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.cpp @@ -227,7 +227,7 @@ IndirectDataTablePresenterLegacy::getRowIndex(std::size_t dataIndex, void IndirectDataTablePresenterLegacy::setStartX(double startX, std::size_t dataIndex, int spectrumIndex) { - if (FittingMode::SEQUENTIAL == m_model->getFittingMode()) + if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode()) setStartX(startX); else if (auto row = getRowIndex(dataIndex, spectrumIndex)) setStartX(startX, *row); @@ -235,7 +235,7 @@ void IndirectDataTablePresenterLegacy::setStartX(double startX, std::size_t data void IndirectDataTablePresenterLegacy::setEndX(double endX, std::size_t dataIndex, int spectrumIndex) { - if (FittingMode::SEQUENTIAL == m_model->getFittingMode()) + if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode()) setEndX(endX); else if (auto row = getRowIndex(dataIndex, spectrumIndex)) setEndX(endX, *row); @@ -244,7 +244,7 @@ void IndirectDataTablePresenterLegacy::setEndX(double endX, std::size_t dataInde void IndirectDataTablePresenterLegacy::setExclude(const std::string &exclude, std::size_t dataIndex, int spectrumIndex) { - if (FittingMode::SEQUENTIAL == m_model->getFittingMode()) + if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode()) setExcludeRegion(exclude); else if (auto row = getRowIndex(dataIndex, spectrumIndex)) setExcludeRegion(exclude, *row); @@ -449,7 +449,7 @@ void IndirectDataTablePresenterLegacy::clearTable() { void IndirectDataTablePresenterLegacy::setStartX(double startX, int index) { MantidQt::API::SignalBlocker blocker(m_dataTable); - if (FittingMode::SEQUENTIAL == m_model->getFittingMode()) + if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode()) setStartX(startX); else m_dataTable->item(index, startXColumn())->setText(makeNumber(startX)); @@ -457,7 +457,7 @@ void IndirectDataTablePresenterLegacy::setStartX(double startX, int index) { void IndirectDataTablePresenterLegacy::setEndX(double endX, int index) { MantidQt::API::SignalBlocker blocker(m_dataTable); - if (FittingMode::SEQUENTIAL == m_model->getFittingMode()) + if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode()) setEndX(endX); else m_dataTable->item(index, endXColumn())->setText(makeNumber(endX)); @@ -466,7 +466,7 @@ void IndirectDataTablePresenterLegacy::setEndX(double endX, int index) { void IndirectDataTablePresenterLegacy::setExcludeRegion(const std::string &exclude, int index) { MantidQt::API::SignalBlocker blocker(m_dataTable); - if (FittingMode::SEQUENTIAL == m_model->getFittingMode()) + if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode()) setExcludeRegion(exclude); else m_dataTable->item(index, excludeColumn()) diff --git a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.h b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.h index 81faae68bcbf022e0541fb1db14527976ca1c72d..95394fbd5b851b291fb22879fafaa14f235bd803 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTER_H_ -#define MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTER_H_ +#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTERLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTERLEGACY_H_ #include "IndirectFittingModelLegacy.h" @@ -128,4 +128,4 @@ private: } // namespace CustomInterfaces } // namespace MantidQt -#endif /* MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTER_H_ */ +#endif /* MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTERLEGACY_H_ */ diff --git a/qt/scientific_interfaces/Indirect/IndirectDiffractionReduction.ui b/qt/scientific_interfaces/Indirect/IndirectDiffractionReduction.ui index 93b8ff28b34d84ae1309da955d3bf1115f849d66..1b670a197e3b1861571b29887649bea35fd2959a 100644 --- a/qt/scientific_interfaces/Indirect/IndirectDiffractionReduction.ui +++ b/qt/scientific_interfaces/Indirect/IndirectDiffractionReduction.ui @@ -105,7 +105,7 @@ <item row="2" column="0"> <widget class="QLabel" name="lbSpecMin"> <property name="text"> - <string>Spectra Min:</string> + <string>SpectraNew Min:</string> </property> </widget> </item> @@ -129,7 +129,7 @@ <item row="4" column="0"> <widget class="QLabel" name="lbSpecMax"> <property name="text"> - <string>Spectra Max:</string> + <string>SpectraNew Max:</string> </property> </widget> </item> diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp index 769d64b152ba1bfbb0596c57880a52d5036b7824..2641582e140eb98b5308b82ec8ff043cb646ad3b 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp @@ -6,7 +6,7 @@ // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectFitAnalysisTab.h" // #include "ui_ConvFit.h" -// #include "ui_IqtFit.h" +#include "ui_IqtFit.h" // #include "ui_JumpFit.h" // #include "ui_MSDFit.h" @@ -39,7 +39,7 @@ WorkspaceGroup_sptr getADSGroupWorkspace(std::string const &workspaceName) { // void updateParameters( // IFunction_sptr function, -// std::unordered_map<std::string, ParameterValue> const ¶meters) { +// std::unordered_map<std::string, ParameterValueNew> const ¶meters) { // if (!function) // return; // for (auto i = 0u; i < function->nParams(); ++i) { @@ -400,7 +400,7 @@ void IndirectFitAnalysisTab::updateParameterValues() { * @param parameters The parameter values to update the browser with. */ void IndirectFitAnalysisTab::updateParameterValues( - const std::unordered_map<std::string, ParameterValue> &) { + const std::unordered_map<std::string, ParameterValueNew> &) { try { updateFitBrowserParameterValues(); } catch (const std::out_of_range &) { diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h index 7a8ef93930ee5bd089a74a542ea8fd5ae508a85a..52b8e2305432c8c5577fde135d3129bee419f67f 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h @@ -101,7 +101,7 @@ protected slots: void executeFit(); void updateParameterValues(); void updateParameterValues( - const std::unordered_map<std::string, ParameterValue> ¶meters); + const std::unordered_map<std::string, ParameterValueNew> ¶meters); void updateFitBrowserParameterValues(); void updateDataReferences(); void updateResultOptions(); diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.cpp index e8be125e15579ea72ee5a4a46b89300989b76531..51191cb78ac1f0f959f59bee121f453c7e84c960 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.cpp @@ -6,7 +6,7 @@ // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectFitAnalysisTabLegacy.h" #include "ui_ConvFit.h" -#include "ui_IqtFit.h" +// #include "ui_IqtFit.h" #include "ui_JumpFit.h" #include "ui_MSDFit.h" @@ -67,7 +67,7 @@ namespace IDA { IndirectFitAnalysisTabLegacy::IndirectFitAnalysisTabLegacy(IndirectFittingModelLegacy *model, QWidget *parent) - : IndirectDataAnalysisTabLegacy(parent), m_fittingModel(model) {} + : IndirectDataAnalysisTab(parent), m_fittingModel(model) {} void IndirectFitAnalysisTabLegacy::setup() { setupFitTab(); @@ -353,7 +353,7 @@ std::size_t IndirectFitAnalysisTabLegacy::getSelectedSpectrum() const { bool IndirectFitAnalysisTabLegacy::isRangeCurrentlySelected( std::size_t dataIndex, std::size_t spectrum) const { - return FittingMode::SEQUENTIAL == m_fittingModel->getFittingMode() || + return FittingModeLegacy::SEQUENTIAL == m_fittingModel->getFittingMode() || m_plotPresenter->isCurrentlySelected(dataIndex, spectrum); } diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.h index 0b87d7194619650285efdc1aacd17d5d238b9d72..2e10b1a1a2efc9a993d4a543d14d6359645c428a 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.h @@ -4,10 +4,10 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_IFATAB_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_IFATAB_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_IFATABLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_IFATABLEGACY_H_ -#include "IndirectDataAnalysisTabLegacy.h" +#include "IndirectDataAnalysisTab.h" #include "IndirectFitDataPresenterLegacy.h" #include "IndirectFitOutputOptionsPresenter.h" #include "IndirectFitOutputOptionsView.h" @@ -29,7 +29,7 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class DLLExport IndirectFitAnalysisTabLegacy : public IndirectDataAnalysisTabLegacy { +class DLLExport IndirectFitAnalysisTabLegacy : public IndirectDataAnalysisTab { Q_OBJECT public: @@ -240,4 +240,4 @@ private: } // namespace CustomInterfaces } // namespace MantidQt -#endif /* MANTIDQTCUSTOMINTERFACESIDA_IFATAB_H_ */ +#endif /* MANTIDQTCUSTOMINTERFACESIDA_IFATABLEGACY_H_ */ diff --git a/qt/scientific_interfaces/Indirect/IndirectFitData.cpp b/qt/scientific_interfaces/Indirect/IndirectFitData.cpp index 43be3e3af57eefd6b18c08b1935ddad61d0f6ad7..eef0e210e9296905c0078ebb6e4c87ef1505b5fa 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitData.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFitData.cpp @@ -148,7 +148,7 @@ std::string createExcludeRegionString(std::string regionString) { std::vector<MantidQt::CustomInterfaces::IDA::WorkspaceIndex> workspaceIndexVectorFromString(const std::string &listString) { - auto const intVec = vectorFromString<int>(listString); + auto const intVec = vectorFromStringNew<int>(listString); std::vector<MantidQt::CustomInterfaces::IDA::WorkspaceIndex> output; for (auto const i : intVec) { output.push_back(MantidQt::CustomInterfaces::IDA::WorkspaceIndex{i}); @@ -162,12 +162,12 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { -Spectra::Spectra(const std::string &str) +SpectraNew::SpectraNew(const std::string &str) : m_vec(workspaceIndexVectorFromString(str)), m_isContinuous(true) { checkContinuous(); } -Spectra::Spectra(WorkspaceIndex minimum, WorkspaceIndex maximum) { +SpectraNew::SpectraNew(WorkspaceIndex minimum, WorkspaceIndex maximum) { if (maximum < minimum) { std::swap(minimum, maximum); } @@ -175,32 +175,32 @@ Spectra::Spectra(WorkspaceIndex minimum, WorkspaceIndex maximum) { std::iota(m_vec.begin(), m_vec.end(), minimum); } -Spectra::Spectra(const Spectra &vec) +SpectraNew::SpectraNew(const SpectraNew &vec) : m_vec(vec.m_vec), m_isContinuous(vec.m_isContinuous) {} -Spectra::Spectra(Spectra &&vec) +SpectraNew::SpectraNew(SpectraNew &&vec) : m_vec(std::move(vec.m_vec)), m_isContinuous(std::move(vec.m_isContinuous)) {} -Spectra &Spectra::operator=(const Spectra &vec) { +SpectraNew &SpectraNew::operator=(const SpectraNew &vec) { m_vec = vec.m_vec; m_isContinuous = vec.m_isContinuous; return *this; } -Spectra &Spectra::operator=(Spectra &&vec) { +SpectraNew &SpectraNew::operator=(SpectraNew &&vec) { m_vec = std::move(vec.m_vec); m_isContinuous = std::move(vec.m_isContinuous); return *this; } -bool Spectra::empty() const { return m_vec.empty(); } +bool SpectraNew::empty() const { return m_vec.empty(); } -SpectrumRowIndex Spectra::size() const { +SpectrumRowIndex SpectraNew::size() const { return SpectrumRowIndex{static_cast<int>(m_vec.size())}; } -std::string Spectra::getString() const { +std::string SpectraNew::getString() const { if (empty()) return ""; if (m_isContinuous) @@ -213,19 +213,19 @@ std::string Spectra::getString() const { return Mantid::Kernel::Strings::toString(out); } -std::pair<WorkspaceIndex, WorkspaceIndex> Spectra::getMinMax() const { +std::pair<WorkspaceIndex, WorkspaceIndex> SpectraNew::getMinMax() const { if (empty()) return std::make_pair(WorkspaceIndex{0}, WorkspaceIndex{0}); return std::make_pair(m_vec.front(), m_vec.back()); } -bool Spectra::operator==(Spectra const &spec) const { +bool SpectraNew::operator==(SpectraNew const &spec) const { return this->getString() == spec.getString(); } -bool Spectra::isContinuous() const { return m_isContinuous; } +bool SpectraNew::isContinuous() const { return m_isContinuous; } -SpectrumRowIndex Spectra::indexOf(WorkspaceIndex i) const { +SpectrumRowIndex SpectraNew::indexOf(WorkspaceIndex i) const { auto const it = std::find(begin(), end(), i); if (it == end()) { throw std::runtime_error("Spectrum index " + std::to_string(i.value) + @@ -234,18 +234,18 @@ SpectrumRowIndex Spectra::indexOf(WorkspaceIndex i) const { return SpectrumRowIndex{static_cast<int>(std::distance(begin(), it))}; } -Spectra Spectra::combine(const Spectra &other) const { +SpectraNew SpectraNew::combine(const SpectraNew &other) const { std::set<WorkspaceIndex> indices(begin(), end()); indices.insert(other.begin(), other.end()); - return Spectra(indices); + return SpectraNew(indices); } -Spectra::Spectra(const std::set<WorkspaceIndex> &indices) +SpectraNew::SpectraNew(const std::set<WorkspaceIndex> &indices) : m_vec(indices.begin(), indices.end()) { checkContinuous(); } -void Spectra::checkContinuous() { +void SpectraNew::checkContinuous() { m_isContinuous = true; if (m_vec.size() > 1) { for (size_t i = 1; i < m_vec.size(); ++i) { @@ -258,8 +258,8 @@ void Spectra::checkContinuous() { } IndirectFitData::IndirectFitData(MatrixWorkspace_sptr workspace, - const Spectra &spectra) - : m_workspace(workspace), m_spectra(Spectra("")) { + const SpectraNew &spectra) + : m_workspace(workspace), m_spectra(SpectraNew("")) { setSpectra(spectra); auto const range = !spectra.empty() ? getBinRange(workspace) : std::make_pair(0.0, 0.0); @@ -300,7 +300,7 @@ Mantid::API::MatrixWorkspace_sptr IndirectFitData::workspace() const { return m_workspace; } -const Spectra &IndirectFitData::spectra() const { return m_spectra; } +const SpectraNew &IndirectFitData::spectra() const { return m_spectra; } WorkspaceIndex IndirectFitData::getSpectrum(SpectrumRowIndex index) const { return m_spectra[index]; @@ -338,30 +338,30 @@ std::string IndirectFitData::getExcludeRegion(WorkspaceIndex spectrum) const { std::vector<double> IndirectFitData::excludeRegionsVector(WorkspaceIndex spectrum) const { - return vectorFromString<double>(getExcludeRegion(spectrum)); + return vectorFromStringNew<double>(getExcludeRegion(spectrum)); } void IndirectFitData::setSpectra(std::string const &spectra) { try { - const Spectra spec = Spectra(createSpectraString(spectra)); + const SpectraNew spec = SpectraNew(createSpectraString(spectra)); setSpectra(spec); } catch (std::exception &ex) { - throw std::runtime_error("Spectra too large for cast: " + + throw std::runtime_error("SpectraNew too large for cast: " + std::string(ex.what())); } } -void IndirectFitData::setSpectra(Spectra &&spectra) { +void IndirectFitData::setSpectra(SpectraNew &&spectra) { validateSpectra(spectra); m_spectra = std::move(spectra); } -void IndirectFitData::setSpectra(Spectra const &spectra) { +void IndirectFitData::setSpectra(SpectraNew const &spectra) { validateSpectra(spectra); m_spectra = spectra; } -void IndirectFitData::validateSpectra(Spectra const &spectra) { +void IndirectFitData::validateSpectra(SpectraNew const &spectra) { int maxValue = static_cast<int>(workspace()->getNumberHistograms()) - 1; std::vector<int> notInRange; for (auto const i : spectra) { @@ -370,9 +370,9 @@ void IndirectFitData::validateSpectra(Spectra const &spectra) { } if (!notInRange.empty()) { if (notInRange.size() > 5) - throw std::runtime_error("Spectra out of range: " + + throw std::runtime_error("SpectraNew out of range: " + join(subvector(notInRange, 0, 5), ",") + "..."); - throw std::runtime_error("Spectra out of range: " + join(notInRange, ",")); + throw std::runtime_error("SpectraNew out of range: " + join(notInRange, ",")); } } diff --git a/qt/scientific_interfaces/Indirect/IndirectFitData.h b/qt/scientific_interfaces/Indirect/IndirectFitData.h index 945133b83e732a04178845d90fbd1a0a467fe501..3875f96b741fb9e79b7627104e3b0b528372b2cd 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitData.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitData.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATA_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATA_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATALEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATALEGACY_H_ #include "DllConfig.h" #include "IndexTypes.h" @@ -30,14 +30,14 @@ namespace IDA { * * Holds a string and vector representation. */ -class MANTIDQT_INDIRECT_DLL Spectra { +class MANTIDQT_INDIRECT_DLL SpectraNew { public: - explicit Spectra(const std::string &str); - Spectra(WorkspaceIndex minimum, WorkspaceIndex maximum); - Spectra(const Spectra &vec); - Spectra(Spectra &&vec); - Spectra &operator=(const Spectra &vec); - Spectra &operator=(Spectra &&vec); + explicit SpectraNew(const std::string &str); + SpectraNew(WorkspaceIndex minimum, WorkspaceIndex maximum); + SpectraNew(const SpectraNew &vec); + SpectraNew(SpectraNew &&vec); + SpectraNew &operator=(const SpectraNew &vec); + SpectraNew &operator=(SpectraNew &&vec); bool empty() const; SpectrumRowIndex size() const; std::string getString() const; @@ -55,22 +55,22 @@ public: const WorkspaceIndex &operator[](SpectrumRowIndex index) const { return m_vec[index.value]; } - bool operator==(Spectra const &spec) const; + bool operator==(SpectraNew const &spec) const; bool isContinuous() const; SpectrumRowIndex indexOf(WorkspaceIndex i) const; - Spectra combine(const Spectra &other) const; + SpectraNew combine(const SpectraNew &other) const; private: - explicit Spectra(const std::set<WorkspaceIndex> &indices); + explicit SpectraNew(const std::set<WorkspaceIndex> &indices); void checkContinuous(); std::vector<WorkspaceIndex> m_vec; bool m_isContinuous; }; -template <typename F> struct ApplySpectra { - explicit ApplySpectra(F &&functor) : m_functor(std::forward<F>(functor)) {} +template <typename F> struct ApplySpectraNew { + explicit ApplySpectraNew(F &&functor) : m_functor(std::forward<F>(functor)) {} - void operator()(const Spectra &spectra) const { + void operator()(const SpectraNew &spectra) const { for (const auto &spectrum : spectra) m_functor(spectrum); } @@ -79,11 +79,11 @@ private: F m_functor; }; -template <typename F> struct ApplyEnumeratedSpectra { - ApplyEnumeratedSpectra(F &&functor, WorkspaceIndex start = WorkspaceIndex{0}) +template <typename F> struct ApplyEnumeratedSpectraNew { + ApplyEnumeratedSpectraNew(F &&functor, WorkspaceIndex start = WorkspaceIndex{0}) : m_start(start), m_functor(std::forward<F>(functor)) {} - WorkspaceIndex operator()(const Spectra &spectra) const { + WorkspaceIndex operator()(const SpectraNew &spectra) const { auto i = m_start; for (const auto &spectrum : spectra) m_functor(i++, spectrum); @@ -96,7 +96,7 @@ private: }; template <class T> -std::vector<T> vectorFromString(const std::string &listString) { +std::vector<T> vectorFromStringNew(const std::string &listString) { try { return Mantid::Kernel::ArrayProperty<T>("vector", listString); } catch (const std::runtime_error &) { @@ -112,7 +112,7 @@ std::vector<T> vectorFromString(const std::string &listString) { class MANTIDQT_INDIRECT_DLL IndirectFitData { public: IndirectFitData(Mantid::API::MatrixWorkspace_sptr workspace, - const Spectra &spectra); + const SpectraNew &spectra); std::string displayName(const std::string &formatString, const std::string &rangeDelimiter) const; @@ -121,7 +121,7 @@ public: std::string getBasename() const; Mantid::API::MatrixWorkspace_sptr workspace() const; - const Spectra &spectra() const; + const SpectraNew &spectra() const; WorkspaceIndex getSpectrum(SpectrumRowIndex index) const; SpectrumRowIndex numberOfSpectra() const; bool zeroSpectra() const; @@ -132,20 +132,20 @@ public: std::vector<double> excludeRegionsVector(WorkspaceIndex spectrum) const; template <typename F> void applySpectra(F &&functor) const { - ApplySpectra<F>(std::forward<F>(functor))(m_spectra); + ApplySpectraNew<F>(std::forward<F>(functor))(m_spectra); } template <typename F> WorkspaceIndex applyEnumeratedSpectra(F &&functor, WorkspaceIndex start = WorkspaceIndex{0}) const { - return ApplyEnumeratedSpectra<F>(std::forward<F>(functor), + return ApplyEnumeratedSpectraNew<F>(std::forward<F>(functor), start)(m_spectra); } void setSpectra(std::string const &spectra); - void setSpectra(Spectra &&spectra); - void setSpectra(Spectra const &spectra); + void setSpectra(SpectraNew &&spectra); + void setSpectra(SpectraNew const &spectra); void setStartX(double const &startX, WorkspaceIndex const &index); void setStartX(double const &startX); void setEndX(double const &endX, WorkspaceIndex const &spectrum); @@ -154,10 +154,10 @@ public: WorkspaceIndex const &spectrum); private: - void validateSpectra(Spectra const &spectra); + void validateSpectra(SpectraNew const &spectra); Mantid::API::MatrixWorkspace_sptr m_workspace; - Spectra m_spectra; + SpectraNew m_spectra; std::map<WorkspaceIndex, std::string> m_excludeRegions; std::map<WorkspaceIndex, std::pair<double, double>> m_ranges; }; diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataPresenterLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitDataPresenterLegacy.h index acce49e6ef314279a6db7974ac4365ba69e8863a..4847111953b22efbcca55b9a4e6ff70cbcb40a44 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitDataPresenterLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitDataPresenterLegacy.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTER_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTER_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTERLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTERLEGACY_H_ #include "IAddWorkspaceDialog.h" #include "IIndirectFitDataViewLegacy.h" @@ -113,4 +113,4 @@ private: } // namespace CustomInterfaces } // namespace MantidQt -#endif /* MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTER_H_ */ +#endif /* MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTERLEGACY_H_ */ diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h index 0906007c4ad5ad980e109ee199a16e91138b946c..d390ceeafff6750f3a8e1b0b6dcb6514cc98d3c3 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEW_H_ -#define MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEW_H_ +#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEWLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEWLEGACY_H_ #include "ui_IndirectFitDataView.h" diff --git a/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp b/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp index 75e3b7b43d83e3a00b67e35899e189169d102950..0d734ebe3cdbdd0319171850c5f0a9410318bb0b 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp @@ -28,14 +28,14 @@ struct TableRowExtractor { m_columns.begin(); } - std::unordered_map<std::string, ParameterValue> + std::unordered_map<std::string, ParameterValueNew> operator()(IDAWorkspaceIndex index) { TableRow row = m_table->getRow(index.value); - std::unordered_map<std::string, ParameterValue> parameters; + std::unordered_map<std::string, ParameterValueNew> parameters; for (auto i = 1u; i < m_chiIndex; i += 2) { const auto &columnName = m_columns[i]; - parameters[columnName] = ParameterValue(row.Double(i), row.Double(i + 1)); + parameters[columnName] = ParameterValueNew(row.Double(i), row.Double(i + 1)); } return parameters; } @@ -55,24 +55,24 @@ typename Map::mapped_type &extractOrAddDefault(Map &map, const Key &key) { } template <typename F> -void applyEnumeratedData(F &&functor, const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { +void applyEnumeratedData(F &&functor, const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { IDAWorkspaceIndex start{0}; for (auto it = fitDataBegin; it < fitDataEnd; ++it) start = (*it)->applyEnumeratedSpectra(functor(it->get()), start); } template <typename F> -void applyData(F &&functor, const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { +void applyData(F &&functor, const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { for (auto it = fitDataBegin; it < fitDataEnd; ++it) (*it)->applySpectra(functor(it->get())); } void extractParametersFromTable( - ITableWorkspace_sptr tableWs, const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd, - std::unordered_map<IndirectFitData const *, ParameterValues> ¶meters) { + ITableWorkspace_sptr tableWs, const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd, + std::unordered_map<IndirectFitData const *, ParameterValuesNew> ¶meters) { TableRowExtractor extractRowFromTable(tableWs); IDAWorkspaceIndex index; for (auto fitData = fitDataBegin; fitData < fitDataEnd; ++fitData) { @@ -185,8 +185,8 @@ void renameResult(WorkspaceGroup_sptr resultWorkspace, } void renameResultWithoutSpectra(WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { std::size_t index = 0; MatrixWorkspace const *previous = nullptr; @@ -200,16 +200,16 @@ void renameResultWithoutSpectra(WorkspaceGroup_sptr resultWorkspace, } void renameResultWithSpectra(WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { std::size_t index = 0; for (auto it = fitDataBegin; it < fitDataEnd; ++it) renameResult(resultWorkspace->getItem(index++), it->get()); } void renameResult(WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { if (static_cast<int>(resultWorkspace->size()) >= fitDataEnd - fitDataBegin) renameResultWithSpectra(resultWorkspace, fitDataBegin, fitDataEnd); else @@ -224,8 +224,8 @@ typename Map::mapped_type &findOrCreateDefaultInMap(Map &map, const Key &key) { return map[key] = typename Map::mapped_type(); } -SpectrumRowIndex numberOfSpectraIn(const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { +SpectrumRowIndex numberOfSpectraIn(const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { SpectrumRowIndex spectra{0}; for (auto it = fitDataBegin; it < fitDataEnd; ++it) spectra += (*it)->numberOfSpectra(); @@ -240,8 +240,8 @@ namespace IDA { IndirectFitOutput::IndirectFitOutput(WorkspaceGroup_sptr resultGroup, ITableWorkspace_sptr parameterTable, WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) : m_resultGroup(resultGroup), m_resultWorkspace(resultWorkspace), m_parameters(), m_outputResultLocations() { addOutput(resultGroup, parameterTable, resultWorkspace, fitDataBegin, @@ -253,8 +253,8 @@ IndirectFitOutput::IndirectFitOutput(WorkspaceGroup_sptr resultGroup, WorkspaceGroup_sptr resultWorkspace, IndirectFitData const *fitData, WorkspaceIndex spectrum) { - m_parameters[fitData] = ParameterValues(); - m_outputResultLocations[fitData] = ResultLocations(); + m_parameters[fitData] = ParameterValuesNew(); + m_outputResultLocations[fitData] = ResultLocationsNew(); addOutput(resultGroup, parameterTable, resultWorkspace, fitData, spectrum); } @@ -265,19 +265,19 @@ bool IndirectFitOutput::isSpectrumFit(IndirectFitData const *fitData, values->second.find(spectrum) != values->second.end(); } -std::unordered_map<std::string, ParameterValue> +std::unordered_map<std::string, ParameterValueNew> IndirectFitOutput::getParameters(IndirectFitData const *fitData, WorkspaceIndex spectrum) const { return getValueOr(m_parameters, - std::unordered_map<std::string, ParameterValue>(), fitData, + std::unordered_map<std::string, ParameterValueNew>(), fitData, spectrum); } -boost::optional<ResultLocation> +boost::optional<ResultLocationNew> IndirectFitOutput::getResultLocation(IndirectFitData const *fitData, WorkspaceIndex spectrum) const { return getValueOr(m_outputResultLocations, - boost::optional<ResultLocation>(boost::none), fitData, + boost::optional<ResultLocationNew>(boost::none), fitData, spectrum); } @@ -298,7 +298,7 @@ WorkspaceGroup_sptr IndirectFitOutput::getLastResultGroup() const { void IndirectFitOutput::mapParameterNames( const std::unordered_map<std::string, std::string> ¶meterNameChanges, - const FitDataIterator &fitDataBegin, const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, const FitDataIteratorNew &fitDataEnd) { for (auto it = fitDataBegin; it < fitDataEnd; ++it) mapParameterNames(parameterNameChanges, it->get()); } @@ -324,8 +324,8 @@ void IndirectFitOutput::mapParameterNames( void IndirectFitOutput::addOutput(WorkspaceGroup_sptr resultGroup, ITableWorkspace_sptr parameterTable, WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { updateParameters(parameterTable, fitDataBegin, fitDataEnd); updateFitResults(resultGroup, fitDataBegin, fitDataEnd); renameResult(resultWorkspace, fitDataBegin, fitDataEnd); @@ -341,7 +341,7 @@ void IndirectFitOutput::addOutput(WorkspaceGroup_sptr resultGroup, TableRowExtractor extractRowFromTable(parameterTable); m_parameters[fitData][spectrum] = extractRowFromTable(WorkspaceIndex{0}); m_outputResultLocations[fitData][spectrum] = - ResultLocation(resultGroup, GroupIndex{0}); + ResultLocationNew(resultGroup, GroupIndex{0}); renameResult(resultWorkspace, fitData); m_resultWorkspace = resultWorkspace; m_resultGroup = resultGroup; @@ -353,8 +353,8 @@ void IndirectFitOutput::removeOutput(IndirectFitData const *fitData) { } void IndirectFitOutput::updateFitResults(WorkspaceGroup_sptr resultGroup, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { if (numberOfSpectraIn(fitDataBegin, fitDataEnd).value <= static_cast<int>(resultGroup->size())) updateFitResultsFromStructured(resultGroup, fitDataBegin, fitDataEnd); @@ -363,15 +363,15 @@ void IndirectFitOutput::updateFitResults(WorkspaceGroup_sptr resultGroup, } void IndirectFitOutput::updateParameters(ITableWorkspace_sptr parameterTable, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { extractParametersFromTable(parameterTable, fitDataBegin, fitDataEnd, m_parameters); } void IndirectFitOutput::updateFitResultsFromUnstructured( - WorkspaceGroup_sptr resultGroup, const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + WorkspaceGroup_sptr resultGroup, const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { std::unordered_map<MatrixWorkspace *, std::map<WorkspaceIndex, GroupIndex>> resultIndices; GroupIndex index{0}; @@ -382,9 +382,9 @@ void IndirectFitOutput::updateFitResultsFromUnstructured( for (const auto &spectrum : (**fitData).spectra()) { auto defaultIt = indices.find(spectrum); if (defaultIt != indices.end()) { - fitResults[spectrum] = ResultLocation(resultGroup, defaultIt->second); + fitResults[spectrum] = ResultLocationNew(resultGroup, defaultIt->second); } else if (static_cast<int>(resultGroup->size()) > index.value) { - fitResults[spectrum] = ResultLocation(resultGroup, index); + fitResults[spectrum] = ResultLocationNew(resultGroup, index); indices[spectrum] = index; ++index; } @@ -393,13 +393,13 @@ void IndirectFitOutput::updateFitResultsFromUnstructured( } void IndirectFitOutput::updateFitResultsFromStructured( - WorkspaceGroup_sptr resultGroup, const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + WorkspaceGroup_sptr resultGroup, const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { GroupIndex index; for (auto fitData = fitDataBegin; fitData < fitDataEnd; ++fitData) { auto &fitResults = m_outputResultLocations[fitData->get()]; for (const auto &spectrum : (**fitData).spectra()) { - fitResults[spectrum] = ResultLocation(resultGroup, index); + fitResults[spectrum] = ResultLocationNew(resultGroup, index); ++index; } } diff --git a/qt/scientific_interfaces/Indirect/IndirectFitOutput.h b/qt/scientific_interfaces/Indirect/IndirectFitOutput.h index e1d53e5d8bc7cf7eae749c6bfe7ce05a0903106c..7b795ec67abcf03086fa9ef6e493e18f75a9b7a3 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitOutput.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitOutput.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITOUTPUT_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITOUTPUT_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITOUTPUTLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITOUTPUTLEGACY_H_ #include "IndirectFitData.h" @@ -21,28 +21,28 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { -struct ParameterValue { - ParameterValue() : value(0) {} - explicit ParameterValue(double val) : value(val) {} - ParameterValue(double val, double err) : value(val), error(err) {} +struct ParameterValueNew { + ParameterValueNew() : value(0) {} + explicit ParameterValueNew(double val) : value(val) {} + ParameterValueNew(double val, double err) : value(val), error(err) {} double value; boost::optional<double> error; }; -struct ResultLocation { - ResultLocation() = default; - ResultLocation(Mantid::API::WorkspaceGroup_sptr group, GroupIndex i) +struct ResultLocationNew { + ResultLocationNew() = default; + ResultLocationNew(Mantid::API::WorkspaceGroup_sptr group, GroupIndex i) : result(group), index(i) {} boost::weak_ptr<Mantid::API::WorkspaceGroup> result; GroupIndex index = GroupIndex{0}; }; -using ParameterValues = - std::map<WorkspaceIndex, std::unordered_map<std::string, ParameterValue>>; +using ParameterValuesNew = + std::map<WorkspaceIndex, std::unordered_map<std::string, ParameterValueNew>>; -using ResultLocations = std::map<WorkspaceIndex, ResultLocation>; +using ResultLocationsNew = std::map<WorkspaceIndex, ResultLocationNew>; -using FitDataIterator = +using FitDataIteratorNew = std::vector<std::unique_ptr<IndirectFitData>>::const_iterator; /* @@ -54,8 +54,8 @@ public: IndirectFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, Mantid::API::WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd); IndirectFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, @@ -65,10 +65,10 @@ public: bool isSpectrumFit(IndirectFitData const *fitData, WorkspaceIndex spectrum) const; - std::unordered_map<std::string, ParameterValue> + std::unordered_map<std::string, ParameterValueNew> getParameters(IndirectFitData const *fitData, WorkspaceIndex spectrum) const; - boost::optional<ResultLocation> + boost::optional<ResultLocationNew> getResultLocation(IndirectFitData const *fitData, WorkspaceIndex spectrum) const; std::vector<std::string> getResultParameterNames() const; @@ -77,7 +77,7 @@ public: void mapParameterNames( const std::unordered_map<std::string, std::string> ¶meterNameChanges, - const FitDataIterator &fitDataBegin, const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, const FitDataIteratorNew &fitDataEnd); void mapParameterNames( const std::unordered_map<std::string, std::string> ¶meterNameChanges, IndirectFitData const *fitData); @@ -88,8 +88,8 @@ public: void addOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, Mantid::API::WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd); void addOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, Mantid::API::WorkspaceGroup_sptr resultWorkspace, @@ -99,24 +99,24 @@ public: private: void updateFitResults(Mantid::API::WorkspaceGroup_sptr resultGroup, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd); void updateParameters(Mantid::API::ITableWorkspace_sptr parameterTable, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd); void updateFitResultsFromUnstructured(Mantid::API::WorkspaceGroup_sptr resultGroup, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd); void updateFitResultsFromStructured(Mantid::API::WorkspaceGroup_sptr resultGroup, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd); boost::weak_ptr<Mantid::API::WorkspaceGroup> m_resultGroup; boost::weak_ptr<Mantid::API::WorkspaceGroup> m_resultWorkspace; - std::unordered_map<IndirectFitData const *, ParameterValues> m_parameters; - std::unordered_map<IndirectFitData const *, ResultLocations> + std::unordered_map<IndirectFitData const *, ParameterValuesNew> m_parameters; + std::unordered_map<IndirectFitData const *, ResultLocationsNew> m_outputResultLocations; }; diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.cpp b/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.cpp index aae021bac6573687fb6499bd628edb58398f2781..75be9141fbdb4ee54fff66b77962fce3f31c7ac0 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.cpp @@ -158,7 +158,7 @@ MatrixWorkspace_sptr IndirectFitPlotModel::getWorkspace() const { return m_fittingModel->getWorkspace(m_activeIndex); } -Spectra IndirectFitPlotModel::getSpectra() const { +SpectraNew IndirectFitPlotModel::getSpectra() const { return m_fittingModel->getSpectra(m_activeIndex); } diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.h b/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.h index 1f34b92b8859d78b27909c1b7fdbea733a7da962..783e41fe662b3e8208c8d5594a506787035db3d9 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTMODEL_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTMODEL_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTMODELLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTMODELLEGACY_H_ #include "IndexTypes.h" #include "IndirectFittingModel.h" @@ -29,7 +29,7 @@ public: Mantid::API::MatrixWorkspace_sptr getWorkspace() const; Mantid::API::MatrixWorkspace_sptr getResultWorkspace() const; Mantid::API::MatrixWorkspace_sptr getGuessWorkspace() const; - Spectra getSpectra() const; + SpectraNew getSpectra() const; Mantid::API::MatrixWorkspace_sptr appendGuessToInput(Mantid::API::MatrixWorkspace_sptr guessWorkspace) const; diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp index 3ee0366538f60c7f5668fa784a231894466d627f..120e458e07885ba11aa7a20c96eccf7fbf0cd897 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp @@ -10,14 +10,14 @@ namespace { using MantidQt::CustomInterfaces::IDA::IIndirectFitPlotView; -using MantidQt::CustomInterfaces::IDA::Spectra; +using MantidQt::CustomInterfaces::IDA::SpectraNew; using MantidQt::CustomInterfaces::IDA::WorkspaceIndex; struct UpdateAvailableSpectra : public boost::static_visitor<> { public: explicit UpdateAvailableSpectra(IIndirectFitPlotView *view) : m_view(view) {} - void operator()(const Spectra &spectra) { + void operator()(const SpectraNew &spectra) { if (spectra.isContinuous()) { auto const minmax = spectra.getMinMax(); m_view->setAvailableSpectra(minmax.first, minmax.second); diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.h b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.h index 44ad7c9fa1c69313709ae2e0120c19eb4b931cd1..c1c48678dac4af5694b2affa5eaf63838e395cdb 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTPRESENTER_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTPRESENTER_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTPRESENTERLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTPRESENTERLEGACY_H_ #include "DllConfig.h" diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotViewLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitPlotViewLegacy.h index b6f534ebd43db8258aa3b9d9a0ea88eaeb5bf39e..34f646db750ae790425d98bcbadb5de2790b4764 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitPlotViewLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotViewLegacy.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTVIEW_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTVIEW_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTVIEWLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTVIEWLEGACY_H_ #include "ui_IndirectFitPreviewPlot.h" diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp b/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp index afd638a60d2d5a0b51d1e67fd1510111a2fbe95a..347594843cd12644016265d7cc66f7477d4aea58 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp @@ -348,10 +348,10 @@ std::vector<std::string> IndirectFittingModel::getWorkspaceNames() const { return names; } -Spectra IndirectFittingModel::getSpectra(DatasetIndex index) const { +SpectraNew IndirectFittingModel::getSpectra(DatasetIndex index) const { if (index < m_fittingData.size()) return m_fittingData[index]->spectra(); - return Spectra(""); + return SpectraNew(""); } std::pair<double, double> @@ -477,17 +477,17 @@ void IndirectFittingModel::setFittingData(PrivateFittingData &&fittingData) { void IndirectFittingModel::setSpectra(const std::string &spectra, DatasetIndex dataIndex) { - setSpectra(Spectra(spectra), dataIndex); + setSpectra(SpectraNew(spectra), dataIndex); } -void IndirectFittingModel::setSpectra(Spectra &&spectra, +void IndirectFittingModel::setSpectra(SpectraNew &&spectra, DatasetIndex dataIndex) { if (m_fittingData.empty()) return; - m_fittingData[dataIndex]->setSpectra(std::forward<Spectra>(spectra)); + m_fittingData[dataIndex]->setSpectra(std::forward<SpectraNew>(spectra)); } -void IndirectFittingModel::setSpectra(const Spectra &spectra, +void IndirectFittingModel::setSpectra(const SpectraNew &spectra, DatasetIndex dataIndex) { if (m_fittingData.empty()) return; @@ -533,7 +533,7 @@ void IndirectFittingModel::addWorkspace(const std::string &workspaceName) { workspaceName); addWorkspace( ws, - Spectra(WorkspaceIndex{0}, + SpectraNew(WorkspaceIndex{0}, WorkspaceIndex{static_cast<int>(ws->getNumberHistograms()) - 1})); } @@ -545,18 +545,18 @@ void IndirectFittingModel::addWorkspace(const std::string &workspaceName, if (workspaceName.empty() || !doesExistInADS(workspaceName)) throw std::runtime_error("A valid sample file needs to be selected."); - addWorkspace(workspaceName, Spectra(spectra)); + addWorkspace(workspaceName, SpectraNew(spectra)); } void IndirectFittingModel::addWorkspace(const std::string &workspaceName, - const Spectra &spectra) { + const SpectraNew &spectra) { auto ws = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>( workspaceName); addWorkspace(ws, spectra); } void IndirectFittingModel::addWorkspace(MatrixWorkspace_sptr workspace, - const Spectra &spectra) { + const SpectraNew &spectra) { if (!m_fittingData.empty() && equivalentWorkspaces(workspace, m_fittingData.back()->workspace())) m_fittingData.back()->combine(IndirectFitData(workspace, spectra)); @@ -565,7 +565,7 @@ void IndirectFittingModel::addWorkspace(MatrixWorkspace_sptr workspace, } void IndirectFittingModel::addNewWorkspace(MatrixWorkspace_sptr workspace, - const Spectra &spectra) { + const SpectraNew &spectra) { m_fittingData.emplace_back(new IndirectFitData(workspace, spectra)); m_defaultParameters.emplace_back( createDefaultParameters(m_fittingData.last())); @@ -620,7 +620,7 @@ void IndirectFittingModel::setDefaultParameterValue(const std::string &name, double value, DatasetIndex dataIndex) { if (m_defaultParameters.size() > dataIndex) - m_defaultParameters[dataIndex][name] = ParameterValue(value); + m_defaultParameters[dataIndex][name] = ParameterValueNew(value); } void IndirectFittingModel::addOutput(IAlgorithm_sptr fitAlgorithm) { @@ -628,8 +628,8 @@ void IndirectFittingModel::addOutput(IAlgorithm_sptr fitAlgorithm) { } void IndirectFittingModel::addOutput(IAlgorithm_sptr fitAlgorithm, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { auto group = getOutputGroup(fitAlgorithm); auto parameters = getOutputParameters(fitAlgorithm); auto result = getOutputResult(fitAlgorithm); @@ -653,8 +653,8 @@ void IndirectFittingModel::addSingleFitOutput(IAlgorithm_sptr fitAlgorithm, void IndirectFittingModel::addOutput(WorkspaceGroup_sptr resultGroup, ITableWorkspace_sptr parameterTable, WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) { if (m_previousModelSelected && m_fitOutput) addOutput(m_fitOutput.get(), resultGroup, parameterTable, resultWorkspace, fitDataBegin, fitDataEnd); @@ -681,8 +681,8 @@ void IndirectFittingModel::addOutput(WorkspaceGroup_sptr resultGroup, IndirectFitOutput IndirectFittingModel::createFitOutput( WorkspaceGroup_sptr resultGroup, ITableWorkspace_sptr parameterTable, - WorkspaceGroup_sptr resultWorkspace, const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) const { + WorkspaceGroup_sptr resultWorkspace, const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) const { return IndirectFitOutput(resultGroup, parameterTable, resultWorkspace, fitDataBegin, fitDataEnd); } @@ -700,8 +700,8 @@ void IndirectFittingModel::addOutput(IndirectFitOutput *fitOutput, WorkspaceGroup_sptr resultGroup, ITableWorkspace_sptr parameterTable, WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) const { + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) const { fitOutput->addOutput(resultGroup, parameterTable, resultWorkspace, fitDataBegin, fitDataEnd); } @@ -719,7 +719,7 @@ FittingMode IndirectFittingModel::getFittingMode() const { return m_fittingMode; } -std::unordered_map<std::string, ParameterValue> +std::unordered_map<std::string, ParameterValueNew> IndirectFittingModel::getParameterValues(DatasetIndex index, WorkspaceIndex spectrum) const { if (m_fittingData.size() > index) { @@ -730,22 +730,22 @@ IndirectFittingModel::getParameterValues(DatasetIndex index, return getDefaultParameters(index); return combine(getDefaultParameters(index), parameters); } - return std::unordered_map<std::string, ParameterValue>(); + return std::unordered_map<std::string, ParameterValueNew>(); } -std::unordered_map<std::string, ParameterValue> +std::unordered_map<std::string, ParameterValueNew> IndirectFittingModel::getFitParameters(DatasetIndex index, WorkspaceIndex spectrum) const { if (m_fitOutput) return m_fitOutput->getParameters(m_fittingData[index].get(), spectrum); - return std::unordered_map<std::string, ParameterValue>(); + return std::unordered_map<std::string, ParameterValueNew>(); } -std::unordered_map<std::string, ParameterValue> +std::unordered_map<std::string, ParameterValueNew> IndirectFittingModel::getDefaultParameters(DatasetIndex index) const { if (index < m_defaultParameters.size()) return mapKeys(m_defaultParameters[index], mapDefaultParameterNames()); - return std::unordered_map<std::string, ParameterValue>(); + return std::unordered_map<std::string, ParameterValueNew>(); } std::unordered_map<std::string, std::string> @@ -755,9 +755,9 @@ IndirectFittingModel::mapDefaultParameterNames() const { return std::unordered_map<std::string, std::string>(); } -std::unordered_map<std::string, ParameterValue> +std::unordered_map<std::string, ParameterValueNew> IndirectFittingModel::createDefaultParameters(DatasetIndex /*unused*/) const { - return std::unordered_map<std::string, ParameterValue>(); + return std::unordered_map<std::string, ParameterValueNew>(); } std::string IndirectFittingModel::getResultXAxisUnit() const { @@ -766,7 +766,7 @@ std::string IndirectFittingModel::getResultXAxisUnit() const { std::string IndirectFittingModel::getResultLogName() const { return "axis-1"; } -boost::optional<ResultLocation> +boost::optional<ResultLocationNew> IndirectFittingModel::getResultLocation(DatasetIndex index, WorkspaceIndex spectrum) const { if (/*m_previousModelSelected && */ m_fitOutput && @@ -893,7 +893,7 @@ IAlgorithm_sptr IndirectFittingModel::createSimultaneousFitWithEqualRange( auto const dataIndex = DatasetIndex{0}; auto const workspaceIndex = getSpectra(dataIndex).front(); auto exclude = - vectorFromString<double>(getExcludeRegion(dataIndex, workspaceIndex)); + vectorFromStringNew<double>(getExcludeRegion(dataIndex, workspaceIndex)); addInputDataToSimultaneousFit(fitAlgorithm, m_fittingData, getFittingRange(dataIndex, workspaceIndex), exclude); diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModel.h b/qt/scientific_interfaces/Indirect/IndirectFittingModel.h index 070f03d3d2bc0d2fc6bb143b7d827898813ec957..d7b5470b22791ebcc4644fd6282740a2dd426271 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFittingModel.h +++ b/qt/scientific_interfaces/Indirect/IndirectFittingModel.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITTINGMODEL_H_ -#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITTINGMODEL_H_ +#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITTINGMODELLEGACY_H_ +#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITTINGMODELLEGACY_H_ #include "IndexTypes.h" #include "IndirectFitData.h" @@ -31,7 +31,7 @@ using IndirectFitDataCollectionType = IndexCollectionType<DatasetIndex, std::unique_ptr<IndirectFitData>>; using DefaultParametersType = IndexCollectionType<DatasetIndex, - std::unordered_map<std::string, ParameterValue>>; + std::unordered_map<std::string, ParameterValueNew>>; struct PrivateFittingData { friend class IndirectFittingModel; @@ -58,7 +58,7 @@ public: virtual bool hasWorkspace(std::string const &workspaceName) const; virtual Mantid::API::MatrixWorkspace_sptr getWorkspace(DatasetIndex index) const; - Spectra getSpectra(DatasetIndex index) const; + SpectraNew getSpectra(DatasetIndex index) const; virtual std::pair<double, double> getFittingRange(DatasetIndex dataIndex, WorkspaceIndex spectrum) const; virtual std::string getExcludeRegion(DatasetIndex dataIndex, @@ -84,8 +84,8 @@ public: void setFittingData(PrivateFittingData &&fittingData); void setSpectra(const std::string &spectra, DatasetIndex dataIndex); - void setSpectra(Spectra &&spectra, DatasetIndex dataIndex); - void setSpectra(const Spectra &spectra, DatasetIndex dataIndex); + void setSpectra(SpectraNew &&spectra, DatasetIndex dataIndex); + void setSpectra(const SpectraNew &spectra, DatasetIndex dataIndex); virtual void setStartX(double startX, DatasetIndex dataIndex, WorkspaceIndex spectrum); virtual void setStartX(double startX, DatasetIndex dataIndex); @@ -99,9 +99,9 @@ public: virtual void addWorkspace(const std::string &workspaceName); void addWorkspace(const std::string &workspaceName, const std::string &spectra); - void addWorkspace(const std::string &workspaceName, const Spectra &spectra); + void addWorkspace(const std::string &workspaceName, const SpectraNew &spectra); virtual void addWorkspace(Mantid::API::MatrixWorkspace_sptr workspace, - const Spectra &spectra); + const SpectraNew &spectra); virtual void removeWorkspace(DatasetIndex index); virtual PrivateFittingData clearWorkspaces(); void setFittingMode(FittingMode mode); @@ -116,13 +116,13 @@ public: void applySpectra(DatasetIndex index, const F &functor) const; FittingMode getFittingMode() const; - std::unordered_map<std::string, ParameterValue> + std::unordered_map<std::string, ParameterValueNew> getParameterValues(DatasetIndex dataIndex, WorkspaceIndex spectrum) const; - std::unordered_map<std::string, ParameterValue> + std::unordered_map<std::string, ParameterValueNew> getFitParameters(DatasetIndex dataIndex, WorkspaceIndex spectrum) const; - std::unordered_map<std::string, ParameterValue> + std::unordered_map<std::string, ParameterValueNew> getDefaultParameters(DatasetIndex dataIndex) const; - boost::optional<ResultLocation> + boost::optional<ResultLocationNew> getResultLocation(DatasetIndex dataIndex, WorkspaceIndex spectrum) const; Mantid::API::WorkspaceGroup_sptr getResultWorkspace() const; Mantid::API::WorkspaceGroup_sptr getResultGroup() const; @@ -154,7 +154,7 @@ protected: DatasetIndex index, WorkspaceIndex spectrum) const; void addNewWorkspace(Mantid::API::MatrixWorkspace_sptr workspace, - const Spectra &spectra); + const SpectraNew &spectra); void removeFittingData(DatasetIndex index); private: @@ -172,7 +172,7 @@ private: virtual std::string simultaneousFitOutputName() const = 0; virtual std::string singleFitOutputName(DatasetIndex index, WorkspaceIndex spectrum) const = 0; - virtual std::unordered_map<std::string, ParameterValue> + virtual std::unordered_map<std::string, ParameterValueNew> createDefaultParameters(DatasetIndex index) const; virtual std::string getResultXAxisUnit() const; @@ -184,8 +184,8 @@ private: createFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, Mantid::API::WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) const; + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) const; virtual IndirectFitOutput createFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, @@ -193,13 +193,13 @@ private: IndirectFitData *fitData, WorkspaceIndex spectrum) const; void addOutput(Mantid::API::IAlgorithm_sptr fitAlgorithm, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd); void addOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, Mantid::API::WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd); + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd); void addOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, Mantid::API::WorkspaceGroup_sptr resultWorkspace, @@ -209,8 +209,8 @@ private: Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, Mantid::API::WorkspaceGroup_sptr resultWorkspace, - const FitDataIterator &fitDataBegin, - const FitDataIterator &fitDataEnd) const; + const FitDataIteratorNew &fitDataBegin, + const FitDataIteratorNew &fitDataEnd) const; virtual void addOutput(IndirectFitOutput *fitOutput, Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.cpp index 897086416983117c0de351f9426dd97aaf8de70e..5b777450289caec4ca286ebd28979fcbd14dd963 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.cpp @@ -336,7 +336,7 @@ operator=(PrivateFittingDataLegacy &&fittingData) { } IndirectFittingModelLegacy::IndirectFittingModelLegacy() - : m_previousModelSelected(false), m_fittingMode(FittingMode::SEQUENTIAL) {} + : m_previousModelSelected(false), m_fittingMode(FittingModeLegacy::SEQUENTIAL) {} bool IndirectFittingModelLegacy::hasWorkspace( std::string const &workspaceName) const { @@ -371,7 +371,7 @@ IndirectFittingModelLegacy::getFittingRange(std::size_t dataIndex, std::size_t spectrum) const { if (dataIndex < m_fittingData.size() && !m_fittingData[dataIndex]->zeroSpectra()) { - if (FittingMode::SEQUENTIAL == m_fittingMode) + if (FittingModeLegacy::SEQUENTIAL == m_fittingMode) return m_fittingData.front()->getRange(0); return m_fittingData[dataIndex]->getRange(spectrum); } @@ -382,7 +382,7 @@ std::string IndirectFittingModelLegacy::getExcludeRegion(std::size_t dataIndex, std::size_t spectrum) const { if (dataIndex < m_fittingData.size() && !m_fittingData[dataIndex]->zeroSpectra()) { - if (FittingMode::SEQUENTIAL == m_fittingMode) + if (FittingModeLegacy::SEQUENTIAL == m_fittingMode) return m_fittingData.back()->getExcludeRegion(0); return m_fittingData[dataIndex]->getExcludeRegion(spectrum); } @@ -482,7 +482,7 @@ void IndirectFittingModelLegacy::setSpectra(const Spectra &spectra, void IndirectFittingModelLegacy::setStartX(double startX, std::size_t dataIndex, std::size_t spectrum) { - if (FittingMode::SEQUENTIAL == m_fittingMode) + if (FittingModeLegacy::SEQUENTIAL == m_fittingMode) m_fittingData.front()->setStartX(startX, 0); else m_fittingData[dataIndex]->setStartX(startX, spectrum); @@ -490,7 +490,7 @@ void IndirectFittingModelLegacy::setStartX(double startX, std::size_t dataIndex, void IndirectFittingModelLegacy::setEndX(double endX, std::size_t dataIndex, std::size_t spectrum) { - if (FittingMode::SEQUENTIAL == m_fittingMode) + if (FittingModeLegacy::SEQUENTIAL == m_fittingMode) m_fittingData.front()->setEndX(endX, 0); else m_fittingData[dataIndex]->setEndX(endX, spectrum); @@ -499,7 +499,7 @@ void IndirectFittingModelLegacy::setEndX(double endX, std::size_t dataIndex, void IndirectFittingModelLegacy::setExcludeRegion(const std::string &exclude, std::size_t dataIndex, std::size_t spectrum) { - if (FittingMode::SEQUENTIAL == m_fittingMode) + if (FittingModeLegacy::SEQUENTIAL == m_fittingMode) m_fittingData.front()->setExcludeRegionString(exclude, 0); else m_fittingData[dataIndex]->setExcludeRegionString(exclude, spectrum); @@ -581,7 +581,7 @@ PrivateFittingDataLegacy IndirectFittingModelLegacy::clearWorkspaces() { return std::move(m_fittingData); } -void IndirectFittingModelLegacy::setFittingMode(FittingMode mode) { +void IndirectFittingModelLegacy::setFittingMode(FittingModeLegacy mode) { m_fittingMode = mode; } @@ -689,7 +689,7 @@ void IndirectFittingModelLegacy::addOutput( spectrum); } -FittingMode IndirectFittingModelLegacy::getFittingMode() const { +FittingModeLegacy IndirectFittingModelLegacy::getFittingMode() const { return m_fittingMode; } @@ -770,8 +770,8 @@ IAlgorithm_sptr IndirectFittingModelLegacy::getFittingAlgorithm() const { } IAlgorithm_sptr -IndirectFittingModelLegacy::getFittingAlgorithm(FittingMode mode) const { - if (mode == FittingMode::SEQUENTIAL) +IndirectFittingModelLegacy::getFittingAlgorithm(FittingModeLegacy mode) const { + if (mode == FittingModeLegacy::SEQUENTIAL) return createSequentialFit(getFittingFunction()); else return createSimultaneousFit(getMultiDomainFunction()); diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.h index 71fceb8e31d6a4b1d0d5388652757a3e9cfe36cb..0df33d931c33d5519a22eaa6c0961948f7462108 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.h @@ -21,7 +21,7 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { -enum class FittingMode { SEQUENTIAL, SIMULTANEOUS }; +enum class FittingModeLegacy { SEQUENTIAL, SIMULTANEOUS }; class IndirectFittingModelLegacy; @@ -91,7 +91,7 @@ public: const Spectra &spectra); virtual void removeWorkspace(std::size_t index); virtual PrivateFittingDataLegacy clearWorkspaces(); - void setFittingMode(FittingMode mode); + void setFittingMode(FittingModeLegacy mode); virtual void setFitFunction(Mantid::API::IFunction_sptr function); virtual void setDefaultParameterValue(const std::string &name, double value, std::size_t dataIndex); @@ -102,7 +102,7 @@ public: template <typename F> void applySpectra(std::size_t index, const F &functor) const; - FittingMode getFittingMode() const; + FittingModeLegacy getFittingMode() const; std::unordered_map<std::string, ParameterValue> getParameterValues(std::size_t dataIndex, std::size_t spectrum) const; std::unordered_map<std::string, ParameterValue> @@ -123,7 +123,7 @@ public: std::size_t index); protected: - Mantid::API::IAlgorithm_sptr getFittingAlgorithm(FittingMode mode) const; + Mantid::API::IAlgorithm_sptr getFittingAlgorithm(FittingModeLegacy mode) const; Mantid::API::IAlgorithm_sptr createSequentialFit(Mantid::API::IFunction_sptr function) const; Mantid::API::IAlgorithm_sptr @@ -207,7 +207,7 @@ private: std::vector<std::unordered_map<std::string, ParameterValue>> m_defaultParameters; bool m_previousModelSelected; - FittingMode m_fittingMode; + FittingModeLegacy m_fittingMode; }; template <typename F> diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.cpp b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3be5ec56bfae030cc37c6d6ba5dbbe23334d8880 --- /dev/null +++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.cpp @@ -0,0 +1,679 @@ +// 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 +// SPDX - License - Identifier: GPL - 3.0 + +#include "IqtFunctionModel.h" +#include "MantidAPI/FunctionFactory.h" +#include "MantidAPI/IFunction.h" +#include "MantidAPI/ITableWorkspace.h" +#include "MantidQtWidgets/Common/FunctionBrowser/FunctionBrowserUtils.h" +#include <map> + +namespace MantidQt { +namespace CustomInterfaces { +namespace IDA { + +using namespace MantidWidgets; +using namespace Mantid::API; + +namespace { +std::map<IqtFunctionModel::ParamID, QString> g_paramName{ + {IqtFunctionModel::ParamID::EXP1_HEIGHT, "Height"}, + {IqtFunctionModel::ParamID::EXP1_LIFETIME, "Lifetime"}, + {IqtFunctionModel::ParamID::EXP2_HEIGHT, "Height"}, + {IqtFunctionModel::ParamID::EXP2_LIFETIME, "Lifetime"}, + {IqtFunctionModel::ParamID::STRETCH_HEIGHT, "Height"}, + {IqtFunctionModel::ParamID::STRETCH_LIFETIME, "Lifetime"}, + {IqtFunctionModel::ParamID::STRETCH_STRETCHING, "Stretching"}, + {IqtFunctionModel::ParamID::BG_A0, "A0"}}; +} + +IqtFunctionModel::IqtFunctionModel() {} + +void IqtFunctionModel::clearData() { + m_numberOfExponentials = 0; + m_hasStretchExponential = false; + m_background.clear(); + m_model.clear(); +} + +void IqtFunctionModel::setFunction(IFunction_sptr fun) { + clearData(); + if (!fun) + return; + if (fun->nFunctions() == 0) { + auto const name = fun->name(); + if (name == "ExpDecay") { + m_numberOfExponentials = 1; + } else if (name == "StretchExp") { + m_hasStretchExponential = true; + } else if (name == "FlatBackground") { + m_background = QString::fromStdString(name); + } else { + throw std::runtime_error("Cannot set function " + name); + } + m_model.setFunction(fun); + return; + } + bool areExponentialsSet = false; + bool isStretchSet = false; + bool isBackgroundSet = false; + for (size_t i = 0; i < fun->nFunctions(); ++i) { + auto f = fun->getFunction(i); + auto const name = f->name(); + if (name == "ExpDecay") { + if (areExponentialsSet) { + throw std::runtime_error("Function has wrong structure."); + } + if (m_numberOfExponentials == 0) { + m_numberOfExponentials = 1; + } else { + m_numberOfExponentials = 2; + areExponentialsSet = true; + } + } else if (name == "StretchExp") { + if (isStretchSet) { + throw std::runtime_error("Function has wrong structure."); + } + m_hasStretchExponential = true; + areExponentialsSet = true; + isStretchSet = true; + } else if (name == "FlatBackground") { + if (isBackgroundSet) { + throw std::runtime_error("Function has wrong structure."); + } + m_background = QString::fromStdString(name); + areExponentialsSet = true; + isStretchSet = true; + isBackgroundSet = true; + } else { + clear(); + throw std::runtime_error("Function has wrong structure."); + } + } + m_model.setFunction(fun); +} + +IFunction_sptr IqtFunctionModel::getFitFunction() const { + return m_model.getFitFunction(); +} + +bool IqtFunctionModel::hasFunction() const { return m_model.hasFunction(); } + +void IqtFunctionModel::addFunction(const QString &prefix, + const QString &funStr) { + if (!prefix.isEmpty()) + throw std::runtime_error( + "Function doesn't have member function with prefix " + + prefix.toStdString()); + auto fun = + FunctionFactory::Instance().createInitialized(funStr.toStdString()); + auto const name = fun->name(); + QString newPrefix; + if (name == "ExpDecay") { + auto const ne = getNumberOfExponentials(); + if (ne > 1) + throw std::runtime_error("Cannot add more exponentials."); + setNumberOfExponentials(ne + 1); + if (auto const prefix = getExp2Prefix()) { + newPrefix = *prefix; + } else { + newPrefix = *getExp1Prefix(); + } + } else if (name == "StretchExp") { + if (hasStretchExponential()) + throw std::runtime_error("Cannot add more stretched exponentials."); + setStretchExponential(true); + newPrefix = *getStretchPrefix(); + } else if (name == "FlatBackground") { + if (hasBackground()) + throw std::runtime_error("Cannot add more backgrounds."); + setBackground(QString::fromStdString(name)); + newPrefix = *getBackgroundPrefix(); + } else { + throw std::runtime_error("Cannot add funtion " + name); + } + auto newFun = getFunctionWithPrefix(newPrefix, getSingleFunction(0)); + copyParametersAndErrors(*fun, *newFun); + if (getNumberLocalFunctions() > 1) { + copyParametersAndErrorsToAllLocalFunctions(*getSingleFunction(0)); + } +} + +void IqtFunctionModel::removeFunction(const QString &prefix) { + if (prefix.isEmpty()) { + clear(); + return; + } + auto prefix1 = getExp1Prefix(); + if (prefix1 && *prefix1 == prefix) { + setNumberOfExponentials(0); + return; + } + prefix1 = getExp2Prefix(); + if (prefix1 && *prefix1 == prefix) { + setNumberOfExponentials(1); + return; + } + prefix1 = getStretchPrefix(); + if (prefix1 && *prefix1 == prefix) { + setStretchExponential(false); + return; + } + prefix1 = getBackgroundPrefix(); + if (prefix1 && *prefix1 == prefix) { + removeBackground(); + return; + } + throw std::runtime_error( + "Function doesn't have member function with prefix " + + prefix.toStdString()); +} + +void IqtFunctionModel::setNumberOfExponentials(int n) { + auto oldValues = getCurrentValues(); + m_numberOfExponentials = n; + m_model.setFunctionString(buildFunctionString()); + m_model.setGlobalParameters(makeGlobalList()); + setCurrentValues(oldValues); +} + +int IqtFunctionModel::getNumberOfExponentials() const { + return m_numberOfExponentials; +} + +void IqtFunctionModel::setStretchExponential(bool on) { + auto oldValues = getCurrentValues(); + m_hasStretchExponential = on; + m_model.setFunctionString(buildFunctionString()); + m_model.setGlobalParameters(makeGlobalList()); + setCurrentValues(oldValues); + if (on) { + estimateStretchExpParameters(); + } +} + +bool IqtFunctionModel::hasStretchExponential() const { + return m_hasStretchExponential; +} + +void IqtFunctionModel::setBackground(const QString &name) { + auto oldValues = getCurrentValues(); + m_background = name; + m_model.setFunctionString(buildFunctionString()); + m_model.setGlobalParameters(makeGlobalList()); + setCurrentValues(oldValues); +} + +void IqtFunctionModel::removeBackground() { + auto oldValues = getCurrentValues(); + m_background.clear(); + m_model.setFunctionString(buildFunctionString()); + m_model.setGlobalParameters(makeGlobalList()); + setCurrentValues(oldValues); +} + +bool IqtFunctionModel::hasBackground() const { return !m_background.isEmpty(); } + +void IqtFunctionModel::tieIntensities(bool on) { + auto heightName = getParameterName(ParamID::STRETCH_HEIGHT); + if (!heightName) + heightName = getParameterName(ParamID::EXP1_HEIGHT); + auto const a0Name = getParameterName(ParamID::BG_A0); + if (!heightName || !a0Name) + return; + auto const tie = on ? QString("1-%1").arg(*a0Name) : QString(); + for (auto i = 0; i < getNumberDomains(); ++i) { + setLocalParameterTie(*heightName, i, tie); + } +} + +void IqtFunctionModel::updateParameterEstimationData( + DataForParameterEstimationCollection &&data) { + m_estimationData = std::move(data); +} + +QString IqtFunctionModel::setBackgroundA0(double value) { + if (hasBackground()) { + setParameter(ParamID::BG_A0, value); + return *getParameterName(ParamID::BG_A0); + } + return ""; +} + +void IqtFunctionModel::setNumberDomains(int n) { m_model.setNumberDomains(n); } + +int IqtFunctionModel::getNumberDomains() const { + return m_model.getNumberDomains(); +} + +void IqtFunctionModel::setParameter(const QString ¶mName, double value) { + m_model.setParameter(paramName, value); +} + +void IqtFunctionModel::setParameterError(const QString ¶mName, + double value) { + m_model.setParameterError(paramName, value); +} + +double IqtFunctionModel::getParameter(const QString ¶mName) const { + return m_model.getParameter(paramName); +} + +double IqtFunctionModel::getParameterError(const QString ¶mName) const { + return m_model.getParameterError(paramName); +} + +QString +IqtFunctionModel::getParameterDescription(const QString ¶mName) const { + return m_model.getParameterDescription(paramName); +} + +QStringList IqtFunctionModel::getParameterNames() const { + return m_model.getParameterNames(); +} + +IFunction_sptr IqtFunctionModel::getSingleFunction(int index) const { + return m_model.getSingleFunction(index); +} + +IFunction_sptr IqtFunctionModel::getCurrentFunction() const { + return m_model.getCurrentFunction(); +} + +QStringList IqtFunctionModel::getGlobalParameters() const { + return m_model.getGlobalParameters(); +} + +QStringList IqtFunctionModel::getLocalParameters() const { + return m_model.getLocalParameters(); +} + +void IqtFunctionModel::setGlobalParameters(const QStringList &globals) { + m_globals.clear(); + for (auto const &name : globals) { + addGlobal(name); + } + auto newGlobals = makeGlobalList(); + m_model.setGlobalParameters(newGlobals); +} + +bool IqtFunctionModel::isGlobal(const QString &parName) const { + return m_model.isGlobal(parName); +} + +void IqtFunctionModel::setGlobal(const QString &parName, bool on) { + if (parName.isEmpty()) + return; + if (on) + addGlobal(parName); + else + removeGlobal(parName); + auto globals = makeGlobalList(); + m_model.setGlobalParameters(globals); +} + +void IqtFunctionModel::addGlobal(const QString &parName) { + auto const pid = getParameterId(parName); + if (pid && !m_globals.contains(*pid)) { + m_globals.push_back(*pid); + } +} + +void IqtFunctionModel::removeGlobal(const QString &parName) { + auto const pid = getParameterId(parName); + if (pid && m_globals.contains(*pid)) { + m_globals.removeOne(*pid); + } +} + +QStringList IqtFunctionModel::makeGlobalList() const { + QStringList globals; + for (auto const id : m_globals) { + auto const name = getParameterName(id); + if (name) + globals << *name; + } + return globals; +} + +void IqtFunctionModel::updateMultiDatasetParameters(const IFunction &fun) { + m_model.updateMultiDatasetParameters(fun); +} + +void IqtFunctionModel::updateMultiDatasetParameters( + const ITableWorkspace ¶mTable) { + auto const nRows = paramTable.rowCount(); + if (nRows == 0) + return; + + auto const globalParameterNames = getGlobalParameters(); + for (auto &&name : globalParameterNames) { + auto valueColumn = paramTable.getColumn(name.toStdString()); + auto errorColumn = paramTable.getColumn((name + "_Err").toStdString()); + m_model.setParameter(name, valueColumn->toDouble(0)); + m_model.setParameterError(name, errorColumn->toDouble(0)); + } + + auto const localParameterNames = getLocalParameters(); + for (auto &&name : localParameterNames) { + auto valueColumn = paramTable.getColumn(name.toStdString()); + auto errorColumn = paramTable.getColumn((name + "_Err").toStdString()); + if (nRows > 1) { + for (size_t i = 0; i < nRows; ++i) { + m_model.setLocalParameterValue(name, static_cast<int>(i), + valueColumn->toDouble(i), + errorColumn->toDouble(i)); + } + } else { + auto const i = m_model.currentDomainIndex(); + m_model.setLocalParameterValue(name, static_cast<int>(i), + valueColumn->toDouble(0), + errorColumn->toDouble(0)); + } + } +} + +void IqtFunctionModel::updateParameters(const IFunction &fun) { + m_model.updateParameters(fun); +} + +void IqtFunctionModel::setCurrentDomainIndex(int i) { + m_model.setCurrentDomainIndex(i); +} + +int IqtFunctionModel::currentDomainIndex() const { + return m_model.currentDomainIndex(); +} + +void IqtFunctionModel::changeTie(const QString ¶mName, const QString &tie) { + m_model.changeTie(paramName, tie); +} + +void IqtFunctionModel::addConstraint(const QString &functionIndex, + const QString &constraint) { + m_model.addConstraint(functionIndex, constraint); +} + +void IqtFunctionModel::removeConstraint(const QString ¶mName) { + m_model.removeConstraint(paramName); +} + +void IqtFunctionModel::setDatasetNames(const QStringList &names) { + m_model.setDatasetNames(names); +} + +QStringList IqtFunctionModel::getDatasetNames() const { + return m_model.getDatasetNames(); +} + +double IqtFunctionModel::getLocalParameterValue(const QString &parName, + int i) const { + return m_model.getLocalParameterValue(parName, i); +} + +bool IqtFunctionModel::isLocalParameterFixed(const QString &parName, + int i) const { + return m_model.isLocalParameterFixed(parName, i); +} + +QString IqtFunctionModel::getLocalParameterTie(const QString &parName, + int i) const { + return m_model.getLocalParameterTie(parName, i); +} + +QString IqtFunctionModel::getLocalParameterConstraint(const QString &parName, + int i) const { + return m_model.getLocalParameterConstraint(parName, i); +} + +void IqtFunctionModel::setLocalParameterValue(const QString &parName, int i, + double value) { + m_model.setLocalParameterValue(parName, i, value); +} + +void IqtFunctionModel::setLocalParameterValue(const QString &parName, int i, + double value, double error) { + m_model.setLocalParameterValue(parName, i, value, error); +} + +void IqtFunctionModel::setLocalParameterTie(const QString &parName, int i, + const QString &tie) { + m_model.setLocalParameterTie(parName, i, tie); +} + +void IqtFunctionModel::setLocalParameterConstraint(const QString &parName, + int i, + const QString &constraint) { + m_model.setLocalParameterConstraint(parName, i, constraint); +} + +void IqtFunctionModel::setLocalParameterFixed(const QString &parName, int i, + bool fixed) { + m_model.setLocalParameterFixed(parName, i, fixed); +} + +void IqtFunctionModel::setParameter(ParamID name, double value) { + auto const prefix = getPrefix(name); + if (prefix) { + m_model.setParameter(*prefix + g_paramName.at(name), value); + } +} + +boost::optional<double> IqtFunctionModel::getParameter(ParamID name) const { + auto const paramName = getParameterName(name); + return paramName ? m_model.getParameter(*paramName) + : boost::optional<double>(); +} + +boost::optional<double> +IqtFunctionModel::getParameterError(ParamID name) const { + auto const paramName = getParameterName(name); + return paramName ? m_model.getParameterError(*paramName) + : boost::optional<double>(); +} + +boost::optional<QString> +IqtFunctionModel::getParameterName(ParamID name) const { + auto const prefix = getPrefix(name); + return prefix ? *prefix + g_paramName.at(name) : boost::optional<QString>(); +} + +boost::optional<QString> +IqtFunctionModel::getParameterDescription(ParamID name) const { + auto const paramName = getParameterName(name); + return paramName ? m_model.getParameterDescription(*paramName) + : boost::optional<QString>(); +} + +boost::optional<QString> IqtFunctionModel::getPrefix(ParamID name) const { + if (name <= ParamID::EXP1_LIFETIME) { + return getExp1Prefix(); + } else if (name <= ParamID::EXP2_LIFETIME) { + return getExp2Prefix(); + } else if (name <= ParamID::STRETCH_STRETCHING) { + return getStretchPrefix(); + } else { + return getBackgroundPrefix(); + } +} + +QMap<IqtFunctionModel::ParamID, double> +IqtFunctionModel::getCurrentValues() const { + QMap<ParamID, double> values; + auto store = [&values, this](ParamID name) { + values[name] = *getParameter(name); + }; + applyParameterFunction(store); + return values; +} + +QMap<IqtFunctionModel::ParamID, double> +IqtFunctionModel::getCurrentErrors() const { + QMap<ParamID, double> errors; + auto store = [&errors, this](ParamID name) { + errors[name] = *getParameterError(name); + }; + applyParameterFunction(store); + return errors; +} + +QMap<int, QString> IqtFunctionModel::getParameterNameMap() const { + QMap<int, QString> out; + auto addToMap = [&out, this](ParamID name) { + out[static_cast<int>(name)] = *getParameterName(name); + }; + applyParameterFunction(addToMap); + return out; +} + +QMap<int, std::string> IqtFunctionModel::getParameterDescriptionMap() const { + QMap<int, std::string> out; + auto expDecay = FunctionFactory::Instance().createInitialized( + buildExpDecayFunctionString()); + out[static_cast<int>(ParamID::EXP1_HEIGHT)] = + expDecay->parameterDescription(0); + out[static_cast<int>(ParamID::EXP1_LIFETIME)] = + expDecay->parameterDescription(1); + out[static_cast<int>(ParamID::EXP2_HEIGHT)] = + expDecay->parameterDescription(0); + out[static_cast<int>(ParamID::EXP2_LIFETIME)] = + expDecay->parameterDescription(1); + auto stretchExp = FunctionFactory::Instance().createInitialized( + buildStretchExpFunctionString()); + out[static_cast<int>(ParamID::STRETCH_HEIGHT)] = + stretchExp->parameterDescription(0); + out[static_cast<int>(ParamID::STRETCH_LIFETIME)] = + stretchExp->parameterDescription(1); + out[static_cast<int>(ParamID::STRETCH_STRETCHING)] = + stretchExp->parameterDescription(2); + auto background = FunctionFactory::Instance().createInitialized( + buildBackgroundFunctionString()); + out[static_cast<int>(ParamID::BG_A0)] = background->parameterDescription(0); + return out; +} + +void IqtFunctionModel::setCurrentValues(const QMap<ParamID, double> &values) { + for (auto const name : values.keys()) { + setParameter(name, values[name]); + } +} + +void IqtFunctionModel::applyParameterFunction( + std::function<void(ParamID)> paramFun) const { + if (m_numberOfExponentials > 0) { + paramFun(ParamID::EXP1_HEIGHT); + paramFun(ParamID::EXP1_LIFETIME); + } + if (m_numberOfExponentials > 1) { + paramFun(ParamID::EXP2_HEIGHT); + paramFun(ParamID::EXP2_LIFETIME); + } + if (m_hasStretchExponential) { + paramFun(ParamID::STRETCH_HEIGHT); + paramFun(ParamID::STRETCH_LIFETIME); + paramFun(ParamID::STRETCH_STRETCHING); + } + if (!m_background.isEmpty()) { + paramFun(ParamID::BG_A0); + } +} + +boost::optional<IqtFunctionModel::ParamID> +IqtFunctionModel::getParameterId(const QString &parName) { + boost::optional<ParamID> result; + auto getter = [&result, parName, this](ParamID pid) { + if (parName == *getParameterName(pid)) + result = pid; + }; + applyParameterFunction(getter); + return result; +} + +std::string IqtFunctionModel::buildExpDecayFunctionString() const { + return "name=ExpDecay,Height=1,Lifetime=1,constraints=(Height>0,Lifetime>0)"; +} + +std::string IqtFunctionModel::buildStretchExpFunctionString() const { + return "name=StretchExp,Height=1,Lifetime=1,Stretching=1,constraints=(Height>" + "0,Lifetime>0,0<Stretching<1.001)"; +} + +std::string IqtFunctionModel::buildBackgroundFunctionString() const { + return "name=FlatBackground,A0=0,constraints=(A0>0)"; +} + +void IqtFunctionModel::estimateStretchExpParameters() { + auto const heightName = getParameterName(ParamID::STRETCH_HEIGHT); + auto const lifeTimeName = getParameterName(ParamID::STRETCH_LIFETIME); + auto const stretchingName = getParameterName(ParamID::STRETCH_STRETCHING); + if (!heightName || !lifeTimeName || !stretchingName) + return; + assert(getNumberDomains() == m_estimationData.size()); + for (auto i = 0; i < getNumberDomains(); ++i) { + auto const &x = m_estimationData[i].x; + auto const &y = m_estimationData[i].y; + auto lifeTime = (x[1] - x[0]) / (log(y[0]) - log(y[1])); + if (lifeTime <= 0) + lifeTime = 1.0; + auto const height = y[0] * exp(x[0] / lifeTime); + setLocalParameterValue(*heightName, i, height); + setLocalParameterValue(*lifeTimeName, i, lifeTime); + setLocalParameterValue(*stretchingName, i, 1.0); + } +} + +QString IqtFunctionModel::buildFunctionString() const { + QStringList functions; + if (m_numberOfExponentials > 0) { + functions << QString::fromStdString(buildExpDecayFunctionString()); + } + if (m_numberOfExponentials > 1) { + functions << QString::fromStdString(buildExpDecayFunctionString()); + } + if (m_hasStretchExponential) { + functions << QString::fromStdString(buildStretchExpFunctionString()); + } + if (!m_background.isEmpty()) { + functions << QString::fromStdString(buildBackgroundFunctionString()); + } + return functions.join(";"); +} + +boost::optional<QString> IqtFunctionModel::getExp1Prefix() const { + if (m_numberOfExponentials == 0) + return boost::optional<QString>(); + if (m_numberOfExponentials == 1 && !m_hasStretchExponential && + m_background.isEmpty()) + return QString(""); + return QString("f0."); +} + +boost::optional<QString> IqtFunctionModel::getExp2Prefix() const { + if (m_numberOfExponentials < 2) + return boost::optional<QString>(); + return QString("f1."); +} + +boost::optional<QString> IqtFunctionModel::getStretchPrefix() const { + if (!m_hasStretchExponential) + return boost::optional<QString>(); + if (m_numberOfExponentials == 0 && m_background.isEmpty()) + return QString(""); + return QString("f%1.").arg(m_numberOfExponentials); +} + +boost::optional<QString> IqtFunctionModel::getBackgroundPrefix() const { + if (m_background.isEmpty()) + return boost::optional<QString>(); + if (m_numberOfExponentials == 0 && !m_hasStretchExponential) + return QString(""); + return QString("f%1.").arg(m_numberOfExponentials + + (m_hasStretchExponential ? 1 : 0)); +} + +} // namespace IDA +} // namespace CustomInterfaces +} // namespace MantidQt diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.h b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.h new file mode 100644 index 0000000000000000000000000000000000000000..48bf3d6d52aae2218e1a3c3848b2f19e5fc5cfa2 --- /dev/null +++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.h @@ -0,0 +1,140 @@ +// 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 +// SPDX - License - Identifier: GPL - 3.0 + +#ifndef MANTIDQT_INDIRECT_IQTFUNCTIONMODEL_H_ +#define MANTIDQT_INDIRECT_IQTFUNCTIONMODEL_H_ + +#include "DllConfig.h" +#include "MantidAPI/IFunction_fwd.h" +#include "MantidAPI/ITableWorkspace_fwd.h" +#include "MantidQtWidgets/Common/FunctionModel.h" +#include "ParameterEstimation.h" + +#include <QMap> +#include <boost/optional.hpp> + +namespace MantidQt { +namespace CustomInterfaces { +namespace IDA { + +using namespace Mantid::API; +using namespace MantidWidgets; + +class MANTIDQT_INDIRECT_DLL IqtFunctionModel : public IFunctionModel { +public: + IqtFunctionModel(); + void setFunction(IFunction_sptr fun) override; + IFunction_sptr getFitFunction() const override; + bool hasFunction() const override; + void addFunction(const QString &prefix, const QString &funStr) override; + void removeFunction(const QString &prefix) override; + void setParameter(const QString ¶mName, double value) override; + void setParameterError(const QString ¶mName, double value) override; + double getParameter(const QString ¶mName) const override; + double getParameterError(const QString ¶mName) const override; + QString getParameterDescription(const QString ¶mName) const override; + QStringList getParameterNames() const override; + IFunction_sptr getSingleFunction(int index) const override; + IFunction_sptr getCurrentFunction() const override; + void setNumberDomains(int) override; + void setDatasetNames(const QStringList &names) override; + QStringList getDatasetNames() const override; + int getNumberDomains() const override; + void setCurrentDomainIndex(int i) override; + int currentDomainIndex() const override; + void changeTie(const QString ¶mName, const QString &tie) override; + void addConstraint(const QString &functionIndex, + const QString &constraint) override; + void removeConstraint(const QString ¶mName) override; + QStringList getGlobalParameters() const override; + void setGlobalParameters(const QStringList &globals) override; + bool isGlobal(const QString &parName) const override; + void setGlobal(const QString &parName, bool on); + QStringList getLocalParameters() const override; + void updateMultiDatasetParameters(const IFunction &fun) override; + void updateParameters(const IFunction &fun) override; + + double getLocalParameterValue(const QString &parName, int i) const override; + bool isLocalParameterFixed(const QString &parName, int i) const override; + QString getLocalParameterTie(const QString &parName, int i) const override; + QString getLocalParameterConstraint(const QString &parName, + int i) const override; + void setLocalParameterValue(const QString &parName, int i, + double value) override; + void setLocalParameterValue(const QString &parName, int i, double value, + double error) override; + void setLocalParameterFixed(const QString &parName, int i, + bool fixed) override; + void setLocalParameterTie(const QString &parName, int i, + const QString &tie) override; + void setLocalParameterConstraint(const QString &parName, int i, + const QString &constraint) override; + QString setBackgroundA0(double value) override; + + void updateMultiDatasetParameters(const ITableWorkspace ¶mTable); + void setNumberOfExponentials(int); + int getNumberOfExponentials() const; + void setStretchExponential(bool); + bool hasStretchExponential() const; + void setBackground(const QString &name); + void removeBackground(); + bool hasBackground() const; + void tieIntensities(bool on); + void + updateParameterEstimationData(DataForParameterEstimationCollection &&data); + + enum class ParamID { + EXP1_HEIGHT, + EXP1_LIFETIME, + EXP2_HEIGHT, + EXP2_LIFETIME, + STRETCH_HEIGHT, + STRETCH_LIFETIME, + STRETCH_STRETCHING, + BG_A0 + }; + QMap<ParamID, double> getCurrentValues() const; + QMap<ParamID, double> getCurrentErrors() const; + QMap<int, QString> getParameterNameMap() const; + QMap<int, std::string> getParameterDescriptionMap() const; + +private: + void clearData(); + QString buildFunctionString() const; + boost::optional<QString> getExp1Prefix() const; + boost::optional<QString> getExp2Prefix() const; + boost::optional<QString> getStretchPrefix() const; + boost::optional<QString> getBackgroundPrefix() const; + void setParameter(ParamID name, double value); + boost::optional<double> getParameter(ParamID name) const; + boost::optional<double> getParameterError(ParamID name) const; + boost::optional<QString> getParameterName(ParamID name) const; + boost::optional<QString> getParameterDescription(ParamID name) const; + boost::optional<QString> getPrefix(ParamID name) const; + void setCurrentValues(const QMap<ParamID, double> &); + void applyParameterFunction(std::function<void(ParamID)> paramFun) const; + boost::optional<ParamID> getParameterId(const QString &parName); + std::string buildExpDecayFunctionString() const; + std::string buildStretchExpFunctionString() const; + std::string buildBackgroundFunctionString() const; + void estimateStretchExpParameters(); + void addGlobal(const QString &parName); + void removeGlobal(const QString &parName); + QStringList makeGlobalList() const; + + FunctionModel m_model; + int m_numberOfExponentials = 0; + bool m_hasStretchExponential = false; + QString m_background; + DataForParameterEstimationCollection m_estimationData; + QList<ParamID> m_globals; +}; + +} // namespace IDA +} // namespace CustomInterfaces +} // namespace MantidQt + +#endif /* MANTIDQT_INDIRECT_IQTFUNCTIONMODEL_H_ */ diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.cpp b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2bd0bacf2b4003c5b818562297daf1fbeb46b461 --- /dev/null +++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.cpp @@ -0,0 +1,398 @@ +// 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 +// SPDX - License - Identifier: GPL - 3.0 + +#include "IqtTemplateBrowser.h" + +#include "MantidAPI/CostFunctionFactory.h" +#include "MantidAPI/FuncMinimizerFactory.h" +#include "MantidAPI/IAlgorithm.h" +#include "MantidAPI/IFuncMinimizer.h" +#include "MantidAPI/ITableWorkspace.h" +#include "MantidAPI/IWorkspaceProperty.h" +#include "MantidKernel/PropertyWithValue.h" + +#include "MantidQtWidgets/Common/FunctionBrowser/FunctionBrowserUtils.h" +#include "MantidQtWidgets/Common/QtPropertyBrowser/ButtonEditorFactory.h" +#include "MantidQtWidgets/Common/QtPropertyBrowser/CompositeEditorFactory.h" +#include "MantidQtWidgets/Common/QtPropertyBrowser/DoubleEditorFactory.h" +#include "MantidQtWidgets/Common/QtPropertyBrowser/qteditorfactory.h" +#include "MantidQtWidgets/Common/QtPropertyBrowser/qtpropertymanager.h" +#include "MantidQtWidgets/Common/QtPropertyBrowser/qttreepropertybrowser.h" + +#include <QMessageBox> +#include <QSettings> +#include <QVBoxLayout> + +#include <iostream> +#include <limits> + +namespace MantidQt { +namespace CustomInterfaces { +namespace IDA { + +/** + * Constructor + * @param parent :: The parent widget. + */ +IqtTemplateBrowser::IqtTemplateBrowser(QWidget *parent) + : FunctionTemplateBrowser(parent), m_presenter(this) { + connect(&m_presenter, SIGNAL(functionStructureChanged()), this, + SIGNAL(functionStructureChanged())); +} + +void IqtTemplateBrowser::createProperties() { + m_parameterManager->blockSignals(true); + m_boolManager->blockSignals(true); + m_enumManager->blockSignals(true); + m_exp1Height = m_parameterManager->addProperty("f0.Height"); + m_parameterManager->setDecimals(m_exp1Height, 6); + m_exp1Lifetime = m_parameterManager->addProperty("f0.Lifetime"); + m_parameterManager->setDecimals(m_exp1Lifetime, 6); + m_exp2Height = m_parameterManager->addProperty("f1.Height"); + m_parameterManager->setDecimals(m_exp2Height, 6); + m_exp2Lifetime = m_parameterManager->addProperty("f1.Lifetime"); + m_parameterManager->setDecimals(m_exp2Lifetime, 6); + m_stretchExpHeight = m_parameterManager->addProperty("Height"); + m_parameterManager->setDecimals(m_stretchExpHeight, 6); + m_stretchExpLifetime = m_parameterManager->addProperty("Lifetime"); + m_parameterManager->setDecimals(m_stretchExpLifetime, 6); + m_stretchExpStretching = m_parameterManager->addProperty("Stretching"); + m_parameterManager->setDecimals(m_stretchExpStretching, 6); + m_A0 = m_parameterManager->addProperty("A0"); + m_parameterManager->setDecimals(m_A0, 6); + + m_parameterMap[m_exp1Height] = 0; + m_parameterMap[m_exp1Lifetime] = 1; + m_parameterMap[m_exp2Height] = 2; + m_parameterMap[m_exp2Lifetime] = 3; + m_parameterMap[m_stretchExpHeight] = 4; + m_parameterMap[m_stretchExpLifetime] = 5; + m_parameterMap[m_stretchExpStretching] = 6; + m_parameterMap[m_A0] = 7; + + m_presenter.setViewParameterDescriptions(); + + m_parameterManager->setDescription(m_exp1Height, + m_parameterDescriptions[m_exp1Height]); + m_parameterManager->setDescription(m_exp1Lifetime, + m_parameterDescriptions[m_exp1Lifetime]); + m_parameterManager->setDescription(m_exp2Height, + m_parameterDescriptions[m_exp2Height]); + m_parameterManager->setDescription(m_exp2Lifetime, + m_parameterDescriptions[m_exp2Lifetime]); + m_parameterManager->setDescription( + m_stretchExpHeight, m_parameterDescriptions[m_stretchExpHeight]); + m_parameterManager->setDescription( + m_stretchExpLifetime, m_parameterDescriptions[m_stretchExpLifetime]); + m_parameterManager->setDescription( + m_stretchExpStretching, m_parameterDescriptions[m_stretchExpStretching]); + m_parameterManager->setDescription(m_A0, m_parameterDescriptions[m_A0]); + + m_numberOfExponentials = m_intManager->addProperty("Exponentials"); + m_intManager->setMinimum(m_numberOfExponentials, 0); + m_intManager->setMaximum(m_numberOfExponentials, 2); + m_browser->addProperty(m_numberOfExponentials); + + m_stretchExponential = m_boolManager->addProperty("Stretch Exponential"); + m_browser->addProperty(m_stretchExponential); + + m_background = m_enumManager->addProperty("Background"); + QStringList backgrounds; + backgrounds << "None" + << "FlatBackground"; + m_enumManager->setEnumNames(m_background, backgrounds); + m_browser->addProperty(m_background); + + m_tieIntensities = m_boolManager->addProperty("Tie Intensities"); + m_browser->addProperty(m_tieIntensities); + m_parameterManager->blockSignals(false); + m_enumManager->blockSignals(false); + m_boolManager->blockSignals(false); + updateState(); +} + +void IqtTemplateBrowser::addExponentialOne() { + m_numberOfExponentials->addSubProperty(m_exp1Height); + m_numberOfExponentials->addSubProperty(m_exp1Lifetime); + ScopedFalse _false(m_emitIntChange); + m_intManager->setValue(m_numberOfExponentials, 1); +} + +void IqtTemplateBrowser::removeExponentialOne() { + m_numberOfExponentials->removeSubProperty(m_exp1Height); + m_numberOfExponentials->removeSubProperty(m_exp1Lifetime); + ScopedFalse _false(m_emitIntChange); + m_intManager->setValue(m_numberOfExponentials, 0); +} + +void IqtTemplateBrowser::addExponentialTwo() { + m_numberOfExponentials->addSubProperty(m_exp2Height); + m_numberOfExponentials->addSubProperty(m_exp2Lifetime); + ScopedFalse _false(m_emitIntChange); + m_intManager->setValue(m_numberOfExponentials, 2); +} + +void IqtTemplateBrowser::removeExponentialTwo() { + m_numberOfExponentials->removeSubProperty(m_exp2Height); + m_numberOfExponentials->removeSubProperty(m_exp2Lifetime); + ScopedFalse _false(m_emitIntChange); + m_intManager->setValue(m_numberOfExponentials, 1); +} + +void IqtTemplateBrowser::addStretchExponential() { + m_stretchExponential->addSubProperty(m_stretchExpHeight); + m_stretchExponential->addSubProperty(m_stretchExpLifetime); + m_stretchExponential->addSubProperty(m_stretchExpStretching); + ScopedFalse _false(m_emitBoolChange); + m_boolManager->setValue(m_stretchExponential, true); +} + +void IqtTemplateBrowser::removeStretchExponential() { + m_stretchExponential->removeSubProperty(m_stretchExpHeight); + m_stretchExponential->removeSubProperty(m_stretchExpLifetime); + m_stretchExponential->removeSubProperty(m_stretchExpStretching); + ScopedFalse _false(m_emitBoolChange); + m_boolManager->setValue(m_stretchExponential, false); +} + +void IqtTemplateBrowser::addFlatBackground() { + m_background->addSubProperty(m_A0); + ScopedFalse _false(m_emitEnumChange); + m_enumManager->setValue(m_background, 1); +} + +void IqtTemplateBrowser::removeBackground() { + m_background->removeSubProperty(m_A0); + ScopedFalse _false(m_emitEnumChange); + m_enumManager->setValue(m_background, 0); +} + +void IqtTemplateBrowser::setExp1Height(double value, double error) { + setParameterPropertyValue(m_exp1Height, value, error); +} + +void IqtTemplateBrowser::setExp1Lifetime(double value, double error) { + setParameterPropertyValue(m_exp1Lifetime, value, error); +} + +void IqtTemplateBrowser::setExp2Height(double value, double error) { + setParameterPropertyValue(m_exp2Height, value, error); +} + +void IqtTemplateBrowser::setExp2Lifetime(double value, double error) { + setParameterPropertyValue(m_exp2Lifetime, value, error); +} + +void IqtTemplateBrowser::setStretchHeight(double value, double error) { + setParameterPropertyValue(m_stretchExpHeight, value, error); +} + +void IqtTemplateBrowser::setStretchLifetime(double value, double error) { + setParameterPropertyValue(m_stretchExpLifetime, value, error); +} + +void IqtTemplateBrowser::setStretchStretching(double value, double error) { + setParameterPropertyValue(m_stretchExpStretching, value, error); +} + +void IqtTemplateBrowser::setA0(double value, double error) { + setParameterPropertyValue(m_A0, value, error); +} + +void IqtTemplateBrowser::setFunction(const QString &funStr) { + m_presenter.setFunction(funStr); +} + +IFunction_sptr IqtTemplateBrowser::getGlobalFunction() const { + return m_presenter.getGlobalFunction(); +} + +IFunction_sptr IqtTemplateBrowser::getFunction() const { + return m_presenter.getFunction(); +} + +void IqtTemplateBrowser::setNumberOfDatasets(int n) { + m_presenter.setNumberOfDatasets(n); +} + +int IqtTemplateBrowser::getNumberOfDatasets() const { + return m_presenter.getNumberOfDatasets(); +} + +void IqtTemplateBrowser::setDatasetNames(const QStringList &names) { + m_presenter.setDatasetNames(names); +} + +QStringList IqtTemplateBrowser::getGlobalParameters() const { + return m_presenter.getGlobalParameters(); +} + +QStringList IqtTemplateBrowser::getLocalParameters() const { + return m_presenter.getLocalParameters(); +} + +void IqtTemplateBrowser::setGlobalParameters(const QStringList &globals) { + m_presenter.setGlobalParameters(globals); +} + +void IqtTemplateBrowser::intChanged(QtProperty *prop) { + if (prop == m_numberOfExponentials && m_emitIntChange) { + m_presenter.setNumberOfExponentials(m_intManager->value(prop)); + } +} + +void IqtTemplateBrowser::boolChanged(QtProperty *prop) { + if (!m_emitBoolChange) + return; + auto const on = m_boolManager->value(prop); + if (prop == m_stretchExponential) { + m_presenter.setStretchExponential(on); + } + if (prop == m_tieIntensities) { + m_presenter.tieIntensities(on); + } +} + +void IqtTemplateBrowser::enumChanged(QtProperty *prop) { + if (!m_emitEnumChange) + return; + if (prop == m_background) { + auto background = + m_enumManager->enumNames(prop)[m_enumManager->value(prop)]; + m_presenter.setBackground(background); + } +} + +void IqtTemplateBrowser::globalChanged(QtProperty *prop, const QString &name, + bool on) { + std::cerr << "Global " << name.toStdString() << ' ' << on << std::endl; +} + +void IqtTemplateBrowser::parameterChanged(QtProperty *prop) { + auto isGlobal = m_parameterManager->isGlobal(prop); + m_presenter.setGlobal(m_actualParameterNames[prop], isGlobal); + if (m_emitParameterValueChange) { + emit parameterValueChanged(m_actualParameterNames[prop], + m_parameterManager->value(prop)); + } +} + +void IqtTemplateBrowser::parameterButtonClicked(QtProperty *prop) { + emit localParameterButtonClicked(m_actualParameterNames[prop]); +} + +void IqtTemplateBrowser::updateMultiDatasetParameters(const IFunction &fun) { + m_presenter.updateMultiDatasetParameters(fun); +} + +void IqtTemplateBrowser::updateMultiDatasetParameters( + const ITableWorkspace ¶mTable) { + m_presenter.updateMultiDatasetParameters(paramTable); +} + +void IqtTemplateBrowser::updateParameters(const IFunction &fun) { + m_presenter.updateParameters(fun); +} + +void IqtTemplateBrowser::setCurrentDataset(int i) { + m_presenter.setCurrentDataset(i); +} + +void IqtTemplateBrowser::updateParameterNames( + const QMap<int, QString> ¶meterNames) { + m_actualParameterNames.clear(); + ScopedFalse _false(m_emitParameterValueChange); + for (auto const prop : m_parameterMap.keys()) { + auto const i = m_parameterMap[prop]; + auto const name = parameterNames[i]; + m_actualParameterNames[prop] = name; + if (!name.isEmpty()) { + prop->setPropertyName(name); + } + } +} + +void IqtTemplateBrowser::updateParameterDescriptions( + const QMap<int, std::string> ¶meterDescriptions) { + m_parameterDescriptions.clear(); + for (auto const prop : m_parameterMap.keys()) { + auto const i = m_parameterMap[prop]; + m_parameterDescriptions[prop] = parameterDescriptions[i]; + } +} + +void IqtTemplateBrowser::setErrorsEnabled(bool enabled) { + ScopedFalse _false(m_emitParameterValueChange); + m_parameterManager->setErrorsEnabled(enabled); +} + +void IqtTemplateBrowser::clear() { + removeBackground(); + removeStretchExponential(); + removeExponentialTwo(); + removeExponentialOne(); +} + +void IqtTemplateBrowser::updateParameterEstimationData( + DataForParameterEstimationCollection &&data) { + m_presenter.updateParameterEstimationData(std::move(data)); +} + +void IqtTemplateBrowser::setBackgroundA0(double value) { + m_presenter.setBackgroundA0(value); +} + +void IqtTemplateBrowser::popupMenu(const QPoint &) { + std::cerr << "Popup" << std::endl; +} + +double IqtTemplateBrowser::getParameterPropertyValue(QtProperty *prop) const { + return prop ? m_parameterManager->value(prop) : 0.0; +} + +void IqtTemplateBrowser::setParameterPropertyValue(QtProperty *prop, + double value, double error) { + if (prop) { + ScopedFalse _false(m_emitParameterValueChange); + m_parameterManager->setValue(prop, value); + m_parameterManager->setError(prop, error); + } +} + +void IqtTemplateBrowser::setGlobalParametersQuiet(const QStringList &globals) { + ScopedFalse _false(m_emitParameterValueChange); + auto parameterProperies = m_parameterMap.keys(); + for (auto const prop : m_parameterMap.keys()) { + auto const name = m_actualParameterNames[prop]; + if (globals.contains(name)) { + m_parameterManager->setGlobal(prop, true); + parameterProperies.removeOne(prop); + } + } + for (auto const prop : parameterProperies) { + if (!m_actualParameterNames[prop].isEmpty()) { + m_parameterManager->setGlobal(prop, false); + } + } +} + +void IqtTemplateBrowser::setTieIntensitiesQuiet(bool on) { + ScopedFalse _false(m_emitBoolChange); + m_boolManager->setValue(m_tieIntensities, on); +} + +void IqtTemplateBrowser::updateState() { + auto const on = m_presenter.canTieIntensities(); + if (!on && m_boolManager->value(m_tieIntensities)) { + ScopedFalse _false(m_emitBoolChange); + m_boolManager->setValue(m_tieIntensities, false); + } + m_tieIntensities->setEnabled(on); +} + +} // namespace IDA +} // namespace CustomInterfaces +} // namespace MantidQt diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.h b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.h new file mode 100644 index 0000000000000000000000000000000000000000..0d89cd893fbba190945e972a52c6210d17df8b10 --- /dev/null +++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.h @@ -0,0 +1,120 @@ +// 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 +// SPDX - License - Identifier: GPL - 3.0 + +#ifndef INDIRECT_IQTTEMPLATEBROWSER_H_ +#define INDIRECT_IQTTEMPLATEBROWSER_H_ + +#include "DllConfig.h" +#include "FunctionTemplateBrowser.h" +#include "IqtTemplatePresenter.h" + +#include <QMap> +#include <QWidget> + +class QtProperty; + +namespace MantidQt { +namespace CustomInterfaces { +namespace IDA { + +/** + * Class FunctionTemplateBrowser implements QtPropertyBrowser to display + * and set properties that can be used to generate a fit function. + * + */ +class MANTIDQT_INDIRECT_DLL IqtTemplateBrowser + : public FunctionTemplateBrowser { + Q_OBJECT +public: + explicit IqtTemplateBrowser(QWidget *parent = nullptr); + void addExponentialOne(); + void removeExponentialOne(); + void addExponentialTwo(); + void removeExponentialTwo(); + void addStretchExponential(); + void removeStretchExponential(); + void addFlatBackground(); + void removeBackground(); + + void setExp1Height(double, double); + void setExp1Lifetime(double, double); + void setExp2Height(double, double); + void setExp2Lifetime(double, double); + void setStretchHeight(double, double); + void setStretchLifetime(double, double); + void setStretchStretching(double, double); + void setA0(double, double); + + void setFunction(const QString &funStr) override; + IFunction_sptr getGlobalFunction() const override; + IFunction_sptr getFunction() const override; + void setNumberOfDatasets(int) override; + int getNumberOfDatasets() const override; + void setDatasetNames(const QStringList &names) override; + QStringList getGlobalParameters() const override; + QStringList getLocalParameters() const override; + void setGlobalParameters(const QStringList &globals) override; + void updateMultiDatasetParameters(const IFunction &fun) override; + void updateMultiDatasetParameters(const ITableWorkspace ¶mTable) override; + void updateParameters(const IFunction &fun) override; + void setCurrentDataset(int i) override; + void updateParameterNames(const QMap<int, QString> ¶meterNames) override; + void updateParameterDescriptions( + const QMap<int, std::string> ¶meterNames); // override; + void setErrorsEnabled(bool enabled) override; + void clear() override; + void updateParameterEstimationData( + DataForParameterEstimationCollection &&data) override; + void setBackgroundA0(double value) override; + void setResolution(std::string const &, DatasetIndex const &) override {} + +protected slots: + void intChanged(QtProperty *) override; + void boolChanged(QtProperty *) override; + void enumChanged(QtProperty *) override; + void globalChanged(QtProperty *, const QString &, bool) override; + void parameterChanged(QtProperty *) override; + void parameterButtonClicked(QtProperty *) override; + +private: + void createProperties() override; + void popupMenu(const QPoint &) override; + double getParameterPropertyValue(QtProperty *prop) const; + void setParameterPropertyValue(QtProperty *prop, double value, double error); + void setGlobalParametersQuiet(const QStringList &globals); + void setTieIntensitiesQuiet(bool on); + void updateState(); + + QtProperty *m_numberOfExponentials; + QtProperty *m_exp1Height = nullptr; + QtProperty *m_exp1Lifetime = nullptr; + QtProperty *m_exp2Height = nullptr; + QtProperty *m_exp2Lifetime = nullptr; + QtProperty *m_stretchExponential; + QtProperty *m_stretchExpHeight = nullptr; + QtProperty *m_stretchExpLifetime = nullptr; + QtProperty *m_stretchExpStretching = nullptr; + QtProperty *m_background; + QtProperty *m_A0 = nullptr; + QtProperty *m_tieIntensities = nullptr; + QMap<QtProperty *, int> m_parameterMap; + QMap<QtProperty *, QString> m_actualParameterNames; + QMap<QtProperty *, std::string> m_parameterDescriptions; + +private: + IqtTemplatePresenter m_presenter; + bool m_emitParameterValueChange = true; + bool m_emitIntChange = true; + bool m_emitBoolChange = true; + bool m_emitEnumChange = true; + friend class IqtTemplatePresenter; +}; + +} // namespace IDA +} // namespace CustomInterfaces +} // namespace MantidQt + +#endif /*INDIRECT_IQTTEMPLATEBROWSER_H_*/ diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..16b45560141a9dfdadac125031585a7b17a0950d --- /dev/null +++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.cpp @@ -0,0 +1,361 @@ +// 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 +// SPDX - License - Identifier: GPL - 3.0 + +#include "IqtTemplatePresenter.h" +#include "IqtTemplateBrowser.h" +#include "MantidQtWidgets/Common/EditLocalParameterDialog.h" + +#include <cmath> +#include <iostream> + +namespace MantidQt { +namespace CustomInterfaces { +namespace IDA { + +using namespace MantidWidgets; + +/** + * Constructor + * @param parent :: The parent widget. + */ +IqtTemplatePresenter::IqtTemplatePresenter(IqtTemplateBrowser *view) + : QObject(view), m_view(view) { + 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))); +} + +void IqtTemplatePresenter::setNumberOfExponentials(int n) { + if (n < 0) { + throw std::logic_error( + "The number of exponents cannot be a negative number."); + } + if (n > 2) { + throw std::logic_error("The number of exponents is limited to 2."); + } + auto nCurrent = m_model.getNumberOfExponentials(); + if (n == 0) { + if (nCurrent == 2) { + m_view->removeExponentialTwo(); + --nCurrent; + } + if (nCurrent == 1) { + m_view->removeExponentialOne(); + --nCurrent; + } + } else if (n == 1) { + if (nCurrent == 0) { + m_view->addExponentialOne(); + ++nCurrent; + } else { + m_view->removeExponentialTwo(); + --nCurrent; + } + } else /*n == 2*/ { + if (nCurrent == 0) { + m_view->addExponentialOne(); + ++nCurrent; + } + if (nCurrent == 1) { + m_view->addExponentialTwo(); + ++nCurrent; + } + } + assert(nCurrent == n); + m_model.setNumberOfExponentials(n); + setErrorsEnabled(false); + updateView(); + emit functionStructureChanged(); +} + +void IqtTemplatePresenter::setStretchExponential(bool on) { + if (on == m_model.hasStretchExponential()) + return; + if (on) { + m_view->addStretchExponential(); + } else { + m_view->removeStretchExponential(); + } + m_model.setStretchExponential(on); + setErrorsEnabled(false); + updateView(); + emit functionStructureChanged(); +} + +void IqtTemplatePresenter::setBackground(const QString &name) { + if (name == "None") { + m_view->removeBackground(); + m_model.removeBackground(); + } else if (name == "FlatBackground") { + m_view->addFlatBackground(); + m_model.setBackground(name); + } else { + throw std::logic_error("Browser doesn't support background " + + name.toStdString()); + } + setErrorsEnabled(false); + updateView(); + emit functionStructureChanged(); +} + +void IqtTemplatePresenter::setNumberOfDatasets(int n) { + m_model.setNumberDomains(n); +} + +int IqtTemplatePresenter::getNumberOfDatasets() const { + return m_model.getNumberDomains(); +} + +void IqtTemplatePresenter::setFunction(const QString &funStr) { + m_model.setFunctionString(funStr); + m_view->clear(); + setErrorsEnabled(false); + if (m_model.hasBackground()) { + m_view->addFlatBackground(); + } + if (m_model.hasStretchExponential()) { + m_view->addStretchExponential(); + } + auto const nExp = m_model.getNumberOfExponentials(); + if (nExp > 0) { + m_view->addExponentialOne(); + } + if (nExp > 1) { + m_view->addExponentialTwo(); + } + updateView(); + emit functionStructureChanged(); +} + +IFunction_sptr IqtTemplatePresenter::getGlobalFunction() const { + return m_model.getFitFunction(); +} + +IFunction_sptr IqtTemplatePresenter::getFunction() const { + return m_model.getCurrentFunction(); +} + +QStringList IqtTemplatePresenter::getGlobalParameters() const { + return m_model.getGlobalParameters(); +} + +QStringList IqtTemplatePresenter::getLocalParameters() const { + return m_model.getLocalParameters(); +} + +void IqtTemplatePresenter::setGlobalParameters(const QStringList &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()); +} + +void IqtTemplatePresenter::updateMultiDatasetParameters(const IFunction &fun) { + m_model.updateMultiDatasetParameters(fun); + updateViewParameters(); +} + +void IqtTemplatePresenter::updateMultiDatasetParameters( + const ITableWorkspace ¶mTable) { + m_model.updateMultiDatasetParameters(paramTable); + updateViewParameters(); +} + +void IqtTemplatePresenter::updateParameters(const IFunction &fun) { + m_model.updateParameters(fun); + updateViewParameters(); +} + +void IqtTemplatePresenter::setCurrentDataset(int i) { + m_model.setCurrentDomainIndex(i); + updateViewParameters(); +} + +void IqtTemplatePresenter::setDatasetNames(const QStringList &names) { + m_model.setDatasetNames(names); +} + +void IqtTemplatePresenter::setViewParameterDescriptions() { + m_view->updateParameterDescriptions(m_model.getParameterDescriptionMap()); +} + +void IqtTemplatePresenter::setErrorsEnabled(bool enabled) { + m_view->setErrorsEnabled(enabled); +} + +void IqtTemplatePresenter::tieIntensities(bool on) { + if (on && !canTieIntensities()) + return; + m_model.tieIntensities(on); + emit functionStructureChanged(); +} + +bool IqtTemplatePresenter::canTieIntensities() const { + return (m_model.hasStretchExponential() || + m_model.getNumberOfExponentials() > 0) && + m_model.hasBackground(); +} + +void IqtTemplatePresenter::updateParameterEstimationData( + DataForParameterEstimationCollection &&data) { + m_model.updateParameterEstimationData(std::move(data)); +} + +void IqtTemplatePresenter::setBackgroundA0(double value) { + m_model.setBackgroundA0(value); + m_view->setA0(value, 0.0); +} + +void IqtTemplatePresenter::updateViewParameters() { + static std::map<IqtFunctionModel::ParamID, + void (IqtTemplateBrowser::*)(double, double)> + setters{{IqtFunctionModel::ParamID::EXP1_HEIGHT, + &IqtTemplateBrowser::setExp1Height}, + {IqtFunctionModel::ParamID::EXP1_LIFETIME, + &IqtTemplateBrowser::setExp1Lifetime}, + {IqtFunctionModel::ParamID::EXP2_HEIGHT, + &IqtTemplateBrowser::setExp2Height}, + {IqtFunctionModel::ParamID::EXP2_LIFETIME, + &IqtTemplateBrowser::setExp2Lifetime}, + {IqtFunctionModel::ParamID::STRETCH_HEIGHT, + &IqtTemplateBrowser::setStretchHeight}, + {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(); + for (auto const name : values.keys()) { + (m_view->*setters.at(name))(values[name], errors[name]); + } +} + +QStringList IqtTemplatePresenter::getDatasetNames() const { + return m_model.getDatasetNames(); +} + +double IqtTemplatePresenter::getLocalParameterValue(const QString &parName, + int i) const { + return m_model.getLocalParameterValue(parName, i); +} + +bool IqtTemplatePresenter::isLocalParameterFixed(const QString &parName, + int i) const { + return m_model.isLocalParameterFixed(parName, i); +} + +QString IqtTemplatePresenter::getLocalParameterTie(const QString &parName, + int i) const { + return m_model.getLocalParameterTie(parName, i); +} + +QString +IqtTemplatePresenter::getLocalParameterConstraint(const QString &parName, + int i) const { + return m_model.getLocalParameterConstraint(parName, i); +} + +void IqtTemplatePresenter::setLocalParameterValue(const QString &parName, int i, + double value) { + m_model.setLocalParameterValue(parName, i, value); +} + +void IqtTemplatePresenter::setLocalParameterTie(const QString &parName, int i, + const QString &tie) { + m_model.setLocalParameterTie(parName, i, tie); +} + +void IqtTemplatePresenter::updateViewParameterNames() { + m_view->updateParameterNames(m_model.getParameterNameMap()); +} + +void IqtTemplatePresenter::updateView() { + updateViewParameterNames(); + updateViewParameters(); + m_view->updateState(); +} + +void IqtTemplatePresenter::setLocalParameterFixed(const QString &parName, int i, + bool fixed) { + m_model.setLocalParameterFixed(parName, i, fixed); +} + +void IqtTemplatePresenter::editLocalParameter(const QString &parName) { + auto const wsNames = getDatasetNames(); + QList<double> values; + QList<bool> fixes; + QStringList ties; + QStringList constraints; + const int n = wsNames.size(); + for (int i = 0; i < n; ++i) { + const double value = getLocalParameterValue(parName, i); + values.push_back(value); + const bool fixed = isLocalParameterFixed(parName, i); + fixes.push_back(fixed); + const auto tie = getLocalParameterTie(parName, i); + ties.push_back(tie); + const auto constraint = getLocalParameterConstraint(parName, i); + constraints.push_back(constraint); + } + + m_editLocalParameterDialog = new EditLocalParameterDialog( + m_view, parName, wsNames, values, fixes, ties, constraints); + connect(m_editLocalParameterDialog, SIGNAL(finished(int)), this, + SLOT(editLocalParameterFinish(int))); + m_editLocalParameterDialog->open(); +} + +void IqtTemplatePresenter::editLocalParameterFinish(int result) { + if (result == QDialog::Accepted) { + auto parName = m_editLocalParameterDialog->getParameterName(); + auto values = m_editLocalParameterDialog->getValues(); + auto fixes = m_editLocalParameterDialog->getFixes(); + auto ties = m_editLocalParameterDialog->getTies(); + assert(values.size() == getNumberOfDatasets()); + for (int i = 0; i < values.size(); ++i) { + setLocalParameterValue(parName, i, values[i]); + if (!ties[i].isEmpty()) { + setLocalParameterTie(parName, i, ties[i]); + } else if (fixes[i]) { + setLocalParameterFixed(parName, i, fixes[i]); + } else { + setLocalParameterTie(parName, i, ""); + } + } + } + m_editLocalParameterDialog = nullptr; + updateViewParameters(); + emit functionStructureChanged(); +} + +void IqtTemplatePresenter::viewChangedParameterValue(const QString &parName, + double value) { + if (parName.isEmpty()) + return; + 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); + if (fabs(value - oldValue) > 1e-6) { + setErrorsEnabled(false); + } + setLocalParameterValue(parName, i, value); + } + emit functionStructureChanged(); +} + +} // namespace IDA +} // namespace CustomInterfaces +} // namespace MantidQt diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.h b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.h new file mode 100644 index 0000000000000000000000000000000000000000..b87c34bd4dae7a17798cb4835c24e0d8d33f386b --- /dev/null +++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.h @@ -0,0 +1,91 @@ +// 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 +// SPDX - License - Identifier: GPL - 3.0 + +#ifndef INDIRECT_IQTTEMPLATEPRESENTER_H_ +#define INDIRECT_IQTTEMPLATEPRESENTER_H_ + +#include "DllConfig.h" +#include "IqtFunctionModel.h" +#include "ParameterEstimation.h" + +#include <QMap> +#include <QWidget> + +class QtProperty; + +namespace MantidQt { +namespace MantidWidgets { +class EditLocalParameterDialog; +} +namespace CustomInterfaces { +namespace IDA { + +class IqtTemplateBrowser; + +/** + * Class FunctionTemplateBrowser implements QtPropertyBrowser to display + * and set properties that can be used to generate a fit function. + * + */ +class MANTIDQT_INDIRECT_DLL IqtTemplatePresenter : public QObject { + Q_OBJECT +public: + explicit IqtTemplatePresenter(IqtTemplateBrowser *view); + void setNumberOfExponentials(int); + void setStretchExponential(bool); + void setBackground(const QString &name); + void setNumberOfDatasets(int); + int getNumberOfDatasets() const; + void setFunction(const QString &funStr); + IFunction_sptr getGlobalFunction() const; + IFunction_sptr getFunction() const; + QStringList getGlobalParameters() const; + QStringList getLocalParameters() const; + void setGlobalParameters(const QStringList &globals); + void setGlobal(const QString &parName, bool on); + void updateMultiDatasetParameters(const IFunction &fun); + void updateMultiDatasetParameters(const ITableWorkspace ¶mTable); + void updateParameters(const IFunction &fun); + void setCurrentDataset(int i); + void setDatasetNames(const QStringList &names); + void setViewParameterDescriptions(); + void setErrorsEnabled(bool enabled); + void tieIntensities(bool on); + bool canTieIntensities() const; + void + updateParameterEstimationData(DataForParameterEstimationCollection &&data); + void setBackgroundA0(double value); + +signals: + void functionStructureChanged(); + +private slots: + void editLocalParameter(const QString &parName); + void editLocalParameterFinish(int result); + void viewChangedParameterValue(const QString &parName, double value); + +private: + void updateViewParameters(); + QStringList getDatasetNames() const; + double getLocalParameterValue(const QString &parName, int i) const; + bool isLocalParameterFixed(const QString &parName, int i) const; + QString getLocalParameterTie(const QString &parName, int i) const; + QString getLocalParameterConstraint(const QString &parName, int i) const; + void setLocalParameterValue(const QString &parName, int i, double value); + void setLocalParameterFixed(const QString &parName, int i, bool fixed); + void setLocalParameterTie(const QString &parName, int i, const QString &tie); + void updateViewParameterNames(); + void updateView(); + IqtTemplateBrowser *m_view; + IqtFunctionModel m_model; + EditLocalParameterDialog *m_editLocalParameterDialog; +}; + +} // namespace IDA +} // namespace CustomInterfaces +} // namespace MantidQt + +#endif /*INDIRECT_IQTTEMPLATEPRESENTER_H_*/ diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.cpp index 40abda2fcb881de8a2cbb98a22d0e0a4279a21bc..21bb570e99d894eea07e4679e95359a0bdcad9af 100644 --- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.cpp @@ -23,7 +23,7 @@ using namespace Mantid::Kernel::Strings; struct SetViewSpectra { explicit SetViewSpectra(IndirectSpectrumSelectionView *view) : m_view(view) {} - void operator()(const Spectra &spectra) const { + void operator()(const SpectraNew &spectra) const { if (spectra.isContinuous()) { m_view->displaySpectra(spectra.getMinMax()); } else { @@ -196,7 +196,7 @@ void IndirectSpectrumSelectionPresenter::setSpectraRange( } void IndirectSpectrumSelectionPresenter::setModelSpectra( - Spectra const &spectra) { + SpectraNew const &spectra) { try { m_model->setSpectra(spectra, m_activeIndex); m_spectraError.clear(); @@ -211,20 +211,20 @@ void IndirectSpectrumSelectionPresenter::setModelSpectra( void IndirectSpectrumSelectionPresenter::updateSpectraList( std::string const &spectraList) { - setModelSpectra(Spectra(createSpectraString(spectraList))); + setModelSpectra(SpectraNew(createSpectraString(spectraList))); emit spectraChanged(m_activeIndex); } void IndirectSpectrumSelectionPresenter::updateSpectraRange( WorkspaceIndex minimum, WorkspaceIndex maximum) { - setModelSpectra(Spectra(minimum, maximum)); + setModelSpectra(SpectraNew(minimum, maximum)); emit spectraChanged(m_activeIndex); } void IndirectSpectrumSelectionPresenter::setMaskSpectraList( std::string const &spectra) { if (m_spectraError.empty()) { - auto const intVec = vectorFromString<int>(spectra); + auto const intVec = vectorFromStringNew<int>(spectra); std::vector<WorkspaceIndex> vec(intVec.size()); std::transform(intVec.begin(), intVec.end(), vec.begin(), [](int i) { return WorkspaceIndex{i}; }); diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.h b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.h index f29c063f9fbb136df5ee1a09b658da4667365100..1bbcc0a1d17a487a20e62d9b7cb43ead2ce9e8e6 100644 --- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.h +++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.h @@ -57,7 +57,7 @@ private slots: private: void setSpectraRange(WorkspaceIndex minimum, WorkspaceIndex maximum); - void setModelSpectra(Spectra const &spectra); + void setModelSpectra(SpectraNew const &spectra); UserInputValidator validateSpectraString(); UserInputValidator &validateSpectraString(UserInputValidator &validator); diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenterLegacy.h b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenterLegacy.h index 3e43cd9dfdd937b60d0032e41fc37254a792ca53..60a57f7011181ab009073a4af7d46ffd39e2ae80 100644 --- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenterLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenterLegacy.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONPRESENTER_H_ -#define MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONPRESENTER_H_ +#ifndef MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONPRESENTERLEGACY_H_ +#define MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONPRESENTERLEGACY_H_ #include "IndirectFittingModelLegacy.h" #include "IndirectSpectrumSelectionViewLegacy.h" diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionView.cpp b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionView.cpp index 0bc300ebe4029189eb650eebebba48d7746e239c..33192f34c595335178b086576bcdbe36e9eca0ba 100644 --- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionView.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionView.cpp @@ -210,7 +210,7 @@ IndirectSpectrumSelectionView::createValidator(const QString ®ex) { UserInputValidator &IndirectSpectrumSelectionView::validateSpectraString( UserInputValidator &uiv) const { if (selectionMode() == SpectrumSelectionMode::STRING) - uiv.checkFieldIsValid("Spectra", m_selector->leSpectra, + uiv.checkFieldIsValid("SpectraNew", m_selector->leSpectra, m_selector->lbSpectraError); return uiv; } diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.cpp index 86eb8c583536cbc797eebd188ded794b16bc6882..636ed92d2087663166825109e903dbc064d943aa 100644 --- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.cpp @@ -51,8 +51,8 @@ IndirectSpectrumSelectionViewLegacy::IndirectSpectrumSelectionViewLegacy(QWidget IndirectSpectrumSelectionViewLegacy::~IndirectSpectrumSelectionViewLegacy() {} -SpectrumSelectionMode IndirectSpectrumSelectionViewLegacy::selectionMode() const { - return static_cast<SpectrumSelectionMode>( +SpectrumSelectionModeLegacy IndirectSpectrumSelectionViewLegacy::selectionMode() const { + return static_cast<SpectrumSelectionModeLegacy>( m_selector->swSpectraSelection->currentIndex()); } @@ -78,14 +78,14 @@ void IndirectSpectrumSelectionViewLegacy::displaySpectra( const std::string &spectraString) { setSpectraString(spectraString); m_selector->cbSelectionMode->setCurrentIndex( - static_cast<int>(SpectrumSelectionMode::STRING)); + static_cast<int>(SpectrumSelectionModeLegacy::STRING)); } void IndirectSpectrumSelectionViewLegacy::displaySpectra(int minimum, int maximum) { setMinimumSpectrum(minimum); setMaximumSpectrum(maximum); m_selector->cbSelectionMode->setCurrentIndex( - static_cast<int>(SpectrumSelectionMode::RANGE)); + static_cast<int>(SpectrumSelectionModeLegacy::RANGE)); } void IndirectSpectrumSelectionViewLegacy::setSpectraRange(int minimum, int maximum) { @@ -199,7 +199,7 @@ IndirectSpectrumSelectionViewLegacy::createValidator(const QString ®ex) { UserInputValidator &IndirectSpectrumSelectionViewLegacy::validateSpectraString( UserInputValidator &uiv) const { - if (selectionMode() == SpectrumSelectionMode::STRING) + if (selectionMode() == SpectrumSelectionModeLegacy::STRING) uiv.checkFieldIsValid("Spectra", m_selector->leSpectra, m_selector->lbSpectraError); return uiv; @@ -239,15 +239,15 @@ void IndirectSpectrumSelectionViewLegacy::clearMaskString() { } void IndirectSpectrumSelectionViewLegacy::enableMaskLineEdit(int doEnable) { - if (doEnable >= 0 || selectionMode() == SpectrumSelectionMode::RANGE) + if (doEnable >= 0 || selectionMode() == SpectrumSelectionModeLegacy::RANGE) m_selector->leMaskBins->setEnabled(true); else m_selector->leMaskBins->setEnabled(false); } void IndirectSpectrumSelectionViewLegacy::emitSpectraChanged(int modeIndex) { - const auto mode = static_cast<SpectrumSelectionMode>(modeIndex); - if (mode == SpectrumSelectionMode::RANGE) + const auto mode = static_cast<SpectrumSelectionModeLegacy>(modeIndex); + if (mode == SpectrumSelectionModeLegacy::RANGE) emitSpectraRangeChanged(); else emitSpectraStringChanged(); diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.h b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.h index c567bf8747d7514dcca23da69e2001ee0db40b7d..157c01afe3ee943e800e09cdc2636a70e8caa63a 100644 --- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.h +++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONVIEW_H_ -#define MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONVIEW_H_ +#ifndef MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONVIEWLEGACY_H_ +#define MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONVIEWLEGACY_H_ #include "ui_IndirectSpectrumSelector.h" @@ -20,7 +20,7 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { -enum class SpectrumSelectionMode { RANGE, STRING }; +enum class SpectrumSelectionModeLegacy { RANGE, STRING }; class MANTIDQT_INDIRECT_DLL IndirectSpectrumSelectionViewLegacy : public API::MantidWidget { @@ -30,7 +30,7 @@ public: IndirectSpectrumSelectionViewLegacy(QWidget *parent = nullptr); virtual ~IndirectSpectrumSelectionViewLegacy() override; - SpectrumSelectionMode selectionMode() const; + SpectrumSelectionModeLegacy selectionMode() const; virtual std::size_t minimumSpectrum() const; virtual std::size_t maximumSpectrum() const; diff --git a/qt/scientific_interfaces/Indirect/Iqt.cpp b/qt/scientific_interfaces/Indirect/Iqt.cpp index d1a59978190dccfefdee10a7a37d2930486bf956..2c9f0d32e236f546d696dd5af3f9d5d5cf7eebfa 100644 --- a/qt/scientific_interfaces/Indirect/Iqt.cpp +++ b/qt/scientific_interfaces/Indirect/Iqt.cpp @@ -150,7 +150,7 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { Iqt::Iqt(QWidget *parent) - : IndirectDataAnalysisTabLegacy(parent), m_iqtTree(nullptr), m_iqtResFileType() { + : IndirectDataAnalysisTab(parent), m_iqtTree(nullptr), m_iqtResFileType() { m_uiForm.setupUi(parent); setOutputPlotOptionsPresenter(std::make_unique<IndirectPlotOptionsPresenter>( m_uiForm.ipoPlotOptions, this, PlotWidget::SpectraTiled)); @@ -438,7 +438,7 @@ void Iqt::loadSettings(const QSettings &settings) { m_uiForm.dsResolution->readSettings(settings.group()); } -void Iqt::plotInput() { IndirectDataAnalysisTabLegacy::plotInput(m_uiForm.ppPlot); } +void Iqt::plotInput() { IndirectDataAnalysisTab::plotInput(m_uiForm.ppPlot); } void Iqt::setFileExtensionsByName(bool filter) { QStringList const noSuffixes{""}; @@ -471,7 +471,7 @@ void Iqt::plotInput(const QString &wsname) { setPreviewSpectrumMaximum( static_cast<int>(inputWorkspace()->getNumberHistograms()) - 1); - IndirectDataAnalysisTabLegacy::plotInput(m_uiForm.ppPlot); + IndirectDataAnalysisTab::plotInput(m_uiForm.ppPlot); auto xRangeSelector = m_uiForm.ppPlot->getRangeSelector("IqtRange"); try { diff --git a/qt/scientific_interfaces/Indirect/Iqt.h b/qt/scientific_interfaces/Indirect/Iqt.h index 806ab7790ce7a8f7c3d36c733c437528110b1752..9f67f30bbe6a7d7a2990f39d0547d45ed510c3e3 100644 --- a/qt/scientific_interfaces/Indirect/Iqt.h +++ b/qt/scientific_interfaces/Indirect/Iqt.h @@ -7,13 +7,13 @@ #ifndef MANTIDQTCUSTOMINTERFACESIDA_IQT_H_ #define MANTIDQTCUSTOMINTERFACESIDA_IQT_H_ -#include "IndirectDataAnalysisTabLegacy.h" +#include "IndirectDataAnalysisTab.h" #include "ui_Iqt.h" namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class DLLExport Iqt : public IndirectDataAnalysisTabLegacy { +class DLLExport Iqt : public IndirectDataAnalysisTab { Q_OBJECT public: @@ -25,7 +25,6 @@ private: bool validate() override; void loadSettings(const QSettings &settings) override; void setFileExtensionsByName(bool filter) override; - void setBrowserWorkspace() override{}; bool isErrorsEnabled(); diff --git a/qt/scientific_interfaces/Indirect/IqtFit.cpp b/qt/scientific_interfaces/Indirect/IqtFit.cpp index c26d10318471f3f9b53221e6714535b69083dcbd..31cac3e8bedf08a820f5551a56ca3a51fcba4b91 100644 --- a/qt/scientific_interfaces/Indirect/IqtFit.cpp +++ b/qt/scientific_interfaces/Indirect/IqtFit.cpp @@ -5,6 +5,7 @@ // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + #include "IqtFit.h" +#include "IndirectFunctionBrowser/IqtTemplateBrowser.h" #include "MantidQtWidgets/Common/UserInputValidator.h" @@ -23,6 +24,7 @@ #include <boost/algorithm/string/predicate.hpp> +using namespace Mantid; using namespace Mantid::API; namespace { @@ -34,74 +36,49 @@ namespace CustomInterfaces { namespace IDA { IqtFit::IqtFit(QWidget *parent) - : IndirectFitAnalysisTabLegacy(new IqtFitModel, parent), + : IndirectFitAnalysisTab(new IqtFitModel, parent), m_uiForm(new Ui::IqtFit) { m_uiForm->setupUi(parent); m_iqtFittingModel = dynamic_cast<IqtFitModel *>(fittingModel()); - setFitDataPresenter(std::make_unique<IndirectFitDataPresenterLegacy>( + setFitDataPresenter(std::make_unique<IndirectFitDataPresenter>( m_iqtFittingModel, m_uiForm->fitDataView)); setPlotView(m_uiForm->pvFitPlotView); setSpectrumSelectionView(m_uiForm->svSpectrumView); setOutputOptionsView(m_uiForm->ovOutputOptionsView); + auto templateBrowser = new IqtTemplateBrowser; + m_uiForm->fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser); setFitPropertyBrowser(m_uiForm->fitPropertyBrowser); setEditResultVisible(true); } void IqtFit::setupFitTab() { + // setSampleWSSuffices({"_iqt"}); + // setSampleFBSuffices({"_iqt.nxs"}); + // Create custom function groups auto &functionFactory = FunctionFactory::Instance(); const auto exponential = functionFactory.createFunction("ExpDecay"); const auto stretchedExponential = functionFactory.createFunction("StretchExp"); - addSpinnerFunctionGroup("Exponential", {exponential}, 0, 2); - addCheckBoxFunctionGroup("Stretched Exponential", {stretchedExponential}); - - // Add custom settings - addBoolCustomSetting("ConstrainIntensities", "Constrain Intensities"); - addBoolCustomSetting("ConstrainBeta", "Make Beta Global"); - addBoolCustomSetting("ExtractMembers", "Extract Members"); - setCustomSettingEnabled("ConstrainBeta", false); - setCustomSettingEnabled("ConstrainIntensities", false); - - // Set available background options - setBackgroundOptions({"None", "FlatBackground"}); connect(m_uiForm->pbRun, SIGNAL(clicked()), this, SLOT(runClicked())); - connect(this, SIGNAL(functionChanged()), this, SLOT(fitFunctionChanged())); - connect(this, SIGNAL(customBoolChanged(const QString &, bool)), this, - SLOT(customBoolUpdated(const QString &, bool))); -} - -void IqtFit::fitFunctionChanged() { - if (numberOfCustomFunctions("StretchExp") > 0) { - setCustomSettingEnabled("ConstrainBeta", true); - } else { - setCustomBoolSetting("ConstrainBeta", false); - setCustomSettingEnabled("ConstrainBeta", false); - } - setConstrainIntensitiesEnabled(m_iqtFittingModel->canConstrainIntensities()); - m_iqtFittingModel->setFitTypeString(fitTypeString()); } -void IqtFit::setConstrainIntensitiesEnabled(bool enabled) { - setCustomSettingEnabled("ConstrainIntensities", enabled); - if (!enabled) - setCustomBoolSetting("ConstrainIntensities", false); - else if (boolSettingValue("ConstrainIntensities")) { - if (m_iqtFittingModel->setConstrainIntensities(true)) - updateTies(); - } +EstimationDataSelector IqtFit::getEstimationDataSelector() const { + return + [](const MantidVec &x, const MantidVec &y) -> DataForParameterEstimation { + size_t const n = 4; + if (y.size() < n + 1) + return DataForParameterEstimation{{}, {}}; + return DataForParameterEstimation{{x[0], x[n]}, {y[0], y[n]}}; + }; } -void IqtFit::customBoolUpdated(const QString &key, bool value) { - if (key == "Constrain Intensities") { - if (m_iqtFittingModel->setConstrainIntensities(value)) - updateTies(); - } else if (key == "Make Beta Global") - m_iqtFittingModel->setBetaIsGlobal(value); +void IqtFit::fitFunctionChanged() { + m_iqtFittingModel->setFitTypeString(fitTypeString()); } std::string IqtFit::fitTypeString() const { @@ -118,9 +95,9 @@ std::string IqtFit::fitTypeString() const { } void IqtFit::setupFit(Mantid::API::IAlgorithm_sptr fitAlgorithm) { - fitAlgorithm->setProperty("ExtractMembers", - boolSettingValue("ExtractMembers")); - IndirectFitAnalysisTabLegacy::setupFit(fitAlgorithm); + // fitAlgorithm->setProperty("ExtractMembers", + // boolSettingValue("ExtractMembers")); + IndirectFitAnalysisTab::setupFit(fitAlgorithm); } void IqtFit::runClicked() { runTab(); } diff --git a/qt/scientific_interfaces/Indirect/IqtFit.h b/qt/scientific_interfaces/Indirect/IqtFit.h index c50ae3c751c48043654b65208043f00c05b5ff7c..21cebfdbf8f917fd0f0292433e9ecad16e4aa104 100644 --- a/qt/scientific_interfaces/Indirect/IqtFit.h +++ b/qt/scientific_interfaces/Indirect/IqtFit.h @@ -7,7 +7,7 @@ #ifndef MANTIDQTCUSTOMINTERFACESIDA_IQTFIT_H_ #define MANTIDQTCUSTOMINTERFACESIDA_IQTFIT_H_ -#include "IndirectFitAnalysisTabLegacy.h" +#include "IndirectFitAnalysisTab.h" #include "IqtFitModel.h" #include "MantidAPI/CompositeFunction.h" @@ -27,7 +27,7 @@ namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class DLLExport IqtFit : public IndirectFitAnalysisTabLegacy { +class DLLExport IqtFit : public IndirectFitAnalysisTab { Q_OBJECT public: @@ -40,7 +40,6 @@ public: protected slots: void setupFit(Mantid::API::IAlgorithm_sptr fitAlgorithm) override; void fitFunctionChanged(); - void customBoolUpdated(const QString &key, bool value); void runClicked(); protected: @@ -48,10 +47,9 @@ protected: void setRunEnabled(bool enable) override; private: - void setConstrainIntensitiesEnabled(bool enabled); std::string fitTypeString() const; - void setupFitTab() override; + EstimationDataSelector getEstimationDataSelector() const override; IqtFitModel *m_iqtFittingModel; std::unique_ptr<Ui::IqtFit> m_uiForm; diff --git a/qt/scientific_interfaces/Indirect/IqtFit.ui b/qt/scientific_interfaces/Indirect/IqtFit.ui index 1b92821f385b05ff88e099e6995cd3bda869a68e..8fef9828f439fc406e6042bc298873c108cf4fc3 100644 --- a/qt/scientific_interfaces/Indirect/IqtFit.ui +++ b/qt/scientific_interfaces/Indirect/IqtFit.ui @@ -22,7 +22,7 @@ <property name="childrenCollapsible"> <bool>false</bool> </property> - <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy" name="fitDataView" native="true"/> + <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataView" name="fitDataView" native="true"/> <widget class="QWidget" name="layoutWidget"> <layout class="QVBoxLayout" name="verticalLayout"> <item> @@ -34,12 +34,12 @@ <number>0</number> </property> <item> - <widget class="MantidQt::MantidWidgets::IndirectFitPropertyBrowserLegacy" name="fitPropertyBrowser"> + <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitPropertyBrowser" name="fitPropertyBrowser"> <widget class="QWidget" name="dockWidgetContents"/> </widget> </item> <item> - <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitPlotViewLegacy" name="pvFitPlotView" native="true"/> + <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitPlotView" name="pvFitPlotView" native="true"/> </item> </layout> </item> @@ -62,7 +62,7 @@ <number>0</number> </property> <item> - <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionViewLegacy" name="svSpectrumView" native="true"/> + <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView" name="svSpectrumView" native="true"/> </item> <item> <widget class="QGroupBox" name="gbRun"> @@ -126,27 +126,27 @@ </widget> <customwidgets> <customwidget> - <class>MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionViewLegacy</class> + <class>MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView</class> <extends>QWidget</extends> - <header>IndirectSpectrumSelectionViewLegacy.h</header> + <header>IndirectSpectrumSelectionView.h</header> <container>1</container> </customwidget> <customwidget> - <class>MantidQt::MantidWidgets::IndirectFitPropertyBrowserLegacy</class> + <class>MantidQt::CustomInterfaces::IDA::IndirectFitPropertyBrowser</class> <extends>QDockWidget</extends> - <header>MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h</header> + <header>IndirectFitPropertyBrowser.h</header> <container>1</container> </customwidget> <customwidget> - <class>MantidQt::CustomInterfaces::IDA::IndirectFitPlotViewLegacy</class> + <class>MantidQt::CustomInterfaces::IDA::IndirectFitPlotView</class> <extends>QWidget</extends> - <header>IndirectFitPlotViewLegacy.h</header> + <header>IndirectFitPlotView.h</header> <container>1</container> </customwidget> <customwidget> - <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy</class> + <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataView</class> <extends>QWidget</extends> - <header>IndirectFitDataViewLegacy.h</header> + <header>IndirectFitDataView.h</header> <container>1</container> </customwidget> <customwidget> diff --git a/qt/scientific_interfaces/Indirect/IqtFitModel.cpp b/qt/scientific_interfaces/Indirect/IqtFitModel.cpp index 9ff96c15138f7f7685a598ff7928bd767d701099..7bbbd9c236d1e5e148acfdf247e098adb28fa60f 100644 --- a/qt/scientific_interfaces/Indirect/IqtFitModel.cpp +++ b/qt/scientific_interfaces/Indirect/IqtFitModel.cpp @@ -185,19 +185,19 @@ namespace CustomInterfaces { namespace IDA { IqtFitModel::IqtFitModel() - : IndirectFittingModelLegacy(), m_makeBetaGlobal(false), + : IndirectFittingModel(), m_makeBetaGlobal(false), m_constrainIntensities(false) {} -CompositeFunction_sptr IqtFitModel::getMultiDomainFunction() const { +MultiDomainFunction_sptr IqtFitModel::getMultiDomainFunction() const { if (m_makeBetaGlobal) return createFunctionWithGlobalBeta(getFittingFunction()); - return IndirectFittingModelLegacy::getMultiDomainFunction(); + return IndirectFittingModel::getMultiDomainFunction(); } IAlgorithm_sptr IqtFitModel::getFittingAlgorithm() const { if (m_makeBetaGlobal) return createSimultaneousFitWithEqualRange(getMultiDomainFunction()); - return IndirectFittingModelLegacy::getFittingAlgorithm(); + return IndirectFittingModel::getFittingAlgorithm(); } std::vector<std::string> IqtFitModel::getSpectrumDependentAttributes() const { @@ -219,22 +219,22 @@ IAlgorithm_sptr IqtFitModel::simultaneousFitAlgorithm() const { std::string IqtFitModel::sequentialFitOutputName() const { if (isMultiFit()) return "MultiIqtFit_" + m_fitType + "_Results"; - auto const fitString = getFitString(getWorkspace(0)); + auto const fitString = getFitString(getWorkspace(DatasetIndex{0})); return createOutputName("%1%" + fitString + "_" + m_fitType + "_s%2%", "_to_", - 0); + DatasetIndex{0}); } std::string IqtFitModel::simultaneousFitOutputName() const { if (isMultiFit()) return "MultiSimultaneousIqtFit_" + m_fitType + "_Results"; - auto const fitString = getFitString(getWorkspace(0)); + auto const fitString = getFitString(getWorkspace(DatasetIndex{0})); return createOutputName("%1%" + fitString + "_mult" + m_fitType + "_s%2%", - "_to_", 0); + "_to_", DatasetIndex{0}); } -std::string IqtFitModel::singleFitOutputName(std::size_t index, - std::size_t spectrum) const { - auto const fitString = getFitString(getWorkspace(0)); +std::string IqtFitModel::singleFitOutputName(DatasetIndex index, + WorkspaceIndex spectrum) const { + auto const fitString = getFitString(getWorkspace(DatasetIndex{0})); return createSingleFitOutputName( "%1%" + fitString + "_" + m_fitType + "_s%2%_Results", index, spectrum); } @@ -243,50 +243,35 @@ void IqtFitModel::setFitTypeString(const std::string &fitType) { m_fitType = fitType; } -void IqtFitModel::setFitFunction(Mantid::API::IFunction_sptr function) { - IndirectFittingModelLegacy::setFitFunction(function); +void IqtFitModel::setFitFunction( + Mantid::API::MultiDomainFunction_sptr function) { + IndirectFittingModel::setFitFunction(function); if (m_constrainIntensities) constrainIntensities(function); } -bool IqtFitModel::canConstrainIntensities() const { - return hasConstrainableIntensities(getFittingFunction()); -} - -bool IqtFitModel::setConstrainIntensities(bool constrain) { - if (constrain != m_constrainIntensities) { - m_constrainIntensities = constrain; - if (constrain) - return constrainIntensities(getFittingFunction()); - return unconstrainIntensities(getFittingFunction()); - } - return true; -} - -void IqtFitModel::setBetaIsGlobal(bool global) { m_makeBetaGlobal = global; } - -std::unordered_map<std::string, ParameterValue> -IqtFitModel::createDefaultParameters(std::size_t index) const { - std::unordered_map<std::string, ParameterValue> parameters; +std::unordered_map<std::string, ParameterValueNew> +IqtFitModel::createDefaultParameters(DatasetIndex index) const { + std::unordered_map<std::string, ParameterValueNew> parameters; parameters["Height"] = - ParameterValue(computeHeightApproximation(getFittingFunction())); + ParameterValueNew(computeHeightApproximation(getFittingFunction())); const auto inputWs = getWorkspace(index); const auto tau = inputWs ? computeTauApproximation(inputWs) : 0.0; - parameters["Lifetime"] = ParameterValue(tau); - parameters["Stretching"] = ParameterValue(1.0); - parameters["A0"] = ParameterValue(0.0); + parameters["Lifetime"] = ParameterValueNew(tau); + parameters["Stretching"] = ParameterValueNew(1.0); + parameters["A0"] = ParameterValueNew(0.0); return parameters; } -CompositeFunction_sptr +MultiDomainFunction_sptr IqtFitModel::createFunctionWithGlobalBeta(IFunction_sptr function) const { boost::shared_ptr<MultiDomainFunction> multiDomainFunction( new MultiDomainFunction); const auto functionString = function->asString(); - for (auto i = 0u; i < numberOfWorkspaces(); ++i) { - auto addDomains = [&](std::size_t /*unused*/) { + for (auto i = DatasetIndex{0}; i < numberOfWorkspaces(); ++i) { + auto addDomains = [&](WorkspaceIndex /*unused*/) { const auto index = multiDomainFunction->nFunctions(); multiDomainFunction->addFunction(createFunction(functionString)); multiDomainFunction->setDomainIndex(index, index); diff --git a/qt/scientific_interfaces/Indirect/IqtFitModel.h b/qt/scientific_interfaces/Indirect/IqtFitModel.h index 02f8fdd8ad890cb69ba8f572d9faa955f32b9a4a..3f3aa320421cf65955294fa8b4b1a852f82ee67a 100644 --- a/qt/scientific_interfaces/Indirect/IqtFitModel.h +++ b/qt/scientific_interfaces/Indirect/IqtFitModel.h @@ -7,38 +7,32 @@ #ifndef MANTIDQTCUSTOMINTERFACESIDA_IQTFITMODEL_H_ #define MANTIDQTCUSTOMINTERFACESIDA_IQTFITMODEL_H_ -#include "IndirectFittingModelLegacy.h" +#include "IndirectFittingModel.h" namespace MantidQt { namespace CustomInterfaces { namespace IDA { -class DLLExport IqtFitModel : public IndirectFittingModelLegacy { +class DLLExport IqtFitModel : public IndirectFittingModel { public: IqtFitModel(); Mantid::API::IAlgorithm_sptr getFittingAlgorithm() const override; - std::vector<std::string> getSpectrumDependentAttributes() const override; - void setFitTypeString(const std::string &fitType); - - void setFitFunction(Mantid::API::IFunction_sptr function) override; - bool canConstrainIntensities() const; - bool setConstrainIntensities(bool constrain); - void setBetaIsGlobal(bool global); + void setFitFunction(Mantid::API::MultiDomainFunction_sptr function) override; private: - Mantid::API::CompositeFunction_sptr getMultiDomainFunction() const override; + Mantid::API::MultiDomainFunction_sptr getMultiDomainFunction() const override; Mantid::API::IAlgorithm_sptr sequentialFitAlgorithm() const override; Mantid::API::IAlgorithm_sptr simultaneousFitAlgorithm() const override; std::string sequentialFitOutputName() const override; std::string simultaneousFitOutputName() const override; - std::string singleFitOutputName(std::size_t index, - std::size_t spectrum) const override; - std::unordered_map<std::string, ParameterValue> - createDefaultParameters(std::size_t index) const override; - Mantid::API::CompositeFunction_sptr + std::string singleFitOutputName(DatasetIndex index, + WorkspaceIndex spectrum) const override; + std::unordered_map<std::string, ParameterValueNew> + createDefaultParameters(DatasetIndex index) const override; + Mantid::API::MultiDomainFunction_sptr createFunctionWithGlobalBeta(Mantid::API::IFunction_sptr function) const; bool m_makeBetaGlobal; diff --git a/qt/scientific_interfaces/Indirect/test/IqtFitModelTest.h b/qt/scientific_interfaces/Indirect/test/IqtFitModelTest.h index f7cc235a78aa712a70a2822ee619728f097c21ae..add9269b176ae6a1817f682af2df2326bdcb9e71 100644 --- a/qt/scientific_interfaces/Indirect/test/IqtFitModelTest.h +++ b/qt/scientific_interfaces/Indirect/test/IqtFitModelTest.h @@ -16,6 +16,7 @@ #include "MantidAPI/FunctionFactory.h" #include "MantidAPI/IFunction.h" #include "MantidAPI/MatrixWorkspace_fwd.h" +#include "MantidAPI/MultiDomainFunction.h" #include "MantidTestHelpers/IndirectFitDataCreationHelper.h" using namespace Mantid::API; @@ -24,19 +25,21 @@ using namespace MantidQt::CustomInterfaces::IDA; namespace { -std::string getFunctionString(bool multipleIntensities) { - return multipleIntensities - ? "name=ExpDecay,Height=1,Lifetime=1;name=ExpDecay,Height=1," - "Lifetime=0.0247558;name=FlatBackground,A0=0" - : "name=LinearBackground,A0=0,A1=0,ties=(A0=0.000000,A1=0.0);" - "(composite=Convolution,FixResolution=true,NumDeriv=true;" - "name=Resolution,Workspace=Name,WorkspaceIndex=0;((composite=" - "ProductFunction,NumDeriv=false;name=Lorentzian,Amplitude=1," - "PeakCentre=0,FWHM=0.0175)))"; -} - -IFunction_sptr getFunction(std::string const &functionString) { - return FunctionFactory::Instance().createInitialized(functionString); +MultiDomainFunction_sptr getFunction(bool multipleIntensities) { + std::string const functionString = + multipleIntensities + ? "composite=CompositeFunction,$domains=i;name=ExpDecay,Height=1," + "Lifetime=1;name=ExpDecay,Height=1," + "Lifetime=0.0247558;name=FlatBackground,A0=0" + : "composite=CompositeFunction,$domains=i;name=LinearBackground,A0=0," + "A1=0,ties=(A0=0.000000,A1=0.0);" + "(composite=Convolution,FixResolution=true,NumDeriv=true;" + "name=Resolution,Workspace=Name,WorkspaceIndex=0;((composite=" + "ProductFunction,NumDeriv=false;name=Lorentzian,Amplitude=1," + "PeakCentre=0,FWHM=0.0175)))"; + auto fun = FunctionFactory::Instance().createInitialized( + "composite=MultiDomainFunction;" + functionString + ";" + functionString); + return boost::dynamic_pointer_cast<MultiDomainFunction>(fun); } } // namespace @@ -65,59 +68,17 @@ public: } void test_that_the_model_is_instantiated_and_can_hold_a_workspace() { - Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1"); + SpectraNew const spectra = SpectraNew("0-1"); m_model->addWorkspace(m_workspace, spectra); - TS_ASSERT_EQUALS(m_model->numberOfWorkspaces(), 1); + TS_ASSERT_EQUALS(m_model->numberOfWorkspaces(), DatasetIndex{1}); } void test_that_getSpectrumDependentAttributes_will_return_an_empty_vector() { TS_ASSERT(m_model->getSpectrumDependentAttributes().empty()); } - void - test_that_canConstrainIntensities_returns_false_if_it_contains_less_than_2_intensity_parameters() { - /// Intensity can either be represented by A0 or Height IqtFit - Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1"); - - m_model->addWorkspace(m_workspace, spectra); - m_model->setFitFunction(getFunction(getFunctionString(false))); - - TS_ASSERT(!m_model->canConstrainIntensities()); - } - - void - test_that_canConstrainIntensities_returns_true_if_it_contains_2_or_more_intensity_parameters() { - /// Intensity can either be represented by A0 or Height in IqtFit - Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1"); - - m_model->addWorkspace(m_workspace, spectra); - m_model->setFitFunction(getFunction(getFunctionString(true))); - - TS_ASSERT(m_model->canConstrainIntensities()); - } - - void - test_that_setConstrainIntensities_returns_false_if_there_is_not_multiple_intensities_to_be_constrained() { - Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1"); - - m_model->addWorkspace(m_workspace, spectra); - m_model->setFitFunction(getFunction(getFunctionString(false))); - - TS_ASSERT(!m_model->setConstrainIntensities(true)); - } - - void - test_that_setConstrainIntensities_returns_true_if_there_are_multiple_intensities_to_be_constrained() { - Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1"); - - m_model->addWorkspace(m_workspace, spectra); - m_model->setFitFunction(getFunction(getFunctionString(true))); - - TS_ASSERT(m_model->setConstrainIntensities(true)); - } - private: MatrixWorkspace_sptr m_workspace; std::unique_ptr<SetUpADSWithWorkspace> m_ads; diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h b/qt/widgets/common/inc/MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h index 532f8eb7f9f337787c875dfbe8f8f7e21b152bd3..c8476c29f169106045d4f9abcad4b38b08e22beb 100644 --- a/qt/widgets/common/inc/MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h +++ b/qt/widgets/common/inc/MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h @@ -4,8 +4,8 @@ // NScD Oak Ridge National Laboratory, European Spallation Source // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + -#ifndef INDIRECTFITPROPERTYBROWSER_H_ -#define INDIRECTFITPROPERTYBROWSER_H_ +#ifndef INDIRECTFITPROPERTYBROWSERLEGACY_H_ +#define INDIRECTFITPROPERTYBROWSERLEGACY_H_ #include "MantidQtWidgets/Common/FitPropertyBrowser.h" #include "MantidQtWidgets/Common/QtPropertyBrowser/qtpropertymanager.h"