diff --git a/notebooks/LPD/LPDChar_Darks_NBC.ipynb b/notebooks/LPD/LPDChar_Darks_NBC.ipynb index de76f651d6b3f713b3e96102a8dd793eb850a3d9..513ab120c02bf376878168d98380c0c4cae2293d 100644 --- a/notebooks/LPD/LPDChar_Darks_NBC.ipynb +++ b/notebooks/LPD/LPDChar_Darks_NBC.ipynb @@ -33,6 +33,7 @@ "karabo_id = \"FXE_DET_LPD1M-1\" # karabo karabo_id\n", "karabo_da = ['-1'] # a list of data aggregators names, Default [-1] for selecting all data aggregators\n", "source_name = \"{}/DET/{}CH0:xtdf\" # Source name for raw detector data - filled with karabo_id & module number\n", + "ctrl_src_template = \"{}/COMP/FEM_MDL_COMP\" # Control device source name template.\n", "\n", "use_dir_creation_date = True # use the creation date of the directory for database time derivation\n", "cal_db_interface = \"tcp://max-exfl-cal001:8015#8025\" # the database interface to use\n", @@ -97,7 +98,10 @@ "from extra_data import RunDirectory\n", "\n", "from cal_tools.enums import BadPixels\n", - "from cal_tools.lpdlib import make_cell_order_condition\n", + "from cal_tools.lpdlib import (\n", + " make_cell_order_condition,\n", + " sort_dark_runs_by_gain,\n", + ")\n", "from cal_tools.plotting import (\n", " create_constant_overview,\n", " plot_badpix_3d,\n", @@ -131,7 +135,12 @@ "max_cells = mem_cells\n", "cells = np.arange(max_cells)\n", "gain_names = ['High', 'Medium', 'Low']\n", - " \n", + "# Check dark runs order and sort if needed.\n", + "run_nums = sort_dark_runs_by_gain(\n", + " raw_folder=in_folder,\n", + " runs=[run_high, run_med, run_low],\n", + " ctrl_src=ctrl_src_template.format(karabo_id),\n", + ")\n", "if karabo_da[0] == '-1':\n", " if modules[0] == -1:\n", " modules = list(range(16))\n", @@ -143,7 +152,7 @@ "\n", "creation_time = None\n", "if use_dir_creation_date:\n", - " creation_time = get_dir_creation_date(in_folder, run_high)\n", + " creation_time = get_dir_creation_date(in_folder, run_nums[0])\n", " print(\"Using {} as creation time\".format(creation_time))\n", "\n", "if inject_cell_order not in {'auto', 'always', 'never'}:\n", @@ -157,7 +166,7 @@ "print('CalDB Interface {}'.format(cal_db_interface))\n", "print(\"Proposal: {}\".format(prop))\n", "print(\"Memory cells: {}/{}\".format(mem_cells, max_cells))\n", - "print(\"Runs: {}, {}, {}\".format(run_high, run_med, run_low))\n", + "print(\"Runs: {}\".format(run_nums))\n", "print(\"Using DB: {}\".format(db_output))\n", "print(\"Input: {}\".format(in_folder))\n", "print(\"Output: {}\".format(out_folder))\n", @@ -334,7 +343,7 @@ "source": [ "# Read report path and create file location tuple to add with the injection\n", "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n", - "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_low, run_med, run_high)\n", + "file_loc = 'proposal:{} runs:{}'.format(proposal, run_nums.split(\" \")) \n", "\n", "report = get_report(metadata_folder)" ] diff --git a/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb b/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb index a875f52a4c458590bbaae4c4fe3d08035628eab1..bb199451e4a785fb09b5062d487dcd25ca6b4196 100644 --- a/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb +++ b/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb @@ -88,7 +88,10 @@ "\n", "from cal_tools.calcat_interface import CalCatApi\n", "from cal_tools.enums import BadPixels\n", - "from cal_tools.lpdlib import make_cell_order_condition\n", + "from cal_tools.lpdlib import (\n", + " make_cell_order_condition,\n", + " sort_dark_runs_by_gain,\n", + ")\n", "from cal_tools.plotting import plot_badpix_3d\n", "from cal_tools.restful_config import calibration_client\n", "from cal_tools.tools import (\n", @@ -110,28 +113,35 @@ "mem_cells = 512\n", "gain_names = ['High', 'Medium', 'Low']\n", "const_shape = (mem_cells, 32, 256, 3) # cells, slow_scan, fast_scan, gain\n", - " \n", + "\n", + "source_name = source_name.format(karabo_id)\n", + "control_source_name = control_source_name.format(karabo_id)\n", + "\n", + "# Check dark runs order and sort if needed.\n", + "run_nums = sort_dark_runs_by_gain(\n", + " raw_folder=in_folder,\n", + " runs=[run_high, run_med, run_low],\n", + " ctrl_src=control_source_name.format(karabo_id),\n", + ")\n", + "\n", "gain_runs = {}\n", "if capacitor_setting == 5:\n", - " gain_runs[\"high_5pf\"] = run_high\n", - " gain_runs[\"med_5pf\"] = run_med\n", - " gain_runs[\"low_5pf\"] = run_low\n", + " gain_runs[\"high_5pf\"] = run_nums[0]\n", + " gain_runs[\"med_5pf\"] = run_nums[1]\n", + " gain_runs[\"low_5pf\"] = run_nums[2]\n", "elif capacitor_setting == 50:\n", - " gain_runs[\"high_50pf\"] = run_high\n", - " gain_runs[\"med_50pf\"] = run_med\n", - " gain_runs[\"low_50pf\"] = run_low\n", + " gain_runs[\"high_50pf\"] = run_nums[0]\n", + " gain_runs[\"med_50pf\"] = run_nums[1]\n", + " gain_runs[\"low_50pf\"] = run_nums[2]\n", "\n", "capacitor_settings = [capacitor_setting]\n", "capacitor_settings = ['{}pf'.format(c) for c in capacitor_settings]\n", "\n", - "creation_time = calcat_creation_time(in_folder, run_high, creation_time)\n", + "creation_time = calcat_creation_time(in_folder, run_nums[0], creation_time)\n", "print(f\"Using {creation_time} as creation time\")\n", "\n", - "source_name = source_name.format(karabo_id)\n", - "control_source_name = control_source_name.format(karabo_id)\n", - "\n", "if -1 in {bias_voltage_0, bias_voltage_1}:\n", - " run_data = RunDirectory(os.path.join(in_folder, f\"r{run_high:04d}\"))\n", + " run_data = RunDirectory(os.path.join(in_folder, f\"r{run_nums[0]:04d}\"))\n", " if bias_voltage_0 == -1:\n", " bias_voltage_0 = run_data[control_source_name, 'sensorBiasVoltage0'].as_single_value(atol=5.)\n", " if bias_voltage_1 == -1:\n", @@ -143,7 +153,7 @@ "print(f'CalDB Interface {cal_db_interface}')\n", "print(f\"Proposal: {prop}\")\n", "print(f\"Memory cells: {mem_cells}\")\n", - "print(f\"Runs: {run_high}, {run_med}, {run_low}\")\n", + "print(f\"Runs: {run_nums}\")\n", "print(f\"Using DB: {db_output}\")\n", "print(f\"Input: {in_folder}\")\n", "print(f\"Output: {out_folder}\")\n", @@ -331,7 +341,7 @@ "source": [ "# Read report path and create file location tuple to add with the injection\n", "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n", - "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_low, run_med, run_high)\n", + "file_loc = 'proposal:{} runs:{}'.format(proposal, run_nums.split(\" \"))\n", "\n", "report = get_report(metadata_folder)" ] diff --git a/src/cal_tools/lpdlib.py b/src/cal_tools/lpdlib.py index b61652b33005bf31e1838103c9d5fb59c2f889c9..9d6b19fe4643b542480fd998ffa65f0041c67fca 100644 --- a/src/cal_tools/lpdlib.py +++ b/src/cal_tools/lpdlib.py @@ -1,9 +1,12 @@ import copy +from logging import warning +from pathlib import Path from typing import List, Optional, Tuple from warnings import warn import h5py import numpy as np +from extra_data import RunDirectory from iCalibrationDB import Conditions, Constants, Detectors from cal_tools.enums import BadPixels @@ -807,3 +810,41 @@ def make_cell_order_condition(use_param, cellid_pattern) -> Optional[str]: use = (use_param == 'always') return (",".join([str(c) for c in cellid_pattern]) + ",") if use else None + + +def sort_sort_dark_runs_by_gain(raw_folder, runs, ctrl_src): + """Check gain factors [100, 10, 1] to decide, + if provided dark runs are in the correct order. + + Args: + raw_folder (Union[str, Path]): The raw data path. + runs (list): A list of 3 runs. + ctrl_src (str): The CTRL source to check `RUN/.../femAsicGain`. + Return: + (list): Sorted dark runs. + """ + run_to_gain = dict() + expected_gain_factors = [100, 10, 1] + assert len(set(runs)) == 3, f"A list of {len(runs)} runs is provided, three different dark runs are expected." # noqa + + for r in runs: + run_to_gain[r] = RunDirectory( + Path(raw_folder) / f"r{r:04d}").get_run_value( + ctrl_src, "femAsicGain") + + if len(set(run_to_gain.values())) < 3: + raise ValueError( + f"Incorrect gain factors for the provided dark runs: {run_to_gain}." + f" The expected gain factors for these runs are {expected_gain_factors}.") + + sorted_run_to_gain = dict(sorted( + run_to_gain.items(), + key=lambda x: expected_gain_factors.index(x[1]))) + + sorted_runs = list(sorted_run_to_gain.keys()) + if list(run_to_gain.values()) != expected_gain_factors: + warning( + "Dark runs were incorrectly sorted and " + f"have now been corrected to: {sorted_runs}.") + + return sorted_runs