Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • lofar2.0/tango
  • mckenna/tango
2 results
Show changes
Commits on Source (6)
......@@ -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"
]
}
}
}
......
ipython >=7.27.0,!=7.28.0 # BSD
jupyter
jupyterlab
jupyterlab_h5web[full] # MIT
ipykernel
jupyter_bokeh
matplotlib
......
......@@ -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()
......
......@@ -46,6 +46,9 @@ class DigitalBeam(beam_device):
MAX_INPUTS = 96
NUM_BEAMLETS = 488
# number of antennas connected to each FPGA in SDP
A_pn = 6
# -----------------
# Device Properties
# -----------------
......@@ -64,13 +67,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 +86,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
......@@ -102,9 +98,9 @@ class DigitalBeam(beam_device):
# 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()
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(self.antennafield_proxy.Antenna_to_SDP_Mapping_R):
if input_nr >= 0:
antenna_select[antenna_nr] = self._input_select[fpga_nr * self.A_pn + input_nr]
return antenna_select
......@@ -113,14 +109,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 * self.A_pn + input_nr] = antennas[antenna_nr]
else:
# do not use antenna for any beamlet
self._input_select[input_nr] = False
self._input_select[fpga_nr * self.A_pn + input_nr] = False
# ----------
# Summarising Attributes
......@@ -151,9 +147,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 * self.A_pn + input_nr] = antenna_itrf[antenna_nr]
# a delay calculator
self.delay_calculator = Delays(reference_itrf)
......
......@@ -22,24 +22,16 @@ 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):
super().setUp("STAT/Observation/1")
......@@ -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,24 +24,16 @@ 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):
super().setUp("STAT/ObservationControl/1")
......@@ -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()
......