diff --git a/CDB/integrations/digitalbeam_cluster_ConfigDb.json b/CDB/integrations/digitalbeam_cluster_ConfigDb.json index cdb1eb1625cdc50adef0b08e6229f3c22930673c..c45565db5ac20015829900d2b6aa895c1b3a385e 100644 --- a/CDB/integrations/digitalbeam_cluster_ConfigDb.json +++ b/CDB/integrations/digitalbeam_cluster_ConfigDb.json @@ -419,12 +419,6 @@ "DigitalBeam": { "STAT/DigitalBeam/HBA0": { "properties": { - "AntennaField_Device": [ - "STAT/AntennaField/HBA0" - ], - "Beamlet_Device": [ - "STAT/Beamlet/HBA0" - ], "Beam_tracking_interval": [ "1.0" ], @@ -438,12 +432,6 @@ }, "STAT/DigitalBeam/HBA1": { "properties": { - "AntennaField_Device": [ - "STAT/AntennaField/HBA1" - ], - "Beamlet_Device": [ - "STAT/Beamlet/HBA1" - ], "Beam_tracking_interval": [ "1.0" ], @@ -457,12 +445,6 @@ }, "STAT/DigitalBeam/LBA": { "properties": { - "AntennaField_Device": [ - "STAT/AntennaField/LBA" - ], - "Beamlet_Device": [ - "STAT/Beamlet/LBA" - ], "Beam_tracking_interval": [ "1.0" ], @@ -488,7 +470,7 @@ ], "Control_Children": [ "STAT/SDPFirmware/LBA", - "STAT/digitalbeam/LBA", + "STAT/DigitalBeam/LBA", "STAT/RECVL/L0", "STAT/RECVL/L1" ], @@ -593,108 +575,108 @@ "3826989.173", "460890.761", "5064596.467", "3826990.269", "460895.632", "5064595.204" ], - "HBAT_PQR_rotation_angles_deg": [ - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24", - "24" - ], "PQR_to_ETRS_rotation_matrix": [ "-0.1195951054", "-0.7919544517", "0.5987530018", " 0.9928227484", "-0.0954186800", "0.0720990002", " 0.0000330969", " 0.6030782884", "0.7976820024" + ], + "Frequency_Band_RW_default": [ + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90", + "LBA_30_90", "LBA_30_90" ] } }, @@ -911,6 +893,104 @@ "-0.1195951054", "-0.7919544517", "0.5987530018", " 0.9928227484", "-0.0954186800", "0.0720990002", " 0.0000330969", " 0.6030782884", "0.7976820024" + ], + "Frequency_Band_RW_default": [ + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190" ] } }, @@ -1127,6 +1207,104 @@ "-0.1195951054", "-0.7919544517", "0.5987530018", " 0.9928227484", "-0.0954186800", "0.0720990002", " 0.0000330969", " 0.6030782884", "0.7976820024" + ], + "Frequency_Band_RW_default": [ + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190" ] } } diff --git a/CDB/stations/hba_core.json b/CDB/stations/hba_core.json index 051bf2968c5836827c4611d4258879f37052bb7e..1fff270bbc411d8390294c19fca9dceccb04df8d 100644 --- a/CDB/stations/hba_core.json +++ b/CDB/stations/hba_core.json @@ -169,6 +169,32 @@ "5", "5", "3", "13", "10", "3", "12", "2", "7", "15", "6", "14", "7", "5", "7", "9", "0", "15" + ], + "Frequency_Band_RW_default": [ + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190" ] } }, @@ -194,6 +220,32 @@ "5", "5", "3", "13", "10", "3", "12", "2", "7", "15", "6", "14", "7", "5", "7", "9", "0", "15" + ], + "Frequency_Band_RW_default": [ + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190" ] } } diff --git a/CDB/stations/hba_remote.json b/CDB/stations/hba_remote.json index 1c31f41f71a0863157e5a7327a8c69253f683060..e094e2b9112a94dda37885920fb88345df5825ea 100644 --- a/CDB/stations/hba_remote.json +++ b/CDB/stations/hba_remote.json @@ -110,6 +110,56 @@ "8", "2", "12", "13", "9", "13", "4", "5", "5", "12", "5", "5", "9", "11", "15", "12", "2", "15" + ], + "Frequency_Band_RW_default": [ + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190", + "HBA_110_190", "HBA_110_190" ] } } diff --git a/CDB/stations/lba.json b/CDB/stations/lba.json index f0b37aed72a7d535ef4587c38580b3565a23a283..5a689fff6622b8e78ef7821b8352316645cef966 100644 --- a/CDB/stations/lba.json +++ b/CDB/stations/lba.json @@ -89,6 +89,104 @@ ], "Antenna_Type": [ "LBA" + ], + "Frequency_Band_RW_default": [ + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90", + "LBA_10_90", "LBA_10_90" ] } } diff --git a/docker-compose/object-storage.yml b/docker-compose/object-storage.yml index feebcee6b94deebecbec658ca6af7aaddad7af60..5d48af9acef8cbb6a480bf5536bb7da5548f8237 100644 --- a/docker-compose/object-storage.yml +++ b/docker-compose/object-storage.yml @@ -41,9 +41,15 @@ services: - ..:/opt/lofar/tango:rw entrypoint: '' command: > - sh -c "mc alias set object-storage http://object-storage:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD + sh -c "until [ \"$(curl -s -w '%{http_code}' -o /dev/null http://object-storage:9000/minio/health/live)\" -eq \"200\" ] + do + sleep 1 + done + mc alias set object-storage http://object-storage:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD mc mb --with-versioning object-storage/caltables - mc cp --recursive /opt/lofar/tango/docker-compose/object-storage/caltables/ object-storage/caltables/" + mc cp --recursive /opt/lofar/tango/docker-compose/object-storage/caltables/ object-storage/caltables/ + date +'%F %T' + echo 'Initialisation completed'" volumes: object-storage: diff --git a/tangostationcontrol/integration_test/default/devices/test_device_antennafield.py b/tangostationcontrol/integration_test/default/devices/test_device_antennafield.py index d79c50d30b744382aad905dcea75c4a2f41385ff..d7995d502e9212acf9bbe2f12b0c49eedc431932 100644 --- a/tangostationcontrol/integration_test/default/devices/test_device_antennafield.py +++ b/tangostationcontrol/integration_test/default/devices/test_device_antennafield.py @@ -27,13 +27,21 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): def setUp(self): self.stationmanager_proxy = self.setup_stationmanager_proxy() super().setUp("STAT/AntennaField/HBA0") + + # Typical tests emulate 'CS001_TILES' number of antennas in + # the AntennaField. 'MAX_ANTENNA' is the number of inputs + # offered by a backing RECV device. Each antenna has + # N_pol (2) inputs. self.proxy.put_property( { "Power_to_RECV_mapping": numpy.array( - [[1, x * 2 + 0] for x in range(MAX_ANTENNA // 2)] + [[1, x * 2 + 0] for x in range(CS001_TILES)] ).flatten(), "Control_to_RECV_mapping": numpy.array( - [[1, x * 2 + 1] for x in range(MAX_ANTENNA // 2)] + [[1, x * 2 + 1] for x in range(CS001_TILES)] + ).flatten(), + "Frequency_Band_RW_default": numpy.array( + [["HBA_110_190", "HBA_110_190"]] * CS001_TILES ).flatten(), } ) @@ -105,9 +113,9 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): numpy.array([[True] * N_rcu_inp] * N_rcu), self.recv_proxy.ANT_mask_RW ) - antenna_qualities = numpy.array([AntennaQuality.OK] * MAX_ANTENNA) + antenna_qualities = numpy.array([AntennaQuality.OK] * CS001_TILES) antenna_use = numpy.array( - [AntennaUse.ON] + [AntennaUse.AUTO] * (MAX_ANTENNA - 1) + [AntennaUse.ON] + [AntennaUse.AUTO] * (CS001_TILES - 1) ) antenna_properties = { "Antenna_Quality": antenna_qualities, @@ -127,7 +135,7 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): # Verify all antennas are indicated to work numpy.testing.assert_equal( - numpy.array([True] * MAX_ANTENNA), antennafield_proxy.Antenna_Usage_Mask_R + numpy.array([True] * CS001_TILES), antennafield_proxy.Antenna_Usage_Mask_R ) # Verify only connected inputs + Antenna_Usage_Mask_R are true @@ -154,9 +162,9 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): antenna_qualities = numpy.array( [AntennaQuality.BROKEN] + [AntennaQuality.OK] - + [AntennaQuality.BROKEN] * (MAX_ANTENNA - 2) + + [AntennaQuality.BROKEN] * (CS001_TILES - 2) ) - antenna_use = numpy.array([AntennaUse.AUTO] * MAX_ANTENNA) + antenna_use = numpy.array([AntennaUse.AUTO] * CS001_TILES) antenna_properties = { "Antenna_Quality": antenna_qualities, "Antenna_Use": antenna_use, @@ -167,7 +175,7 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): "Power_to_RECV_mapping": [-1, -1] * CS001_TILES, "Control_to_RECV_mapping": # [1, 0, 1, 1, 1, 2, 1, x ... 1, 95] - numpy.array([[1, x] for x in range(0, MAX_ANTENNA)]).flatten(), + numpy.array([[1, x] for x in range(CS001_TILES)]).flatten(), } # Cycle device and set properties @@ -179,18 +187,23 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): # Antenna_Usage_Mask_R should be false except one numpy.testing.assert_equal( - numpy.array([False] + [True] + [False] * (MAX_ANTENNA - 2)), + numpy.array([False] + [True] + [False] * (CS001_TILES - 2)), antennafield_proxy.Antenna_Usage_Mask_R, ) # device.power_hardware_on() writes Antenna_Usage_Mask_R to ANT_mask_RW numpy.testing.assert_equal( - numpy.array([False] + [True] + [False] * (MAX_ANTENNA - 2)), + numpy.array([False] + [True] + [False] * (CS001_TILES - 2)), antennafield_proxy.ANT_mask_RW, ) # ANT_mask_RW on antennafield writes to configured recv devices for all - # mapped inputs + # mapped inputs. Unmapped values at the end remain at True. numpy.testing.assert_equal( - numpy.array([False] + [True] + [False] * (MAX_ANTENNA - 2)), + numpy.array( + [False] + + [True] + + [False] * (CS001_TILES - 2) + + [True] * (MAX_ANTENNA - CS001_TILES) + ), self.recv_proxy.ANT_mask_RW.flatten(), ) @@ -272,7 +285,7 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): "Power_to_RECV_mapping": [-1, -1] * CS001_TILES, "Control_to_RECV_mapping": # [1, 0, 1, 1, 1, 2, 1, x ... 1, 95] - numpy.array([[1, x] for x in range(0, MAX_ANTENNA)]).flatten(), + numpy.array([[1, x] for x in range(CS001_TILES)]).flatten(), } antennafield_proxy = self.proxy @@ -286,11 +299,20 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): try: antennafield_proxy.write_attribute( - "HBAT_PWR_on_RW", [[True] * N_elements * N_pol] * MAX_ANTENNA + "HBAT_PWR_on_RW", [[True] * N_elements * N_pol] * CS001_TILES ) + + # Mapped values went to True numpy.testing.assert_equal( - numpy.array([[True] * N_elements * N_pol] * MAX_ANTENNA), - self.recv_proxy.read_attribute("HBAT_PWR_on_RW").value, + numpy.array([[True] * N_elements * N_pol] * CS001_TILES), + self.recv_proxy.read_attribute("HBAT_PWR_on_RW").value[:CS001_TILES], + ) + # Unmapped values went to False + numpy.testing.assert_equal( + numpy.array( + [[False] * N_elements * N_pol] * (MAX_ANTENNA - CS001_TILES) + ), + self.recv_proxy.read_attribute("HBAT_PWR_on_RW").value[CS001_TILES:], ) finally: # Always restore recv again @@ -306,10 +328,10 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): mapping_properties = { "Power_to_RECV_mapping": numpy.array( # X maps on power - [[1, x * 2 + 1] for x in range(MAX_ANTENNA // 2)] + [[1, x * 2 + 1] for x in range(CS001_TILES)] ).flatten(), "Control_to_RECV_mapping": numpy.array( # Y maps on control - [[1, x * 2 + 0] for x in range(MAX_ANTENNA // 2)] + [[1, x * 2 + 0] for x in range(CS001_TILES)] ).flatten(), } @@ -324,12 +346,24 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase): antennafield_proxy.write_attribute( # [X, Y] "RCU_band_select_RW", - [[1, 2]] * MAX_ANTENNA, + [[1, 2]] * CS001_TILES, + ) + + # Mapped values were overwritten + numpy.testing.assert_equal( + # [Power, Control] + numpy.array([2, 1] * CS001_TILES), + self.recv_proxy.read_attribute("RCU_band_select_RW").value.flatten()[ + : (CS001_TILES * 2) + ], ) + # Unmapped values remain at 0 numpy.testing.assert_equal( # [Power, Control] - numpy.array([2, 1] * (MAX_ANTENNA // 2)), - self.recv_proxy.read_attribute("RCU_band_select_RW").value.flatten(), + numpy.array([0] * (MAX_ANTENNA - CS001_TILES * 2)), + self.recv_proxy.read_attribute("RCU_band_select_RW").value.flatten()[ + (CS001_TILES * 2) : + ], ) finally: # Always restore recv again diff --git a/tangostationcontrol/integration_test/default/devices/test_device_calibration.py b/tangostationcontrol/integration_test/default/devices/test_device_calibration.py index a724432974572deee74a613b1ec20df5bd51af9c..3d9329525be4078999fd0d03f89f0b539b09d890 100644 --- a/tangostationcontrol/integration_test/default/devices/test_device_calibration.py +++ b/tangostationcontrol/integration_test/default/devices/test_device_calibration.py @@ -70,21 +70,30 @@ class TestCalibrationDevice(AbstractTestBases.TestDeviceBase): def setUp(self): self.stationmanager_proxy = self.setup_stationmanager_proxy() super().setUp("STAT/Calibration/1") + + self.recv_proxy = self.setup_recv_proxy() + self.sdpfirmware_proxy = self.setup_sdpfirmware_proxy() + self.sdp_proxy = self.setup_sdp_proxy() + self.antennafield_proxy = self.setup_proxy("STAT/AntennaField/HBA0") + + # make sure we restore any properties we modify + self.original_antennafield_properties = self.antennafield_proxy.get_property( + self.antennafield_proxy.get_property_list("*") + ) + self.addCleanup(self.restore_antennafield) + self.antennafield_proxy.put_property( { "Power_to_RECV_mapping": [1, 1, 1, 0] + [-1] * ((DEFAULT_N_HBA_TILES * 2) - 4), "Antenna_Sets": ["ALL"], "Antenna_Set_Masks": ["1" * DEFAULT_N_HBA_TILES], + "Frequency_Band_RW_default": ["HBA_110_190"] + * (DEFAULT_N_HBA_TILES * 2), } ) - self.recv_proxy = self.setup_recv_proxy() - self.sdpfirmware_proxy = self.setup_sdpfirmware_proxy() - self.sdp_proxy = self.setup_sdp_proxy() - - self.addCleanup(self.shutdown_recv) - self.addCleanup(self.shutdown_sdp) + self.antennafield_proxy.boot() # configure the frequencies, which allows access # to the calibration attributes and commands @@ -92,22 +101,7 @@ class TestCalibrationDevice(AbstractTestBases.TestDeviceBase): self.recv_proxy.RCU_band_select_RW = [[1] * N_rcu_inp] * N_rcu def restore_antennafield(self): - self.proxy.put_property( - { - "Power_to_RECV_mapping": [-1, -1] * DEFAULT_N_HBA_TILES, - "Control_to_RECV_mapping": [-1, -1] * DEFAULT_N_HBA_TILES, - } - ) - - @staticmethod - def shutdown_recv(): - recv_proxy = TestDeviceProxy("STAT/RECVH/H0") - recv_proxy.off() - - @staticmethod - def shutdown_sdp(): - sdp_proxy = TestDeviceProxy("STAT/SDP/HBA0") - sdp_proxy.off() + self.proxy.put_property(self.original_antennafield_properties) @staticmethod def shutdown(device: str): @@ -119,38 +113,31 @@ class TestCalibrationDevice(AbstractTestBases.TestDeviceBase): def setup_recv_proxy(self): # setup RECV - recv_proxy = TestDeviceProxy("STAT/RECVH/H0") - recv_proxy.off() + recv_proxy = self.setup_proxy("STAT/RECVH/H0") recv_proxy.boot() - recv_proxy.set_defaults() return recv_proxy def setup_sdpfirmware_proxy(self): # setup SDP - sdpfirmware_proxy = TestDeviceProxy("STAT/SDPFirmware/HBA0") - sdpfirmware_proxy.off() + sdpfirmware_proxy = self.setup_proxy("STAT/SDPFirmware/HBA0") sdpfirmware_proxy.boot() return sdpfirmware_proxy def setup_sdp_proxy(self): # setup SDP - sdp_proxy = TestDeviceProxy("STAT/SDP/HBA0") - sdp_proxy.off() + sdp_proxy = self.setup_proxy("STAT/SDP/HBA0") sdp_proxy.boot() return sdp_proxy def setup_proxy(self, dev: str): - # setup SDP proxy = TestDeviceProxy(dev) proxy.off() - proxy.boot() self.addCleanup(self.shutdown(dev)) return proxy def setup_stationmanager_proxy(self): """Setup StationManager""" - stationmanager_proxy = TestDeviceProxy("STAT/StationManager/1") - stationmanager_proxy.off() + stationmanager_proxy = self.setup_proxy("STAT/StationManager/1") stationmanager_proxy.boot() self.assertEqual(stationmanager_proxy.state(), DevState.ON) return stationmanager_proxy @@ -168,15 +155,14 @@ class TestCalibrationDevice(AbstractTestBases.TestDeviceBase): # [1, 48, 1, 49, x ... 1, 95] } - self.antennafield_proxy = self.setup_proxy("STAT/AntennaField/HBA0") - self.antennafield_proxy.off() + self.antennafield_proxy = self.setup_proxy("STAT/AntennaField/LBA") self.antennafield_proxy.put_property(calibration_properties) self.antennafield_proxy.boot() self.proxy.boot() # calibrate - self.proxy.calibrate_recv("STAT/AntennaField/HBA0") + self.proxy.calibrate_recv("STAT/AntennaField/LBA") # check the results rcu_attenuator_db_pwr = self.antennafield_proxy.RCU_attenuator_dB_RW[:, 0] @@ -230,7 +216,6 @@ class TestCalibrationDevice(AbstractTestBases.TestDeviceBase): } self.antennafield_proxy = self.setup_proxy("STAT/AntennaField/HBA0") - self.antennafield_proxy.off() self.antennafield_proxy.put_property(calibration_properties) self.antennafield_proxy.boot() diff --git a/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py b/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py index a152c5e10a5221959d43f88f8a51099186be9b38..32c3b5666b87e407771f7ae86782d40c5ddfaf20 100644 --- a/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py +++ b/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py @@ -107,6 +107,7 @@ class TestDeviceDigitalBeam(AbstractTestBases.TestDeviceBase): "1" + ("0" * (NR_TILES - 1)), "1" * NR_TILES, ], + "Antenna_Type": "HBA", } ) antennafield_proxy.off() diff --git a/tangostationcontrol/integration_test/digitalbeam_performance/test_digitalbeam_performance.py b/tangostationcontrol/integration_test/digitalbeam_performance/test_digitalbeam_performance.py index 4ed1e4e4aa2cd2fc6854b11724c73a7d647daab8..8034af77013f7bb936bf75813a32baa9d6974416 100644 --- a/tangostationcontrol/integration_test/digitalbeam_performance/test_digitalbeam_performance.py +++ b/tangostationcontrol/integration_test/digitalbeam_performance/test_digitalbeam_performance.py @@ -54,19 +54,21 @@ class TestDigitalbeamPerformance(base.IntegrationTestCase): proxy.off() self.assertTrue(proxy.state() is DevState.OFF) proxy.boot() - proxy.set_defaults() self.assertTrue(proxy.state() is DevState.ON) - for n in range(1, 3): - proxy = antenna_field_proxies[n - 1] + for proxy in antenna_field_proxies: # setup AntennaField control_mapping = [[1, i] for i in range(MAX_ANTENNA)] + power_mapping = [[1, i] for i in range(MAX_ANTENNA)] + sdp_mapping = [[i // 6, i % 6] for i in range(MAX_ANTENNA)] antenna_qualities = numpy.array([AntennaQuality.OK] * MAX_ANTENNA) antenna_use = numpy.array([AntennaUse.AUTO] * MAX_ANTENNA) antenna_set_mask = "1" * MAX_ANTENNA proxy.put_property( { "Control_to_RECV_mapping": numpy.array(control_mapping).flatten(), + "Power_to_RECV_mapping": numpy.array(power_mapping).flatten(), + "Antenna_to_SDP_Mapping": numpy.array(sdp_mapping).flatten(), "Antenna_Quality": antenna_qualities, "Antenna_Use": antenna_use, "Antenna_Sets": ["ALL"], @@ -82,9 +84,9 @@ class TestDigitalbeamPerformance(base.IntegrationTestCase): proxy.off() self.assertTrue(proxy.state() is DevState.OFF) proxy.boot() - proxy.set_defaults() proxy.Tracking_enabled_RW = tracking self.assertTrue(proxy.state() is DevState.ON) + self.assertEqual(MAX_ANTENNA, proxy.nr_antennas_R) # Insert verify that all attributes have been set across # one another~ diff --git a/tangostationcontrol/tangostationcontrol/common/calibration.py b/tangostationcontrol/tangostationcontrol/common/calibration.py index 9cd7d6e8f332ebfce204fa7507004729ff4bd8b0..d484c1d8762337e54e1746de4f21a63aee2d4151 100644 --- a/tangostationcontrol/tangostationcontrol/common/calibration.py +++ b/tangostationcontrol/tangostationcontrol/common/calibration.py @@ -53,7 +53,7 @@ class CalibrationManager: self._url = url self._station_name = station_name self._tmp_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True) - self.bucket_name = "caltabules" + self.bucket_name = "caltables" self.prefix = self._station_name self._init_minio() self.sync_calibration_tables() @@ -66,6 +66,8 @@ class CalibrationManager: if len(bucket_name) > 0: self.bucket_name = bucket_name + logger.info(f"Derived {self.prefix=} {self.bucket_name=} from {self._url=}") + self._storage = Minio( result.netloc, access_key=os.getenv("MINIO_ROOT_USER"), @@ -82,11 +84,18 @@ class CalibrationManager: objects = self._storage.list_objects(self.bucket_name, prefix=f"{self.prefix}/") for obj in objects: filename = os.path.basename(obj.object_name) - self._storage.fget_object( - self.bucket_name, - obj.object_name, - os.path.join(self._tmp_dir.name, filename), - ) + try: + self._storage.fget_object( + self.bucket_name, + obj.object_name, + os.path.join(self._tmp_dir.name, filename), + ) + except Exception as ex: + raise IOError( + f"Failed to download {self.bucket=} {obj.object_name=}" + ) from ex + + logger.info(f"Downloaded {filename} from {obj.object_name}") @staticmethod def _band_to_reference_frequency(is_hba, rcu_band): diff --git a/tangostationcontrol/tangostationcontrol/devices/antennafield.py b/tangostationcontrol/tangostationcontrol/devices/antennafield.py index 65906ae4b0e30b6f40e523a8f168e1ecf41b8ad8..37309355de3390a6791d60d060b5df5ec0dd93e3 100644 --- a/tangostationcontrol/tangostationcontrol/devices/antennafield.py +++ b/tangostationcontrol/tangostationcontrol/devices/antennafield.py @@ -355,6 +355,13 @@ class AntennaField(LOFARDevice): default_value=[-1] * MAX_ANTENNA * 2, ) + # ----- Defaults + + Frequency_Band_RW_default = device_property( + dtype=(str,), + mandatory=False, + ) + # ----- Generic information Antenna_Type_R = attribute( diff --git a/tangostationcontrol/tangostationcontrol/devices/base_device_classes/lofar_device.py b/tangostationcontrol/tangostationcontrol/devices/base_device_classes/lofar_device.py index 116cd4299e287d4122999282f8f2977fe85a732a..61ac4db5663ea7873948faa97404fe665e250dff 100644 --- a/tangostationcontrol/tangostationcontrol/devices/base_device_classes/lofar_device.py +++ b/tangostationcontrol/tangostationcontrol/devices/base_device_classes/lofar_device.py @@ -469,6 +469,13 @@ class LOFARDevice(Device): try: default_value = getattr(self, f"{name}_default") + if default_value is None: + # Attribute allows a default setting, but none + # is configured (f.e. because mandatory=False + # and no useful default exists that can be + # provided in the code). Just skip this attribute. + continue + # properties are always 0D or 1D, but arrays can be 2D. # in the latter case, we need to reshape the default. attr = getattr(self, name) @@ -476,9 +483,12 @@ class LOFARDevice(Device): if max_dim_y > 1: # 2D array -> reshape 1D default - default_value = numpy.array(default_value).reshape( - max_dim_y, max_dim_x - ) + # This is needed because Tango properties cannot be 2D, so we + # cannot specify them in their actual shape. + # + # We assume the length of the y dimension to be variable, + # as some attributes (and thus defaults) have a varying size. + default_value = numpy.array(default_value).reshape(-1, max_dim_x) # set the attribute to the configured default. Shorten after 150 characters logger.debug( diff --git a/tangostationcontrol/tangostationcontrol/devices/calibration.py b/tangostationcontrol/tangostationcontrol/devices/calibration.py index b295a47bce3be34d6d3ae170135e02c93385cd97..df7c1ec31a3b50be659989098addc3f40c824502 100644 --- a/tangostationcontrol/tangostationcontrol/devices/calibration.py +++ b/tangostationcontrol/tangostationcontrol/devices/calibration.py @@ -16,6 +16,7 @@ from tangostationcontrol.common.calibration import ( calibrate_RCU_attenuator_dB, calibrate_input_samples_delay, ) +from tangostationcontrol.common.case_insensitive_dict import CaseInsensitiveDict from tangostationcontrol.common.entrypoint import entry from tangostationcontrol.common.lofar_logging import ( device_logging_to_python, @@ -41,29 +42,31 @@ class Calibration(LOFARDevice): def __init__(self, cl, name): self._calibration_manager: CalibrationManager = None self.event_subscriptions: list = [] - self.sdpfirmware_proxies: dict = {} - self.sdp_proxies: dict = {} - self.ant_proxies: dict = {} - self.last_ant_calibration_timestamp: dict[str, datetime.datetime | None] = {} + self.sdpfirmware_proxies: CaseInsensitiveDict = CaseInsensitiveDict() + self.sdp_proxies: CaseInsensitiveDict = CaseInsensitiveDict() + self.ant_proxies: CaseInsensitiveDict = CaseInsensitiveDict() + self.last_ant_calibration_timestamp: CaseInsensitiveDict[ + str, datetime.datetime | None + ] = CaseInsensitiveDict() # Super must be called after variable assignment due to executing init_device! super().__init__(cl, name) - def _calibrate_antenna_field(self, ant_proxy): + def _calibrate_antenna_field(self, device): """Recalibrate a specific AntennaField.""" + ant_proxy = self.ant_proxies[device] + if ant_proxy.state() not in DEFAULT_COMMAND_STATES: - logger.warning( - f"Device {ant_proxy.name()} not active. Forgoing calibration." - ) + logger.warning(f"Device {device} not active. Forgoing calibration.") return - logger.info("Re-calibrate antenna field %s", ant_proxy.name()) + logger.info("Re-calibrate antenna field %s", device) - self.last_ant_calibration_timestamp[ant_proxy] = datetime.datetime.now() + self.last_ant_calibration_timestamp[device] = datetime.datetime.now() - self.calibrate_recv(ant_proxy) - self.calibrate_sdp(ant_proxy) + self.calibrate_recv(device) + self.calibrate_sdp(device) @log_exceptions() def _antennafield_changed_event(self, event): @@ -86,7 +89,7 @@ class Calibration(LOFARDevice): return # frequencies changed, so we need to recalibrate - self._calibrate_antenna_field(event.device) + self._calibrate_antenna_field(event.device.name()) @log_exceptions() def _clock_changed_event(self, event): @@ -109,7 +112,7 @@ class Calibration(LOFARDevice): for k, ant in self.ant_proxies.items(): # Recalibrate associated AntennaFields - sdpfirmware_device = ant.SDPFirmware_device_R.casefold() + sdpfirmware_device = ant.SDPFirmware_device_R sdp_device = self.sdpfirmware_proxies[sdpfirmware_device].SDP_device_R if device_name_matches(sdp_device, event.device.name()): @@ -172,9 +175,6 @@ class Calibration(LOFARDevice): antennafield.RCU_band_select_RW """ - # sanitize device name - device = device.casefold() - # ----------------------------------------------------------- # Set signal-input attenuation to compensate for # differences in cable length. @@ -196,14 +196,11 @@ class Calibration(LOFARDevice): antennafield.RCU_band_select_RW """ - # sanitize device name - device = device.casefold() - if device not in self.ant_proxies: raise ValueError(f"Could not find {device} in {self.ant_proxies}") ant_proxy = self.ant_proxies[device] - sdpfirmware_device = str(ant_proxy.SDPFirmware_device_R).casefold() + sdpfirmware_device = ant_proxy.SDPFirmware_device_R if sdpfirmware_device not in self.sdpfirmware_proxies: raise ValueError( @@ -212,7 +209,7 @@ class Calibration(LOFARDevice): sdpfirmware_proxy = self.sdpfirmware_proxies[sdpfirmware_device] - sdp_device = str(sdpfirmware_proxy.SDP_device_R).casefold() + sdp_device = sdpfirmware_proxy.SDP_device_R if sdp_device not in self.sdp_proxies: raise ValueError(f"Could not find {sdp_device} in {self.sdp_proxies}") @@ -248,21 +245,22 @@ class Calibration(LOFARDevice): db = Database() devices = db.get_device_exported_for_class(AntennaField.__name__) for d in devices: - logger.debug("found antenna field device %s", str(d)) - self.ant_proxies = {d.casefold(): create_device_proxy(d) for d in devices} - self.last_ant_calibration_timestamp = {d.casefold(): None for d in devices} + logger.debug(f"Found antenna field device {d}") + + self.ant_proxies[d] = create_device_proxy(d) + self.last_ant_calibration_timestamp[d] = None devices = db.get_device_exported_for_class(SDPFirmware.__name__) for d in devices: - logger.debug("found SDP firmware device %s", str(d)) - self.sdpfirmware_proxies = { - d.casefold(): create_device_proxy(d) for d in devices - } + logger.debug(f"Dound SDP firmware device {d}") + + self.sdpfirmware_proxies[d] = create_device_proxy(d) devices = db.get_device_exported_for_class(SDP.__name__) for d in devices: - logger.debug("found SDP device %s", str(d)) - self.sdp_proxies = {d.casefold(): create_device_proxy(d) for d in devices} + logger.debug(f"Found SDP device {d}") + + self.sdp_proxies[d] = create_device_proxy(d) # subscribe to events to notice setting changes in SDP that determine the # input frequency