SKA-Low conversion guide

[1]:
from importlib.metadata import version
import os

try:
    import xradio

    print("XRADIO version", version("xradio"), "already installed.")
except ImportError as e:
    print(e)
    print("Installing XRADIO")

    os.system("pip install xradio")

    import xradio

    print("xradio version", version("xradio"), " installed.")
XRADIO version 1.1.3 already installed.

Download Dataset

[2]:
import toolviper

toolviper.utils.data.download(file="ska_low_sim_18s.ms")
[2026-04-20 15:19:58,240]     INFO   toolviper:  Initializing download...
[2026-04-20 15:19:58,241]     INFO   toolviper:  File already exists: /Users/vdesouza/work/xradio/docs/source/measurement_set/guides/ska_low_sim_18s.ms

Convert to Processing Set

[3]:
from xradio.measurement_set import convert_msv2_to_processing_set

ms_file = "ska_low_sim_18s.ms"
outfile = "ska_low_sim_18s.ps.zarr"
convert_msv2_to_processing_set(
    in_file=ms_file,
    out_file=outfile,
    parallel_mode="none",
    persistence_mode='w',
)
[2026-04-20 15:19:58,528]     INFO   toolviper:  Updated partition scheme used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID']
[2026-04-20 15:19:58,529]     INFO   toolviper:  Number of partitions: 1
[2026-04-20 15:19:58,529]     INFO   toolviper:  OBSERVATION_ID [0], DDI [0], STATE [0], FIELD [0], SCAN [0], EPHEMERIS [None]
[2026-04-20 15:19:58,580]  WARNING   toolviper:  SOURCE table empty for (unique) source_id [0] and spectral_window_id 0.

Processing Set

[4]:
ps_name = outfile

from xradio.measurement_set import open_processing_set

