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.
- xradio/_utils/dict_helpers.py +24 -0
- xradio/_utils/schema.py +2 -2
- xradio/image/_util/_casacore/xds_from_casacore.py +116 -69
- xradio/image/_util/_casacore/xds_to_casacore.py +51 -32
- xradio/image/_util/_fits/xds_from_fits.py +43 -52
- xradio/image/_util/_zarr/common.py +1 -1
- xradio/image/_util/_zarr/xds_from_zarr.py +37 -20
- xradio/image/_util/_zarr/xds_to_zarr.py +20 -21
- xradio/image/_util/casacore.py +6 -3
- xradio/measurement_set/_utils/_msv2/conversion.py +3 -3
- xradio/measurement_set/_utils/_msv2/create_antenna_xds.py +5 -5
- xradio/measurement_set/_utils/_msv2/create_field_and_source_xds.py +11 -3
- xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py +151 -13
- xradio/measurement_set/processing_set_xdt.py +146 -31
- xradio/measurement_set/schema.py +40 -25
- {xradio-0.0.50.dist-info → xradio-0.0.52.dist-info}/METADATA +10 -4
- {xradio-0.0.50.dist-info → xradio-0.0.52.dist-info}/RECORD +20 -20
- {xradio-0.0.50.dist-info → xradio-0.0.52.dist-info}/WHEEL +1 -1
- {xradio-0.0.50.dist-info → xradio-0.0.52.dist-info}/licenses/LICENSE.txt +0 -0
- {xradio-0.0.50.dist-info → xradio-0.0.52.dist-info}/top_level.txt +0 -0
|
@@ -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=
|
|
626
|
+
label=center_label,
|
|
608
627
|
)
|
|
609
628
|
plt.xlabel("RA (rad)")
|
|
610
629
|
plt.ylabel("DEC (rad)")
|
|
611
|
-
|
|
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=
|
|
675
|
+
label=center_label,
|
|
647
676
|
)
|
|
677
|
+
|
|
648
678
|
plt.xlabel("RA Offset (rad)")
|
|
649
679
|
plt.ylabel("DEC Offset (rad)")
|
|
650
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
727
|
-
|
|
728
|
-
|
|
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
|
-
|
|
733
|
-
|
|
734
|
-
|
|
841
|
+
ax1.set_xlabel("x (m)")
|
|
842
|
+
ax1.set_ylabel("y (m)")
|
|
843
|
+
antenna_names = combined_antenna_xds.antenna_name.values
|
|
735
844
|
|
|
736
|
-
|
|
737
|
-
|
|
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
|
-
|
|
743
|
-
|
|
744
|
-
plt.show()
|
|
849
|
+
ax2.set_xlabel("y (m)")
|
|
850
|
+
ax2.set_ylabel("z (m)")
|
|
745
851
|
|
|
746
|
-
|
|
747
|
-
|
|
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
|
-
|
|
753
|
-
|
|
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
|
|
xradio/measurement_set/schema.py
CHANGED
|
@@ -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
|
|
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] = "
|
|
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] = "
|
|
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] = "
|
|
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["
|
|
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,
|
|
569
|
-
|
|
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
|
|
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/
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
[](https://www.python.org/downloads/release/python-3130/)
|
|
83
|
+
[](https://github.com/casangi/xradio/actions/workflows/python-testing-linux.yml?query=branch%3Amain)
|
|
84
|
+
[](https://github.com/casangi/xradio/actions/workflows/python-testing-macos.yml?query=branch%3Amain)
|
|
85
|
+
[](https://github.com/casangi/xradio/actions/workflows/run-ipynb.yml?query=branch%3Amain)
|
|
86
|
+
[](https://codecov.io/gh/casangi/xradio/branch/main/xradio)
|
|
87
|
+
[](https://xradio.readthedocs.io)
|
|
88
|
+
[](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
|
|
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=
|
|
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=
|
|
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
|
|
21
|
-
xradio/image/_util/_casacore/xds_to_casacore.py,sha256=
|
|
22
|
-
xradio/image/_util/_fits/xds_from_fits.py,sha256=
|
|
23
|
-
xradio/image/_util/_zarr/common.py,sha256=
|
|
24
|
-
xradio/image/_util/_zarr/xds_from_zarr.py,sha256=
|
|
25
|
-
xradio/image/_util/_zarr/xds_to_zarr.py,sha256=
|
|
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=
|
|
33
|
-
xradio/measurement_set/schema.py,sha256=
|
|
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=
|
|
39
|
-
xradio/measurement_set/_utils/_msv2/create_antenna_xds.py,sha256=
|
|
40
|
-
xradio/measurement_set/_utils/_msv2/create_field_and_source_xds.py,sha256=
|
|
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=
|
|
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.
|
|
74
|
-
xradio-0.0.
|
|
75
|
-
xradio-0.0.
|
|
76
|
-
xradio-0.0.
|
|
77
|
-
xradio-0.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|