Mantid
Loading...
Searching...
No Matches
FunctionMultiDomainPresenter.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
10
12
15
16#include <QApplication>
17#include <QClipboard>
18#include <QMessageBox>
19#include <QWidget>
20#include <utility>
21
22namespace {
23Mantid::Kernel::Logger g_log("FunctionMultiDomain");
24}
25
27
28using namespace Mantid::API;
29using namespace Mantid::Kernel;
30
32 : m_view(view), m_model(std::make_unique<FunctionModel>()), m_editLocalParameterDialog(nullptr) {
33 connect(m_view, SIGNAL(parameterChanged(std::string const &)), this, SLOT(viewChangedParameter(std::string const &)));
34 connect(m_view, SIGNAL(functionReplaced(std::string const &)), this, SLOT(viewPastedFunction(std::string const &)));
35 connect(m_view, SIGNAL(functionAdded(std::string const &)), this, SLOT(viewAddedFunction(std::string const &)));
36 connect(m_view, SIGNAL(functionRemoved(std::string const &)), this, SLOT(viewRemovedFunction(std::string const &)));
37 connect(m_view, SIGNAL(parameterTieChanged(std::string const &, std::string const &)), this,
38 SLOT(viewChangedTie(std::string const &, std::string const &)));
39 connect(m_view, SIGNAL(parameterConstraintAdded(std::string const &, std::string const &)), this,
40 SLOT(viewAddedConstraint(std::string const &, std::string const &)));
41 connect(m_view, SIGNAL(parameterConstraintRemoved(std::string const &)), this,
42 SLOT(viewRemovedConstraint(std::string const &)));
43 connect(m_view, SIGNAL(localParameterButtonClicked(std::string const &)), this,
44 SLOT(editLocalParameter(std::string const &)));
45 connect(m_view, SIGNAL(copyToClipboardRequest()), this, SLOT(viewRequestedCopyToClipboard()));
46 connect(m_view, SIGNAL(globalsChanged(const std::vector<std::string> &)), this,
47 SLOT(viewChangedGlobals(const std::vector<std::string> &)));
48 connect(m_view, SIGNAL(functionHelpRequest()), this, SLOT(viewRequestedFunctionHelp()));
49 connect(m_view, SIGNAL(attributePropertyChanged(std::string const &)), this,
50 SLOT(viewChangedAttribute(std::string const &)));
51}
52
54 m_model->setFunction(std::move(fun));
55 m_view->setFunction(m_model->getCurrentFunction());
57}
58
59void FunctionMultiDomainPresenter::setFunctionString(std::string const &funStr) {
60 m_model->setFunctionString(funStr);
61 m_view->setFunction(m_model->getCurrentFunction());
63}
64
66
67std::string FunctionMultiDomainPresenter::getFitFunctionString() const { return m_model->getFitFunctionString(); }
68
69bool FunctionMultiDomainPresenter::hasFunction() const { return m_model->hasFunction(); }
70
74
75void FunctionMultiDomainPresenter::setParameter(std::string const &parameterName, double value) {
76 m_model->setParameter(parameterName, value);
77 m_view->setParameter(parameterName, value);
78}
79
80void FunctionMultiDomainPresenter::setParameterError(std::string const &parameterName, double value) {
81 m_model->setParameterError(parameterName, value);
82 m_view->setParameterError(parameterName, value);
83}
84
85double FunctionMultiDomainPresenter::getParameter(std::string const &parameterName) {
86 return m_model->getParameter(parameterName);
87}
88
89bool FunctionMultiDomainPresenter::isParameterFixed(std::string const &parameterName) const {
90 return m_model->isParameterFixed(parameterName);
91}
92
93std::string FunctionMultiDomainPresenter::getParameterTie(std::string const &parameterName) const {
94 return m_model->getParameterTie(parameterName);
95}
96
98 m_model->updateParameters(fun);
100}
101
103 m_model->updateMultiDatasetParameters(fun);
105}
106
108 m_model->updateMultiDatasetAttributes(fun);
110}
111
113
114std::optional<std::string> FunctionMultiDomainPresenter::currentFunctionIndex() const {
116}
117
119
120void FunctionMultiDomainPresenter::setDatasets(const std::vector<std::string> &datasetNames) {
121 m_model->setDatasets(datasetNames);
122}
123
125 m_model->setDatasets(datasets);
126}
127
128void FunctionMultiDomainPresenter::addDatasets(const std::vector<std::string> &datasetNames) {
129 m_model->addDatasets(datasetNames);
130}
131
132std::vector<std::string> FunctionMultiDomainPresenter::getDatasetNames() const { return m_model->getDatasetNames(); }
133
135 return m_model->getDatasetDomainNames();
136}
137
138int FunctionMultiDomainPresenter::getNumberOfDatasets() const { return m_model->getNumberDomains(); }
139
140int FunctionMultiDomainPresenter::getCurrentDataset() const { return m_model->currentDomainIndex(); }
141
143 m_model->setCurrentDomainIndex(index);
145}
146
148 m_model->removeDatasets(indices);
149 setCurrentDataset(m_model->currentDomainIndex());
150}
151
152double FunctionMultiDomainPresenter::getLocalParameterValue(std::string const &parameterName, int i) const {
153 return m_model->getLocalParameterValue(parameterName, i);
154}
155
156bool FunctionMultiDomainPresenter::isLocalParameterFixed(std::string const &parameterName, int i) const {
157 return m_model->isLocalParameterFixed(parameterName, i);
158}
159
160std::string FunctionMultiDomainPresenter::getLocalParameterTie(std::string const &parameterName, int i) const {
161 return m_model->getLocalParameterTie(parameterName, i);
162}
163
164std::string FunctionMultiDomainPresenter::getLocalParameterConstraint(std::string const &parameterName, int i) const {
165 return m_model->getLocalParameterConstraint(parameterName, i);
166}
167
168void FunctionMultiDomainPresenter::setLocalParameterValue(std::string const &parameterName, int i, double value) {
169 m_model->setLocalParameterValue(parameterName, i, value);
170 if (m_model->currentDomainIndex() == i) {
171 m_view->setParameter(parameterName, value);
172 }
173}
174
175void FunctionMultiDomainPresenter::setLocalParameterValue(std::string const &parameterName, int i, double value,
176 double error) {
177 m_model->setLocalParameterValue(parameterName, i, value, error);
178 if (m_model->currentDomainIndex() == i) {
179 m_view->setParameter(parameterName, value);
180 m_view->setParameterError(parameterName, error);
181 }
182}
183
184void FunctionMultiDomainPresenter::setLocalParameterFixed(std::string const &parameterName, int i, bool fixed) {
185 m_model->setLocalParameterFixed(parameterName, i, fixed);
186 if (m_model->currentDomainIndex() == i) {
187 if (fixed) {
188 m_view->setParameterTie(parameterName, QString::number(m_model->getParameter(parameterName)).toStdString());
189 } else {
190 m_view->setParameterTie(parameterName, "");
191 }
192 }
193}
194
195void FunctionMultiDomainPresenter::setLocalParameterTie(std::string const &parameterName, int i,
196 std::string const &tie) {
197 m_model->setLocalParameterTie(parameterName, i, tie);
198 if (m_model->currentDomainIndex() == i) {
199 m_view->setParameterTie(parameterName, tie);
200 }
201}
202
203void FunctionMultiDomainPresenter::setLocalParameterConstraint(std::string const &parameterName, int i,
204 std::string const &constraint) {
205 m_model->setLocalParameterConstraint(parameterName, i, constraint);
206 if (m_model->currentDomainIndex() == i) {
207 m_view->setParameterConstraint(parameterName, constraint);
208 }
209}
210
212 return m_model->getGlobalParameters();
213}
214
215void FunctionMultiDomainPresenter::setGlobalParameters(std::vector<std::string> const &globals) {
216 m_model->setGlobalParameters(globals);
217 m_view->setGlobalParameters(m_model->getGlobalParameters());
218}
219
220std::vector<std::string> FunctionMultiDomainPresenter::getLocalParameters() const {
221 return m_model->getLocalParameters();
222}
223
225 auto const paramName = m_model->setBackgroundA0(value);
226 if (!paramName.empty())
227 m_view->setParameter(paramName, value);
228}
229
231 m_model->setFunctionString(funStr);
233}
234
235void FunctionMultiDomainPresenter::viewAddedFunction(std::string const &funStr) {
236 auto const prefix = m_view->currentFunctionIndex();
237 auto const prefixValue = prefix ? *prefix : "";
238 m_model->addFunction(prefixValue, funStr);
239 m_view->setGlobalParameters(m_model->getGlobalParameters());
241}
242
243void FunctionMultiDomainPresenter::viewRemovedFunction(std::string const &functionIndex) {
244 m_model->removeFunction(functionIndex);
245 m_view->setGlobalParameters(m_model->getGlobalParameters());
247}
248
249void FunctionMultiDomainPresenter::viewChangedTie(std::string const &parameterName, std::string const &tie) {
250 m_model->changeTie(parameterName, tie);
252}
253
254void FunctionMultiDomainPresenter::viewAddedConstraint(std::string const &functionIndex,
255 std::string const &constraint) {
256 m_model->addConstraint(functionIndex, constraint);
258}
259
260void FunctionMultiDomainPresenter::viewRemovedConstraint(std::string const &parameterName) {
261 m_model->removeConstraint(parameterName);
263}
264
266 auto fun = getFunction();
267 if (fun) {
268 QApplication::clipboard()->setText(QString::fromStdString(fun->asString()));
269 }
270}
271
272void FunctionMultiDomainPresenter::viewChangedGlobals(const std::vector<std::string> &globalParameters) {
273 m_model->setGlobalParameters(globalParameters);
275}
276
278 auto func = m_view->getSelectedFunction();
279 if (func)
280 m_view->showFunctionHelp(func->name());
281}
282
283std::string FunctionMultiDomainPresenter::getFunctionString() const { return m_model->getFunctionString(); }
284
285IFunction_sptr FunctionMultiDomainPresenter::getFunction() const { return m_model->getCurrentFunction(); }
286
292
294 auto treeView = dynamic_cast<FunctionTreeView *>(m_view);
295 if (treeView)
296 treeView->setColumnSizes(s0, s1, s2);
297}
298
300 if (auto treeView = dynamic_cast<FunctionTreeView *>(m_view))
301 treeView->setStretchLastColumn(stretch);
302}
303
305
306void FunctionMultiDomainPresenter::viewChangedParameter(std::string const &parameterName) {
307 auto const value = m_view->getParameter(parameterName);
308 m_model->setParameter(parameterName, value);
309 auto const parts = splitParameterName(parameterName);
310 emit parameterChanged(parts.first, parts.second);
311}
312
313void FunctionMultiDomainPresenter::viewChangedAttribute(std::string const &attrName) {
314 try {
315 auto value = m_view->getAttribute(attrName);
316 m_model->setAttribute(attrName, value);
317 emit attributeChanged(attrName);
318 } catch (const std::invalid_argument &e) {
320 g_log.error(e.what());
321 }
322}
323
328void FunctionMultiDomainPresenter::editLocalParameter(std::string const &parameterName) {
329 auto const datasetNames = getDatasetNames();
330 auto const domainNames = getDatasetDomainNames();
331 QList<double> values;
332 QList<bool> fixes;
333 QStringList ties;
334 QStringList constraints;
335 for (int i = 0; i < static_cast<int>(domainNames.size()); ++i) {
336 const double value = getLocalParameterValue(parameterName, i);
337 values.push_back(value);
338 const bool fixed = isLocalParameterFixed(parameterName, i);
339 fixes.push_back(fixed);
340 const auto tie = getLocalParameterTie(parameterName, i);
341 ties.push_back(QString::fromStdString(tie));
342 const auto constraint = getLocalParameterConstraint(parameterName, i);
343 constraints.push_back(QString::fromStdString(constraint));
344 }
345
347 new EditLocalParameterDialog(m_view, parameterName, datasetNames, domainNames, values, fixes, ties, constraints);
348 connect(m_editLocalParameterDialog, SIGNAL(finished(int)), this, SLOT(editLocalParameterFinish(int)));
350}
351
353 if (result == QDialog::Accepted) {
355 auto values = m_editLocalParameterDialog->getValues();
356 auto fixes = m_editLocalParameterDialog->getFixes();
357 auto ties = m_editLocalParameterDialog->getTies();
358 auto constraints = m_editLocalParameterDialog->getConstraints();
359 assert(values.size() == getNumberOfDatasets());
360 for (int i = 0; i < values.size(); ++i) {
361 setLocalParameterValue(parName, i, values[i]);
362 if (!ties[i].isEmpty()) {
363 setLocalParameterTie(parName, i, ties[i].toStdString());
364 } else if (fixes[i]) {
365 setLocalParameterFixed(parName, i, fixes[i]);
366 } else {
367 setLocalParameterTie(parName, i, "");
368 }
369 setLocalParameterConstraint(parName, i, constraints[i].toStdString());
370 }
371 }
374}
375
377 const auto index = m_model->currentDomainIndex();
378 for (auto const &name : m_model->getParameterNames()) {
379 auto const value = m_model->getParameter(name);
381 m_view->setParameterError(name, m_model->getParameterError(name));
382 if (m_model->isLocalParameterFixed(name, index)) {
383 m_view->setParameterTie(name, QString::number(value).toStdString());
384 } else {
385 m_view->setParameterTie(name, m_model->getLocalParameterTie(name, index));
386 }
387 m_view->setParameterConstraint(name, m_model->getLocalParameterConstraint(name, index));
388 }
390}
391
393 for (const auto &name : m_model->getAttributeNames()) {
394 // Create a single lambda expression capable of visiting each attribute
395 auto visitAttribute = [&](auto val) { m_view->setAttributeValue(name, val); };
396 auto value = m_model->getAttribute(name);
397 auto visitor = AttributeLambdaVisitor{visitAttribute};
398 value.apply(visitor);
399 }
400}
401
403 auto treeView = dynamic_cast<FunctionTreeView *>(m_view);
404 if (treeView) {
405 treeView->hideGlobals();
406 }
407}
408
410 auto treeView = dynamic_cast<FunctionTreeView *>(m_view);
411 if (treeView) {
412 treeView->showGlobals();
413 }
414}
415
416} // namespace MantidQt::MantidWidgets
std::string name
Definition Run.cpp:60
double value
The value of the point.
Definition FitMW.cpp:51
double error
std::map< DeltaEMode::Type, std::string > index
A dialog for displaying and editing values of local parameters.
const QList< double > & getValues() const
Get the list of new parameter values.
const QStringList & getConstraints() const
Get a list of the constraints.
const QStringList & getTies() const
Get a list of the ties.
const QList< bool > & getFixes() const
Get a list with the "fixed" attribute.
void viewAddedConstraint(std::string const &functionIndex, std::string const &constraint)
void setDatasets(const std::vector< std::string > &datasetNames)
void addDatasets(const std::vector< std::string > &datasetNames)
void setLocalParameterTie(std::string const &parameterName, int i, std::string const &tie)
bool isLocalParameterFixed(std::string const &parameterName, int i) const
void setLocalParameterConstraint(std::string const &parameterName, int i, std::string const &constraint)
void setParameterError(std::string const &parameterName, double value)
void setLocalParameterValue(std::string const &parameterName, int i, double value)
std::string getLocalParameterConstraint(std::string const &parameterName, int i) const
void parameterChanged(std::string const &funcIndex, std::string const &parameterName)
std::string getLocalParameterTie(std::string const &parameterName, int i) const
void editLocalParameter(std::string const &parameterName)
Launches the Edit Local Parameter dialog and deals with the input from it.
void setParameter(std::string const &parameterName, double value)
bool isParameterFixed(std::string const &parameterName) const
void viewChangedTie(std::string const &parameterName, std::string const &tie)
void attributeChanged(std::string const &attributeName)
void setLocalParameterFixed(std::string const &parameterName, int i, bool fixed)
std::string getParameterTie(std::string const &parameterName) const
double getLocalParameterValue(std::string const &parameterName, int i) const
void viewChangedGlobals(const std::vector< std::string > &globalParameters)
void setGlobalParameters(std::vector< std::string > const &globals)
Class FitPropertyBrowser implements QtPropertyBrowser to display and control fitting function paramet...
void setColumnSizes(int s0, int s1, int s2=-1)
Resize the browser's columns.
The interface to a function view.
virtual void setFunction(IFunction_sptr fun)=0
virtual void setParameterError(std::string const &parameterName, double error)=0
void setAttributeValue(std::string const &attributeName, T &value)
virtual IFunction::Attribute getAttribute(std::string const &attrName) const =0
virtual void setParameter(std::string const &parameterName, double value)=0
virtual std::optional< std::string > currentFunctionIndex() const =0
virtual void setGlobalParameters(const std::vector< std::string > &)=0
virtual void setParameterConstraint(std::string const &parameterName, std::string const &constraint)=0
virtual void setParameterTie(std::string const &parameterName, std::string const &tie)=0
virtual double getParameter(std::string const &parameterName) const =0
virtual IFunction_sptr getSelectedFunction()=0
virtual void setErrorsEnabled(bool enabled)=0
virtual void showFunctionHelp(std::string const &) const =0
This is an interface to a fitting function - a semi-abstarct class.
Definition IFunction.h:166
The Logger class is in charge of the publishing messages from the framework through various channels.
Definition Logger.h:51
void error(const std::string &msg)
Logs at error level.
Definition Logger.cpp:108
EXPORT_OPT_MANTIDQT_COMMON IFunction_sptr getFunctionWithPrefix(std::string const &prefix, const IFunction_sptr &fun)
Get a child function of a parent function whose parameters start with a given prefix.
EXPORT_OPT_MANTIDQT_COMMON std::pair< std::string, std::string > splitParameterName(std::string const &parameterName)
Split a qualified parameter name into function index and local parameter name.
Kernel::Logger g_log("ExperimentInfo")
static logger object
std::shared_ptr< IFunction > IFunction_sptr
shared pointer to the function base class
Definition IFunction.h:743
Kernel::Logger g_log("DetermineSpinStateOrder")
STL namespace.
Attribute visitor structure supporting lambda expressions Example usage: AttributeLambdaVisitor{[](co...
Definition IFunction.h:56