diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/ConvFunctionModel.cpp b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/ConvFunctionModel.cpp index 01fd001365d8cb9dbc12466eb1a60436c6a4bc67..e0aed29ffd52670ffdcf02d6cba0a0d6c5e7ec53 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/ConvFunctionModel.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/ConvFunctionModel.cpp @@ -10,6 +10,7 @@ #include "MantidAPI/ITableWorkspace.h" #include "MantidAPI/MultiDomainFunction.h" #include "MantidQtWidgets/Common/FunctionBrowser/FunctionBrowserUtils.h" +#include <iostream> namespace MantidQt { namespace CustomInterfaces { @@ -39,7 +40,7 @@ void ConvFunctionModel::setFunction(IFunction_sptr fun) { clearData(); if (!fun) return; - + std::cout << fun->asString() << std::endl; bool isBackgroundSet = false; if (fun->name() == "Convolution") { checkConvolution(fun); @@ -78,7 +79,15 @@ void ConvFunctionModel::checkConvolution(IFunction_sptr fun) { throw std::runtime_error("Function has wrong structure."); } isResolutionSet = true; - } else if (name == "CompositeFunction") { + } else if (name == "ProductFunction") { + if (innerFunction->getFunction(0)->name() != "UserFunction") { + throw std::runtime_error("Function has wrong structure."); + } + m_hasTempCorrection = true; + checkConvolution(innerFunction->getFunction(1)); + } + + else if (name == "CompositeFunction") { checkComposite(innerFunction); } else if (FitTypeStringToEnum.count(name) == 1) { if (isFitTypeSet) { @@ -128,6 +137,8 @@ void ConvFunctionModel::checkComposite(IFunction_sptr fun) { } } +// void ConvFunctionModel::checkProductFunction(IFunction_sptr fun) {} + IFunction_sptr ConvFunctionModel::getFitFunction() const { return m_model.getFitFunction(); } diff --git a/qt/scientific_interfaces/Indirect/test/ConvFunctionModelTest.h b/qt/scientific_interfaces/Indirect/test/ConvFunctionModelTest.h index f1902fe0041ac82493ff3723e35480c6f05892cf..a3cd1b4b50db38b071fa2db72a64ad38b9818cc4 100644 --- a/qt/scientific_interfaces/Indirect/test/ConvFunctionModelTest.h +++ b/qt/scientific_interfaces/Indirect/test/ConvFunctionModelTest.h @@ -114,6 +114,17 @@ public: TS_ASSERT_THROWS(m_model->setFunction(fun), std::runtime_error &) } + void test_setFunction_does_not_throw_for_valid_temp_function() { + m_model->setFitType(FitType::OneLorentzian); + m_model->setTempCorrection(true); + auto func = m_model->getFitFunction()->clone()->clone(); + + m_model->setFunction(func); + + TS_ASSERT_EQUALS(m_model->getCurrentFunction()->asString(), + func->asString()) + } + private: std::unique_ptr<MantidQt::CustomInterfaces::IDA::ConvFunctionModel> m_model; }; diff --git a/qt/widgets/common/src/ConvolutionFunctionModel.cpp b/qt/widgets/common/src/ConvolutionFunctionModel.cpp index 19d126d1fd8ab2221a523be6c68229be5dad5b81..af3b3e23a1617a6d945a85bdfeea391264f9d61f 100644 --- a/qt/widgets/common/src/ConvolutionFunctionModel.cpp +++ b/qt/widgets/common/src/ConvolutionFunctionModel.cpp @@ -11,6 +11,7 @@ #include "MantidAPI/MultiDomainFunction.h" #include "MantidKernel/Logger.h" #include "MantidQtWidgets/Common/FunctionBrowser/FunctionBrowserUtils.h" +#include <iostream> namespace { Mantid::Kernel::Logger g_log("ConvolutionFunctionModel"); @@ -74,10 +75,8 @@ void ConvolutionFunctionModel::setModel( const std::string &peaks, bool hasDeltaFunction, const std::vector<double> &qValues, const bool isQDependent, bool hasTempCorrection) { - std::string resolution, convolution, function, modifiedPeaks; auto fitFunction = boost::make_shared<MultiDomainFunction>(); - auto const nf = m_numberDomains > 0 ? static_cast<int>(m_numberDomains) : 1; for (int i = 0; i < nf; ++i) { CompositeFunction_sptr domainFunction; @@ -86,11 +85,14 @@ void ConvolutionFunctionModel::setModel( qValue, hasTempCorrection); auto workspace = resolutionWorkspaces.empty() ? "" : resolutionWorkspaces[i].first; + auto workspaceIndex = + resolutionWorkspaces.empty() ? 0 : resolutionWorkspaces[i].second; auto resolutionFunction = - createResolutionFunction(workspace, resolutionWorkspaces[i].second); + createResolutionFunction(workspace, workspaceIndex); domainFunction = createConvolutionFunction(resolutionFunction, domainFunction); domainFunction = addBackground(domainFunction, background); + fitFunction->addFunction(domainFunction); fitFunction->setDomainIndex(i, i); } @@ -138,7 +140,7 @@ CompositeFunction_sptr ConvolutionFunctionModel::createInnerFunction( FunctionFactory::Instance().createFunction("DeltaFunction"); innerFunction->addFunction(deltaFunction); } - if (hasTempCorrection && (functionSpecified || hasDeltaFunction)) { + if (hasTempCorrection) { innerFunction = addTempCorrection(innerFunction); } diff --git a/qt/widgets/common/test/ConvolutionFunctionModelTest.h b/qt/widgets/common/test/ConvolutionFunctionModelTest.h index 8c2fa79659d47351ec61aa63e9819601b07c313a..7215b019ff310127f6559751b4c9d0f3a609937b 100644 --- a/qt/widgets/common/test/ConvolutionFunctionModelTest.h +++ b/qt/widgets/common/test/ConvolutionFunctionModelTest.h @@ -403,17 +403,17 @@ public: "ProductFunction,NumDeriv=false;name=UserFunction,Formula=(x*11.606/" "Temp)/(1-exp( " "-(x*11.606/" - "Temp))),Temp=0;(name=Lorentzian,Amplitude=1,PeakCentre=0,FWHM=0;name=" - "Lorentzian,Amplitude=1,PeakCentre=0,FWHM=0;name=DeltaFunction,Height=" - "1,Centre=0))));(composite=CompositeFunction,NumDeriv=false,$domains=i;" - "name=FlatBackground,A0=0;(composite=Convolution,FixResolution=true," - "NumDeriv=true;name=Resolution,Workspace=abc,WorkspaceIndex=2,X=(),Y=()" - ";(composite=ProductFunction,NumDeriv=false;name=UserFunction,Formula=(" - "x*11.606/Temp)/(1-exp( " + "Temp))),Temp=100;(name=Lorentzian,Amplitude=1,PeakCentre=0,FWHM=0;" + "name=Lorentzian,Amplitude=1,PeakCentre=0,FWHM=0;name=DeltaFunction," + "Height=1,Centre=0))));(composite=CompositeFunction,NumDeriv=false,$" + "domains=i;name=FlatBackground,A0=0;(composite=Convolution," + "FixResolution=true,NumDeriv=true;name=Resolution,Workspace=abc," + "WorkspaceIndex=2,X=(),Y=();(composite=ProductFunction,NumDeriv=false;" + "name=UserFunction,Formula=(x*11.606/Temp)/(1-exp( " "-(x*11.606/" - "Temp))),Temp=0;(name=Lorentzian,Amplitude=1,PeakCentre=0,FWHM=0;name=" - "Lorentzian,Amplitude=1,PeakCentre=0,FWHM=0;name=DeltaFunction,Height=" - "1,Centre=0))))"); + "Temp))),Temp=100;(name=Lorentzian,Amplitude=1,PeakCentre=0,FWHM=0;" + "name=Lorentzian,Amplitude=1,PeakCentre=0,FWHM=0;name=DeltaFunction," + "Height=1,Centre=0))))"); } void test_component_prefixes_set_correctly_without_temp_correction() { @@ -475,6 +475,29 @@ public: TS_ASSERT_EQUALS(model.tempFunctionPrefix().value().toStdString(), "f1.f1.f0."); } + + void test_component_prefixes_if_only_temp_set() { + auto algo = FrameworkManager::Instance().createAlgorithm("CreateWorkspace"); + algo->initialize(); + algo->setPropertyValue("DataX", "1,2,3"); + algo->setPropertyValue("DataY", "1,2,3"); + algo->setPropertyValue("OutputWorkspace", "abc"); + algo->execute(); + ConvolutionFunctionModel model; + model.setNumberDomains(2); + auto pair1 = std::make_pair<std::string, int>("abc", 1); + auto pair2 = std::make_pair<std::string, int>("abc", 2); + auto fitResolutions = std::vector<std::pair<std::string, int>>(); + fitResolutions.emplace_back(pair1); + fitResolutions.emplace_back(pair2); + + model.setModel("", fitResolutions, "", false, std::vector<double>(), false, + true); + auto fitFunctionAsString = model.getFitFunction()->asString(); + TS_ASSERT_EQUALS(model.convolutionPrefix().value().toStdString(), ""); + TS_ASSERT_EQUALS(model.tempFunctionPrefix().value().toStdString(), + "f1.f0."); + } }; #endif // MANTIDWIDGETS_CONVOLUTIONFUNCTIONMODELTEST_H_