From 8dd90e05bdc0c160c58c1a6d47bb2bc9136e887a Mon Sep 17 00:00:00 2001
From: ahmedk <karim.ahmed@xfel.eu>
Date: Fri, 29 Sep 2023 16:07:08 +0200
Subject: [PATCH] new function validate_dark_runs_order

---
 src/cal_tools/jungfraulib.py | 89 ++++++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)

diff --git a/src/cal_tools/jungfraulib.py b/src/cal_tools/jungfraulib.py
index a7041c5f7..8ca256dd6 100644
--- a/src/cal_tools/jungfraulib.py
+++ b/src/cal_tools/jungfraulib.py
@@ -119,3 +119,92 @@ class JungfrauCtrl():
             return 1
         else:  # DYNAMIC, FORCE_SWITCH_G1, FORCE_SWITCH_G2 or None
             return 0
+
+
+MODES_ORDER = {
+    JGM.DYNAMIC.value: 0,
+    JGM.FORCE_SWITCH_HG1.value: 1,
+    JGM.FORCE_SWITCH_HG2.value: 2,
+    JGM.FIX_GAIN_1.value: 3,
+    JGM.FIX_GAIN_2.value: 4,
+}
+EXPECTED_RUN_ORDER = [
+    [
+        JGM.DYNAMIC.value,
+        JGM.FORCE_SWITCH_HG1.value,
+        JGM.FORCE_SWITCH_HG2.value
+    ],
+    [
+        JGM.DYNAMIC.value,
+        JGM.FIX_GAIN_1.value,
+        JGM.FIX_GAIN_2.value
+    ],
+]
+
+
+def validate_dark_runs_order(
+    raw_folder,
+    runs,
+    ctrl_src,
+    modes_order=MODES_ORDER,
+    expected_run_order=EXPECTED_RUN_ORDER
+):
+    """Validate the 3 dark runs given for Jungfrau.
+
+    Args:
+        raw_folder (str): RAW folder for the validated dark runs.
+        runs (list, optional): [High run, Medium run, Low run]. Defaults to [].
+        ctrl_src (str): Control source path for slow data.
+        modes_order (dict): Gain modes order to sort the runs by.
+        expected_run_order (list):Expected dark runs order to process.
+    Raises:
+        ValueError: Wrong given dark runs
+    """
+    assert len(runs) == 3, "Wrong number of runs. expected a list of 3 runs."
+
+    run_gm_mapping = dict()
+    for run in runs:
+        ctrl_data = JungfrauCtrl(
+            extra_data.RunDirectory(f"{raw_folder}/r{run:04d}/"),
+            ctrl_src)
+        gm = ctrl_data.get_gain_mode_str()
+        run_gm_mapping[run] = gm
+
+    # 1st legacy case before having run.settings in data.
+    if all(value is None for value in run_gm_mapping.values()):
+        warning("run.settings is not stored in the data "
+                f"to read. Hence assuming gain_mode = {gm}"
+                " for adaptive old data.")
+        return runs
+
+    run_gm_mapping = dict(sorted(
+        run_gm_mapping.items(),
+        key=lambda item: modes_order[item[1]]
+        ))
+    if list(run_gm_mapping.keys()) != runs:
+        warning("Given dark runs are unsorted. "
+                f"Runs will be sorted from {runs} of gain modes "
+                f"{list(run_gm_mapping.values())} to "
+                f"{list(run_gm_mapping.keys())}")
+
+    runs = list(run_gm_mapping.keys())
+    modes = list(run_gm_mapping.values())
+
+    legacy_adaptive = [
+        JGM.DYNAMIC.value,
+        JGM.DYNAMIC.value,
+        JGM.FORCE_SWITCH_HG1.value
+    ]
+
+    # 2nd legacy case with CTRL/MDL bug resulting in wrong run settings.
+    if modes == legacy_adaptive:
+        warning(f"run.settings for medium and low gain runs"
+                f" are wrong {modes[1:]}. This is an expected "
+                f"bug for old raw data. Setting gain_mode to {gm}.")
+    elif not modes in expected_run_order:
+        raise ValueError("Wrong dark runs are given. "
+                         f"The given three runs are {runs} with "
+                         f"wrong gain modes {modes}."
+                         "Please verify the selected 3 dark runs to process.")
+
+    return runs
-- 
GitLab