From 8f5dc9372c38bafaa84908de6b435abd0e5892cc Mon Sep 17 00:00:00 2001
From: Jan David Mol <mol@astron.nl>
Date: Fri, 28 Oct 2022 11:53:28 +0200
Subject: [PATCH] L2SS-1010: Deal with unconnected antennas

---
 .../devices/antennafield.py                   | 23 ++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/tangostationcontrol/tangostationcontrol/devices/antennafield.py b/tangostationcontrol/tangostationcontrol/devices/antennafield.py
index 8754eb83f..1822181ca 100644
--- a/tangostationcontrol/tangostationcontrol/devices/antennafield.py
+++ b/tangostationcontrol/tangostationcontrol/devices/antennafield.py
@@ -392,7 +392,15 @@ class AntennaField(lofar_device):
 
     def read_Antenna_Cables_Loss_R(self):
         rcu_bands = self.read_attribute("RCU_band_select_RW")
-        return numpy.array([cable_types[antenna].get_loss(self.Antenna_Type, rcu_band) for antenna, rcu_band in zip(self.Antenna_Cables, rcu_bands)])
+
+        control_to_recv_mapping = numpy.array(self.Control_to_RECV_mapping).reshape(-1,2)
+        recvs = control_to_recv_mapping[:, 0] # first column is RECV device number
+
+        # Unconnected antennas return RCU band 0, which does not exist. Return 0 loss for them instead.
+        return numpy.array([cable_types[cable].get_loss(self.Antenna_Type, rcu_band)
+                            if recv > 0 else 0
+                            for recv, cable, rcu_band in
+                            zip(recvs, self.Antenna_Cables, rcu_bands)])
 
     def read_Calibration_SDP_Signal_Input_Samples_Delay_R(self):
         # Correct for signal delays in the cables
@@ -450,10 +458,23 @@ class AntennaField(lofar_device):
         
         rcu_bands = self.read_attribute("RCU_band_select_RW")
 
+        control_to_recv_mapping = numpy.array(self.Control_to_RECV_mapping).reshape(-1,2)
+        recvs = control_to_recv_mapping[:, 0] # first column is RECV device number
+
+        antenna_to_sdp_mapping = self.read_attribute("Antenna_to_SDP_Mapping_R")
+
         # construct the subband weights based on the rcu_band of each antenna,
         # combining the relevant tables.
         subband_weights = numpy.zeros((self.read_attribute("nr_antennas_R"), 3), dtype=numpy.float64)
         for antenna_nr, rcu_band in enumerate(rcu_bands):
+            # Skip antennas not connected to RECV. These do not have a valid RCU band selected.
+            if recvs[antenna_nr] == 0:
+                continue
+
+            # Skip antennas not connected to SDP. They must retain a weight of 0.
+            if antenna_to_sdp_mapping[antenna_nr, 1] == -1:
+                continue
+
             subband_weights[antenna_nr, :] = rcu_band_to_caltable[rcu_band][antenna_nr, :]
 
         return subband_weights
-- 
GitLab