From 1f67f1cb2a6f779bdc0ea3e3470c5e732478f3d7 Mon Sep 17 00:00:00 2001
From: ahmedk <karim.ahmed@xfel.eu>
Date: Thu, 22 Dec 2022 11:16:39 +0100
Subject: [PATCH] snapshot_at to pdu_snapshot_at,
 restful_config.calibration_client(), and move module_mapping to
 physical_detector_units property

---
 src/cal_tools/calcat_interface.py | 113 +++++++++++++++---------------
 src/cal_tools/restful_config.py   |  16 +++++
 2 files changed, 71 insertions(+), 58 deletions(-)

diff --git a/src/cal_tools/calcat_interface.py b/src/cal_tools/calcat_interface.py
index 3a70239fd..3fd06aecb 100644
--- a/src/cal_tools/calcat_interface.py
+++ b/src/cal_tools/calcat_interface.py
@@ -145,41 +145,22 @@ class CalCatApi(metaclass=ClientWrapper):
     def physical_detector_units(
         self,
         detector_id,
-        snapshot_at,
-        module_naming="da",
+        pdu_snapshot_at,
     ):
         """Physical detector unit metadata."""
 
         resp_pdus = PhysicalDetectorUnit.get_all_by_detector(
-            self.client, detector_id, self.format_time(snapshot_at)
+            self.client, detector_id, self.format_time(pdu_snapshot_at)
         )
 
         if not resp_pdus["success"]:
             raise CalCatError(resp_pdus)
 
-        # 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!")
+        return {
+            pdu['karabo_da']: {
+                k: pdu[k] for k in self.get_pdu_keys}
+            for pdu in resp_pdus['data']
+        }
 
     @lru_cache()
     def calibration_id(self, calibration_name):
@@ -212,7 +193,7 @@ class CalCatApi(metaclass=ClientWrapper):
         condition,
         modules=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         metadata=None,
         module_naming="da",
     ):
@@ -233,7 +214,7 @@ class CalCatApi(metaclass=ClientWrapper):
                 or None for all (default).
             event_at (datetime, date, str or None): Time at which the
                 CCVs should have been valid or None for now (default).
-            snapshot_at (datetime, date, str or None): Time of database
+            pdu_snapshot_at (datetime, date, str or None): Time of database
                 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).
@@ -251,7 +232,7 @@ class CalCatApi(metaclass=ClientWrapper):
                 passed.
         """
         event_at = self.format_time(event_at)
-        snapshot_at = self.format_time(snapshot_at)
+        pdu_snapshot_at = self.format_time(pdu_snapshot_at)
 
         if metadata is None:
             metadata = CCVMetadata()
@@ -286,7 +267,7 @@ class CalCatApi(metaclass=ClientWrapper):
             self.format_cond(condition),
             karabo_da=karabo_da,
             event_at=event_at,
-            snapshot_at=snapshot_at,
+            pdu_snapshot_at=pdu_snapshot_at,
         )
 
         if not resp_versions["success"]:
@@ -376,7 +357,7 @@ class CalibrationData:
         modules=None,
         client=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         module_naming="da",
     ):
         """Initialize a new CalibrationData object.
@@ -393,7 +374,7 @@ class CalibrationData:
                 communication, global one by default.
             event_at (datetime, date, str or None): Default time at which the
                 CCVs should have been valid, now if omitted
-            snapshot_at (datetime, date, str or None): Default time of
+            pdu_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:
@@ -409,10 +390,11 @@ class CalibrationData:
         self.detector_name = detector_name
         self.modules = modules
         self.event_at = event_at
-        self.snapshot_at = snapshot_at
+        self.pdu_snapshot_at = pdu_snapshot_at
         self.module_naming = module_naming
 
         if client is None:
+
             client = (
                 self.__class__.default_client
                 or self.__class__.new_anonymous_client()
@@ -524,9 +506,24 @@ class CalibrationData:
 
     @property
     def physical_detector_units(self):
-        return self._api.physical_detector_units(
-            self.detector["id"], self.snapshot_at, self.module_naming
-        )
+        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!")
 
     @property
     def condition(self):
@@ -540,7 +537,7 @@ class CalibrationData:
             "modules",
             "client",
             "event_at",
-            "snapshot_at",
+            "pdu_snapshot_at",
         } | {self._simplify_parameter_name(name) for name in self.parameters}
 
         kwargs = {key: getattr(self, key) for key in keys}
@@ -552,7 +549,7 @@ class CalibrationData:
         self,
         calibrations=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
     ):
         """Query CCV metadata for calibrations, conditions and time.
 
@@ -562,7 +559,7 @@ class CalibrationData:
             event_at (datetime, date, str or None): Time at which the
                 CCVs should have been valid, now or default value passed at
                 initialization time if omitted.
-            snapshot_at (datetime, date, str or None): Time of database
+            pdu_snapshot_at (datetime, date, str or None): Time of database
                 state to look at, now or default value passed at
                 initialization time if omitted.
 
@@ -577,7 +574,7 @@ class CalibrationData:
             self.condition,
             self.modules,
             event_at or self.event_at,
-            snapshot_at or self.snapshot_at,
+            pdu_snapshot_at or self.pdu_snapshot_at,
             metadata,
             module_naming=self.module_naming,
         )
@@ -832,7 +829,7 @@ class SplitConditionCalibrationData(CalibrationData):
         self,
         calibrations=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
     ):
         """Query CCV metadata for calibrations, conditions and time.
 
