From b5ef7995052aa21db51deabacb195249b7759e9d Mon Sep 17 00:00:00 2001 From: ahmedk <karim.ahmed@xfel.eu> Date: Tue, 20 Apr 2021 15:42:41 +0200 Subject: [PATCH] New notebook for injecting constants from stored h5files --- ...t_calibration_constants_from_h5files.ipynb | 218 ++++++++++++++++++ src/cal_tools/tools.py | 4 +- 2 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 notebooks/LPD/inject_calibration_constants_from_h5files.ipynb diff --git a/notebooks/LPD/inject_calibration_constants_from_h5files.ipynb b/notebooks/LPD/inject_calibration_constants_from_h5files.ipynb new file mode 100644 index 000000000..6b93ca8b4 --- /dev/null +++ b/notebooks/LPD/inject_calibration_constants_from_h5files.ipynb @@ -0,0 +1,218 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Injecting calibration constant data to the database #\n", + "\n", + "Author: European XFEL Detector Group, Version: 1.0\n", + "\n", + "Reading h5files of calibration constants to inject them to the database. Used for LPD" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# calibration constant parameters:\n", + "constant_names = [\"GainMap\", \"GainAmpMap\", \"FFMap\", \"BadPixelsFF\"] # calibration constant name, required.\n", + "in_folder = \"/gpfs/exfel/data/scratch/yousefh/LPD_CalinConst_Provisional/\" # calibration constant file, required.\n", + "proposal = \"\" # Add proposal number to be sent to the database as a part of Raw data location.\n", + "runs = [] # Add list of runs to be sent to the database as a part of Raw data location.\n", + "\n", + "# detector parameters:\n", + "karabo_id = \"FXE_DET_LPD1M-1\" # detector identifier, required.\n", + "karabo_da = [\"LPD00\"] # karabo data aggregators, required.\n", + "\n", + "# calibration database parameters:\n", + "cal_db_interface = \"tcp://max-exfl017:8020\"\n", + "\n", + "# calibration constant conditions:\n", + "memory_cells = 512\n", + "bias_voltage = 250\n", + "capacitor = 5\n", + "creation_time = '2020-01-20T14:12:06' # creation time for the injected constants. required format '2019-01-20T14:12:06'" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "import datetime\n", + "import h5py\n", + "from pathlib import Path\n", + "\n", + "from iCalibrationDB import (\n", + " Constants,\n", + " Conditions,\n", + ")\n", + "from cal_tools.tools import (\n", + " get_from_db,\n", + " get_pdu_from_db,\n", + " send_to_db,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pixels_x = pixels_y = 256\n", + "\n", + "# if proposal or runs are given assign file_loc \n", + "# for calibration constant versions metadata.\n", + "file_loc = \"\"\n", + "if proposal:\n", + " file_loc += f\"proposal:{proposal}\"\n", + "if len(runs) > 0:\n", + " file_loc += f\"runs: {runs}\"\n", + "\n", + "if file_loc == \"\"\n", + " print(\n", + " \"No proposal or runs were given for constant source.\"\n", + " \" No \\\"Raw data location\\\" will be injected with the constants\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def validate_input_paths(in_folder):\n", + " \n", + " # Validate input parameters:\n", + " if not (in_folder):\n", + " raise ValueError(\n", + " \"ERROR: \\\"in_folder\\\" is not given.\"\n", + " \" Please provide the constants input folder.\"\n", + " )\n", + "\n", + " c_folder = Path(in_folder)\n", + " \n", + " if not c_folder.isdir():\n", + " raise ValueError(\n", + " f\"ERROR: in_folder {in_folder} directory doesn't exist.\"\n", + " )\n", + "\n", + " try:\n", + " creation_time = datetime.datetime.strptime(creation_time, '%Y-%m-%dT%H:%M:%S')\n", + " except ValueError:\n", + " raise ValueError(\"Incorrect data format, should be YYYY-MM-DDTHH:MM:SS i.e. 2019-01-20T14:12:06\")\n", + " \n", + " return c_folder, creation_time" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No proposal or runs were given for constant source. No \"Raw data location\" will be injected with the constants\n", + "Physical detector units retrieved are: {'LPD00': 'LPD_SIV1_LPDV2_SM015'}\n", + "BadPixelsFF is injected with creation-time: 2020-01-20 14:12:06\n", + "\n" + ] + } + ], + "source": [ + "c_folder, creation_time = validate_input_paths(in_folder)\n", + "\n", + "# create a report path for calibration constant versions metadata.\n", + "report_path = get_report(\n", + " out_folder=in_folder,\n", + " default_path=f\"No_report/LPD_{datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')}\"\n", + ")\n", + "\n", + "# Calibration constants condition object.\n", + "condition = Conditions.Dark.LPD(\n", + " memory_cells=memory_cells,\n", + " bias_voltage=bias_voltage,\n", + " pixels_x=pixels_x,\n", + " pixels_y=pixels_y,\n", + " capacitor=capacitor,\n", + ")\n", + "\n", + "mod_mapping = {}\n", + "for const in constant_names:\n", + "\n", + " # Calibration constant object.\n", + " constant = getattr(Constants.LPD, const)()\n", + " \n", + " if len(mod_mapping.keys()) == 0\n", + " # Retrieve the detector modules if it is not known.\n", + " physical_units = get_pdu_from_db(\n", + " karabo_id=karabo_id,\n", + " karabo_da=karabo_da,\n", + " constant=constant,\n", + " condition=condition,\n", + " cal_db_interface=cal_db_interface,\n", + " snapshot_at=creation_time\n", + " )\n", + " mod_mapping = dict(zip(karabo_da, physical_units))\n", + " print(\"Physical detector units retrieved are: \", mod_mapping)\n", + "\n", + " for pdu, k_da in zip(physical_units, karabo_da): \n", + "\n", + " cfile = c_folder / f\"{const}_{k_da}\"\n", + "\n", + " # load constant data.\n", + " with h5py.File(cfile, \"r\") as f:\n", + " cdata = f[const][()]\n", + "\n", + " # Validate for only LPD at the moment.\n", + " if not cdata.shape == (pixels_x, pixels_y, memory_cells, 3):\n", + " raise ValueError(\n", + " f\"ERROR: {const} constant data shape is not as expected.\"\n", + " f\" {cdata.shape} != ({pixels_x}, {pixels_y}, {memory_cells}, 3).\"\n", + " )\n", + "\n", + " constant.data = cdata\n", + "\n", + " md = send_to_db(\n", + " db_module=pdu,\n", + " karabo_id=karabo_id,\n", + " constant=constant,\n", + " condition=condition,\n", + " file_loc=file_loc,\n", + " report_path=report_path,\n", + " cal_db_interface=cal_db_interface,\n", + " creation_time=creation_time,\n", + " )" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cal_venv", + "language": "python", + "name": "cal_venv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/cal_tools/tools.py b/src/cal_tools/tools.py index 587bb8970..4f6a3fe6c 100644 --- a/src/cal_tools/tools.py +++ b/src/cal_tools/tools.py @@ -373,13 +373,13 @@ def get_random_db_interface(cal_db_interface): return cal_db_interface -def get_report(out_folder: str): +def get_report(out_folder: str, default_path: str = ""): """Get the report path from calibration_metadata.yml stored in the out_folder. """ metadata = CalibrationMetadata(out_folder) - report_path = metadata.get("report-path", "") + report_path = metadata.get("report-path", default_path) if not report_path: print("WARNING: No report path will be injected " "with the constants.\n") -- GitLab