Skip to content
Snippets Groups Projects
Commit 7ee4bcd4 authored by Stefano Di Frischia's avatar Stefano Di Frischia
Browse files

Merge branch 'L2SS-523-delay-calibration-table' into 'master'

L2SS-523 "Add signal delay calibration table to BEAM"

Closes L2SS-523

See merge request !227
parents bc6b899b cbc04c10
Branches
Tags
1 merge request!227L2SS-523 "Add signal delay calibration table to BEAM"
...@@ -47,6 +47,12 @@ class Beam(lofar_device): ...@@ -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 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 # Attributes
# ---------- # ----------
...@@ -99,16 +105,19 @@ class Beam(lofar_device): ...@@ -99,16 +105,19 @@ class Beam(lofar_device):
return delays return delays
@staticmethod @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, 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. which is a value per tile per dipole per polarisation.
""" """
# Duplicate delay values 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 # 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 return HBAT_bf_delays
...@@ -118,8 +127,9 @@ class Beam(lofar_device): ...@@ -118,8 +127,9 @@ class Beam(lofar_device):
""" """
# Retrieve delays from casacore # Retrieve delays from casacore
delays = self._HBAT_delays(pointing_direction, timestamp) delays = self._HBAT_delays(pointing_direction, timestamp)
# Convert delays into beam weights # 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 # Write weights to RECV
self.recv_proxy.HBAT_BF_delays_RW = HBAT_bf_delays self.recv_proxy.HBAT_BF_delays_RW = HBAT_bf_delays
......
...@@ -68,7 +68,14 @@ class TestBeamDevice(base.TestCase): ...@@ -68,7 +68,14 @@ class TestBeamDevice(base.TestCase):
proxy.on() proxy.on()
self.assertEqual(DevState.ON, proxy.state()) 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 # verify if values are actually transformed
HBAT_delays = proxy.HBAT_delays(numpy.array([["J2000","0deg","0deg"]] * 96).flatten()) HBAT_delays_flat = proxy.HBAT_delays(numpy.array([["J2000","0deg","0deg"]] * 96).flatten())
HBAT_bf_delays = beam.Beam._calculate_HBAT_bf_delays(HBAT_delays) 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.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))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment