From 96d3d7ea3674d99ea2bbd0b097918b065c9de99c Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 29 Oct 2014 11:40:13 +0000 Subject: [PATCH] Added S(Q, w) reduction using batch runner Refs #10451 --- .../CustomInterfaces/src/IndirectSqw.cpp | 131 +++++++++++------- 1 file changed, 78 insertions(+), 53 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp index ab5a57e83265..e6bb59518be5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp @@ -5,6 +5,7 @@ #include using namespace Mantid::API; +using MantidQt::API::BatchAlgorithmRunner; namespace MantidQt { @@ -52,7 +53,7 @@ namespace CustomInterfaces emit showMessageBox(error); } - if(m_uiForm.sqw_ckRebinE->isChecked() && validateEnergyRebin()) + if(m_uiForm.sqw_ckRebinE->isChecked() && !validateEnergyRebin()) valid = false; if(!validateQRebin()) @@ -147,80 +148,104 @@ namespace CustomInterfaces void IndirectSqw::run() { + QString sampleWsName = m_uiForm.sqw_dsSampleInput->getCurrentDataName(); + QString sqwWsName = sampleWsName.left(sampleWsName.length() - 4) + "_sqw"; + QString eRebinWsName = sampleWsName.left(sampleWsName.length() - 4) + "_r"; + QString rebinString = m_uiForm.sqw_leQLow->text() + "," + m_uiForm.sqw_leQWidth->text() + "," + m_uiForm.sqw_leQHigh->text(); - QString wsname; - if(m_uiForm.sqw_dsSampleInput->isFileSelectorVisible()) - { - // Load Nexus file into workspace - QString filename = m_uiForm.sqw_dsSampleInput->getFullFilePath(); - QFileInfo fi(filename); - wsname = fi.baseName(); - - if(!loadFile(filename, wsname)) - { - emit showMessageBox("Could not load Nexus file"); - } - } - else + // Rebin in energy + bool rebinInEnergy = m_uiForm.sqw_ckRebinE->isChecked(); + if(rebinInEnergy) { - // Get the workspace - wsname = m_uiForm.sqw_dsSampleInput->getCurrentDataName(); - } + QString eRebinString = m_uiForm.sqw_leELow->text() + "," + m_uiForm.sqw_leEWidth->text() + + "," + m_uiForm.sqw_leEHigh->text(); - QString pyInput = "from mantid.simpleapi import *\n"; + IAlgorithm_sptr energyRebinAlg = AlgorithmManager::Instance().create("Rebin"); + energyRebinAlg->initialize(); - // Create output name before rebinning - pyInput += "sqwInput = '" + wsname + "'\n"; - pyInput += "sqwOutput = sqwInput[:-3] + 'sqw'\n"; + energyRebinAlg->setProperty("InputWorkspace", sampleWsName.toStdString()); + energyRebinAlg->setProperty("OutputWorkspace", eRebinWsName.toStdString()); + energyRebinAlg->setProperty("Params", eRebinString.toStdString()); - if ( m_uiForm.sqw_ckRebinE->isChecked() ) - { - QString eRebinString = m_uiForm.sqw_leELow->text() + "," + m_uiForm.sqw_leEWidth->text() + - "," + m_uiForm.sqw_leEHigh->text(); - - pyInput += "Rebin(InputWorkspace=sqwInput, OutputWorkspace=sqwInput+'_r', Params='" + eRebinString + "')\n" - "sqwInput += '_r'\n"; + m_batchAlgoRunner->addAlgorithm(energyRebinAlg); } - pyInput += - "efixed = " + m_uiForm.leEfixed->text() + "\n" - "rebin = '" + rebinString + "'\n"; + // Get correct S(Q, w) algorithm + QString efixed = m_uiForm.leEfixed->text(); + IAlgorithm_sptr sqwAlg; QString rebinType = m_uiForm.sqw_cbRebinType->currentText(); + if(rebinType == "Centre (SofQW)") - pyInput += "SofQW(InputWorkspace=sqwInput, OutputWorkspace=sqwOutput, QAxisBinning=rebin, EMode='Indirect', EFixed=efixed)\n"; + sqwAlg = AlgorithmManager::Instance().create("SofQW"); else if(rebinType == "Parallelepiped (SofQW2)") - pyInput += "SofQW2(InputWorkspace=sqwInput, OutputWorkspace=sqwOutput, QAxisBinning=rebin, EMode='Indirect', EFixed=efixed)\n"; + sqwAlg = AlgorithmManager::Instance().create("SofQW2"); else if(rebinType == "Parallelepiped/Fractional Area (SofQW3)") - pyInput += "SofQW3(InputWorkspace=sqwInput, OutputWorkspace=sqwOutput, QAxisBinning=rebin, EMode='Indirect', EFixed=efixed)\n"; + sqwAlg = AlgorithmManager::Instance().create("SofQW3"); - pyInput += "AddSampleLog(Workspace=sqwOutput, LogName='rebin_type', LogType='String', LogText='"+rebinType+"')\n"; + // S(Q, w) algorithm + sqwAlg->initialize(); - if ( m_uiForm.sqw_ckSave->isChecked() ) - { - pyInput += "SaveNexus(InputWorkspace=sqwOutput, Filename=sqwOutput+'.nxs')\n"; + BatchAlgorithmRunner::AlgorithmRuntimeProps sqwInputProps; + if(rebinInEnergy) + sqwInputProps["InputWorkspace"] = eRebinWsName.toStdString(); + else + sqwInputProps["InputWorkspace"] = sampleWsName.toStdString(); - if (m_uiForm.sqw_ckVerbose->isChecked()) - { - pyInput += "logger.notice(\"Resolution file saved to default save directory.\")\n"; - } - } + sqwAlg->setProperty("OutputWorkspace", sqwWsName.toStdString()); + sqwAlg->setProperty("QAxisBinning", rebinString.toStdString()); + sqwAlg->setProperty("EMode", "Indirect"); + sqwAlg->setProperty("EFixed", efixed.toStdString()); - if ( m_uiForm.sqw_cbPlotType->currentText() == "Contour" ) - { - pyInput += "importMatrixWorkspace(sqwOutput).plotGraph2D()\n"; - } + m_batchAlgoRunner->addAlgorithm(sqwAlg, sqwInputProps); + + // Add sample log for S(Q, w) algorithm used + IAlgorithm_sptr sampleLogAlg = AlgorithmManager::Instance().create("AddSampleLog"); + sampleLogAlg->initialize(); + + sampleLogAlg->setProperty("LogName", "rebin_type"); + sampleLogAlg->setProperty("LogType", "String"); + sampleLogAlg->setProperty("LogText", rebinType.toStdString()); - else if ( m_uiForm.sqw_cbPlotType->currentText() == "Spectra" ) + BatchAlgorithmRunner::AlgorithmRuntimeProps inputToAddSampleLogProps; + inputToAddSampleLogProps["Workspace"] = sqwWsName.toStdString(); + + m_batchAlgoRunner->addAlgorithm(sampleLogAlg, inputToAddSampleLogProps); + + // Save S(Q, w) workspace + if(m_uiForm.sqw_ckSave->isChecked()) { - pyInput += - "nspec = mtd[sqwOutput].getNumberHistograms()\n" - "plotSpectrum(sqwOutput, range(0, nspec))\n"; + QString saveFilename = sqwWsName + ".nxs"; + + IAlgorithm_sptr saveNexusAlg = AlgorithmManager::Instance().create("SaveNexus"); + saveNexusAlg->initialize(); + + saveNexusAlg->setProperty("Filename", saveFilename.toStdString()); + + BatchAlgorithmRunner::AlgorithmRuntimeProps inputToSaveNexusProps; + inputToSaveNexusProps["InputWorkspace"] = sqwWsName.toStdString(); + + m_batchAlgoRunner->addAlgorithm(saveNexusAlg, inputToSaveNexusProps); } - QString pyOutput = m_pythonRunner.runPythonCode(pyInput).trimmed(); + m_batchAlgoRunner->executeBatch(); + + //TODO + /* if(m_uiForm.sqw_cbPlotType->currentText() == "Contour") */ + /* { */ + /* pyInput += "importMatrixWorkspace(sqwOutput).plotGraph2D()\n"; */ + /* } */ + + /* else if( m_uiForm.sqw_cbPlotType->currentText() == "Spectra") */ + /* { */ + /* pyInput += */ + /* "nspec = mtd[sqwOutput].getNumberHistograms()\n" */ + /* "plotSpectrum(sqwOutput, range(0, nspec))\n"; */ + /* } */ + + /* QString pyOutput = m_pythonRunner.runPythonCode(pyInput).trimmed(); */ } /**