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.
Files changed (65) hide show
  1. xradio/_utils/coord_math.py +100 -0
  2. xradio/_utils/list_and_array.py +49 -4
  3. xradio/_utils/schema.py +36 -16
  4. xradio/image/_util/_casacore/xds_from_casacore.py +5 -5
  5. xradio/image/_util/_casacore/xds_to_casacore.py +12 -11
  6. xradio/image/_util/_fits/xds_from_fits.py +18 -17
  7. xradio/image/_util/_zarr/zarr_low_level.py +29 -12
  8. xradio/image/_util/common.py +1 -1
  9. xradio/image/_util/image_factory.py +1 -1
  10. xradio/measurement_set/__init__.py +18 -0
  11. xradio/measurement_set/_utils/__init__.py +5 -0
  12. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/load_main_table.py +1 -1
  13. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read.py +15 -1
  14. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/conversion.py +186 -84
  15. xradio/measurement_set/_utils/_msv2/create_antenna_xds.py +535 -0
  16. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/create_field_and_source_xds.py +146 -58
  17. xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py +203 -0
  18. xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py +550 -0
  19. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/subtables.py +1 -1
  20. xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/xds_helper.py +1 -1
  21. xradio/{vis/_vis_utils/ms.py → measurement_set/_utils/msv2.py} +4 -4
  22. xradio/{vis/_vis_utils → measurement_set/_utils}/zarr.py +3 -3
  23. xradio/{vis → measurement_set}/convert_msv2_to_processing_set.py +9 -2
  24. xradio/{vis → measurement_set}/load_processing_set.py +16 -20
  25. xradio/measurement_set/measurement_set_xds.py +83 -0
  26. xradio/{vis/read_processing_set.py → measurement_set/open_processing_set.py} +25 -34
  27. xradio/measurement_set/processing_set.py +777 -0
  28. xradio/measurement_set/schema.py +1979 -0
  29. xradio/schema/check.py +42 -22
  30. xradio/schema/dataclass.py +56 -6
  31. xradio/sphinx/__init__.py +12 -0
  32. xradio/sphinx/schema_table.py +351 -0
  33. {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/METADATA +17 -15
  34. xradio-0.0.42.dist-info/RECORD +76 -0
  35. {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/WHEEL +1 -1
  36. xradio/_utils/common.py +0 -101
  37. xradio/vis/__init__.py +0 -14
  38. xradio/vis/_processing_set.py +0 -302
  39. xradio/vis/_vis_utils/__init__.py +0 -5
  40. xradio/vis/_vis_utils/_ms/create_antenna_xds.py +0 -482
  41. xradio/vis/_vis_utils/_ms/msv4_infos.py +0 -0
  42. xradio/vis/_vis_utils/_ms/msv4_sub_xdss.py +0 -306
  43. xradio/vis/schema.py +0 -1102
  44. xradio-0.0.40.dist-info/RECORD +0 -73
  45. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/load.py +0 -0
  46. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read_main_table.py +0 -0
  47. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read_subtables.py +0 -0
  48. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/table_query.py +0 -0
  49. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/write.py +0 -0
  50. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/write_exp_api.py +0 -0
  51. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/chunks.py +0 -0
  52. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/descr.py +0 -0
  53. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/msv2_msv3.py +0 -0
  54. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/msv2_to_msv4_meta.py +0 -0
  55. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/optimised_functions.py +0 -0
  56. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/partition_queries.py +0 -0
  57. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/partitions.py +0 -0
  58. /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/cds.py +0 -0
  59. /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/partition_attrs.py +0 -0
  60. /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/stokes_types.py +0 -0
  61. /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/encoding.py +0 -0
  62. /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/read.py +0 -0
  63. /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/write.py +0 -0
  64. {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/LICENSE.txt +0 -0
  65. {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 ._processing_set import processing_set
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
- ) -> processing_set:
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
- processing_set
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 = processing_set()
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
- ms_main_store = os.path.join(ms_store, "MAIN")
46
+ correlated_store = os.path.join(ms_store, "correlated_xds")
47
47
 
48
48
  xds = _open_dataset(
49
- ms_main_store,
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.vis.read_processing_set import _read_sub_xds
58
+ from xradio.measurement_set.open_processing_set import _open_sub_xds
59
59
 
60
- sub_xds_dict, field_and_source_xds_dict = _read_sub_xds(
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
- if "visibility" in data_group_vals:
70
- xds[data_group_vals["visibility"]].attrs["field_and_source_xds"] = (
71
- field_and_source_xds_dict[data_group_name]
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 processing_set_iterator:
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, processing_set, None] = None,
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 ._processing_set import processing_set
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 read_processing_set(
9
+ def open_processing_set(
10
10
  ps_store: str,
11
- obs_modes: list = None,
12
- ) -> processing_set:
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
- obs_modes : list, optional
20
- A list of obs_mode to be read for example ['OBSERVE_TARGET#ON_SOURCE']. The obs_mode in a processing set can be seen by calling processing_set.summary().
21
- By default None, which will read all obs_mode.
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 = processing_set()
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
- ms_main_store = os.path.join(ms_store, "MAIN")
37
+ correlated_store = os.path.join(ms_store, "correlated_xds")
36
38
 
37
- xds = _open_dataset(ms_main_store, file_system)
39
+ xds = _open_dataset(correlated_store, file_system)
38
40
  data_groups = xds.attrs["data_groups"]
39
41
 
40
- if (obs_modes is None) or (
41
- bool(set(xds.attrs["partition_info"]["obs_mode"]).intersection(obs_modes))
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 = _read_sub_xds(
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
- if "visibility" in data_group_vals:
54
- xds[data_group_vals["visibility"]].attrs["field_and_source_xds"] = (
55
- field_and_source_xds_dict[data_group_name]
56
- )
57
- elif "spectrum" in data_group_vals:
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 read {ms_name} due to {e}")
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 _read_sub_xds(ms_store, file_system, data_groups, load=False):
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("MAIN")
79
+ file_names.remove("correlated_xds")
89
80
 
90
- field_dict = {"FIELD_AND_SOURCE_" + key.upper(): key for key in data_groups.keys()}
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[xds_names[n]] = xds
94
+ sub_xds_dict[n] = xds
104
95
 
105
96
  return sub_xds_dict, field_and_source_xds_dict
106
97