Source code for mantidimaging.gui.windows.spectrum_viewer.presenter
# Copyright (C) 2022 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from typing import TYPE_CHECKING, Optional
from mantidimaging.core.data.dataset import StrictDataset
from mantidimaging.gui.mvp_base import BasePresenter
from mantidimaging.gui.windows.spectrum_viewer.model import SpectrumViewerWindowModel, SpecType
if TYPE_CHECKING:
from mantidimaging.gui.windows.spectrum_viewer.view import SpectrumViewerWindowView # pragma: no cover
from mantidimaging.gui.windows.main.view import MainWindowView # pragma: no cover
from mantidimaging.core.data import ImageStack
from uuid import UUID
[docs]
class SpectrumViewerWindowPresenter(BasePresenter):
view: 'SpectrumViewerWindowView'
model: SpectrumViewerWindowModel
spectrum_mode: SpecType = SpecType.SAMPLE
current_stack_uuid: Optional['UUID'] = None
current_norm_stack_uuid: Optional['UUID'] = None
def __init__(self, view: 'SpectrumViewerWindowView', main_window: 'MainWindowView'):
super().__init__(view)
self.view = view
self.main_window = main_window
self.model = SpectrumViewerWindowModel(self)
[docs]
def handle_sample_change(self, uuid: Optional['UUID']) -> None:
if uuid == self.current_stack_uuid:
return
else:
self.current_stack_uuid = uuid
new_dataset_id = self.get_dataset_id_for_stack(uuid)
if new_dataset_id:
self.auto_find_flat_stack(new_dataset_id)
else:
self.view.current_dataset_id = None
if uuid is None:
self.model.set_stack(None)
self.view.clear()
return
self.model.set_stack(self.main_window.get_stack(uuid))
normalise_uuid = self.view.get_normalise_stack()
if normalise_uuid is not None:
try:
norm_stack: Optional['ImageStack'] = self.main_window.get_stack(normalise_uuid)
except RuntimeError:
norm_stack = None
self.model.set_normalise_stack(norm_stack)
self.view.set_normalise_error(self.model.normalise_issue())
self.show_new_sample()
[docs]
def handle_normalise_stack_change(self, normalise_uuid: Optional['UUID']) -> None:
if normalise_uuid == self.current_norm_stack_uuid:
return
else:
self.current_norm_stack_uuid = normalise_uuid
if normalise_uuid is None:
self.model.set_normalise_stack(None)
return
self.model.set_normalise_stack(self.main_window.get_stack(normalise_uuid))
self.view.set_normalise_error(self.model.normalise_issue())
self.handle_roi_moved()
[docs]
def auto_find_flat_stack(self, new_dataset_id):
if self.view.current_dataset_id != new_dataset_id:
self.view.current_dataset_id = new_dataset_id
new_dataset = self.main_window.get_dataset(new_dataset_id)
if isinstance(new_dataset, StrictDataset):
if new_dataset.flat_before is not None:
self.view.try_to_select_relevant_normalise_stack(new_dataset.flat_before.name)
elif new_dataset.flat_after is not None:
self.view.try_to_select_relevant_normalise_stack(new_dataset.flat_after.name)
[docs]
def get_dataset_id_for_stack(self, stack_id: Optional['UUID']) -> Optional['UUID']:
return None if stack_id is None else self.main_window.get_dataset_id_from_stack_uuid(stack_id)
[docs]
def show_new_sample(self) -> None:
self.view.set_image(self.model.get_averaged_image())
self.view.set_spectrum(self.model.get_spectrum("roi", self.spectrum_mode))
self.view.spectrum.add_range(*self.model.tof_range)
self.view.spectrum.add_roi(self.model.get_roi("roi"))
self.view.auto_range_image()
[docs]
def handle_range_slide_moved(self, tof_range) -> None:
self.model.tof_range = tof_range
self.view.set_image(self.model.get_averaged_image(), autoLevels=False)
[docs]
def handle_roi_moved(self) -> None:
roi = self.view.spectrum.get_roi()
self.model.set_roi("roi", roi)
self.view.set_spectrum(self.model.get_spectrum("roi", self.spectrum_mode))
[docs]
def handle_export_csv(self) -> None:
path = self.view.get_csv_filename()
if path is None:
return
if path.suffix != ".csv":
path = path.with_suffix(".csv")
self.model.save_csv(path, self.spectrum_mode == SpecType.SAMPLE_NORMED)
[docs]
def handle_enable_normalised(self, enabled: bool) -> None:
if enabled:
self.spectrum_mode = SpecType.SAMPLE_NORMED
else:
self.spectrum_mode = SpecType.SAMPLE
self.handle_roi_moved()
self.view.display_normalise_error()