From 4d2ba844a01749f297442f96f6f6d43975b885d2 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Mon, 18 Nov 2013 16:58:03 +0000 Subject: [PATCH 01/37] Refs #6473. New class for the dialog. --- .../MantidQt/MantidWidgets/CMakeLists.txt | 14 +++--- .../MuonSequentialFitDialog.h | 50 +++++++++++++++++++ .../src/MuonSequentialFitDialog.cpp | 22 ++++++++ 3 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h create mode 100644 Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp diff --git a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt index 00503ac7eb0e..7aef3b27344d 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt +++ b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt @@ -1,22 +1,23 @@ set ( SRC_FILES src/AlgorithmSelectorWidget.cpp + src/CatalogHelper.cpp + src/CatalogSearch.cpp src/CheckboxHeader.cpp src/DataSelector.cpp src/DiagResults.cpp - src/FindReplaceDialog.cpp src/FindDialog.cpp + src/FindReplaceDialog.cpp src/FitPropertyBrowser.cpp src/FunctionBrowser.cpp - src/CatalogSearch.cpp - src/CatalogHelper.cpp src/InstrumentSelector.cpp - src/MessageDisplay.cpp src/MWDiag.cpp src/MWRunFiles.cpp + src/MessageDisplay.cpp src/MultifitSetupDialog.cpp src/MuonFitPropertyBrowser.cpp + src/MuonSequentialFitDialog.cpp + src/ProcessingAlgoWidget.cpp src/PropertyHandler.cpp - src/ProcessingAlgoWidget.cpp src/RangeSelector.cpp src/RenameParDialog.cpp src/SafeQwtPlot.cpp @@ -46,6 +47,7 @@ set ( MOC_FILES inc/MantidQtMantidWidgets/MessageDisplay.h inc/MantidQtMantidWidgets/MultifitSetupDialog.h inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h + inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h inc/MantidQtMantidWidgets/MWDiag.h inc/MantidQtMantidWidgets/MWRunFiles.h inc/MantidQtMantidWidgets/PropertyHandler.h @@ -65,7 +67,7 @@ set ( MOC_FILES # Add the include files are NOT already in MOC_FILES set ( INC_FILES - ${MOC_FILES} + ${MOC_FILES} inc/MantidQtMantidWidgets/WidgetDllOption.h ) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h new file mode 100644 index 000000000000..dfc8898aaf35 --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -0,0 +1,50 @@ +#ifndef MANTID_MANTIDWIDGETS_MUONSEQUENTIALFITDIALOG_H_ +#define MANTID_MANTIDWIDGETS_MUONSEQUENTIALFITDIALOG_H_ + +#include "MantidKernel/System.h" + +#include + +namespace Mantid +{ +namespace MantidWidgets +{ + + /** MuonSequentialFitDialog : TODO: DESCRIPTION + + Copyright © 2013 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + Mantid is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + File change history is stored at: + Code Documentation is available at: + */ + class DLLExport MuonSequentialFitDialog : public QDialog + { + + Q_OBJECT + + public: + MuonSequentialFitDialog(QWidget* parent); + virtual ~MuonSequentialFitDialog(); + + }; + + +} // namespace MantidWidgets +} // namespace Mantid + +#endif /* MANTID_MANTIDWIDGETS_MUONSEQUENTIALFITDIALOG_H_ */ diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp new file mode 100644 index 000000000000..ea7279054f73 --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -0,0 +1,22 @@ +#include "MantidQtMantidWidgets/MuonSequentialFitDialog.h" + +namespace Mantid +{ +namespace MantidWidgets +{ + + /** + * Constructor + */ + MuonSequentialFitDialog::MuonSequentialFitDialog(QWidget* parent) : + QDialog(parent) + {} + + /** + * Destructor + */ + MuonSequentialFitDialog::~MuonSequentialFitDialog() + {} + +} // namespace MantidWidgets +} // namespace Mantid From ff553b9d50df1dc4608f082621137d4a3b7358ad Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 19 Nov 2013 09:50:57 +0000 Subject: [PATCH 02/37] Refs #6473. Enabled Sequential fit option for Muon Analysis. The new dialog is shown when it is clicked. --- .../FitPropertyBrowser.h | 2 +- .../MuonFitPropertyBrowser.h | 6 ++--- .../MuonSequentialFitDialog.h | 2 +- .../src/MuonFitPropertyBrowser.cpp | 23 ++++++++----------- .../src/MuonSequentialFitDialog.cpp | 2 +- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/FitPropertyBrowser.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/FitPropertyBrowser.h index ac67db1dbc87..648f2aa8e44f 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/FitPropertyBrowser.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/FitPropertyBrowser.h @@ -211,7 +211,7 @@ class EXPORT_OPT_MANTIDQT_MANTIDWIDGETS FitPropertyBrowser: public QDockWidget, public slots: virtual void fit(){ doFit(500); } - void sequentialFit(); + virtual void sequentialFit(); void undoFit(); void clear(); void clearBrowser(); diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h index 1745a05c6460..13e7bb4e6165 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h @@ -47,6 +47,8 @@ class EXPORT_OPT_MANTIDQT_MANTIDWIDGETS MuonFitPropertyBrowser: public MantidQt: public slots: /// Perform the fit algorithm virtual void fit(); + /// Open sequential fit dialog + virtual void sequentialFit(); protected: @@ -60,8 +62,6 @@ private slots: private: /// Get the registered function names virtual void populateFunctionNames(); - /// Enable/disable the Fit button; - virtual void setFitEnabled(bool yes); /// Check if the workspace can be used in the fit virtual bool isWorkspaceValid(Mantid::API::Workspace_sptr)const; @@ -71,4 +71,4 @@ private slots: } // API -#endif /*MUONFITPROPERTYBROWSER_H_*/ \ No newline at end of file +#endif /*MUONFITPROPERTYBROWSER_H_*/ diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index dfc8898aaf35..e15e481e92e0 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -5,7 +5,7 @@ #include -namespace Mantid +namespace MantidQt { namespace MantidWidgets { diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp index b827130e6d43..1229c15fcb6d 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp @@ -1,6 +1,6 @@ #include "MantidQtMantidWidgets/MuonFitPropertyBrowser.h" +#include "MantidQtMantidWidgets/MuonSequentialFitDialog.h" #include "MantidQtMantidWidgets/PropertyHandler.h" -#include "MantidQtMantidWidgets/SequentialFitDialog.h" #include "MantidAPI/FunctionFactory.h" // Suppress a warning coming out of code that isn't ours @@ -35,6 +35,7 @@ #include #include +#include namespace MantidQt @@ -42,7 +43,6 @@ namespace MantidQt namespace MantidWidgets { - /** * Constructor * @param parent :: The parent widget - must be an ApplicationWindow @@ -311,6 +311,14 @@ void MuonFitPropertyBrowser::fit() } } +/** + * Show sequential fit dialog. + */ +void MuonFitPropertyBrowser::sequentialFit() +{ + MuonSequentialFitDialog* dialog = new MuonSequentialFitDialog(this); + dialog->show(); +} /** * Connect to the AnalysisDataServis when shown @@ -322,17 +330,6 @@ void MuonFitPropertyBrowser::showEvent(QShowEvent* e) populateWorkspaceNames(); } - -/** -* Enable/disable the Fit button. -*/ -void MuonFitPropertyBrowser::setFitEnabled(bool yes) -{ - m_fitActionFit->setEnabled(yes); - m_fitActionSeqFit->setEnabled(false); -} - - /** Check if the workspace can be used in the fit. The accepted types are * MatrixWorkspaces same size and that it isn't the generated raw file. * @param ws :: The workspace diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index ea7279054f73..2532a6828f40 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -1,6 +1,6 @@ #include "MantidQtMantidWidgets/MuonSequentialFitDialog.h" -namespace Mantid +namespace MantidQt { namespace MantidWidgets { From 3fddfa42858a4260db3bb7c1e24cc776bac41609 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 19 Nov 2013 10:22:44 +0000 Subject: [PATCH 03/37] Refs #6473. Initial UI file for the dialog. --- .../MantidQt/MantidWidgets/CMakeLists.txt | 13 +++---- .../MuonSequentialFitDialog.h | 5 +++ .../MuonSequentialFitDialog.ui | 34 +++++++++++++++++++ .../src/MuonSequentialFitDialog.cpp | 4 ++- 4 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui diff --git a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt index 7aef3b27344d..80b24a037d47 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt +++ b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt @@ -33,9 +33,9 @@ set ( SRC_FILES # Header files with Q_OBJECT that qmake will "moc" set ( MOC_FILES - inc/MantidQtMantidWidgets/AlgorithmSelectorWidget.h - inc/MantidQtMantidWidgets/CheckboxHeader.h - inc/MantidQtMantidWidgets/DataSelector.h + inc/MantidQtMantidWidgets/AlgorithmSelectorWidget.h + inc/MantidQtMantidWidgets/CheckboxHeader.h + inc/MantidQtMantidWidgets/DataSelector.h inc/MantidQtMantidWidgets/DiagResults.h inc/MantidQtMantidWidgets/FindReplaceDialog.h inc/MantidQtMantidWidgets/FindDialog.h @@ -55,7 +55,7 @@ set ( MOC_FILES inc/MantidQtMantidWidgets/pythonCalc.h inc/MantidQtMantidWidgets/RangeSelector.h inc/MantidQtMantidWidgets/RenameParDialog.h - inc/MantidQtMantidWidgets/SafeQwtPlot.h + inc/MantidQtMantidWidgets/SafeQwtPlot.h inc/MantidQtMantidWidgets/SaveWorkspaces.h inc/MantidQtMantidWidgets/ScriptEditor.h inc/MantidQtMantidWidgets/SelectFunctionDialog.h @@ -73,11 +73,12 @@ set ( INC_FILES # QtDesigner UI files to process set ( UI_FILES - inc/MantidQtMantidWidgets/DataSelector.ui + inc/MantidQtMantidWidgets/DataSelector.ui inc/MantidQtMantidWidgets/CatalogSearch.ui - inc/MantidQtMantidWidgets/MultifitSetupDialog.ui inc/MantidQtMantidWidgets/MWDiag.ui inc/MantidQtMantidWidgets/MWRunFiles.ui + inc/MantidQtMantidWidgets/MultifitSetupDialog.ui + inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui inc/MantidQtMantidWidgets/ProcessingAlgoWidget.ui inc/MantidQtMantidWidgets/RenameParDialog.ui inc/MantidQtMantidWidgets/SelectFunctionDialog.ui diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index e15e481e92e0..7428e1770678 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -3,6 +3,8 @@ #include "MantidKernel/System.h" +#include "ui_MuonSequentialFitDialog.h" + #include namespace MantidQt @@ -40,6 +42,9 @@ namespace MantidWidgets public: MuonSequentialFitDialog(QWidget* parent); virtual ~MuonSequentialFitDialog(); + + private: + Ui::MuonSequentialFitDialog ui; }; diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui new file mode 100644 index 000000000000..49bf5729866b --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui @@ -0,0 +1,34 @@ + + + MuonSequentialFitDialog + + + + 0 + 0 + 500 + 500 + + + + + 500 + 500 + + + + Muon Analysis - Sequential Fitting + + + + + + Hi! I am a new form. + + + + + + + + diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 2532a6828f40..6cefccd78500 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -10,7 +10,9 @@ namespace MantidWidgets */ MuonSequentialFitDialog::MuonSequentialFitDialog(QWidget* parent) : QDialog(parent) - {} + { + ui.setupUi(this); + } /** * Destructor From 7ab9e199c1f446f1200fbb84da149b00ab507662 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 19 Nov 2013 13:48:02 +0000 Subject: [PATCH 04/37] Refs #6473. Hide label for MWRunFiles widget if it is empty. --- Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp index 87157889de71..c9992b1262e4 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MWRunFiles.cpp @@ -276,6 +276,7 @@ QString MWRunFiles::getLabelText() const void MWRunFiles::setLabelText(const QString & text) { m_uiForm.textLabel->setText(text); + m_uiForm.textLabel->setVisible( ! text.isEmpty() ); } /** Set the minimum width on the label widget From eaab229f28e0a15c629d3e6f0db8c6496516fea2 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 19 Nov 2013 15:03:32 +0000 Subject: [PATCH 05/37] Refs #6473. Basic elements for the UI form. --- .../MuonSequentialFitDialog.ui | 146 +++++++++++++++++- .../src/MuonFitPropertyBrowser.cpp | 1 + 2 files changed, 144 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui index 49bf5729866b..03ca30c63ff0 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui @@ -21,14 +21,154 @@ - - - Hi! I am a new form. + + + 0 + + 6 + + + + + + 0 + 0 + + + + Runs: + + + + + + + + 0 + 0 + + + + Label: + + + + + + + + + + + + + true + + + true + + + + + + + + + + + Parameters from previous fit + + + true + + + + + + + Initial parameters for every fit + + + + + + + + + + + false + + + 0 + + + true + + + false + + + + + + + false + + + Stop + + + false + + + false + + + + + + + Start + + + + + + + + + Diagnosis + + + false + + + + 6 + + + 0 + + + 0 + + + + + + + + MantidQt::MantidWidgets::MWRunFiles + QWidget +
MantidQtMantidWidgets/MWRunFiles.h
+
+
diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp index 1229c15fcb6d..f4bb5de81468 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp @@ -317,6 +317,7 @@ void MuonFitPropertyBrowser::fit() void MuonFitPropertyBrowser::sequentialFit() { MuonSequentialFitDialog* dialog = new MuonSequentialFitDialog(this); + dialog->setModal(true); dialog->show(); } From ab7d66f2efe9abe5fb582dd66d8dcaac307b1aa6 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 11:15:04 +0000 Subject: [PATCH 06/37] Refs #6473. Validation of label. --- .../MuonSequentialFitDialog.h | 14 ++- .../MuonSequentialFitDialog.ui | 85 ++++++++++++++++--- .../src/MuonSequentialFitDialog.cpp | 37 +++++++- 3 files changed, 119 insertions(+), 17 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 7428e1770678..79ea8bd07e68 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -2,6 +2,7 @@ #define MANTID_MANTIDWIDGETS_MUONSEQUENTIALFITDIALOG_H_ #include "MantidKernel/System.h" +#include "MantidKernel/Logger.h" #include "ui_MuonSequentialFitDialog.h" @@ -44,8 +45,19 @@ namespace MantidWidgets virtual ~MuonSequentialFitDialog(); private: + /// UI form Ui::MuonSequentialFitDialog ui; - + + /// Checks if specified name is valid as a name for label. + static std::string isValidLabel(const std::string& label); + + /// Instance used to print log messages + static Mantid::Kernel::Logger& g_log; + + private slots: + + /// Updates visibility/tooltip of label error asterisk + void validateLabel(const QString& label); }; diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui index 03ca30c63ff0..07d62e5ad6f2 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui @@ -28,6 +28,19 @@ 6 + + + + + + + true + + + true + + + @@ -55,20 +68,64 @@ - - - - - - - - - true - - - true - - + + + 6 + + + + + + + + + 0 + 0 + + + + + + + + + 170 + 0 + 0 + + + + + + + + + 170 + 0 + 0 + + + + + + + + + 161 + 160 + 159 + + + + + + + + * + + + + diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 6cefccd78500..15aa7c775f36 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -1,19 +1,52 @@ #include "MantidQtMantidWidgets/MuonSequentialFitDialog.h" +#include "MantidAPI/AnalysisDataService.h" namespace MantidQt { namespace MantidWidgets { + using namespace Mantid::Kernel; + using namespace Mantid::API; + + Logger& MuonSequentialFitDialog::g_log(Logger::get("MuonSequentialFitDialog")); /** * Constructor */ MuonSequentialFitDialog::MuonSequentialFitDialog(QWidget* parent) : - QDialog(parent) + QDialog(parent) { ui.setupUi(this); + + connect( ui.labelInput, SIGNAL( textChanged(const QString&) ), + this, SLOT( validateLabel(const QString&) ) ); + } + + /** + * Checks if specified name is valid as a name for label. + * @param label :: The name to check + * @return Empty string if valid, otherwise a string describing why is invalid + */ + std::string MuonSequentialFitDialog::isValidLabel(const std::string& label) + { + if ( label.empty() ) + return "Can not be empty"; + else + return AnalysisDataService::Instance().isValid(label); } - + + /** + * Updates visibility/tooltip of label error asterisk. + * @param label :: New label as specified by user + */ + void MuonSequentialFitDialog::validateLabel(const QString& label) + { + std::string error = isValidLabel( label.toStdString() ); + + ui.labelError->setVisible( ! error.empty() ); + ui.labelError->setToolTip( QString::fromStdString(error) ); + } + /** * Destructor */ From 6bcf617d75bf2bcae594f20a2b550b514223f0f6 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 11:16:02 +0000 Subject: [PATCH 07/37] Refs #6473. Single button for start/stop functinality. Can just change the text when stopped/running. --- .../MuonSequentialFitDialog.ui | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui index 07d62e5ad6f2..916aca35a637 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui @@ -151,7 +151,7 @@ - + @@ -169,28 +169,18 @@ - - - false - + - Stop + Start - - false + + true - + false - - - - Start - - - From eb20d269bb30dd2d2976d2754cc792abc80cde38 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 11:57:18 +0000 Subject: [PATCH 08/37] Refs #6473. Enabling/disabling start button on input change. --- .../MuonSequentialFitDialog.h | 9 +++- .../src/MuonSequentialFitDialog.cpp | 41 ++++++++++++++++++- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 79ea8bd07e68..a8de1c12ce2e 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -48,6 +48,9 @@ namespace MantidWidgets /// UI form Ui::MuonSequentialFitDialog ui; + /// Check if all the input field are valid + bool isInputValid(); + /// Checks if specified name is valid as a name for label. static std::string isValidLabel(const std::string& label); @@ -55,9 +58,11 @@ namespace MantidWidgets static Mantid::Kernel::Logger& g_log; private slots: - /// Updates visibility/tooltip of label error asterisk - void validateLabel(const QString& label); + void updateLabelError(const QString& label); + + /// Enables/disables start button depending on wether we are allowed to start. + void updateStartButton(); }; diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 15aa7c775f36..7212c292d2ca 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -18,8 +18,21 @@ namespace MantidWidgets { ui.setupUi(this); + // TODO: set initial values + + // After initial values are set, update depending elements accordingly. We don't rely on + // slot/signal update, as element might be left with default values which means these will + // never be called on initialication. + updateLabelError( ui.labelInput->text() ); + updateStartButton(); + + connect( ui.labelInput, SIGNAL( textChanged(const QString&) ), + this, SLOT( updateLabelError(const QString&) ) ); + connect( ui.labelInput, SIGNAL( textChanged(const QString&) ), - this, SLOT( validateLabel(const QString&) ) ); + this, SLOT( updateStartButton() ) ); + connect( ui.runs, SIGNAL( fileFindingFinished() ), + this, SLOT( updateStartButton() ) ); } /** @@ -39,7 +52,7 @@ namespace MantidWidgets * Updates visibility/tooltip of label error asterisk. * @param label :: New label as specified by user */ - void MuonSequentialFitDialog::validateLabel(const QString& label) + void MuonSequentialFitDialog::updateLabelError(const QString& label) { std::string error = isValidLabel( label.toStdString() ); @@ -47,6 +60,30 @@ namespace MantidWidgets ui.labelError->setToolTip( QString::fromStdString(error) ); } + /** + * Check if all the input field are valid. + * @return True if everything valid, false otherwise + */ + bool MuonSequentialFitDialog::isInputValid() + { + if ( ! ui.runs->isValid() ) + return false; + + std::string label = ui.labelInput->text().toStdString(); + if ( ! isValidLabel(label).empty() ) + return false; + + return true; + } + + /** + * Enables/disables start button depending on wether we are allowed to start. + */ + void MuonSequentialFitDialog::updateStartButton() + { + ui.controlButton->setEnabled( isInputValid() ); + } + /** * Destructor */ From cfce459cc846daebc889462ddb796c7beb34d129 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 12:11:01 +0000 Subject: [PATCH 09/37] Refs #6473. Renamed member variable according to rules. --- .../MuonSequentialFitDialog.h | 10 ++++++++-- .../src/MuonSequentialFitDialog.cpp | 20 +++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index a8de1c12ce2e..6731b083fa43 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -45,12 +45,18 @@ namespace MantidWidgets virtual ~MuonSequentialFitDialog(); private: - /// UI form - Ui::MuonSequentialFitDialog ui; + // -- FUNCTIONS ----------------------------------------------------------- /// Check if all the input field are valid bool isInputValid(); + // -- VARIABLES ----------------------------------------------------------- + + /// UI form + Ui::MuonSequentialFitDialog m_ui; + + // -- STATIC MEMBERS ------------------------------------------------------ + /// Checks if specified name is valid as a name for label. static std::string isValidLabel(const std::string& label); diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 7212c292d2ca..4a2129c6ea79 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -16,22 +16,22 @@ namespace MantidWidgets MuonSequentialFitDialog::MuonSequentialFitDialog(QWidget* parent) : QDialog(parent) { - ui.setupUi(this); + m_ui.setupUi(this); // TODO: set initial values // After initial values are set, update depending elements accordingly. We don't rely on // slot/signal update, as element might be left with default values which means these will // never be called on initialication. - updateLabelError( ui.labelInput->text() ); + updateLabelError( m_ui.labelInput->text() ); updateStartButton(); - connect( ui.labelInput, SIGNAL( textChanged(const QString&) ), + connect( m_ui.labelInput, SIGNAL( textChanged(const QString&) ), this, SLOT( updateLabelError(const QString&) ) ); - connect( ui.labelInput, SIGNAL( textChanged(const QString&) ), + connect( m_ui.labelInput, SIGNAL( textChanged(const QString&) ), this, SLOT( updateStartButton() ) ); - connect( ui.runs, SIGNAL( fileFindingFinished() ), + connect( m_ui.runs, SIGNAL( fileFindingFinished() ), this, SLOT( updateStartButton() ) ); } @@ -56,8 +56,8 @@ namespace MantidWidgets { std::string error = isValidLabel( label.toStdString() ); - ui.labelError->setVisible( ! error.empty() ); - ui.labelError->setToolTip( QString::fromStdString(error) ); + m_ui.labelError->setVisible( ! error.empty() ); + m_ui.labelError->setToolTip( QString::fromStdString(error) ); } /** @@ -66,10 +66,10 @@ namespace MantidWidgets */ bool MuonSequentialFitDialog::isInputValid() { - if ( ! ui.runs->isValid() ) + if ( ! m_ui.runs->isValid() ) return false; - std::string label = ui.labelInput->text().toStdString(); + std::string label = m_ui.labelInput->text().toStdString(); if ( ! isValidLabel(label).empty() ) return false; @@ -81,7 +81,7 @@ namespace MantidWidgets */ void MuonSequentialFitDialog::updateStartButton() { - ui.controlButton->setEnabled( isInputValid() ); + m_ui.controlButton->setEnabled( isInputValid() ); } /** From f7212082d75327c5c53e5150962802974150c737 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 14:04:01 +0000 Subject: [PATCH 10/37] Refs #6473. Better function name. --- .../inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h | 5 +++-- .../MantidWidgets/src/MuonSequentialFitDialog.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 6731b083fa43..e920d1c7be39 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -67,8 +67,9 @@ namespace MantidWidgets /// Updates visibility/tooltip of label error asterisk void updateLabelError(const QString& label); - /// Enables/disables start button depending on wether we are allowed to start. - void updateStartButton(); + /// Enables/disables start button depending on wether we are allowed to start + void updateControlButtonState(); + }; diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 4a2129c6ea79..24e44434d944 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -24,15 +24,15 @@ namespace MantidWidgets // slot/signal update, as element might be left with default values which means these will // never be called on initialication. updateLabelError( m_ui.labelInput->text() ); - updateStartButton(); + updateControlButtonState(); connect( m_ui.labelInput, SIGNAL( textChanged(const QString&) ), this, SLOT( updateLabelError(const QString&) ) ); connect( m_ui.labelInput, SIGNAL( textChanged(const QString&) ), - this, SLOT( updateStartButton() ) ); + this, SLOT( updateControlButtonState() ) ); connect( m_ui.runs, SIGNAL( fileFindingFinished() ), - this, SLOT( updateStartButton() ) ); + this, SLOT( updateControlButtonState() ) ); } /** @@ -79,7 +79,7 @@ namespace MantidWidgets /** * Enables/disables start button depending on wether we are allowed to start. */ - void MuonSequentialFitDialog::updateStartButton() + void MuonSequentialFitDialog::updateControlButtonState() { m_ui.controlButton->setEnabled( isInputValid() ); } From 97d39ab48adc83ab9b33078023d6386d4670f216 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 14:04:38 +0000 Subject: [PATCH 11/37] Refs #6473. Control button logic. --- .../MuonSequentialFitDialog.h | 13 ++++++ .../src/MuonSequentialFitDialog.cpp | 40 ++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index e920d1c7be39..3c188706d007 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -45,11 +45,19 @@ namespace MantidWidgets virtual ~MuonSequentialFitDialog(); private: + enum ControlButtonType { + Start, + Stop + }; + // -- FUNCTIONS ----------------------------------------------------------- /// Check if all the input field are valid bool isInputValid(); + /// Set the type of the control button + void setControlButtonType(ControlButtonType type); + // -- VARIABLES ----------------------------------------------------------- /// UI form @@ -70,6 +78,11 @@ namespace MantidWidgets /// Enables/disables start button depending on wether we are allowed to start void updateControlButtonState(); + /// Start fitting process + void startFit(); + + /// Stop fitting process + void stopFit(); }; diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 24e44434d944..ed86f79038c8 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -14,11 +14,12 @@ namespace MantidWidgets * Constructor */ MuonSequentialFitDialog::MuonSequentialFitDialog(QWidget* parent) : - QDialog(parent) + QDialog(parent) { m_ui.setupUi(this); // TODO: set initial values + setControlButtonType(Start); // After initial values are set, update depending elements accordingly. We don't rely on // slot/signal update, as element might be left with default values which means these will @@ -84,6 +85,43 @@ namespace MantidWidgets m_ui.controlButton->setEnabled( isInputValid() ); } + /** + * Set the type of the control button. It is Start button when fitting has not been started, + * and Stop button when fitting is running. + * @param type :: New type of the button + */ + void MuonSequentialFitDialog::setControlButtonType(ControlButtonType type) + { + // Disconnect everything connected to pressed() signal of the button + disconnect( m_ui.controlButton, SIGNAL( pressed() ), 0, 0); + + // Connect to appropriate slot + auto buttonSlot = (type == Start) ? SLOT( startFit() ) : SLOT( stopFit() ); + connect( m_ui.controlButton, SIGNAL( pressed() ), this, buttonSlot ); + + // Set appropriate text + QString buttonText = (type == Start) ? "Start" : "Stop"; + m_ui.controlButton->setText(buttonText); + } + + /** + * Start fitting process. + */ + void MuonSequentialFitDialog::startFit() + { + g_log.notice("Seq. fitting started"); + setControlButtonType(Stop); + } + + /** + * Stop fitting process. + */ + void MuonSequentialFitDialog::stopFit() + { + g_log.notice("Seq. fitting stopped"); + setControlButtonType(Start); + } + /** * Destructor */ From e8786ba5b5ae3221ac0d1ad614f26b81e7a7926b Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 14:27:02 +0000 Subject: [PATCH 12/37] Refs #6473. Improved inputs alignment. --- .../MuonSequentialFitDialog.ui | 83 +++++++++++++++---- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui index 916aca35a637..ce0433dfafbd 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.ui @@ -6,13 +6,19 @@ 0 0 - 500 + 550 500 + + + 0 + 0 + + - 500 + 550 500 @@ -52,6 +58,9 @@ Runs: + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -65,6 +74,9 @@ Label: + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -127,26 +139,60 @@ - - - - - - + + + + + 0 + 0 + + - Parameters from previous fit + Parameters: - - true + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - Initial parameters for every fit - - + + + + + + + 0 + 0 + + + + Values from previous fit + + + true + + + paramTypeGroup + + + + + + + + 0 + 0 + + + + Initial values for every fit + + + paramTypeGroup + + + + @@ -218,4 +264,7 @@ + + + From afbef9ee13afe17af31716d18835447f518a4182 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 14:27:34 +0000 Subject: [PATCH 13/37] Refs #6473. Disabling input widgets when running. --- .../MuonSequentialFitDialog.h | 3 +++ .../MantidWidgets/src/MuonSequentialFitDialog.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 3c188706d007..a3aae88288a2 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -58,6 +58,9 @@ namespace MantidWidgets /// Set the type of the control button void setControlButtonType(ControlButtonType type); + /// Update enabled state off all the input widgets (except for control ones) + void setInputEnabled(bool enabled); + // -- VARIABLES ----------------------------------------------------------- /// UI form diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index ed86f79038c8..59def9c4d0e1 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -104,6 +104,19 @@ namespace MantidWidgets m_ui.controlButton->setText(buttonText); } + /** * Update enabled state off all the input widgets (except for control ones). + * @param enabled :: True if widgets should be enabled, false otherwise + */ + void MuonSequentialFitDialog::setInputEnabled(bool enabled) + { + m_ui.runs->setEnabled(enabled); + m_ui.labelInput->setEnabled(enabled); + + foreach(QAbstractButton* button, m_ui.paramTypeGroup->buttons()) + button->setEnabled(enabled); + + } + /** * Start fitting process. */ @@ -111,6 +124,7 @@ namespace MantidWidgets { g_log.notice("Seq. fitting started"); setControlButtonType(Stop); + setInputEnabled(false); } /** @@ -120,6 +134,7 @@ namespace MantidWidgets { g_log.notice("Seq. fitting stopped"); setControlButtonType(Start); + setInputEnabled(true); } /** From 4d8680733ce65d0d034f6ac6d3d79a8f732879ee Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 20 Nov 2013 15:13:21 +0000 Subject: [PATCH 14/37] Refs #6473. Initializing the diagnosis table. Columns for all the parameters are added. --- .../MuonSequentialFitDialog.h | 10 +++++- .../src/MuonSequentialFitDialog.cpp | 32 +++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index a3aae88288a2..01ec2019017b 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -6,6 +6,8 @@ #include "ui_MuonSequentialFitDialog.h" +#include "MantidQtMantidWidgets/MuonFitPropertyBrowser.h" + #include namespace MantidQt @@ -41,7 +43,7 @@ namespace MantidWidgets Q_OBJECT public: - MuonSequentialFitDialog(QWidget* parent); + MuonSequentialFitDialog(MuonFitPropertyBrowser* parent); virtual ~MuonSequentialFitDialog(); private: @@ -61,11 +63,17 @@ namespace MantidWidgets /// Update enabled state off all the input widgets (except for control ones) void setInputEnabled(bool enabled); + /// Initialize diagnosis table + void initDiagnosisTable(); + // -- VARIABLES ----------------------------------------------------------- /// UI form Ui::MuonSequentialFitDialog m_ui; + /// Fit properties browser used to start the dialog + MuonFitPropertyBrowser* m_fitPropBrowser; + // -- STATIC MEMBERS ------------------------------------------------------ /// Checks if specified name is valid as a name for label. diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 59def9c4d0e1..b616ed96a55b 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -1,4 +1,6 @@ #include "MantidQtMantidWidgets/MuonSequentialFitDialog.h" +#include "MantidQtMantidWidgets/MuonFitPropertyBrowser.h" + #include "MantidAPI/AnalysisDataService.h" namespace MantidQt @@ -13,14 +15,16 @@ namespace MantidWidgets /** * Constructor */ - MuonSequentialFitDialog::MuonSequentialFitDialog(QWidget* parent) : - QDialog(parent) + MuonSequentialFitDialog::MuonSequentialFitDialog(MuonFitPropertyBrowser* fitPropBrowser) : + QDialog(fitPropBrowser), m_fitPropBrowser(fitPropBrowser) { m_ui.setupUi(this); // TODO: set initial values setControlButtonType(Start); + initDiagnosisTable(); + // After initial values are set, update depending elements accordingly. We don't rely on // slot/signal update, as element might be left with default values which means these will // never be called on initialication. @@ -49,6 +53,30 @@ namespace MantidWidgets return AnalysisDataService::Instance().isValid(label); } + /** + * Initialize diagnosis table. + */ + void MuonSequentialFitDialog::initDiagnosisTable() + { + QStringList headerLabels; + + // Add two static columns + headerLabels << "Run" << "Fit quality"; + + // Add remaining columns - one for every fit function parameter + CompositeFunction_const_sptr fitFunc = m_fitPropBrowser->compositeFunction(); + + for(size_t i = 0; i < fitFunc->nParams(); i++) + headerLabels << QString::fromStdString( fitFunc->parameterName(i) ); + + m_ui.diagnosisTable->setColumnCount( headerLabels.size() ); + m_ui.diagnosisTable->setHorizontalHeaderLabels(headerLabels); + + // Make the table fill all the available space + QHeaderView* header = m_ui.diagnosisTable->horizontalHeader(); + header->setResizeMode(QHeaderView::Stretch); + } + /** * Updates visibility/tooltip of label error asterisk. * @param label :: New label as specified by user From 86efd29bfa2917ae008a8038b251db831c1afcb9 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 14:09:48 +0000 Subject: [PATCH 15/37] Refs #6473. Initial functionality of running/stopping. Fitting itself is not done yet, is simulated by just loading files for now. --- .../MuonSequentialFitDialog.h | 32 ++++-- .../src/MuonSequentialFitDialog.cpp | 108 +++++++++++++----- 2 files changed, 105 insertions(+), 35 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 01ec2019017b..7ad68fca15e7 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -46,22 +46,24 @@ namespace MantidWidgets MuonSequentialFitDialog(MuonFitPropertyBrowser* parent); virtual ~MuonSequentialFitDialog(); - private: - enum ControlButtonType { - Start, - Stop + enum DialogState + { + Running, + Stopped }; + signals: + void stateChanged(DialogState newState); + + private: + // -- FUNCTIONS ----------------------------------------------------------- /// Check if all the input field are valid bool isInputValid(); - /// Set the type of the control button - void setControlButtonType(ControlButtonType type); - - /// Update enabled state off all the input widgets (except for control ones) - void setInputEnabled(bool enabled); + /// Set current dialog state + void setState(DialogState newState); /// Initialize diagnosis table void initDiagnosisTable(); @@ -74,6 +76,12 @@ namespace MantidWidgets /// Fit properties browser used to start the dialog MuonFitPropertyBrowser* m_fitPropBrowser; + /// Current state of the dialog + DialogState m_state; + + /// Whether user requested fitting to be stopped + bool m_stopRequested; + // -- STATIC MEMBERS ------------------------------------------------------ /// Checks if specified name is valid as a name for label. @@ -89,6 +97,12 @@ namespace MantidWidgets /// Enables/disables start button depending on wether we are allowed to start void updateControlButtonState(); + /// Sets control button to be start/stop depending on new dialog state + void updateControlButtonType(DialogState newState); + + /// Update enabled state off all the input widgets depending on new dialog state + void updateInputEnabled(DialogState newState); + /// Start fitting process void startFit(); diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index b616ed96a55b..d3e6b6c5d12e 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -21,15 +21,16 @@ namespace MantidWidgets m_ui.setupUi(this); // TODO: set initial values - setControlButtonType(Start); - initDiagnosisTable(); + setState(Stopped); // After initial values are set, update depending elements accordingly. We don't rely on // slot/signal update, as element might be left with default values which means these will // never be called on initialication. updateLabelError( m_ui.labelInput->text() ); updateControlButtonState(); + updateControlButtonType(m_state); + updateInputEnabled(m_state); connect( m_ui.labelInput, SIGNAL( textChanged(const QString&) ), this, SLOT( updateLabelError(const QString&) ) ); @@ -38,8 +39,19 @@ namespace MantidWidgets this, SLOT( updateControlButtonState() ) ); connect( m_ui.runs, SIGNAL( fileFindingFinished() ), this, SLOT( updateControlButtonState() ) ); + + connect( this, SIGNAL( stateChanged(DialogState) ), + this, SLOT( updateControlButtonType(DialogState) ) ); + connect( this, SIGNAL( stateChanged(DialogState) ), + this, SLOT( updateInputEnabled(DialogState) ) ); } + /** + * Destructor + */ + MuonSequentialFitDialog::~MuonSequentialFitDialog() + {} + /** * Checks if specified name is valid as a name for label. * @param label :: The name to check @@ -73,8 +85,7 @@ namespace MantidWidgets m_ui.diagnosisTable->setHorizontalHeaderLabels(headerLabels); // Make the table fill all the available space - QHeaderView* header = m_ui.diagnosisTable->horizontalHeader(); - header->setResizeMode(QHeaderView::Stretch); + m_ui.diagnosisTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch); } /** @@ -114,35 +125,45 @@ namespace MantidWidgets } /** - * Set the type of the control button. It is Start button when fitting has not been started, - * and Stop button when fitting is running. - * @param type :: New type of the button + * Sets control button to be start/stop depending on new dialog state. + * @param newState :: New state of the dialog */ - void MuonSequentialFitDialog::setControlButtonType(ControlButtonType type) + void MuonSequentialFitDialog::updateControlButtonType(DialogState newState) { // Disconnect everything connected to pressed() signal of the button disconnect( m_ui.controlButton, SIGNAL( pressed() ), 0, 0); // Connect to appropriate slot - auto buttonSlot = (type == Start) ? SLOT( startFit() ) : SLOT( stopFit() ); + auto buttonSlot = (newState == Stopped) ? SLOT( startFit() ) : SLOT( stopFit() ); connect( m_ui.controlButton, SIGNAL( pressed() ), this, buttonSlot ); // Set appropriate text - QString buttonText = (type == Start) ? "Start" : "Stop"; + QString buttonText = (newState == Stopped) ? "Start" : "Stop"; m_ui.controlButton->setText(buttonText); } - /** * Update enabled state off all the input widgets (except for control ones). - * @param enabled :: True if widgets should be enabled, false otherwise + /** + * Updates current state of the dialog. */ - void MuonSequentialFitDialog::setInputEnabled(bool enabled) + void MuonSequentialFitDialog::setState(DialogState newState) { + m_state = newState; + emit stateChanged(newState); + } + + /** + * Update enabled state off all the input widgets depending on new dialog state. + * @param newState :: New state of the dialog + */ + void MuonSequentialFitDialog::updateInputEnabled(DialogState newState) + { + bool enabled = (newState == Stopped); + m_ui.runs->setEnabled(enabled); m_ui.labelInput->setEnabled(enabled); foreach(QAbstractButton* button, m_ui.paramTypeGroup->buttons()) button->setEnabled(enabled); - } /** @@ -150,9 +171,49 @@ namespace MantidWidgets */ void MuonSequentialFitDialog::startFit() { - g_log.notice("Seq. fitting started"); - setControlButtonType(Stop); - setInputEnabled(false); + if ( m_state == Running ) + throw std::runtime_error("Couln't start: already running"); + + QStringList runFilenames = m_ui.runs->getFilenames(); + + // Tell progress bar how many iterations we will need to make and reset it + m_ui.progress->setRange( 0, runFilenames.size() ); + m_ui.progress->setValue(0); + + setState(Running); + m_stopRequested = false; + + for ( auto runIt = runFilenames.constBegin(); runIt != runFilenames.constEnd(); ++runIt ) + { + // Process events (so that Stop button press is processed) + QApplication::processEvents(); + + if ( m_stopRequested ) + { + setState(Stopped); + return; + } + + // Update progress + m_ui.progress->setValue( m_ui.progress->value() + 1 ); + + try + { + // TODO: should be MuonLoad here + IAlgorithm_sptr loadAlg = AlgorithmManager::Instance().createUnmanaged("LoadMuonNexus"); + loadAlg->initialize(); + loadAlg->setPropertyValue( "Filename", runIt->toStdString() ); + loadAlg->setPropertyValue( "OutputWorkspace", "Loaded" ); + loadAlg->execute(); + } + catch(std::exception) + { + // TODO: probably should show QMEssageBox + setState(Stopped); + } + } + + setState(Stopped); } /** @@ -160,16 +221,11 @@ namespace MantidWidgets */ void MuonSequentialFitDialog::stopFit() { - g_log.notice("Seq. fitting stopped"); - setControlButtonType(Start); - setInputEnabled(true); - } + if ( m_state != Running ) + throw std::runtime_error("Coulnd't stop: is not running"); - /** - * Destructor - */ - MuonSequentialFitDialog::~MuonSequentialFitDialog() - {} + m_stopRequested = true; + } } // namespace MantidWidgets } // namespace Mantid From d6b9b7694d9e54eb1f849ba96d6e32c4e9a86dd9 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 17:04:18 +0000 Subject: [PATCH 16/37] Refs #6473. FitPropertyBrowser: make method public. This is quite a useful method for leaving decision on which function exactly to use for fit to the property browser. --- .../inc/MantidQtMantidWidgets/FitPropertyBrowser.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/FitPropertyBrowser.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/FitPropertyBrowser.h index 648f2aa8e44f..ab21560ff6de 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/FitPropertyBrowser.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/FitPropertyBrowser.h @@ -96,8 +96,13 @@ class EXPORT_OPT_MANTIDQT_MANTIDWIDGETS FitPropertyBrowser: public QDockWidget, /// Create a new function PropertyHandler* addFunction(const std::string& fnName); + /// Get Composite Function boost::shared_ptr compositeFunction()const{return m_compositeFunction;} + + /// Return the fitting function + Mantid::API::IFunction_sptr getFittingFunction() const; + /// Get the default function type std::string defaultFunctionType()const; /// Set the default function type @@ -209,6 +214,7 @@ class EXPORT_OPT_MANTIDQT_MANTIDWIDGETS FitPropertyBrowser: public QDockWidget, /// Create a MatrixWorkspace from a TableWorkspace Mantid::API::Workspace_sptr createMatrixFromTableWorkspace()const; + public slots: virtual void fit(){ doFit(500); } virtual void sequentialFit(); @@ -337,8 +343,6 @@ private slots: void minimizerChanged(); /// Do the fitting void doFit(int maxIterations); - /// Return the fitting function - Mantid::API::IFunction_sptr getFittingFunction() const; /// Property managers: QtGroupPropertyManager *m_groupManager; From b0544f1d428cffa804ac769024be4c98299fe77b Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 17:05:45 +0000 Subject: [PATCH 17/37] Refs #6473. Function for getting run title from workspace. --- .../MuonSequentialFitDialog.h | 5 ++++ .../src/MuonSequentialFitDialog.cpp | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 7ad68fca15e7..1dde6aec89aa 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -14,6 +14,8 @@ namespace MantidQt { namespace MantidWidgets { + using namespace Mantid::Kernel; + using namespace Mantid::API; /** MuonSequentialFitDialog : TODO: DESCRIPTION @@ -87,6 +89,9 @@ namespace MantidWidgets /// Checks if specified name is valid as a name for label. static std::string isValidLabel(const std::string& label); + /// Returns displayable title for the given workspace + static std::string getRunTitle(Workspace_const_sptr ws); + /// Instance used to print log messages static Mantid::Kernel::Logger& g_log; diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index d3e6b6c5d12e..7e409dac1b35 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -65,6 +65,29 @@ namespace MantidWidgets return AnalysisDataService::Instance().isValid(label); } + /** + * Returns displayable title for the given workspace; + * @param ws :: Workpspace to get title from + * @return The title, or empty string if unable to get one + */ + std::string MuonSequentialFitDialog::getRunTitle(Workspace_const_sptr ws) + { + auto matrixWS = boost::dynamic_pointer_cast(ws); + + if ( ! matrixWS ) + return ""; + + const std::string& instrName = matrixWS->getInstrument()->getName(); + const int runNumber = matrixWS->getRunNumber(); + + if ( instrName.empty() || runNumber == 0 ) + return ""; + + std::ostringstream runTitle; + runTitle << instrName << runNumber; + return runTitle.str(); + } + /** * Initialize diagnosis table. */ From 15f02a8cd7f23c5718d7ef59c414a583bfdd1cb3 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 17:10:06 +0000 Subject: [PATCH 18/37] Refs #6473. Using better way to get fitting function. --- .../MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 7e409dac1b35..a439f7ca0d73 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -99,7 +99,7 @@ namespace MantidWidgets headerLabels << "Run" << "Fit quality"; // Add remaining columns - one for every fit function parameter - CompositeFunction_const_sptr fitFunc = m_fitPropBrowser->compositeFunction(); + IFunction_sptr fitFunc = m_fitPropBrowser->getFittingFunction(); for(size_t i = 0; i < fitFunc->nParams(); i++) headerLabels << QString::fromStdString( fitFunc->parameterName(i) ); From 8223861b79c36a82e913642c8800b455f7b301a2 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 17:10:27 +0000 Subject: [PATCH 19/37] Refs #6473. Setting initial values for inputs. --- .../MantidWidgets/src/MuonSequentialFitDialog.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index a439f7ca0d73..48a2ce2e3cb4 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -20,10 +20,17 @@ namespace MantidWidgets { m_ui.setupUi(this); - // TODO: set initial values - initDiagnosisTable(); setState(Stopped); + // Set initial runs text + Workspace_const_sptr fitWS = m_fitPropBrowser->getWorkspace(); + m_ui.runs->setText( QString::fromStdString( getRunTitle(fitWS) ) + "-" ); + + // TODO: find a better initial one, e.g. previously used + m_ui.labelInput->setText("Label"); + + initDiagnosisTable(); + // After initial values are set, update depending elements accordingly. We don't rely on // slot/signal update, as element might be left with default values which means these will // never be called on initialication. From e9e10a3f9661f1e3d672f2d7c9fd82abda9b7eab Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 17:14:05 +0000 Subject: [PATCH 20/37] Refs #6473. Minor refactoring. --- .../src/MuonSequentialFitDialog.cpp | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 48a2ce2e3cb4..3ff70aa4b177 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -213,17 +213,16 @@ namespace MantidWidgets setState(Running); m_stopRequested = false; - for ( auto runIt = runFilenames.constBegin(); runIt != runFilenames.constEnd(); ++runIt ) + for ( auto fileIt = runFilenames.constBegin(); fileIt != runFilenames.constEnd(); ++fileIt ) { // Process events (so that Stop button press is processed) QApplication::processEvents(); + // Stop if requested by user if ( m_stopRequested ) - { - setState(Stopped); - return; - } + break; + Workspace_sptr loadedWS; // Update progress m_ui.progress->setValue( m_ui.progress->value() + 1 ); @@ -231,15 +230,22 @@ namespace MantidWidgets { // TODO: should be MuonLoad here IAlgorithm_sptr loadAlg = AlgorithmManager::Instance().createUnmanaged("LoadMuonNexus"); + loadAlg->setChild(true); loadAlg->initialize(); - loadAlg->setPropertyValue( "Filename", runIt->toStdString() ); - loadAlg->setPropertyValue( "OutputWorkspace", "Loaded" ); + loadAlg->setPropertyValue( "Filename", fileIt->toStdString() ); + loadAlg->setPropertyValue( "OutputWorkspace", "__YouDontSeeMeIAmNinja" ); // Is not used loadAlg->execute(); + + loadedWS = loadAlg->getProperty("OutputWorkspace"); + } + catch(std::exception& e) + { + QMessageBox::critical(this, "Loading failed", + "Unable to load one of the files.\n\nCheck log for details"); + g_log.error(e.what()); + break; } - catch(std::exception) { - // TODO: probably should show QMEssageBox - setState(Stopped); } } From 25c011f3855492ca25982b0d42805b2a353fc547 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 17:14:36 +0000 Subject: [PATCH 21/37] Refs #6473. Initial fitting implementation. --- .../src/MuonSequentialFitDialog.cpp | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 3ff70aa4b177..05abeeeffea3 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -204,10 +204,25 @@ namespace MantidWidgets if ( m_state == Running ) throw std::runtime_error("Couln't start: already running"); + const std::string label = m_ui.labelInput->text().toStdString(); + const std::string labelGroupName = "MuonSeqFit_" + label; + + AnalysisDataServiceImpl& ads = AnalysisDataService::Instance(); + + if ( ads.doesExist(labelGroupName) ) + { + // TODO: confirm that + ads.deepRemoveGroup(labelGroupName); + } + + // Create a group for label + ads.add(labelGroupName, boost::make_shared()); + QStringList runFilenames = m_ui.runs->getFilenames(); // Tell progress bar how many iterations we will need to make and reset it m_ui.progress->setRange( 0, runFilenames.size() ); + m_ui.progress->setFormat("%p%"); m_ui.progress->setValue(0); setState(Running); @@ -223,8 +238,6 @@ namespace MantidWidgets break; Workspace_sptr loadedWS; - // Update progress - m_ui.progress->setValue( m_ui.progress->value() + 1 ); try { @@ -245,8 +258,53 @@ namespace MantidWidgets g_log.error(e.what()); break; } + + MatrixWorkspace_sptr ws; + + if ( auto single = boost::dynamic_pointer_cast(loadedWS) ) + { + ws = single; + } + else if ( auto group = boost::dynamic_pointer_cast(loadedWS) ) { + auto first = boost::dynamic_pointer_cast( group->getItem(0) ); + ws = first; } + + const std::string runTitle = getRunTitle(ws); + const std::string wsBaseName = labelGroupName + "_" + runTitle; + + try + { + IAlgorithm_sptr fit = AlgorithmManager::Instance().createUnmanaged("Fit"); + fit->initialize(); + fit->setProperty("Function", m_fitPropBrowser->getFittingFunction()); + fit->setProperty("InputWorkspace", ws); + fit->setProperty("WorkspaceIndex", 0); + fit->setProperty("StartX", m_fitPropBrowser->startX()); + fit->setProperty("EndX", m_fitPropBrowser->endX()); + fit->setProperty("Output", wsBaseName); + fit->setProperty("Minimizer", m_fitPropBrowser->minimizer()); + fit->setProperty("CostFunction", m_fitPropBrowser->costFunction()); + fit->execute(); + } + catch(std::exception& e) + { + QMessageBox::critical(this, "Fitting failed", + "Unable to fit one of the files.\n\nCheck log for details"); + g_log.error(e.what()); + break; + } + + // Make sure created fit workspaces end-up in the group + // TODO: this really should use loop + ads.addToGroup(labelGroupName, wsBaseName + "_NormalisedCovarianceMatrix"); + ads.addToGroup(labelGroupName, wsBaseName + "_Parameters"); + ads.addToGroup(labelGroupName, wsBaseName + "_Workspace"); + + // Update progress + m_ui.progress->setFormat("%p% - " + QString::fromStdString(runTitle) ); + m_ui.progress->setValue( m_ui.progress->value() + 1 ); } setState(Stopped); From a8de94de11424ae4458d1c2526c40ed91e61757e Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 17:51:29 +0000 Subject: [PATCH 22/37] Refs #6473. Diagnosis table is being populated now. --- .../MuonSequentialFitDialog.h | 4 +++ .../src/MuonSequentialFitDialog.cpp | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 1dde6aec89aa..4d4f5477dacf 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -70,6 +70,10 @@ namespace MantidWidgets /// Initialize diagnosis table void initDiagnosisTable(); + /// Add a new entry to the diagnosis table + void addDiagnosisEntry(const std::string& runTitle, double fitQuality, + IFunction_sptr fittedFunction); + // -- VARIABLES ----------------------------------------------------------- /// UI form diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 05abeeeffea3..134b2748a230 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -118,6 +118,30 @@ namespace MantidWidgets m_ui.diagnosisTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch); } + /** + * Add a new entry to the diagnosis table. + * @param runTitle :: Title of the run fitted + * @param fitQuality :: Number representing a goodness of the fit + * @param fittedFunction :: Function containing fitted parameters + */ + void MuonSequentialFitDialog::addDiagnosisEntry(const std::string& runTitle, double fitQuality, + IFunction_sptr fittedFunction) + { + int newRow = m_ui.diagnosisTable->rowCount(); + + m_ui.diagnosisTable->insertRow(newRow); + + m_ui.diagnosisTable->setItem(newRow, 0, new QTableWidgetItem( QString::fromStdString(runTitle) ) ); + m_ui.diagnosisTable->setItem(newRow, 1, new QTableWidgetItem( QString::number(fitQuality) ) ); + + for(int i = 2; i < m_ui.diagnosisTable->columnCount(); ++i) + { + std::string paramName = m_ui.diagnosisTable->horizontalHeaderItem(i)->text().toStdString(); + double value = fittedFunction->getParameter(paramName); + m_ui.diagnosisTable->setItem(newRow, i, new QTableWidgetItem( QString::number(value) ) ); + } + } + /** * Updates visibility/tooltip of label error asterisk. * @param label :: New label as specified by user @@ -225,6 +249,9 @@ namespace MantidWidgets m_ui.progress->setFormat("%p%"); m_ui.progress->setValue(0); + // Clear diagnosis table for new fit + m_ui.diagnosisTable->setRowCount(0); + setState(Running); m_stopRequested = false; @@ -274,6 +301,8 @@ namespace MantidWidgets const std::string runTitle = getRunTitle(ws); const std::string wsBaseName = labelGroupName + "_" + runTitle; + double fitQuality; + try { IAlgorithm_sptr fit = AlgorithmManager::Instance().createUnmanaged("Fit"); @@ -287,6 +316,8 @@ namespace MantidWidgets fit->setProperty("Minimizer", m_fitPropBrowser->minimizer()); fit->setProperty("CostFunction", m_fitPropBrowser->costFunction()); fit->execute(); + + fitQuality = fit->getProperty("OutputChi2overDoF"); } catch(std::exception& e) { @@ -302,6 +333,9 @@ namespace MantidWidgets ads.addToGroup(labelGroupName, wsBaseName + "_Parameters"); ads.addToGroup(labelGroupName, wsBaseName + "_Workspace"); + // Add information about the fit to the diagnosis table + addDiagnosisEntry(runTitle, fitQuality, m_fitPropBrowser->getFittingFunction()); + // Update progress m_ui.progress->setFormat("%p% - " + QString::fromStdString(runTitle) ); m_ui.progress->setValue( m_ui.progress->value() + 1 ); From a0041244db20af87a914cde89d0b19e4f3b4d6c7 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Tue, 10 Dec 2013 18:06:34 +0000 Subject: [PATCH 23/37] Refs #6473. Various minor improvements. --- .../src/MuonSequentialFitDialog.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 134b2748a230..3f5950cad187 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -140,6 +140,8 @@ namespace MantidWidgets double value = fittedFunction->getParameter(paramName); m_ui.diagnosisTable->setItem(newRow, i, new QTableWidgetItem( QString::number(value) ) ); } + + m_ui.diagnosisTable->scrollToBottom(); } /** @@ -235,7 +237,13 @@ namespace MantidWidgets if ( ads.doesExist(labelGroupName) ) { - // TODO: confirm that + QMessageBox::StandardButton answer = QMessageBox::question(this, "Label already exists", + "Label you specified was used for one of the previous fits. Do you want to overwrite it?", + QMessageBox::Yes | QMessageBox::Cancel); + + if ( answer != QMessageBox::Yes ) + return; + ads.deepRemoveGroup(labelGroupName); } @@ -271,6 +279,7 @@ namespace MantidWidgets // TODO: should be MuonLoad here IAlgorithm_sptr loadAlg = AlgorithmManager::Instance().createUnmanaged("LoadMuonNexus"); loadAlg->setChild(true); + loadAlg->setRethrows(true); loadAlg->initialize(); loadAlg->setPropertyValue( "Filename", fileIt->toStdString() ); loadAlg->setPropertyValue( "OutputWorkspace", "__YouDontSeeMeIAmNinja" ); // Is not used @@ -282,7 +291,6 @@ namespace MantidWidgets { QMessageBox::critical(this, "Loading failed", "Unable to load one of the files.\n\nCheck log for details"); - g_log.error(e.what()); break; } @@ -303,10 +311,13 @@ namespace MantidWidgets double fitQuality; + // TODO: fitting function logic + try { IAlgorithm_sptr fit = AlgorithmManager::Instance().createUnmanaged("Fit"); fit->initialize(); + fit->setRethrows(true); fit->setProperty("Function", m_fitPropBrowser->getFittingFunction()); fit->setProperty("InputWorkspace", ws); fit->setProperty("WorkspaceIndex", 0); @@ -323,7 +334,6 @@ namespace MantidWidgets { QMessageBox::critical(this, "Fitting failed", "Unable to fit one of the files.\n\nCheck log for details"); - g_log.error(e.what()); break; } From 8880fbd3074f165059243292fac72684945e020c Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 11 Dec 2013 10:04:14 +0000 Subject: [PATCH 24/37] Refs #6473. Minor improvements. --- .../inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h | 2 +- .../MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp | 3 +-- .../MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 4d4f5477dacf..4a8a96c20f2c 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -45,7 +45,7 @@ namespace MantidWidgets Q_OBJECT public: - MuonSequentialFitDialog(MuonFitPropertyBrowser* parent); + MuonSequentialFitDialog(MuonFitPropertyBrowser* fitPropBrowser); virtual ~MuonSequentialFitDialog(); enum DialogState diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp index f4bb5de81468..ecdd89bde2ba 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp @@ -317,8 +317,7 @@ void MuonFitPropertyBrowser::fit() void MuonFitPropertyBrowser::sequentialFit() { MuonSequentialFitDialog* dialog = new MuonSequentialFitDialog(this); - dialog->setModal(true); - dialog->show(); + dialog->exec(); } /** diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 3f5950cad187..de5a59c397ff 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -11,8 +11,8 @@ namespace MantidWidgets using namespace Mantid::API; Logger& MuonSequentialFitDialog::g_log(Logger::get("MuonSequentialFitDialog")); - /** + * Constructor */ MuonSequentialFitDialog::MuonSequentialFitDialog(MuonFitPropertyBrowser* fitPropBrowser) : @@ -360,7 +360,7 @@ namespace MantidWidgets void MuonSequentialFitDialog::stopFit() { if ( m_state != Running ) - throw std::runtime_error("Coulnd't stop: is not running"); + throw std::runtime_error("Couldn't stop: is not running"); m_stopRequested = true; } From 4cf35e3306f3dbf20ed3b6dd6935922b6f3c672d Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 11 Dec 2013 10:45:59 +0000 Subject: [PATCH 25/37] Refs #6473. Logic for init/sequential fitting options. --- .../src/MuonSequentialFitDialog.cpp | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index de5a59c397ff..07401f9481aa 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -260,6 +260,13 @@ namespace MantidWidgets // Clear diagnosis table for new fit m_ui.diagnosisTable->setRowCount(0); + // Get fit function as specified by user in the fit browser + IFunction_sptr fitFunction = FunctionFactory::Instance().createInitialized( + m_fitPropBrowser->getFittingFunction()->asString() ); + + // Whether we should use initial function for every fit + bool useInitFitFunction = (m_ui.paramTypeGroup->checkedButton() == m_ui.paramTypeInitial); + setState(Running); m_stopRequested = false; @@ -309,26 +316,39 @@ namespace MantidWidgets const std::string runTitle = getRunTitle(ws); const std::string wsBaseName = labelGroupName + "_" + runTitle; - double fitQuality; - // TODO: fitting function logic + IFunction_sptr functionToFit; + + if ( useInitFitFunction ) + // Create a copy so that the original function is not changed + functionToFit = FunctionFactory::Instance().createInitialized( fitFunction->asString() ); + else + // Use the same function over and over, so that previous fitted params are used for the next fit + functionToFit = fitFunction; + + IAlgorithm_sptr fit = AlgorithmManager::Instance().createUnmanaged("Fit"); try { - IAlgorithm_sptr fit = AlgorithmManager::Instance().createUnmanaged("Fit"); fit->initialize(); fit->setRethrows(true); - fit->setProperty("Function", m_fitPropBrowser->getFittingFunction()); + + // Set function. Gets updated when fit is done. + fit->setProperty("Function", functionToFit); + fit->setProperty("InputWorkspace", ws); + fit->setProperty("Output", wsBaseName); + + // We should have one spectra only in the workspace, so use the first one. fit->setProperty("WorkspaceIndex", 0); + + // Various properties from the fit prop. browser fit->setProperty("StartX", m_fitPropBrowser->startX()); fit->setProperty("EndX", m_fitPropBrowser->endX()); - fit->setProperty("Output", wsBaseName); fit->setProperty("Minimizer", m_fitPropBrowser->minimizer()); fit->setProperty("CostFunction", m_fitPropBrowser->costFunction()); - fit->execute(); - fitQuality = fit->getProperty("OutputChi2overDoF"); + fit->execute(); } catch(std::exception& e) { @@ -344,7 +364,7 @@ namespace MantidWidgets ads.addToGroup(labelGroupName, wsBaseName + "_Workspace"); // Add information about the fit to the diagnosis table - addDiagnosisEntry(runTitle, fitQuality, m_fitPropBrowser->getFittingFunction()); + addDiagnosisEntry(runTitle, fit->getProperty("OutputChi2OverDof"), functionToFit); // Update progress m_ui.progress->setFormat("%p% - " + QString::fromStdString(runTitle) ); From 9483f88cf8829cb10edaf7c4708a37ae12d2b5b0 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Wed, 11 Dec 2013 11:24:49 +0000 Subject: [PATCH 26/37] Refs #6473. Showing errors in the diagnosis table. --- .../src/MuonSequentialFitDialog.cpp | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 07401f9481aa..aba3c9a7b674 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -109,13 +109,21 @@ namespace MantidWidgets IFunction_sptr fitFunc = m_fitPropBrowser->getFittingFunction(); for(size_t i = 0; i < fitFunc->nParams(); i++) - headerLabels << QString::fromStdString( fitFunc->parameterName(i) ); + { + QString paramName = QString::fromStdString( fitFunc->parameterName(i) ); + headerLabels << paramName; + headerLabels << paramName + "_Err"; + } m_ui.diagnosisTable->setColumnCount( headerLabels.size() ); m_ui.diagnosisTable->setHorizontalHeaderLabels(headerLabels); - // Make the table fill all the available space - m_ui.diagnosisTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch); + // Make the table fill all the available space and columns be resized to fit contents + m_ui.diagnosisTable->horizontalHeader()->setStretchLastSection(true); + m_ui.diagnosisTable->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); + + // Make rows alternate bg colors for better user experience + m_ui.diagnosisTable->setAlternatingRowColors(true); } /** @@ -134,11 +142,16 @@ namespace MantidWidgets m_ui.diagnosisTable->setItem(newRow, 0, new QTableWidgetItem( QString::fromStdString(runTitle) ) ); m_ui.diagnosisTable->setItem(newRow, 1, new QTableWidgetItem( QString::number(fitQuality) ) ); - for(int i = 2; i < m_ui.diagnosisTable->columnCount(); ++i) + for(int i = 2; i < m_ui.diagnosisTable->columnCount(); i += 2) { std::string paramName = m_ui.diagnosisTable->horizontalHeaderItem(i)->text().toStdString(); - double value = fittedFunction->getParameter(paramName); - m_ui.diagnosisTable->setItem(newRow, i, new QTableWidgetItem( QString::number(value) ) ); + size_t paramIndex = fittedFunction->parameterIndex(paramName); + + QString value = QString::number( fittedFunction->getParameter(paramIndex) ); + QString error = QString::number( fittedFunction->getError(paramIndex) ); + + m_ui.diagnosisTable->setItem(newRow, i, new QTableWidgetItem(value) ); + m_ui.diagnosisTable->setItem(newRow, i + 1, new QTableWidgetItem(error) ); } m_ui.diagnosisTable->scrollToBottom(); From b28b209ee29e203b03d23f5fcebac8e9f019f0bc Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 12:11:29 +0000 Subject: [PATCH 27/37] Refs #6473. Changed the way the sequential dialog is opened. --- .../inc/MantidQtCustomInterfaces/MuonAnalysis.h | 2 ++ .../MantidQt/CustomInterfaces/src/MuonAnalysis.cpp | 13 +++++++++++++ .../MantidQtMantidWidgets/MuonFitPropertyBrowser.h | 3 +++ .../MantidWidgets/src/MuonFitPropertyBrowser.cpp | 5 +---- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h index 3e5d3c69822a..1e4e56440c41 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h @@ -214,6 +214,8 @@ private slots: /// Saves the value of the widget which called the slot void saveWidgetValue(); + /// Opens a sequential fit dialog + void openSequentialFitDialog(); private: diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index 19397c9e2a32..0f2cca8ffd4b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -28,6 +28,7 @@ #include "MantidQtCustomInterfaces/MuonAnalysisResultTableTab.h" #include "MantidQtMantidWidgets/FitPropertyBrowser.h" #include "MantidQtMantidWidgets/MuonFitPropertyBrowser.h" +#include "MantidQtMantidWidgets/MuonSequentialFitDialog.h" #include #include @@ -148,6 +149,8 @@ void MuonAnalysis::initLayout() } m_uiForm.fitBrowser->init(); + connect( m_uiForm.fitBrowser, SIGNAL(sequentialFitRequested()), + this, SLOT(openSequentialFitDialog()) ); // alow appending files m_uiForm.mwRunFiles->allowMultipleFiles(true); @@ -3678,5 +3681,15 @@ void MuonAnalysis::setGrouping(ITableWorkspace_sptr detGroupingTable) updateFrontAndCombo(); } +/** + * Opens a sequential fit dialog. + */ +void MuonAnalysis::openSequentialFitDialog() +{ + MuonSequentialFitDialog* dialog = new MuonSequentialFitDialog(m_uiForm.fitBrowser, loadAlg); + dialog->exec(); + +} + }//namespace MantidQT }//namespace CustomInterfaces diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h index 13e7bb4e6165..1d05b1422cd2 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h @@ -50,6 +50,9 @@ public slots: /// Open sequential fit dialog virtual void sequentialFit(); +signals: + /// Emitted when sequential fit is requested by user + void sequentialFitRequested(); protected: virtual void showEvent(QShowEvent* e); diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp index ecdd89bde2ba..dc853b2978ae 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp @@ -1,5 +1,4 @@ #include "MantidQtMantidWidgets/MuonFitPropertyBrowser.h" -#include "MantidQtMantidWidgets/MuonSequentialFitDialog.h" #include "MantidQtMantidWidgets/PropertyHandler.h" #include "MantidAPI/FunctionFactory.h" @@ -316,8 +315,7 @@ void MuonFitPropertyBrowser::fit() */ void MuonFitPropertyBrowser::sequentialFit() { - MuonSequentialFitDialog* dialog = new MuonSequentialFitDialog(this); - dialog->exec(); + emit sequentialFitRequested(); } /** @@ -346,6 +344,5 @@ bool MuonFitPropertyBrowser::isWorkspaceValid(Mantid::API::Workspace_sptr ws)con return false; } - } // MantidQt } // API From 78debd201b2d43c479e94fa4fc4a105db39815bc Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 12:14:46 +0000 Subject: [PATCH 28/37] Refs #6473. Pass loading algorithm to the dialog. --- .../MuonSequentialFitDialog.h | 5 +- .../src/MuonSequentialFitDialog.cpp | 53 ++++++++----------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 4a8a96c20f2c..9ffc8609aef5 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -45,7 +45,7 @@ namespace MantidWidgets Q_OBJECT public: - MuonSequentialFitDialog(MuonFitPropertyBrowser* fitPropBrowser); + MuonSequentialFitDialog(MuonFitPropertyBrowser* fitPropBrowser, Algorithm_sptr loadAlg); virtual ~MuonSequentialFitDialog(); enum DialogState @@ -88,6 +88,9 @@ namespace MantidWidgets /// Whether user requested fitting to be stopped bool m_stopRequested; + /// Algorithm the dialog should use for loading + Algorithm_sptr m_loadAlg; + // -- STATIC MEMBERS ------------------------------------------------------ /// Checks if specified name is valid as a name for label. diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index aba3c9a7b674..ecab7a4fb028 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -2,6 +2,7 @@ #include "MantidQtMantidWidgets/MuonFitPropertyBrowser.h" #include "MantidAPI/AnalysisDataService.h" +#include "MantidAPI/AlgorithmProxy.h" namespace MantidQt { @@ -12,11 +13,11 @@ namespace MantidWidgets Logger& MuonSequentialFitDialog::g_log(Logger::get("MuonSequentialFitDialog")); /** - * Constructor */ - MuonSequentialFitDialog::MuonSequentialFitDialog(MuonFitPropertyBrowser* fitPropBrowser) : - QDialog(fitPropBrowser), m_fitPropBrowser(fitPropBrowser) + MuonSequentialFitDialog::MuonSequentialFitDialog(MuonFitPropertyBrowser* fitPropBrowser, + Algorithm_sptr loadAlg) : + QDialog(fitPropBrowser), m_fitPropBrowser(fitPropBrowser), m_loadAlg(loadAlg) { m_ui.setupUi(this); @@ -292,20 +293,26 @@ namespace MantidWidgets if ( m_stopRequested ) break; - Workspace_sptr loadedWS; + MatrixWorkspace_sptr ws; + + auto load = boost::dynamic_pointer_cast( AlgorithmManager::Instance().create("MuonLoad") ); + load->setChild(true); + load->setRethrows(true); + load->copyPropertiesFrom(*m_loadAlg); try { - // TODO: should be MuonLoad here - IAlgorithm_sptr loadAlg = AlgorithmManager::Instance().createUnmanaged("LoadMuonNexus"); - loadAlg->setChild(true); - loadAlg->setRethrows(true); - loadAlg->initialize(); - loadAlg->setPropertyValue( "Filename", fileIt->toStdString() ); - loadAlg->setPropertyValue( "OutputWorkspace", "__YouDontSeeMeIAmNinja" ); // Is not used - loadAlg->execute(); - - loadedWS = loadAlg->getProperty("OutputWorkspace"); + load->initialize(); + + load->setPropertyValue( "Filename", fileIt->toStdString() ); + load->setPropertyValue( "OutputWorkspace", "__YouDontSeeMeIAmNinja" ); // Is not used + + if ( m_fitPropBrowser->rawData() ) // TODO: or vice verca? + load->setPropertyValue( "RebinParams", "" ); + + load->execute(); + + ws = load->getProperty("OutputWorkspace"); } catch(std::exception& e) { @@ -314,22 +321,9 @@ namespace MantidWidgets break; } - MatrixWorkspace_sptr ws; - - if ( auto single = boost::dynamic_pointer_cast(loadedWS) ) - { - ws = single; - } - else if ( auto group = boost::dynamic_pointer_cast(loadedWS) ) - { - auto first = boost::dynamic_pointer_cast( group->getItem(0) ); - ws = first; - } - const std::string runTitle = getRunTitle(ws); const std::string wsBaseName = labelGroupName + "_" + runTitle; - IFunction_sptr functionToFit; if ( useInitFitFunction ) @@ -339,12 +333,11 @@ namespace MantidWidgets // Use the same function over and over, so that previous fitted params are used for the next fit functionToFit = fitFunction; - IAlgorithm_sptr fit = AlgorithmManager::Instance().createUnmanaged("Fit"); + IAlgorithm_sptr fit = AlgorithmManager::Instance().create("Fit"); + fit->setRethrows(true); try { - fit->initialize(); - fit->setRethrows(true); // Set function. Gets updated when fit is done. fit->setProperty("Function", functionToFit); From 57fa1287464365daabae1d49c6f6063d63b16d9c Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 12:19:06 +0000 Subject: [PATCH 29/37] Refs #6473. Helper functions to create load algorithm. --- .../MantidQtCustomInterfaces/MuonAnalysis.h | 9 + .../CustomInterfaces/src/MuonAnalysis.cpp | 155 ++++++++++++++++++ 2 files changed, 164 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h index 1e4e56440c41..eaeebf397563 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h @@ -322,6 +322,15 @@ private slots: /// Return number of groups defined (not including pairs) int numGroups(); + /// Returns custom dead time table file name as set on the interface + std::string deadTimeFilename(); + + /// Loads dead time table (group of tables) from the file. + Workspace_sptr loadDeadTimes(const std::string& filename); + + /// Creates and algorithm with all the properties set according to widget values on the interface + Algorithm_sptr createLoadAlgorithm(); + // TODO: wsIndex can be removed from functions below if we put only one group to the workspace // (as we are doing with pairs) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index 0f2cca8ffd4b..b97b6a5b4f91 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -3689,6 +3689,161 @@ void MuonAnalysis::openSequentialFitDialog() MuonSequentialFitDialog* dialog = new MuonSequentialFitDialog(m_uiForm.fitBrowser, loadAlg); dialog->exec(); + +/** + * Returns custom dead time table file name as set on the interface. + * @return The filename + */ +std::string MuonAnalysis::deadTimeFilename() +{ + if(!m_uiForm.mwRunDeadTimeFile->isValid()) + throw std::runtime_error("Specified Dead Time file is not valid."); + + return m_uiForm.mwRunDeadTimeFile->getFirstFilename().toStdString(); +} + +/** + * Loads dead time table (group of table) from the file. + * @param filename :: File to load dead times from + * @return Table (group of tables) with dead times + */ +Workspace_sptr MuonAnalysis::loadDeadTimes(const std::string& filename) +{ + try + { + IAlgorithm_sptr loadDeadTimes = AlgorithmManager::Instance().create("LoadNexusProcessed"); + loadDeadTimes->setChild(true); + loadDeadTimes->setPropertyValue("Filename", filename); + loadDeadTimes->setPropertyValue("OutputWorkspace", "__NotUsed"); + loadDeadTimes->execute(); + + return loadDeadTimes->getProperty("OutputWorkspace"); + } + catch(...) + { + throw std::runtime_error("Unable to load dead times from the spefied file"); + } +} + +/** + * Creates and algorithm with all the properties set according to widget values on the interface. + * @return The algorithm with properties set + */ +Algorithm_sptr MuonAnalysis::createLoadAlgorithm() +{ + Algorithm_sptr loadAlg = AlgorithmManager::Instance().createUnmanaged("MuonLoad"); + loadAlg->initialize(); + + // -- Dead Time Correction -------------------------------------------------- + + if (m_uiForm.deadTimeType->currentIndex() != 0) + { + loadAlg->setProperty("ApplyDeadTimeCorrection", true); + + if (m_uiForm.deadTimeType->currentIndex() == 2) // From Specified File + { + + Workspace_sptr deadTimes = loadDeadTimes( deadTimeFilename() ); + + loadAlg->setProperty("CustomDeadTimeTable", deadTimes); + } + } + + // -- Grouping -------------------------------------------------------------- + + ITableWorkspace_sptr grouping = parseGrouping(); + loadAlg->setProperty("DetectorGroupingTable", grouping); + + // -- X axis options -------------------------------------------------------- + + double Xmin = m_uiForm.timeAxisStartAtInput->text().toDouble(); + loadAlg->setProperty("Xmin", Xmin); + + double Xmax = m_uiForm.timeAxisFinishAtInput->text().toDouble(); + loadAlg->setProperty("Xmax", Xmax); + + double timeZero = m_uiForm.timeZeroFront->text().toDouble(); + loadAlg->setProperty("TimeZero", timeZero); + + // -- Rebin options --------------------------------------------------------- + + if ( m_uiForm.rebinComboBox->currentIndex() != 0) + { + std::string rebinParams; + + if(m_uiForm.rebinComboBox->currentIndex() == 1) // Fixed + { + auto loadedWS = AnalysisDataService::Instance().retrieveWS(m_grouped_name); + MatrixWorkspace_sptr ws; + + if ( ! ( ws = boost::dynamic_pointer_cast(loadedWS) ) ) + { + auto group = boost::dynamic_pointer_cast(loadedWS); + ws = boost::dynamic_pointer_cast(group->getItem(0)); + } + + double binSize = ws->dataX(0)[1] - ws->dataX(0)[0]; + + double bunchedBinSize = binSize * m_uiForm.optionStepSizeText->text().toDouble(); + + rebinParams = boost::lexical_cast(bunchedBinSize); + } + else // Variable + { + rebinParams = m_uiForm.binBoundaries->text().toStdString(); + } + + loadAlg->setPropertyValue("RebinParams", rebinParams); + } + + // -- Group/pair properties ------------------------------------------------- + + int index = m_uiForm.frontGroupGroupPairComboBox->currentIndex(); + + if (index >= numGroups()) + { + loadAlg->setProperty("OutputType", "PairAsymmetry"); + int tableRow = m_pairToRow[index - numGroups()]; + + QTableWidget* t = m_uiForm.pairTable; + + double alpha = t->item(tableRow,3)->text().toDouble(); + int index1 = static_cast( t->cellWidget(tableRow,1) )->currentIndex(); + int index2 = static_cast( t->cellWidget(tableRow,2) )->currentIndex(); + + loadAlg->setProperty("PairFirstIndex", index1); + loadAlg->setProperty("PairSecondIndex", index2); + loadAlg->setProperty("Alpha", alpha); + } + else + { + if ( parsePlotType(m_uiForm.frontPlotFuncs) == Asymmetry ) + loadAlg->setProperty("OutputType", "GroupAsymmetry"); + else + loadAlg->setProperty("OutputType", "GroupCounts"); + + int groupIndex = getGroupNumberFromRow(m_groupToRow[index]); + loadAlg->setProperty("GroupIndex", groupIndex); + } + + // -- Period options -------------------------------------------------------- + + QString periodLabel1 = m_uiForm.homePeriodBox1->currentText(); + + int periodIndex1 = periodLabel1.toInt() - 1; + loadAlg->setProperty("FirstPeriod", periodIndex1); + + QString periodLabel2 = m_uiForm.homePeriodBox2->currentText(); + if ( periodLabel2 != "None" ) + { + int periodIndex2 = periodLabel2.toInt() - 1; + loadAlg->setProperty("SecondPeriod", periodIndex2); + + std::string op = m_uiForm.homePeriodBoxMath->currentText().toStdString(); + loadAlg->setProperty("PeriodOperation", op); + } + + return loadAlg; } }//namespace MantidQT From 88673f3d4407ec3fa80ea3d62d8ed8a56a1557f4 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 12:19:28 +0000 Subject: [PATCH 30/37] Refs #6473. Creating and passing the algorithm to the dialog. --- .../CustomInterfaces/src/MuonAnalysis.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index b97b6a5b4f91..bea6556b53ba 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -3686,9 +3686,25 @@ void MuonAnalysis::setGrouping(ITableWorkspace_sptr detGroupingTable) */ void MuonAnalysis::openSequentialFitDialog() { + Algorithm_sptr loadAlg; + + try + { + loadAlg = createLoadAlgorithm(); + } + catch(...) + { + QMessageBox::critical(this, "Unable to open dialog", "Error while setting load properties"); + return; + } + + m_uiForm.fitBrowser->blockSignals(true); + MuonSequentialFitDialog* dialog = new MuonSequentialFitDialog(m_uiForm.fitBrowser, loadAlg); dialog->exec(); + m_uiForm.fitBrowser->blockSignals(false); +} /** * Returns custom dead time table file name as set on the interface. From 697229c27c6f80ba0c6f84153382ff7d25b42bf0 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 12:20:06 +0000 Subject: [PATCH 31/37] Refs #6473. Refactored dead time correction a bit. So it now uses the same routines as algorithm creation function. --- .../CustomInterfaces/src/MuonAnalysis.cpp | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index bea6556b53ba..f0b6b362d922 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -1535,38 +1535,28 @@ void MuonAnalysis::inputFileChanged(const QStringList& files) if (m_uiForm.instrSelector->currentText().toUpper() == "ARGUS") throw std::runtime_error("Dead times are currently not implemented in ARGUS files."); - IAlgorithm_sptr applyCorrAlg = AlgorithmManager::Instance().create("ApplyDeadTimeCorr"); - - applyCorrAlg->setPropertyValue("InputWorkspace", m_workspace_name); - applyCorrAlg->setPropertyValue("OutputWorkspace", m_workspace_name); - - ScopedWorkspace customDeadTimes; + ScopedWorkspace deadTimes; if (m_uiForm.deadTimeType->currentIndex() == 1) // From Run Data { if( ! loadedDeadTimes ) throw std::runtime_error("Data file doesn't appear to contain dead time values"); - - applyCorrAlg->setPropertyValue("DeadTimeTable", loadedDeadTimes.name()); + + Workspace_sptr ws = loadedDeadTimes.retrieve(); + loadedDeadTimes.remove(); + + deadTimes.set(ws); } else if (m_uiForm.deadTimeType->currentIndex() == 2) // From Specified File { - if(!m_uiForm.mwRunDeadTimeFile->isValid()) - throw std::runtime_error("Specified Dead Time file is not valid."); - - std::string deadTimeFile = m_uiForm.mwRunDeadTimeFile->getFirstFilename().toStdString(); - - IAlgorithm_sptr loadDeadTimes = AlgorithmManager::Instance().create("LoadNexusProcessed"); - loadDeadTimes->setPropertyValue("Filename", deadTimeFile); - loadDeadTimes->setPropertyValue("OutputWorkspace", customDeadTimes.name()); - loadDeadTimes->execute(); - - if ( ! customDeadTimes ) - throw std::runtime_error("Unable to load dead times from the spefied file"); - - applyCorrAlg->setPropertyValue("DeadTimeTable", customDeadTimes.name()); + Workspace_sptr ws = loadDeadTimes( deadTimeFilename() ); + deadTimes.set(ws); } + IAlgorithm_sptr applyCorrAlg = AlgorithmManager::Instance().create("ApplyDeadTimeCorr"); + applyCorrAlg->setPropertyValue("InputWorkspace", m_workspace_name); + applyCorrAlg->setPropertyValue("OutputWorkspace", m_workspace_name); + applyCorrAlg->setPropertyValue("DeadTimeTable", deadTimes.name()); applyCorrAlg->execute(); } catch(std::exception& e) From cccb358c42472ccde02ab9ccb7cc44244dcacaaf Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 12:20:22 +0000 Subject: [PATCH 32/37] Refs #6473. Minor fixes in MuonAnalysis. --- Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index f0b6b362d922..98f3ac73a9e9 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -508,10 +508,7 @@ MatrixWorkspace_sptr MuonAnalysis::createAnalysisWorkspace(ItemType itemType, in alg->initialize(); - // TODO: should really be global - const std::string loadedWSName = m_workspace_name + "Grouped"; - - auto loadedWS = AnalysisDataService::Instance().retrieveWS(loadedWSName); + auto loadedWS = AnalysisDataService::Instance().retrieveWS(m_grouped_name); if ( auto group = boost::dynamic_pointer_cast(loadedWS) ) { @@ -576,7 +573,7 @@ MatrixWorkspace_sptr MuonAnalysis::createAnalysisWorkspace(ItemType itemType, in QTableWidget* t = m_uiForm.pairTable; - double alpha = t->item(m_pairTableRowInFocus,3)->text().toDouble(); + double alpha = t->item(tableRow,3)->text().toDouble(); int index1 = static_cast( t->cellWidget(tableRow,1) )->currentIndex(); int index2 = static_cast( t->cellWidget(tableRow,2) )->currentIndex(); From c2d304f18d34a54c255aa239bb1b087b8e31d4c9 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 12:59:03 +0000 Subject: [PATCH 33/37] Refs #6473. Fix for windows error and warnings. --- Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp | 4 ++-- .../inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h | 2 +- .../MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index 98f3ac73a9e9..9bcc31629ef5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -398,7 +398,7 @@ void MuonAnalysis::plotItem(ItemType itemType, int tableRow, PlotType plotType) setCurrentDataName( wsNameQ ); } - catch(std::exception& e) + catch(...) { QMessageBox::critical( this, "MuonAnalysis - Error", "Unable to plot the item. Check log for details." ); } @@ -3706,7 +3706,7 @@ std::string MuonAnalysis::deadTimeFilename() } /** - * Loads dead time table (group of table) from the file. + * Loads dead time table (group of tables) from the file. * @param filename :: File to load dead times from * @return Table (group of tables) with dead times */ diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index 9ffc8609aef5..a8b33894de78 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -39,7 +39,7 @@ namespace MantidWidgets File change history is stored at: Code Documentation is available at: */ - class DLLExport MuonSequentialFitDialog : public QDialog + class EXPORT_OPT_MANTIDQT_MANTIDWIDGETS MuonSequentialFitDialog : public QDialog { Q_OBJECT diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index ecab7a4fb028..7e0a76677d9c 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -314,7 +314,7 @@ namespace MantidWidgets ws = load->getProperty("OutputWorkspace"); } - catch(std::exception& e) + catch(...) { QMessageBox::critical(this, "Loading failed", "Unable to load one of the files.\n\nCheck log for details"); @@ -356,7 +356,7 @@ namespace MantidWidgets fit->execute(); } - catch(std::exception& e) + catch(...) { QMessageBox::critical(this, "Fitting failed", "Unable to fit one of the files.\n\nCheck log for details"); From 21aacb3980e153004bdc4565005548c34e554b77 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 13:30:39 +0000 Subject: [PATCH 34/37] Refs #6473. Ability to export results on the Results Tab. --- .../src/MuonAnalysisResultTableTab.cpp | 39 ++++++++++++++++++- .../src/MuonSequentialFitDialog.cpp | 3 ++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysisResultTableTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysisResultTableTab.cpp index 46744811542f..3bd15f1c8f8c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysisResultTableTab.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysisResultTableTab.cpp @@ -9,6 +9,7 @@ #include "MantidQtAPI/UserSubWindow.h" #include +#include #include #include @@ -27,8 +28,10 @@ namespace CustomInterfaces { namespace Muon { - using namespace MantidQt::API; using namespace Mantid::Kernel; + using namespace Mantid::API; + + using namespace MantidQt::API; using namespace MantidQt::MantidWidgets; const std::string MuonAnalysisResultTableTab::RUN_NO_LOG = "run_number"; @@ -207,6 +210,7 @@ void MuonAnalysisResultTableTab::populateTables(const QStringList& wsList) // Clear the previous table values m_logValues.clear(); QVector fittedWsList; + // Get all the workspaces from the fitPropertyBrowser and find out whether they have had fitting done to them. for (int i(0); i items = + Mantid::API::AnalysisDataService::Instance().topLevelItems(); + + for ( auto it = items.begin(); it != items.end(); ++it ) + { + if ( ! boost::starts_with(it->first, "MuonSeqFit_") ) + continue; + + auto group = boost::dynamic_pointer_cast(it->second); + + if ( ! group ) + continue; + + for ( size_t i = 0; i < group->size(); ++i ) + { + auto ws = boost::dynamic_pointer_cast( group->getItem(i) ); + + if ( ! ws ) + continue; + + std::string name = ws->name(); + size_t pos = name.find("_Workspace"); + + if ( pos == std::string::npos) + continue; + + name.erase(pos); + + fittedWsList << QString::fromStdString(name); + } + } + if(fittedWsList.size() > 0) { // Make sure all params match. diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 7e0a76677d9c..9fc4c5a01a70 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -324,6 +324,9 @@ namespace MantidWidgets const std::string runTitle = getRunTitle(ws); const std::string wsBaseName = labelGroupName + "_" + runTitle; + ads.add(wsBaseName, ws); + ads.addToGroup(labelGroupName, wsBaseName); + IFunction_sptr functionToFit; if ( useInitFitFunction ) From 9a6c3a05f4efe81f98e1a59881d3957f4ff5a9b2 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 14:11:33 +0000 Subject: [PATCH 35/37] Refs #6473. Fixed the Raw workspace names. This naming is assumed in other places as it turns out. --- Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index 9bcc31629ef5..dd37288a0b30 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -370,7 +370,7 @@ void MuonAnalysis::plotItem(ItemType itemType, int tableRow, PlotType plotType) // Find names for new workspaces const std::string wsName = getNewAnalysisWSName(groupName, itemType, tableRow, plotType); - const std::string wsRawName = wsName + "; Raw"; + const std::string wsRawName = wsName + "_Raw"; // Make sure they end up in the ADS ads.addOrReplace(wsName, ws); From 4b68be5a84a5e4008b309523a05e53eb235a47fa Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 14:16:01 +0000 Subject: [PATCH 36/37] Refs #6473. Spelling mistake fix. --- Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index dd37288a0b30..c187824512f4 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -1758,10 +1758,10 @@ void MuonAnalysis::inputFileChanged(const QStringList& files) infoStr += ss.str(); } else // Show appropriate error message. - infoStr += "Errror - Not set in data file."; + infoStr += "Error - Not set in data file."; } else // Show appropriate error message. - infoStr += "Errror - Not found in data file."; + infoStr += "Error - Not found in data file."; // Include all the run information. m_uiForm.infoBrowser->setText(infoStr.c_str()); From 3d5a2b6a769be9dd17d7abb36f30540cf6fcf624 Mon Sep 17 00:00:00 2001 From: Arturs Bekasovs Date: Fri, 13 Dec 2013 14:56:04 +0000 Subject: [PATCH 37/37] Refs #6473. Cosmetic diagnosis table improvements. --- .../MuonSequentialFitDialog.h | 3 +++ .../src/MuonSequentialFitDialog.cpp | 23 +++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h index a8b33894de78..1a3e76a190d0 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonSequentialFitDialog.h @@ -74,6 +74,9 @@ namespace MantidWidgets void addDiagnosisEntry(const std::string& runTitle, double fitQuality, IFunction_sptr fittedFunction); + /// Helper function to create new item for Diagnosis table + QTableWidgetItem* createTableWidgetItem(const QString& text); + // -- VARIABLES ----------------------------------------------------------- /// UI form diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp index 9fc4c5a01a70..96a56e001b8c 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/MuonSequentialFitDialog.cpp @@ -120,7 +120,6 @@ namespace MantidWidgets m_ui.diagnosisTable->setHorizontalHeaderLabels(headerLabels); // Make the table fill all the available space and columns be resized to fit contents - m_ui.diagnosisTable->horizontalHeader()->setStretchLastSection(true); m_ui.diagnosisTable->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); // Make rows alternate bg colors for better user experience @@ -140,8 +139,11 @@ namespace MantidWidgets m_ui.diagnosisTable->insertRow(newRow); - m_ui.diagnosisTable->setItem(newRow, 0, new QTableWidgetItem( QString::fromStdString(runTitle) ) ); - m_ui.diagnosisTable->setItem(newRow, 1, new QTableWidgetItem( QString::number(fitQuality) ) ); + QString runTitleDisplay = QString::fromStdString(runTitle); + m_ui.diagnosisTable->setItem( newRow, 0, createTableWidgetItem(runTitleDisplay) ); + + QString fitQualityDisplay = QString::number(fitQuality); + m_ui.diagnosisTable->setItem( newRow, 1, createTableWidgetItem(fitQualityDisplay) ); for(int i = 2; i < m_ui.diagnosisTable->columnCount(); i += 2) { @@ -151,13 +153,24 @@ namespace MantidWidgets QString value = QString::number( fittedFunction->getParameter(paramIndex) ); QString error = QString::number( fittedFunction->getError(paramIndex) ); - m_ui.diagnosisTable->setItem(newRow, i, new QTableWidgetItem(value) ); - m_ui.diagnosisTable->setItem(newRow, i + 1, new QTableWidgetItem(error) ); + m_ui.diagnosisTable->setItem(newRow, i, createTableWidgetItem(value) ); + m_ui.diagnosisTable->setItem(newRow, i + 1, createTableWidgetItem(error) ); } m_ui.diagnosisTable->scrollToBottom(); } + /** + * Helper function to create new item for Diagnosis table. + * @return Created and initialized item with text + */ + QTableWidgetItem* MuonSequentialFitDialog::createTableWidgetItem(const QString& text) + { + auto newItem = new QTableWidgetItem(text); + newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); + return newItem; + } + /** * Updates visibility/tooltip of label error asterisk. * @param label :: New label as specified by user