Skip to content

Commit 1c1e090

Browse files
Unify datasets part 5 (#2323)
2 parents 1d27e84 + 4cb12ea commit 1c1e090

File tree

10 files changed

+72
-101
lines changed

10 files changed

+72
-101
lines changed

mantidimaging/core/data/dataset.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def remove_nones(image_stacks: list[ImageStack | None]) -> list[ImageStack]:
2222
return [image_stack for image_stack in image_stacks if image_stack is not None]
2323

2424

25-
class BaseDataset:
25+
class Dataset:
2626

2727
def __init__(
2828
self,
@@ -185,15 +185,15 @@ def is_processed(self) -> bool:
185185
return False
186186

187187

188-
class MixedDataset(BaseDataset):
188+
class MixedDataset(Dataset):
189189
pass
190190

191191

192-
class StrictDataset(BaseDataset):
192+
class StrictDataset(Dataset):
193193
pass
194194

195195

196-
def _get_stack_data_type(stack_id: uuid.UUID, dataset: BaseDataset) -> str:
196+
def _get_stack_data_type(stack_id: uuid.UUID, dataset: Dataset) -> str:
197197
"""
198198
Find the data type as a string of a stack.
199199
:param stack_id: The ID of the stack.

mantidimaging/core/data/test/dataset_test.py

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import numpy as np
1010

1111
from mantidimaging.core.data import ImageStack
12-
from mantidimaging.core.data.dataset import BaseDataset, _get_stack_data_type
12+
from mantidimaging.core.data.dataset import Dataset, _get_stack_data_type
1313
from mantidimaging.core.utility.data_containers import ProjectionAngles, FILE_TYPES
1414
from mantidimaging.test_helpers.unit_test_helper import generate_images
1515

@@ -19,11 +19,11 @@ def _make_standard_dataset(shape=(2, 5, 5)):
1919
image_stacks = [generate_images(shape) for _ in range(6)]
2020
image_stacks[0].name = "samplename"
2121

22-
ds = BaseDataset(sample=image_stacks[0],
23-
flat_before=image_stacks[1],
24-
flat_after=image_stacks[2],
25-
dark_before=image_stacks[3],
26-
dark_after=image_stacks[4])
22+
ds = Dataset(sample=image_stacks[0],
23+
flat_before=image_stacks[1],
24+
flat_after=image_stacks[2],
25+
dark_before=image_stacks[3],
26+
dark_after=image_stacks[4])
2727
ds.proj180deg = image_stacks[5]
2828
return ds, image_stacks
2929

@@ -41,19 +41,19 @@ def _set_fake_projection_angles(image_stack: ImageStack):
4141
class DatasetTest(unittest.TestCase):
4242

4343
def test_create_dataset(self):
44-
ds = BaseDataset()
44+
ds = Dataset()
4545
self.assertIsInstance(ds.id, uuid.UUID)
4646
self.assertEqual(ds.name, "")
4747

4848
def test_prevent_positional_parameters(self):
49-
self.assertRaises(TypeError, BaseDataset, mock.Mock())
49+
self.assertRaises(TypeError, Dataset, mock.Mock())
5050

5151
def test_dataset_name(self):
52-
ds = BaseDataset(name="a_dataset")
52+
ds = Dataset(name="a_dataset")
5353
self.assertEqual(ds.name, "a_dataset")
5454

5555
def test_add_recon(self):
56-
ds = BaseDataset()
56+
ds = Dataset()
5757
recons = [generate_images() for _ in range(3)]
5858
[ds.add_recon(r) for r in recons]
5959

@@ -62,7 +62,7 @@ def test_add_recon(self):
6262
self.assertEqual(3, len(ds.recons))
6363

6464
def test_delete_recon(self):
65-
ds = BaseDataset()
65+
ds = Dataset()
6666
recons = [generate_images() for _ in range(3)]
6767
[ds.add_recon(r) for r in recons]
6868

@@ -71,36 +71,36 @@ def test_delete_recon(self):
7171
self.assertNotIn(recons[-1], ds.all)
7272

7373
def test_delete_failure(self):
74-
ds = BaseDataset()
74+
ds = Dataset()
7575
with self.assertRaises(KeyError):
7676
ds.delete_stack("nonexistent-id")
7777

7878
def test_delete_all_recons(self):
79-
ds = BaseDataset()
79+
ds = Dataset()
8080
recons = [generate_images() for _ in range(3)]
8181
[ds.add_recon(r) for r in recons]
8282
ds.delete_recons()
8383
self.assertListEqual(ds.recons.stacks, [])
8484

8585
def test_sinograms(self):
86-
ds = BaseDataset()
86+
ds = Dataset()
8787
ds.sinograms = sinograms = generate_images()
8888
self.assertIs(ds.sinograms, sinograms)
8989

9090
def test_delete_sinograms(self):
91-
ds = BaseDataset()
91+
ds = Dataset()
9292
ds.sinograms = sinograms = generate_images()
9393
ds.delete_stack(sinograms.id)
9494
self.assertIsNone(ds.sinograms)
9595

9696
def test_stacks_in_all(self):
9797
image_stacks = [mock.Mock() for _ in range(3)]
98-
ds = BaseDataset(stacks=image_stacks)
98+
ds = Dataset(stacks=image_stacks)
9999
self.assertListEqual(ds.all, image_stacks)
100100

101101
def test_sample_in_all(self):
102102
image_sample = mock.Mock(proj180deg=None)
103-
ds = BaseDataset(sample=image_sample)
103+
ds = Dataset(sample=image_sample)
104104
self.assertCountEqual(ds.all, [image_sample])
105105

106106
def test_all_for_full_dataset(self):
@@ -111,27 +111,27 @@ def test_all_for_full_dataset(self):
111111

112112
def test_delete_stack_from_stacks_list(self):
113113
image_stacks = [mock.Mock() for _ in range(3)]
114-
ds = BaseDataset(stacks=image_stacks)
114+
ds = Dataset(stacks=image_stacks)
115115
prev_stacks = image_stacks.copy()
116116
ds.delete_stack(image_stacks[-1].id)
117117
self.assertListEqual(ds.all, prev_stacks[:-1])
118118

119119
def test_get_stack_data_type_returns_recon(self):
120120
recon = generate_images()
121121
recon_id = recon.id
122-
dataset = BaseDataset()
122+
dataset = Dataset()
123123
dataset.recons.append(recon)
124124
self.assertEqual(_get_stack_data_type(recon_id, dataset), "Recon")
125125

126126
def test_get_stack_data_type_returns_images(self):
127127
images = generate_images()
128128
images_id = images.id
129-
dataset = BaseDataset(stacks=[images])
129+
dataset = Dataset(stacks=[images])
130130
self.assertEqual(_get_stack_data_type(images_id, dataset), "Images")
131131

132132
def test_attribute_not_set_returns_none(self):
133133
sample = mock.Mock()
134-
dataset = BaseDataset(sample=sample)
134+
dataset = Dataset(sample=sample)
135135

136136
self.assertIsNone(dataset.flat_before)
137137
self.assertIsNone(dataset.flat_after)
@@ -140,7 +140,7 @@ def test_attribute_not_set_returns_none(self):
140140

141141
def test_set_flat_before(self):
142142
sample = mock.Mock()
143-
dataset = BaseDataset(sample=sample)
143+
dataset = Dataset(sample=sample)
144144
flat_before = mock.Mock(id="1234")
145145
dataset.flat_before = flat_before
146146
self.assertIs(flat_before, dataset.flat_before)
@@ -258,21 +258,21 @@ def test_delete_dark_after(self):
258258
self.assertIsNone(ds.dark_after)
259259

260260
def test_set_stack_by_type_sample(self):
261-
ds = BaseDataset()
261+
ds = Dataset()
262262
sample = mock.Mock()
263263
ds.set_stack(FILE_TYPES.SAMPLE, sample)
264264

265265
self.assertEqual(ds.sample, sample)
266266

267267
def test_set_stack_by_type_flat_before(self):
268-
ds = BaseDataset()
268+
ds = Dataset()
269269
stack = mock.Mock()
270270
ds.set_stack(FILE_TYPES.FLAT_BEFORE, stack)
271271

272272
self.assertEqual(ds.flat_before, stack)
273273

274274
def test_set_stack_by_type_180(self):
275-
ds = BaseDataset()
275+
ds = Dataset()
276276
sample = mock.Mock()
277277
stack = mock.Mock()
278278
ds.set_stack(FILE_TYPES.SAMPLE, sample)
@@ -281,10 +281,10 @@ def test_set_stack_by_type_180(self):
281281
self.assertEqual(ds.proj180deg, stack)
282282

283283
def test_processed_is_true(self):
284-
ds = BaseDataset(sample=generate_images())
284+
ds = Dataset(sample=generate_images())
285285
ds.sample.record_operation("", "")
286286
self.assertTrue(ds.is_processed)
287287

288288
def test_processed_is_false(self):
289-
ds = BaseDataset(sample=generate_images())
289+
ds = Dataset(sample=generate_images())
290290
self.assertFalse(ds.is_processed)

mantidimaging/eyes_tests/main_window_test.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,6 @@ def test_show_add_stack_to_existing_dataset_dialog_for_strict_dataset(self):
8787

8888
self.check_target(widget=self.imaging.add_to_dataset_dialog)
8989

90-
def test_show_add_stack_to_existing_dataset_dialog_for_mixed_dataset(self):
91-
self._create_mixed_dataset()
92-
self.imaging.show_add_stack_to_existing_dataset_dialog(list(self.imaging.presenter.all_dataset_ids)[0])
93-
self.check_target(widget=self.imaging.add_to_dataset_dialog)
94-
9590
def test_clicking_tab_changes_tree_view_selection(self):
9691
self._load_strict_data_set()
9792
sample_vis = self._load_strict_data_set()

mantidimaging/gui/windows/add_images_to_dataset_dialog/test/view_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def setUp(self) -> None:
2222
self.main_window = MainWindowView()
2323
self.dataset_id = uuid.uuid4()
2424
self.dataset_name = "dataset-name"
25-
self.view = AddImagesToDatasetDialog(self.main_window, self.dataset_id, True, self.dataset_name)
25+
self.view = AddImagesToDatasetDialog(self.main_window, self.dataset_id, self.dataset_name)
2626
self.view.presenter = self.presenter = mock.MagicMock()
2727

2828
def test_on_accepted(self):

mantidimaging/gui/windows/add_images_to_dataset_dialog/view.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,15 @@ class AddImagesToDatasetDialog(BaseDialogView):
1515
filePathLineEdit: QLineEdit
1616
datasetNameText: QLabel
1717

18-
def __init__(self, parent, dataset_id: uuid.UUID, strict_dataset: bool, dataset_name: str):
18+
def __init__(self, parent, dataset_id: uuid.UUID, dataset_name: str):
1919
super().__init__(parent, 'gui/ui/add_to_dataset.ui')
2020

2121
self.parent_view = parent
2222
self.presenter = AddImagesToDatasetPresenter(self)
2323
self._dataset_id = dataset_id
2424

25-
if strict_dataset:
26-
self.imageTypeComboBox.addItems(
27-
["Sample", "Flat Before", "Flat After", "Dark Before", "Dark After", "Recon"])
28-
else:
29-
self.imageTypeComboBox.addItems(["Images", "Recon"])
25+
self.imageTypeComboBox.addItems(
26+
["Sample", "Flat Before", "Flat After", "Dark Before", "Dark After", "Recon", "Images"])
3027

3128
self.datasetNameText.setText(dataset_name)
3229
self.chooseFileButton.clicked.connect(self.choose_file_path)

mantidimaging/gui/windows/main/model.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from typing import NoReturn, TYPE_CHECKING
88

99
from mantidimaging.core.data import ImageStack
10-
from mantidimaging.core.data.dataset import StrictDataset, MixedDataset
10+
from mantidimaging.core.data.dataset import StrictDataset, MixedDataset, Dataset
1111
from mantidimaging.core.io import loader, saver
1212
from mantidimaging.core.io.filenames import FilenameGroup
1313
from mantidimaging.core.io.loader.loader import LoadingParameters, ImageParameters
@@ -27,7 +27,7 @@ class MainWindowModel:
2727

2828
def __init__(self) -> None:
2929
super().__init__()
30-
self.datasets: dict[uuid.UUID, MixedDataset | StrictDataset] = {}
30+
self.datasets: dict[uuid.UUID, Dataset] = {}
3131

3232
def get_images_by_uuid(self, images_uuid: uuid.UUID) -> ImageStack | None:
3333
for dataset in self.datasets.values():
@@ -102,8 +102,10 @@ def get_existing_180_id(self, dataset_id: uuid.UUID) -> uuid.UUID | None:
102102
:return: The 180 ID if found, None otherwise.
103103
"""
104104
dataset = self.datasets.get(dataset_id)
105-
if not isinstance(dataset, StrictDataset):
106-
raise RuntimeError(f"Failed to get StrictDataset with ID {dataset_id}")
105+
if not dataset:
106+
raise RuntimeError(f"Failed to get Dataset with ID {dataset_id}")
107+
if not dataset.sample:
108+
raise RuntimeError(f"Dataset with ID {dataset_id} does not have a sample")
107109

108110
if isinstance(dataset.proj180deg, ImageStack):
109111
return dataset.proj180deg.id
@@ -116,13 +118,11 @@ def add_180_deg_to_dataset(self, dataset_id: uuid.UUID, _180_deg_file: str) -> I
116118
:param _180_deg_file: The location of the 180 projection.
117119
:return: The loaded 180 ImageStack object.
118120
"""
119-
if dataset_id in self.datasets:
120-
dataset = self.datasets[dataset_id]
121-
else:
121+
dataset = self.datasets.get(dataset_id)
122+
if not dataset:
122123
raise RuntimeError(f"Failed to get Dataset with ID {dataset_id}")
123-
124-
if not isinstance(dataset, StrictDataset):
125-
raise RuntimeError(f"Wrong dataset type passed to add 180 method: {dataset_id}")
124+
if not dataset.sample:
125+
raise RuntimeError(f"Dataset with ID {dataset_id} does not have a sample")
126126

127127
_180_deg = loader.load_stack_from_group(FilenameGroup.from_file(_180_deg_file))
128128
dataset.proj180deg = _180_deg
@@ -201,7 +201,7 @@ def remove_container(self, container_id: uuid.UUID) -> list[uuid.UUID]:
201201
return ids_to_remove
202202
self.raise_error_when_images_not_found(container_id)
203203

204-
def add_dataset_to_model(self, dataset: StrictDataset | MixedDataset) -> None:
204+
def add_dataset_to_model(self, dataset: Dataset) -> None:
205205
self.datasets[dataset.id] = dataset
206206

207207
@property

mantidimaging/gui/windows/main/presenter.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from qt_material import apply_stylesheet
1717

1818
from mantidimaging.core.data import ImageStack
19-
from mantidimaging.core.data.dataset import StrictDataset, MixedDataset, _get_stack_data_type
19+
from mantidimaging.core.data.dataset import StrictDataset, MixedDataset, _get_stack_data_type, Dataset
2020
from mantidimaging.core.io.loader.loader import create_loading_parameters_for_file_path
2121
from mantidimaging.core.io.utility import find_projection_closest_to_180, THRESHOLD_180
2222
from mantidimaging.core.utility.data_containers import ProjectionAngles
@@ -416,7 +416,7 @@ def stack_visualiser_list(self) -> list[StackId]:
416416
return sorted(stacks, key=lambda x: x.name)
417417

418418
@property
419-
def datasets(self) -> Iterable[MixedDataset | StrictDataset]:
419+
def datasets(self) -> Iterable[Dataset]:
420420
return self.model.datasets.values()
421421

422422
@property
@@ -442,7 +442,7 @@ def all_stack_ids(self) -> Iterable[uuid.UUID]:
442442
def stack_visualiser_names(self) -> list[str]:
443443
return [widget.windowTitle() for widget in self.stack_visualisers.values()]
444444

445-
def get_dataset(self, dataset_id: uuid.UUID) -> MixedDataset | StrictDataset | None:
445+
def get_dataset(self, dataset_id: uuid.UUID) -> Dataset | None:
446446
return self.model.datasets.get(dataset_id)
447447

448448
def get_stack_visualiser(self, stack_id: uuid.UUID) -> StackVisualiserView:
@@ -757,7 +757,7 @@ def _add_images_to_existing_dataset(self) -> None:
757757
self.create_single_tabbed_images_stack(new_images)
758758
self.view.model_changed.emit()
759759

760-
def _add_recon_to_dataset_and_tree_view(self, dataset: MixedDataset | StrictDataset, recon: ImageStack) -> None:
760+
def _add_recon_to_dataset_and_tree_view(self, dataset: Dataset, recon: ImageStack) -> None:
761761
"""
762762
Adds a recon to the dataset and updates the tree view.
763763
:param dataset: The dataset.
@@ -766,7 +766,7 @@ def _add_recon_to_dataset_and_tree_view(self, dataset: MixedDataset | StrictData
766766
dataset.add_recon(recon)
767767
self.add_recon_item_to_tree_view(dataset.id, recon.id, recon.name)
768768

769-
def _add_images_to_existing_mixed_dataset(self, dataset: MixedDataset, new_images: ImageStack) -> None:
769+
def _add_images_to_existing_mixed_dataset(self, dataset: Dataset, new_images: ImageStack) -> None:
770770
"""
771771
Updates the stack list in the mixed dataset and updates the tree view.
772772
:param dataset: The MixedDataset to update.
@@ -775,8 +775,7 @@ def _add_images_to_existing_mixed_dataset(self, dataset: MixedDataset, new_image
775775
dataset.add_stack(new_images)
776776
self.add_child_item_to_tree_view(dataset.id, new_images.id, new_images.name)
777777

778-
def _add_images_to_existing_strict_dataset(self, dataset: StrictDataset, new_images: ImageStack,
779-
stack_type: str) -> None:
778+
def _add_images_to_existing_strict_dataset(self, dataset: Dataset, new_images: ImageStack, stack_type: str) -> None:
780779
"""
781780
Adds or replaces images in a StrictDataset and updates the tree view if required.
782781
:param dataset: The StrictDataset to change.

mantidimaging/gui/windows/main/test/model_test.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import numpy as np
1111

1212
from mantidimaging.core.data import ImageStack
13-
from mantidimaging.core.data.dataset import StrictDataset, MixedDataset
13+
from mantidimaging.core.data.dataset import StrictDataset, MixedDataset, Dataset
1414
from mantidimaging.core.io.loader.loader import LoadingParameters, ImageParameters
1515
from mantidimaging.core.utility.data_containers import ProjectionAngles, FILE_TYPES, Indices
1616
from mantidimaging.gui.windows.main import MainWindowModel
@@ -487,21 +487,21 @@ def test_no_dataset_with_180_raises(self):
487487
self.model.get_existing_180_id("bad-id")
488488

489489
def test_wrong_dataset_type_for_180_raises(self):
490-
md = MixedDataset()
490+
md = Dataset()
491491
self.model.add_dataset_to_model(md)
492492

493493
with self.assertRaises(RuntimeError):
494494
self.model.get_existing_180_id(md.id)
495495

496496
def test_get_existing_180_id_finds_id(self):
497-
sd = StrictDataset(sample=generate_images((5, 20, 20)))
497+
sd = Dataset(sample=generate_images((5, 20, 20)))
498498
sd.proj180deg = _180 = generate_images((1, 20, 20))
499499
self.model.add_dataset_to_model(sd)
500500

501501
assert self.model.get_existing_180_id(sd.id) == _180.id
502502

503503
def test_get_existing_id_returns_none_for_dataset_without_180(self):
504-
sd = StrictDataset(sample=generate_images((5, 20, 20)))
504+
sd = Dataset(sample=generate_images((5, 20, 20)))
505505
self.model.add_dataset_to_model(sd)
506506

507507
self.assertIsNone(self.model.get_existing_180_id(sd.id))

0 commit comments

Comments
 (0)