karabo.simulation package
Subpackages
- karabo.simulation.signal package
- Submodules
- karabo.simulation.signal.base_segmentation module
- karabo.simulation.signal.base_signal module
- karabo.simulation.signal.eor_profile module
- karabo.simulation.signal.galactic_foreground module
- karabo.simulation.signal.helpers module
- karabo.simulation.signal.plotting module
- karabo.simulation.signal.seg_u_net_segmentation module
- karabo.simulation.signal.signal_21_cm module
- karabo.simulation.signal.superimpose module
- karabo.simulation.signal.superpixel_segmentation module
- karabo.simulation.signal.synchroton_signal module
- karabo.simulation.signal.typing module
- Module contents
Submodules
karabo.simulation.beam module
- class BeamPattern(cst_file_path: str, telescope: Telescope | None = None, freq_hz: float = 0.0, pol: Literal['x', 'Y', 'XY'] = 'XY', element_type_index: int = 0, average_fractional_error_factor_increase: float = 1.1, ignore_data_at_pole: bool = True, avg_frac_error: float = 0.8, beam_method: Literal['Gaussian Beam', 'EIDOS_AH', 'EIDOS_EM', 'KatBeam'] = 'Gaussian Beam', interpol: Literal['inter2d', 'RectBivariateSpline'] = 'RectBivariateSpline')
Bases:
object
:param
- static cart2pol(x: ndarray[Any, dtype[float64]], y: ndarray[Any, dtype[float64]]) Tuple[ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]]]
- static eidos_lineplot(B_ah: ndarray[Any, dtype[complex128]], B_em: ndarray[Any, dtype[complex128]], npix: int, path: str | None = None) None
- fit_elements(telescope: Telescope | None = None, freq_hz: float | None = None, pol: Literal['x', 'Y', 'XY'] | None = None, element_type_index: int | None = None, average_fractional_error_factor_increase: float | None = None, ignore_data_at_pole: bool | None = None, avg_frac_error: float | None = None) None
- static get_eidos_holographic_beam(npix: int, ch: int, dia: int, thres: int, mode: Literal['AH', 'EM'] = 'AH') ndarray[Any, dtype[complex128]]
Returns beam
- static get_meerkat_uhfbeam(f: int | float, pol: Literal['H', 'V', 'I'], beamextentx: int | float, beamextenty: int | float, sampling_step: int = 80) Tuple[ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]]]
- Parameters:
pol
beamextent
- Returns:
- static get_scaled_theta_phi(theta: ndarray[Any, dtype[float64]], phi: ndarray[Any, dtype[float64]], theta_em: ndarray[Any, dtype[float64]], phi_em: ndarray[Any, dtype[float64]], beam0: ndarray[Any, dtype[complex128]]) ndarray[Any, dtype[float64]]
- integrate(theta: Quantity | ndarray[Any, dtype[int64 | float64]], phi: Quantity | ndarray[Any, dtype[int64 | float64]], integrand: ndarray[Any, dtype[float64]]) float64
- make_cst_from_arr(arr: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], output_file_path: str) None
Takes array of dimensions (*,8), and returns a cst files :param arr: :return: cst file with given output filename
- plot_beam(theta: ndarray[Any, dtype[float64]], phi: ndarray[Any, dtype[float64]], absdir: ndarray[Any, dtype[float64]], path: str | None = None) None
- Parameters:
theta – in radians
phi – in radian
absdir – in DBs
- Returns:
polar plot
- plot_eidos_beam(path: str | None) None
- static pol2cart(rho: ndarray[Any, dtype[float64]], phi: ndarray[Any, dtype[float64]]) Tuple[ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]]]
- quad_crosspol(theta: Quantity | ndarray[Any, dtype[int64 | float64]], phi: Quantity | ndarray[Any, dtype[int64 | float64]], vcopol: ndarray[Any, dtype[float64]], voltage: bool = False, rel_power_dB: int = -40) ndarray[Any, dtype[float64]]
- save_meerkat_cst_file(cstdata: ndarray[Any, dtype[float64]]) None
Save CST file for MeerKat telescope for the custom beams
- static show_eidos_beam(B_ah: ndarray[Any, dtype[complex128]], path: str | None = None) None
- static show_kat_beam(beampixels: ndarray[Any, dtype[float64]], beamextent: int, freq: int, pol: str, path: str | None = None) None
- Parameters:
beamextent
freq
pol
- Returns:
- sim_beam(beam_method: Literal['Gaussian Beam', 'EIDOS_AH', 'EIDOS_EM', 'KatBeam'] | None = None, f: float | None = None, fov: int | float = 30.0, interpol: Literal['inter2d', 'RectBivariateSpline'] | None = None) Tuple[List[Quantity], ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]]]
Simulates the primary beam
- Parameters:
beam_method – you can choose as beams: “Gaussian Beam”, “Eidos_AH”, “Eidos_EM”, “KatBeam”
f – the frequency for which the beam is simulated (MHz)
fov – when using “KatBeam” the beam will be simulated for this size of fov (radius)
- sym_gaussian(theta: Quantity | ndarray[Any, dtype[int64 | float64]], phi: Quantity | ndarray[Any, dtype[int64 | float64]], freq: Quantity | ndarray[Any, dtype[int64 | float64]], diameter: Quantity | ndarray[Any, dtype[int64 | float64]], fwhm_fac: int = 1, voltage: bool = False, power_norm: int = 1) ndarray[Any, dtype[float64]]
karabo.simulation.coordinate_helper module
- east_north_to_long_lat(east_relative: float, north_relative: float, long: float, lat: float) Tuple[float, float]
Calculate the longitude and latitude of an east-north coordinate based on some reference location.
- Parameters:
east_relative – east coordinate in meters
north_relative – north coordinate in meters
long – reference location longitude
lat – reference location latitude
- Returns:
Tuple of calculated longitude and latitude of passed east-north coordinate
- wgs84_to_cartesian(lon: float | ndarray[Any, dtype[float64]], lat: float | ndarray[Any, dtype[float64]], alt: float | ndarray[Any, dtype[float64]], radius: int = 6371000) ndarray[Any, dtype[float64]]
Transforms WGS84 to cartesian in meters.
- Args:
lon: Longitude [deg]. lat: Latitude [deg]. alt: Altitude [m]. radius: Radius of earth in m.
- Returns:
Cartesian x,y,z coordinates (nx3) in meters.
karabo.simulation.east_north_coordinate module
- class EastNorthCoordinate(x: float, y: float, z: float = 0, x_error: float = 0, y_error: float = 0, z_error: float = 0)
Bases:
object
Class defining an east-north-(up) coordinate.
- Variables:
x – east coordinate in meters
y – north coordinate in meters
z – up coordinate in meters
x_error – east coordinate error in meters
y_error – north coordinate error in meters
z_error – up coordinate error in meters
karabo.simulation.interferometer module
- class CorrelationType(value)
Bases:
Enum
Enum for selecting between the different Correlation Types for the Simulator.
- Auto_Correlations = 'Auto-correlations'
- Both = 'Both'
- Cross_Correlations = 'Cross-correlations'
- class FilterUnits(value)
Bases:
Enum
Enum for selecting between the different Filter Units for the Simulator.
- Metres = 'Metres'
- WaveLengths = 'Wavelengths'
- class InterferometerSimulation(channel_bandwidth_hz: int | float = 0, time_average_sec: int | float = 0, max_time_per_samples: int = 8, correlation_type: CorrelationType = CorrelationType.Cross_Correlations, uv_filter_min: int | float = 0, uv_filter_max: int | float = inf, uv_filter_units: FilterUnits = FilterUnits.WaveLengths, force_polarised_ms: bool = False, ignore_w_components: bool = False, noise_enable: bool = False, noise_seed: str | int = 'time', noise_start_freq: int | float = 1000000000.0, noise_inc_freq: int | float = 100000000.0, noise_number_freq: int = 24, noise_rms_start: int | float = 0, noise_rms_end: int | float = 0, noise_rms: Literal['Range', 'Data file', 'Telescope model'] = 'Range', noise_freq: Literal['Range', 'Data file', 'Observation settings', 'Telescope model'] = 'Range', enable_array_beam: bool = False, enable_numerical_beam: bool = False, beam_polX: BeamPattern | None = None, beam_polY: BeamPattern | None = None, use_gpus: bool | None = None, use_dask: bool | None = None, split_observation_by_channels: bool = False, n_split_channels: int | str = 'each', client: Client | None = None, precision: Literal['single', 'double'] = 'single', station_type: Literal['Aperture array', 'Isotropic beam', 'Gaussian beam', 'VLA (PBCOR)'] = 'Isotropic beam', enable_power_pattern: bool = False, gauss_beam_fwhm_deg: int | float = 0.0, gauss_ref_freq_hz: int | float = 0.0, ionosphere_fits_path: str | None = None, ionosphere_screen_type: str | None = None, ionosphere_screen_height_km: float | None = 300, ionosphere_screen_pixel_size_m: float | None = 0, ionosphere_isoplanatic_screen: bool | None = False)
Bases:
object
Class containing all configuration for the Interferometer Simulation. :ivar channel_bandwidth_hz: The channel width, in Hz, used to simulate bandwidth
smearing. (Note that this can be different to the frequency increment if channels do not cover a contiguous frequency range.)
- Variables:
time_average_sec – The correlator time-average duration, in seconds, used to simulate time averaging smearing.
max_time_per_samples – The maximum number of time samples held in memory before being written to disk.
correlation_type – The type of correlations to produce. Any value of Enum CorrelationType
uv_filter_min – The minimum value of the baseline UV length allowed by the filter. Values outside this range are not evaluated
uv_filter_max – The maximum value of the baseline UV length allowed by the filter. Values outside this range are not evaluated.
uv_filter_units – The units of the baseline UV length filter values. Any value of Enum FilterUnits
force_polarised_ms – If True, always write the Measurement Set in polarised format even if the simulation was run in the single polarisation ‘Scalar’ (or Stokes-I) mode. If False, the size of the polarisation dimension in the Measurement Set will be determined by the simulation mode.
ignore_w_components – If enabled, baseline W-coordinate component values will be set to 0. This will disable W-smearing. Use only if you know what you’re doing!
noise_enable – If true, noise is added.
noise_seed – Random number generator seed.
noise_start_freq – The start frequency in Hz for which noise is included, if noise is set to true.
noise_inc_freq – The frequency increment in Hz, if noise is set to true.
noise_number_freq – The number of frequency taken into account, if noise is set to true.
noise_rms_start – Station RMS (noise) flux density range start value, in Jy. The range is expanded linearly over the number of frequencies for which noise is defined.
noise_rms_end – Station RMS (noise) flux density range end value, in Jy. The range is expanded linearly over the number of frequencies for which noise is defined.
noise_rms –
- The specifications for the RMS noise value:
- Telescope model: values are loaded from files in the telescope
model directory.
Data file: values are loaded from the specified file. Range: values are evaluated according to the specified range
parameters (Default).
The noise values are specified in Jy and represent the RMS noise of an unpolarised source in terms of flux measured in a single polarisation of the detector.
noise_freq –
The list of frequencies for which noise values are defined: Telescope model: frequencies are loaded from a data file in
the telescope model directory.
- Observation settings: frequencies are defined by the observation
settings.
Data file: frequencies are loaded from the specified data file. Range: frequencies are specified by the range parameters
(Default).
enable_array_beam – If true, then the contribution to the station beam from the array pattern (given by beam-forming the antennas in the station) is evaluated.
enable_numerical_beam – If true, make use of any available numerical element pattern files. If numerical pattern data are missing, the functional type will be used instead.
beam_polX – currently only considered for ObservationLong
beam_polX – currently only considered for ObservationLong
use_gpus – Set to true if you want to use gpus for the simulation
client – The dask client to use for the simulation
split_idxs_per_group – The indices of the sky model to split for each group of workers. If None, the sky model will not be split. Useful if the sky model is too large to fit into the memory of a single worker. Group index should be strictly monotonic increasing.
precision – For the arithmetic use you can choose between “single” or “double” precision
station_type – Here you can choose the type of each station in the interferometer. You can either disable all station beam effects by choosing “Isotropic beam”. Or select one of the following beam types: “Gaussian beam”, “Aperture array” or “VLA (PBCOR)”
enable_power_pattern – If true, gauss_beam_fwhm_deg will be taken in as power pattern.
gauss_beam_fwhm_deg – If you choose “Gaussian beam” as station type you need specify the full-width half maximum value at the reference frequency of the Gaussian beam here. Units = degrees. If enable_power_pattern is True, gauss_beam_fwhm_deg is in power pattern, otherwise it is in field pattern.
gauss_ref_freq_hz – The reference frequency of the specified FWHM, in Hz.
ionosphere_fits_path – The path to a fits file containing an ionospheric screen generated with ARatmospy. The file parameters (times/frequencies) should coincide with the planned observation.
- run_simulation(telescope: Telescope, sky: SkyModel, observation: Observation | ObservationLong, backend: Literal[SimulatorBackend.OSKAR] = SimulatorBackend.OSKAR, primary_beam: None = None, visibility_format: Literal['MS', 'OSKAR_VIS'] = 'MS', visibility_path: Path | str | None = None) Visibility
- run_simulation(telescope: Telescope, sky: SkyModel, observation: ObservationParallelized, backend: Literal[SimulatorBackend.OSKAR] = SimulatorBackend.OSKAR, primary_beam: None = None, visibility_format: Literal['MS', 'OSKAR_VIS'] = 'MS', visibility_path: Path | str | None = None) List[Visibility]
- run_simulation(telescope: Telescope, sky: SkyModel, observation: Observation, backend: Literal[SimulatorBackend.RASCIL], primary_beam: Image | None, visibility_format: Literal['MS'] = 'MS', visibility_path: Path | str | None = None) Visibility
Run an interferometer simulation, generating simulated visibility data.
- Args:
telescope: Telescope model defining the configuration sky: sky model defining the sky sources observation: observation settings backend: Simulation backend to be used primary_beam: Primary beam to be included into visibilities.
Currently only relevant for RASCIL. For OSKAR, use the InterferometerSimulation constructor parameters instead.
- visibility_format: Visibility format in which to write generated data to
disk
- visibility_path: Path for the visibility output file (OSKAR_VIS)
or directory (MS). If an observation of type ObservationParallelized is passed, this path will be interpreted as the root directory where the visibility files / dirs will be written to. If None, visibilities will be written to short term cache directory.
- Returns:
- Visibility object of the generated data or list of Visibility objects
for ObservationParallelized observations.
- set_ionosphere(file_path: str) None
Set the path to an ionosphere screen file generated with ARatmospy. The file parameters (times/frequencies) should coincide with the planned observation. see https://github.com/timcornwell/ARatmospy
- Parameters:
file_path – file path to fits file.
- simulate_foreground_vis(telescope: Telescope, foreground: SkyModel, foreground_observation: Observation, foreground_vis_file: str) Tuple[Visibility, List[ndarray[Any, dtype[complex128]]], VisHeader, Binary, VisBlock, ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]]]
Simulates foreground sources
- yes_double_precision() bool
karabo.simulation.line_emission module
- class CircleSkyRegion(center, radius)
Bases:
tuple
- center
Alias for field number 0
- radius
Alias for field number 1
- gaussian_beam_fwhm_for_frequency(desired_frequency: float, reference_fwhm_degrees: float = 1.8, reference_frequency_Hz: float = 800000000.0) float
- generate_gaussian_beam_data(fwhm_pixels: float, x_size: int, y_size: int) ndarray[Any, dtype[float64]]
Given a FWHM in pixel units, and a size in x and y coordinates, return a 2D array of shape (x_size, y_size) containing normalized Gaussian values (such that the central value of the 2D array is 1.0).
- line_emission_pipeline(output_base_directory: Path | str, pointings: List[CircleSkyRegion], sky_model: SkyModel, observation_details: Observation, telescope: Telescope, interferometer: InterferometerSimulation, simulator_backend: SimulatorBackend, dirty_imager_config: DirtyImagerConfig, primary_beams: List[ndarray[Any, dtype[float64]]], should_perform_primary_beam_correction: Literal[True] = False) Tuple[List[List[Visibility]], List[List[Image]]]
- line_emission_pipeline(output_base_directory: Path | str, pointings: List[CircleSkyRegion], sky_model: SkyModel, observation_details: Observation, telescope: Telescope, interferometer: InterferometerSimulation, simulator_backend: SimulatorBackend, dirty_imager_config: DirtyImagerConfig, primary_beams: List[ndarray[Any, dtype[float64]]] | None = None, should_perform_primary_beam_correction: Literal[False] = False) Tuple[List[List[Visibility]], List[List[Image]]]
- line_emission_pipeline(output_base_directory: Path | str, pointings: List[CircleSkyRegion], sky_model: SkyModel, observation_details: Observation, telescope: Telescope, interferometer: InterferometerSimulation, simulator_backend: SimulatorBackend, dirty_imager_config: DirtyImagerConfig, primary_beams: List[ndarray[Any, dtype[float64]]] | None = None, should_perform_primary_beam_correction: bool = False) Tuple[List[List[Visibility]], List[List[Image]]]
Perform a line emission simulation, to compute visibilities and dirty images. A line emission simulation involves assuming every source in the input SkyModel only emits within one frequency channel.
If requested, include primary beam effects into the visibilities and dirty images. And again, if desired, perform a primary beam correction on the final dirty images.
- For OSKAR, the provided primary beams will only be used for correction.
For the actual primary beam effect in OSKAR, set the relevant parameter in the InterferometerSimulation constructor.
- For RASCIL, the provided primary beams are used
for both the primary beam effect and its correction.
karabo.simulation.line_emission_helpers module
- convert_frequency_to_z(freq: _T) _T
Turn given frequency (Hz) into corresponding redshift for 21cm emission.
- Parameters:
freq – Frequency values to be converted into redshifts.
- Returns:
Redshifts corresponding to input frequencies.
- convert_z_to_frequency(z: _T) _T
Turn given redshift into corresponding frequency (Hz) for 21cm emission.
- Parameters:
z – Redshift values to be converted into frequencies.
- Returns:
Frequencies corresponding to input redshifts.
- freq_channels(z_obs: _T, channel_num: int = 10, equally_spaced_freq: bool = True) Tuple[ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]], float64]
Calculates the frequency channels from the redshifts. :param z_obs: Observed redshifts from the HI sources. :param channel_num: Number of channels. :param equally_spaced_freq: If True (default), create channels
equally spaced in frequency. If False, create channels equally spaced in redshift.
- Returns:
Redshift channels array, frequency channels array (in Hz), array of bin widths of frequency channel (in Hz), for convenience, and middle frequency (in Hz)
karabo.simulation.observation module
- class Observation(*, mode: str = 'Tracking', start_frequency_hz: int | float = 0, start_date_and_time: datetime | str, length: timedelta = datetime.timedelta(seconds=14400), number_of_channels: int = 1, frequency_increment_hz: int | float = 0, phase_centre_ra_deg: int | float = 0, phase_centre_dec_deg: int | float = 0, number_of_time_steps: int = 1)
Bases:
ObservationAbstract
- class ObservationAbstract(*, mode: str = 'Tracking', start_frequency_hz: int | float = 0, start_date_and_time: datetime | str, length: timedelta = datetime.timedelta(seconds=14400), number_of_channels: int = 1, frequency_increment_hz: int | float = 0, phase_centre_ra_deg: int | float = 0, phase_centre_dec_deg: int | float = 0, number_of_time_steps: int = 1)
Bases:
ABC
Abstract base class for observations
Holds all important information about an observation.
- compute_hour_angles_of_observation() ndarray[Any, dtype[float64]]
Given a total observation length and an integration time interval, determine the corresponding hour angles of observation. This utility function is used during simulations using the RASCIL backend. Approach based on https://gitlab.com/ska-sdp-china/rascil/-/blob/9002d853b64465238177b37e941c7445fed50d35/examples/performance/mid_write_ms.py#L32-40 # noqa: E501
- static create_observations_oskar_from_lists(settings_tree: Dict[str, Dict[str, Any]], central_frequencies_hz: int | float | List[int | float], channel_bandwidths_hz: int | float | List[int | float], n_channels: int | List[int]) List[Dict[str, Dict[str, Any]]]
Create observations for OSKAR settings from input lists. If there is a mix of different lengths of lists or single values, the missing information is repeated to match the longest list.
Parameters
- settings_treeOskarSettingsTreeType
The OSKAR settings tree, with ‘observation’ key among others.
- central_frequencies_hzint or list of int
List of central frequencies in MHz for each observation.
- channel_bandwidths_hzint or list of int
List of channel bandwidths in MHz for each observation.
- n_channelsint or list of int
List of numbers of channels for each observation.
Returns
- list of dict
List of OSKAR observations, each as a dictionary with ‘observation’ key among others.
Raises
- ValueError
If the input lists are not of the same length.
Notes
The ‘observation’ key in each dictionary in the returned list has a value which is itself a dictionary, with keys ‘start_frequency_hz’, ‘num_channels’, and ‘frequency_inc_hz’.
- get_OSKAR_settings_tree() Dict[str, Dict[str, Any]]
Get the settings of this observation as an oskar setting tree. This function returns a python dictionary formatted according to the OSKAR documentation. <https://fdulwich.github.io/oskarpy-doc/settings_tree.html>.
- Returns:
Dictionary containing the full configuration
in the OSKAR Settings Tree format.
- get_phase_centre() List[float]
- set_length_of_observation(hours: int | float, minutes: int | float, seconds: int | float, milliseconds: int | float) None
Set a new length for the observation. Overriding the observation length set in the constructor.
- Parameters:
hours – hours
minutes – minutes
seconds – seconds
milliseconds – milliseconds
- class ObservationLong(*, mode: str = 'Tracking', start_frequency_hz: int | float = 0, start_date_and_time: datetime | str, length: timedelta = datetime.timedelta(seconds=14400), number_of_channels: int = 1, frequency_increment_hz: int | float = 0, phase_centre_ra_deg: int | float = 0, phase_centre_dec_deg: int | float = 0, number_of_time_steps: int = 1, number_of_days: int = 2)
Bases:
ObservationAbstract
This class allows the use of several observations on different days over a certain period of time within one day. If only ONE observation is desired, even if it takes a little longer, this is already possible using Observation. This class extends Observation so its parameters (except length) are not discussed here. length is little different, which describes the duration of ONE observation, whose maximum duration for ObservationLong is 24h.
- Variables:
number_of_days – Number of successive days to observe
- class ObservationParallelized(*, mode: str = 'Tracking', center_frequencies_hz: int | float | List[int | float] = 100000000.0, start_date_and_time: datetime | str, length: timedelta = datetime.timedelta(seconds=14400), n_channels: int | List[int] = [0, 1, 2, 3, 4, 5], channel_bandwidths_hz: int | float | List[int | float] = [1], phase_centre_ra_deg: int | float = 0, phase_centre_dec_deg: int | float = 0, number_of_time_steps: int = 1)
Bases:
ObservationAbstract
This class allows the use of several observations on different days over a certain period of time within one day. If only ONE observation is desired, even if it takes a little longer, this is already possible using Observation. This class extends Observation so its parameters (except length) are not discussed here. length is little different, which describes the duration of ONE observation, whose maximum duration for ObservationLong is 24h.
- Variables:
number_of_days – Number of successive days to observe
karabo.simulation.sample_simulation module
- run_sample_simulation(*, simulator_backend: SimulatorBackend = SimulatorBackend.OSKAR, visibility_format: Literal['MS', 'OSKAR_VIS'] = 'MS', verbose: bool = False) Tuple[Visibility, List[int] | List[float], SkyModel, Telescope, Observation, InterferometerSimulation]
Creates example visibilities for use in tests, experiments and examples.
- Args:
simulator_backend: Backend to use for simulation visibility_format: Visibility format in which to write generated data to disk verbose: Enable / disable progress prints
- Returns:
- A tuple (visibility, phase_center, sky, telescope, observation,
interferometer_sim) with the generated visibility data and phase center, sky model, telescope, observation and interferometer configuration used to generate it.
karabo.simulation.sky_model module
- class Polarisation(value)
Bases:
Enum
An enumeration.
- STOKES_I = (0,)
- STOKES_Q = (1,)
- STOKES_U = (2,)
- STOKES_V = 3
- class SkyModel(sources: ~numpy.ndarray[~typing.Any, ~numpy.dtype[~numpy.float64]] | ~numpy.ndarray[~typing.Any, ~numpy.dtype[~numpy.object_]] | ~xarray.core.dataarray.DataArray | None = None, wcs: ~astropy.wcs.wcs.WCS | None = None, precision: ~typing.Type[~numpy.float64] = <class 'numpy.float64'>, h5_file_connection: ~h5py._hl.files.File | None = None)
Bases:
object
Class containing all information of the to be observed Sky.
- SkyModel.sources is a xarray.DataArray
( https://docs.xarray.dev/en/stable/generated/xarray.DataArray.html ).
- np.ndarray are also supported as input type for SkyModel.sources,
however, the values in SkyModel.sources are converted to xarray.DataArray.
SkyModel.compute method is used to load the data into memory as a numpy array. It should be called after all the filtering and other operations are completed and to avoid doing the same calculation multiple them when e.g. on a cluster.
- Variables:
sources –
List of all point sources in the sky as xarray.DataArray. The source_ids reside in SkyModel.source_ids if provided through xarray.sources.coords with an arbitrary string key as index or np.ndarray as idx SOURCES_COLS. A single point source is described using the following col-order:
[0] right ascension (deg)
[1] declination (deg)
[2] stokes I Flux (Jy)
[3] stokes Q Flux (Jy): defaults to 0
[4] stokes U Flux (Jy): defaults to 0
[5] stokes V Flux (Jy): defaults to 0
[6] reference_frequency (Hz): defaults to 0
[7] spectral index (N/A): defaults to 0
[8] rotation measure (rad / m^2): defaults to 0
[9] major axis FWHM (arcsec): defaults to 0
[10] minor axis FWHM (arcsec): defaults to 0
[11] position angle (deg): defaults to 0
[12] true redshift: defaults to 0
[13] observed redshift: defaults to 0
- [14] object-id: just for np.ndarray
it is removed in the xr.DataArray and exists then in xr.DataArray.coords as index.
wcs – World Coordinate System (WCS) object representing the coordinate transformation between pixel coordinates and celestial coordinates (e.g., right ascension and declination).
precision – The precision of numerical values used in the SkyModel. Has to be of type np.float_.
h5_file_connection – An open connection to an HDF5 (h5) file that can be used to store or retrieve data related to the SkyModel.
- COL_IDX: Dict[Literal['ra', 'dec', 'stokes_i', 'stokes_q', 'stokes_u', 'stokes_v', 'ref_freq', 'spectral_index', 'rm', 'major', 'minor', 'pa', 'true_redshift', 'observed_redshift', 'id'], int] = {'dec': 1, 'id': 14, 'major': 9, 'minor': 10, 'observed_redshift': 13, 'pa': 11, 'ra': 0, 'ref_freq': 6, 'rm': 8, 'spectral_index': 7, 'stokes_i': 2, 'stokes_q': 3, 'stokes_u': 4, 'stokes_v': 5, 'true_redshift': 12}
- COL_NAME: Dict[int, Literal['ra', 'dec', 'stokes_i', 'stokes_q', 'stokes_u', 'stokes_v', 'ref_freq', 'spectral_index', 'rm', 'major', 'minor', 'pa', 'true_redshift', 'observed_redshift', 'id']] = {0: 'ra', 1: 'dec', 2: 'stokes_i', 3: 'stokes_q', 4: 'stokes_u', 5: 'stokes_v', 6: 'ref_freq', 7: 'spectral_index', 8: 'rm', 9: 'major', 10: 'minor', 11: 'pa', 12: 'true_redshift', 13: 'observed_redshift', 14: 'id'}
- SOURCES_COLS = 14
- add_point_sources(sources: ndarray[Any, dtype[float64]] | ndarray[Any, dtype[object_]] | DataArray) None
Add new point sources to the sky model.
- Parameters:
sources – np.ndarray with shape (number of sources, 1 + SOURCES_COLS),
where you can place the “source_id” at index SOURCES_COLS. OR an xarray.DataArray with shape (number of sources, SOURCES_COLS), where you can place the “source_id” at xarray.DataArray.coord or use SkyModel.source_ids later.
The column indices correspond to:
[0] right ascension (deg)
[1] declination (deg)
[2] stokes I Flux (Jy)
[3] stokes Q Flux (Jy): defaults to 0
[4] stokes U Flux (Jy): defaults to 0
[5] stokes V Flux (Jy): defaults to 0
[6] reference_frequency (Hz): defaults to 0
[7] spectral index (N/A): defaults to 0
[8] rotation measure (rad / m^2): defaults to 0
[9] major axis FWHM (arcsec): defaults to 0
[10] minor axis FWHM (arcsec): defaults to 0
[11] position angle (deg): defaults to 0
[12] true redshift: defaults to 0
[13] observed redshift: defaults to 0
[14] source id (object): is in SkyModel.source_ids if provided
- close() None
Closes the connection to the HDF5 file.
This method closes the connection to the HDF5 file if it is open and sets the h5_file_connection attribute to None.
- compute() None
Loads the lazy data into a numpy array, wrapped in a xarray.DataArray.
This method loads the lazy data from the sources into a numpy array, which is then wrapped in a xarray.DataArray object. It performs the computation necessary to obtain the actual data and stores it in the _sources attribute. After the computation is complete, it calls the close method to close the connection to the HDF5 file.
Returns: None
- convert_to_backend(backend: Literal[SimulatorBackend.OSKAR] = SimulatorBackend.OSKAR, desired_frequencies_hz: Literal[None] = None, channel_bandwidth_hz: float | None = None, verbose: bool = False) SkyModel
- convert_to_backend(backend: Literal[SimulatorBackend.RASCIL], desired_frequencies_hz: ndarray[Any, dtype[float64]], channel_bandwidth_hz: float | None = None, verbose: bool = False) List[SkyComponent]
Convert an existing SkyModel instance into a format acceptable by a desired backend. backend: Determines how to return the SkyModel source catalog.
OSKAR: return the current SkyModel instance, since methods in Karabo support OSKAR-formatted source np.array values. RASCIL: convert the current source array into a list of RASCIL SkyComponent instances.
desired_frequencies_hz: List of frequencies corresponding to start of desired frequency channels. This field is required to convert sources into RASCIL SkyComponents.
The array contains starting frequencies for the desired channels. E.g. [100e6, 110e6] corresponds to 2 frequency channels, which start at 100 MHz and 110 MHz, both with a bandwidth of 10 MHz.
- channel_bandwidth_hz: Used if desired_frequencies_hz has only one element.
Otherwise, bandwidth is determined as the delta between the first two entries in desired_frequencies_hz.
verbose: Determines whether to display additional print statements.
- static copy_sky(sky: _TSkyModel) _TSkyModel
- explore_sky(phase_center: ~typing.List[int] | ~typing.List[float], stokes: ~typing.Literal['Stokes I', 'Stokes Q', 'Stokes U', 'Stokes V'] = 'Stokes I', idx_to_plot: ~numpy.ndarray[~typing.Any, ~numpy.dtype[~numpy.int64]] | None = None, xlim: ~typing.Tuple[int | float, int | float] | None = None, ylim: ~typing.Tuple[int | float, int | float] | None = None, figsize: ~typing.Tuple[int | float, int | float] | None = None, title: str | None = None, xlabel: str | None = None, ylabel: str | None = None, cfun: ~typing.Callable[[...], bool | int | ~numpy.integer | float | ~numpy.floating | ~numpy.ndarray[~typing.Any, ~numpy.dtype[~numpy.int64 | ~numpy.float64]]] | None = <ufunc 'log10'>, cmap: str | None = 'plasma', cbar_label: str | None = None, with_labels: bool = False, wcs: ~astropy.wcs.wcs.WCS | None = None, wcs_enabled: bool = True, filename: str | None = None, block: bool = False, **kwargs: ~typing.Any) None
A scatter plot of the SkyModel (self) where the sources are projected according to the phase_center
- Parameters:
phase_center – [RA,DEC]
stokes – SkyModel stoke flux
idx_to_plot – If you want to plot only a subset of the sources, set the indices here.
xlim – RA-limit of plot
ylim – DEC-limit of plot
figsize – figsize as tuple
title – plot title
xlabel – xlabel
ylabel – ylabel
cfun – flux scale transformation function for scatter-coloring
cmap – matplotlib color map
cbar_label – color bar label
with_labels – Plots object ID’s if set?
wcs – If you want to use a custom astropy.wcs, ignores phase_center if set
wcs_enabled – Use wcs transformation?
filename – Set to path/fname to save figure (set extension to fname to overwrite .png default)
block – Whether or not plotting should block the rest of the program
kwargs – matplotlib kwargs for scatter & Collections, e.g. customize s, vmin or vmax
- filter_by_column(col_idx: int, min_val: int | float, max_val: int | float) SkyModel
Filters the sky based on a specific column index
- Parameters:
col_idx – Column index to filter by
min_val – Minimum value for the column
max_val – Maximum value for the column
- Return sky:
Filtered copy of the sky
- filter_by_radius(inner_radius_deg: int | float, outer_radius_deg: int | float, ra0_deg: int | float, dec0_deg: int | float, indices: Literal[False] = False) SkyModel
- filter_by_radius(inner_radius_deg: int | float, outer_radius_deg: int | float, ra0_deg: int | float, dec0_deg: int | float, indices: Literal[True]) Tuple[SkyModel, ndarray[Any, dtype[int64]]]
Filters the sky according to an inner and outer circle from the phase center
- Parameters:
inner_radius_deg – Inner radius in degrees
outer_radius_deg – Outer radius in degrees
ra0_deg – Phase center right ascension
dec0_deg – Phase center declination
indices – Optional parameter, if set to True,
we also return the indices of the filtered sky copy :return sky: Filtered copy of the sky
- filter_by_radius_euclidean_flat_approximation(inner_radius_deg: int | float, outer_radius_deg: int | float, ra0_deg: int | float, dec0_deg: int | float, indices: Literal[False] = False) SkyModel
- filter_by_radius_euclidean_flat_approximation(inner_radius_deg: int | float, outer_radius_deg: int | float, ra0_deg: int | float, dec0_deg: int | float, indices: Literal[True]) Tuple[SkyModel, ndarray[Any, dtype[int64]]]
Filters sources within an annular region using a flat Euclidean distance approximation suitable for large datasets managed by Xarray.
This function is designed for scenarios where the dataset size precludes in-memory spherical geometry calculations. By leveraging a flat Euclidean approximation, it permits the use of Xarray’s out-of-core computation capabilities, thus bypassing the limitations imposed by the incompatibility of astropy.visualization.wcsaxes.SphericalCircle with Xarray’s data structures. Although this method trades off geometric accuracy against computational efficiency, it remains a practical choice for large angular fields where the curvature of the celestial sphere can be reasonably neglected.
Parameters
- inner_radius_degIntFloat
The inner radius of the annular search region, in degrees.
- outer_radius_degIntFloat
The outer radius of the annular search region, in degrees.
- ra0_degIntFloat
The right ascension of the search region’s center, in degrees.
- dec0_degIntFloat
The declination of the search region’s center, in degrees.
- indicesbool, optional
If True, returns the indices of the filtered sources in addition to the SkyModel object. Defaults to False.
Returns
- SkyModel or tuple of (SkyModel, NDArray[np.int_])
The filtered SkyModel object, and optionally the indices of the filtered sources if indices is set to True.
Raises
- KaraboSkyModelError
If the sources attribute is not populated in the SkyModel instance prior to invoking this function.
Notes
Use this function for large sky models where a full spherical geometry calculation is not feasible due to memory constraints. It is particularly beneficial when working with Xarray and Dask, facilitating scalable data analysis on datasets that are too large to fit into memory.
- classmethod get_GLEAM_Sky(min_freq: float | None = None, max_freq: float | None = None) _TSkyModel
Creates a SkyModel containing GLEAM sources from https://vizier.cfa.harvard.edu/ service with more than 300,000 sources on different frequency-bands.
The survey was created using MWA-telescope and covers the entire sky south of dec +30.
GLEAM’s frequency-range: 72-231 MHz
The required .fits file will get downloaded and cached on disk.
- Args:
min_freq: Set min-frequency in Hz for pre-filtering. max_freq: Set max-frequency in Hz for pre-filtering.
- Returns:
GLEAM sky as SkyModel.
- classmethod get_MALS_DR1V3_Sky(min_freq: float | None = None, max_freq: float | None = None) _TSkyModel
Creates a SkyModel containing “MALS V3” catalogue, of 715,760 sources, where the catalogue and it’s information are from ‘https://mals.iucaa.in/’.
The MeerKAT Absorption Line Survey (MALS) consists of 1655 hrs of MeerKAT time (anticipated raw data ~ 1.7 PB) to carry out the most sensitive search of HI and OH absorption lines at 0<z<2, the redshift range over which most of the cosmic evolution in the star formation rate density takes place. The MALS survey is described in ‘Gupta et al. (2016)’.
MALS sky-coverage consists of 392 sources trackings between all RA-angles and DEC[-78.80,32.35] and different radius.
MALS’s frequency-range: 902-1644 MHz.
For publications, please honor their work by citing them as follows: - If you describe MALS or associated science, please cite ‘Gupta et al. 2016’. - If you use DR1 data products, please cite ‘Deka et al. 2024’.
- Args:
min_freq: Set min-frequency in Hz for pre-filtering. max_freq: Set max-frequency in Hz for pre-filtering.
- Returns:
MALS sky as SkyModel.
- classmethod get_MIGHTEE_Sky(min_freq: float | None = None, max_freq: float | None = None) _TSkyModel
Creates a SkyModel containing “MIGHTEE Continuum Early Science L1 catalogue” sources from https://archive.sarao.ac.za service, consisting of 9896 sources.
MIGHTEE is an extragalactic radio-survey carried out using MeerKAT-telescope. It covers roughly the area between RA[149.40,150.84] and DEC[1.49,2.93].
MIGHTEES’s frequency-range: 1304-1375 MHz
The required .fits file will get downloaded and cached on disk.
- Args:
min_freq: Set min-frequency in Hz for pre-filtering. max_freq: Set max-frequency in Hz for pre-filtering.
- Returns:
MIGHTEE sky as SkyModel.
- static get_OSKAR_sky(sky: ndarray[Any, dtype[float64]] | ndarray[Any, dtype[object_]] | DataArray | SkyModel, precision: Literal['single', 'double'] = 'double') Sky
Get OSKAR sky model object from the defined Sky Model
- Returns:
oskar sky model
- get_cartesian_sky() ndarray[Any, dtype[float64]]
- static get_fits_catalog(path: str) Table
Gets astropy.table.table.Table from a .fits catalog
- Parameters:
path – Location of the .fits file
- Returns:
fits catalog
- classmethod get_random_poisson_disk_sky(min_size: Tuple[int | float, int | float], max_size: Tuple[int | float, int | float], flux_min: int | float, flux_max: int | float, r: int = 3) _TSkyModel
- classmethod get_sample_simulated_catalog() _TSkyModel
Downloads a sample simulated HI source catalog and generates a sky model using the downloaded data. The catalog size is around 8MB.
Source: The simulated catalog data was provided by Luis Machado (https://github.com/lmachadopolettivalle) in collaboration with the ETHZ Cosmology Research Group.
- Returns:
SkyModel: The corresponding sky model. The sky model contains the following information:
- ‘Right Ascension’ (ra): The right ascension coordinates
of the celestial objects.
- ‘Declination’ (dec): The declination coordinates of the
celestial objects.
‘Flux’ (i): The flux measurements of the celestial objects.
- ‘Observed Redshift’: Additional observed redshift information
of the celestial objects.
- Note: Other properties such as ‘stokes_q’, ‘stokes_u’, ‘stokes_v’,
‘ref_freq’, ‘spectral_index’, ‘rm’, ‘major’, ‘minor’, ‘pa’, and ‘id’
are not included in the sky model.
- classmethod get_sky_model_from_fits(*, fits_file: Path | str, prefix_mapping: SkyPrefixMapping, unit_mapping: Dict[str, UnitBase], units_sources: SkySourcesUnits | None = None, min_freq: float | None = None, max_freq: float | None = None, encoded_freq: UnitBase | None = None, chunks: int | Literal['auto'] | Tuple[int, ...] | Mapping[Hashable, int] | None = 'auto', memmap: bool = False) _TSkyModel
Creates a sky-model from fits_file. The following formats are supported: - Each data-array of the .fits file maps to a single SkyModel.sources column. - Frequency of some columns is encoded in col-names of the .fits file.
- Args:
fits_file: The .fits file to create the sky-model from. prefix_mapping: Formattable col-names of .fits file. If encoded_freq is
not None, the freq-encoded field-values must have ‘{0}’ as placeholder.
unit_mapping: Mapping from col-unit to astropy.unit. units_sources: Units of SkyModel.sources. min_freq: Filter by min-freq in Hz? May increase file-reading significantly. max_freq: Filter by max-freq in Hz? May increase file-reading significantly. encoded_freq: Unit of col-name encoded frequency, if the .fits file has
it’s ref-frequency encoded in the col-names.
- chunks: Coerce the array’s data into dask arrays with the given chunks.
Might be useful for reading larger-than-memory .fits files.
- memmap: Whether to use memory mapping when opening the FITS file.
Allows for reading of larger-than-memory files.
- Returns:
sky-model with according sources from fits_file.
- classmethod get_sky_model_from_h5_to_xarray(path: str, prefix_mapping: SkyPrefixMapping | None = None, load_as: Literal['numpy_array', 'dask_array'] = 'dask_array', chunksize: int | Literal['auto'] = 'auto') _TSkyModel
Load a sky model dataset from an HDF5 file and converts it to an xarray DataArray.
Parameters
- pathstr
Path to the input HDF5 file.
- prefix_mappingSkyPrefixMapping
Mapping column names to their corresponding dataset paths in the HDF5 file. If the column is not present in the HDF5 file, set its value to None.
- load_asLiteral[“numpy_array”, “dask_array”], default=”dask_array”
What type of array to load the data inside the xarray Data Array as.
- chunksizeUnion[int, str], default=auto
Chunk size for Dask arrays. This determines the size of chunks that the data will be divided into when read from the file. Can be an integer or ‘auto’. If ‘auto’, Dask will choose an optimal chunk size.
Returns
- xr.DataArray
A 2D xarray DataArray containing the sky model data. Rows represent data points and columns represent different data fields (‘ra’, ‘dec’, …).
- get_wcs() WCS
Gets the currently active world coordinate system astropy.wcs For details see https://docs.astropy.org/en/stable/wcs/index.html
- Returns:
world coordinate system
- property num_sources: int
- classmethod read_from_file(path: str) _TSkyModel
Read a CSV file in to create a SkyModel. The CSV should have the following columns
right ascension (deg)
declination (deg)
stokes I Flux (Jy)
stokes Q Flux (Jy): if no information available, set to 0
stokes U Flux (Jy): if no information available, set to 0
stokes V Flux (Jy): if no information available, set to 0
reference_frequency (Hz): if no information available, set to 0
spectral index (N/A): if no information available, set to 0
rotation measure (rad / m^2): if no information available, set to 0
major axis FWHM (arcsec): if no information available, set to 0
minor axis FWHM (arcsec): if no information available, set to 0
position angle (deg): if no information available, set to 0
true redshift: defaults to 0
observed redshift: defaults to 0
source id (object): is in SkyModel.source_ids if provided
- Parameters:
path – file to read in
- Returns:
SkyModel
- static read_healpix_file_to_sky_model_array(file: str, channel: int, polarisation: Polarisation) Tuple[DataArray, int]
Read a healpix file in hdf5 format. The file should have the map keywords:
- Parameters:
file – hdf5 file path (healpix format)
channel – Channels of observation (between 0 and maximum numbers of channels of observation)
polarisation – 0 = Stokes I, 1 = Stokes Q, 2 = Stokes U, 3 = Stokes V
- Returns:
- rechunk_array_based_on_self(array: DataArray) DataArray
- save_sky_model_as_csv(path: str) None
Save source array into a csv. :param path: path to save the csv file in.
- set_wcs(wcs: WCS) None
Sets a new world coordinate system astropy.wcs For details see https://docs.astropy.org/en/stable/wcs/index.html
- Parameters:
wcs – world coordinate system
- setup_default_wcs(phase_center: List[int] | List[float] = [0, 0]) WCS
Defines a default world coordinate system astropy.wcs For more details see https://docs.astropy.org/en/stable/wcs/index.html
- Parameters:
phase_center – ra-dec location
- Returns:
wcs
- property shape: Tuple[int, ...]
- classmethod sky_test() _TSkyModel
Construction of a sky model which can be used for testing and visualizing the simulation with equal distributed point sources around the phase center ra=20, deg=-30.
- Returns:
The test sky model.
- property source_ids: DataArrayCoordinates[DataArray] | None
- property sources: DataArray | None
- to_np_array(with_obj_ids: bool = False) ndarray[Any, dtype[float64]] | ndarray[Any, dtype[object_]]
Gets the sources as np.ndarray
- Parameters:
with_obj_ids – Option whether object ids should be included or not
- Returns:
the sources of the SkyModel as np.ndarray
- to_sky_xarray(sources: ndarray[Any, dtype[float64]] | ndarray[Any, dtype[object_]] | DataArray) DataArray
- Converts a np.ndarray or xr.DataArray to SkyModel.sources
compatible xr.DataArray.
- Args:
sources: Array to convert. Col-order see SkyModel description.
- Returns:
SkyModel.sources compatible xr.DataArray.
- write_to_file(path: str) None
- class SkyPrefixMapping(ra: str | List[str], dec: str | List[str], stokes_i: str | List[str], stokes_q: str | List[str] | None = None, stokes_u: str | List[str] | None = None, stokes_v: str | List[str] | None = None, ref_freq: str | None = None, spectral_index: str | List[str] | None = None, rm: str | List[str] | None = None, major: str | List[str] | None = None, minor: str | List[str] | None = None, pa: str | List[str] | None = None, true_redshift: str | List[str] | None = None, observed_redshift: str | List[str] | None = None, id: str | List[str] | None = None)
Bases:
object
Defines the relation between col-names of a .fits file and SkyModel.sources.
Field-names of sources-data must be according to SkySourcesColName. Each _SkyPrefixMappingValueType can be a set of col-names, a single col-name. Just leave the values not provided in the .fits file None.
- dec: str | List[str]
- id: str | List[str] | None = None
- major: str | List[str] | None = None
- minor: str | List[str] | None = None
- observed_redshift: str | List[str] | None = None
- pa: str | List[str] | None = None
- ra: str | List[str]
- ref_freq: str | None = None
- rm: str | List[str] | None = None
- spectral_index: str | List[str] | None = None
- stokes_i: str | List[str]
- stokes_q: str | List[str] | None = None
- stokes_u: str | List[str] | None = None
- stokes_v: str | List[str] | None = None
- true_redshift: str | List[str] | None = None
- class SkySourcesUnits(ra: UnitBase = Unit('deg'), dec: UnitBase = Unit('deg'), stokes_i: UnitBase = Unit('Jy'), stokes_q: UnitBase = Unit('Jy'), stokes_u: UnitBase = Unit('Jy'), stokes_v: UnitBase = Unit('Jy'), ref_freq: UnitBase = Unit('Hz'), rm: UnitBase = Unit('rad / m2'), major: UnitBase = Unit('arcsec'), minor: UnitBase = Unit('arcsec'), pa: UnitBase = Unit('deg'))
Bases:
object
Represents the units of SkyModel.sources.
This class is useful for unit-conversion from different Prefixes https://docs.astropy.org/en/stable/units/standard_units.html and different units which can be converted to another (like deg to arcmin).
UnitBase covers - Unit: e.g. u.Jy, u.Hz - CompositeUnit: e.g. u.Jy/u.beam, u.rad/u.m**2 - PrefixUnit: e.g. u.MHz, u.GHz
Just assign another unit to the constructor in case the default doesn’t fit for a specific field. It’s useful if e.g. stokes_i is u.Jy/u.beam in the .fits file instead.
- dec: UnitBase = Unit("deg")
- classmethod extract_names_and_freqs(string: str, cols: ColDefs, unit: Unit | PrefixUnit) Dict[str, float]
Extracts all col-names and it’s encoded frequency (in Hz).
string has to be formattable, meaning it must contain a {0} for being the frequency placeholder. Otherwise it will fail.
Important: This function doesn’t consider the unit of SkyModel.sources “ref_freq” unit. It converts it to Hz regardless.
- Args:
string: Column-name with {0} frequency-placeholder. cols: Columns of the .fits file to search through. unit: Frequency-unit encoded in col-names (e.g. u.MHz).
- Returns:
Mapping col-name -> decoded-frequency in Hz.
- classmethod format_sky_prefix_freq_mapping(cols: ColDefs, prefix_mapping: SkyPrefixMapping, encoded_freq: UnitBase | None) Tuple[SkyPrefixMapping, int, Dict[str, float]]
Formats SkyPrefixMapping fields from str to list[str] if formattable.
The encoded frequencies and col-names of the formattable field-values get extracted from cols, converted into Hz. The extracted col-names and frequencies are then available in a col-name -> freq mapping. In addition, prefix_mapping gets enhanced with a list of according col-names of the .fits file. This function doesn’t do any formatting for each field, if encoded_freq is None or is not positional formattable.
- Args:
cols: Columns of .fits file prefix_mapping: Should contain formattable field-values. encoded_freq: astropy.unit frequency encoded (e.g. u.MHz)
- Raises:
- RuntimeError: In case the number of formatting columns of cols
are not of equal for each frequency-channel.
- Returns:
- Formatted prefix_mapping, number of formatted col-names per frequency,
and a mapping col-name -> frequency (Hz).
- classmethod get_pos_ids_to_ra_dec(pos_ids: Sequence[str] | str) Dict[str, Tuple[float, float]]
Converts position-id(s) from str to ra-dec in degrees.
The supported format(s) of pos_ids is ‘JHHMMSS(.s+)±DDMMSS(.s+)’ (J2000). The format is not tested in it’s entirety to not have to do a sanity-check for each pos-id.
A valid example of pos_ids (here just str instead of an iterable) is `pos_ids`=”J130508.50-285042.0”, which results in RA≈196.285, DEC≈-28.845
- Args:
pos_ids: Position-id(s)
- Returns:
Dict from pos-id to ra-dec-tuple.
- get_unit_scales(cols: ColDefs, unit_mapping: Dict[str, UnitBase], prefix_mapping: SkyPrefixMapping) Dict[str, float]
Converts all units specified in prefix_mapping into a factor, which can be used for multiplication of the according data-array, to convert the SkyModel.sources into standard-units defined in the fields of this dataclass.
If a unit in the .fits file doesn’t match the default units of this dataclass, just change it during instantiation to match the .fits file unit.
- Args:
cols: Columns from hdul[1].columns .fits file. unit_mapping: Mapping from col-unit (from .fits file) to `astropy.units.
Be aware to use the very-same unit. E.g. if it’s prefixed in the .fits, also prefix in the astropy.units (“MHZ”:u.MHz, NOT “MHZ”:u.Hz).
prefix_mapping: Mapping from SkyModel.sources to col-name(s).
- Returns:
Mapping col-name -> scaling-factor to SkyModel.sources standard units.
- classmethod is_pos_formattable(string: str) bool
Checks if string is positional formattable.
It is positional-formattable if string contains a ‘{0}’.
- Args:
string: str to check.
- Returns:
Result if it’s formattable.
- major: UnitBase = Unit("arcsec")
- minor: UnitBase = Unit("arcsec")
- pa: UnitBase = Unit("deg")
- ra: UnitBase = Unit("deg")
- ref_freq: UnitBase = Unit("Hz")
- rm: UnitBase = Unit("rad / m2")
- stokes_i: UnitBase = Unit("Jy")
- stokes_q: UnitBase = Unit("Jy")
- stokes_u: UnitBase = Unit("Jy")
- stokes_v: UnitBase = Unit("Jy")
karabo.simulation.station module
- class Station(position: EastNorthCoordinate, parent_longitude: float = 0.0, parent_latitude: float = 0.0, parent_altitude: float = 0.0)
Bases:
object
- add_station_antenna(antenna: EastNorthCoordinate) None
karabo.simulation.telescope module
- class Telescope(longitude: float, latitude: float, altitude: float = 0.0)
Bases:
object
WGS84 longitude and latitude and altitude in metres centre of the telescope.png centre. A telescope is described as follows:
Each row represents one station, with the elements being the horizontal x (east), horizontal y (north), and horizontal z (up) coordinates, followed by the errors in horizontal y (east), horizontal y (north), and horizontal z (up). Example: [[x, y, z, error_x, error_y, error_z], […]]
- centre_longitudefloat
WGS84 longitude at the center of the telescope.
- centre_latitudefloat
WGS84 latitude at the center of the telescope.
- centre_altitudefloat
Altitude (in meters) at the center of the telescope.
- add_antenna_to_station(station_index: int, horizontal_x: float, horizontal_y: float, horizontal_z: float = 0, horizontal_x_coordinate_error: float = 0, horizontal_y_coordinate_error: float = 0, horizontal_z_coordinate_error: float = 0) None
Add a new antenna to an existing station
- Parameters:
station_index – Index of station to add antenna to
horizontal_x – east coordinate relative to the station center in metres
horizontal_y – north coordinate relative to the station center in metres
horizontal_z – altitude of antenna
horizontal_x_coordinate_error – east coordinate error
relative to the station center in metres :param horizontal_y_coordinate_error: north coordinate error relative to the station center in metres :param horizontal_z_coordinate_error: altitude of antenna error :return:
- add_station(horizontal_x: float, horizontal_y: float, horizontal_z: float = 0.0, horizontal_x_coordinate_error: float = 0.0, horizontal_y_coordinate_error: float = 0.0, horizontal_z_coordinate_error: float = 0.0) None
Specify the stations as relative to the centre position :param horizontal_x: east coordinate relative to centre :param horizontal_y: north coordinate relative to centre :param horizontal_z: up coordinate :param horizontal_x_coordinate_error: east coordinate error :param horizontal_y_coordinate_error: north coordinate error :param horizontal_z_coordinate_error: up coordinate error
- classmethod ang_res(freq: float, b: float) float
Calculates angular resolution in arcsec.
Angular resolution: θ=λ/B Wavelength: λ=c/f B: Max baseline in meters
- Args:
freq: Frequency [Hz]. b: Max baseline in meters (e.g. from max_baseline).
- Returns:
Angular resolution in arcsec.
- classmethod constructor(name: Literal['ACA', 'ALMA', 'ATCA', 'CARMA', 'NGVLA', 'PDBI', 'SMA', 'VLA'], version: Enum, backend: Literal[SimulatorBackend.OSKAR] = SimulatorBackend.OSKAR) Telescope
- classmethod constructor(name: Literal['EXAMPLE', 'MeerKAT', 'ASKAP', 'LOFAR', 'MKATPlus', 'SKA1LOW', 'SKA1MID', 'VLBA', 'WSRT'], version: Literal[None] = None, backend: Literal[SimulatorBackend.OSKAR] = SimulatorBackend.OSKAR) Telescope
- classmethod constructor(name: Literal['LOWBD2', 'LOWBD2-CORE', 'LOW', 'LOWR3', 'LOWR4', 'LOW-AA0.5', 'MID', 'MIDR5', 'MID-AA0.5', 'MEERKAT+', 'ASKAP', 'LOFAR', 'VLAA', 'VLAA_north'], version: Literal[None] = None, backend: Literal[SimulatorBackend.RASCIL] = SimulatorBackend.RASCIL) Telescope
Main constructor to obtain a pre-configured telescope instance. :param name: Name of the desired telescope configuration.
This name, together with the backend, is used as the key to look up the correct telescope specification file.
- Parameters:
version – Version details required for some telescope configurations. Defaults to None.
backend – Underlying package to be used for the telescope configuration, since each package stores the arrays in a different format. Defaults to OSKAR.
- Raises:
ValueError if the combination of input parameters is invalid. Specifically, if the requested telescope requires a version, but an invalid version (or no version) is provided, or if the requested telescope name is not supported by the requested backend.
- Returns:
Telescope instance.
- classmethod create_baseline_cut_telescope(lcut: bool | int | integer | float | floating, hcut: bool | int | integer | float | floating, tel: Telescope, tm_path: Path | str | None = None) Tuple[Path | str, Dict[str, str]]
Cut telescope tel for baseline-lengths.
- Args:
lcut: Lower cut hcut: Higher cut tel: Telescope to cut off tm_path: .tm file-path to save the cut-telescope.
tm_path will get overwritten if it already exists.
- Returns:
.tm file-path & station-name conversion (e.g. station055 -> station009)
- get_OSKAR_telescope() Telescope
Retrieve the OSKAR Telescope object from the karabo.Telescope object.
- Returns:
OSKAR Telescope object
- get_backend_specific_information() Path | str | Configuration
- classmethod get_baselines_dists(baselines_wgs84: ndarray[Any, dtype[float64]]) ndarray[Any, dtype[float64]]
Gets the interferometer baselines distances in meters.
It’s euclidean distance, not geodesic.
- Args:
baselines_wgs84: nx3 wgs84 baselines.
- Returns:
Interferometer baselines dists in meters.
- get_baselines_wgs84() ndarray[Any, dtype[float64]]
Gets the interferometer baselines in WGS84.
This function assumes that self.stations provides WGS84 coordinates.
- Returns:
Baselines lon[deg]/lat[deg]/alt[m] (nx3).
- get_cartesian_position() ndarray[Any, dtype[float64]]
- max_baseline() float64
Gets the longest baseline in meters.
- Returns:
Length of longest baseline.
- property name: str | None
Gets the telescope name (if available).
It’s just the file-name of the referred telescope-file without the ending.
- Returns:
Telescope name or None.
- plot_telescope(file: str | None = None) None
Plot the telescope according to which backend is being used, and save the resulting image into a file, if any is provided.
- plot_telescope_OSKAR(file: str | None = None, block: bool = False) None
Plot the telescope and all its stations and antennas with longitude altitude
- write_to_disk(dir_name: Path | str, *, overwrite: bool = False) None
Write dir_path to disk (must have .tm ending).
- Parameters:
dir – directory in which the configuration will be saved in.
overwrite – If True an existing directory is overwritten if exists. Be careful to put the correct dir as input because the old one can get removed!
karabo.simulation.telescope_versions module
- class ACAVersions(value)
Bases:
Enum
An enumeration.
- ALL = 'all'
- CYCLE_1 = 'cycle1'
- CYCLE_2_i = 'cycle2.i'
- CYCLE_2_ns = 'cycle2.ns'
- CYCLE_3 = 'cycle3'
- CYCLE_4 = 'cycle4'
- CYCLE_5 = 'cycle5'
- CYCLE_6 = 'cycle6'
- CYCLE_7 = 'cycle7'
- CYCLE_7_named = 'cycle7.named'
- CYCLE_8 = 'cycle8'
- CYCLE_8_named = 'cycle8.named'
- i = 'i'
- ns = 'ns'
- tp = 'tp'
- class ALMAVersions(value)
Bases:
Enum
ALMA Cycle 0 configuration : {link}
- ALL = 'all'
- CYCLE_0_COMPACT = 'cycle0.compact'
- CYCLE_0_EXTENDED = 'cycle0.extended'
- CYCLE_1_1 = 'cycle1.1'
- CYCLE_1_2 = 'cycle1.2'
- CYCLE_1_3 = 'cycle1.3'
- CYCLE_1_4 = 'cycle1.4'
- CYCLE_1_5 = 'cycle1.5'
- CYCLE_1_6 = 'cycle1.6'
- CYCLE_2_1 = 'cycle2.1'
- CYCLE_2_2 = 'cycle2.2'
- CYCLE_2_3 = 'cycle2.3'
- CYCLE_2_4 = 'cycle2.4'
- CYCLE_2_5 = 'cycle2.5'
- CYCLE_2_6 = 'cycle2.6'
- CYCLE_2_7 = 'cycle2.7'
- CYCLE_3_1 = 'cycle3.1'
- CYCLE_3_2 = 'cycle3.2'
- CYCLE_3_3 = 'cycle3.3'
- CYCLE_3_4 = 'cycle3.4'
- CYCLE_3_5 = 'cycle3.5'
- CYCLE_3_6 = 'cycle3.6'
- CYCLE_3_7 = 'cycle3.7'
- CYCLE_3_8 = 'cycle3.8'
- CYCLE_4_1 = 'cycle4.1'
- CYCLE_4_2 = 'cycle4.2'
- CYCLE_4_3 = 'cycle4.3'
- CYCLE_4_4 = 'cycle4.4'
- CYCLE_4_5 = 'cycle4.5'
- CYCLE_4_6 = 'cycle4.6'
- CYCLE_4_7 = 'cycle4.7'
- CYCLE_4_8 = 'cycle4.8'
- CYCLE_4_9 = 'cycle4.9'
- CYCLE_5_1 = 'cycle5.1'
- CYCLE_5_10 = 'cycle6.10'
- CYCLE_5_2 = 'cycle5.2'
- CYCLE_5_3 = 'cycle5.3'
- CYCLE_5_4 = 'cycle5.4'
- CYCLE_5_5 = 'cycle5.5'
- CYCLE_5_6 = 'cycle5.6'
- CYCLE_5_7 = 'cycle5.7'
- CYCLE_5_8 = 'cycle5.8'
- CYCLE_5_9 = 'cycle5.9'
- CYCLE_6_1 = 'cycle6.1'
- CYCLE_6_10 = 'cycle6.10'
- CYCLE_6_2 = 'cycle6.2'
- CYCLE_6_3 = 'cycle6.3'
- CYCLE_6_4 = 'cycle6.4'
- CYCLE_6_5 = 'cycle6.5'
- CYCLE_6_6 = 'cycle6.6'
- CYCLE_6_7 = 'cycle6.7'
- CYCLE_6_8 = 'cycle6.8'
- CYCLE_6_9 = 'cycle6.9'
- CYCLE_7_1 = 'cycle7.1'
- CYCLE_7_10 = 'cycle7.10'
- CYCLE_7_2 = 'cycle7.2'
- CYCLE_7_3 = 'cycle7.3'
- CYCLE_7_4 = 'cycle7.4'
- CYCLE_7_5 = 'cycle7.5'
- CYCLE_7_6 = 'cycle7.6'
- CYCLE_7_7 = 'cycle7.7'
- CYCLE_7_8 = 'cycle7.8'
- CYCLE_7_9 = 'cycle7.9'
- CYCLE_8_1 = 'cycle8.1'
- CYCLE_8_10 = 'cycle8.10'
- CYCLE_8_2 = 'cycle8.2'
- CYCLE_8_3 = 'cycle8.3'
- CYCLE_8_4 = 'cycle8.4'
- CYCLE_8_5 = 'cycle8.5'
- CYCLE_8_6 = 'cycle8.6'
- CYCLE_8_7 = 'cycle8.7'
- CYCLE_8_8 = 'cycle8.8'
- CYCLE_8_9 = 'cycle8.9'
- OUT_01 = 'out01'
- OUT_02 = 'out02'
- OUT_03 = 'out03'
- OUT_04 = 'out04'
- OUT_05 = 'out05'
- OUT_06 = 'out06'
- OUT_07 = 'out07'
- OUT_08 = 'out08'
- OUT_09 = 'out09'
- OUT_10 = 'out10'
- OUT_11 = 'out11'
- OUT_12 = 'out12'
- OUT_13 = 'out13'
- OUT_14 = 'out14'
- OUT_15 = 'out15'
- OUT_16 = 'out16'
- OUT_17 = 'out17'
- OUT_18 = 'out18'
- OUT_19 = 'out19'
- OUT_20 = 'out20'
- OUT_21 = 'out21'
- OUT_22 = 'out22'
- OUT_23 = 'out23'
- OUT_24 = 'out24'
- OUT_25 = 'out25'
- OUT_26 = 'out26'
- OUT_27 = 'out27'
- OUT_28 = 'out28'
- class CARMAVersions(value)
Bases:
Enum
Combined Array for Research in Millimeter-wave Astronomy telescope configuration names
- A = 'a'
- B = 'b'
- C = 'c'
- D = 'd'
- E = 'e'
- class MWAVersion(value)
Bases:
Enum
An enumeration.
- ONE = '1'
- TWO_COMPACT = '2compact'
- TWO_EXTENDED = '2ext'
- class NGVLAVersions(value)
Bases:
Enum
next-generation Very Large Array telescope configuration names
- CORE_rev_B = 'core-revB'
- CORE_rev_C = 'core-revC'
- gb_vlba_rev_B = 'gb-vlba-revB'
- lba_rev_C = 'lba-revC'
- main_rev_C = 'main-revC'
- mid_subarray_rev_C = 'mid-subarray-revC'
- plains_rev_B = 'plains-revB'
- plains_rev_C = 'plains-revC'
- rev_B = 'revB'
- rev_C = 'revC'
- sba_rev_B = 'sba-revB'
- sba_rev_C = 'sba-revC'
karabo.simulation.visibility module
- class Visibility(path: Path | str)
Bases:
object
Class representing visibility data on the filesystem
- Args:
- path: Path to visibility data directory (for MS format) or file.
Visibility format will be inferred from the path.
- classmethod combine_vis(visibilities: List[Visibility], combined_ms_filepath: Path | str | None = None, group_by: str = 'day') Path | str
- class VisibilityFormatUtil
Bases:
object
- classmethod is_valid_path_for_format(path: Path | str, format: Literal['MS', 'OSKAR_VIS']) bool
Tests if a path is valid for a specific format
- Args:
path: path to visibility format: visibility format
- Returns:
True if valid, False otherwise
- classmethod parse_visibility_format_from_path(path: Path | str) Literal['MS', 'OSKAR_VIS'] | None