From 6125776041a27f7af818dbe57ff8935119eef762 Mon Sep 17 00:00:00 2001 From: Egor Sobolev <egor.sobolev@xfel.eu> Date: Wed, 6 Sep 2023 13:30:49 +0200 Subject: [PATCH] Improve integrated intensity addon --- .../correction_addons/integrated_intensity.py | 67 +++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/src/calng/correction_addons/integrated_intensity.py b/src/calng/correction_addons/integrated_intensity.py index 61b1ab5b..231f0722 100644 --- a/src/calng/correction_addons/integrated_intensity.py +++ b/src/calng/correction_addons/integrated_intensity.py @@ -1,5 +1,5 @@ import numpy as np -from karabo.bound import NDARRAY_ELEMENT +from karabo.bound import DOUBLE_ELEMENT, NDARRAY_ELEMENT, NODE_ELEMENT from .base_addon import BaseCorrectionAddon @@ -13,18 +13,73 @@ def maybe_get(a): class IntegratedIntensityAddon(BaseCorrectionAddon): _node_name = "integratedIntensity" + def __init__(self, config): + global cupy + import cupy + + self._vmin = config["valueMin"] + self._vmax = config["valueMax"] + + def reconfigure(self, changed_config): + if changed_config.has("valueMin"): + self._vmin = changed_config["valueMin"] + if changed_config.has("valueMax"): + self._vmax = changed_config["valueMax"] + @staticmethod def extend_output_schema(schema): # note: sort of assumes XTDF hash structure ( + NODE_ELEMENT(schema) + .key("integratedIntensity") + .commit(), + + NDARRAY_ELEMENT(schema) + .key("integratedIntensity.mean") + .dtype("DOUBLE") + .commit(), + NDARRAY_ELEMENT(schema) - .key("image.integratedIntensity") + .key("integratedIntensity.variance") .dtype("DOUBLE") + .commit(), + + NDARRAY_ELEMENT(schema) + .key("integratedIntensity.count") + .dtype("UINT64") .commit() ) - def post_correction(self, processed_data, cell_table, pulse_table, output_hash): - # Numpy should handle CuPy dispatch for us - output_hash["image.integratedIntensity"] = maybe_get( - np.nansum(processed_data, axis=(1, 2)) + @staticmethod + def extend_device_schema(schema, prefix): + ( + DOUBLE_ELEMENT(schema) + .key(f"{prefix}.valueMin") + .tags("managed") + .assignmentOptional() + .defaultValue(-10.0) + .reconfigurable() + .commit(), + + DOUBLE_ELEMENT(schema) + .key(f"{prefix}.valueMax") + .tags("managed") + .assignmentOptional() + .defaultValue(20000.0) + .reconfigurable() + .commit() ) + + def post_correction(self, data, cell_table, pulse_table, output_hash): + # Numpy should handle CuPy dispatch for us + mask = np.isfinite(data) & (self._vmin < data) & (data < self._vmax) + + count = np.sum(mask, axis=(1, 2)) + + tmp = mask * data + mu = np.sum(tmp, axis=(1, 2)) / count + var = np.sum(tmp * data, axis=(1, 2)) / count - mu * mu + + output_hash["integratedIntensity.mean"] = maybe_get(mu) + output_hash["integratedIntensity.variance"] = maybe_get(var) + output_hash["integratedIntensity.count"] = maybe_get(count) -- GitLab