Skip to content

Fix crash on QENS Fitting Interface#41126

Open
adriazalvarez wants to merge 17 commits intomainfrom
qens_fitting_crash
Open

Fix crash on QENS Fitting Interface#41126
adriazalvarez wants to merge 17 commits intomainfrom
qens_fitting_crash

Conversation

@adriazalvarez
Copy link
Copy Markdown
Contributor

@adriazalvarez adriazalvarez commented Mar 25, 2026

Description of work

This issue closes #40731 , #41020. Origin of both crashes are two aspects of the same feature: the management of resolution workspaces from the DataModel. The resolution workspaces are stored as a vector of weak pointers to resolution workspaces loaded on the ADS. When data from the ADS revolving these workspaces is removed, the function browser tries to access a pointer that's been voided. Additionally, there was a problem when setting the spectra for resolutions when new spectra were added to the interface, this made impossible to add new spectra.
The fix this issue, there had been two main changes:

  1. DataModel does not store pointers to resolution workspaces, instead the data structure containing every fit data (fitdata) contains a map of resolution ws names vs. spectra. This makes the model more sturdy against changes in resolution, additionally it adds the bonus that it is now possible to select two different resolution workspaces for a given workspace.
  2. As the QENS Fitting interface relies on the ADS due to the Function Browser, I have added an observer to the table of the interface to synchronize delete/clear/and rename operations and avoid trying to fit data that is not on the ads. This part was the main thing taking me a bit off track, as there was already a sort of broken implementation of the ADSObserver on the presenter of the table but it was not really used, also, to use the ADSObserver with qt it is better to let qt integrate it into its thread by using the QMetaObject::invokeMethod, otherwise, weird race conditions occur.

Closes #40731 , #41020 .

To test:


Reviewer

Your comments will be used as part of the gatekeeper process. Comment clearly on what you have checked and tested during your review. Provide an audit trail for any changes requested.

As per the review guidelines:

  • Is the code of an acceptable quality? (Code standards/GUI standards)
  • Has a thorough functional test been performed? Do the changes handle unexpected input/situations?
  • Are appropriately scoped unit and/or system tests provided?
  • Do the release notes conform to the guidelines and describe the changes appropriately?
  • Has the relevant (user and developer) documentation been added/updated?
  • If the PR author isn’t in the mantid-developers or mantid-contributors teams, add a review comment rerun ci to authorize/rerun the CI

Gatekeeper

As per the gatekeeping guidelines:

  • Has a thorough first line review been conducted, including functional testing?
  • At a high-level, is the code quality sufficient?
  • Are the base, milestone and labels correct?

adriazalvarez and others added 14 commits March 25, 2026 07:09
- Modify how data model sets and retrieves resolutions
- Add support for new fitdata structure with resolution map
…me and delete handles

- Add notifier functions using Qmetaobject to properly handle threads
…ution at the end so that model is set with all appropriate paramters
…odel function signature that includes the resolution spectra

- add table entry without retrieving all resolutions
- Refactor a bit to remove redundancy
- Add need tests covering new way of handling resolution in model
@adriazalvarez adriazalvarez added this to the Release 6.16 milestone Mar 25, 2026
@adriazalvarez adriazalvarez added Bug Issues and pull requests that are regressions or would be considered a bug by users (e.g. crashing) ISIS: Spectroscopy Issue and pull requests relating to Muons, Indirect and Inelastic at ISIS labels Mar 25, 2026
@adriazalvarez adriazalvarez changed the title Qens fitting crash Fix crash on QENS Fitting interface Mar 25, 2026
@adriazalvarez adriazalvarez changed the title Fix crash on QENS Fitting interface Fix crash on QENS Fitting Interface Mar 25, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 25, 2026

Unit test results

2 863 tests   2 863 ✅  8h 20m 43s ⏱️
    1 suites      0 💤
    1 files        0 ❌

Results for commit 51eb826.

♻️ This comment has been updated with latest results.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 25, 2026

System test results

808 tests   792 ✅  3h 1m 5s ⏱️
 11 suites   16 💤
 11 files      0 ❌

Results for commit 51eb826.

♻️ This comment has been updated with latest results.

@adriazalvarez
Copy link
Copy Markdown
Contributor Author

