Source code for mantidimaging.gui.windows.spectrum_viewer.view

# Copyright (C) 2022 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from pathlib import Path
from typing import TYPE_CHECKING, Optional

from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QCheckBox, QVBoxLayout, QFileDialog, QPushButton, QLabel

from mantidimaging.core.utility import finder
from mantidimaging.gui.mvp_base import BaseMainWindowView
from mantidimaging.gui.widgets.dataset_selector import DatasetSelectorWidgetView
from .presenter import SpectrumViewerWindowPresenter
from .spectrum_widget import SpectrumWidget

if TYPE_CHECKING:
    from mantidimaging.gui.windows.main import MainWindowView  # noqa:F401  # pragma: no cover
    from uuid import UUID
    import numpy as np


[docs] class SpectrumViewerWindowView(BaseMainWindowView): sampleStackSelector: DatasetSelectorWidgetView normaliseStackSelector: DatasetSelectorWidgetView normaliseCheckBox: QCheckBox imageLayout: QVBoxLayout exportButton: QPushButton normaliseErrorIcon: QLabel _current_dataset_id: Optional['UUID'] normalise_error_issue: str = "" def __init__(self, main_window: 'MainWindowView'): super().__init__(main_window, 'gui/ui/spectrum_viewer.ui') self.main_window = main_window icon_path = finder.ROOT_PATH + "/gui/ui/images/exclamation-triangle-red.png" self.normalise_error_icon_pixmap = QPixmap(icon_path) self.presenter = SpectrumViewerWindowPresenter(self, main_window) self.spectrum = SpectrumWidget(self) self.imageLayout.addWidget(self.spectrum) self.spectrum.range_changed.connect(self.presenter.handle_range_slide_moved) self.spectrum.roi_changed.connect(self.presenter.handle_roi_moved) self._current_dataset_id = None self.sampleStackSelector.stack_selected_uuid.connect(self.presenter.handle_sample_change) self.normaliseStackSelector.stack_selected_uuid.connect(self.presenter.handle_normalise_stack_change) self.normaliseCheckBox.stateChanged.connect(self.set_normalise_dropdown_state) self.normaliseCheckBox.stateChanged.connect(self.presenter.handle_enable_normalised) self._configure_dropdown(self.sampleStackSelector) self._configure_dropdown(self.normaliseStackSelector) self.sampleStackSelector.select_eligible_stack() self.try_to_select_relevant_normalise_stack("Flat") self.exportButton.clicked.connect(self.presenter.handle_export_csv)
[docs] def cleanup(self): self.sampleStackSelector.unsubscribe_from_main_window() self.normaliseStackSelector.unsubscribe_from_main_window() self.main_window.spectrum_viewer = None
@property def current_dataset_id(self) -> Optional['UUID']: return self._current_dataset_id @current_dataset_id.setter def current_dataset_id(self, uuid: Optional['UUID']) -> None: self._current_dataset_id = uuid def _configure_dropdown(self, selector: DatasetSelectorWidgetView) -> None: selector.presenter.show_stacks = True selector.subscribe_to_main_window(self.main_window)
[docs] def set_normalise_dropdown_state(self) -> None: if self.normaliseCheckBox.isChecked(): self.normaliseStackSelector.setEnabled(True) else: self.normaliseStackSelector.setEnabled(False)
[docs] def try_to_select_relevant_normalise_stack(self, name: str) -> None: self.normaliseStackSelector.try_to_select_relevant_stack(name)
[docs] def get_normalise_stack(self) -> Optional['UUID']: return self.normaliseStackSelector.current()
[docs] def get_csv_filename(self) -> Optional[Path]: path = QFileDialog.getSaveFileName(self, "Save CSV file", "", "CSV file (*.csv)")[0] if path: return Path(path) else: return None
[docs] def set_image(self, image_data: Optional['np.ndarray'], autoLevels: bool = True): self.spectrum.image.setImage(image_data, autoLevels=autoLevels)
[docs] def set_spectrum(self, spectrum_data: 'np.ndarray'): self.spectrum.spectrum.clearPlots() self.spectrum.spectrum.plot(spectrum_data)
[docs] def clear(self) -> None: self.spectrum.clear_data()
[docs] def auto_range_image(self): self.spectrum.image.vb.autoRange()
[docs] def set_normalise_error(self, norm_issue: str): self.normalise_error_issue = norm_issue self.display_normalise_error()
[docs] def display_normalise_error(self): if self.normalise_error_issue and self.normaliseCheckBox.isChecked(): self.normaliseErrorIcon.setPixmap(self.normalise_error_icon_pixmap) self.normaliseErrorIcon.setToolTip(self.normalise_error_issue) else: self.normaliseErrorIcon.setPixmap(QPixmap()) self.normaliseErrorIcon.setToolTip("")