xradio 0.0.50__py3-none-any.whl → 0.0.52__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.
@@ -569,6 +569,17 @@ class ProcessingSetXdt:
569
569
  ValueError
570
570
  If the combined datasets are empty or improperly formatted.
571
571
  """
572
+
573
+ def setup_annotations_all(axis, scatter, field_names):
574
+ """
575
+ Creates annotations for when label_all_fields=True
576
+ """
577
+ coord_x, coord_y = np.array(scatter.get_offsets()).transpose()
578
+ offset_x = np.abs(np.max(coord_x) - np.min(coord_x)) * 0.01
579
+ offset_y = np.abs(np.max(coord_y) - np.min(coord_y)) * 0.01
580
+ for idx, (x, y) in enumerate(zip(coord_x + offset_x, coord_y + offset_y)):
581
+ axis.annotate(field_names[idx], (x, y), alpha=1)
582
+
572
583
  if self._xdt.attrs.get("type") not in PS_DATASET_TYPES:
573
584
  raise InvalidAccessorLocation(
574
585
  f"{self._xdt.path} is not a processing set node."
@@ -585,9 +596,9 @@ class ProcessingSetXdt:
585
596
  if (len(combined_field_and_source_xds.data_vars) > 0) and (
586
597
  "FIELD_PHASE_CENTER" in combined_field_and_source_xds
587
598
  ):
588
- plt.figure()
599
+ fig = plt.figure()
589
600
  plt.title("Field Phase Center Locations")
590
- plt.scatter(
601
+ scatter = plt.scatter(
591
602
  combined_field_and_source_xds["FIELD_PHASE_CENTER"].sel(
592
603
  sky_dir_label="ra"
593
604
  ),
@@ -595,31 +606,40 @@ class ProcessingSetXdt:
595
606
  sky_dir_label="dec"
596
607
  ),
597
608
  )
598
-
599
609
  center_field_name = combined_field_and_source_xds.attrs["center_field_name"]
600
610
  center_field = combined_field_and_source_xds.sel(
601
611
  field_name=center_field_name
602
612
  )
613
+
614
+ if label_all_fields:
615
+ field_name = combined_field_and_source_xds.field_name.values
616
+ setup_annotations_all(fig.axes[0], scatter, field_name)
617
+ fig.axes[0].margins(0.2, 0.2)
618
+ center_label = None
619
+ else:
620
+ center_label = center_field_name
621
+
603
622
  plt.scatter(
604
623
  center_field["FIELD_PHASE_CENTER"].sel(sky_dir_label="ra"),
605
624
  center_field["FIELD_PHASE_CENTER"].sel(sky_dir_label="dec"),
606
625
  color="red",
607
- label=center_field_name,
626
+ label=center_label,
608
627
  )
609
628
  plt.xlabel("RA (rad)")
610
629
  plt.ylabel("DEC (rad)")
611
- plt.legend()
630
+ if not label_all_fields:
631
+ plt.legend()
612
632
  plt.show()
613
633
 
614
634
  if (len(combined_ephemeris_field_and_source_xds.data_vars) > 0) and (
615
635
  "FIELD_PHASE_CENTER" in combined_ephemeris_field_and_source_xds
616
636
  ):
617
637
 
618
- plt.figure()
638
+ fig = plt.figure()
619
639
  plt.title(
620
640
  "Offset of Field Phase Center from Source Location (Ephemeris Data)"
621
641
  )
622
- plt.scatter(
642
+ scatter = plt.scatter(
623
643
  combined_ephemeris_field_and_source_xds["FIELD_OFFSET"].sel(
624
644
  sky_dir_label="ra"
625
645
  ),
@@ -639,15 +659,26 @@ class ProcessingSetXdt:
639
659
  center_field = combined_ephemeris_field_and_source_xds.sel(
640
660
  field_name=center_field_name
641
661
  )
662
+
663
+ if label_all_fields:
664
+ field_name = combined_ephemeris_field_and_source_xds.field_name.values
665
+ setup_annotations_all(fig.axes[0], scatter, field_name)
666
+ fig.axes[0].margins(0.2, 0.2)
667
+ center_label = None
668
+ else:
669
+ center_label = center_field_name
670
+
642
671
  plt.scatter(
643
672
  center_field["FIELD_OFFSET"].sel(sky_dir_label="ra"),
644
673
  center_field["FIELD_OFFSET"].sel(sky_dir_label="dec"),
645
674
  color="red",
646
- label=center_field_name,
675
+ label=center_label,
647
676
  )
677
+
648
678
  plt.xlabel("RA Offset (rad)")
649
679
  plt.ylabel("DEC Offset (rad)")
650
- plt.legend()
680
+ if not label_all_fields:
681
+ plt.legend()
651
682
  plt.show()
652
683
 
653
684
  def get_combined_antenna_xds(self) -> xr.Dataset:
@@ -693,18 +724,23 @@ class ProcessingSetXdt:
693
724
 
694
725
  return combined_antenna_xds
695
726
 
696
- def plot_antenna_positions(self):
727
+ def plot_antenna_positions(self, label_all_antennas: bool = False):
697
728
  """
