xradio 0.0.40__py3-none-any.whl → 0.0.42__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- xradio/_utils/coord_math.py +100 -0
- xradio/_utils/list_and_array.py +49 -4
- xradio/_utils/schema.py +36 -16
- xradio/image/_util/_casacore/xds_from_casacore.py +5 -5
- xradio/image/_util/_casacore/xds_to_casacore.py +12 -11
- xradio/image/_util/_fits/xds_from_fits.py +18 -17
- xradio/image/_util/_zarr/zarr_low_level.py +29 -12
- xradio/image/_util/common.py +1 -1
- xradio/image/_util/image_factory.py +1 -1
- xradio/measurement_set/__init__.py +18 -0
- xradio/measurement_set/_utils/__init__.py +5 -0
- xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/load_main_table.py +1 -1
- xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read.py +15 -1
- xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/conversion.py +186 -84
- xradio/measurement_set/_utils/_msv2/create_antenna_xds.py +535 -0
- xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/create_field_and_source_xds.py +146 -58
- xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py +203 -0
- xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py +550 -0
- xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/subtables.py +1 -1
- xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/xds_helper.py +1 -1
- xradio/{vis/_vis_utils/ms.py → measurement_set/_utils/msv2.py} +4 -4
- xradio/{vis/_vis_utils → measurement_set/_utils}/zarr.py +3 -3
- xradio/{vis → measurement_set}/convert_msv2_to_processing_set.py +9 -2
- xradio/{vis → measurement_set}/load_processing_set.py +16 -20
- xradio/measurement_set/measurement_set_xds.py +83 -0
- xradio/{vis/read_processing_set.py → measurement_set/open_processing_set.py} +25 -34
- xradio/measurement_set/processing_set.py +777 -0
- xradio/measurement_set/schema.py +1979 -0
- xradio/schema/check.py +42 -22
- xradio/schema/dataclass.py +56 -6
- xradio/sphinx/__init__.py +12 -0
- xradio/sphinx/schema_table.py +351 -0
- {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/METADATA +17 -15
- xradio-0.0.42.dist-info/RECORD +76 -0
- {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/WHEEL +1 -1
- xradio/_utils/common.py +0 -101
- xradio/vis/__init__.py +0 -14
- xradio/vis/_processing_set.py +0 -302
- xradio/vis/_vis_utils/__init__.py +0 -5
- xradio/vis/_vis_utils/_ms/create_antenna_xds.py +0 -482
- xradio/vis/_vis_utils/_ms/msv4_infos.py +0 -0
- xradio/vis/_vis_utils/_ms/msv4_sub_xdss.py +0 -306
- xradio/vis/schema.py +0 -1102
- xradio-0.0.40.dist-info/RECORD +0 -73
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/load.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read_main_table.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read_subtables.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/table_query.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/write.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/write_exp_api.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/chunks.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/descr.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/msv2_msv3.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/msv2_to_msv4_meta.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/optimised_functions.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/partition_queries.py +0 -0
- /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/partitions.py +0 -0
- /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/cds.py +0 -0
- /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/partition_attrs.py +0 -0
- /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/stokes_types.py +0 -0
- /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/encoding.py +0 -0
- /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/read.py +0 -0
- /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/write.py +0 -0
- {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/LICENSE.txt +0 -0
- {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from .
|
|
2
|
+
from xradio.measurement_set import ProcessingSet
|
|
3
3
|
from typing import Dict, Union
|
|
4
4
|
|
|
5
5
|
|
|
@@ -8,7 +8,7 @@ def load_processing_set(
|
|
|
8
8
|
sel_parms: dict,
|
|
9
9
|
data_variables: Union[list, None] = None,
|
|
10
10
|
load_sub_datasets: bool = True,
|
|
11
|
-
) ->
|
|
11
|
+
) -> ProcessingSet:
|
|
12
12
|
"""Loads a processing set into memory.
|
|
13
13
|
|
|
14
14
|
Parameters
|
|
@@ -29,24 +29,24 @@ def load_processing_set(
|
|
|
29
29
|
data_variables : Union[list, None], optional
|
|
30
30
|
The list of data variables to load into memory for example ['VISIBILITY', 'WEIGHT, 'FLAGS']. By default None which will load all data variables into memory.
|
|
31
31
|
load_sub_datasets : bool, optional
|
|
32
|
-
If true sub-datasets (for example weather_xds, antenna_xds, pointing_xds, ...) will be loaded into memory, by default True.
|
|
32
|
+
If true sub-datasets (for example weather_xds, antenna_xds, pointing_xds, system_calibration_xds ...) will be loaded into memory, by default True.
|
|
33
33
|
|
|
34
34
|
Returns
|
|
35
35
|
-------
|
|
36
|
-
|
|
36
|
+
ProcessingSet
|
|
37
37
|
In memory representation of processing set (data is represented by Dask.arrays).
|
|
38
38
|
"""
|
|
39
39
|
from xradio._utils.zarr.common import _open_dataset, _get_file_system_and_items
|
|
40
40
|
|
|
41
41
|
file_system, ms_store_list = _get_file_system_and_items(ps_store)
|
|
42
42
|
|
|
43
|
-
ps =
|
|
43
|
+
ps = ProcessingSet()
|
|
44
44
|
for ms_name, ms_xds_isel in sel_parms.items():
|
|
45
45
|
ms_store = os.path.join(ps_store, ms_name)
|
|
46
|
-
|
|
46
|
+
correlated_store = os.path.join(ms_store, "correlated_xds")
|
|
47
47
|
|
|
48
48
|
xds = _open_dataset(
|
|
49
|
-
|
|
49
|
+
correlated_store,
|
|
50
50
|
file_system,
|
|
51
51
|
ms_xds_isel,
|
|
52
52
|
data_variables,
|
|
@@ -55,9 +55,9 @@ def load_processing_set(
|
|
|
55
55
|
data_groups = xds.attrs["data_groups"]
|
|
56
56
|
|
|
57
57
|
if load_sub_datasets:
|
|
58
|
-
from xradio.
|
|
58
|
+
from xradio.measurement_set.open_processing_set import _open_sub_xds
|
|
59
59
|
|
|
60
|
-
sub_xds_dict, field_and_source_xds_dict =
|
|
60
|
+
sub_xds_dict, field_and_source_xds_dict = _open_sub_xds(
|
|
61
61
|
ms_store, file_system=file_system, load=True, data_groups=data_groups
|
|
62
62
|
)
|
|
63
63
|
|
|
@@ -66,26 +66,22 @@ def load_processing_set(
|
|
|
66
66
|
**sub_xds_dict,
|
|
67
67
|
}
|
|
68
68
|
for data_group_name, data_group_vals in data_groups.items():
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
elif "spectrum" in data_group_vals:
|
|
74
|
-
xds[data_group_vals["spectrum"]].attrs["field_and_source_xds"] = (
|
|
75
|
-
field_and_source_xds_dict[data_group_name]
|
|
76
|
-
)
|
|
69
|
+
|
|
70
|
+
xds[data_group_vals["correlated_data"]].attrs[
|
|
71
|
+
"field_and_source_xds"
|
|
72
|
+
] = field_and_source_xds_dict[data_group_name]
|
|
77
73
|
|
|
78
74
|
ps[ms_name] = xds
|
|
79
75
|
|
|
80
76
|
return ps
|
|
81
77
|
|
|
82
78
|
|
|
83
|
-
class
|
|
79
|
+
class ProcessingSetIterator:
|
|
84
80
|
def __init__(
|
|
85
81
|
self,
|
|
86
82
|
sel_parms: dict,
|
|
87
83
|
input_data_store: str,
|
|
88
|
-
input_data: Union[Dict,
|
|
84
|
+
input_data: Union[Dict, ProcessingSet, None] = None,
|
|
89
85
|
data_variables: list = None,
|
|
90
86
|
load_sub_datasets: bool = True,
|
|
91
87
|
):
|
|
@@ -110,7 +106,7 @@ class processing_set_iterator:
|
|
|
110
106
|
data_variables : list, optional
|
|
111
107
|
The list of data variables to load into memory for example ['VISIBILITY', 'WEIGHT, 'FLAGS']. By default None which will load all data variables into memory.
|
|
112
108
|
load_sub_datasets : bool, optional
|
|
113
|
-
If true sub-datasets (for example weather_xds, antenna_xds, pointing_xds, ...) will be loaded into memory, by default True.
|
|
109
|
+
If true sub-datasets (for example weather_xds, antenna_xds, pointing_xds, system_calibration_xds ...) will be loaded into memory, by default True.
|
|
114
110
|
"""
|
|
115
111
|
|
|
116
112
|
self.input_data = input_data
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
from xradio._utils.list_and_array import to_list
|
|
3
|
+
import xarray as xr
|
|
4
|
+
import numbers
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class MeasurementSetXds(xr.Dataset):
|
|
9
|
+
__slots__ = ()
|
|
10
|
+
|
|
11
|
+
def __init__(self, xds):
|
|
12
|
+
super().__init__(xds.data_vars, xds.coords, xds.attrs)
|
|
13
|
+
|
|
14
|
+
def to_store(self, store, **kwargs):
|
|
15
|
+
"""
|
|
16
|
+
Write the MeasurementSetXds to a Zarr store.
|
|
17
|
+
Does not write to cloud storage yet.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
store (str): The path to the Zarr store.
|
|
21
|
+
**kwargs: Additional keyword arguments to be passed to `xarray.Dataset.to_zarr`. See https://docs.xarray.dev/en/latest/generated/xarray.Dataset.to_zarr.html for more information.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
None
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
copy_cor_xds = self.copy() # No deep copy
|
|
28
|
+
|
|
29
|
+
# Remove field_and_source_xds from all correlated_data (VISIBILITY/SPECTRUM) data variables
|
|
30
|
+
# and save them as separate zarr files.
|
|
31
|
+
for data_group_name, data_group in self.attrs["data_groups"].items():
|
|
32
|
+
del copy_cor_xds[data_group["correlated_data"]].attrs[
|
|
33
|
+
"field_and_source_xds"
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
# print("data_group_name", data_group_name)
|
|
37
|
+
xr.Dataset.to_zarr(
|
|
38
|
+
self[data_group["correlated_data"]].attrs["field_and_source_xds"],
|
|
39
|
+
os.path.join(store, "field_and_source_xds_" + data_group_name),
|
|
40
|
+
**kwargs,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Remove xds attributes from copy_cor_xds and save xds attributes as separate zarr files.
|
|
44
|
+
for attrs_name in self.attrs:
|
|
45
|
+
if "xds" in attrs_name:
|
|
46
|
+
del copy_cor_xds.attrs[attrs_name]
|
|
47
|
+
xr.Dataset.to_zarr(
|
|
48
|
+
self.attrs[attrs_name], os.path.join(store, attrs_name, **kwargs)
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# Save copy_cor_xds as zarr file.
|
|
52
|
+
xr.Dataset.to_zarr(
|
|
53
|
+
copy_cor_xds, os.path.join(store, "correlated_xds"), **kwargs
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
def sel(self, data_group_name=None, **kwargs):
|
|
57
|
+
"""
|
|
58
|
+
Select data along dimension(s) by label.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
**kwargs: Keyword arguments to be passed to `xarray.Dataset.sel`. See https://xarray.pydata.org/en/stable/generated/xarray.Dataset.sel.html for more information.
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
MeasurementSetXds
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
if data_group_name is not None:
|
|
68
|
+
sel_data_group_set = set(
|
|
69
|
+
self.attrs["data_groups"][data_group_name].values()
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
data_variables_to_drop = []
|
|
73
|
+
for dg in self.attrs["data_groups"].values():
|
|
74
|
+
temp_set = set(dg.values()) - sel_data_group_set
|
|
75
|
+
data_variables_to_drop.extend(list(temp_set))
|
|
76
|
+
|
|
77
|
+
data_variables_to_drop = list(set(data_variables_to_drop))
|
|
78
|
+
|
|
79
|
+
return MeasurementSetXds(
|
|
80
|
+
super().sel(**kwargs).drop_vars(data_variables_to_drop)
|
|
81
|
+
)
|
|
82
|
+
else:
|
|
83
|
+
return MeasurementSetXds(super().sel(**kwargs))
|
|
@@ -1,46 +1,48 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
|
-
from .
|
|
3
|
+
from xradio.measurement_set import ProcessingSet
|
|
4
4
|
import toolviper.utils.logger as logger
|
|
5
5
|
from xradio._utils.zarr.common import _open_dataset, _get_file_system_and_items
|
|
6
6
|
import s3fs
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def
|
|
9
|
+
def open_processing_set(
|
|
10
10
|
ps_store: str,
|
|
11
|
-
|
|
12
|
-
) ->
|
|
11
|
+
intents: list = None,
|
|
12
|
+
) -> ProcessingSet:
|
|
13
13
|
"""Creates a lazy representation of a Processing Set (only meta-data is loaded into memory).
|
|
14
14
|
|
|
15
15
|
Parameters
|
|
16
16
|
----------
|
|
17
17
|
ps_store : str
|
|
18
18
|
String of the path and name of the processing set. For example '/users/user_1/uid___A002_Xf07bba_Xbe5c_target.lsrk.vis.zarr'.
|
|
19
|
-
|
|
20
|
-
A list of
|
|
21
|
-
By default None, which will
|
|
19
|
+
intents : list, optional
|
|
20
|
+
A list of intents to be open for example ['OBSERVE_TARGET#ON_SOURCE']. The intents in a processing set can be seen by calling processing_set.summary().
|
|
21
|
+
By default None, which will open all intents.
|
|
22
22
|
|
|
23
23
|
Returns
|
|
24
24
|
-------
|
|
25
25
|
processing_set
|
|
26
26
|
Lazy representation of processing set (data is represented by Dask.arrays).
|
|
27
27
|
"""
|
|
28
|
+
from xradio.measurement_set import MeasurementSetXds
|
|
29
|
+
|
|
28
30
|
file_system, ms_store_list = _get_file_system_and_items(ps_store)
|
|
29
31
|
|
|
30
|
-
ps =
|
|
32
|
+
ps = ProcessingSet()
|
|
31
33
|
data_group = "base"
|
|
32
34
|
for ms_name in ms_store_list:
|
|
33
35
|
# try:
|
|
34
36
|
ms_store = os.path.join(ps_store, ms_name)
|
|
35
|
-
|
|
37
|
+
correlated_store = os.path.join(ms_store, "correlated_xds")
|
|
36
38
|
|
|
37
|
-
xds = _open_dataset(
|
|
39
|
+
xds = _open_dataset(correlated_store, file_system)
|
|
38
40
|
data_groups = xds.attrs["data_groups"]
|
|
39
41
|
|
|
40
|
-
if (
|
|
41
|
-
bool(set(xds.attrs["partition_info"]["
|
|
42
|
+
if (intents is None) or (
|
|
43
|
+
bool(set(xds.attrs["partition_info"]["intents"]).intersection(intents))
|
|
42
44
|
):
|
|
43
|
-
sub_xds_dict, field_and_source_xds_dict =
|
|
45
|
+
sub_xds_dict, field_and_source_xds_dict = _open_sub_xds(
|
|
44
46
|
ms_store, file_system=file_system, data_groups=data_groups
|
|
45
47
|
)
|
|
46
48
|
|
|
@@ -50,33 +52,22 @@ def read_processing_set(
|
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
for data_group_name, data_group_vals in data_groups.items():
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
xds[data_group_vals["spectrum"]].attrs["field_and_source_xds"] = (
|
|
59
|
-
field_and_source_xds_dict[data_group_name]
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
ps[ms_name] = xds
|
|
55
|
+
xds[data_group_vals["correlated_data"]].attrs[
|
|
56
|
+
"field_and_source_xds"
|
|
57
|
+
] = field_and_source_xds_dict[data_group_name]
|
|
58
|
+
|
|
59
|
+
ps[ms_name] = MeasurementSetXds(xds)
|
|
63
60
|
# except Exception as e:
|
|
64
|
-
# logger.warning(f"Could not
|
|
61
|
+
# logger.warning(f"Could not open {ms_name} due to {e}")
|
|
65
62
|
# continue
|
|
66
63
|
|
|
67
64
|
return ps
|
|
68
65
|
|
|
69
66
|
|
|
70
|
-
def
|
|
67
|
+
def _open_sub_xds(ms_store, file_system, data_groups, load=False):
|
|
71
68
|
sub_xds_dict = {}
|
|
72
69
|
field_and_source_xds_dict = {}
|
|
73
70
|
|
|
74
|
-
xds_names = {
|
|
75
|
-
"ANTENNA": "antenna_xds",
|
|
76
|
-
"WEATHER": "weather_xds",
|
|
77
|
-
"POINTING": "pointing_xds",
|
|
78
|
-
}
|
|
79
|
-
|
|
80
71
|
if isinstance(file_system, s3fs.core.S3FileSystem):
|
|
81
72
|
file_names = [
|
|
82
73
|
bd.split(sep="/")[-1] for bd in file_system.listdir(ms_store, detail=False)
|
|
@@ -85,9 +76,9 @@ def _read_sub_xds(ms_store, file_system, data_groups, load=False):
|
|
|
85
76
|
file_names = file_system.listdir(ms_store)
|
|
86
77
|
file_names = [item for item in file_names if not item.startswith(".")]
|
|
87
78
|
|
|
88
|
-
file_names.remove("
|
|
79
|
+
file_names.remove("correlated_xds")
|
|
89
80
|
|
|
90
|
-
field_dict = {"
|
|
81
|
+
field_dict = {"field_and_source_xds_" + key: key for key in data_groups.keys()}
|
|
91
82
|
|
|
92
83
|
# field_and_source_xds_name_start = "FIELD"
|
|
93
84
|
for n in file_names:
|
|
@@ -100,7 +91,7 @@ def _read_sub_xds(ms_store, file_system, data_groups, load=False):
|
|
|
100
91
|
if n in field_dict.keys():
|
|
101
92
|
field_and_source_xds_dict[field_dict[n]] = xds
|
|
102
93
|
else:
|
|
103
|
-
sub_xds_dict[
|
|
94
|
+
sub_xds_dict[n] = xds
|
|
104
95
|
|
|
105
96
|
return sub_xds_dict, field_and_source_xds_dict
|
|
106
97
|
|