diff --git a/src/calng/DetectorAssembler.py b/src/calng/DetectorAssembler.py index 94418b1a621e101cff0925e27727835c8938d5cb..3ec407bff51a1bbf8b4b88dfc6140bf19de6e2aa 100644 --- a/src/calng/DetectorAssembler.py +++ b/src/calng/DetectorAssembler.py @@ -1,7 +1,5 @@ import enum import functools -import gzip -import pickle import re import numpy as np @@ -30,7 +28,7 @@ from karabo.bound import ( ) from TrainMatcher import TrainMatcher -from . import scenes +from . import geom_utils, scenes, utils from ._version import version as deviceVersion @@ -163,9 +161,9 @@ class DetectorAssembler(TrainMatcher.TrainMatcher): .key("geometryDevice") .displayedName("Geometry device") .description( - "The name of the device which will provide geometries. The device is " - "expected to provide a current geometry as a VectorChar (gzipped " - "pickled extra-geom geometry) element named pickledGeometry" + "The the device which will provide geometry. The device is expected to " + "have current geometry as a string (for now using custom non-robust " + "serialization scheme) element named serializedGeometry." ) .assignmentMandatory() .commit(), @@ -189,10 +187,10 @@ class DetectorAssembler(TrainMatcher.TrainMatcher): geometry_device = self.get("geometryDevice") client = self.remote() try: - initial_geometry = client.get(geometry_device, "pickledGeometry") + initial_geometry = client.get(geometry_device, "serializedGeometry") except RuntimeError: self.log.WARN( - f"Failed to get initial geometry, maybe geometry device is down" + "Failed to get initial geometry, maybe geometry device is down" ) else: self.log.INFO("Got geometry immediately after init :D") @@ -230,14 +228,14 @@ class DetectorAssembler(TrainMatcher.TrainMatcher): return super().requestScene(params) def _receive_geometry(self, device_id, config): - if not config.has("pickledGeometry"): + if not config.has("serializedGeometry"): return self.log.INFO(f"Found geometry on {device_id}") - zipped_geometry = config["pickledGeometry"] - if len(zipped_geometry) == 0: + serialized_geometry = config["serializedGeometry"] + if len(serialized_geometry) == 0: self.log.INFO("New geometry empty, will ignore update.") return - self._geometry = pickle.loads(gzip.decompress(zipped_geometry)) + self._geometry = geom_utils.deserialize_geometry(serialized_geometry) # TODO: allow multiple memory cells (extra geom notion of extra dimensions) self._stack_input_buffer = np.zeros(self._geometry.expected_data_shape) diff --git a/src/calng/base_geometry.py b/src/calng/base_geometry.py index 1b3e052b19fa32e909d687fe32905abd061bb9ef..c2fdb1394a3c6b97cbc798c33470f35f22bf4c80 100644 --- a/src/calng/base_geometry.py +++ b/src/calng/base_geometry.py @@ -1,7 +1,5 @@ import contextlib -import gzip import logging -import pickle import matplotlib.pyplot as plt import numpy as np @@ -24,7 +22,6 @@ from karabo.middlelayer import ( State, String, Unit, - VectorChar, VectorHash, VectorString, get_instance_parent, @@ -33,7 +30,7 @@ from karabo.middlelayer import ( from matplotlib.backends.backend_agg import FigureCanvasAgg from ._version import version as deviceVersion -from . import scenes +from . import geom_utils, scenes def make_x_y_coordinate_node( @@ -199,9 +196,9 @@ class ManualGeometryBase(Device): daqPolicy=DaqPolicy.OMIT, ) - pickledGeometry = VectorChar( - displayedName="Pickled geometry", - defaultValue=[], + serializedGeometry = String( + displayedName="Serialized geometry", + defaultValue="", accessMode=AccessMode.READONLY, ) @@ -209,6 +206,7 @@ class ManualGeometryBase(Device): ImageData(np.empty(0, dtype=np.uint32)), displayedName="Geometry preview", encoding=EncodingType.RGBA, + daqPolicy=DaqPolicy.OMIT, ) geometryFile = Node( @@ -284,7 +282,7 @@ class ManualGeometryBase(Device): async def _set_geometry(self, geometry, update_preview=True): self.geometry = geometry - self.pickledGeometry = gzip.compress(pickle.dumps(self.geometry)) + self.serializedGeometry = geom_utils.serialize_geometry(geometry) if update_preview: await self.updatePreview() diff --git a/src/calng/geom_utils.py b/src/calng/geom_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..de8181380195a8df78e02d3696d17f4c131943bb --- /dev/null +++ b/src/calng/geom_utils.py @@ -0,0 +1,11 @@ +import base64 +import gzip +import pickle + + +def serialize_geometry(geom: "extra_geom.base.DetectorGeometryBase") -> str: + return base64.b64encode(gzip.compress(pickle.dumps(geom))).decode(encoding="ASCII") + + +def deserialize_geometry(serialized: str) -> "extra_geom.base.DetectorGeometryBase": + return pickle.loads(gzip.decompress(base64.b64decode(serialized.encode())))