From 26ecb2859f642b08a85c1abb17a86ca0a3925d20 Mon Sep 17 00:00:00 2001
From: ahmedk <karim.ahmed@xfel.eu>
Date: Wed, 3 May 2023 10:01:03 +0200
Subject: [PATCH] Feat: calibrations_timestamps_markdown method and usage use
 JF, epix100, and pnccd

---
 ...Jungfrau_Gain_Correct_and_Verify_NBC.ipynb |  4 ++-
 .../ePix100/Correction_ePix100_NBC.ipynb      |  9 ++---
 notebooks/pnCCD/Correct_pnCCD_NBC.ipynb       |  9 ++---
 src/cal_tools/calcat_interface.py             | 34 +++++++++++++++++++
 4 files changed, 41 insertions(+), 15 deletions(-)

diff --git a/notebooks/Jungfrau/Jungfrau_Gain_Correct_and_Verify_NBC.ipynb b/notebooks/Jungfrau/Jungfrau_Gain_Correct_and_Verify_NBC.ipynb
index 8eeadf72a..ebb0d15f3 100644
--- a/notebooks/Jungfrau/Jungfrau_Gain_Correct_and_Verify_NBC.ipynb
+++ b/notebooks/Jungfrau/Jungfrau_Gain_Correct_and_Verify_NBC.ipynb
@@ -205,7 +205,9 @@
     "if relative_gain:\n",
     "    constant_names += [\"BadPixelsFF10Hz\", \"RelativeGain10Hz\"]\n",
     "\n",
-    "jf_metadata = jf_cal.metadata(calibrations=constant_names)"
+    "jf_metadata = jf_cal.metadata(calibrations=constant_names)\n",
+    "# Display retrieved calibration constants timestamps\n",
+    "display(Markdown(jf_cal.calibrations_timestamps_markdown(metadata=jf_metadata)))"
    ]
   },
   {
diff --git a/notebooks/ePix100/Correction_ePix100_NBC.ipynb b/notebooks/ePix100/Correction_ePix100_NBC.ipynb
index 57c48072c..ae7f91d9e 100644
--- a/notebooks/ePix100/Correction_ePix100_NBC.ipynb
+++ b/notebooks/ePix100/Correction_ePix100_NBC.ipynb
@@ -281,13 +281,8 @@
     ")\n",
     "const_metadata = epix_cal.metadata(calibrations=constant_names)\n",
     "\n",
-    "mod_to_pdu = epix_cal.mod_to_pdu\n",
-    "ccvs_url = \"https://in.xfel.eu/calibration/calibration_constant_versions/\"\n",
-    "for mod, mod_md in const_metadata.items():\n",
-    "    display(Markdown(f\"{mod}({mod_to_pdu[mod]}):\"))\n",
-    "    for cname, c_mdata in mod_md.items():\n",
-    "        display(Markdown(\n",
-    "            f\"- [{cname}]({ccvs_url}/{c_mdata['ccv_id']}): {c_mdata['begin_validity_at']}\"))\n",
+    "# Display retrieved calibration constants timestamps\n",
+    "display(Markdown(epix_cal.calibrations_timestamps_markdown(metadata=const_metadata)))\n",
     "\n",
     "# Load the constant data from files\n",
     "const_data = epix_cal.ndarray_map(metadata=const_metadata)[karabo_da]\n",
diff --git a/notebooks/pnCCD/Correct_pnCCD_NBC.ipynb b/notebooks/pnCCD/Correct_pnCCD_NBC.ipynb
index 557aa099e..f8faf8b71 100644
--- a/notebooks/pnCCD/Correct_pnCCD_NBC.ipynb
+++ b/notebooks/pnCCD/Correct_pnCCD_NBC.ipynb
@@ -342,13 +342,8 @@
     "                \"Relative gain correction is disabled.\")\n",
     "        corr_bools['relgain'] = False\n",
     "\n",
-    "mod_to_pdu = pnccd_cal.mod_to_pdu\n",
-    "ccvs_url = \"https://in.xfel.eu/calibration/calibration_constant_versions/\"\n",
-    "for mod, mod_md in pnccd_metadata.items():\n",
-    "    display(Markdown(f\"{mod}({mod_to_pdu[mod]}):\"))\n",
-    "    for cname, c_mdata in mod_md.items():\n",
-    "        display(Markdown(\n",
-    "            f\"- [{cname}]({ccvs_url}/{c_mdata['ccv_id']}): {c_mdata['begin_validity_at']}\"))\n",
+    "# Display retrieved calibration constants timestamps\n",
+    "display(Markdown(pnccd_cal.calibrations_timestamps_markdown(metadata=pnccd_metadata)))\n",
     "\n",
     "metadata = pnccd_metadata[karabo_da]\n",
     "\n",
diff --git a/src/cal_tools/calcat_interface.py b/src/cal_tools/calcat_interface.py
index bca8e5a3f..792070f2e 100644
--- a/src/cal_tools/calcat_interface.py
+++ b/src/cal_tools/calcat_interface.py
@@ -692,6 +692,40 @@ class CalibrationData:
 
         return self.load_constants_from_metadata(metadata)
 
+    def calibrations_timestamps_markdown(
+        self,
+        metadata=None,
+        ccvs_url = "https://in.xfel.eu/calibration/calibration_constant_versions/",  # noqa
+        ):
+        """Return Markdown text for all detector modules
+        and their retrieved constants creation time
+        with a reference link to the CCV CalCat urls.
+
+        Args:
+            metadata (CCVMetadata):
+                The detector CCV metadata object with all retrieved
+                constants metadata. If metadata is None. Metadata for
+                all calibrations and latest snapshot_at and event_at are used.
+            ccvs_url (Str): The calibration constant version CalCat url.
+        Returns:
+            (Str): markdown text that can be displayed properly using
+                `from IPython.display import Markdown, display`.
+        """
+        markdown_text = ""
+        mod_to_pdu = self.mod_to_pdu
+        if metadata is None:
+            metadata = self.metadata()
+        for mod, mod_md in metadata.items():
+            # Add module name.
+            markdown_text += f"\n{mod}({mod_to_pdu[mod]}):\n"
+            # Add calibration constant name with link to CalCat
+            # and add creation time.
+            for cname, c_mdata in mod_md.items():
+                markdown_text += (
+                    f"- [{cname}]({ccvs_url}/{c_mdata['ccv_id']}): "
+                    f"{c_mdata['begin_validity_at']}\n")
+        return markdown_text
+
     def _build_condition(self, parameters):
         cond = dict()
 
-- 
GitLab