ps_xdt = open_processing_set(ps_store=outfile)
ps_xdt.xr_ps.summary()
[4]:
name scan_intents shape execution_block_UID polarization scan_name spw_name spw_intents field_name source_name line_name field_coords session_reference_UID scheduling_block_UID project_UID start_frequency end_frequency
0 ska_low_sim_18s_0 [OBSERVE_TARGET#ON_SOURCE] (67, 153, 27, 4) --- [XX, XY, YX, YY] [0] spw_0 [UNSPECIFIED] [_0] [Unknown] [] [fk5, 11h20m00.00s, -10d00m00.00s] --- --- 1.013862e+08 1.736084e+08
[5]:
ps_xdt["ska_low_sim_18s_0"]
[5]:
<xarray.DataTree 'ska_low_sim_18s_0'>
Group: /ska_low_sim_18s_0
│   Dimensions:                     (time: 67, baseline_id: 153, frequency: 27,
│                                    polarization: 4, uvw_label: 3)
│   Coordinates:
│     * time                        (time) float64 536B 9.47e+08 ... 9.47e+08
│       field_name                  (time) <U23 6kB dask.array<chunksize=(67,), meta=np.ndarray>
│       scan_name                   (time) <U21 6kB dask.array<chunksize=(67,), meta=np.ndarray>
│     * baseline_id                 (baseline_id) int64 1kB 0 1 2 3 ... 150 151 152
│       baseline_antenna1_name      (baseline_id) <U24 15kB dask.array<chunksize=(153,), meta=np.ndarray>
│       baseline_antenna2_name      (baseline_id) <U24 15kB dask.array<chunksize=(153,), meta=np.ndarray>
│     * frequency                   (frequency) float64 216B 1.014e+08 ... 1.736e+08
│     * polarization                (polarization) <U2 32B 'XX' 'XY' 'YX' 'YY'
│     * uvw_label                   (uvw_label) <U1 12B 'u' 'v' 'w'
│   Data variables:
│       EFFECTIVE_INTEGRATION_TIME  (time, baseline_id) float64 82kB dask.array<chunksize=(67, 153), meta=np.ndarray>
│       FLAG                        (time, baseline_id, frequency, polarization) bool 1MB dask.array<chunksize=(67, 153, 27, 4), meta=np.ndarray>
│       TIME_CENTROID               (time, baseline_id) float64 82kB dask.array<chunksize=(67, 153), meta=np.ndarray>
│       UVW                         (time, baseline_id, uvw_label) float64 246kB dask.array<chunksize=(67, 153, 3), meta=np.ndarray>
│       VISIBILITY                  (time, baseline_id, frequency, polarization) complex64 9MB dask.array<chunksize=(67, 153, 27, 4), meta=np.ndarray>
│       WEIGHT                      (time, baseline_id, frequency, polarization) float32 4MB dask.array<chunksize=(67, 153, 27, 4), meta=np.ndarray>
│   Attributes:
│       creation_date:     2026-04-20T21:19:58.537824+00:00
│       creator:           {'software_name': 'xradio', 'version': '1.1.3'}
│       data_groups:       {'base': {'correlated_data': 'VISIBILITY', 'date': '20...
│       observation_info:  {'observer': ['fd382'], 'observing_log': "['']", 'proj...
│       processor_info:    {'sub_type': '', 'type': ''}
│       schema_version:    4.0.0
│       type:              visibility
├── Group: /ska_low_sim_18s_0/antenna_xds
│       Dimensions:                 (antenna_name: 18, cartesian_pos_label: 3,
│                                    receptor_label: 2)
│       Coordinates:
│         * antenna_name            (antenna_name) <U24 2kB 's0000 (station345_S8-1)'...
│           mount                   (antenna_name) <U5 360B dask.array<chunksize=(18,), meta=np.ndarray>
│           station_name            (antenna_name) <U5 360B dask.array<chunksize=(18,), meta=np.ndarray>
│           telescope_name          (antenna_name) <U12 864B dask.array<chunksize=(18,), meta=np.ndarray>
│         * cartesian_pos_label     (cartesian_pos_label) <U1 12B 'x' 'y' 'z'
│         * receptor_label          (receptor_label) <U5 40B 'pol_0' 'pol_1'
│           polarization_type       (antenna_name, receptor_label) <U1 144B dask.array<chunksize=(18, 2), meta=np.ndarray>
│       Data variables:
│           ANTENNA_DISH_DIAMETER   (antenna_name) float64 144B dask.array<chunksize=(18,), meta=np.ndarray>
│           ANTENNA_POSITION        (antenna_name, cartesian_pos_label) float64 432B dask.array<chunksize=(18, 3), meta=np.ndarray>
│           ANTENNA_RECEPTOR_ANGLE  (antenna_name, receptor_label) float64 288B dask.array<chunksize=(18, 2), meta=np.ndarray>
│       Attributes:
│           overall_telescope_name:  OSKAR 2.10.0
│           relocatable_antennas:    False
│           type:                    antenna
├── Group: /ska_low_sim_18s_0/field_and_source_base_xds
│       Dimensions:                       (field_name: 1, sky_dir_label: 2)
│       Coordinates:
│         * field_name                    (field_name) <U23 92B '_0'
│           source_name                   (field_name) <U7 28B dask.array<chunksize=(1,), meta=np.ndarray>
│         * sky_dir_label                 (sky_dir_label) <U3 24B 'ra' 'dec'
│       Data variables:
│           FIELD_PHASE_CENTER_DIRECTION  (field_name, sky_dir_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>
│       Attributes:
│           type:     field_and_source
└── Group: /ska_low_sim_18s_0/phased_array_xds
        Dimensions:                       (antenna_name: 18,
                                           cartesian_pos_label_local: 3,
                                           cartesian_pos_label: 3, receptor_label: 2,
                                           element_id: 256)
        Coordinates:
          * antenna_name                  (antenna_name) <U24 2kB 's0000 (station345_...
          * cartesian_pos_label_local     (cartesian_pos_label_local) <U1 12B 'p' ......
          * cartesian_pos_label           (cartesian_pos_label) <U1 12B 'x' 'y' 'z'
          * receptor_label                (receptor_label) <U5 40B 'pol_0' 'pol_1'
            polarization_type             (antenna_name, receptor_label) <U1 144B dask.array<chunksize=(18, 2), meta=np.ndarray>
          * element_id                    (element_id) int64 2kB 0 1 2 3 ... 253 254 255
        Data variables:
            PHASED_ARRAY_COORDINATE_AXES  (antenna_name, cartesian_pos_label_local, cartesian_pos_label) float64 1kB dask.array<chunksize=(18, 3, 3), meta=np.ndarray>
            PHASED_ARRAY_ELEMENT_FLAG     (antenna_name, receptor_label, element_id) bool 9kB dask.array<chunksize=(18, 2, 256), meta=np.ndarray>
            PHASED_ARRAY_ELEMENT_OFFSET   (antenna_name, cartesian_pos_label_local, element_id) float64 111kB dask.array<chunksize=(18, 3, 256), meta=np.ndarray>
        Attributes:
            type:     phased_array
[6]:
msv4_xdt = ps_xdt["ska_low_sim_18s_0"]
msv4_xdt.ds
[6]:
<xarray.DatasetView> Size: 15MB
Dimensions:                     (time: 67, baseline_id: 153, frequency: 27,
                                 polarization: 4, uvw_label: 3)
Coordinates:
  * time                        (time) float64 536B 9.47e+08 ... 9.47e+08
    field_name                  (time) <U23 6kB dask.array<chunksize=(67,), meta=np.ndarray>
    scan_name                   (time) <U21 6kB dask.array<chunksize=(67,), meta=np.ndarray>
  * baseline_id                 (baseline_id) int64 1kB 0 1 2 3 ... 150 151 152
    baseline_antenna1_name      (baseline_id) <U24 15kB dask.array<chunksize=(153,), meta=np.ndarray>
    baseline_antenna2_name      (baseline_id) <U24 15kB dask.array<chunksize=(153,), meta=np.ndarray>
  * frequency                   (frequency) float64 216B 1.014e+08 ... 1.736e+08
  * polarization                (polarization) <U2 32B 'XX' 'XY' 'YX' 'YY'
  * uvw_label                   (uvw_label) <U1 12B 'u' 'v' 'w'
Data variables:
    EFFECTIVE_INTEGRATION_TIME  (time, baseline_id) float64 82kB dask.array<chunksize=(67, 153), meta=np.ndarray>
    FLAG                        (time, baseline_id, frequency, polarization) bool 1MB dask.array<chunksize=(67, 153, 27, 4), meta=np.ndarray>
    TIME_CENTROID               (time, baseline_id) float64 82kB dask.array<chunksize=(67, 153), meta=np.ndarray>
    UVW                         (time, baseline_id, uvw_label) float64 246kB dask.array<chunksize=(67, 153, 3), meta=np.ndarray>
    VISIBILITY                  (time, baseline_id, frequency, polarization) complex64 9MB dask.array<chunksize=(67, 153, 27, 4), meta=np.ndarray>
    WEIGHT                      (time, baseline_id, frequency, polarization) float32 4MB dask.array<chunksize=(67, 153, 27, 4), meta=np.ndarray>
Attributes:
    creation_date:     2026-04-20T21:19:58.537824+00:00
    creator:           {'software_name': 'xradio', 'version': '1.1.3'}
    data_groups:       {'base': {'correlated_data': 'VISIBILITY', 'date': '20...
    observation_info:  {'observer': ['fd382'], 'observing_log': "['']", 'proj...
    processor_info:    {'sub_type': '', 'type': ''}
    schema_version:    4.0.0
    type:              visibility
[7]:
ant_xds = ps_xdt.xr_ps.get_combined_antenna_xds()
ant_xds
[7]:
<xarray.Dataset> Size: 6kB
Dimensions:                 (antenna_name: 18, cartesian_pos_label: 3,
                             receptor_label: 2, baseline_id: 153,
                             frequency: 27, polarization: 4, time: 67,
                             uvw_label: 3)
Coordinates:
  * antenna_name            (antenna_name) <U24 2kB 's0000 (station345_S8-1)'...
    mount                   (antenna_name) <U5 360B dask.array<chunksize=(18,), meta=np.ndarray>
    station_name            (antenna_name) <U5 360B dask.array<chunksize=(18,), meta=np.ndarray>
    telescope_name          (antenna_name) <U12 864B dask.array<chunksize=(18,), meta=np.ndarray>
  * cartesian_pos_label     (cartesian_pos_label) <U1 12B 'x' 'y' 'z'
  * receptor_label          (receptor_label) <U5 40B 'pol_0' 'pol_1'
    polarization_type       (antenna_name, receptor_label) <U1 144B dask.array<chunksize=(18, 2), meta=np.ndarray>
  * baseline_id             (baseline_id) int64 1kB 0 1 2 3 ... 149 150 151 152
  * frequency               (frequency) float64 216B 1.014e+08 ... 1.736e+08
  * polarization            (polarization) <U2 32B 'XX' 'XY' 'YX' 'YY'
  * time                    (time) float64 536B 9.47e+08 9.47e+08 ... 9.47e+08
  * uvw_label               (uvw_label) <U1 12B 'u' 'v' 'w'
Data variables:
    ANTENNA_DISH_DIAMETER   (antenna_name) float64 144B dask.array<chunksize=(18,), meta=np.ndarray>
    ANTENNA_POSITION        (antenna_name, cartesian_pos_label) float64 432B dask.array<chunksize=(18, 3), meta=np.ndarray>
    ANTENNA_RECEPTOR_ANGLE  (antenna_name, receptor_label) float64 288B dask.array<chunksize=(18, 2), meta=np.ndarray>
Attributes:
    overall_telescope_name:  OSKAR 2.10.0
    relocatable_antennas:    False
    type:                    antenna
[8]:
ps_xdt.xr_ps.plot_antenna_positions_2d()
../../_images/measurement_set_guides_SKA_low_11_0.png