From 193f531d5cbd0f72c753a2d9a582ddddd5ab5a8d Mon Sep 17 00:00:00 2001 From: Lisa Dorofeeva Date: Fri, 11 Jul 2025 14:57:20 +0200 Subject: [PATCH] Correct setting name for mask form file dataset; prepend all strak-finder-specific settings names with sf; Make streak-finder mask optional now that we have mask from file --- README.md | 33 ++++++++++++++++++--------------- dap/algos/addmaskfile.py | 2 +- dap/algos/streakfind.py | 36 +++++++++++++++++++----------------- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 73d2c0b..0f38f66 100644 --- a/README.md +++ b/README.md @@ -111,13 +111,13 @@ options: Input parameters: * `'do_snr': 1/0` - Specifies whether to do whitefield and std correction, if selected - changes image and mask in place. - * `'std_data_file': str` - hdf5 data file containing pre-calculated std. - * `'std_dataset': str` - [optional] dataset containing pre-calculated std, defaults to `'entry/crystallography/std'`. - * `'whitefield_data_file': str` - hdf5 data file containing pre-calculated white field. - * `'whitefield_dataset': str` - [optional] dataset containing pre-calculated white field, defaults to `'entry/crystallography/whitefield'`. - * `'mask_data_file': str` - hdf5 data file containing pre-calculated mask. - * `'mask_dataset': str` - [optional] dataset containing pre-calculated mask, defaults to `'entry/instrument/detector/mask'`. - * `'scale_whitefield': 1/0` - Specifies whether to scale whitefield to signal, useful if intensity jumps. + * `'sf_std_data_file': str` - hdf5 data file containing pre-calculated std. + * `'sf_std_dataset': str` - [optional] dataset containing pre-calculated std, defaults to `'entry/crystallography/std'`. + * `'sf_whitefield_data_file': str` - hdf5 data file containing pre-calculated white field. + * `'sf_whitefield_dataset': str` - [optional] dataset containing pre-calculated white field, defaults to `'entry/crystallography/whitefield'`. + * `'sf_mask_data_file': str` - [optional] hdf5 data file containing pre-calculated mask. + * `'sf_mask_dataset': str` - [optional] dataset containing pre-calculated mask, defaults to `'entry/instrument/detector/mask'`. + * `'sf_scale_whitefield': 1/0` - Specifies whether to scale whitefield to signal, useful if intensity jumps. * `'do_streakfinder_analysis': 1/0` - Specifies whether to execute the streak-finder algorithm. * `'sf_peak_structure_radius': int` - Connectivity structure radius for *peaks* detection. @@ -245,7 +245,7 @@ options: Input parameters: * `'apply_additional_mask': 1/0` - Input flag to enable this functionality. * `'mask_file': str` - Path to the hdf5 or npy file with mask data. - * `'mask_ds': str` [Optional] - Name of the dataset containing mask in the hdf5 file, default is `"mask_data"`. + * `'mask_dataset': str` [Optional] - Name of the dataset containing mask in the hdf5 file, default is `"mask_data"`. Algorithm Output: * `'mask_from_file_applied': 1/0` - Indicates whether the algorithm ran successfully. @@ -314,14 +314,17 @@ Example JSON for Convergent-Beam Diffraction Streak-Finder: "roi_y1": [], "roi_x2": [], "roi_y2": [], - "do_snr": 0, - "std_data_file": "/sf/instrument/exp/00m_mustermann/res/aux_data/streakfinder_metadata.h5", - "std_dataset": "entry/crystallography/std", - "whitefield_data_file": "/sf/bernina/exp/00m_mustermann/res/aux_data/streakfinder_metadata.h5", - "whitefield_dataset": "entry/crystallography/whitefield", - "mask_data_file": "/sf/bernina/exp/00m_mustermann/res/aux_data/JF_mask.h5", + "": 1, + "mask_file": "/sf/jungfrau/config/additional_mask/JF07T32V02.h5", "mask_dataset": "mask_data", - "scale_whitefield": 0, + "do_snr": 0, + "sf_std_data_file": "/sf/instrument/exp/00m_mustermann/res/aux_data/streakfinder_metadata.h5", + "sf_std_dataset": "entry/crystallography/std", + "sf_whitefield_data_file": "/sf/bernina/exp/00m_mustermann/res/aux_data/streakfinder_metadata.h5", + "sf_whitefield_dataset": "entry/crystallography/whitefield", + "sf_mask_data_file": "/sf/bernina/exp/00m_mustermann/res/aux_data/JF_mask.h5", + "sf_mask_dataset": "mask_data", + "sf_scale_whitefield": 0, "do_streakfinder_analysis": 1, "sf_negative_handler": "zero", "sf_peak_structure_radius": 2, diff --git a/dap/algos/addmaskfile.py b/dap/algos/addmaskfile.py index 9c9ce0e..4f82ee5 100644 --- a/dap/algos/addmaskfile.py +++ b/dap/algos/addmaskfile.py @@ -13,7 +13,7 @@ def calc_apply_additional_mask_from_file(results, pixel_mask_pf): mask_file = results.get("mask_file", None) if not mask_file: return - mask_dataset = results.get("mask_ds", DEFAULT_MASK_DATASET) + mask_dataset = results.get("mask_dataset", DEFAULT_MASK_DATASET) # Support for hdf5 and npy if mask_file.endswith(".npy"): diff --git a/dap/algos/streakfind.py b/dap/algos/streakfind.py index d42e50d..e307d71 100644 --- a/dap/algos/streakfind.py +++ b/dap/algos/streakfind.py @@ -45,7 +45,6 @@ def calc_streakfinder_analysis(results, data, pf_pixel_mask): if do_snr: # Changes data and mask in-place data = cryst_data.snr[0].copy() - np.multiply(pf_pixel_mask, cryst_data.mask, out=pf_pixel_mask) try: _calc_streakfinder_analysis(results, cryst_data) @@ -56,40 +55,43 @@ def calc_streakfinder_analysis(results, data, pf_pixel_mask): def _generate_cryst_data(results, data, pf_pixel_mask) -> CrystData: params_required = [ - "whitefield_data_file", - "mask_data_file", - "std_data_file", - "scale_whitefield", # Bool + "sf_whitefield_data_file", + "sf_std_data_file", + "sf_scale_whitefield", # Bool ] if not all(param in results.keys() for param in params_required): raise ValueError(f"ERROR: Not enough parameters for CBD correction. Skipping\n" f"{params_required=}") - whitefield_data_file = results["whitefield_data_file"] - mask_data_file = results["mask_data_file"] - std_data_file = results["std_data_file"] - scale_whitefield = results["scale_whitefield"] + whitefield_data_file = results["sf_whitefield_data_file"] + std_data_file = results["sf_std_data_file"] + scale_whitefield = results["sf_scale_whitefield"] # Using CXI Store specification as default - whitefield_dataset = results.get("whitefield_dataset", "entry/crystallography/whitefield") - mask_dataset = results.get("mask_dataset", "entry/instrument/detector/mask") - std_dataset = results.get("std_dataset", "entry/crystallography/std") + whitefield_dataset = results.get("sf_whitefield_dataset", "entry/crystallography/whitefield") + std_dataset = results.get("sf_std_dataset", "entry/crystallography/std") - num_threads = results.get("num_threads", DEFAULT_NUM_THREADS) + num_threads = results.get("sf_num_threads", DEFAULT_NUM_THREADS) with h5py.File(whitefield_data_file, "r") as hf: whitefield = hf[whitefield_dataset][:] - with h5py.File(mask_data_file, "r") as hf: - mask = hf[mask_dataset][:].astype(np.bool) - with h5py.File(std_data_file, "r") as hf: std = hf[std_dataset][:] + mask_data_file = results.get("sf_mask_data_file", None) + if mask_data_file is None: + mask = pf_pixel_mask + else: + mask_dataset = results.get("sf_mask_dataset", "entry/instrument/detector/mask") + with h5py.File(mask_data_file, "r") as hf: + mask = hf[mask_dataset][:].astype(np.bool) + mask *= pf_pixel_mask + data = CrystData( data=data[np.newaxis, :], - mask=mask*pf_pixel_mask, + mask=mask, std=std, whitefield=whitefield )