Skip to content

Commit bb2a2c8

Browse files
authored
Merge pull request #653 from DiamondLightSource/datachecker
Data checker auto insertion
2 parents 5b02ae5 + 4c40296 commit bb2a2c8

3 files changed

Lines changed: 172 additions & 21 deletions

File tree

‎httomo/runner/task_runner.py‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,20 @@ def _execute_section(self, section: Section, section_index: int = 0):
9696
f"Section {section_index} (pattern={section.methods[0].pattern.name}) with the following methods:",
9797
level=logging.INFO,
9898
)
99-
methods_info = [
100-
f" {method.method_name} ({method.package_name})\n"
101-
for method in section.methods
102-
]
99+
100+
methods_info = []
101+
for method in section.methods:
102+
if method.method_name == "data_checker":
103+
methods_info.append(
104+
f" --- output check with data_checker --- ({method.package_name})\n"
105+
)
106+
else:
107+
methods_info.append(
108+
f" {method.method_name} ({method.package_name})\n"
109+
)
110+
103111
methods_info[-1] = methods_info[-1].rstrip("\n")
112+
104113
self._log_pipeline(methods_info, level=logging.INFO)
105114

106115
slicing_dim_section: Literal[0, 1] = _get_slicing_dim(section.pattern) - 1 # type: ignore

