Skip to content
Snippets Groups Projects
Commit f37b0999 authored by Jan David Mol's avatar Jan David Mol
Browse files

L2SS-1005: Moved DigitalBeam.Input_to_Antenna_Mapping to...

L2SS-1005: Moved DigitalBeam.Input_to_Antenna_Mapping to AntennaField.Antenna_to_SDP_Mapping, to collect all antenna configuration information in the same device
parent 23a3205a
No related branches found
No related tags found
1 merge request!451Draft: Move configuration about to implement calibration
......@@ -164,6 +164,13 @@
"1", "28",
"1", "29"
],
"Antenna_to_SDP_Mapping": [
"0", "0",
"0", "1",
"0", "2",
"0", "3",
"0", "4"
],
"Antenna_Field_Reference_ETRS": [
"3839371.416", "430339.901", "5057958.886"
],
......@@ -196,24 +203,6 @@
"DigitalBeam": {
"STAT/DigitalBeam/1": {
"properties": {
"Input_to_Antenna_Mapping": [
"0", "1", "2", "3", "4", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1"
]
}
}
}
......
......@@ -196,6 +196,13 @@
"1","25",
"1","26"
],
"Antenna_to_SDP_Mapping": [
"3", "0",
"0", "-1",
"0", "-1",
"3", "1",
"3", "2"
],
"Antenna_Field_Reference_ETRS": [
"3839371.416","430339.901","5057958.886"
],
......@@ -258,6 +265,17 @@
"1","15",
"1","17"
],
"Antenna_to_SDP_Mapping": [
"0", "0",
"0", "1",
"0", "2",
"0", "3",
"0", "4",
"0", "5",
"1", "0",
"1", "1",
"1", "2"
],
"Antenna_Field_Reference_ETRS": [
"3839358.189",
"430354.482",
......@@ -286,24 +304,6 @@
"properties": {
"AntennaField_Device": [
"STAT/AntennaField/2"
],
"Input_to_Antenna_Mapping": [
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"0", "3", "4", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1"
]
}
},
......@@ -312,24 +312,6 @@
"AntennaField_Device": [
"STAT/AntennaField/1"
],
"Input_to_Antenna_Mapping": [
"0", "1", "2", "3", "4", "5",
"6", "7", "8", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1"
],
"Tracking_enabled_RW_default": [
"False"
]
......
......@@ -105,6 +105,16 @@
"1", "94",
"1", "95"
],
"Antenna_to_SDP_Mapping": [
"0", "0", "0", "1", "0", "2", "0", "3", "0", "4", "0", "5",
"1", "0", "1", "1", "1", "2", "1", "3", "1", "4", "1", "5",
"2", "0", "2", "1", "2", "2", "2", "3", "2", "4", "2", "5",
"3", "0", "3", "1", "3", "2", "3", "3", "3", "4", "3", "5",
"4", "0", "4", "1", "4", "2", "4", "3", "4", "4", "4", "5",
"5", "0", "5", "1", "5", "2", "5", "3", "5", "4", "5", "5",
"6", "0", "6", "1", "6", "2", "6", "3", "6", "4", "6", "5",
"7", "0", "7", "1", "7", "2", "7", "3", "7", "4", "7", "5"
],
"Antenna_Field_Reference_ETRS": [
"3826896.631", "460979.131", "5064657.943"
],
......@@ -223,24 +233,6 @@
"DigitalBeam": {
"STAT/DigitalBeam/1": {
"properties": {
"Input_to_Antenna_Mapping": [
"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "10", "11",
"12", "13", "14", "15", "16", "17",
"18", "19", "20", "21", "22", "23",
"24", "25", "26", "27", "28", "29",
"30", "31", "32", "33", "34", "35",
"36", "37", "38", "39", "40", "41",
"42", "43", "44", "45", "46", "47",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1"
]
}
}
}
......
......@@ -187,6 +187,21 @@ class AntennaField(lofar_device):
default_value = HBATAntennaOffsets.HBAT1_BASE_ANTENNA_OFFSETS.flatten()
)
# ----- SDP mapping
Antenna_to_SDP_Mapping = device_property(
dtype=(numpy.int32,),
doc='The mapping of Antennas to FPGA input pairs. Each FPGA can handle 6 inputs, and SDP has 16 FPGAs. Each antenna is represented with a (fpga, input) value pair. The array is flattened, so must be reshaped upon use. An input=-1 means the antenna is unconnected.',
default_value = numpy.array([-1] * MAX_NUMBER_OF_HBAT * 2, dtype=numpy.int32)
)
SDP_device = device_property(
dtype=str,
doc='Which SDP device is processing this AntennaField.',
mandatory=False,
default_value = "STAT/SDP/1"
)
# ----- RECV mapping
Power_to_RECV_mapping = device_property(
......@@ -203,13 +218,6 @@ class AntennaField(lofar_device):
default_value = [-1] * MAX_NUMBER_OF_HBAT * 2
)
Antenna_to_FPGA_mapping = device_property(
dtype=(numpy.int32,),
doc='The mapping of Antenna control lines to FPGA inputs. Each array element describes which antenna of the AntennaField is connected there (-1 = no antenna connected)',
mandatory=False,
default_value = [-1] * MAX_NUMBER_OF_HBAT
)
RECV_devices = device_property(
dtype=(str,),
doc='Which Recv devices are in use by the AntennaField. The order is important and it should match up with the order of the mapping.',
......@@ -231,6 +239,9 @@ class AntennaField(lofar_device):
Antenna_Usage_Mask_R = attribute(doc='Whether each antenna will be used.',
dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT)
Antenna_to_SDP_Mapping_R = attribute(doc='To which (fpga, input) pair each antenna is connected. -1=unconnected.',
dtype=((numpy.int32,),), max_dim_x=2, max_dim_y=MAX_NUMBER_OF_HBAT)
ANT_mask_RW = mapped_attribute("ANT_mask_RW", dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
RCU_PWR_ANT_on_R = mapped_attribute("RCU_PWR_ANT_on_R", dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT)
RCU_PWR_ANT_on_RW = mapped_attribute("RCU_PWR_ANT_on_RW", dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
......@@ -302,6 +313,9 @@ class AntennaField(lofar_device):
return numpy.logical_or(antennas_forced_on, antennas_auto_on)
def read_Antenna_to_SDP_Mapping_R(self):
return numpy.array(self.Antenna_to_SDP_Mapping).reshape(-1,2)
def read_nr_antennas_R(self):
# The number of antennas should be equal to:
# * the number of elements in the Control_to_RECV_mapping (after reshaping),
......@@ -309,6 +323,7 @@ class AntennaField(lofar_device):
# * the number of antennas exposed through Antenna_Reference_ITRF_R.
# * the number of elements in Antenna_Use
# * the number of elements in Antenna_Quality
# * the number of elements in Antenna_to_SDP_Mapping
#
# Parsing a property here is quickest, so we chose that.
return len(self.Control_to_RECV_mapping) // 2
......@@ -373,7 +388,7 @@ class AntennaField(lofar_device):
def read_Antenna_Reference_GEOHASH_R(self):
return GEO_to_GEOHASH(self.read_Antenna_Reference_GEO_R())
def __setup_all_receiver_proxies(self):
def __setup_all_proxies(self):
self.recv_proxies = []
for recv in self.RECV_devices:
......@@ -382,6 +397,9 @@ class AntennaField(lofar_device):
recv_proxy.set_source(DevSource.DEV)
self.recv_proxies.append(recv_proxy)
self.sdp_proxy = DeviceProxy(self.SDP_device)
self.sdp_proxy.set_source(DevSource.DEV)
def __setup_mapper(self):
number_of_receivers = len(self.RECV_devices)
# Reshape of mapping is needed because properties are stored in 1d arrays
......@@ -426,7 +444,7 @@ class AntennaField(lofar_device):
@log_exceptions()
def configure_for_initialise(self):
super().configure_for_initialise()
self.__setup_all_receiver_proxies()
self.__setup_all_proxies()
self.__setup_mapper()
@log_exceptions()
......
......@@ -64,13 +64,6 @@ class DigitalBeam(beam_device):
default_value = "STAT/Beamlet/1"
)
Input_to_Antenna_Mapping = device_property(
dtype=(numpy.int32,),
doc='Which antenna of the antennafield is connected to each input. -1 if no antenna is present.',
mandatory=False,
default_value = [-1] * MAX_INPUTS
)
# ----------
# Attributes
# ----------
......@@ -90,7 +83,7 @@ class DigitalBeam(beam_device):
def nr_inputs(self):
""" Return the number of configured inputs. """
return max(self.Input_to_Antenna_Mapping) + 1
return len(self.antennafield_proxy.Antenna_to_SDP_Mapping_R)
def read_input_select_RW(self):
return self._input_select
......@@ -100,11 +93,12 @@ class DigitalBeam(beam_device):
def read_antenna_select_RW(self):
# select only the rows from self.__input_select for which a mapping onto antennas is defined.
antenna_select = [[False] * self.NUM_BEAMLETS] * self.nr_inputs()
antenna_to_sdp_mapping = self.antennafield_proxy.Antenna_to_SDP_Mapping_R
antenna_select = [[False] * self.NUM_BEAMLETS] * len(antenna_to_sdp_mapping)
for input_nr, antenna_nr in enumerate(self.Input_to_Antenna_Mapping):
if antenna_nr >= 0:
antenna_select[antenna_nr] = self._input_select[input_nr]
for antenna_nr, (fpga_nr, input_nr) in enumerate(antenna_to_sdp_mapping):
if input_nr >= 0:
antenna_select[antenna_nr] = self._input_select[fpga_nr * 6 + input_nr]
return antenna_select
......@@ -113,14 +107,14 @@ class DigitalBeam(beam_device):
# to select the antennas they would like to use.
antenna_usage_mask = self.antennafield_proxy.Antenna_Usage_Mask_R
for input_nr, antenna_nr in enumerate(self.Input_to_Antenna_Mapping):
if antenna_nr >= 0:
for antenna_nr, (fpga_nr, input_nr) in enumerate(self.antennafield_proxy.Antenna_to_SDP_Mapping_R):
if input_nr >= 0:
if antenna_usage_mask[antenna_nr]:
# use antenna for the beamlets as supplied by the client
self._input_select[input_nr] = antennas[antenna_nr]
self._input_select[fpga_nr * 6 + input_nr] = antennas[antenna_nr]
else:
# do not use antenna for any beamlet
self._input_select[input_nr] = False
self._input_select[fpga_nr * 6 + input_nr] = False
# ----------
# Summarising Attributes
......@@ -151,9 +145,9 @@ class DigitalBeam(beam_device):
# Generate positions for all FPGA inputs.
# Use reference position for any missing antennas so they always get a delay of 0
input_itrf = numpy.array([reference_itrf] * self.MAX_INPUTS)
for input_nr, antenna_nr in enumerate(self.Input_to_Antenna_Mapping):
if antenna_nr >= 0:
input_itrf[input_nr] = antenna_itrf[antenna_nr]
for antenna_nr, (fpga_nr, input_nr) in enumerate(self.antennafield_proxy.Antenna_to_SDP_Mapping_R):
if input_nr >= 0:
input_itrf[fpga_nr * 6 + input_nr] = antenna_itrf[antenna_nr]
# a delay calculator
self.delay_calculator = Delays(reference_itrf)
......
......@@ -22,23 +22,15 @@ class TestDeviceObservation(AbstractTestBases.TestDeviceBase):
NUM_TILES = 48
NUM_BEAMLETS_CTRL = 488
NUM_INPUTS = 96
INPUT_TO_ANTENNA_MAPPING = [
"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "10", "11",
"12", "13", "14", "15", "16", "17",
"18", "19", "20", "21", "22", "23",
"24", "25", "26", "27", "28", "29",
"30", "31", "32", "33", "34", "35",
"36", "37", "38", "39", "40", "41",
"42", "43", "44", "45", "46", "47",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1"
ANTENNA_TO_SDP_MAPPING = [
"0", "0", "0", "1", "0", "2", "0", "3", "0", "4", "0", "5",
"1", "0", "1", "1", "1", "2", "1", "3", "1", "4", "1", "5",
"2", "0", "2", "1", "2", "2", "2", "3", "2", "4", "2", "5",
"3", "0", "3", "1", "3", "2", "3", "3", "3", "4", "3", "5",
"4", "0", "4", "1", "4", "2", "4", "3", "4", "4", "4", "5",
"5", "0", "5", "1", "5", "2", "5", "3", "5", "4", "5", "5",
"6", "0", "6", "1", "6", "2", "6", "3", "6", "4", "6", "5",
"7", "0", "7", "1", "7", "2", "7", "3", "7", "4", "7", "5",
]
def setUp(self):
......@@ -74,6 +66,7 @@ class TestDeviceObservation(AbstractTestBases.TestDeviceBase):
antenna_use = numpy.array([AntennaUse.AUTO] * 96)
antennafield_proxy.put_property({"RECV_devices": ["STAT/RECV/1"],
"Control_to_RECV_mapping": numpy.array(control_mapping).flatten(),
"Antenna_to_SDP_Mapping": self.ANTENNA_TO_SDP_MAPPING,
'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use})
antennafield_proxy.off()
antennafield_proxy.boot()
......@@ -90,7 +83,6 @@ class TestDeviceObservation(AbstractTestBases.TestDeviceBase):
def setup_digitalbeam_proxy(self):
# setup Digitalbeam
digitalbeam_proxy = TestDeviceProxy("STAT/DigitalBeam/1")
digitalbeam_proxy.put_property({"Input_to_Antenna_Mapping": numpy.array(self.INPUT_TO_ANTENNA_MAPPING).flatten()})
digitalbeam_proxy.off()
digitalbeam_proxy.warm_boot()
digitalbeam_proxy.set_defaults()
......
......@@ -24,23 +24,15 @@ class TestObservationControlDevice(AbstractTestBases.TestDeviceBase):
NUM_TILES = 48
NUM_BEAMLETS_CTRL = 488
NUM_INPUTS = 96
INPUT_TO_ANTENNA_MAPPING = [
"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "10", "11",
"12", "13", "14", "15", "16", "17",
"18", "19", "20", "21", "22", "23",
"24", "25", "26", "27", "28", "29",
"30", "31", "32", "33", "34", "35",
"36", "37", "38", "39", "40", "41",
"42", "43", "44", "45", "46", "47",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1",
"-1", "-1", "-1", "-1", "-1", "-1"
ANTENNA_TO_SDP_MAPPING = [
"0", "0", "0", "1", "0", "2", "0", "3", "0", "4", "0", "5",
"1", "0", "1", "1", "1", "2", "1", "3", "1", "4", "1", "5",
"2", "0", "2", "1", "2", "2", "2", "3", "2", "4", "2", "5",
"3", "0", "3", "1", "3", "2", "3", "3", "3", "4", "3", "5",
"4", "0", "4", "1", "4", "2", "4", "3", "4", "4", "4", "5",
"5", "0", "5", "1", "5", "2", "5", "3", "5", "4", "5", "5",
"6", "0", "6", "1", "6", "2", "6", "3", "6", "4", "6", "5",
"7", "0", "7", "1", "7", "2", "7", "3", "7", "4", "7", "5",
]
def setUp(self):
......@@ -73,7 +65,8 @@ class TestObservationControlDevice(AbstractTestBases.TestDeviceBase):
antennafield_proxy = TestDeviceProxy("STAT/AntennaField/1")
control_mapping = [[1,i] for i in range(self.NUM_TILES)]
antennafield_proxy.put_property({"RECV_devices": ["STAT/RECV/1"],
"Power_to_RECV_mapping": numpy.array(control_mapping).flatten()})
"Power_to_RECV_mapping": numpy.array(control_mapping).flatten(),
"Antenna_to_SDP_Mapping": self.ANTENNA_TO_SDP_MAPPING})
antennafield_proxy.off()
antennafield_proxy.warm_boot()
antennafield_proxy.set_defaults()
......@@ -90,7 +83,6 @@ class TestObservationControlDevice(AbstractTestBases.TestDeviceBase):
def setup_digitalbeam_proxy(self):
# setup Digitalbeam
digitalbeam_proxy = TestDeviceProxy("STAT/DigitalBeam/1")
digitalbeam_proxy.put_property({"Input_to_Antenna_Mapping": numpy.array(self.INPUT_TO_ANTENNA_MAPPING).flatten()})
digitalbeam_proxy.off()
digitalbeam_proxy.warm_boot()
digitalbeam_proxy.set_defaults()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment