From f8f1876b14a455440ff54f7e690ed937ead36957 Mon Sep 17 00:00:00 2001
From: Thomas Kluyver <thomas.kluyver@xfel.eu>
Date: Thu, 27 Apr 2023 13:40:51 +0200
Subject: [PATCH] Number LPD Mini modules from 1-8 rather than 0-7

---
 .../LPDMini/LPD_Mini_Char_Darks_NBC.ipynb     | 51 +++++++++----------
 notebooks/LPDMini/LPD_Mini_Correct.ipynb      | 10 ++--
 2 files changed, 30 insertions(+), 31 deletions(-)

diff --git a/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb b/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb
index d9f7d7a54..6bec3c000 100644
--- a/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb
+++ b/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb
@@ -30,9 +30,10 @@
     "run_low = 12 # run number in which low gain data was recorded, required\n",
     "\n",
     "karabo_id = \"FXE_DET_LPD_MINI\" # karabo karabo_id\n",
-    "karabo_da = ['-1']  # a list of data aggregators names, Default [-1] for selecting all data aggregators\n",
-    "source_name = \"{}/DET/0CH0:xtdf\"\n",
-    "control_source_name = \"{}/FPGA/FEM\"\n",
+    "karabo_da = ['']  # a list of data aggregators names, Default [''] for selecting all data aggregators\n",
+    "modules = [-1]  # Module numbers (1-8) to process, use [-1] for all\n",
+    "source_name = \"{}/DET/0CH0:xtdf\"  # Source name for raw detector data\n",
+    "control_source_name = \"{}/FPGA/FEM\"  # Source name for control device\n",
     "\n",
     "creation_time = \"\"  # Override the timestamp taken from the run (format '2023-03-30 15:04:31')\n",
     "cal_db_interface = \"tcp://max-exfl016:8015#8025\" # the database interface to use\n",
@@ -157,17 +158,15 @@
     "calcat = CalCatApi(client=calibration_client())\n",
     "detector_id = calcat.detector(karabo_id)['id']\n",
     "pdus_by_da = calcat.physical_detector_units(detector_id, pdu_snapshot_at=creation_time)\n",
-    "pdu_name_by_da = {da: p['physical_name'] for (da, p) in pdus_by_da.items()}\n",
+    "mod_num_to_pdu_name = {\n",
+    "    int(da.split('/')[-1]): p['physical_name']\n",
+    "    for (da, p) in pdus_by_da.items()\n",
+    "}\n",
     "\n",
-    "# Override:\n",
-    "#pdu_name_by_da = {'LPDMINI00/1': 'LPD_TEST_FAKE_MINI01', 'LPDMINI00/7': 'LPD_TEST_FAKE_MINI02'}\n",
-    "\n",
-    "if karabo_da and '/' in karabo_da[0]:\n",
-    "    pdu_name_by_da = {da: pdu_name_by_da[da] for da in karabo_da}\n",
+    "if modules and modules != [-1]:\n",
+    "    mod_num_to_pdu_name = {m: mod_num_to_pdu_name[m] for m in modules}\n",
     "else:\n",