698
729
  Plot the antenna positions of all antennas in the Processing Set.
699
730
 
700
- This method generates three scatter plots displaying the antenna positions in different planes:
731
+ This method generates and displays a figure with three scatter plots, displaying the antenna
732
+ positions in different planes:
733
+
701
734
  - X vs Y
702
735
  - X vs Z
703
736
  - Y vs Z
704
737
 
738
+ The antenna names are shown on hovering their positions, unless label_all_antennas is enabled.
739
+
705
740
  Parameters
706
741
  ----------
707
- None
742
+ label_all_antennas : bool, optional
743
+ If 'True', annotations are shown with the names of every antenna next to their positions.
708
744
 
709
745
  Returns
710
746
  -------
@@ -715,6 +751,75 @@ class ProcessingSetXdt:
715
751
  ValueError
716
752
  If the combined antenna dataset is empty or missing required coordinates.
717
753
  """
754
+
755
+ def antenna_hover(event):
756
+ if event.inaxes in antenna_axes:
757
+ for axis in antenna_axes:
758
+ contained, indices = scatter_map[axis].contains(event)
759
+ annotation = annotations_map[axis]
760
+ if contained:
761
+ scatter = scatter_map[axis]
762
+ update_antenna_annotation(indices, scatter, annotation)
763
+ annotation.set_visible(True)
764
+ fig.canvas.draw_idle()
765
+ else:
766
+ visible = annotation.get_visible()
767
+ if visible:
768
+ annotation.set_visible(False)
769
+ fig.canvas.draw_idle()
770
+
771
+ def update_antenna_annotation(indices, scatter, annotation):
772
+ position = scatter.get_offsets()[indices["ind"][0]]
773
+ annotation.xy = position
774
+ text = "{}".format(" ".join([antenna_names[num] for num in indices["ind"]]))
775
+ annotation.set_text(text)
776
+ annotation.get_bbox_patch().set_facecolor("#e8d192")
777
+ annotation.get_bbox_patch().set_alpha(1)
778
+
779
+ def setup_annotations_for_hover(antenna_axes, scatter_plots):
780
+ """
781
+ Creates annotations on all the axes requested.
782
+
783
+ Returns
784
+ -------
785
+ dict
786
+ dict from antenna axes -> annotation objects
787
+ """
788
+ antenna_annotations = []
789
+ for axis in antenna_axes:
790
+ annotation = axis.annotate(
791
+ "",
792
+ xy=(0, 0),
793
+ xytext=(10, 15),
794
+ textcoords="offset points",
795
+ arrowprops=dict(arrowstyle="-|>"),
796
+ bbox=dict(boxstyle="round", fc="w"),
797
+ )
798
+ antenna_annotations.append(annotation)
799
+ annotation.set_visible(False)
800
+ annotations_map = dict(zip(antenna_axes, antenna_annotations))
801
+
802
+ return annotations_map
803
+
804
+ def setup_annotations_for_all(antenna_axes, scatter_map):
805
+ """
806
+ Creates annotations for when label_all_antennas=True
807
+ """
808
+ antenna_annotations = []
809
+ for axis in antenna_axes:
810
+ scatter = scatter_map[axis]
811
+ coord_x, coord_y = np.array(scatter.get_offsets()).transpose()
812
+ offset_x = np.abs(np.max(coord_x) - np.min(coord_x)) * 0.01
813
+ offset_y = np.abs(np.max(coord_y) - np.min(coord_y)) * 0.01
814
+ for idx, (x, y) in enumerate(
815
+ zip(coord_x + offset_x, coord_y + offset_y)
816
+ ):
817
+ annotation = axis.annotate(
818
+ antenna_names[idx],
819
+ (x, y),
820
+ alpha=1,
821
+ )
822
+
718
823
  if self._xdt.attrs.get("type") not in PS_DATASET_TYPES:
719
824
  raise InvalidAccessorLocation(
720
825
  f"{self._xdt.path} is not a processing set node."
@@ -723,34 +828,44 @@ class ProcessingSetXdt:
723
828
  combined_antenna_xds = self.get_combined_antenna_xds()
724
829
  from matplotlib import pyplot as plt
725
830
 
726
- plt.figure()
727
- plt.title("Antenna Positions")
728
- plt.scatter(
831
+ fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(12, 8))
832
+ fig.suptitle("Antenna Positions")
833
+ fig.subplots_adjust(
834
+ wspace=0.25, hspace=0.25, left=0.1, right=0.95, top=0.9, bottom=0.1
835
+ )
836
+
837
+ scatter1 = ax1.scatter(
729
838
  combined_antenna_xds["ANTENNA_POSITION"].sel(cartesian_pos_label="x"),
730
839
  combined_antenna_xds["ANTENNA_POSITION"].sel(cartesian_pos_label="y"),
731
840
  )
732
- plt.xlabel("x (m)")
733
- plt.ylabel("y (m)")
734
- plt.show()
841
+ ax1.set_xlabel("x (m)")
842
+ ax1.set_ylabel("y (m)")
843
+ antenna_names = combined_antenna_xds.antenna_name.values
735
844
 
736
- plt.figure()
737
- plt.title("Antenna Positions")
738
- plt.scatter(
739
- combined_antenna_xds["ANTENNA_POSITION"].sel(cartesian_pos_label="x"),
845
+ scatter2 = ax2.scatter(
846
+ combined_antenna_xds["ANTENNA_POSITION"].sel(cartesian_pos_label="y"),
740
847
  combined_antenna_xds["ANTENNA_POSITION"].sel(cartesian_pos_label="z"),
741
848
  )
742
- plt.xlabel("x (m)")
743
- plt.ylabel("z (m)")
744
- plt.show()
849
+ ax2.set_xlabel("y (m)")
850
+ ax2.set_ylabel("z (m)")
745
851
 
746
- plt.figure()
747
- plt.title("Antenna Positions")
748
- plt.scatter(
749
- combined_antenna_xds["ANTENNA_POSITION"].sel(cartesian_pos_label="y"),
852
+ scatter3 = ax3.scatter(
853
+ combined_antenna_xds["ANTENNA_POSITION"].sel(cartesian_pos_label="x"),
750
854
  combined_antenna_xds["ANTENNA_POSITION"].sel(cartesian_pos_label="z"),
751
855
  )
752
- plt.xlabel("y (m)")
753
- plt.ylabel("z (m)")
856
+ ax3.set_xlabel("x (m)")
857
+ ax3.set_ylabel("z (m)")
858
+
859
+ ax4.axis("off")
860
+
861
+ antenna_axes = [ax1, ax2, ax3]
862
+ scatter_map = dict(zip(antenna_axes, [scatter1, scatter2, scatter3]))
863
+ if label_all_antennas:
864
+ annotations_map = setup_annotations_for_all(antenna_axes, scatter_map)
865
+ else:
866
+ annotations_map = setup_annotations_for_hover(antenna_axes, scatter_map)
867
+ fig.canvas.mpl_connect("motion_notify_event", antenna_hover)
868
+
754
869
  plt.show()
755
870
 
756
871
 
@@ -27,7 +27,7 @@ TimeWeather = Literal["time_weather"]
27
27
  AntennaName = Literal["antenna_name"]
28
28
  """ Antenna name dimension """
29
29
  StationName = Literal["station_name"]
30
- """ Station identifier dimension """
30
+ """ Station name dimension """
31
31
  ReceptorLabel = Literal["receptor_label"]
32
32
  """ Receptor label dimension """
33
33
  ToneLabel = Literal["tone_label"]
@@ -295,7 +295,7 @@ class SkyCoordArray:
295
295
 
296
296
  type: Attr[SkyCoord] = "sky_coord"
297
297
  units: Attr[UnitsOfSkyCoordInRadians] = ("rad", "rad")
298
- frame: Attr[AllowedSkyCoordFrames] = ""
298
+ frame: Attr[AllowedSkyCoordFrames] = "icrs"
299
299
  """