@@ -842,7 +839,7 @@ class SplitConditionCalibrationData(CalibrationData):
             event_at (datetime, date, str or None): Time at which the
                 CCVs should have been valid, now or default value passed at
                 initialization time if omitted.
-            snapshot_at (datetime, date, str or None): Time of database
+            pdu_snapshot_at (datetime, date, str or None): Time of database
                 state to look at, now or default value passed at
                 initialization time if omitted.
 
@@ -868,7 +865,7 @@ class SplitConditionCalibrationData(CalibrationData):
                 self.dark_condition,
                 self.modules,
                 event_at or self.event_at,
-                snapshot_at or self.snapshot_at,
+                pdu_snapshot_at or self.pdu_snapshot_at,
                 metadata,
                 module_naming=self.module_naming,
             )
@@ -882,7 +879,7 @@ class SplitConditionCalibrationData(CalibrationData):
                 self.illuminated_condition,
                 self.modules,
                 event_at or self.event_at,
-                snapshot_at or self.snapshot_at,
+                pdu_snapshot_at or self.pdu_snapshot_at,
                 metadata,
                 module_naming=self.module_naming,
             )
@@ -927,7 +924,7 @@ class AGIPD_CalibrationData(SplitConditionCalibrationData):
         modules=None,
         client=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         gain_setting=None,
         gain_mode=None,
         module_naming="da",
@@ -941,7 +938,7 @@ class AGIPD_CalibrationData(SplitConditionCalibrationData):
             modules,
             client,
             event_at,
-            snapshot_at,
+            pdu_snapshot_at,
             module_naming,
         )
 
@@ -1005,7 +1002,7 @@ class LPD_CalibrationData(SplitConditionCalibrationData):
         modules=None,
         client=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         module_naming="da",
     ):
         super().__init__(
@@ -1013,7 +1010,7 @@ class LPD_CalibrationData(SplitConditionCalibrationData):
             modules,
             client,
             event_at,
-            snapshot_at,
+            pdu_snapshot_at,
             module_naming,
         )
 
@@ -1058,7 +1055,7 @@ class DSSC_CalibrationData(CalibrationData):
         modules=None,
         client=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         module_naming="da",
     ):
         super().__init__(
@@ -1066,7 +1063,7 @@ class DSSC_CalibrationData(CalibrationData):
             modules,
             client,
             event_at,
-            snapshot_at,
+            pdu_snapshot_at,
             module_naming,
         )
 
@@ -1114,7 +1111,7 @@ class JUNGFRAU_CalibrationData(CalibrationData):
         modules=None,
         client=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         module_naming="da",
     ):
         super().__init__(
@@ -1122,7 +1119,7 @@ class JUNGFRAU_CalibrationData(CalibrationData):
             modules,
             client,
             event_at,
-            snapshot_at,
+            pdu_snapshot_at,
             module_naming,
         )
 
@@ -1174,7 +1171,7 @@ class PNCCD_CalibrationData(CalibrationData):
         pixels_y=1024,
         client=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         module_naming="da",
     ):
         # Ignore modules for this detector.
@@ -1183,7 +1180,7 @@ class PNCCD_CalibrationData(CalibrationData):
             None,
             client,
             event_at,
-            snapshot_at,
+            pdu_snapshot_at,
             module_naming,
         )
 
@@ -1229,7 +1226,7 @@ class EPIX100_CalibrationData(SplitConditionCalibrationData):
         source_energy=9.2,
         client=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         module_naming="da",
     ):
         # Ignore modules for this detector.
@@ -1238,7 +1235,7 @@ class EPIX100_CalibrationData(SplitConditionCalibrationData):
             None,
             client,
             event_at,
-            snapshot_at,
+            pdu_snapshot_at,
             module_naming,
         )
 
@@ -1278,7 +1275,7 @@ class GOTTHARD2_CalibrationData(CalibrationData):
         single_photon,
         client=None,
         event_at=None,
-        snapshot_at=None,
+        pdu_snapshot_at=None,
         module_naming="da",
     ):
         # Ignore modules for this detector.
@@ -1287,7 +1284,7 @@ class GOTTHARD2_CalibrationData(CalibrationData):
             None,
             client,
             event_at,
-            snapshot_at,
+            pdu_snapshot_at,
             module_naming,
         )
 
diff --git a/src/cal_tools/restful_config.py b/src/cal_tools/restful_config.py
index 7a7944080..5eb32aad2 100644
--- a/src/cal_tools/restful_config.py
+++ b/src/cal_tools/restful_config.py
@@ -1,5 +1,6 @@
 from pathlib import Path
 
+from calibration_client import CalibrationClient
 from dynaconf import Dynaconf
 
 config_dir = Path(__file__).parent.resolve()
@@ -13,3 +14,18 @@ restful_config = Dynaconf(
     ],
     merge_enabled=True,
 )
+
+
+def calibration_client():
+    # Create client for CalCat.
+    calcat_config = restful_config.get('calcat')
+    return CalibrationClient(
+        base_api_url=calcat_config['base-api-url'],
+        use_oauth2=calcat_config['use-oauth2'],
+        client_id=calcat_config['user-id'],
+        client_secret=calcat_config['user-secret'],
+        user_email=calcat_config['user-email'],
+        token_url=calcat_config['token-url'],
+        refresh_url=calcat_config['refresh-url'],
+        auth_url=calcat_config['auth-url'],
+        scope='')
-- 
GitLab