-    "    karabo_da = sorted(pdu_name_by_da.keys())\n",
-    "\n",
-    "modules = [int(x.split('/')[-1]) for x in karabo_da]"
+    "    modules = sorted(mod_num_to_pdu_name.keys())"
    ]
   },
   {
@@ -176,8 +175,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "for da, pdu in pdu_name_by_da.items():\n",
-    "    print(f\"{da} -> {pdu}\")"
+    "print(\"Minis in use (1-8) and PDUs:\")\n",
+    "for mod_num, pdu in mod_num_to_pdu_name.items():\n",
+    "    print(f\"Mini {mod_num} -> {pdu}\")"
    ]
   },
   {
@@ -197,7 +197,7 @@
     "parallel_num_threads = multiprocessing.cpu_count() // parallel_num_procs\n",
     "\n",
     "# the actual characterization\n",
-    "def characterize_module(run_path, gg):\n",
+    "def characterize_detector(run_path, gg):\n",
     "\n",
     "    run = RunDirectory(run_path, parallelize=False)\n",
     "    det_source = source_name.format(karabo_id)\n",
@@ -273,7 +273,7 @@
    "outputs": [],
    "source": [
     "def modno_to_slice(m):\n",
-    "    return slice(m * 32, (m + 1) * 32)"
+    "    return slice((m-1) * 32, m * 32)"
    ]
   },
   {
@@ -300,7 +300,7 @@
     "    inp.append((run_path, gain_i))\n",
     "\n",
     "with multiprocessing.Pool(processes=parallel_num_procs) as pool:\n",
-    "    results = pool.starmap(characterize_module, inp)\n",
+    "    results = pool.starmap(characterize_detector, inp)\n",
     "\n",
     "for ir, r in enumerate(results):\n",
     "    offset, noise, gg, bp, data, normal, cellid_pattern = r\n",
@@ -315,7 +315,7 @@
     "        offset_consts[m][..., gg] = offset[:, mod_slice]\n",
     "        noise_consts[m][..., gg] = noise[:, mod_slice]\n",
     "        badpix_consts[m][..., gg] = bp[:, mod_slice]\n",
-    "        data_samples[m][..., gg] = data[:, m]\n",
+    "        data_samples[m][..., gg] = data[:, m - 1]\n",
     "        normal_tests[m][..., gg] = normal[:, mod_slice]\n",
     "\n",
     "    print(f\"{gain_names[gg]} gain. \"\n",
@@ -349,18 +349,18 @@
     "print('Retrieve pre-existing constants for comparison.')\n",
     "cap = capacitor_settings[0]\n",
     "\n",
-    "for mod_num, karabo_da_m in zip(modules, karabo_da):\n",
+    "for mod_num, db_module in mod_num_to_pdu_name.items():\n",
     "    old_const[mod_num] = {}\n",
     "    old_mdata[mod_num] = {}\n",
-    "    db_module = pdu_name_by_da[karabo_da_m]\n",
+    "    karabo_da_m = f'{karabo_da}/{mod_num}'\n",
     "\n",
     "    if inject_cell_order:\n",
     "        mem_cell_order = \",\".join([str(c) for c in cellid_pattern]) + \",\"\n",
     "    else:\n",
     "        mem_cell_order = None\n",
     "\n",
-    "    # mod_num is from 0 to 7, so b_v_0 applies to even numbers\n",
-    "    bias_voltage = bias_voltage_0 if (mod_num % 2 == 0) else bias_voltage_1\n",
+    "    # mod_num is from 1 to 8, so b_v_0 applies to odd numbers\n",
+    "    bias_voltage = bias_voltage_0 if (mod_num % 2 == 1) else bias_voltage_1\n",
     "    condition = Conditions.Dark.LPD(\n",
     "        memory_cells=mem_cells,\n",
     "        pixels_x=256,\n",
@@ -428,8 +428,7 @@
     "# Save constants in the calibration DB\n",
     "md = None\n",
     "cap = capacitor_settings[0]\n",
-    "for mod_num, karabo_da_m in zip(modules, karabo_da):\n",
-    "    db_module = pdu_name_by_da[karabo_da_m]\n",
+    "for mod_num, db_module in mod_num_to_pdu_name.items():\n",
     "    print(f\"Storing constants for PDU {db_module}\")\n",
     "\n",
     "    if inject_cell_order:\n",
@@ -448,8 +447,8 @@
     "        dconst = getattr(Constants.LPD, const_name)()\n",
     "        dconst.data = const_dict[mod_num]\n",
     "\n",
-    "        # mod_num is from 0 to 7, so b_v_0 applies to even numbers\n",
-    "        bias_voltage = bias_voltage_0 if (mod_num % 2 == 0) else bias_voltage_1\n",
+    "        # mod_num is from 1 to 8, so b_v_0 applies to odd numbers\n",
+    "        bias_voltage = bias_voltage_0 if (mod_num % 2 == 1) else bias_voltage_1\n",
     "        \n",
     "        # set the operating condition\n",
     "        condition = Conditions.Dark.LPD(\n",
diff --git a/notebooks/LPDMini/LPD_Mini_Correct.ipynb b/notebooks/LPDMini/LPD_Mini_Correct.ipynb
index 34e6214e3..de07bb7c9 100644
--- a/notebooks/LPDMini/LPD_Mini_Correct.ipynb
+++ b/notebooks/LPDMini/LPD_Mini_Correct.ipynb
@@ -25,7 +25,7 @@
     "out_folder = \"/gpfs/exfel/data/scratch/kluyvert/correct-lpdmini-p4576-r48\"  # the folder to output to, required\n",
     "metadata_folder = ''  # Directory containing calibration_metadata.yml when run by xfel-calibrate.\n",
     "sequences = [-1]  # Sequences to correct, use [-1] for all\n",
-    "modules = [-1]  # Modules indices to correct, use [-1] for all\n",
+    "modules = [-1]  # Module numbers (1-8) to correct, use [-1] for all\n",
     "karabo_da = ['']  # Data aggregators names to correct, use [''] for all\n",
     "run = 48  # run to process, required\n",
     "\n",
@@ -226,7 +226,7 @@
     "else:\n",
     "    modules = sorted(set(modules) & modnos_from_db)\n",
     "\n",
-    "print(\"Modules to correct:\", modules)"
+    "print(\"Modules to correct (of 1-8):\", modules)"
    ]
   },
   {
@@ -286,8 +286,8 @@
     "    (illuminated_calibrations, illuminated_condition)\n",
     "]:\n",
     "    for mod_num in modules:\n",
-    "        # mod_num is from 0 to 7, so b_v_0 applies to even numbers\n",
-    "        bias_voltage = bias_voltage_0 if mod_num % 2 == 0 else bias_voltage_1\n",
+    "        # mod_num is from 1 to 8, so b_v_0 applies to odd numbers\n",
+    "        bias_voltage = bias_voltage_0 if mod_num % 2 == 1 else bias_voltage_1\n",
     "        condition_w_voltage = [dict(parameter_id=1, value=bias_voltage)] + condition\n",
     "        karabo_da_m = f'{karabo_da[0]}/{mod_num}'\n",
     "        \n",
@@ -373,7 +373,7 @@
     "\n",
     "const_shape = (mem_cells, 32 * len(module_nums), 256, 3)  # cells, slow_scan, fast_scan, gain\n",
     "const_slices = [slice(i * 32, (i+1) * 32) for i in range(len(module_nums))]\n",
-    "raw_data_slices = [slice(n * 32, (n+1) * 32) for n in module_nums]\n",
+    "raw_data_slices = [slice((n-1) * 32, n * 32) for n in module_nums]\n",
     "\n",
     "def _assemble_constant(arr, calibration_name):\n",
     "    for mod_num, sl in zip(module_nums, const_slices):\n",
-- 
GitLab