diff --git a/Code/Mantid/CurveFitting/inc/MantidCurveFitting/IkedaCarpenterPV.h b/Code/Mantid/CurveFitting/inc/MantidCurveFitting/IkedaCarpenterPV.h index 89510a157b8ff3affe4f5ded120f7fdb0ab934a7..d20f18c837b50d8bfe4cda35ad5e7b20c11f47b3 100644 --- a/Code/Mantid/CurveFitting/inc/MantidCurveFitting/IkedaCarpenterPV.h +++ b/Code/Mantid/CurveFitting/inc/MantidCurveFitting/IkedaCarpenterPV.h @@ -59,6 +59,9 @@ namespace Mantid /// overwrite IFunction base class methods std::string name()const{return "IkedaCarpenterPV";} + //virtual void calJacobianForCovariance(API::Jacobian* out, const double* xValues, const int& nData); + virtual void setActiveParameter(int i,double value); + virtual double activeParameter(int i)const; virtual void function(double* out, const double* xValues, const int& nData); void constFunction(double* out, const double* xValues, const int& nData) const; diff --git a/Code/Mantid/CurveFitting/src/IkedaCarpenterPV.cpp b/Code/Mantid/CurveFitting/src/IkedaCarpenterPV.cpp index 64cd8d3b340d8dc227b8a0a182adb68c3a178680..20fed28cc8d32a5e2bc5c75abbd17c6bdc693b6a 100644 --- a/Code/Mantid/CurveFitting/src/IkedaCarpenterPV.cpp +++ b/Code/Mantid/CurveFitting/src/IkedaCarpenterPV.cpp @@ -10,6 +10,7 @@ #include "MantidAPI/IInstrument.h" #include "MantidDataObjects/Workspace2D.h" #include <cmath> +#include <gsl/gsl_math.h> namespace Mantid @@ -80,11 +81,6 @@ void IkedaCarpenterPV::init() declareParameter("Gamma",1.0); declareParameter("Eta",0.5); // which means initially half gauss half lorentzian declareParameter("X0",0.0); - - //IConstraint* constraint = ConstraintFactory::Instance().createInitialized(this, fitParam.getConstraint()); -//API::IFunction* fun, const std::string paramName, const double lowerBound, const double upperBound - //BoundaryConstraint bc(this, "Eta", 0.0, 1.0); - addConstraint(new BoundaryConstraint(this, "Eta", 0.0, 1.0)); } @@ -299,6 +295,26 @@ void IkedaCarpenterPV::function(double* out, const double* xValues, const int& n } } +void IkedaCarpenterPV::setActiveParameter(int i,double value) +{ + int j = indexOfActive(i); + + if (parameterName(j) == "Eta") + setParameter(j,tanh(value)/2.0+0.5,false); ///sqrt(1./value),false); + else + setParameter(j,value,false); +} + +double IkedaCarpenterPV::activeParameter(int i)const +{ + int j = indexOfActive(i); + + if (parameterName(j) == "Sigma") + return gsl_atanh(2.0*(getParameter(j)-0.5)); //1./pow(getParameter(j),2); + else + return getParameter(j); +} + } // namespace CurveFitting diff --git a/Code/qtiplot/qtiplot/src/Mantid/FitPropertyBrowser.cpp b/Code/qtiplot/qtiplot/src/Mantid/FitPropertyBrowser.cpp index 7593a5de966375e4f0df8753c1957e0763a23e07..64a7eabc67b71677f4b053de50500aae4b3ebc2f 100644 --- a/Code/qtiplot/qtiplot/src/Mantid/FitPropertyBrowser.cpp +++ b/Code/qtiplot/qtiplot/src/Mantid/FitPropertyBrowser.cpp @@ -37,11 +37,11 @@ FitPropertyBrowser::FitPropertyBrowser(QWidget* parent) :QDockWidget("Fit Function",parent),m_currentFunction(0),m_compositeFunction(0),m_defaultFunction("Gaussian"),m_default_width(0), m_guessOutputName(true),m_changeSlotsEnabled(true),m_peakToolOn(false),m_appWindow((ApplicationWindow*)parent) { - setObjectName("FitFunction"); // this is needed for QMainWindow::restoreState() - setMinimumHeight(150); - setMinimumWidth(200); - m_appWindow->addDockWidget( Qt::LeftDockWidgetArea, this ); - + setObjectName("FitFunction"); // this is needed for QMainWindow::restoreState() + setMinimumHeight(150); + setMinimumWidth(200); + m_appWindow->addDockWidget( Qt::LeftDockWidgetArea, this ); + QWidget* w = new QWidget(parent); /* Create property managers: they create, own properties, get and set values */ @@ -139,9 +139,9 @@ m_guessOutputName(true),m_changeSlotsEnabled(true),m_peakToolOn(false),m_appWind setWidget(w); - m_browser->setContextMenuPolicy(Qt::CustomContextMenu); - connect(m_browser, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(popupMenu(const QPoint &))); - connect(m_browser, SIGNAL(currentItemChanged(QtBrowserItem*)), this, SLOT(currentItemChanged(QtBrowserItem*))); + m_browser->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_browser, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(popupMenu(const QPoint &))); + connect(m_browser, SIGNAL(currentItemChanged(QtBrowserItem*)), this, SLOT(currentItemChanged(QtBrowserItem*))); createCompositeFunction(); @@ -168,75 +168,75 @@ void FitPropertyBrowser::popupMenu(const QPoint &) if (isFunctionsGroup) { - action = new QAction("Add function",this); - connect(action,SIGNAL(triggered()),this,SLOT(addFunction())); - menu->addAction(action); - - action = new QAction("Plot",this); - connect(action,SIGNAL(triggered()),this,SLOT(plotGuessAll())); - menu->addAction(action); - + action = new QAction("Add function",this); + connect(action,SIGNAL(triggered()),this,SLOT(addFunction())); + menu->addAction(action); + + action = new QAction("Plot",this); + connect(action,SIGNAL(triggered()),this,SLOT(plotGuessAll())); + menu->addAction(action); + menu->addSeparator(); - - action = new QAction("Save",this); - connect(action,SIGNAL(triggered()),this,SLOT(saveFunction())); - menu->addAction(action); - - action = new QAction("Load",this); - connect(action,SIGNAL(triggered()),this,SLOT(loadFunction())); - menu->addAction(action); - - action = new QAction("Copy",this); - connect(action,SIGNAL(triggered()),this,SLOT(copy())); - menu->addAction(action); - - //action = new QAction("Paste",this); - //connect(action,SIGNAL(triggered()),this,SLOT(paste())); - //menu->addAction(action); - + + action = new QAction("Save",this); + connect(action,SIGNAL(triggered()),this,SLOT(saveFunction())); + menu->addAction(action); + + action = new QAction("Load",this); + connect(action,SIGNAL(triggered()),this,SLOT(loadFunction())); + menu->addAction(action); + + action = new QAction("Copy",this); + connect(action,SIGNAL(triggered()),this,SLOT(copy())); + menu->addAction(action); + + //action = new QAction("Paste",this); + //connect(action,SIGNAL(triggered()),this,SLOT(paste())); + //menu->addAction(action); + menu->addSeparator(); } else if (isFunctionsGroup || isSettingsGroup || isASetting) { if (isFitEnabled()) { - action = new QAction("Fit",this); - connect(action,SIGNAL(triggered()),this,SLOT(fit())); - menu->addAction(action); - } - - if (isUndoEnabled()) - { - action = new QAction("Undo Fit",this); - connect(action,SIGNAL(triggered()),this,SLOT(undoFit())); - menu->addAction(action); - } - - action = new QAction("Clear all",this); - connect(action,SIGNAL(triggered()),this,SLOT(clear())); - menu->addAction(action); - + action = new QAction("Fit",this); + connect(action,SIGNAL(triggered()),this,SLOT(fit())); + menu->addAction(action); + } + + if (isUndoEnabled()) + { + action = new QAction("Undo Fit",this); + connect(action,SIGNAL(triggered()),this,SLOT(undoFit())); + menu->addAction(action); + } + + action = new QAction("Clear all",this); + connect(action,SIGNAL(triggered()),this,SLOT(clear())); + menu->addAction(action); + } else if (isFunction) { if (isCompositeFunction) { - action = new QAction("Add function",this); - connect(action,SIGNAL(triggered()),this,SLOT(addFunction())); - menu->addAction(action); - } - - action = new QAction("Remove",this); - connect(action,SIGNAL(triggered()),this,SLOT(deleteFunction())); - menu->addAction(action); - - if (m_peakToolOn) - { - action = new QAction("Plot",this); - connect(action,SIGNAL(triggered()),this,SLOT(plotGuessCurrent())); - menu->addAction(action); - } - + action = new QAction("Add function",this); + connect(action,SIGNAL(triggered()),this,SLOT(addFunction())); + menu->addAction(action); + } + + action = new QAction("Remove",this); + connect(action,SIGNAL(triggered()),this,SLOT(deleteFunction())); + menu->addAction(action); + + if (m_peakToolOn) + { + action = new QAction("Plot",this); + connect(action,SIGNAL(triggered()),this,SLOT(plotGuessCurrent())); + menu->addAction(action); + } + menu->addSeparator(); } else @@ -252,139 +252,139 @@ void FitPropertyBrowser::popupMenu(const QPoint &) isParameter = false; } - if (isTie) - { - //menu->addSeparator(); - action = new QAction("Remove",this); - connect(action,SIGNAL(triggered()),this,SLOT(deleteTie())); - menu->addAction(action); - } - else if (isLowerBound || isUpperBound) - { - action = new QAction("Remove",this); - connect(action,SIGNAL(triggered()),this,SLOT(removeBounds())); - menu->addAction(action); - } - //else if (isUpperBound) - //{ - // action = new QAction("Remove",this); - // connect(action,SIGNAL(triggered()),this,SLOT(removeUpperBound())); - // menu->addAction(action); - //} - else if (count() > 0 && isParameter) - { - bool noTies = !hasTie(ci->property()); - bool hasLower = false; - bool hasUpper = false; - - QMap<QtProperty*,std::pair<QtProperty*,QtProperty*> >::iterator c = m_constraints.find(ci->property()); - if (c != m_constraints.end()) - { - hasLower = c.value().first != 0; - hasUpper = c.value().second != 0; - } - bool hasBounds = hasLower || hasUpper; - - if (noTies && !hasBounds) - { - action = new QAction("Fix",this); - connect(action,SIGNAL(triggered()),this,SLOT(addFixTie())); - menu->addAction(action); - } - - if (noTies && (!hasLower || !hasUpper)) - { - QMenu *constraintMenu = menu->addMenu("Constraint"); - - if (!hasLower) - { - QMenu* detailMenu = constraintMenu->addMenu("Lower Bound"); - - action = new QAction("10%",this); - connect(action,SIGNAL(triggered()),this,SLOT(addLowerBound10())); - detailMenu->addAction(action); - - action = new QAction("50%",this); - connect(action,SIGNAL(triggered()),this,SLOT(addLowerBound50())); - detailMenu->addAction(action); - - action = new QAction("Custom",this); - connect(action,SIGNAL(triggered()),this,SLOT(addLowerBound())); - detailMenu->addAction(action); - } - - if (!hasUpper) - { - QMenu* detailMenu = constraintMenu->addMenu("Upper Bound"); - - action = new QAction("10%",this); - connect(action,SIGNAL(triggered()),this,SLOT(addUpperBound10())); - detailMenu->addAction(action); - - action = new QAction("50%",this); - connect(action,SIGNAL(triggered()),this,SLOT(addUpperBound50())); - detailMenu->addAction(action); - - action = new QAction("Custom",this); - connect(action,SIGNAL(triggered()),this,SLOT(addUpperBound())); - detailMenu->addAction(action); - } - - if (!hasLower && !hasUpper) - { - QMenu* detailMenu = constraintMenu->addMenu("Both Bounds"); - - action = new QAction("10%",this); - connect(action,SIGNAL(triggered()),this,SLOT(addBothBounds10())); - detailMenu->addAction(action); - - action = new QAction("50%",this); - connect(action,SIGNAL(triggered()),this,SLOT(addBothBounds50())); - detailMenu->addAction(action); - - action = new QAction("Custom",this); - connect(action,SIGNAL(triggered()),this,SLOT(addBothBounds())); - detailMenu->addAction(action); - } - } - - if (hasBounds) - { - action = new QAction("Remove constraints",this); - connect(action,SIGNAL(triggered()),this,SLOT(removeBounds())); - menu->addAction(action); - } - - if (noTies && !hasBounds) - { - if (count() == 1) - { - action = new QAction("Tie",this); - connect(action,SIGNAL(triggered()),this,SLOT(addTie())); - menu->addAction(action); - } - else - { - QMenu* detail = menu->addMenu("Tie"); - - action = new QAction("To function",this); - connect(action,SIGNAL(triggered()),this,SLOT(addTieToFunction())); - detail->addAction(action); - - action = new QAction("Custom Tie",this); - connect(action,SIGNAL(triggered()),this,SLOT(addTie())); - detail->addAction(action); - } - } - else if (!noTies) - { - action = new QAction("Remove tie",this); - connect(action,SIGNAL(triggered()),this,SLOT(deleteTie())); - menu->addAction(action); - } - } - } - + if (isTie) + { + //menu->addSeparator(); + action = new QAction("Remove",this); + connect(action,SIGNAL(triggered()),this,SLOT(deleteTie())); + menu->addAction(action); + } + else if (isLowerBound || isUpperBound) + { + action = new QAction("Remove",this); + connect(action,SIGNAL(triggered()),this,SLOT(removeBounds())); + menu->addAction(action); + } + //else if (isUpperBound) + //{ + // action = new QAction("Remove",this); + // connect(action,SIGNAL(triggered()),this,SLOT(removeUpperBound())); + // menu->addAction(action); + //} + else if (count() > 0 && isParameter) + { + bool noTies = !hasTie(ci->property()); + bool hasLower = false; + bool hasUpper = false; + + QMap<QtProperty*,std::pair<QtProperty*,QtProperty*> >::iterator c = m_constraints.find(ci->property()); + if (c != m_constraints.end()) + { + hasLower = c.value().first != 0; + hasUpper = c.value().second != 0; + } + bool hasBounds = hasLower || hasUpper; + + if (noTies && !hasBounds) + { + action = new QAction("Fix",this); + connect(action,SIGNAL(triggered()),this,SLOT(addFixTie())); + menu->addAction(action); + } + + if (noTies && (!hasLower || !hasUpper)) + { + QMenu *constraintMenu = menu->addMenu("Constraint"); + + if (!hasLower) + { + QMenu* detailMenu = constraintMenu->addMenu("Lower Bound"); + + action = new QAction("10%",this); + connect(action,SIGNAL(triggered()),this,SLOT(addLowerBound10())); + detailMenu->addAction(action); + + action = new QAction("50%",this); + connect(action,SIGNAL(triggered()),this,SLOT(addLowerBound50())); + detailMenu->addAction(action); + + action = new QAction("Custom",this); + connect(action,SIGNAL(triggered()),this,SLOT(addLowerBound())); + detailMenu->addAction(action); + } + + if (!hasUpper) + { + QMenu* detailMenu = constraintMenu->addMenu("Upper Bound"); + + action = new QAction("10%",this); + connect(action,SIGNAL(triggered()),this,SLOT(addUpperBound10())); + detailMenu->addAction(action); + + action = new QAction("50%",this); + connect(action,SIGNAL(triggered()),this,SLOT(addUpperBound50())); + detailMenu->addAction(action); + + action = new QAction("Custom",this); + connect(action,SIGNAL(triggered()),this,SLOT(addUpperBound())); + detailMenu->addAction(action); + } + + if (!hasLower && !hasUpper) + { + QMenu* detailMenu = constraintMenu->addMenu("Both Bounds"); + + action = new QAction("10%",this); + connect(action,SIGNAL(triggered()),this,SLOT(addBothBounds10())); + detailMenu->addAction(action); + + action = new QAction("50%",this); + connect(action,SIGNAL(triggered()),this,SLOT(addBothBounds50())); + detailMenu->addAction(action); + + action = new QAction("Custom",this); + connect(action,SIGNAL(triggered()),this,SLOT(addBothBounds())); + detailMenu->addAction(action); + } + } + + if (hasBounds) + { + action = new QAction("Remove constraints",this); + connect(action,SIGNAL(triggered()),this,SLOT(removeBounds())); + menu->addAction(action); + } + + if (noTies && !hasBounds) + { + if (count() == 1) + { + action = new QAction("Tie",this); + connect(action,SIGNAL(triggered()),this,SLOT(addTie())); + menu->addAction(action); + } + else + { + QMenu* detail = menu->addMenu("Tie"); + + action = new QAction("To function",this); + connect(action,SIGNAL(triggered()),this,SLOT(addTieToFunction())); + detail->addAction(action); + + action = new QAction("Custom Tie",this); + connect(action,SIGNAL(triggered()),this,SLOT(addTie())); + detail->addAction(action); + } + } + else if (!noTies) + { + action = new QAction("Remove tie",this); + connect(action,SIGNAL(triggered()),this,SLOT(deleteTie())); + menu->addAction(action); + } + } + } + menu->popup(QCursor::pos()); } @@ -393,12 +393,12 @@ void FitPropertyBrowser::popupMenu(const QPoint &) * @param fnName A registered function name */ Mantid::API::IFunction* FitPropertyBrowser::addFunction(const std::string& fnName, Mantid::API::CompositeFunction* cfun) -{ - +{ + disableUndo(); - Mantid::API::IFunction* f = 0; - if (fnName.find("=") == std::string::npos) - { + Mantid::API::IFunction* f = 0; + if (fnName.find("=") == std::string::npos) + { f = Mantid::API::FunctionFactory::Instance().createUnwrapped(fnName); f->initialize(); } @@ -412,14 +412,6 @@ Mantid::API::IFunction* FitPropertyBrowser::addFunction(const std::string& fnNam Mantid::API::IPeakFunction* pf = dynamic_cast<Mantid::API::IPeakFunction*>(f); if (pf) { - if (m_default_width != 0.0) - { - pf->setWidth(m_default_width); - } - else - { - m_default_width = pf->width(); - } if (!workspaceName().empty() && workspaceIndex() >= 0) { pf->setCentre( (startX() + endX())/2 ); @@ -429,37 +421,37 @@ Mantid::API::IFunction* FitPropertyBrowser::addFunction(const std::string& fnNam if (f->name() == "LinearBackground" && !workspaceName().empty()) { int wi = workspaceIndex(); - Mantid::API::MatrixWorkspace_sptr ws = boost::dynamic_pointer_cast<Mantid::API::MatrixWorkspace>( - Mantid::API::AnalysisDataService::Instance().retrieve(workspaceName()) ); + Mantid::API::MatrixWorkspace_sptr ws = boost::dynamic_pointer_cast<Mantid::API::MatrixWorkspace>( + Mantid::API::AnalysisDataService::Instance().retrieve(workspaceName()) ); if (ws && wi >= 0 && wi < ws->getNumberHistograms()) - { - const Mantid::MantidVec& X = ws->readX(wi); - double istart = 0, iend = 0; - for(int i=0;i<X.size()-1;++i) - { - double x = X[i]; - if (x < startX()) - { - istart = i; - } - if (x > endX()) - { - iend = i; - if (iend > 0) iend--; - break; - } - } - if (iend > istart) - { - const Mantid::MantidVec& Y = ws->readY(wi); - double p0 = Y[istart]; - double p1 = Y[iend]; - double A1 = (p1-p0)/(X[iend]-X[istart]); - double A0 = p0 - A1*X[istart]; - f->setParameter("A0",A0); - f->setParameter("A1",A1); - } - } + { + const Mantid::MantidVec& X = ws->readX(wi); + double istart = 0, iend = 0; + for(int i=0;i<X.size()-1;++i) + { + double x = X[i]; + if (x < startX()) + { + istart = i; + } + if (x > endX()) + { + iend = i; + if (iend > 0) iend--; + break; + } + } + if (iend > istart) + { + const Mantid::MantidVec& Y = ws->readY(wi); + double p0 = Y[istart]; + double p1 = Y[iend]; + double A1 = (p1-p0)/(X[iend]-X[istart]); + double A0 = p0 - A1*X[istart]; + f->setParameter("A0",A0); + f->setParameter("A1",A1); + } + } } setWorkspace(f); @@ -525,7 +517,7 @@ void FitPropertyBrowser::addFunctionToBrowser(Mantid::API::IFunction* f,Mantid:: void FitPropertyBrowser::replaceFunction(Mantid::API::IFunction* f_old,const std::string& fnName) { disableUndo(); - Mantid::API::IFunction* f = Mantid::API::FunctionFactory::Instance().createUnwrapped(fnName); + Mantid::API::IFunction* f = Mantid::API::FunctionFactory::Instance().createUnwrapped(fnName); f->initialize(); setWorkspace(f); replaceFunction(f_old,f); @@ -1036,7 +1028,7 @@ void FitPropertyBrowser::populateFunctionNames() //{ QString qfnName = QString::fromStdString(fnName); m_registeredFunctions << qfnName; - boost::shared_ptr<Mantid::API::IFunction> f = Mantid::API::FunctionFactory::Instance().create(fnName); + boost::shared_ptr<Mantid::API::IFunction> f = Mantid::API::FunctionFactory::Instance().create(fnName); f->initialize(); Mantid::API::IPeakFunction* pf = dynamic_cast<Mantid::API::IPeakFunction*>(f.get()); Mantid::API::CompositeFunction* cf = dynamic_cast<Mantid::API::CompositeFunction*>(f.get()); @@ -1193,15 +1185,15 @@ void FitPropertyBrowser::populateWorkspaceNames() void FitPropertyBrowser::workspace_added(const QString &wsName, Mantid::API::Workspace_sptr ws) { if ( !isWorkspaceValid(ws) ) return; - QString oldName = QString::fromStdString(workspaceName()); - int i = m_workspaceNames.indexOf(wsName); + QString oldName = QString::fromStdString(workspaceName()); + int i = m_workspaceNames.indexOf(wsName); if (i < 0) { m_workspaceNames.append(wsName); m_workspaceNames.sort(); } m_enumManager->setEnumNames(m_workspace, m_workspaceNames); - i = m_workspaceNames.indexOf(oldName); + i = m_workspaceNames.indexOf(oldName); if (i >= 0) { m_enumManager->setValue(m_workspace,i); @@ -1210,14 +1202,14 @@ void FitPropertyBrowser::workspace_added(const QString &wsName, Mantid::API::Wor void FitPropertyBrowser::workspace_removed(const QString &wsName) { - QString oldName = QString::fromStdString(workspaceName()); - int i = m_workspaceNames.indexOf(wsName); + QString oldName = QString::fromStdString(workspaceName()); + int i = m_workspaceNames.indexOf(wsName); if (i >= 0) { m_workspaceNames.removeAt(i); } m_enumManager->setEnumNames(m_workspace, m_workspaceNames); - i = m_workspaceNames.indexOf(oldName); + i = m_workspaceNames.indexOf(oldName); if (i >= 0) { m_enumManager->setValue(m_workspace,i); @@ -1225,19 +1217,19 @@ void FitPropertyBrowser::workspace_removed(const QString &wsName) } void FitPropertyBrowser::init() -{ - populateFunctionNames(); - populateWorkspaceNames(); +{ + populateFunctionNames(); + populateWorkspaceNames(); connect(m_appWindow->mantidUI,SIGNAL(workspace_replaced(const QString &, Mantid::API::Workspace_sptr)), this,SLOT(workspace_added(const QString &, Mantid::API::Workspace_sptr))); connect(m_appWindow->mantidUI,SIGNAL(workspace_removed(const QString &)), this,SLOT(workspace_removed(const QString &))); -} - +} + void FitPropertyBrowser::reinit() -{ -} - +{ +} + /** Check if the workspace can be used in the fit * @param ws The workspace */ @@ -1402,75 +1394,75 @@ void FitPropertyBrowser::clearBrowser() m_ties.clear(); } -/// Set the parameters to the fit outcome -void FitPropertyBrowser::getFitResults() -{ - std::string wsName = outputName() + "_Parameters"; - Mantid::API::ITableWorkspace_sptr ws = boost::dynamic_pointer_cast<Mantid::API::ITableWorkspace>( - Mantid::API::AnalysisDataService::Instance().retrieve(wsName) ); - - if (ws) - { - try - { - Mantid::API::TableRow row = ws->getFirstRow(); - do - { - std::string name; - double value; - row >> name >> value; - // In case of a single function Fit doesn't create a CompositeFunction - if (count() == 1) - { - name.insert(0,"f0."); - } - compositeFunction()->setParameter(name,value); - } - while(row.next()); - updateParameters(); - } - catch(...) - { - // do nothing - } - } -} - -/** - * Slot. Undoes the fit: restores the parameters to their initial values. - */ -void FitPropertyBrowser::undoFit() -{ - if (m_initialParameters.size() == compositeFunction()->nParams()) - { +/// Set the parameters to the fit outcome +void FitPropertyBrowser::getFitResults() +{ + std::string wsName = outputName() + "_Parameters"; + Mantid::API::ITableWorkspace_sptr ws = boost::dynamic_pointer_cast<Mantid::API::ITableWorkspace>( + Mantid::API::AnalysisDataService::Instance().retrieve(wsName) ); + + if (ws) + { + try + { + Mantid::API::TableRow row = ws->getFirstRow(); + do + { + std::string name; + double value; + row >> name >> value; + // In case of a single function Fit doesn't create a CompositeFunction + if (count() == 1) + { + name.insert(0,"f0."); + } + compositeFunction()->setParameter(name,value); + } + while(row.next()); + updateParameters(); + } + catch(...) + { + // do nothing + } + } +} + +/** + * Slot. Undoes the fit: restores the parameters to their initial values. + */ +void FitPropertyBrowser::undoFit() +{ + if (m_initialParameters.size() == compositeFunction()->nParams()) + { for(int i=0;i<compositeFunction()->nParams();i++) { compositeFunction()->setParameter(i,m_initialParameters[i]); } updateParameters(); - } + } disableUndo(); -} - -/// disable undo when the function changes -void FitPropertyBrowser::disableUndo() -{ - m_initialParameters.clear(); - m_btnUnFit->setEnabled(false); -} - +} + +/// disable undo when the function changes +void FitPropertyBrowser::disableUndo() +{ + m_initialParameters.clear(); + m_btnUnFit->setEnabled(false); +} + /// Tells if undo can be done bool FitPropertyBrowser::isUndoEnabled()const { return m_initialParameters.size() && compositeFunction()->nParams() == m_initialParameters.size(); } -/// Enable/disable the Fit button; -void FitPropertyBrowser::setFitEnabled(bool yes) -{ - m_btnFit->setEnabled(yes); -} - +/// Enable/disable the Fit button; +void FitPropertyBrowser::setFitEnabled(bool yes) +{ + m_btnFit->setEnabled(yes); +} + /// Returns true if the function is ready for a fit bool FitPropertyBrowser::isFitEnabled()const {