From 844d2a479400dc81679eeb5be575576eb9f9071f Mon Sep 17 00:00:00 2001 From: algol Date: Fri, 17 Jul 2026 15:44:46 +0100 Subject: [PATCH 1/2] correction to the extraction of separate darks/flats --- httomo/darks_flats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/httomo/darks_flats.py b/httomo/darks_flats.py index 1d346a845..6de114453 100644 --- a/httomo/darks_flats.py +++ b/httomo/darks_flats.py @@ -211,7 +211,7 @@ def generate_dummy(image_type: ImageType) -> np.ndarray: if ( darks_config is not None and flats_config is not None - and darks_config.file != flats_config.file + and darks_config.data_path != flats_config.data_path ): darks = get_separate(darks_config, ImageType.Dark) flats = get_separate(flats_config, ImageType.Flat) From 98434724837b2df705b60d843391efa57513c17e Mon Sep 17 00:00:00 2001 From: algol Date: Fri, 17 Jul 2026 16:34:28 +0100 Subject: [PATCH 2/2] corrections and a new test with data --- httomo/darks_flats.py | 9 +++ .../dark_field_different_path.h5 | Bin 0 -> 156032 bytes tests/test_get_darks_flats.py | 75 ++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 tests/test_data/i12/separate_flats_darks/dark_field_different_path.h5 diff --git a/httomo/darks_flats.py b/httomo/darks_flats.py index 6de114453..2ba54508f 100644 --- a/httomo/darks_flats.py +++ b/httomo/darks_flats.py @@ -217,6 +217,15 @@ def generate_dummy(image_type: ImageType) -> np.ndarray: flats = get_separate(flats_config, ImageType.Flat) return darks, flats + if ( + darks_config is not None + and flats_config is not None + and darks_config.file != flats_config.file + ): + darks = get_separate(darks_config, ImageType.Dark) + flats = get_separate(flats_config, ImageType.Flat) + return darks, flats + if ( darks_config is not None and flats_config is not None diff --git a/tests/test_data/i12/separate_flats_darks/dark_field_different_path.h5 b/tests/test_data/i12/separate_flats_darks/dark_field_different_path.h5 new file mode 100644 index 0000000000000000000000000000000000000000..f88b054080a850aa9840fd6dcd1171ee31aeccd0 GIT binary patch literal 156032 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 GfByqnW2brm literal 0 HcmV?d00001 diff --git a/tests/test_get_darks_flats.py b/tests/test_get_darks_flats.py index 805d36f1c..b99102c78 100644 --- a/tests/test_get_darks_flats.py +++ b/tests/test_get_darks_flats.py @@ -299,6 +299,81 @@ def test_get_darks_flats_different_file(preview_config: PreviewConfig): np.testing.assert_array_equal(loaded_darks, darks) +@pytest.mark.parametrize( + "preview_config", + [ + PreviewConfig( + angles=PreviewDimConfig(start=0, stop=180), + detector_y=PreviewDimConfig(start=0, stop=128), + detector_x=PreviewDimConfig(start=0, stop=160), + ), + PreviewConfig( + angles=PreviewDimConfig(start=0, stop=180), + detector_y=PreviewDimConfig(start=0, stop=10), + detector_x=PreviewDimConfig(start=0, stop=160), + ), + PreviewConfig( + angles=PreviewDimConfig(start=0, stop=180), + detector_y=PreviewDimConfig(start=10, stop=20), + detector_x=PreviewDimConfig(start=0, stop=160), + ), + PreviewConfig( + angles=PreviewDimConfig(start=0, stop=180), + detector_y=PreviewDimConfig(start=0, stop=128), + detector_x=PreviewDimConfig(start=0, stop=10), + ), + PreviewConfig( + angles=PreviewDimConfig(start=0, stop=180), + detector_y=PreviewDimConfig(start=0, stop=128), + detector_x=PreviewDimConfig(start=10, stop=20), + ), + ], + ids=[ + "no_cropping", + "crop_det_y_start_0", + "crop_det_y_start_10", + "crop_det_x_start_0", + "crop_det_x_start_10", + ], +) +def test_get_darks_flats_different_file_and_paths(preview_config: PreviewConfig): + DARKS_CONFIG = DarksFlatsFileConfig( + file=Path(__file__).parent + / "test_data/i12/separate_flats_darks/dark_field_different_path.h5", + data_path="/tomo/data", + image_key_path=None, + ) + FLATS_CONFIG = DarksFlatsFileConfig( + file=Path(__file__).parent / "test_data/i12/separate_flats_darks/flat_field.h5", + data_path="/1-NoProcessPlugin-tomo/data", + image_key_path=None, + ) + + loaded_darks, loaded_flats = get_darks_flats( + DARKS_CONFIG, + FLATS_CONFIG, + preview_config, + np.uint16, + ) + + with h5py.File(DARKS_CONFIG.file, "r") as f: + darks = f[DARKS_CONFIG.data_path][ + :, + preview_config.detector_y.start : preview_config.detector_y.stop, + preview_config.detector_x.start : preview_config.detector_x.stop, + ] + + with h5py.File(FLATS_CONFIG.file, "r") as f: + flats = f[FLATS_CONFIG.data_path][ + :, + preview_config.detector_y.start : preview_config.detector_y.stop, + preview_config.detector_x.start : preview_config.detector_x.stop, + ] + + np.testing.assert_array_equal(loaded_flats, flats) + np.testing.assert_array_equal(loaded_darks, darks) + + def test_ignore_darks_get_separate_flats(): DARKS_CONFIG = None FLATS_CONFIG = DarksFlatsFileConfig(