diff --git a/.github/workflows/python-testing-linux.yml b/.github/workflows/python-testing-linux.yml
index 5f6dc7af..56fa5548 100644
--- a/.github/workflows/python-testing-linux.yml
+++ b/.github/workflows/python-testing-linux.yml
@@ -15,7 +15,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
- python-version: ["3.9","3.10","3.11","3.12"]
+ python-version: ["3.9","3.10","3.11","3.12","3.13"]
steps:
- uses: actions/checkout@v4
diff --git a/.github/workflows/python-testing-macos.yml b/.github/workflows/python-testing-macos.yml
index c72a90fa..5119d41e 100644
--- a/.github/workflows/python-testing-macos.yml
+++ b/.github/workflows/python-testing-macos.yml
@@ -17,7 +17,7 @@ jobs:
fail-fast: false
matrix:
os: ["macos-latest"]
- python-version: ["3.9", "3.10", "3.11", "3.12"]
+ python-version: ["3.9", "3.10", "3.11", "3.12","3.13"]
steps:
- uses: actions/checkout@v4
diff --git a/demo/demo.ipynb b/demo/demo.ipynb
index b5dbb9e3..33c59343 100644
--- a/demo/demo.ipynb
+++ b/demo/demo.ipynb
@@ -222,7 +222,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 1,
"metadata": {},
"outputs": [
{
@@ -318,6 +318,8 @@
"│ 59750_altaz_2settings.ms │ CASA MS v2 │ ASKAP │ 0.0037 │ Interferometer │\n",
"├──────────────────────────────────────────┼────────────────┼─────────────┼──────────┼────────────────────────────┤\n",
"│ 59749_bp_8beams_pattern.ms │ CASA MS v2 │ ASKAP │ 0.0081 │ Interferometer │\n",
+ "├──────────────────────────────────────────┼────────────────┼─────────────┼──────────┼────────────────────────────┤\n",
+ "│ gaincal.test.zarr │ CASA MS v4 │ NA │ NA │ NA │\n",
"└──────────────────────────────────────────┴────────────────┴─────────────┴──────────┴────────────────────────────┘\n",
"\n"
],
@@ -412,6 +414,8 @@
"│\u001b[34m \u001b[0m\u001b[34m59750_altaz_2settings.ms \u001b[0m\u001b[34m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mCASA MS v2 \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mASKAP \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32m0.0037 \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mInterferometer \u001b[0m\u001b[32m \u001b[0m│\n",
"├──────────────────────────────────────────┼────────────────┼─────────────┼──────────┼────────────────────────────┤\n",
"│\u001b[34m \u001b[0m\u001b[34m59749_bp_8beams_pattern.ms \u001b[0m\u001b[34m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mCASA MS v2 \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mASKAP \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32m0.0081 \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mInterferometer \u001b[0m\u001b[32m \u001b[0m│\n",
+ "├──────────────────────────────────────────┼────────────────┼─────────────┼──────────┼────────────────────────────┤\n",
+ "│\u001b[34m \u001b[0m\u001b[34mgaincal.test.zarr \u001b[0m\u001b[34m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mCASA MS v4 \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mNA \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mNA \u001b[0m\u001b[32m \u001b[0m│\u001b[32m \u001b[0m\u001b[32mNA \u001b[0m\u001b[32m \u001b[0m│\n",
"└──────────────────────────────────────────┴────────────────┴─────────────┴──────────┴────────────────────────────┘\n"
]
},
@@ -425,6 +429,68 @@
"list_files()"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-01-17 16:16:46,635\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: \u001b[38;2;50;50;205m/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/toolviper/utils/data/.dropbox\u001b[0m \n",
+ "[\u001b[38;2;128;05;128m2025-01-17 16:16:46,635\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Updating file metadata information ... \n",
+ " "
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ " Download List \n",
+ " ─────────────── \n",
+ " gmrt.ms \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ " \n",
+ " \u001b[1m \u001b[0m\u001b[1mDownload List\u001b[0m\u001b[1m \u001b[0m \n",
+ " ─────────────── \n",
+ " \u001b[35mgmrt.ms\u001b[0m \n",
+ " \n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " "
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "caf35236e84d4604a056c918dab1c78d",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "gmrt.ms.zip: 0%| | 0.00/2.03M [00:00, ?iB/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from toolviper.utils.data import download\n",
+ "download(file=\"gmrt.ms\")"
+ ]
+ },
{
"cell_type": "code",
"execution_count": 3,
@@ -15675,7 +15741,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.12.6"
+ "version": "3.12.8"
}
},
"nbformat": 4,
diff --git a/dev/review_fs/review_fs.ipynb b/dev/review_fs/review_fs.ipynb
new file mode 100644
index 00000000..a67bff01
--- /dev/null
+++ b/dev/review_fs/review_fs.ipynb
@@ -0,0 +1,12090 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:43,583\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: \u001b[38;2;50;50;205m/home/fedemp/ws_xradio_dev/venv_xradio_python312/lib/python3.12/site-packages/toolviper/utils/data/.dropbox\u001b[0m \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:43,584\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Updating file metadata information ... \n",
+ " "
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ " \n",
+ " Download List \n",
+ " ───────────────────────────────────────────── \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg.ms \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ " \n",
+ " \u001b[1m \u001b[0m\u001b[1mDownload List \u001b[0m\u001b[1m \u001b[0m \n",
+ " ───────────────────────────────────────────── \n",
+ " \u001b[35mALMA_uid___A002_X1003af4_X75a3.split.avg.ms\u001b[0m \n",
+ " \n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:44,785\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: ALMA_uid___A002_X1003af4_X75a3.split.avg.ms \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:44,786\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: \u001b[38;2;50;50;205m/home/fedemp/ws_xradio_dev/venv_xradio_python312/lib/python3.12/site-packages/toolviper/utils/data/.dropbox\u001b[0m \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:44,786\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Updating file metadata information ... \n",
+ " "
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ " \n",
+ " Download List \n",
+ " ────────────────────── \n",
+ " VLBA_TL016B_split.ms \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ " \n",
+ " \u001b[1m \u001b[0m\u001b[1mDownload List \u001b[0m\u001b[1m \u001b[0m \n",
+ " ────────────────────── \n",
+ " \u001b[35mVLBA_TL016B_split.ms\u001b[0m \n",
+ " \n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:46,013\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: VLBA_TL016B_split.ms \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:46,015\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: \u001b[38;2;50;50;205m/home/fedemp/ws_xradio_dev/venv_xradio_python312/lib/python3.12/site-packages/toolviper/utils/data/.dropbox\u001b[0m \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:46,015\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Updating file metadata information ... \n",
+ " "
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ " \n",
+ " Download List \n",
+ " ────────────────────────────────── \n",
+ " Antennae_North.cal.lsrk.split.ms \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ " \n",
+ " \u001b[1m \u001b[0m\u001b[1mDownload List \u001b[0m\u001b[1m \u001b[0m \n",
+ " ────────────────────────────────── \n",
+ " \u001b[35mAntennae_North.cal.lsrk.split.ms\u001b[0m \n",
+ " \n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:47,168\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: Antennae_North.cal.lsrk.split.ms \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:47,169\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: \u001b[38;2;50;50;205m/home/fedemp/ws_xradio_dev/venv_xradio_python312/lib/python3.12/site-packages/toolviper/utils/data/.dropbox\u001b[0m \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:47,170\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Updating file metadata information ... \n",
+ " "
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ " \n",
+ " Download List \n",
+ " ────────────────────── \n",
+ " SNR_G55_10s.split.ms \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ " \n",
+ " \u001b[1m \u001b[0m\u001b[1mDownload List \u001b[0m\u001b[1m \u001b[0m \n",
+ " ────────────────────── \n",
+ " \u001b[35mSNR_G55_10s.split.ms\u001b[0m \n",
+ " \n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:48,471\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: SNR_G55_10s.split.ms \n"
+ ]
+ }
+ ],
+ "source": [
+ "from toolviper.utils.data import download\n",
+ "download(file=\"ALMA_uid___A002_X1003af4_X75a3.split.avg.ms\") #ALMA Mosaic Ephmeris of the Sun.\n",
+ "download(file=\"VLBA_TL016B_split.ms\") \n",
+ "download(file=\"Antennae_North.cal.lsrk.split.ms\")\n",
+ "download(file=\"SNR_G55_10s.split.ms\")\n",
+ "# download()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# VLBA_TL016B_split Split fields"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:51,453\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBSERVATION_ID', 'FIELD_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:51,466\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Number of partitions: 4 \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:51,467\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [-1], FIELD [0], SCAN [0] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:51,744\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Source_id is -1. No source information will be included in the field_and_source_xds. \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:51,851\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [-1], FIELD [1], SCAN [0] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:52,145\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Source_id is -1. No source information will be included in the field_and_source_xds. \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:52,263\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [-1], FIELD [0], SCAN [0] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:52,623\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Source_id is -1. No source information will be included in the field_and_source_xds. \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:52,730\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [-1], FIELD [1], SCAN [0] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:20:53,020\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Source_id is -1. No source information will be included in the field_and_source_xds. \n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " name | \n",
+ " intents | \n",
+ " shape | \n",
+ " polarization | \n",
+ " scan_name | \n",
+ " spw_name | \n",
+ " field_name | \n",
+ " source_name | \n",
+ " line_name | \n",
+ " field_coords | \n",
+ " start_frequency | \n",
+ " end_frequency | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " VLBA_TL016B_split_0 | \n",
+ " [obs_0] | \n",
+ " (200, 55, 6, 2) | \n",
+ " [RR, LL] | \n",
+ " [0] | \n",
+ " spw_0 | \n",
+ " [4C39.25_0] | \n",
+ " [Unknown] | \n",
+ " [] | \n",
+ " [fk5, 9h27m03.01s, 39d02m20.85s] | \n",
+ " 5.004000e+09 | \n",
+ " 5.006500e+09 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " VLBA_TL016B_split_1 | \n",
+ " [obs_0] | \n",
+ " (540, 55, 6, 2) | \n",
+ " [RR, LL] | \n",
+ " [0] | \n",
+ " spw_0 | \n",
+ " [J1154+6022_1] | \n",
+ " [Unknown] | \n",
+ " [] | \n",
+ " [fk5, 11h54m04.54s, 60d22m20.82s] | \n",
+ " 5.004000e+09 | \n",
+ " 5.006500e+09 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " VLBA_TL016B_split_2 | \n",
+ " [obs_0] | \n",
+ " (200, 55, 6, 2) | \n",
+ " [RR, LL] | \n",
+ " [0] | \n",
+ " spw_1 | \n",
+ " [4C39.25_0] | \n",
+ " [Unknown] | \n",
+ " [] | \n",
+ " [fk5, 9h27m03.01s, 39d02m20.85s] | \n",
+ " 5.068000e+09 | \n",
+ " 5.070500e+09 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " VLBA_TL016B_split_3 | \n",
+ " [obs_0] | \n",
+ " (540, 55, 6, 2) | \n",
+ " [RR, LL] | \n",
+ " [0] | \n",
+ " spw_1 | \n",
+ " [J1154+6022_1] | \n",
+ " [Unknown] | \n",
+ " [] | \n",
+ " [fk5, 11h54m04.54s, 60d22m20.82s] | \n",
+ " 5.068000e+09 | \n",
+ " 5.070500e+09 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " name intents shape polarization scan_name \\\n",
+ "0 VLBA_TL016B_split_0 [obs_0] (200, 55, 6, 2) [RR, LL] [0] \n",
+ "3 VLBA_TL016B_split_1 [obs_0] (540, 55, 6, 2) [RR, LL] [0] \n",
+ "2 VLBA_TL016B_split_2 [obs_0] (200, 55, 6, 2) [RR, LL] [0] \n",
+ "1 VLBA_TL016B_split_3 [obs_0] (540, 55, 6, 2) [RR, LL] [0] \n",
+ "\n",
+ " spw_name field_name source_name line_name \\\n",
+ "0 spw_0 [4C39.25_0] [Unknown] [] \n",
+ "3 spw_0 [J1154+6022_1] [Unknown] [] \n",
+ "2 spw_1 [4C39.25_0] [Unknown] [] \n",
+ "1 spw_1 [J1154+6022_1] [Unknown] [] \n",
+ "\n",
+ " field_coords start_frequency end_frequency \n",
+ "0 [fk5, 9h27m03.01s, 39d02m20.85s] 5.004000e+09 5.006500e+09 \n",
+ "3 [fk5, 11h54m04.54s, 60d22m20.82s] 5.004000e+09 5.006500e+09 \n",
+ "2 [fk5, 9h27m03.01s, 39d02m20.85s] 5.068000e+09 5.070500e+09 \n",
+ "1 [fk5, 11h54m04.54s, 60d22m20.82s] 5.068000e+09 5.070500e+09 "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf VLBA_TL016B_split_field_id.ps.zarr\n",
+ "\n",
+ "msv2_name = \"VLBA_TL016B_split.ms\"\n",
+ "convert_out = \"VLBA_TL016B_split_field_id.ps.zarr\"\n",
+ "\n",
+ "\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " parallel=False,\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 184B\n",
+ "Dimensions: (field_name: 1, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) <U29 116B '4C39.25_0'\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " source_name (field_name) <U7 28B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " type: field_and_source
- field_name: 1
- sky_dir_label: 2
FIELD_PHASE_CENTER
(field_name, sky_dir_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Size: 184B\n",
+ "Dimensions: (field_name: 1, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) \n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 16B dask.array\n",
+ "Attributes:\n",
+ " type: field_and_source"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps['VLBA_TL016B_split_0'].VISIBILITY.field_and_source_xds"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# VLBA_TL016B_split"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:04,422\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBSERVATION_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:04,432\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Number of partitions: 2 \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:04,432\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [-1], FIELD [0 1], SCAN [0] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:04,828\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Source_id is -1. No source information will be included in the field_and_source_xds. \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:04,944\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [-1], FIELD [0 1], SCAN [0] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:05,287\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Source_id is -1. No source information will be included in the field_and_source_xds. \n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " name | \n",
+ " intents | \n",
+ " shape | \n",
+ " polarization | \n",
+ " scan_name | \n",
+ " spw_name | \n",
+ " field_name | \n",
+ " source_name | \n",
+ " line_name | \n",
+ " field_coords | \n",
+ " start_frequency | \n",
+ " end_frequency | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " VLBA_TL016B_split_0 | \n",
+ " [obs_0] | \n",
+ " (740, 55, 6, 2) | \n",
+ " [RR, LL] | \n",
+ " [0] | \n",
+ " spw_0 | \n",
+ " [4C39.25_0, J1154+6022_1] | \n",
+ " [Unknown] | \n",
+ " [] | \n",
+ " Multi-Phase-Center | \n",
+ " 5.004000e+09 | \n",
+ " 5.006500e+09 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " VLBA_TL016B_split_1 | \n",
+ " [obs_0] | \n",
+ " (740, 55, 6, 2) | \n",
+ " [RR, LL] | \n",
+ " [0] | \n",
+ " spw_1 | \n",
+ " [4C39.25_0, J1154+6022_1] | \n",
+ " [Unknown] | \n",
+ " [] | \n",
+ " Multi-Phase-Center | \n",
+ " 5.068000e+09 | \n",
+ " 5.070500e+09 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " name intents shape polarization scan_name \\\n",
+ "0 VLBA_TL016B_split_0 [obs_0] (740, 55, 6, 2) [RR, LL] [0] \n",
+ "1 VLBA_TL016B_split_1 [obs_0] (740, 55, 6, 2) [RR, LL] [0] \n",
+ "\n",
+ " spw_name field_name source_name line_name \\\n",
+ "0 spw_0 [4C39.25_0, J1154+6022_1] [Unknown] [] \n",
+ "1 spw_1 [4C39.25_0, J1154+6022_1] [Unknown] [] \n",
+ "\n",
+ " field_coords start_frequency end_frequency \n",
+ "0 Multi-Phase-Center 5.004000e+09 5.006500e+09 \n",
+ "1 Multi-Phase-Center 5.068000e+09 5.070500e+09 "
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf VLBA_TL016B_split.ps.zarr\n",
+ "\n",
+ "msv2_name = \"VLBA_TL016B_split.ms\"\n",
+ "convert_out = \"VLBA_TL016B_split.ps.zarr\"\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " parallel=False,\n",
+ " partition_scheme=[]\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 368B\n",
+ "Dimensions: (field_name: 2, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) <U32 256B '4C39.25_0' 'J1154+6022_1'\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " source_name (field_name) <U7 56B dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 32B dask.array<chunksize=(2, 2), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " type: field_and_source
- field_name: 2
- sky_dir_label: 2
field_name
(field_name)
<U32
'4C39.25_0' 'J1154+6022_1'
array(['4C39.25_0', 'J1154+6022_1'], dtype='<U32')
sky_dir_label
(sky_dir_label)
<U3
'ra' 'dec'
array(['ra', 'dec'], dtype='<U3')
source_name
(field_name)
<U7
dask.array<chunksize=(2,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 56 B | \n",
+ " 56 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2,) | \n",
+ " (2,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
FIELD_PHASE_CENTER
(field_name, sky_dir_label)
float64
dask.array<chunksize=(2, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 32 B | \n",
+ " 32 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2, 2) | \n",
+ " (2, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Size: 368B\n",
+ "Dimensions: (field_name: 2, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) \n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 32B dask.array\n",
+ "Attributes:\n",
+ " type: field_and_source"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps['VLBA_TL016B_split_0'].VISIBILITY.field_and_source_xds"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# day2_TDEM0003_10s_norx Split Field (add to tests)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:43,579\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBSERVATION_ID', 'FIELD_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:43,594\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 8 \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:43,595\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [-1], FIELD [2], SCAN [ 5 7 9 11 13 15 17 19 22 24 26 28 30 32 34 36 39 41 43 45 47 49 51 53] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:44,424\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [-1], FIELD [3], SCAN [ 6 8 10 12 14 16 18 23 25 27 29 31 33 35 40 42 44 46 48 50 52] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:46,717\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [-1], FIELD [5], SCAN [56] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:46,946\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [-1], FIELD [7], SCAN [59] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:47,140\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [-1], FIELD [2], SCAN [ 5 7 9 11 13 15 17 19 22 24 26 28 30 32 34 36 39 41 43 45 47 49 51 53] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:47,890\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [-1], FIELD [3], SCAN [ 6 8 10 12 14 16 18 23 25 27 29 31 33 35 40 42 44 46 48 50 52] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:50,067\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [-1], FIELD [5], SCAN [56] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:50,296\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [-1], FIELD [7], SCAN [59] \n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " name | \n",
+ " intents | \n",
+ " shape | \n",
+ " polarization | \n",
+ " scan_name | \n",
+ " spw_name | \n",
+ " field_name | \n",
+ " source_name | \n",
+ " line_name | \n",
+ " field_coords | \n",
+ " start_frequency | \n",
+ " end_frequency | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 | \n",
+ " day2_TDEM0003_10s_norx_0 | \n",
+ " [obs_0] | \n",
+ " (196, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 32, 3... | \n",
+ " Subband:0_0 | \n",
+ " [J0954+1743_2] | \n",
+ " [J0954+1743_2] | \n",
+ " [] | \n",
+ " [fk5, 9h54m56.82s, 17d43m31.22s] | \n",
+ " 3.638723e+10 | \n",
+ " 3.639510e+10 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " day2_TDEM0003_10s_norx_1 | \n",
+ " [obs_0] | \n",
+ " (609, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [10, 12, 14, 16, 18, 23, 25, 27, 29, 31, 33, 3... | \n",
+ " Subband:0_0 | \n",
+ " [IRC+10216_3] | \n",
+ " [IRC+10216_3] | \n",
+ " [] | \n",
+ " [fk5, 9h47m57.38s, 13d16m40.66s] | \n",
+ " 3.638723e+10 | \n",
+ " 3.639510e+10 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " day2_TDEM0003_10s_norx_2 | \n",
+ " [obs_0] | \n",
+ " (32, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [56] | \n",
+ " Subband:0_0 | \n",
+ " [J1229+0203_5] | \n",
+ " [J1229+0203_5] | \n",
+ " [] | \n",
+ " [fk5, 12h29m06.70s, 2d03m08.60s] | \n",
+ " 3.638723e+10 | \n",
+ " 3.639510e+10 | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " day2_TDEM0003_10s_norx_3 | \n",
+ " [obs_0] | \n",
+ " (17, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [59] | \n",
+ " Subband:0_0 | \n",
+ " [J1331+3030_7] | \n",
+ " [J1331+3030_7] | \n",
+ " [] | \n",
+ " [fk5, 13h31m08.29s, 30d30m32.96s] | \n",
+ " 3.638723e+10 | \n",
+ " 3.639510e+10 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " day2_TDEM0003_10s_norx_4 | \n",
+ " [obs_0] | \n",
+ " (196, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 32, 3... | \n",
+ " Subband:0_1 | \n",
+ " [J0954+1743_2] | \n",
+ " [J0954+1743_2] | \n",
+ " [] | \n",
+ " [fk5, 9h54m56.82s, 17d43m31.22s] | \n",
+ " 3.630454e+10 | \n",
+ " 3.631242e+10 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " day2_TDEM0003_10s_norx_5 | \n",
+ " [obs_0] | \n",
+ " (609, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [10, 12, 14, 16, 18, 23, 25, 27, 29, 31, 33, 3... | \n",
+ " Subband:0_1 | \n",
+ " [IRC+10216_3] | \n",
+ " [IRC+10216_3] | \n",
+ " [] | \n",
+ " [fk5, 9h47m57.38s, 13d16m40.66s] | \n",
+ " 3.630454e+10 | \n",
+ " 3.631242e+10 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " day2_TDEM0003_10s_norx_6 | \n",
+ " [obs_0] | \n",
+ " (32, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [56] | \n",
+ " Subband:0_1 | \n",
+ " [J1229+0203_5] | \n",
+ " [J1229+0203_5] | \n",
+ " [] | \n",
+ " [fk5, 12h29m06.70s, 2d03m08.60s] | \n",
+ " 3.630454e+10 | \n",
+ " 3.631242e+10 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " day2_TDEM0003_10s_norx_7 | \n",
+ " [obs_0] | \n",
+ " (17, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [59] | \n",
+ " Subband:0_1 | \n",
+ " [J1331+3030_7] | \n",
+ " [J1331+3030_7] | \n",
+ " [] | \n",
+ " [fk5, 13h31m08.29s, 30d30m32.96s] | \n",
+ " 3.630454e+10 | \n",
+ " 3.631242e+10 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " name intents shape polarization \\\n",
+ "5 day2_TDEM0003_10s_norx_0 [obs_0] (196, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "6 day2_TDEM0003_10s_norx_1 [obs_0] (609, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "3 day2_TDEM0003_10s_norx_2 [obs_0] (32, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "0 day2_TDEM0003_10s_norx_3 [obs_0] (17, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "1 day2_TDEM0003_10s_norx_4 [obs_0] (196, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "2 day2_TDEM0003_10s_norx_5 [obs_0] (609, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "7 day2_TDEM0003_10s_norx_6 [obs_0] (32, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "4 day2_TDEM0003_10s_norx_7 [obs_0] (17, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "\n",
+ " scan_name spw_name \\\n",
+ "5 [11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 32, 3... Subband:0_0 \n",
+ "6 [10, 12, 14, 16, 18, 23, 25, 27, 29, 31, 33, 3... Subband:0_0 \n",
+ "3 [56] Subband:0_0 \n",
+ "0 [59] Subband:0_0 \n",
+ "1 [11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 32, 3... Subband:0_1 \n",
+ "2 [10, 12, 14, 16, 18, 23, 25, 27, 29, 31, 33, 3... Subband:0_1 \n",
+ "7 [56] Subband:0_1 \n",
+ "4 [59] Subband:0_1 \n",
+ "\n",
+ " field_name source_name line_name \\\n",
+ "5 [J0954+1743_2] [J0954+1743_2] [] \n",
+ "6 [IRC+10216_3] [IRC+10216_3] [] \n",
+ "3 [J1229+0203_5] [J1229+0203_5] [] \n",
+ "0 [J1331+3030_7] [J1331+3030_7] [] \n",
+ "1 [J0954+1743_2] [J0954+1743_2] [] \n",
+ "2 [IRC+10216_3] [IRC+10216_3] [] \n",
+ "7 [J1229+0203_5] [J1229+0203_5] [] \n",
+ "4 [J1331+3030_7] [J1331+3030_7] [] \n",
+ "\n",
+ " field_coords start_frequency end_frequency \n",
+ "5 [fk5, 9h54m56.82s, 17d43m31.22s] 3.638723e+10 3.639510e+10 \n",
+ "6 [fk5, 9h47m57.38s, 13d16m40.66s] 3.638723e+10 3.639510e+10 \n",
+ "3 [fk5, 12h29m06.70s, 2d03m08.60s] 3.638723e+10 3.639510e+10 \n",
+ "0 [fk5, 13h31m08.29s, 30d30m32.96s] 3.638723e+10 3.639510e+10 \n",
+ "1 [fk5, 9h54m56.82s, 17d43m31.22s] 3.630454e+10 3.631242e+10 \n",
+ "2 [fk5, 9h47m57.38s, 13d16m40.66s] 3.630454e+10 3.631242e+10 \n",
+ "7 [fk5, 12h29m06.70s, 2d03m08.60s] 3.630454e+10 3.631242e+10 \n",
+ "4 [fk5, 13h31m08.29s, 30d30m32.96s] 3.630454e+10 3.631242e+10 "
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf \"day2_TDEM0003_10s_norx_field_id.ps.zarr\"\n",
+ "\n",
+ "msv2_name = \"day2_TDEM0003_10s_norx.ms\"\n",
+ "convert_out = \"day2_TDEM0003_10s_norx_field_id.ps.zarr\"\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " parallel=False,\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 504B\n",
+ "Dimensions: (field_name: 1, sky_dir_label: 2, line_label: 2)\n",
+ "Coordinates:\n",
+ " field_id (field_name) int64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+ " * field_name (field_name) <U32 128B 'J0954+1743_2'\n",
+ " * line_label (line_label) <U21 168B '0' '1'\n",
+ " line_name (field_name, line_label) <U1 8B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ " source_name (field_name) <U32 128B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+ "Dimensions without coordinates: sky_dir_label\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ " LINE_REST_FREQUENCY (field_name, line_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ " LINE_SYSTEMIC_VELOCITY (field_name, line_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " is_ephemeris: False\n",
+ " type: field_and_source
- field_name: 1
- sky_dir_label: 2
- line_label: 2
field_id
(field_name)
int64
dask.array<chunksize=(1,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 8 B | \n",
+ " 8 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1,) | \n",
+ " (1,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " int64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
field_name
(field_name)
<U32
'J0954+1743_2'
array(['J0954+1743_2'], dtype='<U32')
line_label
(line_label)
<U21
'0' '1'
array(['0', '1'], dtype='<U21')
line_name
(field_name, line_label)
<U1
dask.array<chunksize=(1, 2), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 8 B | \n",
+ " 8 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
source_name
(field_name)
<U32
dask.array<chunksize=(1,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 128 B | \n",
+ " 128 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1,) | \n",
+ " (1,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
FIELD_PHASE_CENTER
(field_name, sky_dir_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
LINE_REST_FREQUENCY
(field_name, line_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- observer :
- lsrk
- type :
- spectral_coord
- units :
- ['Hz']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
LINE_SYSTEMIC_VELOCITY
(field_name, line_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(field_name, sky_dir_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
- is_ephemeris :
- False
- type :
- field_and_source
"
+ ],
+ "text/plain": [
+ " Size: 504B\n",
+ "Dimensions: (field_name: 1, sky_dir_label: 2, line_label: 2)\n",
+ "Coordinates:\n",
+ " field_id (field_name) int64 8B dask.array\n",
+ " * field_name (field_name) \n",
+ " source_name (field_name) \n",
+ "Dimensions without coordinates: sky_dir_label\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 16B dask.array\n",
+ " LINE_REST_FREQUENCY (field_name, line_label) float64 16B dask.array\n",
+ " LINE_SYSTEMIC_VELOCITY (field_name, line_label) float64 16B dask.array\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 16B dask.array\n",
+ "Attributes:\n",
+ " is_ephemeris: False\n",
+ " type: field_and_source"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps['day2_TDEM0003_10s_norx_0'].VISIBILITY.field_and_source_xds"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# day2_TDEM0003_10s_norx"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:51,332\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBSERVATION_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:51,337\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 2 \n",
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:51,338\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [-1], FIELD [2 3 5 7], SCAN [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28 29 30\n",
+ " 31 32 33 34 35 36 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 56 59] \n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/numpy/_core/numeric.py:452: RuntimeWarning: invalid value encountered in cast\n",
+ " multiarray.copyto(res, fill_value, casting='unsafe')\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-01-30 11:28:53,936\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [-1], FIELD [2 3 5 7], SCAN [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28 29 30\n",
+ " 31 32 33 34 35 36 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 56 59] \n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/numpy/_core/numeric.py:452: RuntimeWarning: invalid value encountered in cast\n",
+ " multiarray.copyto(res, fill_value, casting='unsafe')\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " name | \n",
+ " intents | \n",
+ " shape | \n",
+ " polarization | \n",
+ " scan_name | \n",
+ " spw_name | \n",
+ " field_name | \n",
+ " source_name | \n",
+ " line_name | \n",
+ " field_coords | \n",
+ " start_frequency | \n",
+ " end_frequency | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " day2_TDEM0003_10s_norx_0 | \n",
+ " [obs_0] | \n",
+ " (854, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 2... | \n",
+ " Subband:0_0 | \n",
+ " [IRC+10216_3, J0954+1743_2, J1229+0203_5, J133... | \n",
+ " [IRC+10216_3, J0954+1743_2, J1229+0203_5, J133... | \n",
+ " [] | \n",
+ " Multi-Phase-Center | \n",
+ " 3.638723e+10 | \n",
+ " 3.639510e+10 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " day2_TDEM0003_10s_norx_1 | \n",
+ " [obs_0] | \n",
+ " (854, 171, 64, 4) | \n",
+ " [RR, RL, LR, LL] | \n",
+ " [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 2... | \n",
+ " Subband:0_1 | \n",
+ " [IRC+10216_3, J0954+1743_2, J1229+0203_5, J133... | \n",
+ " [IRC+10216_3, J0954+1743_2, J1229+0203_5, J133... | \n",
+ " [] | \n",
+ " Multi-Phase-Center | \n",
+ " 3.630454e+10 | \n",
+ " 3.631242e+10 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " name intents shape polarization \\\n",
+ "0 day2_TDEM0003_10s_norx_0 [obs_0] (854, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "1 day2_TDEM0003_10s_norx_1 [obs_0] (854, 171, 64, 4) [RR, RL, LR, LL] \n",
+ "\n",
+ " scan_name spw_name \\\n",
+ "0 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 2... Subband:0_0 \n",
+ "1 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 2... Subband:0_1 \n",
+ "\n",
+ " field_name \\\n",
+ "0 [IRC+10216_3, J0954+1743_2, J1229+0203_5, J133... \n",
+ "1 [IRC+10216_3, J0954+1743_2, J1229+0203_5, J133... \n",
+ "\n",
+ " source_name line_name \\\n",
+ "0 [IRC+10216_3, J0954+1743_2, J1229+0203_5, J133... [] \n",
+ "1 [IRC+10216_3, J0954+1743_2, J1229+0203_5, J133... [] \n",
+ "\n",
+ " field_coords start_frequency end_frequency \n",
+ "0 Multi-Phase-Center 3.638723e+10 3.639510e+10 \n",
+ "1 Multi-Phase-Center 3.630454e+10 3.631242e+10 "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf \"day2_TDEM0003_10s_norx.ps.zarr\"\n",
+ "\n",
+ "msv2_name = \"day2_TDEM0003_10s_norx.ms\"\n",
+ "convert_out = \"day2_TDEM0003_10s_norx.ps.zarr\"\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " parallel=False,\n",
+ " partition_scheme=[]\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.summary()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 2kB\n",
+ "Dimensions: (field_name: 4, sky_dir_label: 2, line_label: 2)\n",
+ "Coordinates:\n",
+ " field_id (field_name) int64 32B dask.array<chunksize=(4,), meta=np.ndarray>\n",
+ " * field_name (field_name) <U32 512B 'J0954+1743_2' ... 'J1331+...\n",
+ " * line_label (line_label) <U21 168B '0' '1'\n",
+ " line_name (field_name, line_label) <U1 32B dask.array<chunksize=(4, 2), meta=np.ndarray>\n",
+ " source_name (field_name) <U32 512B dask.array<chunksize=(4,), meta=np.ndarray>\n",
+ "Dimensions without coordinates: sky_dir_label\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 64B dask.array<chunksize=(4, 2), meta=np.ndarray>\n",
+ " LINE_REST_FREQUENCY (field_name, line_label) float64 64B dask.array<chunksize=(4, 2), meta=np.ndarray>\n",
+ " LINE_SYSTEMIC_VELOCITY (field_name, line_label) float64 64B dask.array<chunksize=(4, 2), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 64B dask.array<chunksize=(4, 2), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " is_ephemeris: False\n",
+ " type: field_and_source
- field_name: 4
- sky_dir_label: 2
- line_label: 2
field_id
(field_name)
int64
dask.array<chunksize=(4,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 32 B | \n",
+ " 32 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (4,) | \n",
+ " (4,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " int64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
field_name
(field_name)
<U32
'J0954+1743_2' ... 'J1331+3030_7'
array(['J0954+1743_2', 'IRC+10216_3', 'J1229+0203_5', 'J1331+3030_7'],\n",
+ " dtype='<U32')
line_label
(line_label)
<U21
'0' '1'
array(['0', '1'], dtype='<U21')
line_name
(field_name, line_label)
<U1
dask.array<chunksize=(4, 2), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 32 B | \n",
+ " 32 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (4, 2) | \n",
+ " (4, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
source_name
(field_name)
<U32
dask.array<chunksize=(4,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 512 B | \n",
+ " 512 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (4,) | \n",
+ " (4,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
FIELD_PHASE_CENTER
(field_name, sky_dir_label)
float64
dask.array<chunksize=(4, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 64 B | \n",
+ " 64 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (4, 2) | \n",
+ " (4, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
LINE_REST_FREQUENCY
(field_name, line_label)
float64
dask.array<chunksize=(4, 2), meta=np.ndarray>
- observer :
- lsrk
- type :
- spectral_coord
- units :
- ['Hz']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 64 B | \n",
+ " 64 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (4, 2) | \n",
+ " (4, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
LINE_SYSTEMIC_VELOCITY
(field_name, line_label)
float64
dask.array<chunksize=(4, 2), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 64 B | \n",
+ " 64 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (4, 2) | \n",
+ " (4, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(field_name, sky_dir_label)
float64
dask.array<chunksize=(4, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 64 B | \n",
+ " 64 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (4, 2) | \n",
+ " (4, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
- is_ephemeris :
- False
- type :
- field_and_source
"
+ ],
+ "text/plain": [
+ " Size: 2kB\n",
+ "Dimensions: (field_name: 4, sky_dir_label: 2, line_label: 2)\n",
+ "Coordinates:\n",
+ " field_id (field_name) int64 32B dask.array\n",
+ " * field_name (field_name) \n",
+ " source_name (field_name) \n",
+ "Dimensions without coordinates: sky_dir_label\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 64B dask.array\n",
+ " LINE_REST_FREQUENCY (field_name, line_label) float64 64B dask.array\n",
+ " LINE_SYSTEMIC_VELOCITY (field_name, line_label) float64 64B dask.array\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 64B dask.array\n",
+ "Attributes:\n",
+ " is_ephemeris: False\n",
+ " type: field_and_source"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps['day2_TDEM0003_10s_norx_0'].VISIBILITY.field_and_source_xds"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Antennae_North.cal.lsrk.split.ms Split Field"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:31,730\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID', 'FIELD_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:31,845\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Number of partitions: 12 \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:31,847\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [32 23 30 37], FIELD [0], SCAN [ 9 17 21 25] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:32,014\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [33 24 31], FIELD [1], SCAN [ 9 17 21] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:32,170\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [34 25 32], FIELD [2], SCAN [ 9 17 21] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:32,332\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [1], DDI [0], STATE [32 23 30 37], FIELD [0], SCAN [26 34 38 42] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:32,497\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [1], DDI [0], STATE [33 24 31], FIELD [1], SCAN [26 34 38] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:32,666\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [1], DDI [0], STATE [34 25 32], FIELD [2], SCAN [26 34 38] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:32,833\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [32], FIELD [0], SCAN [43] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:32,969\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [33], FIELD [1], SCAN [43] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:33,103\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [34], FIELD [2], SCAN [43] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:33,330\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [3], DDI [0], STATE [48 39 46 53], FIELD [0], SCAN [48 56 60 64] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:33,570\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [3], DDI [0], STATE [49 40 47], FIELD [1], SCAN [48 56 60] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:33,743\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [3], DDI [0], STATE [50 41 48], FIELD [2], SCAN [48 56 60] \n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " name | \n",
+ " intents | \n",
+ " shape | \n",
+ " polarization | \n",
+ " scan_name | \n",
+ " spw_name | \n",
+ " field_name | \n",
+ " source_name | \n",
+ " line_name | \n",
+ " field_coords | \n",
+ " start_frequency | \n",
+ " end_frequency | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 6 | \n",
+ " Antennae_North.cal.lsrk.split_00 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (20, 45, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [17, 21, 25, 9] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m52.43s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Antennae_North.cal.lsrk.split_01 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (15, 45, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [17, 21, 9] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_1] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m52.96s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " Antennae_North.cal.lsrk.split_02 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (15, 45, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [17, 21, 9] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_2] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m53.49s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Antennae_North.cal.lsrk.split_03 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (20, 55, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [26, 34, 38, 42] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m52.43s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " Antennae_North.cal.lsrk.split_04 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (15, 55, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [26, 34, 38] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_1] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m52.96s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " Antennae_North.cal.lsrk.split_05 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (15, 55, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [26, 34, 38] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_2] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m53.49s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " Antennae_North.cal.lsrk.split_06 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (5, 55, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [43] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m52.43s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " Antennae_North.cal.lsrk.split_07 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (5, 55, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [43] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_1] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m52.96s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " Antennae_North.cal.lsrk.split_08 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (5, 55, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [43] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_2] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m53.49s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " Antennae_North.cal.lsrk.split_09 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... | \n",
+ " (20, 77, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [48, 56, 60, 64] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m52.43s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Antennae_North.cal.lsrk.split_10 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... | \n",
+ " (15, 77, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [48, 56, 60] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_1] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m52.96s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Antennae_North.cal.lsrk.split_11 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... | \n",
+ " (15, 77, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [48, 56, 60] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_2] | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " [fk5, 12h01m53.49s, -18d52m02.92s] | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " name \\\n",
+ "6 Antennae_North.cal.lsrk.split_00 \n",
+ "4 Antennae_North.cal.lsrk.split_01 \n",
+ "11 Antennae_North.cal.lsrk.split_02 \n",
+ "1 Antennae_North.cal.lsrk.split_03 \n",
+ "5 Antennae_North.cal.lsrk.split_04 \n",
+ "8 Antennae_North.cal.lsrk.split_05 \n",
+ "7 Antennae_North.cal.lsrk.split_06 \n",
+ "10 Antennae_North.cal.lsrk.split_07 \n",
+ "0 Antennae_North.cal.lsrk.split_08 \n",
+ "9 Antennae_North.cal.lsrk.split_09 \n",
+ "3 Antennae_North.cal.lsrk.split_10 \n",
+ "2 Antennae_North.cal.lsrk.split_11 \n",
+ "\n",
+ " intents shape \\\n",
+ "6 [OBSERVE_TARGET#ON_SOURCE] (20, 45, 8, 2) \n",
+ "4 [OBSERVE_TARGET#ON_SOURCE] (15, 45, 8, 2) \n",
+ "11 [OBSERVE_TARGET#ON_SOURCE] (15, 45, 8, 2) \n",
+ "1 [OBSERVE_TARGET#ON_SOURCE] (20, 55, 8, 2) \n",
+ "5 [OBSERVE_TARGET#ON_SOURCE] (15, 55, 8, 2) \n",
+ "8 [OBSERVE_TARGET#ON_SOURCE] (15, 55, 8, 2) \n",
+ "7 [OBSERVE_TARGET#ON_SOURCE] (5, 55, 8, 2) \n",
+ "10 [OBSERVE_TARGET#ON_SOURCE] (5, 55, 8, 2) \n",
+ "0 [OBSERVE_TARGET#ON_SOURCE] (5, 55, 8, 2) \n",
+ "9 [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... (20, 77, 8, 2) \n",
+ "3 [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... (15, 77, 8, 2) \n",
+ "2 [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... (15, 77, 8, 2) \n",
+ "\n",
+ " polarization scan_name spw_name field_name \\\n",
+ "6 [XX, YY] [17, 21, 25, 9] spw_0 [NGC4038 - Antennae North_0] \n",
+ "4 [XX, YY] [17, 21, 9] spw_0 [NGC4038 - Antennae North_1] \n",
+ "11 [XX, YY] [17, 21, 9] spw_0 [NGC4038 - Antennae North_2] \n",
+ "1 [XX, YY] [26, 34, 38, 42] spw_0 [NGC4038 - Antennae North_0] \n",
+ "5 [XX, YY] [26, 34, 38] spw_0 [NGC4038 - Antennae North_1] \n",
+ "8 [XX, YY] [26, 34, 38] spw_0 [NGC4038 - Antennae North_2] \n",
+ "7 [XX, YY] [43] spw_0 [NGC4038 - Antennae North_0] \n",
+ "10 [XX, YY] [43] spw_0 [NGC4038 - Antennae North_1] \n",
+ "0 [XX, YY] [43] spw_0 [NGC4038 - Antennae North_2] \n",
+ "9 [XX, YY] [48, 56, 60, 64] spw_0 [NGC4038 - Antennae North_0] \n",
+ "3 [XX, YY] [48, 56, 60] spw_0 [NGC4038 - Antennae North_1] \n",
+ "2 [XX, YY] [48, 56, 60] spw_0 [NGC4038 - Antennae North_2] \n",
+ "\n",
+ " source_name line_name \\\n",
+ "6 [NGC4038 - Antennae North_0] [] \n",
+ "4 [NGC4038 - Antennae North_0] [] \n",
+ "11 [NGC4038 - Antennae North_0] [] \n",
+ "1 [NGC4038 - Antennae North_0] [] \n",
+ "5 [NGC4038 - Antennae North_0] [] \n",
+ "8 [NGC4038 - Antennae North_0] [] \n",
+ "7 [NGC4038 - Antennae North_0] [] \n",
+ "10 [NGC4038 - Antennae North_0] [] \n",
+ "0 [NGC4038 - Antennae North_0] [] \n",
+ "9 [NGC4038 - Antennae North_0] [] \n",
+ "3 [NGC4038 - Antennae North_0] [] \n",
+ "2 [NGC4038 - Antennae North_0] [] \n",
+ "\n",
+ " field_coords start_frequency end_frequency \n",
+ "6 [fk5, 12h01m52.43s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "4 [fk5, 12h01m52.96s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "11 [fk5, 12h01m53.49s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "1 [fk5, 12h01m52.43s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "5 [fk5, 12h01m52.96s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "8 [fk5, 12h01m53.49s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "7 [fk5, 12h01m52.43s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "10 [fk5, 12h01m52.96s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "0 [fk5, 12h01m53.49s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "9 [fk5, 12h01m52.43s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "3 [fk5, 12h01m52.96s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n",
+ "2 [fk5, 12h01m53.49s, -18d52m02.92s] 3.439281e+11 3.440067e+11 "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf \"Antennae_North.cal.lsrk.split.field_id.ps.zarr\"\n",
+ "\n",
+ "msv2_name = \"Antennae_North.cal.lsrk.split.ms\"\n",
+ "convert_out = \"Antennae_North.cal.lsrk.split.field_id.ps.zarr\"\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " parallel=False,\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 424B\n",
+ "Dimensions: (field_name: 1, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) <U46 184B 'NGC4038 - Antennae North_0'\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " source_name (field_name) <U46 184B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " type: field_and_source
- field_name: 1
- sky_dir_label: 2
field_name
(field_name)
<U46
'NGC4038 - Antennae North_0'
array(['NGC4038 - Antennae North_0'], dtype='<U46')
sky_dir_label
(sky_dir_label)
<U3
'ra' 'dec'
array(['ra', 'dec'], dtype='<U3')
source_name
(field_name)
<U46
dask.array<chunksize=(1,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 184 B | \n",
+ " 184 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1,) | \n",
+ " (1,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
FIELD_PHASE_CENTER
(field_name, sky_dir_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(field_name, sky_dir_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Size: 424B\n",
+ "Dimensions: (field_name: 1, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) \n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 16B dask.array\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 16B dask.array\n",
+ "Attributes:\n",
+ " type: field_and_source"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps['Antennae_North.cal.lsrk.split_00'].VISIBILITY.field_and_source_xds"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Antennae_North.cal.lsrk.split.ms"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:38,656\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:38,710\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Number of partitions: 4 \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:38,712\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [32 33 34 23 24 25 30 31 37], FIELD [0 1 2], SCAN [ 9 17 21 25] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:38,890\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [1], DDI [0], STATE [32 33 34 23 24 25 30 31 37], FIELD [0 1 2], SCAN [26 34 38 42] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:39,174\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [32 33 34], FIELD [0 1 2], SCAN [43] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:39,335\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [3], DDI [0], STATE [48 49 50 39 40 41 46 47 53], FIELD [0 1 2], SCAN [48 56 60 64] \n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " name | \n",
+ " intents | \n",
+ " shape | \n",
+ " polarization | \n",
+ " scan_name | \n",
+ " spw_name | \n",
+ " field_name | \n",
+ " source_name | \n",
+ " line_name | \n",
+ " field_coords | \n",
+ " start_frequency | \n",
+ " end_frequency | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Antennae_North.cal.lsrk.split_0 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (50, 45, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [17, 21, 25, 9] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_0, NGC4038 - Antenna... | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " Multi-Phase-Center | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Antennae_North.cal.lsrk.split_1 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (50, 55, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [26, 34, 38, 42] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_0, NGC4038 - Antenna... | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " Multi-Phase-Center | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Antennae_North.cal.lsrk.split_2 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (15, 55, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [43] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_0, NGC4038 - Antenna... | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " Multi-Phase-Center | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Antennae_North.cal.lsrk.split_3 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... | \n",
+ " (50, 77, 8, 2) | \n",
+ " [XX, YY] | \n",
+ " [48, 56, 60, 64] | \n",
+ " spw_0 | \n",
+ " [NGC4038 - Antennae North_0, NGC4038 - Antenna... | \n",
+ " [NGC4038 - Antennae North_0] | \n",
+ " [] | \n",
+ " Multi-Phase-Center | \n",
+ " 3.439281e+11 | \n",
+ " 3.440067e+11 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " name \\\n",
+ "0 Antennae_North.cal.lsrk.split_0 \n",
+ "1 Antennae_North.cal.lsrk.split_1 \n",
+ "3 Antennae_North.cal.lsrk.split_2 \n",
+ "2 Antennae_North.cal.lsrk.split_3 \n",
+ "\n",
+ " intents shape \\\n",
+ "0 [OBSERVE_TARGET#ON_SOURCE] (50, 45, 8, 2) \n",
+ "1 [OBSERVE_TARGET#ON_SOURCE] (50, 55, 8, 2) \n",
+ "3 [OBSERVE_TARGET#ON_SOURCE] (15, 55, 8, 2) \n",
+ "2 [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... (50, 77, 8, 2) \n",
+ "\n",
+ " polarization scan_name spw_name \\\n",
+ "0 [XX, YY] [17, 21, 25, 9] spw_0 \n",
+ "1 [XX, YY] [26, 34, 38, 42] spw_0 \n",
+ "3 [XX, YY] [43] spw_0 \n",
+ "2 [XX, YY] [48, 56, 60, 64] spw_0 \n",
+ "\n",
+ " field_name \\\n",
+ "0 [NGC4038 - Antennae North_0, NGC4038 - Antenna... \n",
+ "1 [NGC4038 - Antennae North_0, NGC4038 - Antenna... \n",
+ "3 [NGC4038 - Antennae North_0, NGC4038 - Antenna... \n",
+ "2 [NGC4038 - Antennae North_0, NGC4038 - Antenna... \n",
+ "\n",
+ " source_name line_name field_coords \\\n",
+ "0 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
+ "1 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
+ "3 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
+ "2 [NGC4038 - Antennae North_0] [] Multi-Phase-Center \n",
+ "\n",
+ " start_frequency end_frequency \n",
+ "0 3.439281e+11 3.440067e+11 \n",
+ "1 3.439281e+11 3.440067e+11 \n",
+ "3 3.439281e+11 3.440067e+11 \n",
+ "2 3.439281e+11 3.440067e+11 "
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf \"Antennae_North.cal.lsrk.split.ps.zarr\"\n",
+ "\n",
+ "msv2_name = \"Antennae_North.cal.lsrk.split.ms\"\n",
+ "convert_out = \"Antennae_North.cal.lsrk.split.ps.zarr\"\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " parallel=False,\n",
+ " partition_scheme=[]\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 1kB\n",
+ "Dimensions: (field_name: 3, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) <U46 552B 'NGC4038 - Antennae North_0' ....\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " source_name (field_name) <U46 552B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 48B dask.array<chunksize=(3, 2), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 48B dask.array<chunksize=(3, 2), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " type: field_and_source
- field_name: 3
- sky_dir_label: 2
field_name
(field_name)
<U46
'NGC4038 - Antennae North_0' ......
array(['NGC4038 - Antennae North_0', 'NGC4038 - Antennae North_1',\n",
+ " 'NGC4038 - Antennae North_2'], dtype='<U46')
sky_dir_label
(sky_dir_label)
<U3
'ra' 'dec'
array(['ra', 'dec'], dtype='<U3')
source_name
(field_name)
<U46
dask.array<chunksize=(3,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 552 B | \n",
+ " 552 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
FIELD_PHASE_CENTER
(field_name, sky_dir_label)
float64
dask.array<chunksize=(3, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 48 B | \n",
+ " 48 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3, 2) | \n",
+ " (3, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(field_name, sky_dir_label)
float64
dask.array<chunksize=(3, 2), meta=np.ndarray>
- frame :
- fk5
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 48 B | \n",
+ " 48 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3, 2) | \n",
+ " (3, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Size: 1kB\n",
+ "Dimensions: (field_name: 3, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) \n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 48B dask.array\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 48B dask.array\n",
+ "Attributes:\n",
+ " type: field_and_source"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps['Antennae_North.cal.lsrk.split_0'].VISIBILITY.field_and_source_xds"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# ALMA_uid___A002_X1003af4_X75a3.split Split Field"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:44,500\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID', 'FIELD_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:46,331\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Number of partitions: 96 \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:46,332\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:46,599\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:46,779\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:46,980\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:47,125\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:47,297\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [21 48 75], FIELD [3], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:47,494\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [22 49 76], FIELD [4], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:47,680\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [23 50 77], FIELD [5], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:47,861\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [24 51 78], FIELD [6], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:48,032\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [25 52 79], FIELD [7], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:48,222\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [26 53 80], FIELD [8], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:48,403\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [27 54 81], FIELD [9], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:48,607\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [28 55 82], FIELD [10], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:48,876\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [29 56 83], FIELD [11], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:49,145\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [30 57 84], FIELD [12], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:49,417\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [31 58 85], FIELD [13], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:49,624\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [32 59 86], FIELD [14], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:49,798\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [33 60 87], FIELD [15], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:49,997\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [34 61 88], FIELD [16], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:50,237\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [35 62 89], FIELD [17], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:50,468\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [36 63 90], FIELD [18], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:50,726\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [37 64 91], FIELD [19], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:50,941\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [38 65 92], FIELD [20], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:51,110\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [39 66 93], FIELD [21], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:51,278\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [40 67 94], FIELD [22], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:51,497\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [41 68 95], FIELD [23], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:51,796\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [42 69 96], FIELD [24], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:52,090\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [43 70 97], FIELD [25], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:52,300\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [44 71 98], FIELD [26], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:52,507\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [45 72], FIELD [27], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:52,677\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [46 73], FIELD [28], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:52,914\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [47 74], FIELD [29], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:53,196\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:53,377\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:53,588\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:53,773\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:53,924\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:54,107\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [21 48 75], FIELD [3], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:54,305\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [22 49 76], FIELD [4], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:54,500\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [23 50 77], FIELD [5], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:54,759\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [24 51 78], FIELD [6], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:54,974\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [25 52 79], FIELD [7], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:55,205\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [26 53 80], FIELD [8], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:55,469\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [27 54 81], FIELD [9], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:55,683\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [28 55 82], FIELD [10], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:55,875\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [29 56 83], FIELD [11], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:56,071\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [30 57 84], FIELD [12], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:56,291\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [31 58 85], FIELD [13], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:56,591\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [32 59 86], FIELD [14], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:56,768\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [33 60 87], FIELD [15], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:56,939\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [34 61 88], FIELD [16], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:57,118\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [35 62 89], FIELD [17], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:57,346\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [36 63 90], FIELD [18], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:57,603\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [37 64 91], FIELD [19], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:57,853\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [38 65 92], FIELD [20], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:58,037\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [39 66 93], FIELD [21], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:58,267\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [40 67 94], FIELD [22], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:58,448\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [41 68 95], FIELD [23], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:58,625\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [42 69 96], FIELD [24], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:58,787\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [43 70 97], FIELD [25], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:58,950\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [44 71 98], FIELD [26], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:59,120\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [45 72], FIELD [27], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:59,274\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [46 73], FIELD [28], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:59,452\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [47 74], FIELD [29], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:59,643\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:21:59,915\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:00,181\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:00,437\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:00,814\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:01,115\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [21 48 75], FIELD [3], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:01,374\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [22 49 76], FIELD [4], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:01,665\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [23 50 77], FIELD [5], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:01,940\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [24 51 78], FIELD [6], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:02,216\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [25 52 79], FIELD [7], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:02,502\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [26 53 80], FIELD [8], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:02,931\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [27 54 81], FIELD [9], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:03,314\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [28 55 82], FIELD [10], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:03,751\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [29 56 83], FIELD [11], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:04,085\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [30 57 84], FIELD [12], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:04,426\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [31 58 85], FIELD [13], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:04,808\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [32 59 86], FIELD [14], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:05,095\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [33 60 87], FIELD [15], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:05,523\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [34 61 88], FIELD [16], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:05,901\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [35 62 89], FIELD [17], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:06,328\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [36 63 90], FIELD [18], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:06,701\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [37 64 91], FIELD [19], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:07,019\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [38 65 92], FIELD [20], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:07,299\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [39 66 93], FIELD [21], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:07,625\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [40 67 94], FIELD [22], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:07,946\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [41 68 95], FIELD [23], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:08,377\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [42 69 96], FIELD [24], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:08,731\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [43 70 97], FIELD [25], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:09,012\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [44 71 98], FIELD [26], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:09,296\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [45 72], FIELD [27], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:09,590\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [46 73], FIELD [28], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:22:09,856\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [47 74], FIELD [29], SCAN [8] \n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " name | \n",
+ " intents | \n",
+ " shape | \n",
+ " polarization | \n",
+ " scan_name | \n",
+ " spw_name | \n",
+ " field_name | \n",
+ " source_name | \n",
+ " line_name | \n",
+ " field_coords | \n",
+ " start_frequency | \n",
+ " end_frequency | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 68 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_00 | \n",
+ " [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... | \n",
+ " (3, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_01 | \n",
+ " [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... | \n",
+ " (3, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_02 | \n",
+ " [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] | \n",
+ " (3, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 55 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_03 | \n",
+ " [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... | \n",
+ " (31, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [6] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [J1408-0752_2] | \n",
+ " [J1408-0752_2] | \n",
+ " [] | \n",
+ " [icrs, 14h08m56.48s, -7d52m26.67s] | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_04 | \n",
+ " [OBSERVE_TARGET#OFF_SOURCE] | \n",
+ " (14, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_91 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (9, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_25] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 50 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_92 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (9, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_26] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 41 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_93 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (6, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_27] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 38 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_94 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (6, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_28] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_95 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (6, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_29] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
96 rows × 12 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " name \\\n",
+ "68 ALMA_uid___A002_X1003af4_X75a3.split.avg_00 \n",
+ "14 ALMA_uid___A002_X1003af4_X75a3.split.avg_01 \n",
+ "17 ALMA_uid___A002_X1003af4_X75a3.split.avg_02 \n",
+ "55 ALMA_uid___A002_X1003af4_X75a3.split.avg_03 \n",
+ "28 ALMA_uid___A002_X1003af4_X75a3.split.avg_04 \n",
+ ".. ... \n",
+ "12 ALMA_uid___A002_X1003af4_X75a3.split.avg_91 \n",
+ "50 ALMA_uid___A002_X1003af4_X75a3.split.avg_92 \n",
+ "41 ALMA_uid___A002_X1003af4_X75a3.split.avg_93 \n",
+ "38 ALMA_uid___A002_X1003af4_X75a3.split.avg_94 \n",
+ "22 ALMA_uid___A002_X1003af4_X75a3.split.avg_95 \n",
+ "\n",
+ " intents shape \\\n",
+ "68 [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... (3, 51, 1, 2) \n",
+ "14 [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... (3, 51, 1, 2) \n",
+ "17 [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] (3, 51, 1, 2) \n",
+ "55 [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... (31, 51, 1, 2) \n",
+ "28 [OBSERVE_TARGET#OFF_SOURCE] (14, 51, 1, 2) \n",
+ ".. ... ... \n",
+ "12 [OBSERVE_TARGET#ON_SOURCE] (9, 1326, 7, 2) \n",
+ "50 [OBSERVE_TARGET#ON_SOURCE] (9, 1326, 7, 2) \n",
+ "41 [OBSERVE_TARGET#ON_SOURCE] (6, 1326, 7, 2) \n",
+ "38 [OBSERVE_TARGET#ON_SOURCE] (6, 1326, 7, 2) \n",
+ "22 [OBSERVE_TARGET#ON_SOURCE] (6, 1326, 7, 2) \n",
+ "\n",
+ " polarization scan_name spw_name \\\n",
+ "68 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "14 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "17 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "55 [XX, YY] [6] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "28 [XX, YY] [8] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ ".. ... ... ... \n",
+ "12 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "50 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "41 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "38 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "22 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "\n",
+ " field_name source_name line_name \\\n",
+ "68 [Sun_10_0] [Sun_10_0] [] \n",
+ "14 [Sun_10_0] [Sun_10_0] [] \n",
+ "17 [Sun_10_0] [Sun_10_0] [] \n",
+ "55 [J1408-0752_2] [J1408-0752_2] [] \n",
+ "28 [Sun_10_0] [Sun_10_0] [] \n",
+ ".. ... ... ... \n",
+ "12 [Sun_10_25] [Sun_10_0] [Single_Continuum(ID=0)] \n",
+ "50 [Sun_10_26] [Sun_10_0] [Single_Continuum(ID=0)] \n",
+ "41 [Sun_10_27] [Sun_10_0] [Single_Continuum(ID=0)] \n",
+ "38 [Sun_10_28] [Sun_10_0] [Single_Continuum(ID=0)] \n",
+ "22 [Sun_10_29] [Sun_10_0] [Single_Continuum(ID=0)] \n",
+ "\n",
+ " field_coords start_frequency end_frequency \n",
+ "68 Ephemeris 2.480000e+11 2.480000e+11 \n",
+ "14 Ephemeris 2.480000e+11 2.480000e+11 \n",
+ "17 Ephemeris 2.480000e+11 2.480000e+11 \n",
+ "55 [icrs, 14h08m56.48s, -7d52m26.67s] 2.480000e+11 2.480000e+11 \n",
+ "28 Ephemeris 2.480000e+11 2.480000e+11 \n",
+ ".. ... ... ... \n",
+ "12 Ephemeris 2.299609e+11 2.300547e+11 \n",
+ "50 Ephemeris 2.299609e+11 2.300547e+11 \n",
+ "41 Ephemeris 2.299609e+11 2.300547e+11 \n",
+ "38 Ephemeris 2.299609e+11 2.300547e+11 \n",
+ "22 Ephemeris 2.299609e+11 2.300547e+11 \n",
+ "\n",
+ "[96 rows x 12 columns]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf \"ALMA_uid___A002_X1003af4_X75a3.split.field_id.ps.zarr\"\n",
+ "\n",
+ "msv2_name = \"ALMA_uid___A002_X1003af4_X75a3.split.avg.ms\"\n",
+ "convert_out = \"ALMA_uid___A002_X1003af4_X75a3.split.field_id.ps.zarr\"\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " ephemeris_interpolate=True,\n",
+ " parallel=False,\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 1kB\n",
+ "Dimensions: (time: 3, sky_pos_label: 3,\n",
+ " ellipsoid_pos_label: 3, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) <U4 48B 'lon' ... 'dist'\n",
+ " field_name (time) <U28 336B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " * sky_pos_label (sky_pos_label) <U4 48B 'ra' 'dec' 'dist'\n",
+ " source_name (time) <U28 336B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " * time (time) float64 24B 1.667e+09 ... 1.667e+09\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (time, sky_pos_label) float64 72B dask.array<chunksize=(3, 3), meta=np.ndarray>\n",
+ " HELIOCENTRIC_RADIAL_VELOCITY (time) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " NORTH_POLE_ANGULAR_DISTANCE (time) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " NORTH_POLE_POSITION_ANGLE (time) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " OBSERVER_PHASE_ANGLE (time) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " OBSERVER_POSITION (ellipsoid_pos_label) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (time, sky_pos_label) float64 72B dask.array<chunksize=(3, 3), meta=np.ndarray>\n",
+ " SOURCE_RADIAL_VELOCITY (time) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " SUB_OBSERVER_DIRECTION (time, ellipsoid_pos_label) float64 72B dask.array<chunksize=(3, 3), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " type: field_and_source_ephemeris
- time: 3
- sky_pos_label: 3
- ellipsoid_pos_label: 3
- sky_dir_label: 2
ellipsoid_pos_label
(ellipsoid_pos_label)
<U4
'lon' 'lat' 'dist'
array(['lon', 'lat', 'dist'], dtype='<U4')
field_name
(time)
<U28
dask.array<chunksize=(3,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 336 B | \n",
+ " 336 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
sky_dir_label
(sky_dir_label)
<U3
'ra' 'dec'
array(['ra', 'dec'], dtype='<U3')
sky_pos_label
(sky_pos_label)
<U4
'ra' 'dec' 'dist'
array(['ra', 'dec', 'dist'], dtype='<U4')
source_name
(time)
<U28
dask.array<chunksize=(3,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 336 B | \n",
+ " 336 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
time
(time)
float64
1.667e+09 1.667e+09 1.667e+09
- format :
- unix
- scale :
- utc
- type :
- time
- units :
- ['s']
array([1.666705e+09, 1.666705e+09, 1.666705e+09])
FIELD_PHASE_CENTER
(time, sky_pos_label)
float64
dask.array<chunksize=(3, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 72 B | \n",
+ " 72 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3, 3) | \n",
+ " (3, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
HELIOCENTRIC_RADIAL_VELOCITY
(time)
float64
dask.array<chunksize=(3,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 24 B | \n",
+ " 24 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
NORTH_POLE_ANGULAR_DISTANCE
(time)
float64
dask.array<chunksize=(3,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 24 B | \n",
+ " 24 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
NORTH_POLE_POSITION_ANGLE
(time)
float64
dask.array<chunksize=(3,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 24 B | \n",
+ " 24 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
OBSERVER_PHASE_ANGLE
(time)
float64
dask.array<chunksize=(3,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 24 B | \n",
+ " 24 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
OBSERVER_POSITION
(ellipsoid_pos_label)
float64
dask.array<chunksize=(3,), meta=np.ndarray>
- coordinate_system :
- geocentric
- data :
- [0.0, 0.0, 0.0]
- frame :
- WGS84
- origin_object_name :
- Earth
- type :
- location
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 24 B | \n",
+ " 24 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(time, sky_pos_label)
float64
dask.array<chunksize=(3, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 72 B | \n",
+ " 72 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3, 3) | \n",
+ " (3, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_RADIAL_VELOCITY
(time)
float64
dask.array<chunksize=(3,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 24 B | \n",
+ " 24 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SUB_OBSERVER_DIRECTION
(time, ellipsoid_pos_label)
float64
dask.array<chunksize=(3, 3), meta=np.ndarray>
- coordinate_system :
- planetodetic
- frame :
- Undefined
- origin_object_name :
- Sun
- type :
- location
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 72 B | \n",
+ " 72 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3, 3) | \n",
+ " (3, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
PandasIndex
PandasIndex(Index(['lon', 'lat', 'dist'], dtype='object', name='ellipsoid_pos_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec'], dtype='object', name='sky_dir_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec', 'dist'], dtype='object', name='sky_pos_label'))
PandasIndex
PandasIndex(Index([1666704688.448, 1666704690.448, 1666704691.4639997], dtype='float64', name='time'))
- type :
- field_and_source_ephemeris
"
+ ],
+ "text/plain": [
+ " Size: 1kB\n",
+ "Dimensions: (time: 3, sky_pos_label: 3,\n",
+ " ellipsoid_pos_label: 3, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) \n",
+ " * sky_dir_label (sky_dir_label) \n",
+ " * time (time) float64 24B 1.667e+09 ... 1.667e+09\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (time, sky_pos_label) float64 72B dask.array\n",
+ " HELIOCENTRIC_RADIAL_VELOCITY (time) float64 24B dask.array\n",
+ " NORTH_POLE_ANGULAR_DISTANCE (time) float64 24B dask.array\n",
+ " NORTH_POLE_POSITION_ANGLE (time) float64 24B dask.array\n",
+ " OBSERVER_PHASE_ANGLE (time) float64 24B dask.array\n",
+ " OBSERVER_POSITION (ellipsoid_pos_label) float64 24B dask.array\n",
+ " SOURCE_LOCATION (time, sky_pos_label) float64 72B dask.array\n",
+ " SOURCE_RADIAL_VELOCITY (time) float64 24B dask.array\n",
+ " SUB_OBSERVER_DIRECTION (time, ellipsoid_pos_label) float64 72B dask.array\n",
+ "Attributes:\n",
+ " type: field_and_source_ephemeris"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps['ALMA_uid___A002_X1003af4_X75a3.split.avg_00'].VISIBILITY.field_and_source_xds"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# ALMA_uid___A002_X1003af4_X75a3.split"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:17,590\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:17,696\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Number of partitions: 18 \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:17,697\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:17,892\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:18,082\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:18,259\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:18,421\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:18,624\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n",
+ " 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68\n",
+ " 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92\n",
+ " 93 94 95 96 97 98], FIELD [ 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n",
+ " 27 28 29], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:18,901\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:19,178\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:19,411\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:19,595\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:19,726\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:19,882\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n",
+ " 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68\n",
+ " 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92\n",
+ " 93 94 95 96 97 98], FIELD [ 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n",
+ " 27 28 29], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:20,083\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:20,406\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:20,720\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:20,981\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:21,309\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:23:21,611\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n",
+ " 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68\n",
+ " 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92\n",
+ " 93 94 95 96 97 98], FIELD [ 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n",
+ " 27 28 29], SCAN [8] \n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " name | \n",
+ " intents | \n",
+ " shape | \n",
+ " polarization | \n",
+ " scan_name | \n",
+ " spw_name | \n",
+ " field_name | \n",
+ " source_name | \n",
+ " line_name | \n",
+ " field_coords | \n",
+ " start_frequency | \n",
+ " end_frequency | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 13 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_00 | \n",
+ " [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... | \n",
+ " (3, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_01 | \n",
+ " [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... | \n",
+ " (3, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_02 | \n",
+ " [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] | \n",
+ " (3, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_03 | \n",
+ " [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... | \n",
+ " (31, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [6] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [J1408-0752_2] | \n",
+ " [J1408-0752_2] | \n",
+ " [] | \n",
+ " [icrs, 14h08m56.48s, -7d52m26.67s] | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_04 | \n",
+ " [OBSERVE_TARGET#OFF_SOURCE] | \n",
+ " (14, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_05 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (312, 51, 1, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_4#SQLD_0 | \n",
+ " [Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S... | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 2.480000e+11 | \n",
+ " 2.480000e+11 | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_06 | \n",
+ " [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... | \n",
+ " (2, 51, 4, 1) | \n",
+ " [XX] | \n",
+ " [7] | \n",
+ " WVR#NOMINAL_1 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 1.845500e+11 | \n",
+ " 1.905500e+11 | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_07 | \n",
+ " [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... | \n",
+ " (2, 51, 4, 1) | \n",
+ " [XX] | \n",
+ " [7] | \n",
+ " WVR#NOMINAL_1 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 1.845500e+11 | \n",
+ " 1.905500e+11 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_08 | \n",
+ " [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] | \n",
+ " (2, 51, 4, 1) | \n",
+ " [XX] | \n",
+ " [7] | \n",
+ " WVR#NOMINAL_1 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 1.845500e+11 | \n",
+ " 1.905500e+11 | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_09 | \n",
+ " [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... | \n",
+ " (26, 51, 4, 1) | \n",
+ " [XX] | \n",
+ " [6] | \n",
+ " WVR#NOMINAL_1 | \n",
+ " [J1408-0752_2] | \n",
+ " [J1408-0752_2] | \n",
+ " [] | \n",
+ " [icrs, 14h08m56.48s, -7d52m26.67s] | \n",
+ " 1.845500e+11 | \n",
+ " 1.905500e+11 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_10 | \n",
+ " [OBSERVE_TARGET#OFF_SOURCE] | \n",
+ " (11, 51, 4, 1) | \n",
+ " [XX] | \n",
+ " [8] | \n",
+ " WVR#NOMINAL_1 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 1.845500e+11 | \n",
+ " 1.905500e+11 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_11 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (234, 51, 4, 1) | \n",
+ " [XX] | \n",
+ " [8] | \n",
+ " WVR#NOMINAL_1 | \n",
+ " [Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S... | \n",
+ " [Sun_10_0] | \n",
+ " [] | \n",
+ " Ephemeris | \n",
+ " 1.845500e+11 | \n",
+ " 1.905500e+11 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_12 | \n",
+ " [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... | \n",
+ " (2, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_13 | \n",
+ " [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... | \n",
+ " (2, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_14 | \n",
+ " [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] | \n",
+ " (2, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [7] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_15 | \n",
+ " [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... | \n",
+ " (30, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [6] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [J1408-0752_2] | \n",
+ " [J1408-0752_2] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " [icrs, 14h08m56.48s, -7d52m26.67s] | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_16 | \n",
+ " [OBSERVE_TARGET#OFF_SOURCE] | \n",
+ " (12, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_0] | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " ALMA_uid___A002_X1003af4_X75a3.split.avg_17 | \n",
+ " [OBSERVE_TARGET#ON_SOURCE] | \n",
+ " (234, 1326, 7, 2) | \n",
+ " [XX, YY] | \n",
+ " [8] | \n",
+ " X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 | \n",
+ " [Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S... | \n",
+ " [Sun_10_0] | \n",
+ " [Single_Continuum(ID=0)] | \n",
+ " Ephemeris | \n",
+ " 2.299609e+11 | \n",
+ " 2.300547e+11 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " name \\\n",
+ "13 ALMA_uid___A002_X1003af4_X75a3.split.avg_00 \n",
+ "4 ALMA_uid___A002_X1003af4_X75a3.split.avg_01 \n",
+ "5 ALMA_uid___A002_X1003af4_X75a3.split.avg_02 \n",
+ "9 ALMA_uid___A002_X1003af4_X75a3.split.avg_03 \n",
+ "6 ALMA_uid___A002_X1003af4_X75a3.split.avg_04 \n",
+ "10 ALMA_uid___A002_X1003af4_X75a3.split.avg_05 \n",
+ "8 ALMA_uid___A002_X1003af4_X75a3.split.avg_06 \n",
+ "0 ALMA_uid___A002_X1003af4_X75a3.split.avg_07 \n",
+ "3 ALMA_uid___A002_X1003af4_X75a3.split.avg_08 \n",
+ "11 ALMA_uid___A002_X1003af4_X75a3.split.avg_09 \n",
+ "16 ALMA_uid___A002_X1003af4_X75a3.split.avg_10 \n",
+ "7 ALMA_uid___A002_X1003af4_X75a3.split.avg_11 \n",
+ "1 ALMA_uid___A002_X1003af4_X75a3.split.avg_12 \n",
+ "2 ALMA_uid___A002_X1003af4_X75a3.split.avg_13 \n",
+ "14 ALMA_uid___A002_X1003af4_X75a3.split.avg_14 \n",
+ "12 ALMA_uid___A002_X1003af4_X75a3.split.avg_15 \n",
+ "17 ALMA_uid___A002_X1003af4_X75a3.split.avg_16 \n",
+ "15 ALMA_uid___A002_X1003af4_X75a3.split.avg_17 \n",
+ "\n",
+ " intents shape \\\n",
+ "13 [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... (3, 51, 1, 2) \n",
+ "4 [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... (3, 51, 1, 2) \n",
+ "5 [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] (3, 51, 1, 2) \n",
+ "9 [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... (31, 51, 1, 2) \n",
+ "6 [OBSERVE_TARGET#OFF_SOURCE] (14, 51, 1, 2) \n",
+ "10 [OBSERVE_TARGET#ON_SOURCE] (312, 51, 1, 2) \n",
+ "8 [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... (2, 51, 4, 1) \n",
+ "0 [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... (2, 51, 4, 1) \n",
+ "3 [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] (2, 51, 4, 1) \n",
+ "11 [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... (26, 51, 4, 1) \n",
+ "16 [OBSERVE_TARGET#OFF_SOURCE] (11, 51, 4, 1) \n",
+ "7 [OBSERVE_TARGET#ON_SOURCE] (234, 51, 4, 1) \n",
+ "1 [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... (2, 1326, 7, 2) \n",
+ "2 [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... (2, 1326, 7, 2) \n",
+ "14 [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] (2, 1326, 7, 2) \n",
+ "12 [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... (30, 1326, 7, 2) \n",
+ "17 [OBSERVE_TARGET#OFF_SOURCE] (12, 1326, 7, 2) \n",
+ "15 [OBSERVE_TARGET#ON_SOURCE] (234, 1326, 7, 2) \n",
+ "\n",
+ " polarization scan_name spw_name \\\n",
+ "13 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "4 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "5 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "9 [XX, YY] [6] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "6 [XX, YY] [8] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "10 [XX, YY] [8] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n",
+ "8 [XX] [7] WVR#NOMINAL_1 \n",
+ "0 [XX] [7] WVR#NOMINAL_1 \n",
+ "3 [XX] [7] WVR#NOMINAL_1 \n",
+ "11 [XX] [6] WVR#NOMINAL_1 \n",
+ "16 [XX] [8] WVR#NOMINAL_1 \n",
+ "7 [XX] [8] WVR#NOMINAL_1 \n",
+ "1 [XX, YY] [7] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "2 [XX, YY] [7] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "14 [XX, YY] [7] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "12 [XX, YY] [6] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "17 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "15 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n",
+ "\n",
+ " field_name source_name \\\n",
+ "13 [Sun_10_0] [Sun_10_0] \n",
+ "4 [Sun_10_0] [Sun_10_0] \n",
+ "5 [Sun_10_0] [Sun_10_0] \n",
+ "9 [J1408-0752_2] [J1408-0752_2] \n",
+ "6 [Sun_10_0] [Sun_10_0] \n",
+ "10 [Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S... [Sun_10_0] \n",
+ "8 [Sun_10_0] [Sun_10_0] \n",
+ "0 [Sun_10_0] [Sun_10_0] \n",
+ "3 [Sun_10_0] [Sun_10_0] \n",
+ "11 [J1408-0752_2] [J1408-0752_2] \n",
+ "16 [Sun_10_0] [Sun_10_0] \n",
+ "7 [Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S... [Sun_10_0] \n",
+ "1 [Sun_10_0] [Sun_10_0] \n",
+ "2 [Sun_10_0] [Sun_10_0] \n",
+ "14 [Sun_10_0] [Sun_10_0] \n",
+ "12 [J1408-0752_2] [J1408-0752_2] \n",
+ "17 [Sun_10_0] [Sun_10_0] \n",
+ "15 [Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S... [Sun_10_0] \n",
+ "\n",
+ " line_name field_coords \\\n",
+ "13 [] Ephemeris \n",
+ "4 [] Ephemeris \n",
+ "5 [] Ephemeris \n",
+ "9 [] [icrs, 14h08m56.48s, -7d52m26.67s] \n",
+ "6 [] Ephemeris \n",
+ "10 [] Ephemeris \n",
+ "8 [] Ephemeris \n",
+ "0 [] Ephemeris \n",
+ "3 [] Ephemeris \n",
+ "11 [] [icrs, 14h08m56.48s, -7d52m26.67s] \n",
+ "16 [] Ephemeris \n",
+ "7 [] Ephemeris \n",
+ "1 [Single_Continuum(ID=0)] Ephemeris \n",
+ "2 [Single_Continuum(ID=0)] Ephemeris \n",
+ "14 [Single_Continuum(ID=0)] Ephemeris \n",
+ "12 [Single_Continuum(ID=0)] [icrs, 14h08m56.48s, -7d52m26.67s] \n",
+ "17 [Single_Continuum(ID=0)] Ephemeris \n",
+ "15 [Single_Continuum(ID=0)] Ephemeris \n",
+ "\n",
+ " start_frequency end_frequency \n",
+ "13 2.480000e+11 2.480000e+11 \n",
+ "4 2.480000e+11 2.480000e+11 \n",
+ "5 2.480000e+11 2.480000e+11 \n",
+ "9 2.480000e+11 2.480000e+11 \n",
+ "6 2.480000e+11 2.480000e+11 \n",
+ "10 2.480000e+11 2.480000e+11 \n",
+ "8 1.845500e+11 1.905500e+11 \n",
+ "0 1.845500e+11 1.905500e+11 \n",
+ "3 1.845500e+11 1.905500e+11 \n",
+ "11 1.845500e+11 1.905500e+11 \n",
+ "16 1.845500e+11 1.905500e+11 \n",
+ "7 1.845500e+11 1.905500e+11 \n",
+ "1 2.299609e+11 2.300547e+11 \n",
+ "2 2.299609e+11 2.300547e+11 \n",
+ "14 2.299609e+11 2.300547e+11 \n",
+ "12 2.299609e+11 2.300547e+11 \n",
+ "17 2.299609e+11 2.300547e+11 \n",
+ "15 2.299609e+11 2.300547e+11 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf \"ALMA_uid___A002_X1003af4_X75a3.split.ps.zarr\"\n",
+ "\n",
+ "msv2_name = \"ALMA_uid___A002_X1003af4_X75a3.split.avg.ms\"\n",
+ "convert_out = \"ALMA_uid___A002_X1003af4_X75a3.split.ps.zarr\"\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " parallel=False,\n",
+ " partition_scheme=[]\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 312B\n",
+ "Dimensions: (field_name: 1, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) <U32 128B 'J1408-0752_2'\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " source_name (field_name) <U32 128B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 16B dask.array<chunksize=(1, 2), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " type: field_and_source
- field_name: 1
- sky_dir_label: 2
FIELD_PHASE_CENTER
(field_name, sky_dir_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(field_name, sky_dir_label)
float64
dask.array<chunksize=(1, 2), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (1, 2) | \n",
+ " (1, 2) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Size: 312B\n",
+ "Dimensions: (field_name: 1, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * field_name (field_name) \n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 16B dask.array\n",
+ " SOURCE_LOCATION (field_name, sky_dir_label) float64 16B dask.array\n",
+ "Attributes:\n",
+ " type: field_and_source"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps[\"ALMA_uid___A002_X1003af4_X75a3.split.avg_09\"].VISIBILITY.field_and_source_xds "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 1kB\n",
+ "Dimensions: (time: 3, sky_pos_label: 3,\n",
+ " time_ephemeris: 2, ellipsoid_pos_label: 3,\n",
+ " sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) <U4 48B 'lon' ... 'dist'\n",
+ " field_name (time) <U28 336B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " * sky_pos_label (sky_pos_label) <U4 48B 'ra' 'dec' 'dist'\n",
+ " source_name (time) <U28 336B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " * time (time) float64 24B 1.667e+09 ... 1.667e+09\n",
+ " * time_ephemeris (time_ephemeris) float64 16B 1.667e+09 1.66...\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (time, sky_pos_label) float64 72B dask.array<chunksize=(3, 3), meta=np.ndarray>\n",
+ " HELIOCENTRIC_RADIAL_VELOCITY (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " NORTH_POLE_ANGULAR_DISTANCE (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " NORTH_POLE_POSITION_ANGLE (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " OBSERVER_PHASE_ANGLE (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " OBSERVER_POSITION (ellipsoid_pos_label) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (time_ephemeris, sky_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
+ " SOURCE_RADIAL_VELOCITY (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " SUB_OBSERVER_DIRECTION (time_ephemeris, ellipsoid_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
+ "Attributes:\n",
+ " type: field_and_source_ephemeris
- time: 3
- sky_pos_label: 3
- time_ephemeris: 2
- ellipsoid_pos_label: 3
- sky_dir_label: 2
ellipsoid_pos_label
(ellipsoid_pos_label)
<U4
'lon' 'lat' 'dist'
array(['lon', 'lat', 'dist'], dtype='<U4')
field_name
(time)
<U28
dask.array<chunksize=(3,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 336 B | \n",
+ " 336 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
sky_dir_label
(sky_dir_label)
<U3
'ra' 'dec'
array(['ra', 'dec'], dtype='<U3')
sky_pos_label
(sky_pos_label)
<U4
'ra' 'dec' 'dist'
array(['ra', 'dec', 'dist'], dtype='<U4')
source_name
(time)
<U28
dask.array<chunksize=(3,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 336 B | \n",
+ " 336 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
time
(time)
float64
1.667e+09 1.667e+09 1.667e+09
- format :
- unix
- scale :
- utc
- type :
- time
- units :
- ['s']
array([1.666705e+09, 1.666705e+09, 1.666705e+09])
time_ephemeris
(time_ephemeris)
float64
1.667e+09 1.667e+09
- format :
- unix
- scale :
- utc
- type :
- time
- units :
- ['s']
array([1.666656e+09, 1.666742e+09])
FIELD_PHASE_CENTER
(time, sky_pos_label)
float64
dask.array<chunksize=(3, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 72 B | \n",
+ " 72 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3, 3) | \n",
+ " (3, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
HELIOCENTRIC_RADIAL_VELOCITY
(time_ephemeris)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2,) | \n",
+ " (2,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
NORTH_POLE_ANGULAR_DISTANCE
(time_ephemeris)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2,) | \n",
+ " (2,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
NORTH_POLE_POSITION_ANGLE
(time_ephemeris)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2,) | \n",
+ " (2,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
OBSERVER_PHASE_ANGLE
(time_ephemeris)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2,) | \n",
+ " (2,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
OBSERVER_POSITION
(ellipsoid_pos_label)
float64
dask.array<chunksize=(3,), meta=np.ndarray>
- coordinate_system :
- geocentric
- data :
- [0.0, 0.0, 0.0]
- frame :
- WGS84
- origin_object_name :
- Earth
- type :
- location
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 24 B | \n",
+ " 24 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(time_ephemeris, sky_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 48 B | \n",
+ " 48 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2, 3) | \n",
+ " (2, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_RADIAL_VELOCITY
(time_ephemeris)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 16 B | \n",
+ " 16 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2,) | \n",
+ " (2,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SUB_OBSERVER_DIRECTION
(time_ephemeris, ellipsoid_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- coordinate_system :
- planetodetic
- frame :
- Undefined
- origin_object_name :
- Sun
- type :
- location
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 48 B | \n",
+ " 48 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (2, 3) | \n",
+ " (2, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
PandasIndex
PandasIndex(Index(['lon', 'lat', 'dist'], dtype='object', name='ellipsoid_pos_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec'], dtype='object', name='sky_dir_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec', 'dist'], dtype='object', name='sky_pos_label'))
PandasIndex
PandasIndex(Index([1666704688.448, 1666704690.448, 1666704691.4639997], dtype='float64', name='time'))
PandasIndex
PandasIndex(Index([1666656000.0, 1666742400.0], dtype='float64', name='time_ephemeris'))
- type :
- field_and_source_ephemeris
"
+ ],
+ "text/plain": [
+ " Size: 1kB\n",
+ "Dimensions: (time: 3, sky_pos_label: 3,\n",
+ " time_ephemeris: 2, ellipsoid_pos_label: 3,\n",
+ " sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) \n",
+ " * sky_dir_label (sky_dir_label) \n",
+ " * time (time) float64 24B 1.667e+09 ... 1.667e+09\n",
+ " * time_ephemeris (time_ephemeris) float64 16B 1.667e+09 1.66...\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (time, sky_pos_label) float64 72B dask.array\n",
+ " HELIOCENTRIC_RADIAL_VELOCITY (time_ephemeris) float64 16B dask.array\n",
+ " NORTH_POLE_ANGULAR_DISTANCE (time_ephemeris) float64 16B dask.array\n",
+ " NORTH_POLE_POSITION_ANGLE (time_ephemeris) float64 16B dask.array\n",
+ " OBSERVER_PHASE_ANGLE (time_ephemeris) float64 16B dask.array\n",
+ " OBSERVER_POSITION (ellipsoid_pos_label) float64 24B dask.array\n",
+ " SOURCE_LOCATION (time_ephemeris, sky_pos_label) float64 48B dask.array\n",
+ " SOURCE_RADIAL_VELOCITY (time_ephemeris) float64 16B dask.array\n",
+ " SUB_OBSERVER_DIRECTION (time_ephemeris, ellipsoid_pos_label) float64 48B dask.array\n",
+ "Attributes:\n",
+ " type: field_and_source_ephemeris"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ps['ALMA_uid___A002_X1003af4_X75a3.split.avg_00'].VISIBILITY.field_and_source_xds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.DataArray 'OBSERVER_POSITION' (ellipsoid_pos_label: 3)> Size: 24B\n",
+ "dask.array<open_dataset-OBSERVER_POSITION, shape=(3,), dtype=float64, chunksize=(3,), chunktype=numpy.ndarray>\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) <U4 48B 'lon' 'lat' 'dist'\n",
+ "Attributes:\n",
+ " coordinate_system: geocentric\n",
+ " data: [0.0, 0.0, 0.0]\n",
+ " frame: WGS84\n",
+ " origin_object_name: Earth\n",
+ " type: location\n",
+ " units: ['rad', 'rad', 'm']
dask.array<chunksize=(3,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 24 B | \n",
+ " 24 B | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (3,) | \n",
+ " (3,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 1 chunks in 2 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
- coordinate_system :
- geocentric
- data :
- [0.0, 0.0, 0.0]
- frame :
- WGS84
- origin_object_name :
- Earth
- type :
- location
- units :
- ['rad', 'rad', 'm']
"
+ ],
+ "text/plain": [
+ " Size: 24B\n",
+ "dask.array\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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ZW5j9PPzyzS8UqVKyviMcVmy/3gepUuXtmh/6+7unmkbSX+i+fLly0qxYkmsebHPMBgMsLOzUy6fZhye8V688+fPIyIiwuJtzdL9RU774BeRmJgIFxcX5X1ebH/79+/HxIkTERISkulkUlxcXKbbtkTE4odRABaHFjMYDHBzc8OJEyeybXfixAmUKlUq2wNidr755hv07NkTf/75J7Zt24YhQ4Zg6tSpOHjwIEqXLo20tDRoNBps3rzZ7FO+Od1XmJPcbDz5If3X5dKlS2E0GjONz8uuB7JSvnx5i3auWT1lLSLK/zt16oQDBw5g1KhRqFGjBpycnJCWlobmzZub/JLu1KkTGjRogD/++APbtm3DzJkzMX36dKxduxYtWrRQ2s6cOTPL7nSyy72vry+OHTuGa9euwcPDI9vP9TzLsmRdZLesjz76KMsDy7NdQOTVE38vOp+sPvPzrotneXp6onfv3mjfvj18fHywbNkyfPnll7maR1bf59TUVLPDn3edpKWloVmzZll2tvuydaNi6fcyPz3vdlK8eHGkpKQgISHhuU5CPI+cYs2rfYYl6yQtLQ3VqlXDt99+a7bts/s3S7fpnPbBz+v69euIi4szOfHyotvfxYsX0bRpU/j6+uLbb7+Fh4cHtFotNm3ahO+++87sPGJjYzMV3tlhcZgL7733Hv773/9i3759Zp/4/Pvvv3H58mWTU/XPo1q1aqhWrRrGjRuHAwcO4K233sL8+fPx5ZdfomzZshAReHt757jDzU2h5+npibS0NJw/f175pQs8vck6NjZWuVk+v6Wf9XNxccn103jpn+HixYsmZxjOnj2bpzFa6v79+9i5cycmTZqECRMmKMPTf2U/y83NDZ988gk++eQT3L59G7Vq1cKUKVPQokULZb3o9frnekqxdevWWL58OX799VeMHTs227YvuqysmNse058qT01Nzbf+Pi2Vvo2fPXs205nrs2fPFth34FlFixZF2bJlcerUKQCmcT7rzJkzKFGihHJGqGjRomaf5rX0SkDJkiWh1+uVZWelbNmySExMzLccZvzMGc/kJCcnIzIyUllu+rZ76tSpLGPJzfcyt/vQrHKS8TO8KF9fXwBPn1p+nr7z0t28eTPTGeb0fk5z+0BTfu0zslrW8ePH0bRp0zw/mZHdPvh5LV26FAAQGBgIIG+2v7/++gtJSUlYv369yRnYrG67unHjBpKTk02O7TnhPYe5MGrUKNjb22PAgAGZuiKJiYnBwIED4eDgoNwzlFvx8fFISUkxGVatWjVYWVkp9xt16NAB1tbWmDRpUqZfmCJiEpejo6PFp6hbtmwJAJmeKkz/dfaiT/xaKjAwEHq9Hl999RWePHmSafydO3eynDb9Czxr1iyT4fnxV2Iskf4r+Nk8PRtPampqpjy5uLjA3d1dyXvt2rVRtmxZfP3110hMTMy0rOzWCwC8//77qFatGqZMmYKQkJBM4xMSEvD555/nybKy4ujomKlQsba2RseOHbFmzRqzBcjzLut51KlTBy4uLpg/f75JlxibN29GREREvn8Hjh8/bvaeoCtXruD06dPKDx43NzfUqFEDS5YsMVmfp06dwrZt25TvMvD0QBoXF2dyxePWrVtK7wM5sbKyQrt27fDXX3/h8OHDmcanb9udOnVCSEgItm7dmqlNbGxspv1abgUEBECr1WLWrFkm36eff/4ZcXFxSm5q1aoFb29vfP/995m2tfTpLP1eAlAKJ0v+QkXLli3xzz//mHy/Hjx4gIULF8LLy8ui+94s4e/vDwBm85EbKSkpJv22JicnY8GCBShZsqTydKul8mufYU6nTp1w48YN/Pe//8007tGjR3jw4EGu52nJPvh57Nq1C5MnT4a3tze6du0KIG+2P3PziIuLw+LFi83GkX4PqSU9i6TjmcNcKF++PJYsWYKuXbuiWrVqmf5Cyt27d7F8+fJM97xZateuXRg8eDA++OADVKhQASkpKVi6dKlyAAWe7uy//PJLjB07FpcvX0a7du1QpEgRREZG4o8//kD//v0xcuRIAE+/sL///juGDx+ON998E05OTmjdurXZZVevXh09evTAwoULERsbi0aNGuGff/7BkiVL0K5du0w3M+cXvV6PefPmoVu3bqhVqxY6d+6MkiVL4urVq9i4cSPeeust/Pjjj2anrVGjBoKCgjB37lzExcWhfv362Llzp0V9h+UHvV6vdHPy5MkTlCpVCtu2bcvUX2JCQgJKly6N999/X/mzdjt27MChQ4eUB3esrKzw008/oUWLFqhSpQp69eqFUqVK4caNG9i9ezf0ej3++uuvLGOxtbXF2rVrERAQgIYNG6JTp0546623YGtrq/wFjqJFi2LKlCkvvKys1K5dGzt27MC3334Ld3d3eHt7w8/PD9OmTcPu3bvh5+eHfv36oXLlyoiJicHRo0exY8cOxMTE5HpZz8PW1hbTp09Hr1690KhRIwQFBSld2Xh5eeHTTz/N1+Vv374dEydORJs2bVCvXj04OTnh0qVLWLRoEZKSkkz6ZJs5cyZatGgBf39/9OnTR+nKxmAwmLTr3LkzPvvsM7Rv3x5DhgxRuoWqUKGCxTe+f/XVV9i2bRsaNWqkdB1y69YtrFq1Cvv27YOzszNGjRqF9evX47333kPPnj1Ru3ZtPHjwACdPnsTq1atx+fLlHC9p3blzx+xl8/QD69ixYzFp0iQ0b94cbdq0wdmzZzF37ly8+eabSqfPVlZWmDdvHlq3bo0aNWqgV69ecHNzw5kzZxAeHo6tW7da/L0E/tcFyOeff47OnTvD1tYWrVu3Nns/55gxY7B8+XK0aNECQ4YMQbFixbBkyRJERkZizZo1edbBuo+PD6pWrYodO3Zk6nIGeHr2L2OfeulcXV3RrFkz5b27uzumT5+Oy5cvo0KFCvj9998RFhaGhQsX5vre9fzaZ5jTrVs3rFy5EgMHDsTu3bvx1ltvITU1FWfOnMHKlSuxdetWsw9PZceSfXBONm/ejDNnziAlJQXR0dHYtWsXtm/fDk9PT6xfv155yC0vtr93330XWq0WrVu3xoABA5CYmIj//ve/cHFxwa1btzLNZ/v27ShTpozl3dgA7MrmeZw4cUKCgoLEzc1NbG1txWg0SlBQkNkuCHLTlc2lS5ekd+/eUrZsWbGzs5NixYpJkyZNZMeOHZnmu2bNGnn77bfF0dFRHB0dxdfXVwYNGiRnz55V2iQmJkqXLl3E2dlZ6R4jO0+ePJFJkyaJt7e32NraioeHh4wdO1YeP35s0i63Xdlk1/bZrmzS7d69WwIDA8VgMIidnZ2ULVtWevbsKYcPH1bamOuO49GjRzJkyBApXry4ODo6SuvWreXatWu56spm5syZz93u2eVcv35d2rdvL87OzmIwGOSDDz6QmzdvmrRLSkqSUaNGSfXq1aVIkSLi6Ogo1atXl7lz52aa/7Fjx6RDhw5SvHhx0el04unpKZ06dZKdO3dmG3O6+/fvy4QJE6RatWri4OAgdnZ2UrVqVRk7dqzcunUr18tKz8GdO3dMpjWX1zNnzkjDhg3F3t5eAJh0TxEdHS2DBg0SDw8P5TvVtGlTWbhwodImq+9SdrLryiar+fz+++9Ss2ZN0el0UqxYMenatatcv37dpE1W23VWXbKYi+NZly5dkgkTJki9evXExcVFbGxspGTJktKqVSuTrqTS7dixQ9566y2xt7cXvV4vrVu3ltOnT2dqt23bNqlatapotVqpWLGi/Prrr1l2ZZNVVx5XrlyR7t27S8mSJUWn04mPj48MGjTIpHuThIQEGTt2rJQrV060Wq2UKFFC6tevL19//bXSNUpW0rtWMfdq2rSp0u7HH38UX19fsbW1FVdXV/n4448zdVkjIrJv3z5p1qyZ8n164403ZPbs2cp4S76X6SZPniylSpUSKysrk2362a5sREQuXrwo77//vjg7O4udnZ3UrVtXNmzYYNImq+0vfb+yePHibNeViMi3334rTk5OmbozyWodIkP3YSL/204PHz4s/v7+YmdnJ56envLjjz++UKwvss/IzXcqOTlZpk+fLlWqVBGdTidFixaV2rVry6RJkyQuLs5kfWS1TT/vPvhZ6fu69JdWqxWj0SjNmjWTH374QenWLqO82P7Wr18vb7zxhtjZ2YmXl5dMnz5dFi1alGm/m5qaKm5ubjJu3LgcP0tGmv+/koiIiEgF4uLi4OPjgxkzZph0/WKpxo0b4+7duzneS0rqt27dOnTp0gUXL16Em5ubxdPxnkMiIiIVMRgMGD16NGbOnFlgT1eTOk2fPh2DBw/OVWEIADxzSERE9BrhmUPKCc8cEhEREZGCZw6JiIiISMEzh0RERESkYHFIRERERAp2gq0iaWlpuHnzJooUKVLofwOZiIiILCMiSEhIgLu7e551iJ6fWByqyM2bNzP9UXEiIiJSh2vXrqF06dKFHUaOWByqSJEiRQA83bj0en0hR0NERESWiI+Ph4eHh3Icf9mxOFSR9EvJer2exSEREZHKqOWWsJf/wjcRERERFRgWh0RERESkYHFIRERERAoWh0RERESkYHFIRERERAoWh0RERESkYHFIRERERAoWh0RERESkYHFIRERERAr+hZTX3PqDVzFk3Unl/ax21dCmXplCjIhyizlUvwNn7qJLcKjy/reefqjvW6IQI6LcYg7VjfkzpRERKewgyDLx8fEwGAyIi4vLkz+f5zVmY5bjLk9r9cLzp/zHHKofc6h+zKG6FUT+8vr4nd94Wfk1ld2XwZLxVPiYQ/VjDtWPOVQ35s88FoevofUHr+ZpOyp4zKH6HThzN0/bUcFjDtWN+csai8PXUMb70/KiHRU85lD9Mt7flBftqOAxh+rG/GWNxSERERERKVgcEhEREZGCxeFraFa7annajgoec6h+v/X0y9N2VPCYQ3Vj/rLG4vA1ZGkfeOwr7+XFHKqfpX2ovc59rb3smEN1Y/6yxuLwNZVT303sm+vlxxyqH3OofsyhujF/5rETbBXJj040+dc11I85VD/+dQb1Yw7VLb/zp7ZOsFkcqojaNi4iIiJS3/Gbl5WJiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISKG64nDOnDnw8vKCnZ0d/Pz88M8//2TbftWqVfD19YWdnR2qVauGTZs2mYwXEUyYMAFubm6wt7dHQEAAzp8/b9ImJiYGXbt2hV6vh7OzM/r06YPExERl/OPHj9GzZ09Uq1YNNjY2aNeundlY9uzZg1q1akGn06FcuXIIDg5+rnVARERElF9UVRz+/vvvGD58OCZOnIijR4+ievXqCAwMxO3bt822P3DgAIKCgtCnTx8cO3YM7dq1Q7t27XDq1CmlzYwZMzBr1izMnz8foaGhcHR0RGBgIB4/fqy06dq1K8LDw7F9+3Zs2LABe/fuRf/+/ZXxqampsLe3x5AhQxAQEGA2lsjISLRq1QpNmjRBWFgYhg0bhr59+2Lr1q15tHaIiIiIXpxGRKSwg7CUn58f3nzzTfz4448AgLS0NHh4eOBf//oXxowZk6n9hx9+iAcPHmDDhg3KsHr16qFGjRqYP38+RATu7u4YMWIERo4cCQCIi4uDq6srgoOD0blzZ0RERKBy5co4dOgQ6tSpAwDYsmULWrZsievXr8Pd3d1kmT179kRsbCzWrVtnMvyzzz7Dxo0bTQrTzp07IzY2Flu2bLHo88fHx8NgMCAuLg56vd6iaYiIiKhwqe34rZozh8nJyThy5IjJmTkrKysEBAQgJCTE7DQhISGZzuQFBgYq7SMjIxEVFWXSxmAwwM/PT2kTEhICZ2dnpTAEgICAAFhZWSE0NNTi+HOKhYiIiOhlYFPYAVjq7t27SE1Nhaurq8lwV1dXnDlzxuw0UVFRZttHRUUp49OHZdfGxcXFZLyNjQ2KFSumtLFEVrHEx8fj0aNHsLe3zzRNUlISkpKSlPfx8fEWL4+IiIjoeajmzOHraOrUqTAYDMrLw8OjsEMiIiKiV5xqisMSJUrA2toa0dHRJsOjo6NhNBrNTmM0GrNtn/5vTm2efeAlJSUFMTExWS43N7Ho9XqzZw0BYOzYsYiLi1Ne165ds3h5RERERM9DNcWhVqtF7dq1sXPnTmVYWloadu7cCX9/f7PT+Pv7m7QHgO3btyvtvb29YTQaTdrEx8cjNDRUaePv74/Y2FgcOXJEabNr1y6kpaXBz8/P4vhzisUcnU4HvV5v8iIiIiLKT6q55xAAhg8fjh49eqBOnTqoW7cuvv/+ezx48AC9evUCAHTv3h2lSpXC1KlTAQBDhw5Fo0aN8M0336BVq1ZYsWIFDh8+jIULFwIANBoNhg0bhi+//BLly5eHt7c3xo8fD3d3d6WvwkqVKqF58+bo168f5s+fjydPnmDw4MHo3LmzyZPKp0+fRnJyMmJiYpCQkICwsDAAQI0aNQAAAwcOxI8//ojRo0ejd+/e2LVrF1auXImNGzcWzMojIiIisoSozOzZs6VMmTKi1Wqlbt26cvDgQWVco0aNpEePHibtV65cKRUqVBCtVitVqlSRjRs3moxPS0uT8ePHi6urq+h0OmnatKmcPXvWpM29e/ckKChInJycRK/XS69evSQhIcGkjaenpwDI9Mpo9+7dUqNGDdFqteLj4yOLFy/O1WePi4sTABIXF5er6YiIiKjwqO34rap+Dl93ausniYiIiNR3/FbNPYdERERElP9YHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlYHBIRERGRgsUhERERESlsCjsAovy2/uBVDFl3Unk/q101tKlXphAjotxiDtWN+VM/5vD1ohERKewgyDLx8fEwGAyIi4uDXq8v7HBUwWvM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4O/vj5MnT5oUntu3b4der0flypWVNhnnkd4mfR6W8Pb2htFoNJlPfHw8QkNDczUfIiIiovyminsOK1WqhObNm6Nfv374559/sH//fgwePBidO3eGu7s7AODGjRvw9fVVzgQaDAb06dMHw4cPx+7du3HkyBH06tUL/v7+qFevHgDg3XffReXKldGtWzccP34cW7duxbhx4zBo0CDljN3AgQNx6dIljB49GmfOnMHcuXOxcuVKfPrpp0p8iYmJCAsLQ1hYGICnD6CEhYXh6tWrAACNRoNhw4bhyy+/xPr163Hy5El0794d7u7uaNeuXQGtRSIiIiILFPbj0pa6d++eBAUFiZOTk+j1eunVq5ckJCQo4yMjIwWA7N69Wxn26NEj+eSTT6Ro0aLi4OAg7du3l1u3bpnM9/Lly9KiRQuxt7eXEiVKyIgRI+TJkycmbXbv3i01atQQrVYrPj4+snjx4kzjAWR69ejRQ2mTlpYm48ePF1dXV9HpdNK0aVM5e/ZsrtaB2h6FJyIiIvUdvzUiIoVXmlJuxMfHw2AwIC4uDnq9vrDDISIiIguo7fitisvKRERERFQwWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpWBwSERERkYLFIREREREpbAo7AKL8tv7gVQxZd1J5P6tdNbSpV6YQI6LcYg7VjflTP+bw9aIRESnsIMgy8fHxMBgMiIuLg16vL+xwVMFrzMYsx12e1qoAI6HnxRyqG/Onfszhi1Pb8ZuXlemVld0OzZLxVPiYQ3Vj/tSPOXw9sTikV9L6g1fztB0VPOZQ3Zg/9WMOX18sDumVlPHemLxoRwWPOVQ35k/9mMPXF4tDIiIiIlKwOCQiIiIiBYtDeiXNalctT9tRwWMO1Y35Uz/m8PXF4pBeSZb2v8V+ul5ezKG6MX/qxxy+vlgc0isrp/632D/Xy485VDfmT/2Yw9cTO8FWEbV1ovmyYM/+6sccqhvzp37M4YtR2/GbxaGKqG3jIiIiIvUdv3lZmYiIiIgULA6JiIiISMHi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y+QyelbKly+Pq1evYsWKFbh48SJmzZqFP/74w6TN0KFDsWjRIixevBjnzp3DxIkTER4enmlef//9Nxo0aKBcXiYidWJxSESvHBsbGwwePBgzZszAnDlzULlyZfj6+mZq1759e9y+fRubNm0yO5/y5cvj8OHD8PHxQadOnVC2bFn0798fTZo0QUhIiPKAiKWcnZ2xdu1avPPOO6hUqRLmz5+P5cuXK2faJk+ejPHjx2Pq1KmoVKkSmjdvjo0bN8Lb2xsAUKpUKUyaNAljxoyBq6srBg8enOWy+vbti2XLluUYU5s2bfDpp59i8ODBqFGjBg4cOIDx48ebtPnwww8xfvx4jB49GrVr18aVK1fw8ccfZ5rXihUr0K9fv9ysEiJ6CWkkL++2JiKil8KjR49QsWJF/P7778rTz/lp8+bNGDFiBE6cOAEbG97OTqRmPHNIRPQKsre3xy+//IK7d+8WyPIePHiAxYsXszAkegXwzCERERERKXjmkIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgULA6JiIiISMHikIiIiIgU/w/Y7/kDbji4HQAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 302kB\n",
+ "Dimensions: (time: 838, sky_pos_label: 3,\n",
+ " ellipsoid_pos_label: 3, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) <U4 48B 'lon' ... 'dist'\n",
+ " field_name (time) <U28 94kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " * sky_pos_label (sky_pos_label) <U4 48B 'ra' 'dec' 'dist'\n",
+ " source_name (time) <U28 94kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " * time (time) float64 7kB 1.667e+09 ... 1.667e+09\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (time, sky_pos_label) float64 20kB dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
+ " HELIOCENTRIC_RADIAL_VELOCITY (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " NORTH_POLE_ANGULAR_DISTANCE (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " NORTH_POLE_POSITION_ANGLE (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " OBSERVER_PHASE_ANGLE (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (time, sky_pos_label) float64 20kB dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
+ " SOURCE_RADIAL_VELOCITY (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " SUB_OBSERVER_DIRECTION (time, ellipsoid_pos_label) float64 20kB dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
+ " FIELD_OFFSET (time, sky_dir_label) float64 13kB 0.0 ... 0.0\n",
+ "Attributes:\n",
+ " type: field_and_source_ephemeris\n",
+ " center_field_name: Sun_10_0
- time: 838
- sky_pos_label: 3
- ellipsoid_pos_label: 3
- sky_dir_label: 2
ellipsoid_pos_label
(ellipsoid_pos_label)
<U4
'lon' 'lat' 'dist'
array(['lon', 'lat', 'dist'], dtype='<U4')
field_name
(time)
<U28
dask.array<chunksize=(2,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 91.66 kiB | \n",
+ " 34.12 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
sky_dir_label
(sky_dir_label)
<U3
'ra' 'dec'
array(['ra', 'dec'], dtype='<U3')
sky_pos_label
(sky_pos_label)
<U4
'ra' 'dec' 'dist'
array(['ra', 'dec', 'dist'], dtype='<U4')
source_name
(time)
<U28
dask.array<chunksize=(2,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 91.66 kiB | \n",
+ " 34.12 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
time
(time)
float64
1.667e+09 1.667e+09 ... 1.667e+09
- format :
- unix
- scale :
- utc
- type :
- time
- units :
- ['s']
array([1.666705e+09, 1.666705e+09, 1.666705e+09, ..., 1.666705e+09,\n",
+ " 1.666705e+09, 1.666705e+09])
FIELD_PHASE_CENTER
(time, sky_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 19.64 kiB | \n",
+ " 7.31 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838, 3) | \n",
+ " (312, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
HELIOCENTRIC_RADIAL_VELOCITY
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 91 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
NORTH_POLE_ANGULAR_DISTANCE
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 91 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
NORTH_POLE_POSITION_ANGLE
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 91 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
OBSERVER_PHASE_ANGLE
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 91 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(time, sky_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 19.64 kiB | \n",
+ " 7.31 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838, 3) | \n",
+ " (312, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 121 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_RADIAL_VELOCITY
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 91 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SUB_OBSERVER_DIRECTION
(time, ellipsoid_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- coordinate_system :
- planetodetic
- frame :
- Undefined
- origin_object_name :
- Sun
- type :
- location
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 19.64 kiB | \n",
+ " 7.31 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838, 3) | \n",
+ " (312, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 121 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
FIELD_OFFSET
(time, sky_dir_label)
float64
0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad']
array([[0., 0.],\n",
+ " [0., 0.],\n",
+ " [0., 0.],\n",
+ " ...,\n",
+ " [0., 0.],\n",
+ " [0., 0.],\n",
+ " [0., 0.]])
PandasIndex
PandasIndex(Index(['lon', 'lat', 'dist'], dtype='object', name='ellipsoid_pos_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec'], dtype='object', name='sky_dir_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec', 'dist'], dtype='object', name='sky_pos_label'))
PandasIndex
PandasIndex(Index([1666704693.8880005, 1666704696.1919994, 1666704688.6079998,\n",
+ " 1666704690.6240005, 1666704694.6560001, 1666704696.672,\n",
+ " 1666704699.6480007, 1666704701.9519997, 1666704694.4960003,\n",
+ " 1666704696.4960003,\n",
+ " ...\n",
+ " 1666704758.4960003, 1666704760.512, 1666704762.5279999,\n",
+ " 1666704764.5439997, 1666705389.552, 1666705391.5679998,\n",
+ " 1666705393.5840006, 1666705395.6000004, 1666705397.6160002,\n",
+ " 1666705399.632],\n",
+ " dtype='float64', name='time', length=838))
- type :
- field_and_source_ephemeris
- center_field_name :
- Sun_10_0
"
+ ],
+ "text/plain": [
+ " Size: 302kB\n",
+ "Dimensions: (time: 838, sky_pos_label: 3,\n",
+ " ellipsoid_pos_label: 3, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) \n",
+ " * sky_dir_label (sky_dir_label) \n",
+ " * time (time) float64 7kB 1.667e+09 ... 1.667e+09\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (time, sky_pos_label) float64 20kB dask.array\n",
+ " HELIOCENTRIC_RADIAL_VELOCITY (time) float64 7kB dask.array\n",
+ " NORTH_POLE_ANGULAR_DISTANCE (time) float64 7kB dask.array\n",
+ " NORTH_POLE_POSITION_ANGLE (time) float64 7kB dask.array\n",
+ " OBSERVER_PHASE_ANGLE (time) float64 7kB dask.array\n",
+ " SOURCE_LOCATION (time, sky_pos_label) float64 20kB dask.array\n",
+ " SOURCE_RADIAL_VELOCITY (time) float64 7kB dask.array\n",
+ " SUB_OBSERVER_DIRECTION (time, ellipsoid_pos_label) float64 20kB dask.array\n",
+ " FIELD_OFFSET (time, sky_dir_label) float64 13kB 0.0 ... 0.0\n",
+ "Attributes:\n",
+ " type: field_and_source_ephemeris\n",
+ " center_field_name: Sun_10_0"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import open_processing_set\n",
+ "convert_out = \"ALMA_uid___A002_X1003af4_X75a3.split.ps.zarr\"\n",
+ "ps = open_processing_set(convert_out)\n",
+ "\n",
+ "ps.plot_phase_centers()\n",
+ "ps.get_combined_field_and_source_xds_ephemeris()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# ALMA_uid___A002_X1003af4_X75a3.split.avg.ms interpolate"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:06,352\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:06,468\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Number of partitions: 18 \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:06,469\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:06,684\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:06,875\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:07,054\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:07,224\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:07,417\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n",
+ " 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68\n",
+ " 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92\n",
+ " 93 94 95 96 97 98], FIELD [ 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n",
+ " 27 28 29], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:07,641\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:07,824\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:08,003\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:08,182\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:08,401\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:08,646\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [1], STATE [21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n",
+ " 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68\n",
+ " 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92\n",
+ " 93 94 95 96 97 98], FIELD [ 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n",
+ " 27 28 29], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:08,866\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [0], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:09,134\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [16], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:09,412\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [17], FIELD [0], SCAN [7] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:09,680\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [19], FIELD [2], SCAN [6] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:10,070\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [20 99], FIELD [0], SCAN [8] \n",
+ "[\u001b[38;2;128;05;128m2025-02-03 15:24:10,516\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44\n",
+ " 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68\n",
+ " 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92\n",
+ " 93 94 95 96 97 98], FIELD [ 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\n",
+ " 27 28 29], SCAN [8] \n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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/RhDdWP8zGNy+AJas+9igbajoscYqt/ekzcLtB0VPcZQ3Ri/3DE5fAE9en9aQbSjoscYqt+j9zcVRDsqeoyhujF+uWNySEREREQKJodEREREpGBy+AKa3q5WgbajoscYqt/ingEF2o6KHmOoboxf7pgcvoAsHQOPY+U9uxhD9bN0DLUXeay1Zx1jqG6MX+6YHL6g8hu7iWNzPfsYQ/VjDNWPMVQ3xs88DoKtIoUxiCZ/XUP9GEP1468zqB9jqG6FHT+1DYLN5FBF1LZxERERkfqO37ysTEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQKJodEREREpGBySEREREQK1SWHM2fOhI+PDxwcHBAQEIC///47z/YrVqyAv78/HBwcUKtWLaxfv96kXkQwYcIEeHh4wNHREcHBwThz5oxJm4SEBHTt2hV6vR6urq7o06cPUlNTlfr79++jZ8+eqFWrFuzs7NCuXTuzfdmxYwfq1asHnU6HSpUqITw8/InWAREREVFhUVVyuGzZMgwfPhxhYWE4dOgQateujZCQEFy/ft1s+7179yI0NBR9+vTB4cOH0a5dO7Rr1w7Hjx9X2kydOhXTp0/H7NmzERkZCWdnZ4SEhOD+/ftKm65duyI6OhqbN2/G2rVrsXPnTvTv31+pz8zMhKOjI4YMGYLg4GCzfYmNjUWrVq3w+uuvIyoqCsOGDUPfvn2xcePGAlo7RERERE9PIyJS3J2wVEBAAF5++WX88MMPAICsrCx4eXnhX//6F8aMGZOj/XvvvYc7d+5g7dq1SlmjRo1Qp04dzJ49GyICT09PjBgxAiNHjgQAJCUlwd3dHeHh4ejcuTNiYmJQvXp17N+/Hw0aNAAAbNiwAW+99RYuX74MT09Pk2X27NkTiYmJWL16tUn5xx9/jHXr1pkkpp07d0ZiYiI2bNhg0edPTk6GwWBAUlIS9Hq9RdMQERFR8VLb8Vs1Zw7T09Nx8OBBkzNzNjY2CA4ORkREhNlpIiIicpzJCwkJUdrHxsYiLi7O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eZ+cnAwvL69c50lERET0tIr1nsOyZcvC398/z5dWq0VgYCASExNx8OBBZdpt27YhKytLSbIeV79+fdjb22Pr1q1K2alTp3Dx4kUEBgYCAAIDA3Hs2DGTxHPz5s3Q6/WoXr260ubReWS3yZ6HVqtF/fr1TdpkZWVh69atShtzoqKiAAAeHh65ttHpdNDr9SYvIiIiokJV3E/EWKpFixZSt25diYyMlN27d0vlypUlNDRUqb98+bJUrVpVIiMjlbKBAwdKhQoVZNu2bXLgwAEJDAyUwMBApT4jI0Nq1qwpb775pkRFRcmGDRukbNmyMnbsWKXNuXPnxMnJSUaNGiUxMTEyc+ZMsbW1lQ0bNihtli5dKjqdTsLDw+XEiRPSv39/cXV1VZ6C/ueff+Q///mPHDhwQGJjY+WPP/4QPz8/adq0qVXrQG1POxEREZH6jt+qSQ5v3boloaGh4uLiInq9Xnr16iUpKSlKfWxsrACQ7du3K2X37t2TDz/8UEqWLClOTk7Svn17uXbtmsl8z58/Ly1bthRHR0cpU6aMjBgxQh48eGDSZvv27VKnTh3RarXi5+cn8+fPz9G/GTNmSIUKFUSr1UrDhg1l3759St3FixeladOmUqpUKdHpdFKpUiUZNWqU1RuJ2jYuIiIiUt/xWyMiUqynLsliycnJMBgMSEpK4iVmIiIilVDb8VsV4xwSERERUdFgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKSwK+4OUPFas+8ihqw+pryf3q4W2jSqUIw9ImsxhurHGKofY6hujJ8pjYhIcXeCLJOcnAyDwYCkpCTo9fqnnp/PmHW51p2f3Oqp50+FjzFUP8ZQ/RhDdSuK+BX08buw8bLyCyqvL4Ml9VT8GEP1YwzVjzFUN8bPPCaHL6A1+y4WaDsqeoyh+jGG6scYqhvjlzsmhy+gR++rKIh2VPQYQ/VjDNWPMVQ3xi93TA6JiIiISMHkkIiIiIgUTA5fQNPb1SrQdlT0GEP1YwzVjzFUN8Yvd0wOX0CWjt30Io/x9KxjDNWPMVQ/xlDdGL/cMTl8QeU3dhPH5nr2MYbqxxiqH2OoboyfeRwEW0UKYxBNjgqvfoyh+jGG6scYqlthx09tg2AzOVQRtW1cREREpL7jNy8rExEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZGCySERERERKZgcEhEREZFCNclhQkICunbtCr1eD1dXV/Tp0wepqal5TnP//n0MGjQIpUuXhouLCzp27Ij4+HiTNhcvXkSrVq3g5OQENzc3jBo1ChkZGSZtduzYgXr16kGn06FSpUoIDw83qd+5cydat24NT09PaDQarF69OkdfRAQTJkyAh4cHHB0dERwcjDNnzjzRuiAiIiIqLKpJDrt27Yro6Ghs3rwZa9euxc6dO9G/f/88p/noo4/w559/YsWKFfi///s/XL16FR06dFDqMzMz0apVK6Snp2Pv3r1YsGABwsPDMWHCBKVNbGwsWrVqhddffx1RUVEYNmwY+vbti40bNypt7ty5g9q1a2PmzJm59mXq1KmYPn06Zs+ejcjISDg7OyMkJAT3799/irVCREREVMBEBU6cOCEAZP/+/UrZX3/9JRqNRq5cuWJ2msTERLG3t5cVK1YoZTExMQJAIiIiRERk/fr1YmNjI3FxcUqbWbNmiV6vl7S0NBERGT16tNSoUcNk3u+9956EhISYXS4A+f33303KsrKyxGg0yrRp00z6p9PpZMmSJRasgYeSkpIEgCQlJVk8DRERERUvtR2/VXHmMCIiAq6urmjQoIFSFhwcDBsbG0RGRpqd5uDBg3jw4AGCg4OVMn9/f1SoUAERERHKfGvVqgV3d3elTUhICJKTkxEdHa20eXQe2W2y52GJ2NhYxMXFmczHYDAgICAgz/mkpaUhOTnZ5EVERERUmFSRHMbFxcHNzc2kzM7ODqVKlUJcXFyu02i1Wri6upqUu7u7K9PExcWZJIbZ9dl1ebVJTk7GvXv3LO7/o/M21xdzJk2aBIPBoLy8vLwsWh4RERHRkyrW5HDMmDHQaDR5vk6ePFmcXSxWY8eORVJSkvK6dOlScXeJiIiInnN2xbnwESNGoGfPnnm28fPzg9FoxPXr103KMzIykJCQAKPRaHY6o9GI9PR0JCYmmpw9jI+PV6YxGo34+++/TabLfpr50TaPP+EcHx8PvV4PR0fHfD/jo/OKj4+Hh4eHyXzq1KmT63Q6nQ46nc6iZRAREREVhGI9c1i2bFn4+/vn+dJqtQgMDERiYiIOHjyoTLtt2zZkZWUhICDA7Lzr168Pe3t7bN26VSk7deoULl68iMDAQABAYGAgjh07ZpJ4bt68GXq9HtWrV1faPDqP7DbZ87CEr68vjEajyXySk5MRGRlp1XyIiIiICpsq7jmsVq0aWrRogX79+uHvv//Gnj17MHjwYHTu3Bmenp4AgCtXrsDf3185E2gwGNCnTx8MHz4c27dvx8GDB9GrVy8EBgaiUaNGAIA333wT1atXR7du3XDkyBFs3LgR48aNw6BBg5QzdgMHDsS5c+cwevRonDx5Ej/++COWL1+Ojz76SOlfamoqoqKiEBUVBeDhAyhRUVG4ePEiAECj0WDYsGH4/PPPsWbNGhw7dgzdu3eHp6cn2rVrV0RrkYiIiMgCxf24tKVu3boloaGh4uLiInq9Xnr16iUpKSlKfWxsrACQ7du3K2X37t2TDz/8UEqWLClOTk7Svn17uXbtmsl8z58/Ly1bthRHR0cpU6aMjBgxQh48eGDSZvv27VKnTh3RarXi5+cn8+fPz1EPIMerR48eSpusrCwZP368uLu7i06nk2bNmsmpU6esWgdqexSeiIiI1Hf81oiIFF9qStZITk6GwWBAUlIS9Hp9cXeHiIiILKC247cqLisTERERUdFgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKRgckhERERECiaHRERERKSwK+4OEBW2NfsuYsjqY8r76e1qoU2jCsXYI7IWY6hujJ/6MYYvFo2ISHF3giyTnJwMg8GApKQk6PX64u6OKviMWZdr3fnJrYqwJ/SkGEN1Y/zUjzF8emo7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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
<xarray.Dataset> Size: 302kB\n",
+ "Dimensions: (time: 838, sky_pos_label: 3,\n",
+ " ellipsoid_pos_label: 3, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) <U4 48B 'lon' ... 'dist'\n",
+ " field_name (time) <U28 94kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
+ " * sky_pos_label (sky_pos_label) <U4 48B 'ra' 'dec' 'dist'\n",
+ " source_name (time) <U28 94kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " * time (time) float64 7kB 1.667e+09 ... 1.667e+09\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (time, sky_pos_label) float64 20kB dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
+ " HELIOCENTRIC_RADIAL_VELOCITY (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " NORTH_POLE_ANGULAR_DISTANCE (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " NORTH_POLE_POSITION_ANGLE (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " OBSERVER_PHASE_ANGLE (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " SOURCE_LOCATION (time, sky_pos_label) float64 20kB dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
+ " SOURCE_RADIAL_VELOCITY (time) float64 7kB dask.array<chunksize=(2,), meta=np.ndarray>\n",
+ " SUB_OBSERVER_DIRECTION (time, ellipsoid_pos_label) float64 20kB dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
+ " FIELD_OFFSET (time, sky_dir_label) float64 13kB 0.0 ... 0.0\n",
+ "Attributes:\n",
+ " type: field_and_source_ephemeris\n",
+ " center_field_name: Sun_10_0
- time: 838
- sky_pos_label: 3
- ellipsoid_pos_label: 3
- sky_dir_label: 2
ellipsoid_pos_label
(ellipsoid_pos_label)
<U4
'lon' 'lat' 'dist'
array(['lon', 'lat', 'dist'], dtype='<U4')
field_name
(time)
<U28
dask.array<chunksize=(2,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 91.66 kiB | \n",
+ " 34.12 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
sky_dir_label
(sky_dir_label)
<U3
'ra' 'dec'
array(['ra', 'dec'], dtype='<U3')
sky_pos_label
(sky_pos_label)
<U4
'ra' 'dec' 'dist'
array(['ra', 'dec', 'dist'], dtype='<U4')
source_name
(time)
<U28
dask.array<chunksize=(2,), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 91.66 kiB | \n",
+ " 34.12 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
time
(time)
float64
1.667e+09 1.667e+09 ... 1.667e+09
- format :
- unix
- scale :
- utc
- type :
- time
- units :
- ['s']
array([1.666705e+09, 1.666705e+09, 1.666705e+09, ..., 1.666705e+09,\n",
+ " 1.666705e+09, 1.666705e+09])
FIELD_PHASE_CENTER
(time, sky_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 19.64 kiB | \n",
+ " 7.31 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838, 3) | \n",
+ " (312, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
HELIOCENTRIC_RADIAL_VELOCITY
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
NORTH_POLE_ANGULAR_DISTANCE
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
NORTH_POLE_POSITION_ANGLE
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
OBSERVER_PHASE_ANGLE
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_LOCATION
(time, sky_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 19.64 kiB | \n",
+ " 7.31 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838, 3) | \n",
+ " (312, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SOURCE_RADIAL_VELOCITY
(time)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 6.55 kiB | \n",
+ " 2.44 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838,) | \n",
+ " (312,) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
SUB_OBSERVER_DIRECTION
(time, ellipsoid_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- coordinate_system :
- planetodetic
- frame :
- Undefined
- origin_object_name :
- Sun
- type :
- location
- units :
- ['rad', 'rad', 'm']
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " Array | \n",
+ " Chunk | \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes | \n",
+ " 19.64 kiB | \n",
+ " 7.31 kiB | \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape | \n",
+ " (838, 3) | \n",
+ " (312, 3) | \n",
+ " \n",
+ " \n",
+ " Dask graph | \n",
+ " 15 chunks in 44 graph layers | \n",
+ " \n",
+ " \n",
+ " Data type | \n",
+ " float64 numpy.ndarray | \n",
+ " \n",
+ " \n",
+ " \n",
+ " | \n",
+ " \n",
+ " \n",
+ " | \n",
+ "
\n",
+ "
FIELD_OFFSET
(time, sky_dir_label)
float64
0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad']
array([[0., 0.],\n",
+ " [0., 0.],\n",
+ " [0., 0.],\n",
+ " ...,\n",
+ " [0., 0.],\n",
+ " [0., 0.],\n",
+ " [0., 0.]])
PandasIndex
PandasIndex(Index(['lon', 'lat', 'dist'], dtype='object', name='ellipsoid_pos_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec'], dtype='object', name='sky_dir_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec', 'dist'], dtype='object', name='sky_pos_label'))
PandasIndex
PandasIndex(Index([1666704693.8880005, 1666704696.1919994, 1666704688.6079998,\n",
+ " 1666704690.6240005, 1666704694.6560001, 1666704696.672,\n",
+ " 1666704699.6480007, 1666704701.9519997, 1666704694.4960003,\n",
+ " 1666704696.4960003,\n",
+ " ...\n",
+ " 1666704758.4960003, 1666704760.512, 1666704762.5279999,\n",
+ " 1666704764.5439997, 1666705389.552, 1666705391.5679998,\n",
+ " 1666705393.5840006, 1666705395.6000004, 1666705397.6160002,\n",
+ " 1666705399.632],\n",
+ " dtype='float64', name='time', length=838))
- type :
- field_and_source_ephemeris
- center_field_name :
- Sun_10_0
"
+ ],
+ "text/plain": [
+ " Size: 302kB\n",
+ "Dimensions: (time: 838, sky_pos_label: 3,\n",
+ " ellipsoid_pos_label: 3, sky_dir_label: 2)\n",
+ "Coordinates:\n",
+ " * ellipsoid_pos_label (ellipsoid_pos_label) \n",
+ " * sky_dir_label (sky_dir_label) \n",
+ " * time (time) float64 7kB 1.667e+09 ... 1.667e+09\n",
+ "Data variables:\n",
+ " FIELD_PHASE_CENTER (time, sky_pos_label) float64 20kB dask.array\n",
+ " HELIOCENTRIC_RADIAL_VELOCITY (time) float64 7kB dask.array\n",
+ " NORTH_POLE_ANGULAR_DISTANCE (time) float64 7kB dask.array\n",
+ " NORTH_POLE_POSITION_ANGLE (time) float64 7kB dask.array\n",
+ " OBSERVER_PHASE_ANGLE (time) float64 7kB dask.array\n",
+ " SOURCE_LOCATION (time, sky_pos_label) float64 20kB dask.array\n",
+ " SOURCE_RADIAL_VELOCITY (time) float64 7kB dask.array\n",
+ " SUB_OBSERVER_DIRECTION (time, ellipsoid_pos_label) float64 20kB dask.array\n",
+ " FIELD_OFFSET (time, sky_dir_label) float64 13kB 0.0 ... 0.0\n",
+ "Attributes:\n",
+ " type: field_and_source_ephemeris\n",
+ " center_field_name: Sun_10_0"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from xradio.measurement_set import convert_msv2_to_processing_set\n",
+ "\n",
+ "!rm -rf \"ALMA_uid___A002_X1003af4_X75a3.split.interpolate_ephemeris.ps.zarr\"\n",
+ "\n",
+ "msv2_name = \"ALMA_uid___A002_X1003af4_X75a3.split.avg.ms\"\n",
+ "convert_out = \"ALMA_uid___A002_X1003af4_X75a3.split.interpolate_ephemeris.ps.zarr\"\n",
+ "\n",
+ "convert_msv2_to_processing_set(\n",
+ " in_file=msv2_name,\n",
+ " out_file=convert_out,\n",
+ " overwrite=True,\n",
+ " parallel=False,\n",
+ " ephemeris_interpolate=True,\n",
+ " partition_scheme=[]\n",
+ ")\n",
+ "\n",
+ "from xradio.measurement_set import open_processing_set\n",
+ "ps = open_processing_set(convert_out)\n",
+ "ps.sel(intents='OBSERVE_TARGET#ON_SOURCE').plot_phase_centers()\n",
+ "ps.get_combined_field_and_source_xds_ephemeris()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.3"
+ },
+ "widgets": {
+ "application/vnd.jupyter.widget-state+json": {
+ "state": {
+ "0d363ac171e5416e9e32c39dc3f33c9d": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "1d98195c39934260b049fbb3075c5c11": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "layout": "IPY_MODEL_a52cc95ef767415eb7c1fe264d50e264",
+ "style": "IPY_MODEL_5001cf41b07541a39b99a9cf7e5c79aa",
+ "value": " 28.2M/28.2M [00:05<00:00, 14.2MiB/s]"
+ }
+ },
+ "1f71c548ef1b4ccc91dd9a2a3a044dcc": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "2285c5102d4842c3a3a8e0fc13c87356": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "2cfc381f1cbe4841a7d4ad9d5a01bab2": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "2d30bf221b414a53b6f54bbd1e0524f5": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLStyleModel",
+ "state": {
+ "description_width": "",
+ "font_size": null,
+ "text_color": null
+ }
+ },
+ "32ddaa198b3640528b477725eed47b2a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "layout": "IPY_MODEL_ae53bf29f51d41b89d3b34557dcaad56",
+ "style": "IPY_MODEL_71f74314521743a0a1d9ff709f3f3cbb",
+ "value": "Antennae_North.cal.lsrk.split.ms.zip: 100%"
+ }
+ },
+ "382813aa877641f5b93d0588b359d325": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "ProgressStyleModel",
+ "state": {
+ "description_width": ""
+ }
+ },
+ "3a5f42ae41194d31b8a18a4b17a62bdb": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "4116488b707743a1abbf83d1e45618e1": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "layout": "IPY_MODEL_b88283ae6c7d4353adb742267aefc45d",
+ "style": "IPY_MODEL_95cb7c3ff8954a808641c0297faf1162",
+ "value": " 1.49M/1.49M [00:00<00:00, 4.98MiB/s]"
+ }
+ },
+ "426dc162c1034bc9a2ecd158b4ec601a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "FloatProgressModel",
+ "state": {
+ "bar_style": "success",
+ "layout": "IPY_MODEL_9a374a8e66764e57b1d9dcfeca6c9734",
+ "max": 8648349,
+ "style": "IPY_MODEL_90ad4b707dfb4efc85aa14c378249b16",
+ "value": 8648349
+ }
+ },
+ "457d2544037a48c18534fc682572daf4": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLStyleModel",
+ "state": {
+ "description_width": "",
+ "font_size": null,
+ "text_color": null
+ }
+ },
+ "4e6b461a2be4414b9f1a45a9a5aaf8da": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HBoxModel",
+ "state": {
+ "children": [
+ "IPY_MODEL_a40ea2652a0e418596bd1d7d84d67824",
+ "IPY_MODEL_ca3125db5032444e95ac779c397b3f96",
+ "IPY_MODEL_58487d091ad5407b94304e25b9e20928"
+ ],
+ "layout": "IPY_MODEL_5725bb9f67fc481a91e4c9d03b02fd2c"
+ }
+ },
+ "5001cf41b07541a39b99a9cf7e5c79aa": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLStyleModel",
+ "state": {
+ "description_width": "",
+ "font_size": null,
+ "text_color": null
+ }
+ },
+ "555fb08671ba43f2ac80372dd375b890": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HBoxModel",
+ "state": {
+ "children": [
+ "IPY_MODEL_32ddaa198b3640528b477725eed47b2a",
+ "IPY_MODEL_f837680791454e8a85d979af42b8ff8e",
+ "IPY_MODEL_4116488b707743a1abbf83d1e45618e1"
+ ],
+ "layout": "IPY_MODEL_7c5e6fad37d94f3b8ee1e5b3797f35f0"
+ }
+ },
+ "5725bb9f67fc481a91e4c9d03b02fd2c": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "58487d091ad5407b94304e25b9e20928": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "layout": "IPY_MODEL_0d363ac171e5416e9e32c39dc3f33c9d",
+ "style": "IPY_MODEL_7fc377ac8d7a403bb87cb7f952e4a428",
+ "value": " 8.97M/8.97M [00:00<00:00, 10.2MiB/s]"
+ }
+ },
+ "64cdffe142794ed1bcc58d398665b95c": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "64e6ae587f8d41aaa50509d03013f007": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "71f74314521743a0a1d9ff709f3f3cbb": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLStyleModel",
+ "state": {
+ "description_width": "",
+ "font_size": null,
+ "text_color": null
+ }
+ },
+ "7c5e6fad37d94f3b8ee1e5b3797f35f0": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "7fc377ac8d7a403bb87cb7f952e4a428": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLStyleModel",
+ "state": {
+ "description_width": "",
+ "font_size": null,
+ "text_color": null
+ }
+ },
+ "816583bd69c74b53897f60e425a2f097": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HBoxModel",
+ "state": {
+ "children": [
+ "IPY_MODEL_eef1eee639924e10bb6189c24cdc2908",
+ "IPY_MODEL_9b34086bf48d4decb38465ea5aedec16",
+ "IPY_MODEL_1d98195c39934260b049fbb3075c5c11"
+ ],
+ "layout": "IPY_MODEL_9a293b85613d4229ae37e5583a697e1c"
+ }
+ },
+ "866b891641c5497c9b00089215be307c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLStyleModel",
+ "state": {
+ "description_width": "",
+ "font_size": null,
+ "text_color": null
+ }
+ },
+ "90ad4b707dfb4efc85aa14c378249b16": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "ProgressStyleModel",
+ "state": {
+ "description_width": ""
+ }
+ },
+ "95cb7c3ff8954a808641c0297faf1162": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLStyleModel",
+ "state": {
+ "description_width": "",
+ "font_size": null,
+ "text_color": null
+ }
+ },
+ "9605769bdc154f7c896f243e4b5295dd": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "9a293b85613d4229ae37e5583a697e1c": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "9a374a8e66764e57b1d9dcfeca6c9734": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "9b34086bf48d4decb38465ea5aedec16": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "FloatProgressModel",
+ "state": {
+ "bar_style": "success",
+ "layout": "IPY_MODEL_9605769bdc154f7c896f243e4b5295dd",
+ "max": 29593547,
+ "style": "IPY_MODEL_f069939848fa4991bfff5c171d4e3648",
+ "value": 29593547
+ }
+ },
+ "a399d4141a7f4065b418a5d904367ece": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "layout": "IPY_MODEL_3a5f42ae41194d31b8a18a4b17a62bdb",
+ "style": "IPY_MODEL_2d30bf221b414a53b6f54bbd1e0524f5",
+ "value": "SNR_G55_10s.split.ms.zip: 100%"
+ }
+ },
+ "a40ea2652a0e418596bd1d7d84d67824": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "layout": "IPY_MODEL_64cdffe142794ed1bcc58d398665b95c",
+ "style": "IPY_MODEL_ac5d45a4f6b04a708e8c9d8f576e609c",
+ "value": "VLBA_TL016B_split.ms.zip: 100%"
+ }
+ },
+ "a52cc95ef767415eb7c1fe264d50e264": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "ac5d45a4f6b04a708e8c9d8f576e609c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLStyleModel",
+ "state": {
+ "description_width": "",
+ "font_size": null,
+ "text_color": null
+ }
+ },
+ "ae53bf29f51d41b89d3b34557dcaad56": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "b88283ae6c7d4353adb742267aefc45d": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "c9ed6ddd3c9e453390ed35f617a1732b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "ProgressStyleModel",
+ "state": {
+ "description_width": ""
+ }
+ },
+ "ca3125db5032444e95ac779c397b3f96": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "FloatProgressModel",
+ "state": {
+ "bar_style": "success",
+ "layout": "IPY_MODEL_2285c5102d4842c3a3a8e0fc13c87356",
+ "max": 9402465,
+ "style": "IPY_MODEL_c9ed6ddd3c9e453390ed35f617a1732b",
+ "value": 9402465
+ }
+ },
+ "e3abb7b4275a48f1b4f9461ba56886da": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "layout": "IPY_MODEL_1f71c548ef1b4ccc91dd9a2a3a044dcc",
+ "style": "IPY_MODEL_866b891641c5497c9b00089215be307c",
+ "value": " 8.25M/8.25M [00:00<00:00, 12.5MiB/s]"
+ }
+ },
+ "ed0abdf9a83c42469bd8042b8bdfed80": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "2.0.0",
+ "model_name": "LayoutModel",
+ "state": {}
+ },
+ "eef1eee639924e10bb6189c24cdc2908": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "layout": "IPY_MODEL_64e6ae587f8d41aaa50509d03013f007",
+ "style": "IPY_MODEL_457d2544037a48c18534fc682572daf4",
+ "value": "ALMA_uid___A002_X1003af4_X75a3.split.avg.ms.zip: 100%"
+ }
+ },
+ "f069939848fa4991bfff5c171d4e3648": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "ProgressStyleModel",
+ "state": {
+ "description_width": ""
+ }
+ },
+ "f6fe2e89a44744a0858ff05774d7440b": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "HBoxModel",
+ "state": {
+ "children": [
+ "IPY_MODEL_a399d4141a7f4065b418a5d904367ece",
+ "IPY_MODEL_426dc162c1034bc9a2ecd158b4ec601a",
+ "IPY_MODEL_e3abb7b4275a48f1b4f9461ba56886da"
+ ],
+ "layout": "IPY_MODEL_2cfc381f1cbe4841a7d4ad9d5a01bab2"
+ }
+ },
+ "f837680791454e8a85d979af42b8ff8e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "2.0.0",
+ "model_name": "FloatProgressModel",
+ "state": {
+ "bar_style": "success",
+ "layout": "IPY_MODEL_ed0abdf9a83c42469bd8042b8bdfed80",
+ "max": 1560578,
+ "style": "IPY_MODEL_382813aa877641f5b93d0588b359d325",
+ "value": 1560578
+ }
+ }
+ },
+ "version_major": 2,
+ "version_minor": 0
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/docs/source/measurement_set/guides/ALMA_ephemeris.ipynb b/docs/source/measurement_set/guides/ALMA_ephemeris.ipynb
index 5a80ec1d..85655f83 100644
--- a/docs/source/measurement_set/guides/ALMA_ephemeris.ipynb
+++ b/docs/source/measurement_set/guides/ALMA_ephemeris.ipynb
@@ -18,7 +18,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "XRADIO version 0.0.41 already installed.\n"
+ "XRADIO version 0.0.47 already installed.\n"
]
}
],
@@ -71,8 +71,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:29,661\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m File exists: \u001b[38;2;50;50;205m/home/fedemp/ws_xradio_dev/venv_xradio_python312/lib/python3.12/site-packages/toolviper/utils/data/.dropbox\u001b[0m \n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:29,661\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Updating file metadata information ... \n",
+ "[\u001b[38;2;128;05;128m2025-01-16 08:56:37,486\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: \u001b[38;2;50;50;205m/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/toolviper/utils/data/.dropbox\u001b[0m \n",
+ "[\u001b[38;2;128;05;128m2025-01-16 08:56:37,486\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Updating file metadata information ... \n",
" "
]
},
@@ -101,22 +101,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- " "
+ "[\u001b[38;2;128;05;128m2025-01-16 08:56:38,296\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: venus_ephem_test.ms \n"
]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "b5176279a1cd4b95b3f6cccfe698fcf9",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "venus_ephem_test.ms.zip: 0%| | 0.00/16.0M [00:00, ?iB/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
}
],
"source": [
@@ -143,22 +129,75 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:37,251\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID', 'FIELD_ID'] \n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:37,280\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m Number of partitions: 7 \n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:37,283\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [15 22 29 20], FIELD [1], SCAN [ 7 11] \n",
- "with_pointing True\n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:37,735\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [16 23 30 21], FIELD [2], SCAN [ 7 11] \n",
- "with_pointing True\n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:38,009\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [17 24 15 22], FIELD [3], SCAN [ 7 11] \n",
- "with_pointing True\n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:38,244\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [18 25 16 23], FIELD [0], SCAN [ 7 11] \n",
- "with_pointing True\n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:38,496\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [19 26 17 24], FIELD [4], SCAN [ 7 11] \n",
- "with_pointing True\n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:38,749\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [20 27 18 25], FIELD [5], SCAN [ 7 11] \n",
- "with_pointing True\n",
- "[\u001b[38;2;128;05;128m2024-10-14 15:41:38,962\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m toolviper: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [21 28 19 26], FIELD [6], SCAN [ 7 11] \n",
- "with_pointing True\n"
+ "[\u001b[38;2;128;05;128m2025-01-16 08:56:38,683\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Partition scheme that will be used: ['DATA_DESC_ID', 'OBS_MODE', 'OBSERVATION_ID', 'FIELD_ID'] \n",
+ "[\u001b[38;2;128;05;128m2025-01-16 08:56:38,693\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 7 \n",
+ "[\u001b[38;2;128;05;128m2025-01-16 08:56:38,693\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [0], STATE [15 22 29 20], FIELD [1], SCAN [ 7 11] \n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at WEIGHT is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at UVW is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at FLAG is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at frequency is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at VISIBILITY is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at polarization is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at baseline_id is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at EFFECTIVE_INTEGRATION_TIME is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at baseline_antenna2_name is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at scan_number is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at time is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at uvw_label is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at baseline_antenna1_name is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2821: UserWarning: Object at TIME_CENTROID is not recognized as a component of a Zarr hierarchy.\n",
+ " warnings.warn(\n",
+ "/Users/jsteeb/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2349: UserWarning: The `compressor` argument is deprecated. Use `compressors` instead.\n",
+ " compressors = _parse_deprecated_compressor(compressor, compressors)\n"
+ ]
+ },
+ {
+ "ename": "TypeError",
+ "evalue": "Expected a BytesBytesCodec. Got instead.",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[3], line 6\u001b[0m\n\u001b[1;32m 4\u001b[0m main_chunksize \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfrequency\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;241m1\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;241m20\u001b[39m} \u001b[38;5;66;03m# baseline, polarization\u001b[39;00m\n\u001b[1;32m 5\u001b[0m outfile \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mvenus_ephem_test.vis.zarr\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 6\u001b[0m \u001b[43mconvert_msv2_to_processing_set\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43min_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mms_file\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mout_file\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutfile\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43mparallel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43moverwrite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 11\u001b[0m \u001b[43m \u001b[49m\u001b[43mmain_chunksize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmain_chunksize\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[43m)\u001b[49m\n",
+ "File \u001b[0;32m~/Dropbox/xradio/src/xradio/measurement_set/convert_msv2_to_processing_set.py:156\u001b[0m, in \u001b[0;36mconvert_msv2_to_processing_set\u001b[0;34m(in_file, out_file, partition_scheme, main_chunksize, with_pointing, pointing_chunksize, pointing_interpolate, ephemeris_interpolate, phase_cal_interpolate, sys_cal_interpolate, use_table_iter, compressor, storage_backend, parallel, overwrite)\u001b[0m\n\u001b[1;32m 136\u001b[0m delayed_list\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 137\u001b[0m dask\u001b[38;5;241m.\u001b[39mdelayed(convert_and_write_partition)(\n\u001b[1;32m 138\u001b[0m in_file,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 153\u001b[0m )\n\u001b[1;32m 154\u001b[0m )\n\u001b[1;32m 155\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 156\u001b[0m \u001b[43mconvert_and_write_partition\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 157\u001b[0m \u001b[43m \u001b[49m\u001b[43min_file\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 158\u001b[0m \u001b[43m \u001b[49m\u001b[43mout_file\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 159\u001b[0m \u001b[43m \u001b[49m\u001b[43mms_v4_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 160\u001b[0m \u001b[43m \u001b[49m\u001b[43mpartition_info\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpartition_info\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 161\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_table_iter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_table_iter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 162\u001b[0m \u001b[43m \u001b[49m\u001b[43mpartition_scheme\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpartition_scheme\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 163\u001b[0m \u001b[43m \u001b[49m\u001b[43mmain_chunksize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmain_chunksize\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 164\u001b[0m \u001b[43m \u001b[49m\u001b[43mwith_pointing\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mwith_pointing\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 165\u001b[0m \u001b[43m \u001b[49m\u001b[43mpointing_chunksize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpointing_chunksize\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 166\u001b[0m \u001b[43m \u001b[49m\u001b[43mpointing_interpolate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpointing_interpolate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 167\u001b[0m \u001b[43m \u001b[49m\u001b[43mephemeris_interpolate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mephemeris_interpolate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 168\u001b[0m \u001b[43m \u001b[49m\u001b[43mphase_cal_interpolate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mphase_cal_interpolate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 169\u001b[0m \u001b[43m \u001b[49m\u001b[43msys_cal_interpolate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msys_cal_interpolate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompressor\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcompressor\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 171\u001b[0m \u001b[43m \u001b[49m\u001b[43moverwrite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moverwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 172\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parallel:\n\u001b[1;32m 175\u001b[0m dask\u001b[38;5;241m.\u001b[39mcompute(delayed_list)\n",
+ "File \u001b[0;32m~/Dropbox/xradio/src/xradio/measurement_set/_utils/_msv2/conversion.py:1280\u001b[0m, in \u001b[0;36mconvert_and_write_partition\u001b[0;34m(in_file, out_file, ms_v4_id, partition_info, use_table_iter, partition_scheme, main_chunksize, with_pointing, pointing_chunksize, pointing_interpolate, ephemeris_interpolate, phase_cal_interpolate, sys_cal_interpolate, compressor, storage_backend, overwrite)\u001b[0m\n\u001b[1;32m 1278\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 1279\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m storage_backend \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mzarr\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m-> 1280\u001b[0m \u001b[43mxds\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_zarr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstore\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcorrelated_xds\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1281\u001b[0m ant_xds\u001b[38;5;241m.\u001b[39mto_zarr(store\u001b[38;5;241m=\u001b[39mos\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(file_name, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mantenna_xds\u001b[39m\u001b[38;5;124m\"\u001b[39m), mode\u001b[38;5;241m=\u001b[39mmode)\n\u001b[1;32m 1282\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m group_name \u001b[38;5;129;01min\u001b[39;00m xds\u001b[38;5;241m.\u001b[39mattrs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdata_groups\u001b[39m\u001b[38;5;124m\"\u001b[39m]:\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/xarray/core/dataset.py:2622\u001b[0m, in \u001b[0;36mDataset.to_zarr\u001b[0;34m(self, store, chunk_store, mode, synchronizer, group, encoding, compute, consolidated, append_dim, region, safe_chunks, storage_options, zarr_version, zarr_format, write_empty_chunks, chunkmanager_store_kwargs)\u001b[0m\n\u001b[1;32m 2454\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Write dataset contents to a zarr group.\u001b[39;00m\n\u001b[1;32m 2455\u001b[0m \n\u001b[1;32m 2456\u001b[0m \u001b[38;5;124;03mZarr chunks are determined in the following way:\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2618\u001b[0m \u001b[38;5;124;03m The I/O user guide, with more details and examples.\u001b[39;00m\n\u001b[1;32m 2619\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 2620\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mxarray\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbackends\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapi\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m to_zarr\n\u001b[0;32m-> 2622\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mto_zarr\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[call-overload,misc]\u001b[39;49;00m\n\u001b[1;32m 2623\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2624\u001b[0m \u001b[43m \u001b[49m\u001b[43mstore\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstore\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2625\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunk_store\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunk_store\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2626\u001b[0m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstorage_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2627\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2628\u001b[0m \u001b[43m \u001b[49m\u001b[43msynchronizer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msynchronizer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2629\u001b[0m \u001b[43m \u001b[49m\u001b[43mgroup\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2630\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2631\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompute\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcompute\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2632\u001b[0m \u001b[43m \u001b[49m\u001b[43mconsolidated\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconsolidated\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2633\u001b[0m \u001b[43m \u001b[49m\u001b[43mappend_dim\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mappend_dim\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2634\u001b[0m \u001b[43m \u001b[49m\u001b[43mregion\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mregion\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2635\u001b[0m \u001b[43m \u001b[49m\u001b[43msafe_chunks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msafe_chunks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2636\u001b[0m \u001b[43m \u001b[49m\u001b[43mzarr_version\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mzarr_version\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2637\u001b[0m \u001b[43m \u001b[49m\u001b[43mzarr_format\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mzarr_format\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2638\u001b[0m \u001b[43m \u001b[49m\u001b[43mwrite_empty_chunks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mwrite_empty_chunks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2639\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunkmanager_store_kwargs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunkmanager_store_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2640\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/xarray/backends/api.py:2216\u001b[0m, in \u001b[0;36mto_zarr\u001b[0;34m(dataset, store, chunk_store, mode, synchronizer, group, encoding, compute, consolidated, append_dim, region, safe_chunks, storage_options, zarr_version, zarr_format, write_empty_chunks, chunkmanager_store_kwargs)\u001b[0m\n\u001b[1;32m 2214\u001b[0m writer \u001b[38;5;241m=\u001b[39m ArrayWriter()\n\u001b[1;32m 2215\u001b[0m \u001b[38;5;66;03m# TODO: figure out how to properly handle unlimited_dims\u001b[39;00m\n\u001b[0;32m-> 2216\u001b[0m \u001b[43mdump_to_store\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdataset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mzstore\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwriter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2217\u001b[0m writes \u001b[38;5;241m=\u001b[39m writer\u001b[38;5;241m.\u001b[39msync(\n\u001b[1;32m 2218\u001b[0m compute\u001b[38;5;241m=\u001b[39mcompute, chunkmanager_store_kwargs\u001b[38;5;241m=\u001b[39mchunkmanager_store_kwargs\n\u001b[1;32m 2219\u001b[0m )\n\u001b[1;32m 2221\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m compute:\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/xarray/backends/api.py:1952\u001b[0m, in \u001b[0;36mdump_to_store\u001b[0;34m(dataset, store, writer, encoder, encoding, unlimited_dims)\u001b[0m\n\u001b[1;32m 1949\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m encoder:\n\u001b[1;32m 1950\u001b[0m variables, attrs \u001b[38;5;241m=\u001b[39m encoder(variables, attrs)\n\u001b[0;32m-> 1952\u001b[0m \u001b[43mstore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstore\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvariables\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcheck_encoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwriter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munlimited_dims\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43munlimited_dims\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/xarray/backends/zarr.py:1022\u001b[0m, in \u001b[0;36mZarrStore.store\u001b[0;34m(self, variables, attributes, check_encoding_set, writer, unlimited_dims)\u001b[0m\n\u001b[1;32m 1019\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1020\u001b[0m variables_to_set \u001b[38;5;241m=\u001b[39m variables_encoded\n\u001b[0;32m-> 1022\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_variables\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1023\u001b[0m \u001b[43m \u001b[49m\u001b[43mvariables_to_set\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcheck_encoding_set\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwriter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munlimited_dims\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43munlimited_dims\u001b[49m\n\u001b[1;32m 1024\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1025\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_consolidate_on_close:\n\u001b[1;32m 1026\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m {}\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/xarray/backends/zarr.py:1194\u001b[0m, in \u001b[0;36mZarrStore.set_variables\u001b[0;34m(self, variables, check_encoding_set, writer, unlimited_dims)\u001b[0m\n\u001b[1;32m 1190\u001b[0m encoded_attrs[DIMENSION_KEY] \u001b[38;5;241m=\u001b[39m dims\n\u001b[1;32m 1192\u001b[0m encoding[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moverwrite\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m-> 1194\u001b[0m zarr_array \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_create_new_array\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1195\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1196\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1197\u001b[0m \u001b[43m \u001b[49m\u001b[43mshape\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mshape\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1198\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1199\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1200\u001b[0m \u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoded_attrs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1201\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1203\u001b[0m writer\u001b[38;5;241m.\u001b[39madd(v\u001b[38;5;241m.\u001b[39mdata, zarr_array, region)\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/xarray/backends/zarr.py:1089\u001b[0m, in \u001b[0;36mZarrStore._create_new_array\u001b[0;34m(self, name, shape, dtype, fill_value, encoding, attrs)\u001b[0m\n\u001b[1;32m 1086\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1087\u001b[0m encoding[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mwrite_empty_chunks\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_write_empty\n\u001b[0;32m-> 1089\u001b[0m zarr_array \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzarr_group\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1090\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1091\u001b[0m \u001b[43m \u001b[49m\u001b[43mshape\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mshape\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1092\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1093\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1094\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1095\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1096\u001b[0m zarr_array \u001b[38;5;241m=\u001b[39m _put_attrs(zarr_array, attrs)\n\u001b[1;32m 1097\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m zarr_array\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2234\u001b[0m, in \u001b[0;36mGroup.create\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2232\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mcreate\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs: Any, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Array:\n\u001b[1;32m 2233\u001b[0m \u001b[38;5;66;03m# Backwards compatibility for 2.x\u001b[39;00m\n\u001b[0;32m-> 2234\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate_array\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/_compat.py:43\u001b[0m, in \u001b[0;36m_deprecate_positional_args.._inner_deprecate_positional_args..inner_f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 41\u001b[0m extra_args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(args) \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mlen\u001b[39m(all_args)\n\u001b[1;32m 42\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m extra_args \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m---> 43\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 45\u001b[0m \u001b[38;5;66;03m# extra_args > 0\u001b[39;00m\n\u001b[1;32m 46\u001b[0m args_msg \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 47\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00marg\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 48\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name, arg \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(kwonly_args[:extra_args], args[\u001b[38;5;241m-\u001b[39mextra_args:], strict\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 49\u001b[0m ]\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:2351\u001b[0m, in \u001b[0;36mGroup.create_array\u001b[0;34m(self, name, shape, dtype, chunks, shards, filters, compressors, compressor, serializer, fill_value, order, attributes, chunk_key_encoding, dimension_names, storage_options, overwrite, config)\u001b[0m\n\u001b[1;32m 2258\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Create an array within this group.\u001b[39;00m\n\u001b[1;32m 2259\u001b[0m \n\u001b[1;32m 2260\u001b[0m \u001b[38;5;124;03mThis method lightly wraps :func:`zarr.core.array.create_array`.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2347\u001b[0m \u001b[38;5;124;03mAsyncArray\u001b[39;00m\n\u001b[1;32m 2348\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 2349\u001b[0m compressors \u001b[38;5;241m=\u001b[39m _parse_deprecated_compressor(compressor, compressors)\n\u001b[1;32m 2350\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m Array(\n\u001b[0;32m-> 2351\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sync\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2352\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_async_group\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate_array\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2353\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2354\u001b[0m \u001b[43m \u001b[49m\u001b[43mshape\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mshape\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2355\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2356\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2357\u001b[0m \u001b[43m \u001b[49m\u001b[43mshards\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mshards\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2358\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2359\u001b[0m \u001b[43m \u001b[49m\u001b[43mattributes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattributes\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2360\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunk_key_encoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunk_key_encoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2361\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompressors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcompressors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2362\u001b[0m \u001b[43m \u001b[49m\u001b[43mserializer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mserializer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2363\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimension_names\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdimension_names\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2364\u001b[0m \u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2365\u001b[0m \u001b[43m \u001b[49m\u001b[43mfilters\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfilters\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2366\u001b[0m \u001b[43m \u001b[49m\u001b[43moverwrite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moverwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2367\u001b[0m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstorage_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2368\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2369\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2370\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2371\u001b[0m )\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/sync.py:187\u001b[0m, in \u001b[0;36mSyncMixin._sync\u001b[0;34m(self, coroutine)\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21m_sync\u001b[39m(\u001b[38;5;28mself\u001b[39m, coroutine: Coroutine[Any, Any, T]) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 185\u001b[0m \u001b[38;5;66;03m# TODO: refactor this to to take *args and **kwargs and pass those to the method\u001b[39;00m\n\u001b[1;32m 186\u001b[0m \u001b[38;5;66;03m# this should allow us to better type the sync wrapper\u001b[39;00m\n\u001b[0;32m--> 187\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msync\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 188\u001b[0m \u001b[43m \u001b[49m\u001b[43mcoroutine\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 189\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43masync.timeout\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 190\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/sync.py:142\u001b[0m, in \u001b[0;36msync\u001b[0;34m(coro, loop, timeout)\u001b[0m\n\u001b[1;32m 139\u001b[0m return_result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(\u001b[38;5;28miter\u001b[39m(finished))\u001b[38;5;241m.\u001b[39mresult()\n\u001b[1;32m 141\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(return_result, \u001b[38;5;167;01mBaseException\u001b[39;00m):\n\u001b[0;32m--> 142\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m return_result\n\u001b[1;32m 143\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 144\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m return_result\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/sync.py:98\u001b[0m, in \u001b[0;36m_runner\u001b[0;34m(coro)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 94\u001b[0m \u001b[38;5;124;03mAwait a coroutine and return the result of running it. If awaiting the coroutine raises an\u001b[39;00m\n\u001b[1;32m 95\u001b[0m \u001b[38;5;124;03mexception, the exception will be returned.\u001b[39;00m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 97\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 98\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m coro\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m ex:\n\u001b[1;32m 100\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ex\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/group.py:1119\u001b[0m, in \u001b[0;36mAsyncGroup.create_array\u001b[0;34m(self, name, shape, dtype, chunks, shards, filters, compressors, compressor, serializer, fill_value, order, attributes, chunk_key_encoding, dimension_names, storage_options, overwrite, config)\u001b[0m\n\u001b[1;32m 1025\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Create an array within this group.\u001b[39;00m\n\u001b[1;32m 1026\u001b[0m \n\u001b[1;32m 1027\u001b[0m \u001b[38;5;124;03mThis method lightly wraps :func:`zarr.core.array.create_array`.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1115\u001b[0m \n\u001b[1;32m 1116\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 1118\u001b[0m compressors \u001b[38;5;241m=\u001b[39m _parse_deprecated_compressor(compressor, compressors)\n\u001b[0;32m-> 1119\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m create_array(\n\u001b[1;32m 1120\u001b[0m store\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstore_path,\n\u001b[1;32m 1121\u001b[0m name\u001b[38;5;241m=\u001b[39mname,\n\u001b[1;32m 1122\u001b[0m shape\u001b[38;5;241m=\u001b[39mshape,\n\u001b[1;32m 1123\u001b[0m dtype\u001b[38;5;241m=\u001b[39mdtype,\n\u001b[1;32m 1124\u001b[0m chunks\u001b[38;5;241m=\u001b[39mchunks,\n\u001b[1;32m 1125\u001b[0m shards\u001b[38;5;241m=\u001b[39mshards,\n\u001b[1;32m 1126\u001b[0m filters\u001b[38;5;241m=\u001b[39mfilters,\n\u001b[1;32m 1127\u001b[0m compressors\u001b[38;5;241m=\u001b[39mcompressors,\n\u001b[1;32m 1128\u001b[0m serializer\u001b[38;5;241m=\u001b[39mserializer,\n\u001b[1;32m 1129\u001b[0m fill_value\u001b[38;5;241m=\u001b[39mfill_value,\n\u001b[1;32m 1130\u001b[0m order\u001b[38;5;241m=\u001b[39morder,\n\u001b[1;32m 1131\u001b[0m zarr_format\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmetadata\u001b[38;5;241m.\u001b[39mzarr_format,\n\u001b[1;32m 1132\u001b[0m attributes\u001b[38;5;241m=\u001b[39mattributes,\n\u001b[1;32m 1133\u001b[0m chunk_key_encoding\u001b[38;5;241m=\u001b[39mchunk_key_encoding,\n\u001b[1;32m 1134\u001b[0m dimension_names\u001b[38;5;241m=\u001b[39mdimension_names,\n\u001b[1;32m 1135\u001b[0m storage_options\u001b[38;5;241m=\u001b[39mstorage_options,\n\u001b[1;32m 1136\u001b[0m overwrite\u001b[38;5;241m=\u001b[39moverwrite,\n\u001b[1;32m 1137\u001b[0m config\u001b[38;5;241m=\u001b[39mconfig,\n\u001b[1;32m 1138\u001b[0m )\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/array.py:3919\u001b[0m, in \u001b[0;36mcreate_array\u001b[0;34m(store, name, shape, dtype, chunks, shards, filters, compressors, serializer, fill_value, order, zarr_format, attributes, chunk_key_encoding, dimension_names, storage_options, overwrite, config)\u001b[0m\n\u001b[1;32m 3904\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m AsyncArray\u001b[38;5;241m.\u001b[39m_create_v2(\n\u001b[1;32m 3905\u001b[0m store_path\u001b[38;5;241m=\u001b[39mstore_path,\n\u001b[1;32m 3906\u001b[0m shape\u001b[38;5;241m=\u001b[39mshape_parsed,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 3916\u001b[0m config\u001b[38;5;241m=\u001b[39mconfig_parsed,\n\u001b[1;32m 3917\u001b[0m )\n\u001b[1;32m 3918\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 3919\u001b[0m array_array, array_bytes, bytes_bytes \u001b[38;5;241m=\u001b[39m \u001b[43m_parse_chunk_encoding_v3\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3920\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompressors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcompressors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3921\u001b[0m \u001b[43m \u001b[49m\u001b[43mfilters\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfilters\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3922\u001b[0m \u001b[43m \u001b[49m\u001b[43mserializer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mserializer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3923\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype_parsed\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3924\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3925\u001b[0m sub_codecs \u001b[38;5;241m=\u001b[39m cast(\u001b[38;5;28mtuple\u001b[39m[Codec, \u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m], (\u001b[38;5;241m*\u001b[39marray_array, array_bytes, \u001b[38;5;241m*\u001b[39mbytes_bytes))\n\u001b[1;32m 3926\u001b[0m codecs_out: \u001b[38;5;28mtuple\u001b[39m[Codec, \u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m]\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/array.py:4120\u001b[0m, in \u001b[0;36m_parse_chunk_encoding_v3\u001b[0;34m(compressors, filters, serializer, dtype)\u001b[0m\n\u001b[1;32m 4117\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 4118\u001b[0m maybe_bytes_bytes \u001b[38;5;241m=\u001b[39m cast(Iterable[Codec \u001b[38;5;241m|\u001b[39m \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, JSON]], compressors)\n\u001b[0;32m-> 4120\u001b[0m out_bytes_bytes \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m_parse_bytes_bytes_codec\u001b[49m\u001b[43m(\u001b[49m\u001b[43mc\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mc\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmaybe_bytes_bytes\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4122\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m out_array_array, out_array_bytes, out_bytes_bytes\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/core/array.py:4120\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 4117\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 4118\u001b[0m maybe_bytes_bytes \u001b[38;5;241m=\u001b[39m cast(Iterable[Codec \u001b[38;5;241m|\u001b[39m \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, JSON]], compressors)\n\u001b[0;32m-> 4120\u001b[0m out_bytes_bytes \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(\u001b[43m_parse_bytes_bytes_codec\u001b[49m\u001b[43m(\u001b[49m\u001b[43mc\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m c \u001b[38;5;129;01min\u001b[39;00m maybe_bytes_bytes)\n\u001b[1;32m 4122\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m out_array_array, out_array_bytes, out_bytes_bytes\n",
+ "File \u001b[0;32m~/miniforge3/envs/zinc/lib/python3.12/site-packages/zarr/registry.py:184\u001b[0m, in \u001b[0;36m_parse_bytes_bytes_codec\u001b[0;34m(data)\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 183\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data, BytesBytesCodec):\n\u001b[0;32m--> 184\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExpected a BytesBytesCodec. Got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(data)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m instead.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 185\u001b[0m result \u001b[38;5;241m=\u001b[39m data\n\u001b[1;32m 186\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n",
+ "\u001b[0;31mTypeError\u001b[0m: Expected a BytesBytesCodec. Got instead."
]
}
],
@@ -187,198 +226,10 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": null,
"id": "dab986ca-55f8-4a4a-ba59-9c97fcc2ca84",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " name | \n",
- " intents | \n",
- " shape | \n",
- " polarization | \n",
- " scan_number | \n",
- " spw_name | \n",
- " field_name | \n",
- " source_name | \n",
- " line_name | \n",
- " field_coords | \n",
- " start_frequency | \n",
- " end_frequency | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 3 | \n",
- " venus_ephem_test_0 | \n",
- " [OBSERVE_TARGET#ON_SOURCE] | \n",
- " (20, 1128, 1, 2) | \n",
- " [XX, YY] | \n",
- " [7, 11] | \n",
- " X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 | \n",
- " [Venus_1] | \n",
- " [Venus_0] | \n",
- " [OSSO_Line_1(ID=0)] | \n",
- " Ephemeris | \n",
- " 2.452498e+11 | \n",
- " 2.452498e+11 | \n",
- "
\n",
- " \n",
- " 5 | \n",
- " venus_ephem_test_1 | \n",
- " [OBSERVE_TARGET#ON_SOURCE] | \n",
- " (20, 1128, 1, 2) | \n",
- " [XX, YY] | \n",
- " [7, 11] | \n",
- " X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 | \n",
- " [Venus_2] | \n",
- " [Venus_0] | \n",
- " [OSSO_Line_1(ID=0)] | \n",
- " Ephemeris | \n",
- " 2.452498e+11 | \n",
- " 2.452498e+11 | \n",
- "
\n",
- " \n",
- " 6 | \n",
- " venus_ephem_test_2 | \n",
- " [OBSERVE_TARGET#ON_SOURCE] | \n",
- " (20, 1128, 1, 2) | \n",
- " [XX, YY] | \n",
- " [7, 11] | \n",
- " X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 | \n",
- " [Venus_3] | \n",
- " [Venus_0] | \n",
- " [OSSO_Line_1(ID=0)] | \n",
- " Ephemeris | \n",
- " 2.452498e+11 | \n",
- " 2.452498e+11 | \n",
- "
\n",
- " \n",
- " 0 | \n",
- " venus_ephem_test_3 | \n",
- " [OBSERVE_TARGET#ON_SOURCE] | \n",
- " (20, 1128, 1, 2) | \n",
- " [XX, YY] | \n",
- " [7, 11] | \n",
- " X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 | \n",
- " [Venus_0] | \n",
- " [Venus_0] | \n",
- " [OSSO_Line_1(ID=0)] | \n",
- " Ephemeris | \n",
- " 2.452498e+11 | \n",
- " 2.452498e+11 | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " venus_ephem_test_4 | \n",
- " [OBSERVE_TARGET#ON_SOURCE] | \n",
- " (20, 1128, 1, 2) | \n",
- " [XX, YY] | \n",
- " [7, 11] | \n",
- " X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 | \n",
- " [Venus_4] | \n",
- " [Venus_0] | \n",
- " [OSSO_Line_1(ID=0)] | \n",
- " Ephemeris | \n",
- " 2.452498e+11 | \n",
- " 2.452498e+11 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " venus_ephem_test_5 | \n",
- " [OBSERVE_TARGET#ON_SOURCE] | \n",
- " (20, 1128, 1, 2) | \n",
- " [XX, YY] | \n",
- " [7, 11] | \n",
- " X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 | \n",
- " [Venus_5] | \n",
- " [Venus_0] | \n",
- " [OSSO_Line_1(ID=0)] | \n",
- " Ephemeris | \n",
- " 2.452498e+11 | \n",
- " 2.452498e+11 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " venus_ephem_test_6 | \n",
- " [OBSERVE_TARGET#ON_SOURCE] | \n",
- " (20, 1128, 1, 2) | \n",
- " [XX, YY] | \n",
- " [7, 11] | \n",
- " X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 | \n",
- " [Venus_6] | \n",
- " [Venus_0] | \n",
- " [OSSO_Line_1(ID=0)] | \n",
- " Ephemeris | \n",
- " 2.452498e+11 | \n",
- " 2.452498e+11 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " name intents shape \\\n",
- "3 venus_ephem_test_0 [OBSERVE_TARGET#ON_SOURCE] (20, 1128, 1, 2) \n",
- "5 venus_ephem_test_1 [OBSERVE_TARGET#ON_SOURCE] (20, 1128, 1, 2) \n",
- "6 venus_ephem_test_2 [OBSERVE_TARGET#ON_SOURCE] (20, 1128, 1, 2) \n",
- "0 venus_ephem_test_3 [OBSERVE_TARGET#ON_SOURCE] (20, 1128, 1, 2) \n",
- "4 venus_ephem_test_4 [OBSERVE_TARGET#ON_SOURCE] (20, 1128, 1, 2) \n",
- "2 venus_ephem_test_5 [OBSERVE_TARGET#ON_SOURCE] (20, 1128, 1, 2) \n",
- "1 venus_ephem_test_6 [OBSERVE_TARGET#ON_SOURCE] (20, 1128, 1, 2) \n",
- "\n",
- " polarization scan_number spw_name \\\n",
- "3 [XX, YY] [7, 11] X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 \n",
- "5 [XX, YY] [7, 11] X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 \n",
- "6 [XX, YY] [7, 11] X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 \n",
- "0 [XX, YY] [7, 11] X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 \n",
- "4 [XX, YY] [7, 11] X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 \n",
- "2 [XX, YY] [7, 11] X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 \n",
- "1 [XX, YY] [7, 11] X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0 \n",
- "\n",
- " field_name source_name line_name field_coords start_frequency \\\n",
- "3 [Venus_1] [Venus_0] [OSSO_Line_1(ID=0)] Ephemeris 2.452498e+11 \n",
- "5 [Venus_2] [Venus_0] [OSSO_Line_1(ID=0)] Ephemeris 2.452498e+11 \n",
- "6 [Venus_3] [Venus_0] [OSSO_Line_1(ID=0)] Ephemeris 2.452498e+11 \n",
- "0 [Venus_0] [Venus_0] [OSSO_Line_1(ID=0)] Ephemeris 2.452498e+11 \n",
- "4 [Venus_4] [Venus_0] [OSSO_Line_1(ID=0)] Ephemeris 2.452498e+11 \n",
- "2 [Venus_5] [Venus_0] [OSSO_Line_1(ID=0)] Ephemeris 2.452498e+11 \n",
- "1 [Venus_6] [Venus_0] [OSSO_Line_1(ID=0)] Ephemeris 2.452498e+11 \n",
- "\n",
- " end_frequency \n",
- "3 2.452498e+11 \n",
- "5 2.452498e+11 \n",
- "6 2.452498e+11 \n",
- "0 2.452498e+11 \n",
- "4 2.452498e+11 \n",
- "2 2.452498e+11 \n",
- "1 2.452498e+11 "
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"ps_name = outfile\n",
"\n",
@@ -390,1189 +241,30 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"id": "d3d0ac93",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "dict_keys(['venus_ephem_test_3', 'venus_ephem_test_6', 'venus_ephem_test_5', 'venus_ephem_test_0', 'venus_ephem_test_4', 'venus_ephem_test_1', 'venus_ephem_test_2'])"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"ps.keys()"
]
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": null,
"id": "259aa56b",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
<xarray.MeasurementSetXds> Size: 2MB\n",
- "Dimensions: (baseline_id: 1128, time: 20, frequency: 1,\n",
- " polarization: 2, uvw_label: 3)\n",
- "Coordinates:\n",
- " baseline_antenna1_name (baseline_id) <U9 41kB dask.array<chunksize=(1128,), meta=np.ndarray>\n",
- " baseline_antenna2_name (baseline_id) <U9 41kB dask.array<chunksize=(1128,), meta=np.ndarray>\n",
- " * baseline_id (baseline_id) int64 9kB 0 1 2 ... 1125 1126 1127\n",
- " scan_number (time) int64 160B dask.array<chunksize=(20,), meta=np.ndarray>\n",
- " * time (time) float64 160B 1.547e+09 ... 1.547e+09\n",
- " * frequency (frequency) float64 8B 2.452e+11\n",
- " * polarization (polarization) <U2 16B 'XX' 'YY'\n",
- " * uvw_label (uvw_label) <U1 12B 'u' 'v' 'w'\n",
- "Data variables:\n",
- " EFFECTIVE_INTEGRATION_TIME (time, baseline_id) float64 180kB dask.array<chunksize=(20, 1128), meta=np.ndarray>\n",
- " FLAG (time, baseline_id, frequency, polarization) bool 45kB dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>\n",
- " TIME_CENTROID (time, baseline_id) float64 180kB dask.array<chunksize=(20, 1128), meta=np.ndarray>\n",
- " UVW (time, baseline_id, uvw_label) float64 541kB dask.array<chunksize=(20, 1128, 3), meta=np.ndarray>\n",
- " VISIBILITY (time, baseline_id, frequency, polarization) complex64 361kB dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>\n",
- " WEIGHT (time, baseline_id, frequency, polarization) float32 180kB dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>\n",
- "Attributes:\n",
- " creation_date: 2024-10-14T13:41:37.351595\n",
- " data_groups: {'base': {'correlated_data': 'VISIBILITY', 'flag': 'FL...\n",
- " observation_info: {'execution_block_UID': '<EntityRef entityId="uid://A0...\n",
- " partition_info: {'field_name': ['Venus_1'], 'intents': ['OBSERVE_TARGE...\n",
- " processor_info: {'sub_type': 'ALMA_CORRELATOR_MODE', 'type': 'CORRELAT...\n",
- " schema_version: 4.0.-9994\n",
- " type: visibility\n",
- " xradio_version: 0.0.41\n",
- " antenna_xds: <xarray.Dataset> Size: 7kB\\nDimensions: ...
- baseline_id: 1128
- time: 20
- frequency: 1
- polarization: 2
- uvw_label: 3
baseline_antenna1_name
(baseline_id)
<U9
dask.array<chunksize=(1128,), meta=np.ndarray>
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 39.66 kiB | \n",
- " 39.66 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (1128,) | \n",
- " (1128,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
baseline_antenna2_name
(baseline_id)
<U9
dask.array<chunksize=(1128,), meta=np.ndarray>
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 39.66 kiB | \n",
- " 39.66 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (1128,) | \n",
- " (1128,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
baseline_id
(baseline_id)
int64
0 1 2 3 4 ... 1124 1125 1126 1127
array([ 0, 1, 2, ..., 1125, 1126, 1127])
scan_number
(time)
int64
dask.array<chunksize=(20,), meta=np.ndarray>
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 160 B | \n",
- " 160 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (20,) | \n",
- " (20,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " int64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
time
(time)
float64
1.547e+09 1.547e+09 ... 1.547e+09
- effective_integration_time :
- EFFECTIVE_INTEGRATION_TIME
- format :
- unix
- integration_time :
- {'attrs': {'type': 'quantity', 'units': ['s']}, 'data': 6.048, 'dims': []}
- scale :
- utc
- type :
- time
- units :
- ['s']
array([1.546947e+09, 1.546947e+09, 1.546947e+09, 1.546947e+09, 1.546947e+09,\n",
- " 1.546947e+09, 1.546947e+09, 1.546947e+09, 1.546947e+09, 1.546947e+09,\n",
- " 1.546947e+09, 1.546947e+09, 1.546947e+09, 1.546947e+09, 1.546947e+09,\n",
- " 1.546947e+09, 1.546947e+09, 1.546947e+09, 1.546947e+09, 1.546947e+09])
frequency
(frequency)
float64
2.452e+11
- channel_width :
- {'attrs': {'type': 'quantity', 'units': ['Hz']}, 'data': 48339843.75, 'dims': []}
- observer :
- TOPO
- reference_frequency :
- {'attrs': {'observer': 'TOPO', 'type': 'spectral_coord', 'units': ['Hz']}, 'data': 245249813494.30084, 'dims': []}
- spectral_window_id :
- 0
- spectral_window_name :
- X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0
- type :
- spectral_coord
- units :
- ['Hz']
polarization
(polarization)
<U2
'XX' 'YY'
array(['XX', 'YY'], dtype='<U2')
uvw_label
(uvw_label)
<U1
'u' 'v' 'w'
array(['u', 'v', 'w'], dtype='<U1')
EFFECTIVE_INTEGRATION_TIME
(time, baseline_id)
float64
dask.array<chunksize=(20, 1128), meta=np.ndarray>
- type :
- quantity
- units :
- ['s']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 176.25 kiB | \n",
- " 176.25 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (20, 1128) | \n",
- " (20, 1128) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
FLAG
(time, baseline_id, frequency, polarization)
bool
dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 44.06 kiB | \n",
- " 44.06 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (20, 1128, 1, 2) | \n",
- " (20, 1128, 1, 2) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " bool numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
TIME_CENTROID
(time, baseline_id)
float64
dask.array<chunksize=(20, 1128), meta=np.ndarray>
- format :
- unix
- scale :
- utc
- type :
- time
- units :
- ['s']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 176.25 kiB | \n",
- " 176.25 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (20, 1128) | \n",
- " (20, 1128) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
UVW
(time, baseline_id, uvw_label)
float64
dask.array<chunksize=(20, 1128, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- uvw
- units :
- ['m', 'm', 'm']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 528.75 kiB | \n",
- " 528.75 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (20, 1128, 3) | \n",
- " (20, 1128, 3) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
VISIBILITY
(time, baseline_id, frequency, polarization)
complex64
dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>
- type :
- quanta
- units :
- ['unkown']
- field_and_source_xds :
- <xarray.Dataset> Size: 544B\n",
- "Dimensions: (time_ephemeris: 2, sky_pos_label: 3,\n",
- " line_label: 1, ellipsoid_pos_label: 3,\n",
- " sky_dir_label: 2)\n",
- "Coordinates:\n",
- " * ellipsoid_pos_label (ellipsoid_pos_label) <U4 48B 'lon' 'lat' 'dist'\n",
- " field_name <U7 28B ...\n",
- " * line_label (line_label) <U21 84B '0'\n",
- " line_name (line_label) <U17 68B dask.array<chunksize=(1,), meta=np.ndarray>\n",
- " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
- " * sky_pos_label (sky_pos_label) <U4 48B 'ra' 'dec' 'dist'\n",
- " source_name <U7 28B ...\n",
- " * time_ephemeris (time_ephemeris) float64 16B 1.547e+09 1.547e+09\n",
- "Data variables:\n",
- " FIELD_PHASE_CENTER (time_ephemeris, sky_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
- " LINE_REST_FREQUENCY (line_label) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
- " LINE_SYSTEMIC_VELOCITY (line_label) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
- " OBSERVER_POSITION (ellipsoid_pos_label) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
- " SOURCE_LOCATION (time_ephemeris, sky_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
- " SOURCE_RADIAL_VELOCITY (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>\n",
- " SUB_OBSERVER_DIRECTION (time_ephemeris, ellipsoid_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
- "Attributes:\n",
- " is_ephemeris: True\n",
- " type: field_and_source
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 352.50 kiB | \n",
- " 352.50 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (20, 1128, 1, 2) | \n",
- " (20, 1128, 1, 2) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " complex64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
WEIGHT
(time, baseline_id, frequency, polarization)
float32
dask.array<chunksize=(20, 1128, 1, 2), meta=np.ndarray>
- type :
- quanta
- units :
- ['unkown']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 176.25 kiB | \n",
- " 176.25 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (20, 1128, 1, 2) | \n",
- " (20, 1128, 1, 2) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float32 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
PandasIndex
PandasIndex(Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\n",
- " ...\n",
- " 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127],\n",
- " dtype='int64', name='baseline_id', length=1128))
PandasIndex
PandasIndex(Index([1546946510.2080002, 1546946516.2560005, 1546946522.304,\n",
- " 1546946528.3520002, 1546946534.3999996, 1546946738.6879997,\n",
- " 1546946744.736, 1546946750.7840004, 1546946756.8319998,\n",
- " 1546946762.88, 1546946967.1680002, 1546946973.2160006,\n",
- " 1546946979.264, 1546946985.3120003, 1546946991.3599997,\n",
- " 1546947302.448, 1546947308.4960003, 1546947314.5439997,\n",
- " 1546947320.592, 1546947326.6399994],\n",
- " dtype='float64', name='time'))
PandasIndex
PandasIndex(Index([245249813494.30084], dtype='float64', name='frequency'))
PandasIndex
PandasIndex(Index(['XX', 'YY'], dtype='object', name='polarization'))
PandasIndex
PandasIndex(Index(['u', 'v', 'w'], dtype='object', name='uvw_label'))
- creation_date :
- 2024-10-14T13:41:37.351595
- data_groups :
- {'base': {'correlated_data': 'VISIBILITY', 'flag': 'FLAG', 'uvw': 'UVW', 'weight': 'WEIGHT'}}
- observation_info :
- {'execution_block_UID': '<EntityRef entityId="uid://A002/Xd7be9d/X499e" partId="X00000000" entityTypeName="ASDM" documentVersion="1"/>', 'execution_block_id': 'ExecBlock_0', 'execution_block_number': 999, 'observer': ['sv2421'], 'observing_log': '', 'observing_script': 'StandardInterferometry.py', 'observing_script_UID': '', 'project': 'uid://A001/X12ea/X715', 'release_date': '1858-11-17T00:00:00.000000000', 'session_reference': '<EntityRef entityId="uid://A001/X133d/X169f" partId="X00000000" entityTypeName="OUSStatus" documentVersion="1.0"/>'}
- partition_info :
- {'field_name': ['Venus_1'], 'intents': ['OBSERVE_TARGET#ON_SOURCE'], 'line_name': ['OSSO_Line_1(ID=0)'], 'polarization_setup': ['XX', 'YY'], 'scan_number': [7, 11], 'source_name': ['Venus_0'], 'spectral_window_name': 'X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0', 'taql': 'WHERE (DATA_DESC_ID IN [0]) AND(OBSERVATION_ID IN [0]) AND(STATE_ID IN [15,22,29,20]) AND(FIELD_ID IN [1]) AND(SCAN_NUMBER IN [7,11]) AND(STATE_ID IN [15,22,29,20]) '}
- processor_info :
- {'sub_type': 'ALMA_CORRELATOR_MODE', 'type': 'CORRELATOR'}
- schema_version :
- 4.0.-9994
- type :
- visibility
- xradio_version :
- 0.0.41
- antenna_xds :
- <xarray.Dataset> Size: 7kB\n",
- "Dimensions: (antenna_name: 47, cartesian_pos_label: 3,\n",
- " receptor_label: 2)\n",
- "Coordinates:\n",
- " * antenna_name (antenna_name) <U9 2kB 'DA41_A058' ... 'DV25_A006'\n",
- " * cartesian_pos_label (cartesian_pos_label) <U1 12B 'x' 'y' 'z'\n",
- " mount (antenna_name) <U6 1kB dask.array<chunksize=(47,), meta=np.ndarray>\n",
- " polarization_type (antenna_name, receptor_label) <U1 376B dask.array<chunksize=(47, 2), meta=np.ndarray>\n",
- " * receptor_label (receptor_label) <U5 40B 'pol_0' 'pol_1'\n",
- " station (antenna_name) <U4 752B dask.array<chunksize=(47,), meta=np.ndarray>\n",
- " telescope_name (antenna_name) <U4 752B dask.array<chunksize=(47,), meta=np.ndarray>\n",
- "Data variables:\n",
- " ANTENNA_DISH_DIAMETER (antenna_name) float64 376B dask.array<chunksize=(47,), meta=np.ndarray>\n",
- " ANTENNA_POSITION (antenna_name, cartesian_pos_label) float64 1kB dask.array<chunksize=(47, 3), meta=np.ndarray>\n",
- " ANTENNA_RECEPTOR_ANGLE (antenna_name, receptor_label) float64 752B dask.array<chunksize=(47, 2), meta=np.ndarray>\n",
- "Attributes:\n",
- " overall_telescope_name: ALMA\n",
- " relocatable_antennas: True\n",
- " type: antenna
"
- ],
- "text/plain": [
- " Size: 2MB\n",
- "Dimensions: (baseline_id: 1128, time: 20, frequency: 1,\n",
- " polarization: 2, uvw_label: 3)\n",
- "Coordinates:\n",
- " baseline_antenna1_name (baseline_id) \n",
- " baseline_antenna2_name (baseline_id) \n",
- " * baseline_id (baseline_id) int64 9kB 0 1 2 ... 1125 1126 1127\n",
- " scan_number (time) int64 160B dask.array\n",
- " * time (time) float64 160B 1.547e+09 ... 1.547e+09\n",
- " * frequency (frequency) float64 8B 2.452e+11\n",
- " * polarization (polarization) \n",
- " FLAG (time, baseline_id, frequency, polarization) bool 45kB dask.array\n",
- " TIME_CENTROID (time, baseline_id) float64 180kB dask.array\n",
- " UVW (time, baseline_id, uvw_label) float64 541kB dask.array\n",
- " VISIBILITY (time, baseline_id, frequency, polarization) complex64 361kB dask.array\n",
- " WEIGHT (time, baseline_id, frequency, polarization) float32 180kB dask.array\n",
- "Attributes:\n",
- " creation_date: 2024-10-14T13:41:37.351595\n",
- " data_groups: {'base': {'correlated_data': 'VISIBILITY', 'flag': 'FL...\n",
- " observation_info: {'execution_block_UID': ' Size: 7kB\\nDimensions: ..."
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"ps[\"venus_ephem_test_0\"]"
]
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"id": "079098b0-f78e-4ace-907a-5c63f157b107",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{'execution_block_UID': '',\n",
- " 'execution_block_id': 'ExecBlock_0',\n",
- " 'execution_block_number': 999,\n",
- " 'observer': ['sv2421'],\n",
- " 'observing_log': '',\n",
- " 'observing_script': 'StandardInterferometry.py',\n",
- " 'observing_script_UID': '',\n",
- " 'project': 'uid://A001/X12ea/X715',\n",
- " 'release_date': '1858-11-17T00:00:00.000000000',\n",
- " 'session_reference': ''}"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"main_xds = ps[\"venus_ephem_test_0\"]\n",
"main_xds.observation_info"
@@ -1580,833 +272,10 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"id": "ba761deb-b7a9-4b2b-8163-3050413fe59c",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
<xarray.Dataset> Size: 7kB\n",
- "Dimensions: (antenna_name: 47, cartesian_pos_label: 3,\n",
- " receptor_label: 2)\n",
- "Coordinates:\n",
- " * antenna_name (antenna_name) <U9 2kB 'DA41_A058' ... 'DV25_A006'\n",
- " * cartesian_pos_label (cartesian_pos_label) <U1 12B 'x' 'y' 'z'\n",
- " mount (antenna_name) <U6 1kB dask.array<chunksize=(47,), meta=np.ndarray>\n",
- " polarization_type (antenna_name, receptor_label) <U1 376B dask.array<chunksize=(47, 2), meta=np.ndarray>\n",
- " * receptor_label (receptor_label) <U5 40B 'pol_0' 'pol_1'\n",
- " station (antenna_name) <U4 752B dask.array<chunksize=(47,), meta=np.ndarray>\n",
- " telescope_name (antenna_name) <U4 752B dask.array<chunksize=(47,), meta=np.ndarray>\n",
- "Data variables:\n",
- " ANTENNA_DISH_DIAMETER (antenna_name) float64 376B dask.array<chunksize=(47,), meta=np.ndarray>\n",
- " ANTENNA_POSITION (antenna_name, cartesian_pos_label) float64 1kB dask.array<chunksize=(47, 3), meta=np.ndarray>\n",
- " ANTENNA_RECEPTOR_ANGLE (antenna_name, receptor_label) float64 752B dask.array<chunksize=(47, 2), meta=np.ndarray>\n",
- "Attributes:\n",
- " overall_telescope_name: ALMA\n",
- " relocatable_antennas: True\n",
- " type: antenna
- antenna_name: 47
- cartesian_pos_label: 3
- receptor_label: 2
antenna_name
(antenna_name)
<U9
'DA41_A058' ... 'DV25_A006'
array(['DA41_A058', 'DA42_A023', 'DA43_A035', 'DA44_A001', 'DA45_A036',\n",
- " 'DA47_A049', 'DA49_A024', 'DA50_A034', 'DA51_A002', 'DA52_A082',\n",
- " 'DA53_A033', 'DA54_A018', 'DA55_A040', 'DA56_A039', 'DA57_A041',\n",
- " 'DA58_A005', 'DA59_A031', 'DA60_A043', 'DA61_A019', 'DA62_A050',\n",
- " 'DA63_A085', 'DA64_A015', 'DA65_A068', 'DV01_A045', 'DV02_A048',\n",
- " 'DV03_A044', 'DV04_A066', 'DV05_A007', 'DV06_A027', 'DV07_A008',\n",
- " 'DV08_A042', 'DV09_A074', 'DV10_A062', 'DV11_A016', 'DV12_A003',\n",
- " 'DV13_A010', 'DV14_A017', 'DV15_A047', 'DV16_A069', 'DV17_A060',\n",
- " 'DV18_A004', 'DV19_A026', 'DV20_A072', 'DV21_A011', 'DV23_A022',\n",
- " 'DV24_A088', 'DV25_A006'], dtype='<U9')
cartesian_pos_label
(cartesian_pos_label)
<U1
'x' 'y' 'z'
array(['x', 'y', 'z'], dtype='<U1')
mount
(antenna_name)
<U6
dask.array<chunksize=(47,), meta=np.ndarray>
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 1.10 kiB | \n",
- " 1.10 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (47,) | \n",
- " (47,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
polarization_type
(antenna_name, receptor_label)
<U1
dask.array<chunksize=(47, 2), meta=np.ndarray>
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 376 B | \n",
- " 376 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (47, 2) | \n",
- " (47, 2) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
receptor_label
(receptor_label)
<U5
'pol_0' 'pol_1'
array(['pol_0', 'pol_1'], dtype='<U5')
station
(antenna_name)
<U4
dask.array<chunksize=(47,), meta=np.ndarray>
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 752 B | \n",
- " 752 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (47,) | \n",
- " (47,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
telescope_name
(antenna_name)
<U4
dask.array<chunksize=(47,), meta=np.ndarray>
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 752 B | \n",
- " 752 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (47,) | \n",
- " (47,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
ANTENNA_DISH_DIAMETER
(antenna_name)
float64
dask.array<chunksize=(47,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 376 B | \n",
- " 376 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (47,) | \n",
- " (47,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
ANTENNA_POSITION
(antenna_name, cartesian_pos_label)
float64
dask.array<chunksize=(47, 3), meta=np.ndarray>
- coordinate_system :
- geocentric
- frame :
- GRS80
- origin_object_name :
- earth
- type :
- location
- units :
- ['m', 'm', 'm']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 1.10 kiB | \n",
- " 1.10 kiB | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (47, 3) | \n",
- " (47, 3) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
ANTENNA_RECEPTOR_ANGLE
(antenna_name, receptor_label)
float64
dask.array<chunksize=(47, 2), meta=np.ndarray>
- type :
- quantity
- units :
- ['rad']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 752 B | \n",
- " 752 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (47, 2) | \n",
- " (47, 2) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
PandasIndex
PandasIndex(Index(['DA41_A058', 'DA42_A023', 'DA43_A035', 'DA44_A001', 'DA45_A036',\n",
- " 'DA47_A049', 'DA49_A024', 'DA50_A034', 'DA51_A002', 'DA52_A082',\n",
- " 'DA53_A033', 'DA54_A018', 'DA55_A040', 'DA56_A039', 'DA57_A041',\n",
- " 'DA58_A005', 'DA59_A031', 'DA60_A043', 'DA61_A019', 'DA62_A050',\n",
- " 'DA63_A085', 'DA64_A015', 'DA65_A068', 'DV01_A045', 'DV02_A048',\n",
- " 'DV03_A044', 'DV04_A066', 'DV05_A007', 'DV06_A027', 'DV07_A008',\n",
- " 'DV08_A042', 'DV09_A074', 'DV10_A062', 'DV11_A016', 'DV12_A003',\n",
- " 'DV13_A010', 'DV14_A017', 'DV15_A047', 'DV16_A069', 'DV17_A060',\n",
- " 'DV18_A004', 'DV19_A026', 'DV20_A072', 'DV21_A011', 'DV23_A022',\n",
- " 'DV24_A088', 'DV25_A006'],\n",
- " dtype='object', name='antenna_name'))
PandasIndex
PandasIndex(Index(['x', 'y', 'z'], dtype='object', name='cartesian_pos_label'))
PandasIndex
PandasIndex(Index(['pol_0', 'pol_1'], dtype='object', name='receptor_label'))
- overall_telescope_name :
- ALMA
- relocatable_antennas :
- True
- type :
- antenna
"
- ],
- "text/plain": [
- " Size: 7kB\n",
- "Dimensions: (antenna_name: 47, cartesian_pos_label: 3,\n",
- " receptor_label: 2)\n",
- "Coordinates:\n",
- " * antenna_name (antenna_name) \n",
- " polarization_type (antenna_name, receptor_label) \n",
- " * receptor_label (receptor_label) \n",
- " telescope_name (antenna_name) \n",
- "Data variables:\n",
- " ANTENNA_DISH_DIAMETER (antenna_name) float64 376B dask.array\n",
- " ANTENNA_POSITION (antenna_name, cartesian_pos_label) float64 1kB dask.array\n",
- " ANTENNA_RECEPTOR_ANGLE (antenna_name, receptor_label) float64 752B dask.array\n",
- "Attributes:\n",
- " overall_telescope_name: ALMA\n",
- " relocatable_antennas: True\n",
- " type: antenna"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"ps[\"venus_ephem_test_0\"].attrs[\n",
" \"antenna_xds\"\n",
@@ -2415,879 +284,10 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"id": "24e79ab8",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
<xarray.Dataset> Size: 544B\n",
- "Dimensions: (time_ephemeris: 2, sky_pos_label: 3,\n",
- " line_label: 1, ellipsoid_pos_label: 3,\n",
- " sky_dir_label: 2)\n",
- "Coordinates:\n",
- " * ellipsoid_pos_label (ellipsoid_pos_label) <U4 48B 'lon' 'lat' 'dist'\n",
- " field_name <U7 28B ...\n",
- " * line_label (line_label) <U21 84B '0'\n",
- " line_name (line_label) <U17 68B dask.array<chunksize=(1,), meta=np.ndarray>\n",
- " * sky_dir_label (sky_dir_label) <U3 24B 'ra' 'dec'\n",
- " * sky_pos_label (sky_pos_label) <U4 48B 'ra' 'dec' 'dist'\n",
- " source_name <U7 28B ...\n",
- " * time_ephemeris (time_ephemeris) float64 16B 1.547e+09 1.547e+09\n",
- "Data variables:\n",
- " FIELD_PHASE_CENTER (time_ephemeris, sky_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
- " LINE_REST_FREQUENCY (line_label) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
- " LINE_SYSTEMIC_VELOCITY (line_label) float64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
- " OBSERVER_POSITION (ellipsoid_pos_label) float64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
- " SOURCE_LOCATION (time_ephemeris, sky_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
- " SOURCE_RADIAL_VELOCITY (time_ephemeris) float64 16B dask.array<chunksize=(2,), meta=np.ndarray>\n",
- " SUB_OBSERVER_DIRECTION (time_ephemeris, ellipsoid_pos_label) float64 48B dask.array<chunksize=(2, 3), meta=np.ndarray>\n",
- "Attributes:\n",
- " is_ephemeris: True\n",
- " type: field_and_source
- time_ephemeris: 2
- sky_pos_label: 3
- line_label: 1
- ellipsoid_pos_label: 3
- sky_dir_label: 2
FIELD_PHASE_CENTER
(time_ephemeris, sky_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 48 B | \n",
- " 48 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (2, 3) | \n",
- " (2, 3) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
LINE_REST_FREQUENCY
(line_label)
float64
dask.array<chunksize=(1,), meta=np.ndarray>
- observer :
- lsrk
- type :
- spectral_coord
- units :
- ['Hz']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 8 B | \n",
- " 8 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (1,) | \n",
- " (1,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
LINE_SYSTEMIC_VELOCITY
(line_label)
float64
dask.array<chunksize=(1,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 8 B | \n",
- " 8 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (1,) | \n",
- " (1,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
OBSERVER_POSITION
(ellipsoid_pos_label)
float64
dask.array<chunksize=(3,), meta=np.ndarray>
- coordinate_system :
- geocentric
- data :
- [0.0, 0.0, 0.0]
- frame :
- WGS84
- origin_object_name :
- Earth
- type :
- location
- units :
- ['rad', 'rad', 'm']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 24 B | \n",
- " 24 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (3,) | \n",
- " (3,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
SOURCE_LOCATION
(time_ephemeris, sky_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- frame :
- icrs
- type :
- sky_coord
- units :
- ['rad', 'rad', 'm']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 48 B | \n",
- " 48 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (2, 3) | \n",
- " (2, 3) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
SOURCE_RADIAL_VELOCITY
(time_ephemeris)
float64
dask.array<chunksize=(2,), meta=np.ndarray>
- type :
- quantity
- units :
- ['m/s']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 16 B | \n",
- " 16 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (2,) | \n",
- " (2,) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
SUB_OBSERVER_DIRECTION
(time_ephemeris, ellipsoid_pos_label)
float64
dask.array<chunksize=(2, 3), meta=np.ndarray>
- coordinate_system :
- planetodetic
- frame :
- Undefined
- origin_object_name :
- Venus
- type :
- location
- units :
- ['rad', 'rad', 'm']
\n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " Array | \n",
- " Chunk | \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " Bytes | \n",
- " 48 B | \n",
- " 48 B | \n",
- " \n",
- " \n",
- " \n",
- " Shape | \n",
- " (2, 3) | \n",
- " (2, 3) | \n",
- " \n",
- " \n",
- " Dask graph | \n",
- " 1 chunks in 2 graph layers | \n",
- " \n",
- " \n",
- " Data type | \n",
- " float64 numpy.ndarray | \n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- "
PandasIndex
PandasIndex(Index(['lon', 'lat', 'dist'], dtype='object', name='ellipsoid_pos_label'))
PandasIndex
PandasIndex(Index(['0'], dtype='object', name='line_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec'], dtype='object', name='sky_dir_label'))
PandasIndex
PandasIndex(Index(['ra', 'dec', 'dist'], dtype='object', name='sky_pos_label'))
PandasIndex
PandasIndex(Index([1546946399.9999998, 1546947599.9999998], dtype='float64', name='time_ephemeris'))
- is_ephemeris :
- True
- type :
- field_and_source
"
- ],
- "text/plain": [
- " Size: 544B\n",
- "Dimensions: (time_ephemeris: 2, sky_pos_label: 3,\n",
- " line_label: 1, ellipsoid_pos_label: 3,\n",
- " sky_dir_label: 2)\n",
- "Coordinates:\n",
- " * ellipsoid_pos_label (ellipsoid_pos_label) \n",
- " * sky_dir_label (sky_dir_label) \n",
- " LINE_REST_FREQUENCY (line_label) float64 8B dask.array\n",
- " LINE_SYSTEMIC_VELOCITY (line_label) float64 8B dask.array\n",
- " OBSERVER_POSITION (ellipsoid_pos_label) float64 24B dask.array\n",
- " SOURCE_LOCATION (time_ephemeris, sky_pos_label) float64 48B dask.array\n",
- " SOURCE_RADIAL_VELOCITY (time_ephemeris) float64 16B dask.array\n",
- " SUB_OBSERVER_DIRECTION (time_ephemeris, ellipsoid_pos_label) float64 48B dask.array\n",
- "Attributes:\n",
- " is_ephemeris: True\n",
- " type: field_and_source"
- ]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"ps[\"venus_ephem_test_0\"].VISIBILITY.attrs[\n",
" \"field_and_source_xds\"\n",
@@ -3296,22 +296,10 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": null,
"id": "500a2998",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[-2.10546176e+00, -2.96016890e-01, 1.03421121e+11],\n",
- " [-2.10521098e+00, -2.96071311e-01, 1.03436687e+11]])"
- ]
- },
- "execution_count": 9,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"ps[\"venus_ephem_test_5\"].VISIBILITY.attrs[\n",
" \"field_and_source_xds\"\n",
@@ -3320,62 +308,20 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": null,
"id": "23704913",
"metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAHHCAYAAACFl+2TAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIc0lEQVR4nO3deXyU1aH/8e8kkAxbAoFsyBawIgGUpY0gIi5gUKSiYgUFWRX5YZGgslytEKgsooK2iLVXFhEFsSLFclEUuBUIokCsMUJZAqgEUJAkCAmQnN8f3EwZMoFMMvPM9nm/XvNq55kzz5w5TGa+nnOec2zGGCMAAAB4VZivKwAAABAKCF0AAAAWIHQBAABYgNAFAABgAUIXAACABQhdAAAAFiB0AQAAWIDQBQAAYAFCFwAAgAUIXQDgJ2w2myZPnlyhss2aNdPgwYO9Wh8AnkXoAkLUq6++KpvNpuuuu67K51q9enWFw0KgWLhwoWw2m+Nmt9t11VVX6bHHHtORI0csqcPmzZs1efJknThxwpLXA+BdNvZeBEJTly5ddOjQIe3fv1+7d+/WlVdeWelzPfbYY5o7d66C6etk4cKFGjJkiKZMmaKkpCQVFhZq48aNWrx4sZo2baqsrCzVrFnTo69ZWFioatWqqVq1apKkF154QU899ZRycnLUrFkzp7JFRUUKCwtT9erVPVoHAN5DTxcQgnJycrR582a99NJLio2N1ZIlS3xdJb91++23a8CAARo+fLgWLlyoMWPGKCcnRytXrvT4a9ntdkfgupzIyEgCFxBgCF1ACFqyZInq1aunXr16qW/fvi5D1/79+2Wz2fTCCy/o9ddfV4sWLRQZGanf/OY3+uKLLxzlBg8erLlz50qS03BcqZKSEs2ZM0etW7eW3W5XfHy8RowYoZ9//tnp9Zo1a6Y777xTGzduVEpKiux2u5o3b64333zTqVzpsN+mTZs0duxYxcbGqlatWrr77rv1448/OpVduXKlevXqpYYNGyoyMlItWrTQ1KlTVVxcXOm2u+WWWySdD66SdO7cOU2dOtXRPs2aNdN//dd/qaioyOl5X375pVJTU9WgQQPVqFFDSUlJGjp0qFOZC+d0TZ48WU899ZQkKSkpydGu+/fvd7TXxXO69u3bp/vuu08xMTGqWbOmOnXqpH/84x9OZTZs2CCbzaZ3331Xzz33nBo1aiS73a5bb71Ve/bscSq7e/du3XvvvUpISJDdblejRo3Ur18/5eXlVbr9gFBWsf+kAhBUlixZonvuuUcRERHq37+/5s2bpy+++EK/+c1vypR9++23VVBQoBEjRshms+n555/XPffco3379ql69eoaMWKEDh06pLVr12rx4sVlnj9ixAjHUN3o0aOVk5OjP//5z9qxY4c2bdrk1FuzZ88e9e3bV8OGDdOgQYM0f/58DR48WB07dlTr1q2dzvv73/9e9erV06RJk7R//37NmTNHjz32mJYtW+Yos3DhQtWuXVtjx45V7dq1tW7dOj377LPKz8/XrFmzKtV2e/fulSTVr19fkjR8+HAtWrRIffv21RNPPKHPP/9c06dP17fffqsVK1ZIko4eParbbrtNsbGxmjBhgurWrav9+/fr/fffL/d17rnnHv373//WO++8o9mzZ6tBgwaSpNjYWJfljxw5ouuvv16nTp3S6NGjVb9+fS1atEi//e1v9d577+nuu+92Kj9jxgyFhYXpySefVF5enp5//nk9+OCD+vzzzyVJZ86cUWpqqoqKivT73/9eCQkJ+uGHH/Thhx/qxIkTio6OrlT7ASHNAAgpX375pZFk1q5da4wxpqSkxDRq1Mg8/vjjTuVycnKMJFO/fn1z/Phxx/GVK1caSWbVqlWOY6NGjTKuvk4+++wzI8ksWbLE6fiaNWvKHG/atKmRZP75z386jh09etRERkaaJ554wnFswYIFRpLp3r27KSkpcRxPS0sz4eHh5sSJE45jp06dKlOnESNGmJo1a5rCwsJy2+jC1/nkk0/Mjz/+aL777juzdOlSU79+fVOjRg3z/fffm8zMTCPJDB8+3Om5Tz75pJFk1q1bZ4wxZsWKFUaS+eKLLy75mpLMpEmTHPdnzZplJJmcnJwyZZs2bWoGDRrkuD9mzBgjyXz22WeOYwUFBSYpKck0a9bMFBcXG2OMWb9+vZFkWrVqZYqKihxlX375ZSPJfP3118YYY3bs2GEkmeXLl1+yzgAqjuFFIMQsWbJE8fHxuvnmmyWdH9K6//77tXTpUpfDbvfff7/q1avnuN+1a1dJ54eyLmf58uWKjo5Wjx499NNPPzluHTt2VO3atbV+/Xqn8snJyY7zS+d7dVq2bOnytR555BGnYcyuXbuquLhYBw4ccByrUaOG4/8XFBTop59+UteuXXXq1Cnt3LnzsvWXpO7duys2NlaNGzdWv379VLt2ba1YsUJXXHGFVq9eLUkaO3as03OeeOIJSXIM7dWtW1eS9OGHH+rs2bMVel13rV69WikpKbrhhhscx2rXrq1HHnlE+/fvV3Z2tlP5IUOGKCIiwnH/4n/X0p6sjz76SKdOnfJKnYFQQ+iySLNmzZzmu9hsNs2YMaNCzzXG6Pbbb5fNZtMHH3zgssyxY8fUqFEj2Wy2Sl1enpGRoVtuuUW1atVSVFSUbrzxRp0+fdrt88C/FRcXa+nSpbr55puVk5OjPXv2aM+ePbruuut05MgRffrpp2We06RJE6f7pQHs4jlZruzevVt5eXmKi4tTbGys0+3kyZM6evToJV+r9PVcvVZF6vXNN9/o7rvvVnR0tKKiohQbG6sBAwZIUoXnJc2dO1dr167V+vXrlZ2drX379ik1NVWSdODAAYWFhZW58jMhIUF169Z1BMBu3brp3nvvVXp6uho0aKC77rpLCxYsKDPvqyoOHDigli1bljneqlUrx+MXulz7JSUlaezYsfrv//5vNWjQQKmpqZo7dy7zuYAqYE6XhaZMmaKHH37Ycb9OnToVet6cOXOc/ovelWHDhumaa67RDz/84Ha9MjIy1LNnT02cOFF/+tOfVK1aNX311VcKCyOTB5t169YpNzdXS5cu1dKlS8s8vmTJEt12221Ox8LDw12ey1RgeYiSkhLFxcWVe3XkxfOT3Hmty5U9ceKEunXrpqioKE2ZMkUtWrSQ3W7X9u3bNX78eJWUlFy2/pKUkpKiX//615csc7m/T5vNpvfee09btmzRqlWr9NFHH2no0KF68cUXtWXLFtWuXbtCdfGkirT1iy++qMGDB2vlypX6+OOPNXr0aE2fPl1btmxRo0aNrKoqEDQIXRaqU6eOEhIS3HpOZmamXnzxRX355ZdKTEx0WWbevHk6ceKEnn32Wf3P//xPmcdXrlyp9PR0ZWdnq2HDhho0aJCefvppx6XpaWlpGj16tCZMmOB4jqv/YkbgW7JkieLi4hxXG17o/fff14oVK/Taa685DctVRHmho0WLFvrkk0/UpUsXt89ZVRs2bNCxY8f0/vvv68Ybb3QcL73q0BOaNm2qkpIS7d6929GjJJ2f1H7ixAk1bdrUqXynTp3UqVMnPffcc3r77bf14IMPaunSpRo+fLjL818uzF1cl127dpU5XjqMenFdKqpt27Zq27atnnnmGW3evFldunTRa6+9pj/+8Y+VOh8QyujKsNCMGTNUv359tW/fXrNmzdK5c+cuWf7UqVN64IEHNHfu3HLDWnZ2tqZMmaI333zTZc/UZ599poceekiPP/64srOz9Ze//EULFy7Uc889J+n8VVWff/654uLidP311ys+Pl7dunXTxo0bq/6G4VdOnz6t999/X3feeaf69u1b5vbYY4+poKBAf//7390+d61atSSpzND27373OxUXF2vq1KllnnPu3DmvrrRe2pNzYc/NmTNn9Oqrr3rsNe644w5J53ujL/TSSy9Jknr16iXp/JDdxb117dq1k6RLDjGW167l1WXr1q3KyMhwHPvll1/0+uuvq1mzZkpOTr7sOS6Un59f5juqbdu2CgsL8+iwKBBK6OmyyOjRo9WhQwfFxMRo8+bNmjhxonJzcx1fzq6kpaXp+uuv11133eXy8aKiIvXv31+zZs1SkyZNXE42Tk9P14QJEzRo0CBJUvPmzTV16lSNGzdOkyZNcjxn8uTJeuGFF9SuXTu9+eabuvXWW5WVlaVf/epXHnj38Ad///vfVVBQoN/+9rcuH+/UqZNjodT777/frXN37NhR0vnPeWpqqsLDw9WvXz9169ZNI0aM0PTp05WZmanbbrtN1atX1+7du7V8+XK9/PLL6tu3b5XfmyvXX3+96tWrp0GDBmn06NGy2WxavHixR1fNv/baazVo0CC9/vrrjuHMrVu3atGiRerTp4/jYoVFixbp1Vdf1d13360WLVqooKBAf/3rXxUVFeUIbq6UtuvTTz+tfv36qXr16urdu7cjjF1owoQJeuedd3T77bdr9OjRiomJ0aJFi5STk6O//e1vbk8XWLdunR577DHdd999uuqqq3Tu3DktXrxY4eHhuvfee906F4D/47sLJwPf+PHjjaRL3r799luXz33jjTdMtWrVyr1sfeXKlebKK680BQUFjmOSzIoVKxz309LSzP333++4X3op+M8//+w41qBBA2O3202tWrUcN7vdbiSZX375xWzatMlIMhMnTnR6/bZt25oJEyZUolXgr3r37m3sdrv55Zdfyi0zePBgU716dfPTTz85loyYNWtWmXK6aGmDc+fOmd///vcmNjbW2Gy2MstHvP7666Zjx46mRo0apk6dOqZt27Zm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nz4tSbLb7WUea926tcLC/jMDIz4+Xm3atHHcDw8PV/369XX06FGn59WoUUOnTp2q6tsAcJH27duruLhYR48eVdeuXV2W6dKli86dO6e9e/eqRYsWkqR///vfkqSmTZtaVtfyELoABJW9e/fq0KFDKikp0f79+9W2bdtyy9avX182m00///xzmceqV6/udN9ms7k8VlJS4nTs+PHjio2NrcI7AELXyZMntWfPHsf9nJwcZWZmKiYmRldddZUefPBBPfTQQ3rxxRfVvn17/fjjj/r00091zTXXqFevXurevbs6dOigoUOHas6cOSopKdGoUaPUo0ePMsOSvsBEegBB48yZMxowYIDuv/9+TZ06VcOHDy/TE3WhiIgIJScnKzs722N1yMrKUvv27T12PiCUfPnll2rfvr3jb2js2LFq3769nn32WUnSggUL9NBDD+mJJ55Qy5Yt1adPH33xxRdq0qSJJCksLEyrVq1SgwYNdOONN6pXr15q1aqVli5d6rP3dCF6ugAEjaefflp5eXl65ZVXVLt2ba1evVpDhw7Vhx9+WO5zUlNTtXHjRo0ZM6bKr3/q1Clt27bN6QpKABV300036VLLh1avXl3p6elKT08vt0zDhg31t7/9zRvVqzJ6ugAEhQ0bNmjOnDlavHixoqKiFBYWpsWLF+uzzz7TvHnzyn3esGHDtHr1auXl5VW5DitXrlSTJk3KnW8CILSxIj2AkHffffepQ4cOmjhxYpXO06lTJ40ePVoPPPCAh2oGIJjQ0wUg5M2aNctxyXll/fTTT7rnnnvUv39/D9UKQLChpwsAAMAC9HQBAABYgNAFAABgAUIXAACABQhdAAAAFiB0AQAAWIDQBQAAYAFCFwAAgAUIXQAAABYgdAEAAFjg/wNV6vuUMl6UjgAAAABJRU5ErkJggg==",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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A9WMiMi4MOgiolorKxeI252Fyp7GUW6L252FsnI+r0NExKCLiGrtRM7NCj1cjxIA8grv4UTOTekqRURkpBh0EVGt3SiuOuCqTTkiInPGoIuIas2toUKn5YiIzBmDLiKqtQ6+zvB0VKCqxBAyPHyKsYOvs5TVIiIySgy6iKjWrK1kiO0TCAAVAi/l+9g+gczXRUQEBl1EVEcRrT2xZkhbeDiqDyF6OCqwZkhb5ukiIvr/mByViOosorUnegZ6MCM9EVE1GHQRkU5YW8kQ4u9i6GoQERktDi8SERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEETC7oKikpQZs2bSCTyZCRkaHanpubC5lMVuF1/PhxteOTkpLQokULKBQKBAUFYd++fRLfAREREVkikwu6Zs6cCS8vryr3Hzx4EHl5eapXu3btVPvS0tIwaNAgjBw5EmfPnkVUVBSioqKQmZkpRdWJiIjIgplU0PXvf/8b33//PZYtW1ZlGRcXF3h4eKhetra2qn0rV65EREQEZsyYgZYtW2LBggVo27YtPvnkEymqT0RERBbMZIKugoICjB49Gps3b0a9evWqLNe3b1+4ubkhNDQU3333ndq+9PR0hIWFqW0LDw9Henp6lecrKSlBUVGR2ouIiIhIWyYRdAkhEB0djbFjx6J9+/aVlmnQoAGWL1+OpKQk7N27F6GhoYiKilILvPLz8+Hu7q52nLu7O/Lz86u8dnx8PBwdHVWvJk2a6OamiIiIyKLYGPLis2fPxuLFi6stc+HCBXz//fcoLi5GTExMleUaN26MadOmqd4/++yzuH79OpYuXYq+ffvWuo4xMTFq5y0qKmLgRURERFozaNA1ffp0REdHV1vGz88PKSkpSE9Ph1wuV9vXvn17DB48GJs2bar02I4dOyI5OVn13sPDAwUFBWplCgoK4OHhUeX15XJ5hesSERERacugQZerqytcXV1rLPfRRx/hvffeU72/fv06wsPDsW3bNnTs2LHK4zIyMuDp6al6HxISgkOHDmHKlCmqbcnJyQgJCandDRARERFpyKBBl6aaNm2q9r5BgwYAAH9/f3h7ewMANm3aBDs7OwQHBwMAvvnmG2zYsAGff/656rjJkyeje/fuWL58OSIjI5GYmIhTp05h3bp1Et0JERERWSqTCLo0tWDBAly9ehU2NjZo0aIFtm3bhgEDBqj2d+7cGVu3bsXcuXPx9ttv48knn8TOnTvRunVrA9aaiIiILIFMCCEMXQlTUlRUBEdHRxQWFsLBwcHQ1SEiIiINGMP3t0mkjCAiIiIydQy6iIiIiCTAoIuIiIhIAgy6iIiIiCTAoIuIiIhIAgy6iIiIiCRgVnm6iIiISL/KygVO5NzEjeJ7cGuoQAdfZ1hbyQxdLZPAoIuIiIg0sj8zD3G7s5BXeE+1zdNRgdg+gYho7VnNkQRweJGIiIg0sD8zD+O+PKMWcAFAfuE9jPvyDPZn5hmoZqaDQRcRERFVq6xcIG53Fipbwka5LW53FsrKuchNdRh0ERERUbVO5Nys0MP1KAEgr/AeTuTclK5SJohBFxEREVXrRnHVAVdtylkqBl1ERERULbeGCp2Ws1QMuoiIiKhaHXyd4emoQFWJIWR4+BRjB19nKatlchh0ERERUbWsrWSI7RMIABUCL+X72D6BzNdVAwZdREREVKOI1p5YM6QtPBzVhxA9HBVYM6Qt83RpgMlRiYiISCMRrT3RM9CDGelriUEXERERaczaSoYQfxdDV8MkcXiRiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAImE3Q1a9YMMplM7bVo0SK1Mj/++CO6du0KhUKBJk2aYMmSJRXOk5SUhBYtWkChUCAoKAj79u2T6haIiIjIgplM0AUA8+fPR15enuo1ceJE1b6ioiL06tULPj4+OH36NJYuXYp58+Zh3bp1qjJpaWkYNGgQRo4cibNnzyIqKgpRUVHIzMw0xO0QERGRBbExdAW00bBhQ3h4eFS6b8uWLbh//z42bNgAOzs7tGrVChkZGVixYgXefPNNAMDKlSsRERGBGTNmAAAWLFiA5ORkfPLJJ1i7dq1k90FERESWx6R6uhYtWgQXFxcEBwdj6dKlKC0tVe1LT09Ht27dYGdnp9oWHh6Oixcv4tatW6oyYWFhaucMDw9Henp6ldcsKSlBUVGR2ouIiIhIWybT0zVp0iS0bdsWzs7OSEtLQ0xMDPLy8rBixQoAQH5+Pnx9fdWOcXd3V+1zcnJCfn6+atujZfLz86u8bnx8POLi4nR8N0RERGRpDNrTNXv27AqT4x9/ZWdnAwCmTZuGHj164Omnn8bYsWOxfPlyfPzxxygpKdFrHWNiYlBYWKh6Xbt2Ta/XIyIiIvNk0J6u6dOnIzo6utoyfn5+lW7v2LEjSktLkZubi4CAAHh4eKCgoECtjPK9ch5YVWWqmicGAHK5HHK5vKZbISIiIqqWQYMuV1dXuLq61urYjIwMWFlZwc3NDQAQEhKCOXPm4MGDB7C1tQUAJCcnIyAgAE5OTqoyhw4dwpQpU1TnSU5ORkhISN1uhIiIiKgGJjGRPj09HR9++CHOnTuHK1euYMuWLZg6dSqGDBmiCqhef/112NnZYeTIkTh//jy2bduGlStXYtq0aarzTJ48Gfv378fy5cuRnZ2NefPm4dSpU5gwYYKhbo2IiIgshEwIIQxdiZqcOXMG//rXv5CdnY2SkhL4+vpi6NChmDZtmtrQ348//ojx48fj5MmTaNy4MSZOnIhZs2apnSspKQlz585Fbm4unnzySSxZsgQvvfSSxnUpKiqCo6MjCgsL4eDgoLN7JCIiIv0xhu9vkwi6jIkx/NCIiIhIO8bw/W0Sw4tEREREpo5BFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERScBkgq5mzZpBJpOpvRYtWqTan5ubW2G/TCbD8ePH1c6TlJSEFi1aQKFQICgoCPv27ZP6VoiIiMgC2Ri6AtqYP38+Ro8erXrfsGHDCmUOHjyIVq1aqd67uLio/j8tLQ2DBg1CfHw8evfuja1btyIqKgpnzpxB69at9Vt5IiIismgmFXQ1bNgQHh4e1ZZxcXGpsszKlSsRERGBGTNmAAAWLFiA5ORkfPLJJ1i7dq3O60tERESkZDLDiwCwaNEiuLi4IDg4GEuXLkVpaWmFMn379oWbmxtCQ0Px3Xffqe1LT09HWFiY2rbw8HCkp6dXec2SkhIUFRWpvYiIiIi0ZTI9XZMmTULbtm3h7OyMtLQ0xMTEIC8vDytWrAAANGjQAMuXL0eXLl1gZWWFr7/+GlFRUdi5cyf69u0LAMjPz4e7u7vaed3d3ZGfn1/ldePj4xEXF6e/GyMiIiKLIBNCCENdfPbs2Vi8eHG1ZS5cuIAWLVpU2L5hwwaMGTMGf//9N+RyeaXHDhs2DDk5OThy5AgAwM7ODps2bcKgQYNUZVavXo24uDgUFBRUeo6SkhKUlJSo3hcVFaFJkyYoLCyEg4NDjfdIREREhldUVARHR0eDfn8btKdr+vTpiI6OrraMn59fpds7duyI0tJS5ObmIiAgoMoyycnJqvceHh4VgquCgoJq54nJ5fIqgzoiIiIiTRk06HJ1dYWrq2utjs3IyICVlRXc3NyqLePp6al6HxISgkOHDmHKlCmqbcnJyQgJCalVHYiIiIg0ZRJzutLT0/HDDz/gueeeQ8OGDZGeno6pU6diyJAhcHJyAgBs2rQJdnZ2CA4OBgB888032LBhAz7//HPVeSZPnozu3btj+fLliIyMRGJiIk6dOoV169YZ5L6IiIjIcphE0CWXy5GYmIh58+ahpKQEvr6+mDp1KqZNm6ZWbsGCBbh69SpsbGzQokULbNu2DQMGDFDt79y5M7Zu3Yq5c+fi7bffxpNPPomdO3cyRxcRERHpnUEn0psiY5iIR0RERNoxhu9vk8rTRURERGSqGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEEGHQRERERSYBBFxEREZEETCI5KhERUWXKygVO5NzEjeJ7cGuoQAdfZ1hbyQxdLaJKMegiIiKTtD8zD3G7s5BXeE+1zdNRgdg+gYho7VnNkUSGweFFIiIyOfsz8zDuyzNqARcA5Bfew7gvz2B/Zp6BakZUNQZdRERkUsrKBeJ2Z6GyNeyU2+J2Z6GsnKvckXFh0EVERCblRM7NCj1cjxIA8grv4UTOTekqRaQBBl1ERGRSbhRXHXDVphyRVBh0ERGRSXFrqNBpOSKpMOgiIiKT0sHXGZ6OClSVGEKGh08xdvB1lrJaRDVi0EVERCbF2kqG2D6BAFAh8FK+j+0TyHxdZHQYdBERkcmJaO2JNUPawsNRfQjRw1GBNUPaMk8XGSUmRyUiIpMU0doTPQM9mJGeTAaDLiIiMlnWVjKE+LsYuhpEGuHwIhEREZEEGHQRERERSYDDi0QWrqxccE4MEZEEGHQRWbD9mXmI252ltqSKp6MCsX0C+fQXEZGOcXiRyELtz8zDuC/PVFjDLr/wHsZ9eQb7M/MMVDMiIvPEoIvIApWVC8TtzoKoZJ9yW9zuLJSVV1aCiIhqg0EXkQU6kXOzQg/XowSAvMJ7OJFzU7pKERGZOQZdRBboRnHVAVdtyhERUc0YdBFZILeGipoLaVGOiIhqxqCLyAJ18HWGp6OiwmLBSjI8fIqxg6+zlNUiIjJrDLqILJC1lQyxfQIBoELgpXwf2yeQ+bqIiHSIQReRhYpo7Yk1Q9rCw1F9CNHDUYE1Q9oyTxcRkY6ZVNC1d+9edOzYEfb29nByckJUVJTa/l9//RWRkZGoV68e3NzcMGPGDJSWlqqVSU1NRdu2bSGXy9G8eXNs3LhRuhsgMjIRrT1xdNbz+Gp0J6wc2AZfje6Eo7OeZ8BFRKQHWmWkv3DhAhITE3HkyBFcvXoVd+7cgaurK4KDgxEeHo7+/ftDLpfrpaJff/01Ro8ejYULF+L5559HaWkpMjMzVfvLysoQGRkJDw8PpKWlIS8vD8OGDYOtrS0WLlwIAMjJyUFkZCTGjh2LLVu24NChQxg1ahQ8PT0RHh6ul3oTGTtrKxlC/F0MXQ0iIrMnE0LUmP3wzJkzmDlzJo4ePYouXbqgQ4cO8PLygr29PW7evInMzEwcOXIERUVFmDlzJqZMmaLT4Ku0tBTNmjVDXFwcRo4cWWmZf//73+jduzeuX78Od3d3AMDatWsxa9Ys/PHHH7Czs8OsWbOwd+9etWBt4MCBuH37Nvbv369RXYqKiuDo6IjCwkI4ODjU/eaIiIhI74zh+1ujnq7+/ftjxowZ2LFjBxo1alRlufT0dKxcuRLLly/H22+/ras64syZM/j9999hZWWF4OBg5Ofno02bNli6dClat26tunZQUJAq4AKA8PBwjBs3DufPn0dwcDDS09MRFhamdu7w8HBMmTKlymuXlJSgpKRE9b6oqEhn90VEVeNC3ERkbjQKun7++WfY2trWWC4kJAQhISF48OBBnSv2qCtXrgAA5s2bhxUrVqBZs2ZYvnw5evTogZ9//hnOzs7Iz89XC7gAqN7n5+er/ltZmaKiIty9exf29vYVrh0fH4+4uDid3g8RVY8LcROROdJoIr0mAVdtys+ePRsymazaV3Z2NsrLywEAc+bMQf/+/dGuXTskJCRAJpMhKSlJq7ppKyYmBoWFharXtWvX9Ho9IkvHhbiJyFxpNZFe6eTJkzh8+DBu3LihCoiUVqxYofF5pk+fjujo6GrL+Pn5IS/v4YdsYGCgartcLoefnx9+/fVXAICHhwdOnDihdmxBQYFqn/K/ym2PlnFwcKi0l0t5HX09HEBE6mpaiFuGhwtx9wz04FAjEZkcrYOuhQsXYu7cuQgICIC7uztksv998D36/5pwdXWFq6trjeXatWsHuVyOixcvIjQ0FADw4MED5ObmwsfHB8DDoc33338fN27cgJubGwAgOTkZDg4OqmAtJCQE+/btUzt3cnIyQkJCtKo3EemHNgtx84lLIjI1WgddK1euxIYNG2rsodIlBwcHjB07FrGxsWjSpAl8fHywdOlSAMCrr74KAOjVqxcCAwMxdOhQLFmyBPn5+Zg7dy7Gjx+v6qkaO3YsPvnkE8ycORMjRoxASkoKtm/fjr1790p2L0RUNS7ETUTmTOugy8rKCl26dNFHXaq1dOlS2NjYYOjQobh79y46duyIlJQUODk5AQCsra2xZ88ejBs3DiEhIahfvz6GDx+O+fPnq87h6+uLvXv3YurUqVi5ciW8vb3x+eefM0cXkZHgQtxEZM40ytP1qCVLluD69ev48MMP9VQl42YMeT6IzFVZuUDo4hTkF96rdF6XDA+XKTo663nO6SIirRjD97fWPV1vvfUWIiMj4e/vj8DAwApPKn7zzTc6qxwRWRblQtzjvjwDGaAWeHEhbiIydVqvvThp0iQcPnwYTz31FFxcXODo6Kj2IiKqCy7ETUTmSuvhxYYNGyIxMRGRkZH6qpNRM4buSSJLwIz0RKRLxvD9rfXworOzM/z9/fVRFyIiFS7ETUTmRuvhxXnz5iE2NhZ37tzRR32IiIiIzJLWPV0fffQRLl++DHd3dzRr1qzCRPozZ87orHJERERE5kLroCsqKkoP1SBzwXk45oU/TyIi3dF6Ir2lM4aJeMZqf2Ye4nZnqS3j4umoQGyfQD5xZoKk/nkywCMifTKG72+Ngi4hhNbrKporY/ihGaP9mXkY9+WZCgktlb81fNTftEj982TATkT6Zgzf3xpNpG/VqhUSExNx//79asv98ssvGDduHBYtWqSTypFpKCsXiNudVWkGceW2uN1ZKCtnp6opkPrnqQzwHl/oOr/wHsZ9eQb7M/N0ch0iIkPTaE7Xxx9/jFmzZuFf//oXevbsifbt28PLywsKhQK3bt1CVlYWjh49ivPnz2PChAkYN26cvutNRuREzs0KX5iPEgDyCu/hRM5NpgAwAVL+PGsK8GR4GOD1DPTgUCMRmTyNgq4XXngBp06dwtGjR7Ft2zZs2bIFV69exd27d9G4cWMEBwdj2LBhGDx4sGoBarIcN4qr/oKuTTkyLCl/ngzYiciSaPX0YmhoKEJDQ/VVFzJRbg0VNRfSohwZlpQ/T2MP2Dm5n4h0SeuUEUSP6+DrDE9HBfIL71U6TCTDw3XzOvg6S101qgUpf57GHLBzcj8R6ZrWGemJHmdtJUNsn0AA/3u6TUn5PrZPIHsITISUP09lgFfVmWR4GOhIHbBzcj8R6QODLtKJiNaeWDOkLTwc1XskPBwVTBdhgqT6eRpjwM6ncYlIX5gcVUvGkOfDmHEOjHmR6udpTEN56Zf/wqDPjtdY7qvRnTi5n8iEGMP3N+d0kU5ZW8n4RWRGpPp5RrT2RM9AD6MI2I19cj8RmS6thxeff/55xMXFVdh+69YtPP/88zqpFBFpp6xcIP3yX9iV8TvSL/9lkkNfygCvX5snEOLvYrAeUmOe3E9Epk3rnq7U1FT89NNPOHv2LLZs2YL69esDAO7fv4///Oc/Oq8gEVXPmIbmzAGfxiUifanVRPqDBw8iPz8fnTp1Qm5uro6rRESa4lN2umeMk/uJyDzUKujy9PTEf/7zHwQFBeHZZ59FamqqjqtFRDXhU3b6w6dxiUgftB5elMke/nUnl8uxdetWvPfee4iIiMCsWbN0XjkiqhqX0NEvY5rcT0TmQeug6/EME3PnzkXLli0xfPhwnVWKiGrGp+z0j0/jEpEuaR105eTkwNXVVW1b//790aJFC5w6dUpnFSOi6vEpOyIi06J10OXj41Pp9latWqFVq1Z1rhARaYZP2RERmRYuA0RkoviUHRGRaWHQRWTC+JQdEZHp4DJARCaOT9kREZkGBl1EZoBP2RERGT8OLxIRERFJwKSCrr1796Jjx46wt7eHk5MToqKi1PbLZLIKr8TERLUyqampaNu2LeRyOZo3b46NGzdKdwNk8cxhYWpjwHYkIlNkMsOLX3/9NUaPHo2FCxfi+eefR2lpKTIzMyuUS0hIQEREhOp9o0aNVP+fk5ODyMhIjB07Flu2bMGhQ4cwatQoeHp6Ijw8XIrbIAvGhal1g+1IRKZKJh5PMW+ESktL0axZM8TFxWHkyJFVlpPJZPj2228r9IApzZo1C3v37lUL1gYOHIjbt29j//79GtWlqKgIjo6OKCwshIODg1b3QZZLuTD14//YlFPd+aShZvTRjmXlgg8hEFkAY/j+NonhxTNnzuD333+HlZUVgoOD4enpiRdffLHSnq7x48ejcePG6NChAzZs2KC2bFF6ejrCwsLUyoeHhyM9Pb3Ka5eUlKCoqEjtRaQNLkytG/pox/2ZeQhdnIJBnx3H5MQMDPrsOEIXp2B/Zp5O6kxE9CiTCLquXLkCAJg3bx7mzp2LPXv2wMnJCT169MDNmzdV5ebPn4/t27cjOTkZ/fv3x7/+9S98/PHHqv35+flwd3dXO7e7uzuKiopw9+7dSq8dHx8PR0dH1atJkyZ6uEMyZ9osTE1V03U7KnvNHj9nfuE9jPvyDAMvItI5gwZds2fPrnTy+6Ov7OxslJeXAwDmzJmD/v37o127dkhISIBMJkNSUpLqfO+88w66dOmC4OBgzJo1CzNnzsTSpUvrVMeYmBgUFhaqXteuXavT+cjycGFq3dBlO7L3kYgMwaAT6adPn47o6Ohqy/j5+SEv7+FfnIGBgartcrkcfn5++PXXX6s8tmPHjliwYAFKSkogl8vh4eGBgoICtTIFBQVwcHCAvb19peeQy+WQy+Ua3hFRRVyYWjfzpnTZjtr0mjH/GRHpikGDLldXV7i6utZYrl27dpDL5bh48SJCQ0MBAA8ePEBubm6VC3ADQEZGBpycnFRBU0hICPbt26dWJjk5GSEhIXW4C6LqWfrC1Lp62lCX7cjeRyIyBJOY0+Xg4ICxY8ciNjYW33//PS5evIhx48YBAF599VUAwO7du/H5558jMzMTly5dwpo1a7Bw4UJMnDhRdZ6xY8fiypUrmDlzJrKzs7F69Wps374dU6dONch9kXHQd84nS16YWpfzpnTZjux9JCJDMJk8XUuXLoWNjQ2GDh2Ku3fvomPHjkhJSYGTkxMAwNbWFqtWrcLUqVMhhEDz5s2xYsUKjB49WnUOX19f7N27F1OnTsXKlSvh7e2Nzz//nDm6LJhUOZ+UC1M/fi0PM84vVdO8KRkezpvqGeihccCpq3a09N5HIjIMk8jTZUyMIc8H6YYhcmdZUk6o9Mt/YdBnx2ss99XoTlrPm9JFOyp//gDUfgeYO43IPBnD97fJ9HQR6ZI+emE0YUkLU+tz3pQu2tESex+JyLAYdJFF4tNr+mcK86YiWnuiZ6BHhV4z4GFPnSX0SBKRdBh0kUXi02v6Zyrzph7vNePajkSkLybx9CKRrplCL4ypM8WnNpmlnoj0iUEXWSRlL0xVX/cyPOzdMHQvjKlTzpvycFQPXj0cFUY3UZ1Z6olI3zi8SBZJ2Qsz7sszkKHyp9eMrRfGVFU1b8rY2pbz/IhI3xh0kcXi02vSMYWnNjnPj4j0jUEXWTRT6YUh/eM8PyLSNwZdZPFMoRfGnBhrglhTedqSiEwXgy4ikowxp2PgPD8i0jc+vUhkRvS9eHddmEI6BlN62pKITA97uojMhD56kXQ1FGioZZdqg/P8iEhfGHQRmYGqFu9W9iLVppdGl0GcqaVj4Dw/ItIHDi8SmTh9JPXU9VAg0zEQETHoIjJ52vQiaUIfQRzTMRARMegi0hlDTWLXdS+SroM4gMsuEREBnNNFpBOGTIWg614kfQwFMh0DERF7uojqzNCpEHTdi6SvoUBTTcdgzGk4iMi0sKeLqA6MIRWCrnuR9JmZ3dTSMRhzMlciMj3s6SKqA33Mf6oNXfYiKYM4ABV6z3QxFKhMx9CvzRMI8Xep9jyG7GUydA8mEZkf9nQR1YExpULQZS+SMoh7vJfHQ8JeHkP2MhlDDyYRmR8GXUR1YGypEDRJ6qlplvmagjh9Llytj2Sv2jC1ZK5EZBoYdBHVgT7nP+mDtr1HVQVx+uyFMoZeJmPqwSQi88E5XUR1oO/5T7qkqzlK+p7rZAzz5IytB5OIzAODLqI6MoVUCLrKMq+PbPWPM4ZeJiZzJSJ94PAikQ4YeyoEXc1RkmKukzH0MjGZKxHpA4MuokfUZXK4JpPYDUVXvUdS9EIZyzw5Y3iCk4jMC4Muov/PnBNh6qr3SIpeKGPqZTL2HkwiMi2c00UE80+Eqas5SlLNdTKmeXLaJHMlIqoOe7rI4hlDigJ901XvkZS9UObUy6TPnGZEZDoYdJHFs5REmLqaoyTlXCdjnienKXMetiYi7ZhE0JWamornnnuu0n0nTpzAs88+CwD48ccfMX78eJw8eRKurq6YOHEiZs6cqVY+KSkJ77zzDnJzc/Hkk09i8eLFeOmll/R+D2S8jCFFgVR01XtkTr1Q+mTozPpEZFxMIujq3Lkz8vLU59S88847OHToENq3bw8AKCoqQq9evRAWFoa1a9fip59+wogRI9CoUSO8+eabAIC0tDQMGjQI8fHx6N27N7Zu3YqoqCicOXMGrVu3lvy+yDgYQ4oCKemq98gceqH0yRKGrYlIOyYxkd7Ozg4eHh6ql4uLC3bt2oU33ngDMtnDD6stW7bg/v372LBhA1q1aoWBAwdi0qRJWLFiheo8K1euREREBGbMmIGWLVtiwYIFaNu2LT755BND3RoZASbCJH0whsz6RGRcTCLoetx3332Hv/76C2+88YZqW3p6Orp16wY7OzvVtvDwcFy8eBG3bt1SlQkLC1M7V3h4ONLT06u8VklJCYqKitReZF5MaSkfMh2WNGxNRJoxyaBr/fr1CA8Ph7e3t2pbfn4+3N3d1cop3+fn51dbRrm/MvHx8XB0dFS9mjRpoqvbICNiTCkKyLiUlQukX/4LuzJ+R/rlvzRe4sjShq2JqGYGndM1e/ZsLF68uNoyFy5cQIsWLVTvf/vtNxw4cADbt2/Xd/UAADExMZg2bZrqfVFREQMvM8XJ4fS4ujx5aCyZ9YnIeBg06Jo+fTqio6OrLePn56f2PiEhAS4uLujbt6/adg8PDxQUFKhtU7738PCotoxyf2Xkcjnkcnm1dSTjp2meJE4O1y1Tzk9V1ycPjSmzPhEZB4MGXa6urnB1ddW4vBACCQkJGDZsGGxtbdX2hYSEYM6cOXjw4IFqX3JyMgICAuDk5KQqc+jQIUyZMkV1XHJyMkJCQup+M2S0mCfJMEy53XX15CHXbySiR8mEEJpNUDAChw4dQlhYWIUhRwAoLCxEQEAAevXqhVmzZiEzMxMjRozABx98oJYyonv37li0aBEiIyORmJiIhQsXapUyoqioCI6OjigsLISDg4PO75F0q6reCuXXJOdr6Yept3v65b8w6LPjNZb7anQnjXpGTbnHj8hcGMP3t0lNpF+/fj06d+5cIeACAEdHR3z//ffIyclBu3btMH36dLz77ruqgAt4mO9r69atWLduHZ555hns2LEDO3fuZI4uM1VTbwXwsLdC04nRpBlzaHddP3nI9RuJCDCR5KhKW7durXb/008/jSNHjlRb5tVXX8Wrr76qy2qRkbKU5X2MjTm0O588JCJ9MKmeLiJtME+SYZhDuzNhLhHpA4MuMlvsrTAMc2h3JswlIn1g0EUmoTYJKtlbYRjm0u5MmEtEumZSc7rIMtU29QDzJBmGObU7E+YSkS6ZVMoIY2AMj5xaEl2kHjDlfFGmjO1ORNrSZ3oVY/j+ZtClJWP4oVmKsnKB0MUpVT4Jp1xG5eis52v8R8k8SYbBdiciTen7DzVj+P7m8CIZLV2mHuDyPobBdiciTdR12S1TwYn0ZLTMIfUAERFVzxwSKmuKQRcZLXNIPUC6UZunV4nINGgzqmHqOLxIRkuZeiC/8F6lfwEp53QZe+oBS6PreVyckE9k3ixpVINBFxktc0o9YCl0HSDpcp4HJ/UTGSdLGtVg0EVGTZmg8vEvcg/2dBgdXU+ErWmehwwP53n0DPSoMXhibxmR8bKkUQ0GXWT0mKDS+OkyQFLS1dOrlvJUFJGpsqRRDU6kJ5OgTD3Qr80TCPF3MYt/fOZEHxNhdTHPw5KeiiIyZZay7BZ7uoj0yFLmEeljIqwu5nnoMtcbEemXJYxqMOgi0hNLmkekj4mwupjnYUlPRRGZA3NPqMzhRSI9UM4jeryXRTmPaH9mnoFqph/KAKmqv0dleBhwajMRVjnPQ3n84+cDap7noatgkHnCiEgXGHQR6ZglziPSRYBUmbrO89BFMLg/Mw+hi1Mw6LPjmJyYgUGfHUfo4hSzC5yJSP+44LWWjGHBTDJu6Zf/wqDPjtdY7qvRncyuG11fQ6p1mRun7HUEKn8qqrrgraonHzU5loiMizF8f3NOF5GOST2PyJgm6+trImxd5nnUNtebPtJgEJFlY9BFpGNSZlfW92T92gR0xjgRtjbBIJ98JCJdY9BF9P/pqsdIquzK+k76aW5PX2obDPLJRyLSNQZdRNBtgCFFdmV9D30xi7tlrQdHRNLg04tk8fSR3kHf2ZX1kQFeyRKfvqyMPtJgEJFlY08XWTR99hjpM7uyPoe+OJfpIUtaD46IpMGeLrJo+uwxAvS3ZqQ+h744l+l/LGU9OCKSBnu6yKLpK8DQdxoHfU7W51wmdZawHhwRSYNBF1k0fQQYUjz1p8+hL6mevgSMK8dYdYwxDQYRmR4OL5JF0/VkaSnXXNTX0Je+lvR5HJfXISJLw2WAtKSvZQRM5S9+c1SXZWIeVVYuELo4pco5YsoeoqOzntfpz1Zfvzv67LHj8jpEJDVjWAaIQZeW9PFDM7cklKZIFz8Dc1xzUR8BnaGCUyKybMYQdJnE8GJqaipkMlmlr5MnTwIAcnNzK91//Lj6l2BSUhJatGgBhUKBoKAg7Nu3zxC3pCLlcBRVLaK1J47Oeh5fje6ElQPb4KvRnXB01vNaBb3m+NSfPp6+1PcTo0RExsokJtJ37twZeXnqwcc777yDQ4cOoX379mrbDx48iFatWqneu7j8r0chLS0NgwYNQnx8PHr37o2tW7ciKioKZ86cQevWrfV7E5XggrrGpa6Tpc31qT9d93aZY3BKRKQJkwi67Ozs4OHhoXr/4MED7Nq1CxMnToRMpv7h7+Liolb2UStXrkRERARmzJgBAFiwYAGSk5PxySefYO3atfq7gSowCaV5kfKpP6noY+jbXINTIqKamMTw4uO+++47/PXXX3jjjTcq7Ovbty/c3NwQGhqK7777Tm1feno6wsLC1LaFh4cjPT29ymuVlJSgqKhI7aUr/IvfvEj11J9U9DX0zeV1iMhSmWTQtX79eoSHh8Pb21u1rUGDBli+fDmSkpKwd+9ehIaGIioqSi3wys/Ph7u7u9q53N3dkZ+fX+W14uPj4ejoqHo1adJEZ/fBv/jNj7lkMNfn+ovmFpwSEWnKoMOLs2fPxuLFi6stc+HCBbRo0UL1/rfffsOBAwewfft2tXKNGzfGtGnTVO+fffZZXL9+HUuXLkXfvn1rXceYmBi18xYVFeks8DLH4Sgyjwzm+h76Vganjw9devCpXSIyYwYNuqZPn47o6Ohqy/j5+am9T0hIgIuLi0aBVMeOHZGcnKx67+HhgYKCArUyBQUFVc4BAwC5XA65XF7jtWqDC+qaL1PPYC7F0Lc5BKdERNowaNDl6uoKV1dXjcsLIZCQkIBhw4bB1ta2xvIZGRnw9PzfX8whISE4dOgQpkyZotqWnJyMkJAQreqtS/yLn4yRVEPfph6cEhFpwySeXlRKSUlBTk4ORo0aVWHfpk2bYGdnh+DgYADAN998gw0bNuDzzz9XlZk8eTK6d++O5cuXIzIyEomJiTh16hTWrVsn2T1Uhn/xk7Hh0DcRke6ZVNC1fv16dO7cWW2O16MWLFiAq1evwsbGBi1atMC2bdswYMAA1f7OnTtj69atmDt3Lt5++208+eST2Llzp0FydD2Of/GTMeHQNxGR7nEZIC0ZwzICRFLhElVEZC6M4fvbpHq6iEhaHPomItIdBl1EVC0OfRMR6YZJJkclIiIiMjUMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAIMuoiIiIgkwKCLiIiISAI2hq4AkVTKygVO5NzEjeJ7cGuoQAdfZ1hbyQxdLSIishAMusgi7M/MQ9zuLOQV3lNt83RUILZPICJaexqwZkREZCk4vEhmb39mHsZ9eUYt4AKA/MJ7GPflGezPzDNQzYiIyJIw6CKzVlYuELc7C6KSfcptcbuzUFZeWQkiIiLdYdBFZu1Ezs0KPVyPEgDyCu/hRM5N6SpFREQWiUEXmbUbxVUHXLUpR0REVFsMusisuTVU6LQcERFRbTHoIrPWwdcZno4KVJUYQoaHTzF28HWWslpERGSBGHSRWbO2kiG2TyAAVAi8lO9j+wQyXxcREekdgy4yexGtPbFmSFt4OKoPIXo4KrBmSFvm6SIiIkkwOSpZhIjWnugZ6MGM9EREZDAMushiWFvJEOLvYuhqEBGRheLwIhEREZEE2NNFZGBciJvMAX+PiWpmMj1dP//8M/r164fGjRvDwcEBoaGhOHz4sFqZX3/9FZGRkahXrx7c3NwwY8YMlJaWqpVJTU1F27ZtIZfL0bx5c2zcuFHCuyBStz8zD6GLUzDos+OYnJiBQZ8dR+jiFK4HSSaFv8dEmjGZoKt3794oLS1FSkoKTp8+jWeeeQa9e/dGfn4+AKCsrAyRkZG4f/8+0tLSsGnTJmzcuBHvvvuu6hw5OTmIjIzEc889h4yMDEyZMgWjRo3CgQMHDHVbZMG4EDeZA/4eE2lOJoQw+pV+//zzT7i6uuK///0vunbtCgAoLi6Gg4MDkpOTERYWhn//+9/o3bs3rl+/Dnd3dwDA2rVrMWvWLPzxxx+ws7PDrFmzsHfvXmRmZqrOPXDgQNy+fRv79+/XqC5FRUVwdHREYWEhHBwcdH+zZBHKygVCF6dUuS6kDA9TWhyd9TyHaMho8feYTIkxfH+bRE+Xi4sLAgIC8MUXX+Cff/5BaWkpPv30U7i5uaFdu3YAgPT0dAQFBakCLgAIDw9HUVERzp8/ryoTFhamdu7w8HCkp6dXee2SkhIUFRWpvYjqigtxkzng7zGRdkxiIr1MJsPBgwcRFRWFhg0bwsrKCm5ubti/fz+cnJwAAPn5+WoBFwDVe+UQZFVlioqKcPfuXdjb21e4dnx8POLi4vRxW2TBuBA3mQP+HhNpx6A9XbNnz4ZMJqv2lZ2dDSEExo8fDzc3Nxw5cgQnTpxAVFQU+vTpg7w8/c4XiImJQWFhoep17do1vV6PLAMX4iZzwN9jIu0YtKdr+vTpiI6OrraMn58fUlJSsGfPHty6dUs1Drt69WokJydj06ZNmD17Njw8PHDixAm1YwsKCgAAHh4eqv8qtz1axsHBodJeLgCQy+WQy+W1uT2iKikX4s4vvIfKJlUq58JwIW4yZvw9JtKOQYMuV1dXuLq61ljuzp07AAArK/WOOSsrK5SXlwMAQkJC8P777+PGjRtwc3MDACQnJ8PBwQGBgYGqMvv27VM7R3JyMkJCQup8L0TaUC7EPe7LM5ABal9YXIibTAV/j4m0YxIT6UNCQuDk5IThw4fj3Llz+PnnnzFjxgxVCggA6NWrFwIDAzF06FCcO3cOBw4cwNy5czF+/HhVT9XYsWNx5coVzJw5E9nZ2Vi9ejW2b9+OqVOnGvL2yEJxIW4yB/w9JtKcSaSMAIBTp05hzpw5OHXqFB48eIBWrVrh3XffxYsvvqgqc/XqVYwbNw6pqamoX78+hg8fjkWLFsHG5n8deqmpqZg6dSqysrLg7e2Nd955p8YhzkcZwyOnZF6YyZvMAX+PydgZw/e3yQRdxsIYfmhERESkHWP4/jaJ4UUiIiIiU2cSebqIyLhwKImISHsMuohIK/sz8xC3O0stE7mnowKxfQI5aZqIqBocXiQijXFxYyKi2mPQRUQaKSsXiNudVWkSTOW2uN1ZKCvnszlERJVh0EVEGuHixkREdcOgi4g0wsWNiYjqhkEXEWmEixsTEdUNgy4i0ohyceOqEkPI8PApRi5uTERUOQZdRKQR5eLGACoEXlzcmIioZgy6iEhjXNyYiKj2mByViLQS0doTPQM9mJGeiEhLDLqISGvWVjKE+LsYuhpERCaFw4tEREREEmDQRURERCQBBl1EREREEmDQRURERCQBBl1EREREEmDQRURERCQBBl1EREREEmDQRURERCQBBl1EREREEmBGei0JIQAARUVFBq4JERERaUr5va38HjcEBl1aKi4uBgA0adLEwDUhIiIibRUXF8PR0dEg15YJQ4Z8Jqi8vBzXr19Hw4YNIZNJv8BvUVERmjRpgmvXrsHBwUHy6xsDtsFDbAe2gRLbgW0AsA2UqmoHIQSKi4vh5eUFKyvDzK5iT5eWrKys4O3tbehqwMHBwaL/UQFsAyW2A9tAie3ANgDYBkqVtYOheriUOJGeiIiISAIMuoiIiIgkwKDLxMjlcsTGxkIulxu6KgbDNniI7cA2UGI7sA0AtoGSMbcDJ9ITERERSYA9XUREREQSYNBFREREJAEGXUREREQSYNBFREREJAEGXToQHx+PZ599Fg0bNoSbmxuioqJw8eLFao/57LPP0LVrVzg5OcHJyQlhYWE4ceKEav+DBw8wa9YsBAUFoX79+vDy8sKwYcNw/fr1Ss9XUlKCNm3aQCaTISMjQ23f9u3b0aZNG9SrVw8+Pj5YunSp2v7U1FTIZLIKr/z8fJNph2bNmlWo/6JFi9TK/Pjjj+jatSsUCgWaNGmCJUuWVKhPUlISWrRoAYVCgaCgIOzbt8+i2mDjxo0VzqFQKLRqA2Nvh3v37iE6OhpBQUGwsbFBVFRUpfVJTU1F27ZtIZfL0bx5c2zcuNGi2sASPhdSU1PRr18/eHp6on79+mjTpg22bNlSoT7m/LmgSRvo4nPBmNvg4sWLeO655+Du7g6FQgE/Pz/MnTsXDx48UDtPXX8PAACC6iw8PFwkJCSIzMxMkZGRIV566SXRtGlT8ffff1d5zOuvvy5WrVolzp49Ky5cuCCio6OFo6Oj+O2334QQQty+fVuEhYWJbdu2iezsbJGeni46dOgg2rVrV+n5Jk2aJF588UUBQJw9e1a1fd++fcLGxkasWbNGXL58WezZs0d4enqKjz/+WFXm8OHDAoC4ePGiyMvLU73KyspMph18fHzE/Pnz1er/6HULCwuFu7u7GDx4sMjMzBRfffWVsLe3F59++qmqzLFjx4S1tbVYsmSJyMrKEnPnzhW2trbip59+spg2SEhIEA4ODmrnyM/P1/j+TaEd/v77bzF27Fixbt06ER4eLvr161ehLleuXBH16tUT06ZNE1lZWeLjjz8W1tbWYv/+/RbTBpbwufD++++LuXPnimPHjolLly6JDz/8UFhZWYndu3erypj754ImbaCLzwVjboPLly+LDRs2iIyMDJGbmyt27dol3NzcRExMjKqMLn4PhBCCQZce3LhxQwAQ//nPfzQ+prS0VDRs2FBs2rSpyjInTpwQAMTVq1fVtu/bt0+0aNFCnD9/vkLQNWjQIDFgwAC18h999JHw9vYW5eXlQoj/fbjeunVL4/pqQsp28PHxER988EGVx6xevVo4OTmJkpIS1bZZs2aJgIAA1fv/+7//E5GRkWrHdezYUYwZM0bj+j/O1NogISFBODo6alxXTRlTOzxq+PDhlQYcM2fOFK1atVLb9tprr4nw8HCNzlsZU2sDS/hcqMxLL70k3njjDdV7c/9cqMzjbaCPzwVjb4OpU6eK0NBQ1Xtd/R5weFEPCgsLAQDOzs4aH3Pnzh08ePCg2mMKCwshk8nQqFEj1baCggKMHj0amzdvRr169SocU1JSUqEb2N7eHr/99huuXr2qtr1Nmzbw9PREz549cezYMY3rXl19AWnaAQAWLVoEFxcXBAcHY+nSpSgtLVXtS09PR7du3WBnZ6faFh4ejosXL+LWrVuqMmFhYWrnDA8PR3p6usb1r6yugOm0AQD8/fff8PHxQZMmTdCvXz+cP39e47pXV1/AONpBE+b+u6ANc/5cqOo8j17HEn8XHm8DQPefC8bcBpcuXcL+/fvRvXt31Tad/R5oFaJRjcrKykRkZKTo0qWLVseNGzdO+Pn5ibt371a6/+7du6Jt27bi9ddfV20rLy8XERERYsGCBUIIIXJycir0dH366aeiXr164uDBg6KsrExcvHhRtGjRQgAQaWlpQgghsrOzxdq1a8WpU6fEsWPHxBtvvCFsbGzE6dOntbz7/5GyHYQQYvny5eLw4cPi3LlzYs2aNaJRo0Zi6tSpqv09e/YUb775ptoxyp7BrKwsIYQQtra2YuvWrWplVq1aJdzc3LS6ByVTbIO0tDSxadMmcfbsWZGamip69+4tHBwcxLVr17S6h0cZWzs8qqpenieffFIsXLhQbdvevXsFAHHnzh2t7kMI02wDS/hceNy2bduEnZ2dyMzMVG0z98+Fx1XWBrr+XDDWNggJCRFyuVwAEG+++abaULqufg8YdOnY2LFjhY+Pj1a/jPHx8cLJyUmcO3eu0v33798Xffr0EcHBwaKwsFC1feXKlaJLly6itLRUCFF50FVeXi5mzpwpFAqFsLa2Fk5OTmLevHkCgDh+/HiVderWrZsYMmSIxvfwOCnboTLr168XNjY24t69e0IIwwRdptgGlV3P399fzJ07V+N7eJyxtcOjpAq6TLENKmNunwuPSklJEfXq1aswdGXunwuPqqoNKrteXT4XjLUNfv31V3H+/HmxdetW8cQTT4jFixer9jHoMkLjx48X3t7e4sqVKxofs3TpUuHo6ChOnjxZ6f779++LqKgo8fTTT4s///xTbV+/fv2ElZWVsLa2Vr0ACGtrazFs2DC1sqWlpeK3334TJSUlYt++fQKAuHHjRpX1euutt0SnTp00vo9HSd0OlcnMzBQARHZ2thBCiKFDh1b4YklJSREAxM2bN4UQQjRp0qTCuP+7774rnn76aY3vQ8lU26AyAwYMEAMHDtT4Ph5ljO3wqKoCjq5du4rJkyerbduwYYNwcHDQ6B4eZaptUBlz+1xQSk1NFfXr11d7qETJ3D8XlKprg8rU9nPBmNvgUZs3bxb29vaqTg1d/R4w6NKB8vJyMX78eOHl5SV+/vlnjY9bvHixcHBwEOnp6ZXuV/4itWrVqtIA6erVq+Knn35SvQ4cOCAAiB07dlT7F8TQoUNFSEhItXULCwsTL7/8ssb3IoTh2qEyX375pbCyslIFE8pJ5Pfv31eViYmJqTCRvnfv3mrnCQkJ0WqipKm3weNKS0tFQEBAtcMRlTHmdnhUdRPpW7durbZt0KBBWk2kN/U2qIy5fS4I8fCBgfr164tPPvmk0mPM/XNBiJrb4HG1+Vww9jZ43KZNm4SNjY3q81IXvwdCMOjSiXHjxglHR0eRmpqq9kjqo8MQQ4cOFbNnz1a9X7RokbCzsxM7duxQO6a4uFgI8fAXqW/fvsLb21tkZGSolXn06bNHVTa8+Mcff4g1a9aICxcuiLNnz4pJkyYJhUIhfvjhB1WZDz74QOzcuVP88ssv4qeffhKTJ08WVlZW4uDBgybRDmlpaeKDDz4QGRkZ4vLly+LLL78Urq6uar19t2/fFu7u7mLo0KEiMzNTJCYminr16lVIGWFjYyOWLVsmLly4IGJjY7V+JNjU2yAuLk4cOHBAXL58WZw+fVoMHDhQKBQKcf78eY3bwNjbQYiHw6pnz54Vffr0ET169BBnz55V+3ejTBkxY8YMceHCBbFq1SqtU0aYehtYwueCcjgtJiZG7Rx//fWXqoy5fy5o0ga6+Fww5jb48ssvxbZt20RWVpa4fPmy2LZtm/Dy8hKDBw9WldHF74EQDLp0AkClr4SEBFWZ7t27i+HDh6ve+/j4VHpMbGysEOJ/AVRlr8OHD1daj6qCrk6dOon69euLevXqiRdeeKHCXK7FixcLf39/oVAohLOzs+jRo4dISUkxmXY4ffq06Nixo3B0dBQKhUK0bNlSLFy4sMJ4/blz50RoaKiQy+XiiSeeEIsWLapwD9u3bxdPPfWUsLOzE61atRJ79+61qDaYMmWKaNq0qbCzsxPu7u7ipZdeEmfOnNGqDUyhHaq61qMOHz4s2rRpI+zs7ISfn59a3S2hDSzhc2H48OGVnqN79+5q92DOnwuatIEuPheMuQ0SExNF27ZtRYMGDUT9+vVFYGCgWLhwYYUJ+3X9PRBCCNn/bwwiIiIi0iPm6SIiIiKSAIMuIiIiIgkw6CIiIiKSAIMuIiIiIgkw6CIiIiKSAIMuIiIiIgkw6CIiIiKSAIMuIiIiMgr//e9/0adPH3h5eUEmk2Hnzp1an0MIgWXLluGpp56CXC7HE088gffff1/3la0FBl1EZPHWr1+PXr161ekcf/75J9zc3PDbb7/pqFZElueff/7BM888g1WrVtX6HJMnT8bnn3+OZcuWITs7G9999x06dOigw1rWHjPSE5FFu3fvHvz8/JCUlIQuXbrU6VxvvfUWbt26hfXr1+uodkSWSyaT4dtvv0VUVJRqW0lJCebMmYOvvvoKt2/fRuvWrbF48WL06NEDAHDhwgU8/fTTyMzMREBAgGEqXg32dBGRRduxYwccHBzqHHABwBtvvIEtW7bg5s2bOqgZET1uwoQJSE9PR2JiIn788Ue8+uqriIiIwC+//AIA2L17N/z8/LBnzx74+vqiWbNmGDVqlNH8m2TQRURm4Y8//oCHhwcWLlyo2paWlgY7OzscOnSoyuMSExPRp08ftW3R0dGIiorCwoUL4e7ujkaNGmH+/PkoLS3FjBkz4OzsDG9vbyQkJKgd16pVK3h5eeHbb7/V7c0REX799VckJCQgKSkJXbt2hb+/P9566y2Ehoaq/i1euXIFV69eRVJSEr744gts3LgRp0+fxoABAwxc+4dsDF0BIiJdcHV1xYYNGxAVFYVevXohICAAQ4cOxYQJE/DCCy9UedzRo0cxdOjQCttTUlLg7e2N//73vzh27BhGjhyJtLQ0dOvWDT/88AO2bduGMWPGoGfPnvD29lYd16FDBxw5cgQjR47Uy30SWaqffvoJZWVleOqpp9S2l5SUwMXFBQBQXl6OkpISfPHFF6py69evR7t27XDx4kWDDzky6CIis/HSSy9h9OjRGDx4MNq3b4/69esjPj6+yvK3b99GYWEhvLy8KuxzdnbGRx99BCsrKwQEBGDJkiW4c+cO3n77bQBATEwMFi1ahKNHj2LgwIGq47y8vHD27Fnd3xyRhfv7779hbW2N06dPw9raWm1fgwYNAACenp6wsbFRC8xatmwJ4GFPGYMuIiIdWrZsGVq3bo2kpCScPn0acrm8yrJ3794FACgUigr7WrVqBSur/83AcHd3R+vWrVXvra2t4eLighs3bqgdZ29vjzt37tT1NojoMcHBwSgrK8ONGzfQtWvXSst06dIFpaWluHz5Mvz9/QEAP//8MwDAx8dHsrpWhUEXEZmVy5cv4/r16ygvL0dubi6CgoKqLOvi4gKZTIZbt25V2Gdra6v2XiaTVbqtvLxcbdvNmzfh6upahzsgslx///03Ll26pHqfk5ODjIwMODs746mnnsLgwYMxbNgwLF++HMHBwfjjjz9w6NAhPP3004iMjERYWBjatm2LESNG4MMPP0R5eTnGjx+Pnj17VhiWNAROpCcis3H//n0MGTIEr732GhYsWIBRo0ZV6Il6lJ2dHQIDA5GVlaWzOmRmZiI4OFhn5yOyJKdOnUJwcLDq39C0adMQHByMd999FwCQkJCAYcOGYfr06QgICEBUVBROnjyJpk2bAgCsrKywe/duNG7cGN26dUNkZCRatmyJxMREg93To9jTRURmY86cOSgsLMRHH32EBg0aYN++fRgxYgT27NlT5THh4eE4evQopkyZUufr37lzB6dPn1Z7gpKINNejRw9Ulz7U1tYWcXFxiIuLq7KMl5cXvv76a31Ur87Y00VEZiE1NRUffvghNm/eDAcHB1hZWWHz5s04cuQI1qxZU+VxI0eOxL59+1BYWFjnOuzatQtNmzatcr4JEVk2ZqQnIov36quvom3btoiJianTeTp16oRJkybh9ddf11HNiMicsKeLiCze0qVLVY+c19aff/6JV155BYMGDdJRrYjI3LCni4iIiEgC7OkiIiIikgCDLiIiIiIJMOgiIiIikgCDLiIiIiIJMOgiIiIikgCDLiIiIiIJMOgiIiIikgCDLiIiIiIJMOgiIiIiksD/A/IhIWwBgB/4AAAAAElFTkSuQmCC",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"ps.plot_antenna_positions()"
]
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": null,
"id": "535915a6",
"metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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bSGXyzVlarUaMpkMZmZmSE5O1pqnS0JCApRKJVQqFezt7fM6ZCIiIpKAqV2/Tea24CeffIKLFy9qlXXv3h2+vr4YOXJktokVERERUX4wmeTKzs4O/v7+WmU2NjZwdHTMUE5ERERkLCbT54qIiIjIFJhMy5Uuhw4dMnYIRERERFrYckVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkISZXRERERBJickVEREQkIZNJriZOnIiaNWvCzs4Ozs7OaNOmDa5fv27ssIiIiIi0mExy9ffff2PAgAH4559/sHfvXrx58waffvopXrx4YezQiIiIiDRkQghh7CByIj4+Hs7Ozvj777/RsGFDvd6TkJAApVIJlUoFe3v7PI6QiIiIpGBq129zYweQUyqVCgBQrFixTOskJycjOTlZ8zohISHP4yIiIqLCzWRuC74rLS0NQ4YMQf369eHv759pvYkTJ0KpVGomd3f3fIySiIiICiOTvC3Yv39/7Nq1C0ePHkWpUqUyraer5crd3d1kmhWJiIiItwXz3MCBA7F9+3YcPnw4y8QKACwtLWFpaZlPkRERERGZUHIlhMC3336LzZs349ChQ/Dy8jJ2SEREREQZmExyNWDAAKxevRp//vkn7Ozs8PDhQwCAUqmEtbW1kaMjIiIiestk+lzJZDKd5REREQgJCdFrGaZ2z5aIiIhM7/ptMi1XJpIDEhERUSFnkkMxEBERERVUTK6IiIiIJMTkioiIiEhCTK6IiIiIJGRwh/arV69i7dq1OHLkCO7cuYOXL1/CyckJAQEBCAwMRPv27TlwJxERERVaeg/FcObMGYwYMQJHjx5F/fr1UatWLbi5ucHa2hpPnz7FpUuXcOTIESQkJGDEiBEYMmRIgUuyTO1RTiIiIjK967feLVft27fH8OHDsWHDBjg4OGRa78SJE/jll18wffp0/Pjjj1LESERERGQy9G65evPmDSwsLPResKH184OpZb5ERERketdvvTu0G5ooFbTEioiIiCg/6H1bcPbs2XovdNCgQTkKhoiIiMjU6X1b0MvLS+t1fHw8Xr58qel/9fz5cxQpUgTOzs6IjIyUPFApmFqzIhEREZne9Vvv24JRUVGaafz48ahatSquXr2Kp0+f4unTp7h69SqqVauGn3/+OS/jJSIiIirQ9G65epePjw82bNiAgIAArfLTp0+jQ4cOiIqKkixAKZla5ktERESmd/3O0QjtsbGxSE1NzVCuVqvx6NGjXAdFREREZKpylFx98skn6Nu3L86cOaMpO336NPr374+mTZtKFhwRERGRqclRcrVs2TK4uLigRo0asLS0hKWlJWrVqoUSJUpgyZIlUsdIREREZDIM/m1BAHBycsLOnTtx48YNXLt2DQDg6+uLcuXKSRocERERkanJUXKVrly5ckyoiIiIiN6R4+Tq/v372Lp1K+7evYuUlBSteTNmzMh1YERERESmKEfJ1f79+9G6dWt4e3vj2rVr8Pf3R3R0NIQQqFatmtQxEhEREZmMHHVoDw0NxbBhw3Dx4kVYWVlh48aNuHfvHho1aoSOHTtKHSMRERGRychRcnX16lV07doVAGBubo5Xr17B1tYWP/30EyZPnixpgERERESmJEfJlY2NjaaflaurK27fvq2Z9/jxY2kiIyIiIjJBOepzVadOHRw9ehR+fn5o0aIFhg4diosXL2LTpk2oU6eO1DESERERmYwcJVczZsxAUlISACA8PBxJSUlYt24dypYtyycFiYiIqFAzOLlSq9W4f/8+KleuDODtLcIFCxZIHhgRERGRKTK4z5VcLsenn36KZ8+e5UU8RERERCYtRx3a/f39ERkZKXUsRERERCYvR8nVuHHjMGzYMGzfvh2xsbFISEjQmoiIiIgKK5kQQhj6JjOz/8vJ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",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"ps.plot_phase_centers()"
]
@@ -3397,7 +343,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.12.3"
+ "version": "3.12.8"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
diff --git a/pyproject.toml b/pyproject.toml
index b882208d..8ada8647 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,13 +1,13 @@
[project]
name = "xradio"
-version = "0.0.47"
+version = "0.0.48"
description = " Xarray Radio Astronomy Data IO"
authors = [
{name = "Jan-Willem Steeb", email="jsteeb@nrao.edu"},
]
license = {file = "LICENSE.txt"}
readme = "README.md"
-requires-python = ">= 3.9, < 3.13"
+requires-python = ">= 3.9, < 3.14"
dependencies = [
'astropy',
diff --git a/src/xradio/_utils/list_and_array.py b/src/xradio/_utils/list_and_array.py
index 3673e203..9da5db6b 100644
--- a/src/xradio/_utils/list_and_array.py
+++ b/src/xradio/_utils/list_and_array.py
@@ -64,10 +64,12 @@ def to_list(x):
def to_np_array(x):
- if isinstance(x, (list, np.ndarray)):
+ if isinstance(x, np.ndarray):
if x.ndim == 0:
return np.array([x.item()])
return np.array(x) # needed for json serialization
+ elif isinstance(x, list):
+ return np.array(x)
return np.array([x])
diff --git a/src/xradio/_utils/schema.py b/src/xradio/_utils/schema.py
index 2f28621e..4deb0e71 100644
--- a/src/xradio/_utils/schema.py
+++ b/src/xradio/_utils/schema.py
@@ -1,5 +1,6 @@
import toolviper.utils.logger as logger
import xarray as xr
+from typing import Union
def convert_generic_xds_to_xradio_schema(
@@ -7,6 +8,7 @@ def convert_generic_xds_to_xradio_schema(
msv4_xds: xr.Dataset,
to_new_data_variables: dict[str, list],
to_new_coords: dict[str, list],
+ ref_code: Union[int, None] = None,
) -> xr.Dataset:
"""Converts a generic xarray Dataset to the xradio schema.
@@ -63,7 +65,7 @@ def convert_generic_xds_to_xradio_schema(
if key in column_description:
msv4_measure = column_description_casacore_to_msv4_measure(
- column_description[key]
+ column_description[key], ref_code
)
else:
msv4_measure = None
diff --git a/src/xradio/measurement_set/_utils/_msv2/conversion.py b/src/xradio/measurement_set/_utils/_msv2/conversion.py
index ec06c2d9..b673decf 100644
--- a/src/xradio/measurement_set/_utils/_msv2/conversion.py
+++ b/src/xradio/measurement_set/_utils/_msv2/conversion.py
@@ -423,7 +423,7 @@ def create_coordinates(
"baseline_antenna1_id": ("baseline_id", baseline_ant1_id),
"baseline_antenna2_id": ("baseline_id", baseline_ant2_id),
"baseline_id": np.arange(len(baseline_ant1_id)),
- "scan_number": ("time", scan_id),
+ "scan_name": ("time", scan_id.astype(str)),
"uvw_label": ["u", "v", "w"],
}
@@ -1029,7 +1029,7 @@ def get_observation_info(in_file, observation_id, intents):
datetime.timezone.utc
).isoformat(),
"xradio_version": importlib.metadata.version("xradio"),
- "schema_version": "4.0.-9987",
+ "schema_version": "4.0.-9989",
"type": "visibility",
}
)
@@ -1211,34 +1211,45 @@ def get_observation_info(in_file, observation_id, intents):
else:
ephemeris_interp_time = None
- if "FIELD_ID" not in partition_scheme:
- field_id = np.full(time_baseline_shape, -42, dtype=int)
- field_id[tidxs, bidxs] = tb_tool.getcol("FIELD_ID")
- field_id = np.max(field_id, axis=1)
- field_times = utime
- else:
- field_id = check_if_consistent(tb_tool.getcol("FIELD_ID"), "FIELD_ID")
- field_times = None
+ # if "FIELD_ID" not in partition_scheme:
+ # field_id = np.full(time_baseline_shape, -42, dtype=int)
+ # field_id[tidxs, bidxs] = tb_tool.getcol("FIELD_ID")
+ # field_id = np.max(field_id, axis=1)
+ # field_times = utime
+ # else:
+ # field_id = check_if_consistent(tb_tool.getcol("FIELD_ID"), "FIELD_ID")
+ # field_times = None
+
+ field_id = np.full(
+ time_baseline_shape, -42, dtype=int
+ ) # -42 used for missing baselines
+ field_id[tidxs, bidxs] = tb_tool.getcol("FIELD_ID")
+ field_id = np.max(field_id, axis=1)
+ field_times = xds.time.values
# col_unique = unique_1d(col)
# assert len(col_unique) == 1, col_name + " is not consistent."
# return col_unique[0]
- field_and_source_xds, source_id, _num_lines = create_field_and_source_xds(
- in_file,
- field_id,
- xds.frequency.attrs["spectral_window_id"],
- field_times,
- is_single_dish,
- time_min_max,
- ephemeris_interp_time,
+ field_and_source_xds, source_id, _num_lines, field_names = (
+ create_field_and_source_xds(
+ in_file,
+ field_id,
+ xds.frequency.attrs["spectral_window_id"],
+ field_times,
+ is_single_dish,
+ time_min_max,
+ ephemeris_interpolate,
+ )
)
+
logger.debug("Time field_and_source_xds " + str(time.time() - start))
xds = fix_uvw_frame(xds, field_and_source_xds, is_single_dish)
+ xds = xds.assign_coords({"field_name": ("time", field_names)})
partition_info_misc_fields = {
- "scan_id": scan_id,
+ "scan_name": xds.coords["scan_name"].data,
"intents": intents,
"taql_where": taql_where,
}
diff --git a/src/xradio/measurement_set/_utils/_msv2/create_field_and_source_xds.py b/src/xradio/measurement_set/_utils/_msv2/create_field_and_source_xds.py
index 98ddf2b7..63ed3b62 100644
--- a/src/xradio/measurement_set/_utils/_msv2/create_field_and_source_xds.py
+++ b/src/xradio/measurement_set/_utils/_msv2/create_field_and_source_xds.py
@@ -7,7 +7,9 @@
import toolviper.utils.logger as logger
from xradio.measurement_set._utils._msv2.msv4_sub_xdss import (
+ interpolate_to_time,
rename_and_interpolate_to_time,
+ standard_time_coord_attrs,
)
from xradio.measurement_set._utils._msv2.subtables import subt_rename_ids
from xradio.measurement_set._utils._msv2._tables.read import (
@@ -41,7 +43,7 @@ def create_field_and_source_xds(
field_times: list,
is_single_dish: bool,
time_min_max: Tuple[np.float64, np.float64],
- ephemeris_interp_time: Union[xr.DataArray, None] = None,
+ ephemeris_interpolate: bool = True,
) -> tuple[xr.Dataset, int]:
"""
Create a field and source xarray dataset (xds) from the given input file, field ID, and spectral window ID.
@@ -57,13 +59,13 @@ def create_field_and_source_xds(
spectral_window_id : int
The ID of the spectral window.
field_times: list
- Time data for field. It is the same as the time axis in the main MSv4 dataset and is used if more than one field is present.
+ Time data for field. It is the same as the time axis in the main MSv4 dataset.
is_single_dish: bool
whether the main xds has single-dish (SPECTRUM) data
time_min_max : Tuple[np.float64, np.float46]
Min / max times to constrain loading (usually to the time range relevant to an MSv4)
- ephemeris_interp_time : Union[xr.DataArray, None]
- Time axis to interpolate the ephemeris data vars to (usually main MSv4 time)
+ ephemeris_interpolate : bool
+ If true ephemeris data is interpolated to the main MSv4 time axis given in field_times.
Returns:
-------
@@ -77,41 +79,47 @@ def create_field_and_source_xds(
field_and_source_xds = xr.Dataset(attrs={"type": "field_and_source"})
- field_and_source_xds, ephemeris_path, ephemeris_table_name, source_id = (
- extract_field_info_and_check_ephemeris(
- field_and_source_xds, in_file, field_id, field_times, is_single_dish
- )
+ (
+ field_and_source_xds,
+ ephemeris_path,
+ ephemeris_table_name,
+ source_id,
+ field_names,
+ ) = extract_field_info_and_check_ephemeris(
+ field_and_source_xds, in_file, field_id, field_times, is_single_dish
+ )
+
+ field_and_source_xds, num_lines = extract_source_info(
+ field_and_source_xds, in_file, source_id, spectral_window_id
)
- if field_and_source_xds.attrs["is_ephemeris"]:
+ if field_and_source_xds.attrs["type"] == "field_and_source_ephemeris":
field_and_source_xds = extract_ephemeris_info(
field_and_source_xds,
ephemeris_path,
ephemeris_table_name,
is_single_dish,
time_min_max,
- ephemeris_interp_time,
+ field_times,
+ field_names,
+ ephemeris_interpolate,
)
- field_and_source_xds, num_lines = extract_source_info(
- field_and_source_xds, in_file, source_id, spectral_window_id
- )
-
logger.debug(
f"create_field_and_source_xds() execution time {time.time() - start_time:0.2f} s"
)
- # Check if we can drop time axis. The phase centers are repeated.
- if field_times is not None:
- if is_single_dish:
- center_dv = "FIELD_REFERENCE_CENTER"
- else:
- center_dv = "FIELD_PHASE_CENTER"
+ # # Check if we can drop time axis. The phase centers are repeated.
+ # if field_times is not None:
+ # if is_single_dish:
+ # center_dv = "FIELD_REFERENCE_CENTER"
+ # else:
+ # center_dv = "FIELD_PHASE_CENTER"
- if np.unique(field_and_source_xds[center_dv], axis=0).shape[0] == 1:
- field_and_source_xds = field_and_source_xds.isel(time=0).drop_vars("time")
+ # if np.unique(field_and_source_xds[center_dv], axis=0).shape[0] == 1:
+ # field_and_source_xds = field_and_source_xds.isel(time=0).drop_vars("time")
- return field_and_source_xds, source_id, num_lines
+ return field_and_source_xds, source_id, num_lines, field_names
def extract_ephemeris_info(
@@ -121,6 +129,8 @@ def extract_ephemeris_info(
is_single_dish,
time_min_max: Tuple[np.float64, np.float64],
interp_time: Union[xr.DataArray, None],
+ field_names: list,
+ ephemeris_interpolate: bool = True,
):
"""
Extracts ephemeris information from the given path and table name and adds it to the xarray dataset.
@@ -165,7 +175,7 @@ def extract_ephemeris_info(
ephemeris_xds = ephemeris_xds.isel(
ephemeris_id=0
) # Collapse the ephemeris_id dimension.
- # Data varaibles ['time', 'RA', 'DEC', 'Rho', 'RadVel', 'NP_ang', 'NP_dist', 'DiskLong', 'DiskLat', 'Sl_lon', 'Sl_lat', 'r', 'rdot', 'phang']
+ # Data variables ['time', 'RA', 'DEC', 'Rho', 'RadVel', 'NP_ang', 'NP_dist', 'DiskLong', 'DiskLat', 'Sl_lon', 'Sl_lat', 'r', 'rdot', 'phang']
# Get meta data.
ephemeris_meta = ephemeris_xds.attrs["other"]["msv2"]["ctds_attrs"]
@@ -357,21 +367,24 @@ def extract_ephemeris_info(
"sky_pos_label": ["ra", "dec", "dist"],
}
temp_xds = temp_xds.assign_coords(coords)
- time_coord_attrs = {
- "type": "time",
- "units": ["s"],
- "scale": "utc",
- "format": "unix",
- }
- temp_xds["time_ephemeris"].attrs.update(time_coord_attrs)
+ temp_xds["time_ephemeris"].attrs.update(standard_time_coord_attrs)
# Convert to si units
temp_xds = convert_to_si_units(temp_xds)
# interpolate if ephemeris_interpolate/interp_time=True, and rename time_ephemeris=>time
- temp_xds = rename_and_interpolate_to_time(
- temp_xds, "time_ephemeris", interp_time, "field_and_source_xds"
- )
+ if ephemeris_interpolate:
+ temp_xds = rename_and_interpolate_to_time(
+ temp_xds, "time_ephemeris", interp_time, "field_and_source_xds"
+ )
+ source_location_interp = temp_xds["SOURCE_LOCATION"]
+ else:
+ source_location_interp = interpolate_to_time(
+ temp_xds["SOURCE_LOCATION"],
+ interp_time,
+ "field_and_source_xds",
+ "time_ephemeris",
+ )
xds = xr.merge([xds, temp_xds])
@@ -383,35 +396,58 @@ def extract_ephemeris_info(
else:
center_dv = "FIELD_PHASE_CENTER"
- if "time" in xds[center_dv].coords:
- assert (
- interp_time is not None
- ), 'ephemeris_interpolate must be True if there is ephemeris data and multiple fields (this will occur if "FIELD_ID" is not in partition_scheme).'
+ xds = xds.sel(field_name=field_names) # Expand for all times in ms
+ xds = xds.assign_coords({"time": ("field_name", interp_time)})
+ xds["time"].attrs.update(standard_time_coord_attrs)
+ xds = xds.swap_dims({"field_name": "time"})
- field_phase_center = wrap_to_pi(
- xds[center_dv].values + xds["SOURCE_LOCATION"][:, 0:2].values
- )
- field_phase_center = np.column_stack(
- (field_phase_center, np.zeros(xds[center_dv].values.shape[0]))
- )
- field_phase_center[:, -1] = (
- field_phase_center[:, -1] + xds["SOURCE_LOCATION"][:, -1].values
- )
+ source_location_interp
+ field_phase_center = wrap_to_pi(
+ xds[center_dv].values + source_location_interp[:, 0:2].values
+ )
- xds[center_dv] = xr.DataArray(
- field_phase_center,
- dims=[xds["SOURCE_LOCATION"].dims[0], "sky_pos_label"],
- )
- else:
- field_phase_center = (
- np.append(xds[center_dv].values, 0) + xds["SOURCE_LOCATION"].values
- )
- field_phase_center[:, 0:2] = wrap_to_pi(field_phase_center[:, 0:2])
+ field_phase_center = np.column_stack(
+ (field_phase_center, np.zeros(xds[center_dv].values.shape[0]))
+ )
- xds[center_dv] = xr.DataArray(
- field_phase_center,
- dims=[xds["SOURCE_LOCATION"].dims[0], "sky_pos_label"],
- )
+ field_phase_center[:, -1] = (
+ field_phase_center[:, -1] + source_location_interp[:, -1].values
+ )
+
+ xds[center_dv] = xr.DataArray(
+ field_phase_center,
+ dims=["time", "sky_pos_label"],
+ )
+
+ # if "time" in xds[center_dv].coords:
+ # assert (
+ # interp_time is not None
+ # ), 'ephemeris_interpolate must be True if there is ephemeris data and multiple fields (this will occur if "FIELD_ID" is not in partition_scheme).'
+
+ # field_phase_center = wrap_to_pi(
+ # xds[center_dv].values + xds["SOURCE_LOCATION"][:, 0:2].values
+ # )
+ # field_phase_center = np.column_stack(
+ # (field_phase_center, np.zeros(xds[center_dv].values.shape[0]))
+ # )
+ # field_phase_center[:, -1] = (
+ # field_phase_center[:, -1] + xds["SOURCE_LOCATION"][:, -1].values
+ # )
+
+ # xds[center_dv] = xr.DataArray(
+ # field_phase_center,
+ # dims=[xds["SOURCE_LOCATION"].dims[0], "sky_pos_label"],
+ # )
+ # else:
+ # field_phase_center = (
+ # np.append(xds[center_dv].values, 0) + xds["SOURCE_LOCATION"].values
+ # )
+ # field_phase_center[:, 0:2] = wrap_to_pi(field_phase_center[:, 0:2])
+
+ # xds[center_dv] = xr.DataArray(
+ # field_phase_center,
+ # dims=[xds["SOURCE_LOCATION"].dims[0], "sky_pos_label"],
+ # )
xds[center_dv].attrs.update(xds["SOURCE_LOCATION"].attrs)
@@ -465,18 +501,12 @@ def make_line_dims_and_coords(
)
line_label_data = np.arange(coords_lines_data.shape[-1]).astype(str)
- if len(source_id) == 1:
- line_coords = {
- "line_name": ("line_label", coords_lines_data),
- "line_label": line_label_data,
- }
- line_dims = ["line_label"]
- else:
- line_coords = {
- "line_name": (("time", "line_label"), coords_lines_data),
- "line_label": line_label_data,
- }
- line_dims = ["time", "line_label"]
+
+ line_coords = {
+ "line_name": (("field_name", "line_label"), coords_lines_data),
+ "line_label": line_label_data,
+ }
+ line_dims = ["field_name", "line_label"]
return line_dims, line_coords
@@ -567,17 +597,16 @@ def extract_source_info(
num_lines : int
Sum of num_lines for all unique sources extracted.
"""
+ unknown = to_np_array(["Unknown"] * len(source_id))
+
coords = {}
- is_ephemeris = xds.attrs[
- "is_ephemeris"
- ] # If ephemeris data is present we ignore the SOURCE_DIRECTION in the source table.
if all(source_id == -1):
logger.warning(
f"Source_id is -1. No source information will be included in the field_and_source_xds."
)
xds = xds.assign_coords(
- {"source_name": "Unknown"}
+ {"source_name": ("field_name", unknown)}
) # Need to add this for ps.summary() to work.
return xds, 0
@@ -585,7 +614,7 @@ def extract_source_info(
logger.warning(
f"Could not find SOURCE table for source_id {source_id}. Source information will not be included in the field_and_source_xds."
)
- xds = xds.assign_coords({"source_name": "Unknown"})
+ xds = xds.assign_coords({"source_name": ("field_name", unknown)})
return xds, 0
unique_source_id = unique_1d(source_id)
@@ -603,7 +632,7 @@ def extract_source_info(
f"SOURCE table empty for (unique) source_id {unique_source_id} and spectral_window_id {spectral_window_id}."
)
xds = xds.assign_coords(
- {"source_name": "Unknown"}
+ {"source_name": ("field_name", unknown)}
) # Need to add this for ps.summary() to work.
return xds, 0
@@ -631,25 +660,25 @@ def extract_source_info(
# Get source name (the time axis is optional and will probably be required if the partition scheme does not include 'FIELD_ID' or 'SOURCE_ID'.).
# Note again that this optional time axis has nothing to do with the original time axis in the source table that we drop.
- if len(source_id) == 1:
- source_xds = source_xds.sel(SOURCE_ID=source_id[0])
- coords["source_name"] = (
- source_xds["NAME"].values.item() + "_" + str(source_id[0])
- )
- direction_dims = ["sky_dir_label"]
- # coords["source_id"] = source_id[0]
- else:
- source_xds = source_xds.sel(SOURCE_ID=source_id)
- coords["source_name"] = (
- "time",
- np.char.add(
- source_xds["NAME"].data, np.char.add("_", source_id.astype(str))
- ),
- )
- direction_dims = ["time", "sky_dir_label"]
- # coords["source_id"] = ("time", source_id)
+ # if len(source_id) == 1:
+ # source_xds = source_xds.sel(SOURCE_ID=source_id[0])
+ # coords["source_name"] = (
+ # source_xds["NAME"].values.item() + "_" + str(source_id[0])
+ # )
+ # direction_dims = ["sky_dir_label"]
+ # # coords["source_id"] = source_id[0]
+ # else:
+
+ source_xds = source_xds.sel(SOURCE_ID=source_id)
+ coords["source_name"] = (
+ "field_name",
+ np.char.add(source_xds["NAME"].data, np.char.add("_", source_id.astype(str))),
+ )
+ direction_dims = ["field_name", "sky_dir_label"]
+ # coords["source_id"] = ("time", source_id)
- # If ephemeris data is present we ignore the SOURCE_DIRECTION.
+ is_ephemeris = xds.attrs["type"] == "field_and_source_ephemeris"
+ # If ephemeris data is present we ignore the SOURCE_DIRECTION in the source table.
if not is_ephemeris:
direction_msv2_col = "DIRECTION"
msv4_measure = column_description_casacore_to_msv4_measure(
@@ -686,6 +715,7 @@ def extract_source_info(
line_dims, line_coords = make_line_dims_and_coords(
source_xds, source_id, num_lines
)
+
xds = xds.assign_coords(line_coords)
to_new_data_variables = {
@@ -693,7 +723,7 @@ def extract_source_info(
"SYSVEL": ["LINE_SYSTEMIC_VELOCITY", line_dims],
}
to_new_coords = {
- "TIME": ["time", ["time"]],
+ "TIME": ["field_name", ["field_name"]],
}
convert_generic_xds_to_xradio_schema(
source_xds, xds, to_new_data_variables, to_new_coords
@@ -757,7 +787,7 @@ def make_field_dims_and_coords(
else:
coords["field_name"] = field_xds["NAME"].values.item() + "_" + str(field_id)
# coords["field_id"] = field_id
- dims = ["sky_dir_label"]
+ dims = ["field_name", "sky_dir_label"]
return dims, coords
@@ -809,20 +839,18 @@ def extract_field_info_and_check_ephemeris(
assert (
len(field_xds.poly_id) == 1
), "Polynomial field positions not supported. Please open an issue on https://github.com/casangi/xradio/issues so that we can add support for this."
+
field_xds = field_xds.isel(poly_id=0, drop=True)
+
# field_xds = field_xds.assign_coords({'field_id':field_xds['field_id'].data})
field_xds = field_xds.assign_coords({"field_id": unique_field_id})
- field_xds = field_xds.sel(
- field_id=field_id, drop=False
- ) # Make sure field_id match up with time axis (duplicate fields are allowed).
+ # field_xds = field_xds.sel(
+ # field_id=to_np_array(field_id), drop=False
+ # ) # Make sure field_id match up with time axis (duplicate fields are allowed).
source_id = to_np_array(field_xds.SOURCE_ID.values)
ephemeris_table_name = None
ephemeris_path = None
- is_ephemeris = False
- field_and_source_xds.attrs["is_ephemeris"] = (
- False # If we find a path to the ephemeris table we will set this to True.
- )
# Need to check if ephemeris_id is present and if ephemeris table is present.
if "EPHEMERIS_ID" in field_xds:
@@ -843,66 +871,121 @@ def extract_field_info_and_check_ephemeris(
)
if len(ephemeris_name_table_index) > 0: # Are there any ephemeris tables.
- is_ephemeris = True
e_index = ephemeris_name_table_index[0]
ephemeris_path = os.path.join(in_file, "FIELD")
ephemeris_table_name = files[e_index]
- field_and_source_xds.attrs["is_ephemeris"] = True
+ field_and_source_xds.attrs["type"] = "field_and_source_ephemeris"
else:
logger.warning(
f"Could not find ephemeris table for field_id {field_id}. Ephemeris information will not be included in the field_and_source_xds."
)
-
- dims, coords = make_field_dims_and_coords(field_xds, field_id, field_times)
+ from xradio._utils.schema import convert_generic_xds_to_xradio_schema
if is_single_dish:
- field_data_variables = {
- "REFERENCE_DIR": "FIELD_REFERENCE_CENTER",
+ to_new_data_variables = {
+ "REFERENCE_DIR": [
+ "FIELD_REFERENCE_CENTER",
+ ["field_name", "sky_dir_label"],
+ ],
+ "FIELD_ID": ["FIELD_ID", ["field_name"]],
}
else:
- field_data_variables = {
- # "DELAY_DIR": "FIELD_DELAY_CENTER",
- "PHASE_DIR": "FIELD_PHASE_CENTER",
- # "REFERENCE_DIR": "FIELD_REFERENCE_CENTER",
+ to_new_data_variables = {
+ "PHASE_DIR": ["FIELD_PHASE_CENTER", ["field_name", "sky_dir_label"]],
+ # "DELAY_DIR": ["FIELD_DELAY_CENTER",["field_name", "sky_dir_label"]],
+ # "REFERENCE_DIR": ["FIELD_REFERENCE_CENTER",["field_name", "sky_dir_label"]],
}
- field_column_description = field_xds.attrs["other"]["msv2"]["ctds_attrs"][
- "column_descriptions"
- ]
-
- for generic_name, msv4_name in field_data_variables.items():
-
- delay_dir_ref_col = "DelayDir_Ref"
- if field_xds.get(delay_dir_ref_col) is None:
- delaydir_ref = None
- else:
- delaydir_ref = check_if_consistent(
- field_xds.get(delay_dir_ref_col), delay_dir_ref_col
- )
-
- msv4_measure = column_description_casacore_to_msv4_measure(
- field_column_description[generic_name], ref_code=delaydir_ref
- )
+ to_new_coords = {
+ "NAME": ["field_name", ["field_name"]],
+ "field_id": ["field_id", ["field_name"]],
+ }
- field_and_source_xds[msv4_name] = xr.DataArray.from_dict(
- {
- "dims": dims,
- "data": list(field_xds[generic_name].data),
- "attrs": msv4_measure,
- }
+ delay_dir_ref_col = "DelayDir_Ref"
+ if field_xds.get(delay_dir_ref_col) is None:
+ ref_code = None
+ else:
+ ref_code = check_if_consistent(
+ field_xds.get(delay_dir_ref_col), delay_dir_ref_col
)
- field_measures_type = "sky_coord"
- field_and_source_xds[msv4_name].attrs["type"] = field_measures_type
+ field_and_source_xds = convert_generic_xds_to_xradio_schema(
+ field_xds, field_and_source_xds, to_new_data_variables, to_new_coords, ref_code
+ )
- field_and_source_xds = field_and_source_xds.assign_coords(coords)
- if "time" in field_and_source_xds:
- time_column_description = field_xds.attrs["other"]["msv2"]["ctds_attrs"][
- "column_descriptions"
- ]["TIME"]
- time_msv4_measure = column_description_casacore_to_msv4_measure(
- time_column_description
- )
- field_and_source_xds.coords["time"].attrs.update(time_msv4_measure)
+ # Some field names are not unique. We need to add the field_id to the field_name to make it unique.
+ field_and_source_xds = field_and_source_xds.assign_coords(
+ {
+ "field_name": np.char.add(
+ field_and_source_xds["field_name"].data,
+ np.char.add("_", field_and_source_xds["field_id"].astype(str)),
+ ),
+ "sky_dir_label": ["ra", "dec"],
+ }
+ )
- return field_and_source_xds, ephemeris_path, ephemeris_table_name, source_id
+ temp = field_and_source_xds.set_xindex("field_id")
+ field_names = temp.sel(field_id=field_id).field_name.data
+ # field_id shouldn ot be in final xds, and no longer needed past this point
+ field_and_source_xds = field_and_source_xds.drop_vars("field_id")
+
+ # dims, coords = make_field_dims_and_coords(field_xds, field_id, field_times)
+
+ # if is_single_dish:
+ # field_data_variables = {
+ # "REFERENCE_DIR": "FIELD_REFERENCE_CENTER",
+ # }
+ # else:
+ # field_data_variables = {
+ # # "DELAY_DIR": "FIELD_DELAY_CENTER",
+ # "PHASE_DIR": "FIELD_PHASE_CENTER",
+ # # "REFERENCE_DIR": "FIELD_REFERENCE_CENTER",
+ # }
+
+ # field_column_description = field_xds.attrs["other"]["msv2"]["ctds_attrs"][
+ # "column_descriptions"
+ # ]
+
+ # delay_dir_ref_col = "DelayDir_Ref"
+ # if field_xds.get(delay_dir_ref_col) is None:
+ # delaydir_ref = None
+ # else:
+ # delaydir_ref = check_if_consistent(
+ # field_xds.get(delay_dir_ref_col), delay_dir_ref_col
+ # )
+
+ # for generic_name, msv4_name in field_data_variables.items():
+ # msv4_measure = column_description_casacore_to_msv4_measure(
+ # field_column_description[generic_name], ref_code=delaydir_ref
+ # )
+
+ # print(msv4_name,generic_name,field_xds[generic_name].data.shape,field_xds[generic_name].data)
+
+ # field_and_source_xds[msv4_name] = xr.DataArray.from_dict(
+ # {
+ # "dims": dims,
+ # "data": list(field_xds[generic_name].data),
+ # "attrs": msv4_measure,
+ # }
+ # )
+
+ # field_measures_type = "sky_coord"
+ # field_and_source_xds[msv4_name].attrs["type"] = field_measures_type
+
+ # field_and_source_xds = field_and_source_xds.assign_coords(coords)
+ # if "time" in field_and_source_xds:
+ # time_column_description = field_xds.attrs["other"]["msv2"]["ctds_attrs"][
+ # "column_descriptions"
+ # ]["TIME"]
+ # time_msv4_measure = column_description_casacore_to_msv4_measure(
+ # time_column_description
+ # )
+ # field_and_source_xds.coords["time"].attrs.update(time_msv4_measure)
+
+ return (
+ field_and_source_xds,
+ ephemeris_path,
+ ephemeris_table_name,
+ source_id,
+ field_names,
+ )
diff --git a/src/xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py b/src/xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py
index a74511b2..538cc7e8 100644
--- a/src/xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py
+++ b/src/xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py
@@ -55,7 +55,7 @@ def create_info_dicts(
# "field_id": to_list(unique_1d(field_id)),
"field_name": to_list(np.unique(field_and_source_xds.field_name.values)),
"polarization_setup": to_list(xds.polarization.values),
- "scan_number": to_list(np.unique(partition_info_misc_fields["scan_id"])),
+ "scan_name": to_list(np.unique(partition_info_misc_fields["scan_name"])),
"source_name": to_list(np.unique(field_and_source_xds.source_name.values)),
# "source_id": to_list(unique_1d(source_id)),
"intents": partition_info_misc_fields["intents"].split(","),
diff --git a/src/xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py b/src/xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py
index bb4c3bdd..2aa185c6 100644
--- a/src/xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py
+++ b/src/xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py
@@ -127,9 +127,9 @@ def interpolate_to_time(
xds = xds.interp(
{time_name: interp_time.data}, method=method, assume_sorted=True
)
- # scan_number sneaks in as a coordinate of the main time axis, drop it
- if "scan_number" in xds.coords:
- xds = xds.drop_vars("scan_number")
+ # scan_name sneaks in as a coordinate of the main time axis, drop it
+ if "scan_name" in xds.coords:
+ xds = xds.drop_vars("scan_name")
points_after = xds[time_name].size
logger.debug(
f"{message_prefix}: interpolating the time coordinate "
diff --git a/src/xradio/measurement_set/load_processing_set.py b/src/xradio/measurement_set/load_processing_set.py
index e7ff37b4..eedba39b 100644
--- a/src/xradio/measurement_set/load_processing_set.py
+++ b/src/xradio/measurement_set/load_processing_set.py
@@ -37,6 +37,7 @@ def load_processing_set(
In memory representation of processing set (data is represented by Dask.arrays).
"""
from xradio._utils.zarr.common import _open_dataset, _get_file_system_and_items
+ from xradio.measurement_set import MeasurementSetXds
file_system, ms_store_list = _get_file_system_and_items(ps_store)
@@ -71,7 +72,7 @@ def load_processing_set(
"field_and_source_xds"
] = field_and_source_xds_dict[data_group_name]
- ps[ms_name] = xds
+ ps[ms_name] = MeasurementSetXds(xds)
return ps
diff --git a/src/xradio/measurement_set/processing_set.py b/src/xradio/measurement_set/processing_set.py
index b01ddc31..c7103f3d 100644
--- a/src/xradio/measurement_set/processing_set.py
+++ b/src/xradio/measurement_set/processing_set.py
@@ -110,7 +110,7 @@ def _summary(self, data_group="base"):
"intents": [],
"shape": [],
"polarization": [],
- "scan_number": [],
+ "scan_name": [],
"spw_name": [],
"field_name": [],
"source_name": [],
@@ -129,9 +129,7 @@ def _summary(self, data_group="base"):
value.attrs["partition_info"]["spectral_window_name"]
)
summary_data["polarization"].append(value.polarization.values)
- summary_data["scan_number"].append(
- value.attrs["partition_info"]["scan_number"]
- )
+ summary_data["scan_name"].append(value.attrs["partition_info"]["scan_name"])
data_name = value.attrs["data_groups"][data_group]["correlated_data"]
if "VISIBILITY" in data_name:
@@ -156,16 +154,27 @@ def _summary(self, data_group="base"):
)
summary_data["end_frequency"].append(to_list(value["frequency"].values)[-1])
- if value[data_name].attrs["field_and_source_xds"].is_ephemeris:
+ if (
+ value[data_name].attrs["field_and_source_xds"].attrs["type"]
+ == "field_and_source_ephemeris"
+ ):
summary_data["field_coords"].append("Ephemeris")
+ # elif (
+ # "time"
+ # in value[data_name].attrs["field_and_source_xds"][center_name].coords
+ # ):
elif (
- "time"
- in value[data_name].attrs["field_and_source_xds"][center_name].coords
+ value[data_name]
+ .attrs["field_and_source_xds"][center_name]["field_name"]
+ .size
+ > 1
):
summary_data["field_coords"].append("Multi-Phase-Center")
else:
ra_dec_rad = (
- value[data_name].attrs["field_and_source_xds"][center_name].values
+ value[data_name]
+ .attrs["field_and_source_xds"][center_name]
+ .values[0, :]
)
frame = (
value[data_name]
@@ -383,10 +392,7 @@ def to_store(self, store, **kwargs):
def get_combined_field_and_source_xds(self, data_group="base"):
"""
- Combine the `field_and_source_xds` datasets from all Measurement Sets into a single dataset.
-
- The combined `xarray.Dataset` will have a new dimension 'field_name', consolidating data from
- each Measurement Set. Ephemeris data is handled separately.
+ Combine all non-ephemeris `field_and_source_xds` datasets from a Processing Set for a datagroup into a single dataset.
Parameters
----------
@@ -395,22 +401,17 @@ def get_combined_field_and_source_xds(self, data_group="base"):
Returns
-------
- tuple of xarray.Dataset
- A tuple containing two `xarray.Dataset` objects:
- - combined_field_and_source_xds: Combined dataset for standard fields.
- - combined_ephemeris_field_and_source_xds: Combined dataset for ephemeris fields.
+ xarray.Dataset
+ combined_field_and_source_xds: Combined dataset for standard fields.
Raises
------
ValueError
If the `field_and_source_xds` attribute is missing or improperly formatted in any Measurement Set.
"""
- df = self.summary(data_group)
combined_field_and_source_xds = xr.Dataset()
- combined_ephemeris_field_and_source_xds = xr.Dataset()
for ms_name, ms_xds in self.items():
-
correlated_data_name = ms_xds.attrs["data_groups"][data_group][
"correlated_data"
]
@@ -421,75 +422,18 @@ def get_combined_field_and_source_xds(self, data_group="base"):
.copy(deep=True)
)
- if (
- "line_name" in field_and_source_xds.coords
- ): # Not including line info since it is a function of spw.
- field_and_source_xds = field_and_source_xds.drop_vars(
- ["LINE_REST_FREQUENCY", "LINE_SYSTEMIC_VELOCITY"], errors="ignore"
- )
- del field_and_source_xds["line_name"]
- del field_and_source_xds["line_label"]
-
- if "time" in field_and_source_xds.coords:
- if "time" not in field_and_source_xds.field_name.dims:
- field_names = np.array(
- [field_and_source_xds.field_name.values.item()]
- * len(field_and_source_xds.time.values)
- )
- source_names = np.array(
- [field_and_source_xds.source_name.values.item()]
- * len(field_and_source_xds.time.values)
- )
- del field_and_source_xds["field_name"]
- del field_and_source_xds["source_name"]
- field_and_source_xds = field_and_source_xds.assign_coords(
- field_name=("time", field_names)
- )
- field_and_source_xds = field_and_source_xds.assign_coords(
- source_name=("time", source_names)
- )
- field_and_source_xds = field_and_source_xds.swap_dims(
- {"time": "field_name"}
- )
- del field_and_source_xds["time"]
- elif "time_ephemeris" in field_and_source_xds.coords:
- if "time_ephemeris" not in field_and_source_xds.field_name.dims:
- field_names = np.array(
- [field_and_source_xds.field_name.values.item()]
- * len(field_and_source_xds.time_ephemeris.values)
- )
- source_names = np.array(
- [field_and_source_xds.source_name.values.item()]
- * len(field_and_source_xds.time_ephemeris.values)
- )
- del field_and_source_xds["field_name"]
- del field_and_source_xds["source_name"]
- field_and_source_xds = field_and_source_xds.assign_coords(
- field_name=("time_ephemeris", field_names)
- )
- field_and_source_xds = field_and_source_xds.assign_coords(
- source_name=("time_ephemeris", source_names)
- )
- field_and_source_xds = field_and_source_xds.swap_dims(
- {"time_ephemeris": "field_name"}
- )
- del field_and_source_xds["time_ephemeris"]
- else:
- for dv_names in field_and_source_xds.data_vars:
- if "field_name" not in field_and_source_xds[dv_names].dims:
- field_and_source_xds[dv_names] = field_and_source_xds[
- dv_names
- ].expand_dims("field_name")
+ if not field_and_source_xds.attrs["type"] == "field_and_source_ephemeris":
- if field_and_source_xds.is_ephemeris:
- if len(combined_ephemeris_field_and_source_xds.data_vars) == 0:
- combined_ephemeris_field_and_source_xds = field_and_source_xds
- else:
- combined_ephemeris_field_and_source_xds = xr.concat(
- [combined_ephemeris_field_and_source_xds, field_and_source_xds],
- dim="field_name",
+ if (
+ "line_name" in field_and_source_xds.coords
+ ): # Not including line info since it is a function of spw.
+ field_and_source_xds = field_and_source_xds.drop_vars(
+ ["LINE_REST_FREQUENCY", "LINE_SYSTEMIC_VELOCITY"],
+ errors="ignore",
)
- else:
+ del field_and_source_xds["line_name"]
+ del field_and_source_xds["line_label"]
+
if len(combined_field_and_source_xds.data_vars) == 0:
combined_field_and_source_xds = field_and_source_xds
else:
@@ -541,12 +485,86 @@ def get_combined_field_and_source_xds(self, data_group="base"):
combined_field_and_source_xds.field_name[min_index].values
)
+ return combined_field_and_source_xds
+
+ def get_combined_field_and_source_xds_ephemeris(self, data_group="base"):
+ """
+ Combine all ephemeris `field_and_source_xds` datasets from a Processing Set for a datagroup into a single dataset.
+
+ Parameters
+ ----------
+ data_group : str, optional
+ The data group to process. Default is "base".
+
+ Returns
+ -------
+ xarray.Dataset
+ - combined_ephemeris_field_and_source_xds: Combined dataset for ephemeris fields.
+
+ Raises
+ ------
+ ValueError
+ If the `field_and_source_xds` attribute is missing or improperly formatted in any Measurement Set.
+ """
+
+ combined_ephemeris_field_and_source_xds = xr.Dataset()
+ for ms_name, ms_xds in self.items():
+
+ correlated_data_name = ms_xds.attrs["data_groups"][data_group][
+ "correlated_data"
+ ]
+
+ field_and_source_xds = (
+ ms_xds[correlated_data_name]
+ .attrs["field_and_source_xds"]
+ .copy(deep=True)
+ )
+
+ if field_and_source_xds.attrs["type"] == "field_and_source_ephemeris":
+
+ if (
+ "line_name" in field_and_source_xds.coords
+ ): # Not including line info since it is a function of spw.
+ field_and_source_xds = field_and_source_xds.drop_vars(
+ ["LINE_REST_FREQUENCY", "LINE_SYSTEMIC_VELOCITY"],
+ errors="ignore",
+ )
+ del field_and_source_xds["line_name"]
+ del field_and_source_xds["line_label"]
+
+ from xradio.measurement_set._utils._msv2.msv4_sub_xdss import (
+ interpolate_to_time,
+ )
+
+ if "time_ephemeris" in field_and_source_xds:
+ field_and_source_xds = interpolate_to_time(
+ field_and_source_xds,
+ field_and_source_xds.time,
+ "field_and_source_xds",
+ "time_ephemeris",
+ )
+ del field_and_source_xds["time_ephemeris"]
+ field_and_source_xds = field_and_source_xds.rename(
+ {"time_ephemeris": "time"}
+ )
+
+ if "OBSERVER_POSITION" in field_and_source_xds:
+ field_and_source_xds = field_and_source_xds.drop_vars(
+ ["OBSERVER_POSITION"], errors="ignore"
+ )
+
+ if len(combined_ephemeris_field_and_source_xds.data_vars) == 0:
+ combined_ephemeris_field_and_source_xds = field_and_source_xds
+ else:
+
+ combined_ephemeris_field_and_source_xds = xr.concat(
+ [combined_ephemeris_field_and_source_xds, field_and_source_xds],
+ dim="time",
+ )
+
if (len(combined_ephemeris_field_and_source_xds.data_vars) > 0) and (
"FIELD_PHASE_CENTER" in combined_ephemeris_field_and_source_xds
):
- combined_ephemeris_field_and_source_xds = (
- combined_ephemeris_field_and_source_xds.drop_duplicates("field_name")
- )
from xradio._utils.coord_math import wrap_to_pi
@@ -556,7 +574,7 @@ def get_combined_field_and_source_xds(self, data_group="base"):
)
combined_ephemeris_field_and_source_xds["FIELD_OFFSET"] = xr.DataArray(
wrap_to_pi(offset.sel(sky_pos_label=["ra", "dec"])).values,
- dims=["field_name", "sky_dir_label"],
+ dims=["time", "sky_dir_label"],
)
combined_ephemeris_field_and_source_xds["FIELD_OFFSET"].attrs = (
combined_ephemeris_field_and_source_xds["FIELD_PHASE_CENTER"].attrs
@@ -589,7 +607,7 @@ def get_combined_field_and_source_xds(self, data_group="base"):
combined_ephemeris_field_and_source_xds.field_name[min_index].values
)
- return combined_field_and_source_xds, combined_ephemeris_field_and_source_xds
+ return combined_ephemeris_field_and_source_xds
def plot_phase_centers(self, label_all_fields=False, data_group="base"):
"""
@@ -615,8 +633,11 @@ def plot_phase_centers(self, label_all_fields=False, data_group="base"):
ValueError
If the combined datasets are empty or improperly formatted.
"""
- combined_field_and_source_xds, combined_ephemeris_field_and_source_xds = (
- self.get_combined_field_and_source_xds(data_group)
+ combined_field_and_source_xds = self.get_combined_field_and_source_xds(
+ data_group
+ )
+ combined_ephemeris_field_and_source_xds = (
+ self.get_combined_field_and_source_xds_ephemeris(data_group)
)
from matplotlib import pyplot as plt
@@ -669,6 +690,11 @@ def plot_phase_centers(self, label_all_fields=False, data_group="base"):
center_field_name = combined_ephemeris_field_and_source_xds.attrs[
"center_field_name"
]
+
+ combined_ephemeris_field_and_source_xds = (
+ combined_ephemeris_field_and_source_xds.set_xindex("field_name")
+ )
+
center_field = combined_ephemeris_field_and_source_xds.sel(
field_name=center_field_name
)
diff --git a/src/xradio/measurement_set/schema.py b/src/xradio/measurement_set/schema.py
index 5c84be7b..993641f5 100644
--- a/src/xradio/measurement_set/schema.py
+++ b/src/xradio/measurement_set/schema.py
@@ -60,6 +60,8 @@
""" Polynomial term used in VLBI GAIN_CURVE """
LineLabel = Literal["line_label"]
""" Line labels (for line names and variables). """
+FieldName = Literal["field_name"]
+""" Field names dimension. """
# Represents "no dimension", i.e. used for coordinates and data variables with
# zero dimensions.
@@ -961,7 +963,7 @@ class FreqSamplingArray:
"""
-# Define FieldAndSourceXds dataset already here, as it is needed in the
+# Define FieldAndSourceXds and FieldSourceEphemerisXds already here, as they are needed in the
# definition of VisibilityArray
@xarray_dataset_schema
class FieldSourceXds:
@@ -972,34 +974,16 @@ class FieldSourceXds:
For single dishes, this is the nominal pointing direction.
"""
- source_name: Optional[Coord[Union[ZD, Time], str]]
+ source_name: Coord[FieldName, str]
""" Source name. """
- field_name: Optional[Coord[Union[ZD, Time], str]]
- """Field name."""
-
- time: Optional[Coordof[TimeInterpolatedCoordArray]]
- """Midpoint of time for which this set of parameters is accurate. Labeled 'time' when interpolated to main time """
- time_ephemeris: Optional[Coordof[TimeEphemerisCoordArray]]
- """Midpoint of time for which this set of parameters is accurate. Labeled 'time_ephemeris' when not interpolating to main time """
- line_label: Optional[Coord[LineLabel, str]]
- """ Line labels (for line names and variables). """
+ field_name: Coord[FieldName, str]
+ """Field name."""
- line_names: Optional[
- Coord[
- Union[
- tuple[LineLabel],
- tuple[Time, LineLabel],
- tuple[TimeEphemeris, LineLabel],
- ],
- str,
- ]
- ]
- """ Line names (e.g. v=1, J=1-0, SiO). """
+ sky_dir_label: Coord[SkyDirLabel, str]
+ """ Coordinate labels of sky directions (typically shape 2 and 'ra', 'dec') """
- FIELD_PHASE_CENTER: Optional[
- Data[Union[ZD, tuple[Time], tuple[TimeEphemeris]], SkyCoordArray]
- ]
+ FIELD_PHASE_CENTER: Optional[Data[FieldName, SkyCoordArray]]
"""
Offset from the SOURCE_DIRECTION that gives the direction of phase
center for which the fringes have been stopped-that is a point source in
@@ -1009,25 +993,14 @@ class FieldSourceXds:
varies with field, it refers DelayDir_Ref column instead.
"""
- FIELD_REFERENCE_CENTER: Optional[
- Data[Union[ZD, tuple[Time], tuple[TimeEphemeris]], SkyCoordArray]
- ]
+ FIELD_REFERENCE_CENTER: Optional[Data[FieldName, SkyCoordArray]]
"""
Used in single-dish to record the associated reference direction if positionswitching
been applied. For conversion from MSv2, frame refers column keywords by default. If
frame varies with field, it refers DelayDir_Ref column instead.
"""
- SOURCE_LOCATION: Optional[
- Data[
- Union[
- ZD,
- tuple[Time],
- tuple[TimeEphemeris],
- ],
- SkyCoordArray,
- ]
- ]
+ SOURCE_LOCATION: Optional[Data[FieldName, SkyCoordArray]]
"""
CASA Table Cols: RA,DEC,Rho."Astrometric RA and Dec and Geocentric
distance with respect to the observer’s location (Geocentric). "Adjusted
@@ -1040,11 +1013,7 @@ class FieldSourceXds:
LINE_REST_FREQUENCY: Optional[
Data[
- Union[
- tuple[LineLabel],
- tuple[Time, LineLabel],
- tuple[TimeEphemeris, LineLabel],
- ],
+ tuple[FieldName, LineLabel],
SpectralCoordArray,
]
]
@@ -1052,37 +1021,118 @@ class FieldSourceXds:
LINE_SYSTEMIC_VELOCITY: Optional[
Data[
- Union[
- tuple[LineLabel],
- tuple[Time, LineLabel],
- tuple[TimeEphemeris, LineLabel],
- ],
+ tuple[FieldName, LineLabel],
QuantityInMetersPerSecondArray,
]
]
""" Systemic velocity at reference """
- SOURCE_RADIAL_VELOCITY: Optional[
+ OBSERVER_POSITION: Optional[Data[ZD, LocationArray]]
+ """ Observer location. """
+
+ # --- Attributes ---
+ doppler_shift_velocity: Optional[Attr[UnitsOfDopplerShift]]
+ """ Velocity definition of the Doppler shift, e.g., RADIO or OPTICAL velocity in m/s """
+
+ source_model_url: Optional[Attr[str]]
+ """URL to access source model"""
+
+ type: Attr[Literal["field_and_source"]] = "field_and_source"
+ """
+ Type of dataset.
+ """
+
+ # --- Optional coordinates ---
+ cartesian_pos_label: Optional[Coord[CartesianPosLabel, str]] = ("x", "y", "z")
+ """ Coordinate labels of geocentric earth location data (typically shape 3 and 'x', 'y', 'z')"""
+
+ line_label: Optional[Coord[LineLabel, str]] = ()
+ """ Line labels (for line names and variables). """
+
+ line_names: Optional[Coord[tuple[FieldName, LineLabel], str]] = ()
+ """ Line names (e.g. v=1, J=1-0, SiO). """
+
+
+@xarray_dataset_schema
+class FieldSourceEphemerisXds:
+ """
+ Field positions for each source, when the source have ephemeris information.
+
+ Defines a field position on the sky. For interferometers, this is the correlated field position.
+ For single dishes, this is the nominal pointing direction.
+ """
+
+ source_name: Coord[Time, str]
+ """ Source name. """
+
+ field_name: Coord[Time, str]
+ """Field name."""
+
+ time: Coordof[TimeInterpolatedCoordArray]
+ """Midpoint of time for which this set of parameters is accurate. Labeled 'time' when interpolated to main time """
+
+ FIELD_PHASE_CENTER: Optional[Data[tuple[Time], SkyCoordArray]]
+ """
+ Offset from the SOURCE_DIRECTION that gives the direction of phase
+ center for which the fringes have been stopped-that is a point source in
+ this direction will produce a constant measured phase (page 2 of
+ https://articles.adsabs.harvard.edu/pdf/1999ASPC..180...79F). For
+ conversion from MSv2, frame refers column keywords by default. If frame
+ varies with field, it refers DelayDir_Ref column instead.
+ """
+
+ FIELD_REFERENCE_CENTER: Optional[Data[tuple[Time], SkyCoordArray]]
+ """
+ Used in single-dish to record the associated reference direction if positionswitching
+ been applied. For conversion from MSv2, frame refers column keywords by default. If
+ frame varies with field, it refers DelayDir_Ref column instead.
+ """
+
+ LINE_REST_FREQUENCY: Optional[Data[tuple[Time, LineLabel], SpectralCoordArray]]
+ """ Rest frequencies for the transitions. """
+
+ LINE_SYSTEMIC_VELOCITY: Optional[
+ Data[tuple[Time, LineLabel], QuantityInMetersPerSecondArray]
+ ]
+ """ Systemic velocity at reference """
+
+ SOURCE_LOCATION: Optional[
Data[
- Union[ZD, tuple[Time], tuple[TimeEphemeris]], QuantityInMetersPerSecondArray
+ Union[
+ tuple[Time],
+ tuple[TimeEphemeris],
+ ],
+ SkyCoordArray,
]
]
+ """
+ CASA Table Cols: RA,DEC,Rho."Astrometric RA and Dec and Geocentric
+ distance with respect to the observer’s location (Geocentric). "Adjusted
+ for light-time aberration only. With respect to the reference plane and
+ equinox of the chosen system (ICRF or FK4/B1950). If the FK4/B1950 frame
+ output is selected, elliptic aberration terms are added. Astrometric RA/DEC
+ is generally used when comparing or reducing data against a star catalog."
+ https://ssd.jpl.nasa.gov/horizons/manual.html : 1. Astrometric RA & DEC
+ """
+
+ SOURCE_RADIAL_VELOCITY: Optional[
+ Data[Union[tuple[Time], tuple[TimeEphemeris]], QuantityInMetersPerSecondArray]
+ ]
""" CASA Table Cols: RadVel. Geocentric distance rate """
NORTH_POLE_POSITION_ANGLE: Optional[
- Data[Union[ZD, tuple[Time], tuple[TimeEphemeris]], QuantityInRadiansArray]
+ Data[Union[tuple[Time], tuple[TimeEphemeris]], QuantityInRadiansArray]
]
""" CASA Table cols: NP_ang, "Targets' apparent north-pole position angle (counter-clockwise with respect to direction of true-of-date reference-frame north pole) and angular distance from the sub-observer point (center of disc) at print time. A negative distance indicates the north-pole is on the hidden hemisphere." https://ssd.jpl.nasa.gov/horizons/manual.html : 17. North pole position angle & distance from disc center. """
NORTH_POLE_ANGULAR_DISTANCE: Optional[
- Data[Union[ZD, tuple[Time], tuple[TimeEphemeris]], QuantityInRadiansArray]
+ Data[Union[tuple[Time], tuple[TimeEphemeris]], QuantityInRadiansArray]
]
""" CASA Table cols: NP_dist, "Targets' apparent north-pole position angle (counter-clockwise with respect to direction of true-of date reference-frame north pole) and angular distance from the sub-observer point (center of disc) at print time. A negative distance indicates the north-pole is on the hidden hemisphere."https://ssd.jpl.nasa.gov/horizons/manual.html : 17. North pole position angle & distance from disc center. """
SUB_OBSERVER_DIRECTION: Optional[
Data[
Union[
- ZD,
tuple[Time],
tuple[TimeEphemeris],
],
@@ -1094,7 +1144,6 @@ class FieldSourceXds:
SUB_SOLAR_POSITION: Optional[
Data[
Union[
- ZD,
tuple[Time],
tuple[TimeEphemeris],
],
@@ -1104,14 +1153,12 @@ class FieldSourceXds:
""" CASA Table cols: Sl_lon, Sl_lat, r. "Heliocentric distance along with "Apparent sub-solar longitude and latitude of the Sun on the target. The apparent planetodetic longitude and latitude of the center of the target disc as seen from the Sun, as seen by the observer at print-time. This is _NOT_ exactly the same as the "sub-solar" (nearest) point for a non-spherical target shape (since the center of the disc seen from the Sun might not be the closest point to the Sun), but is very close if not a highly irregular body shape. Light travel-time from Sun to target and from target to observer is taken into account. Latitude is the angle between the equatorial plane and the line perpendicular to the reference ellipsoid of the body. The reference ellipsoid is an oblate spheroid with a single flatness coefficient in which the y-axis body radius is taken to be the same value as the x-axis radius. Uses IAU2009 rotation models except for Earth and Moon, which uses a higher precision models. Values for Jupiter, Saturn, Uranus and Neptune are Set III, referring to rotation of their magnetic fields. Whether longitude is positive to the east or west for the target will be indicated at the end of the output ephemeris." https://ssd.jpl.nasa.gov/horizons/manual.html : 15. Solar sub-longitude & sub-latitude """
HELIOCENTRIC_RADIAL_VELOCITY: Optional[
- Data[
- Union[ZD, tuple[Time], tuple[TimeEphemeris]], QuantityInMetersPerSecondArray
- ]
+ Data[Union[tuple[Time], tuple[TimeEphemeris]], QuantityInMetersPerSecondArray]
]
""" CASA Table cols: rdot."The Sun's apparent range-rate relative to the target, as seen by the observer. A positive "rdot" means the target was moving away from the Sun, negative indicates movement toward the Sun." https://ssd.jpl.nasa.gov/horizons/manual.html : 19. Solar range & range-rate (relative to target) """
OBSERVER_PHASE_ANGLE: Optional[
- Data[Union[ZD, tuple[Time], tuple[TimeEphemeris]], QuantityInRadiansArray]
+ Data[Union[tuple[Time], tuple[TimeEphemeris]], QuantityInRadiansArray]
]
""" CASA Table cols: phang.""phi" is the true PHASE ANGLE at the observers' location at print time. "PAB-LON" and "PAB-LAT" are the FK4/B1950 or ICRF/J2000 ecliptic longitude and latitude of the phase angle bisector direction; the outward directed angle bisecting the arc created by the apparent vector from Sun to target center and the astrometric vector from observer to target center. For an otherwise uniform ellipsoid, the time when its long-axis is perpendicular to the PAB direction approximately corresponds to lightcurve maximum (or maximum brightness) of the body. PAB is discussed in Harris et al., Icarus 57, 251-258 (1984)." https://ssd.jpl.nasa.gov/horizons/manual.html : Phase angle and bisector """
@@ -1124,15 +1171,15 @@ class FieldSourceXds:
source_model_url: Optional[Attr[str]]
"""URL to access source model"""
+
ephemeris_name: Optional[Attr[str]]
"""The name of the ephemeris. For example DE430.
This can be used with Astropy solar_system_ephemeris.set('DE430'), see
https://docs.astropy.org/en/stable/coordinates/solarsystem.html.
"""
- is_ephemeris: Attr[bool] = False
- type: Attr[Literal["field_and_source"]] = "field_and_source"
+ type: Attr[Literal["field_and_source_ephemeris"]] = "field_and_source_ephemeris"
"""
Type of dataset.
"""
@@ -1151,6 +1198,15 @@ class FieldSourceXds:
cartesian_pos_label: Optional[Coord[CartesianPosLabel, str]] = ("x", "y", "z")
""" Coordinate labels of geocentric earth location data (typically shape 3 and 'x', 'y', 'z')"""
+ line_label: Optional[Coord[LineLabel, str]] = ()
+ """ Line labels (for line names and variables). """
+
+ line_names: Optional[Coord[tuple[FieldName, LineLabel], str]] = ()
+ """ Line names (e.g. v=1, J=1-0, SiO). """
+
+ time_ephemeris: Optional[Coordof[TimeEphemerisCoordArray]] = ()
+ """Midpoint of time for which this set of parameters is accurate. Labeled 'time_ephemeris' when not interpolating to main time """
+
@xarray_dataarray_schema
class SpectrumArray:
@@ -1166,7 +1222,7 @@ class SpectrumArray:
frequency: Coordof[FrequencyArray]
polarization: Coordof[PolarizationArray]
- field_and_source_xds: Attr[FieldSourceXds]
+ field_and_source_xds: Attr[Union[FieldSourceXds, FieldSourceEphemerisXds]]
long_name: Optional[Attr[str]] = "Spectrum values"
""" Long-form name to use for axis. Should be ``"Spectrum values"``"""
units: Attr[list[str]] = ("Jy",)
@@ -1186,7 +1242,7 @@ class VisibilityArray:
polarization: Coordof[PolarizationArray]
frequency: Coordof[FrequencyArray]
- field_and_source_xds: Attr[FieldSourceXds]
+ field_and_source_xds: Attr[Union[FieldSourceXds, FieldSourceEphemerisXds]]
long_name: Optional[Attr[str]] = "Visibility values"
""" Long-form name to use for axis. Should be ``"Visibility values"``"""
units: Attr[list[str]] = ("Jy",)
@@ -1207,8 +1263,8 @@ class PartitionInfoDict:
""" List of all field names """
polarization_setup: list[str]
""" List of polrization bases. """
- scan_number: list[int]
- """ List of scan numbers. """
+ scan_name: list[str]
+ """ List of scan names. """
source_name: list[str]
""" List of source names. """
# source_id: mising / remove for good?
@@ -1892,8 +1948,8 @@ class VisibilityXds:
"""
uvw_label: Optional[Coordof[UvwLabelArray]] = None
""" u,v,w """
- scan_number: Optional[Coord[Time, Union[numpy.int64, numpy.int32]]] = None
- """Arbitary scan number to identify data taken in the same logical scan."""
+ scan_name: Optional[Coord[Time, str]] = None
+ """Arbitary scan name to identify data taken in the same logical scan."""
# --- Optional data variables / arrays ---
@@ -1989,8 +2045,8 @@ class SpectrumXds:
actual polarization basis for each antenna using labels from the set of
combinations of 'X', 'Y', 'R' and 'L'.
"""
- scan_number: Optional[Coord[Time, Union[numpy.int64, numpy.int32]]] = None
- """Arbitary scan number to identify data taken in the same logical scan."""
+ scan_name: Optional[Coord[Time, str]] = None
+ """Arbitary scan name to identify data taken in the same logical scan."""
# SPECTRUM_CORRECTED: Optional[Dataof[SpectrumArray]] = None
diff --git a/tests/stakeholder/test_measure_set_stakeholder.py b/tests/stakeholder/test_measure_set_stakeholder.py
index 9ab30c0e..bc7708de 100644
--- a/tests/stakeholder/test_measure_set_stakeholder.py
+++ b/tests/stakeholder/test_measure_set_stakeholder.py
@@ -131,7 +131,7 @@ def base_test(
freq_axis = ps.get_ps_freq_axis()
assert type(freq_axis) == xr.DataArray
combined_field_xds = ps.get_combined_field_and_source_xds()
- assert type(combined_field_xds) == tuple
+ assert type(combined_field_xds) == xr.Dataset
combined_antenna = ps.get_combined_antenna_xds()
assert type(combined_antenna) == xr.Dataset
ps.get_combined_field_and_source_xds()
@@ -195,7 +195,7 @@ def test_s3(tmp_path):
# probably is because the schema, the converter or the schema cheker have
# changed since the dataset was uploaded.
base_test(
- "s3://viper-test-data/Antennae_North.cal.lsrk.split.py39.v5.vis.zarr",
+ "s3://viper-test-data/Antennae_North.cal.lsrk.split.py39.v7.vis.zarr",
tmp_path,
190.0405216217041,
is_s3=True,
@@ -411,10 +411,10 @@ def test_askap_59755_eq_interleave_15(tmp_path):
# test_sd_A002_Xae00c5_X2e6b(tmp_path=Path("."))
# test_sd_A002_Xced5df_Xf9d9(tmp_path=Path("."))
# test_sd_A002_Xe3a5fd_Xe38e(tmp_path=Path("."))
- # test_s3(tmp_path=Path("."))
+ test_s3(tmp_path=Path("."))
# test_vlass(tmp_path=Path("."))
# test_alma(tmp_path=Path("."))
- test_preconverted_alma(tmp_path=Path("."))
+ # test_preconverted_alma(tmp_path=Path("."))
# test_ska_mid(tmp_path=Path("."))
# test_lofar(tmp_path=Path("."))
# test_meerkat(tmp_path=Path("."))