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("")