diff --git a/mantidimaging/gui/test/gui_system_loading_test.py b/mantidimaging/gui/test/gui_system_loading_test.py index 9b0f634166a..1d9792c2e5c 100644 --- a/mantidimaging/gui/test/gui_system_loading_test.py +++ b/mantidimaging/gui/test/gui_system_loading_test.py @@ -64,36 +64,6 @@ def _click_stack_selector(cls): def test_load_images(self): self._load_images() - @mock.patch("mantidimaging.gui.windows.main.MainWindowView._get_file_name") - def test_load_180(self, mocked_select_file): - path_180 = Path(LOAD_SAMPLE).parents[1] / "180deg" / "IMAT_Flower_180deg_000000.tif" - mocked_select_file.return_value = path_180 - self.assertEqual(len(self.main_window.presenter.get_active_stack_visualisers()), 0) - self._load_data_set() - stacks = self.main_window.presenter.get_active_stack_visualisers() - self.assertEqual(len(self.main_window.presenter.get_active_stack_visualisers()), 5) - - # Remove existing 180 - proj180deg_entry = self.main_window.dataset_tree_widget.findItems("180", Qt.MatchFlag.MatchRecursive) - self.assertEqual(len(proj180deg_entry), 1) - self.main_window.dataset_tree_widget.setCurrentItem(proj180deg_entry[0]) - self.main_window._delete_container() - - self.assertFalse(stacks[0].presenter.images.has_proj180deg()) - self.assertEqual(len(self.main_window.presenter.get_active_stack_visualisers()), 4) - - # load new 180 - QTimer.singleShot(SHORT_DELAY, lambda: self._click_stack_selector()) - self.main_window.actionLoad180deg.trigger() - - wait_until(lambda: len(self.main_window.presenter.get_active_stack_visualisers()) == 5) - - stacks_after = self.main_window.presenter.get_active_stack_visualisers() - self.assertEqual(len(stacks_after), 5) - self.assertIn(stacks[0], stacks_after) - self.assertTrue(stacks[0].presenter.images.has_proj180deg()) - self._check_datasets_consistent() - def _get_log_angle(self, log_path): with open(log_path) as log_file: for line in log_file: diff --git a/mantidimaging/gui/ui/main_window.ui b/mantidimaging/gui/ui/main_window.ui index 3d2b555b043..7744e78dce3 100644 --- a/mantidimaging/gui/ui/main_window.ui +++ b/mantidimaging/gui/ui/main_window.ui @@ -40,7 +40,6 @@ - @@ -191,13 +190,13 @@ - - false - - - Load ShutterCounts file for stack... - - + + false + + + Load ShutterCounts file for stack... + + false diff --git a/mantidimaging/gui/windows/add_images_to_dataset_dialog/view.py b/mantidimaging/gui/windows/add_images_to_dataset_dialog/view.py index 373ad19f879..b740a9a96df 100644 --- a/mantidimaging/gui/windows/add_images_to_dataset_dialog/view.py +++ b/mantidimaging/gui/windows/add_images_to_dataset_dialog/view.py @@ -23,7 +23,7 @@ def __init__(self, parent, dataset_id: uuid.UUID, dataset_name: str): self._dataset_id = dataset_id self.imageTypeComboBox.addItems( - ["Sample", "Flat Before", "Flat After", "Dark Before", "Dark After", "Recon", "Images"]) + ["Sample", "Flat Before", "Flat After", "Dark Before", "Dark After", "Recon", "Images", "Proj 180"]) self.datasetNameText.setText(dataset_name) self.chooseFileButton.clicked.connect(self.choose_file_path) diff --git a/mantidimaging/gui/windows/main/model.py b/mantidimaging/gui/windows/main/model.py index 500a2ba0fac..1bd8283fe64 100644 --- a/mantidimaging/gui/windows/main/model.py +++ b/mantidimaging/gui/windows/main/model.py @@ -112,23 +112,6 @@ def get_existing_180_id(self, dataset_id: uuid.UUID) -> uuid.UUID | None: return dataset.proj180deg.id return None - def add_180_deg_to_dataset(self, dataset_id: uuid.UUID, _180_deg_file: str) -> ImageStack: - """ - Loads the 180 projection and adds this to a given Dataset ID. - :param dataset_id: The ID of the Dataset. - :param _180_deg_file: The location of the 180 projection. - :return: The loaded 180 ImageStack object. - """ - dataset = self.datasets.get(dataset_id) - if not dataset: - raise RuntimeError(f"Failed to get Dataset with ID {dataset_id}") - if not dataset.sample: - raise RuntimeError(f"Dataset with ID {dataset_id} does not have a sample") - - _180_deg = loader.load_stack_from_group(FilenameGroup.from_file(_180_deg_file)) - dataset.proj180deg = _180_deg - return _180_deg - def add_projection_angles_to_sample(self, images_id: uuid.UUID, proj_angles: ProjectionAngles) -> None: images = self.get_images_by_uuid(images_id) if images is None: diff --git a/mantidimaging/gui/windows/main/presenter.py b/mantidimaging/gui/windows/main/presenter.py index 60435c1d787..d9929eff49c 100644 --- a/mantidimaging/gui/windows/main/presenter.py +++ b/mantidimaging/gui/windows/main/presenter.py @@ -398,15 +398,6 @@ def get_stack_with_images(self, images: ImageStack) -> StackVisualiserView: return sv raise RuntimeError(f"Did not find stack {images} in stacks! Stacks: {self.stack_visualisers.items()}") - def add_180_deg_file_to_dataset(self, dataset_id: uuid.UUID, _180_deg_file: str) -> None: - """ - Loads a 180 file then adds it to the dataset, creates a stack window, and updates the dataset tree view. - :param dataset_id: The ID of the dataset to update. - :param _180_deg_file: The filename for the 180 file. - """ - proj180deg = self.model.add_180_deg_to_dataset(dataset_id, _180_deg_file) - self.add_images_to_existing_dataset(dataset_id, proj180deg, "proj_180") - def add_projection_angles_to_sample(self, stack_id: uuid.UUID, proj_angles: ProjectionAngles) -> None: self.model.add_projection_angles_to_sample(stack_id, proj_angles) diff --git a/mantidimaging/gui/windows/main/test/model_test.py b/mantidimaging/gui/windows/main/test/model_test.py index 161c3b67731..60c630ea864 100644 --- a/mantidimaging/gui/windows/main/test/model_test.py +++ b/mantidimaging/gui/windows/main/test/model_test.py @@ -217,30 +217,6 @@ def test_add_log_to_sample_no_stack(self, load_log: mock.Mock): stack_mock.assert_called_with(images_id) - @mock.patch('mantidimaging.core.io.loader.load_stack_from_group') - def test_add_180_deg_to_dataset(self, load: mock.Mock): - _180_file = "180 file" - dataset_id = "id" - self.model.datasets[dataset_id] = dataset_mock = StrictDataset(sample=generate_images()) - load.return_value = _180_stack = generate_images() - self.model.add_180_deg_to_dataset(dataset_id=dataset_id, _180_deg_file=_180_file) - - load_arg = load.call_args[0][0] - self.assertEqual(load_arg.first_file().name, _180_file) - self.assertEqual(_180_stack, dataset_mock.proj180deg) - - @mock.patch('mantidimaging.core.io.loader.load') - def test_add_180_deg_to_dataset_no_dataset(self, load: mock.Mock): - """ - Test in add_180_deg_to_stack when get_images_by_uuid returns None - """ - _180_file = "180 file" - dataset_id = "id" - self.assertRaises(RuntimeError, - self.model.add_180_deg_to_dataset, - dataset_id=dataset_id, - _180_deg_file=_180_file) - def test_add_projection_angles_to_sample_no_stack(self): proj_angles = ProjectionAngles(np.arange(0, 10)) images_id = "id" diff --git a/mantidimaging/gui/windows/main/test/presenter_test.py b/mantidimaging/gui/windows/main/test/presenter_test.py index fa937f07529..2b9f7ac66f3 100644 --- a/mantidimaging/gui/windows/main/test/presenter_test.py +++ b/mantidimaging/gui/windows/main/test/presenter_test.py @@ -259,30 +259,6 @@ def test_get_stack_with_images_failure(self): with self.assertRaises(RuntimeError): self.presenter.get_stack_with_images(generate_images()) - def test_add_first_180_deg_to_dataset(self): - self.model.datasets[self.dataset.id] = self.dataset - filename_for_180 = "path/to/180" - self.model.get_existing_180_id.return_value = None - self.model.add_180_deg_to_dataset.return_value = _180_deg = generate_images((1, 200, 200)) - self.presenter.add_images_to_existing_dataset = mock.Mock() - - self.presenter.add_180_deg_file_to_dataset(self.dataset.id, filename_for_180) - self.model.add_180_deg_to_dataset.assert_called_once_with(self.dataset.id, filename_for_180) - self.presenter.add_images_to_existing_dataset.assert_called_once_with(self.dataset.id, _180_deg, "proj_180") - - def test_replace_180_deg_in_dataset(self): - self.model.datasets[self.dataset.id] = self.dataset - dataset_id = self.dataset.id - filename_for_180 = "path/to/180" - self.model.get_existing_180_id.return_value = existing_180_id = "prev-id" - self.presenter.stack_visualisers[existing_180_id] = existing_180_stack = mock.Mock() - self.model.add_180_deg_to_dataset.return_value = _180_deg = generate_images((1, 200, 200)) - - self.presenter.add_180_deg_file_to_dataset(dataset_id, filename_for_180) - self.model.add_180_deg_to_dataset.assert_called_once_with(dataset_id, filename_for_180) - self.assertNotIn(existing_180_stack, self.presenter.stack_visualisers) - self.view.model_changed.emit.assert_called_once() - def test_add_projection_angles_to_stack(self): id, angles = "doesn't-exist", ProjectionAngles(np.ndarray([1])) self.presenter.add_projection_angles_to_sample(id, angles) diff --git a/mantidimaging/gui/windows/main/test/view_test.py b/mantidimaging/gui/windows/main/test/view_test.py index db8b467107c..090320605cb 100644 --- a/mantidimaging/gui/windows/main/test/view_test.py +++ b/mantidimaging/gui/windows/main/test/view_test.py @@ -43,28 +43,6 @@ def test_execute_save(self): self.presenter.notify.assert_called_once_with(PresNotification.IMAGE_FILE_SAVE) - @mock.patch("mantidimaging.gui.windows.main.view.DatasetSelectorDialog") - @mock.patch("mantidimaging.gui.windows.main.view.QFileDialog.getOpenFileName") - def test_load_180_deg_dialog(self, get_open_file_name: mock.Mock, dataset_selector_dialog: mock.Mock): - dataset_selector_dialog.return_value.exec.return_value = QDialog.DialogCode.Accepted - dataset_id = "dataset-id" - dataset_selector_dialog.return_value.selected_id = dataset_id - selected_file = "~/home/test/directory/selected_file.tif" - get_open_file_name.return_value = (selected_file, None) - _180_dataset = mock.MagicMock() - self.presenter.add_180_deg_file_to_dataset.return_value = _180_dataset - - self.view.load_180_deg_dialog() - - dataset_selector_dialog.assert_called_once_with(main_window=self.view, - title='Dataset Selector', - message="Which dataset is the 180 projection being loaded for?") - get_open_file_name.assert_called_once_with(caption="180 Degree Image", - filter="Image File (*.tif *.tiff);;All (*.*)", - initialFilter="Image File (*.tif *.tiff)") - self.presenter.add_180_deg_file_to_dataset.assert_called_once_with(dataset_id=dataset_id, - _180_deg_file=selected_file) - def test_execute_load(self): self.view.execute_image_file_load() @@ -214,7 +192,6 @@ def test_update_shortcuts_with_presenter_with_no_stacks(self): def _update_shortcuts_test(self, original_state, has_stacks): self.view.actionSaveImages.setEnabled(original_state) self.view.actionSampleLoadLog.setEnabled(original_state) - self.view.actionLoad180deg.setEnabled(original_state) self.view.actionLoadProjectionAngles.setEnabled(original_state) self.view.menuWorkflow.setEnabled(original_state) self.view.menuImage.setEnabled(original_state) @@ -223,7 +200,6 @@ def _update_shortcuts_test(self, original_state, has_stacks): self.assertEqual(has_stacks, self.view.actionSaveImages.isEnabled()) self.assertEqual(has_stacks, self.view.actionSampleLoadLog.isEnabled()) - self.assertEqual(has_stacks, self.view.actionLoad180deg.isEnabled()) self.assertEqual(has_stacks, self.view.actionLoadProjectionAngles.isEnabled()) self.assertEqual(has_stacks, self.view.menuWorkflow.isEnabled()) self.assertEqual(has_stacks, self.view.menuImage.isEnabled()) diff --git a/mantidimaging/gui/windows/main/view.py b/mantidimaging/gui/windows/main/view.py index c2893a01e20..ec5cfcb3b49 100644 --- a/mantidimaging/gui/windows/main/view.py +++ b/mantidimaging/gui/windows/main/view.py @@ -89,7 +89,6 @@ class MainWindowView(BaseMainWindowView): actionSampleLoadLog: QAction actionShutterCounts: QAction actionLoadProjectionAngles: QAction - actionLoad180deg: QAction actionLoadDataset: QAction actionLoadImages: QAction actionLoadNeXusFile: QAction @@ -188,7 +187,6 @@ def setup_shortcuts(self) -> None: self.actionLoadNeXusFile.triggered.connect(self.show_nexus_load_dialog) self.actionSampleLoadLog.triggered.connect(self.load_sample_log_dialog) self.actionShutterCounts.triggered.connect(self.load_shuttercounts_dialog) - self.actionLoad180deg.triggered.connect(self.load_180_deg_dialog) self.actionLoadProjectionAngles.triggered.connect(self.load_projection_angles) self.actionSaveImages.triggered.connect(self.show_image_save_dialog) self.actionSaveNeXusFile.triggered.connect(self.show_nexus_save_dialog) @@ -232,7 +230,6 @@ def update_shortcuts(self) -> None: self.actionSaveNeXusFile.setEnabled(has_datasets) self.actionSampleLoadLog.setEnabled(has_datasets) self.actionShutterCounts.setEnabled(has_datasets) - self.actionLoad180deg.setEnabled(has_datasets) self.actionLoadProjectionAngles.setEnabled(has_datasets) self.menuWorkflow.setEnabled(has_datasets) self.menuImage.setEnabled(has_datasets) @@ -347,28 +344,6 @@ def load_shuttercounts_dialog(self) -> None: if self.spectrum_viewer: self.spectrum_viewer.handle_shuttercount_change() - def load_180_deg_dialog(self) -> None: - dataset_selector = DatasetSelectorDialog(main_window=self, - title="Dataset Selector", - message="Which dataset is the 180 projection being loaded for?") - # Was closed without accepting (e.g. via x button or ESC) - if QDialog.DialogCode.Accepted != dataset_selector.exec(): - return - dataset_to_add_180_deg_to = dataset_selector.selected_id - - if dataset_to_add_180_deg_to is None: - QMessageBox.critical(self, "Error", "No dataset selected.") - return - - # Open file dialog - selected_file = self._get_file_name("180 Degree Image", "Image File (*.tif *.tiff)") - - # Cancel/Close was clicked - if selected_file == "": - return - - self.presenter.add_180_deg_file_to_dataset(dataset_id=dataset_to_add_180_deg_to, _180_deg_file=selected_file) - LOAD_PROJECTION_ANGLES_DIALOG_MESSAGE = "Which stack are the projection angles in DEGREES being loaded for?" LOAD_PROJECTION_ANGLES_FILE_DIALOG_CAPTION = "File with projection angles in DEGREES"