From 8636af78dd55b65b0804b60dcfbe215388e915ec Mon Sep 17 00:00:00 2001
From: ahmedk <karim.ahmed@xfel.eu>
Date: Mon, 9 Oct 2023 15:22:29 +0200
Subject: [PATCH] put back to dataclass and avoid using a dict but sort lists
 directly

---
 src/cal_tools/agipdlib.py | 32 +++++++++++++-------------------
 1 file changed, 13 insertions(+), 19 deletions(-)

diff --git a/src/cal_tools/agipdlib.py b/src/cal_tools/agipdlib.py
index 1be1ac8f4..61a8fac91 100644
--- a/src/cal_tools/agipdlib.py
+++ b/src/cal_tools/agipdlib.py
@@ -326,15 +326,6 @@ 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?
@@ -346,21 +337,24 @@ class AgipdCtrlRuns:
         """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?
+        # SlopesPC: 4  # Gain runs??. Any more expected PatternTypeIndexs?
         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:
+        for c in self.run_ctrls:
+            patterns.append(c.run_dc[
+                self.ctrl_src, "patternTypeIndex"].as_single_value())
+        zipped_lists = zip(patterns, self.runs, self.run_ctrls)
+
+        # Sort the lists based on the patterns
+        sorted_zipped_lists = sorted(zipped_lists, key=lambda item: item[0])
+        _, sorted_runs, sorted_run_ctrls = zip(*sorted_zipped_lists)
+
+        if sorted_runs != 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()]
+            self.runs = sorted_runs
+            self.run_ctrls = sorted_run_ctrls
 
     def validate_gain_modes(self):
         """Validate the runs' gain modes arrangement.
-- 
GitLab