Ephemeris 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

https://open-bitbucket.nrao.edu/projects/CASA/repos/casatestdata/browse/unittest/tclean/venus_ephem_test.ms

[2]:
import toolviper
ms_file = "venus_ephem_test.ms"
toolviper.utils.data.download(file=ms_file)
[2026-04-20 15:17:27,795]     INFO   toolviper:  Initializing download...
[2026-04-20 15:17:27,795]     INFO   toolviper:  File already exists: /Users/vdesouza/work/xradio/docs/source/measurement_set/guides/venus_ephem_test.ms

Convert to Processing Set

[3]:
from xradio.measurement_set import convert_msv2_to_processing_set
ms_file = "venus_ephem_test.ms"

main_chunksize = {"frequency": 1, "time": 20}  # baseline, polarization
outfile = "venus_ephem_test.ps.zarr"
convert_msv2_to_processing_set(
    in_file=ms_file,
    out_file=outfile,
    parallel_mode="none",
    persistence_mode='w',
    main_chunksize=main_chunksize,
)
[2026-04-20 15:17:28,092]     INFO   toolviper:  Updated partition scheme used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID', 'EPHEMERIS_ID']
[2026-04-20 15:17:28,094]     INFO   toolviper:  Number of partitions: 1
[2026-04-20 15:17:28,094]     INFO   toolviper:  OBSERVATION_ID [0], DDI [0], STATE [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], FIELD [0, 1, 2, 3, 4, 5, 6], SCAN [7, 11], EPHEMERIS [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 venus_ephem_test_0 [OBSERVE_TARGET#ON_SOURCE] (140, 1128, 1, 2) uid://A002/Xd7be9d/X499e [XX, YY] [11, 7] X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 [UNSPECIFIED] [Venus_0, Venus_1, Venus_2, Venus_3, Venus_4, ... [Venus_0] [OSSO_Line_1(ID=0)] Ephemeris uid://A001/X133d/X169f uid://A001/X133d/X169a uid://A001/X12ea/X715 2.452498e+11 2.452498e+11
[5]:


ps_xdt["venus_ephem_test_0"]
[5]:
<xarray.DataTree 'venus_ephem_test_0'>
Group: /venus_ephem_test_0
│   Dimensions:                     (time: 140, baseline_id: 1128, frequency: 1,
│                                    polarization: 2, uvw_label: 3)
│   Coordinates:
│     * time                        (time) float64 1kB 1.547e+09 ... 1.547e+09
│       field_name                  (time) <U27 15kB dask.array<chunksize=(140,), meta=np.ndarray>
│       scan_name                   (time) <U21 12kB dask.array<chunksize=(140,), meta=np.ndarray>
│     * baseline_id                 (baseline_id) int64 9kB 0 1 2 ... 1125 1126 1127
│       baseline_antenna1_name      (baseline_id) <U9 41kB dask.array<chunksize=(1128,), meta=np.ndarray>
│       baseline_antenna2_name      (baseline_id) <U9 41kB dask.array<chunksize=(1128,), meta=np.ndarray>
│     * frequency                   (frequency) float64 8B 2.452e+11
│     * polarization                (polarization) <U2 16B 'XX' 'YY'
│     * uvw_label                   (uvw_label) <U1 12B 'u' 'v' 'w'
│   Data variables:
│       EFFECTIVE_INTEGRATION_TIME  (time, baseline_id) float64 1MB dask.array<chunksize=(20, 1128), meta=np.ndarray>
│       FLAG                        (time, baseline_id, frequency, polarization) bool 316kB dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>
│       TIME_CENTROID               (time, baseline_id) float64 1MB dask.array<chunksize=(20, 1128), meta=np.ndarray>
│       UVW                         (time, baseline_id, uvw_label) float64 4MB dask.array<chunksize=(20, 1128, 3), meta=np.ndarray>
│       VISIBILITY                  (time, baseline_id, frequency, polarization) complex64 3MB dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>
│       WEIGHT                      (time, baseline_id, frequency, polarization) float32 1MB dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>
│   Attributes:
│       creation_date:     2026-04-20T21:17:28.127657+00:00
│       creator:           {'software_name': 'xradio', 'version': '1.1.3'}
│       data_groups:       {'base': {'correlated_data': 'VISIBILITY', 'date': '20...
│       observation_info:  {'execution_block_UID': 'uid://A002/Xd7be9d/X499e', 'o...
│       processor_info:    {'sub_type': 'ALMA_CORRELATOR_MODE', 'type': 'CORRELAT...
│       schema_version:    4.0.0
│       type:              visibility
├── Group: /venus_ephem_test_0/antenna_xds
│       Dimensions:                 (antenna_name: 47, cartesian_pos_label: 3,
│                                    receptor_label: 2)
│       Coordinates:
│         * antenna_name            (antenna_name) <U9 2kB 'DA41_A058' ... 'DV25_A006'
│           mount                   (antenna_name) <U6 1kB dask.array<chunksize=(47,), meta=np.ndarray>
│           station_name            (antenna_name) <U4 752B dask.array<chunksize=(47,), meta=np.ndarray>
│           telescope_name          (antenna_name) <U4 752B dask.array<chunksize=(47,), 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 376B dask.array<chunksize=(47, 2), meta=np.ndarray>
│       Data variables:
│           ANTENNA_DISH_DIAMETER   (antenna_name) float64 376B dask.array<chunksize=(47,), meta=np.ndarray>
│           ANTENNA_POSITION        (antenna_name, cartesian_pos_label) float64 1kB dask.array<chunksize=(47, 3), meta=np.ndarray>
│           ANTENNA_RECEPTOR_ANGLE  (antenna_name, receptor_label) float64 752B dask.array<chunksize=(47, 2), meta=np.ndarray>
│       Attributes:
│           overall_telescope_name:  ALMA
│           relocatable_antennas:    True
│           type:                    antenna
├── Group: /venus_ephem_test_0/field_and_source_base_xds
│       Dimensions:                       (time: 140, sky_dir_label: 2,
│                                          sky_dis_label: 1, line_label: 1,
│                                          cartesian_pos_label: 3, time_ephemeris: 2,
│                                          ellipsoid_dir_label: 2,
│                                          ellipsoid_dis_label: 1)
│       Coordinates:
│           field_name                    (time) <U27 15kB dask.array<chunksize=(140,), meta=np.ndarray>
│           source_name                   (time) <U27 15kB dask.array<chunksize=(140,), meta=np.ndarray>
│         * sky_dir_label                 (sky_dir_label) <U3 24B 'ra' 'dec'
│         * sky_dis_label                 (sky_dis_label) <U4 16B 'dist'
│         * line_label                    (line_label) <U21 84B '0'
│           line_name                     (time, line_label) <U17 10kB dask.array<chunksize=(140, 1), meta=np.ndarray>
│         * cartesian_pos_label           (cartesian_pos_label) <U1 12B 'x' 'y' 'z'
│         * time_ephemeris                (time_ephemeris) float64 16B 1.547e+09 1.54...
│         * ellipsoid_dir_label           (ellipsoid_dir_label) <U3 24B 'lon' 'lat'
│         * ellipsoid_dis_label           (ellipsoid_dis_label) <U4 16B 'dist'
│       Data variables:
│           FIELD_PHASE_CENTER_DIRECTION  (time, sky_dir_label) float64 2kB dask.array<chunksize=(140, 2), meta=np.ndarray>
│           FIELD_PHASE_CENTER_DISTANCE   (time, sky_dis_label) float64 1kB dask.array<chunksize=(140, 1), meta=np.ndarray>
│           LINE_REST_FREQUENCY           (time, line_label) float64 1kB dask.array<chunksize=(140, 1), meta=np.ndarray>
│           LINE_SYSTEMIC_VELOCITY        (time, line_label) float64 1kB dask.array<chunksize=(140, 1), meta=np.ndarray>
│           OBSERVER_POSITION             (cartesian_pos_label) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>
│           SOURCE_DIRECTION              (time_ephemeris, sky_dir_label) float64 32B dask.array<chunksize=(2, 2), meta=np.ndarray>
│           SOURCE_DISTANCE               (time_ephemeris, sky_dis_label) float64 16B dask.array<chunksize=(2, 1), meta=np.ndarray>
│           SOURCE_RADIAL_VELOCITY        (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>
│           SUB_OBSERVER_DIRECTION        (time_ephemeris, ellipsoid_dir_label) float64 32B dask.array<chunksize=(2, 2), meta=np.ndarray>
│       Attributes:
│           type:     field_and_source_ephemeris
└── Group: /venus_ephem_test_0/weather_xds
        Dimensions:              (station_name: 5, time_weather: 147,
                                  cartesian_pos_label: 3)
        Coordinates:
          * station_name         (station_name) <U14 280B 'Meteo129' ... 'MeteoTB2'
          * time_weather         (time_weather) float64 1kB 1.547e+09 ... 1.547e+09
          * cartesian_pos_label  (cartesian_pos_label) <U1 12B 'x' 'y' 'z'
        Data variables:
            DEW_POINT            (station_name, time_weather) float64 6kB dask.array<chunksize=(5, 147), meta=np.ndarray>
            PRESSURE             (station_name, time_weather) float64 6kB dask.array<chunksize=(5, 147), meta=np.ndarray>
            REL_HUMIDITY         (station_name, time_weather) float64 6kB dask.array<chunksize=(5, 147), meta=np.ndarray>
            STATION_POSITION     (station_name, cartesian_pos_label) float64 120B dask.array<chunksize=(5, 3), meta=np.ndarray>
            TEMPERATURE          (station_name, time_weather) float64 6kB dask.array<chunksize=(5, 147), meta=np.ndarray>
            WIND_DIRECTION       (station_name, time_weather) float64 6kB dask.array<chunksize=(5, 147), meta=np.ndarray>
            WIND_SPEED           (station_name, time_weather) float64 6kB dask.array<chunksize=(5, 147), meta=np.ndarray>
        Attributes:
            type:     weather
[6]:
ms_xdt = ps_xdt["venus_ephem_test_0"]
ms_xdt.observation_info
[6]:
{'execution_block_UID': 'uid://A002/Xd7be9d/X499e',
 'observer': ['sv2421'],
 'observing_log': '',
 'project_UID': 'uid://A001/X12ea/X715',
 'release_date': '1858-11-17T00:00:00',
 'scheduling_block_UID': 'uid://A001/X133d/X169a',
 'session_reference_UID': 'uid://A001/X133d/X169f'}
[7]:
ms_xdt["antenna_xds"]   # or ms_xdt.antenna_xds
[7]:
<xarray.DataTree 'antenna_xds'>
Group: /venus_ephem_test_0/antenna_xds
    Dimensions:                 (time: 140, baseline_id: 1128, frequency: 1,
                                 polarization: 2, uvw_label: 3, antenna_name: 47,
                                 cartesian_pos_label: 3, receptor_label: 2)
    Coordinates:
      * antenna_name            (antenna_name) <U9 2kB 'DA41_A058' ... 'DV25_A006'
        mount                   (antenna_name) <U6 1kB dask.array<chunksize=(47,), meta=np.ndarray>
        station_name            (antenna_name) <U4 752B dask.array<chunksize=(47,), meta=np.ndarray>
        telescope_name          (antenna_name) <U4 752B dask.array<chunksize=(47,), 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 376B dask.array<chunksize=(47, 2), meta=np.ndarray>
    Inherited coordinates:
      * baseline_id             (baseline_id) int64 9kB 0 1 2 3 ... 1125 1126 1127
      * frequency               (frequency) float64 8B 2.452e+11
      * polarization            (polarization) <U2 16B 'XX' 'YY'
      * time                    (time) float64 1kB 1.547e+09 1.547e+09 ... 1.547e+09
      * uvw_label               (uvw_label) <U1 12B 'u' 'v' 'w'
    Data variables:
        ANTENNA_DISH_DIAMETER   (antenna_name) float64 376B dask.array<chunksize=(47,), meta=np.ndarray>
        ANTENNA_POSITION        (antenna_name, cartesian_pos_label) float64 1kB dask.array<chunksize=(47, 3), meta=np.ndarray>
        ANTENNA_RECEPTOR_ANGLE  (antenna_name, receptor_label) float64 752B dask.array<chunksize=(47, 2), meta=np.ndarray>
    Attributes:
        overall_telescope_name:  ALMA
        relocatable_antennas:    True
        type:                    antenna
[8]:
field_and_source_xds = ms_xdt.xr_ms.get_field_and_source_xds()
[9]:
field_and_source_xds
[9]:
<xarray.DatasetView> Size: 56kB
Dimensions:                       (time: 140, sky_dir_label: 2,
                                   sky_dis_label: 1, line_label: 1,
                                   cartesian_pos_label: 3, time_ephemeris: 2,
                                   ellipsoid_dir_label: 2, baseline_id: 1128,
                                   frequency: 1, polarization: 2, uvw_label: 3,
                                   ellipsoid_dis_label: 1)
Coordinates: (12/15)
  * time                          (time) float64 1kB 1.547e+09 ... 1.547e+09
    field_name                    (time) <U27 15kB dask.array<chunksize=(140,), meta=np.ndarray>
    source_name                   (time) <U27 15kB dask.array<chunksize=(140,), meta=np.ndarray>
  * sky_dir_label                 (sky_dir_label) <U3 24B 'ra' 'dec'
  * sky_dis_label                 (sky_dis_label) <U4 16B 'dist'
  * line_label                    (line_label) <U21 84B '0'
    ...                            ...
  * ellipsoid_dir_label           (ellipsoid_dir_label) <U3 24B 'lon' 'lat'
  * baseline_id                   (baseline_id) int64 9kB 0 1 2 ... 1126 1127
  * frequency                     (frequency) float64 8B 2.452e+11
  * polarization                  (polarization) <U2 16B 'XX' 'YY'
  * uvw_label                     (uvw_label) <U1 12B 'u' 'v' 'w'
  * ellipsoid_dis_label           (ellipsoid_dis_label) <U4 16B 'dist'
Data variables:
    FIELD_PHASE_CENTER_DIRECTION  (time, sky_dir_label) float64 2kB dask.array<chunksize=(140, 2), meta=np.ndarray>
    FIELD_PHASE_CENTER_DISTANCE   (time, sky_dis_label) float64 1kB dask.array<chunksize=(140, 1), meta=np.ndarray>
    LINE_REST_FREQUENCY           (time, line_label) float64 1kB dask.array<chunksize=(140, 1), meta=np.ndarray>
    LINE_SYSTEMIC_VELOCITY        (time, line_label) float64 1kB dask.array<chunksize=(140, 1), meta=np.ndarray>
    OBSERVER_POSITION             (cartesian_pos_label) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>
    SOURCE_DIRECTION              (time_ephemeris, sky_dir_label) float64 32B dask.array<chunksize=(2, 2), meta=np.ndarray>
    SOURCE_DISTANCE               (time_ephemeris, sky_dis_label) float64 16B dask.array<chunksize=(2, 1), meta=np.ndarray>
    SOURCE_RADIAL_VELOCITY        (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>
    SUB_OBSERVER_DIRECTION        (time_ephemeris, ellipsoid_dir_label) float64 32B dask.array<chunksize=(2, 2), meta=np.ndarray>
Attributes:
    type:     field_and_source_ephemeris
[10]:
ms_xdt.xr_ms.get_field_and_source_xds().FIELD_PHASE_CENTER_DIRECTION.isel(time=0,drop=True).to_dict()
[10]:
{'dims': ('sky_dir_label',),
 'attrs': {'frame': 'icrs', 'type': 'sky_coord', 'units': 'rad'},
 'data': [-2.1054387263055148, -0.2961237230862559],
 'coords': {'sky_dir_label': {'dims': ('sky_dir_label',),
   'attrs': {},
   'data': ['ra', 'dec']}},
 'name': 'FIELD_PHASE_CENTER_DIRECTION'}
[11]:
ps_xdt.xr_ps.plot_antenna_positions_2d()
../../_images/measurement_set_guides_ALMA_ephemeris_15_0.png
[12]:
ps_xdt.xr_ps.plot_phase_centers()
../../_images/measurement_set_guides_ALMA_ephemeris_16_0.png
[13]:
import xarray as xr
xds = xr.DataArray([0,0,0], dims=["time"], coords={"time": [0, 1, 2]})
xds.attrs = {"test":0, "test2": 1}
xds
[13]:
<xarray.DataArray (time: 3)> Size: 24B
array([0, 0, 0])
Coordinates:
  * time     (time) int64 24B 0 1 2
Attributes:
    test:     0
    test2:    1
[14]:
xds = xds*10
xds
[14]:
<xarray.DataArray (time: 3)> Size: 24B
array([0, 0, 0])
Coordinates:
  * time     (time) int64 24B 0 1 2
Attributes:
    test:     0
    test2:    1
[15]:
import numpy as np

dis =  {
                "attrs": {
                    "coordinate_system": "geocentric",
                    "frame": "ITRF",
                    "origin_object_name": "earth",
                    "type": "location",
                    "units": "m",
                },
                "data": [6379946.01326443],
                "dims": ("sky_dis_label",),
                "coords":  {'sky_dis_label': {'dims': ('sky_dis_label',),
                    'data': ['m']}
                },
            }


dir =  {
                "attrs": {
                    "coordinate_system": "geocentric",
                    "frame": "ITRF",
                    "origin_object_name": "earth",
                    "type": "location",
                    "units": "rad",
                },
                "data": np.array([-1.1825465955049892, -0.3994149869262738]),
                "dims" : ("sky_dir_label",),
                "coords":  {'sky_dir_label': {'dims': ('sky_dir_label',),
                    'data': ['ra', 'dec']}
                },

            }

dir
[15]:
{'attrs': {'coordinate_system': 'geocentric',
  'frame': 'ITRF',
  'origin_object_name': 'earth',
  'type': 'location',
  'units': 'rad'},
 'data': array([-1.1825466 , -0.39941499]),
 'dims': ('sky_dir_label',),
 'coords': {'sky_dir_label': {'dims': ('sky_dir_label',),
   'data': ['ra', 'dec']}}}
[16]:
import xarray as xr


xr.DataArray.from_dict(dir)
[16]:
<xarray.DataArray (sky_dir_label: 2)> Size: 16B
array([-1.1825466 , -0.39941499])
Coordinates:
  * sky_dir_label  (sky_dir_label) <U3 24B 'ra' 'dec'
Attributes:
    coordinate_system:   geocentric
    frame:               ITRF
    origin_object_name:  earth
    type:                location
    units:               rad