diff --git a/Framework/CurveFitting/inc/MantidCurveFitting/Algorithms/QENSFitSequential.h b/Framework/CurveFitting/inc/MantidCurveFitting/Algorithms/QENSFitSequential.h index 6feb6c897f029b309402514f69af60ac5e2c36f7..9b14cb0459158bfbf081e251696f4a22952d131a 100644 --- a/Framework/CurveFitting/inc/MantidCurveFitting/Algorithms/QENSFitSequential.h +++ b/Framework/CurveFitting/inc/MantidCurveFitting/Algorithms/QENSFitSequential.h @@ -45,6 +45,7 @@ private: API::ITableWorkspace_sptr performFit(const std::string &input, const std::string &output); void deleteTemporaryWorkspaces(const std::string &outputBaseName); + void addAdditionalLogs(API::WorkspaceGroup_sptr resultWorkspace); void addAdditionalLogs(API::Workspace_sptr result); virtual bool throwIfElasticQConversionFails() const; @@ -75,10 +76,14 @@ private: std::vector<std::string> const &spectra, std::string const &outputBaseName, std::string const &endOfSuffix); - void copyLogs(API::WorkspaceGroup_sptr resultWorkspace, - const std::vector<API::MatrixWorkspace_sptr> &workspaces); + void copyLogs(API::WorkspaceGroup_sptr resultWorkspaces, + std::vector<API::MatrixWorkspace_sptr> const &workspaces); + void copyLogs(API::Workspace_sptr resultWorkspace, + std::vector<API::MatrixWorkspace_sptr> const &workspaces); void copyLogs(API::MatrixWorkspace_sptr resultWorkspace, API::WorkspaceGroup_sptr resultGroup); + void copyLogs(API::MatrixWorkspace_sptr resultWorkspace, + API::Workspace_sptr resultGroup); void extractMembers(API::WorkspaceGroup_sptr resultGroupWs, const std::vector<API::MatrixWorkspace_sptr> &workspaces, const std::string &outputWsName); diff --git a/Framework/CurveFitting/src/Algorithms/PlotPeakByLogValue.cpp b/Framework/CurveFitting/src/Algorithms/PlotPeakByLogValue.cpp index 7ae364b380dcbac91d31a2ab8455841b5767c400..a45856b9eb0834ed88c2a76e380dd048b0987b79 100644 --- a/Framework/CurveFitting/src/Algorithms/PlotPeakByLogValue.cpp +++ b/Framework/CurveFitting/src/Algorithms/PlotPeakByLogValue.cpp @@ -220,9 +220,9 @@ void PlotPeakByLogValue::exec() { setProperty("OutputWorkspace", result); - std::vector<std::string> covariance_workspaces; - std::vector<std::string> fit_workspaces; - std::vector<std::string> parameter_workspaces; + std::vector<MatrixWorkspace_sptr> fitWorkspaces; + std::vector<ITableWorkspace_sptr> parameterWorkspaces; + std::vector<ITableWorkspace_sptr> covarianceWorkspaces; double dProg = 1. / static_cast<double>(wsNames.size()); double Prog = 0.; @@ -250,9 +250,9 @@ void PlotPeakByLogValue::exec() { } if (createFitOutput) { - covariance_workspaces.reserve(covariance_workspaces.size() + jend); - fit_workspaces.reserve(fit_workspaces.size() + jend); - parameter_workspaces.reserve(parameter_workspaces.size() + jend); + covarianceWorkspaces.reserve(covarianceWorkspaces.size() + jend); + fitWorkspaces.reserve(fitWorkspaces.size() + jend); + parameterWorkspaces.reserve(parameterWorkspaces.size() + jend); } dProg /= abs(jend - j); @@ -305,8 +305,7 @@ void PlotPeakByLogValue::exec() { bool ignoreInvalidData = getProperty("IgnoreInvalidData"); // Fit the function - API::IAlgorithm_sptr fit = - AlgorithmManager::Instance().createUnmanaged("Fit"); + auto fit = this->createChildAlgorithm("Fit"); fit->initialize(); fit->setPropertyValue("EvaluationType", getPropertyValue("EvaluationType")); @@ -341,15 +340,18 @@ void PlotPeakByLogValue::exec() { chi2 = fit->getProperty("OutputChi2overDoF"); if (createFitOutput) { - covariance_workspaces.push_back(wsBaseName + - "_NormalisedCovarianceMatrix"); - parameter_workspaces.push_back(wsBaseName + "_Parameters"); - fit_workspaces.push_back(wsBaseName + "_Workspace"); + MatrixWorkspace_sptr outputFitWorkspace = + fit->getProperty("OutputWorkspace"); + ITableWorkspace_sptr outputParamWorkspace = + fit->getProperty("OutputParameters"); + ITableWorkspace_sptr outputCovarianceWorkspace = + fit->getProperty("OutputNormalisedCovarianceMatrix"); + fitWorkspaces.emplace_back(outputFitWorkspace); + parameterWorkspaces.emplace_back(outputParamWorkspace); + covarianceWorkspaces.emplace_back(outputCovarianceWorkspace); } - g_log.debug() << "Fit result " << fit->getPropertyValue("OutputStatus") << ' ' << chi2 << '\n'; - } catch (...) { g_log.error("Error in Fit ChildAlgorithm"); throw; @@ -378,37 +380,33 @@ void PlotPeakByLogValue::exec() { ifun->setParameter(i, initialParams[i]); } } - } // for(;j < jend;++j) } if (createFitOutput) { // collect output of fit for each spectrum into workspace groups - API::IAlgorithm_sptr groupAlg = - AlgorithmManager::Instance().createUnmanaged("GroupWorkspaces"); - groupAlg->initialize(); - groupAlg->setProperty("InputWorkspaces", covariance_workspaces); - groupAlg->setProperty("OutputWorkspace", - m_baseName + "_NormalisedCovarianceMatrices"); - groupAlg->execute(); - - groupAlg = AlgorithmManager::Instance().createUnmanaged("GroupWorkspaces"); - groupAlg->initialize(); - groupAlg->setProperty("InputWorkspaces", parameter_workspaces); - groupAlg->setProperty("OutputWorkspace", m_baseName + "_Parameters"); - groupAlg->execute(); - - groupAlg = AlgorithmManager::Instance().createUnmanaged("GroupWorkspaces"); - groupAlg->initialize(); - groupAlg->setProperty("InputWorkspaces", fit_workspaces); - groupAlg->setProperty("OutputWorkspace", m_baseName + "_Workspaces"); - groupAlg->execute(); + WorkspaceGroup_sptr covarianceGroup = boost::make_shared<WorkspaceGroup>(); + for (auto const &workspace : covarianceWorkspaces) + covarianceGroup->addWorkspace(workspace); + AnalysisDataService::Instance().addOrReplace( + m_baseName + "_NormalisedCovarianceMatrices", covarianceGroup); + + WorkspaceGroup_sptr parameterGroup = boost::make_shared<WorkspaceGroup>(); + for (auto const &workspace : parameterWorkspaces) + parameterGroup->addWorkspace(workspace); + AnalysisDataService::Instance().addOrReplace(m_baseName + "_Parameters", + parameterGroup); + + WorkspaceGroup_sptr fitGroup = boost::make_shared<WorkspaceGroup>(); + for (auto const &workspace : fitWorkspaces) + fitGroup->addWorkspace(workspace); + AnalysisDataService::Instance().addOrReplace(m_baseName + "_Workspaces", + fitGroup); } for (auto &minimizerWorkspace : m_minimizerWorkspaces) { const std::string paramName = minimizerWorkspace.first; - API::IAlgorithm_sptr groupAlg = - AlgorithmManager::Instance().createUnmanaged("GroupWorkspaces"); + auto groupAlg = this->createChildAlgorithm("GroupWorkspaces"); groupAlg->initialize(); groupAlg->setProperty("InputWorkspaces", minimizerWorkspace.second); groupAlg->setProperty("OutputWorkspace", m_baseName + "_" + paramName); diff --git a/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp b/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp index 73bc15b98fe2be28bf1163bf05b07d5c0f5aa486..90165ffd3af82be1294b61294b1f32e7c5caf0af 100644 --- a/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp +++ b/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp @@ -563,6 +563,11 @@ QENSFitSequential::getAdditionalLogNumbers() const { return logs; } +void QENSFitSequential::addAdditionalLogs(WorkspaceGroup_sptr resultWorkspace) { + for (const auto &workspace : *resultWorkspace) + addAdditionalLogs(workspace); +} + void QENSFitSequential::addAdditionalLogs(Workspace_sptr resultWorkspace) { auto logAdder = createChildAlgorithm("AddSampleLog", -1.0, -1.0, false); logAdder->setProperty("Workspace", resultWorkspace); @@ -759,12 +764,19 @@ void QENSFitSequential::extractMembers( } void QENSFitSequential::copyLogs( - WorkspaceGroup_sptr resultWorkspace, - const std::vector<MatrixWorkspace_sptr> &workspaces) { + WorkspaceGroup_sptr resultWorkspaces, + std::vector<MatrixWorkspace_sptr> const &workspaces) { + for (auto const &resultWorkspace : *resultWorkspaces) + copyLogs(resultWorkspace, workspaces); +} + +void QENSFitSequential::copyLogs( + Workspace_sptr resultWorkspace, + std::vector<MatrixWorkspace_sptr> const &workspaces) { auto logCopier = createChildAlgorithm("CopyLogs", -1.0, -1.0, false); logCopier->setProperty("OutputWorkspace", resultWorkspace->getName()); - for (const auto &workspace : workspaces) { + for (auto const &workspace : workspaces) { logCopier->setProperty("InputWorkspace", workspace); logCopier->executeAsChildAlg(); } @@ -772,6 +784,12 @@ void QENSFitSequential::copyLogs( void QENSFitSequential::copyLogs(MatrixWorkspace_sptr resultWorkspace, WorkspaceGroup_sptr resultGroup) { + for (auto const &workspace : *resultGroup) + copyLogs(resultWorkspace, workspace); +} + +void QENSFitSequential::copyLogs(MatrixWorkspace_sptr resultWorkspace, + Workspace_sptr resultGroup) { auto logCopier = createChildAlgorithm("CopyLogs", -1.0, -1.0, false); logCopier->setProperty("InputWorkspace", resultWorkspace); logCopier->setProperty("OutputWorkspace", resultGroup->getName()); diff --git a/Framework/CurveFitting/test/Algorithms/PlotPeakByLogValueTest.h b/Framework/CurveFitting/test/Algorithms/PlotPeakByLogValueTest.h index 87afe3c32e1d582f8c6708b44aac9880bd6ff9d6..2cf1a3d7415a0b03d087244c67dcba4aa19d3602 100644 --- a/Framework/CurveFitting/test/Algorithms/PlotPeakByLogValueTest.h +++ b/Framework/CurveFitting/test/Algorithms/PlotPeakByLogValueTest.h @@ -539,34 +539,20 @@ public: TS_ASSERT(fits); if (fits->size() > 0) { - // Get the Fit algorithm history auto fit = fits->getItem(0); - const auto &wsHistory = fit->getHistory(); - const auto &child = wsHistory.getAlgorithmHistory(0); - TS_ASSERT_EQUALS(child->name(), "Fit"); - const auto &properties = child->getProperties(); - - // Check max iterations property - PropertyNameIs maxIterationsCheck("MaxIterations"); - auto prop = std::find_if(properties.begin(), properties.end(), - maxIterationsCheck); - TS_ASSERT_EQUALS((*prop)->value(), "50"); - - // Check minimizer property - PropertyNameIs minimizerCheck("Minimizer"); - prop = std::find_if(properties.begin(), properties.end(), minimizerCheck); - TS_ASSERT_EQUALS((*prop)->value(), - "Levenberg-Marquardt,AbsError=0.01,RelError=1"); + TS_ASSERT_EQUALS(fit->history().size(), 0); + TS_ASSERT_EQUALS(fit->getName(), "PlotPeakResult_Workspaces_1"); } AnalysisDataService::Instance().clear(); } - void test_histogram_fit() { + void test_parameters_are_correct_for_a_histogram_fit() { createHistogramWorkspace("InputWS", 10, -10.0, 10.0); PlotPeakByLogValue alg; alg.initialize(); + alg.setAlwaysStoreInADS(false); alg.setProperty("EvaluationType", "Histogram"); alg.setPropertyValue("Input", "InputWS,v1:3"); alg.setPropertyValue("OutputWorkspace", "out"); @@ -574,23 +560,10 @@ public: alg.setPropertyValue("Function", "name=FlatBackground,A0=2"); alg.execute(); - { - auto params = AnalysisDataService::Instance().retrieveWS<ITableWorkspace>( - "InputWS_0_Parameters"); - TS_ASSERT_DELTA(params->Double(0, 1), 1.0, 1e-15); - } - - { - auto params = AnalysisDataService::Instance().retrieveWS<ITableWorkspace>( - "InputWS_1_Parameters"); - TS_ASSERT_DELTA(params->Double(0, 1), 1.1, 1e-15); - } - - { - auto params = AnalysisDataService::Instance().retrieveWS<ITableWorkspace>( - "InputWS_2_Parameters"); - TS_ASSERT_DELTA(params->Double(0, 1), 0.6, 1e-15); - } + ITableWorkspace_sptr params = alg.getProperty("OutputWorkspace"); + TS_ASSERT_DELTA(params->Double(0, 1), 1.0, 1e-15); + TS_ASSERT_DELTA(params->Double(1, 1), 1.1, 1e-15); + TS_ASSERT_DELTA(params->Double(2, 1), 0.6, 1e-15); AnalysisDataService::Instance().clear(); } diff --git a/Framework/PythonInterface/test/python/plugins/algorithms/WorkflowAlgorithms/EnergyWindowScanTest.py b/Framework/PythonInterface/test/python/plugins/algorithms/WorkflowAlgorithms/EnergyWindowScanTest.py index 5bcf829c098f6fcea4ab149d79880410d291dafb..469f00cdfb2892b9fca96552dce51b169dd2f5bd 100644 --- a/Framework/PythonInterface/test/python/plugins/algorithms/WorkflowAlgorithms/EnergyWindowScanTest.py +++ b/Framework/PythonInterface/test/python/plugins/algorithms/WorkflowAlgorithms/EnergyWindowScanTest.py @@ -26,15 +26,17 @@ class EnergyWindowScanTest(unittest.TestCase): InelasticRange='0, 1.5', GroupingMethod='All') self.assertEqual(round(mtd['Scan_el_eq1'].readY(0)[0], 7), 0) - self.assertEqual(round(mtd['Scan_inel_eq2'].readY(0)[0], 7), -6.8454638) + self.assertEqual( + round( + mtd['Scan_inel_eq2'].readY(0)[0], 7), -6.8454638) def test_MSDFit(self): EnergyWindowScan(InputFiles="IRS26176.RAW", Instrument='IRIS', Analyser='graphite', Reflection='002', SpectraRange='3, 50', ElasticRange='-0.5, 0', InelasticRange='0, 0.5', GroupingMethod='Individual', MSDFit=True) - scan_ws = mtd['Scan_el_eq1_Gauss_0_Workspace'] - self.assertEqual(round(scan_ws.readY(0)[0], 7), 0.0844171) - self.assertEqual(round(scan_ws.readY(0)[1], 7), 0.0963181) + scan_ws = mtd['Scan_msd_fit'] + self.assertEqual(round(scan_ws[0].readY(0)[0], 7), 0.0844171) + self.assertEqual(round(scan_ws[0].readY(0)[1], 7), 0.0963181) if __name__ == '__main__': diff --git a/qt/scientific_interfaces/Indirect/ConvFitModel.cpp b/qt/scientific_interfaces/Indirect/ConvFitModel.cpp index 3cbdc9996f5d07df3e26617d2496580d3af9ce4c..0b73a54635633b0efb74c652aadde16dd3415281 100644 --- a/qt/scientific_interfaces/Indirect/ConvFitModel.cpp +++ b/qt/scientific_interfaces/Indirect/ConvFitModel.cpp @@ -19,6 +19,11 @@ using namespace Mantid::API; namespace { +MatrixWorkspace_sptr getADSMatrixWorkspace(std::string const &workspaceName) { + return AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>( + workspaceName); +} + boost::optional<std::size_t> getFirstInCategory(CompositeFunction_const_sptr composite, const std::string &category) { @@ -110,13 +115,11 @@ CompositeFunction_sptr addTemperatureCorrection(IFunction_sptr model, return applyTemperatureCorrection(model, correction, value); } -IAlgorithm_sptr loadParameterFileAlgorithm(MatrixWorkspace_sptr workspace, - const std::string &filename) { - IAlgorithm_sptr loadParamFile = - AlgorithmManager::Instance().create("LoadParameterFile"); - loadParamFile->setChild(true); +IAlgorithm_sptr loadParameterFileAlgorithm(std::string const &workspaceName, + std::string const &filename) { + auto loadParamFile = AlgorithmManager::Instance().create("LoadParameterFile"); loadParamFile->initialize(); - loadParamFile->setProperty("Workspace", workspace); + loadParamFile->setProperty("Workspace", workspaceName); loadParamFile->setProperty("Filename", filename); return loadParamFile; } @@ -130,8 +133,8 @@ void readAnalyserFromFile(const std::string &analyser, auto const parameterFile = idfDirectory + instrument->getName() + "_" + analyser + "_" + reflection + "_Parameters.xml"; - IAlgorithm_sptr loadParamFile = - loadParameterFileAlgorithm(workspace, parameterFile); + auto loadParamFile = + loadParameterFileAlgorithm(workspace->getName(), parameterFile); loadParamFile->execute(); if (!loadParamFile->isExecuted()) @@ -170,37 +173,50 @@ boost::optional<double> instrumentResolution(MatrixWorkspace_sptr workspace) { } } -MatrixWorkspace_sptr cloneWorkspace(MatrixWorkspace_sptr inputWS) { - IAlgorithm_sptr cloneAlg = - AlgorithmManager::Instance().create("CloneWorkspace"); +MatrixWorkspace_sptr cloneWorkspace(MatrixWorkspace_sptr inputWS, + std::string const &outputName) { + auto cloneAlg = AlgorithmManager::Instance().create("CloneWorkspace"); cloneAlg->setLogging(false); - cloneAlg->setChild(true); cloneAlg->initialize(); cloneAlg->setProperty("InputWorkspace", inputWS); - cloneAlg->setProperty("OutputWorkspace", "__cloned"); + cloneAlg->setProperty("OutputWorkspace", outputName); cloneAlg->execute(); - Workspace_sptr workspace = cloneAlg->getProperty("OutputWorkspace"); - return boost::dynamic_pointer_cast<MatrixWorkspace>(workspace); + return getADSMatrixWorkspace(outputName); } MatrixWorkspace_sptr appendWorkspace(MatrixWorkspace_sptr leftWS, MatrixWorkspace_sptr rightWS, - int numHistograms) { - IAlgorithm_sptr appendAlg = - AlgorithmManager::Instance().create("AppendSpectra"); + int numHistograms, + std::string const &outputName) { + auto appendAlg = AlgorithmManager::Instance().create("AppendSpectra"); appendAlg->setLogging(false); - appendAlg->setChild(true); appendAlg->initialize(); appendAlg->setProperty("InputWorkspace1", leftWS); appendAlg->setProperty("InputWorkspace2", rightWS); appendAlg->setProperty("Number", numHistograms); - appendAlg->setProperty("OutputWorkspace", "__appended"); + appendAlg->setProperty("OutputWorkspace", outputName); appendAlg->execute(); - return appendAlg->getProperty("OutputWorkspace"); + return getADSMatrixWorkspace(outputName); +} + +void renameWorkspace(std::string const &name, std::string const &newName) { + auto renamer = AlgorithmManager::Instance().create("RenameWorkspace"); + renamer->setLogging(false); + renamer->setProperty("InputWorkspace", name); + renamer->setProperty("OutputWorkspace", newName); + renamer->execute(); } -MatrixWorkspace_sptr extendResolutionWorkspace(MatrixWorkspace_sptr resolution, - std::size_t numberOfHistograms) { +void deleteWorkspace(std::string const &workspaceName) { + auto deleter = AlgorithmManager::Instance().create("DeleteWorkspace"); + deleter->setLogging(false); + deleter->setProperty("Workspace", workspaceName); + deleter->execute(); +} + +void extendResolutionWorkspace(MatrixWorkspace_sptr resolution, + std::size_t numberOfHistograms, + std::string const &outputName) { const auto resolutionNumHist = resolution->getNumberHistograms(); if (resolutionNumHist != 1 && resolutionNumHist != numberOfHistograms) { std::string msg( @@ -208,13 +224,15 @@ MatrixWorkspace_sptr extendResolutionWorkspace(MatrixWorkspace_sptr resolution, throw std::runtime_error(msg); } - auto resolutionWS = cloneWorkspace(resolution); + auto resolutionWS = cloneWorkspace(resolution, "__cloned"); // Append to cloned workspace if necessary - if (resolutionNumHist == 1 && numberOfHistograms > 1) - return appendWorkspace(resolutionWS, resolution, - static_cast<int>(numberOfHistograms - 1)); - return resolutionWS; + if (resolutionNumHist == 1 && numberOfHistograms > 1) { + appendWorkspace(resolutionWS, resolution, + static_cast<int>(numberOfHistograms - 1), outputName); + deleteWorkspace("__cloned"); + } else + renameWorkspace("__cloned", outputName); } void getParameterNameChanges( @@ -535,8 +553,7 @@ void ConvFitModel::removeWorkspace(std::size_t index) { } void ConvFitModel::setResolution(const std::string &name, std::size_t index) { - setResolution( - AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(name), index); + setResolution(getADSMatrixWorkspace(name), index); } void ConvFitModel::setResolution(MatrixWorkspace_sptr resolution, @@ -555,9 +572,9 @@ void ConvFitModel::setResolution(MatrixWorkspace_sptr resolution, void ConvFitModel::addExtendedResolution(std::size_t index) { const std::string name = "__ConvFitResolution" + std::to_string(index); - AnalysisDataService::Instance().addOrReplace( - name, extendResolutionWorkspace(m_resolution[index].lock(), - getNumberHistograms(index))); + + extendResolutionWorkspace(m_resolution[index].lock(), + getNumberHistograms(index), name); if (m_extendedResolution.size() > index) m_extendedResolution[index] = name; diff --git a/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp b/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp index e5e1909e15c11d95d7718017c7783399d9ef9ce0..b951e21d383883748b16ec59805aa6fda0301adf 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp @@ -6,6 +6,7 @@ // SPDX - License - Identifier: GPL - 3.0 + #include "IndirectFitOutput.h" +#include "MantidAPI/AlgorithmManager.h" #include "MantidAPI/AnalysisDataService.h" #include "MantidAPI/TableRow.h" #include "MantidAPI/TextAxis.h" @@ -135,17 +136,23 @@ std::vector<std::string> getAxisLabels(MatrixWorkspace_sptr workspace, return std::vector<std::string>(); } +void renameWorkspace(std::string const &name, std::string const &newName) { + auto renamer = AlgorithmManager::Instance().create("RenameWorkspace"); + renamer->setProperty("InputWorkspace", name); + renamer->setProperty("OutputWorkspace", newName); + renamer->execute(); +} + void renameResult(Workspace_sptr resultWorkspace, const std::string &workspaceName) { - AnalysisDataService::Instance().rename(resultWorkspace->getName(), - workspaceName + "_Result"); + renameWorkspace(resultWorkspace->getName(), workspaceName + "_Result"); } void renameResult(Workspace_sptr resultWorkspace, IndirectFitData const *fitData) { const auto name = resultWorkspace->getName(); const auto newName = fitData->displayName("%1%_s%2%_Result", "_to_"); - AnalysisDataService::Instance().rename(name, newName); + renameWorkspace(name, newName); } void renameResultWithoutSpectra(WorkspaceGroup_sptr resultWorkspace, diff --git a/qt/scientific_interfaces/Indirect/JumpFitModel.cpp b/qt/scientific_interfaces/Indirect/JumpFitModel.cpp index 22e3cba12161f4b333db7d437af880cfc0c41c7a..d55b93d8cd6d00b7db3044f9efd3483490f58a31 100644 --- a/qt/scientific_interfaces/Indirect/JumpFitModel.cpp +++ b/qt/scientific_interfaces/Indirect/JumpFitModel.cpp @@ -80,89 +80,101 @@ JumpFitParameters createJumpFitParameters(MatrixWorkspace *workspace) { return parameters; } -MatrixWorkspace_sptr scaleWorkspace(MatrixWorkspace_sptr workspace, - double factor) { +void deleteTemporaryWorkspaces(std::vector<std::string> const &workspaceNames) { + auto deleter = AlgorithmManager::Instance().create("DeleteWorkspace"); + deleter->setLogging(false); + for (auto const &name : workspaceNames) { + deleter->setProperty("Workspace", name); + deleter->execute(); + } +} + +std::string scaleWorkspace(std::string const &inputName, + std::string const &outputName, double factor) { auto scaleAlg = AlgorithmManager::Instance().create("Scale"); scaleAlg->initialize(); scaleAlg->setLogging(false); - scaleAlg->setChild(true); - scaleAlg->setProperty("InputWorkspace", workspace); - scaleAlg->setProperty("OutputWorkspace", "__scaled"); + scaleAlg->setProperty("InputWorkspace", inputName); + scaleAlg->setProperty("OutputWorkspace", outputName); scaleAlg->setProperty("Factor", factor); scaleAlg->execute(); - return scaleAlg->getProperty("OutputWorkspace"); + return outputName; } -MatrixWorkspace_sptr extractSpectra(MatrixWorkspace_sptr workspace, - int startIndex, int endIndex) { +std::string extractSpectra(std::string const &inputName, int startIndex, + int endIndex, std::string const &outputName) { auto extractAlg = AlgorithmManager::Instance().create("ExtractSpectra"); extractAlg->initialize(); - extractAlg->setChild(true); extractAlg->setLogging(false); - extractAlg->setProperty("InputWorkspace", workspace); + extractAlg->setProperty("InputWorkspace", inputName); extractAlg->setProperty("StartWorkspaceIndex", startIndex); extractAlg->setProperty("EndWorkspaceIndex", endIndex); - extractAlg->setProperty("OutputWorkspace", "__extracted"); + extractAlg->setProperty("OutputWorkspace", outputName); extractAlg->execute(); - return extractAlg->getProperty("OutputWorkspace"); + return outputName; } -MatrixWorkspace_sptr extractSpectrum(MatrixWorkspace_sptr workspace, - int index) { - return extractSpectra(workspace, index, index); +std::string extractSpectrum(MatrixWorkspace_sptr workspace, int index, + std::string const &outputName) { + return extractSpectra(workspace->getName(), index, index, outputName); } -MatrixWorkspace_sptr extractHWHMSpectrum(MatrixWorkspace_sptr workspace, - int index) { - return scaleWorkspace(extractSpectrum(workspace, index), 0.5); +std::string extractHWHMSpectrum(MatrixWorkspace_sptr workspace, int index) { + auto const scaledName = "__scaled_" + std::to_string(index); + auto const extractedName = "__extracted_" + std::to_string(index); + auto const outputName = scaleWorkspace( + extractSpectrum(workspace, index, extractedName), scaledName, 0.5); + deleteTemporaryWorkspaces({extractedName}); + return outputName; } -MatrixWorkspace_sptr appendWorkspace(MatrixWorkspace_sptr lhs, - MatrixWorkspace_sptr rhs) { +std::string appendWorkspace(std::string const &lhsName, + std::string const &rhsName, + std::string const &outputName) { auto appendAlg = AlgorithmManager::Instance().create("AppendSpectra"); appendAlg->initialize(); - appendAlg->setChild(true); appendAlg->setLogging(false); - appendAlg->setProperty("InputWorkspace1", lhs); - appendAlg->setProperty("InputWorkspace2", rhs); - appendAlg->setProperty("OutputWorkspace", "__appended"); + appendAlg->setProperty("InputWorkspace1", lhsName); + appendAlg->setProperty("InputWorkspace2", rhsName); + appendAlg->setProperty("OutputWorkspace", outputName); appendAlg->execute(); - return appendAlg->getProperty("OutputWorkspace"); + return outputName; } -MatrixWorkspace_sptr -appendAll(const std::vector<MatrixWorkspace_sptr> &workspaces) { - auto appended = workspaces.front(); +MatrixWorkspace_sptr appendAll(std::vector<std::string> const &workspaces, + std::string const &outputName) { + auto appended = workspaces[0]; for (auto i = 1u; i < workspaces.size(); ++i) - appended = appendWorkspace(appended, workspaces[i]); - return appended; -} - -MatrixWorkspace_sptr addToADS(MatrixWorkspace_sptr workspace, - const std::string &name) { - AnalysisDataService::Instance().addOrReplace(name, workspace); - return workspace; + appended = appendWorkspace(appended, workspaces[i], outputName); + return AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(appended); } -std::vector<MatrixWorkspace_sptr> +std::vector<std::string> subdivideWidthWorkspace(MatrixWorkspace_sptr workspace, const std::vector<std::size_t> &widthSpectra) { - std::vector<MatrixWorkspace_sptr> subworkspaces; + std::vector<std::string> subworkspaces; subworkspaces.reserve(1 + 2 * widthSpectra.size()); int start = 0; for (auto i = 0u; i < widthSpectra.size(); ++i) { const auto spectrum = static_cast<int>(widthSpectra[i]); - if (spectrum > start) - subworkspaces.emplace_back( - extractSpectra(workspace, start, spectrum - 1)); + if (spectrum > start) { + auto const outputName = "__extracted_" + std::to_string(start) + "_to_" + + std::to_string(spectrum); + subworkspaces.emplace_back(extractSpectra(workspace->getName(), start, + spectrum - 1, outputName)); + } subworkspaces.emplace_back(extractHWHMSpectrum(workspace, spectrum)); start = spectrum + 1; } const int end = static_cast<int>(workspace->getNumberHistograms()); - if (start < end) - subworkspaces.emplace_back(extractSpectra(workspace, start, end - 1)); + if (start < end) { + auto const outputName = + "__extracted_" + std::to_string(start) + "_to_" + std::to_string(end); + subworkspaces.emplace_back( + extractSpectra(workspace->getName(), start, end - 1, outputName)); + } return subworkspaces; } @@ -176,10 +188,13 @@ createHWHMWorkspace(MatrixWorkspace_sptr workspace, const std::string &hwhmName, hwhmName); const auto subworkspaces = subdivideWidthWorkspace(workspace, widthSpectra); - const auto hwhmWorkspace = appendAll(subworkspaces); + const auto hwhmWorkspace = appendAll(subworkspaces, hwhmName); const auto axis = workspace->getAxis(1)->clone(hwhmWorkspace.get()); hwhmWorkspace->replaceAxis(1, dynamic_cast<TextAxis *>(axis)); - return addToADS(hwhmWorkspace, hwhmName); + + deleteTemporaryWorkspaces(subworkspaces); + + return hwhmWorkspace; } boost::optional<std::size_t>