diff --git a/notebooks/LPD/LPD_Correct_Fast.ipynb b/notebooks/LPD/LPD_Correct_Fast.ipynb index 4fd91a297b48fe4f592193f0f5912462ae85d602..d9ff08114dce628a847dedac56635c24aea9ade5 100644 --- a/notebooks/LPD/LPD_Correct_Fast.ipynb +++ b/notebooks/LPD/LPD_Correct_Fast.ipynb @@ -108,7 +108,11 @@ "from cal_tools.calcat_interface import CalCatError, LPD_CalibrationData\n", "from cal_tools.lpdalgs import correct_lpd_frames\n", "from cal_tools.lpdlib import get_mem_cell_pattern, make_cell_order_condition\n", - "from cal_tools.tools import CalibrationMetadata, calcat_creation_time\n", + "from cal_tools.tools import (\n", + " CalibrationMetadata,\n", + " calcat_creation_time,\n", + " write_constants_fragment,\n", + ")\n", "from cal_tools.files import DataFile" ] }, @@ -230,17 +234,6 @@ "# Obtain and prepare calibration constants" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "metadata = CalibrationMetadata(metadata_folder or out_folder)\n", - "# Constant paths & timestamps are saved under retrieved-constants in calibration_metadata.yml\n", - "const_yaml = metadata.setdefault(\"retrieved-constants\", {})" - ] - }, { "cell_type": "code", "execution_count": null, @@ -249,55 +242,41 @@ }, "outputs": [], "source": [ - "const_data = dict() # {\"ModuleName\": {\"ConstantName\": ndarray}}\n", "start = perf_counter()\n", - "if const_yaml:\n", - " const_load_mp = psh.ProcessContext(num_workers=24)\n", - "\n", - " for mod, constants in const_yaml.items():\n", - " const_data[mod] = {} # An empty dictionary stays for a module with no constants.\n", - " for cname, cmdata in constants[\"constants\"].items():\n", - " const_data[mod][cname] = const_load_mp.alloc(\n", - " shape=(256, 256, mem_cells, 3), # All LPD constants have the same shape.\n", - " dtype=np.uint32 if cname.startswith('BadPixels') else np.float32\n", - " )\n", - " def load_constant_dataset(wid, index, mod):\n", - " for cname, mdata in const_yaml[mod][\"constants\"].items():\n", - " with h5py.File(mdata[\"path\"], \"r\") as cf:\n", - " cf[f\"{mdata['dataset']}/data\"].read_direct(const_data[mod][cname])\n", - "\n", - " const_load_mp.map(load_constant_dataset, karabo_da)\n", - "else:\n", - " cell_ids_pattern_s = None\n", - " if use_cell_order != 'never':\n", - " # Read the order of memory cells used\n", - " raw_data = xd.DataCollection.from_paths([e[1] for e in data_to_process])\n", - " cell_ids_pattern_s = make_cell_order_condition(\n", - " use_cell_order, get_mem_cell_pattern(raw_data, det_inp_sources)\n", - " )\n", - " print(\"Memory cells order:\", cell_ids_pattern_s)\n", - " lpd_cal = LPD_CalibrationData(\n", - " detector_name=karabo_id,\n", - " modules=karabo_da,\n", - " sensor_bias_voltage=bias_voltage,\n", - " memory_cells=mem_cells,\n", - " feedback_capacitor=capacitor,\n", - " source_energy=photon_energy,\n", - " memory_cell_order=cell_ids_pattern_s,\n", - " category=category,\n", - " event_at=creation_time,\n", - " client=rest_cfg.calibration_client(),\n", - " caldb_root=Path(cal_db_root),\n", + "\n", + "cell_ids_pattern_s = None\n", + "if use_cell_order != 'never':\n", + " # Read the order of memory cells used\n", + " raw_data = xd.DataCollection.from_paths([e[1] for e in data_to_process])\n", + " cell_ids_pattern_s = make_cell_order_condition(\n", + " use_cell_order, get_mem_cell_pattern(raw_data, det_inp_sources)\n", " )\n", - " const_data = lpd_cal.ndarray_map([\"Offset\", \"BadPixelsDark\"])\n", - " try:\n", - " illum_const_data = lpd_cal.ndarray_map(lpd_cal.illuminated_calibrations)\n", - " for key, value in illum_const_data.items():\n", - " const_data.setdefault(key, {}).update(value)\n", - " except CalCatError as e: # TODO: replace when API errors are improved.\n", - " warning(f\"CalCatError: {e}\")\n", + "print(\"Memory cells order:\", cell_ids_pattern_s)\n", + "\n", + "lpd_cal = LPD_CalibrationData(\n", + " detector_name=karabo_id,\n", + " modules=karabo_da,\n", + " sensor_bias_voltage=bias_voltage,\n", + " memory_cells=mem_cells,\n", + " feedback_capacitor=capacitor,\n", + " source_energy=photon_energy,\n", + " memory_cell_order=cell_ids_pattern_s,\n", + " category=category,\n", + " event_at=creation_time,\n", + " client=rest_cfg.calibration_client(),\n", + " caldb_root=Path(cal_db_root),\n", + ")\n", + "\n", + "lpd_metadata = lpd_cal.metadata([\"Offset\", \"BadPixelsDark\"])\n", + "try:\n", + " illum_metadata = lpd_cal.metadata(lpd_cal.illuminated_calibrations)\n", + " for key, value in illum_metadata.items():\n", + " lpd_metadata.setdefault(key, {}).update(value)\n", + "except CalCatError as e: # TODO: replace when API errors are improved.\n", + " warning(f\"CalCatError: {e}\")\n", + "\n", "total_time = perf_counter() - start\n", - "print(f'Loading constants {total_time:.1f}s')" + "print(f'Looking up constants {total_time:.1f}s')" ] }, { @@ -307,7 +286,7 @@ "outputs": [], "source": [ "# Validate the constants availability and raise/warn accordingly.\n", - "for mod, calibrations in const_data.items():\n", + "for mod, calibrations in lpd_metadata.items():\n", " missing_offset = {\"Offset\"} - set(calibrations)\n", " warn_missing_constants = {\n", " \"BadPixelsDark\", \"BadPixelsFF\", \"GainAmpMap\",\n", @@ -324,6 +303,23 @@ "data_to_process = [(mod, in_f, out_f) for mod, in_f, out_f in data_to_process if mod in karabo_da]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write constants metadata to fragment YAML\n", + "write_constants_fragment(\n", + " out_folder=(metadata_folder or out_folder),\n", + " det_metadata=lpd_metadata,\n", + " caldb_root=lpd_cal.caldb_root,\n", + ")\n", + "\n", + "# Load constants data for all constants\n", + "const_data = lpd_cal.ndarray_map(metadata=lpd_metadata)" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/notebooks/LPD/LPD_retrieve_constants_precorrection.ipynb b/notebooks/LPD/LPD_retrieve_constants_precorrection.ipynb deleted file mode 100644 index 27b78bc715629114466f4dd7e6e845c494cc3381..0000000000000000000000000000000000000000 --- a/notebooks/LPD/LPD_retrieve_constants_precorrection.ipynb +++ /dev/null @@ -1,205 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# LPD Retrieving Constants Pre-correction #\n", - "\n", - "Author: European XFEL Detector Group, Version: 1.0\n", - "\n", - "The following notebook provides a constants metadata in a YAML file to use while correcting LPD images." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Input parameters\n", - "in_folder = \"/gpfs/exfel/exp/FXE/202201/p003073/raw/\" # the folder to read data from, required\n", - "out_folder = \"/gpfs/exfel/data/scratch/ahmedk/test/remove/LPD_test\" # the folder to output to, required\n", - "metadata_folder = '' # Directory containing calibration_metadata.yml when run by xfel-calibrate.\n", - "modules = [-1] # Modules indices to correct, use [-1] for all, only used when karabo_da is empty\n", - "karabo_da = [''] # Data aggregators names to correct, use [''] for all\n", - "run = 10 # run to process, required\n", - "\n", - "# Source parameters\n", - "karabo_id = 'FXE_DET_LPD1M-1' # Karabo domain for detector.\n", - "input_source = '{karabo_id}/DET/{module_index}CH0:xtdf' # Input fast data source.\n", - "\n", - "# CalCat parameters\n", - "creation_time = \"\" # The timestamp to use with Calibration DB. Required Format: \"YYYY-MM-DD hh:mm:ss\" e.g. 2019-07-04 11:02:41\n", - "\n", - "# Operating conditions\n", - "mem_cells = 512 # Memory cells, LPD constants are always taken with 512 cells.\n", - "bias_voltage = 250.0 # Detector bias voltage.\n", - "capacitor = '5pF' # Capacitor setting: 5pF or 50pF\n", - "photon_energy = 9.2 # Photon energy in keV.\n", - "category = 0 # Whom to blame.\n", - "use_cell_order = 'auto' # Whether to use memory cell order as a detector condition (not stored for older constants)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from logging import warning\n", - "from pathlib import Path\n", - "\n", - "import numpy as np\n", - "\n", - "from calibration_client import CalibrationClient\n", - "from calibration_client.modules import CalibrationConstantVersion\n", - "import extra_data as xd\n", - "\n", - "from cal_tools.lpdlib import get_mem_cell_pattern, make_cell_order_condition\n", - "import cal_tools.restful_config as rest_cfg\n", - "from cal_tools.calcat_interface import CalCatError, LPD_CalibrationData\n", - "from cal_tools.tools import (\n", - " CalibrationMetadata,\n", - " calcat_creation_time,\n", - ")\n", - "from cal_tools.step_timing import StepTimer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "out_folder = Path(out_folder)\n", - "out_folder.mkdir(exist_ok=True)\n", - "\n", - "metadata = CalibrationMetadata(metadata_folder or out_folder)\n", - "# Constant paths & timestamps are saved under retrieved-constants in calibration_metadata.yml\n", - "retrieved_constants = metadata.setdefault(\"retrieved-constants\", {})\n", - "\n", - "creation_time = calcat_creation_time(in_folder, run, creation_time)\n", - "print(f'Using {creation_time.isoformat()} as creation time')\n", - "\n", - "# Pick all modules/aggregators or those selected.\n", - "if not karabo_da or karabo_da == ['']:\n", - " if not modules or modules == [-1]:\n", - " modules = list(range(16))\n", - "\n", - " karabo_da = [f'LPD{i:02d}' for i in modules]\n", - "else:\n", - " modules = [int(x[-2:]) for x in karabo_da]\n", - "\n", - "# List of detector sources.\n", - "det_inp_sources = [input_source.format(karabo_id=karabo_id, module_index=int(da[-2:])) for da in karabo_da]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "step_timer = StepTimer()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "step_timer.start()\n", - "\n", - "cell_ids_pattern_s = None\n", - "if use_cell_order != 'never':\n", - " # Read the order of memory cells used\n", - " raw_data = xd.RunDirectory(Path(in_folder, f'r{run:04d}'))\n", - " cell_ids_pattern_s = make_cell_order_condition(\n", - " use_cell_order, get_mem_cell_pattern(raw_data, det_inp_sources)\n", - " )\n", - " print(\"Memory cells order:\", cell_ids_pattern_s)\n", - "\n", - "lpd_cal = LPD_CalibrationData(\n", - " detector_name=karabo_id,\n", - " modules=karabo_da,\n", - " sensor_bias_voltage=bias_voltage,\n", - " memory_cells=mem_cells,\n", - " feedback_capacitor=capacitor,\n", - " source_energy=photon_energy,\n", - " memory_cell_order=cell_ids_pattern_s,\n", - " category=category,\n", - " event_at=creation_time,\n", - " client=rest_cfg.calibration_client(),\n", - ")\n", - "\n", - "# Initialize const_data in case no constants were retrieved.\n", - "lpd_cal_metadata = {mod: {\"no-constants-retrieved\": None} for mod in karabo_da}\n", - "\n", - "constant_data = lpd_cal.metadata([\"Offset\", \"BadPixelsDark\"])\n", - "try:\n", - " illum_const_data = lpd_cal.metadata(lpd_cal.illuminated_calibrations)\n", - " for key, value in illum_const_data.items():\n", - " const_data.setdefault(key, {}).update(value)\n", - "except CalCatError as e: # TODO: replace when API errors are improved.\n", - " warning(f\"CalCatError: {e}\")\n", - "\n", - "# Validate the constants availability and raise/warn correspondingly. \n", - "for mod, ccv_dict in lpd_cal_metadata.items():\n", - " missing_offset = {\"Offset\"} - set(ccv_dict)\n", - " warn_missing_constants = {\n", - " \"BadPixelsDark\", \"BadPixelsFF\", \"GainAmpMap\", \"FFMap\", \"RelativeGain\"} - set(ccv_dict)\n", - " if missing_offset:\n", - " warning(f\"Offset constant is not available to correct {mod}\")\n", - " karabo_da.remove(mod)\n", - " if warn_missing_constants:\n", - " warning(f\"Constants {warn_missing_constants} were not retrieved for {mod}.\")\n", - "if not karabo_da: # Offsets are missing for all modules.\n", - " raise Exception(\"Could not find offset constants for all modules, will not correct data.\")\n", - "\n", - "for mod, ccv_dict in lpd_cal_metadata.items():\n", - " mdata_dict = {\"constants\": dict()}\n", - " for cname, ccv_metadata in ccv_dict.items():\n", - " mdata_dict[\"constants\"][cname] = {\n", - " \"path\": str(lpd_cal.caldb_root / ccv_metadata[\"path\"]),\n", - " \"dataset\": ccv_metadata[\"dataset\"],\n", - " \"creation-time\": ccv_metadata[\"begin_validity_at\"],\n", - " \"ccv_id\": ccv_metadata[\"ccv_id\"],\n", - " }\n", - " mdata_dict[\"physical-name\"] = ccv_metadata[\"physical_name\"]\n", - " retrieved_constants[mod] = mdata_dict\n", - "metadata.save()\n", - "\n", - "step_timer.done_step(f\"Stored retrieved constants in {metadata.filename}.\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.8.11 ('.cal4_venv')", - "language": "python", - "name": "python3" - }, - "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.8.11" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "ccde353e8822f411c1c49844e1cbe3edf63293a69efd975d1b44f5e852832668" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/src/xfel_calibrate/notebooks.py b/src/xfel_calibrate/notebooks.py index a35bdaacf97d371abdf06ed5fbbe3d8f4f21a3da..b505e7530d4daf3fe438be191fc0e1743dfca0b9 100644 --- a/src/xfel_calibrate/notebooks.py +++ b/src/xfel_calibrate/notebooks.py @@ -76,8 +76,6 @@ notebooks = { "cluster cores": 8}, }, "CORRECT": { - "pre_notebooks": [ - "notebooks/LPD/LPD_retrieve_constants_precorrection.ipynb"], "notebook": "notebooks/LPD/LPD_Correct_Fast.ipynb", "concurrency": {"parameter": "sequences", "default concurrency": [-1],