diff --git a/CDB/integrations/recvcluster_ConfigDb.json b/CDB/integrations/recvcluster_ConfigDb.json index 4aecaea4862f8a9911c2832aa2ac6939f730ab7f..23659cb18c4dea5badc2c5c4ff5201aba94cde36 100644 --- a/CDB/integrations/recvcluster_ConfigDb.json +++ b/CDB/integrations/recvcluster_ConfigDb.json @@ -14,1397 +14,449 @@ "AntennaField": { "STAT/AntennaField/1": { "properties": { - "Antenna_Field_Reference_ITRF": [ - "3826577.066", - "461022.948", - "5064892.786" + "Antenna_Field_Reference_ETRS": [ + "3826896.631", "460979.131", "5064657.943" ], - "Antenna_Reference_itrf": [ - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786" + "Antenna_Reference_ETRS": [ + "3826886.142", "460980.772", "5064665.668", + "3826887.237", "460985.643", "5064664.406", + "3826889.022", "460974.271", "5064664.094", + "3826890.118", "460979.142", "5064662.831", + "3826891.214", "460984.012", "5064661.568", + "3826892.311", "460988.883", "5064660.305", + "3826891.902", "460967.768", "5064662.520", + "3826892.999", "460972.640", "5064661.256", + "3826894.094", "460977.511", "5064659.994", + "3826895.191", "460982.382", "5064658.730", + "3826896.287", "460987.252", "5064657.467", + "3826897.383", "460992.123", "5064656.204", + "3826895.879", "460966.138", "5064659.682", + "3826896.974", "460971.009", "5064658.419", + "3826898.071", "460975.880", "5064657.156", + "3826899.167", "460980.751", "5064655.893", + "3826900.263", "460985.622", "5064654.630", + "3826901.359", "460990.493", "5064653.367", + "3826900.951", "460969.378", "5064655.582", + "3826902.048", "460974.250", "5064654.319", + "3826903.143", "460979.120", "5064653.056", + "3826904.240", "460983.991", "5064651.793", + "3826906.024", "460972.619", "5064651.481", + "3826907.120", "460977.490", "5064650.218", + "3826969.290", "460898.914", "5064610.654", + "3826970.386", "460903.785", "5064609.392", + "3826972.171", "460892.413", "5064609.080", + "3826973.267", "460897.284", "5064607.817", + "3826974.363", "460902.154", "5064606.554", + "3826975.459", "460907.025", "5064605.291", + "3826975.051", "460885.911", "5064607.506", + "3826976.147", "460890.782", "5064606.242", + "3826977.243", "460895.653", "5064604.980", + "3826978.339", "460900.524", "5064603.716", + "3826979.436", "460905.394", "5064602.453", + "3826980.532", "460910.265", "5064601.190", + "3826979.027", "460884.281", "5064604.668", + "3826980.123", "460889.152", "5064603.405", + "3826981.220", "460894.022", "5064602.142", + "3826982.316", "460898.893", "5064600.879", + "3826983.412", "460903.764", "5064599.616", + "3826984.508", "460908.635", "5064598.353", + "3826984.100", "460887.521", "5064600.568", + "3826985.196", "460892.392", "5064599.305", + "3826986.292", "460897.262", "5064598.042", + "3826987.388", "460902.133", "5064596.779", + "3826989.173", "460890.761", "5064596.467", + "3826990.269", "460895.632", "5064595.204" ], - "HBAT_antenna_itrf_offsets": [ - "-1.847", - "-1.180", - " 1.493", - "-1.581", - " 0.003", - " 1.186", - "-1.315", - " 1.185", - " 0.880", - "-1.049", - " 2.367", - " 0.573", - "-0.882", - "-1.575", - " 0.804", - "-0.616", - "-0.393", - " 0.498", - "-0.350", - " 0.789", - " 0.191", - "-0.083", - " 1.971", - "-0.116", - " 0.083", - "-1.971", - " 0.116", - " 0.350", - "-0.789", - "-0.191", - " 0.616", - " 0.393", - "-0.498", - " 0.882", - " 1.575", - "-0.804", - " 1.049", - "-2.367", - "-0.573", - " 1.315", - "-1.185", - "-0.880", - " 1.581", - "-0.003", - "-1.186", - " 1.847", - " 1.180", - "-1.493" + "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" + ], + "HBAT_PQR_to_ETRS_rotation_matrix": [ + "-0.1195951054", "-0.7919544517", "0.5987530018", + " 0.9928227484", "-0.0954186800", "0.0720990002", + " 0.0000330969", " 0.6030782884", "0.7976820024" ] } }, "STAT/AntennaField/2": { "properties": { - "Antenna_Field_Reference_ITRF": [ - "3826577.066", - "461022.948", - "5064892.786" + "Antenna_Field_Reference_ETRS": [ + "3826896.631", "460979.131", "5064657.943" + ], + "Antenna_Reference_ETRS": [ + "3826886.142", "460980.772", "5064665.668", + "3826887.237", "460985.643", "5064664.406", + "3826889.022", "460974.271", "5064664.094", + "3826890.118", "460979.142", "5064662.831", + "3826891.214", "460984.012", "5064661.568", + "3826892.311", "460988.883", "5064660.305", + "3826891.902", "460967.768", "5064662.520", + "3826892.999", "460972.640", "5064661.256", + "3826894.094", "460977.511", "5064659.994", + "3826895.191", "460982.382", "5064658.730", + "3826896.287", "460987.252", "5064657.467", + "3826897.383", "460992.123", "5064656.204", + "3826895.879", "460966.138", "5064659.682", + "3826896.974", "460971.009", "5064658.419", + "3826898.071", "460975.880", "5064657.156", + "3826899.167", "460980.751", "5064655.893", + "3826900.263", "460985.622", "5064654.630", + "3826901.359", "460990.493", "5064653.367", + "3826900.951", "460969.378", "5064655.582", + "3826902.048", "460974.250", "5064654.319", + "3826903.143", "460979.120", "5064653.056", + "3826904.240", "460983.991", "5064651.793", + "3826906.024", "460972.619", "5064651.481", + "3826907.120", "460977.490", "5064650.218", + "3826969.290", "460898.914", "5064610.654", + "3826970.386", "460903.785", "5064609.392", + "3826972.171", "460892.413", "5064609.080", + "3826973.267", "460897.284", "5064607.817", + "3826974.363", "460902.154", "5064606.554", + "3826975.459", "460907.025", "5064605.291", + "3826975.051", "460885.911", "5064607.506", + "3826976.147", "460890.782", "5064606.242", + "3826977.243", "460895.653", "5064604.980", + "3826978.339", "460900.524", "5064603.716", + "3826979.436", "460905.394", "5064602.453", + "3826980.532", "460910.265", "5064601.190", + "3826979.027", "460884.281", "5064604.668", + "3826980.123", "460889.152", "5064603.405", + "3826981.220", "460894.022", "5064602.142", + "3826982.316", "460898.893", "5064600.879", + "3826983.412", "460903.764", "5064599.616", + "3826984.508", "460908.635", "5064598.353", + "3826984.100", "460887.521", "5064600.568", + "3826985.196", "460892.392", "5064599.305", + "3826986.292", "460897.262", "5064598.042", + "3826987.388", "460902.133", "5064596.779", + "3826989.173", "460890.761", "5064596.467", + "3826990.269", "460895.632", "5064595.204" ], - "Antenna_Reference_itrf": [ - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786" + "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" ], - "HBAT_antenna_itrf_offsets": [ - "-1.847", - "-1.180", - " 1.493", - "-1.581", - " 0.003", - " 1.186", - "-1.315", - " 1.185", - " 0.880", - "-1.049", - " 2.367", - " 0.573", - "-0.882", - "-1.575", - " 0.804", - "-0.616", - "-0.393", - " 0.498", - "-0.350", - " 0.789", - " 0.191", - "-0.083", - " 1.971", - "-0.116", - " 0.083", - "-1.971", - " 0.116", - " 0.350", - "-0.789", - "-0.191", - " 0.616", - " 0.393", - "-0.498", - " 0.882", - " 1.575", - "-0.804", - " 1.049", - "-2.367", - "-0.573", - " 1.315", - "-1.185", - "-0.880", - " 1.581", - "-0.003", - "-1.186", - " 1.847", - " 1.180", - "-1.493" + "HBAT_PQR_to_ETRS_rotation_matrix": [ + "-0.1195951054", "-0.7919544517", "0.5987530018", + " 0.9928227484", "-0.0954186800", "0.0720990002", + " 0.0000330969", " 0.6030782884", "0.7976820024" ] } }, "STAT/AntennaField/3": { "properties": { - "Antenna_Field_Reference_ITRF": [ - "3826577.066", - "461022.948", - "5064892.786" + "Antenna_Field_Reference_ETRS": [ + "3826896.631", "460979.131", "5064657.943" ], - "Antenna_Reference_itrf": [ - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786" + "Antenna_Reference_ETRS": [ + "3826886.142", "460980.772", "5064665.668", + "3826887.237", "460985.643", "5064664.406", + "3826889.022", "460974.271", "5064664.094", + "3826890.118", "460979.142", "5064662.831", + "3826891.214", "460984.012", "5064661.568", + "3826892.311", "460988.883", "5064660.305", + "3826891.902", "460967.768", "5064662.520", + "3826892.999", "460972.640", "5064661.256", + "3826894.094", "460977.511", "5064659.994", + "3826895.191", "460982.382", "5064658.730", + "3826896.287", "460987.252", "5064657.467", + "3826897.383", "460992.123", "5064656.204", + "3826895.879", "460966.138", "5064659.682", + "3826896.974", "460971.009", "5064658.419", + "3826898.071", "460975.880", "5064657.156", + "3826899.167", "460980.751", "5064655.893", + "3826900.263", "460985.622", "5064654.630", + "3826901.359", "460990.493", "5064653.367", + "3826900.951", "460969.378", "5064655.582", + "3826902.048", "460974.250", "5064654.319", + "3826903.143", "460979.120", "5064653.056", + "3826904.240", "460983.991", "5064651.793", + "3826906.024", "460972.619", "5064651.481", + "3826907.120", "460977.490", "5064650.218", + "3826969.290", "460898.914", "5064610.654", + "3826970.386", "460903.785", "5064609.392", + "3826972.171", "460892.413", "5064609.080", + "3826973.267", "460897.284", "5064607.817", + "3826974.363", "460902.154", "5064606.554", + "3826975.459", "460907.025", "5064605.291", + "3826975.051", "460885.911", "5064607.506", + "3826976.147", "460890.782", "5064606.242", + "3826977.243", "460895.653", "5064604.980", + "3826978.339", "460900.524", "5064603.716", + "3826979.436", "460905.394", "5064602.453", + "3826980.532", "460910.265", "5064601.190", + "3826979.027", "460884.281", "5064604.668", + "3826980.123", "460889.152", "5064603.405", + "3826981.220", "460894.022", "5064602.142", + "3826982.316", "460898.893", "5064600.879", + "3826983.412", "460903.764", "5064599.616", + "3826984.508", "460908.635", "5064598.353", + "3826984.100", "460887.521", "5064600.568", + "3826985.196", "460892.392", "5064599.305", + "3826986.292", "460897.262", "5064598.042", + "3826987.388", "460902.133", "5064596.779", + "3826989.173", "460890.761", "5064596.467", + "3826990.269", "460895.632", "5064595.204" ], - "HBAT_antenna_itrf_offsets": [ - "-1.847", - "-1.180", - " 1.493", - "-1.581", - " 0.003", - " 1.186", - "-1.315", - " 1.185", - " 0.880", - "-1.049", - " 2.367", - " 0.573", - "-0.882", - "-1.575", - " 0.804", - "-0.616", - "-0.393", - " 0.498", - "-0.350", - " 0.789", - " 0.191", - "-0.083", - " 1.971", - "-0.116", - " 0.083", - "-1.971", - " 0.116", - " 0.350", - "-0.789", - "-0.191", - " 0.616", - " 0.393", - "-0.498", - " 0.882", - " 1.575", - "-0.804", - " 1.049", - "-2.367", - "-0.573", - " 1.315", - "-1.185", - "-0.880", - " 1.581", - "-0.003", - "-1.186", - " 1.847", - " 1.180", - "-1.493" + "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" + ], + "HBAT_PQR_to_ETRS_rotation_matrix": [ + "-0.1195951054", "-0.7919544517", "0.5987530018", + " 0.9928227484", "-0.0954186800", "0.0720990002", + " 0.0000330969", " 0.6030782884", "0.7976820024" ] } }, "STAT/AntennaField/4": { "properties": { - "Antenna_Field_Reference_ITRF": [ - "3826577.066", - "461022.948", - "5064892.786" + "Antenna_Field_Reference_ETRS": [ + "3826896.631", "460979.131", "5064657.943" + ], + "Antenna_Reference_ETRS": [ + "3826886.142", "460980.772", "5064665.668", + "3826887.237", "460985.643", "5064664.406", + "3826889.022", "460974.271", "5064664.094", + "3826890.118", "460979.142", "5064662.831", + "3826891.214", "460984.012", "5064661.568", + "3826892.311", "460988.883", "5064660.305", + "3826891.902", "460967.768", "5064662.520", + "3826892.999", "460972.640", "5064661.256", + "3826894.094", "460977.511", "5064659.994", + "3826895.191", "460982.382", "5064658.730", + "3826896.287", "460987.252", "5064657.467", + "3826897.383", "460992.123", "5064656.204", + "3826895.879", "460966.138", "5064659.682", + "3826896.974", "460971.009", "5064658.419", + "3826898.071", "460975.880", "5064657.156", + "3826899.167", "460980.751", "5064655.893", + "3826900.263", "460985.622", "5064654.630", + "3826901.359", "460990.493", "5064653.367", + "3826900.951", "460969.378", "5064655.582", + "3826902.048", "460974.250", "5064654.319", + "3826903.143", "460979.120", "5064653.056", + "3826904.240", "460983.991", "5064651.793", + "3826906.024", "460972.619", "5064651.481", + "3826907.120", "460977.490", "5064650.218", + "3826969.290", "460898.914", "5064610.654", + "3826970.386", "460903.785", "5064609.392", + "3826972.171", "460892.413", "5064609.080", + "3826973.267", "460897.284", "5064607.817", + "3826974.363", "460902.154", "5064606.554", + "3826975.459", "460907.025", "5064605.291", + "3826975.051", "460885.911", "5064607.506", + "3826976.147", "460890.782", "5064606.242", + "3826977.243", "460895.653", "5064604.980", + "3826978.339", "460900.524", "5064603.716", + "3826979.436", "460905.394", "5064602.453", + "3826980.532", "460910.265", "5064601.190", + "3826979.027", "460884.281", "5064604.668", + "3826980.123", "460889.152", "5064603.405", + "3826981.220", "460894.022", "5064602.142", + "3826982.316", "460898.893", "5064600.879", + "3826983.412", "460903.764", "5064599.616", + "3826984.508", "460908.635", "5064598.353", + "3826984.100", "460887.521", "5064600.568", + "3826985.196", "460892.392", "5064599.305", + "3826986.292", "460897.262", "5064598.042", + "3826987.388", "460902.133", "5064596.779", + "3826989.173", "460890.761", "5064596.467", + "3826990.269", "460895.632", "5064595.204" ], - "Antenna_Reference_itrf": [ - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786", - "3826577.066", - "461022.948", - "5064892.786" + "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" ], - "HBAT_antenna_itrf_offsets": [ - "-1.847", - "-1.180", - " 1.493", - "-1.581", - " 0.003", - " 1.186", - "-1.315", - " 1.185", - " 0.880", - "-1.049", - " 2.367", - " 0.573", - "-0.882", - "-1.575", - " 0.804", - "-0.616", - "-0.393", - " 0.498", - "-0.350", - " 0.789", - " 0.191", - "-0.083", - " 1.971", - "-0.116", - " 0.083", - "-1.971", - " 0.116", - " 0.350", - "-0.789", - "-0.191", - " 0.616", - " 0.393", - "-0.498", - " 0.882", - " 1.575", - "-0.804", - " 1.049", - "-2.367", - "-0.573", - " 1.315", - "-1.185", - "-0.880", - " 1.581", - "-0.003", - "-1.186", - " 1.847", - " 1.180", - "-1.493" + "HBAT_PQR_to_ETRS_rotation_matrix": [ + "-0.1195951054", "-0.7919544517", "0.5987530018", + " 0.9928227484", "-0.0954186800", "0.0720990002", + " 0.0000330969", " 0.6030782884", "0.7976820024" ] } } diff --git a/docker-compose/Makefile b/docker-compose/Makefile index 7606e94abd344a9c255463664bf2f55d8e556b93..5cdb54531b472901dbda22902937e62a0ab2902b 100644 --- a/docker-compose/Makefile +++ b/docker-compose/Makefile @@ -172,10 +172,10 @@ up: minimal ## start the base TANGO system and prepare requested services $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) up --no-start --no-recreate $(SERVICE) run: minimal ## run a service using arguments and delete it afterwards - $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) run --no-deps --rm $(SERVICE) $(SERVICE_ARGS) + $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) run -T --no-deps --rm $(SERVICE) $(SERVICE_ARGS) integration: minimal ## run a service using arguments and delete it afterwards - $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) run --no-deps --rm integration-test $(INTEGRATION_ARGS) + $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) run -T --no-deps --rm integration-test $(INTEGRATION_ARGS) down: ## stop all services and tear down the system $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) down diff --git a/tangostationcontrol/docs/source/broken_hardware.rst b/tangostationcontrol/docs/source/broken_hardware.rst new file mode 100644 index 0000000000000000000000000000000000000000..7047d324ed7085122225a6e07ca67e830835b876 --- /dev/null +++ b/tangostationcontrol/docs/source/broken_hardware.rst @@ -0,0 +1,47 @@ +Broken Hardware +-------------------- + +Not all hardware is always functional. Broken hardware must be excluded from the signal chain, and in some cases prevented from powering up. + +Disabling antennas +`````````````````````````` + +Not all antennas present in the field are to be used. The AntennaField device exposes the following properties for each of its antennas: + +:Antenna_Quality: The condition of the antenna: 0=OK, 1=SUSPICIOUS, 2=BROKEN, 3=BEYOND_REPAIR. + + :type: ``int32[]`` + +:Antenna_Use: Whether each antenna should be used: 0=AUTO, 1=ON, 2=OFF. In AUTO mode, an antenna is used if its quality is OK or SUSPICIOUS. In ON mode, it is always used. In OFF mode, never. + + :type: ``int32[]`` + +which can also be queried as ``Antenna_Quality_R`` and ``Antenna_Use_R``. + +.. note:: If these properties are updated, you should restart both the AntennaField and DigitalBeam device to propagate their effects. + +The above settings result in a subset of the antennas in the AntennaField to be marked as usable. The following property exposes this conclusion: + +:Antenna_Usage_Mask_R: Whether antennas will be used, according to their configured state and quality. Antennas which are configured to be BROKEN, BEYOND_REPAIR, or OFF, are not used. + + :type: ``bool[N_tiles]`` + +Effect on signal chain +"""""""""""""""""""""""""" + +The DigitalBeam device will only beamform inputs that are enabled in the ``AntennaField.Antenna_Usage_Mask_R`` attribute. + + +Power distribution +-------------------------- + +At boot, during hardware initialisation, the following devices toggle power: + +* The RECV device turns all RCUs enabled in ``RCU_mask_RW`` OFF and ON, +* The RECV device powers its antennas according to its ``RCU_PWR_ANT_on_RW_default`` property, +* The AntennaField device powers its antennas, if they are: + * Enabled in ``Antenna_Usage_Mask_R`` attribute, that is, not marked as BROKEN, BEYOND_REPAIR, or OFF, + * Enabled in the ``Antenna_Needs_Power`` property. + +.. note:: Exotic inputs like a noise source must not receive power, even when used. Use the ``Antenna_Needs_Power`` property to configure which antennas should be powered on. + diff --git a/tangostationcontrol/docs/source/devices/antennafield.rst b/tangostationcontrol/docs/source/devices/antennafield.rst index bcf93f62e9d40aa4d48e24c68eb357433216542d..faede195aec38828f2c1d1d6b71d2bdb928ef6eb 100644 --- a/tangostationcontrol/docs/source/devices/antennafield.rst +++ b/tangostationcontrol/docs/source/devices/antennafield.rst @@ -46,13 +46,19 @@ The antennas represented by the antenna field are selected by the following prop :type: ``str[]`` -:Power_to_RECV_mapping: Pairs of numbers ``(recv_idx, ant_idx)`` describing the inputs on which the Antenna *power* is connected. The ``recv_idx`` is the index in ``RECV_devices``, starting at 1. The ``ant_idx`` is the absolute index of the antenna in the ``RECV`` device. A value of ``-1`` means the antenna is not connected at all. +Antenna mapping +"""""""""""""""""""" + +These properties configure which inputs in RECV represent the power and control for each antenna: + +:HBAT_Power_to_RECV_mapping: Pairs of numbers ``(recv_idx, ant_idx)`` describing the inputs on which the HBAT *power* is connected. The ``recv_idx`` is the index in ``RECV_devices``, starting at 1. The ``ant_idx`` is the absolute index of the antenna in the ``RECV`` device. A value of ``-1`` means the antenna is not connected at all. :type: ``int32[]`` :shape: ``int32[][2]`` :Control_to_RECV_mapping: Pairs of numbers ``(recv_idx, ant_idx)`` describing the inputs on which the Antenna *control* is connected. The ``recv_idx`` is the index in ``RECV_devices``, starting at 1. The ``ant_idx`` is the absolute index of the antenna in the ``RECV`` device. A value of ``-1`` means the antenna is not connected at all. + Positions """""""""""""""""""" diff --git a/tangostationcontrol/docs/source/devices/using.rst b/tangostationcontrol/docs/source/devices/using.rst index 053d73bda33703c187f6bd9de9d7d84194647254..57d2f255ed2fdd673e8996492a8b2ff434960387 100644 --- a/tangostationcontrol/docs/source/devices/using.rst +++ b/tangostationcontrol/docs/source/devices/using.rst @@ -109,12 +109,10 @@ Most devices provide the following commands, in order to configure the hardware :set_translator_defaults(): Select the hardware to configure and monitor. -:prepare_hardware(): For devices that control hardware, this command prepares the hardware to accept commands (f.e. load firmware). +:prepare_hardware(): For devices that control hardware, this command prepares the hardware to accept commands (f.e. power cycle, load firmware). :set_defaults(): Upload default attribute settings from the TangoDB to the hardware. -:initialise_hardware(): For devices that control hardware, this command runs the hardware initialisation procedure. - :on(): Mark the device as operational. Moves from ``STANDBY`` to ``ON``. See also :ref:`boot`, which provides functionality to initialise all the devices. diff --git a/tangostationcontrol/docs/source/index.rst b/tangostationcontrol/docs/source/index.rst index 6bd156c2b7f9d3cda99ad3af8a7e01bbc33c45c8..4c56206dfce3ab37b07f103a963d06846ccd8f12 100644 --- a/tangostationcontrol/docs/source/index.rst +++ b/tangostationcontrol/docs/source/index.rst @@ -34,6 +34,7 @@ Even without having access to any LOFAR2.0 hardware, you can install the full st devices/configure configure_station signal_chain + broken_hardware developer faq diff --git a/tangostationcontrol/tangostationcontrol/devices/antennafield.py b/tangostationcontrol/tangostationcontrol/devices/antennafield.py index 25b58719c287c4a6fe6e4b690f0228187ac17989..565f979539a3a70f538f39f880cd7efeae0102e4 100644 --- a/tangostationcontrol/tangostationcontrol/devices/antennafield.py +++ b/tangostationcontrol/tangostationcontrol/devices/antennafield.py @@ -110,6 +110,15 @@ class AntennaField(lofar_device): default_value = numpy.array([AntennaUse.AUTO] * MAX_NUMBER_OF_HBAT) ) + # ----- Antenna properties + + Antenna_Needs_Power = device_property( + doc="Whether to provide power to each antenna (False for noise sources)", + dtype='DevVarBooleanArray', + mandatory=False, + default_value = numpy.array([False] * MAX_NUMBER_OF_HBAT) + ) + # ----- Position information Antenna_Field_Reference_ITRF = device_property( @@ -149,7 +158,6 @@ class AntennaField(lofar_device): mandatory=False, default_value = 2015.5 ) - HBAT_PQR_rotation_angles_deg = device_property( doc='Rotation of each tile in the PQ plane ("horizontal") in degrees.', dtype='DevVarFloatArray', @@ -206,14 +214,21 @@ class AntennaField(lofar_device): Antenna_Names_R = attribute(access=AttrWriteType.READ, dtype=(str,), max_dim_x=MAX_NUMBER_OF_HBAT) - Antenna_Quality_R = attribute(access=AttrWriteType.READ, - dtype=(numpy.uint16,), max_dim_x=MAX_NUMBER_OF_HBAT) - Antenna_Use_R = attribute(access=AttrWriteType.READ, - dtype=(numpy.uint16,), max_dim_x=MAX_NUMBER_OF_HBAT) - Antenna_Usage_Mask_R = attribute(access=AttrWriteType.READ, + Antenna_Quality_R = attribute(doc='The quality of each antenna. 0=OK, 1=SUSPICIOUS, 2=BROKEN, 3=BEYOND_REPAIR.', + dtype=(numpy.uint32,), max_dim_x=MAX_NUMBER_OF_HBAT) + Antenna_Use_R = attribute(doc='Whether each antenna should be used. 0=AUTO, 1=ON, 2=OFF. In AUTO mode, the antenna is used if it is not BROKEN or BEYOND_REPAIR.', + dtype=(numpy.uint32,), max_dim_x=MAX_NUMBER_OF_HBAT) + Antenna_Quality_str_R = attribute(doc='The quality of each antenna, as a string.', + dtype=(str,), max_dim_x=MAX_NUMBER_OF_HBAT) + Antenna_Use_str_R = attribute(doc='Whether each antenna should be used, as a string.', + dtype=(str,), max_dim_x=MAX_NUMBER_OF_HBAT) + + Antenna_Usage_Mask_R = attribute(doc='Whether each antenna will be used.', dtype=(bool,), max_dim_x=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) + 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) HBAT_BF_delay_steps_R = mapped_attribute("HBAT_BF_delay_steps_R", dtype=((numpy.int64,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT) HBAT_BF_delay_steps_RW = mapped_attribute("HBAT_BF_delay_steps_RW", dtype=((numpy.int64,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE) HBAT_LED_on_R = mapped_attribute("HBAT_LED_on_R", dtype=((bool,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT) @@ -266,19 +281,29 @@ class AntennaField(lofar_device): def read_Antenna_Quality_R(self): return self.Antenna_Quality + + def read_Antenna_Use_str_R(self): + return [AntennaUse(x).name for x in self.Antenna_Use] + def read_Antenna_Quality_str_R(self): + return [AntennaQuality(x).name for x in self.Antenna_Quality] + def read_Antenna_Usage_Mask_R(self): - antenna_usage = numpy.zeros(MAX_NUMBER_OF_HBAT, dtype=bool) - for n in range(0, MAX_NUMBER_OF_HBAT): - antenna_usage[n] = (self.read_attribute('Antenna_Use_R')[n] == AntennaUse.ON - or (self.read_attribute('Antenna_Use_R')[n] == AntennaUse.AUTO and self.read_attribute('Antenna_Quality_R')[n] <= AntennaQuality.SUSPICIOUS)) - return antenna_usage + use = numpy.array(self.Antenna_Use) + quality = numpy.array(self.Antenna_Quality) + + antennas_forced_on = use == AntennaUse.ON + antennas_auto_on = numpy.logical_and(use == AntennaUse.AUTO, quality <= AntennaQuality.SUSPICIOUS) + + return numpy.logical_or(antennas_forced_on, antennas_auto_on) 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), # * the number of elements in the Power_to_RECV_mapping (after reshaping), # * the number of antennas exposed through Antenna_Reference_ITRF_R. + # * the number of elements in Antenna_Use + # * the number of elements in Antenna_Quality # # Parsing a property here is quickest, so we chose that. return len(self.Control_to_RECV_mapping) // 2 @@ -388,31 +413,15 @@ class AntennaField(lofar_device): @log_exceptions() def _prepare_hardware(self): - # Initialise the RCU hardware. - for recv_proxy in self.recv_proxies: - RCU_mask = recv_proxy.RCU_mask_RW - # Set the mask to all Trues - recv_proxy.RCU_mask_RW = [True] * 32 - # Turn off the RCUs - recv_proxy.RCU_off() - - # TODO(Stefano): restore wait attribute - #recv_proxy.wait_attribute("RECVTR_translator_busy_R", False, recv_proxy.RCU_On_Off_timeout) - - # Restore the mask - recv_proxy.RCU_mask_RW = RCU_mask - # Turn on the RCUs - recv_proxy.RCU_on() + usage_mask = self.read_attribute('Antenna_Usage_Mask_R') - # TODO(Stefano): restore wait attribute - #recv_proxy.wait_attribute("RECVTR_translator_busy_R", False, recv_proxy.RCU_On_Off_timeout) - - @log_exceptions() - def _initialise_hardware(self): # Disable controlling the tiles that fall outside the mask # WARN: Needed in configure_for_initialise but Tango does not allow to write attributes in INIT state self.proxy.write_attribute('ANT_mask_RW', self.read_attribute('Antenna_Usage_Mask_R')) + # Turn on power to antennas that need it (and due to the ANT_mask, that we're using) + self.proxy.write_attribute('RCU_PWR_ANT_on_RW', self.Antenna_Needs_Power) + # -------- # Commands # -------- @@ -452,6 +461,8 @@ class AntennaToRecvMapper(object): self.__number_of_receivers = number_of_receivers self.__default_value_mapping_read = { "ANT_mask_RW": numpy.full(number_of_antennas, False), + "RCU_PWR_ANT_on_R": numpy.full(number_of_antennas, False), + "RCU_PWR_ANT_on_RW": numpy.full(number_of_antennas, False), "HBAT_BF_delay_steps_R": numpy.zeros([number_of_antennas,32], dtype=numpy.int64), "HBAT_BF_delay_steps_RW": numpy.zeros([number_of_antennas,32], dtype=numpy.int64), "HBAT_LED_on_R": numpy.full((number_of_antennas,32), False), @@ -464,6 +475,7 @@ class AntennaToRecvMapper(object): } self.__default_value_mapping_write = { "ANT_mask_RW": numpy.full(96, False), + "RCU_PWR_ANT_on_RW": numpy.full(96, False), "HBAT_BF_delay_steps_RW": numpy.zeros([96,32], dtype=numpy.int64), "HBAT_LED_on_RW": numpy.full((96,32), False), "HBAT_PWR_LNA_on_RW": numpy.full((96,32), False), diff --git a/tangostationcontrol/tangostationcontrol/devices/apsct.py b/tangostationcontrol/tangostationcontrol/devices/apsct.py index 60563f1138c125c79274b1c2f5342b7df68c02e8..f2bf1fa4d7af436807fd74c9649627ffa4593bb3 100644 --- a/tangostationcontrol/tangostationcontrol/devices/apsct.py +++ b/tangostationcontrol/tangostationcontrol/devices/apsct.py @@ -52,6 +52,10 @@ class APSCT(opcua_device): default_value=10.0 ) + TRANSLATOR_DEFAULT_SETTINGS = [ + 'APSCTTR_monitor_rate_RW' + ] + # ---------- # Attributes # ---------- @@ -118,7 +122,7 @@ class APSCT(opcua_device): # overloaded functions # -------- - def _initialise_hardware(self): + def _prepare_hardware(self): """ Initialise the APSCT hardware. """ # Cycle clock diff --git a/tangostationcontrol/tangostationcontrol/devices/apspu.py b/tangostationcontrol/tangostationcontrol/devices/apspu.py index 08c43f5a4362b22bd15ab0065e243f741add98ae..70536471bf6238e009c258444956b440b2d6cf23 100644 --- a/tangostationcontrol/tangostationcontrol/devices/apspu.py +++ b/tangostationcontrol/tangostationcontrol/devices/apspu.py @@ -37,6 +37,10 @@ class APSPU(opcua_device): default_value=1 ) + TRANSLATOR_DEFAULT_SETTINGS = [ + 'APSPUTR_monitor_rate_RW' + ] + # ---------- # Attributes # ---------- diff --git a/tangostationcontrol/tangostationcontrol/devices/lofar_device.py b/tangostationcontrol/tangostationcontrol/devices/lofar_device.py index 665caca7a4d0439e0a2195d9939210229b71cdb0..c04033f343e5ffb118fb31931b60262a6279c9d1 100644 --- a/tangostationcontrol/tangostationcontrol/devices/lofar_device.py +++ b/tangostationcontrol/tangostationcontrol/devices/lofar_device.py @@ -342,16 +342,6 @@ class lofar_device(Device, metaclass=DeviceMeta): # This is just the command version of _prepare_hardware(). self._prepare_hardware() - - @only_in_states(DEFAULT_COMMAND_STATES) - @fault_on_error() - @command() - @DebugIt() - def initialise_hardware(self): - """ Initialise the hardware after configuring it. """ - - # This is just the command version of _initialise_hardware(). - self._initialise_hardware() @only_in_states(INITIALISED_STATES) @fault_on_error() @@ -391,9 +381,6 @@ class lofar_device(Device, metaclass=DeviceMeta): # initialise settings self.set_defaults() - # powercycle backing hardware - self.initialise_hardware() - # make device available self.On() @@ -413,11 +400,7 @@ class lofar_device(Device, metaclass=DeviceMeta): self._set_defaults(self.TRANSLATOR_DEFAULT_SETTINGS) def _prepare_hardware(self): - """ Override this method to load any firmware before configuring the hardware. """ - pass - - def _initialise_hardware(self): - """ Override this method to initialise any hardware after configuring it. """ + """ Override this method to load any firmware or power cycle components before configuring the hardware. """ pass def _disable_hardware(self): diff --git a/tangostationcontrol/tangostationcontrol/devices/observation.py b/tangostationcontrol/tangostationcontrol/devices/observation.py index 05d225a4b9d62f7f7190615f4d71f5e34639ab4c..d2b22f4a91b211792b1bc9a08f32c590db6292ef 100644 --- a/tangostationcontrol/tangostationcontrol/devices/observation.py +++ b/tangostationcontrol/tangostationcontrol/devices/observation.py @@ -42,7 +42,7 @@ class Observation(lofar_device): """ NUM_MAX_HBAT = MAX_NUMBER_OF_HBAT - NUM_INPUTS = DigitalBeam.NUM_INPUTS + MAX_INPUTS = DigitalBeam.MAX_INPUTS NUM_BEAMLETS = DigitalBeam.NUM_BEAMLETS # Attributes @@ -52,7 +52,7 @@ class Observation(lofar_device): stop_time_R = attribute(dtype=numpy.float64, access=AttrWriteType.READ) antenna_mask_R = attribute(dtype=(numpy.int64,), max_dim_x=NUM_MAX_HBAT, access=AttrWriteType.READ) filter_R = attribute(dtype=numpy.str, access=AttrWriteType.READ) - saps_subband_R = attribute(dtype=((numpy.uint32,),), max_dim_x=NUM_INPUTS, max_dim_y=NUM_BEAMLETS, access=AttrWriteType.READ) + saps_subband_R = attribute(dtype=((numpy.uint32,),), max_dim_x=MAX_INPUTS, max_dim_y=NUM_BEAMLETS, access=AttrWriteType.READ) saps_pointing_R = attribute(dtype=((numpy.str,),), max_dim_x=3, max_dim_y=NUM_BEAMLETS, access=AttrWriteType.READ) tile_beam_R = attribute(dtype=(numpy.str,), max_dim_x=3, access=AttrWriteType.READ) first_beamlet_R = attribute(dtype=numpy.int64, access=AttrWriteType.READ) @@ -67,6 +67,8 @@ class Observation(lofar_device): self._observation_id = -1 self._stop_time = datetime.now() + self._num_inputs = 0 + def configure_for_initialise(self): """Load the JSON from the attribute and configure member variables""" @@ -113,6 +115,9 @@ class Observation(lofar_device): self.tilebeam_proxy = DeviceProxy(f"{util.get_ds_inst_name()}/Tilebeam/1") self.tilebeam_proxy.set_source(DevSource.DEV) + # Collect static information + self._num_inputs = self.digitalbeam_proxy.antenna_select_RW.shape[0] + logger.info( f"The observation with ID={self._observation_id} is " "configured. It will begin as soon as On() is called and it is" @@ -268,7 +273,7 @@ class Observation(lofar_device): def _apply_saps_antenna_select(self, antenna_mask:list): """ Convert an array of antenna indexes into a boolean select array""" - antenna_select = numpy.array([[False] * self.NUM_BEAMLETS] * self.NUM_INPUTS) + antenna_select = numpy.array([[False] * self.NUM_BEAMLETS] * self._num_inputs) first_beamlet = numpy.array(self.read_first_beamlet_R(), dtype=numpy.int64) for a in antenna_mask: for i in range(first_beamlet, self.NUM_BEAMLETS): diff --git a/tangostationcontrol/tangostationcontrol/devices/recv.py b/tangostationcontrol/tangostationcontrol/devices/recv.py index 037b8adb69fa2515f5a3e2dbaa4ed00c8a2ab43b..aeaa506c3d0cca422426db7316dd095bc34e7de6 100644 --- a/tangostationcontrol/tangostationcontrol/devices/recv.py +++ b/tangostationcontrol/tangostationcontrol/devices/recv.py @@ -70,7 +70,7 @@ class RECV(opcua_device): ) RCU_PWR_ANT_on_RW = device_property( - dtype='DevVarLong64Array', + dtype='DevVarBooleanArray', mandatory=False, default_value=[False] * 96 # turn power off by default in test setups, f.e. to prevent blowing up the noise sources ) @@ -83,7 +83,8 @@ class RECV(opcua_device): TRANSLATOR_DEFAULT_SETTINGS = [ 'ANT_mask_RW', - 'RCU_mask_RW' + 'RCU_mask_RW', + 'RECVTR_monitor_rate_RW' ] # ----- Timing values @@ -236,7 +237,7 @@ class RECV(opcua_device): # in positive delays regardless of the pointing direction. self.HBAT_bf_delay_offset = numpy.mean(self.HBAT_bf_delay_step_delays) - def _initialise_hardware(self): + def _prepare_hardware(self): """ Initialise the RCU hardware. """ # Cycle RCUs diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py b/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py index 79afeacfe41c314d63a59396ceae2b4f7d523c15..e77459a88e69b285c95ad2ac22948f359fe60afb 100644 --- a/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py +++ b/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py @@ -35,7 +35,7 @@ class Beamlet(opcua_device): A_PN = 6 N_POL = 2 N_BEAMLETS_CTRL = 488 - N_BEAMSETS_CTRL = 2 + N_BEAMSETS_CTRL = SDP.N_beamsets_ctrl N_POL_BF = 2 P_SUM = 2 # number of hops that the data of the stream has traveled to reach the BSN aligner on this node diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py index 8c190ddfbb48388dcc6ac10fb4dcccb97ed1ec26..93c91ef791fff255aa2d56e1e1e5c34cdd0f3dbf 100644 --- a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py +++ b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py @@ -37,9 +37,13 @@ class DigitalBeam(beam_device): * antennas: the elements in the AntennaField that feeds the FPGA, * inputs: the antenna slots of the FPGAs (covering both X and Y as one), * polarised_inputs: all the input slots of the FPGAs (separating X and Y). + + The antennas are drawn from an AntennaField device. Only the antennas enabled + in the AntennaField's Antenna_Usage_Mask will be used in beamforming. Those + disabled in the mask will get a weight of 0. """ - NUM_INPUTS = 96 + MAX_INPUTS = 96 NUM_BEAMLETS = 488 # ----------------- @@ -64,7 +68,7 @@ class DigitalBeam(beam_device): 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] * NUM_INPUTS + default_value = [-1] * MAX_INPUTS ) # ---------- @@ -74,12 +78,19 @@ class DigitalBeam(beam_device): Duration_delays_R = attribute(access=AttrWriteType.READ, dtype=numpy.float64, fget=lambda self: self._delays.statistics["last"] or 0) - input_select_RW = attribute(doc='Selection of inputs to use for forming each beamlet', - dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=NUM_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed") + input_select_RW = attribute(doc='Selection of inputs to use for forming each beamlet. Allows selecting broken antennas.', + dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=MAX_INPUTS, 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=NUM_BEAMLETS, max_dim_y=MAX_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed") - antenna_select_RW = attribute(doc='Selection of antennas to use for forming each beamlet (= a subset of input_select of the configured antennas)', - dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=NUM_INPUTS, 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, fget="nr_inputs") + def nr_inputs(self): + """ Return the number of configured inputs. """ + + return max(self.Input_to_Antenna_Mapping) + 1 def read_input_select_RW(self): return self._input_select @@ -89,7 +100,7 @@ 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] * (max(self.Input_to_Antenna_Mapping) + 1) + 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: @@ -98,9 +109,18 @@ class DigitalBeam(beam_device): 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 input_nr, antenna_nr in enumerate(self.Input_to_Antenna_Mapping): - if self.antennafield_proxy.Antenna_Usage_Mask_R[input_nr] and antenna_nr >= 0: - self._input_select[input_nr] = antennas[antenna_nr] + if antenna_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] + else: + # do not use antenna for any beamlet + self._input_select[input_nr] = False # ---------- # Summarising Attributes @@ -120,7 +140,6 @@ class DigitalBeam(beam_device): self.antennafield_proxy = DeviceProxy(self.AntennaField_Device) self.antennafield_proxy.set_source(DevSource.DEV) - antenna_usage_mask = self.antennafield_proxy.Antenna_Usage_Mask_R self.beamlet_proxy = DeviceProxy(self.Beamlet_Device) self.beamlet_proxy.set_source(DevSource.DEV) @@ -131,9 +150,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.NUM_INPUTS) + input_itrf = numpy.array([reference_itrf] * self.MAX_INPUTS) for input_nr, antenna_nr in enumerate(self.Input_to_Antenna_Mapping): - if antenna_usage_mask[input_nr] and antenna_nr >= 0: + if antenna_nr >= 0: input_itrf[input_nr] = antenna_itrf[antenna_nr] # a delay calculator @@ -143,9 +162,8 @@ class DigitalBeam(beam_device): self.relative_input_positions = input_itrf - reference_itrf # use all antennas in the mapping for all beamlets, unless specified otherwise - input_select_mask = numpy.logical_and(numpy.array(self.Input_to_Antenna_Mapping) >= 0, antenna_usage_mask) - input_select = numpy.repeat(input_select_mask, self.NUM_BEAMLETS).reshape(self.NUM_INPUTS, self.NUM_BEAMLETS) - self.write_input_select_RW(input_select) + self.write_input_select_RW(numpy.zeros((self.MAX_INPUTS, self.NUM_BEAMLETS), dtype=bool)) + self.write_antenna_select_RW(numpy.ones((self.nr_inputs(), self.NUM_BEAMLETS), dtype=bool)) # -------- # internal functions @@ -159,7 +177,7 @@ class DigitalBeam(beam_device): Returns delays[antenna][beamlet] """ - delays = numpy.zeros((self.NUM_INPUTS, self.NUM_BEAMLETS), dtype=numpy.float64) + delays = numpy.zeros((self.MAX_INPUTS, self.NUM_BEAMLETS), dtype=numpy.float64) d = self.delay_calculator d.set_measure_time(timestamp) @@ -173,7 +191,7 @@ class DigitalBeam(beam_device): """ Converts an array with dimensions [antenna][beamlet] -> [fpga_nr][input_nr][pol_nr][beamlet] by repeating the values for both polarisations. """ - assert arr.shape == (self.NUM_INPUTS, self.NUM_BEAMLETS) + assert arr.shape == (self.MAX_INPUTS, self.NUM_BEAMLETS) # Each antenna maps on [fpga_nr][input_nr][0] and [fpga_nr][input_nr][1], and we work # with [antenna][beamlet], so we have to interleave copies of the input array per beamlet @@ -206,7 +224,7 @@ class DigitalBeam(beam_device): beam_weights = self.beamlet_proxy.calculate_bf_weights(fpga_delays.flatten()) beam_weights = beam_weights.reshape((Beamlet.N_PN, Beamlet.A_PN * Beamlet.N_POL * Beamlet.N_BEAMLETS_CTRL)) - # Filter out unwanted antennas + # Filter out unwanted antennas (they get a weight of 0) beam_weights *= self._map_inputs_on_polarised_inputs(self._input_select) return beam_weights diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py index 2a7ca8991f168f6bf5ba673207da6dc9dbb09817..d35701ee4821919631a3c4b791c631ca142ae4f0 100644 --- a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py +++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py @@ -113,7 +113,7 @@ class SDP(opcua_device): # TODO(needs to not be statically declared as this can change depending on the station and configuration) S_pn = 12 # Number of ADC signal inputs per Processing Node (PN) FPGA. N_pn = 16 # Number of FPGAs per antenna band that is controlled via the SC - SDP interface. - N_beamsets_ctrl = 2 + N_beamsets_ctrl = 1 FPGA_firmware_version_R = attribute_wrapper(comms_annotation=["FPGA_firmware_version_R"], datatype=str, dims=(N_pn,)) FPGA_boot_image_R = attribute_wrapper(comms_annotation=["FPGA_boot_image_R"], datatype=numpy.int32, dims=(N_pn,), doc="Active FPGA image (0=factory, 1=user)") diff --git a/tangostationcontrol/tangostationcontrol/devices/unb2.py b/tangostationcontrol/tangostationcontrol/devices/unb2.py index 8ec767588ae0e9fe333411b763d47c765da20649..ba0c1364efe3af800ca0a3cf3ae7be313d1a38ac 100644 --- a/tangostationcontrol/tangostationcontrol/devices/unb2.py +++ b/tangostationcontrol/tangostationcontrol/devices/unb2.py @@ -70,7 +70,8 @@ class UNB2(opcua_device): ) TRANSLATOR_DEFAULT_SETTINGS = [ - 'UNB2_mask_RW' + 'UNB2_mask_RW', + 'UNB2TR_monitor_rate_RW' ] UNB2TR_I2C_bus_DDR4_error_R = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_DDR4_error_R"],datatype=numpy.int64 , dims=(2,4)) @@ -198,7 +199,7 @@ class UNB2(opcua_device): # overloaded functions # -------- - def _initialise_hardware(self): + def _prepare_hardware(self): """ Initialise the UNB2 hardware. """ # Cycle UNB2s diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py b/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py index d8932263df5079790e14cdd988f73c3224e8c53a..2d98e2fce13730e2e02ea49316c29fe2dd693b1f 100644 --- a/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py +++ b/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py @@ -46,6 +46,45 @@ class TestStatisticsWriterSST(BaseIntegrationTestCase): self.assertIsNotNone(self.recv_proxy.RCU_Band_Select_R) self.assertIsNotNone(self.recv_proxy.RCU_DTH_on_R) + def test_header_info(self): + """ Test whether the header info are inserted and collected in the proper way""" + with TemporaryDirectory() as tmpdir: + new_sys_argv = [ + sys.argv[0], + "--mode", "SST", + "--no-tango", + "--file", join( + dirname(dirname(dirname(dirname(__file__)))), + "test/statistics", "SDP_SST_statistics_packets.bin" + ), + "--output_dir", tmpdir + ] + + with mock.patch.object(entry.sys, 'argv', new_sys_argv): + with self.assertRaises(SystemExit): + entry.main() + + # check if file was written + self.assertTrue(isfile(f"{tmpdir}/SST_2021-09-20-12-17-40.h5")) + + # test statistics reader + new_sys_argv = [ + sys.argv[0], + "--files", f"{tmpdir}/SST_2021-09-20-12-17-40.h5", + "--start_time", "2021-09-20#07:40:08.937+00:00", + "--end_time", "2021-10-04#07:50:08.937+00:00" + ] + with mock.patch.object(reader.sys, 'argv', new_sys_argv): + stat_parser = reader.setup_stat_parser() + SSTstatistics = stat_parser.list_statistics() + self.assertIsNotNone(SSTstatistics) + stat = stat_parser.get_statistic( + '2021-09-20T12:17:40.000+00:00' + ) + self.assertIsNotNone(stat) + self.assertEqual("0.1", stat.station_version_id) + self.assertEqual("0.1", stat.writer_version_id) + def test_insert_tango_SST_statistics(self): self.assertEqual(DevState.ON, self.recv_proxy.state()) collector = StationSSTCollector(device=self.recv_proxy) diff --git a/tangostationcontrol/tangostationcontrol/integration_test/recv_cluster/test_recv_cluster.py b/tangostationcontrol/tangostationcontrol/integration_test/recv_cluster/test_recv_cluster.py index 0c1fdcafc848ff87d23c1ba8ddd0eb9b87b46bab..fea5e86b8b896cff43f6c38b8122b8ad2b08ac30 100644 --- a/tangostationcontrol/tangostationcontrol/integration_test/recv_cluster/test_recv_cluster.py +++ b/tangostationcontrol/tangostationcontrol/integration_test/recv_cluster/test_recv_cluster.py @@ -11,25 +11,25 @@ import time import numpy import logging import statistics -import unittest from tango import DevState from tangostationcontrol.integration_test import base from tangostationcontrol.integration_test.device_proxy import TestDeviceProxy +from tangostationcontrol.devices.antennafield import AntennaQuality, AntennaUse logger = logging.getLogger() class TestRecvCluster(base.IntegrationTestCase): - POINTING_DIRECTION = numpy.array([["J2000", "0deg", "0deg"]] * 96).flatten() + NR_TILES = 48 + POINTING_DIRECTION = numpy.array([["J2000","0deg","0deg"]] * NR_TILES).flatten() def setUp(self): super(TestRecvCluster, self).setUp() - @unittest.skip("waiting for L2SS-799") def test_recv_cluster_performance(self): beam_proxies = [] antenna_field_proxies = [] @@ -45,27 +45,31 @@ class TestRecvCluster(base.IntegrationTestCase): for proxy in recv_proxies: proxy.off() self.assertTrue(proxy.state() is DevState.OFF) - proxy.initialise() - self.assertTrue(proxy.state() is DevState.STANDBY) + proxy.warm_boot() proxy.set_defaults() - proxy.on() self.assertTrue(proxy.state() is DevState.ON) - for proxy in antenna_field_proxies: + for n in range(1, 5): + proxy = antenna_field_proxies[n-1] + # setup AntennaField + NR_TILES = 48 + control_mapping = [[1,i] for i in range(NR_TILES)] + antenna_qualities = numpy.array([AntennaQuality.OK] * 96) + antenna_use = numpy.array([AntennaUse.AUTO] * 96) + proxy.put_property({"RECV_devices": [f"STAT/RECV/{n}"], + "Control_to_RECV_mapping": numpy.array(control_mapping).flatten(), + 'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use}) proxy.off() - self.assertTrue(proxy.state() is DevState.OFF) - proxy.initialise() - self.assertTrue(proxy.state() is DevState.STANDBY) - proxy.set_defaults() - proxy.on() + proxy.boot() + self.assertEqual(NR_TILES, proxy.nr_antennas_R) self.assertTrue(proxy.state() is DevState.ON) for proxy in beam_proxies: proxy.off() self.assertTrue(proxy.state() is DevState.OFF) - proxy.initialise() - self.assertTrue(proxy.state() is DevState.STANDBY) - proxy.on() + proxy.warm_boot() + proxy.set_defaults() + proxy.Tracking_enabled_RW = False self.assertTrue(proxy.state() is DevState.ON) results = [] diff --git a/tangostationcontrol/tangostationcontrol/statistics/reader.py b/tangostationcontrol/tangostationcontrol/statistics/reader.py index cb9370fd206440de37f31bdbaae7218f71470726..eb1594540554b443ec232bee33ffbc67a1cb4722 100644 --- a/tangostationcontrol/tangostationcontrol/statistics/reader.py +++ b/tangostationcontrol/tangostationcontrol/statistics/reader.py @@ -156,7 +156,7 @@ class statistics_data: # we will be creating potentially tens of thousands of these object. Using __slots__ makes them faster and uses less memory. At the cost of # having to list all self attributes here. - __slots__ = ("version_id", "timestamp", "station_id", "source_info_t_adc", "source_info_subband_calibrated_flag", "source_info_payload_error", + __slots__ = ("version_id", "station_version_id", "writer_version_id", "timestamp", "station_id", "source_info_t_adc", "source_info_subband_calibrated_flag", "source_info_payload_error", "source_info_payload_error", "source_info_payload_error", "source_info_nyquist_zone_index", "source_info_gn_index", "source_info_fsub_type", "source_info_beam_repositioning_flag", "source_info_antenna_band_index", "source_info__raw", "observation_id", "nof_statistics_per_packet", "nof_signal_inputs", "nof_bytes_per_statistic", "marker", "integration_interval_raw", @@ -169,6 +169,10 @@ class statistics_data: # get all the general header info self.version_id = file[group_key].attrs["version_id"] self.station_id = file[group_key].attrs["station_id"] + + # get software version info + self.station_version_id = file[group_key].attrs["station_version_id"] + self.writer_version_id = file[group_key].attrs["writer_version_id"] # convert string timestamp to datetime object self.timestamp = datetime.datetime.fromisoformat(file[group_key].attrs["timestamp"]) diff --git a/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION b/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION new file mode 100644 index 0000000000000000000000000000000000000000..49d59571fbf6e077eece30f8c418b6aad15e20b0 --- /dev/null +++ b/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION @@ -0,0 +1 @@ +0.1 diff --git a/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py b/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py index 4ac9dd9d451ae77a93b0f5f0d848d4de138cfd8c..a22c909fd5ec461e449094003297c1adbda9e451 100644 --- a/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py +++ b/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py @@ -10,6 +10,7 @@ from abc import ABC, abstractmethod from datetime import datetime, timedelta import logging +import os # python hdf5 import h5py @@ -33,6 +34,19 @@ __all__ = [ "SstHdf5Writer", "BstHdf5Writer", ] +def _get_lsc_version() -> str: + """ Retrieve the Lofar Station Control software version """ + filepath = os.path.join(os.path.realpath('../'), 'tangostationcontrol/VERSION') + with open(filepath) as f: + version = f.readline().strip() + return version or "" + +def _get_writer_version() -> str: + """ Retrieve the Statistics Writer software version """ + filepath = os.path.join(os.path.dirname(__file__), 'VERSION') + with open(filepath) as f: + version = f.readline().strip() + return version or "" class HDF5Writer(ABC): SST_MODE = "SST" @@ -67,6 +81,10 @@ class HDF5Writer(ABC): # writer is in (SST,XST,BST) self.mode = statistics_mode.upper() + # software version + self.station_version_id = _get_lsc_version() + self.writer_version_id = _get_writer_version() + # Set device if any, defaults to None self.device = device @@ -207,6 +225,10 @@ class HDF5Writer(ABC): timespec="milliseconds" ) + # store software version entries + header["station_version_id"] = self.station_version_id + header["writer_version_id"] = self.writer_version_id + # Stores the header of the packet received for this matrix as a list of # attributes for k, v in header.items():