From 75600342b011c9f60eeb5b2f352a2582ab3b27dd Mon Sep 17 00:00:00 2001
From: Egor Sobolev <egor.sobolev@xfel.eu>
Date: Mon, 4 Mar 2024 17:16:31 +0100
Subject: [PATCH] Write data for any analysis addon in data_dict

---
 src/cal_tools/agipdlib.py      | 31 ++++++++++---------------------
 src/cal_tools/litpx_counter.py |  6 ++++++
 2 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/src/cal_tools/agipdlib.py b/src/cal_tools/agipdlib.py
index 1783c0b81..7290f54f7 100644
--- a/src/cal_tools/agipdlib.py
+++ b/src/cal_tools/agipdlib.py
@@ -28,7 +28,7 @@ from cal_tools.agipdutils import (
     melt_snowy_pixels,
 )
 from cal_tools.enums import AgipdGainMode, BadPixels, SnowResolution
-from cal_tools.litpx_counter import LitPixelCounter
+from cal_tools.litpx_counter import AnalysisAddon, LitPixelCounter
 from logging import warning
 
 
@@ -771,26 +771,19 @@ class AgipdCorrections:
         det_channel = det_channel.partition(":")[0] + ":output"
         agipd_corr_source = f"{karabo_id}/CORR/{det_channel}"
 
-        schema = {
-            agipd_corr_source: ["image"]
-        }
-        addons = {
-            "litpx_counter": f"{karabo_id}/LITPX/{det_channel}"
-        }
-        for addon_name, src_name in addons.items():
-            addon = data_dict.get(addon_name)
-            if addon is not None:
-                src_channels = schema.setdefault(src_name, [])
-                src_channels.append(addon.channel)
-
-        instrument_channels = []
-        for src_name, src_channels in schema.items():
-            instrument_channels += [f"{src_name}/{ch}" for ch in src_channels]
+        instrument_channels = [f"{agipd_corr_source}/image"]
 
         # backward compatibility BEGIN
         instrument_channels.append(f"{agipd_base}/image")
         # backward compatibility END
 
+        addons = []
+        for name, elem in data_dict.items():
+            if isinstance(elem, AnalysisAddon):
+                src_name = elem.source_name(karabo_id, det_channel)
+                addons.append((elem, src_name))
+                instrument_channels.append(f"{src_name}/{elem.channel}")
+
         with DataFile.from_details(out_folder, agg, runno, seqno) as outfile:
             outfile.create_metadata(
                 like=dc, instrument_channels=instrument_channels)
@@ -832,11 +825,7 @@ class AgipdCorrections:
 
             # create addon sources
             required_addon_data = []
-            for addon_name, src_name in addons.items():
-                addon = data_dict.get(addon_name)
-                if addon is None:
-                    continue
-
+            for addon, src_name in addons:
                 src = outfile.create_instrument_source(src_name)
                 addon.set_num_images(n_img)
                 addon.create_schema(src, trains, count)
diff --git a/src/cal_tools/litpx_counter.py b/src/cal_tools/litpx_counter.py
index 660ddbf72..0a70097f0 100644
--- a/src/cal_tools/litpx_counter.py
+++ b/src/cal_tools/litpx_counter.py
@@ -25,6 +25,9 @@ class AnalysisAddon:
     def process(self, chunk):
         raise NotImplementedError
 
+    def source_name(self, karabo_id, channel):
+        return f"{karabo_id}/DANA/{channel}"
+
     def create_schema(self, source, file_trains=None, count=None):
         if file_trains is None:
             file_trains = source.file["INDEX/trainId"][:]
@@ -83,3 +86,6 @@ class LitPixelCounter(AnalysisAddon):
             self.num_lit_px[i] = np.sum(
                 self.image[i] > self.threshold, initial=0, where=mask)
             self.num_good_px[i] = np.sum(mask)
+
+    def source_name(self, karabo_id, channel):
+        return f"{karabo_id}/LITPX/{channel}"
-- 
GitLab