From 899df347ebc84e3232c763d60198984f7f6e5a01 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Mon, 13 Jan 2025 11:33:34 +0100 Subject: [PATCH 01/16] change scan_number to scan_name (str), #333 --- src/xradio/measurement_set/schema.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/xradio/measurement_set/schema.py b/src/xradio/measurement_set/schema.py index 1105b159..ad765684 100644 --- a/src/xradio/measurement_set/schema.py +++ b/src/xradio/measurement_set/schema.py @@ -1207,8 +1207,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? @@ -1882,8 +1882,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 --- @@ -1976,8 +1976,8 @@ class SpectrumXds: """ If the polarizations are not constant over baseline """ - 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 From ba4c1b56b9051654b31e2dca1e22d4ec77ae5e70 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Mon, 13 Jan 2025 11:34:17 +0100 Subject: [PATCH 02/16] converter: produce scan_name (str) from numbers, #333 --- src/xradio/measurement_set/_utils/_msv2/conversion.py | 6 +++--- src/xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py | 2 +- src/xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py | 6 +++--- src/xradio/measurement_set/processing_set.py | 6 ++---- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/xradio/measurement_set/_utils/_msv2/conversion.py b/src/xradio/measurement_set/_utils/_msv2/conversion.py index 7509c2bc..a0591a9d 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.-9991", + "schema_version": "4.0.-9990", "type": "visibility", } ) @@ -1238,7 +1238,7 @@ def get_observation_info(in_file, observation_id, intents): xds = fix_uvw_frame(xds, field_and_source_xds, is_single_dish) 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/msv4_info_dicts.py b/src/xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py index b0e036be..f52ed26b 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 1ca2c534..b20ffcdd 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/processing_set.py b/src/xradio/measurement_set/processing_set.py index b01ddc31..d9bd9cdd 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: From a21001e35d7405d65ca6cef481ce3742d2c9840c Mon Sep 17 00:00:00 2001 From: Jan-Willem Date: Thu, 16 Jan 2025 07:39:42 -0500 Subject: [PATCH 03/16] Add Python 3.13 support. --- .github/workflows/python-testing-linux.yml | 2 +- .github/workflows/python-testing-macos.yml | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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..e759e17a 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/pyproject.toml b/pyproject.toml index b882208d..d3e54fdf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ authors = [ ] license = {file = "LICENSE.txt"} readme = "README.md" -requires-python = ">= 3.9, < 3.13" +requires-python = ">= 3.9, < 3.14" dependencies = [ 'astropy', From c33129ac0856dc0bf72763e4aabe955324ad8202 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 16 Jan 2025 13:41:32 +0100 Subject: [PATCH 04/16] update vers number after merge, #333 --- src/xradio/measurement_set/_utils/_msv2/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xradio/measurement_set/_utils/_msv2/conversion.py b/src/xradio/measurement_set/_utils/_msv2/conversion.py index 77aacdae..abc33a16 100644 --- a/src/xradio/measurement_set/_utils/_msv2/conversion.py +++ b/src/xradio/measurement_set/_utils/_msv2/conversion.py @@ -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.-9990", + "schema_version": "4.0.-9989", "type": "visibility", } ) From ded2d6e4fb58dad90558bd8f1ecff41abd14c02c Mon Sep 17 00:00:00 2001 From: Jan-Willem Date: Thu, 16 Jan 2025 08:04:47 -0500 Subject: [PATCH 05/16] Revert Python 3.13 support, issues with numba. --- .github/workflows/python-testing-linux.yml | 2 +- .github/workflows/python-testing-macos.yml | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-testing-linux.yml b/.github/workflows/python-testing-linux.yml index 56fa5548..5f6dc7af 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","3.13"] + python-version: ["3.9","3.10","3.11","3.12"] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/python-testing-macos.yml b/.github/workflows/python-testing-macos.yml index e759e17a..c72a90fa 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", "3.13"] + python-version: ["3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 diff --git a/pyproject.toml b/pyproject.toml index d3e54fdf..b882208d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ authors = [ ] license = {file = "LICENSE.txt"} readme = "README.md" -requires-python = ">= 3.9, < 3.14" +requires-python = ">= 3.9, < 3.13" dependencies = [ 'astropy', From c6a0081e9860a82b9f9fee166e9134817f920aa3 Mon Sep 17 00:00:00 2001 From: Jan-Willem Date: Thu, 23 Jan 2025 08:42:39 -0500 Subject: [PATCH 06/16] Update demo ipynb. --- demo/demo.ipynb | 70 +- .../guides/ALMA_ephemeris.ipynb | 3238 +---------------- 2 files changed, 160 insertions(+), 3148 deletions(-) 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 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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nameintentsshapepolarizationscan_numberspw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
3venus_ephem_test_0[OBSERVE_TARGET#ON_SOURCE](20, 1128, 1, 2)[XX, YY][7, 11]X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0[Venus_1][Venus_0][OSSO_Line_1(ID=0)]Ephemeris2.452498e+112.452498e+11
5venus_ephem_test_1[OBSERVE_TARGET#ON_SOURCE](20, 1128, 1, 2)[XX, YY][7, 11]X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0[Venus_2][Venus_0][OSSO_Line_1(ID=0)]Ephemeris2.452498e+112.452498e+11
6venus_ephem_test_2[OBSERVE_TARGET#ON_SOURCE](20, 1128, 1, 2)[XX, YY][7, 11]X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0[Venus_3][Venus_0][OSSO_Line_1(ID=0)]Ephemeris2.452498e+112.452498e+11
0venus_ephem_test_3[OBSERVE_TARGET#ON_SOURCE](20, 1128, 1, 2)[XX, YY][7, 11]X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0[Venus_0][Venus_0][OSSO_Line_1(ID=0)]Ephemeris2.452498e+112.452498e+11
4venus_ephem_test_4[OBSERVE_TARGET#ON_SOURCE](20, 1128, 1, 2)[XX, YY][7, 11]X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0[Venus_4][Venus_0][OSSO_Line_1(ID=0)]Ephemeris2.452498e+112.452498e+11
2venus_ephem_test_5[OBSERVE_TARGET#ON_SOURCE](20, 1128, 1, 2)[XX, YY][7, 11]X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0[Venus_5][Venus_0][OSSO_Line_1(ID=0)]Ephemeris2.452498e+112.452498e+11
1venus_ephem_test_6[OBSERVE_TARGET#ON_SOURCE](20, 1128, 1, 2)[XX, YY][7, 11]X1847499280#ALMA_RB_06#BB_1#SW-01#FULL_RES_0[Venus_6][Venus_0][OSSO_Line_1(ID=0)]Ephemeris2.452498e+112.452498e+11
\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", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\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:               ...
" - ], - "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", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\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
" - ], - "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", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\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
" - ], - "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": { From f82be0d7df6d700e698cd787b1c59d343002dbf3 Mon Sep 17 00:00:00 2001 From: Jan-Willem Date: Fri, 24 Jan 2025 09:44:43 -0500 Subject: [PATCH 07/16] Fix load_processing_set so that each item in PS is MeasurementSetXds. --- src/xradio/measurement_set/load_processing_set.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 From 0c4dbe2e708765ea6640a0ff8e32946674e5264c Mon Sep 17 00:00:00 2001 From: Jan-Willem Date: Thu, 30 Jan 2025 16:57:41 -0500 Subject: [PATCH 08/16] Field_and_source_xds simplification proposal. --- dev/review_fs/review_fs.ipynb | 9096 +++++++++++++++++ src/xradio/_utils/list_and_array.py | 4 +- src/xradio/_utils/schema.py | 4 +- .../_utils/_msv2/conversion.py | 29 +- .../_msv2/create_field_and_source_xds.py | 337 +- src/xradio/measurement_set/processing_set.py | 11 +- src/xradio/measurement_set/schema.py | 121 +- 7 files changed, 9453 insertions(+), 149 deletions(-) create mode 100644 dev/review_fs/review_fs.ipynb diff --git a/dev/review_fs/review_fs.ipynb b/dev/review_fs/review_fs.ipynb new file mode 100644 index 00000000..18a4c3ec --- /dev/null +++ b/dev/review_fs/review_fs.ipynb @@ -0,0 +1,9096 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\u001b[38;2;128;05;128m2025-01-30 10:58:44,360\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-30 10:58:44,361\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",
+       "  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-01-30 10:58:45,339\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: ALMA_uid___A002_X1003af4_X75a3.split.avg.ms \n", + "[\u001b[38;2;128;05;128m2025-01-30 10:58:45,340\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-30 10:58:45,340\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",
+       "  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-01-30 10:58:46,096\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: VLBA_TL016B_split.ms \n", + "[\u001b[38;2;128;05;128m2025-01-30 10:58:46,097\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-30 10:58:46,098\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",
+       "  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-01-30 10:58:47,037\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: Antennae_North.cal.lsrk.split.ms \n", + "[\u001b[38;2;128;05;128m2025-01-30 10:58:47,038\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-30 10:58:47,038\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",
+       "  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-01-30 10:58:47,726\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\u001b[38;2;128;05;128m2025-01-30 11:02:00,646\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:02:00,653\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 4 \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:02:00,653\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 [0], SCAN [0] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:02:00,833\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m viperlog: \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-01-30 11:02:00,927\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 [1], SCAN [0] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:02:01,147\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m viperlog: \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-01-30 11:02:01,309\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 [0], SCAN [0] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:02:01,543\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m viperlog: \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-01-30 11:02:01,652\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 [1], SCAN [0] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:02:01,869\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m viperlog: \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameintentsshapepolarizationscan_namespw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
2VLBA_TL016B_split_0[obs_0](200, 55, 6, 2)[RR, LL][0]spw_0[4C39.25_0][Unknown][][fk5, 9h27m03.01s, 39d02m20.85s]5.004000e+095.006500e+09
3VLBA_TL016B_split_1[obs_0](540, 55, 6, 2)[RR, LL][0]spw_0[J1154+6022_1][Unknown][][fk5, 11h54m04.54s, 60d22m20.82s]5.004000e+095.006500e+09
1VLBA_TL016B_split_2[obs_0](200, 55, 6, 2)[RR, LL][0]spw_1[4C39.25_0][Unknown][][fk5, 9h27m03.01s, 39d02m20.85s]5.068000e+095.070500e+09
0VLBA_TL016B_split_3[obs_0](540, 55, 6, 2)[RR, LL][0]spw_1[J1154+6022_1][Unknown][][fk5, 11h54m04.54s, 60d22m20.82s]5.068000e+095.070500e+09
\n", + "
" + ], + "text/plain": [ + " name intents shape polarization scan_name \\\n", + "2 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", + "1 VLBA_TL016B_split_2 [obs_0] (200, 55, 6, 2) [RR, LL] [0] \n", + "0 VLBA_TL016B_split_3 [obs_0] (540, 55, 6, 2) [RR, LL] [0] \n", + "\n", + " spw_name field_name source_name line_name \\\n", + "2 spw_0 [4C39.25_0] [Unknown] [] \n", + "3 spw_0 [J1154+6022_1] [Unknown] [] \n", + "1 spw_1 [4C39.25_0] [Unknown] [] \n", + "0 spw_1 [J1154+6022_1] [Unknown] [] \n", + "\n", + " field_coords start_frequency end_frequency \n", + "2 [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", + "1 [fk5, 9h27m03.01s, 39d02m20.85s] 5.068000e+09 5.070500e+09 \n", + "0 [fk5, 11h54m04.54s, 60d22m20.82s] 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_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": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 168B\n",
+       "Dimensions:             (field_name: 1, sky_dir_label: 2)\n",
+       "Coordinates:\n",
+       "    field_id            (field_name) int64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "  * field_name          (field_name) <U29 116B '4C39.25_0'\n",
+       "    source_name         (field_name) <U7 28B 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",
+       "Attributes:\n",
+       "    is_ephemeris:  False\n",
+       "    type:          field_and_source
" + ], + "text/plain": [ + " Size: 168B\n", + "Dimensions: (field_name: 1, sky_dir_label: 2)\n", + "Coordinates:\n", + " field_id (field_name) int64 8B dask.array\n", + " * field_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", + "Attributes:\n", + " is_ephemeris: False\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": [ + "# VLBA_TL016B_split" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\u001b[38;2;128;05;128m2025-01-30 11:02:49,369\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:02:49,373\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:02:49,373\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 [0 1], SCAN [0] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:02:49,718\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m viperlog: \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-01-30 11:02:49,825\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 [0 1], SCAN [0] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:02:50,047\u001b[0m] \u001b[38;2;255;160;0m WARNING\u001b[0m\u001b[38;2;112;128;144m viperlog: \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameintentsshapepolarizationscan_namespw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
0VLBA_TL016B_split_0[obs_0](740, 55, 6, 2)[RR, LL][0]spw_0[4C39.25_0, J1154+6022_1][Unknown][]Multi-Phase-Center5.004000e+095.006500e+09
1VLBA_TL016B_split_1[obs_0](740, 55, 6, 2)[RR, LL][0]spw_1[4C39.25_0, J1154+6022_1][Unknown][]Multi-Phase-Center5.068000e+095.070500e+09
\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": 8, + "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": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 360B\n",
+       "Dimensions:             (field_name: 2, sky_dir_label: 2)\n",
+       "Coordinates:\n",
+       "    field_id            (field_name) int64 16B dask.array<chunksize=(2,), meta=np.ndarray>\n",
+       "  * field_name          (field_name) <U32 256B '4C39.25_0' 'J1154+6022_1'\n",
+       "    source_name         (field_name) <U7 56B dask.array<chunksize=(2,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: sky_dir_label\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",
+       "    is_ephemeris:  False\n",
+       "    type:          field_and_source
" + ], + "text/plain": [ + " Size: 360B\n", + "Dimensions: (field_name: 2, sky_dir_label: 2)\n", + "Coordinates:\n", + " field_id (field_name) int64 16B dask.array\n", + " * field_name (field_name) \n", + "Dimensions without coordinates: sky_dir_label\n", + "Data variables:\n", + " FIELD_PHASE_CENTER (field_name, sky_dir_label) float64 32B dask.array\n", + "Attributes:\n", + " is_ephemeris: False\n", + " type: field_and_source" + ] + }, + "execution_count": 9, + "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": 1, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameintentsshapepolarizationscan_namespw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
5day2_TDEM0003_10s_norx_0[obs_0](196, 171, 64, 4)[RR, RL, LR, LL][11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 32, 3...Subband:0_0[J0954+1743_2][J0954+1743_2][][fk5, 9h54m56.82s, 17d43m31.22s]3.638723e+103.639510e+10
6day2_TDEM0003_10s_norx_1[obs_0](609, 171, 64, 4)[RR, RL, LR, LL][10, 12, 14, 16, 18, 23, 25, 27, 29, 31, 33, 3...Subband:0_0[IRC+10216_3][IRC+10216_3][][fk5, 9h47m57.38s, 13d16m40.66s]3.638723e+103.639510e+10
3day2_TDEM0003_10s_norx_2[obs_0](32, 171, 64, 4)[RR, RL, LR, LL][56]Subband:0_0[J1229+0203_5][J1229+0203_5][][fk5, 12h29m06.70s, 2d03m08.60s]3.638723e+103.639510e+10
0day2_TDEM0003_10s_norx_3[obs_0](17, 171, 64, 4)[RR, RL, LR, LL][59]Subband:0_0[J1331+3030_7][J1331+3030_7][][fk5, 13h31m08.29s, 30d30m32.96s]3.638723e+103.639510e+10
1day2_TDEM0003_10s_norx_4[obs_0](196, 171, 64, 4)[RR, RL, LR, LL][11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 32, 3...Subband:0_1[J0954+1743_2][J0954+1743_2][][fk5, 9h54m56.82s, 17d43m31.22s]3.630454e+103.631242e+10
2day2_TDEM0003_10s_norx_5[obs_0](609, 171, 64, 4)[RR, RL, LR, LL][10, 12, 14, 16, 18, 23, 25, 27, 29, 31, 33, 3...Subband:0_1[IRC+10216_3][IRC+10216_3][][fk5, 9h47m57.38s, 13d16m40.66s]3.630454e+103.631242e+10
7day2_TDEM0003_10s_norx_6[obs_0](32, 171, 64, 4)[RR, RL, LR, LL][56]Subband:0_1[J1229+0203_5][J1229+0203_5][][fk5, 12h29m06.70s, 2d03m08.60s]3.630454e+103.631242e+10
4day2_TDEM0003_10s_norx_7[obs_0](17, 171, 64, 4)[RR, RL, LR, LL][59]Subband:0_1[J1331+3030_7][J1331+3030_7][][fk5, 13h31m08.29s, 30d30m32.96s]3.630454e+103.631242e+10
\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": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\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
" + ], + "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": 3, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameintentsshapepolarizationscan_namespw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
0day2_TDEM0003_10s_norx_0[obs_0](854, 171, 64, 4)[RR, RL, LR, LL][10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 2...Subband:0_0[IRC+10216_3, J0954+1743_2, J1229+0203_5, J133...[IRC+10216_3, J0954+1743_2, J1229+0203_5, J133...[]Multi-Phase-Center3.638723e+103.639510e+10
1day2_TDEM0003_10s_norx_1[obs_0](854, 171, 64, 4)[RR, RL, LR, LL][10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 2...Subband:0_1[IRC+10216_3, J0954+1743_2, J1229+0203_5, J133...[IRC+10216_3, J0954+1743_2, J1229+0203_5, J133...[]Multi-Phase-Center3.630454e+103.631242e+10
\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": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\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
" + ], + "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": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\u001b[38;2;128;05;128m2025-01-30 11:32:15,495\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-30 11:32:15,523\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 12 \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:15,523\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 [32 23 30 37], FIELD [0], SCAN [ 9 17 21 25] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:15,626\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 [33 24 31], FIELD [1], SCAN [ 9 17 21] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:15,775\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 [34 25 32], FIELD [2], SCAN [ 9 17 21] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:15,926\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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-01-30 11:32:16,064\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [1], DDI [0], STATE [33 24 31], FIELD [1], SCAN [26 34 38] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:16,204\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [1], DDI [0], STATE [34 25 32], FIELD [2], SCAN [26 34 38] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:16,341\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [32], FIELD [0], SCAN [43] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:16,494\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [33], FIELD [1], SCAN [43] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:16,637\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [34], FIELD [2], SCAN [43] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:16,779\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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-01-30 11:32:16,915\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [3], DDI [0], STATE [49 40 47], FIELD [1], SCAN [48 56 60] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:17,048\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameintentsshapepolarizationscan_namespw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
6Antennae_North.cal.lsrk.split_00[OBSERVE_TARGET#ON_SOURCE](20, 45, 8, 2)[XX, YY][17, 21, 25, 9]spw_0[NGC4038 - Antennae North_0][NGC4038 - Antennae North_0][][fk5, 12h01m52.43s, -18d52m02.92s]3.439281e+113.440067e+11
11Antennae_North.cal.lsrk.split_01[OBSERVE_TARGET#ON_SOURCE](15, 45, 8, 2)[XX, YY][17, 21, 9]spw_0[NGC4038 - Antennae North_1][NGC4038 - Antennae North_0][][fk5, 12h01m52.96s, -18d52m02.92s]3.439281e+113.440067e+11
4Antennae_North.cal.lsrk.split_02[OBSERVE_TARGET#ON_SOURCE](15, 45, 8, 2)[XX, YY][17, 21, 9]spw_0[NGC4038 - Antennae North_2][NGC4038 - Antennae North_0][][fk5, 12h01m53.49s, -18d52m02.92s]3.439281e+113.440067e+11
3Antennae_North.cal.lsrk.split_03[OBSERVE_TARGET#ON_SOURCE](20, 55, 8, 2)[XX, YY][26, 34, 38, 42]spw_0[NGC4038 - Antennae North_0][NGC4038 - Antennae North_0][][fk5, 12h01m52.43s, -18d52m02.92s]3.439281e+113.440067e+11
2Antennae_North.cal.lsrk.split_04[OBSERVE_TARGET#ON_SOURCE](15, 55, 8, 2)[XX, YY][26, 34, 38]spw_0[NGC4038 - Antennae North_1][NGC4038 - Antennae North_0][][fk5, 12h01m52.96s, -18d52m02.92s]3.439281e+113.440067e+11
5Antennae_North.cal.lsrk.split_05[OBSERVE_TARGET#ON_SOURCE](15, 55, 8, 2)[XX, YY][26, 34, 38]spw_0[NGC4038 - Antennae North_2][NGC4038 - Antennae North_0][][fk5, 12h01m53.49s, -18d52m02.92s]3.439281e+113.440067e+11
10Antennae_North.cal.lsrk.split_06[OBSERVE_TARGET#ON_SOURCE](5, 55, 8, 2)[XX, YY][43]spw_0[NGC4038 - Antennae North_0][NGC4038 - Antennae North_0][][fk5, 12h01m52.43s, -18d52m02.92s]3.439281e+113.440067e+11
7Antennae_North.cal.lsrk.split_07[OBSERVE_TARGET#ON_SOURCE](5, 55, 8, 2)[XX, YY][43]spw_0[NGC4038 - Antennae North_1][NGC4038 - Antennae North_0][][fk5, 12h01m52.96s, -18d52m02.92s]3.439281e+113.440067e+11
9Antennae_North.cal.lsrk.split_08[OBSERVE_TARGET#ON_SOURCE](5, 55, 8, 2)[XX, YY][43]spw_0[NGC4038 - Antennae North_2][NGC4038 - Antennae North_0][][fk5, 12h01m53.49s, -18d52m02.92s]3.439281e+113.440067e+11
8Antennae_North.cal.lsrk.split_09[OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO...(20, 77, 8, 2)[XX, YY][48, 56, 60, 64]spw_0[NGC4038 - Antennae North_0][NGC4038 - Antennae North_0][][fk5, 12h01m52.43s, -18d52m02.92s]3.439281e+113.440067e+11
1Antennae_North.cal.lsrk.split_10[OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO...(15, 77, 8, 2)[XX, YY][48, 56, 60]spw_0[NGC4038 - Antennae North_1][NGC4038 - Antennae North_0][][fk5, 12h01m52.96s, -18d52m02.92s]3.439281e+113.440067e+11
0Antennae_North.cal.lsrk.split_11[OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO...(15, 77, 8, 2)[XX, YY][48, 56, 60]spw_0[NGC4038 - Antennae North_2][NGC4038 - Antennae North_0][][fk5, 12h01m53.49s, -18d52m02.92s]3.439281e+113.440067e+11
\n", + "
" + ], + "text/plain": [ + " name \\\n", + "6 Antennae_North.cal.lsrk.split_00 \n", + "11 Antennae_North.cal.lsrk.split_01 \n", + "4 Antennae_North.cal.lsrk.split_02 \n", + "3 Antennae_North.cal.lsrk.split_03 \n", + "2 Antennae_North.cal.lsrk.split_04 \n", + "5 Antennae_North.cal.lsrk.split_05 \n", + "10 Antennae_North.cal.lsrk.split_06 \n", + "7 Antennae_North.cal.lsrk.split_07 \n", + "9 Antennae_North.cal.lsrk.split_08 \n", + "8 Antennae_North.cal.lsrk.split_09 \n", + "1 Antennae_North.cal.lsrk.split_10 \n", + "0 Antennae_North.cal.lsrk.split_11 \n", + "\n", + " intents shape \\\n", + "6 [OBSERVE_TARGET#ON_SOURCE] (20, 45, 8, 2) \n", + "11 [OBSERVE_TARGET#ON_SOURCE] (15, 45, 8, 2) \n", + "4 [OBSERVE_TARGET#ON_SOURCE] (15, 45, 8, 2) \n", + "3 [OBSERVE_TARGET#ON_SOURCE] (20, 55, 8, 2) \n", + "2 [OBSERVE_TARGET#ON_SOURCE] (15, 55, 8, 2) \n", + "5 [OBSERVE_TARGET#ON_SOURCE] (15, 55, 8, 2) \n", + "10 [OBSERVE_TARGET#ON_SOURCE] (5, 55, 8, 2) \n", + "7 [OBSERVE_TARGET#ON_SOURCE] (5, 55, 8, 2) \n", + "9 [OBSERVE_TARGET#ON_SOURCE] (5, 55, 8, 2) \n", + "8 [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... (20, 77, 8, 2) \n", + "1 [OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO... (15, 77, 8, 2) \n", + "0 [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", + "11 [XX, YY] [17, 21, 9] spw_0 [NGC4038 - Antennae North_1] \n", + "4 [XX, YY] [17, 21, 9] spw_0 [NGC4038 - Antennae North_2] \n", + "3 [XX, YY] [26, 34, 38, 42] spw_0 [NGC4038 - Antennae North_0] \n", + "2 [XX, YY] [26, 34, 38] spw_0 [NGC4038 - Antennae North_1] \n", + "5 [XX, YY] [26, 34, 38] spw_0 [NGC4038 - Antennae North_2] \n", + "10 [XX, YY] [43] spw_0 [NGC4038 - Antennae North_0] \n", + "7 [XX, YY] [43] spw_0 [NGC4038 - Antennae North_1] \n", + "9 [XX, YY] [43] spw_0 [NGC4038 - Antennae North_2] \n", + "8 [XX, YY] [48, 56, 60, 64] spw_0 [NGC4038 - Antennae North_0] \n", + "1 [XX, YY] [48, 56, 60] spw_0 [NGC4038 - Antennae North_1] \n", + "0 [XX, YY] [48, 56, 60] spw_0 [NGC4038 - Antennae North_2] \n", + "\n", + " source_name line_name \\\n", + "6 [NGC4038 - Antennae North_0] [] \n", + "11 [NGC4038 - Antennae North_0] [] \n", + "4 [NGC4038 - Antennae North_0] [] \n", + "3 [NGC4038 - Antennae North_0] [] \n", + "2 [NGC4038 - Antennae North_0] [] \n", + "5 [NGC4038 - Antennae North_0] [] \n", + "10 [NGC4038 - Antennae North_0] [] \n", + "7 [NGC4038 - Antennae North_0] [] \n", + "9 [NGC4038 - Antennae North_0] [] \n", + "8 [NGC4038 - Antennae North_0] [] \n", + "1 [NGC4038 - Antennae North_0] [] \n", + "0 [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", + "11 [fk5, 12h01m52.96s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "4 [fk5, 12h01m53.49s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "3 [fk5, 12h01m52.43s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "2 [fk5, 12h01m52.96s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "5 [fk5, 12h01m53.49s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "10 [fk5, 12h01m52.43s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "7 [fk5, 12h01m52.96s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "9 [fk5, 12h01m53.49s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "8 [fk5, 12h01m52.43s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "1 [fk5, 12h01m52.96s, -18d52m02.92s] 3.439281e+11 3.440067e+11 \n", + "0 [fk5, 12h01m53.49s, -18d52m02.92s] 3.439281e+11 3.440067e+11 " + ] + }, + "execution_count": 7, + "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": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 408B\n",
+       "Dimensions:             (field_name: 1, sky_dir_label: 2)\n",
+       "Coordinates:\n",
+       "    field_id            (field_name) int64 8B dask.array<chunksize=(1,), meta=np.ndarray>\n",
+       "  * field_name          (field_name) <U46 184B 'NGC4038 - Antennae North_0'\n",
+       "    source_name         (field_name) <U46 184B 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",
+       "    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
" + ], + "text/plain": [ + " Size: 408B\n", + "Dimensions: (field_name: 1, sky_dir_label: 2)\n", + "Coordinates:\n", + " field_id (field_name) int64 8B dask.array\n", + " * field_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", + " SOURCE_LOCATION (field_name, sky_dir_label) float64 16B dask.array\n", + "Attributes:\n", + " is_ephemeris: False\n", + " type: field_and_source" + ] + }, + "execution_count": 8, + "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": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\u001b[38;2;128;05;128m2025-01-30 11:32:59,592\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'] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:59,609\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 4 \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:32:59,610\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 [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-01-30 11:32:59,742\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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-01-30 11:32:59,883\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [2], DDI [0], STATE [32 33 34], FIELD [0 1 2], SCAN [43] \n", + "[\u001b[38;2;128;05;128m2025-01-30 11:33:00,120\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameintentsshapepolarizationscan_namespw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
0Antennae_North.cal.lsrk.split_0[OBSERVE_TARGET#ON_SOURCE](50, 45, 8, 2)[XX, YY][17, 21, 25, 9]spw_0[NGC4038 - Antennae North_0, NGC4038 - Antenna...[NGC4038 - Antennae North_0][]Multi-Phase-Center3.439281e+113.440067e+11
1Antennae_North.cal.lsrk.split_1[OBSERVE_TARGET#ON_SOURCE](50, 55, 8, 2)[XX, YY][26, 34, 38, 42]spw_0[NGC4038 - Antennae North_0, NGC4038 - Antenna...[NGC4038 - Antennae North_0][]Multi-Phase-Center3.439281e+113.440067e+11
3Antennae_North.cal.lsrk.split_2[OBSERVE_TARGET#ON_SOURCE](15, 55, 8, 2)[XX, YY][43]spw_0[NGC4038 - Antennae North_0, NGC4038 - Antenna...[NGC4038 - Antennae North_0][]Multi-Phase-Center3.439281e+113.440067e+11
2Antennae_North.cal.lsrk.split_3[OBSERVE_TARGET#ON_SOURCE, CALIBRATE_WVR#ON_SO...(50, 77, 8, 2)[XX, YY][48, 56, 60, 64]spw_0[NGC4038 - Antennae North_0, NGC4038 - Antenna...[NGC4038 - Antennae North_0][]Multi-Phase-Center3.439281e+113.440067e+11
\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": 9, + "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": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 1kB\n",
+       "Dimensions:             (field_name: 3, sky_dir_label: 2)\n",
+       "Coordinates:\n",
+       "    field_id            (field_name) int64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+       "  * field_name          (field_name) <U46 552B 'NGC4038 - Antennae North_0' ....\n",
+       "    source_name         (field_name) <U46 552B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: sky_dir_label\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",
+       "    is_ephemeris:  False\n",
+       "    type:          field_and_source
" + ], + "text/plain": [ + " Size: 1kB\n", + "Dimensions: (field_name: 3, sky_dir_label: 2)\n", + "Coordinates:\n", + " field_id (field_name) int64 24B dask.array\n", + " * field_name (field_name) \n", + "Dimensions without coordinates: sky_dir_label\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", + " is_ephemeris: False\n", + " type: field_and_source" + ] + }, + "execution_count": 10, + "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": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\u001b[38;2;128;05;128m2025-01-30 16:50:40,372\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-30 16:50:40,984\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 96 \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:40,985\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 [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:41,152\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 [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:41,317\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 [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:41,468\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 [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:41,589\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 [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:41,746\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 [21 48 75], FIELD [3], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:41,961\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 [22 49 76], FIELD [4], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:42,114\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 [23 50 77], FIELD [5], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:42,272\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 [24 51 78], FIELD [6], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:42,433\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 [25 52 79], FIELD [7], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:42,593\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 [26 53 80], FIELD [8], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:42,753\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 [27 54 81], FIELD [9], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:42,911\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 [28 55 82], FIELD [10], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:43,068\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 [29 56 83], FIELD [11], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:43,227\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 [30 57 84], FIELD [12], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:43,386\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 [31 58 85], FIELD [13], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:43,545\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 [32 59 86], FIELD [14], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:43,712\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 [33 60 87], FIELD [15], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:43,866\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 [34 61 88], FIELD [16], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:44,021\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 [35 62 89], FIELD [17], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:44,174\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 [36 63 90], FIELD [18], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:44,336\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 [37 64 91], FIELD [19], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:44,493\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 [38 65 92], FIELD [20], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:44,662\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 [39 66 93], FIELD [21], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:44,817\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 [40 67 94], FIELD [22], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:44,975\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 [41 68 95], FIELD [23], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:45,135\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 [42 69 96], FIELD [24], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:45,371\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 [43 70 97], FIELD [25], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:45,532\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 [44 71 98], FIELD [26], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:45,689\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 [45 72], FIELD [27], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:45,846\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 [46 73], FIELD [28], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:46,015\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 [47 74], FIELD [29], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:46,182\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 [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:46,331\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 [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:46,483\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 [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:46,627\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 [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:46,750\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 [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:46,898\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 [21 48 75], FIELD [3], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:47,043\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 [22 49 76], FIELD [4], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:47,197\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 [23 50 77], FIELD [5], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:47,345\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 [24 51 78], FIELD [6], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:47,520\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 [25 52 79], FIELD [7], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:47,674\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 [26 53 80], FIELD [8], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:47,837\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 [27 54 81], FIELD [9], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:48,010\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 [28 55 82], FIELD [10], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:48,166\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 [29 56 83], FIELD [11], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:48,322\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 [30 57 84], FIELD [12], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:48,479\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 [31 58 85], FIELD [13], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:48,645\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 [32 59 86], FIELD [14], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:48,804\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 [33 60 87], FIELD [15], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:48,971\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 [34 61 88], FIELD [16], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:49,124\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 [35 62 89], FIELD [17], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:49,432\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 [36 63 90], FIELD [18], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:49,610\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 [37 64 91], FIELD [19], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:49,809\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 [38 65 92], FIELD [20], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:49,976\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 [39 66 93], FIELD [21], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:50,125\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 [40 67 94], FIELD [22], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:50,280\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 [41 68 95], FIELD [23], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:50,431\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 [42 69 96], FIELD [24], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:50,587\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 [43 70 97], FIELD [25], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:50,732\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 [44 71 98], FIELD [26], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:50,880\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 [45 72], FIELD [27], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:51,028\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 [46 73], FIELD [28], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:51,175\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 [47 74], FIELD [29], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:51,323\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:51,547\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:51,768\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:51,996\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:52,360\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:52,658\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [21 48 75], FIELD [3], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:52,911\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [22 49 76], FIELD [4], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:53,159\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [23 50 77], FIELD [5], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:53,402\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [24 51 78], FIELD [6], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:53,652\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [25 52 79], FIELD [7], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:53,914\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [26 53 80], FIELD [8], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:54,405\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [27 54 81], FIELD [9], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:54,675\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [28 55 82], FIELD [10], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:54,924\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [29 56 83], FIELD [11], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:55,184\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [30 57 84], FIELD [12], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:55,437\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [31 58 85], FIELD [13], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:55,683\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [32 59 86], FIELD [14], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:55,943\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [33 60 87], FIELD [15], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:56,205\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [34 61 88], FIELD [16], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:56,466\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [35 62 89], FIELD [17], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:56,715\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [36 63 90], FIELD [18], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:56,961\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [37 64 91], FIELD [19], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:57,202\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [38 65 92], FIELD [20], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:57,451\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [39 66 93], FIELD [21], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:57,688\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [40 67 94], FIELD [22], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:57,930\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [41 68 95], FIELD [23], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:58,171\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [42 69 96], FIELD [24], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:58,464\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [43 70 97], FIELD [25], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:58,718\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [44 71 98], FIELD [26], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:58,968\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [45 72], FIELD [27], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:59,212\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [46 73], FIELD [28], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:50:59,472\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [47 74], FIELD [29], SCAN [8] \n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameintentsshapepolarizationscan_namespw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
18ALMA_uid___A002_X1003af4_X75a3.split.avg_00[CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV...(3, 51, 1, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_0][Sun_10_0][]Ephemeris2.480000e+112.480000e+11
8ALMA_uid___A002_X1003af4_X75a3.split.avg_01[CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A...(3, 51, 1, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_0][Sun_10_0][]Ephemeris2.480000e+112.480000e+11
49ALMA_uid___A002_X1003af4_X75a3.split.avg_02[CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT](3, 51, 1, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_0][Sun_10_0][]Ephemeris2.480000e+112.480000e+11
58ALMA_uid___A002_X1003af4_X75a3.split.avg_03[CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S...(31, 51, 1, 2)[XX, YY][6]X767114449#ALMA_RB_06#BB_4#SQLD_0[J1408-0752_2][J1408-0752_2][][icrs, 14h08m56.48s, -7d52m26.67s]2.480000e+112.480000e+11
59ALMA_uid___A002_X1003af4_X75a3.split.avg_04[OBSERVE_TARGET#OFF_SOURCE](14, 51, 1, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_0][Sun_10_0][]Ephemeris2.480000e+112.480000e+11
.......................................
12ALMA_uid___A002_X1003af4_X75a3.split.avg_91[OBSERVE_TARGET#ON_SOURCE](9, 1326, 7, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_25][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
65ALMA_uid___A002_X1003af4_X75a3.split.avg_92[OBSERVE_TARGET#ON_SOURCE](9, 1326, 7, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_26][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
53ALMA_uid___A002_X1003af4_X75a3.split.avg_93[OBSERVE_TARGET#ON_SOURCE](6, 1326, 7, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_27][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
57ALMA_uid___A002_X1003af4_X75a3.split.avg_94[OBSERVE_TARGET#ON_SOURCE](6, 1326, 7, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_28][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
62ALMA_uid___A002_X1003af4_X75a3.split.avg_95[OBSERVE_TARGET#ON_SOURCE](6, 1326, 7, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_29][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
\n", + "

96 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " name \\\n", + "18 ALMA_uid___A002_X1003af4_X75a3.split.avg_00 \n", + "8 ALMA_uid___A002_X1003af4_X75a3.split.avg_01 \n", + "49 ALMA_uid___A002_X1003af4_X75a3.split.avg_02 \n", + "58 ALMA_uid___A002_X1003af4_X75a3.split.avg_03 \n", + "59 ALMA_uid___A002_X1003af4_X75a3.split.avg_04 \n", + ".. ... \n", + "12 ALMA_uid___A002_X1003af4_X75a3.split.avg_91 \n", + "65 ALMA_uid___A002_X1003af4_X75a3.split.avg_92 \n", + "53 ALMA_uid___A002_X1003af4_X75a3.split.avg_93 \n", + "57 ALMA_uid___A002_X1003af4_X75a3.split.avg_94 \n", + "62 ALMA_uid___A002_X1003af4_X75a3.split.avg_95 \n", + "\n", + " intents shape \\\n", + "18 [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... (3, 51, 1, 2) \n", + "8 [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... (3, 51, 1, 2) \n", + "49 [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] (3, 51, 1, 2) \n", + "58 [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... (31, 51, 1, 2) \n", + "59 [OBSERVE_TARGET#OFF_SOURCE] (14, 51, 1, 2) \n", + ".. ... ... \n", + "12 [OBSERVE_TARGET#ON_SOURCE] (9, 1326, 7, 2) \n", + "65 [OBSERVE_TARGET#ON_SOURCE] (9, 1326, 7, 2) \n", + "53 [OBSERVE_TARGET#ON_SOURCE] (6, 1326, 7, 2) \n", + "57 [OBSERVE_TARGET#ON_SOURCE] (6, 1326, 7, 2) \n", + "62 [OBSERVE_TARGET#ON_SOURCE] (6, 1326, 7, 2) \n", + "\n", + " polarization scan_name spw_name \\\n", + "18 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n", + "8 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n", + "49 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n", + "58 [XX, YY] [6] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n", + "59 [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", + "65 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n", + "53 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n", + "57 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n", + "62 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n", + "\n", + " field_name source_name line_name \\\n", + "18 [Sun_10_0] [Sun_10_0] [] \n", + "8 [Sun_10_0] [Sun_10_0] [] \n", + "49 [Sun_10_0] [Sun_10_0] [] \n", + "58 [J1408-0752_2] [J1408-0752_2] [] \n", + "59 [Sun_10_0] [Sun_10_0] [] \n", + ".. ... ... ... \n", + "12 [Sun_10_25] [Sun_10_0] [Single_Continuum(ID=0)] \n", + "65 [Sun_10_26] [Sun_10_0] [Single_Continuum(ID=0)] \n", + "53 [Sun_10_27] [Sun_10_0] [Single_Continuum(ID=0)] \n", + "57 [Sun_10_28] [Sun_10_0] [Single_Continuum(ID=0)] \n", + "62 [Sun_10_29] [Sun_10_0] [Single_Continuum(ID=0)] \n", + "\n", + " field_coords start_frequency end_frequency \n", + "18 Ephemeris 2.480000e+11 2.480000e+11 \n", + "8 Ephemeris 2.480000e+11 2.480000e+11 \n", + "49 Ephemeris 2.480000e+11 2.480000e+11 \n", + "58 [icrs, 14h08m56.48s, -7d52m26.67s] 2.480000e+11 2.480000e+11 \n", + "59 Ephemeris 2.480000e+11 2.480000e+11 \n", + ".. ... ... ... \n", + "12 Ephemeris 2.299609e+11 2.300547e+11 \n", + "65 Ephemeris 2.299609e+11 2.300547e+11 \n", + "53 Ephemeris 2.299609e+11 2.300547e+11 \n", + "57 Ephemeris 2.299609e+11 2.300547e+11 \n", + "62 Ephemeris 2.299609e+11 2.300547e+11 \n", + "\n", + "[96 rows x 12 columns]" + ] + }, + "execution_count": 3, + "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": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 1kB\n",
+       "Dimensions:                       (time: 3, sky_pos_label: 3,\n",
+       "                                   ellipsoid_pos_label: 3)\n",
+       "Coordinates:\n",
+       "  * ellipsoid_pos_label           (ellipsoid_pos_label) <U4 48B 'lon' ... 'dist'\n",
+       "    field_id                      (time) int64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+       "    field_name                    (time) <U28 336B dask.array<chunksize=(3,), meta=np.ndarray>\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",
+       "    is_ephemeris:  True\n",
+       "    type:          field_and_source
" + ], + "text/plain": [ + " Size: 1kB\n", + "Dimensions: (time: 3, sky_pos_label: 3,\n", + " ellipsoid_pos_label: 3)\n", + "Coordinates:\n", + " * ellipsoid_pos_label (ellipsoid_pos_label) \n", + " field_name (time) \n", + " * sky_pos_label (sky_pos_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", + " is_ephemeris: True\n", + " type: field_and_source" + ] + }, + "execution_count": 5, + "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": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\u001b[38;2;128;05;128m2025-01-30 16:51:26,900\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'] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:26,934\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 18 \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:26,934\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 [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,134\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 [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,283\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 [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,471\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 [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,607\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 [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,763\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 [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-01-30 16:51:27,956\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 [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,114\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 [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,261\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 [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,405\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 [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,525\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 [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,675\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 [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-01-30 16:51:28,847\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:29,076\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:29,304\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:29,532\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:29,815\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-30 16:51:30,087\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameintentsshapepolarizationscan_namespw_namefield_namesource_nameline_namefield_coordsstart_frequencyend_frequency
4ALMA_uid___A002_X1003af4_X75a3.split.avg_00[CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV...(3, 51, 1, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_0][Sun_10_0][]Ephemeris2.480000e+112.480000e+11
1ALMA_uid___A002_X1003af4_X75a3.split.avg_01[CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A...(3, 51, 1, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_0][Sun_10_0][]Ephemeris2.480000e+112.480000e+11
11ALMA_uid___A002_X1003af4_X75a3.split.avg_02[CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT](3, 51, 1, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_0][Sun_10_0][]Ephemeris2.480000e+112.480000e+11
12ALMA_uid___A002_X1003af4_X75a3.split.avg_03[CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S...(31, 51, 1, 2)[XX, YY][6]X767114449#ALMA_RB_06#BB_4#SQLD_0[J1408-0752_2][J1408-0752_2][][icrs, 14h08m56.48s, -7d52m26.67s]2.480000e+112.480000e+11
13ALMA_uid___A002_X1003af4_X75a3.split.avg_04[OBSERVE_TARGET#OFF_SOURCE](14, 51, 1, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_0][Sun_10_0][]Ephemeris2.480000e+112.480000e+11
10ALMA_uid___A002_X1003af4_X75a3.split.avg_05[OBSERVE_TARGET#ON_SOURCE](312, 51, 1, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_4#SQLD_0[Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S...[Sun_10_0][]Ephemeris2.480000e+112.480000e+11
2ALMA_uid___A002_X1003af4_X75a3.split.avg_06[CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV...(2, 51, 4, 1)[XX][7]WVR#NOMINAL_1[Sun_10_0][Sun_10_0][]Ephemeris1.845500e+111.905500e+11
3ALMA_uid___A002_X1003af4_X75a3.split.avg_07[CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A...(2, 51, 4, 1)[XX][7]WVR#NOMINAL_1[Sun_10_0][Sun_10_0][]Ephemeris1.845500e+111.905500e+11
0ALMA_uid___A002_X1003af4_X75a3.split.avg_08[CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT](2, 51, 4, 1)[XX][7]WVR#NOMINAL_1[Sun_10_0][Sun_10_0][]Ephemeris1.845500e+111.905500e+11
5ALMA_uid___A002_X1003af4_X75a3.split.avg_09[CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S...(26, 51, 4, 1)[XX][6]WVR#NOMINAL_1[J1408-0752_2][J1408-0752_2][][icrs, 14h08m56.48s, -7d52m26.67s]1.845500e+111.905500e+11
15ALMA_uid___A002_X1003af4_X75a3.split.avg_10[OBSERVE_TARGET#OFF_SOURCE](11, 51, 4, 1)[XX][8]WVR#NOMINAL_1[Sun_10_0][Sun_10_0][]Ephemeris1.845500e+111.905500e+11
16ALMA_uid___A002_X1003af4_X75a3.split.avg_11[OBSERVE_TARGET#ON_SOURCE](234, 51, 4, 1)[XX][8]WVR#NOMINAL_1[Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S...[Sun_10_0][]Ephemeris1.845500e+111.905500e+11
9ALMA_uid___A002_X1003af4_X75a3.split.avg_12[CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV...(2, 1326, 7, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_0][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
6ALMA_uid___A002_X1003af4_X75a3.split.avg_13[CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A...(2, 1326, 7, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_0][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
7ALMA_uid___A002_X1003af4_X75a3.split.avg_14[CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT](2, 1326, 7, 2)[XX, YY][7]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_0][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
8ALMA_uid___A002_X1003af4_X75a3.split.avg_15[CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S...(30, 1326, 7, 2)[XX, YY][6]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[J1408-0752_2][J1408-0752_2][Single_Continuum(ID=0)][icrs, 14h08m56.48s, -7d52m26.67s]2.299609e+112.300547e+11
17ALMA_uid___A002_X1003af4_X75a3.split.avg_16[OBSERVE_TARGET#OFF_SOURCE](12, 1326, 7, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_0][Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
14ALMA_uid___A002_X1003af4_X75a3.split.avg_17[OBSERVE_TARGET#ON_SOURCE](234, 1326, 7, 2)[XX, YY][8]X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2[Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S...[Sun_10_0][Single_Continuum(ID=0)]Ephemeris2.299609e+112.300547e+11
\n", + "
" + ], + "text/plain": [ + " name \\\n", + "4 ALMA_uid___A002_X1003af4_X75a3.split.avg_00 \n", + "1 ALMA_uid___A002_X1003af4_X75a3.split.avg_01 \n", + "11 ALMA_uid___A002_X1003af4_X75a3.split.avg_02 \n", + "12 ALMA_uid___A002_X1003af4_X75a3.split.avg_03 \n", + "13 ALMA_uid___A002_X1003af4_X75a3.split.avg_04 \n", + "10 ALMA_uid___A002_X1003af4_X75a3.split.avg_05 \n", + "2 ALMA_uid___A002_X1003af4_X75a3.split.avg_06 \n", + "3 ALMA_uid___A002_X1003af4_X75a3.split.avg_07 \n", + "0 ALMA_uid___A002_X1003af4_X75a3.split.avg_08 \n", + "5 ALMA_uid___A002_X1003af4_X75a3.split.avg_09 \n", + "15 ALMA_uid___A002_X1003af4_X75a3.split.avg_10 \n", + "16 ALMA_uid___A002_X1003af4_X75a3.split.avg_11 \n", + "9 ALMA_uid___A002_X1003af4_X75a3.split.avg_12 \n", + "6 ALMA_uid___A002_X1003af4_X75a3.split.avg_13 \n", + "7 ALMA_uid___A002_X1003af4_X75a3.split.avg_14 \n", + "8 ALMA_uid___A002_X1003af4_X75a3.split.avg_15 \n", + "17 ALMA_uid___A002_X1003af4_X75a3.split.avg_16 \n", + "14 ALMA_uid___A002_X1003af4_X75a3.split.avg_17 \n", + "\n", + " intents shape \\\n", + "4 [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... (3, 51, 1, 2) \n", + "1 [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... (3, 51, 1, 2) \n", + "11 [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] (3, 51, 1, 2) \n", + "12 [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... (31, 51, 1, 2) \n", + "13 [OBSERVE_TARGET#OFF_SOURCE] (14, 51, 1, 2) \n", + "10 [OBSERVE_TARGET#ON_SOURCE] (312, 51, 1, 2) \n", + "2 [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... (2, 51, 4, 1) \n", + "3 [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... (2, 51, 4, 1) \n", + "0 [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] (2, 51, 4, 1) \n", + "5 [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... (26, 51, 4, 1) \n", + "15 [OBSERVE_TARGET#OFF_SOURCE] (11, 51, 4, 1) \n", + "16 [OBSERVE_TARGET#ON_SOURCE] (234, 51, 4, 1) \n", + "9 [CALIBRATE_ATMOSPHERE#OFF_SOURCE, CALIBRATE_WV... (2, 1326, 7, 2) \n", + "6 [CALIBRATE_ATMOSPHERE#AMBIENT, CALIBRATE_WVR#A... (2, 1326, 7, 2) \n", + "7 [CALIBRATE_ATMOSPHERE#HOT, CALIBRATE_WVR#HOT] (2, 1326, 7, 2) \n", + "8 [CALIBRATE_PHASE#ON_SOURCE, CALIBRATE_WVR#ON_S... (30, 1326, 7, 2) \n", + "17 [OBSERVE_TARGET#OFF_SOURCE] (12, 1326, 7, 2) \n", + "14 [OBSERVE_TARGET#ON_SOURCE] (234, 1326, 7, 2) \n", + "\n", + " polarization scan_name spw_name \\\n", + "4 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n", + "1 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n", + "11 [XX, YY] [7] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n", + "12 [XX, YY] [6] X767114449#ALMA_RB_06#BB_4#SQLD_0 \n", + "13 [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", + "2 [XX] [7] WVR#NOMINAL_1 \n", + "3 [XX] [7] WVR#NOMINAL_1 \n", + "0 [XX] [7] WVR#NOMINAL_1 \n", + "5 [XX] [6] WVR#NOMINAL_1 \n", + "15 [XX] [8] WVR#NOMINAL_1 \n", + "16 [XX] [8] WVR#NOMINAL_1 \n", + "9 [XX, YY] [7] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n", + "6 [XX, YY] [7] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n", + "7 [XX, YY] [7] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n", + "8 [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", + "14 [XX, YY] [8] X767114449#ALMA_RB_06#BB_1#SW-01#FULL_RES_2 \n", + "\n", + " field_name source_name \\\n", + "4 [Sun_10_0] [Sun_10_0] \n", + "1 [Sun_10_0] [Sun_10_0] \n", + "11 [Sun_10_0] [Sun_10_0] \n", + "12 [J1408-0752_2] [J1408-0752_2] \n", + "13 [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", + "2 [Sun_10_0] [Sun_10_0] \n", + "3 [Sun_10_0] [Sun_10_0] \n", + "0 [Sun_10_0] [Sun_10_0] \n", + "5 [J1408-0752_2] [J1408-0752_2] \n", + "15 [Sun_10_0] [Sun_10_0] \n", + "16 [Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S... [Sun_10_0] \n", + "9 [Sun_10_0] [Sun_10_0] \n", + "6 [Sun_10_0] [Sun_10_0] \n", + "7 [Sun_10_0] [Sun_10_0] \n", + "8 [J1408-0752_2] [J1408-0752_2] \n", + "17 [Sun_10_0] [Sun_10_0] \n", + "14 [Sun_10_10, Sun_10_11, Sun_10_12, Sun_10_13, S... [Sun_10_0] \n", + "\n", + " line_name field_coords \\\n", + "4 [] Ephemeris \n", + "1 [] Ephemeris \n", + "11 [] Ephemeris \n", + "12 [] [icrs, 14h08m56.48s, -7d52m26.67s] \n", + "13 [] Ephemeris \n", + "10 [] Ephemeris \n", + "2 [] Ephemeris \n", + "3 [] Ephemeris \n", + "0 [] Ephemeris \n", + "5 [] [icrs, 14h08m56.48s, -7d52m26.67s] \n", + "15 [] Ephemeris \n", + "16 [] Ephemeris \n", + "9 [Single_Continuum(ID=0)] Ephemeris \n", + "6 [Single_Continuum(ID=0)] Ephemeris \n", + "7 [Single_Continuum(ID=0)] Ephemeris \n", + "8 [Single_Continuum(ID=0)] [icrs, 14h08m56.48s, -7d52m26.67s] \n", + "17 [Single_Continuum(ID=0)] Ephemeris \n", + "14 [Single_Continuum(ID=0)] Ephemeris \n", + "\n", + " start_frequency end_frequency \n", + "4 2.480000e+11 2.480000e+11 \n", + "1 2.480000e+11 2.480000e+11 \n", + "11 2.480000e+11 2.480000e+11 \n", + "12 2.480000e+11 2.480000e+11 \n", + "13 2.480000e+11 2.480000e+11 \n", + "10 2.480000e+11 2.480000e+11 \n", + "2 1.845500e+11 1.905500e+11 \n", + "3 1.845500e+11 1.905500e+11 \n", + "0 1.845500e+11 1.905500e+11 \n", + "5 1.845500e+11 1.905500e+11 \n", + "15 1.845500e+11 1.905500e+11 \n", + "16 1.845500e+11 1.905500e+11 \n", + "9 2.299609e+11 2.300547e+11 \n", + "6 2.299609e+11 2.300547e+11 \n", + "7 2.299609e+11 2.300547e+11 \n", + "8 2.299609e+11 2.300547e+11 \n", + "17 2.299609e+11 2.300547e+11 \n", + "14 2.299609e+11 2.300547e+11 " + ] + }, + "execution_count": 6, + "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": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset> Size: 1kB\n",
+       "Dimensions:                       (time: 3, sky_pos_label: 3,\n",
+       "                                   time_ephemeris: 2, ellipsoid_pos_label: 3)\n",
+       "Coordinates:\n",
+       "  * ellipsoid_pos_label           (ellipsoid_pos_label) <U4 48B 'lon' ... 'dist'\n",
+       "    field_id                      (time) int64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
+       "    field_name                    (time) <U28 336B dask.array<chunksize=(3,), meta=np.ndarray>\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",
+       "    is_ephemeris:  True\n",
+       "    type:          field_and_source
" + ], + "text/plain": [ + " Size: 1kB\n", + "Dimensions: (time: 3, sky_pos_label: 3,\n", + " time_ephemeris: 2, ellipsoid_pos_label: 3)\n", + "Coordinates:\n", + " * ellipsoid_pos_label (ellipsoid_pos_label) \n", + " field_name (time) \n", + " * sky_pos_label (sky_pos_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", + " is_ephemeris: True\n", + " type: field_and_source" + ] + }, + "execution_count": 7, + "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": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\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']
" + ], + "text/plain": [ + " Size: 24B\n", + "dask.array\n", + "Coordinates:\n", + " * ellipsoid_pos_label (ellipsoid_pos_label) 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 24ed26ea..f1a3c036 100644 --- a/src/xradio/measurement_set/_utils/_msv2/conversion.py +++ b/src/xradio/measurement_set/_utils/_msv2/conversion.py @@ -1211,31 +1211,38 @@ 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( + 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_interp_time, + 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_name": xds.coords["scan_name"].data, 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..bb412b0f 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,7 @@ import toolviper.utils.logger as logger from xradio.measurement_set._utils._msv2.msv4_sub_xdss import ( - rename_and_interpolate_to_time, + rename_and_interpolate_to_time, interpolate_to_time ) from xradio.measurement_set._utils._msv2.subtables import subt_rename_ids from xradio.measurement_set._utils._msv2._tables.read import ( @@ -41,7 +41,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 +57,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,12 +77,16 @@ 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 = ( + 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"]: field_and_source_xds = extract_ephemeris_info( field_and_source_xds, @@ -90,28 +94,26 @@ def create_field_and_source_xds( 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 +123,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. @@ -369,12 +373,16 @@ def extract_ephemeris_info( 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]) - + # Add the SOURCE_LOCATION to the FIELD_PHASE_CENTER or FIELD_REFERENCE_CENTER. Ephemeris obs: When loaded from the MSv2 field table the FIELD_REFERENCE_CENTER or FIELD_PHASE_CENTER only contain an offset from the SOURCE_LOCATION. # We also need to add a distance dimension to the FIELD_PHASE_CENTER or FIELD_REFERENCE_CENTER to match the SOURCE_LOCATION. # FIELD_PHASE_CENTER is used for interferometer data and FIELD_REFERENCE_CENTER is used for single dish data. @@ -382,36 +390,62 @@ def extract_ephemeris_info( center_dv = "FIELD_REFERENCE_CENTER" 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).' - - field_phase_center = wrap_to_pi( - xds[center_dv].values + xds["SOURCE_LOCATION"][:, 0:2].values + + + xds = xds.sel(field_name=field_names) #Expand for all times in ms + xds = xds.assign_coords({"time": ('field_name',interp_time)}) + xds = xds.swap_dims({"field_name": "time"}) + + + source_location_interp + field_phase_center = wrap_to_pi( + xds[center_dv].values + source_location_interp[:, 0:2].values ) - field_phase_center = np.column_stack( + + 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 + + field_phase_center[:, -1] = ( + field_phase_center[:, -1] + source_location_interp[:, -1].values ) + + - xds[center_dv] = xr.DataArray( + 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 + dims=["time", "sky_pos_label"], ) - 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"], - ) + # 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 +499,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,6 +595,8 @@ 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" @@ -577,7 +607,7 @@ def extract_source_info( 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 +615,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 +633,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,23 +661,24 @@ 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. if not is_ephemeris: @@ -686,6 +717,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 +725,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 +789,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,12 +841,14 @@ 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 @@ -852,57 +886,100 @@ def extract_field_info_and_check_ephemeris( 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 - ) - - 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 + to_new_coords = { + "NAME": ["field_name",["field_name"]], + "field_id": ["field_id",["field_name"]], + } - 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 + 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_and_source_xds.coords["time"].attrs.update(time_msv4_measure) - - return field_and_source_xds, ephemeris_path, ephemeris_table_name, source_id + + 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 + ) + + #Some field names are not unqiue. 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)))}) + + temp = field_and_source_xds.set_xindex("field_id") + field_names = temp.sel(field_id = field_id).field_name.data + + + + # 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/processing_set.py b/src/xradio/measurement_set/processing_set.py index d9bd9cdd..30b3faca 100644 --- a/src/xradio/measurement_set/processing_set.py +++ b/src/xradio/measurement_set/processing_set.py @@ -156,14 +156,15 @@ def _summary(self, data_group="base"): if value[data_name].attrs["field_and_source_xds"].is_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 + # ): + elif 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] diff --git a/src/xradio/measurement_set/schema.py b/src/xradio/measurement_set/schema.py index be0a4135..33dcec94 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). """ +FieldNameArray = Literal["field_name"] +""" Field names dimension. """ # Represents "no dimension", i.e. used for coordinates and data variables with # zero dimensions. @@ -959,12 +961,129 @@ class FreqSamplingArray: 'topo' (telescope centric) velocity frame, rather it assumes if no velocity frame is given that this is the default. """ + + +# Define FieldAndSourceXds dataset already here, as it is needed in the +# definition of VisibilityArray +@xarray_dataset_schema +class FieldSourceXds: + """ + Field positions for each source. + + Defines a field position on the sky. For interferometers, this is the correlated field position. + For single dishes, this is the nominal pointing direction. + """ + field_name: Coord[FieldNameArray, str] + """Field name.""" + + source_name: Optional[Coord[FieldNameArray, str]] + """ Source name. """ + + line_label: Optional[Coord[LineLabel, str]] + """ Line labels (for line names and variables). """ + + line_names: Optional[Coord[tuple[FieldNameArray, LineLabel],str]] + """ Line names (e.g. v=1, J=1-0, SiO). """ + + FIELD_PHASE_CENTER: Optional[ + Data[FieldNameArray, 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[FieldNameArray, 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, + ] + ] + """ + 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 + """ + + LINE_REST_FREQUENCY: Optional[ + Data[ + Union[ + tuple[LineLabel], + tuple[Time, LineLabel], + tuple[TimeEphemeris, LineLabel], + ], + SpectralCoordArray, + ] + ] + """ Rest frequencies for the transitions. """ + LINE_SYSTEMIC_VELOCITY: Optional[ + Data[ + Union[ + tuple[LineLabel], + tuple[Time, LineLabel], + tuple[TimeEphemeris, LineLabel], + ], + QuantityInMetersPerSecondArray, + ] + ] + """ Systemic velocity at reference """ + + 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""" + + is_ephemeris: Attr[bool] = False + + type: Attr[Literal["field_and_source"]] = "field_and_source" + """ + Type of dataset. + """ + + # --- Optional coordinates --- + sky_dir_label: Coord[SkyDirLabel, str] = ("ra", "dec") + """ Coordinate labels of sky directions (typically shape 2 and 'ra', 'dec') """ + + ellipsoid_pos_label: Optional[Coord[EllipsoidPosLabel, str]] = ( + "lon", + "lat", + "height", + ) + """ Coordinate labels of geodetic earth location data (typically shape 3 and 'lon', 'lat', 'height')""" + cartesian_pos_label: Optional[Coord[CartesianPosLabel, str]] = ("x", "y", "z") + """ Coordinate labels of geocentric earth location data (typically shape 3 and 'x', 'y', 'z')""" # Define FieldAndSourceXds dataset already here, as it is needed in the # definition of VisibilityArray @xarray_dataset_schema -class FieldSourceXds: +class FieldSourceEphemerisXds: """ Field positions for each source. From 0737f734dc75f44bbed25d8732d139853b5c5b7e Mon Sep 17 00:00:00 2001 From: Jan-Willem Date: Fri, 31 Jan 2025 14:58:09 -0500 Subject: [PATCH 09/16] Fix field_and_source related PS methods. --- dev/review_fs/review_fs.ipynb | 4250 +++++++++++++++-- .../_msv2/create_field_and_source_xds.py | 2 +- src/xradio/measurement_set/processing_set.py | 174 +- 3 files changed, 3808 insertions(+), 618 deletions(-) diff --git a/dev/review_fs/review_fs.ipynb b/dev/review_fs/review_fs.ipynb index 18a4c3ec..a161cbb0 100644 --- a/dev/review_fs/review_fs.ipynb +++ b/dev/review_fs/review_fs.ipynb @@ -9,8 +9,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[\u001b[38;2;128;05;128m2025-01-30 10:58:44,360\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-30 10:58:44,361\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", + "[\u001b[38;2;128;05;128m2025-01-31 14:52:09,185\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-31 14:52:09,186\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", " " ] }, @@ -39,9 +39,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[\u001b[38;2;128;05;128m2025-01-30 10:58:45,339\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: ALMA_uid___A002_X1003af4_X75a3.split.avg.ms \n", - "[\u001b[38;2;128;05;128m2025-01-30 10:58:45,340\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-30 10:58:45,340\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", + "[\u001b[38;2;128;05;128m2025-01-31 14:52:10,214\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: ALMA_uid___A002_X1003af4_X75a3.split.avg.ms \n", + "[\u001b[38;2;128;05;128m2025-01-31 14:52:10,214\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-31 14:52:10,214\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", " " ] }, @@ -70,9 +70,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[\u001b[38;2;128;05;128m2025-01-30 10:58:46,096\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: VLBA_TL016B_split.ms \n", - "[\u001b[38;2;128;05;128m2025-01-30 10:58:46,097\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-30 10:58:46,098\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", + "[\u001b[38;2;128;05;128m2025-01-31 14:52:10,740\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: VLBA_TL016B_split.ms \n", + "[\u001b[38;2;128;05;128m2025-01-31 14:52:10,742\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-31 14:52:10,742\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,9 +101,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[\u001b[38;2;128;05;128m2025-01-30 10:58:47,037\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: Antennae_North.cal.lsrk.split.ms \n", - "[\u001b[38;2;128;05;128m2025-01-30 10:58:47,038\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-30 10:58:47,038\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", + "[\u001b[38;2;128;05;128m2025-01-31 14:52:11,347\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: Antennae_North.cal.lsrk.split.ms \n", + "[\u001b[38;2;128;05;128m2025-01-31 14:52:11,348\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-31 14:52:11,348\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", " " ] }, @@ -132,7 +132,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "[\u001b[38;2;128;05;128m2025-01-30 10:58:47,726\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: SNR_G55_10s.split.ms \n" + "[\u001b[38;2;128;05;128m2025-01-31 14:52:11,947\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m File exists: SNR_G55_10s.split.ms \n" + ] + }, + { + "ename": "TypeError", + "evalue": "download() missing 1 required positional argument: 'file'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 6\u001b[0m\n\u001b[1;32m 4\u001b[0m download(file\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAntennae_North.cal.lsrk.split.ms\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 5\u001b[0m download(file\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSNR_G55_10s.split.ms\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 6\u001b[0m \u001b[43mdownload\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mTypeError\u001b[0m: download() missing 1 required positional argument: 'file'" ] } ], @@ -154,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -322,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -909,7 +920,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1036,7 +1047,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1623,7 +1634,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1871,7 +1882,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2688,7 +2699,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2852,7 +2863,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3670,7 +3681,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -4012,7 +4023,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -4656,7 +4667,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -4837,7 +4848,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -5484,7 +5495,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -5894,7 +5905,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -6998,41 +7009,41 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[\u001b[38;2;128;05;128m2025-01-30 16:51:26,900\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'] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:26,934\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 18 \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:26,934\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 [0], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,134\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 [16], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,283\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 [17], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,471\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 [19], FIELD [2], SCAN [6] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,607\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 [20 99], FIELD [0], SCAN [8] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:27,763\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 [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", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:37,166\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'] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:37,198\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m Number of partitions: 18 \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:37,199\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 [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:37,980\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 [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:38,149\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 [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:38,315\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 [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:38,487\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 [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:38,639\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 [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-01-30 16:51:27,956\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 [0], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,114\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 [16], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,261\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 [17], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,405\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 [19], FIELD [2], SCAN [6] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,525\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 [20 99], FIELD [0], SCAN [8] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:28,675\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 [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", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:38,838\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 [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:38,997\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 [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:39,173\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 [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:39,333\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 [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:39,459\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 [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:39,621\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 [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-01-30 16:51:28,847\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [0], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:29,076\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [16], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:29,304\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [17], FIELD [0], SCAN [7] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:29,532\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [19], FIELD [2], SCAN [6] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:29,815\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [20 99], FIELD [0], SCAN [8] \n", - "[\u001b[38;2;128;05;128m2025-01-30 16:51:30,087\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:39,814\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [0], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:40,060\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [16], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:40,287\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [17], FIELD [0], SCAN [7] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:40,509\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [19], FIELD [2], SCAN [6] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:40,770\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \u001b[0m OBSERVATION_ID [0], DDI [2], STATE [20 99], FIELD [0], SCAN [8] \n", + "[\u001b[38;2;128;05;128m2025-01-31 09:39:41,039\u001b[0m] \u001b[38;2;50;50;205m INFO\u001b[0m\u001b[38;2;112;128;144m viperlog: \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", @@ -7471,7 +7482,7 @@ "14 2.299609e+11 2.300547e+11 " ] }, - "execution_count": 6, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -7499,7 +7510,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -7875,30 +7886,19 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
<xarray.Dataset> Size: 1kB\n",
-       "Dimensions:                       (time: 3, sky_pos_label: 3,\n",
-       "                                   time_ephemeris: 2, ellipsoid_pos_label: 3)\n",
+       "
<xarray.Dataset> Size: 320B\n",
+       "Dimensions:             (field_name: 1, sky_dir_label: 2)\n",
        "Coordinates:\n",
-       "  * ellipsoid_pos_label           (ellipsoid_pos_label) <U4 48B 'lon' ... 'dist'\n",
-       "    field_id                      (time) int64 24B dask.array<chunksize=(3,), meta=np.ndarray>\n",
-       "    field_name                    (time) <U28 336B dask.array<chunksize=(3,), meta=np.ndarray>\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",
+       "    field_id            (field_name) int64 8B dask.array<chunksize=(1,), meta=np.ndarray>\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            (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",
+       "    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",
-       "    is_ephemeris:  True\n",
-       "    type:          field_and_source