@coderabbitai full review

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 30, 2026

✅ Actions performed

Full review triggered.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 30, 2026

📝 Walkthrough

Walkthrough

This PR refactors workspace lifecycle management in QENS fitting to prevent crashes when workspaces are removed from the Analysis Data Service. It relocates ADS observation from presenters to the view layer, allowing the view to forward ADS events (delete, rename, clear) to presenters. The DataModel resolution API is expanded from simple name-based methods to context-aware methods accepting workspace names and spectra indices. Internal resolution tracking shifts from weak workspace pointers to per-workspace spectrum-indexed mappings within FitData. ConvolutionDataPresenter and FitDataPresenter are updated to use the new resolution API and handle workspace state changes through centralized handlers that update the model and refresh the UI.

Suggested labels

ISIS: Core

Suggested reviewers

  • jclarkeSTFC
  • walshmm
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main objective: fixing a crash in the QENS Fitting Interface, which is the primary change across all modified files.
Linked Issues check ✅ Passed Changes address #40731 by implementing ADS observer handlers in presenters/views, exception handling in property browser, and robust resolution mapping in FitData to prevent crashes when ADS workspaces are removed.
Out of Scope Changes check ✅ Passed All changes directly support the crash-fix objective: ADS observers, resolution refactoring, workspace-name tracking, exception handling, and corresponding test updates are all in-scope for fixing ADS-removal crashes.
Description check ✅ Passed The PR description clearly explains the motivation (crashes when removing ADS workspaces), the two main changes (DataModel resolution handling and ADS observer synchronization), and references the closed issues.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch qens_fitting_crash

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🧹 Nitpick comments (6)
qt/widgets/spectroscopy/test/DataModelTest.h (1)

257-266: Clarify the "no workspaces without resolution" invariant.

