xradio 0.0.40__py3-none-any.whl → 0.0.42__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. xradio/_utils/coord_math.py +100 -0
  2. xradio/_utils/list_and_array.py +49 -4
  3. xradio/_utils/schema.py +36 -16
  4. xradio/image/_util/_casacore/xds_from_casacore.py +5 -5
  5. xradio/image/_util/_casacore/xds_to_casacore.py +12 -11
  6. xradio/image/_util/_fits/xds_from_fits.py +18 -17
  7. xradio/image/_util/_zarr/zarr_low_level.py +29 -12
  8. xradio/image/_util/common.py +1 -1
  9. xradio/image/_util/image_factory.py +1 -1
  10. xradio/measurement_set/__init__.py +18 -0
  11. xradio/measurement_set/_utils/__init__.py +5 -0
  12. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/load_main_table.py +1 -1
  13. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read.py +15 -1
  14. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/conversion.py +186 -84
  15. xradio/measurement_set/_utils/_msv2/create_antenna_xds.py +535 -0
  16. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/create_field_and_source_xds.py +146 -58
  17. xradio/measurement_set/_utils/_msv2/msv4_info_dicts.py +203 -0
  18. xradio/measurement_set/_utils/_msv2/msv4_sub_xdss.py +550 -0
  19. xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/subtables.py +1 -1
  20. xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/xds_helper.py +1 -1
  21. xradio/{vis/_vis_utils/ms.py → measurement_set/_utils/msv2.py} +4 -4
  22. xradio/{vis/_vis_utils → measurement_set/_utils}/zarr.py +3 -3
  23. xradio/{vis → measurement_set}/convert_msv2_to_processing_set.py +9 -2
  24. xradio/{vis → measurement_set}/load_processing_set.py +16 -20
  25. xradio/measurement_set/measurement_set_xds.py +83 -0
  26. xradio/{vis/read_processing_set.py → measurement_set/open_processing_set.py} +25 -34
  27. xradio/measurement_set/processing_set.py +777 -0
  28. xradio/measurement_set/schema.py +1979 -0
  29. xradio/schema/check.py +42 -22
  30. xradio/schema/dataclass.py +56 -6
  31. xradio/sphinx/__init__.py +12 -0
  32. xradio/sphinx/schema_table.py +351 -0
  33. {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/METADATA +17 -15
  34. xradio-0.0.42.dist-info/RECORD +76 -0
  35. {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/WHEEL +1 -1
  36. xradio/_utils/common.py +0 -101
  37. xradio/vis/__init__.py +0 -14
  38. xradio/vis/_processing_set.py +0 -302
  39. xradio/vis/_vis_utils/__init__.py +0 -5
  40. xradio/vis/_vis_utils/_ms/create_antenna_xds.py +0 -482
  41. xradio/vis/_vis_utils/_ms/msv4_infos.py +0 -0
  42. xradio/vis/_vis_utils/_ms/msv4_sub_xdss.py +0 -306
  43. xradio/vis/schema.py +0 -1102
  44. xradio-0.0.40.dist-info/RECORD +0 -73
  45. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/load.py +0 -0
  46. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read_main_table.py +0 -0
  47. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/read_subtables.py +0 -0
  48. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/table_query.py +0 -0
  49. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/write.py +0 -0
  50. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/_tables/write_exp_api.py +0 -0
  51. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/chunks.py +0 -0
  52. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/descr.py +0 -0
  53. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/msv2_msv3.py +0 -0
  54. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/msv2_to_msv4_meta.py +0 -0
  55. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/optimised_functions.py +0 -0
  56. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/partition_queries.py +0 -0
  57. /xradio/{vis/_vis_utils/_ms → measurement_set/_utils/_msv2}/partitions.py +0 -0
  58. /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/cds.py +0 -0
  59. /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/partition_attrs.py +0 -0
  60. /xradio/{vis/_vis_utils → measurement_set/_utils}/_utils/stokes_types.py +0 -0
  61. /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/encoding.py +0 -0
  62. /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/read.py +0 -0
  63. /xradio/{vis/_vis_utils → measurement_set/_utils}/_zarr/write.py +0 -0
  64. {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/LICENSE.txt +0 -0
  65. {xradio-0.0.40.dist-info → xradio-0.0.42.dist-info}/top_level.txt +0 -0
xradio/vis/schema.py DELETED
@@ -1,1102 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Literal, Optional, Union, List
4
- from xradio.schema.bases import (
5
- xarray_dataset_schema,
6
- xarray_dataarray_schema,
7
- dict_schema,
8
- )
9
- from xradio.schema.typing import Attr, Coord, Coordof, Data, Dataof, Name
10
- import numpy
11
-
12
- # Dimensions
13
- Time = Literal["time"]
14
- """ Observation time dimension """
15
- AntennaName = Literal["antenna_name"]
16
- """ Antenna name dimension """
17
- StationId = Literal["station_id"]
18
- """ Station ID dimension """
19
- ReceptorId = Literal["receptor_id"]
20
- """ Receptor ID dimension """
21
- ReceptorLabel = Literal["receptor_label"]
22
- """ Receptor label dimension """
23
- ToneLabel = Literal["tone_label"]
24
- """ Tone label dimension """
25
- BaselineId = Literal["baseline_id"]
26
- """ Baseline ID dimension """
27
- Frequency = Literal["frequency"]
28
- """ Frequency dimension """
29
- Polarization = Literal["polarization"]
30
- """ Polarization dimension """
31
- UvwLabel = Literal["uvw_label"]
32
- """ Coordinate dimension of UVW data (typically shape 3 for 'u', 'v', 'w') """
33
- SkyDirLabel = Literal["sky_dir_label"]
34
- """ Coordinate labels of sky directions (typically shape 2 and 'ra', 'dec') """
35
- SphericalDirLabel = Literal["spherical_dir_label"]
36
- """ Coordinate labels of spherical directions (shape 2 and 'lon', 'lat1' """
37
- SkyPosLabel = Literal["sky_pos_label"]
38
- """ Coordinate labels of sky positions (typically shape 3 and 'ra', 'dec', 'dist') """
39
- SphericalPosLabel = Literal["spherical_pos_label"]
40
- """ Coordinate labels of spherical positions (shape shape 3 and 'lon', 'lat1', 'dist2') """
41
- EllipsoidPosLabel = Literal["ellipsoid_pos_label"]
42
- """ Coordinate labels of geodetic earth location data (typically shape 3 and 'lon', 'lat', 'height')"""
43
- CartesianPosLabel = Literal["cartesian_pos_label"]
44
- """ Coordinate labels of geocentric earth location data (typically shape 3 and 'x', 'y', 'z')"""
45
- TimePhaseCal = Literal["time_phase_cal"]
46
- """ Coordinate label for VLBI-specific phase cal time axis """
47
- TimePolynomial = Literal["time_polynomial"]
48
- """ For data that is represented as variable in time using Taylor expansion """
49
- PolyTerm = Literal["poly_term"]
50
- """ Polynomial term used in VLBI GAIN_CURVE """
51
- LineLabel = Literal["line_label"]
52
- """ Line labels (for line names and variables). """
53
-
54
- # Represents "no dimension", i.e. used for coordinates and data variables with
55
- # zero dimensions.
56
- ZD = tuple[()]
57
-
58
- # Quantities
59
-
60
-
61
- @xarray_dataarray_schema
62
- class TimeArray:
63
- """
64
- Representation of a time quantity.
65
-
66
- :py:class:`astropy.time.Time` serves as the reference implementation.
67
- Data can be converted as follows::
68
-
69
- astropy.time.Time(data * astropy.units.Unit(attrs['units'][0]),
70
- format=attrs['format'], scale=attrs['scale'])
71
-
72
- All formats that express time as floating point numbers since an epoch
73
- are permissible, so at present the realistic options are:
74
-
75
- * ``mjd`` (from 1858-11-17 00:00:00 UTC)
76
- * ``unix`` (from 1970-01-01 00:00:00 UTC)
77
- * ``unix_tai`` (from 1970-01-01 00:00:00 TAI)
78
- * ``cxcsec`` (from 1998-01-01 00:00:00 TT)
79
- * ``gps`` (from 1980-01-06 00:00:00 UTC)
80
-
81
- """
82
-
83
- data: Data[ZD, float]
84
- """Time since epoch, typically in seconds (see ``units``)."""
85
-
86
- scale: Attr[str] = "tai"
87
- """
88
- Time scale of data. Must be one of ``(‘tai’, ‘tcb’, ‘tcg’, ‘tdb’, ‘tt’, ‘ut1’, ‘utc’)``,
89
- see :py:class:`astropy.time.Time`
90
- """
91
- format: Attr[str] = "unix_tai"
92
- """Time representation and epoch, see :py:class:`TimeArray`."""
93
-
94
- type: Attr[str] = "time"
95
- units: Attr[list[str]] = ("s",)
96
-
97
-
98
- @xarray_dataarray_schema
99
- class SkyCoordArray:
100
- data: Data[Union[SkyDirLabel, SkyPosLabel], float]
101
-
102
- type: Attr[str] = "sky_coord"
103
- units: Attr[list[str]] = ("rad", "rad")
104
- frame: Attr[str] = ""
105
- """
106
- From fixvis docs: clean and the im tool ignore the reference frame
107
- claimed by the UVW column (it is often mislabelled as ITRF when it is
108
- really FK5 (J2000)) and instead assume the (u, v, w)s are in the same frame
109
- as the phase tracking center. calcuvw does not yet force the UVW column and
110
- field centers to use the same reference frame! Blank = use the phase
111
- tracking frame of vis.
112
- """
113
-
114
-
115
- @xarray_dataarray_schema
116
- class SkyCoordOffsetArray:
117
- data: Data[Union[SkyDirLabel, SkyPosLabel], float]
118
-
119
- type: Attr[str] = "sky_coord"
120
- units: Attr[list[str]] = ("rad", "rad")
121
-
122
-
123
- @xarray_dataarray_schema
124
- class QuantityArray:
125
- """
126
- Anonymous quantity, possibly with associated units
127
-
128
- Often used for distances / differences (integration time, channel width etcetera).
129
- """
130
-
131
- data: Data[ZD, float]
132
-
133
- units: Attr[list[str]]
134
- type: Attr[str] = "quantity"
135
-
136
-
137
- # Coordinates / Axes
138
- @xarray_dataarray_schema
139
- class TimeCoordArray:
140
- """Data model of visibility time axis. See also :py:class:`TimeArray`."""
141
-
142
- data: Data[Time, float]
143
- """
144
- Time, expressed in seconds since the epoch (see ``scale`` &
145
- ``format``), see also see :py:class:`TimeArray`.
146
- """
147
-
148
- integration_time: Optional[Attr[QuantityArray]] = None
149
- """ The nominal sampling interval (ms v2). Units of seconds. """
150
- effective_integration_time: Optional[Attr[str]] = None
151
- """
152
- Name of data array that contains the integration time that includes
153
- the effects of missing data.
154
- """
155
-
156
- type: Attr[str] = "time"
157
- """ Coordinate type. Should be ``"time"``. """
158
- units: Attr[list[str]] = ("s",)
159
- """ Units to associate with axis"""
160
- scale: Attr[str] = "tai"
161
- """ Astropy time scales, see :py:class:`TimeArray` """
162
- format: Attr[str] = "unix"
163
- """ Astropy format, see :py:class:`TimeArray`"""
164
- long_name: Optional[Attr[str]] = "Observation Time"
165
- """ Long-form name to use for axis"""
166
-
167
-
168
- @xarray_dataset_schema
169
- class FieldSourceXds:
170
- """
171
- Field positions for each source.
172
-
173
- Defines a field position on the sky. For interferometers, this is the correlated field position.
174
- For single dishes, this is the nominal pointing direction.
175
- """
176
-
177
- source_name: Optional[Coord[Union[ZD, Time], str]]
178
- """ Source name. """
179
- field_name: Optional[Coord[Union[ZD, Time], str]]
180
- """Field name."""
181
-
182
- time: Optional[Coordof[TimeCoordArray]]
183
- """Midpoint of time for which this set of parameters is accurate"""
184
-
185
- line_label: Optional[Coord[LineLabel, str]]
186
- """ Line labels (for line names and variables). """
187
-
188
- line_names: Optional[Coord[Union[tuple[LineLabel], tuple[Time, LineLabel]], str]]
189
- """ Line names (e.g. v=1, J=1-0, SiO). """
190
-
191
- FIELD_PHASE_CENTER: Optional[Data[Union[ZD, Time], SkyCoordOffsetArray]]
192
- """
193
- Offset from the SOURCE_DIRECTION that gives the direction of phase
194
- center for which the fringes have been stopped-that is a point source in
195
- this direction will produce a constant measured phase (page 2 of
196
- https://articles.adsabs.harvard.edu/pdf/1999ASPC..180...79F). For
197
- conversion from MSv2, frame refers column keywords by default. If frame
198
- varies with field, it refers DelayDir_Ref column instead.
199
- """
200
- FIELD_DELAY_CENTER: Optional[
201
- Data[Union[tuple[SkyDirLabel], tuple[Time, SkyDirLabel]], numpy.float64]
202
- ]
203
- """
204
- Offset from the SOURCE_DIRECTION that gives the direction of delay
205
- center where coherence is maximized by inserting delay into one element of
206
- an interferometer to compensate for the geometrical and instrumental
207
- differential delay. (For conversion from MSv2, frame refers column keywords
208
- by default. If frame varies with field, it refers PhaseDir_Ref column
209
- instead.)
210
- """
211
-
212
- SOURCE_LOCATION: Optional[
213
- Data[
214
- Union[
215
- tuple[SkyPosLabel],
216
- tuple[Time, SkyPosLabel],
217
- tuple[SkyDirLabel],
218
- tuple[Time, SkyDirLabel],
219
- ],
220
- numpy.float64,
221
- ]
222
- ]
223
- """
224
- CASA Table Cols: RA,DEC,Rho."Astrometric RA and Dec and Geocentric
225
- distance with respect to the observer’s location (Geocentric). "Adjusted
226
- for light-time aberration only. With respect to the reference plane and
227
- equinox of the chosen system (ICRF or FK4/B1950). If the FK4/B1950 frame
228
- output is selected, elliptic aberration terms are added. Astrometric RA/DEC
229
- is generally used when comparing or reducing data against a star catalog."
230
- https://ssd.jpl.nasa.gov/horizons/manual.html : 1. Astrometric RA & DEC
231
- """
232
-
233
- LINE_REST_FREQUENCY: Optional[
234
- Data[Union[tuple[LineLabel], tuple[Time, LineLabel]], numpy.float64]
235
- ]
236
- """ Rest frequencies for the transitions. """
237
-
238
- LINE_SYSTEMIC_VELOCITY: Optional[
239
- Data[Union[tuple[LineLabel], tuple[Time, LineLabel]], numpy.float64]
240
- ]
241
- """ Systemic velocity at reference """
242
-
243
- SOURCE_RADIAL_VELOCITY: Optional[Data[tuple[Time], numpy.float64]]
244
- """ CASA Table Cols: RadVel. Geocentric distance rate """
245
-
246
- NORTH_POLE_POSITION_ANGLE: Optional[Data[tuple[Time], numpy.float64]]
247
- """ CASA Table cols: NP_ang, "Targets' apparent north-pole position angle (counter-clockwise with respect to direction of true-of-date reference-frame north pole) and angular distance from the sub-observer point (center of disc) at print time. A negative distance indicates the north-pole is on the hidden hemisphere." https://ssd.jpl.nasa.gov/horizons/manual.html : 17. North pole position angle & distance from disc center. """
248
-
249
- NORTH_POLE_ANGULAR_DISTANCE: Optional[Data[tuple[Time], numpy.float64]]
250
- """ CASA Table cols: NP_dist, "Targets' apparent north-pole position angle (counter-clockwise with respect to direction of true-of date reference-frame north pole) and angular distance from the sub-observer point (center of disc) at print time. A negative distance indicates the north-pole is on the hidden hemisphere."https://ssd.jpl.nasa.gov/horizons/manual.html : 17. North pole position angle & distance from disc center. """
251
-
252
- SUB_OBSERVER_DIRECTION: Optional[
253
- Data[tuple[Time, SphericalDirLabel], numpy.float64]
254
- ]
255
- """ CASA Table cols: DiskLong, DiskLat. "Apparent planetodetic longitude and latitude of the center of the target disc seen by the OBSERVER at print-time. This is not exactly the same as the "nearest point" for a non-spherical target shape (since the center of the disc might not be the point closest to the observer), but is generally very close if not a very irregular body shape. The IAU2009 rotation models are used except for Earth and MOON, which use higher-precision models. For the gas giants Jupiter, Saturn, Uranus and Neptune, IAU2009 longitude is based on the "System III" prime meridian rotation angle of the magnetic field. By contrast, pole direction (thus latitude) is relative to the body dynamical equator. There can be an offset between the magnetic pole and the dynamical pole of rotation. Down-leg light travel-time from target to observer is taken into account. Latitude is the angle between the equatorial plane and perpendicular to the reference ellipsoid of the body and body oblateness thereby included. The reference ellipsoid is an oblate spheroid with a single flatness coefficient in which the y-axis body radius is taken to be the same value as the x-axis radius. Whether longitude is positive to the east or west for the target will be indicated at the end of the output ephemeris." https://ssd.jpl.nasa.gov/horizons/manual.html : 14. Observer sub-longitude & sub-latitude """
256
-
257
- SUB_SOLAR_POSITION: Optional[Data[tuple[Time, SphericalPosLabel], numpy.float64]]
258
- """ CASA Table cols: Sl_lon, Sl_lat, r. "Heliocentric distance along with "Apparent sub-solar longitude and latitude of the Sun on the target. The apparent planetodetic longitude and latitude of the center of the target disc as seen from the Sun, as seen by the observer at print-time. This is _NOT_ exactly the same as the "sub-solar" (nearest) point for a non-spherical target shape (since the center of the disc seen from the Sun might not be the closest point to the Sun), but is very close if not a highly irregular body shape. Light travel-time from Sun to target and from target to observer is taken into account. Latitude is the angle between the equatorial plane and the line perpendicular to the reference ellipsoid of the body. The reference ellipsoid is an oblate spheroid with a single flatness coefficient in which the y-axis body radius is taken to be the same value as the x-axis radius. Uses IAU2009 rotation models except for Earth and Moon, which uses a higher precision models. Values for Jupiter, Saturn, Uranus and Neptune are Set III, referring to rotation of their magnetic fields. Whether longitude is positive to the east or west for the target will be indicated at the end of the output ephemeris." https://ssd.jpl.nasa.gov/horizons/manual.html : 15. Solar sub-longitude & sub-latitude """
259
-
260
- HELIOCENTRIC_RADIAL_VELOCITY: Optional[Data[tuple[Time], numpy.float64]]
261
- """ CASA Table cols: rdot."The Sun's apparent range-rate relative to the target, as seen by the observer. A positive "rdot" means the target was moving away from the Sun, negative indicates movement toward the Sun." https://ssd.jpl.nasa.gov/horizons/manual.html : 19. Solar range & range-rate (relative to target) """
262
-
263
- OBSERVER_PHASE_ANGLE: Optional[Data[tuple[Time], numpy.float64]]
264
- """ CASA Table cols: phang.""phi" is the true PHASE ANGLE at the observers' location at print time. "PAB-LON" and "PAB-LAT" are the FK4/B1950 or ICRF/J2000 ecliptic longitude and latitude of the phase angle bisector direction; the outward directed angle bisecting the arc created by the apparent vector from Sun to target center and the astrometric vector from observer to target center. For an otherwise uniform ellipsoid, the time when its long-axis is perpendicular to the PAB direction approximately corresponds to lightcurve maximum (or maximum brightness) of the body. PAB is discussed in Harris et al., Icarus 57, 251-258 (1984)." https://ssd.jpl.nasa.gov/horizons/manual.html : Phase angle and bisector """
265
-
266
- OBSERVER_POSITION: Optional[
267
- Data[Union[tuple[EllipsoidPosLabel], tuple[CartesianPosLabel]], numpy.float64]
268
- ]
269
- """ Observer location. """
270
-
271
- # --- Attributes ---
272
- DOPPLER_SHIFT_VELOCITY: Optional[Attr[numpy.float64]]
273
- """ Velocity definition of the Doppler shift, e.g., RADIO or OPTICAL velocity in m/s """
274
-
275
- source_model_url: Optional[Attr[str]]
276
- """URL to access source model"""
277
- ephemeris_name: Optional[Attr[str]]
278
- """The name of the ephemeris. For example DE430.
279
-
280
- This can be used with Astropy solar_system_ephemeris.set('DE430'), see
281
- https://docs.astropy.org/en/stable/coordinates/solarsystem.html.
282
- """
283
- is_ephemeris: Attr[bool] = False
284
-
285
- type: Attr[str] = "field_and_source"
286
- """
287
- Type of dataset.
288
- """
289
-
290
- # --- Optional coordinates ---
291
- sky_dir_label: Optional[Coord[SkyDirLabel, str]] = ("ra", "dec")
292
- """ Coordinate labels of sky directions (typically shape 2 and 'ra', 'dec') """
293
- sky_pos_label: Optional[Coord[SkyPosLabel, str]] = ("ra", "dec", "dist")
294
- """ Coordinate lables of sky positions (typically shape 3 and 'ra', 'dec', 'dist') """
295
- ellipsoid_pos_label: Optional[Coord[EllipsoidPosLabel, str]] = (
296
- "lon",
297
- "lat",
298
- "height",
299
- )
300
- """ Coordinate labels of geodetic earth location data (typically shape 3 and 'lon', 'lat', 'height')"""
301
- cartesian_pos_label: Optional[Coord[CartesianPosLabel, str]] = ("x", "y", "z")
302
- """ Coordinate labels of geocentric earth location data (typically shape 3 and 'x', 'y', 'z')"""
303
-
304
-
305
- @xarray_dataarray_schema
306
- class SpectralCoordArray:
307
- data: Data[ZD, float]
308
-
309
- frame: Attr[str] = "gcrs"
310
- """Astropy time scales."""
311
-
312
- type: Attr[str] = "frequency"
313
- units: Attr[list[str]] = ("Hz",)
314
-
315
-
316
- @xarray_dataarray_schema
317
- class EarthLocationArray:
318
- data: Data[CartesianPosLabel, float]
319
-
320
- ellipsoid: Attr[str]
321
- """
322
- ITRF makes use of GRS80 ellipsoid and WGS84 makes use of WGS84 ellipsoid
323
- """
324
- units: Attr[list[str]] = ("m", "m", "m")
325
- """
326
- If the units are a list of strings then it must be the same length as
327
- the last dimension of the data array. This allows for having different
328
- units in the same data array,for example geodetic coordinates could use
329
- ``['rad','rad','m']``.
330
- """
331
-
332
-
333
- @dict_schema
334
- class PartitionInfoDict:
335
- # spectral_window_id: missing / remove for good?
336
- spectral_window_name: str
337
- # field_id: missing / probably remove for good?
338
- field_name: list[str]
339
- # source_id: mising / remove for good?
340
- line_name: list[str]
341
- scan_number: list[int]
342
- source_name: list[str]
343
- polarization_setup: list[str]
344
- num_lines: int
345
- obs_mode: list[str]
346
- taql: Optional[str]
347
-
348
-
349
- @dict_schema
350
- class ObservationInfoDict:
351
- observer: list
352
- """List of observer names."""
353
- project: str
354
- """Project Code/Project_UID"""
355
- release_data: str
356
- """Project release date. This is the date on which the data may become
357
- public. Format: YYYY-MM-DDTHH:mm:ss.SSS (ISO 8601)"""
358
- execution_block_id: Optional[str]
359
- """ ASDM: Indicates the position of the execution block in the project
360
- (sequential numbering starting at 1). """
361
- execution_block_number: Optional[str]
362
- """ASDM: Indicates the position of the execution block in the project
363
- (sequential numbering starting at 1)."""
364
- execution_block_UID: Optional[str]
365
- """ASDM: The archive’s UID of the execution block."""
366
- session_reference: Optional[str]
367
- """ASDM: The observing session reference."""
368
- observing_script: Optional[str]
369
- """ASDM: The text of the observation script."""
370
- observing_script_UID: Optional[str]
371
- """ASDM: A reference to the Entity which contains the observing script."""
372
- observing_log: Optional[str]
373
- """ASDM: Logs of the observation during this execu- tion block."""
374
-
375
-
376
- @dict_schema
377
- class ProcessorInfoDict:
378
- type: str
379
- """Processor type; reserved keywords include (”CORRELATOR” -
380
- interferometric correlator; ”SPECTROMETER” - single-dish correlator;
381
- ”RADIOMETER” - generic detector/integrator)."""
382
- sub_type: str
383
- """Processor sub-type, e.g. ”GBT” or ”JIVE”."""
384
-
385
-
386
- @xarray_dataarray_schema
387
- class BaselineArray:
388
- """TODO: documentation"""
389
-
390
- data: Data[BaselineId, Union[numpy.int64, numpy.int32]]
391
- """Unique id for each baseline."""
392
- long_name: Optional[Attr[str]] = "Baseline ID"
393
-
394
-
395
- @xarray_dataarray_schema
396
- class BaselineAntennaNameArray:
397
- """Array of antenna_name by baseline_id, as used in main_xds and main_sd_xds
398
- (antenna_name by baseline_id dim"""
399
-
400
- data: Data[BaselineId, str]
401
- """Unique id for each baseline."""
402
- long_name: Optional[Attr[str]] = "Antenna name by baseline_id"
403
-
404
-
405
- @xarray_dataarray_schema
406
- class AntennaNameArray:
407
- """TODO: documentation"""
408
-
409
- data: Data[AntennaName, str]
410
- """Unique name for each antenna(_station)."""
411
- long_name: Optional[Attr[str]] = "Antenna name"
412
-
413
-
414
- @xarray_dataset_schema
415
- class DopplerXds:
416
- # TODO
417
- pass
418
-
419
-
420
- @xarray_dataarray_schema
421
- class FrequencyArray:
422
- """TODO: documentation"""
423
-
424
- data: Data[Frequency, float]
425
- """ Time, expressed in SI seconds since the epoch. """
426
- spectral_window_name: Attr[str]
427
- """ Name associated with spectral window. """
428
- frequency_group_name: Optional[Attr[str]]
429
- """ Name associated with frequency group - needed for multi-band VLBI fringe-fitting."""
430
- reference_frequency: Attr[SpectralCoordArray]
431
- """ A frequency representative of the spectral window, usually the sky
432
- frequency corresponding to the DC edge of the baseband. Used by the calibration
433
- system if a fixed scaling frequency is required or in algorithms to identify the
434
- observing band. """
435
- channel_width: Attr[QuantityArray] # Not SpectralCoord, as it is a difference
436
- """ The nominal channel bandwidth. Same units as data array (see units key). """
437
- doppler: Optional[Attr[DopplerXds]]
438
- """ Doppler tracking information """
439
-
440
- type: Attr[str] = "spectral_coord"
441
- """ Coordinate type. Should be ``"spectral_coord"``. """
442
- long_name: Optional[Attr[str]] = "Frequency"
443
- """ Long-form name to use for axis"""
444
- units: Attr[list[str]] = ("Hz",)
445
- """ Units to associate with axis"""
446
- frame: Attr[str] = "icrs"
447
- """
448
- Astropy velocity reference frames (see :external:ref:`astropy-spectralcoord`).
449
- Note that Astropy does not use the name
450
- 'topo' (telescope centric) velocity frame, rather it assumes if no velocity
451
- frame is given that this is the default.
452
- """
453
-
454
-
455
- @xarray_dataarray_schema
456
- class PolarizationArray:
457
- """
458
- Possible correlations that can be formed from polarised receptors. Possible
459
- values, taken from `Measures/Stokes.h
460
- <https://github.com/casacore/casacore/blob/5a8df94738bdc36be27e695d7b14fe949a1cc2df/measures/Measures/Stokes.h>`_:
461
-
462
- * ``I``, ``Q``, ``U``, ``V`` (standard stokes parameters)
463
- * ``RR``, ``RL``, ``LR``, ``LL`` (circular correlation products)
464
- * ``XX``, ``XY``, ``YX``, ``YY`` (linear correlation products)
465
- * ``RX``, ``RY``, ``LX``, ``LY``, ``XR``, ``XL``, ``YR``, ``YL`` (mixed correlation products)
466
- * ``PP``, ``PQ``, ``QP``, ``QQ`` (general quasi-orthogonal correlation products)
467
- * ``RCircular``, ``LCircular``, ``Linear`` (single dish polarization types)
468
- * ``Ptotal`` (polarized intensity: ``sqrt(Q²+U²+V²)``)
469
- * ``Plinear`` (linearly polarized intensity: ``sqrt(Q²+U²)``)
470
- * ``PFtotal`` (polarization fraction: ``Ptotal/I``)
471
- * ``PFlinear`` (linear polarization fraction: ``Plinear/I``)
472
- * ``Pangle`` (linear polarization angle: ``0.5 arctan(U/Q)`` in radians)
473
-
474
- """
475
-
476
- data: Data[Polarization, str]
477
- """ Polarization names. """
478
- long_name: Optional[Attr[str]] = "Polarization"
479
- """ Long-form name to use for axis. Should be ``"Polarization"``"""
480
-
481
-
482
- @xarray_dataarray_schema
483
- class UvwLabelArray:
484
- """
485
- Coordinate axis to make up ``("u", "v", "w")`` tuple, see :py:class:`UvwArray`.
486
- """
487
-
488
- data: Data[UvwLabel, str] = ("u", "v", "w")
489
- """Should be ``('u','v','w')``, used by :py:class:`UvwArray`"""
490
- long_name: Optional[Attr[str]] = "U/V/W label"
491
- """ Long-form name to use for axis. Should be ``"U/V/W label"``"""
492
-
493
-
494
- # Data variables
495
- @xarray_dataarray_schema
496
- class VisibilityArray:
497
- """TODO: documentation"""
498
-
499
- data: Data[
500
- tuple[Time, BaselineId, Frequency, Polarization],
501
- Union[numpy.complex64, numpy.complex128],
502
- ]
503
-
504
- time: Coord[tuple[()], TimeCoordArray]
505
- baseline_id: Coord[tuple[()], BaselineArray]
506
- polarization: Coord[tuple[()], PolarizationArray]
507
- frequency: Coord[tuple[()], FrequencyArray]
508
- time: Coord[ZD, TimeCoordArray]
509
- baseline_id: Coord[ZD, BaselineArray]
510
- polarization: Coord[ZD, PolarizationArray]
511
- frequency: Coord[ZD, FrequencyArray]
512
-
513
- field_and_source_xds: Attr[FieldSourceXds]
514
- long_name: Optional[Attr[str]] = "Visibility values"
515
- """ Long-form name to use for axis. Should be ``"Visibility values"``"""
516
- units: Attr[list[str]] = ("Jy",)
517
-
518
-
519
- @xarray_dataarray_schema
520
- class SpectrumArray:
521
- """Definition of xr.DataArray for SPECTRUM data (single dish)"""
522
-
523
- data: Data[
524
- tuple[Time, AntennaName, Frequency, Polarization],
525
- Union[numpy.float64, numpy.float32, numpy.float16],
526
- ]
527
-
528
- time: Coordof[TimeCoordArray]
529
- antenna_name: Coordof[AntennaNameArray]
530
- frequency: Coordof[FrequencyArray]
531
- polarization: Coordof[PolarizationArray]
532
-
533
- field_and_source_xds: Attr[FieldSourceXds]
534
- long_name: Optional[Attr[str]] = "Spectrum values"
535
- """ Long-form name to use for axis. Should be ``"Spectrum values"``"""
536
- units: Attr[list[str]] = ("Jy",)
537
-
538
-
539
- @xarray_dataarray_schema
540
- class FlagArray:
541
- """
542
- An array of Boolean values with the same shape as `VISIBILITY`,
543
- representing the cumulative flags applying to this data matrix. Data are
544
- flagged bad if the ``FLAG`` array element is ``True``.
545
- """
546
-
547
- data: Data[
548
- Union[
549
- tuple[Time, BaselineId, Frequency, Polarization],
550
- tuple[Time, BaselineId, Frequency],
551
- tuple[Time, BaselineId],
552
- tuple[Time, AntennaName, Frequency, Polarization], # SD
553
- ],
554
- bool,
555
- ]
556
- time: Coordof[TimeCoordArray]
557
- baseline_id: Optional[Coordof[BaselineArray]] # Only IF
558
- antenna_name: Optional[Coordof[AntennaNameArray]] # Only SD
559
- frequency: Coordof[FrequencyArray]
560
- polarization: Optional[Coordof[PolarizationArray]] = None
561
- long_name: Optional[Attr[str]] = "Visibility flags"
562
-
563
-
564
- @xarray_dataarray_schema
565
- class WeightArray:
566
- """
567
- The weight for each channel, with the same shape as the associated
568
- :py:class:`VisibilityArray`, as assigned by the correlator or processor.
569
-
570
- Weight spectrum in ms v2 is renamed weight. Should be calculated as
571
- 1/sigma^2 (sigma rms noise).
572
- """
573
-
574
- data: Data[
575
- Union[
576
- tuple[Time, BaselineId, Frequency, Polarization],
577
- tuple[Time, BaselineId, Frequency],
578
- tuple[Time, BaselineId],
579
- tuple[Time, AntennaName, Frequency, Polarization], # SD
580
- ],
581
- Union[numpy.float16, numpy.float32, numpy.float64],
582
- ]
583
- """Visibility weights"""
584
- time: Coordof[TimeCoordArray]
585
- baseline_id: Optional[Coordof[BaselineArray]] # Only IF
586
- antenna_name: Optional[Coordof[AntennaNameArray]] # Only SD
587
- frequency: Optional[Coordof[FrequencyArray]] = None
588
- polarization: Optional[Coordof[PolarizationArray]] = None
589
- long_name: Optional[Attr[str]] = "Visibility weights"
590
-
591
-
592
- @xarray_dataarray_schema
593
- class UvwArray:
594
- """
595
- Coordinates for the baseline from ``baseline_antenna2_id`` to
596
- ``baseline_antenna1_id``, i.e. the baseline is equal to the difference
597
- ``POSITION2 - POSITION1``. The UVW given are for the ``TIME_CENTROID``, and
598
- correspond in general to the reference type for the
599
- ``field_info.phase_dir``.
600
-
601
- The baseline direction should be: ``W`` towards source direction; ``V`` in
602
- plane through source and system's pole; ``U`` in direction of increasing
603
- longitude coordinate. So citing
604
- http://casa.nrao.edu/Memos/CoordConvention.pdf: Consider an XYZ Celestial
605
- coordinate system centered at the location of the interferometer, with
606
- :math:`X` towards the East, :math:`Z` towards the NCP and :math:`Y` to
607
- complete a right-handed system. The UVW coordinate system is then defined
608
- by the hour-angle and declination of the phase-reference direction such
609
- that
610
-
611
- #. when the direction of observation is the NCP (`ha=0,dec=90`),
612
- the UVW coordinates are aligned with XYZ,
613
- #. V, W and the NCP are always on a Great circle,
614
- #. when W is on the local meridian, U points East
615
- #. when the direction of observation is at zero declination, an
616
- hour-angle of -6 hours makes W point due East.
617
-
618
- This definition also determines the sign of the phase of ``VISIBILITY``.
619
-
620
- """
621
-
622
- data: Data[
623
- Union[
624
- tuple[Time, BaselineId, Frequency, Polarization, UvwLabel],
625
- tuple[Time, BaselineId, Frequency, UvwLabel],
626
- tuple[Time, BaselineId, UvwLabel],
627
- tuple[Time, AntennaName, UvwLabel], # SD
628
- tuple[Time, AntennaName, Frequency, UvwLabel], # SD
629
- tuple[Time, AntennaName, Frequency, Polarization], # SD
630
- ],
631
- Union[
632
- numpy.float16,
633
- numpy.float32,
634
- numpy.float64,
635
- ],
636
- ]
637
- """Baseline coordinates from ``baseline_antenna2_id`` to ``baseline_antenna1_id``"""
638
- time: Coordof[TimeCoordArray]
639
- baseline_id: Optional[Coordof[BaselineArray]] # Only IF
640
- antenna_name: Optional[Coordof[AntennaNameArray]] # Only SD
641
- frequency: Optional[Coordof[FrequencyArray]] = None
642
- polarization: Optional[Coordof[PolarizationArray]] = None
643
- uvw_label: Coordof[UvwLabelArray] = ("u", "v", "w")
644
- long_name: Optional[Attr[str]] = "Baseline coordinates"
645
- """ Long-form name to use for axis. Should be ``"Baseline coordinates``"""
646
- units: Attr[list[str]] = ("m",)
647
-
648
-
649
- @xarray_dataarray_schema
650
- class TimeSamplingArray:
651
- """TODO: documentation"""
652
-
653
- data: Data[
654
- Union[
655
- tuple[Time, BaselineId, Frequency, Polarization],
656
- tuple[Time, BaselineId, Frequency],
657
- tuple[Time, BaselineId],
658
- tuple[Time, AntennaName], # SD
659
- ],
660
- float,
661
- ]
662
-
663
- time: Coordof[TimeCoordArray]
664
- baseline_id: Optional[Coordof[BaselineArray]] # Only IF
665
- antenna_name: Optional[Coordof[AntennaNameArray]] # Only SD
666
- frequency: Optional[Coordof[FrequencyArray]] = None
667
- polarization: Optional[Coordof[PolarizationArray]] = None
668
-
669
- scale: Attr[str] = "tai"
670
- """ Astropy time scales, see :py:class:`astropy.time.Time` """
671
- format: Attr[str] = "unix"
672
- """ Astropy format, see :py:class:`astropy.time.Time`. Default seconds from 1970-01-01 00:00:00 UTC """
673
-
674
- long_name: Optional[Attr[str]] = "Time sampling data"
675
- units: Attr[list[str]] = ("s",)
676
-
677
-
678
- @xarray_dataarray_schema
679
- class FreqSamplingArray:
680
- """TODO: documentation"""
681
-
682
- data: Data[
683
- Union[
684
- tuple[Time, BaselineId, Frequency, Polarization],
685
- tuple[Time, BaselineId, Frequency],
686
- tuple[Time, Frequency],
687
- tuple[Frequency],
688
- ],
689
- float,
690
- ]
691
- """
692
- Data about frequency sampling, such as centroid or integration
693
- time. Concrete function depends on concrete data array within
694
- :py:class:`VisibilityXds`.
695
- """
696
- frequency: Coordof[FrequencyArray]
697
- time: Optional[Coordof[TimeCoordArray]] = None
698
- baseline_id: Optional[Coordof[BaselineArray]] = None
699
- polarization: Optional[Coordof[PolarizationArray]] = None
700
- long_name: Optional[Attr[str]] = "Frequency sampling data"
701
- units: Attr[list[str]] = ("Hz",)
702
- frame: Attr[str] = "icrs"
703
- """
704
- Astropy velocity reference frames (see :external:ref:`astropy-spectralcoord`).
705
- Note that Astropy does not use the name
706
- 'topo' (telescope centric) velocity frame, rather it assumes if no velocity
707
- frame is given that this is the default.
708
- """
709
-
710
-
711
- # Data Sets
712
-
713
-
714
- @xarray_dataset_schema
715
- class AntennaXds:
716
- # Coordinates
717
- antenna_name: Coordof[AntennaNameArray]
718
- """ Antenna name """
719
- station: Coord[AntennaName, str]
720
- """ Name of the station pad (relevant to arrays with moving antennas). """
721
- mount: Coord[AntennaName, str]
722
- """ Mount type of the antenna. Reserved keywords include: ”EQUATORIAL” - equatorial mount;
723
- ”ALT-AZ” - azimuth-elevation mount;
724
- "ALT-AZ+ROTATOR" alt-az mount with feed rotator; introduced for ASKAP dishes;
725
- "ALT-AZ+NASMYTH-R": Nasmyth mount with receivers at the right-hand side of the cabin. Many high-frequency antennas used for VLBI have such a mount typel;
726
- "ALT-AZ+NASMYTH-L:: Nasmyth mount with receivers at the left-hand side of the cabin.
727
- ”X-Y” - x-y mount;
728
- ”SPACE-HALCA” - specific orientation model."""
729
- telescope_name: Optional[Coord[AntennaName, str]]
730
- """ Useful when data is combined from mutiple arrays for example ACA + ALMA. """
731
- # TODO: receptor_label, polarization_type, sky_dir_label set as optional
732
- # for datasets like test_alma_ephemris_mosaic. See also BEAM_OFFSET below.
733
- receptor_label: Optional[Coord[ReceptorLabel, str]]
734
- """ Names of receptors """
735
- polarization_type: Optional[Coord[tuple[AntennaName, ReceptorLabel], str]]
736
- """ Polarization type to which each receptor responds (e.g. ”R”,”L”,”X” or ”Y”).
737
- This is the receptor polarization type as recorded in the final correlated data (e.g. ”RR”); i.e.
738
- as measured after all polarization combiners. ['X','Y'], ['R','L'] """
739
- cartesian_pos_label: Optional[Coord[CartesianPosLabel, str]]
740
- """ (x,y,z) - either cartesian or ellipsoid """
741
- ellipsoid_pos_label: Optional[Coord[EllipsoidPosLabel, str]]
742
- """ (lon, lat, dist) - either cartesian or ellipsoid"""
743
- sky_dir_label: Optional[Coord[SkyDirLabel, str]]
744
- """ ra, dec """
745
- time: Optional[Coordof[TimeCoordArray]]
746
- """ Time for VLBI phase cal"""
747
- time_phase_cal: Optional[Coord[TimePhaseCal, numpy.float64]]
748
- """ Time for VLBI phase cal"""
749
- tone_label: Optional[Coord[ToneLabel, str]]
750
- """ ? """
751
- gain_curve_type: Optional[Coord[AntennaName, str]]
752
- """ ? """
753
-
754
- # Data variables
755
- ANTENNA_POSITION: Data[
756
- Union[
757
- tuple[AntennaName, EllipsoidPosLabel], tuple[AntennaName, CartesianPosLabel]
758
- ],
759
- QuantityArray,
760
- ] # EarthLocationArray
761
- """
762
- In a right-handed frame, X towards the intersection of the equator and
763
- the Greenwich meridian, Z towards the pole.
764
- """
765
- ANTENNA_FEED_OFFSET: Data[
766
- Union[
767
- tuple[AntennaName, EllipsoidPosLabel], tuple[AntennaName, CartesianPosLabel]
768
- ],
769
- QuantityArray,
770
- ]
771
- """
772
- Offset of feed relative to position (``Antenna_Table.offset + Feed_Table.position``).
773
- """
774
- ANTENNA_DISH_DIAMETER: Optional[Data[tuple[AntennaName], QuantityArray]]
775
- """
776
- Nominal diameter of dish, as opposed to the effective diameter.
777
- """
778
- ANTENNA_EFFECTIVE_DISH_DIAMETER: Optional[
779
- Data[tuple[AntennaName, ReceptorLabel, SkyDirLabel], QuantityArray]
780
- ]
781
- """ Airy Disk Model .... """
782
-
783
- # TODO: setting BEAM_OFFSET and RECEPTOR_ANGLE as optional for now, as it
784
- # is not present in some datasets (example: test_alma_ephemris_mosaic)
785
- BEAM_OFFSET: Optional[Data[tuple[AntennaName, ReceptorLabel], SkyCoordArray]]
786
- """
787
- Beam position offset, as defined on the sky but in the antenna
788
- reference frame.
789
- """
790
- RECEPTOR_ANGLE: Optional[Data[tuple[AntennaName, ReceptorLabel], QuantityArray]]
791
- """
792
- Polarization reference angle. Converts into parallactic angle in the sky domain.
793
- """
794
- FOCUS_LENGTH: Optional[Data[tuple[AntennaName], QuantityArray]]
795
- """
796
- Focus length. As defined along the optical axis of the antenna.
797
- """
798
-
799
- GAIN_CURVE: Optional[
800
- Data[tuple[AntennaName, ReceptorLabel, PolyTerm], numpy.float32]
801
- ]
802
- """ VLBI. ? """
803
- GAIN_CURVE_INTERVAL: Optional[Data[tuple[AntennaName], QuantityArray]]
804
- """ VLBI. ? """
805
- GAIN_CURVE_SENSITIVITY: Optional[
806
- Data[tuple[AntennaName, ReceptorLabel], numpy.float32]
807
- ]
808
- """ VLBI. ? """
809
- PHASE_CAL: Optional[
810
- Data[
811
- Union[
812
- tuple[AntennaName, Time, ReceptorLabel, ToneLabel],
813
- tuple[AntennaName, TimePhaseCal, ReceptorLabel, ToneLabel],
814
- ],
815
- numpy.complex64,
816
- ]
817
- ]
818
- """ VLBI. ? """
819
- PHASE_CAL_CABLE_CAL: Optional[
820
- Data[
821
- Union[tuple[AntennaName, Time], tuple[AntennaName, TimePhaseCal]],
822
- QuantityArray,
823
- ]
824
- ]
825
- """ VLBI. ? """
826
- PHASE_CAL_INTERVAL: Optional[
827
- Data[
828
- Union[tuple[AntennaName, Time], tuple[AntennaName, TimePhaseCal]],
829
- QuantityArray,
830
- ]
831
- ]
832
- """ VLBI. ? """
833
- PHASE_CAL_TONE_FREQUENCY: Optional[
834
- Data[
835
- Union[
836
- tuple[AntennaName, Time, ReceptorLabel, ToneLabel],
837
- tuple[AntennaName, TimePhaseCal, ReceptorLabel, ToneLabel],
838
- ],
839
- QuantityArray,
840
- ]
841
- ]
842
- """ VLBI. ? """
843
-
844
- # Attributes
845
- overall_telescope_name: Optional[Attr[str]]
846
- """
847
- The name of the collection of arrays and dishes that were used for the observation.
848
- In many instances this will only be a single array or dish. An example of a
849
- telescope consistening of mutiple arrays and dishes is the EHT. The coordinate
850
- telescope_name will give the names of the constituent arrays and dishes. From
851
- MSv2 observation table.
852
- """
853
- relocatable_antennas: Optional[Attr[bool]]
854
- """ Can the antennas be moved (ALMA, VLA, NOEMA) """
855
- type: Attr[str] = "antenna"
856
- """
857
- Type of dataset. Expected to be ``antenna``
858
- """
859
-
860
-
861
- @xarray_dataset_schema
862
- class WeatherXds:
863
- """Weather. Contains station positions and time-dependent mean external
864
- atmosphere and weather information"""
865
-
866
- # Coordinates
867
- time: Coordof[TimeCoordArray]
868
- """ Mid-point of the time interval """
869
- station_id: Coord[StationId, numpy.int64]
870
- """ Station identifier """
871
- antenna_name: Optional[Coordof[AntennaNameArray]]
872
- """ Antenna identifier """
873
-
874
- # Data variables (all optional)
875
- H2O: Optional[Data[tuple[StationId, Time], QuantityArray]] = None
876
- """ Average column density of water """
877
- IONOS_ELECTRON: Optional[Data[tuple[StationId, Time], QuantityArray]] = None
878
- """ Average column density of electrons """
879
- PRESSURE: Optional[Data[tuple[StationId, Time], QuantityArray]] = None
880
- """ Ambient atmospheric pressure """
881
- REL_HUMIDITY: Optional[Data[tuple[StationId, Time], QuantityArray]] = None
882
- """ Ambient relative humidity """
883
- TEMPERATURE: Optional[Data[tuple[StationId, Time], QuantityArray]] = None
884
- """ Ambient air temperature for an antenna """
885
- DEW_POINT: Optional[Data[tuple[StationId, Time], QuantityArray]] = None
886
- """ Dew point """
887
- WIND_DIRECTION: Optional[Data[tuple[StationId, Time], QuantityArray]] = None
888
- """ Average wind direction """
889
- WIND_SPEED: Optional[Data[tuple[StationId, Time], QuantityArray]] = None
890
- """ Average wind speed """
891
- STATION_POSITION: Optional[Data[tuple[StationId], QuantityArray]] = None
892
- """ Station position """
893
-
894
- # Attributes
895
- type: Attr[str] = "weather"
896
- """
897
- Type of dataset.
898
- """
899
-
900
-
901
- @xarray_dataset_schema
902
- class PointingXds:
903
- time: Coordof[TimeCoordArray]
904
- """
905
- Mid-point of the time interval for which the information in this row is
906
- valid. Required to use the same time measure reference as in visibility dataset
907
- """
908
- antenna_name: Coordof[AntennaNameArray]
909
- """
910
- Antenna name, as specified by baseline_antenna1/2_name in visibility dataset
911
- """
912
- sky_dir_label: Coord[SkyDirLabel, str]
913
- """
914
- Direction labels.
915
- """
916
-
917
- BEAM_POINTING: Data[
918
- Union[tuple[Time, AntennaName, TimePolynomial], tuple[Time, AntennaName]],
919
- SkyCoordArray,
920
- ]
921
- """
922
- Antenna pointing direction, optionally expressed as polynomial coefficients. DIRECTION in MSv3.
923
- """
924
- DISH_MEASURED_POINTING: Optional[Data[tuple[Time, AntennaName], SkyCoordArray]]
925
- """
926
- The current encoder values on the primary axes of the mount type for
927
- the antenna. ENCODER in MSv3.
928
- """
929
- OVER_THE_TOP: Optional[Data[tuple[Time, AntennaName], bool]]
930
-
931
-
932
- @xarray_dataset_schema
933
- class SpectralCoordXds:
934
- # TODO
935
- pass
936
-
937
-
938
- @xarray_dataset_schema
939
- class PhasedArrayXds:
940
- # TODO
941
- pass
942
-
943
-
944
- @xarray_dataset_schema
945
- class SystemCalibrationXds:
946
- """System calibration. Contains time- and frequency- variable
947
- calibration measurements for each antenna, as indexed on receptor"""
948
-
949
- # Coordinates
950
- antenna_name: Coordof[AntennaNameArray]
951
- """ Antenna identifier """
952
- time: Coordof[TimeCoordArray]
953
- """ Midpoint of time for which this set of parameters is accurate """
954
- receptor_id: Optional[Coord[ReceptorId, numpy.float64]] = None
955
- """ """
956
- frequency: Optional[Coordof[FrequencyArray]] = None
957
- """ """
958
-
959
- # Data variables (all optional)
960
- PHASE_DIFFERENCE: Optional[Data[tuple[Time, AntennaName], numpy.float64]] = None
961
- """ Phase difference between receptor 0 and receptor 1 """
962
- TCAL: Optional[
963
- Data[tuple[Time, AntennaName, ReceptorId, Frequency], QuantityArray]
964
- ] = None
965
- """ Calibration temp """
966
- TRX: Optional[
967
- Data[tuple[Time, AntennaName, ReceptorId, Frequency], QuantityArray]
968
- ] = None
969
- """ Receiver temperature """
970
- TSKY: Optional[
971
- Data[tuple[Time, AntennaName, ReceptorId, Frequency], QuantityArray]
972
- ] = None
973
- """ Sky temperature """
974
- TSYS: Optional[
975
- Data[tuple[Time, AntennaName, ReceptorId, Frequency], QuantityArray]
976
- ] = None
977
- """ System temperature """
978
- TANT: Optional[
979
- Data[tuple[Time, AntennaName, ReceptorId, Frequency], QuantityArray]
980
- ] = None
981
- """ Antenna temperature """
982
- TANT_SYS: Optional[
983
- Data[tuple[Time, AntennaName, ReceptorId, Frequency], QuantityArray]
984
- ] = None
985
- """ TANT/TSYS """
986
-
987
- # Attributes
988
- type: Attr[str] = "system_calibration"
989
- """
990
- Type of dataset.
991
- """
992
-
993
-
994
- @xarray_dataset_schema
995
- class VisibilityXds:
996
- """TODO: documentation"""
997
-
998
- # --- Required Coordinates ---
999
- time: Coordof[TimeCoordArray]
1000
- """
1001
- The time coordinate is the mid-point of the nominal sampling interval, as
1002
- specified in the ``ms_v4.time.attrs['integration_time']`` (ms v2 interval).
1003
- """
1004
- baseline_id: Optional[Coordof[BaselineArray]] # IF. not present in main_sd_xds
1005
- """ Baseline ID """
1006
- antenna_name: Optional[
1007
- Coordof[AntennaNameArray]
1008
- ] # Single-dish. not present in main_xds
1009
- """ antenna_name """
1010
- frequency: Coordof[FrequencyArray]
1011
- """Center frequencies for each channel."""
1012
- polarization: Coordof[PolarizationArray]
1013
- """
1014
- Labels for polarization types, e.g. ``['XX','XY','YX','YY']``, ``['RR','RL','LR','LL']``.
1015
- """
1016
- uvw_label: Optional[Coordof[UvwLabelArray]]
1017
- """ u,v,w """
1018
- baseline_antenna1_name: Optional[Coordof[BaselineAntennaNameArray]] # IF
1019
- """Antenna name for 1st antenna in baseline. Maps to ``attrs['antenna_xds'].antenna_name``"""
1020
- baseline_antenna2_name: Optional[Coordof[BaselineAntennaNameArray]] # IF
1021
- """Antenna name for 2nd antenna in baseline. Maps to ``attrs['antenna_xds'].antenna_name``"""
1022
-
1023
- # --- Required Attributes ---
1024
- partition_info: Attr[PartitionInfoDict]
1025
- antenna_xds: Attr[AntennaXds]
1026
-
1027
- # --- Optional Coordinates ---
1028
- scan_number: Optional[Coord[Time, Union[numpy.int64, numpy.int32]]] = None
1029
- """Arbitary scan number to identify data taken in the same logical scan."""
1030
-
1031
- # --- Required data variables ---
1032
-
1033
- # --- Optional data variables / arrays ---
1034
-
1035
- # Either VISIBILITY (interferometry) or SPECTRUM (single-dish)
1036
- VISIBILITY: Optional[Dataof[VisibilityArray]] = None
1037
- """Complex visibilities, either simulated or measured by interferometer."""
1038
- SPECTRUM: Optional[Dataof[SpectrumArray]] = None
1039
- """Single dish data, either simulated or measured by an antenna."""
1040
-
1041
- VISIBILITY_CORRECTED: Optional[Dataof[VisibilityArray]] = None
1042
- VISIBILITY_MODEL: Optional[Dataof[VisibilityArray]] = None
1043
- SPECTRUM_CORRECTED: Optional[Dataof[SpectrumArray]] = None
1044
-
1045
- FLAG: Optional[Dataof[FlagArray]] = None
1046
- WEIGHT: Optional[Dataof[WeightArray]] = None
1047
- UVW: Optional[Dataof[UvwArray]] = None
1048
- EFFECTIVE_INTEGRATION_TIME: Optional[
1049
- Data[
1050
- Union[
1051
- tuple[Time, BaselineId],
1052
- tuple[Time, BaselineId, Frequency],
1053
- tuple[Time, BaselineId, Frequency, Polarization],
1054
- tuple[Time, AntennaName], # SD
1055
- tuple[Time, AntennaName, Frequency], # SD
1056
- tuple[Time, AntennaName, Frequency, Polarization], # SD
1057
- ],
1058
- QuantityArray,
1059
- ]
1060
- ] = None
1061
- """
1062
- The integration time, including the effects of missing data, in contrast to
1063
- ``integration_time`` attribute of the ``time`` coordinate,
1064
- see :py:class:`TimeArray`. (MS v2: ``exposure``).
1065
- """
1066
- TIME_CENTROID: Optional[Dataof[TimeSamplingArray]] = None
1067
- """
1068
- The time centroid of the visibility, includes the effects of missing data
1069
- unlike the ``time`` coordinate, see :py:class:`TimeArray`.
1070
- """
1071
- TIME_CENTROID_EXTRA_PRECISION: Optional[Dataof[TimeSamplingArray]] = None
1072
- """Additional precision for ``TIME_CENTROID``"""
1073
- EFFECTIVE_CHANNEL_WIDTH: Optional[Dataof[FreqSamplingArray]] = None
1074
- """The channel bandwidth that includes the effects of missing data."""
1075
- FREQUENCY_CENTROID: Optional[Dataof[FreqSamplingArray]] = None
1076
- """Includes the effects of missing data unlike ``frequency``."""
1077
-
1078
- # --- Optional Attributes ---
1079
- observation_info: Optional[Attr[ObservationInfoDict]] = None
1080
- processor_info: Optional[Attr[ProcessorInfoDict]] = None
1081
- weather_xds: Optional[Attr[WeatherXds]] = None
1082
- pointing_xds: Optional[Attr[PointingXds]] = None
1083
- phased_array_xds: Optional[Attr[PhasedArrayXds]] = None
1084
- system_calibration_xds: Optional[Attr[SystemCalibrationXds]] = None
1085
-
1086
- version: Optional[Attr[str]] = None # TODO:
1087
- """Semantic version of xradio data format"""
1088
- creation_date: Optional[Attr[str]] = None
1089
- """Date visibility dataset was created . Format: YYYY-MM-DDTHH:mm:ss.SSS (ISO 8601)"""
1090
- intent: Optional[Attr[str]] = None
1091
- """Identifies the intention of the scan, such as to calibrate or observe a
1092
- target. See :ref:`scan intents` for possible values.
1093
- """
1094
- data_description_id: Optional[Attr[str]] = None
1095
- """
1096
- The id assigned to this combination of spectral window and polarization setup.
1097
- """
1098
-
1099
- type: Attr[str] = "visibility"
1100
- """
1101
- Dataset type
1102
- """