diff --git a/lofar_station_client/devices.py b/lofar_station_client/devices.py index 5603a7a790a60746f1c265f0c7d9c2f8379bdf13..aac73f1b8f89f2c859c5f5fd42f9450b8116ad1f 100644 --- a/lofar_station_client/devices.py +++ b/lofar_station_client/devices.py @@ -8,6 +8,7 @@ import numpy from tango import DeviceProxy from tango import ExtractAs + class LofarDeviceProxy(DeviceProxy): """A LOFAR-specific tango.DeviceProxy that provides a richer experience.""" @@ -20,10 +21,14 @@ class LofarDeviceProxy(DeviceProxy): @lru_cache() def get_attribute_shape(self, name): - # "format" property describes actual dimensions as a tuple (x, y, z, ...), - # so reshape the value accordingly. + """Get the shape of the requested attribute, as a tuple.""" + config = self.get_attribute_config(name) + if config.format and config.format[0] == "(": + # For >2D arrays, the "format" property describes actual + # the dimensions as a tuple (x, y, z, ...), + # so reshape the value accordingly. shape = ast.literal_eval(config.format) elif config.max_dim_y > 0: # 2D array @@ -61,7 +66,9 @@ class LofarDeviceProxy(DeviceProxy): value = numpy.array(value) if value.shape != shape: - raise ValueError(f"Invalid shape. Given: {value.shape} Expected: {shape}") + raise ValueError( + f"Invalid shape. Given: {value.shape} Expected: {shape}" + ) if len(shape) > 2: # >2D arrays collapse into 2D diff --git a/tests/test_devices.py b/tests/test_devices.py index 22ecb3adff749f73cbcef52fcb4b9f6da1eeaf64..ed90eaaf8cacd387ac22b406fc8983a3a0cedc9c 100644 --- a/tests/test_devices.py +++ b/tests/test_devices.py @@ -17,22 +17,12 @@ class MyDevice(Device): access=AttrWriteType.READ_WRITE, ) - scalar = attribute( - dtype=bool, - access=AttrWriteType.READ_WRITE - ) + scalar = attribute(dtype=bool, access=AttrWriteType.READ_WRITE) - spectrum = attribute( - dtype=(bool,), - max_dim_x=2, - access=AttrWriteType.READ_WRITE - ) + spectrum = attribute(dtype=(bool,), max_dim_x=2, access=AttrWriteType.READ_WRITE) image = attribute( - dtype=((bool,),), - max_dim_x=2, - max_dim_y=3, - access=AttrWriteType.READ_WRITE + dtype=((bool,),), max_dim_x=2, max_dim_y=3, access=AttrWriteType.READ_WRITE ) def init_device(self): @@ -77,7 +67,7 @@ class LofarDeviceProxyTest(base.TestCase): @classmethod def setUpClass(cls): # setting up the TestContext takes ~1 second, so do it only once - cls.context = MultiDeviceTestContext( + cls.context = MultiDeviceTestContext( cls.TEST_DEVICE_INFO, process=True, ) @@ -107,23 +97,22 @@ class LofarDeviceProxyTest(base.TestCase): def test_read_image(self): value = self.proxy.image - self.assertEqual((3,2), value.shape) + self.assertEqual((3, 2), value.shape) self.assertEqual(numpy.bool_, type(value[0, 0])) - def test_write_image(self): self.proxy.image = [[True, False]] * 3 def test_write_3D_attribute_lists(self): self.proxy.A = [ - [True, True, True, True], - [True, True, True, True], - [True, True, True, True], - ], [ - [False, False, False, False], - [False, False, False, False], - [False, False, False, False], - ] + [True, True, True, True], + [True, True, True, True], + [True, True, True, True], + ], [ + [False, False, False, False], + [False, False, False, False], + [False, False, False, False], + ] def test_write_3D_attribute_numpy(self): self.proxy.A = numpy.zeros((2, 3, 4), dtype=bool)