Newer
Older
#include "MantidQtWidgets/Common/FitPropertyBrowser.h"
#include "MantidQtWidgets/Common/HelpWindow.h"
#include "MantidQtWidgets/Common/MantidDesktopServices.h"
#include "MantidQtWidgets/Common/MultifitSetupDialog.h"
#include "MantidQtWidgets/Common/PropertyHandler.h"
#include "MantidQtWidgets/Common/SequentialFitDialog.h"
#include "MantidAPI/CompositeFunction.h"
Federico Montesino Pouzols
committed
#include "MantidAPI/CostFunctionFactory.h"
#include "MantidAPI/FuncMinimizerFactory.h"
#include "MantidAPI/IBackgroundFunction.h"
Federico Montesino Pouzols
committed
#include "MantidAPI/ICostFunction.h"
#include "MantidAPI/IFuncMinimizer.h"
#include "MantidAPI/IPeakFunction.h"
#include "MantidAPI/ITableWorkspace.h"
Federico Montesino Pouzols
committed
#include "MantidAPI/MatrixWorkspace.h"
#include "MantidAPI/ParameterTie.h"
#include "MantidAPI/TableRow.h"
#include "MantidAPI/WorkspaceFactory.h"
#include "MantidKernel/ConfigService.h"
#include "MantidKernel/LibraryManager.h"
#include "MantidQtWidgets/Common/QtPropertyBrowser/FilenameDialogEditor.h"
#include "MantidQtWidgets/Common/QtPropertyBrowser/FormulaDialogEditor.h"
#include "MantidQtWidgets/Common/QtPropertyBrowser/StringEditorFactory.h"
#include "MantidQtWidgets/Common/QtPropertyBrowser/DoubleEditorFactory.h"
#include "MantidQtWidgets/Common/QtPropertyBrowser/ParameterPropertyManager.h"
#include "MantidQtWidgets/Common/QtPropertyBrowser/qteditorfactory.h"
#include "MantidQtWidgets/Common/QtPropertyBrowser/qttreepropertybrowser.h"
#include <QApplication>
#include <QClipboard>
#include <QInputDialog>
#include <QPushButton>
Anders Markvardsen
committed
#include <QSignalMapper>
#include <QUrl>
#include <QVBoxLayout>
namespace MantidQt {
using API::MantidDesktopServices;
namespace MantidWidgets {
/**
* Constructor
* @param parent :: The parent widget - must be an ApplicationWindow
* @param mantidui :: The UI form for MantidPlot
FitPropertyBrowser::FitPropertyBrowser(QWidget *parent, QObject *mantidui)
: QDockWidget("Fit Function", parent), m_workspaceIndex(nullptr),
m_startX(nullptr), m_endX(nullptr), m_output(nullptr),
m_minimizer(nullptr), m_ignoreInvalidData(nullptr),
m_costFunction(nullptr), m_maxIterations(nullptr), m_peakRadius(nullptr),
m_logValue(nullptr), m_plotDiff(nullptr), m_plotCompositeMembers(nullptr),
m_convolveMembers(nullptr), m_rawData(nullptr), m_xColumn(nullptr),
m_yColumn(nullptr), m_errColumn(nullptr), m_showParamErrors(nullptr),
m_evaluationType(nullptr), m_compositeFunction(), m_browser(nullptr),
m_fitActionUndoFit(nullptr), m_fitActionSeqFit(nullptr),
m_fitActionFit(nullptr), m_fitActionEvaluate(nullptr),
m_functionsGroup(nullptr), m_settingsGroup(nullptr),
m_customSettingsGroup(nullptr), m_changeSlotsEnabled(false),
m_guessOutputName(true),
m_updateObserver(*this, &FitPropertyBrowser::handleFactoryUpdate),
m_fitMapper(nullptr), m_fitMenu(nullptr),
m_displayActionPlotGuess(nullptr), m_displayActionQuality(nullptr),
m_displayActionClearAll(nullptr), m_setupActionCustomSetup(nullptr),
m_setupActionRemove(nullptr), m_tip(nullptr), m_fitSelector(nullptr),
m_fitTree(nullptr), m_currentHandler(nullptr),
m_defaultFunction("Gaussian"), m_defaultPeak("Gaussian"),
m_defaultBackground("LinearBackground"), m_index_(0), m_peakToolOn(false),
m_auto_back(false),
m_autoBgName(QString::fromStdString(
Mantid::Kernel::ConfigService::Instance().getString(
"curvefitting.autoBackground"))),
m_autoBackground(nullptr), m_decimals(-1), m_mantidui(mantidui),
m_shouldBeNormalised(false) {
std::string libpath =
Mantid::Kernel::ConfigService::Instance().getString("plugins.directory");
if (!libpath.empty()) {
Mantid::Kernel::LibraryManager::Instance().OpenAllLibraries(libpath);
}
// Try to create a Gaussian. Failing will mean that CurveFitting dll is not
// loaded
boost::shared_ptr<Mantid::API::IFunction> f =
boost::shared_ptr<Mantid::API::IFunction>(
Mantid::API::FunctionFactory::Instance().createFunction("Gaussian"));
if (m_autoBgName.toLower() == "none") {
setAutoBackgroundName(m_autoBgName);
}
std::string def = Mantid::Kernel::ConfigService::Instance().getString(
"curvefitting.defaultPeak");
if (!def.empty()) {
def = Mantid::Kernel::ConfigService::Instance().getString(
"curvefitting.autoBackground");
if (!def.empty()) {
m_defaultBackground = def;
}
m_defaultFunction = m_defaultPeak;
setObjectName(
"FitFunction"); // this is needed for QMainWindow::restoreState()
setMinimumHeight(150);
setMinimumWidth(200);
QWidget *w = new QWidget(this);
/* Create property managers: they create, own properties, get and set values
*/
m_groupManager = new QtGroupPropertyManager(w);
m_doubleManager = new QtDoublePropertyManager(w);
m_stringManager = new QtStringPropertyManager(w);
m_enumManager = new QtEnumPropertyManager(w);
m_intManager = new QtIntPropertyManager(w);
m_boolManager = new QtBoolPropertyManager(w);
m_filenameManager = new QtStringPropertyManager(w);
m_formulaManager = new QtStringPropertyManager(w);
m_columnManager = new QtEnumPropertyManager(w);
m_workspace = m_enumManager->addProperty("Workspace");
m_vectorManager = new QtGroupPropertyManager(w);
m_vectorSizeManager = new QtIntPropertyManager(w);
m_vectorDoubleManager = new QtDoublePropertyManager(w);
m_parameterManager = new ParameterPropertyManager(w);
* Initialise the fit property browser
*/
void FitPropertyBrowser::init() {
QWidget *w = new QWidget(this);
QSettings settings;
settings.beginGroup("Mantid/FitBrowser");
Robert Whitley
committed
/* Create function group */
QtProperty *functionsGroup = m_groupManager->addProperty("Functions");
connect(this, SIGNAL(xRangeChanged(double, double)), m_mantidui,
SLOT(x_range_from_picker(double, double)));
/* Create input - output properties */
QtProperty *settingsGroup = m_groupManager->addProperty("Settings");
m_startX = addDoubleProperty("StartX");
m_endX = addDoubleProperty("EndX");
m_workspaceIndex = m_intManager->addProperty("Workspace Index");
m_output = m_stringManager->addProperty("Output");
m_minimizer = m_enumManager->addProperty("Minimizer");
<< "Levenberg-MarquardtMD"
<< "Trust Region"
<< "Conjugate gradient (Fletcher-Reeves imp.)"
<< "Conjugate gradient (Polak-Ribiere imp.)"
<< "Damped GaussNewton";
m_ignoreInvalidData = m_boolManager->addProperty("Ignore invalid data");
setIgnoreInvalidData(settings.value("Ignore invalid data", false).toBool());
m_enumManager->setEnumNames(m_minimizer, m_minimizers);
m_costFunction = m_enumManager->addProperty("Cost function");
m_costFunctions << "Least squares"
<< "Rwp"
<< "Unweighted least squares";
m_enumManager->setEnumNames(m_costFunction, m_costFunctions);
m_maxIterations = m_intManager->addProperty("Max Iterations");
m_intManager->setValue(m_maxIterations,
settings.value("Max Iterations", 500).toInt());
Robert Whitley
committed
m_peakRadius = m_intManager->addProperty("Peak Radius");
m_intManager->setValue(m_peakRadius,
settings.value("Peak Radius", 0).toInt());
m_plotDiff = m_boolManager->addProperty("Plot Difference");
bool plotDiff = settings.value("Plot Difference", QVariant(true)).toBool();
m_boolManager->setValue(m_plotDiff, plotDiff);
m_plotCompositeMembers = m_boolManager->addProperty("Plot Composite Members");
bool plotCompositeItems =
Loading
Loading full blame...