xradio 0.0.40__py3-none-any.whl → 0.0.41__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 (47) hide show
  1. xradio/{vis → correlated_data}/__init__.py +3 -2
  2. xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/_tables/load_main_table.py +1 -1
  3. xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/_tables/read.py +14 -0
  4. xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/conversion.py +117 -58
  5. xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/create_antenna_xds.py +195 -167
  6. xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/create_field_and_source_xds.py +40 -39
  7. xradio/correlated_data/_utils/_ms/msv4_info_dicts.py +203 -0
  8. xradio/correlated_data/_utils/_ms/msv4_sub_xdss.py +516 -0
  9. xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/subtables.py +1 -1
  10. xradio/{vis/_vis_utils → correlated_data/_utils}/zarr.py +3 -3
  11. xradio/{vis → correlated_data}/convert_msv2_to_processing_set.py +9 -2
  12. xradio/correlated_data/correlated_xds.py +13 -0
  13. xradio/{vis → correlated_data}/load_processing_set.py +13 -17
  14. xradio/{vis/read_processing_set.py → correlated_data/open_processing_set.py} +20 -22
  15. xradio/{vis/_processing_set.py → correlated_data/processing_set.py} +11 -12
  16. xradio/{vis → correlated_data}/schema.py +572 -186
  17. xradio/correlated_data/test__processing_set.py +74 -0
  18. {xradio-0.0.40.dist-info → xradio-0.0.41.dist-info}/METADATA +9 -10
  19. xradio-0.0.41.dist-info/RECORD +75 -0
  20. {xradio-0.0.40.dist-info → xradio-0.0.41.dist-info}/WHEEL +1 -1
  21. xradio/vis/_vis_utils/_ms/msv4_infos.py +0 -0
  22. xradio/vis/_vis_utils/_ms/msv4_sub_xdss.py +0 -306
  23. xradio-0.0.40.dist-info/RECORD +0 -73
  24. /xradio/{vis/_vis_utils → correlated_data/_utils}/__init__.py +0 -0
  25. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/_tables/load.py +0 -0
  26. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/_tables/read_main_table.py +0 -0
  27. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/_tables/read_subtables.py +0 -0
  28. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/_tables/table_query.py +0 -0
  29. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/_tables/write.py +0 -0
  30. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/_tables/write_exp_api.py +0 -0
  31. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/chunks.py +0 -0
  32. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/descr.py +0 -0
  33. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/msv2_msv3.py +0 -0
  34. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/msv2_to_msv4_meta.py +0 -0
  35. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/optimised_functions.py +0 -0
  36. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/partition_queries.py +0 -0
  37. /xradio/{vis/_vis_utils → correlated_data/_utils}/_ms/partitions.py +0 -0
  38. /xradio/{vis/_vis_utils → correlated_data/_utils}/_utils/cds.py +0 -0
  39. /xradio/{vis/_vis_utils → correlated_data/_utils}/_utils/partition_attrs.py +0 -0
  40. /xradio/{vis/_vis_utils → correlated_data/_utils}/_utils/stokes_types.py +0 -0
  41. /xradio/{vis/_vis_utils → correlated_data/_utils}/_utils/xds_helper.py +0 -0
  42. /xradio/{vis/_vis_utils → correlated_data/_utils}/_zarr/encoding.py +0 -0
  43. /xradio/{vis/_vis_utils → correlated_data/_utils}/_zarr/read.py +0 -0
  44. /xradio/{vis/_vis_utils → correlated_data/_utils}/_zarr/write.py +0 -0
  45. /xradio/{vis/_vis_utils → correlated_data/_utils}/ms.py +0 -0
  46. {xradio-0.0.40.dist-info → xradio-0.0.41.dist-info}/LICENSE.txt +0 -0
  47. {xradio-0.0.40.dist-info → xradio-0.0.41.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,74 @@
1
+ import unittest
2
+ from xradio.src.xradio.correlated_data.processing_set import processing_set
3
+
4
+
5
+ class TestProcessingSet(unittest.TestCase):
6
+
7
+ def setUp(self):
8
+ # Create a sample processing set
9
+ self.ps = processing_set()
10
+ self.ps["ms1"] = {
11
+ "partition_info": {
12
+ "obs_mode": "OBSERVE_TARGET#ON_SOURCE",
13
+ "spectral_window_name": "spw1",
14
+ },
15
+ "polarization": ["RR", "LL"],
16
+ "visibility": "vis1",
17
+ "frequency": [1e9, 2e9],
18
+ }
19
+ self.ps["ms2"] = {
20
+ "partition_info": {
21
+ "obs_mode": "OBSERVE_TARGET#CALIBRATE_POLARIZATION",
22
+ "spectral_window_name": "spw2",
23
+ },
24
+ "polarization": ["RR"],
25
+ "spectrum": "spec1",
26
+ "frequency": [2e9, 3e9],
27
+ }
28
+ self.ps["ms3"] = {
29
+ "partition_info": {
30
+ "obs_mode": "OBSERVE_TARGET#ON_SOURCE",
31
+ "spectral_window_name": "spw1",
32
+ },
33
+ "polarization": ["LL"],
34
+ "visibility": "vis2",
35
+ "frequency": [3e9, 4e9],
36
+ }
37
+
38
+ def test_summary(self):
39
+ # Test the summary method
40
+ summary = self.ps.summary()
41
+ self.assertEqual(
42
+ len(summary), 3
43
+ ) # Check the number of rows in the summary table
44
+
45
+ def test_get_ps_max_dims(self):
46
+ # Test the get_ps_max_dims method
47
+ max_dims = self.ps.get_ps_max_dims()
48
+ self.assertEqual(max_dims, {"frequency": 2, "polarization": 2})
49
+
50
+ def test_get_ps_freq_axis(self):
51
+ # Test the get_ps_freq_axis method
52
+ freq_axis = self.ps.get_ps_freq_axis()
53
+ self.assertEqual(len(freq_axis), 4) # Check the length of the frequency axis
54
+
55
+ def test_sel(self):
56
+ # Test the sel method
57
+ subset = self.ps.sel(
58
+ obs_mode="OBSERVE_TARGET#ON_SOURCE", polarization=["RR", "LL"]
59
+ )
60
+ self.assertEqual(len(subset), 2) # Check the number of MSs in the subset
61
+
62
+ def test_ms_sel(self):
63
+ # Test the ms_sel method
64
+ subset = self.ps.ms_sel(obs_mode="OBSERVE_TARGET#ON_SOURCE", polarization="RR")
65
+ self.assertEqual(len(subset), 1) # Check the number of MSs in the subset
66
+
67
+ def test_ms_isel(self):
68
+ # Test the ms_isel method
69
+ subset = self.ps.ms_isel(obs_mode="OBSERVE_TARGET#ON_SOURCE", polarization="LL")
70
+ self.assertEqual(len(subset), 1) # Check the number of MSs in the subset
71
+
72
+
73
+ if __name__ == "__main__":
74
+ unittest.main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xradio
3
- Version: 0.0.40
3
+ Version: 0.0.41
4
4
  Summary: Xarray Radio Astronomy Data IO
5
5
  Author-email: Jan-Willem Steeb <jsteeb@nrao.edu>
6
6
  License: BSD 3-Clause License
@@ -43,18 +43,14 @@ License-File: LICENSE.txt
43
43
  Requires-Dist: astropy
44
44
  Requires-Dist: dask
45
45
  Requires-Dist: distributed
46
- Requires-Dist: graphviper
47
46
  Requires-Dist: toolviper
48
- Requires-Dist: matplotlib
49
47
  Requires-Dist: numba >=0.57.0
50
48
  Requires-Dist: numpy
51
- Requires-Dist: prettytable
52
49
  Requires-Dist: pytest
53
50
  Requires-Dist: pytest-cov
54
51
  Requires-Dist: pytest-html
55
52
  Requires-Dist: s3fs
56
53
  Requires-Dist: scipy
57
- Requires-Dist: tqdm
58
54
  Requires-Dist: xarray
59
55
  Requires-Dist: zarr
60
56
  Requires-Dist: pyarrow
@@ -62,11 +58,6 @@ Requires-Dist: typeguard
62
58
  Requires-Dist: typing-extensions ; python_version < "3.10"
63
59
  Requires-Dist: python-casacore >=3.6.1 ; sys_platform != "darwin"
64
60
  Provides-Extra: docs
65
- Requires-Dist: jupyterlab ; extra == 'docs'
66
- Requires-Dist: ipykernel ; extra == 'docs'
67
- Requires-Dist: ipympl ; extra == 'docs'
68
- Requires-Dist: ipython ; extra == 'docs'
69
- Requires-Dist: jupyter-client ; extra == 'docs'
70
61
  Requires-Dist: nbsphinx ; extra == 'docs'
71
62
  Requires-Dist: recommonmark ; extra == 'docs'
72
63
  Requires-Dist: scanpydoc ; extra == 'docs'
@@ -75,6 +66,14 @@ Requires-Dist: sphinx-autosummary-accessors ; extra == 'docs'
75
66
  Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
76
67
  Requires-Dist: twine ; extra == 'docs'
77
68
  Requires-Dist: pandoc ; extra == 'docs'
69
+ Provides-Extra: interactive
70
+ Requires-Dist: matplotlib ; extra == 'interactive'
71
+ Requires-Dist: prettytable ; extra == 'interactive'
72
+ Requires-Dist: jupyterlab ; extra == 'interactive'
73
+ Requires-Dist: ipykernel ; extra == 'interactive'
74
+ Requires-Dist: ipympl ; extra == 'interactive'
75
+ Requires-Dist: ipython ; extra == 'interactive'
76
+ Requires-Dist: jupyter-client ; extra == 'interactive'
78
77
 
79
78
  # xradio
80
79
  Xarray Radio Astronomy Data IO is still in development.
@@ -0,0 +1,75 @@
1
+ xradio/__init__.py,sha256=WHBhQWQie3YQqfIxQBL3LKiKuUcN7ZL7sPMEcdWOp5E,382
2
+ xradio/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ xradio/_utils/common.py,sha256=GY_fjet9wLhnx9XUINTq6ONBoceyLWRXHXlrNla3j3o,3726
4
+ xradio/_utils/list_and_array.py,sha256=_wznOiHra1pHrWNdtQPXhk-TAXJ8qb9fTGE0czQNpIo,2802
5
+ xradio/_utils/schema.py,sha256=tdGyvQTd-rQivtkzmH9-1f7KMIB9KeSf57EN2v7Mw_o,6855
6
+ xradio/_utils/_casacore/tables.py,sha256=aq6E_4RRAHdTBCwMKrVil1cWhFU2O980DNH9IlRKXLw,1280
7
+ xradio/_utils/zarr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ xradio/_utils/zarr/common.py,sha256=egj3Zma0BUK0msOBDozMa-62rHrcxrjCNE5XkkZUq70,5332
9
+ xradio/correlated_data/__init__.py,sha256=2oVnsJL4afv17FYpuHLH_bxspcJNWCWiT3wYCOn5jLk,423
10
+ xradio/correlated_data/convert_msv2_to_processing_set.py,sha256=Hae-NOHSyxydlMEssiH3DpkYSJorDHTslsp3Dl8Dq08,6422
11
+ xradio/correlated_data/correlated_xds.py,sha256=Q_qlQyAYC-9jhxvvR3wgGjPLy2tBctu2bvaD212BtVY,256
12
+ xradio/correlated_data/load_processing_set.py,sha256=Sn8WQ6kdpnzngsGaW9o2fd6xOqOn2wM7yIKj45SXobQ,5526
13
+ xradio/correlated_data/open_processing_set.py,sha256=BcW03m7ZoKcrdZsugczK6sbyu1YmPgoh2WZY5FYsrz8,4002
14
+ xradio/correlated_data/processing_set.py,sha256=DXh34lr_-15kwy_ZkL3Ee25ptqcEwpQ9gbfJwU14zPI,11951
15
+ xradio/correlated_data/schema.py,sha256=pJuWi0qwQoiJkGnb541f3Iq-YjiB6EsjDbbfW8Tc85c,59247
16
+ xradio/correlated_data/test__processing_set.py,sha256=zWyUfCGr_FwxUqYZInNi3bYAH-ctmE_xB9ORSRaT4fs,2527
17
+ xradio/correlated_data/_utils/__init__.py,sha256=Scu6rKJ2SpO8aG7F-xdTZcYfyWx0viV8gFh8E8ur_gI,93
18
+ xradio/correlated_data/_utils/ms.py,sha256=m7cYGZGbdCD3uSPe1BldgRurZ4Y-K3vJr6aePUVyGjE,4310
19
+ xradio/correlated_data/_utils/zarr.py,sha256=ehXlu0Xh_UZ5Xm2RnHCxESsRZ26c3DQAO5rqMK5MwTk,3947
20
+ xradio/correlated_data/_utils/_ms/chunks.py,sha256=JTPk3il6fk570BjWZMoOAtsbvnLmqPcBv9EPY6A2yOs,2964
21
+ xradio/correlated_data/_utils/_ms/conversion.py,sha256=Gz5_7vu0rUMrLxZJEMyCaCJ9UC9dKvVOemabVM67JCw,40940
22
+ xradio/correlated_data/_utils/_ms/create_antenna_xds.py,sha256=w5yjNV4Ow1mL0zev9avLn7jfRfcBP-wmkpS0rGBGE4Y,17686
23
+ xradio/correlated_data/_utils/_ms/create_field_and_source_xds.py,sha256=IPYbLx4580UGd2ibe2KtTThCCY4Ckz86reIL6s_8u4I,30881
24
+ xradio/correlated_data/_utils/_ms/descr.py,sha256=dYK8mhXxODIh-dfqaOm-YZb7kmoN1N2golX_RFncO94,5215
25
+ xradio/correlated_data/_utils/_ms/msv2_msv3.py,sha256=9AKs2HWly7Ivv_Cjr11dIPGmm33_rtSBoGF9wN5ZwEQ,116
26
+ xradio/correlated_data/_utils/_ms/msv2_to_msv4_meta.py,sha256=gk9gU7g2Lk7dmaiLW8qecOEt574pRtGsCHnUnHXM3D0,1614
27
+ xradio/correlated_data/_utils/_ms/msv4_info_dicts.py,sha256=kQpKNvgIki_ZIpC-lbKRqCKah7aLBoy5Q_NH1Q2vz3g,6895
28
+ xradio/correlated_data/_utils/_ms/msv4_sub_xdss.py,sha256=qZUq6edNe5F9rLPrIEMXAPYehkk60WnVIq42MTqVho0,18440
29
+ xradio/correlated_data/_utils/_ms/optimised_functions.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ xradio/correlated_data/_utils/_ms/partition_queries.py,sha256=hEe3VAzGqtEPg3X4GUhvHaxyesjS6WVy5et421qSdZg,14573
31
+ xradio/correlated_data/_utils/_ms/partitions.py,sha256=_KhRq8bSx2QxuWp9K57fLoLxcU6kvJ35e6wvJ-THbwc,12979
32
+ xradio/correlated_data/_utils/_ms/subtables.py,sha256=_mpOOtHexqhiqEKt7S4LVqImJoNMJKSY18vNVw83r_U,3945
33
+ xradio/correlated_data/_utils/_ms/_tables/load.py,sha256=IR3fdKlq8rgH4bHmB1JTtB5gSGuITIvErJEVjUA8rWM,1799
34
+ xradio/correlated_data/_utils/_ms/_tables/load_main_table.py,sha256=npy30aRt_qtd8vfgGWYQgHRj1YON-ZYjfQi7zzLtToM,14806
35
+ xradio/correlated_data/_utils/_ms/_tables/read.py,sha256=JLhn_8W2spLJy_3MjZ1mdMPKe7GPTq3VwuLeY-DiCjk,42937
36
+ xradio/correlated_data/_utils/_ms/_tables/read_main_table.py,sha256=8AbNt-AxrhPK3EPRa7xqJXffxzIgfVsv1BDfoVJEXLU,26056
37
+ xradio/correlated_data/_utils/_ms/_tables/read_subtables.py,sha256=JM6pGUQtjQR881u9VqakmbJjppEFq-EVKnEZ14JqnAw,12438
38
+ xradio/correlated_data/_utils/_ms/_tables/table_query.py,sha256=q8EGFf_zIwHcHnvFJOn8hPh8zFZQ3f7BGbXvL3bHad4,555
39
+ xradio/correlated_data/_utils/_ms/_tables/write.py,sha256=43XQ-tHhbhex0eUTRknNpPEEOnNR-w1lGCox9WZ9NHE,9540
40
+ xradio/correlated_data/_utils/_ms/_tables/write_exp_api.py,sha256=GDEll8nMwkQGc6vosu4UddFL5_ld7WurRgF9hYFTRmU,15511
41
+ xradio/correlated_data/_utils/_utils/cds.py,sha256=OpvKowSheIthUbcPEv2AoKmxlEt3DqJZS5C1AYh5z10,1179
42
+ xradio/correlated_data/_utils/_utils/partition_attrs.py,sha256=JaePHts_A0EbB4K-0a_uC98RZ2EmfjB9pDSEI11oAwk,3401
43
+ xradio/correlated_data/_utils/_utils/stokes_types.py,sha256=DMa8TmmS7BQ99Xm8c7ZjcRapMtLbrKVxrt4f0qUIOvg,561
44
+ xradio/correlated_data/_utils/_utils/xds_helper.py,sha256=jZWR55e574j9NJ4Yf5HdHD7J7QtKdXbXStbblQ66WdE,13218
45
+ xradio/correlated_data/_utils/_zarr/encoding.py,sha256=GENIlThV6a9CUCL6gIGlu9c6NR3OFWNos6mpxZjMwDc,536
46
+ xradio/correlated_data/_utils/_zarr/read.py,sha256=O9DiwD2Gn8WiatQ-Q6WGGSwjsXwFktG4f81lM-mgcSg,7596
47
+ xradio/correlated_data/_utils/_zarr/write.py,sha256=k5IfqtI44Dm4KBDiKFGhL5hN7kwNOulvVHmeP5Mi7N4,10043
48
+ xradio/image/__init__.py,sha256=HAD0GfopIbhdxOYckyW6S9US_dSWmZrwIl3FHUzZwrE,435
49
+ xradio/image/image.py,sha256=QoJ_BTLoMfeXJzU1yvtidBIhaMmjNA5_-6C3FWJRUeI,15635
50
+ xradio/image/_util/__init__.py,sha256=M9lxD1Gc7kv0ucDEDbjLRuIEuESev-IG8j9EaCKUAkA,77
51
+ xradio/image/_util/casacore.py,sha256=DmBTHUQ6870N5ARuFnYSfjZSLniJYgsjrsICUlCREYM,4234
52
+ xradio/image/_util/common.py,sha256=vQs7Du9FSkb_D64Syt3IkiWkb_GmG9xhDPdgbpgP9Ok,9031
53
+ xradio/image/_util/fits.py,sha256=gyGm06fuCKqVGK7uv-ObvQNfFawUDsIOa_nQyklM3Aw,329
54
+ xradio/image/_util/image_factory.py,sha256=6tPzs20FTm2wEshHc1xqtTV7D0TbKxGLUKAVtvOc68I,10506
55
+ xradio/image/_util/zarr.py,sha256=lhQqVRC1GEWClG3zRbuDr2IlQBfXeDqaLUJIN-MVMxA,1652
56
+ xradio/image/_util/_casacore/__init__.py,sha256=OlsiRE40o1jSbBI4khgQQzgfDYbAlOMKIhO4UFlbGhg,41
57
+ xradio/image/_util/_casacore/common.py,sha256=ky999eTCWta8w-uIs-7P7rPhZRLuh9yTuQXAxPvaPm4,1579
58
+ xradio/image/_util/_casacore/xds_from_casacore.py,sha256=4puiE2_1-7Y1-0yK7L8FYyDp5Ab8hEhDjLvoXiGMx9E,42561
59
+ xradio/image/_util/_casacore/xds_to_casacore.py,sha256=P6c-yoOjuVQkm07ApA7FFKfje4aPwV-MsRFKaRaPq9I,15338
60
+ xradio/image/_util/_fits/xds_from_fits.py,sha256=kpZ2gdbDQtoUD1DdQZymup5OVnB3e73D66LruLYESsw,28445
61
+ xradio/image/_util/_zarr/common.py,sha256=apMX_bF4Hr3pFGjnDFpp36KgmhTYAPBZquNkjBHrsXk,307
62
+ xradio/image/_util/_zarr/xds_from_zarr.py,sha256=4b6KHmAcnrhBbCi-Z7e3Lm6l6wziJL1zaNIohmPAYDk,3601
63
+ xradio/image/_util/_zarr/xds_to_zarr.py,sha256=wogXbwX8n3Sl9PHoc3_Y_LBowQsQ-94HZQFZ5NcxUZA,1624
64
+ xradio/image/_util/_zarr/zarr_low_level.py,sha256=_skL70DhtmVjmxRJsfZaospt3rndB9l-2QoHFF1kAKE,12786
65
+ xradio/schema/__init__.py,sha256=EzEMnOtN8G_wdjo8QBRKfq5MrYgfr_nt1pfunlI6i6Q,733
66
+ xradio/schema/bases.py,sha256=5BiE6gAq2xmaJEyiaGbpCSoNek83ly9f0R0Rv1rx9DM,17081
67
+ xradio/schema/check.py,sha256=Quugw5pC-c3c6C_JujSOQSfU_XVFIwymmg8wM0IZtXY,18521
68
+ xradio/schema/dataclass.py,sha256=Byegqga9tTkgFDMK6JXwLkDo78OX906v3CBElH592N4,12356
69
+ xradio/schema/metamodel.py,sha256=WjtW7pAVzcjLRWifRH3sQoOiN6TV810hARpOIz1M_gw,3845
70
+ xradio/schema/typing.py,sha256=8-o6fZd99kJ4FVdgBYRTIRJ-wDqpcUNXzCTfJvl3TIw,10439
71
+ xradio-0.0.41.dist-info/LICENSE.txt,sha256=9CYIJt7riOXo9AD0eXBZviLxo_HebD-2JJI8oiWtzfg,1807
72
+ xradio-0.0.41.dist-info/METADATA,sha256=vzs61B5tZwpiZDr-p1PQKm_EedSfE8JeA48D_3Kz43k,4510
73
+ xradio-0.0.41.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
74
+ xradio-0.0.41.dist-info/top_level.txt,sha256=dQu27fGBZJ2Yk-gW5XeD-dZ76Xa4Xcvk60Vz-dwXp7k,7
75
+ xradio-0.0.41.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.2)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes
@@ -1,306 +0,0 @@
1
- import toolviper.utils.logger as logger
2
- import time
3
- from typing import Tuple, Union
4
-
5
- import numpy as np
6
- import xarray as xr
7
-
8
- from xradio._utils.schema import (
9
- column_description_casacore_to_msv4_measure,
10
- convert_generic_xds_to_xradio_schema,
11
- )
12
- from .subtables import subt_rename_ids
13
- from ._tables.read import make_taql_where_between_min_max, load_generic_table
14
-
15
-
16
- def interpolate_to_time(
17
- xds: xr.Dataset,
18
- interp_time: Union[xr.DataArray, None],
19
- message_prefix: str,
20
- time_name: str = "time",
21
- ) -> xr.Dataset:
22
- """
23
- Interpolate the time coordinate of the input xarray dataset to the
24
- a data array. This can be used for example to interpolate a pointing_xds
25
- to the time coord of the (main) MSv4, or similarly the ephemeris
26
- data variables of a field_and_source_xds.
27
-
28
- Uses interpolation method "linear", unless the source number of points is
29
- 1 in which case "nearest" is used, to avoid divide-by-zero issues.
30
-
31
- Parameters:
32
- ----------
33
- xds : xr.Dataset
34
- Xarray dataset to interpolate (presumably a pointing_xds or an xds of
35
- ephemeris variables)
36
- interp_time : Union[xr.DataArray, None]
37
- Time axis to interpolate the dataset to (usually main MSv4 time)
38
- message_prefix: str
39
- A prefix for info/debug/etc. messages
40
-
41
- Returns:
42
- -------
43
- interpolated_xds : xr.Dataset
44
- xarray dataset with time axis interpolated to interp_time.
45
- """
46
- if interp_time is not None:
47
- points_before = xds[time_name].size
48
- if points_before > 1:
49
- method = "linear"
50
- else:
51
- method = "nearest"
52
- xds = xds.interp({time_name: interp_time}, method=method, assume_sorted=True)
53
- points_after = xds[time_name].size
54
- logger.debug(
55
- f"{message_prefix}: interpolating the time coordinate "
56
- f"from {points_before} to {points_after} points"
57
- )
58
-
59
- return xds
60
-
61
-
62
- def create_weather_xds(in_file: str):
63
- """
64
- Creates a Weather Xarray Dataset from a MS v2 WEATHER table.
65
-
66
- Parameters
67
- ----------
68
- in_file : str
69
- Input MS name.
70
-
71
- Returns
72
- -------
73
- xr.Dataset
74
- Weather Xarray Dataset.
75
- """
76
-
77
- dims_station_time = ["station_id", "time"]
78
- to_new_data_variables = {
79
- "H20": ["H2O", dims_station_time],
80
- "IONOS_ELECTRON": ["IONOS_ELECTRON", dims_station_time],
81
- "PRESSURE": ["PRESSURE", dims_station_time],
82
- "REL_HUMIDITY": ["REL_HUMIDITY", dims_station_time],
83
- "TEMPERATURE": ["TEMPERATURE", dims_station_time],
84
- "DEW_POINT": ["DEW_POINT", dims_station_time],
85
- "WIND_DIRECTION": ["WIND_DIRECTION", dims_station_time],
86
- "WIND_SPEED": ["WIND_SPEED", dims_station_time],
87
- }
88
-
89
- to_new_coords = {
90
- "ANTENNA_ID": ["station_id", ["station_id"]],
91
- "TIME": ["time", ["time"]],
92
- }
93
-
94
- # Read WEATHER table into a Xarray Dataset.
95
- try:
96
- generic_weather_xds = load_generic_table(
97
- in_file,
98
- "WEATHER",
99
- rename_ids=subt_rename_ids["WEATHER"],
100
- )
101
- except ValueError as _exc:
102
- return None
103
-
104
- weather_xds = xr.Dataset(attrs={"type": "weather"})
105
- weather_xds = convert_generic_xds_to_xradio_schema(
106
- generic_weather_xds, weather_xds, to_new_data_variables, to_new_coords
107
- )
108
-
109
- # correct expected types
110
- weather_xds["station_id"] = weather_xds["station_id"].astype(np.int64)
111
-
112
- return weather_xds
113
-
114
-
115
- def correct_generic_pointing_xds(
116
- generic_pointing_xds: xr.Dataset, to_new_data_variables: dict[str, list]
117
- ) -> xr.Dataset:
118
- """
119
- Takes a (generic) pointing_xds as read from a POINTING subtable of an MSv2
120
- and tries to correct several deviations from the MSv2 specs seen in
121
- common test data.
122
- The problems fixed here include wrong dimensions:
123
- - for example transposed dimensions with respect to the MSv2 specs (output
124
- from CASA simulator),
125
- - missing/additional unexpected dimensions when some of the columns are
126
- empty (in the sense of "empty casacore cells").
127
-
128
- This function modifies the data arrays of the data vars affected by such
129
- issues.
130
-
131
- Parameters
132
- ----------
133
- generic_pointing_xds: xr.Dataset
134
- The generic pointing dataset (loaded from MSv2) to be fixed
135
- to_new_data_variables: dict
136
- The dict used for convert_generic_xds_to_xradio_schema, which gives all
137
- the data variables relevant for the final MSv4 dataset.
138
-
139
- Returns:
140
- --------
141
- xr.Dataset
142
- Corrected dataset with dimensions conforming to MSv2 specs.
143
- """
144
-
145
- correct_pointing_xds = generic_pointing_xds.copy()
146
-
147
- for key in generic_pointing_xds:
148
- if key in to_new_data_variables:
149
- data_var_name = to_new_data_variables[key]
150
- # Corrects dim sizes of "empty cell" variables, such as empty DIRECTION, TARGET, etc.
151
- if (
152
- "dim_2" in generic_pointing_xds.sizes
153
- and generic_pointing_xds.sizes["dim_2"] == 0
154
- ):
155
- # When all direction variables are "empty"
156
- data_var_data = xr.DataArray(
157
- [[[[np.nan, np.nan]]]],
158
- dims=generic_pointing_xds.dims,
159
- ).isel(n_polynomial=0, drop=True)
160
- correct_pointing_xds[data_var_name].data = data_var_data
161
-
162
- elif (
163
- "dir" in generic_pointing_xds.sizes
164
- and generic_pointing_xds.sizes["dir"] == 0
165
- ):
166
- # When some direction variables are "empty" but some are populated properly
167
- if "dim_2" in generic_pointing_xds[key].sizes:
168
- data_var_data = xr.DataArray(
169
- generic_pointing_xds[key].values,
170
- dims=generic_pointing_xds[key].dims,
171
- )
172
- else:
173
- shape = tuple(
174
- generic_pointing_xds.sizes[dim]
175
- for dim in ["TIME", "ANTENNA_ID"]
176
- ) + (2,)
177
- data_var_data = xr.DataArray(
178
- np.full(shape, np.nan),
179
- dims=generic_pointing_xds[key].dims,
180
- )
181
- correct_pointing_xds[data_var_name].data = data_var_data
182
-
183
- return correct_pointing_xds
184
-
185
-
186
- def create_pointing_xds(
187
- in_file: str,
188
- ant_xds_name_ids: xr.DataArray,
189
- time_min_max: Union[Tuple[np.float64, np.float64], None],
190
- interp_time: Union[xr.DataArray, None] = None,
191
- ) -> xr.Dataset:
192
- """
193
- Creates a Pointing Xarray Dataset from an MS v2 POINTING (sub)table.
194
-
195
- WIP: details of a few direction variables (and possibly moving some to attributes) to be
196
- settled (see MSv4 spreadsheet).
197
-
198
- Parameters
199
- ----------
200
- in_file : str
201
- Input MS name.
202
- ant_xds_name_ids : xr.Dataset
203
- antenna_name data array from antenna_xds, with name/id information
204
- time_min_max : tuple
205
- min / max times values to constrain loading (from the TIME column)
206
- interp_time : Union[xr.DataArray, None] (Default value = None)
207
- interpolate time to this (presumably main dataset time)
208
-
209
- Returns
210
- -------
211
- xr.Dataset
212
- Pointing Xarray dataset
213
- """
214
- start = time.time()
215
-
216
- time_ant_dims = ["time", "antenna_name"]
217
- time_ant_dir_dims = time_ant_dims + ["sky_dir_label"]
218
- to_new_data_variables = {
219
- "DIRECTION": ["BEAM_POINTING", time_ant_dir_dims],
220
- "ENCODER": ["DISH_MEASURED_POINTING", time_ant_dir_dims],
221
- # => attribute?
222
- "TARGET": ["TARGET", time_ant_dir_dims],
223
- "POINTING_OFFSET": ["POINTING_OFFSET", time_ant_dir_dims],
224
- "SOURCE_OFFSET": ["SOURCE_OFFSET", time_ant_dir_dims],
225
- "OVER_THE_TOP": ["OVER_THE_TOP", time_ant_dims],
226
- }
227
-
228
- to_new_coords = {
229
- "TIME": ["time", ["time"]],
230
- # "ANTENNA_ID": ["antenna_name", ["antenna_name"]],
231
- "dim_2": ["sky_dir_label", ["sky_dir_label"]],
232
- }
233
-
234
- taql_time_range = make_taql_where_between_min_max(
235
- time_min_max, in_file, "POINTING", "TIME"
236
- )
237
-
238
- if taql_time_range is None:
239
- taql_where = f"WHERE (ANTENNA_ID IN [{','.join(map(str, ant_xds_name_ids.antenna_id.values))}])"
240
- else:
241
- taql_where = (
242
- taql_time_range
243
- + f" AND (ANTENNA_ID IN [{','.join(map(str, ant_xds_name_ids.antenna_id.values))}])"
244
- )
245
- # Read POINTING table into a Xarray Dataset.
246
- generic_pointing_xds = load_generic_table(
247
- in_file,
248
- "POINTING",
249
- rename_ids=subt_rename_ids["POINTING"],
250
- taql_where=taql_where,
251
- )
252
-
253
- if not generic_pointing_xds.data_vars:
254
- # apparently empty MS/POINTING table => produce empty xds
255
- return xr.Dataset()
256
-
257
- # Checking a simple way of using only the one single coefficient of the polynomials
258
- if "n_polynomial" in generic_pointing_xds.sizes:
259
- size = generic_pointing_xds.sizes["n_polynomial"]
260
- if size == 1:
261
- generic_pointing_xds = generic_pointing_xds.sel({"n_polynomial": 0})
262
-
263
- generic_pointing_xds = correct_generic_pointing_xds(
264
- generic_pointing_xds, to_new_data_variables
265
- )
266
-
267
- pointing_xds = xr.Dataset(attrs={"type": "pointing"})
268
- coords = {
269
- "antenna_name": ant_xds_name_ids.sel(
270
- antenna_id=generic_pointing_xds["ANTENNA_ID"]
271
- ).data,
272
- "sky_dir_label": ["ra", "dec"],
273
- }
274
- pointing_xds = pointing_xds.assign_coords(coords)
275
- pointing_xds = convert_generic_xds_to_xradio_schema(
276
- generic_pointing_xds, pointing_xds, to_new_data_variables, to_new_coords
277
- )
278
-
279
- # Add attributes specific to pointing_xds
280
- if "TRACKING" in generic_pointing_xds.data_vars:
281
- pointing_xds.attrs["tracking"] = generic_pointing_xds.data_vars[
282
- "TRACKING"
283
- ].values[0, 0]
284
-
285
- # Move target from data_vars to attributes?
286
- move_target_as_attr = False
287
- if move_target_as_attr:
288
- pointing_column_descriptions = generic_pointing_xds.attrs["other"]["msv2"][
289
- "ctds_attrs"
290
- ]["column_descriptions"]
291
-
292
- target = generic_pointing_xds.data_vars["TARGET"]
293
- pointing_xds.attrs["target"] = {
294
- "dims": ["sky_dir_label"],
295
- "data": target.values[0, 0].tolist(),
296
- "attrs": column_description_casacore_to_msv4_measure(
297
- pointing_column_descriptions["TARGET"]
298
- ),
299
- }
300
- # TODO: move also source_offset/pointing_offset from data_vars to attrs?
301
-
302
- pointing_xds = interpolate_to_time(pointing_xds, interp_time, "pointing_xds")
303
-
304
- logger.debug(f"create_pointing_xds() execution time {time.time() - start:0.2f} s")
305
-
306
- return pointing_xds
@@ -1,73 +0,0 @@
1
- xradio/__init__.py,sha256=WHBhQWQie3YQqfIxQBL3LKiKuUcN7ZL7sPMEcdWOp5E,382
2
- xradio/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- xradio/_utils/common.py,sha256=GY_fjet9wLhnx9XUINTq6ONBoceyLWRXHXlrNla3j3o,3726
4
- xradio/_utils/list_and_array.py,sha256=_wznOiHra1pHrWNdtQPXhk-TAXJ8qb9fTGE0czQNpIo,2802
5
- xradio/_utils/schema.py,sha256=tdGyvQTd-rQivtkzmH9-1f7KMIB9KeSf57EN2v7Mw_o,6855
6
- xradio/_utils/_casacore/tables.py,sha256=aq6E_4RRAHdTBCwMKrVil1cWhFU2O980DNH9IlRKXLw,1280
7
- xradio/_utils/zarr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- xradio/_utils/zarr/common.py,sha256=egj3Zma0BUK0msOBDozMa-62rHrcxrjCNE5XkkZUq70,5332
9
- xradio/image/__init__.py,sha256=HAD0GfopIbhdxOYckyW6S9US_dSWmZrwIl3FHUzZwrE,435
10
- xradio/image/image.py,sha256=QoJ_BTLoMfeXJzU1yvtidBIhaMmjNA5_-6C3FWJRUeI,15635
11
- xradio/image/_util/__init__.py,sha256=M9lxD1Gc7kv0ucDEDbjLRuIEuESev-IG8j9EaCKUAkA,77
12
- xradio/image/_util/casacore.py,sha256=DmBTHUQ6870N5ARuFnYSfjZSLniJYgsjrsICUlCREYM,4234
13
- xradio/image/_util/common.py,sha256=vQs7Du9FSkb_D64Syt3IkiWkb_GmG9xhDPdgbpgP9Ok,9031
14
- xradio/image/_util/fits.py,sha256=gyGm06fuCKqVGK7uv-ObvQNfFawUDsIOa_nQyklM3Aw,329
15
- xradio/image/_util/image_factory.py,sha256=6tPzs20FTm2wEshHc1xqtTV7D0TbKxGLUKAVtvOc68I,10506
16
- xradio/image/_util/zarr.py,sha256=lhQqVRC1GEWClG3zRbuDr2IlQBfXeDqaLUJIN-MVMxA,1652
17
- xradio/image/_util/_casacore/__init__.py,sha256=OlsiRE40o1jSbBI4khgQQzgfDYbAlOMKIhO4UFlbGhg,41
18
- xradio/image/_util/_casacore/common.py,sha256=ky999eTCWta8w-uIs-7P7rPhZRLuh9yTuQXAxPvaPm4,1579
19
- xradio/image/_util/_casacore/xds_from_casacore.py,sha256=4puiE2_1-7Y1-0yK7L8FYyDp5Ab8hEhDjLvoXiGMx9E,42561
20
- xradio/image/_util/_casacore/xds_to_casacore.py,sha256=P6c-yoOjuVQkm07ApA7FFKfje4aPwV-MsRFKaRaPq9I,15338
21
- xradio/image/_util/_fits/xds_from_fits.py,sha256=kpZ2gdbDQtoUD1DdQZymup5OVnB3e73D66LruLYESsw,28445
22
- xradio/image/_util/_zarr/common.py,sha256=apMX_bF4Hr3pFGjnDFpp36KgmhTYAPBZquNkjBHrsXk,307
23
- xradio/image/_util/_zarr/xds_from_zarr.py,sha256=4b6KHmAcnrhBbCi-Z7e3Lm6l6wziJL1zaNIohmPAYDk,3601
24
- xradio/image/_util/_zarr/xds_to_zarr.py,sha256=wogXbwX8n3Sl9PHoc3_Y_LBowQsQ-94HZQFZ5NcxUZA,1624
25
- xradio/image/_util/_zarr/zarr_low_level.py,sha256=_skL70DhtmVjmxRJsfZaospt3rndB9l-2QoHFF1kAKE,12786
26
- xradio/schema/__init__.py,sha256=EzEMnOtN8G_wdjo8QBRKfq5MrYgfr_nt1pfunlI6i6Q,733
27
- xradio/schema/bases.py,sha256=5BiE6gAq2xmaJEyiaGbpCSoNek83ly9f0R0Rv1rx9DM,17081
28
- xradio/schema/check.py,sha256=Quugw5pC-c3c6C_JujSOQSfU_XVFIwymmg8wM0IZtXY,18521
29
- xradio/schema/dataclass.py,sha256=Byegqga9tTkgFDMK6JXwLkDo78OX906v3CBElH592N4,12356
30
- xradio/schema/metamodel.py,sha256=WjtW7pAVzcjLRWifRH3sQoOiN6TV810hARpOIz1M_gw,3845
31
- xradio/schema/typing.py,sha256=8-o6fZd99kJ4FVdgBYRTIRJ-wDqpcUNXzCTfJvl3TIw,10439
32
- xradio/vis/__init__.py,sha256=oOaHEnHp799cu72Zwo4WUQdrgFE2JCy-O0XVhaz3C2w,381
33
- xradio/vis/_processing_set.py,sha256=rvPAU5ksfODDDaJQBzBlZaHQDSDseV6UqCxN2Qa5gxs,12097
34
- xradio/vis/convert_msv2_to_processing_set.py,sha256=x5P9P8BZiK243iFi5kjn3i4gMgaGbozSN1sh1bgyYNI,5906
35
- xradio/vis/load_processing_set.py,sha256=sQmKG04grVn9jqOrhGc8K6B2-tk65NR0GBW8I8W62cI,5755
36
- xradio/vis/read_processing_set.py,sha256=8h1UDXFZqwObs6J6p5ef0FSA9ILW3A6I_6HMbQrbRFc,4170
37
- xradio/vis/schema.py,sha256=pQelyv3f6uIW12UKT_sB8KETyXpMX8klPeUOpq4dyd8,44858
38
- xradio/vis/_vis_utils/__init__.py,sha256=Scu6rKJ2SpO8aG7F-xdTZcYfyWx0viV8gFh8E8ur_gI,93
39
- xradio/vis/_vis_utils/ms.py,sha256=m7cYGZGbdCD3uSPe1BldgRurZ4Y-K3vJr6aePUVyGjE,4310
40
- xradio/vis/_vis_utils/zarr.py,sha256=d7T7P2rLzHTvoH7jh4FsiqkFq-PHsxRHUhM4mxbZI9M,3947
41
- xradio/vis/_vis_utils/_ms/chunks.py,sha256=JTPk3il6fk570BjWZMoOAtsbvnLmqPcBv9EPY6A2yOs,2964
42
- xradio/vis/_vis_utils/_ms/conversion.py,sha256=KTpv5CaPYVsqu3WQI-j4yZiNL3NWn6sev905tAyzq8I,38889
43
- xradio/vis/_vis_utils/_ms/create_antenna_xds.py,sha256=WMX1Av328Et0o56pTcva5tYSOFlu-mBxhJJHp33rb3k,17181
44
- xradio/vis/_vis_utils/_ms/create_field_and_source_xds.py,sha256=d_WlX_xA33rpHS8Dhqct8HmczZfteA2W7CHC1EPuZEw,30897
45
- xradio/vis/_vis_utils/_ms/descr.py,sha256=dYK8mhXxODIh-dfqaOm-YZb7kmoN1N2golX_RFncO94,5215
46
- xradio/vis/_vis_utils/_ms/msv2_msv3.py,sha256=9AKs2HWly7Ivv_Cjr11dIPGmm33_rtSBoGF9wN5ZwEQ,116
47
- xradio/vis/_vis_utils/_ms/msv2_to_msv4_meta.py,sha256=gk9gU7g2Lk7dmaiLW8qecOEt574pRtGsCHnUnHXM3D0,1614
48
- xradio/vis/_vis_utils/_ms/msv4_infos.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- xradio/vis/_vis_utils/_ms/msv4_sub_xdss.py,sha256=DaLIqC05AZbkdc-XiahesYwfRFyLXNlWW4DoBv72d5I,10649
50
- xradio/vis/_vis_utils/_ms/optimised_functions.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
- xradio/vis/_vis_utils/_ms/partition_queries.py,sha256=hEe3VAzGqtEPg3X4GUhvHaxyesjS6WVy5et421qSdZg,14573
52
- xradio/vis/_vis_utils/_ms/partitions.py,sha256=_KhRq8bSx2QxuWp9K57fLoLxcU6kvJ35e6wvJ-THbwc,12979
53
- xradio/vis/_vis_utils/_ms/subtables.py,sha256=6--dh6betXhlxGejzcJJd8bYdiNkl5ppzLoyorofZ6c,3943
54
- xradio/vis/_vis_utils/_ms/_tables/load.py,sha256=IR3fdKlq8rgH4bHmB1JTtB5gSGuITIvErJEVjUA8rWM,1799
55
- xradio/vis/_vis_utils/_ms/_tables/load_main_table.py,sha256=_Ov4cs5t06RqfmrAHZoYwpb8K27b7iqjIkCMsJ0TR6o,14798
56
- xradio/vis/_vis_utils/_ms/_tables/read.py,sha256=ZrDHvUoyiAJu6P_2LIpedZgrDuWBwMi99RdMHrj6wyY,42555
57
- xradio/vis/_vis_utils/_ms/_tables/read_main_table.py,sha256=8AbNt-AxrhPK3EPRa7xqJXffxzIgfVsv1BDfoVJEXLU,26056
58
- xradio/vis/_vis_utils/_ms/_tables/read_subtables.py,sha256=JM6pGUQtjQR881u9VqakmbJjppEFq-EVKnEZ14JqnAw,12438
59
- xradio/vis/_vis_utils/_ms/_tables/table_query.py,sha256=q8EGFf_zIwHcHnvFJOn8hPh8zFZQ3f7BGbXvL3bHad4,555
60
- xradio/vis/_vis_utils/_ms/_tables/write.py,sha256=43XQ-tHhbhex0eUTRknNpPEEOnNR-w1lGCox9WZ9NHE,9540
61
- xradio/vis/_vis_utils/_ms/_tables/write_exp_api.py,sha256=GDEll8nMwkQGc6vosu4UddFL5_ld7WurRgF9hYFTRmU,15511
62
- xradio/vis/_vis_utils/_utils/cds.py,sha256=OpvKowSheIthUbcPEv2AoKmxlEt3DqJZS5C1AYh5z10,1179
63
- xradio/vis/_vis_utils/_utils/partition_attrs.py,sha256=JaePHts_A0EbB4K-0a_uC98RZ2EmfjB9pDSEI11oAwk,3401
64
- xradio/vis/_vis_utils/_utils/stokes_types.py,sha256=DMa8TmmS7BQ99Xm8c7ZjcRapMtLbrKVxrt4f0qUIOvg,561
65
- xradio/vis/_vis_utils/_utils/xds_helper.py,sha256=jZWR55e574j9NJ4Yf5HdHD7J7QtKdXbXStbblQ66WdE,13218
66
- xradio/vis/_vis_utils/_zarr/encoding.py,sha256=GENIlThV6a9CUCL6gIGlu9c6NR3OFWNos6mpxZjMwDc,536
67
- xradio/vis/_vis_utils/_zarr/read.py,sha256=O9DiwD2Gn8WiatQ-Q6WGGSwjsXwFktG4f81lM-mgcSg,7596
68
- xradio/vis/_vis_utils/_zarr/write.py,sha256=k5IfqtI44Dm4KBDiKFGhL5hN7kwNOulvVHmeP5Mi7N4,10043
69
- xradio-0.0.40.dist-info/LICENSE.txt,sha256=9CYIJt7riOXo9AD0eXBZviLxo_HebD-2JJI8oiWtzfg,1807
70
- xradio-0.0.40.dist-info/METADATA,sha256=JSY0V_0Zij1K06oFq-4U_z8rRIZCDFsbBadezmVS-jM,4443
71
- xradio-0.0.40.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
72
- xradio-0.0.40.dist-info/top_level.txt,sha256=dQu27fGBZJ2Yk-gW5XeD-dZ76Xa4Xcvk60Vz-dwXp7k,7
73
- xradio-0.0.40.dist-info/RECORD,,
File without changes