From a8f89ee96b04a0d4af40dd3f2f8d1083580ced7a Mon Sep 17 00:00:00 2001
From: ahmedk <karim.ahmed@xfel.eu>
Date: Mon, 9 Oct 2023 14:31:09 +0200
Subject: [PATCH] sort_dark_runs method

---
 src/cal_tools/agipdlib.py | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/cal_tools/agipdlib.py b/src/cal_tools/agipdlib.py
index d743044f1..1be1ac8f4 100644
--- a/src/cal_tools/agipdlib.py
+++ b/src/cal_tools/agipdlib.py
@@ -326,6 +326,15 @@ class AgipdCtrlRuns:
                 ) for r in self.runs]
         self.gain_modes = self.get_gain_modes()
 
+        self.runs = []
+        self.runs_dict = {}
+        for c in self.run_ctrls:
+            self.runs_dict[c.run] = {
+                "dc": c.run_dc,
+                "ctrl": c,
+            }
+            self.runs.append(c.run)
+
     def _validate_same_value(self, name, values):
             if len(set(values)) != 1:
                 # Should we raise an error and stop processing?
@@ -334,8 +343,24 @@ class AgipdCtrlRuns:
                     f" with values of {values}, respectively.")
 
     def sort_dark_runs(self):
-        assert len(self.run_ctrls) == 3, f"AGIPD dark runs are expected to be 3. {len(self.run_ctrls)} runs are given."  # noqa
-        # TODO: complete sorting
+        """Order dark runs based on PatternTypeIndex."""
+        assert len(self.run_ctrls) == 3, f"AGIPD dark runs are expected to be 3. {len(self.run_ctrls)} runs are given."
+        # Expected patterns: XRay: 0, DarkHG: 1, DarkMG: 2, DarkLG: 3,
+        # SlopesPC: 4  # Gain runs??. Are there any more expected PatternTypeIndex?
+        patterns = []
+        for r, rdict in self.runs_dict.items():
+            pattern = rdict["dc"][
+                self.ctrl_src, "patternTypeIndex"].as_single_value()
+            self.runs_dict[r]["pattern"] = pattern
+            patterns.append(pattern)  # needed in case of unsorted warning.
+        self.runs_dict = sorted(self.runs_dict.items(), key=lambda item: item[1]["pattern"])
+        if list(self.runs_dict.keys()) != self.runs:
+            Warning("Given dark runs are unsorted. Run will be sorted from"
+                    f" {self.runs} with patternTypeIndexs {patterns} to "
+                    f" {list(self.runs_dict.keys())}.")
+             # Update run_ctrls and runs order
+            self.runs = list(self.runs_dict.keys())
+            self.run_ctrls = [v["ctrl"] for v in self.runs_dict.values()]
 
     def validate_gain_modes(self):
         """Validate the runs' gain modes arrangement.
-- 
GitLab