diff --git a/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb b/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb index 0bbba6c5e5f7d695f4ee09d7249aa20729e8c859..003bab0b3856619b104c5b207ed7a4878adade80 100644 --- a/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb +++ b/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb @@ -269,7 +269,7 @@ " ctrl_src=ctrl_src,\n", ")\n", "agipd_ctrl_dark.sort_dark_runs()\n", - "agipd_ctrl_dark.validate_gain_modes()\n", + "\n", "if mem_cells == 0:\n", " mem_cells = agipd_ctrl_dark.get_memory_cells()\n", "\n", diff --git a/src/cal_tools/agipdlib.py b/src/cal_tools/agipdlib.py index fdb8df0dd13052b9385d6304b786e0bf5d30d350..b8491ff4ba6be40b68bbc9873ea74cb445551c44 100644 --- a/src/cal_tools/agipdlib.py +++ b/src/cal_tools/agipdlib.py @@ -333,29 +333,41 @@ class AgipdCtrlRuns: f"{name} is not the same for all runs {self.runs}" f" with values of {values}, respectively.") - def sort_dark_runs(self, fixed_gain_mode): + def sort_dark_runs(self): """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??. Any more expected PatternTypeIndexs? - if fixed_gain_mode: - # used gain mode - pass - else: # Adaptive mode. patterns -> DarkHG: 1, DarkMG: 2, DarkLG: 3 - patterns = [] - 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) + assert len(self.runs) == 3, f"AGIPD dark runs are expected to be 3. {len(self.runs)} runs are given." + # Expected patterns: + # XRay: 0, DarkHG: 1, DarkMG: 2, DarkLG: 3, PC: 4 and CS: 5. + sort_by = {} + + if self.gain_modes == self.adaptive_gain_modes: # Adaptive gain + # Patterns -> DarkHG: 1, DarkMG: 2, DarkLG: 3 + if "AGIPD1M" in self.ctrl_src: + pattern_dataset = "patternTypeIndex" + elif "AGIPD500K" in self.ctrl_src: + pattern_dataset = "expTypeIndex" + + sort_by[pattern_dataset] = [] # sort by patterns + for c in self.run_ctrls: + sort_by[pattern_dataset].append(c.run_dc[ + self.ctrl_src, pattern_dataset].as_single_value()) + + # Check if a mix of adaptive and fixed gain runs. + elif any(gm == AgipdGainMode.ADAPTIVE_GAIN for gm in self.gain_modes): + raise ValueError( + f"Given runs {self.runs} have a mix of ADAPTIVE and " + f"FIXED gain modes: {self.gain_modes}.") + else: # Fixed gain: Patterns is X-Ray: 0 for all runs. + sort_by["gainModeIndex"] = [int(gm) for gm in self.gain_modes] + + zipped_lists = zip(list(sort_by.values())[0], 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. Runs will be sorted from" - f" {self.runs} with patternTypeIndexs {patterns} to " + f" {self.runs} with {list(sort_by.keys())[0]} {list(sort_by.values())} to " f" {sorted_runs}.") # Update run_ctrls and runs order self.runs = sorted_runs diff --git a/tests/test_agipdlib.py b/tests/test_agipdlib.py index e312c377a13309a02351214243a95a7324e199bc..fed4b365d2960392729503e79a9e63e59655fe0a 100644 --- a/tests/test_agipdlib.py +++ b/tests/test_agipdlib.py @@ -292,34 +292,20 @@ def test_raise_fixed_gain_mode(): with pytest.raises(ValueError): adaptive_fixed_ctrls.fixed_gain_mode() - @pytest.mark.requires_gpfs -def test_raise_validate_gain_modes(): - adaptive_fixed_ctrls = AgipdCtrlRuns( - raw_folder=TEST_RAW_FOLDER, - runs=[9011, 9016, 9017], - image_src=SPB_AGIPD_INST_SRC, - ctrl_src=CTRL_SRC, - ) - with pytest.raises(ValueError): - adaptive_fixed_ctrls.validate_gain_modes() - - unsorted_fixed_gain_ctrls = AgipdCtrlRuns( - raw_folder=TEST_RAW_FOLDER, - runs=[9013, 9011, 9012], # unsorted fixed gain runs - image_src=SPB_AGIPD_INST_SRC, - ctrl_src=CTRL_SRC, - ) - with pytest.raises(ValueError): - unsorted_fixed_gain_ctrls.validate_gain_modes() - -@pytest.mark.requires_gpfs -def test_sort_dark_runs(): - unsorted_runs_ctrls = AgipdCtrlRuns( +@pytest.mark.parametrize( + "runs,expected", + [ + ([9013, 9011, 9012], [9011, 9012, 9013]), + ([9017, 9016, 9015], [9015, 9016, 9017]), + ], +) +def test_sort_dark_runs(runs, expected): + runs_ctrls = AgipdCtrlRuns( raw_folder=TEST_RAW_FOLDER, - runs=[9013, 9011, 9012], # unsorted runs + runs=runs, image_src=SPB_AGIPD_INST_SRC, ctrl_src=CTRL_SRC, ) - unsorted_runs_ctrls.sort_dark_runs() - assert unsorted_runs_ctrls.runs == [9011, 9012, 9013] \ No newline at end of file + runs_ctrls.sort_dark_runs() + assert runs_ctrls.runs == expected