From 14018b9550d89afc81ae8294b29feda5110c25e5 Mon Sep 17 00:00:00 2001
From: ahmedk <karim.ahmed@xfel.eu>
Date: Mon, 12 Dec 2022 20:18:36 +0100
Subject: [PATCH] update da_to to module_naming

---
 src/cal_tools/calcat_interface.py | 97 +++++++++++++++++++------------
 1 file changed, 61 insertions(+), 36 deletions(-)

diff --git a/src/cal_tools/calcat_interface.py b/src/cal_tools/calcat_interface.py
index d70e3e91c..b51df9aa6 100644
--- a/src/cal_tools/calcat_interface.py
+++ b/src/cal_tools/calcat_interface.py
@@ -142,7 +142,12 @@ class CalCatApi(metaclass=ClientWrapper):
         return {k: resp_detector["data"][k] for k in self.get_detector_keys}
 
     @lru_cache()
-    def physical_detector_units(self, detector_id, snapshot_at, da_to="da"):
+    def physical_detector_units(
+        self,
+        detector_id,
+        snapshot_at,
+        module_naming="da",
+    ):
         """Physical detector unit metadata."""
 
         resp_pdus = PhysicalDetectorUnit.get_all_by_detector(
@@ -154,19 +159,19 @@ class CalCatApi(metaclass=ClientWrapper):
 
         # Create dict based on requested keys: karabo_da, module number,
         # or QxMx naming convention.
-        if da_to == "da":
+        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 da_to == "modno":
+        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 da_to == "qm":
+        elif module_naming == "qm":
             return {
                 module_index_to_qm(int(pdu["karabo_da"][-2:])): {
                     k: pdu[k] for k in self.get_pdu_keys
@@ -174,7 +179,7 @@ class CalCatApi(metaclass=ClientWrapper):
                 for pdu in resp_pdus["data"]
             }
         else:
-            raise ValueError(f"{da_to} is unknown!")
+            raise ValueError(f"{module_naming} is unknown!")
 
     @lru_cache()
     def calibration_id(self, calibration_name):
@@ -209,7 +214,7 @@ class CalCatApi(metaclass=ClientWrapper):
         event_at=None,
         snapshot_at=None,
         metadata=None,
-        da_to="da",
+        module_naming="da",
     ):
         """Query bulk CCV metadata from CalCat.
 
@@ -232,6 +237,13 @@ class CalCatApi(metaclass=ClientWrapper):
                 state to look at or None for now (default).
             metadata (dict or None): Mapping to fill for results or
                 None for a new dictionary (default).
+            module_naming (str or None): Expected module name convention to be
+                used as metadata dict keys. Expected values are:
+                `da`: data aggregator name is used. Default.
+                `modno`: module index is used. Index is chosen based on last 2
+                    integers in karabo_da.
+                `qm`: QxMx naming convention is used. Virtual names for
+                    AGIPD, DSSC, and LPD.
 
         Returns:
             (dict) Nested mapping of module number to calibrations to
@@ -282,16 +294,17 @@ class CalCatApi(metaclass=ClientWrapper):
 
         for ccv in resp_versions["data"]:
             try:
-                if da_to == "da":
+                if module_naming == "da":
                     mod = ccv["physical_detector_unit"]["karabo_da"]
-                elif da_to == "qm":  # Can be used for AGIPD, LPD, and DSSC.
+                # 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 da_to == "modno":
+                elif module_naming == "modno":
                     mod = int(ccv["physical_detector_unit"]["karabo_da"][-2:])
                 else:
-                    raise ValueError(f"{da_to} is unknown!")
+                    raise ValueError(f"{module_naming} is unknown!")
             except KeyError:
                 # Not included in our modules
                 continue
@@ -364,7 +377,7 @@ class CalibrationData:
         client=None,
         event_at=None,
         snapshot_at=None,
-        da_to="da",
+        module_naming="da",
     ):
         """Initialize a new CalibrationData object.
 
@@ -382,6 +395,13 @@ class CalibrationData:
                 CCVs should have been valid, now if omitted
             snapshot_at (datetime, date, str or None): Default time of
                 database state to look at, now if omitted.
+            module_naming (str or None): Expected module name convention to be
+                used as metadata dict keys. Expected values are:
+                `da`: data aggregator name is used. Default.
+                `modno`: module index is used. Index is chosen based on last 2
+                    integers in karabo_da.
+                `qm`: QxMx naming convention is used. Virtual names for
+                    AGIPD, DSSC, and LPD.
             **condition_params: Operating condition parameters defined
                 on an instance level.
         """
@@ -390,7 +410,7 @@ class CalibrationData:
         self.modules = modules
         self.event_at = event_at
         self.snapshot_at = snapshot_at
-        self.da_to = da_to
+        self.module_naming = module_naming
 
         if client is None:
             client = (
@@ -505,7 +525,7 @@ class CalibrationData:
     @property
     def physical_detector_units(self):
         return self._api.physical_detector_units(
-            self.detector["id"], self.snapshot_at, self.da_to
+            self.detector["id"], self.snapshot_at, self.module_naming
         )
 
     @property
@@ -559,7 +579,7 @@ class CalibrationData:
             event_at or self.event_at,
             snapshot_at or self.snapshot_at,
             metadata,
-            da_to=self.da_to,
+            module_naming=self.module_naming,
         )
         return metadata
 
@@ -744,9 +764,9 @@ class CalibrationData:
         try:
             creation_date = data.files[0].metadata()["creationDate"]
         except KeyError:
-            from warnings import warn
+            from warnings import warning
 
-            warn(
+            warning(
                 "Last file modification time used as creation date for old "
                 "DAQ file format may be unreliable"
             )
@@ -756,9 +776,9 @@ class CalibrationData:
             )
         else:
             if not data.is_single_run:
-                from warnings import warn
+                from warnings import warning
 
-                warn(
+                warning(
                     "Sample file used to determine creation date for multi "
                     "run data"
                 )
@@ -847,7 +867,10 @@ class SplitConditionCalibrationData(CalibrationData):
 
         metadata = CCVMetadata()
 
-        dark_calibrations = self.dark_calibrations & set(calibrations)
+        # Calibrations are sorted to ensure using exactly the same query
+        # for multiple configuration. e.g. This is essential for calparrot.
+        dark_calibrations = sorted(
+            self.dark_calibrations & set(calibrations))
         if dark_calibrations:
             self._api.closest_ccv_by_time_by_condition(
                 self.detector_name,
@@ -857,10 +880,11 @@ class SplitConditionCalibrationData(CalibrationData):
                 event_at or self.event_at,
                 snapshot_at or self.snapshot_at,
                 metadata,
-                da_to=self.da_to,
+                module_naming=self.module_naming,
             )
 
-        illum_calibrations = self.illuminated_calibrations & set(calibrations)
+        illum_calibrations = sorted(
+            self.illuminated_calibrations & set(calibrations))
         if illum_calibrations:
             self._api.closest_ccv_by_time_by_condition(
                 self.detector_name,
@@ -870,8 +894,9 @@ class SplitConditionCalibrationData(CalibrationData):
                 event_at or self.event_at,
                 snapshot_at or self.snapshot_at,
                 metadata,
-                da_to=self.da_to,
+                module_naming=self.module_naming,
             )
+
         return metadata
 
 
@@ -915,7 +940,7 @@ class AGIPD_CalibrationData(SplitConditionCalibrationData):
         snapshot_at=None,
         gain_setting=None,
         gain_mode=None,
-        da_to="da",
+        module_naming="da",
         integration_time=12,
         source_energy=9.2,
         pixels_x=512,
@@ -927,7 +952,7 @@ class AGIPD_CalibrationData(SplitConditionCalibrationData):
             client,
             event_at,
             snapshot_at,
-            da_to,
+            module_naming,
         )
 
         self.sensor_bias_voltage = sensor_bias_voltage
@@ -991,7 +1016,7 @@ class LPD_CalibrationData(SplitConditionCalibrationData):
         client=None,
         event_at=None,
         snapshot_at=None,
-        da_to="da",
+        module_naming="da",
     ):
         super().__init__(
             detector_name,
@@ -999,7 +1024,7 @@ class LPD_CalibrationData(SplitConditionCalibrationData):
             client,
             event_at,
             snapshot_at,
-            da_to,
+            module_naming,
         )
 
         self.sensor_bias_voltage = sensor_bias_voltage
@@ -1044,7 +1069,7 @@ class DSSC_CalibrationData(CalibrationData):
         client=None,
         event_at=None,
         snapshot_at=None,
-        da_to="da",
+        module_naming="da",
     ):
         super().__init__(
             detector_name,
@@ -1052,7 +1077,7 @@ class DSSC_CalibrationData(CalibrationData):
             client,
             event_at,
             snapshot_at,
-            da_to,
+            module_naming,
         )
 
         self.sensor_bias_voltage = sensor_bias_voltage
@@ -1100,7 +1125,7 @@ class JUNGFRAU_CalibrationData(CalibrationData):
         client=None,
         event_at=None,
         snapshot_at=None,
-        da_to="da",
+        module_naming="da",
     ):
         super().__init__(
             detector_name,
@@ -1108,7 +1133,7 @@ class JUNGFRAU_CalibrationData(CalibrationData):
             client,
             event_at,
             snapshot_at,
-            da_to,
+            module_naming,
         )
 
         self.sensor_bias_voltage = sensor_bias_voltage
@@ -1160,7 +1185,7 @@ class PNCCD_CalibrationData(CalibrationData):
         client=None,
         event_at=None,
         snapshot_at=None,
-        da_to="da",
+        module_naming="da",
     ):
         # Ignore modules for this detector.
         super().__init__(
@@ -1169,7 +1194,7 @@ class PNCCD_CalibrationData(CalibrationData):
             client,
             event_at,
             snapshot_at,
-            da_to,
+            module_naming,
         )
 
         self.sensor_bias_voltage = sensor_bias_voltage
@@ -1215,7 +1240,7 @@ class EPIX100_CalibrationData(SplitConditionCalibrationData):
         client=None,
         event_at=None,
         snapshot_at=None,
-        da_to="da",
+        module_naming="da",
     ):
         # Ignore modules for this detector.
         super().__init__(
@@ -1224,7 +1249,7 @@ class EPIX100_CalibrationData(SplitConditionCalibrationData):
             client,
             event_at,
             snapshot_at,
-            da_to,
+            module_naming,
         )
 
         self.sensor_bias_voltage = sensor_bias_voltage
@@ -1264,7 +1289,7 @@ class GOTTHARD2_CalibrationData(CalibrationData):
         client=None,
         event_at=None,
         snapshot_at=None,
-        da_to="da",
+        module_naming="da",
     ):
         # Ignore modules for this detector.
         super().__init__(
@@ -1273,7 +1298,7 @@ class GOTTHARD2_CalibrationData(CalibrationData):
             client,
             event_at,
             snapshot_at,
-            da_to,
+            module_naming,
         )
 
         self.sensor_bias_voltage = sensor_bias_voltage
-- 
GitLab