From 5a42d5bfc46fb66457d35be5e8fcbdcd55a8e247 Mon Sep 17 00:00:00 2001
From: David Hammer <dhammer@mailbox.org>
Date: Fri, 8 Apr 2022 14:12:05 +0200
Subject: [PATCH] Including the individual geometry devices

Wow, I guess this was a slight oversight
---
 src/calng/geometries/Agipd1MGeometry.py  | 15 ++++++
 src/calng/geometries/Dssc1MGeometry.py   | 15 ++++++
 src/calng/geometries/JungfrauGeometry.py | 62 ++++++++++++++++++++++++
 src/calng/geometries/Lpd1MGeometry.py    | 15 ++++++
 src/calng/geometries/__init__.py         |  1 +
 5 files changed, 108 insertions(+)
 create mode 100644 src/calng/geometries/Agipd1MGeometry.py
 create mode 100644 src/calng/geometries/Dssc1MGeometry.py
 create mode 100644 src/calng/geometries/JungfrauGeometry.py
 create mode 100644 src/calng/geometries/Lpd1MGeometry.py
 create mode 100644 src/calng/geometries/__init__.py

diff --git a/src/calng/geometries/Agipd1MGeometry.py b/src/calng/geometries/Agipd1MGeometry.py
new file mode 100644
index 00000000..dd800ad7
--- /dev/null
+++ b/src/calng/geometries/Agipd1MGeometry.py
@@ -0,0 +1,15 @@
+import extra_geom
+
+from ..base_geometry import ManualQuadrantsGeometryBase, make_quadrant_corners_node
+
+
+class Agipd1MGeometry(ManualQuadrantsGeometryBase):
+    geometry_class = extra_geom.AGIPD_1MGeometry
+    quadrantCorners = make_quadrant_corners_node(
+        [
+            (-525, 625),
+            (-550, -10),
+            (520, -160),
+            (542.5, 475),
+        ]
+    )
diff --git a/src/calng/geometries/Dssc1MGeometry.py b/src/calng/geometries/Dssc1MGeometry.py
new file mode 100644
index 00000000..55548120
--- /dev/null
+++ b/src/calng/geometries/Dssc1MGeometry.py
@@ -0,0 +1,15 @@
+import extra_geom
+
+from ..base_geometry import ManualQuadrantsGeometryBase, make_quadrant_corners_node
+
+
+class Dssc1MGeometry(ManualQuadrantsGeometryBase):
+    geometry_class = extra_geom.DSSC_1MGeometry
+    quadrantCorners = make_quadrant_corners_node(
+        [
+            (-130, 5),
+            (-130, -125),
+            (5, -125),
+            (5, 5),
+        ]
+    )
diff --git a/src/calng/geometries/JungfrauGeometry.py b/src/calng/geometries/JungfrauGeometry.py
new file mode 100644
index 00000000..c447accc
--- /dev/null
+++ b/src/calng/geometries/JungfrauGeometry.py
@@ -0,0 +1,62 @@
+import extra_geom
+import numpy as np
+from karabo.middlelayer import Hash
+
+from ..base_geometry import ManualModuleListGeometryBase, make_manual_module_list_node
+
+
+class JungfrauGeometry(ManualModuleListGeometryBase):
+    geometry_class = extra_geom.JUNGFRAUGeometry
+    moduleList = make_manual_module_list_node(
+        [
+            Hash("posX", x, "posY", y, "orientX", ox, "orientY", oy)
+            for (x, y, ox, oy) in [
+                (95, 564, -1, -1),
+                (95, 17, -1, -1),
+                (95, -530, -1, -1),
+                (95, -1077, -1, -1),
+                (-1125, -1078, 1, 1),
+                (-1125, -531, 1, 1),
+                (-1125, 16, 1, 1),
+                (-1125, 563, 1, 1),
+            ]
+        ]
+    )
+
+    def _update_manual_from_current(self):
+        self.moduleList.modules = [
+            self._guess_offset_and_orientation(module)
+            for module in self.geometry.modules
+        ]
+
+    def _guess_offset_and_orientation(self, module, asic_gap=2):
+        # note: if this generalizes, make classmethod of ManualModuleListGeometryBase
+        # Working backwards from from_module_positions from detectors.py in extra_geom
+        corners = np.asarray([tile.corner_pos for tile in module])
+        row_1 = corners[0:4]
+        row_2 = corners[4:8]
+        horizontal_diff = np.diff([row_1[:, 0], row_2[:, 0]])
+        vertical_diff = np.diff([row_1[:, 1], row_2[:, 1]], axis=0)
+
+        if np.all(horizontal_diff > 0):
+            x_orientation = 1
+        else:
+            # TODO: maybe warn if also not all < 0
+            x_orientation = -1
+
+        if np.all(vertical_diff > 0):
+            y_orientation = 1
+        else:
+            y_orientation = -1
+
+        corner = module[0].corner_pos
+        module_width = (4 * self.geometry_class.frag_fs_pixels) + (3 * asic_gap)
+        module_height = (2 * self.geometry_class.frag_ss_pixels) + asic_gap
+        corner_x = corner[0] / self.geometry_class.pixel_size - (
+            module_width if x_orientation == -1 else 0
+        )
+        corner_y = corner[1] / self.geometry_class.pixel_size - (
+            module_height if y_orientation == -1 else 0
+        )
+
+        return (corner_x, corner_y, x_orientation, y_orientation)
diff --git a/src/calng/geometries/Lpd1MGeometry.py b/src/calng/geometries/Lpd1MGeometry.py
new file mode 100644
index 00000000..39a5d043
--- /dev/null
+++ b/src/calng/geometries/Lpd1MGeometry.py
@@ -0,0 +1,15 @@
+import extra_geom
+
+from ..base_geometry import ManualQuadrantsGeometryBase, make_quadrant_corners_node
+
+
+class Lpd1MGeometry(ManualQuadrantsGeometryBase):
+    geometry_class = extra_geom.LPD_1MGeometry
+    quadrantCorners = make_quadrant_corners_node(
+        [
+            (11.4, 299),
+            (-11.5, 8),
+            (254.5, -16),
+            (278.5, 275),
+        ]
+    )
diff --git a/src/calng/geometries/__init__.py b/src/calng/geometries/__init__.py
new file mode 100644
index 00000000..b82477f1
--- /dev/null
+++ b/src/calng/geometries/__init__.py
@@ -0,0 +1 @@
+from . import Agipd1MGeometry, Dssc1MGeometry, Lpd1MGeometry, JungfrauGeometry
-- 
GitLab