/** * Gets the energy mode from a workspace based on the X unit. * * Units of dSpacing typically denote diffraction, hence Elastic. * All other units default to spectroscopy, therefore Indirect. * * @param ws Pointer to the workspace * @return Energy mode */ std::string IndirectTab::getEMode(Mantid::API::MatrixWorkspace_sptr ws) { Mantid::Kernel::Unit_sptr xUnit = ws->getAxis(0)->unit(); std::string xUnitName = xUnit->caption(); g_log.debug() << "X unit name is: " << xUnitName << '\n'; if (boost::algorithm::find_first(xUnitName, "d-Spacing")) return "Elastic"; return "Indirect"; }
bool ApplyPaalmanPings::validate() { UserInputValidator uiv; uiv.checkDataSelectorIsValid("Sample", m_uiForm.dsSample); MatrixWorkspace_sptr sampleWs; bool useCan = m_uiForm.ckUseCan->isChecked(); bool useCorrections = m_uiForm.ckUseCorrections->isChecked(); if (!(useCan || useCorrections)) uiv.addErrorMessage("Must use either container subtraction or corrections"); if (useCan) { uiv.checkDataSelectorIsValid("Container", m_uiForm.dsContainer); // Check can and sample workspaces are the same "type" (reduced or S(Q, w)) QString sample = m_uiForm.dsSample->getCurrentDataName(); QString sampleType = sample.right(sample.length() - sample.lastIndexOf("_")); QString container = m_uiForm.dsContainer->getCurrentDataName(); QString containerType = container.right(container.length() - container.lastIndexOf("_")); g_log.debug() << "Sample type is: " << sampleType.toStdString() << '\n'; g_log.debug() << "Can type is: " << containerType.toStdString() << '\n'; if (containerType != sampleType) uiv.addErrorMessage( "Sample and can workspaces must contain the same type of data."); } if (useCorrections) { if (m_uiForm.dsCorrections->getCurrentDataName().compare("") == 0) { uiv.addErrorMessage( "Use Correction must contain a corrections file or workspace."); } else { QString correctionsWsName = m_uiForm.dsCorrections->getCurrentDataName(); WorkspaceGroup_sptr corrections = AnalysisDataService::Instance().retrieveWS<WorkspaceGroup>( correctionsWsName.toStdString()); for (size_t i = 0; i < corrections->size(); i++) { // Check it is a MatrixWorkspace MatrixWorkspace_sptr factorWs = boost::dynamic_pointer_cast<MatrixWorkspace>( corrections->getItem(i)); if (!factorWs) { QString msg = "Correction factor workspace " + QString::number(i) + " is not a MatrixWorkspace"; uiv.addErrorMessage(msg); continue; } // Check X unit is wavelength Mantid::Kernel::Unit_sptr xUnit = factorWs->getAxis(0)->unit(); if (xUnit->caption() != "Wavelength") { QString msg = "Correction factor workspace " + QString::fromStdString(factorWs->name()) + " is not in wavelength"; uiv.addErrorMessage(msg); } } } } // Show errors if there are any if (!uiv.isAllInputValid()) emit showMessageBox(uiv.generateErrorMessage()); return uiv.isAllInputValid(); }
void CalculatePaalmanPings::run() { // Get correct corrections algorithm auto sampleShape = m_uiForm.cbSampleShape->currentText(); auto algorithmName = sampleShape.replace(" ", "") + "PaalmanPingsCorrection"; algorithmName = algorithmName.replace( "Annulus", "Cylinder"); // Use the cylinder algorithm for annulus API::BatchAlgorithmRunner::AlgorithmRuntimeProps absCorProps; auto absCorAlgo = AlgorithmManager::Instance().create(algorithmName.toStdString()); absCorAlgo->initialize(); // Sample details auto sampleWsName = m_uiForm.dsSample->getCurrentDataName(); MatrixWorkspace_sptr sampleWs = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>( sampleWsName.toStdString()); const auto emode = m_uiForm.cbEmode->currentText(); absCorAlgo->setProperty("EMode", emode.toStdString()); const auto efixed = m_uiForm.doubleEfixed->value(); absCorAlgo->setProperty("EFixed", efixed); const long int numwave = m_uiForm.spNwave->value(); absCorAlgo->setProperty("NumberWavelengths", numwave); const bool inter = m_uiForm.cbInterpolate->isChecked(); absCorAlgo->setProperty("Interpolate", inter); // If not in wavelength then do conversion const auto sampleXUnit = sampleWs->getAxis(0)->unit(); if (sampleXUnit->caption() != "Wavelength" && emode != "Efixed") { g_log.information( "Sample workspace not in wavelength, need to convert to continue."); absCorProps["SampleWorkspace"] = addConvertUnitsStep(sampleWs, "Wavelength"); } else { absCorProps["SampleWorkspace"] = sampleWsName.toStdString(); } absCorAlgo->setProperty( "SampleDensityType", m_uiForm.cbSampleDensity->currentText().toStdString()); absCorAlgo->setProperty("SampleDensity", m_uiForm.spSampleDensity->value()); absCorAlgo->setProperty( "SampleChemicalFormula", m_uiForm.leSampleChemicalFormula->text().toStdString()); addShapeSpecificSampleOptions(absCorAlgo, sampleShape); // Can details if (m_uiForm.ckUseCan->isChecked()) { const auto canWsName = m_uiForm.dsContainer->getCurrentDataName().toStdString(); MatrixWorkspace_sptr canWs = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(canWsName); // If not in wavelength then do conversion Mantid::Kernel::Unit_sptr canXUnit = canWs->getAxis(0)->unit(); if (canXUnit->caption() != "Wavelength" && emode != "Efixed") { g_log.information("Container workspace not in wavelength, need to " "convert to continue."); absCorProps["CanWorkspace"] = addConvertUnitsStep(canWs, "Wavelength"); } else { absCorProps["CanWorkspace"] = canWsName; } absCorAlgo->setProperty("CanDensityType", m_uiForm.cbCanDensity->currentText().toStdString()); absCorAlgo->setProperty("CanDensity", m_uiForm.spCanDensity->value()); const auto canChemicalFormula = m_uiForm.leCanChemicalFormula->text(); absCorAlgo->setProperty("CanChemicalFormula", canChemicalFormula.toStdString()); addShapeSpecificCanOptions(absCorAlgo, sampleShape); } // Generate workspace names auto nameCutIndex = sampleWsName.lastIndexOf("_"); if (nameCutIndex == -1) nameCutIndex = sampleWsName.length(); QString correctionType; switch (m_uiForm.cbSampleShape->currentIndex()) { case 0: correctionType = "flt"; break; case 1: correctionType = "cyl"; break; case 2: correctionType = "ann"; break; } const auto outputWsName = sampleWsName.left(nameCutIndex) + "_" + correctionType + "_abs"; absCorAlgo->setProperty("OutputWorkspace", outputWsName.toStdString()); // Add corrections algorithm to queue m_batchAlgoRunner->addAlgorithm(absCorAlgo, absCorProps); // Run algorithm queue connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(absCorComplete(bool))); m_batchAlgoRunner->executeBatchAsync(); // Set the result workspace for Python script export m_pythonExportWsName = outputWsName.toStdString(); }