300
300
  Possible values are astropy SkyCoord frames.
301
301
  Several casacore frames found in MSv2 are translated to astropy frames as follows: AZELGEO=>altaz, J2000=>fk5, ICRS=>icrs.
@@ -324,7 +324,7 @@ class PointingBeamArray:
324
324
 
325
325
  type: Attr[SkyCoord] = "sky_coord"
326
326
  units: Attr[UnitsOfSkyCoordInRadians] = ("rad", "rad")
327
- frame: Attr[AllowedSkyCoordFrames] = "fk5"
327
+ frame: Attr[AllowedSkyCoordFrames] = "icrs"
328
328
  """
329
329
  From fixvis docs: clean and the im tool ignore the reference frame claimed by the UVW column (it is often mislabelled
330
330
  as ITRF when it is really FK5 (J2000)) and instead assume the (u, v, w)s are in the same frame as the phase tracking
@@ -341,7 +341,7 @@ class LocalSkyCoordArray:
341
341
 
342
342
  type: Attr[SkyCoord] = "sky_coord"
343
343
  units: Attr[UnitsOfSkyCoordInRadians] = ("rad", "rad")
344
- frame: Attr[AllowedSkyCoordFrames] = "fk5"
344
+ frame: Attr[AllowedSkyCoordFrames] = "icrs"
345
345
  """
346
346
  From fixvis docs: clean and the im tool ignore the reference frame claimed by the UVW column (it is often mislabelled
347
347
  as ITRF when it is really FK5 (J2000)) and instead assume the (u, v, w)s are in the same frame as the phase tracking
