diff --git a/src/calng/AgipdCorrection.py b/src/calng/AgipdCorrection.py index c9442d4b0c7bc1ac9e0ac0c330a549eaca17f8e5..70fca7bf34df21dd53f4b042c2ff1eabfa53051e 100644 --- a/src/calng/AgipdCorrection.py +++ b/src/calng/AgipdCorrection.py @@ -153,6 +153,20 @@ class AgipdCorrection(BaseCorrection): .reconfigurable() .commit() ) + ( + STRING_ELEMENT(expected) + .key("corrections.badPixelMaskValue") + .displayedName("Bad pixel masking value") + .description( + "Any pixels masked by the bad pixel mask will have their value " + "replaced with this. Note that this setting is evaluated as a string; " + "use float('nan') to get NaN value." + ) + .assignmentOptional() + .defaultValue("float('nan')") + .reconfigurable() + .commit() + ) @property def input_data_shape(self): @@ -177,7 +191,11 @@ class AgipdCorrection(BaseCorrection): def __init__(self, config): # TODO: different gpu runner for fixed gain mode self.gain_mode = AgipdGainMode[config.get("gainMode")] - self._gpu_runner_init_args = {"gain_mode": self.gain_mode} + self.bad_pixel_mask_value = eval(config.get("corrections.badPixelMaskValue")) + self._gpu_runner_init_args = { + "gain_mode": self.gain_mode, + "bad_pixel_mask_value": self.bad_pixel_mask_value, + } super().__init__(config) self._output_transpose = { @@ -389,6 +407,11 @@ class AgipdCorrection(BaseCorrection): for path in config.getPaths() ): self._has_updated_bad_pixel_selection = False + if config.has("corrections.badPixelMaskValue"): + self.bad_pixel_mask_value = eval( + config.get("corrections.badPixelMaskValue") + ) + self.gpu_runner.set_bad_pixel_mask_value(self.bad_pixel_mask_value) def postReconfigure(self): super().postReconfigure() @@ -405,4 +428,6 @@ class AgipdCorrection(BaseCorrection): if not self._has_updated_bad_pixel_selection: self._update_bad_pixel_selection() - self.gpu_runner.override_bad_pixel_flags_to_use(self._override_bad_pixel_flags) + self.gpu_runner.override_bad_pixel_flags_to_use( + self._override_bad_pixel_flags + ) diff --git a/src/calng/agipd_gpu.py b/src/calng/agipd_gpu.py index 60d0cd1c0e0a0c0fb537922817942083d9a5ecd5..b8fbc6c7876d3ac678b1e927d55f841ce64a2720 100644 --- a/src/calng/agipd_gpu.py +++ b/src/calng/agipd_gpu.py @@ -36,7 +36,7 @@ class AgipdGpuRunner(base_gpu.BaseGpuRunner): output_transpose=(1, 2, 0), # default: memorycells-fast input_data_dtype=cupy.uint16, output_data_dtype=cupy.float32, - bad_pixel_mask_value=cupy.float32(cupy.nan), + bad_pixel_mask_value=cupy.nan, gain_mode=AgipdGainMode.ADAPTIVE_GAIN, ): self.gain_mode = gain_mode @@ -70,7 +70,7 @@ class AgipdGpuRunner(base_gpu.BaseGpuRunner): self.md_additional_offset_gpu = cupy.zeros(self.map_shape, dtype=cupy.float32) self.rel_gain_xray_map_gpu = cupy.ones(self.map_shape, dtype=cupy.float32) self.bad_pixel_map_gpu = cupy.zeros(self.gm_map_shape, dtype=cupy.uint32) - self.bad_pixel_mask_value = bad_pixel_mask_value # TODO: make this configurable + self.set_bad_pixel_mask_value(bad_pixel_mask_value) self.update_block_size((1, 1, 64)) @@ -212,6 +212,9 @@ class AgipdGpuRunner(base_gpu.BaseGpuRunner): f"Percentage of bad pixels now: {cupy.count_nonzero(self.bad_pixel_map_gpu) / self.bad_pixel_map_gpu.size * 100:.02f}" ) + def set_bad_pixel_mask_value(self, mask_value): + self.bad_pixel_mask_value = cupy.float32(mask_value) + def flush_buffers(self): self.offset_map_gpu.fill(0) self.rel_gain_pc_map_gpu.fill(1)