From 3ce8f69ed773ada28572305256beff2541ccebc2 Mon Sep 17 00:00:00 2001
From: Philipp Schmidt <philipp.schmidt@xfel.eu>
Date: Fri, 13 May 2022 21:24:22 +0200
Subject: [PATCH] Make constant axis ordering configurable and adjust based on
 calibration type

---
 notebooks/LPD/LPD_Correct_Fast.ipynb | 36 +++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git a/notebooks/LPD/LPD_Correct_Fast.ipynb b/notebooks/LPD/LPD_Correct_Fast.ipynb
index 91fe5d360..f624f5fae 100644
--- a/notebooks/LPD/LPD_Correct_Fast.ipynb
+++ b/notebooks/LPD/LPD_Correct_Fast.ipynb
@@ -306,39 +306,57 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "# These are intended in order cell, X, Y, gain\n",
     "ccv_offsets = {}\n",
     "ccv_gains = {}\n",
     "ccv_masks = {}\n",
     "\n",
+    "ccv_shape = (mem_cells, 256, 256, 3)\n",
+    "\n",
+    "constant_order = {\n",
+    "    'Offset':        (1, 0, 2, 3),\n",
+    "    'BadPixelsDark': (1, 0, 2, 3),\n",
+    "    'RelativeGain':  (1, 0, 2, 3),\n",
+    "    'FFMap':         (0, 1, 2, 3),\n",
+    "    'BadPixelsFF':   (0, 1, 2, 3),\n",
+    "    'GainAmpMap':    (0, 1, 2, 3),\n",
+    "}\n",
+    "\n",
     "def prepare_constants(wid, index, aggregator):\n",
     "    consts = {calibration_name: entry['data']\n",
     "              for (aggregator_, calibration_name), entry\n",
     "              in const_data.items()\n",
     "              if aggregator == aggregator_}\n",
     "    \n",
+    "    def _prepare_data(calibration_name, dtype):\n",
+    "        return consts[calibration_name] \\\n",
+    "            .transpose(constant_order[calibration_name]) \\\n",
+    "            .astype(dtype, copy=True)  # Make sure array is contiguous.\n",
+    "    \n",
     "    if offset_corr and 'Offset' in consts:\n",
-    "        ccv_offsets[aggregator] = consts['Offset'].astype(np.float32)\n",
+    "        ccv_offsets[aggregator] = _prepare_data('Offset', np.float32)\n",
     "    else:\n",
-    "        ccv_offsets[aggregator] = np.zeros((256, 256, mem_cells, 3), dtype=np.float32)\n",
+    "        ccv_offsets[aggregator] = np.zeros(ccv_shape, dtype=np.float32)\n",
     "        \n",
-    "    ccv_gains[aggregator] = np.ones((256, 256, mem_cells, 3), dtype=np.float32)\n",
+    "    ccv_gains[aggregator] = np.ones(ccv_shape, dtype=np.float32)\n",
     "    \n",
     "    if 'BadPixelsDark' in consts:\n",
-    "        ccv_masks[aggregator] = consts['BadPixelsDark'].astype(np.uint32)\n",
+    "        ccv_masks[aggregator] = _prepare_data('BadPixelsDark', np.uint32)\n",
     "    else:\n",
-    "        ccv_masks[aggregator] = np.zeros((256, 256, mem_cells, 3), dtype=np.uint32)\n",
+    "        ccv_masks[aggregator] = np.zeros(ccv_shape, dtype=np.uint32)\n",
     "    \n",
     "    if rel_gain and 'RelativeGain' in consts:\n",
-    "        ccv_gains[aggregator] *= consts['RelativeGain']\n",
+    "        ccv_gains[aggregator] *= _prepare_data('RelativeGain', np.float32)\n",
     "        \n",
     "    if ff_map and 'FFMap' in consts:\n",
-    "        ccv_gains[aggregator] *= consts['FFMap']\n",
+    "        ccv_gains[aggregator] *= _prepare_data('FFMap', np.float32)\n",
     "        \n",
     "        if 'BadPixelsFF' in consts:\n",
-    "            np.bitwise_or(ccv_masks[aggregator], consts['BadPixelsFF'], out=ccv_masks[aggregator])\n",
+    "            np.bitwise_or(ccv_masks[aggregator], _prepare_data('BadPixelsFF', np.uint32),\n",
+    "                          out=ccv_masks[aggregator])\n",
     "        \n",
     "    if gain_amp_map and 'GainAmpMap' in consts:\n",
-    "        ccv_gains[aggregator] *= consts['GainAmpMap']\n",
+    "        ccv_gains[aggregator] *= _prepare_data('GainAmpMap', np.float32)\n",
     "        \n",
     "    print('.', end='', flush=True)\n",
     "    \n",
-- 
GitLab