@@ -518,7 +518,7 @@ AllowedSpectralCoordFrames = Literal[
518
518
  # "LSRK" -> "lsrk",
519
519
  # "LSRD" -> "lsrd",
520
520
  "BARY",
521
- "GEO",
521
+ # "GEO", -> "gcrs"
522
522
  "TOPO",
523
523
  # astropy frames
524
524
  "gcrs",
@@ -540,17 +540,20 @@ class SpectralCoordArray:
540
540
 
541
541
  units: Attr[UnitsHertz] = ("Hz",)
542
542
 
543
- observer: Attr[AllowedSpectralCoordFrames] = "gcrs"
543
+ observer: Attr[AllowedSpectralCoordFrames] = "icrs"
544
544
  """
545
545
  Capitalized reference observers are from casacore. TOPO implies creating astropy earth_location.
546
546
  Astropy velocity reference frames are lowercase. Note that Astropy does not use the name 'TOPO' (telescope centric)
547
547
  rather it assumes if no velocity frame is given that this is the default.
548
+
549
+ When converting from MSv2 and casacore frequency frames, the following translations from casacore to astropy
550
+ frame names are applied: GEO=>gcrs, LSRK=>lsrk, LSRD=>lsrd
548
551
  """
549
552
 
550
553
  type: Attr[SpectralCoord] = "spectral_coord"
551
554
 
552
555
 
553
- AllowedLocationFrames = Literal["ITRF", "GRS80", "WGS84", "WGS72", "Undefined"]
556
+ AllowedLocationFrames = Literal["ITRS", "Undefined"]
554
557
 
555
558
 
556
559
  AllowedLocationCoordinateSystems = Literal[
@@ -562,11 +565,16 @@ AllowedLocationCoordinateSystems = Literal[
562
565
  ]
563
566
 
564
567
 
568
+ AllowedEllipsoid = Literal["GRS80", "WGS84", "WGS72"]
569
+
570
+
565
571
  @xarray_dataarray_schema
566
572
  class LocationArray:
567
573
  """
568
- Measure type used for example in antenna_xds/ANTENNA_POSITION, field_and_source_xds/OBSERVER_POSITION
569
- Data dimensions can be EllipsoidPosLabel or CartesianPosLabel
574
+ Measure type used for example in antenna_xds/ANTENNA_POSITION, weather_xds/STATION_POSITION,
575
+ field_and_source_xds(ephemeris)/OBSERVER_POSITION.
576
+
577
+ Data dimensions can be CartesianPosLabel or EllipsoidPosLabel
570
578
  """
571
579
 
572
580
  data: Data[Union[EllipsoidPosLabel, CartesianPosLabel], float]
@@ -575,13 +583,13 @@ class LocationArray:
575
583
  """
576
584
  If the units are a list of strings then it must be the same length as
577
585
  the last dimension of the data array. This allows for having different
578
- units in the same data array,for example geodetic coordinates could use
586
+ units in the same data array, for example geodetic coordinates could use
579
587
  ``['rad','rad','m']``.
580
588
  """
581
589
 
582
590
  frame: Attr[AllowedLocationFrames]
583
591
  """
584
- Can be ITRF, GRS80, WGS84, WGS72, Undefined
592
+ Reference frame. Can be ITRS (assumed for all Earth locations) or Undefined (used in non-Earth locations).
585
593
  """
586
594
 
587
595
  coordinate_system: Attr[AllowedLocationCoordinateSystems]
@@ -589,24 +597,29 @@ class LocationArray:
589
597
 
590
598
  origin_object_name: Attr[str]
591
599
  """
592
- earth/sun/moon/etc
600
+ earth/sun/moon/etc.
601
+ """
602
+
603
+ ellipsoid: Optional[Attr[AllowedEllipsoid]]
604
+ """
605
+ Ellipsoid used in geodetic Earth locations (with EllipsoidPosLabel coordinate)
593
606
  """
594
607
 
595
608
  type: Attr[Location] = "location"
596
- """ """
609
+ """ Measure type. Should be ``"location"``."""
597
610
 
598
611
 
599
612
  @xarray_dataarray_schema
600
613
  class EllipsoidPosLocationArray:
601
614
  """
602
- Measure type used for example in field_and_source_xds/SUB_OBSERVER_POSITION, SUB_SOLAR_POSITION
615
+ Measure type used for example in field_and_source_xds(ephemeris) / SUB_OBSERVER_DIRECTION, SUB_SOLAR_POSITION
603
616
  """
604
617
 
605
618
  data: Data[EllipsoidPosLabel, float]
606
619
 
607
620
  frame: Attr[AllowedLocationFrames]
608
621
  """
609
- Can be ITRF, GRS80, WGS84, WGS72
622
+ Reference frame. Can be ITRS (assumed for all Earth locations) or Undefined (used in non-Earth locations).
610
623
  """
611
624
 
612
625
  coordinate_system: Attr[AllowedLocationCoordinateSystems]
@@ -618,7 +631,7 @@ class EllipsoidPosLocationArray:
618
631
  """
619
632
 
620
633
  type: Attr[Location] = "location"
621
- """ """
634
+ """ Measure type. Should be ``"location"``."""
622
635
 
623
636
  units: Attr[UnitsOfPositionInRadians] = ("rad", "rad", "m")
624
637
  """
@@ -1445,7 +1458,7 @@ class AntennaXds:
1445
1458
  # Coordinates
1446
1459
  antenna_name: Coordof[AntennaNameArray]
1447
1460
  """ Antenna name """
1448
- station: Coord[AntennaName, str]
1461
+ station_name: Coord[AntennaName, str]
1449
1462
  """ Name of the station pad (relevant to arrays with moving antennas). """
1450
1463
  mount: Coord[AntennaName, str]
1451
1464
  """ Mount type of the antenna. Reserved keywords include: ”EQUATORIAL” - equatorial mount;
@@ -1529,7 +1542,7 @@ class GainCurveXds:
1529
1542
  # Coordinates
1530
1543
  antenna_name: Coordof[AntennaNameArray]
1531
1544
  """ Antenna name """
1532
- station: Coord[AntennaName, str]
1545
+ station_name: Coord[AntennaName, str]
1533
1546
  """ Name of the station pad (relevant to arrays with moving antennas). """
1534
1547
  mount: Coord[AntennaName, str]
1535
1548
  """ Mount type of the antenna. Reserved keywords include: ”EQUATORIAL” - equatorial mount;
@@ -1588,7 +1601,7 @@ class PhaseCalibrationXds:
1588
1601
  # Coordinates
1589
1602
  antenna_name: Coordof[AntennaNameArray]
1590
1603
  """ Antenna name """
1591
- station: Coord[AntennaName, str]
1604
+ station_name: Coord[AntennaName, str]
1592
1605
  """ Name of the station pad (relevant to arrays with moving antennas). """
1593
1606
  mount: Coord[AntennaName, str]
1594
1607
  """ Mount type of the antenna. Reserved keywords include: ”EQUATORIAL” - equatorial mount;
@@ -1672,13 +1685,11 @@ class WeatherXds:
1672
1685
 
1673
1686
  # Coordinates
1674
1687
  station_name: Coord[StationName, str]
1675
- """ Station identifier """
1688
+ """ Station name """
1676
1689
  time: Optional[Coordof[TimeInterpolatedCoordArray]]
1677
1690
  """ Mid-point of the time interval. Labeled 'time' when interpolated to main time axis """
1678
1691
  time_weather: Optional[Coordof[TimeWeatherCoordArray]]
1679
1692
  """ Mid-point of the time interval. Labeled 'time_weather' when not interpolated to main time axis """
1680
- antenna_name: Optional[Coordof[AntennaNameArray]]
1681
- """ Antenna identifier """
1682
1693
  ellipsoid_pos_label: Optional[Coord[EllipsoidPosLabel, str]] = (
1683
1694
  "lon",
1684
1695
  "lat",
@@ -1688,6 +1699,10 @@ class WeatherXds:
1688
1699
  cartesian_pos_label: Optional[Coord[CartesianPosLabel, str]] = ("x", "y", "z")
1689
1700
  """ Coordinate labels of geocentric earth location data (typically shape 3 and 'x', 'y', 'z')"""
1690
1701
 
1702
+ # Station position variable - required
1703
+ STATION_POSITION: Data[tuple[StationName], LocationArray] = None
1704
+ """ Position of the weather station """
1705
+
1691
1706
  # Data variables (all optional)
1692
1707
  H2O: Optional[
1693
1708
  Data[
@@ -1766,8 +1781,6 @@ class WeatherXds:
1766
1781
  ]
1767
1782
  ] = None
1768
1783
  """ Average wind speed """
1769
- STATION_POSITION: Optional[Data[tuple[StationName], LocationArray]] = None
1770
- """ Station position """
1771
1784
 
1772
1785
  # Attributes
1773
1786
  type: Attr[Literal["weather"]] = "weather"
@@ -1883,7 +1896,9 @@ class SystemCalibrationXds:
1883
1896
 
1884
1897
  # Coordinates
1885
1898
  antenna_name: Coordof[AntennaNameArray]
1886
- """ Antenna identifier """
1899
+ """ Antenna name """
1900
+ station_name: Coord[AntennaName, str]
1901
+ """ Name of the station pad (relevant to arrays with moving antennas). """
1887
1902
  receptor_label: Coord[ReceptorLabel, str]
1888
1903
  """ Names of receptors """
1889
1904
  polarization_type: Coord[tuple[AntennaName, ReceptorLabel], str]
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xradio
3
- Version: 0.0.50
3
+ Version: 0.0.52
4
4
  Summary: Xarray Radio Astronomy Data IO
5
- Author-email: Jan-Willem Steeb <jsteeb@nrao.edu>
5
+ Author-email: Jan-Willem Steeb <jsteeb@nrao.edu>, Federico Montesino Pouzols <pouzols@eso.edu>, Dave Mehringer <dmehring@nrao.edu>, Peter Wortmann <peter.wortmann@skao.int>
6
6
  License: BSD 3-Clause License
7
7
 
8
8
  All works in this repository are copyrighted 2024.
@@ -43,7 +43,7 @@ License-File: LICENSE.txt
43
43
  Requires-Dist: astropy
44
44
  Requires-Dist: dask
45
45
  Requires-Dist: distributed
46
- Requires-Dist: toolviper
46
+ Requires-Dist: toolviper>=0.0.11
47
47
  Requires-Dist: numba>=0.57.0
48
48
  Requires-Dist: numpy
49
49
  Requires-Dist: pytest
@@ -79,7 +79,13 @@ Dynamic: license-file
79
79
  # xradio
80
80
  Xarray Radio Astronomy Data IO is still in development.
81
81
 
82
- [![Python 3.9 3.10 3.11 3.12](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%203.12-blue)](https://www.python.org/downloads/release/python-380/)
82
+ [![Python 3.11 3.12 3.13](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13-blue)](https://www.python.org/downloads/release/python-3130/)
83
+ [![Linux Tests](https://github.com/casangi/xradio/actions/workflows/python-testing-linux.yml/badge.svg?branch=main)](https://github.com/casangi/xradio/actions/workflows/python-testing-linux.yml?query=branch%3Amain)
84
+ [![macOS Tests](https://github.com/casangi/xradio/actions/workflows/python-testing-macos.yml/badge.svg?branch=main)](https://github.com/casangi/xradio/actions/workflows/python-testing-macos.yml?query=branch%3Amain)
85
+ [![ipynb Tests](https://github.com/casangi/xradio/actions/workflows/run-ipynb.yml/badge.svg?branch=main)](https://github.com/casangi/xradio/actions/workflows/run-ipynb.yml?query=branch%3Amain)
86
+ [![Coverage](https://codecov.io/gh/casangi/xradio/branch/main/graph/badge.svg)](https://codecov.io/gh/casangi/xradio/branch/main/xradio)
87
+ [![Documentation Status](https://readthedocs.org/projects/xradio/badge/?version=latest)](https://xradio.readthedocs.io)
88
+ [![Version Status](https://img.shields.io/pypi/v/xradio.svg)](https://pypi.python.org/pypi/xradio/)
83
89
 
84
90
  # Installing
85
91
  It is recommended to use the conda environment manager from [miniforge](https://github.com/conda-forge/miniforge) to create a clean, self-contained runtime where XRADIO and all its dependencies can be installed:
@@ -1,48 +1,48 @@
1
1
  xradio/__init__.py,sha256=82picDsKDBYZRlIpp5JjWsBEf_daXgiLVM7zq6rY_6Q,383
2
2
  xradio/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  xradio/_utils/coord_math.py,sha256=n4Td6jcEX4vM49Xseuwrg6USylTGsySS6CND93DEG_8,3587
4
- xradio/_utils/dict_helpers.py,sha256=rUiZhicKu0rptWwXpEwo1fHdAf7hCF4yyoXpRoDrjcU,2162
4
+ xradio/_utils/dict_helpers.py,sha256=-g2ZvRufOYACzD7d_8BBFpFwhDFxIm4Psm_TRaVJZ38,2690
5
5
  xradio/_utils/list_and_array.py,sha256=fW0LDSXlPrSQguSUcZM5oy2Zw-KQVqq9vmmLS8jhc70,4340
6
- xradio/_utils/schema.py,sha256=XJwJNCenkgK0tjxJmMO_F-8VDqHiutDX2K1iP9kBgIA,7472
6
+ xradio/_utils/schema.py,sha256=iF4cU9nmBvYvmG5HxkN3fJN4BFEMmIWiBY15HI7mbbw,7472
7
7
  xradio/_utils/_casacore/tables.py,sha256=aq6E_4RRAHdTBCwMKrVil1cWhFU2O980DNH9IlRKXLw,1280
8
8
  xradio/_utils/zarr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  xradio/_utils/zarr/common.py,sha256=egj3Zma0BUK0msOBDozMa-62rHrcxrjCNE5XkkZUq70,5332
10
10
  xradio/image/__init__.py,sha256=HAD0GfopIbhdxOYckyW6S9US_dSWmZrwIl3FHUzZwrE,435
11
11
  xradio/image/image.py,sha256=j2Rhya35RRR5NIq1kYzXHbYvKlhtKLhD28sZq_2AtPo,14042
12
12
  xradio/image/_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- xradio/image/_util/casacore.py,sha256=3gF720wtbU0_L6ZWZlKTvBTHFKWNdTgI4_uCwVYwnWE,4353
13
+ xradio/image/_util/casacore.py,sha256=eaiMcr546p7k9SU2s3pQDgpFyS94xW3Z1ZR3yXxVEfc,4375
14
14
  xradio/image/_util/common.py,sha256=y2QJXTHowvjqwNPG5a-cOzl0WneH7c8c9jAVSKQeK2w,8429
15
15
  xradio/image/_util/fits.py,sha256=gyGm06fuCKqVGK7uv-ObvQNfFawUDsIOa_nQyklM3Aw,329
16
16
  xradio/image/_util/image_factory.py,sha256=Mm0ZDraD0WoNpGqy98EneFr1PxgfyNZNQwquIH2t0nc,8610
17
17
  xradio/image/_util/zarr.py,sha256=lhQqVRC1GEWClG3zRbuDr2IlQBfXeDqaLUJIN-MVMxA,1652
18
18
  xradio/image/_util/_casacore/__init__.py,sha256=OlsiRE40o1jSbBI4khgQQzgfDYbAlOMKIhO4UFlbGhg,41
19
19
  xradio/image/_util/_casacore/common.py,sha256=Z7Jl3AU7jVcgjNtCnvL7CCXJQAxXeEtowXBmSShuAv4,1329
20
- xradio/image/_util/_casacore/xds_from_casacore.py,sha256=-y-VluzdvdnoK3swCDgA0UFhhajCRoPD6eY9e8c42F8,42462
21
- xradio/image/_util/_casacore/xds_to_casacore.py,sha256=Oh1Uve0y7R54VOqchm8JAxrmx4n1oHEvae7zJrVHMFg,16054
22
- xradio/image/_util/_fits/xds_from_fits.py,sha256=vadDxBvLYJudlUwLQcR7cX23hRIDMJZUHP0adKwh1WU,29853
23
- xradio/image/_util/_zarr/common.py,sha256=apMX_bF4Hr3pFGjnDFpp36KgmhTYAPBZquNkjBHrsXk,307
24
- xradio/image/_util/_zarr/xds_from_zarr.py,sha256=4b6KHmAcnrhBbCi-Z7e3Lm6l6wziJL1zaNIohmPAYDk,3601
25
- xradio/image/_util/_zarr/xds_to_zarr.py,sha256=wogXbwX8n3Sl9PHoc3_Y_LBowQsQ-94HZQFZ5NcxUZA,1624
20
+ xradio/image/_util/_casacore/xds_from_casacore.py,sha256=KOtXG7fwHyTTRyHprlbQOVcu1ZnrSv47zcP8Mu4SGSc,44036
21
+ xradio/image/_util/_casacore/xds_to_casacore.py,sha256=Mw_o3Jr0HlcMn0UtJ8oX-GqM73Q3QRlMeMUBLFJzhRM,16861
22
+ xradio/image/_util/_fits/xds_from_fits.py,sha256=EzysySeskhcqaH2GefrcKsM_FWbC3JCemXwgoS9_434,29484
23
+ xradio/image/_util/_zarr/common.py,sha256=ltlj3uFa-uv8lXlDtV79QnfNmfm0tyhXN5FDAjZtjzg,308
24
+ xradio/image/_util/_zarr/xds_from_zarr.py,sha256=KMsfaSSm9kyVoztS6pUzGNxMZzQnCxkk0kDv2GxW5Kw,4451
25
+ xradio/image/_util/_zarr/xds_to_zarr.py,sha256=aEnbZr_Yn6bCEPFz_k0HW-JSchvfkaOqx4lEkA1mJNU,1533
26
26
  xradio/image/_util/_zarr/zarr_low_level.py,sha256=xnYm6EmVbmLxMlOSXH32SABfQBLHfr2H9ch9gYwFNXs,13338
27
27
  xradio/measurement_set/__init__.py,sha256=Vrr1Py50TvbzeZ_VMCswYNz0Wcccbf-iJDj4ArlfcJ0,870
28
28
  xradio/measurement_set/convert_msv2_to_processing_set.py,sha256=uLZjXplVPXa0XnNa-Fty85k_-fsw6ZC98Hfiwd1WF-U,9704
29
29
  xradio/measurement_set/load_processing_set.py,sha256=8EPApyGy0Tmzu6Seeby7dKxvtxtAFA585kK50DYVHas,8164
30
30
  xradio/measurement_set/measurement_set_xdt.py,sha256=kN337gyn7Q8nF4ENy292PYsmBJJLu5ozhJ3FyT5BcVo,11986
31
31
  xradio/measurement_set/open_processing_set.py,sha256=kMODJmXT2KU12L6Y2NdTV8shvLGb5PgLIOqJgMCzlHI,5308
32
- xradio/measurement_set/processing_set_xdt.py,sha256=LhonH1v9knkcFg5wYC1KHBB5pqhH0xPH6EkIms3-0xM,59353
33
- xradio/measurement_set/schema.py,sha256=6vQEuI81V9mQ5y-Az310NfwgbdOEXkJDYQfIoZuMPdc,85757
32
+ xradio/measurement_set/processing_set_xdt.py,sha256=CkwBbilEPh3Sy6qTdtfV2bjZ2MhTCGy3A3fYWk7JstA,64413
33
+ xradio/measurement_set/schema.py,sha256=juA8v8-ZLWcKUlguGQw2t4b1Ftqn2xzwTvYmIDmRKL8,86489
34
34
  xradio/measurement_set/_utils/__init__.py,sha256=XE-h1yMfr6tVD6gdUwXO1CVq5SQ6kD_oj-e5TFwslds,97
35
35
  xradio/measurement_set/_utils/msv2.py,sha256=7hnZMFoQ-s1g0ATjEupLvtdqQCdroPv-Rl5OwjqXjh8,4430
36
36
  xradio/measurement_set/_utils/zarr.py,sha256=ehXlu0Xh_UZ5Xm2RnHCxESsRZ26c3DQAO5rqMK5MwTk,3947
37
37
  xradio/measurement_set/_utils/_msv2/chunks.py,sha256=JTPk3il6fk570BjWZMoOAtsbvnLmqPcBv9EPY6A2yOs,2964
38
- xradio/measurement_set/_utils/_msv2/conversion.py,sha256=ERpoGBpi2x2qgX-NSql0LtpWE-uy_PG8uTvE_lJcQuY,52997
39
- xradio/measurement_set/_utils/_msv2/create_antenna_xds.py,sha256=qLUDxbkJBOaD7EaVx7ufiU0CL5f8VVxK-923-j4XpXc,17758
40
- xradio/measurement_set/_utils/_msv2/create_field_and_source_xds.py,sha256=iyR5LzCupA6ZJmIOjIylwCQRI1EU4JEofBL7sbDWzwA,37069
38
+ xradio/measurement_set/_utils/_msv2/conversion.py,sha256=Jqs2o8LFvey3X-5JWo_hTWwvgXIBZUAGhEZt0ahcjf4,53013
39
+ xradio/measurement_set/_utils/_msv2/create_antenna_xds.py,sha256=MhNg-tf1B0OYpLWIq9W9RFKihzsfKw0PGfBxFFgwCj4,17798
40
+ xradio/measurement_set/_utils/_msv2/create_field_and_source_xds.py,sha256=UWimMYDf4ZgF8XJpSpnZjt0Jq14kON115PY81qSf01A,37299
41
41
  xradio/measurement_set/_utils/_msv2/descr.py,sha256=PGY39PYQj0K4th5RUv0jOWszcHlZDt6VQRTOuntCeYI,5213
42
42
  xradio/measurement_set/_utils/_msv2/msv2_msv3.py,sha256=9AKs2HWly7Ivv_Cjr11dIPGmm33_rtSBoGF9wN5ZwEQ,116
43
43
  xradio/measurement_set/_utils/_msv2/msv2_to_msv4_meta.py,sha256=gk9gU7g2Lk7dmaiLW8qecOEt574pRtGsCHnUnHXM3D0,1614
44
44
  xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py,sha256=5-T-C5wPAPHIUY1eQXvfdLQxPPuTy6UJIZhLlMyfMqA,7213
45
- xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py,sha256=Y_YjSOvH5A1Ij2x5lAC7FAL6C0mEbWvbGRPYpBIay7w,21958
45
+ xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py,sha256=QxiAuhZoZx_oFe-JZT8tx1BzeM0onTcLWYAncMcgDqY,27426
46
46
  xradio/measurement_set/_utils/_msv2/optimised_functions.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  xradio/measurement_set/_utils/_msv2/partition_queries.py,sha256=6toOYRE6lay78r24kgUgQHOngQLuIGqQKcBTZcCk4lE,14709
48
48
  xradio/measurement_set/_utils/_msv2/partitions.py,sha256=_KhRq8bSx2QxuWp9K57fLoLxcU6kvJ35e6wvJ-THbwc,12979
@@ -70,8 +70,8 @@ xradio/schema/metamodel.py,sha256=WjtW7pAVzcjLRWifRH3sQoOiN6TV810hARpOIz1M_gw,38
70
70
  xradio/schema/typing.py,sha256=8-o6fZd99kJ4FVdgBYRTIRJ-wDqpcUNXzCTfJvl3TIw,10439
71
71
  xradio/sphinx/__init__.py,sha256=VGY-7Ty3q67qpnBee0-znbiJ-Iy0F93UO--IpjEdHXc,380
72
72
  xradio/sphinx/schema_table.py,sha256=uq33habbAbReqnEG6ASKSd4UOMZGUzA3qoTX45rq84U,12373
73
- xradio-0.0.50.dist-info/licenses/LICENSE.txt,sha256=9CYIJt7riOXo9AD0eXBZviLxo_HebD-2JJI8oiWtzfg,1807
74
- xradio-0.0.50.dist-info/METADATA,sha256=XpYcb4kWmCYjPkjybQhk-fJxKyRwM2W0wjyOMfr_s74,4471
75
- xradio-0.0.50.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
76
- xradio-0.0.50.dist-info/top_level.txt,sha256=dQu27fGBZJ2Yk-gW5XeD-dZ76Xa4Xcvk60Vz-dwXp7k,7
77
- xradio-0.0.50.dist-info/RECORD,,
73
+ xradio-0.0.52.dist-info/licenses/LICENSE.txt,sha256=9CYIJt7riOXo9AD0eXBZviLxo_HebD-2JJI8oiWtzfg,1807
74
+ xradio-0.0.52.dist-info/METADATA,sha256=achhZfzihb5bty53MwAf2t1sLZ2BqXbY4I3EuaN-GEk,5574
75
+ xradio-0.0.52.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
76
+ xradio-0.0.52.dist-info/top_level.txt,sha256=dQu27fGBZJ2Yk-gW5XeD-dZ76Xa4Xcvk60Vz-dwXp7k,7
77
+ xradio-0.0.52.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5