from typing import List, Optional
from pydantic import Field
from ska_tmc_cdm.messages.base import CdmObject
from ska_tmc_cdm.messages.skydirection import SkyDirection
__all__ = [
"PSTScanConfiguration",
"PSTBeamConfiguration",
"PSTConfiguration",
"ChannelPolarisationSelection",
"RescaleConfiguration",
"RequantisationConfiguration",
"FlowThroughScanConfiguration",
"DetectedFilterBankScanConfiguration",
"PulsarTimingScanConfiguration",
"SpectralKurtosisConfiguration",
]
[docs]
class ChannelPolarisationSelection(CdmObject):
"""
Class to hold channel polarization selection configuration.
:param channels: channels
:param polarisations: polarisations
"""
channels: List[int] = Field(default_factory=list)
polarisations: str = Field(default_factory=str)
[docs]
class RescaleConfiguration(CdmObject):
"""
Class to hold rescale configuration.
:param algorithm: algorithm
:param periodic_update: periodic_update
:param timescale: timescale
"""
algorithm: str = Field(default_factory=str)
periodic_update: bool = Field(default_factory=bool)
timescale: float = Field(default_factory=float)
[docs]
class RequantisationConfiguration(CdmObject):
"""
Class to hold requantisation configuration.
:param num_bits_out: num_bits_out
:param scale: scale
"""
num_bits_out: int = Field(default_factory=int)
scale: float = Field(default_factory=float)
[docs]
class FlowThroughScanConfiguration(CdmObject):
"""
Class to hold PST Scan configuration for FLOW_THROUGH
processing mode for PST.
:param channel_polarisation_selection: channel_polarisation_selection
:param rescale: rescale
:param requantisation: requantisation
"""
channel_polarisation_selection: ChannelPolarisationSelection = Field(
default_factory=ChannelPolarisationSelection
)
rescale: RescaleConfiguration = Field(default_factory=RescaleConfiguration)
requantisation: RequantisationConfiguration = Field(
default_factory=RequantisationConfiguration
)
[docs]
class SpectralKurtosisConfiguration(CdmObject):
"""
Class to hold spectral kurtosis configuration for Pulsar Timing
scan configuration.
:param sk_range: sk_range
:param sk_integration_limit: sk_integration_limit
:param sk_excision_limit: sk_excision_limit
"""
sk_range: list = Field(default_factory=list)
sk_integration_limit: int = Field(ge=64, le=1024)
sk_excision_limit: float = Field(ge=1.0, le=100.0)
[docs]
class DetectedFilterBankScanConfiguration(CdmObject):
"""
Class to hold PST Scan configuration for DETECTED_FILTERBANK
processing mode for PST.
:param dispersion_measure: The DM for coherent/incoherent de-dispersion in pc/cm^3
:param rotation_measure: The RM for phase-coherent Faraday rotation correction in rad/m^2
:param output_frequency_channels: Number of output frequency channels. The default of -1 means no re-channelisation
:param stokes_parameters: The Stokes parameters to output when in Detected Filterbank mode.
:param num_bits_out: Number of bits per output sample
:param time_decimation_factor: The number of input samples per output time sample
:param frequency_decimation_factor: The number of input frequency channels incoherently added to each output frequency channel
:param sk_config: List of SK config parameters
:param requantisation_scale: Scale factor to govern the dynamic range for fixed precision output during re-quantisation
:param requantisation_length: Number of samples to average together when determining the scale factors
:param num_sk_config: Number of sk_configs
"""
dispersion_measure: float = Field(ge=0.0, le=100000.0)
rotation_measure: Optional[float] = None
output_frequency_channels: int
stokes_parameters: str
num_bits_out: int
time_decimation_factor: int
frequency_decimation_factor: int
sk_config: list[SpectralKurtosisConfiguration] = Field(
default_factory=list,
)
requantisation_scale: Optional[float] = None
requantisation_length: Optional[float] = None
num_sk_config: Optional[int] = None
[docs]
class PulsarTimingScanConfiguration(CdmObject):
"""
Class to hold PST Scan configuration for PULSAR_TIMING
processing mode for PST.
:param dispersion_measure: The DM for coherent/incoherent de-dispersion in pc/cm^3
:param rotation_measure: The RM for phase-coherent Faraday rotation correction in rad/m^2
:param ephemeris: The ephemeris of the pulsar being observed
:param pulsar_phase_predictor: Pulsar phase predictor generated from ephemeris
:param output_frequency_channels: Number of output frequency channels. The default of -1 means 'all channels'
:param output_phase_bins: Number of output phase bins
:param sk_config: List of SK config parameters
:param target_snr: The SNR of the on-pulse flux. Can end a scan early and 0 means no limit
:param num_sk_config: Number of sk_configs
"""
dispersion_measure: float = Field(ge=0.0, le=100000.0)
rotation_measure: Optional[float] = None
ephemeris: str
pulsar_phase_predictor: str
output_frequency_channels: int
output_phase_bins: int = Field(ge=64, le=2048)
sk_config: list[SpectralKurtosisConfiguration] = Field(
default_factory=list
)
target_snr: float = Field(ge=0.0)
num_sk_config: Optional[int] = None
[docs]
class PSTScanConfiguration(CdmObject):
"""
Class to hold Scan configuration items
:param centre_frequency: Centre frequency
:param total_bandwidth: Total bandwidth
:param observer_id: Observer ID
:param project_id: Project ID
:param delay_centre: ITRF coordinates
:param receiver_id: Receiver ID
:param max_scan_length: Maximum scan length
:param subint_duration: Sub-integration duration
:param receptors: List of receptors
:param receptor_weights: List of receptor weights
:param pst_processing_mode: PST processing mode
:param target: Target sky direction
:param ft: FLOW_THROUGH mode configuration
:param df: DETECTED_FILTERBANK mode configuration
:param pt: PULSAR_TIMING mode configuration
"""
centre_frequency: float = 0.0
total_bandwidth: float = 0.0
observer_id: str
project_id: str
delay_centre: List[float] = Field(default_factory=list)
receiver_id: str
max_scan_length: float = Field(default=0.0)
subint_duration: float = Field(default=10.0)
receptors: List[str]
receptor_weights: List[float]
pst_processing_mode: str
target: SkyDirection
ft: Optional[FlowThroughScanConfiguration] = None
df: Optional[DetectedFilterBankScanConfiguration] = None
pt: Optional[PulsarTimingScanConfiguration] = None
[docs]
class PSTBeamConfiguration(CdmObject):
"""
Class to hold PST beam configuration items
:param beam_id: Beam ID
:param scan: Scan configuration
"""
beam_id: Optional[int] = None
scan: Optional[PSTScanConfiguration] = None
[docs]
class PSTConfiguration(CdmObject):
"""
Class to hold PST configuration items
:param beams: List of beam configurations
"""
beams: List[PSTBeamConfiguration] = Field(default_factory=list)