/// Fit the data simultaneously. void MultiDatasetFit::fitSimultaneous() { try { m_uiForm.btnFit->setEnabled(false); auto fun = createFunction(); auto fit = Mantid::API::AlgorithmManager::Instance().create("Fit"); fit->initialize(); fit->setProperty("Function", fun); fit->setPropertyValue("InputWorkspace", getWorkspaceName(0).toStdString()); fit->setProperty("WorkspaceIndex", getWorkspaceIndex(0)); auto range = getFittingRange(0); fit->setProperty("StartX", range.first); fit->setProperty("EndX", range.second); int n = getNumberOfSpectra(); for (int ispec = 1; ispec < n; ++ispec) { std::string suffix = boost::lexical_cast<std::string>(ispec); fit->setPropertyValue("InputWorkspace_" + suffix, getWorkspaceName(ispec).toStdString()); fit->setProperty("WorkspaceIndex_" + suffix, getWorkspaceIndex(ispec)); auto range = getFittingRange(ispec); fit->setProperty("StartX_" + suffix, range.first); fit->setProperty("EndX_" + suffix, range.second); } m_fitOptionsBrowser->copyPropertiesToAlgorithm(*fit); m_outputWorkspaceName = m_fitOptionsBrowser->getProperty("Output"); if (m_outputWorkspaceName.isEmpty()) { m_outputWorkspaceName = "out"; fit->setPropertyValue("Output", m_outputWorkspaceName.toStdString()); m_fitOptionsBrowser->setProperty("Output", "out"); } if (n == 1) { m_outputWorkspaceName += "_Workspace"; } else { m_outputWorkspaceName += "_Workspaces"; } removeOldOutput(); m_fitRunner.reset(new API::AlgorithmRunner()); connect(m_fitRunner.get(), SIGNAL(algorithmComplete(bool)), this, SLOT(finishFit(bool)), Qt::QueuedConnection); m_fitRunner->startAlgorithm(fit); } catch (std::exception &e) { QString mess(e.what()); const int maxSize = 500; if (mess.size() > maxSize) { mess = mess.mid(0, maxSize); mess += "..."; } QMessageBox::critical(this, "MantidPlot - Error", QString("Fit failed:\n\n %1").arg(mess)); m_uiForm.btnFit->setEnabled(true); } }
/** * Get value of named log from workspace i * (Must be able to cast to double) * @param logName :: [input] Name of log * @param function :: [input] Function to apply to log e.g. min, max, mean... * @param i :: [input] index of dataset * @returns :: value of log cast to double */ double DataController::getLogValue(const QString &logName, const StatisticType &function, int i) const { auto &ads = Mantid::API::AnalysisDataService::Instance(); const auto &wsName = getWorkspaceName(i).toStdString(); if (ads.doesExist(wsName)) { const auto &workspace = ads.retrieveWS<Mantid::API::MatrixWorkspace>(wsName); return workspace->run().getLogAsSingleValue(logName.toStdString(), function); } else { throw std::runtime_error("Workspace not found: " + wsName); } }
/// Fit the data sets sequentially if there are no global parameters. void MultiDatasetFit::fitSequential() { try { /// disable button to avoid multiple fit click m_uiForm.btnFit->setEnabled(false); std::ostringstream input; int n = getNumberOfSpectra(); for (int ispec = 0; ispec < n; ++ispec) { input << getWorkspaceName(ispec).toStdString() << ",i" << getWorkspaceIndex(ispec) << ";"; } auto fun = m_functionBrowser->getFunction(); auto fit = Mantid::API::AlgorithmManager::Instance().create("PlotPeakByLogValue"); fit->initialize(); fit->setPropertyValue("Function", fun->asString()); fit->setPropertyValue("Input", input.str()); auto range = getFittingRange(0); fit->setProperty("StartX", range.first); fit->setProperty("EndX", range.second); m_fitOptionsBrowser->copyPropertiesToAlgorithm(*fit); m_outputWorkspaceName = m_fitOptionsBrowser->getProperty("OutputWorkspace") + "_Workspaces"; removeOldOutput(); m_fitRunner.reset(new API::AlgorithmRunner()); connect(m_fitRunner.get(), SIGNAL(algorithmComplete(bool)), this, SLOT(finishFit(bool)), Qt::QueuedConnection); m_fitRunner->startAlgorithm(fit); } catch (std::exception &e) { QString mess(e.what()); const int maxSize = 500; if (mess.size() > maxSize) { mess = mess.mid(0, maxSize); mess += "..."; } QMessageBox::critical( this, "MantidPlot - Error", QString("PlotPeakByLogValue failed:\n\n %1").arg(mess)); m_uiForm.btnFit->setEnabled(true); } }
/// Check that the data sets in the table are valid and remove invalid ones. void DataController::checkSpectra() { QList<int> rows; int nrows = getNumberOfSpectra(); auto &ADS = Mantid::API::AnalysisDataService::Instance(); for (int row = 0; row < nrows; ++row) { auto wsName = getWorkspaceName(row).toStdString(); auto i = getWorkspaceIndex(row); if (!ADS.doesExist(wsName)) { rows.push_back(row); continue; } auto ws = ADS.retrieveWS<Mantid::API::MatrixWorkspace>(wsName); if (!ws || i >= static_cast<int>(ws->getNumberHistograms())) { rows.push_back(row); continue; } } removeSpectra(rows); }
/** * Collect names of the logs in the data workspaces and pass them on to * m_fitOptionsBrowser. */ void MultiDatasetFit::setLogNames() { if (getNumberOfSpectra() > 0) { try { auto ws = Mantid::API::AnalysisDataService::Instance() .retrieveWS<Mantid::API::MatrixWorkspace>( getWorkspaceName(0).toStdString()); const std::vector<Mantid::Kernel::Property *> logs = ws->run().getLogData(); QStringList logNames; for (int i = 0; i < static_cast<int>(logs.size()); ++i) { if (dynamic_cast<Mantid::Kernel::TimeSeriesProperty<double> *>( logs[i])) { logNames << QString::fromStdString(logs[i]->name()); } } if (!logNames.isEmpty()) { m_fitOptionsBrowser->setLogNames(logNames); } } catch (...) { /*Maybe the data table hasn't updated yet*/ } } }
/** * Get list of log names from workspace i * @param i :: [input] index of dataset * @returns :: list of log names */ std::vector<std::string> DataController::getWorkspaceLogNames(int i) const { std::vector<std::string> logNames; // validate input if (i > getNumberOfSpectra()) { std::ostringstream err; err << "Index " << i << "greater than number of spectra (" << getNumberOfSpectra() << ")"; throw std::invalid_argument(err.str()); } // populate vector of names auto &ads = Mantid::API::AnalysisDataService::Instance(); const auto &wsName = getWorkspaceName(i).toStdString(); if (ads.doesExist(wsName)) { const auto &workspace = ads.retrieveWS<Mantid::API::MatrixWorkspace>(wsName); const auto &logs = workspace->run().getLogData(); for (const auto &log : logs) { logNames.push_back(log->name()); } } return logNames; }