Skip to content

Commit ca4420b

Browse files
Merge StrictDataset constructor into BaseDataset
1 parent 14dabd3 commit ca4420b

File tree

4 files changed

+32
-29
lines changed

4 files changed

+32
-29
lines changed

mantidimaging/core/data/dataset.py

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# SPDX - License - Identifier: GPL-3.0-or-later
33
from __future__ import annotations
44
import uuid
5-
from dataclasses import dataclass
65

76
import numpy as np
87

@@ -25,7 +24,17 @@ def remove_nones(image_stacks: list[ImageStack | None]) -> list[ImageStack]:
2524

2625
class BaseDataset:
2726

28-
def __init__(self, *, name: str = "", stacks: list[ImageStack] | None = None) -> None:
27+
def __init__(
28+
self,
29+
*,
30+
name: str = "",
31+
stacks: list[ImageStack] | None = None,
32+
sample: ImageStack | None = None,
33+
flat_before: ImageStack | None = None,
34+
flat_after: ImageStack | None = None,
35+
dark_before: ImageStack | None = None,
36+
dark_after: ImageStack | None = None,
37+
) -> None:
2938
self._id: uuid.UUID = uuid.uuid4()
3039
self.name = name
3140

@@ -34,6 +43,15 @@ def __init__(self, *, name: str = "", stacks: list[ImageStack] | None = None) ->
3443
stacks = [] if stacks is None else stacks
3544
self._stacks: list[ImageStack] = stacks
3645

46+
self.sample = sample
47+
self.flat_before = flat_before
48+
self.flat_after = flat_after
49+
self.dark_before = dark_before
50+
self.dark_after = dark_after
51+
52+
if self.name == "" and sample is not None:
53+
self.name = sample.name
54+
3755
@property
3856
def id(self) -> uuid.UUID:
3957
return self._id
@@ -89,31 +107,7 @@ class MixedDataset(BaseDataset):
89107
pass
90108

91109

92-
@dataclass
93110
class StrictDataset(BaseDataset):
94-
sample: ImageStack
95-
flat_before: ImageStack | None = None
96-
flat_after: ImageStack | None = None
97-
dark_before: ImageStack | None = None
98-
dark_after: ImageStack | None = None
99-
100-
def __init__(self,
101-
*,
102-
sample: ImageStack,
103-
flat_before: ImageStack | None = None,
104-
flat_after: ImageStack | None = None,
105-
dark_before: ImageStack | None = None,
106-
dark_after: ImageStack | None = None,
107-
name: str = ""):
108-
super().__init__(name=name)
109-
self.sample = sample
110-
self.flat_before = flat_before
111-
self.flat_after = flat_after
112-
self.dark_before = dark_before
113-
self.dark_after = dark_after
114-
115-
if self.name == "":
116-
self.name = sample.name
117111

118112
@property
119113
def all(self) -> list[ImageStack]:
@@ -165,6 +159,8 @@ def proj180deg(self) -> ImageStack | None:
165159

166160
@proj180deg.setter
167161
def proj180deg(self, proj180deg: ImageStack | None) -> None:
162+
if self.sample is None:
163+
raise RuntimeError("Can't set a 180 projection without a sample")
168164
self.sample.proj180deg = proj180deg
169165

170166
def delete_stack(self, images_id: uuid.UUID) -> None:
@@ -179,6 +175,7 @@ def delete_stack(self, images_id: uuid.UUID) -> None:
179175
elif isinstance(self.dark_after, ImageStack) and self.dark_after.id == images_id:
180176
self.dark_after = None
181177
elif isinstance(self.proj180deg, ImageStack) and self.proj180deg.id == images_id:
178+
assert self.sample is not None
182179
self.sample.clear_proj180deg()
183180
elif isinstance(self.sinograms, ImageStack) and self.sinograms.id == images_id:
184181
self.sinograms = None
@@ -221,7 +218,7 @@ def _get_stack_data_type(stack_id: uuid.UUID, dataset: BaseDataset) -> str:
221218
if stack_id in [stack.id for stack in dataset._stacks]:
222219
return "Images"
223220
if isinstance(dataset, StrictDataset):
224-
if stack_id == dataset.sample.id:
221+
if dataset.sample is not None and stack_id == dataset.sample.id:
225222
return "Sample"
226223
if dataset.flat_before is not None and stack_id == dataset.flat_before.id:
227224
return "Flat Before"

mantidimaging/core/io/saver.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ def _nexus_save(nexus_file: h5py.File, dataset: StrictDataset, sample_name: str,
247247
data["image_key"] = detector["image_key"]
248248

249249
for recon in dataset.recons:
250+
assert dataset.sample is not None
250251
assert dataset.sample.filenames is not None
251252
_save_recon_to_nexus(nexus_file, recon, dataset.sample.filenames[0])
252253

mantidimaging/gui/windows/main/model.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,10 @@ def remove_container(self, container_id: uuid.UUID) -> list[uuid.UUID]:
185185
proj_180_id = None
186186
# If we're deleting a sample from a StrictDataset then any linked 180 projection will also be
187187
# deleted
188-
if isinstance(dataset, StrictDataset) and dataset.proj180deg and dataset.sample.id == container_id:
189-
proj_180_id = dataset.proj180deg.id
188+
if isinstance(dataset, StrictDataset) and dataset.proj180deg:
189+
assert dataset.sample is not None
190+
if dataset.sample.id == container_id:
191+
proj_180_id = dataset.proj180deg.id
190192
dataset.delete_stack(container_id)
191193
return [container_id, proj_180_id] if proj_180_id else [container_id]
192194
if container_id == dataset.recons.id:

mantidimaging/gui/windows/main/presenter.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ def add_alternative_180_if_required(self, dataset: StrictDataset) -> None:
241241
Checks if the dataset has a 180 projection and tries to find an alternative if one is missing.
242242
:param dataset: The loaded dataset.
243243
"""
244+
assert dataset.sample is not None
244245
if dataset.sample.has_proj180deg() and dataset.sample.proj180deg.filenames: # type: ignore
245246
return
246247
else:
@@ -260,6 +261,7 @@ def create_strict_dataset_stack_windows(self, dataset: StrictDataset) -> StackVi
260261
:param dataset: The loaded dataset.
261262
:return: The stack widget for the sample.
262263
"""
264+
assert dataset.sample is not None
263265
sample_stack_vis = self._create_lone_stack_window(dataset.sample)
264266
self._tabify_stack_window(sample_stack_vis)
265267

@@ -357,6 +359,7 @@ def create_strict_dataset_tree_view_items(self, dataset: StrictDataset) -> None:
357359
Creates the tree view items for a strict dataset.
358360
:param dataset: The loaded dataset.
359361
"""
362+
assert dataset.sample is not None
360363
dataset_tree_item = self.view.create_dataset_tree_widget_item(dataset.name, dataset.id)
361364
self.view.create_child_tree_item(dataset_tree_item, dataset.sample.id, "Projections")
362365

0 commit comments

Comments
 (0)