diff --git a/tangostationcontrol/tangostationcontrol/devices/beam.py b/tangostationcontrol/tangostationcontrol/devices/beam.py index 2ad554c3e1285f28f04c071c5fdfa33146173300..357798272a1328c657d51697e90bcdbf09b016fe 100644 --- a/tangostationcontrol/tangostationcontrol/devices/beam.py +++ b/tangostationcontrol/tangostationcontrol/devices/beam.py @@ -9,6 +9,7 @@ import numpy import datetime +from functools import partial from tango.server import attribute, command, device_property from tango import AttrWriteType, DebugIt, DevState, DeviceProxy, DevVarStringArray, DevVarDoubleArray @@ -105,7 +106,7 @@ class Beam(lofar_device): return delays @staticmethod - def _calculate_HBAT_bf_delays(delays: numpy.ndarray, HBAT_signal_input_delays: numpy.ndarray): + def _calculate_HBAT_bf_delays(delays: numpy.ndarray, HBAT_signal_input_delays: numpy.ndarray, HBAT_bf_delay_step_delays: numpy.ndarray): """ Helper function that converts a signal path delay (in seconds) to an analog beam weight, which is a value per tile per dipole per polarisation. @@ -115,10 +116,15 @@ class Beam(lofar_device): # Add signal input delay summed_delays = numpy.add(polarised_delays,HBAT_signal_input_delays) - - # Divide by 0.5ns and round - HBAT_bf_delays = numpy.array(summed_delays / 0.5e-09, dtype=numpy.int64) + # Find the right delay step by looking for the closest match in property RECV-> HBAT_bf_delay_step_delays + HBAT_bf_delays = numpy.zeros((96,32), dtype=numpy.int64) + distance = lambda x , y : numpy.absolute(x-y) + for tile in range(96): + for at in range(32): + delay = summed_delays[tile,at] + step = min(HBAT_bf_delay_step_delays,key=partial(distance,delay)) + HBAT_bf_delays[tile,at] = numpy.int64(delay / step) return HBAT_bf_delays def _HBAT_set_pointing(self, pointing_direction: numpy.array, timestamp: datetime.datetime = datetime.datetime.now()): @@ -129,7 +135,7 @@ class Beam(lofar_device): delays = self._HBAT_delays(pointing_direction, timestamp) # Convert delays into beam weights - HBAT_bf_delays = self._calculate_HBAT_bf_delays(delays, self.HBAT_signal_input_delays) + HBAT_bf_delays = self._calculate_HBAT_bf_delays(delays, self.HBAT_signal_input_delays, self.recv_proxy.HBAT_bf_delay_step_delays) # Write weights to RECV self.recv_proxy.HBAT_BF_delays_RW = HBAT_bf_delays diff --git a/tangostationcontrol/tangostationcontrol/devices/recv.py b/tangostationcontrol/tangostationcontrol/devices/recv.py index bff2817560ccb48c7e1a013eaf58510a3e65aafb..636b694a051b45fd6a1b7e797373080c9ec2cd06 100644 --- a/tangostationcontrol/tangostationcontrol/devices/recv.py +++ b/tangostationcontrol/tangostationcontrol/devices/recv.py @@ -51,39 +51,15 @@ class RECV(opcua_device): HBAT_bf_delay_step_delays = device_property( dtype="DevVarFloatArray", mandatory=False, - default_value=numpy.array([ - 0.0, - 0.5228E-9, - 0.9797E-9, - 1.4277E-9, - 1.9055E-9, - 2.4616E-9, - 2.9539E-9, - 3.4016E-9, - 3.8076E-9, - 4.3461E-9, - 4.9876E-9, - 5.4894E-9, - 5.7973E-9, - 6.2707E-9, - 6.8628E-9, - 7.3989E-9, - 8.0673E-9, - 8.6188E-9, - 9.1039E-9, - 9.5686E-9, - 10.0463E-9, - 10.5774E-9, - 11.0509E-9, - 11.5289E-9, - 11.9374E-9, - 12.4524E-9, - 13.0842E-9, - 13.5936E-9, - 13.9198E-9, - 14.4087E-9, - 14.9781E-9, - 15.5063E-9],dtype=numpy.float64) + default_value=numpy.array([ + 0.0, 0.5228E-9, 0.9797E-9, 1.4277E-9, 1.9055E-9, + 2.4616E-9, 2.9539E-9, 3.4016E-9, 3.8076E-9, 4.3461E-9, + 4.9876E-9, 5.4894E-9, 5.7973E-9, 6.2707E-9, 6.8628E-9, + 7.3989E-9, 8.0673E-9, 8.6188E-9, 9.1039E-9, 9.5686E-9, + 10.0463E-9, 10.5774E-9, 11.0509E-9, 11.5289E-9, 11.9374E-9, + 12.4524E-9, 13.0842E-9, 13.5936E-9, 13.9198E-9, 14.4087E-9, + 14.9781E-9, 15.5063E-9 + ],dtype=numpy.float64) ) first_default_settings = [ diff --git a/tangostationcontrol/tangostationcontrol/test/devices/test_beam_device.py b/tangostationcontrol/tangostationcontrol/test/devices/test_beam_device.py index 1e0b93ffa8625a5125d064b8a8877f43f2ed4824..09e10bdf2b4bc739b16b28c3e59d6b9ff0402e95 100644 --- a/tangostationcontrol/tangostationcontrol/test/devices/test_beam_device.py +++ b/tangostationcontrol/tangostationcontrol/test/devices/test_beam_device.py @@ -71,5 +71,6 @@ class TestBeamDevice(base.TestCase): # verify if values are actually transformed HBAT_delays = proxy.HBAT_delays(numpy.array([["J2000","0deg","0deg"]] * 96).flatten()) HBAT_signal_input_delays = numpy.random.rand(96,32) # tango properties cannot be retrieved for mock devices - HBAT_bf_delays = beam.Beam._calculate_HBAT_bf_delays(numpy.array(HBAT_delays).reshape(96,16), HBAT_signal_input_delays) + HBAT_bf_delay_step_delays = numpy.random.rand(32) + HBAT_bf_delays = beam.Beam._calculate_HBAT_bf_delays(numpy.array(HBAT_delays).reshape(96,16), HBAT_signal_input_delays, HBAT_bf_delay_step_delays) self.assertNotEqual(HBAT_delays, HBAT_bf_delays)