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