From c606771a60a7280e700ab379c01201ad1bdebc90 Mon Sep 17 00:00:00 2001
From: David Hammer <dhammer@mailbox.org>
Date: Fri, 28 Jan 2022 12:30:36 +0100
Subject: [PATCH] Enable transposition from weird DAQ axis order on GPU

---
 src/calng/JungfrauCorrection.py | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/calng/JungfrauCorrection.py b/src/calng/JungfrauCorrection.py
index 9fc8eadc..33a1b006 100644
--- a/src/calng/JungfrauCorrection.py
+++ b/src/calng/JungfrauCorrection.py
@@ -3,6 +3,7 @@ import enum
 import cupy
 import numpy as np
 from karabo.bound import (
+    BOOL_ELEMENT,
     DOUBLE_ELEMENT,
     KARABO_CLASSINFO,
     OUTPUT_CHANNEL,
@@ -98,10 +99,14 @@ class JungfrauGpuRunner(base_gpu.BaseGpuRunner):
     def _get_gain_map_for_preview(self):
         return self.input_gain_map_gpu
 
-    def load_data(self, image_data, input_gain_map, cell_table):
+    def load_data(self, image_data, input_gain_map, cell_table, daq_transpose=False):
         """Experiment: loading all three in one function as they are tied"""
-        self.input_data_gpu.set(image_data)
-        self.input_gain_map_gpu.set(input_gain_map)
+        if daq_transpose:
+            self.input_data_gpu[:] = cupy.asarray(image_data).transpose()[0]
+            self.input_gain_map_gpu[:] = cupy.asarray(input_gain_map).transpose()[0]
+        else:
+            self.input_data_gpu.set(image_data)
+            self.input_gain_map_gpu.set(input_gain_map)
         if self.burst_mode:
             self.cell_table_gpu.set(cell_table)
 
@@ -253,6 +258,7 @@ class JungfrauCorrection(BaseCorrection):
     _calcat_friend_class = JungfrauCalcatFriend
     _constant_enum_class = JungfrauConstants
     _managed_keys = BaseCorrection._managed_keys.copy()
+    _schema_cache_fields = BaseCorrection._schema_cache_fields.copy()
     _image_data_path = "data.adc"
     _cell_table_path = "data.memoryCell"
 
@@ -281,6 +287,22 @@ class JungfrauCorrection(BaseCorrection):
             .commit(),
         )
 
+        (
+            BOOL_ELEMENT(expected)
+            .key("dataFormat.daqTranspose")
+            .displayedName("Transpose axes from DAQ")
+            .description(
+                "Data on daqOutput channel has interesting axis order. In online "
+                "deployments, this means that a transpose is needed before correction."
+            )
+            .assignmentOptional()
+            .defaultValue(True)
+            .reconfigurable()
+            .commit(),
+        )
+        JungfrauCorrection._schema_cache_fields.add("dataFormat.daqTranspose")
+        JungfrauCorrection._managed_keys.add("dataFormat.daqTranspose")
+
         (
             OUTPUT_CHANNEL(expected)
             .key("preview.outputGainMap")
@@ -341,7 +363,10 @@ class JungfrauCorrection(BaseCorrection):
             cell_table = cell_table[np.newaxis]
         try:
             self.kernel_runner.load_data(
-                image_data, data_hash.get("data.gain"), cell_table
+                image_data,
+                data_hash.get("data.gain"),
+                cell_table,
+                daq_transpose=self._schema_cache["dataFormat.daqTranspose"]
             )
         except ValueError as e:
             self.log_status_warn(f"Failed to load data: {e}")
-- 
GitLab