2
2
# SPDX - License - Identifier: GPL-3.0-or-later
3
3
from __future__ import annotations
4
4
import uuid
5
- from dataclasses import dataclass
6
5
7
6
import numpy as np
8
7
@@ -25,7 +24,17 @@ def remove_nones(image_stacks: list[ImageStack | None]) -> list[ImageStack]:
25
24
26
25
class BaseDataset :
27
26
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 :
29
38
self ._id : uuid .UUID = uuid .uuid4 ()
30
39
self .name = name
31
40
@@ -34,6 +43,15 @@ def __init__(self, *, name: str = "", stacks: list[ImageStack] | None = None) ->
34
43
stacks = [] if stacks is None else stacks
35
44
self ._stacks : list [ImageStack ] = stacks
36
45
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
+
37
55
@property
38
56
def id (self ) -> uuid .UUID :
39
57
return self ._id
@@ -89,31 +107,7 @@ class MixedDataset(BaseDataset):
89
107
pass
90
108
91
109
92
- @dataclass
93
110
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
117
111
118
112
@property
119
113
def all (self ) -> list [ImageStack ]:
@@ -165,6 +159,8 @@ def proj180deg(self) -> ImageStack | None:
165
159
166
160
@proj180deg .setter
167
161
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" )
168
164
self .sample .proj180deg = proj180deg
169
165
170
166
def delete_stack (self , images_id : uuid .UUID ) -> None :
@@ -179,6 +175,7 @@ def delete_stack(self, images_id: uuid.UUID) -> None:
179
175
elif isinstance (self .dark_after , ImageStack ) and self .dark_after .id == images_id :
180
176
self .dark_after = None
181
177
elif isinstance (self .proj180deg , ImageStack ) and self .proj180deg .id == images_id :
178
+ assert self .sample is not None
182
179
self .sample .clear_proj180deg ()
183
180
elif isinstance (self .sinograms , ImageStack ) and self .sinograms .id == images_id :
184
181
self .sinograms = None
@@ -221,7 +218,7 @@ def _get_stack_data_type(stack_id: uuid.UUID, dataset: BaseDataset) -> str:
221
218
if stack_id in [stack .id for stack in dataset ._stacks ]:
222
219
return "Images"
223
220
if isinstance (dataset , StrictDataset ):
224
- if stack_id == dataset .sample .id :
221
+ if dataset . sample is not None and stack_id == dataset .sample .id :
225
222
return "Sample"
226
223
if dataset .flat_before is not None and stack_id == dataset .flat_before .id :
227
224
return "Flat Before"
0 commit comments