The comment on line 264 states "There can't be workspaces without resolution", and the test verifies that removing all resolutions also clears all workspaces. This is an important design invariant for the convolution fitting workflow. Ensure this behavior is documented in the DataModel class or removeResolution method documentation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@qt/widgets/spectroscopy/test/DataModelTest.h` around lines 257 - 266,
Document the invariant that workspaces cannot exist without an associated
resolution in the DataModel API: update the DataModel class description and the
removeResolution(...) method docstring to state that removing all resolutions
will clear workspaceNames (see methods resolutionNames(), workspaceNames(),
updateWorkspaceNames()) and that removeResolution triggers this cleanup,
referencing the behavior tested in test_resolutions_reference. Make the doc
change concise, state the expected post-condition (workspaceNames empty if no
resolutions), and mention callers should not assume workspaces persist after
removals.
qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/IDataModel.h (1)

72-73: Consider clarifying the distinction between getResolutionNames() and resolutionNames().

The interface has two methods with similar names but different semantics:

  • getResolutionNames() (line 73): non-const, returns std::set<std::string> by value
  • resolutionNames() (line 87): const, returns const std::set<std::string>&

If getResolutionNames() computes/filters the names while resolutionNames() returns a cached set, consider renaming for clarity (e.g., computeResolutionNames() vs resolutionNames()), or add documentation to clarify the distinction.

Also applies to: 87-88

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/IDataModel.h` around
lines 72 - 73, The two similarly named methods getResolutionNames() and
resolutionNames() are confusing because getResolutionNames() is non-const and
returns a set by value while resolutionNames() is const and returns a const
reference; update the API to make the distinction explicit by either renaming
getResolutionNames() to something like computeResolutionNames() or
filteredResolutionNames() if it performs computation/filtering, or by adding
clear doc-comments above both declarations describing their semantics (e.g.,
"compute and return a new set of resolution names" vs "return cached resolution
names by reference") and ensure the chosen names/comments are applied
consistently for the pair resolutionNames() and getResolutionNames().
qt/scientific_interfaces/Inelastic/QENSFitting/FitDataPresenter.cpp (1)

54-64: Consider removing const qualifier from removeADSWorkspace.

This method is marked const but has observable side effects (removing workspaces and resolutions from the model). While technically valid C++ (the const applies to this, not m_model), it can be misleading to readers. Consider removing the const qualifier to better reflect the method's behavior.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@qt/scientific_interfaces/Inelastic/QENSFitting/FitDataPresenter.cpp` around
lines 54 - 64, The method FitDataPresenter::removeADSWorkspace is declared const
but mutates the model via m_model->removeWorkspaceByName and
m_model->removeResolution; remove the const qualifier from the method signature
so its declaration and definition reflect that it has side effects (update the
signature of removeADSWorkspace to be non-const wherever declared/defined,
keeping the existing logic and return value), and ensure any callers or
overrides compile after the change.
qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/DataModel.h (1)

73-90: Consider clarifying the difference between getResolutionNames() and resolutionNames().

There are two methods for obtaining resolution names:

  • getResolutionNames() (line 77): Returns a freshly computed std::set<std::string> by value
  • resolutionNames() (line 89): Returns const std::set<std::string>& to the cached m_uniqueResWsNames

This dual interface could lead to confusion. Consider either:

  1. Adding documentation to clarify when to use each
  2. Renaming one for clarity (e.g., computeResolutionNames() vs cachedResolutionNames())
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/DataModel.h` around
lines 73 - 90, The two similarly named APIs getResolutionNames() and
resolutionNames() are confusing because one returns a computed set by value and
the other returns a const reference to the cached m_uniqueResWsNames; rename
them to make intent explicit (e.g., rename getResolutionNames() ->
computeResolutionNames() and resolutionNames() -> cachedResolutionNames()) and
update all usages, or alternatively add clear doc-comments above both functions
explaining which returns a fresh set and which returns the cached reference and
reference m_uniqueResWsNames; ensure any public/consumer call sites are updated
(or provide a short deprecated wrapper if you must preserve the old names).
qt/widgets/spectroscopy/src/DataModel.cpp (2)

112-129: Consider simplifying the resolution lookup logic.

The nested conditionals and map lookups make this logic hard to follow. Consider extracting the resolution lookup into a helper function for clarity.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@qt/widgets/spectroscopy/src/DataModel.cpp` around lines 112 - 129, Refactor
DataModel::getResolutionsForFit by extracting the resolution lookup and
workspace-check logic into a private helper (e.g., resolveResolutionInfo or
isSingleHistogramResolution) that takes a const std::string& resName and returns
a pair<bool /*exists*/, bool /*singleHistogram*/>, then replace the inline
checkedResolutions handling inside the loop with calls to that helper and cache
results in a local unordered_map<string,bool> if needed; use
m_adsInstance.doesExist and
m_adsInstance.retrieveWS<Mantid::API::MatrixWorkspace> inside the helper and
keep the outer loop only responsible for building resolutionVector from the
helper’s result and the incoming spectrum.value.

51-56: Document or handle getWorkspaceID returning an out-of-bounds value.

When the workspace name is not found, getWorkspaceID returns a WorkspaceID with value equal to the container size (out-of-bounds). This is consistent with STL iterator semantics but could lead to subtle bugs if callers don't validate the result. Consider either:

  1. Adding a comment documenting this behavior
  2. Returning std::optional<WorkspaceID> to make the "not found" case explicit

The test at DataModelTest.h:81 documents this behavior, but the implementation itself has no indication.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@qt/widgets/spectroscopy/src/DataModel.cpp` around lines 51 - 56, The
getWorkspaceID method currently returns a WorkspaceID constructed from (iter -
names.cbegin()) which yields names.size() when not found; update the
implementation to make the "not found" case explicit: either add a clear comment
above DataModel::getWorkspaceID documenting that it returns a sentinel index
equal to container size when the name is missing, or change the API to return
std::optional<WorkspaceID> (adjusting callers and tests such as DataModelTest to
handle std::nullopt), i.e., detect if iter == names.cend() and then return
std::nullopt (or the documented sentinel) so callers cannot silently use an
out-of-bounds ID.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@qt/scientific_interfaces/Inelastic/QENSFitting/FitDataPresenter.cpp`:
- Around line 31-39: In FitDataPresenter::handleADSRename the concatenation for
the variable names produces a leading " , " when removedNew is false and
removedOld is true; change the construction to only insert the separator when
names is non-empty (e.g. build a small list of removed names or append with a
conditional that checks if names.empty() before adding " , "), leaving the
existing removedNew/removedOld checks, updateTab() call and the final
displayWarning("Data " + names + " was removed from the ADS.") intact so the
message never starts with a stray separator.
- Around line 270-273: Remove the temporary debug printing in
FitDataPresenter.cpp: delete the std::cout line inside the loop that iterates
over selectedIndices (the block using m_model->getSubIndices(index.row()) and
the variables wsId and wsIndex). Ensure no other leftover console/debug prints
remain in that loop; if needed, replace with appropriate logging calls or
silently proceed with the loop logic that follows.

In `@qt/scientific_interfaces/Inelastic/QENSFitting/FitDataPresenter.h`:
- Around line 34-36: The parameter order for handleADSRename is inconsistent:
IFitDataPresenter declares (const std::string &newName, const std::string
&oldName) but FitDataPresenter overrides handleADSRename(const std::string
&oldName, const std::string &newName). Change the IFitDataPresenter declaration
to match the ADS convention and the override by declaring virtual void
handleADSRename(const std::string &oldName, const std::string &newName) = 0; and
update any callers/implementations to use the (oldName, newName) ordering so all
declarations and overrides (IFitDataPresenter::handleADSRename and
FitDataPresenter::handleADSRename) are consistent.

In `@qt/scientific_interfaces/Inelastic/QENSFitting/FitDataView.cpp`:
- Around line 61-64: The rename parameter order is inverted:
FitDataView::renameHandle currently passes (newName, oldName) into
notifyADSRename which ultimately calls m_presenter->handleADSRename(newName,
oldName), while FitDataPresenter::handleADSRename is declared as (const
std::string &oldName, const std::string &newName) (and the base
AnalysisDataServiceObserver::renameHandle uses (wsName, newName) where wsName is
the old name). Fix by aligning parameter order—either change
FitDataView::renameHandle to invoke notifyADSRename with (oldName, newName) or
swap the arguments when calling m_presenter->handleADSRename inside
notifyADSRename so the presenter receives (oldName, newName); ensure the
signature of FitDataPresenter::handleADSRename remains (oldName, newName) to
match the base class.

In `@qt/scientific_interfaces/Inelastic/QENSFitting/FitDataView.h`:
- Around line 50-52: The override signature for renameHandle in FitDataView.h
uses parameter names newName and oldName but the base class
AnalysisDataServiceObserver defines renameHandle(const std::string &wsName,
const std::string &newName) where wsName is the old name; fix the header to
match the base by changing the parameter order/names to (const std::string
&oldName, const std::string &newName) or better (const std::string &wsName,
const std::string &newName) and then update the implementation in
FitDataView.cpp (the renameHandle method) to use the same parameter names and
semantics so the old workspace name is the first argument and the new name is
the second.

In
`@qt/scientific_interfaces/Inelastic/QENSFitting/InelasticFitPropertyBrowser.cpp`:
- Around line 428-439: The try block can leave the two browser presenters in a
partially-updated state because resetLocalParameters() is a no-op; save the
previous state for both m_functionBrowser and m_templatePresenter (e.g.,
previous nData/datasets/qValues/resolutions), then perform the updates
(setNumberOfDatasets, setDatasets, setQValues, setResolution) and if any
exception is thrown restore the saved state for both presenters (or clear them
to a known empty state) so the UI never remains partially updated; alternatively
make the update atomic by preparing all new data off-line and only calling the
setters once when ready, and ensure you call a meaningful recovery method on
both m_functionBrowser and m_templatePresenter (not just resetLocalParameters())
when catching Mantid::Kernel::Exception::NotFoundError.

In
`@qt/scientific_interfaces/Inelastic/test/QENSFitting/ConvolutionDataPresenterTest.h`:
- Around line 96-112: The tests test_setResolution_calls_to_model and
test_setResolution_has_bad_values use the workspace name "TestWS" but setUp()
registers "TestWs", causing mock string-matching failures; update the calls to
m_presenter->setResolution and the corresponding EXPECT_CALL/ON_CALL usages to
use the exact workspace name "TestWs" (i.e. change "TestWS" to "TestWs") so
m_model, m_view, removeSpecialValues, and displayWarning expectations match the
registered workspace name.

In `@qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/FitData.h`:
- Around line 57-60: FitData::combine() currently merges spectra, ranges and
exclude regions but neglects m_resolutions so incoming resolution assignments
are lost; update FitData::combine() to also merge other.m_resolutions into
this->m_resolutions (iterate other.m_resolutions and insert/assign each pair
into m_resolutions), choosing a conflict rule (e.g. overwrite existing entries
with the incoming value or skip if you want to keep originals) so
getResolutions() / getResolutionFromWsIndex() see the combined data; ensure any
related helper methods (getResolutions, getResolutionFromWsIndex,
removeResolutionEntry) remain consistent with the merged state.

In `@qt/widgets/spectroscopy/src/DataModel.cpp`:
- Around line 140-159: In DataModel::setResolution add a bounds check for
workspaceID before calling m_fittingData->at(workspaceID.value): validate that
workspaceID.value is within m_fittingData->size() (or the same guard logic used
in getWorkspace) and throw an appropriate std::out_of_range or
std::runtime_error with a clear message when invalid; only proceed to read the
resolution and call m_fittingData->at(...).setResolution(resName, spectra) after
the check to prevent out-of-range access.
- Around line 135-138: DataModel::setResolution(const std::string&, const
std::string&, const FunctionModelSpectra&) currently calls
getWorkspaceID(wsName) and delegates to the overload without checking the
returned workspace ID; since getWorkspaceID can return an invalid/out-of-range
value, first validate the workspace exists (e.g. check the optional/flag or
bounds returned by getWorkspaceID) before calling the workspaceID overload, and
if invalid return an error/false (or handle appropriately) instead of delegating
and risking access to m_fittingData in the workspaceID overload.

In `@qt/widgets/spectroscopy/src/FitData.cpp`:
- Around line 343-353: The membership check in FitData::setResolution currently
uses m_ranges but should use the canonical spectra container m_spectra (and the
overload calling setResolution for each spectrum) because setSpectra() updates
m_spectra not m_ranges; change the conditional in
FitData::setResolution(std::string const &wsName, WorkspaceIndex const
&spectrum) to test m_spectra.contains(spectrum) (or the appropriate lookup into
m_spectra) so added/removed spectra are respected, and ensure the batch overload
still delegates to that corrected single-spectrum setter.

---

Nitpick comments:
In `@qt/scientific_interfaces/Inelastic/QENSFitting/FitDataPresenter.cpp`:
- Around line 54-64: The method FitDataPresenter::removeADSWorkspace is declared
const but mutates the model via m_model->removeWorkspaceByName and
m_model->removeResolution; remove the const qualifier from the method signature
so its declaration and definition reflect that it has side effects (update the
signature of removeADSWorkspace to be non-const wherever declared/defined,
keeping the existing logic and return value), and ensure any callers or
overrides compile after the change.

In `@qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/DataModel.h`:
- Around line 73-90: The two similarly named APIs getResolutionNames() and
resolutionNames() are confusing because one returns a computed set by value and
the other returns a const reference to the cached m_uniqueResWsNames; rename
them to make intent explicit (e.g., rename getResolutionNames() ->
computeResolutionNames() and resolutionNames() -> cachedResolutionNames()) and
update all usages, or alternatively add clear doc-comments above both functions
explaining which returns a fresh set and which returns the cached reference and
reference m_uniqueResWsNames; ensure any public/consumer call sites are updated
(or provide a short deprecated wrapper if you must preserve the old names).

In `@qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/IDataModel.h`:
- Around line 72-73: The two similarly named methods getResolutionNames() and
resolutionNames() are confusing because getResolutionNames() is non-const and
returns a set by value while resolutionNames() is const and returns a const
reference; update the API to make the distinction explicit by either renaming
getResolutionNames() to something like computeResolutionNames() or
filteredResolutionNames() if it performs computation/filtering, or by adding
clear doc-comments above both declarations describing their semantics (e.g.,
"compute and return a new set of resolution names" vs "return cached resolution
names by reference") and ensure the chosen names/comments are applied
consistently for the pair resolutionNames() and getResolutionNames().

In `@qt/widgets/spectroscopy/src/DataModel.cpp`:
- Around line 112-129: Refactor DataModel::getResolutionsForFit by extracting
the resolution lookup and workspace-check logic into a private helper (e.g.,
resolveResolutionInfo or isSingleHistogramResolution) that takes a const
std::string& resName and returns a pair<bool /*exists*/, bool
/*singleHistogram*/>, then replace the inline checkedResolutions handling inside
the loop with calls to that helper and cache results in a local
unordered_map<string,bool> if needed; use m_adsInstance.doesExist and
m_adsInstance.retrieveWS<Mantid::API::MatrixWorkspace> inside the helper and
keep the outer loop only responsible for building resolutionVector from the
helper’s result and the incoming spectrum.value.
- Around line 51-56: The getWorkspaceID method currently returns a WorkspaceID
constructed from (iter - names.cbegin()) which yields names.size() when not
found; update the implementation to make the "not found" case explicit: either
add a clear comment above DataModel::getWorkspaceID documenting that it returns
a sentinel index equal to container size when the name is missing, or change the
API to return std::optional<WorkspaceID> (adjusting callers and tests such as
DataModelTest to handle std::nullopt), i.e., detect if iter == names.cend() and
then return std::nullopt (or the documented sentinel) so callers cannot silently
use an out-of-bounds ID.

In `@qt/widgets/spectroscopy/test/DataModelTest.h`:
- Around line 257-266: Document the invariant that workspaces cannot exist
without an associated resolution in the DataModel API: update the DataModel
class description and the removeResolution(...) method docstring to state that
removing all resolutions will clear workspaceNames (see methods
resolutionNames(), workspaceNames(), updateWorkspaceNames()) and that
removeResolution triggers this cleanup, referencing the behavior tested in
test_resolutions_reference. Make the doc change concise, state the expected
post-condition (workspaceNames empty if no resolutions), and mention callers
should not assume workspaces persist after removals.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d94fd236-141c-470c-85ff-74349ae469d7

📥 Commits

Reviewing files that changed from the base of the PR and between 19dd760 and 958ea33.

📒 Files selected for processing (20)
  • qt/scientific_interfaces/Inelastic/QENSFitting/ConvolutionDataPresenter.cpp
  • qt/scientific_interfaces/Inelastic/QENSFitting/ConvolutionDataPresenter.h
  • qt/scientific_interfaces/Inelastic/QENSFitting/FitDataPresenter.cpp
  • qt/scientific_interfaces/Inelastic/QENSFitting/FitDataPresenter.h
  • qt/scientific_interfaces/Inelastic/QENSFitting/FitDataView.cpp
  • qt/scientific_interfaces/Inelastic/QENSFitting/FitDataView.h
  • qt/scientific_interfaces/Inelastic/QENSFitting/FittingModel.cpp
  • qt/scientific_interfaces/Inelastic/QENSFitting/FunctionQDataPresenter.h
  • qt/scientific_interfaces/Inelastic/QENSFitting/InelasticFitPropertyBrowser.cpp
  • qt/scientific_interfaces/Inelastic/test/QENSFitting/ConvolutionDataPresenterTest.h
  • qt/scientific_interfaces/Inelastic/test/QENSFitting/FitDataPresenterTest.h
  • qt/widgets/common/src/ConvolutionFunctionModel.cpp
  • qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/DataModel.h
  • qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/FitData.h
  • qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/IDataModel.h
  • qt/widgets/spectroscopy/inc/MantidQtWidgets/Spectroscopy/MockObjects.h
  • qt/widgets/spectroscopy/src/DataModel.cpp
  • qt/widgets/spectroscopy/src/FitData.cpp
  • qt/widgets/spectroscopy/test/DataModelTest.h
  • qt/widgets/spectroscopy/test/FitDataTest.h

- Main change was some name inconsistencies between old and new name  when overriding handleRename from the observers
@adriazalvarez adriazalvarez marked this pull request as ready for review March 31, 2026 06:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Bug Issues and pull requests that are regressions or would be considered a bug by users (e.g. crashing) ISIS: Spectroscopy Issue and pull requests relating to Muons, Indirect and Inelastic at ISIS

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

Crash on clearing workspaces in QENS tab

1 participant