Source code for ska_pst.lmc.receive.receive_model

# -*- coding: utf-8 -*-
#
# This file is part of the SKA PST project.
#
# Distributed under the terms of the BSD 3-clause new license.
# See LICENSE for more info.
"""Module for providing common model classes within the RECV.MGMT component."""

from __future__ import annotations

from dataclasses import dataclass

from ska_pst.lmc.component.monitor_data_handler import MonitorDataStore


[docs]@dataclass class ReceiveData: """ A data class to represent RECV monitoring across all subbands. This class is used to model the combined subband data RECV subcomponent. """ data_received: int = 0 """The amount of data received during current scan, in bytes.""" data_receive_rate: float = 0.0 """The rate of data received during current scan, in Gb/s.""" data_dropped: int = 0 """The amount of data dropped during current scan, in bytes.""" data_drop_rate: float = 0.0 """The rate of data dropped during current scan, in bytes/s.""" misordered_packets: int = 0 """The number of misordered packets received during current scan.""" misordered_packet_rate: float = 0.0 """The current rate of misordered packets, in packets/s.""" malformed_packets: int = 0 """The total number of malformed packets received during current scan.""" malformed_packet_rate: float = 0.0 """The current rate of malformed packets, in packets/s.""" misdirected_packets: int = 0 """ The total of misdirected packets for current scan. These are valid packets but not for the current beam, subband, and/or scan. """ misdirected_packet_rate: float = 0.0 """The current rate of misdirected packets, in packets/s.""" checksum_failure_packets: int = 0 """The total number of network interface with either a UDP, IP header or CRC checksum failure.""" checksum_failure_packet_rate: float = 0.0 """The current rate of packets with a checksum failure, in packets/s.""" timestamp_sync_error_packets: int = 0 """The total number of packets received where the timestamp has become desynchronised with the packet sequence number * sampling interval.""" timestamp_sync_error_packet_rate: float = 0.0 """The current rate of packets with timestamp sync error, in packets/s.""" seq_number_sync_error_packets: int = 0 """The total number of packets received where the packet sequence number has become desynchronised with the data rate and elapsed time.""" seq_number_sync_error_packet_rate: float = 0.0 """The current rate of packets with a sequence number sync error, in packets/s.""" invalid_polarisation_correction_packets: int = 0 """The number of packets received where no valid Jones polarisation corrections have been applied.""" invalid_polarisation_correction_packet_rate: float = 0.0 """The current rate of packets with a sequence number sync error, in packets/s.""" invalid_station_beam_packets: int = 0 """The number of packets received where no valid station beam delay polynomials have been applied.""" invalid_station_beam_packet_rate: float = 0.0 """The number of packets received per second where no valid Jones polarisation corrections have been applied, in packets/s.""" invalid_pst_beam_packets: int = 0 """The number of packets received where no valid PST beam delay polynomials have been applied.""" invalid_pst_beam_packet_rate: float = 0.0 """The number of packets received per second where no valid PST beam delay polynomials have been applied, in packets/s.""" percentage_data_received: float = 0.0 """The current amount of CBF data received as a percentage of the total CBF data expected.""" percentage_valid_station_beam: float = 0.0 """The percentage of CBF data received that has validity flag set for station beam delay polynomials.""" percentage_valid_pst_beam: float = 0.0 """The percentage of CBF data received that has validity flag set for pst beam delay polynomials.""" percentage_valid_polarisation_correction: float = 0.0 """The percentage of CBF data received that has validity flag set for Jones polarisation corrections."""
class ReceiveDataStore(MonitorDataStore[ReceiveData, ReceiveData]): """Data store used to aggregate the subband monitoring data for Receive.""" @property def monitor_data(self: ReceiveDataStore) -> ReceiveData: """ Return the current calculated monitoring data. This aggregates all the individual subband data values into one :py:class:`ReceiveData` instance. :returns: current monitoring data. """ number_subbands: int = len(self._subband_data) if number_subbands == 0: return ReceiveData() monitor_data = ReceiveData() for subband_monitor_data in self._subband_data.values(): monitor_data.data_received += subband_monitor_data.data_received monitor_data.data_receive_rate += subband_monitor_data.data_receive_rate monitor_data.data_dropped += subband_monitor_data.data_dropped monitor_data.data_drop_rate += subband_monitor_data.data_drop_rate monitor_data.misordered_packets += subband_monitor_data.misordered_packets monitor_data.misordered_packet_rate += subband_monitor_data.misordered_packet_rate monitor_data.malformed_packets += subband_monitor_data.malformed_packets monitor_data.malformed_packet_rate += subband_monitor_data.malformed_packet_rate monitor_data.misdirected_packets += subband_monitor_data.misdirected_packets monitor_data.misdirected_packet_rate += subband_monitor_data.misdirected_packet_rate monitor_data.invalid_polarisation_correction_packets += ( subband_monitor_data.invalid_polarisation_correction_packets ) monitor_data.invalid_polarisation_correction_packet_rate += ( subband_monitor_data.invalid_polarisation_correction_packet_rate ) monitor_data.invalid_station_beam_packets += subband_monitor_data.invalid_station_beam_packets monitor_data.invalid_station_beam_packet_rate += ( subband_monitor_data.invalid_station_beam_packet_rate ) monitor_data.invalid_pst_beam_packets += subband_monitor_data.invalid_pst_beam_packets monitor_data.invalid_pst_beam_packet_rate += subband_monitor_data.invalid_pst_beam_packet_rate monitor_data.percentage_data_received += subband_monitor_data.percentage_data_received monitor_data.percentage_valid_station_beam += subband_monitor_data.percentage_valid_station_beam monitor_data.percentage_valid_pst_beam += subband_monitor_data.percentage_valid_pst_beam monitor_data.percentage_valid_polarisation_correction += ( subband_monitor_data.percentage_valid_polarisation_correction ) # assume that sub-bands contain a roughly equal workload monitor_data.percentage_data_received /= number_subbands monitor_data.percentage_valid_station_beam /= number_subbands monitor_data.percentage_valid_pst_beam /= number_subbands monitor_data.percentage_valid_polarisation_correction /= number_subbands return monitor_data