‎httomo/transform_layer.py‎

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ def __init__(
3737

3838
def transform(self, pipeline: Pipeline) -> Pipeline:
3939
pipeline = self.insert_data_reducer(pipeline)
40+
pipeline = self.insert_data_checker(pipeline)
41+
4042
pipeline_is_sweep = _check_if_pipeline_has_a_sweep(pipeline)
4143

4244
if pipeline_is_sweep:
@@ -89,6 +91,70 @@ def insert_data_reducer(self, pipeline: Pipeline) -> Pipeline:
8991
methods.append(m)
9092
return Pipeline(loader, methods)
9193

94+
def insert_data_checker(self, pipeline: Pipeline) -> Pipeline:
95+
"""This will insert CPU or GPU data checker method AFTER most of the methods in the pipeline"""
96+
loader = pipeline.loader
97+
methods = []
98+
methods.append(
99+
GenericMethodWrapper(
100+
self._repo,
101+
"httomolib.misc.utils",
102+
"data_checker",
103+
comm=self._comm,
104+
save_result=False,
105+
task_id="datachecker_0",
106+
infsnans_correct=False, # the input (raw) data is 16bit
107+
zeros_warning=True, # we count the zeros if the data is too sparse
108+
data_to_method_name="Data Loader",
109+
),
110+
)
111+
for index, m in enumerate(pipeline):
112+
methods.append(m)
113+
# handling some exceptions here after which we don't need to insert the data checker
114+
if (
115+
m.method_name
116+
not in [
117+
"data_reducer",
118+
"data_checker",
119+
"calculate_stats",
120+
"rescale_to_int",
121+
]
122+
and "rotation" not in m.module_path
123+
and index < len(pipeline._methods) - 1
124+
):
125+
if m.is_cpu:
126+
# add the CPU checker method
127+
methods.append(
128+
GenericMethodWrapper(
129+
self._repo,
130+
"httomolib.misc.utils",
131+
"data_checker",
132+
comm=self._comm,
133+
save_result=False,
134+
task_id=f"datachecker_{m.task_id}",
135+
infsnans_correct=True,
136+
zeros_warning=True,
137+
data_to_method_name=m.method_name,
138+
),
139+
)
140+
else:
141+
# add the GPU checker method
142+
methods.append(
143+
GenericMethodWrapper(
144+
self._repo,
145+
"httomolibgpu.misc.utils",
146+
"data_checker",
147+
comm=self._comm,
148+
save_result=False,
149+
task_id=f"datachecker_{m.task_id}",
150+
infsnans_correct=True,
151+
zeros_warning=False,
152+
data_to_method_name=m.method_name,
153+
),
154+
)
155+
156+
return Pipeline(loader, methods)
157+
92158
def insert_save_images_after_sweep(self, pipeline: Pipeline) -> Pipeline:
93159
"""For sweep methods we add image saving method."""
94160
loader = pipeline.loader

‎tests/test_transform_layer.py‎

Lines changed: 93 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,82 @@ def test_insert_image_save_after_sweep(mocker: MockerFixture, tmp_path: Path):
186186
assert pipeline[3].config_params["axis"] == 1
187187

188188

189+
def test_insert_data_checker(mocker: MockerFixture, tmp_path: Path):
190+
comm = MPI.COMM_SELF
191+
repo = make_mock_repo(mocker)
192+
loader = mocker.create_autospec(
193+
LoaderInterface,
194+
instance=True,
195+
)
196+
pipeline = Pipeline(
197+
loader=loader,
198+
methods=[
199+
make_test_method(
200+
mocker,
201+
method_name="remove_outlier",
202+
module_path="httomolibgpu.misc.corr",
203+
save_result=False,
204+
task_id="t1",
205+
),
206+
make_test_method(
207+
mocker,
208+
method_name="find_center_vo",
209+
module_path="httomolibgpu.recon.rotation",
210+
save_result=False,
211+
task_id="t2",
212+
),
213+
make_test_method(
214+
mocker,
215+
method_name="normalize",
216+
module_path="httomolibgpu.prep.normalize",
217+
save_result=False,
218+
task_id="t3",
219+
),
220+
make_test_method(
221+
mocker,
222+
method_name="FBP3d_tomobar",
223+
module_path="httomolibgpu.recon.algorithm",
224+
save_result=False,
225+
sweep=True,
226+
task_id="t4",
227+
),
228+
make_test_method(
229+
mocker,
230+
method_name="calculate_stats",
231+
module_path="httomo.methods",
232+
save_result=False,
233+
task_id="t5",
234+
),
235+
make_test_method(
236+
mocker,
237+
method_name="rescale_to_int",
238+
module_path="httomolib.misc.rescale",
239+
save_result=False,
240+
task_id="t6",
241+
),
242+
make_test_method(
243+
mocker,
244+
method_name="save_to_images",
245+
module_path="httomolib.misc.images",
246+
save_result=False,
247+
task_id="t7",
248+
),
249+
],
250+
)
251+
trans = TransformLayer(comm, repo=repo, save_all=False, out_dir=tmp_path)
252+
pipeline = trans.insert_data_checker(pipeline)
253+
254+
assert len(pipeline) == 11
255+
assert pipeline[0].method_name == "data_checker"
256+
assert pipeline[2].method_name == "data_checker"
257+
assert pipeline[4].method_name == "normalize"
258+
assert pipeline[5].method_name == "data_checker"
259+
assert pipeline[6].method_name == "FBP3d_tomobar"
260+
assert pipeline[7].method_name == "data_checker"
261+
assert pipeline[9].method_name == "rescale_to_int"
262+
assert pipeline[10].method_name == "save_to_images"
263+
264+
189265
def test_insert_image_save_after_sweep2(mocker: MockerFixture, tmp_path: Path):
190266
comm = MPI.COMM_SELF
191267
repo = make_mock_repo(mocker)
@@ -220,7 +296,7 @@ def test_insert_image_save_after_sweep2(mocker: MockerFixture, tmp_path: Path):
220296
),
221297
make_test_method(
222298
mocker,
223-
method_name="FBP",
299+
method_name="FBP3d_tomobar",
224300
module_path="httomolibgpu.recon.algorithm",
225301
save_result=False,
226302
task_id="t4",
@@ -237,7 +313,7 @@ def test_insert_image_save_after_sweep2(mocker: MockerFixture, tmp_path: Path):
237313

238314
assert pipeline[5].method_name == "save_to_images"
239315
assert pipeline[5].task_id == "saveimage_sweep_t4"
240-
assert pipeline[5].config_params["subfolder_name"] == "images_sweep_FBP"
316+
assert pipeline[5].config_params["subfolder_name"] == "images_sweep_FBP3d_tomobar"
241317
assert pipeline[5].config_params["axis"] == 1
242318

243319

@@ -285,13 +361,13 @@ def test_insert_paganin_not_last_sweep(mocker: MockerFixture, tmp_path: Path):
285361
trans = TransformLayer(comm, repo=repo, save_all=False, out_dir=tmp_path)
286362
pipeline = trans.transform(pipeline)
287363

288-
assert len(pipeline) == 7
289-
assert pipeline[4].method_name == "save_to_images"
290-
assert pipeline[4].task_id == "saveimage_sweep_t3"
291-
assert pipeline[4].config_params["subfolder_name"] == "images_sweep_paganin_filter"
292-
assert pipeline[5].method_name == "FBP3d_tomobar"
293-
assert pipeline[6].task_id == "saveimage_sweep_t4"
294-
assert pipeline[6].config_params["subfolder_name"] == "images_sweep_FBP3d_tomobar"
364+
assert len(pipeline) == 11
365+
assert pipeline[7].method_name == "save_to_images"
366+
assert pipeline[7].task_id == "saveimage_sweep_t3"
367+
assert pipeline[7].config_params["subfolder_name"] == "images_sweep_paganin_filter"
368+
assert pipeline[9].method_name == "FBP3d_tomobar"
369+
assert pipeline[10].task_id == "saveimage_sweep_t4"
370+
assert pipeline[10].config_params["subfolder_name"] == "images_sweep_FBP3d_tomobar"
295371

296372

297373
def test_insert_paganin_is_last_sweep(mocker: MockerFixture, tmp_path: Path):
@@ -331,10 +407,10 @@ def test_insert_paganin_is_last_sweep(mocker: MockerFixture, tmp_path: Path):
331407
trans = TransformLayer(comm, repo=repo, save_all=False, out_dir=tmp_path)
332408
pipeline = trans.transform(pipeline)
333409

334-
assert len(pipeline) == 5
335-
assert pipeline[4].method_name == "save_to_images"
336-
assert pipeline[4].task_id == "saveimage_sweep_t3"
337-
assert pipeline[4].config_params["subfolder_name"] == "images_sweep_paganin_filter"
410+
assert len(pipeline) == 8
411+
assert pipeline[7].method_name == "save_to_images"
412+
assert pipeline[7].task_id == "saveimage_sweep_t3"
413+
assert pipeline[7].config_params["subfolder_name"] == "images_sweep_paganin_filter"
338414

339415

340416
def test_insert_denoise_last_after_FBP_sweep(mocker: MockerFixture, tmp_path: Path):
@@ -374,7 +450,7 @@ def test_insert_denoise_last_after_FBP_sweep(mocker: MockerFixture, tmp_path: Pa
374450
trans = TransformLayer(comm, repo=repo, save_all=False, out_dir=tmp_path)
375451
pipeline = trans.transform(pipeline)
376452

377-
assert len(pipeline) == 5
378-
assert pipeline[4].method_name == "save_to_images"
379-
assert pipeline[4].task_id == "saveimage_sweep_t3"
380-
assert pipeline[4].config_params["subfolder_name"] == "images_sweep_median_filter"
453+
assert len(pipeline) == 8
454+
assert pipeline[7].method_name == "save_to_images"
455+
assert pipeline[7].task_id == "saveimage_sweep_t3"
456+
assert pipeline[7].config_params["subfolder_name"] == "images_sweep_median_filter"

0 commit comments

Comments
 (0)