From a228027892e120e6bf47400b5c448936ddb64508 Mon Sep 17 00:00:00 2001
From: ahmedk <karim.ahmed@xfel.eu>
Date: Fri, 30 Dec 2022 12:36:51 +0100
Subject: [PATCH] add module naming back in CalCatApi

---
 src/cal_tools/calcat_interface.py | 92 +++++++++++++++++--------------
 1 file changed, 50 insertions(+), 42 deletions(-)

diff --git a/src/cal_tools/calcat_interface.py b/src/cal_tools/calcat_interface.py
index 3fd06aecb..9049fae00 100644
--- a/src/cal_tools/calcat_interface.py
+++ b/src/cal_tools/calcat_interface.py
@@ -146,6 +146,7 @@ class CalCatApi(metaclass=ClientWrapper):
         self,
         detector_id,
         pdu_snapshot_at,
+        module_naming="da"
     ):
         """Physical detector unit metadata."""
 
@@ -156,11 +157,30 @@ class CalCatApi(metaclass=ClientWrapper):
         if not resp_pdus["success"]:
             raise CalCatError(resp_pdus)
 
-        return {
-            pdu['karabo_da']: {
-                k: pdu[k] for k in self.get_pdu_keys}
-            for pdu in resp_pdus['data']
-        }
+        # Create dict based on requested keys: karabo_da, module number,
+        # or QxMx naming convention.
+        if module_naming == "da":
+            return {
+                pdu["karabo_da"]: {k: pdu[k] for k in self.get_pdu_keys}
+                for pdu in resp_pdus["data"]
+            }
+        elif module_naming == "modno":
+            return {
+                int(pdu["karabo_da"][-2:]): {
+                    k: pdu[k] for k in self.get_pdu_keys
+                }
+                for pdu in resp_pdus["data"]
+            }
+        elif module_naming == "qm":
+            return {
+                module_index_to_qm(int(pdu["karabo_da"][-2:])): {
+                    k: pdu[k] for k in self.get_pdu_keys
+                }
+                for pdu in resp_pdus["data"]
+            }
+        else:
+            raise ValueError(f"{module_naming} is unknown!")
+
 
     @lru_cache()
     def calibration_id(self, calibration_name):
@@ -251,15 +271,22 @@ class CalCatApi(metaclass=ClientWrapper):
         }
         calibration_ids = list(cal_id_map.keys())
 
+        # Map aggregator to the selected module name.
+        da_to_modname = {
+            data['karabo_da']: mod_name for mod_name, data in
+            self.physical_detector_units(
+                self.detector(detector_name)['id'],
+                pdu_snapshot_at,
+                module_naming=module_naming
+            ).items()
+            if not modules or mod_name in modules
+        }
         # The API call supports a single module or all modules, as the
         # performance increase is only minor in between. Hence, all
         # modules are queried if more than one is selected and filtered
         # afterwards, if necessary.
-        karabo_da = (
-            next(iter(modules))
-            if modules is not None and len(modules) == 1
-            else "",
-        )  # noqa
+        karabo_da = next(iter(da_to_modname)) if len(da_to_modname) == 1 else '',
+
         resp_versions = CalibrationConstantVersion.get_closest_by_time_by_detector_conditions(  # noqa
             self.client,
             detector_name,
@@ -275,17 +302,8 @@ class CalCatApi(metaclass=ClientWrapper):
 
         for ccv in resp_versions["data"]:
             try:
-                if module_naming == "da":
-                    mod = ccv["physical_detector_unit"]["karabo_da"]
-                # Can be used for AGIPD, LPD, and DSSC.
-                elif module_naming == "qm":
-                    mod = module_index_to_qm(
-                        int(ccv["physical_detector_unit"]["karabo_da"][-2:])
-                    )
-                elif module_naming == "modno":
-                    mod = int(ccv["physical_detector_unit"]["karabo_da"][-2:])
-                else:
-                    raise ValueError(f"{module_naming} is unknown!")
+                mod = da_to_modname[ccv['physical_detector_unit']['karabo_da']]
+                print(mod)
             except KeyError:
                 # Not included in our modules
                 continue
@@ -506,24 +524,11 @@ class CalibrationData:
 
     @property
     def physical_detector_units(self):
-        pdu_dict = self._api.physical_detector_units(
-            self.detector["id"], self.pdu_snapshot_at)
-        # Create dict based on requested keys: karabo_da, module number,
-        # or QxMx naming convention.
-        if self.module_naming == "da":
-            return pdu_dict
-        elif self.module_naming == "modno":
-            return {
-                int(mod[-2:]): mod_v
-                for mod, mod_v in pdu_dict.items()
-            }
-        elif self.module_naming == "qm":
-            return {
-                module_index_to_qm(int(mod[-2:])): mod_v
-                for mod, mod_v in pdu_dict.items()
-            }
-        else:
-            raise ValueError(f"{self.module_naming} is unknown!")
+        return self._api.physical_detector_units(
+            self.detector["id"], self.pdu_snapshot_at, self.module_naming
+        )
+
+
 
     @property
     def condition(self):
@@ -1169,6 +1174,7 @@ class PNCCD_CalibrationData(CalibrationData):
         gain_setting,
         pixels_x=1024,
         pixels_y=1024,
+        modules=None,
         client=None,
         event_at=None,
         pdu_snapshot_at=None,
@@ -1177,7 +1183,7 @@ class PNCCD_CalibrationData(CalibrationData):
         # Ignore modules for this detector.
         super().__init__(
             detector_name,
-            None,
+            modules,
             client,
             event_at,
             pdu_snapshot_at,
@@ -1224,6 +1230,7 @@ class EPIX100_CalibrationData(SplitConditionCalibrationData):
         pixels_x=708,
         pixels_y=768,
         source_energy=9.2,
+        modules=None,
         client=None,
         event_at=None,
         pdu_snapshot_at=None,
@@ -1232,7 +1239,7 @@ class EPIX100_CalibrationData(SplitConditionCalibrationData):
         # Ignore modules for this detector.
         super().__init__(
             detector_name,
-            None,
+            modules,
             client,
             event_at,
             pdu_snapshot_at,
@@ -1273,6 +1280,7 @@ class GOTTHARD2_CalibrationData(CalibrationData):
         exposure_period,
         acquisition_rate,
         single_photon,
+        modules=None,
         client=None,
         event_at=None,
         pdu_snapshot_at=None,
@@ -1281,7 +1289,7 @@ class GOTTHARD2_CalibrationData(CalibrationData):
         # Ignore modules for this detector.
         super().__init__(
             detector_name,
-            None,
+            modules,
             client,
             event_at,
             pdu_snapshot_at,
-- 
GitLab