diff --git a/tangostationcontrol/tangostationcontrol/devices/beam.py b/tangostationcontrol/tangostationcontrol/devices/beam.py index 3330d3a3b2be83035d9915ccb5b421e7912a995b..2ad554c3e1285f28f04c071c5fdfa33146173300 100644 --- a/tangostationcontrol/tangostationcontrol/devices/beam.py +++ b/tangostationcontrol/tangostationcontrol/devices/beam.py @@ -47,6 +47,12 @@ class Beam(lofar_device): default_value = numpy.tile(numpy.array([3826923.546, 460915.441, 5064643.489]),(96,16,1)) # CS001LBA, in ITRF2005 timestamp 2012.5 ) + HBAT_signal_input_delays = device_property( + dtype='DevVarFloatArray', + mandatory=False, + default_value = numpy.zeros((96,32), dtype=numpy.float64) + ) + # ---------- # Attributes # ---------- @@ -99,16 +105,19 @@ class Beam(lofar_device): return delays @staticmethod - def _calculate_HBAT_bf_delays(delays: numpy.ndarray): + def _calculate_HBAT_bf_delays(delays: numpy.ndarray, HBAT_signal_input_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. """ # Duplicate delay values per polarisation - polarised_delays = numpy.tile(delays, 2) # output dims -> 96x32 + polarised_delays = numpy.tile(delays, 2) # output dims -> 96x32 + # 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(polarised_delays / 0.5e-09, dtype=numpy.int64) + HBAT_bf_delays = numpy.array(summed_delays / 0.5e-09, dtype=numpy.int64) return HBAT_bf_delays @@ -118,8 +127,9 @@ class Beam(lofar_device): """ # Retrieve delays from casacore delays = self._HBAT_delays(pointing_direction, timestamp) + # Convert delays into beam weights - HBAT_bf_delays = self._calculate_HBAT_bf_delays(delays) + HBAT_bf_delays = self._calculate_HBAT_bf_delays(delays, self.HBAT_signal_input_delays) # Write weights to RECV self.recv_proxy.HBAT_BF_delays_RW = HBAT_bf_delays diff --git a/tangostationcontrol/tangostationcontrol/test/devices/test_beam_device.py b/tangostationcontrol/tangostationcontrol/test/devices/test_beam_device.py index 06a6d858114b30a1dc1f1f6ba7314aadf1a2c5c3..71d6745c9333dd1e981d9191003a76e697bce95c 100644 --- a/tangostationcontrol/tangostationcontrol/test/devices/test_beam_device.py +++ b/tangostationcontrol/tangostationcontrol/test/devices/test_beam_device.py @@ -68,7 +68,14 @@ class TestBeamDevice(base.TestCase): proxy.on() self.assertEqual(DevState.ON, proxy.state()) + # verify property is retrieved (workaround) + HBAT_signal_input_delays = beam.Beam.HBAT_signal_input_delays.default_value + self.assertTrue((HBAT_signal_input_delays==numpy.zeros((96,32), dtype=numpy.float64)).all()) + # verify if values are actually transformed - HBAT_delays = proxy.HBAT_delays(numpy.array([["J2000","0deg","0deg"]] * 96).flatten()) - HBAT_bf_delays = beam.Beam._calculate_HBAT_bf_delays(HBAT_delays) + HBAT_delays_flat = proxy.HBAT_delays(numpy.array([["J2000","0deg","0deg"]] * 96).flatten()) + HBAT_delays = numpy.array(HBAT_delays_flat).reshape(96,16) + + HBAT_bf_delays = beam.Beam._calculate_HBAT_bf_delays(HBAT_delays, HBAT_signal_input_delays) self.assertNotEqual(HBAT_delays, HBAT_bf_delays) + self.assertTrue(HBAT_bf_delays[0][0]==numpy.int64((HBAT_delays[0][0]+HBAT_signal_input_delays[0][0])/0.5e-09))