Skip to content
Snippets Groups Projects

L2SS-1265 remove antenna_select and input_select

Merged Taya Snijder requested to merge L2SS-1265_remove_antenna_select_and_input_select into master
Files
4
@@ -84,26 +84,6 @@ class DigitalBeam(BeamDevice):
fget=lambda self: self._delays.get_statistic(self)["last"] or 0,
)
input_select_RW = attribute(
doc="Selection of inputs to use for forming each beamlet. \
Allows selecting broken antennas.",
dtype=((bool,),),
max_dim_x=N_beamlets_ctrl,
max_dim_y=MAX_ANTENNA,
access=AttrWriteType.READ_WRITE,
fisallowed="is_attribute_access_allowed",
)
antenna_select_RW = attribute(
doc="Selection of antennas desired to use for forming each beamlet \
(= a subset of input_select of the configured antennas). Unselects broken antennas.",
dtype=((bool,),),
max_dim_x=N_beamlets_ctrl,
max_dim_y=MAX_ANTENNA,
access=AttrWriteType.READ_WRITE,
fisallowed="is_attribute_access_allowed",
)
nr_inputs_R = attribute(
doc="Number of configured inputs from the associated antenna field.",
dtype=numpy.uint32,
@@ -132,43 +112,6 @@ class DigitalBeam(BeamDevice):
"""Return the number of controlled beamlets."""
return len([x for x in self.Beamlet_Select if x is True])
def read_input_select_RW(self):
return self._input_select
def write_input_select_RW(self, inputs):
self._input_select = inputs
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] * N_beamlets_ctrl] * self.nr_inputs()
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 * A_pn + input_nr
]
return antenna_select
def write_antenna_select_RW(self, antennas):
# Do not use any broken antennas, even if the user requests it. This allows the user
# to select the antennas they would like to use.
antenna_usage_mask = self.antennafield_proxy.Antenna_Usage_Mask_R
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[fpga_nr * A_pn + input_nr] = antennas[antenna_nr]
else:
# do not use antenna for any beamlet
self._input_select[fpga_nr * A_pn + input_nr] = False
def read_subband_select_RW(self):
"""Beamlet attribute read filtered through Beamlet Select"""
subband_select = self.beamlet_proxy.subband_select_RW
@@ -230,18 +173,29 @@ class DigitalBeam(BeamDevice):
# relative positions of each antenna
self.relative_input_positions = input_itrf - reference_itrf
# use all antennas in the mapping for all beamlets, unless specified otherwise
self.write_input_select_RW(
numpy.zeros((MAX_ANTENNA, N_beamlets_ctrl), dtype=bool)
)
self.write_antenna_select_RW(
numpy.ones((self.nr_inputs(), N_beamlets_ctrl), dtype=bool)
)
# configure which inputs are selected to be on
self._input_select()
# --------
# internal functions
# --------
def _input_select(self):
"""
Sets up the input selection
"""
input_select = numpy.zeros((MAX_ANTENNA, N_beamlets_ctrl), dtype=bool)
antenna_usage_mask = self.antennafield_proxy.Antenna_Usage_Mask_R
for antenna_nr, (fpga_nr, input_nr) in enumerate(
self.antennafield_proxy.Antenna_to_SDP_Mapping_R
):
if input_nr >= 0:
input_select[fpga_nr * A_pn + input_nr] = antenna_usage_mask[antenna_nr]
return input_select
@TimeIt()
def _delays(self, pointing_direction: numpy.array, timestamp: datetime.datetime):
"""
@@ -334,7 +288,7 @@ class DigitalBeam(BeamDevice):
beam_weights,
self.beamlet_proxy,
"FPGA_bf_weights_xx_yy_RW",
self._map_inputs_on_polarised_inputs(self._input_select),
self._map_inputs_on_polarised_inputs(self._input_select()),
)
# Determine how far away from ideal apply time
Loading