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