Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Framework/Kernel/inc/MantidKernel/Strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,9 @@ MANTID_KERNEL_DLL std::string toLower(const std::string &input);
/// Converts string to all uppercase
MANTID_KERNEL_DLL std::string toUpper(const std::string &input);

/// Checks if string ends with a suffix
MANTID_KERNEL_DLL bool endsWith(std::string const &str, std::string const &suffix);

/// determine if a character group exists in a string
MANTID_KERNEL_DLL int confirmStr(const std::string &S, const std::string &fullPhrase);
/// Get a word from a string
Expand Down
9 changes: 9 additions & 0 deletions Framework/Kernel/src/Strings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,15 @@ MANTID_KERNEL_DLL std::string toUpper(const std::string &input) {
return output;
}

/** Checks if string ends with a suffix
*/
MANTID_KERNEL_DLL bool endsWith(std::string const &str, std::string const &suffix) {
if (str.size() >= suffix.size()) {
return str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
}
return false;
}

//------------------------------------------------------------------------------------------------
/**
* Function to convert a number into hex
Expand Down
7 changes: 7 additions & 0 deletions Framework/Kernel/test/StringsTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,13 @@ class StringsTest : public CxxTest::TestSuite {
TS_ASSERT_EQUALS(text.length(), length);
}
}

void test_endsWith_when_the_suffix_is_smaller_than_the_str() {
TS_ASSERT(endsWith("ATestString", "String"));
TS_ASSERT(!endsWith("AStringTest", "String"));
}

void test_endsWith_when_the_suffix_is_too_large() { TS_ASSERT(!endsWith("SmallText", "AVeryLongSuffix")); }
};

class StringsTestPerformance : public CxxTest::TestSuite {
Expand Down
1 change: 1 addition & 0 deletions docs/source/release/v6.11.0/Inelastic/Bugfixes/37671.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Available fit functions in the `Function (Q)` tab of the :ref:`QENS Fitting <interface-inelastic-qens-fitting>` interface are updated according to the type of data (`EISF`, `A0` or `Width`) loaded on the table.
Original file line number Diff line number Diff line change
Expand Up @@ -148,11 +148,11 @@ void FitDataPresenter::addTableEntry(FitDomainIndex row) {
}

void FitDataPresenter::handleCellChanged(int row, int column) {
if (m_view->getColumnIndexFromName("StartX") == column) {
if (m_view->columnIndex("StartX") == column) {
setTableStartXAndEmit(m_view->getText(row, column).toDouble(), row, column);
} else if (m_view->getColumnIndexFromName("EndX") == column) {
} else if (m_view->columnIndex("EndX") == column) {
setTableEndXAndEmit(m_view->getText(row, column).toDouble(), row, column);
} else if (m_view->getColumnIndexFromName("Mask X Range") == column) {
} else if (m_view->columnIndex("Mask X Range") == column) {
setModelExcludeAndEmit(m_view->getText(row, column).toStdString(), row);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class MANTIDQT_INELASTIC_DLL FitDataPresenter : public IFitDataPresenter, public
std::vector<std::string> createDisplayNames() const;
void validate(IUserInputValidator *validator);

virtual void updateFitFunctionList() const {};

virtual void addWorkspace(const std::string &workspaceName, const std::string &paramType, const int &spectrum_index) {
UNUSED_ARG(workspaceName);
UNUSED_ARG(paramType);
Expand Down
29 changes: 18 additions & 11 deletions qt/scientific_interfaces/Inelastic/QENSFitting/FitDataView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,11 @@ void FitDataView::setHorizontalHeaders(const QStringList &headers) {
auto header = m_uiForm->tbFitData->horizontalHeader();
header->setSectionResizeMode(0, QHeaderView::Stretch);

m_uiForm->tbFitData->setItemDelegateForColumn(getColumnIndexFromName("StartX"),
m_uiForm->tbFitData->setItemDelegateForColumn(columnIndex("StartX"),
new NumericInputDelegate(m_uiForm->tbFitData, NUMERICAL_PRECISION));
m_uiForm->tbFitData->setItemDelegateForColumn(getColumnIndexFromName("EndX"),
m_uiForm->tbFitData->setItemDelegateForColumn(columnIndex("EndX"),
new NumericInputDelegate(m_uiForm->tbFitData, NUMERICAL_PRECISION));
m_uiForm->tbFitData->setItemDelegateForColumn(getColumnIndexFromName("Mask X Range"),
m_uiForm->tbFitData->setItemDelegateForColumn(columnIndex("Mask X Range"),
new RegexInputDelegate(m_uiForm->tbFitData, MASK_LIST));

m_uiForm->tbFitData->verticalHeader()->setVisible(false);
Expand All @@ -89,16 +89,16 @@ void FitDataView::addTableEntry(size_t row, FitDataRow const &newRow) {

cell = std::make_unique<QTableWidgetItem>(QString::number(newRow.workspaceIndex));
cell->setFlags(flags);
setCell(std::move(cell), row, getColumnIndexFromName("WS Index"));
setCell(std::move(cell), row, columnIndex("WS Index"));

cell = std::make_unique<QTableWidgetItem>(makeQStringNumber(newRow.startX, NUMERICAL_PRECISION));
setCell(std::move(cell), row, getColumnIndexFromName("StartX"));
setCell(std::move(cell), row, columnIndex("StartX"));

cell = std::make_unique<QTableWidgetItem>(makeQStringNumber(newRow.endX, NUMERICAL_PRECISION));
setCell(std::move(cell), row, getColumnIndexFromName("EndX"));
setCell(std::move(cell), row, columnIndex("EndX"));

cell = std::make_unique<QTableWidgetItem>(QString::fromStdString(newRow.exclude));
setCell(std::move(cell), row, getColumnIndexFromName("Mask X Range"));
setCell(std::move(cell), row, columnIndex("Mask X Range"));
}

void FitDataView::updateNumCellEntry(double numEntry, size_t row, size_t column) {
Expand All @@ -109,8 +109,8 @@ void FitDataView::updateNumCellEntry(double numEntry, size_t row, size_t column)

bool FitDataView::isTableEmpty() const { return m_uiForm->tbFitData->rowCount() == 0; }

int FitDataView::getColumnIndexFromName(std::string const &ColName) {
return m_HeaderLabels.indexOf(QString::fromStdString(ColName));
int FitDataView::columnIndex(std::string const &name) const {
return m_HeaderLabels.indexOf(QString::fromStdString(name));
}

void FitDataView::clearTable() { m_uiForm->tbFitData->setRowCount(0); }
Expand All @@ -119,8 +119,15 @@ void FitDataView::setCell(std::unique_ptr<QTableWidgetItem> cell, size_t row, si
m_uiForm->tbFitData->setItem(static_cast<int>(row), static_cast<int>(column), cell.release());
}

bool FitDataView::dataColumnContainsText(std::string const &columnText) const {
return !m_uiForm->tbFitData->findItems(QString::fromStdString(columnText), Qt::MatchContains).isEmpty();
bool FitDataView::columnContains(std::string const &columnHeader, std::string const &text) const {
auto const column = columnIndex(columnHeader);
for (auto row = 0; row < m_uiForm->tbFitData->rowCount(); ++row) {
auto const itemText = m_uiForm->tbFitData->item(row, column)->text();
if (itemText.contains(QString::fromStdString(text))) {
return true;
}
}
return false;
}

QString FitDataView::getText(int row, int column) const {
Expand Down
4 changes: 2 additions & 2 deletions qt/scientific_interfaces/Inelastic/QENSFitting/FitDataView.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ class MANTIDQT_INELASTIC_DLL FitDataView : public QTabWidget, public IFitDataVie
void validate(IUserInputValidator *validator) override;
virtual void addTableEntry(size_t row, FitDataRow const &newRow) override;
virtual void updateNumCellEntry(double numEntry, size_t row, size_t column) override;
int getColumnIndexFromName(std::string const &ColName) override;
int columnIndex(std::string const &name) const override;
void clearTable() override;
QString getText(int row, int column) const override;
QModelIndexList getSelectedIndexes() const override;
bool dataColumnContainsText(std::string const &columnText) const override;
bool columnContains(std::string const &columnHeader, std::string const &text) const override;

void displayWarning(const std::string &warning) override;

Expand Down
1 change: 1 addition & 0 deletions qt/scientific_interfaces/Inelastic/QENSFitting/FitTab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ void FitTab::handleDataRemoved() {
updateDataReferences();
m_plotPresenter->updateDataSelection(m_dataPresenter->createDisplayNames());
updateParameterEstimationData();
m_dataPresenter->updateFitFunctionList();
}

void FitTab::handlePlotSpectrumChanged() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "ParameterEstimation.h"

#include "MantidAPI/TextAxis.h"
#include "MantidKernel/Strings.h"

namespace {
using namespace MantidQt::CustomInterfaces::Inelastic;
Expand All @@ -33,9 +34,10 @@ void replaceAxisLabel(TextAxis *axis, std::size_t const index, std::string const
axis->setLabel(index, label);
}

void convertWidthToHWHM(MatrixWorkspace_sptr workspace, const std::vector<std::size_t> &widthSpectra) {
void convertWidthToHWHM(MatrixWorkspace_sptr workspace, std::vector<std::size_t> const &widthSpectra) {
for (auto const &spectrumIndex : widthSpectra) {
if (auto axis = dynamic_cast<TextAxis *>(workspace->getAxis(1))) {
auto axis = dynamic_cast<TextAxis *>(workspace->getAxis(1));
if (axis && !Mantid::Kernel::Strings::endsWith(axis->label(spectrumIndex), "HWHM")) {
replaceAxisLabel(axis, spectrumIndex, "Width", "HWHM");
replaceAxisLabel(axis, spectrumIndex, "FWHM", "HWHM");
workspace->mutableY(spectrumIndex) *= 0.5;
Expand Down Expand Up @@ -71,6 +73,10 @@ bool FunctionQDataPresenter::addWorkspaceFromDialog(MantidWidgets::IAddWorkspace
return false;
}

void FunctionQDataPresenter::updateFitFunctionList() const {
m_tab->handleFunctionListChanged(chooseFunctionQFunctions(std::nullopt));
}

void FunctionQDataPresenter::addWorkspace(const std::string &workspaceName, const std::string &paramType,
const int &spectrum_index) {
const auto workspace = m_adsInstance.retrieveWS<MatrixWorkspace>(workspaceName);
Expand All @@ -87,18 +93,24 @@ void FunctionQDataPresenter::addWorkspace(const std::string &workspaceName, cons
m_model->addWorkspace(workspace->getName(), singleSpectra);
}

std::map<std::string, std::string> FunctionQDataPresenter::chooseFunctionQFunctions(bool paramWidth) const {
if (m_view->isTableEmpty()) // when first data is added to table, it can only be either WIDTH or EISF
return paramWidth ? FunctionQ::WIDTH_FITS : FunctionQ::EISF_FITS;

bool widthFuncs = paramWidth || m_view->dataColumnContainsText("HWHM");
bool eisfFuncs = !paramWidth || m_view->dataColumnContainsText("EISF") || m_view->dataColumnContainsText("A0");
std::map<std::string, std::string>
FunctionQDataPresenter::chooseFunctionQFunctions(std::optional<bool> paramWidth) const {
if (m_view->isTableEmpty())
return (paramWidth == std::nullopt) ? FunctionQ::ALL_FITS
: *paramWidth ? FunctionQ::WIDTH_FITS
: FunctionQ::EISF_FITS;
auto const columnHeader = "Parameter";
auto widthFuncs = m_view->columnContains(columnHeader, "HWHM");
auto eisfFuncs = m_view->columnContains(columnHeader, "EISF") || m_view->columnContains(columnHeader, "A0");
if (paramWidth != std::nullopt) {
widthFuncs = widthFuncs || *paramWidth;
eisfFuncs = eisfFuncs || !*paramWidth;
}
if (widthFuncs && eisfFuncs)
return FunctionQ::ALL_FITS;
else if (widthFuncs)
if (widthFuncs)
return FunctionQ::WIDTH_FITS;
else
return FunctionQ::EISF_FITS;
return FunctionQ::EISF_FITS;
}

void FunctionQDataPresenter::setActiveParameterType(const std::string &type) { m_activeParameterType = type; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class MANTIDQT_INELASTIC_DLL FunctionQDataPresenter : public FitDataPresenter, p
void handleAddClicked() override;
void handleWorkspaceChanged(FunctionQAddWorkspaceDialog *dialog, const std::string &workspace) override;
void handleParameterTypeChanged(FunctionQAddWorkspaceDialog *dialog, const std::string &type) override;
void updateFitFunctionList() const override;

protected:
void addTableEntry(FitDomainIndex row) override;
Expand All @@ -44,7 +45,7 @@ class MANTIDQT_INELASTIC_DLL FunctionQDataPresenter : public FitDataPresenter, p
void updateActiveWorkspaceID(WorkspaceID index);
void updateParameterOptions(FunctionQAddWorkspaceDialog *dialog, const FunctionQParameters &parameters);
void updateParameterTypes(FunctionQAddWorkspaceDialog *dialog, FunctionQParameters const &parameters);
std::map<std::string, std::string> chooseFunctionQFunctions(bool paramWidth) const;
std::map<std::string, std::string> chooseFunctionQFunctions(std::optional<bool> paramWidth) const;
void setActiveWorkspaceIDToCurrentWorkspace(MantidWidgets::IAddWorkspaceDialog const *dialog);

std::string m_activeParameterType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ namespace MantidQt::CustomInterfaces::Inelastic {
FunctionQParameters::FunctionQParameters() : m_widths(), m_eisfs() {}

FunctionQParameters::FunctionQParameters(const MatrixWorkspace_sptr &workspace)
: m_widths(findAxisLabels(workspace, {".Width", ".FWHM"})), m_eisfs(findAxisLabels(workspace, {".EISF"})),
: m_widths(findAxisLabels(workspace, {".Width", ".FWHM", ".HWHM"})), m_eisfs(findAxisLabels(workspace, {".EISF"})),
m_a0s(findAxisLabels(workspace, {".A0"})) {}

std::vector<std::string> FunctionQParameters::names(std::string const &parameterType) const {
Expand Down
4 changes: 2 additions & 2 deletions qt/scientific_interfaces/Inelastic/QENSFitting/IFitDataView.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ class MANTIDQT_INELASTIC_DLL IFitDataView {
virtual void validate(IUserInputValidator *validator) = 0;
virtual void addTableEntry(size_t row, FitDataRow const &newRow) = 0;
virtual void updateNumCellEntry(double numEntry, size_t row, size_t column) = 0;
virtual int getColumnIndexFromName(std::string const &ColName) = 0;
virtual int columnIndex(std::string const &name) const = 0;
virtual void clearTable() = 0;
virtual QString getText(int row, int column) const = 0;
virtual QModelIndexList getSelectedIndexes() const = 0;
virtual bool dataColumnContainsText(std::string const &columnText) const = 0;
virtual bool columnContains(std::string const &columnHeader, std::string const &text) const = 0;

virtual void displayWarning(std::string const &warning) = 0;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -292,11 +292,11 @@ class MockFitDataView : public IFitDataView {
MOCK_METHOD1(validate, void(MantidQt::CustomInterfaces::IUserInputValidator *validator));
MOCK_METHOD2(addTableEntry, void(size_t row, FitDataRow const &newRow));
MOCK_METHOD3(updateNumCellEntry, void(double numEntry, size_t row, size_t column));
MOCK_METHOD1(getColumnIndexFromName, int(std::string const &ColName));
MOCK_CONST_METHOD1(columnIndex, int(std::string const &name));
MOCK_METHOD0(clearTable, void());
MOCK_CONST_METHOD2(getText, QString(int row, int column));
MOCK_CONST_METHOD0(getSelectedIndexes, QModelIndexList());
MOCK_CONST_METHOD1(dataColumnContainsText, bool(const std::string &columnText));
MOCK_CONST_METHOD2(columnContains, bool(const std::string &columnHeader, const std::string &text));

MOCK_METHOD1(setSampleWSSuffices, void(const QStringList &suffices));
MOCK_METHOD1(setSampleFBSuffices, void(const QStringList &suffices));
Expand Down
Loading