diff --git a/CHANGELOG.md b/CHANGELOG.md
index b5d74636..7ac68632 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,19 +6,26 @@ Added new observing capabilities for limb sounding, ground-based radar, fixed su
Added:
- Analysis method `collect_limb_observations` (with enumeration `ScanDirection`) for limb sounding observations from periodic scans at a constant angular rate.
- - Analysis method `collect_space_observations` for the periods when satellites can observe other satellites (as by a sensor or a radio frequency link), subject to slant range limits and Earth occlusion (a minimum WGS 84 geodetic altitude of the line of sight). Each observation records the lines of sight at its start and end as its geometry.
+ - Analysis method `collect_space_observations` for the periods when satellites can observe other satellites (as by a sensor or a radio frequency link), subject to slant range limits and Earth occlusion (a minimum WGS 84 geodetic altitude of the line of sight). Each observation records the lines of sight at its start and end as its geometry, and the satellites' closest approach during the period (`closest_time` and `closest_range`).
- Object schemas `RadarStation` (with `RadarBand` and `RadarStation.from_band`) and `TerrainMask`, and analysis methods `collect_radar_track` and `compute_radar_track`, for ground-based radar coverage. `AllSurfaceObjects` includes `RadarStation`.
- Object schema `SurfacePlatform` (included in `AllSurfaceObjects`) for instruments on platforms fixed above the Earth's surface, such as towers or tethered balloons, with a `heading` that orients their views, and analysis methods `collect_platform_track` and `compute_platform_track` for the static footprints of their `Instrument` and `PointedInstrument` views at a target elevation, either below the instruments (looking down) or above them (looking up, as at clouds), with views clipped to the horizon of the ground below (argument `ground_elevation` of the footprint and pixel methods) and to an optional `terrain_mask` (a `TerrainMask`, as for a `RadarStation`), with method `SurfacePlatform.compute_visible_region` for the region of a target above the instruments visible over them. Utility method `compute_static_track` gives a fixed position the form of an orbit track, from which instruments project their views as from a satellite.
- Module `preprocess` to derive inputs from external datasets, including terrain masks from Copernicus DEM data (`compute_terrain_mask`, `compute_terrain_mask_for_station`, `compute_terrain_mask_for_platform`, `get_copernicus_dem_tile_urls`, and `sample_dem_elevation`, with an `effective_earth_radius_factor` for refraction, also an argument of `compute_terrain_elevation_angle`), and gridded weights from GeoTIFF rasters (`read_raster_weights`).
- Generation method `generate_points_random` for random points, uniform by area or weighted by a raster (for example, of population counts or densities), optionally within a mask, with a seed for reproducibility.
- Analysis methods `collect_region_observations` and `collect_multi_region_observations` to collect the periods (start and end) when an instrument observes any part of a region (shapely `Polygon` or `MultiPolygon`), using the footprints of pointed and conical instruments and the field of regard of other instruments. Each observation records its swath (the part of the region swept by the footprint) as its geometry and identifies the region by the hash of its geometry (`target_hash`). Methods `aggregate_observations` and `reduce_observations` combine the swaths of a region into the part of it observed.
- - Analysis methods `find_coincident_observations`, the periods when two or more satellites observe the same point at once (or within a maximum time difference), and `find_coincident_ground_track`, the overlapping footprints of pairs of satellites at the same time (or within a maximum time difference), with example notebook `FindCoincidentObservations` (Metop-SG-B ICI and NASA FALCON).
+ - Analysis methods `find_coincident_observations`, the periods when two or more satellites observe the same point at once (or within a maximum time difference), comparing their observation periods or, with `instantaneous`, their epochs (as the times scanning instruments sample the point), and `find_coincident_ground_track`, the overlapping footprints of pairs of satellites at the same time (or within a maximum time difference), with example notebook `FindCoincidentObservations` (Metop-SG-B ICI and NASA FALCON).
+ - Analysis method `collect_feature_observations` for the observations of features: regions that exist for a period of time (`start` to `end`), such as the storms of a nature run in an observing system simulation experiment (OSSE), sampled by the footprints of the ground track. Each observation is a satellite's view of the part of a feature inside its swath, with the fraction and area viewed and the viewing geometry (elevation angle, azimuth, slant range, and satellite height) at the viewed part.
+ - Analysis method `compute_sample_sizes` for the sizes of the samples of point or feature observations: the extent on the ground of a `PointedInstrument`'s pixel at each target, along and across track, and the spacing between pixels (which bound the detail an observation can resolve), with the satellite's slant range and the target's scan angle. Methods `PointedInstrument.compute_sample_size`, `compute_sample_spacing`, `get_cross_track_sample_spacing`, and `get_along_track_sample_spacing`, and utility method `compute_ground_sample_size` (the size on the ground of an angular extent centered on the line of sight to a target). Field `PointedInstrument.scan_period` for scanning instruments, whose scans are spaced along track by the distance they advance on the ground in one period (as for microwave sounders with one beam per scan position), and utility method `compute_ground_advance`.
+ - Fields `ConicalInstrument.beam_width` and `scan_sample_spacing`, and methods `ConicalInstrument.compute_sample_size` (the footprint of the beam, longer in the oblique direction of the view) and `compute_sample_spacing` (the distance the scanned arc advances per scan, and between samples along the arc), for the sample sizes of conical scanners.
- Analysis methods `compute_access_periods`, the periods when a satellite is in view of a point above a minimum elevation angle, and `compute_region_access_periods`, a conservative superset of the periods when an instrument's field of regard may observe any part of a region (for example, to cull analysis times).
- Support for shapely `Point` objects (longitude, latitude, and optional elevation) wherever a TAT-C `Point` is accepted (`collect_observations`, `collect_multi_observations`, `compute_dop`, and `GeneralPerturbationsOrbit.get_observation_events`), in anticipation of replacing TAT-C points.
- Object schema `ConicalInstrument` (included in `AllInstruments`) for conically scanning instruments, observed when a point crosses the scanned cone, and utility method `compute_cone_and_azimuth`.
+ - Object schemas `Attitude` and `AttitudeSchedule` (with `AttitudeSegment`), and field `attitude` of satellites and constellations, for the attitude of a spacecraft's body: its velocity frame (yaw steering) and yaw, roll, and pitch angles (constant or by argument of latitude), or a schedule of attitudes over time (for example, the yaw flips of a satellite that alternately flies forward and backward, or alternating observing modes). Instruments point relative to the body (their roll and pitch angles, scan azimuths, and pixels are measured from its axes), while their fields of regard remain measured from nadir. Method `get_instrument` of satellites and constellations gets an instrument bound to the attitude (see `Instrument.bind_attitude` and `Instrument.platform_attitude`), and projection utilities accept an `attitude`.
+ - Object schema `TargetAttitude` for a spacecraft that points its body at ground targets (as an agile satellite imaging sites, or a target mode): at each time, at the target closest to nadir within a maximum off-nadir angle, and otherwise along nadir, so that its instruments' views follow the targets. Schedules may switch to and from target pointing.
+ - Sun glint: utility methods `compute_specular_point` (the specular point, or center of the sun glint, on the WGS 84 ellipsoid seen from a satellite) and `compute_glint_angle` (the angle between the directions toward the satellite and of the Sun's specular reflection at a target); fields `Instrument.min_target_glint_angle` and `max_target_glint_angle` to avoid or require sun glint (for example, for ocean color or glint observations); a `glint_angle` column of observations and ground tracks with solar angles; and object schema `GlintAttitude` for a spacecraft that points its body at the specular point, or short of it toward nadir by an offset angle (constant or a function of the specular point's angle from nadir), as for a glint observing mode, which schedules may switch to and from.
- Instrument pointing options: fields `PointedInstrument.velocity_frame` (enumeration `VelocityFrame`, for spacecraft without yaw steering), `Instrument.nadir_reference` (enumeration `NadirReference`, for a geocentric nadir), `PointedInstrument.view_geometry` (enumeration `ViewGeometry`, for cross-track scanners), and `PointedInstrument.roll_angle_profile` and `pitch_angle_profile` (with methods `get_roll_angle` and `get_pitch_angle`) to vary pointing around the orbit. Projection functions accept matching arguments, including `tilt_angle`.
- Fields `Instrument.min_target_solar_elevation` and `Instrument.max_target_solar_elevation` to require a range of solar elevation angles at the target.
- Fields `GeneralPerturbationsOrbit.remove_drag`, to propagate without drag, and `GeneralPerturbationsOrbit.repeat_cycle`, to propagate the elements directly (`None`, the default), maintained on a repeat ground track with a repeat cycle found from the elements (`"auto"`), or with a declared repeat cycle (a duration), also accepted by `from_tle`, `from_omm_csv`, and `from_omm_json`. Related methods `GeneralPerturbationsOrbit.get_repeat_element` and `GeneralPerturbationsElements.get_repeat_element`, `refine_repeat_cycle`, `without_drag`, `is_sun_synchronous`, and property `has_drag`.
+ - Field `GeneralPerturbationsOrbit.element_switch_times` (with method `get_element_index`) to switch between elements at given times rather than midway between their epochs, and utility method `align_element_switches` to switch satellites whose elements are published together (as for a formation or a constellation) at common times, so that their relative positions do not jump while their elements switch at slightly different times.
- Field `inclination` of `MolniyaOrbit` and `TundraOrbit` (by default, the critical inclination), and methods `from_apogee_longitude` and `get_apogee_longitude` to place an orbit by the longitude of its apogee.
- Field `WalkerConstellation.seam_spacing` (and method `get_seam_spacing`) to set the seam of a star configuration.
- Argument `during_contact` of `compute_latencies` to choose when an observation that ends during a downlink is downlinked (`"end"`, `"next"`, or `"immediate"`).
@@ -40,9 +47,11 @@ Changed:
- `get_observation_events` completes passes whose rise or set Skyfield misses (grazing passes, which barely exceed the minimum elevation angle), finding the missing event from the culmination and dropping culminations below the minimum. `compute_access_periods` and `collect_observations` no longer treated such a pass as visible from the start (or to the end) of the analysis period, which made a conical instrument observe points through the Earth.
- `collect_observations` refines access periods to the instrument's field of regard, uses the time the view sweeps over the point as the epoch of a `PointedInstrument` observation, and evaluates orbits with a repeat cycle consistently.
- `collect_observations` and `collect_region_observations` accept one or more points or regions and one or more satellites, and `instrument_index=None` for every instrument of each satellite, computing all of their observations together (concatenated and sorted by start). `collect_multi_observations` and `collect_multi_region_observations` are kept as wrappers for backwards compatibility.
+ - `collect_observations` computes the observations of all points by each satellite and instrument together, vectorized across the points: the orbit is propagated once to screen the windows in which each point may be observed, and the periods, epochs, and validity of the observations are refined in all windows at once (in blocks that bound memory). Many points are about 50 times faster to collect (for example, 649 points, 24 satellites, and one day, from about 220 to 4.5 seconds), and a point's observations do not depend on the other points (to within a microsecond). Observation times are always in nanoseconds (`datetime64[ns, UTC]`), as are those of `collect_downlinks`.
- `collect_orbit_track`, `collect_ground_track`, `collect_ground_pixels`, `collect_limb_observations`, and `collect_downlinks` accept one or more satellites (and the track methods `instrument_index=None` for every instrument), and `collect_ro_observations` one or more receivers, with the results of several concatenated and sorted by time (or start). Downlinks and RO observations of several satellites are computed together.
- `PointedInstrument` roll and pitch angles rotate the view rigidly (roll, then pitch about the rolled cross-track axis), and `compute_view_tangents` accepts them. Documented the pointing conventions (positive roll looks left, positive pitch looks forward, and cross-track pixel indices run from right to left).
- `compute_latencies` downlinks an observation that ends during a downlink at the end of that downlink by default (`during_contact="end"`; formerly `"next"`).
+ - `PointedInstrument.cross_track_oversampling` and `along_track_oversampling` may be negative, for gaps between pixels (as of an undersampling sounder).
- `collect_ro_observations` uses the point of minimum WGS 84 geodetic altitude on the receiver-transmitter line as the tangent point.
- `SOCConstellation` uses the polar streets-of-coverage pattern for near-polar orbits (new field `polar` and methods `is_polar`, `get_footprint_angle`, `get_polar_design`, `get_satellites_per_plane`, and `get_number_planes`; `generate_walker` raises a `ValueError` for polar designs) and a continuously covering hexagonal lattice for inclined orbits, which requires more satellites at a given packing distance.
- `collect_ground_track` and `collect_ground_pixels` cull times with a mask using the periods when the instrument's field of regard may observe it, which no longer misses footprints near the poles or across the anti-meridian. Masks are split along the anti-meridian and poles before use, and results are sorted by time.
@@ -55,10 +64,18 @@ Changed:
- Fixed `TrainConstellation` for long intervals between members, and `MolniyaOrbit` and `TundraOrbit` periods to repeat the ground track as propagated.
- Fixed rectangular footprints of wide, elongated views.
- Fixed `PointedInstrument.compute_footprint_pixel_array` for a single-time (scalar) orbit track.
+ - Fixed `collect_observations` missing short observations (and misplacing the ends of long ones) when a field of regard extends to the horizon of a long access period, as near the perigee of a Molniya orbit, which were refined from too few samples of the access period.
+ - Fixed the pixel positions of a `PointedInstrument` with oversampling (`compute_projected_pixel_position`, `compute_footprint_pixel_array`, and `collect_ground_pixels`), which spaced the pixels by a fraction of the field of view rather than across all of it.
+ - Fixed `split_polygon` for polygons around a pole whose boundary is not monotonic in longitude (such as Antarctica's coastline), which it reconstructed by sorting their vertices by longitude, removing and adding strips of the polygon: they are now reconstructed in their vertex order, unrolled across the anti-meridian.
+ - Fixed `grid_observations` for cells whose points each have a single sample (and so no revisit), which raised an error, and to average the revisit of a cell over only the points with a revisit.
+ - Fixed `compute_ground_track` to identify orbits with the period of the element that propagates the orbit (as selected by `element_switch_times`), rather than the element whose epoch is closest.
+ - Fixed `collect_ro_observations` labeling some occultations of transmitters nearly abeam of the receiver (yaw angles near 90 degrees) as setting rather than rising: `is_rising` follows the direction of the tangent point through `sample_elevation`. `collect_ro_observations` also splits a grazing occultation, whose tangent point descends and rises again, into a setting and a rising observation where the tangent point turns, so that each observation crosses `sample_elevation` at most once.
+ - Fixed `compute_latencies` for observations and downlinks whose times have different units (for example, microseconds and nanoseconds).
- Fixed `split_polygon` for longitudes beyond 180 degrees, for polygons spanning -180 to 180 degrees of longitude, and for holes across the anti-meridian or around a pole (holes are now split like exteriors), and to drop degenerate (zero-area) parts left by repairing invalid polygons.
- Fixed cached orbit computations for copies with changed fields, and orbits and satellites to be picklable after propagation.
- Fixed numba-compiled utility methods (in `tatc.utils.orbital`, `observation`, `radar`, `atmosphere`, and `surface`) returning `nan` for integer inputs, which overflowed in compiled integer arithmetic (for example, `semimajor_axis_to_mean_motion(7000000)`): inputs are now converted to floats.
- Improved the performance of footprints (rays projected together from one view frame, vectorized ray and limb intersections, polygon assembly, splitting along the anti-meridian, and `split_polygon`), masked ground tracks, multi-element orbit propagation, `collect_ro_observations` (observation periods of all transmitters searched and sampled together, with sample times and profiles built at once), `collect_limb_observations` (all scans sampled together, with sample times built at once), radar footprints (terrain masks interpolated at all azimuths at once, and a closed-form local projection instead of PROJ transformers for each station), `collect_observations` (linear-time pairing of rise and set events, and validity checks of all epochs at once), `collect_region_observations` (validity checks and swaths of all periods at once), `collect_orbit_track` (masks tested and points built for all times at once), observations of several points, regions, or satellites (Earth orientation computed together at each step of their searches), rise and set times (each bracketed near Skyfield's estimate and bisected only until it is narrower than a millisecond), orbit propagation (IAU 2000A nutation angles interpolated from a cached table, to within about a microarcsecond, rather than computed for every time), instrument validity checks (without iterating over Skyfield times), and the searches that refine observation periods (times built from offsets without `datetime` objects). `to_datetime64_ns` and `GeneralPerturbationsOrbit.get_closest_element_index` accept Skyfield `Time` objects.
+ - `find_coincident_observations` and `aggregate_observations` compute all targets together rather than one at a time, with the same results: for a day of observations of about 100,000 to 250,000 points, in seconds rather than 5 to 13 minutes.
- `collect_region_observations` is about 3 times faster for detailed regions (for example, 30 days of observations of four regions of 2000 vertices each, from about 13 to 4 seconds), computing the distances to a region's boundary with a numba-compiled function.
- Numba-compiled functions cache their machine code (`cache=True`) in `__pycache__` directories next to the source files (or in the directory set by `NUMBA_CACHE_DIR`), so that new processes (for example, the workers of a multiprocessing pool) load rather than recompile them. After editing a constant or compiled function in an editable install, clear the cache (see the README).
- Unit tests run numba-compiled functions compiled rather than as Python (set `NUMBA_DISABLE_JIT=1` to include them in a coverage report).
diff --git a/docs/api_reference/analysis/coverage.rst b/docs/api_reference/analysis/coverage.rst
index 66e4e985..45bb8d75 100644
--- a/docs/api_reference/analysis/coverage.rst
+++ b/docs/api_reference/analysis/coverage.rst
@@ -25,6 +25,10 @@ Compute Region Access Periods
-----------------------------
.. autofunction:: tatc.analysis.compute_region_access_periods
+Compute Sample Sizes
+--------------------
+.. autofunction:: tatc.analysis.compute_sample_sizes
+
Aggregate Observations
----------------------
.. autofunction:: tatc.analysis.aggregate_observations
diff --git a/docs/api_reference/analysis/feature_coverage.rst b/docs/api_reference/analysis/feature_coverage.rst
new file mode 100644
index 00000000..e65e9a61
--- /dev/null
+++ b/docs/api_reference/analysis/feature_coverage.rst
@@ -0,0 +1,6 @@
+Feature Observations
+====================
+
+Collect Feature Observations
+----------------------------
+.. autofunction:: tatc.analysis.collect_feature_observations
diff --git a/docs/api_reference/analysis/index.rst b/docs/api_reference/analysis/index.rst
index 6657fe07..83bc1532 100644
--- a/docs/api_reference/analysis/index.rst
+++ b/docs/api_reference/analysis/index.rst
@@ -10,6 +10,7 @@ Analysis functions simulate mission operation to compute key performance metrics
coverage
track
coincidence
+ feature_coverage
latency
dop
ro_coverage
diff --git a/docs/api_reference/schemas/space.rst b/docs/api_reference/schemas/space.rst
index d3ca16a2..c8b13c3e 100644
--- a/docs/api_reference/schemas/space.rst
+++ b/docs/api_reference/schemas/space.rst
@@ -19,6 +19,33 @@ Conical Instrument
.. autopydantic_model:: tatc.schemas.ConicalInstrument
:members:
+Attitude
+--------
+
+.. autopydantic_model:: tatc.schemas.Attitude
+ :members:
+
+Target Attitude
+---------------
+
+.. autopydantic_model:: tatc.schemas.TargetAttitude
+ :members:
+
+Glint Attitude
+--------------
+
+.. autopydantic_model:: tatc.schemas.GlintAttitude
+ :members:
+
+Attitude Schedule
+-----------------
+
+.. autopydantic_model:: tatc.schemas.AttitudeSchedule
+ :members:
+
+.. autopydantic_model:: tatc.schemas.AttitudeSegment
+ :members:
+
Satellite
---------
diff --git a/docs/api_reference/utils/index.rst b/docs/api_reference/utils/index.rst
index d9ad5133..25391e88 100644
--- a/docs/api_reference/utils/index.rst
+++ b/docs/api_reference/utils/index.rst
@@ -32,6 +32,14 @@ Utility Functions
.. autofunction:: tatc.utils.compute_cone_and_azimuth
+.. autofunction:: tatc.utils.compute_ground_sample_size
+
+.. autofunction:: tatc.utils.compute_ground_advance
+
+.. autofunction:: tatc.utils.compute_specular_point
+
+.. autofunction:: tatc.utils.compute_glint_angle
+
.. autoclass:: tatc.utils.VelocityFrame
:members:
@@ -71,6 +79,8 @@ Utility Functions
.. autofunction:: tatc.utils.compute_j2_mean_motion_rate
+.. autofunction:: tatc.utils.align_element_switches
+
.. autofunction:: tatc.utils.compute_max_access_time
.. autofunction:: tatc.utils.compute_max_transit_time
diff --git a/docs/examples/CollectLimb.ipynb b/docs/examples/CollectLimb.ipynb
index 7777a3b5..517a49b6 100644
--- a/docs/examples/CollectLimb.ipynb
+++ b/docs/examples/CollectLimb.ipynb
@@ -12514,7 +12514,9 @@
"# embed frames as JPEG images, which are much smaller than PNG\n",
"plt.rcParams[\"animation.frame_format\"] = \"jpeg\"\n",
"\n",
- "fig, ax = plt.subplots(figsize=(8, 4), dpi=72, subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, ax = plt.subplots(\n",
+ " figsize=(8, 4), dpi=72, subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"\n",
"frame_duration = timedelta(hours=1)\n",
"num_frames = int(duration / frame_duration)\n",
@@ -12525,7 +12527,9 @@
" time = times[0] + frame * frame_duration\n",
" orbit_track.loc[\n",
" (orbit_track.time >= time) & (orbit_track.time < time + frame_duration)\n",
- " ].plot(ax=ax, marker=\".\", color=\"k\", markersize=1, lw=0, transform=ccrs.PlateCarree())\n",
+ " ].plot(\n",
+ " ax=ax, marker=\".\", color=\"k\", markersize=1, lw=0, transform=ccrs.PlateCarree()\n",
+ " )\n",
" frame_obs = limb_obs.loc[\n",
" (limb_obs.start >= time) & (limb_obs.start < time + frame_duration)\n",
" ]\n",
diff --git a/docs/examples/CollectOrbitGroundTrack.ipynb b/docs/examples/CollectOrbitGroundTrack.ipynb
index 139e73db..049d5a02 100644
--- a/docs/examples/CollectOrbitGroundTrack.ipynb
+++ b/docs/examples/CollectOrbitGroundTrack.ipynb
@@ -340,11 +340,7 @@
"fig, ax = plt.subplots(figsize=(8, 5), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
"\n",
"results.plot(\n",
- " column=\"valid\",\n",
- " legend=True,\n",
- " cmap=\"inferno\",\n",
- " ax=ax,\n",
- " transform=ccrs.PlateCarree()\n",
+ " column=\"valid\", legend=True, cmap=\"inferno\", ax=ax, transform=ccrs.PlateCarree()\n",
")\n",
"ax.stock_img()\n",
"ax.set_global()\n",
@@ -558,13 +554,13 @@
"fig, ax = plt.subplots(figsize=(8, 5), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
"\n",
"results.plot(\n",
- " column=\"valid\", \n",
- " edgecolor=\"none\", \n",
- " alpha=0.4, \n",
- " legend=True, \n",
- " cmap=\"inferno\", \n",
+ " column=\"valid\",\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.4,\n",
+ " legend=True,\n",
+ " cmap=\"inferno\",\n",
" ax=ax,\n",
- " transform=ccrs.PlateCarree()\n",
+ " transform=ccrs.PlateCarree(),\n",
")\n",
"ax.stock_img()\n",
"ax.set_global()\n",
@@ -604,7 +600,14 @@
"\n",
"results = compute_ground_track(noaa20, times)\n",
"fig, ax = plt.subplots(figsize=(8, 5), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
- "ax = results.plot(facecolor=\"r\", edgecolor=\"none\", alpha=0.4, zorder=1, ax=ax, transform=ccrs.PlateCarree())\n",
+ "ax = results.plot(\n",
+ " facecolor=\"r\",\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.4,\n",
+ " zorder=1,\n",
+ " ax=ax,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
"ax.stock_img()\n",
"ax.set_global()\n",
"plt.show()"
diff --git a/docs/examples/CollectPlatformTrack.ipynb b/docs/examples/CollectPlatformTrack.ipynb
index c9362f9c..76dd667a 100644
--- a/docs/examples/CollectPlatformTrack.ipynb
+++ b/docs/examples/CollectPlatformTrack.ipynb
@@ -241,7 +241,9 @@
"def mean_radius(track, platform):\n",
" \"\"\"Mean distance (m) from a platform to the boundary of each footprint.\"\"\"\n",
" local = track.to_crs(local_crs(platform))\n",
- " return local.geometry.apply(lambda g: np.hypot(*np.array(g.exterior.coords)[:, :2].T).mean())\n",
+ " return local.geometry.apply(\n",
+ " lambda g: np.hypot(*np.array(g.exterior.coords)[:, :2].T).mean()\n",
+ " )\n",
"\n",
"\n",
"summary = results[[\"platform\", \"instrument\", \"elevation\"]].copy()\n",
@@ -303,7 +305,12 @@
" facecolor=\"tab:orange\", edgecolor=\"k\", alpha=0.5, ax=ax\n",
")\n",
"ax.plot(0, 0, \"k^\")\n",
- "ax.set(xlabel=\"East (m)\", ylabel=\"North (m)\", title=\"Camera Footprint from 1,000 m\", aspect=\"equal\")\n",
+ "ax.set(\n",
+ " xlabel=\"East (m)\",\n",
+ " ylabel=\"North (m)\",\n",
+ " title=\"Camera Footprint from 1,000 m\",\n",
+ " aspect=\"equal\",\n",
+ ")\n",
"ax.grid(True, alpha=0.3)\n",
"plt.tight_layout()\n",
"plt.show()"
@@ -408,7 +415,10 @@
],
"source": [
"heights = [100, 250, 500, 1000, 2000]\n",
- "balloons = [balloon.model_copy(update={\"name\": f\"{height} m\", \"height\": height}) for height in heights]\n",
+ "balloons = [\n",
+ " balloon.model_copy(update={\"name\": f\"{height} m\", \"height\": height})\n",
+ " for height in heights\n",
+ "]\n",
"by_height = collect_platform_track(balloons, instrument_index=None)\n",
"by_height[\"radius (km)\"] = mean_radius(by_height, balloon) / 1e3\n",
"display(\n",
@@ -593,7 +603,12 @@
" column=\"instrument\", cmap=\"tab10\", edgecolor=\"k\", alpha=0.5, legend=True, ax=ax\n",
")\n",
"ax.plot(0, 0, \"k^\")\n",
- "ax.set(xlabel=\"East (m)\", ylabel=\"North (m)\", title=\"Tower Footprints (heading north)\", aspect=\"equal\")\n",
+ "ax.set(\n",
+ " xlabel=\"East (m)\",\n",
+ " ylabel=\"North (m)\",\n",
+ " title=\"Tower Footprints (heading north)\",\n",
+ " aspect=\"equal\",\n",
+ ")\n",
"ax.grid(True, alpha=0.3)\n",
"plt.show()"
]
@@ -643,8 +658,12 @@
"source": [
"import geopandas as gpd\n",
"\n",
- "pixel_camera = tower.instruments[0].model_copy(update={\"cross_track_pixels\": 12, \"along_track_pixels\": 8})\n",
- "pixels = pixel_camera.compute_footprint_pixel_array(tower.get_track(), elevation=tower.elevation)[0]\n",
+ "pixel_camera = tower.instruments[0].model_copy(\n",
+ " update={\"cross_track_pixels\": 12, \"along_track_pixels\": 8}\n",
+ ")\n",
+ "pixels = pixel_camera.compute_footprint_pixel_array(\n",
+ " tower.get_track(), elevation=tower.elevation\n",
+ ")[0]\n",
"pixels_local = gpd.GeoSeries([pixels], crs=\"EPSG:4326\").to_crs(local_crs(tower)).iloc[0]\n",
"\n",
"# pixel centers by cross-track (right to left) and along-track (fore to aft) index\n",
@@ -658,9 +677,19 @@
"tower_results[tower_results.instrument == \"North camera\"].to_crs(local_crs(tower)).plot(\n",
" facecolor=\"none\", edgecolor=\"k\", ax=ax\n",
")\n",
- "ax.plot([p.x for p in pixels_local.geoms], [p.y for p in pixels_local.geoms], \".\", color=\"tab:blue\")\n",
+ "ax.plot(\n",
+ " [p.x for p in pixels_local.geoms],\n",
+ " [p.y for p in pixels_local.geoms],\n",
+ " \".\",\n",
+ " color=\"tab:blue\",\n",
+ ")\n",
"ax.plot(0, 0, \"k^\")\n",
- "ax.set(xlabel=\"East (m)\", ylabel=\"North (m)\", title=\"North Camera Pixel Centers\", aspect=\"equal\")\n",
+ "ax.set(\n",
+ " xlabel=\"East (m)\",\n",
+ " ylabel=\"North (m)\",\n",
+ " title=\"North Camera Pixel Centers\",\n",
+ " aspect=\"equal\",\n",
+ ")\n",
"ax.grid(True, alpha=0.3)\n",
"plt.show()"
]
@@ -713,7 +742,10 @@
"\n",
"import pandas as pd\n",
"\n",
- "times = [datetime(2026, 10, 16, 7, tzinfo=timezone.utc) + timedelta(minutes=10 * i) for i in range(144)]\n",
+ "times = [\n",
+ " datetime(2026, 10, 16, 7, tzinfo=timezone.utc) + timedelta(minutes=10 * i)\n",
+ " for i in range(144)\n",
+ "]\n",
"camera = tower.instruments[0].model_copy(update={\"min_target_solar_elevation\": 10})\n",
"track = tower.get_track(times)\n",
"center = camera.compute_footprint_center(track, elevation=tower.elevation)\n",
@@ -727,7 +759,12 @@
"\n",
"fig, ax = plt.subplots(figsize=(10, 2.5))\n",
"ax.step(valid.index.tz_localize(None), valid.astype(int), where=\"post\")\n",
- "ax.set(yticks=[0, 1], yticklabels=[\"invalid\", \"valid\"], xlabel=\"Local time (MST)\", title=\"North Camera Valid Observations\")\n",
+ "ax.set(\n",
+ " yticks=[0, 1],\n",
+ " yticklabels=[\"invalid\", \"valid\"],\n",
+ " xlabel=\"Local time (MST)\",\n",
+ " title=\"North Camera Valid Observations\",\n",
+ ")\n",
"plt.show()"
]
},
@@ -800,16 +837,33 @@
"\n",
"composite = compute_platform_track(network)\n",
"composite_masked = compute_platform_track(network, mask=mask)\n",
- "print(f\"composite area: {composite.to_crs(local_crs(network[0])).area.iloc[0] / 1e6:.0f} km2\")\n",
- "print(f\"masked composite area: {composite_masked.to_crs(local_crs(network[0])).area.iloc[0] / 1e6:.0f} km2\")\n",
+ "print(\n",
+ " f\"composite area: {composite.to_crs(local_crs(network[0])).area.iloc[0] / 1e6:.0f} km2\"\n",
+ ")\n",
+ "print(\n",
+ " f\"masked composite area: {composite_masked.to_crs(local_crs(network[0])).area.iloc[0] / 1e6:.0f} km2\"\n",
+ ")\n",
"\n",
"fig, ax = plt.subplots(figsize=(8, 7), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
- "composite.plot(facecolor=\"none\", edgecolor=\"tab:red\", ls=\"--\", ax=ax, transform=ccrs.PlateCarree())\n",
- "composite_masked.plot(facecolor=\"tab:red\", edgecolor=\"none\", alpha=0.4, ax=ax, transform=ccrs.PlateCarree())\n",
+ "composite.plot(\n",
+ " facecolor=\"none\", edgecolor=\"tab:red\", ls=\"--\", ax=ax, transform=ccrs.PlateCarree()\n",
+ ")\n",
+ "composite_masked.plot(\n",
+ " facecolor=\"tab:red\",\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.4,\n",
+ " ax=ax,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
"ax.plot(*mask.exterior.xy, color=\"k\", lw=1, transform=ccrs.PlateCarree())\n",
"for platform in network:\n",
" ax.plot(platform.longitude, platform.latitude, \"k^\", transform=ccrs.PlateCarree())\n",
- " ax.text(platform.longitude + 0.01, platform.latitude + 0.01, platform.name, transform=ccrs.PlateCarree())\n",
+ " ax.text(\n",
+ " platform.longitude + 0.01,\n",
+ " platform.latitude + 0.01,\n",
+ " platform.name,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
"ax.add_feature(cfeature.STATES, edgecolor=\"gray\")\n",
"ax.set_extent([-112.45, -111.6, 33.1, 33.7], crs=ccrs.PlateCarree())\n",
"ax.set_title(\"Composite Balloon Network Coverage (shaded: masked)\")\n",
@@ -918,18 +972,24 @@
" }\n",
")\n",
"cloud_base = tower.elevation + 2000\n",
- "sky_results = collect_platform_track(sky_tower, instrument_index=None, elevation=cloud_base)\n",
+ "sky_results = collect_platform_track(\n",
+ " sky_tower, instrument_index=None, elevation=cloud_base\n",
+ ")\n",
"\n",
"\n",
"def distance_range(track, platform):\n",
" \"\"\"Minimum and maximum distances (m) from a platform to the boundary of each footprint.\"\"\"\n",
" local = track.to_crs(local_crs(platform))\n",
- " distances = local.geometry.apply(lambda g: np.hypot(*np.array(g.exterior.coords)[:, :2].T))\n",
+ " distances = local.geometry.apply(\n",
+ " lambda g: np.hypot(*np.array(g.exterior.coords)[:, :2].T)\n",
+ " )\n",
" return distances.apply(np.min), distances.apply(np.max)\n",
"\n",
"\n",
"sky_summary = sky_results[[\"platform\", \"instrument\", \"elevation\"]].copy()\n",
- "sky_summary[\"near (km)\"], sky_summary[\"far (km)\"] = (d / 1e3 for d in distance_range(sky_results, sky_tower))\n",
+ "sky_summary[\"near (km)\"], sky_summary[\"far (km)\"] = (\n",
+ " d / 1e3 for d in distance_range(sky_results, sky_tower)\n",
+ ")\n",
"sky_summary[\"area (km2)\"] = sky_results.to_crs(local_crs(sky_tower)).area / 1e6\n",
"display(sky_summary.round(3))"
]
@@ -963,7 +1023,11 @@
"fig = plt.figure(figsize=(13, 6))\n",
"ax = fig.add_subplot(1, 2, 1, projection=ccrs.PlateCarree())\n",
"sky_results[sky_results.instrument == \"West sky camera\"].plot(\n",
- " facecolor=\"tab:purple\", edgecolor=\"k\", alpha=0.4, ax=ax, transform=ccrs.PlateCarree()\n",
+ " facecolor=\"tab:purple\",\n",
+ " edgecolor=\"k\",\n",
+ " alpha=0.4,\n",
+ " ax=ax,\n",
+ " transform=ccrs.PlateCarree(),\n",
")\n",
"ax.plot(sky_tower.longitude, sky_tower.latitude, \"k^\", transform=ccrs.PlateCarree())\n",
"ax.stock_img()\n",
@@ -976,7 +1040,12 @@
" facecolor=\"tab:cyan\", edgecolor=\"k\", alpha=0.5, ax=ax\n",
")\n",
"ax.plot(0, 0, \"k^\")\n",
- "ax.set(xlabel=\"East (m)\", ylabel=\"North (m)\", title=\"Sky Camera Footprint at 2,000 m\", aspect=\"equal\")\n",
+ "ax.set(\n",
+ " xlabel=\"East (m)\",\n",
+ " ylabel=\"North (m)\",\n",
+ " title=\"Sky Camera Footprint at 2,000 m\",\n",
+ " aspect=\"equal\",\n",
+ ")\n",
"ax.grid(True, alpha=0.3)\n",
"plt.tight_layout()\n",
"plt.show()"
@@ -1006,11 +1075,15 @@
}
],
"source": [
- "pixel_sky_camera = sky_tower.instruments[0].model_copy(update={\"cross_track_pixels\": 9, \"along_track_pixels\": 9})\n",
+ "pixel_sky_camera = sky_tower.instruments[0].model_copy(\n",
+ " update={\"cross_track_pixels\": 9, \"along_track_pixels\": 9}\n",
+ ")\n",
"sky_pixels = pixel_sky_camera.compute_footprint_pixel_array(\n",
" sky_tower.get_track(), elevation=cloud_base, ground_elevation=sky_tower.elevation\n",
")[0]\n",
- "sky_pixels_local = gpd.GeoSeries([sky_pixels], crs=\"EPSG:4326\").to_crs(local_crs(sky_tower)).iloc[0]\n",
+ "sky_pixels_local = (\n",
+ " gpd.GeoSeries([sky_pixels], crs=\"EPSG:4326\").to_crs(local_crs(sky_tower)).iloc[0]\n",
+ ")\n",
"\n",
"# pixel centers by cross-track and along-track index\n",
"sky_centers = np.array([(p.x, p.y) for p in sky_pixels_local.geoms]).reshape(9, 9, 2)\n",
@@ -1107,10 +1180,17 @@
"REGENERATE_TERRAIN_MASK = False # set True to re-derive from the DEM over the network\n",
"\n",
"if REGENERATE_TERRAIN_MASK:\n",
- " from tatc.preprocess import compute_terrain_mask_for_platform, get_copernicus_dem_tile_urls\n",
+ " from tatc.preprocess import (\n",
+ " compute_terrain_mask_for_platform,\n",
+ " get_copernicus_dem_tile_urls,\n",
+ " )\n",
"\n",
- " dem_urls = get_copernicus_dem_tile_urls(sky_tower.longitude, sky_tower.latitude, radius=100000)\n",
- " sky_tower.terrain_mask = compute_terrain_mask_for_platform(dem_urls, sky_tower, search_radius=100000)\n",
+ " dem_urls = get_copernicus_dem_tile_urls(\n",
+ " sky_tower.longitude, sky_tower.latitude, radius=100000\n",
+ " )\n",
+ " sky_tower.terrain_mask = compute_terrain_mask_for_platform(\n",
+ " dem_urls, sky_tower, search_radius=100000\n",
+ " )\n",
" with open(TERRAIN_MASK_PATH, \"w\", encoding=\"utf-8\") as f:\n",
" json.dump({sky_tower.name: sky_tower.terrain_mask.model_dump()}, f, indent=2)\n",
"else:\n",
@@ -1119,18 +1199,30 @@
"\n",
"open_sky = sky_tower.model_copy(update={\"terrain_mask\": None})\n",
"visible = gpd.GeoSeries(\n",
- " [open_sky.compute_visible_region(cloud_base), sky_tower.compute_visible_region(cloud_base)],\n",
+ " [\n",
+ " open_sky.compute_visible_region(cloud_base),\n",
+ " sky_tower.compute_visible_region(cloud_base),\n",
+ " ],\n",
" index=[\"ground horizon\", \"terrain mask\"],\n",
" crs=\"EPSG:4326\",\n",
")\n",
- "masked_results = collect_platform_track(sky_tower, instrument_index=None, elevation=cloud_base)\n",
+ "masked_results = collect_platform_track(\n",
+ " sky_tower, instrument_index=None, elevation=cloud_base\n",
+ ")\n",
"\n",
"angles = sky_tower.terrain_mask.min_elevation_angle\n",
"print(f\"terrain mask: {min(angles):.2f} to {max(angles):.2f} degrees\")\n",
- "print(\"visible cloud base (km2):\", (visible.to_crs(local_crs(sky_tower)).area / 1e6).round(0).to_dict())\n",
+ "print(\n",
+ " \"visible cloud base (km2):\",\n",
+ " (visible.to_crs(local_crs(sky_tower)).area / 1e6).round(0).to_dict(),\n",
+ ")\n",
"masked_summary = masked_results[[\"instrument\"]].copy()\n",
- "masked_summary[\"area without mask (km2)\"] = sky_results.to_crs(local_crs(sky_tower)).area / 1e6\n",
- "masked_summary[\"area with mask (km2)\"] = masked_results.to_crs(local_crs(sky_tower)).area / 1e6\n",
+ "masked_summary[\"area without mask (km2)\"] = (\n",
+ " sky_results.to_crs(local_crs(sky_tower)).area / 1e6\n",
+ ")\n",
+ "masked_summary[\"area with mask (km2)\"] = (\n",
+ " masked_results.to_crs(local_crs(sky_tower)).area / 1e6\n",
+ ")\n",
"display(masked_summary.round(1))"
]
},
@@ -1161,15 +1253,25 @@
],
"source": [
"fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
- "visible[[\"ground horizon\"]].plot(facecolor=\"none\", edgecolor=\"k\", ls=\"--\", ax=ax, transform=ccrs.PlateCarree())\n",
- "visible[[\"terrain mask\"]].plot(facecolor=\"tab:green\", edgecolor=\"k\", alpha=0.2, ax=ax, transform=ccrs.PlateCarree())\n",
+ "visible[[\"ground horizon\"]].plot(\n",
+ " facecolor=\"none\", edgecolor=\"k\", ls=\"--\", ax=ax, transform=ccrs.PlateCarree()\n",
+ ")\n",
+ "visible[[\"terrain mask\"]].plot(\n",
+ " facecolor=\"tab:green\", edgecolor=\"k\", alpha=0.2, ax=ax, transform=ccrs.PlateCarree()\n",
+ ")\n",
"masked_results[masked_results.instrument == \"West sky camera\"].plot(\n",
- " facecolor=\"tab:purple\", edgecolor=\"k\", alpha=0.5, ax=ax, transform=ccrs.PlateCarree()\n",
+ " facecolor=\"tab:purple\",\n",
+ " edgecolor=\"k\",\n",
+ " alpha=0.5,\n",
+ " ax=ax,\n",
+ " transform=ccrs.PlateCarree(),\n",
")\n",
"ax.plot(sky_tower.longitude, sky_tower.latitude, \"k^\", transform=ccrs.PlateCarree())\n",
"ax.add_feature(cfeature.STATES, edgecolor=\"gray\")\n",
"ax.set_extent([-114.1, -109.8, 31.8, 35.1], crs=ccrs.PlateCarree())\n",
- "ax.set_title(\"Cloud Base at 2,000 m Visible over the Horizon (dashed) and Terrain (green)\")\n",
+ "ax.set_title(\n",
+ " \"Cloud Base at 2,000 m Visible over the Horizon (dashed) and Terrain (green)\"\n",
+ ")\n",
"plt.show()"
]
},
diff --git a/docs/examples/CollectRO.ipynb b/docs/examples/CollectRO.ipynb
index df5fcdea..bafffda2 100644
--- a/docs/examples/CollectRO.ipynb
+++ b/docs/examples/CollectRO.ipynb
@@ -178,7 +178,7 @@
},
"outputs": [],
"source": [
- "from tatc.schemas import GeneralPerturbationsOrbit, Satellite\n",
+ "from tatc.schemas import GeneralPerturbationsOrbit, Satellite\n",
"\n",
"txs = []\n",
"\n",
@@ -188,7 +188,8 @@
" for i in range(0, len(lines), 3):\n",
" txs.append(\n",
" Satellite(\n",
- " name=lines[i], orbit=GeneralPerturbationsOrbit.from_tle(lines[i + 1 : i + 3])\n",
+ " name=lines[i],\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(lines[i + 1 : i + 3]),\n",
" )\n",
" )\n",
"\n",
@@ -212,7 +213,7 @@
"All reported positions refer to the geodetic tangent point (longitude, latitude, and elevation above the WGS 84 reference ellipsoid). The outputs report each RO observation including the following fields:\n",
" * `receiver`: the receiver satellite name\n",
" * `transmitter`: the transmitter satellite name\n",
- " * `is_rising`: true, if the transmitter is ahead of the receiver (a rising occultation); false indicates it is behind (a setting occultation)\n",
+ " * `is_rising`: true, if the tangent point rises through the sample elevation (a rising occultation); false indicates it descends (a setting occultation)\n",
" * `geometry`: a multipoint geometry that describes the tangent point observation arc of points separated by (at most) `time_step`\n",
" * `position`: a point geometry that describes the tangent point interpolated at the `sample_elevation` value\n",
" * `rx_tx_pitch`: the transmitter pitch angle as viewed by the receiver\n",
@@ -581,7 +582,7 @@
" color=ro_obs.apply(lambda r: \"m\" if r.is_rising else \"g\", axis=1),\n",
" scale=50,\n",
" scale_units=\"width\",\n",
- " transform=ccrs.PlateCarree()\n",
+ " transform=ccrs.PlateCarree(),\n",
")\n",
"ax.stock_img()\n",
"ax.set_global()\n",
@@ -15036,7 +15037,9 @@
"# embed frames as JPEG images, which are much smaller than PNG\n",
"plt.rcParams[\"animation.frame_format\"] = \"jpeg\"\n",
"\n",
- "fig, ax = plt.subplots(figsize=(8, 4), dpi=72, subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, ax = plt.subplots(\n",
+ " figsize=(8, 4), dpi=72, subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"\n",
"frame_duration = timedelta(minutes=1)\n",
"animation_duration = timedelta(minutes=30)\n",
@@ -15059,7 +15062,7 @@
" [point.y for point in r.geometry.geoms],\n",
" \".m\" if r.is_rising else \".g\",\n",
" markersize=1,\n",
- " transform=ccrs.PlateCarree()\n",
+ " transform=ccrs.PlateCarree(),\n",
" ),\n",
" axis=1,\n",
" )\n",
@@ -15075,7 +15078,7 @@
" color=ro_obs_filtered.apply(lambda r: \"m\" if r.is_rising else \"g\", axis=1),\n",
" scale=50,\n",
" scale_units=\"width\",\n",
- " transform=ccrs.PlateCarree()\n",
+ " transform=ccrs.PlateCarree(),\n",
" )\n",
" ax.set_global()\n",
" ax.coastlines()\n",
diff --git a/docs/examples/CollectRadarTrack.ipynb b/docs/examples/CollectRadarTrack.ipynb
index 1d576853..58449bc0 100644
--- a/docs/examples/CollectRadarTrack.ipynb
+++ b/docs/examples/CollectRadarTrack.ipynb
@@ -34,12 +34,35 @@
"# all four are real NEXRAD WSR-88D stations, which are S-band; coordinates and\n",
"# antenna elevations (1426, 7514, 239, and 5319 ft) are from the NCEI station table\n",
"stations = [\n",
- " RadarStation.from_band(RadarBand.S, name=\"KIWA\", latitude=33.289233, longitude=-111.66991, elevation=434.6),\n",
" RadarStation.from_band(\n",
- " RadarBand.S, name=\"KFSX\", latitude=34.574333, longitude=-111.19844, elevation=2290.3, min_elevation_angle=-0.2\n",
+ " RadarBand.S,\n",
+ " name=\"KIWA\",\n",
+ " latitude=33.289233,\n",
+ " longitude=-111.66991,\n",
+ " elevation=434.6,\n",
+ " ),\n",
+ " RadarStation.from_band(\n",
+ " RadarBand.S,\n",
+ " name=\"KFSX\",\n",
+ " latitude=34.574333,\n",
+ " longitude=-111.19844,\n",
+ " elevation=2290.3,\n",
+ " min_elevation_angle=-0.2,\n",
+ " ),\n",
+ " RadarStation.from_band(\n",
+ " RadarBand.S,\n",
+ " name=\"KYUX\",\n",
+ " latitude=32.495281,\n",
+ " longitude=-114.65671,\n",
+ " elevation=72.8,\n",
+ " ),\n",
+ " RadarStation.from_band(\n",
+ " RadarBand.S,\n",
+ " name=\"KEMX\",\n",
+ " latitude=31.89365,\n",
+ " longitude=-110.63025,\n",
+ " elevation=1621.2,\n",
" ),\n",
- " RadarStation.from_band(RadarBand.S, name=\"KYUX\", latitude=32.495281, longitude=-114.65671, elevation=72.8),\n",
- " RadarStation.from_band(RadarBand.S, name=\"KEMX\", latitude=31.89365, longitude=-110.63025, elevation=1621.2),\n",
"]"
]
},
@@ -377,7 +400,12 @@
"\n",
"fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
"composite.plot(\n",
- " facecolor=\"r\", edgecolor=\"none\", alpha=0.4, zorder=1, ax=ax, transform=ccrs.PlateCarree()\n",
+ " facecolor=\"r\",\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.4,\n",
+ " zorder=1,\n",
+ " ax=ax,\n",
+ " transform=ccrs.PlateCarree(),\n",
")\n",
"ax.stock_img()\n",
"ax.add_feature(cfeature.STATES, edgecolor=\"gray\")\n",
@@ -425,12 +453,19 @@
"REGENERATE_TERRAIN_MASKS = False # set True to re-derive from the DEM over the network\n",
"\n",
"if REGENERATE_TERRAIN_MASKS:\n",
- " from tatc.preprocess import get_copernicus_dem_tile_urls, compute_terrain_mask_for_station\n",
+ " from tatc.preprocess import (\n",
+ " get_copernicus_dem_tile_urls,\n",
+ " compute_terrain_mask_for_station,\n",
+ " )\n",
"\n",
" terrain_masks = {}\n",
" for station in stations:\n",
- " dem_urls = get_copernicus_dem_tile_urls(station.longitude, station.latitude, radius=100000)\n",
- " station.terrain_mask = compute_terrain_mask_for_station(dem_urls, station, search_radius=100000)\n",
+ " dem_urls = get_copernicus_dem_tile_urls(\n",
+ " station.longitude, station.latitude, radius=100000\n",
+ " )\n",
+ " station.terrain_mask = compute_terrain_mask_for_station(\n",
+ " dem_urls, station, search_radius=100000\n",
+ " )\n",
" terrain_masks[station.name] = station.terrain_mask.model_dump()\n",
" # persist for reuse, so subsequent runs do not need to repeat the DEM fetch\n",
" with open(TERRAIN_MASK_PATH, \"w\", encoding=\"utf-8\") as f:\n",
@@ -511,7 +546,9 @@
"source": [
"heights = [2438, 3048, 4572, 6096]\n",
"\n",
- "fig, axes = plt.subplots(2, 2, figsize=(12, 12), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, axes = plt.subplots(\n",
+ " 2, 2, figsize=(12, 12), subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"for ax, height in zip(axes.flat, heights):\n",
" results_h = collect_radar_track(stations, elevation=height)\n",
" results_h.plot(\n",
@@ -560,7 +597,12 @@
"\n",
"fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
"composite_masked.plot(\n",
- " facecolor=\"r\", edgecolor=\"none\", alpha=0.4, zorder=1, ax=ax, transform=ccrs.PlateCarree()\n",
+ " facecolor=\"r\",\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.4,\n",
+ " zorder=1,\n",
+ " ax=ax,\n",
+ " transform=ccrs.PlateCarree(),\n",
")\n",
"ax.stock_img()\n",
"ax.add_feature(cfeature.STATES, edgecolor=\"gray\")\n",
@@ -658,9 +700,27 @@
}
],
"source": [
- "s_band = RadarStation.from_band(RadarBand.S, name=\"S-band\", latitude=stations[0].latitude, longitude=stations[0].longitude, elevation=stations[0].elevation)\n",
- "c_band = RadarStation.from_band(RadarBand.C, name=\"C-band\", latitude=stations[0].latitude, longitude=stations[0].longitude, elevation=stations[0].elevation)\n",
- "x_band = RadarStation.from_band(RadarBand.X, name=\"X-band\", latitude=stations[0].latitude, longitude=stations[0].longitude, elevation=stations[0].elevation)\n",
+ "s_band = RadarStation.from_band(\n",
+ " RadarBand.S,\n",
+ " name=\"S-band\",\n",
+ " latitude=stations[0].latitude,\n",
+ " longitude=stations[0].longitude,\n",
+ " elevation=stations[0].elevation,\n",
+ ")\n",
+ "c_band = RadarStation.from_band(\n",
+ " RadarBand.C,\n",
+ " name=\"C-band\",\n",
+ " latitude=stations[0].latitude,\n",
+ " longitude=stations[0].longitude,\n",
+ " elevation=stations[0].elevation,\n",
+ ")\n",
+ "x_band = RadarStation.from_band(\n",
+ " RadarBand.X,\n",
+ " name=\"X-band\",\n",
+ " latitude=stations[0].latitude,\n",
+ " longitude=stations[0].longitude,\n",
+ " elevation=stations[0].elevation,\n",
+ ")\n",
"\n",
"band_results = collect_radar_track([s_band, c_band, x_band], elevation=6096)\n",
"display(band_results[[\"station\", \"band\", \"outer_ground_range\"]])\n",
diff --git a/docs/examples/CollectSpace.ipynb b/docs/examples/CollectSpace.ipynb
index 9e839bca..332abda2 100644
--- a/docs/examples/CollectSpace.ipynb
+++ b/docs/examples/CollectSpace.ipynb
@@ -90,10 +90,10 @@
"id": "57460b14",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T21:26:00.616319Z",
- "iopub.status.busy": "2026-10-08T21:26:00.616319Z",
- "iopub.status.idle": "2026-10-08T21:26:01.195234Z",
- "shell.execute_reply": "2026-10-08T21:26:01.194234Z"
+ "iopub.execute_input": "2026-10-26T00:14:27.234786Z",
+ "iopub.status.busy": "2026-10-26T00:14:27.234565Z",
+ "iopub.status.idle": "2026-10-26T00:14:27.588033Z",
+ "shell.execute_reply": "2026-10-26T00:14:27.587297Z"
}
},
"outputs": [],
@@ -122,10 +122,10 @@
"id": "540af7d4",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T21:26:01.197234Z",
- "iopub.status.busy": "2026-10-08T21:26:01.197234Z",
- "iopub.status.idle": "2026-10-08T21:26:02.769096Z",
- "shell.execute_reply": "2026-10-08T21:26:02.768388Z"
+ "iopub.execute_input": "2026-10-26T00:14:27.590175Z",
+ "iopub.status.busy": "2026-10-26T00:14:27.589905Z",
+ "iopub.status.idle": "2026-10-26T00:14:28.506469Z",
+ "shell.execute_reply": "2026-10-26T00:14:28.505653Z"
}
},
"outputs": [],
@@ -175,10 +175,10 @@
"id": "9f26de47",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T21:26:02.771611Z",
- "iopub.status.busy": "2026-10-08T21:26:02.771611Z",
- "iopub.status.idle": "2026-10-08T21:26:02.956951Z",
- "shell.execute_reply": "2026-10-08T21:26:02.956951Z"
+ "iopub.execute_input": "2026-10-26T00:14:28.508479Z",
+ "iopub.status.busy": "2026-10-26T00:14:28.508185Z",
+ "iopub.status.idle": "2026-10-26T00:14:28.619028Z",
+ "shell.execute_reply": "2026-10-26T00:14:28.618267Z"
}
},
"outputs": [
@@ -209,152 +209,186 @@
"
array(['2006-08-25T00:15:00.000000000', '2006-08-25T00:45:00.000000000',\n",
+ " extra_das_attribute: This is an example of metadata added using a supple...
Mon Sep 28 12:21:13 EDT 2026 : imported by GrADS Data Server 2.0
extra_das_attribute :
This is an example of metadata added using a supplementary DAS file. See testdata/extra.das for the source.
"
],
"text/plain": [
@@ -939,11 +941,18 @@
" \"\"\"One chunk of the Nature Run over the study region, retried if the server returns a field of zeros.\"\"\"\n",
" minx, miny, maxx, maxy = domain.bounds\n",
" for attempt in range(4):\n",
- " chunk = remote[VARIABLES].sel(\n",
- " time=slice(naive(chunk_start), naive(chunk_start + CHUNK - timedelta(seconds=1))),\n",
- " lon=slice(minx, maxx),\n",
- " lat=slice(miny, maxy),\n",
- " ).load()\n",
+ " chunk = (\n",
+ " remote[VARIABLES]\n",
+ " .sel(\n",
+ " time=slice(\n",
+ " naive(chunk_start),\n",
+ " naive(chunk_start + CHUNK - timedelta(seconds=1)),\n",
+ " ),\n",
+ " lon=slice(minx, maxx),\n",
+ " lat=slice(miny, maxy),\n",
+ " )\n",
+ " .load()\n",
+ " )\n",
" if float((chunk[\"lwtup\"] == 0).mean()) < 0.5:\n",
" return chunk\n",
" raise RuntimeError(f\"the server returned a field of zeros for {chunk_start}\")\n",
@@ -952,13 +961,18 @@
"nature_file = DATA_DIR / f\"g5nr_hurricane_{nature_start:%Y%m%d}_{duration.days}d.nc\"\n",
"if not nature_file.exists():\n",
" with xr.open_dataset(NATURE_URL) as remote:\n",
- " chunks = [fetch_chunk(remote, nature_start + k * CHUNK) for k in range(int(duration / CHUNK))]\n",
+ " chunks = [\n",
+ " fetch_chunk(remote, nature_start + k * CHUNK)\n",
+ " for k in range(int(duration / CHUNK))\n",
+ " ]\n",
" xr.concat(chunks, \"time\").to_netcdf(nature_file)\n",
"nature = xr.load_dataset(nature_file)\n",
"assert nature.sizes[\"time\"] == n_frames\n",
"assert float((nature[\"lwtup\"] == 0).mean()) == 0\n",
"# each time stamp is the middle of its 30-minute averaging interval\n",
- "assert (nature.time.values[0] - np.datetime64(naive(nature_start))) == np.timedelta64(15, \"m\")\n",
+ "assert (nature.time.values[0] - np.datetime64(naive(nature_start))) == np.timedelta64(\n",
+ " 15, \"m\"\n",
+ ")\n",
"nature"
]
},
@@ -985,10 +999,10 @@
"id": "37e47761",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:47:35.649871Z",
- "iopub.status.busy": "2026-10-24T21:47:35.649871Z",
- "iopub.status.idle": "2026-10-24T21:47:47.712725Z",
- "shell.execute_reply": "2026-10-24T21:47:47.712725Z"
+ "iopub.execute_input": "2026-10-25T04:52:42.397499Z",
+ "iopub.status.busy": "2026-10-25T04:52:42.397499Z",
+ "iopub.status.idle": "2026-10-25T04:52:54.316832Z",
+ "shell.execute_reply": "2026-10-25T04:52:54.316832Z"
}
},
"outputs": [
@@ -1089,9 +1103,13 @@
"\n",
"from tatc.constants import EARTH_MEAN_RADIUS\n",
"\n",
- "THRESHOLD = 5.67037e-8 * 220**4 # W m-2, the upwelling longwave flux of a 220 K blackbody\n",
+ "THRESHOLD = (\n",
+ " 5.67037e-8 * 220**4\n",
+ ") # W m-2, the upwelling longwave flux of a 220 K blackbody\n",
"PRECIP_THRESHOLD = 10 / 3600 # kg m-2 s-1 (10 mm/h)\n",
- "EFFECTIVE_RESOLUTION_KM = 4 * 7 # km, several grid spacings (Gelaro et al., 2015); smaller features are not resolved\n",
+ "EFFECTIVE_RESOLUTION_KM = (\n",
+ " 4 * 7\n",
+ ") # km, several grid spacings (Gelaro et al., 2015); smaller features are not resolved\n",
"STORM_RADIUS_KM = 500 # km, features within this distance of the storm center are attributed to the storm\n",
"KINDS = {\n",
" \"cold cloud top\": lambda frame: frame[\"lwtup\"].values < THRESHOLD,\n",
@@ -1103,13 +1121,17 @@
" \"\"\"The features of a kind (contiguous patches at least EFFECTIVE_RESOLUTION_KM in size) in each frame.\"\"\"\n",
" lon, lat = nature.lon.values, nature.lat.values\n",
" lon2d, lat2d = np.meshgrid(lon, lat)\n",
- " cell_area = (EARTH_MEAN_RADIUS * np.radians(GRID_SIZE)) ** 2 * np.cos(np.radians(lat2d)) # m^2\n",
+ " cell_area = (EARTH_MEAN_RADIUS * np.radians(GRID_SIZE)) ** 2 * np.cos(\n",
+ " np.radians(lat2d)\n",
+ " ) # m^2\n",
"\n",
" records, polygons = [], []\n",
" for frame in range(nature.sizes[\"time\"]):\n",
" fields = nature.isel(time=frame)\n",
" lwtup, prectot = fields[\"lwtup\"].values, fields[\"prectot\"].values\n",
- " labels, n_labels = ndi.label(KINDS[kind](fields)) # contiguous cells of the kind\n",
+ " labels, n_labels = ndi.label(\n",
+ " KINDS[kind](fields)\n",
+ " ) # contiguous cells of the kind\n",
" if n_labels == 0:\n",
" continue\n",
" ids = np.arange(1, n_labels + 1)\n",
@@ -1120,7 +1142,10 @@
" order = np.argsort(labels[j, i], kind=\"stable\")\n",
" j, i = j[order], i[order]\n",
" cells = shapely.box(\n",
- " lon[i] - GRID_SIZE / 2, lat[j] - GRID_SIZE / 2, lon[i] + GRID_SIZE / 2, lat[j] + GRID_SIZE / 2\n",
+ " lon[i] - GRID_SIZE / 2,\n",
+ " lat[j] - GRID_SIZE / 2,\n",
+ " lon[i] + GRID_SIZE / 2,\n",
+ " lat[j] + GRID_SIZE / 2,\n",
" )\n",
" for k, cluster in enumerate(np.split(cells, np.cumsum(n_cells)[:-1])):\n",
" records.append(\n",
@@ -1139,7 +1164,9 @@
" polygons.append(shapely.union_all(cluster))\n",
"\n",
" features = gpd.GeoDataFrame(records, geometry=polygons, crs=\"EPSG:4326\")\n",
- " features[\"diameter_km\"] = np.sqrt(4 * features.area_km2 / np.pi) # of a circle of equal area\n",
+ " features[\"diameter_km\"] = np.sqrt(\n",
+ " 4 * features.area_km2 / np.pi\n",
+ " ) # of a circle of equal area\n",
" return features[features.diameter_km >= EFFECTIVE_RESOLUTION_KM]\n",
"\n",
"\n",
@@ -1147,16 +1174,28 @@
"features[\"time\"] = start + features.frame * frame_duration\n",
"\n",
"# distance (great circle) from the storm center at the middle of the frame, interpolated from the hourly track\n",
- "frame_middle = (nature.time.values[features.frame] - track.index.values[0]) / np.timedelta64(1, \"h\")\n",
+ "frame_middle = (\n",
+ " nature.time.values[features.frame] - track.index.values[0]\n",
+ ") / np.timedelta64(1, \"h\")\n",
"track_hours = (track.index.values - track.index.values[0]) / np.timedelta64(1, \"h\")\n",
"center_lat = np.radians(np.interp(frame_middle, track_hours, track.lat))\n",
"center_lon = np.radians(np.interp(frame_middle, track_hours, track.lon))\n",
"lat, lon = np.radians(features.lat), np.radians(features.lon)\n",
"features[\"storm_distance_km\"] = (\n",
- " EARTH_MEAN_RADIUS / 1e3\n",
- " * np.arccos(np.clip(np.sin(lat) * np.sin(center_lat) + np.cos(lat) * np.cos(center_lat) * np.cos(lon - center_lon), -1, 1))\n",
+ " EARTH_MEAN_RADIUS\n",
+ " / 1e3\n",
+ " * np.arccos(\n",
+ " np.clip(\n",
+ " np.sin(lat) * np.sin(center_lat)\n",
+ " + np.cos(lat) * np.cos(center_lat) * np.cos(lon - center_lon),\n",
+ " -1,\n",
+ " 1,\n",
+ " )\n",
+ " )\n",
+ ")\n",
+ "features[\"region\"] = np.where(\n",
+ " features.storm_distance_km < STORM_RADIUS_KM, \"storm\", \"environment\"\n",
")\n",
- "features[\"region\"] = np.where(features.storm_distance_km < STORM_RADIUS_KM, \"storm\", \"environment\")\n",
"features.groupby([\"kind\", \"region\"]).agg(\n",
" features=(\"frame\", \"size\"),\n",
" median_diameter_km=(\"diameter_km\", \"median\"),\n",
@@ -1181,10 +1220,10 @@
"id": "069ee49e",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:47:47.714730Z",
- "iopub.status.busy": "2026-10-24T21:47:47.714730Z",
- "iopub.status.idle": "2026-10-24T21:47:47.742987Z",
- "shell.execute_reply": "2026-10-24T21:47:47.742987Z"
+ "iopub.execute_input": "2026-10-25T04:52:54.318837Z",
+ "iopub.status.busy": "2026-10-25T04:52:54.318837Z",
+ "iopub.status.idle": "2026-10-25T04:52:54.347844Z",
+ "shell.execute_reply": "2026-10-25T04:52:54.347334Z"
}
},
"outputs": [
@@ -1302,7 +1341,9 @@
" field_of_regard=field_of_regard,\n",
" cross_track_field_of_view=field_of_regard,\n",
" along_track_field_of_view=compute_along_track_field_of_view(\n",
- " orbits[\"NOAA-20\"].get_mean_altitude(), TIME_STEP, orbits[\"NOAA-20\"].get_inclination()\n",
+ " orbits[\"NOAA-20\"].get_mean_altitude(),\n",
+ " TIME_STEP,\n",
+ " orbits[\"NOAA-20\"].get_inclination(),\n",
" ),\n",
" roll_angle=scan[\"roll\"],\n",
" is_rectangular=True,\n",
@@ -1311,7 +1352,11 @@
"\n",
"\n",
"satellites = [\n",
- " Satellite(name=name, orbit=orbit, instruments=[swath_instrument(\"ATMS\"), swath_instrument(\"CrIS\")])\n",
+ " Satellite(\n",
+ " name=name,\n",
+ " orbit=orbit,\n",
+ " instruments=[swath_instrument(\"ATMS\"), swath_instrument(\"CrIS\")],\n",
+ " )\n",
" for name, orbit in orbits.items()\n",
"]\n",
"\n",
@@ -1330,7 +1375,43 @@
").set_index(\"sensor\")\n",
"# sample spacing at nadir (km): that of the heritage sensor, scaled for the future sensors in proportion to their footprint\n",
"heritage_km = sensors.horizontal_km[sensors.swath].values\n",
- "sensors[\"sampling_km\"] = REFERENCE_RANGE_KM * np.radians(sensors.swath.map(SAMPLING_DEG)) * sensors.horizontal_km / heritage_km\n",
+ "sensors[\"sampling_km\"] = (\n",
+ " REFERENCE_RANGE_KM\n",
+ " * np.radians(sensors.swath.map(SAMPLING_DEG))\n",
+ " * sensors.horizontal_km\n",
+ " / heritage_km\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def sensor_instrument(sensor):\n",
+ " \"\"\"The swath instrument of a sensor with its pixels (for its sample sizes, see `compute_sample_sizes`): pixels\n",
+ " spaced by the angle that the sample spacing subtends at nadir from the reference range (enough to span the\n",
+ " swath), each with the instantaneous field of view that its horizontal resolution subtends, along and across\n",
+ " track.\"\"\"\n",
+ " row = sensors.loc[sensor]\n",
+ " swath = swath_instrument(row.swath)\n",
+ " ifov = np.degrees(2 * np.arctan(row.horizontal_km / 2 / REFERENCE_RANGE_KM))\n",
+ " spacing = np.degrees(row.sampling_km / REFERENCE_RANGE_KM)\n",
+ " pixels = round(swath.cross_track_field_of_view / spacing)\n",
+ " # the oversampling makes each pixel's field of view ifov (negative: a gap between pixels)\n",
+ " return PointedInstrument(\n",
+ " **swath.model_dump(\n",
+ " exclude={\n",
+ " \"cross_track_field_of_view\",\n",
+ " \"along_track_field_of_view\",\n",
+ " \"cross_track_pixels\",\n",
+ " \"cross_track_oversampling\",\n",
+ " \"along_track_oversampling\",\n",
+ " }\n",
+ " ),\n",
+ " cross_track_field_of_view=pixels * spacing,\n",
+ " along_track_field_of_view=spacing,\n",
+ " cross_track_pixels=pixels,\n",
+ " cross_track_oversampling=1 - spacing / ifov,\n",
+ " along_track_oversampling=1 - spacing / ifov,\n",
+ " )\n",
+ "\n",
+ "\n",
"sensors.round(1)"
]
},
@@ -1350,10 +1431,10 @@
"id": "7e009a6b",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:47:47.745212Z",
- "iopub.status.busy": "2026-10-24T21:47:47.745212Z",
- "iopub.status.idle": "2026-10-24T21:47:48.084161Z",
- "shell.execute_reply": "2026-10-24T21:47:48.084161Z"
+ "iopub.execute_input": "2026-10-25T04:52:54.349850Z",
+ "iopub.status.busy": "2026-10-25T04:52:54.348852Z",
+ "iopub.status.idle": "2026-10-25T04:52:54.659010Z",
+ "shell.execute_reply": "2026-10-25T04:52:54.659010Z"
}
},
"outputs": [
@@ -1467,7 +1548,10 @@
"def collect_tracks(satellites, duration):\n",
" \"\"\"The footprint of every instrument of the satellites at each time step over a duration from start, clipped to the\n",
" study region, with its frame.\"\"\"\n",
- " times = [start + timedelta(seconds=TIME_STEP * (i + 0.5)) for i in range(int(duration.total_seconds() // TIME_STEP))]\n",
+ " times = [\n",
+ " start + timedelta(seconds=TIME_STEP * (i + 0.5))\n",
+ " for i in range(int(duration.total_seconds() // TIME_STEP))\n",
+ " ]\n",
" tracks = collect_ground_track(satellites, times, instrument_index=None, mask=domain)\n",
" tracks = tracks[tracks.valid_obs].reset_index(drop=True)\n",
" tracks[\"geometry\"] = shapely.force_2d(tracks.geometry.values)\n",
@@ -1478,7 +1562,9 @@
"tracks = collect_tracks(satellites, duration)\n",
"# the area swept by each swath (ATMS or CrIS) in each frame\n",
"swaths = tracks.groupby([\"frame\", \"instrument\"]).geometry.agg(shapely.union_all)\n",
- "tracks.groupby([\"satellite\", \"instrument\"]).agg(footprints=(\"time\", \"size\"), first=(\"time\", \"min\"), last=(\"time\", \"max\"))"
+ "tracks.groupby([\"satellite\", \"instrument\"]).agg(\n",
+ " footprints=(\"time\", \"size\"), first=(\"time\", \"min\"), last=(\"time\", \"max\")\n",
+ ")"
]
},
{
@@ -1488,7 +1574,7 @@
"source": [
"## Compute Observability and Resolution\n",
"\n",
- "As in the monsoon OSSE, a feature is **observed** by a swath if the swath footprint of some time step in its frame overlaps it, a **look** is one satellite's view of the part of a feature inside its swath, and a feature is **resolved** if its viewed part spans at least `RESOLUTION_FACTOR` (two) resolution elements at its best look. The resolution element is the larger of a sensor's footprint and sample spacing at nadir, scaled by the slant range and (across track) the secant of the zenith angle, with its size measured as the diameter of a circle of the same area (`ELEMENT_AXIS`)."
+ "As in the monsoon OSSE, a feature is **observed** by a swath if the swath footprint of some time step in its frame overlaps it, a **look** is one satellite's view of the part of a feature inside its swath, and a feature is **resolved** if its viewed part spans at least `RESOLUTION_FACTOR` (two) resolution elements at its best look. TAT-C's `collect_feature_observations` collects the looks at features that exist for a period of time (here, each feature's frame), with the viewing geometry of each. The resolution element is the larger of a sensor's pixel and the spacing between its pixels, projected onto the ground at the look by TAT-C's `compute_sample_sizes` along and across track (see the monsoon OSSE), with its size measured as the diameter of a circle of the same area (`ELEMENT_AXIS`)."
]
},
{
@@ -1497,10 +1583,10 @@
"id": "a502a7dc",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:47:48.087167Z",
- "iopub.status.busy": "2026-10-24T21:47:48.087167Z",
- "iopub.status.idle": "2026-10-24T21:47:48.460042Z",
- "shell.execute_reply": "2026-10-24T21:47:48.460042Z"
+ "iopub.execute_input": "2026-10-25T04:52:54.661016Z",
+ "iopub.status.busy": "2026-10-25T04:52:54.661016Z",
+ "iopub.status.idle": "2026-10-25T04:52:55.377629Z",
+ "shell.execute_reply": "2026-10-25T04:52:55.377629Z"
}
},
"outputs": [
@@ -1604,102 +1690,81 @@
}
],
"source": [
- "from pyproj import Transformer\n",
- "from skyfield.framelib import itrs\n",
+ "from tatc.analysis import collect_feature_observations, compute_sample_sizes\n",
"\n",
"RESOLUTION_FACTOR = 2 # a feature is resolved if its viewed part spans at least this many resolution elements\n",
"ELEMENT_AXIS = \"equivalent\" # the size of a resolution element: \"equivalent\" (diameter of equal area) or \"cross-track\"\n",
"AXES = [\"equivalent\", \"cross-track\"]\n",
"\n",
- "TO_ECEF = Transformer.from_crs(\"EPSG:4979\", \"EPSG:4978\", always_xy=True)\n",
- "\n",
"\n",
- "def up(lon, lat):\n",
- " \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
- " lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
- "\n",
- "\n",
- "def element_size(slant_range, zenith, nadir_km, axis):\n",
- " \"\"\"Size (km) of a resolution element of size nadir_km at nadir: its angular size times the slant range (m) along\n",
- " track, and longer by the secant of the zenith angle (deg) cross track. The size is the diameter of a circle of the\n",
- " same area (axis=\"equivalent\", the geometric mean of the two) or the cross-track size (axis=\"cross-track\").\"\"\"\n",
- " along = slant_range / 1e3 * nadir_km / REFERENCE_RANGE_KM\n",
- " cross = along / np.cos(np.radians(zenith))\n",
- " return cross if axis == \"cross-track\" else np.sqrt(along * cross)\n",
- "\n",
- "\n",
- "def collect_looks(tracks, features, orbits):\n",
- " \"\"\"The looks at the features from the tracks: the part of each feature inside a satellite's swath in its frame, at\n",
- " the time of the footprint that covers most of it, with the slant range and zenith angle at its centroid.\"\"\"\n",
- " # pieces: the parts of each feature inside each footprint (of a satellite's instrument, at a time) in the same frame\n",
- " pieces = gpd.sjoin(\n",
- " features[[\"frame\", \"geometry\"]],\n",
- " tracks[[\"frame\", \"satellite\", \"instrument\", \"time\", \"geometry\"]].rename(columns={\"frame\": \"frame_track\"}),\n",
- " predicate=\"intersects\",\n",
- " )\n",
- " pieces = pieces[pieces.frame == pieces.frame_track].rename_axis(\"feature\").reset_index()\n",
- " pieces[\"geometry\"] = shapely.intersection(pieces.geometry.values, tracks.geometry.values[pieces.index_right])\n",
- " pieces[\"piece_area\"] = shapely.area(pieces.geometry.values)\n",
- "\n",
- " # looks: the part of each feature inside a satellite's swath, at the time of the footprint that covers most of it\n",
- " looks = (\n",
- " pieces.sort_values(\"piece_area\", ascending=False)\n",
- " .groupby([\"feature\", \"satellite\", \"instrument\"])\n",
- " .agg(time=(\"time\", \"first\"), geometry=(\"geometry\", shapely.union_all))\n",
- " .reset_index()\n",
+ "def collect_looks(satellites, duration, features):\n",
+ " \"\"\"The looks at the features (see `collect_feature_observations`): each satellite's view of the part of each\n",
+ " feature inside its swath in the feature's frame, at the time of the footprint that covers most of it, with the\n",
+ " size of the viewed part and the slant range and zenith angle at its centroid.\"\"\"\n",
+ " times = [\n",
+ " start + timedelta(seconds=TIME_STEP * (i + 0.5))\n",
+ " for i in range(int(duration.total_seconds() // TIME_STEP))\n",
+ " ]\n",
+ " looks = collect_feature_observations(\n",
+ " features.assign(start=features.time, end=features.time + frame_duration),\n",
+ " satellites,\n",
+ " times,\n",
" )\n",
- " looks[\"viewed_fraction\"] = np.minimum(\n",
- " 1, shapely.area(looks.geometry.values) / shapely.area(features.geometry.values[looks.feature])\n",
+ " looks[\"viewed_km\"] = np.sqrt(\n",
+ " 4 * looks.viewed_fraction * features.area_km2.values[looks.feature] / np.pi\n",
" )\n",
- " looks[\"viewed_km\"] = np.sqrt(4 * looks.viewed_fraction * features.area_km2.values[looks.feature] / np.pi)\n",
- " centroids = shapely.centroid(looks.geometry.values)\n",
- " looks[\"lon\"], looks[\"lat\"] = shapely.get_x(centroids), shapely.get_y(centroids)\n",
- "\n",
- " # the viewing geometry (slant range and zenith angle) from the satellite position at the time of the footprint\n",
- " looks[\"range_m\"], looks[\"zenith\"] = np.nan, np.nan\n",
- " for name, group in looks.groupby(\"satellite\"):\n",
- " sat_xyz = np.array(orbits[name].to_gp_orbit().get_orbit_track(list(group.time)).frame_xyz(itrs).m).T\n",
- " target = np.stack(TO_ECEF.transform(group.lon.values, group.lat.values, np.zeros(len(group))), axis=-1)\n",
- " line_of_sight = sat_xyz - target\n",
- " looks.loc[group.index, \"range_m\"] = np.linalg.norm(line_of_sight, axis=-1)\n",
- " looks.loc[group.index, \"zenith\"] = np.degrees(\n",
- " np.arccos(\n",
- " np.sum(line_of_sight * up(group.lon.values, group.lat.values), axis=-1)\n",
- " / np.linalg.norm(line_of_sight, axis=-1)\n",
- " )\n",
- " )\n",
+ " looks[\"range_m\"], looks[\"zenith\"] = looks.sat_range, 90 - looks.sat_alt\n",
" return looks\n",
"\n",
"\n",
- "def assess(looks, features):\n",
+ "def assess(looks, features, satellites):\n",
" \"\"\"Whether each sensor observes and resolves each feature, from its best look.\"\"\"\n",
" results = []\n",
" for sensor, row in sensors.iterrows():\n",
- " sensor_looks = looks[looks.instrument == row.swath].copy()\n",
- " # the resolution element at nadir is the larger of the footprint and the sample spacing\n",
- " nadir_km = max(row.horizontal_km, row.sampling_km)\n",
- " for axis in AXES:\n",
- " element_km = element_size(sensor_looks.range_m, sensor_looks.zenith, nadir_km, axis)\n",
+ " # the sizes of the sensor's samples at its looks, flown on the same satellites\n",
+ " sensor_satellites = [\n",
+ " satellite.model_copy(update={\"instruments\": [sensor_instrument(sensor)]})\n",
+ " for satellite in satellites\n",
+ " ]\n",
+ " sensor_looks = compute_sample_sizes(\n",
+ " looks[looks.instrument == row.swath], sensor_satellites\n",
+ " )\n",
+ " # the resolution element is the larger of a sample and the spacing between samples (km), along and across track\n",
+ " along = np.maximum(sensor_looks.sample_along, sensor_looks.spacing_along) / 1e3\n",
+ " cross = np.maximum(sensor_looks.sample_cross, sensor_looks.spacing_cross) / 1e3\n",
+ " for axis, element_km in {\n",
+ " \"equivalent\": np.sqrt(along * cross),\n",
+ " \"cross-track\": cross,\n",
+ " }.items():\n",
" sensor_looks[f\"elements ({axis})\"] = sensor_looks.viewed_km / element_km\n",
" if axis == ELEMENT_AXIS:\n",
" sensor_looks[\"element_km\"] = element_km\n",
" # the best look at each feature: the one whose viewed part spans the most resolution elements\n",
- " best = sensor_looks.loc[sensor_looks.groupby(\"feature\")[f\"elements ({ELEMENT_AXIS})\"].idxmax()].set_index(\"feature\")\n",
- " result = features[[\"frame\", \"kind\", \"region\", \"diameter_km\", \"area_km2\", \"tot_prectot\"]].copy()\n",
+ " best = sensor_looks.loc[\n",
+ " sensor_looks.groupby(\"feature\")[f\"elements ({ELEMENT_AXIS})\"].idxmax()\n",
+ " ].set_index(\"feature\")\n",
+ " result = features[\n",
+ " [\"frame\", \"kind\", \"region\", \"diameter_km\", \"area_km2\", \"tot_prectot\"]\n",
+ " ].copy()\n",
" result[\"sensor\"] = sensor\n",
- " result[\"looks\"] = sensor_looks.groupby(\"feature\").size().reindex(result.index, fill_value=0)\n",
+ " result[\"looks\"] = (\n",
+ " sensor_looks.groupby(\"feature\").size().reindex(result.index, fill_value=0)\n",
+ " )\n",
" result[\"observed\"] = result.looks > 0\n",
- " result = result.join(best[[\"satellite\", \"zenith\", \"viewed_fraction\", \"viewed_km\", \"element_km\"]])\n",
+ " result = result.join(\n",
+ " best[[\"satellite\", \"zenith\", \"viewed_fraction\", \"viewed_km\", \"element_km\"]]\n",
+ " )\n",
" for axis in AXES:\n",
- " result[f\"elements ({axis})\"] = sensor_looks.groupby(\"feature\")[f\"elements ({axis})\"].max()\n",
+ " result[f\"elements ({axis})\"] = sensor_looks.groupby(\"feature\")[\n",
+ " f\"elements ({axis})\"\n",
+ " ].max()\n",
" result[\"resolved\"] = result[f\"elements ({ELEMENT_AXIS})\"] >= RESOLUTION_FACTOR\n",
" results.append(result)\n",
" return pd.concat(results).reset_index().rename(columns={\"index\": \"feature\"})\n",
"\n",
"\n",
- "looks = collect_looks(tracks, features, orbits)\n",
- "results = assess(looks, features)\n",
+ "looks = collect_looks(satellites, duration, features)\n",
+ "results = assess(looks, features, satellites)\n",
"results.groupby([\"kind\", \"sensor\"])[[\"observed\", \"resolved\"]].sum().unstack(\"kind\")"
]
},
@@ -1719,10 +1784,10 @@
"id": "0e740b36",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:47:48.462047Z",
- "iopub.status.busy": "2026-10-24T21:47:48.462047Z",
- "iopub.status.idle": "2026-10-24T21:47:50.252601Z",
- "shell.execute_reply": "2026-10-24T21:47:50.252601Z"
+ "iopub.execute_input": "2026-10-25T04:52:55.379634Z",
+ "iopub.status.busy": "2026-10-25T04:52:55.379634Z",
+ "iopub.status.idle": "2026-10-25T04:52:57.573365Z",
+ "shell.execute_reply": "2026-10-25T04:52:57.573365Z"
}
},
"outputs": [
@@ -1745,35 +1810,85 @@
"# the frame with the most features of the kind whose status (not observed, observed, or resolved) differs between the sensors\n",
"of_kind = results[results.kind == KIND]\n",
"status = of_kind.observed.astype(int) + of_kind.resolved.astype(int)\n",
- "example = (status.groupby([of_kind.frame, of_kind.feature]).nunique() > 1).groupby(\"frame\").sum().idxmax()\n",
+ "example = (\n",
+ " (status.groupby([of_kind.frame, of_kind.feature]).nunique() > 1)\n",
+ " .groupby(\"frame\")\n",
+ " .sum()\n",
+ " .idxmax()\n",
+ ")\n",
"example_time = start + example * frame_duration\n",
- "example_center = track.iloc[np.abs(track.index - pd.Timestamp(nature.time.values[example])).argmin()]\n",
- "STATUS = {\"not observed\": \"#d9d8d3\", \"observed, not resolved\": \"#eb6834\", \"resolved\": \"#2a78d6\"}\n",
+ "example_center = track.iloc[\n",
+ " np.abs(track.index - pd.Timestamp(nature.time.values[example])).argmin()\n",
+ "]\n",
+ "STATUS = {\n",
+ " \"not observed\": \"#d9d8d3\",\n",
+ " \"observed, not resolved\": \"#eb6834\",\n",
+ " \"resolved\": \"#2a78d6\",\n",
+ "}\n",
"\n",
- "fig, axes = plt.subplots(2, 2, figsize=(11, 11), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, axes = plt.subplots(\n",
+ " 2, 2, figsize=(11, 11), subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"for ax, sensor in zip(axes.ravel(), sensors.index):\n",
" background = nature[\"lwtup\"].isel(time=example)\n",
- " ax.pcolormesh(background.lon, background.lat, background, cmap=\"Greys_r\", vmin=100, vmax=320, shading=\"auto\", transform=ccrs.PlateCarree())\n",
+ " ax.pcolormesh(\n",
+ " background.lon,\n",
+ " background.lat,\n",
+ " background,\n",
+ " cmap=\"Greys_r\",\n",
+ " vmin=100,\n",
+ " vmax=320,\n",
+ " shading=\"auto\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
" members = of_kind[(of_kind.sensor == sensor) & (of_kind.frame == example)]\n",
- " member_status = np.where(members.resolved, \"resolved\", np.where(members.observed, \"observed, not resolved\", \"not observed\"))\n",
+ " member_status = np.where(\n",
+ " members.resolved,\n",
+ " \"resolved\",\n",
+ " np.where(members.observed, \"observed, not resolved\", \"not observed\"),\n",
+ " )\n",
" for label, color in STATUS.items():\n",
" selected = features.loc[members.feature[member_status == label]]\n",
" if len(selected):\n",
- " selected.plot(ax=ax, facecolor=color, edgecolor=\"black\", linewidth=0.4, transform=ccrs.PlateCarree())\n",
+ " selected.plot(\n",
+ " ax=ax,\n",
+ " facecolor=color,\n",
+ " edgecolor=\"black\",\n",
+ " linewidth=0.4,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
" # fade the part of the study region outside the swath\n",
" swath = swaths.get((example, sensors.loc[sensor, \"swath\"]))\n",
" outside = domain if swath is None else domain.difference(swath)\n",
- " ax.add_geometries([outside], crs=ccrs.PlateCarree(), facecolor=\"white\", edgecolor=\"none\", alpha=0.6)\n",
+ " ax.add_geometries(\n",
+ " [outside],\n",
+ " crs=ccrs.PlateCarree(),\n",
+ " facecolor=\"white\",\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.6,\n",
+ " )\n",
" ax.add_feature(cfeature.COASTLINE, edgecolor=\"#8a8984\", linewidth=0.5)\n",
" ax.plot(track.lon, track.lat, color=\"#0b0b0b\", lw=1, transform=ccrs.PlateCarree())\n",
- " ax.plot(example_center.lon, example_center.lat, marker=\"x\", ms=8, mew=2, color=\"#0b0b0b\", transform=ccrs.PlateCarree())\n",
- " ax.set_extent([domain.bounds[0], domain.bounds[2], domain.bounds[1], domain.bounds[3]])\n",
+ " ax.plot(\n",
+ " example_center.lon,\n",
+ " example_center.lat,\n",
+ " marker=\"x\",\n",
+ " ms=8,\n",
+ " mew=2,\n",
+ " color=\"#0b0b0b\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
+ " ax.set_extent(\n",
+ " [domain.bounds[0], domain.bounds[2], domain.bounds[1], domain.bounds[3]]\n",
+ " )\n",
" ax.set_title(f\"{sensor} ({sensors.loc[sensor, 'horizontal_km']} km)\", fontsize=10)\n",
"for label, color in STATUS.items():\n",
" axes[0, 0].plot([], [], color=color, lw=6, label=label)\n",
"axes[0, 0].plot([], [], color=\"#ffffff\", lw=6, alpha=0.6, label=\"outside swath\")\n",
"axes[0, 0].legend(loc=\"lower left\", fontsize=8, frameon=True)\n",
- "fig.suptitle(f\"Heavy precipitation features, {example_time:%Y-%m-%d %H:%M}-{example_time + frame_duration:%H:%M} UTC (Nature Run {nature_start:%Y})\")\n",
+ "fig.suptitle(\n",
+ " f\"Heavy precipitation features, {example_time:%Y-%m-%d %H:%M}-{example_time + frame_duration:%H:%M} UTC (Nature Run {nature_start:%Y})\"\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()"
]
@@ -1794,10 +1909,10 @@
"id": "37988d01",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:47:50.257606Z",
- "iopub.status.busy": "2026-10-24T21:47:50.257606Z",
- "iopub.status.idle": "2026-10-24T21:47:50.281200Z",
- "shell.execute_reply": "2026-10-24T21:47:50.281200Z"
+ "iopub.execute_input": "2026-10-25T04:52:57.577886Z",
+ "iopub.status.busy": "2026-10-25T04:52:57.577886Z",
+ "iopub.status.idle": "2026-10-25T04:52:57.601832Z",
+ "shell.execute_reply": "2026-10-25T04:52:57.601832Z"
}
},
"outputs": [
@@ -2052,7 +2167,9 @@
" \"features\": len(r),\n",
" \"observed (%)\": 100 * r.observed.mean(),\n",
" \"resolved (%)\": 100 * r.resolved.mean(),\n",
- " \"resolved (% of precipitation)\": 100 * r.tot_prectot[r.resolved].sum() / r.tot_prectot.sum(),\n",
+ " \"resolved (% of precipitation)\": 100\n",
+ " * r.tot_prectot[r.resolved].sum()\n",
+ " / r.tot_prectot.sum(),\n",
" \"median element of observed (km)\": r.element_km[r.observed].median(),\n",
" }\n",
" )\n",
@@ -2060,8 +2177,12 @@
"\n",
"summary = pd.concat(\n",
" {\n",
- " \"all\": results.groupby([\"kind\", \"sensor\"]).apply(summarize, include_groups=False),\n",
- " \"storm\": results[results.region == \"storm\"].groupby([\"kind\", \"sensor\"]).apply(summarize, include_groups=False),\n",
+ " \"all\": results.groupby([\"kind\", \"sensor\"]).apply(\n",
+ " summarize, include_groups=False\n",
+ " ),\n",
+ " \"storm\": results[results.region == \"storm\"]\n",
+ " .groupby([\"kind\", \"sensor\"])\n",
+ " .apply(summarize, include_groups=False),\n",
" },\n",
" names=[\"features\"],\n",
")\n",
@@ -2086,10 +2207,10 @@
"id": "705ebfc2",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:47:50.283206Z",
- "iopub.status.busy": "2026-10-24T21:47:50.283206Z",
- "iopub.status.idle": "2026-10-24T21:47:50.458744Z",
- "shell.execute_reply": "2026-10-24T21:47:50.458744Z"
+ "iopub.execute_input": "2026-10-25T04:52:57.603840Z",
+ "iopub.status.busy": "2026-10-25T04:52:57.603840Z",
+ "iopub.status.idle": "2026-10-25T04:52:57.777760Z",
+ "shell.execute_reply": "2026-10-25T04:52:57.777760Z"
}
},
"outputs": [
@@ -2105,10 +2226,25 @@
}
],
"source": [
- "BLUE, ORANGE, AQUA, YELLOW, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#eda100\", \"#8a8984\", \"#0b0b0b\"\n",
+ "BLUE, ORANGE, AQUA, YELLOW, GRAY, INK = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#eda100\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ ")\n",
"SENSOR_COLORS = {\"ATMS\": BLUE, \"Future MW\": ORANGE, \"CrIS\": AQUA, \"Future IR\": YELLOW}\n",
"SENSOR_STYLES = {\"ATMS\": \"-\", \"Future MW\": \"--\", \"CrIS\": \"-\", \"Future IR\": \"--\"}\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"\n",
"edges = np.array([EFFECTIVE_RESOLUTION_KM, 40, 56, 80, 112, np.inf])\n",
"labels = [f\"{EFFECTIVE_RESOLUTION_KM}-40\", \"40-56\", \"56-80\", \"80-112\", \">112\"]\n",
@@ -2118,12 +2254,33 @@
"for ax, kind in zip(axes, KINDS):\n",
" of_kind = results[results.kind == kind]\n",
" observed = of_kind[of_kind.observed]\n",
- " by_size = observed.groupby([\"sensor\", \"size_class\"], observed=False).resolved.mean().unstack().loc[sensors.index] * 100\n",
+ " by_size = (\n",
+ " observed.groupby([\"sensor\", \"size_class\"], observed=False)\n",
+ " .resolved.mean()\n",
+ " .unstack()\n",
+ " .loc[sensors.index]\n",
+ " * 100\n",
+ " )\n",
" for sensor in sensors.index:\n",
- " ax.plot(labels, by_size.loc[sensor], marker=\"o\", color=SENSOR_COLORS[sensor], ls=SENSOR_STYLES[sensor], label=sensor)\n",
- " counts = observed[observed.sensor == \"CrIS\"].groupby(\"size_class\", observed=False).size()\n",
- " ax.set_xticks(range(len(labels)), [f\"{label}\\n(n = {n})\" for label, n in zip(labels, counts)])\n",
- " ax.set(xlabel=\"Feature diameter (km), with the number observed in the CrIS swath\", title=f\"{kind.capitalize()} features\", ylim=(0, 105))\n",
+ " ax.plot(\n",
+ " labels,\n",
+ " by_size.loc[sensor],\n",
+ " marker=\"o\",\n",
+ " color=SENSOR_COLORS[sensor],\n",
+ " ls=SENSOR_STYLES[sensor],\n",
+ " label=sensor,\n",
+ " )\n",
+ " counts = (\n",
+ " observed[observed.sensor == \"CrIS\"].groupby(\"size_class\", observed=False).size()\n",
+ " )\n",
+ " ax.set_xticks(\n",
+ " range(len(labels)), [f\"{label}\\n(n = {n})\" for label, n in zip(labels, counts)]\n",
+ " )\n",
+ " ax.set(\n",
+ " xlabel=\"Feature diameter (km), with the number observed in the CrIS swath\",\n",
+ " title=f\"{kind.capitalize()} features\",\n",
+ " ylim=(0, 105),\n",
+ " )\n",
" ax.title.set_fontsize(10)\n",
"axes[0].set_ylabel(\"Observed features resolved (%)\")\n",
"axes[0].legend(frameon=False, fontsize=8, loc=\"lower right\")\n",
diff --git a/docs/examples/RunOSSEMonsoon.ipynb b/docs/examples/RunOSSEMonsoon.ipynb
index 78f90c32..7b6eb7b2 100644
--- a/docs/examples/RunOSSEMonsoon.ipynb
+++ b/docs/examples/RunOSSEMonsoon.ipynb
@@ -45,10 +45,10 @@
"id": "d4c76230",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:27.746711Z",
- "iopub.status.busy": "2026-10-24T21:16:27.745208Z",
- "iopub.status.idle": "2026-10-24T21:16:28.704832Z",
- "shell.execute_reply": "2026-10-24T21:16:28.704832Z"
+ "iopub.execute_input": "2026-10-25T04:53:08.862564Z",
+ "iopub.status.busy": "2026-10-25T04:53:08.862564Z",
+ "iopub.status.idle": "2026-10-25T04:53:09.846840Z",
+ "shell.execute_reply": "2026-10-25T04:53:09.846840Z"
}
},
"outputs": [],
@@ -92,10 +92,10 @@
"id": "8f96f040",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:28.707343Z",
- "iopub.status.busy": "2026-10-24T21:16:28.707343Z",
- "iopub.status.idle": "2026-10-24T21:16:30.273969Z",
- "shell.execute_reply": "2026-10-24T21:16:30.273464Z"
+ "iopub.execute_input": "2026-10-25T04:53:09.849358Z",
+ "iopub.status.busy": "2026-10-25T04:53:09.849358Z",
+ "iopub.status.idle": "2026-10-25T04:53:11.387609Z",
+ "shell.execute_reply": "2026-10-25T04:53:11.387609Z"
}
},
"outputs": [
@@ -486,7 +486,7 @@
" Conventions: COARDS\\nGrADS\n",
" dataType: Grid\n",
" history: Mon Sep 28 14:37:35 EDT 2026 : imported by GrADS Da...\n",
- " extra_das_attribute: This is an example of metadata added using a supple...
xarray.Dataset
time: 96
lat: 113
lon: 193
time
(time)
datetime64[ns]
2005-07-16T00:15:00 ... 2005-07-...
grads_dim :
t
grads_mapping :
linear
grads_size :
36576
grads_min :
21:15z15may2005
grads_step :
30mn
long_name :
time
minimum :
21:15z15may2005
maximum :
20:45z16jun2007
resolution :
0.020833334
array(['2005-07-16T00:15:00.000000000', '2005-07-16T00:45:00.000000000',\n",
+ " extra_das_attribute: This is an example of metadata added using a supple...
Mon Sep 28 14:37:35 EDT 2026 : imported by GrADS Data Server 2.0
extra_das_attribute :
This is an example of metadata added using a supplementary DAS file. See testdata/extra.das for the source.
"
],
"text/plain": [
@@ -759,14 +759,19 @@
" minx, miny, maxx, maxy = domain.bounds\n",
" with xr.open_dataset(G5NR_URL, decode_times=True) as remote:\n",
" remote[[\"lwtup\", \"preccon\"]].sel(\n",
- " time=slice(nature_start.replace(tzinfo=None), (nature_start + duration).replace(tzinfo=None)),\n",
+ " time=slice(\n",
+ " nature_start.replace(tzinfo=None),\n",
+ " (nature_start + duration).replace(tzinfo=None),\n",
+ " ),\n",
" lon=slice(minx, maxx),\n",
" lat=slice(miny, maxy),\n",
" ).load().to_netcdf(nature_file)\n",
" nature = xr.load_dataset(nature_file)\n",
" assert nature.sizes[\"time\"] == int(duration / frame_duration)\n",
" # each time stamp is the middle of its 30-minute averaging interval\n",
- " assert (nature.time.values[0] - np.datetime64(nature_start.replace(tzinfo=None))) == np.timedelta64(15, \"m\")\n",
+ " assert (\n",
+ " nature.time.values[0] - np.datetime64(nature_start.replace(tzinfo=None))\n",
+ " ) == np.timedelta64(15, \"m\")\n",
" return nature\n",
"\n",
"\n",
@@ -792,10 +797,10 @@
"id": "25deaf45",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:30.275971Z",
- "iopub.status.busy": "2026-10-24T21:16:30.275971Z",
- "iopub.status.idle": "2026-10-24T21:16:31.863266Z",
- "shell.execute_reply": "2026-10-24T21:16:31.862756Z"
+ "iopub.execute_input": "2026-10-25T04:53:11.390389Z",
+ "iopub.status.busy": "2026-10-25T04:53:11.389382Z",
+ "iopub.status.idle": "2026-10-25T04:53:12.999514Z",
+ "shell.execute_reply": "2026-10-25T04:53:12.999514Z"
}
},
"outputs": [
@@ -956,21 +961,29 @@
"\n",
"from tatc.constants import EARTH_MEAN_RADIUS, de421, timescale\n",
"\n",
- "THRESHOLD = 5.67037e-8 * 220**4 # W m-2, the upwelling longwave flux of a 220 K blackbody\n",
- "EFFECTIVE_RESOLUTION_KM = 4 * 7 # km, several grid spacings (Gelaro et al., 2015); smaller features are not resolved\n",
+ "THRESHOLD = (\n",
+ " 5.67037e-8 * 220**4\n",
+ ") # W m-2, the upwelling longwave flux of a 220 K blackbody\n",
+ "EFFECTIVE_RESOLUTION_KM = (\n",
+ " 4 * 7\n",
+ ") # km, several grid spacings (Gelaro et al., 2015); smaller features are not resolved\n",
"\n",
"\n",
"def find_features(nature):\n",
" \"\"\"The features (contiguous cold cloud tops at least EFFECTIVE_RESOLUTION_KM in size) in each frame of the nature run.\"\"\"\n",
" lon, lat = nature.lon.values, nature.lat.values\n",
" lon2d, lat2d = np.meshgrid(lon, lat)\n",
- " cell_area = (EARTH_MEAN_RADIUS * np.radians(GRID_SIZE)) ** 2 * np.cos(np.radians(lat2d)) # m^2\n",
+ " cell_area = (EARTH_MEAN_RADIUS * np.radians(GRID_SIZE)) ** 2 * np.cos(\n",
+ " np.radians(lat2d)\n",
+ " ) # m^2\n",
"\n",
" records, polygons = [], []\n",
" for frame in range(nature.sizes[\"time\"]):\n",
" lwtup = nature[\"lwtup\"].isel(time=frame).values\n",
" preccon = nature[\"preccon\"].isel(time=frame).values\n",
- " labels, n_labels = ndi.label(lwtup < THRESHOLD) # contiguous cells colder than the threshold\n",
+ " labels, n_labels = ndi.label(\n",
+ " lwtup < THRESHOLD\n",
+ " ) # contiguous cells colder than the threshold\n",
" if n_labels == 0:\n",
" continue\n",
" ids = np.arange(1, n_labels + 1)\n",
@@ -981,7 +994,10 @@
" order = np.argsort(labels[j, i], kind=\"stable\")\n",
" j, i = j[order], i[order]\n",
" cells = shapely.box(\n",
- " lon[i] - GRID_SIZE / 2, lat[j] - GRID_SIZE / 2, lon[i] + GRID_SIZE / 2, lat[j] + GRID_SIZE / 2\n",
+ " lon[i] - GRID_SIZE / 2,\n",
+ " lat[j] - GRID_SIZE / 2,\n",
+ " lon[i] + GRID_SIZE / 2,\n",
+ " lat[j] + GRID_SIZE / 2,\n",
" )\n",
" for k, cluster in enumerate(np.split(cells, np.cumsum(n_cells)[:-1])):\n",
" records.append(\n",
@@ -999,11 +1015,17 @@
" polygons.append(shapely.union_all(cluster))\n",
"\n",
" features = gpd.GeoDataFrame(records, geometry=polygons, crs=\"EPSG:4326\")\n",
- " features[\"diameter_km\"] = np.sqrt(4 * features.area_km2 / np.pi) # of a circle of equal area\n",
- " features = features[features.diameter_km >= EFFECTIVE_RESOLUTION_KM].reset_index(drop=True)\n",
+ " features[\"diameter_km\"] = np.sqrt(\n",
+ " 4 * features.area_km2 / np.pi\n",
+ " ) # of a circle of equal area\n",
+ " features = features[features.diameter_km >= EFFECTIVE_RESOLUTION_KM].reset_index(\n",
+ " drop=True\n",
+ " )\n",
" features[\"time\"] = start + features.frame * frame_duration\n",
" # solar hour at the feature (hour angle of the Sun plus 12 hours) at the middle of the frame, in the Nature Run's year\n",
- " solar_time = timescale.from_datetimes([nature_start + (frame + 0.5) * frame_duration for frame in features.frame])\n",
+ " solar_time = timescale.from_datetimes(\n",
+ " [nature_start + (frame + 0.5) * frame_duration for frame in features.frame]\n",
+ " )\n",
" features[\"solar_hour\"] = (\n",
" de421[\"earth\"] + wgs84.latlon(features.lat.values, features.lon.values)\n",
" ).at(solar_time).observe(de421[\"sun\"]).apparent().hadec()[0].hours + 12\n",
@@ -1011,7 +1033,19 @@
"\n",
"\n",
"features = find_features(nature)\n",
- "features[[\"time\", \"n_cells\", \"area_km2\", \"diameter_km\", \"lon\", \"lat\", \"min_lwtup\", \"max_preccon\", \"solar_hour\"]].describe().round(2)"
+ "features[\n",
+ " [\n",
+ " \"time\",\n",
+ " \"n_cells\",\n",
+ " \"area_km2\",\n",
+ " \"diameter_km\",\n",
+ " \"lon\",\n",
+ " \"lat\",\n",
+ " \"min_lwtup\",\n",
+ " \"max_preccon\",\n",
+ " \"solar_hour\",\n",
+ " ]\n",
+ "].describe().round(2)"
]
},
{
@@ -1043,10 +1077,10 @@
"id": "4c6a2204",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:31.865273Z",
- "iopub.status.busy": "2026-10-24T21:16:31.865273Z",
- "iopub.status.idle": "2026-10-24T21:16:31.892545Z",
- "shell.execute_reply": "2026-10-24T21:16:31.892545Z"
+ "iopub.execute_input": "2026-10-25T04:53:13.001519Z",
+ "iopub.status.busy": "2026-10-25T04:53:13.001519Z",
+ "iopub.status.idle": "2026-10-25T04:53:13.031499Z",
+ "shell.execute_reply": "2026-10-25T04:53:13.030995Z"
}
},
"outputs": [
@@ -1164,7 +1198,9 @@
" field_of_regard=field_of_regard,\n",
" cross_track_field_of_view=field_of_regard,\n",
" along_track_field_of_view=compute_along_track_field_of_view(\n",
- " orbits[\"NOAA-20\"].get_mean_altitude(), TIME_STEP, orbits[\"NOAA-20\"].get_inclination()\n",
+ " orbits[\"NOAA-20\"].get_mean_altitude(),\n",
+ " TIME_STEP,\n",
+ " orbits[\"NOAA-20\"].get_inclination(),\n",
" ),\n",
" roll_angle=scan[\"roll\"],\n",
" is_rectangular=True,\n",
@@ -1173,7 +1209,11 @@
"\n",
"\n",
"satellites = [\n",
- " Satellite(name=name, orbit=orbit, instruments=[swath_instrument(\"ATMS\"), swath_instrument(\"CrIS\")])\n",
+ " Satellite(\n",
+ " name=name,\n",
+ " orbit=orbit,\n",
+ " instruments=[swath_instrument(\"ATMS\"), swath_instrument(\"CrIS\")],\n",
+ " )\n",
" for name, orbit in orbits.items()\n",
"]\n",
"\n",
@@ -1192,7 +1232,43 @@
").set_index(\"sensor\")\n",
"# sample spacing at nadir (km): that of the heritage sensor, scaled for the future sensors in proportion to their footprint\n",
"heritage_km = sensors.horizontal_km[sensors.swath].values\n",
- "sensors[\"sampling_km\"] = REFERENCE_RANGE_KM * np.radians(sensors.swath.map(SAMPLING_DEG)) * sensors.horizontal_km / heritage_km\n",
+ "sensors[\"sampling_km\"] = (\n",
+ " REFERENCE_RANGE_KM\n",
+ " * np.radians(sensors.swath.map(SAMPLING_DEG))\n",
+ " * sensors.horizontal_km\n",
+ " / heritage_km\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def sensor_instrument(sensor):\n",
+ " \"\"\"The swath instrument of a sensor with its pixels (for its sample sizes, see `compute_sample_sizes`): pixels\n",
+ " spaced by the angle that the sample spacing subtends at nadir from the reference range (enough to span the\n",
+ " swath), each with the instantaneous field of view that its horizontal resolution subtends, along and across\n",
+ " track.\"\"\"\n",
+ " row = sensors.loc[sensor]\n",
+ " swath = swath_instrument(row.swath)\n",
+ " ifov = np.degrees(2 * np.arctan(row.horizontal_km / 2 / REFERENCE_RANGE_KM))\n",
+ " spacing = np.degrees(row.sampling_km / REFERENCE_RANGE_KM)\n",
+ " pixels = round(swath.cross_track_field_of_view / spacing)\n",
+ " # the oversampling makes each pixel's field of view ifov (negative: a gap between pixels)\n",
+ " return PointedInstrument(\n",
+ " **swath.model_dump(\n",
+ " exclude={\n",
+ " \"cross_track_field_of_view\",\n",
+ " \"along_track_field_of_view\",\n",
+ " \"cross_track_pixels\",\n",
+ " \"cross_track_oversampling\",\n",
+ " \"along_track_oversampling\",\n",
+ " }\n",
+ " ),\n",
+ " cross_track_field_of_view=pixels * spacing,\n",
+ " along_track_field_of_view=spacing,\n",
+ " cross_track_pixels=pixels,\n",
+ " cross_track_oversampling=1 - spacing / ifov,\n",
+ " along_track_oversampling=1 - spacing / ifov,\n",
+ " )\n",
+ "\n",
+ "\n",
"sensors.round(1)"
]
},
@@ -1212,10 +1288,10 @@
"id": "01285f14",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:31.894549Z",
- "iopub.status.busy": "2026-10-24T21:16:31.894549Z",
- "iopub.status.idle": "2026-10-24T21:16:32.183675Z",
- "shell.execute_reply": "2026-10-24T21:16:32.183675Z"
+ "iopub.execute_input": "2026-10-25T04:53:13.033388Z",
+ "iopub.status.busy": "2026-10-25T04:53:13.033388Z",
+ "iopub.status.idle": "2026-10-25T04:53:13.321446Z",
+ "shell.execute_reply": "2026-10-25T04:53:13.321446Z"
}
},
"outputs": [
@@ -1329,7 +1405,10 @@
"def collect_tracks(satellites, duration):\n",
" \"\"\"The footprint of every instrument of the satellites at each time step over a duration from start, clipped to the\n",
" study region, with its frame.\"\"\"\n",
- " times = [start + timedelta(seconds=TIME_STEP * (i + 0.5)) for i in range(int(duration.total_seconds() // TIME_STEP))]\n",
+ " times = [\n",
+ " start + timedelta(seconds=TIME_STEP * (i + 0.5))\n",
+ " for i in range(int(duration.total_seconds() // TIME_STEP))\n",
+ " ]\n",
" tracks = collect_ground_track(satellites, times, instrument_index=None, mask=domain)\n",
" tracks = tracks[tracks.valid_obs].reset_index(drop=True)\n",
" tracks[\"geometry\"] = shapely.force_2d(tracks.geometry.values)\n",
@@ -1340,7 +1419,9 @@
"tracks = collect_tracks(satellites, duration)\n",
"# the area swept by each swath (ATMS or CrIS) in each frame\n",
"swaths = tracks.groupby([\"frame\", \"instrument\"]).geometry.agg(shapely.union_all)\n",
- "tracks.groupby([\"satellite\", \"instrument\"]).agg(footprints=(\"time\", \"size\"), first=(\"time\", \"min\"), last=(\"time\", \"max\"))"
+ "tracks.groupby([\"satellite\", \"instrument\"]).agg(\n",
+ " footprints=(\"time\", \"size\"), first=(\"time\", \"min\"), last=(\"time\", \"max\")\n",
+ ")"
]
},
{
@@ -1352,11 +1433,13 @@
"\n",
"A feature is **observed** by a swath if the swath footprint of some time step in its frame overlaps it. A **look** is one satellite's view of a feature in its frame. It covers the part of the feature inside that satellite's swath, which is only part of it if the feature straddles the swath edge, and the size of this viewed part (the diameter of a circle of the same area) is what the sensor must resolve.\n",
"\n",
- "For each look, the satellite's slant range and zenith angle at the centroid of the viewed part follow from the satellite position at the time of the footprint that covers most of it (TAT-C's orbit propagation), and give the size of the sensor's resolution element there: the element's angular size (the larger of the footprint and the sample spacing at nadir) times the slant range along track, and longer by the secant of the zenith angle across track. The validation notebooks confirmed this geometry against the reported viewing geometry of real data. Two measures of the size of the element are offered (`ELEMENT_AXIS`):\n",
+ "For each look, the satellite's slant range and zenith angle at the centroid of the viewed part follow from the satellite position at the time of the footprint that covers most of it (TAT-C's orbit propagation), and give the size of the sensor's resolution element there. Each sensor is modeled as its swath's instrument with pixels (`sensor_instrument`), spaced and sized by the angles that its sample spacing and horizontal resolution subtend at nadir, and TAT-C's `compute_sample_sizes` projects a pixel and the spacing between pixels onto the ground at the look, along and across track, so that they grow with the slant range and, across track, with the obliquity of the view. The element is the larger of the two in each direction. The validation notebooks confirmed this geometry against the reported viewing geometry of real data. Two measures of the size of the element are offered (`ELEMENT_AXIS`):\n",
"\n",
"* `\"equivalent\"` (the default): the diameter of a circle of the same area, the geometric mean of the along-track and cross-track sizes; and\n",
"* `\"cross-track\"`: the cross-track size, a stricter measure, which is up to about 2.3 times the along-track size at the swath edges of ATMS and 1.9 times at those of CrIS.\n",
"\n",
+ "TAT-C's `collect_feature_observations` collects the looks at features that exist for a period of time (here, each feature's frame), with the viewing geometry of each.\n",
+ "\n",
"If a feature has several looks, the best (the one whose viewed part spans the most resolution elements) is used.\n",
"\n",
"A feature is **resolved** if its viewed part spans at least `RESOLUTION_FACTOR` resolution elements. The default of two is a heuristic (a feature must span at least a couple of independent samples to be distinguished from its surroundings), and the sensitivity to it and to the measure of the element is shown below."
@@ -1368,10 +1451,10 @@
"id": "d40d4f90",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:32.186673Z",
- "iopub.status.busy": "2026-10-24T21:16:32.186673Z",
- "iopub.status.idle": "2026-10-24T21:16:32.302264Z",
- "shell.execute_reply": "2026-10-24T21:16:32.302264Z"
+ "iopub.execute_input": "2026-10-25T04:53:13.324454Z",
+ "iopub.status.busy": "2026-10-25T04:53:13.324454Z",
+ "iopub.status.idle": "2026-10-25T04:53:13.698980Z",
+ "shell.execute_reply": "2026-10-25T04:53:13.698980Z"
}
},
"outputs": [
@@ -1463,103 +1546,84 @@
}
],
"source": [
- "from pyproj import Transformer\n",
- "from skyfield.framelib import itrs\n",
+ "from tatc.analysis import collect_feature_observations, compute_sample_sizes\n",
"\n",
"RESOLUTION_FACTOR = 2 # a feature is resolved if its viewed part spans at least this many resolution elements\n",
"ELEMENT_AXIS = \"equivalent\" # the size of a resolution element: \"equivalent\" (diameter of equal area) or \"cross-track\"\n",
"AXES = [\"equivalent\", \"cross-track\"]\n",
"\n",
- "TO_ECEF = Transformer.from_crs(\"EPSG:4979\", \"EPSG:4978\", always_xy=True)\n",
- "\n",
"\n",
- "def up(lon, lat):\n",
- " \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
- " lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
- "\n",
- "\n",
- "def element_size(slant_range, zenith, nadir_km, axis):\n",
- " \"\"\"Size (km) of a resolution element of size nadir_km at nadir: its angular size times the slant range (m) along\n",
- " track, and longer by the secant of the zenith angle (deg) cross track. The size is the diameter of a circle of the\n",
- " same area (axis=\"equivalent\", the geometric mean of the two) or the cross-track size (axis=\"cross-track\").\"\"\"\n",
- " along = slant_range / 1e3 * nadir_km / REFERENCE_RANGE_KM\n",
- " cross = along / np.cos(np.radians(zenith))\n",
- " return cross if axis == \"cross-track\" else np.sqrt(along * cross)\n",
- "\n",
- "\n",
- "def collect_looks(tracks, features, orbits):\n",
- " \"\"\"The looks at the features from the tracks: the part of each feature inside a satellite's swath in its frame, at\n",
- " the time of the footprint that covers most of it, with the slant range and zenith angle at its centroid.\"\"\"\n",
- " # pieces: the parts of each feature inside each footprint (of a satellite's instrument, at a time) in the same frame\n",
- " pieces = gpd.sjoin(\n",
- " features[[\"frame\", \"geometry\"]],\n",
- " tracks[[\"frame\", \"satellite\", \"instrument\", \"time\", \"geometry\"]].rename(columns={\"frame\": \"frame_track\"}),\n",
- " predicate=\"intersects\",\n",
- " )\n",
- " pieces = pieces[pieces.frame == pieces.frame_track].rename_axis(\"feature\").reset_index()\n",
- " pieces[\"geometry\"] = shapely.intersection(pieces.geometry.values, tracks.geometry.values[pieces.index_right])\n",
- " pieces[\"piece_area\"] = shapely.area(pieces.geometry.values)\n",
- "\n",
- " # looks: the part of each feature inside a satellite's swath, at the time of the footprint that covers most of it\n",
- " looks = (\n",
- " pieces.sort_values(\"piece_area\", ascending=False)\n",
- " .groupby([\"feature\", \"satellite\", \"instrument\"])\n",
- " .agg(time=(\"time\", \"first\"), geometry=(\"geometry\", shapely.union_all))\n",
- " .reset_index()\n",
+ "def collect_looks(satellites, duration, features):\n",
+ " \"\"\"The looks at the features (see `collect_feature_observations`): each satellite's view of the part of each\n",
+ " feature inside its swath in the feature's frame, at the time of the footprint that covers most of it, with the\n",
+ " size of the viewed part and the slant range and zenith angle at its centroid.\"\"\"\n",
+ " times = [\n",
+ " start + timedelta(seconds=TIME_STEP * (i + 0.5))\n",
+ " for i in range(int(duration.total_seconds() // TIME_STEP))\n",
+ " ]\n",
+ " looks = collect_feature_observations(\n",
+ " features.assign(start=features.time, end=features.time + frame_duration),\n",
+ " satellites,\n",
+ " times,\n",
" )\n",
- " looks[\"viewed_fraction\"] = np.minimum(\n",
- " 1, shapely.area(looks.geometry.values) / shapely.area(features.geometry.values[looks.feature])\n",
+ " looks[\"viewed_km\"] = np.sqrt(\n",
+ " 4 * looks.viewed_fraction * features.area_km2.values[looks.feature] / np.pi\n",
" )\n",
- " looks[\"viewed_km\"] = np.sqrt(4 * looks.viewed_fraction * features.area_km2.values[looks.feature] / np.pi)\n",
- " centroids = shapely.centroid(looks.geometry.values)\n",
- " looks[\"lon\"], looks[\"lat\"] = shapely.get_x(centroids), shapely.get_y(centroids)\n",
- "\n",
- " # the viewing geometry (slant range and zenith angle) from the satellite position at the time of the footprint\n",
- " looks[\"range_m\"], looks[\"zenith\"] = np.nan, np.nan\n",
- " for name, group in looks.groupby(\"satellite\"):\n",
- " sat_xyz = np.array(orbits[name].to_gp_orbit().get_orbit_track(list(group.time)).frame_xyz(itrs).m).T\n",
- " target = np.stack(TO_ECEF.transform(group.lon.values, group.lat.values, np.zeros(len(group))), axis=-1)\n",
- " line_of_sight = sat_xyz - target\n",
- " looks.loc[group.index, \"range_m\"] = np.linalg.norm(line_of_sight, axis=-1)\n",
- " looks.loc[group.index, \"zenith\"] = np.degrees(\n",
- " np.arccos(\n",
- " np.sum(line_of_sight * up(group.lon.values, group.lat.values), axis=-1)\n",
- " / np.linalg.norm(line_of_sight, axis=-1)\n",
- " )\n",
- " )\n",
+ " looks[\"range_m\"], looks[\"zenith\"] = looks.sat_range, 90 - looks.sat_alt\n",
" return looks\n",
"\n",
"\n",
- "def assess(looks, features):\n",
+ "def assess(looks, features, satellites):\n",
" \"\"\"Whether each sensor observes and resolves each feature, from its best look.\"\"\"\n",
" results = []\n",
" for sensor, row in sensors.iterrows():\n",
- " sensor_looks = looks[looks.instrument == row.swath].copy()\n",
- " # the resolution element at nadir is the larger of the footprint and the sample spacing\n",
- " nadir_km = max(row.horizontal_km, row.sampling_km)\n",
- " for axis in AXES:\n",
- " element_km = element_size(sensor_looks.range_m, sensor_looks.zenith, nadir_km, axis)\n",
+ " # the sizes of the sensor's samples at its looks, flown on the same satellites\n",
+ " sensor_satellites = [\n",
+ " satellite.model_copy(update={\"instruments\": [sensor_instrument(sensor)]})\n",
+ " for satellite in satellites\n",
+ " ]\n",
+ " sensor_looks = compute_sample_sizes(\n",
+ " looks[looks.instrument == row.swath], sensor_satellites\n",
+ " )\n",
+ " # the resolution element is the larger of a sample and the spacing between samples (km), along and across track\n",
+ " along = np.maximum(sensor_looks.sample_along, sensor_looks.spacing_along) / 1e3\n",
+ " cross = np.maximum(sensor_looks.sample_cross, sensor_looks.spacing_cross) / 1e3\n",
+ " for axis, element_km in {\n",
+ " \"equivalent\": np.sqrt(along * cross),\n",
+ " \"cross-track\": cross,\n",
+ " }.items():\n",
" sensor_looks[f\"elements ({axis})\"] = sensor_looks.viewed_km / element_km\n",
" if axis == ELEMENT_AXIS:\n",
" sensor_looks[\"element_km\"] = element_km\n",
" # the best look at each feature: the one whose viewed part spans the most resolution elements\n",
- " best = sensor_looks.loc[sensor_looks.groupby(\"feature\")[f\"elements ({ELEMENT_AXIS})\"].idxmax()].set_index(\"feature\")\n",
- " result = features[[\"frame\", \"diameter_km\", \"area_km2\", \"tot_preccon\", \"solar_hour\"]].copy()\n",
+ " best = sensor_looks.loc[\n",
+ " sensor_looks.groupby(\"feature\")[f\"elements ({ELEMENT_AXIS})\"].idxmax()\n",
+ " ].set_index(\"feature\")\n",
+ " result = features[\n",
+ " [\"frame\", \"diameter_km\", \"area_km2\", \"tot_preccon\", \"solar_hour\"]\n",
+ " ].copy()\n",
" result[\"sensor\"] = sensor\n",
- " result[\"looks\"] = sensor_looks.groupby(\"feature\").size().reindex(result.index, fill_value=0)\n",
+ " result[\"looks\"] = (\n",
+ " sensor_looks.groupby(\"feature\").size().reindex(result.index, fill_value=0)\n",
+ " )\n",
" result[\"observed\"] = result.looks > 0\n",
- " result = result.join(best[[\"satellite\", \"zenith\", \"viewed_fraction\", \"viewed_km\", \"element_km\"]])\n",
+ " result = result.join(\n",
+ " best[[\"satellite\", \"zenith\", \"viewed_fraction\", \"viewed_km\", \"element_km\"]]\n",
+ " )\n",
" for axis in AXES:\n",
- " result[f\"elements ({axis})\"] = sensor_looks.groupby(\"feature\")[f\"elements ({axis})\"].max()\n",
+ " result[f\"elements ({axis})\"] = sensor_looks.groupby(\"feature\")[\n",
+ " f\"elements ({axis})\"\n",
+ " ].max()\n",
" result[\"resolved\"] = result[f\"elements ({ELEMENT_AXIS})\"] >= RESOLUTION_FACTOR\n",
" results.append(result)\n",
" return pd.concat(results).reset_index().rename(columns={\"index\": \"feature\"})\n",
"\n",
"\n",
- "looks = collect_looks(tracks, features, orbits)\n",
- "results = assess(looks, features)\n",
- "results.groupby(\"sensor\")[[\"observed\", \"resolved\"]].sum().join(sensors).loc[sensors.index].round(1)"
+ "looks = collect_looks(satellites, duration, features)\n",
+ "results = assess(looks, features, satellites)\n",
+ "results.groupby(\"sensor\")[[\"observed\", \"resolved\"]].sum().join(sensors).loc[\n",
+ " sensors.index\n",
+ "].round(1)"
]
},
{
@@ -1578,10 +1642,10 @@
"id": "aa237b59",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:32.304268Z",
- "iopub.status.busy": "2026-10-24T21:16:32.304268Z",
- "iopub.status.idle": "2026-10-24T21:16:35.105621Z",
- "shell.execute_reply": "2026-10-24T21:16:35.105621Z"
+ "iopub.execute_input": "2026-10-25T04:53:13.701987Z",
+ "iopub.status.busy": "2026-10-25T04:53:13.700986Z",
+ "iopub.status.idle": "2026-10-25T04:53:16.495768Z",
+ "shell.execute_reply": "2026-10-25T04:53:16.495768Z"
}
},
"outputs": [
@@ -1602,32 +1666,72 @@
"\n",
"# the frame with the most features whose status (not observed, observed, or resolved) differs between the sensors\n",
"status = results.observed.astype(int) + results.resolved.astype(int)\n",
- "example = (status.groupby([results.frame, results.feature]).nunique() > 1).groupby(\"frame\").sum().idxmax()\n",
+ "example = (\n",
+ " (status.groupby([results.frame, results.feature]).nunique() > 1)\n",
+ " .groupby(\"frame\")\n",
+ " .sum()\n",
+ " .idxmax()\n",
+ ")\n",
"example_time = start + example * frame_duration\n",
- "STATUS = {\"not observed\": \"#d9d8d3\", \"observed, not resolved\": \"#eb6834\", \"resolved\": \"#2a78d6\"}\n",
+ "STATUS = {\n",
+ " \"not observed\": \"#d9d8d3\",\n",
+ " \"observed, not resolved\": \"#eb6834\",\n",
+ " \"resolved\": \"#2a78d6\",\n",
+ "}\n",
"\n",
- "fig, axes = plt.subplots(2, 2, figsize=(12, 8), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, axes = plt.subplots(\n",
+ " 2, 2, figsize=(12, 8), subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"for ax, sensor in zip(axes.ravel(), sensors.index):\n",
" background = nature[\"lwtup\"].isel(time=example)\n",
- " ax.pcolormesh(background.lon, background.lat, background, cmap=\"Greys_r\", vmin=100, vmax=450, shading=\"auto\", transform=ccrs.PlateCarree())\n",
+ " ax.pcolormesh(\n",
+ " background.lon,\n",
+ " background.lat,\n",
+ " background,\n",
+ " cmap=\"Greys_r\",\n",
+ " vmin=100,\n",
+ " vmax=450,\n",
+ " shading=\"auto\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
" members = results[(results.sensor == sensor) & (results.frame == example)]\n",
- " status = np.where(members.resolved, \"resolved\", np.where(members.observed, \"observed, not resolved\", \"not observed\"))\n",
+ " status = np.where(\n",
+ " members.resolved,\n",
+ " \"resolved\",\n",
+ " np.where(members.observed, \"observed, not resolved\", \"not observed\"),\n",
+ " )\n",
" for label, color in STATUS.items():\n",
" selected = features.loc[members.feature[status == label]]\n",
" if len(selected):\n",
- " selected.plot(ax=ax, facecolor=color, edgecolor=\"black\", linewidth=0.4, transform=ccrs.PlateCarree())\n",
+ " selected.plot(\n",
+ " ax=ax,\n",
+ " facecolor=color,\n",
+ " edgecolor=\"black\",\n",
+ " linewidth=0.4,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
" # fade the part of the study region outside the swath\n",
" swath = swaths.get((example, sensors.loc[sensor, \"swath\"]))\n",
" outside = domain if swath is None else domain.difference(swath)\n",
- " ax.add_geometries([outside], crs=ccrs.PlateCarree(), facecolor=\"white\", edgecolor=\"none\", alpha=0.6)\n",
+ " ax.add_geometries(\n",
+ " [outside],\n",
+ " crs=ccrs.PlateCarree(),\n",
+ " facecolor=\"white\",\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.6,\n",
+ " )\n",
" ax.add_feature(cfeature.STATES, edgecolor=\"white\", linewidth=0.5)\n",
- " ax.set_extent([domain.bounds[0], domain.bounds[2], domain.bounds[1], domain.bounds[3]])\n",
+ " ax.set_extent(\n",
+ " [domain.bounds[0], domain.bounds[2], domain.bounds[1], domain.bounds[3]]\n",
+ " )\n",
" ax.set_title(f\"{sensor} ({sensors.loc[sensor, 'horizontal_km']} km)\", fontsize=10)\n",
"for label, color in STATUS.items():\n",
" axes[0, 0].plot([], [], color=color, lw=6, label=label)\n",
"axes[0, 0].plot([], [], color=\"#ffffff\", lw=6, alpha=0.6, label=\"outside swath\")\n",
"axes[0, 0].legend(loc=\"lower left\", fontsize=8, frameon=True)\n",
- "fig.suptitle(f\"Cold cloud top features, {example_time:%Y-%m-%d %H:%M}-{example_time + frame_duration:%H:%M} UTC (Nature Run {nature_start:%Y})\")\n",
+ "fig.suptitle(\n",
+ " f\"Cold cloud top features, {example_time:%Y-%m-%d %H:%M}-{example_time + frame_duration:%H:%M} UTC (Nature Run {nature_start:%Y})\"\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()"
]
@@ -1648,10 +1752,10 @@
"id": "fd2fc711",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:35.109625Z",
- "iopub.status.busy": "2026-10-24T21:16:35.108625Z",
- "iopub.status.idle": "2026-10-24T21:16:35.121050Z",
- "shell.execute_reply": "2026-10-24T21:16:35.121050Z"
+ "iopub.execute_input": "2026-10-25T04:53:16.499289Z",
+ "iopub.status.busy": "2026-10-25T04:53:16.499289Z",
+ "iopub.status.idle": "2026-10-25T04:53:16.517435Z",
+ "shell.execute_reply": "2026-10-25T04:53:16.516429Z"
}
},
"outputs": [
@@ -1757,19 +1861,33 @@
}
],
"source": [
- "total = {\"features\": len(features), \"area\": features.area_km2.sum(), \"precipitation\": features.tot_preccon.sum()}\n",
- "summary = results.groupby(\"sensor\").apply(\n",
- " lambda r: pd.Series(\n",
- " {\n",
- " \"observed (% of features)\": 100 * r.observed.mean(),\n",
- " \"resolved (% of features)\": 100 * r.resolved.mean(),\n",
- " \"resolved (% of area)\": 100 * r.area_km2[r.resolved].sum() / total[\"area\"],\n",
- " \"resolved (% of precipitation)\": 100 * r.tot_preccon[r.resolved].sum() / total[\"precipitation\"],\n",
- " \"median resolution element of observed (km)\": r.element_km[r.observed].median(),\n",
- " }\n",
- " ),\n",
- " include_groups=False,\n",
- ").loc[sensors.index]\n",
+ "total = {\n",
+ " \"features\": len(features),\n",
+ " \"area\": features.area_km2.sum(),\n",
+ " \"precipitation\": features.tot_preccon.sum(),\n",
+ "}\n",
+ "summary = (\n",
+ " results.groupby(\"sensor\")\n",
+ " .apply(\n",
+ " lambda r: pd.Series(\n",
+ " {\n",
+ " \"observed (% of features)\": 100 * r.observed.mean(),\n",
+ " \"resolved (% of features)\": 100 * r.resolved.mean(),\n",
+ " \"resolved (% of area)\": 100\n",
+ " * r.area_km2[r.resolved].sum()\n",
+ " / total[\"area\"],\n",
+ " \"resolved (% of precipitation)\": 100\n",
+ " * r.tot_preccon[r.resolved].sum()\n",
+ " / total[\"precipitation\"],\n",
+ " \"median resolution element of observed (km)\": r.element_km[\n",
+ " r.observed\n",
+ " ].median(),\n",
+ " }\n",
+ " ),\n",
+ " include_groups=False,\n",
+ " )\n",
+ " .loc[sensors.index]\n",
+ ")\n",
"summary.round(1)"
]
},
@@ -1791,10 +1909,10 @@
"id": "985db512",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:35.123054Z",
- "iopub.status.busy": "2026-10-24T21:16:35.123054Z",
- "iopub.status.idle": "2026-10-24T21:16:35.272252Z",
- "shell.execute_reply": "2026-10-24T21:16:35.271247Z"
+ "iopub.execute_input": "2026-10-25T04:53:16.519435Z",
+ "iopub.status.busy": "2026-10-25T04:53:16.519435Z",
+ "iopub.status.idle": "2026-10-25T04:53:16.672362Z",
+ "shell.execute_reply": "2026-10-25T04:53:16.672362Z"
}
},
"outputs": [
@@ -1896,21 +2014,54 @@
}
],
"source": [
- "BLUE, ORANGE, AQUA, YELLOW, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#eda100\", \"#8a8984\", \"#0b0b0b\"\n",
+ "BLUE, ORANGE, AQUA, YELLOW, GRAY, INK = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#eda100\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ ")\n",
"SENSOR_COLORS = {\"ATMS\": BLUE, \"Future MW\": ORANGE, \"CrIS\": AQUA, \"Future IR\": YELLOW}\n",
"SENSOR_STYLES = {\"ATMS\": \"-\", \"Future MW\": \"--\", \"CrIS\": \"-\", \"Future IR\": \"--\"}\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"\n",
"edges = np.array([EFFECTIVE_RESOLUTION_KM, 40, 56, 80, 112, np.inf])\n",
"labels = [f\"{EFFECTIVE_RESOLUTION_KM}-40\", \"40-56\", \"56-80\", \"80-112\", \">112\"]\n",
"results[\"size_class\"] = pd.cut(results.diameter_km, edges, labels=labels, right=False)\n",
- "by_size = results.groupby([\"sensor\", \"size_class\"], observed=False).resolved.mean().unstack().loc[sensors.index] * 100\n",
+ "by_size = (\n",
+ " results.groupby([\"sensor\", \"size_class\"], observed=False)\n",
+ " .resolved.mean()\n",
+ " .unstack()\n",
+ " .loc[sensors.index]\n",
+ " * 100\n",
+ ")\n",
"counts = results[results.sensor == \"ATMS\"].groupby(\"size_class\", observed=False).size()\n",
"\n",
"fig, ax = plt.subplots(figsize=(7, 3.8))\n",
"for sensor in sensors.index:\n",
- " ax.plot(labels, by_size.loc[sensor], marker=\"o\", color=SENSOR_COLORS[sensor], ls=SENSOR_STYLES[sensor], label=sensor)\n",
- "ax.set(xlabel=\"Feature diameter (km)\", ylabel=\"Features resolved (% of size class)\", title=\"Resolved features by size\", ylim=(0, 100))\n",
+ " ax.plot(\n",
+ " labels,\n",
+ " by_size.loc[sensor],\n",
+ " marker=\"o\",\n",
+ " color=SENSOR_COLORS[sensor],\n",
+ " ls=SENSOR_STYLES[sensor],\n",
+ " label=sensor,\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Feature diameter (km)\",\n",
+ " ylabel=\"Features resolved (% of size class)\",\n",
+ " title=\"Resolved features by size\",\n",
+ " ylim=(0, 100),\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"for x, n in zip(labels, counts):\n",
" ax.annotate(f\"n = {n}\", (x, 2), ha=\"center\", fontsize=8, color=GRAY)\n",
@@ -1933,10 +2084,10 @@
"id": "d03edac1",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:35.274251Z",
- "iopub.status.busy": "2026-10-24T21:16:35.273251Z",
- "iopub.status.idle": "2026-10-24T21:16:35.441615Z",
- "shell.execute_reply": "2026-10-24T21:16:35.441111Z"
+ "iopub.execute_input": "2026-10-25T04:53:16.675831Z",
+ "iopub.status.busy": "2026-10-25T04:53:16.674830Z",
+ "iopub.status.idle": "2026-10-25T04:53:16.823131Z",
+ "shell.execute_reply": "2026-10-25T04:53:16.823131Z"
}
},
"outputs": [
@@ -1955,16 +2106,37 @@
"fig, ax = plt.subplots(figsize=(9, 4))\n",
"bins = np.arange(0, 25, 1)\n",
"nature_hist, _ = np.histogram(features.solar_hour, bins)\n",
- "ax.bar(bins[:-1] + 0.5, nature_hist, width=1, color=\"#e6e5e0\", label=\"Nature Run (all features)\")\n",
+ "ax.bar(\n",
+ " bins[:-1] + 0.5,\n",
+ " nature_hist,\n",
+ " width=1,\n",
+ " color=\"#e6e5e0\",\n",
+ " label=\"Nature Run (all features)\",\n",
+ ")\n",
"for swath, style, color in [(\"ATMS\", \":\", BLUE), (\"CrIS\", \":\", AQUA)]:\n",
" r = results[results.sensor == swath]\n",
" hist, _ = np.histogram(r.solar_hour[r.observed], bins)\n",
- " ax.plot(bins[:-1] + 0.5, hist, ls=\":\", color=color, label=f\"observed ({swath} swath)\")\n",
+ " ax.plot(\n",
+ " bins[:-1] + 0.5, hist, ls=\":\", color=color, label=f\"observed ({swath} swath)\"\n",
+ " )\n",
"for sensor in sensors.index:\n",
" r = results[results.sensor == sensor]\n",
" hist, _ = np.histogram(r.solar_hour[r.resolved], bins)\n",
- " ax.plot(bins[:-1] + 0.5, hist, ls=\"-\", marker=\"o\", ms=3, color=SENSOR_COLORS[sensor], label=f\"resolved ({sensor})\")\n",
- "ax.set(xlabel=\"Solar hour at feature\", ylabel=\"Features\", title=\"Features by solar hour\", xlim=(0, 24))\n",
+ " ax.plot(\n",
+ " bins[:-1] + 0.5,\n",
+ " hist,\n",
+ " ls=\"-\",\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " color=SENSOR_COLORS[sensor],\n",
+ " label=f\"resolved ({sensor})\",\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Solar hour at feature\",\n",
+ " ylabel=\"Features\",\n",
+ " title=\"Features by solar hour\",\n",
+ " xlim=(0, 24),\n",
+ ")\n",
"ax.set_xticks(range(0, 25, 3))\n",
"ax.legend(frameon=False, fontsize=8, loc=\"upper left\")\n",
"fig.tight_layout()\n",
@@ -1985,10 +2157,10 @@
"id": "b480d8db",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:35.443623Z",
- "iopub.status.busy": "2026-10-24T21:16:35.443623Z",
- "iopub.status.idle": "2026-10-24T21:16:35.458511Z",
- "shell.execute_reply": "2026-10-24T21:16:35.457959Z"
+ "iopub.execute_input": "2026-10-25T04:53:16.825418Z",
+ "iopub.status.busy": "2026-10-25T04:53:16.825418Z",
+ "iopub.status.idle": "2026-10-25T04:53:16.839433Z",
+ "shell.execute_reply": "2026-10-25T04:53:16.839433Z"
}
},
"outputs": [
@@ -2100,7 +2272,9 @@
"# resolution elements, of either size\n",
"sensitivity = pd.DataFrame(\n",
" {\n",
- " (axis, f\"N = {n}\"): results.groupby(\"sensor\")[f\"elements ({axis})\"].apply(lambda r: 100 * (r >= n).mean())\n",
+ " (axis, f\"N = {n}\"): results.groupby(\"sensor\")[f\"elements ({axis})\"].apply(\n",
+ " lambda r: 100 * (r >= n).mean()\n",
+ " )\n",
" for axis in AXES\n",
" for n in (1, 2, 3)\n",
" }\n",
@@ -2136,10 +2310,10 @@
"id": "b02e9ec9",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:16:35.460523Z",
- "iopub.status.busy": "2026-10-24T21:16:35.460523Z",
- "iopub.status.idle": "2026-10-24T21:19:45.963475Z",
- "shell.execute_reply": "2026-10-24T21:19:45.962966Z"
+ "iopub.execute_input": "2026-10-25T04:53:16.841463Z",
+ "iopub.status.busy": "2026-10-25T04:53:16.841463Z",
+ "iopub.status.idle": "2026-10-25T04:56:45.448422Z",
+ "shell.execute_reply": "2026-10-25T04:56:45.447394Z"
}
},
"outputs": [
@@ -2198,7 +2372,7 @@
"
3.5
\n",
"
0.5
\n",
"
2.2
\n",
- "
3.4
\n",
+ "
3.5
\n",
"
3.4
\n",
" \n",
"
\n",
@@ -2207,7 +2381,7 @@
"
8.4
\n",
"
6.9
\n",
"
0.8
\n",
- "
4.1
\n",
+ "
4.2
\n",
"
6.9
\n",
"
6.9
\n",
"
\n",
@@ -2216,7 +2390,7 @@
"
10.0
\n",
"
8.0
\n",
"
1.1
\n",
- "
4.4
\n",
+ "
4.5
\n",
"
7.7
\n",
"
7.9
\n",
" \n",
@@ -2227,7 +2401,7 @@
"
10.5
\n",
"
1.2
\n",
"
6.1
\n",
- "
10.2
\n",
+ "
10.3
\n",
"
10.4
\n",
" \n",
"
\n",
@@ -2236,14 +2410,14 @@
"
11.3
\n",
"
1.6
\n",
"
6.8
\n",
- "
11.2
\n",
+ "
11.3
\n",
"
11.2
\n",
"
\n",
"
\n",
"
current (3 in the 13:30 plane)
\n",
"
11.6
\n",
"
9.8
\n",
- "
0.9
\n",
+ "
1.0
\n",
"
5.3
\n",
"
9.6
\n",
"
9.6
\n",
@@ -2254,8 +2428,8 @@
"
14.8
\n",
"
12.3
\n",
"
1.5
\n",
- "
7.3
\n",
- "
12.0
\n",
+ "
7.4
\n",
+ "
12.1
\n",
"
12.1
\n",
"
\n",
"
\n",
@@ -2263,8 +2437,8 @@
"
19.0
\n",
"
15.6
\n",
"
2.1
\n",
- "
8.8
\n",
- "
15.1
\n",
+ "
8.9
\n",
+ "
15.2
\n",
"
15.4
\n",
"
\n",
"
\n",
@@ -2273,7 +2447,7 @@
"
15.5
\n",
"
13.2
\n",
"
1.5
\n",
- "
7.8
\n",
+ "
7.9
\n",
"
12.9
\n",
"
13.1
\n",
"
\n",
@@ -2282,8 +2456,8 @@
"
23.8
\n",
"
19.4
\n",
"
2.6
\n",
- "
11.1
\n",
- "
19.0
\n",
+ "
11.3
\n",
+ "
19.1
\n",
"
19.2
\n",
" \n",
"
\n",
@@ -2292,8 +2466,8 @@
"
15.5
\n",
"
13.3
\n",
"
1.8
\n",
- "
8.2
\n",
- "
13.1
\n",
+ "
8.3
\n",
+ "
13.2
\n",
"
13.2
\n",
"
\n",
"
\n",
@@ -2301,17 +2475,17 @@
"
29.8
\n",
"
24.0
\n",
"
3.4
\n",
- "
14.1
\n",
- "
23.4
\n",
- "
23.7
\n",
+ "
14.2
\n",
+ "
23.6
\n",
+ "
23.8
\n",
"
\n",
"
\n",
"
6 plane(s) x 1
\n",
"
29.3
\n",
"
23.9
\n",
"
3.6
\n",
- "
14.4
\n",
- "
23.2
\n",
+ "
14.5
\n",
+ "
23.3
\n",
"
23.6
\n",
"
\n",
" \n",
@@ -2354,34 +2528,34 @@
"sensor resolved, ATMS resolved, CrIS \\\n",
"satellites design \n",
"1 1 plane(s) x 1 0.5 2.2 \n",
- "2 1 plane(s) x 2 0.8 4.1 \n",
- " 2 plane(s) x 1 1.1 4.4 \n",
+ "2 1 plane(s) x 2 0.8 4.2 \n",
+ " 2 plane(s) x 1 1.1 4.5 \n",
"3 1 plane(s) x 3 1.2 6.1 \n",
" 3 plane(s) x 1 1.6 6.8 \n",
- " current (3 in the 13:30 plane) 0.9 5.3 \n",
- "4 1 plane(s) x 4 1.5 7.3 \n",
- " 4 plane(s) x 1 2.1 8.8 \n",
- "5 1 plane(s) x 5 1.5 7.8 \n",
- " 5 plane(s) x 1 2.6 11.1 \n",
- "6 1 plane(s) x 6 1.8 8.2 \n",
- " 2 plane(s) x 3 3.4 14.1 \n",
- " 6 plane(s) x 1 3.6 14.4 \n",
+ " current (3 in the 13:30 plane) 1.0 5.3 \n",
+ "4 1 plane(s) x 4 1.5 7.4 \n",
+ " 4 plane(s) x 1 2.1 8.9 \n",
+ "5 1 plane(s) x 5 1.5 7.9 \n",
+ " 5 plane(s) x 1 2.6 11.3 \n",
+ "6 1 plane(s) x 6 1.8 8.3 \n",
+ " 2 plane(s) x 3 3.4 14.2 \n",
+ " 6 plane(s) x 1 3.6 14.5 \n",
"\n",
"sensor resolved, Future MW \\\n",
"satellites design \n",
- "1 1 plane(s) x 1 3.4 \n",
+ "1 1 plane(s) x 1 3.5 \n",
"2 1 plane(s) x 2 6.9 \n",
" 2 plane(s) x 1 7.7 \n",
- "3 1 plane(s) x 3 10.2 \n",
- " 3 plane(s) x 1 11.2 \n",
+ "3 1 plane(s) x 3 10.3 \n",
+ " 3 plane(s) x 1 11.3 \n",
" current (3 in the 13:30 plane) 9.6 \n",
- "4 1 plane(s) x 4 12.0 \n",
- " 4 plane(s) x 1 15.1 \n",
+ "4 1 plane(s) x 4 12.1 \n",
+ " 4 plane(s) x 1 15.2 \n",
"5 1 plane(s) x 5 12.9 \n",
- " 5 plane(s) x 1 19.0 \n",
- "6 1 plane(s) x 6 13.1 \n",
- " 2 plane(s) x 3 23.4 \n",
- " 6 plane(s) x 1 23.2 \n",
+ " 5 plane(s) x 1 19.1 \n",
+ "6 1 plane(s) x 6 13.2 \n",
+ " 2 plane(s) x 3 23.6 \n",
+ " 6 plane(s) x 1 23.3 \n",
"\n",
"sensor resolved, Future IR \n",
"satellites design \n",
@@ -2396,7 +2570,7 @@
"5 1 plane(s) x 5 13.1 \n",
" 5 plane(s) x 1 19.2 \n",
"6 1 plane(s) x 6 13.2 \n",
- " 2 plane(s) x 3 23.7 \n",
+ " 2 plane(s) x 3 23.8 \n",
" 6 plane(s) x 1 23.6 "
]
},
@@ -2418,7 +2592,8 @@
"\n",
"def constellation(n_planes, per_plane, rng):\n",
" \"\"\"Satellites in n_planes sun-synchronous planes at 830 km, whose ascending equator crossing times are spread evenly\n",
- " over 12 hours from 13:30, with per_plane satellites evenly spaced in each plane at a random phase.\"\"\"\n",
+ " over 12 hours from 13:30, with per_plane satellites evenly spaced in each plane at a random phase.\n",
+ " \"\"\"\n",
" members = []\n",
" for p in range(n_planes):\n",
" hours = (13.5 + 12 * p / n_planes) % 24\n",
@@ -2443,9 +2618,13 @@
"\n",
"def evaluate(members, features):\n",
" \"\"\"The share (%) of the features that each sensor observes and resolves, flown on the members.\"\"\"\n",
- " tracks = collect_tracks(members, TRADE_DURATION)\n",
- " looks = collect_looks(tracks, features, {member.name: member.orbit for member in members})\n",
- " return assess(looks, features).groupby(\"sensor\")[[\"observed\", \"resolved\"]].mean().mul(100)\n",
+ " looks = collect_looks(members, TRADE_DURATION, features)\n",
+ " return (\n",
+ " assess(looks, features, members)\n",
+ " .groupby(\"sensor\")[[\"observed\", \"resolved\"]]\n",
+ " .mean()\n",
+ " .mul(100)\n",
+ " )\n",
"\n",
"\n",
"trade_features = find_features(load_nature(TRADE_DURATION))\n",
@@ -2460,9 +2639,13 @@
" ]\n",
").reset_index()\n",
"trade[\"satellites\"] = trade.planes * trade.per_plane\n",
- "trade[\"design\"] = trade.planes.astype(str) + \" plane(s) x \" + trade.per_plane.astype(str)\n",
+ "trade[\"design\"] = (\n",
+ " trade.planes.astype(str) + \" plane(s) x \" + trade.per_plane.astype(str)\n",
+ ")\n",
"# the current constellation over the same two weeks, for reference\n",
- "current = evaluate(satellites, trade_features).assign(satellites=3, design=\"current (3 in the 13:30 plane)\")\n",
+ "current = evaluate(satellites, trade_features).assign(\n",
+ " satellites=3, design=\"current (3 in the 13:30 plane)\"\n",
+ ")\n",
"\n",
"# features observed (by each swath) and resolved (by each sensor), % of all features, averaged over the draws\n",
"trade_summary = pd.concat([trade, current.reset_index()]).pivot_table(\n",
@@ -2470,7 +2653,9 @@
")\n",
"trade_summary = pd.concat(\n",
" [\n",
- " trade_summary[\"observed\"][[\"ATMS\", \"CrIS\"]].add_prefix(\"observed, \").add_suffix(\" swath\"),\n",
+ " trade_summary[\"observed\"][[\"ATMS\", \"CrIS\"]]\n",
+ " .add_prefix(\"observed, \")\n",
+ " .add_suffix(\" swath\"),\n",
" trade_summary[\"resolved\"][sensors.index].add_prefix(\"resolved, \"),\n",
" ],\n",
" axis=1,\n",
@@ -2485,16 +2670,16 @@
"id": "d9b2cedf",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-24T21:19:45.965476Z",
- "iopub.status.busy": "2026-10-24T21:19:45.965476Z",
- "iopub.status.idle": "2026-10-24T21:19:46.211542Z",
- "shell.execute_reply": "2026-10-24T21:19:46.211542Z"
+ "iopub.execute_input": "2026-10-25T04:56:45.450431Z",
+ "iopub.status.busy": "2026-10-25T04:56:45.450431Z",
+ "iopub.status.idle": "2026-10-25T04:56:45.696234Z",
+ "shell.execute_reply": "2026-10-25T04:56:45.696234Z"
}
},
"outputs": [
{
"data": {
- "image/png": "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w5UrVxAfHw+TyYRJkyYhMTERQ4cOxe+//47Lly/jp59+wtixY2E0GnHs2DEsWLAAx48fx9WrV7Ft2zbcuXMHjzzyiDV2HxERUY3CegMRWRMTFURkkYODAzp06IAPP/wQXbp0gY+PD95++22MHz8eK1asgL+/P5YtW4bFixfDx8cHGzduxMKFC/OsIyQkBBMnTsSQIUNQp04dLFmyBACwZs0ajBw5Eq+88gpat26N/v3749ixY2jcuHGZYp0xYwaUSiW8vLxQp04dXL16FQ0bNsSRI0dgNBrRs2dP+Pj4YMqUKXB2doZCoYCTkxMOHTqEPn36oFWrVnjrrbfwwQcfoHfv3g+874iIiGoa1huIyJokwXvqEBEREREREVElwRYVRERERERERFRpMFFBRERERERERJUGExVEREREREREVGkwUUFERERERERElQYTFURERERERERUaTBRQURERERERESVBhMVRERERERERFRpMFFBRERERERERJUGExVEREREREREVGkwUUFERERERERElQYTFURERERERERUaTBRQURERERERESVBhMVRERERERERFRpMFFBRERERERERJUGExVEREREREREVGkwUUFERERERERElQYTFURERERERERUaTBRQURERERERESVBhMVRERERERERFRpMFFBRERERERERJUGExVEREREREREVGkwUUFERERERERElQYTFURERERERERUaTBRQURE1drNmzcqOgQiIiIiKgUmKoiIqNo6djQKGzesxbGjURUdChERERGVEBMVRERULR07GoVDhw4AAA4dOsBkBREREVEVwUQFERFVO7mTFDmYrCAiIiKqGpiooBrHaDQW+by6uXLlCj7//HOrr3fOnDmYMWOG1ddb2ZhMpgd6vbILCwvDrl27KjoMq8qfpGjWrLn82BrJiszMTDz55JNo1aoV/P390atXL1y5cqXU61m7di2eeuqpB4rlYUlLS0OHDh3g5+cHPz+/Mpe5MHPmzIFOpyvRvLk/s6NHj8aKFSsAAKtXr8aHH34IADh58iS++eYbq8VXE0RGRqJ9+/YVHUaxynLuKa/zYGWR+3tQFEvfC39/f2RkZFg1npMnT6Jv375WXae1ldcxoqTvhTUJIdC5c2fExMQ81O0SlTcmKqhGEUIgJuYSNqxfg+UfLsGG9WtwJeYyhBAVHVqZ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",
+ "image/png": "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bNC65gHo/E9KAEYIybeBAweyzp07s8jISCaVStnjx4/ZkydPmEwmY5GRkaxz585s4MCBfHk/Pz82btw4xhhjd+/eZQDYsWPH9O47KCiIAWD79u3jlyUlJTGxWMy2bNnCL0tPT2cODg5s4cKFjDHGDhw4wMzNzZlarWZXrlxhNjY2bMKECWzKlCmMMcaGDx/OevXqlW2dzp8/zwCwxMRExhhjly5dYhzHsSdPnjDGGFOr1czR0ZGtWLGCMcbY8ePHmZmZGUtNTdXaT+XKldnq1av1PkdsbCwDwE6ePKmzrk+fPmz8+PH845o1a7I1a9bolCtfvjz7/fffdZbPnDmT1axZk6WnpzNbW1sWEhLCkpKSmKmpKbt69SobN24c8/Pz48uHhIQwJycnJhaLWb169dj48ePZqVOnsj0+jDFmamrKNmzYoHfdsmXLmIeHB2OMsX379rF69eqxbt268cerVatWbNq0adnue+fOncza2pp/vH79emZubq63/v369eMfazQaZmtry1auXKlVbsKECczf3z/H+hBCCCn6Mq85Mvn5+TEfHx+tMvXr19c6x3x4HcIYYwC0zrPZGTVqFOvevbvW85ctW5alpaXxy9auXcuqVq3KNBoNvywtLY3J5XJ29OhRxhhj9vb2bMGCBfx6pVLJnJyctOryob179zKhUKi13x07djAA7NKlSznG/fjxYwaALVmyRGt55nVVbGwsY4yxV69esYYNGzIAzNXVlQ0cOJDt2LGDqdXqbPfdsWNHNnjwYL3rrl27xjiOY5GRkSwmJoaJxWL2008/sR49ejDGGJs3bx5r0KBBtvt++/YtA8CuX7+uVY/Lly9rlRs4cCArX748U6lU/LIePXroXNvt37+fCQSCHOtDSFFGLSoIKQBlypRB+/btsXHjRqxfvx7t27fnM+zZuXLlCoRCIfz8/HIsl/VuwsOHD6FUKvlsPACIxWJ4eXnh9u3bAABfX18kJibi8uXLCAkJgZ+fH5o2bcpn9IODg7We8/Lly+jcuTPKly8PU1NTvmnhs2fPAGQ0OaxWrRrffDAkJARv375Fz549AQAXL15EUlISrK2tYWJiwv89fvxYqwljVpnjechkMq3lcXFx2LNnD/r168cv69evH9atW5fjMdJHLBajX79+WL9+PXbt2gVXV1d4enrqlPP19cWjR49w/PhxdO/eHTdv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QrZEC5GihtSX+O/UvGS4C8jzOUNECpfm5ZMD65n4y3u88vviEJFiQFxr/q/PH3m1x1UhIkUpN7TqU2Xp0VMVKRr6uuGnn34CAuuBli1b0q9fP3r06MHVV19NZmbmWbHjdLj11lt555136tuMBk+tPSq2bt3Kp59+WqE9Pj6e48eP14lRAsHpYBgGsz6dSaNGjRk95nKaNW9Rv/ZoPozifHwHd+D89h38R8uSGGGxYbtkCpY+l5eFecgysi0cyWqvH4PPOc7fRdnx+0dieFwhbZLFRuzz86s4omo+/vjjGofm5efn88orr3DPPffU+jyapqGqtbu1dOrUidmzZwcXQjNnzqRbt27B/sGDB7N8+XImT54MwC+//ELHjh3ZsGED/fv35+jRo2RkZNCrV69a2ysQCAQNDUP3sWPjQhYsW8/E2JdxKPm0tR8DNRxb50cwtZxcIkhIAXHCFF7fJguqwaV5yfe50Qx/SHux5uXLw5v49MAG8nyh9/shCSnc2Lof7SISq52/stKja7JTKyTOrI0nRUNeN5RnypQpPPPMM+i6zo033sizzz4bLG0qOLep9W9FVFQU6enptGrVKqR906ZNNGlSUeUTCM4Wx49nEx4egdlsZvglI4mJialXewxdx3CVhHks/Ajv+nlQrhqwucsQbKNvRA4vs1OyhgVKjgoPihpT2a6IPycTSuM9y+8uVdhpCn1f5U5UNced/Bw1nKdcn2wPLDoNjwu87pAjalVP+iQsX76cRx55hF9+CbiLbt++nT/84Q/s2LGDu+++m/z8fPr164eqqvzyyy8VSmz98Y9/ZMyYMUydOpVbb72V8PBw9u7dy5EjR9iwYQOzZs3i3Xffxefz4XA4ePnll6tc8EydOpX/+7//46677kLXdb766ituvvnmoJfe4MGDueOOOwDweDykpaVxzz338Msvv9C/f3+WL19Onz59sFgs1V73K6+8wieffIIsy3Tq1IlXXnmFyMhInn76afbu3UtRURH79+8nMTGRjz/+OPh/5LXXXuOrr75C0zQSExN5/fXXadq0aYX5HQ4HDz30EEuWLCE7O5uHH36Yq6++usK40s/e5/MRERHBv//9b1JSUjh48CCDBg3i5ptvZt68eRQUFPDCCy8watQoADZu3Mijjz5KYWEhuq5z3333MX78+GqvWyAQnBsU5WegHPmUuN3P0sfR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AidPnoRCoSj0mIODg9XiNhqNGDhwIJYtW1bssSZNmkChUGD//v2Ijo7Gzz//jI8//hhvvPEGjh8/jubNm1stDiIiorqE9QYisgYmKoioXHx9fbFjxw6cOHECer0e77//PuRyU+Osb7/9ttC6arUaBoOh0LKOHTvCYDAgPj4e3bp1s0pM5vYTGBiI7777Dt7e3lAqzZ/qZDIZunTpgi5dumDevHnw8vLC999/j1mzZlklLiIiorqO9QYiqgh2/SAis5KSktCzZ09s2rQJp0+fRmxsLLZu3Yrly5dj8ODBaNGiBfR6PT7++GNcvXoVGzduxNq1awttw9vbGxkZGfjvf/+LxMREZGVloXXr1hg5ciTGjBmD7du3IzY2Fn/88QeWLVuGPXv2VChWb29vHD9+HNeuXUNiYiKMRiOmTp2K5ORkjBgxAr///juuXr2Kn3/+GRMmTIDBYMDx48exePFinDhxAtevX8f27duRkJCARx55xBqHj4iIqE5hvYGIrImJCiIyy8HBAZ07d8YHH3yA7t27o3379njrrbcwadIkfPLJJwgICMDKlSuxbNkytG/fHps3b8aSJUsKbSM0NBRTpkzB8OHD0aBBAyxfvhwAsG7dOowZMwavvPIK2rRpg0GDBuH48ePw8PCoUKyzZ8+GQqGAr68vGjRogOvXr6Np06Y4evQoDAYD+vTpg/bt22P69OlwdnaGXC6Hk5MTDh8+jP79+6N169Z488038f7776Nfv34PfOyIiIjqGtYbiMiaZIJz6hARERERERFRNcEWFURERERERERUbTBRQURERERERETVBhMVRERERERERFRtMFFBRERERERERNUGExVEREREREREVG0wUUFERERERERE1QYTFURERERERERUbTBRQURERERERETVBhMVRERERERERFRtMFFBRERERERERNUGExVEREREREREVG0wUUFERERERERE1QYTFURERERERERUbTBRQURERERERETVBhMVRERERERERFRtMFFBRERERERERNUGExVEREREREREVG0wUUFERERERERE1QYTFURERERERERUbTBRQURERERERETVBhMVRERERERERFRtMFFBRERERERERNUGExVEREREREREVG0wUUFERLXa7du3qjoEIiIiIioHJiqIiKjWOn4sGps3rcfxY9FVHQoRERERlRET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",
"text/plain": [
"
"
]
@@ -2508,36 +2693,93 @@
"\n",
"fig, axes = plt.subplots(1, 2, figsize=(11, 4.2), sharey=True)\n",
"for ax, (title, pair) in zip(\n",
- " axes, {\"Microwave (ATMS swath)\": (\"ATMS\", \"Future MW\"), \"Infrared (CrIS swath)\": (\"CrIS\", \"Future IR\")}.items()\n",
+ " axes,\n",
+ " {\n",
+ " \"Microwave (ATMS swath)\": (\"ATMS\", \"Future MW\"),\n",
+ " \"Infrared (CrIS swath)\": (\"CrIS\", \"Future IR\"),\n",
+ " }.items(),\n",
"):\n",
" ends = []\n",
" for sensor in pair:\n",
" color = SENSOR_COLORS[sensor]\n",
" for strategy, (ls, marker) in STRATEGIES.items():\n",
- " selected = trade[(trade.sensor == sensor) & ((trade.planes == 1) if strategy == \"one plane\" else (trade.per_plane == 1))]\n",
+ " selected = trade[\n",
+ " (trade.sensor == sensor)\n",
+ " & (\n",
+ " (trade.planes == 1)\n",
+ " if strategy == \"one plane\"\n",
+ " else (trade.per_plane == 1)\n",
+ " )\n",
+ " ]\n",
" stats = selected.groupby(\"satellites\")[\"resolved\"].agg([\"mean\", \"std\"])\n",
- " ax.fill_between(stats.index, stats[\"mean\"] - stats[\"std\"], stats[\"mean\"] + stats[\"std\"], color=color, alpha=0.12, lw=0)\n",
- " ax.plot(stats.index, stats[\"mean\"], ls=ls, marker=marker, ms=6, lw=2, color=color, mec=\"white\", mew=1.5)\n",
+ " ax.fill_between(\n",
+ " stats.index,\n",
+ " stats[\"mean\"] - stats[\"std\"],\n",
+ " stats[\"mean\"] + stats[\"std\"],\n",
+ " color=color,\n",
+ " alpha=0.12,\n",
+ " lw=0,\n",
+ " )\n",
+ " ax.plot(\n",
+ " stats.index,\n",
+ " stats[\"mean\"],\n",
+ " ls=ls,\n",
+ " marker=marker,\n",
+ " ms=6,\n",
+ " lw=2,\n",
+ " color=color,\n",
+ " mec=\"white\",\n",
+ " mew=1.5,\n",
+ " )\n",
" ends.append([stats[\"mean\"].iloc[-1], f\"{sensor}, {strategy}\"])\n",
- " two_planes = trade[(trade.sensor == sensor) & (trade.planes == 2) & (trade.per_plane == 3)][\"resolved\"].mean()\n",
- " ax.plot(6, two_planes, marker=\"D\", ms=8, color=\"white\", mec=color, mew=2, zorder=3)\n",
+ " two_planes = trade[\n",
+ " (trade.sensor == sensor) & (trade.planes == 2) & (trade.per_plane == 3)\n",
+ " ][\"resolved\"].mean()\n",
+ " ax.plot(\n",
+ " 6, two_planes, marker=\"D\", ms=8, color=\"white\", mec=color, mew=2, zorder=3\n",
+ " )\n",
" # direct labels at the line ends, nudged apart so that they do not overlap\n",
" ends.sort()\n",
" for i in range(1, len(ends)):\n",
" ends[i][0] = max(ends[i][0], ends[i - 1][0] + 1.4)\n",
" for y, label in ends:\n",
- " ax.annotate(label, (6, y), xytext=(10, 0), textcoords=\"offset points\", va=\"center\", fontsize=8, color=INK)\n",
+ " ax.annotate(\n",
+ " label,\n",
+ " (6, y),\n",
+ " xytext=(10, 0),\n",
+ " textcoords=\"offset points\",\n",
+ " va=\"center\",\n",
+ " fontsize=8,\n",
+ " color=INK,\n",
+ " )\n",
" # the features observed at any resolution, with separate planes: the most that any sensor can resolve\n",
- " observed = trade[(trade.sensor == pair[0]) & (trade.per_plane == 1)].groupby(\"satellites\")[\"observed\"].mean()\n",
+ " observed = (\n",
+ " trade[(trade.sensor == pair[0]) & (trade.per_plane == 1)]\n",
+ " .groupby(\"satellites\")[\"observed\"]\n",
+ " .mean()\n",
+ " )\n",
" ax.plot(observed.index, observed, color=GRAY, lw=1, ls=\":\")\n",
" ax.set(title=title, xlabel=\"Satellites\", xticks=range(1, 7), xlim=(0.7, 8.9))\n",
" ax.title.set_fontsize(10)\n",
"axes[0].set(ylabel=\"Features resolved (% of all features)\", ylim=(0, None))\n",
"legend = [\n",
- " plt.Line2D([], [], color=GRAY, ls=\"-\", marker=\"o\", mec=\"white\", label=\"separate planes\"),\n",
+ " plt.Line2D(\n",
+ " [], [], color=GRAY, ls=\"-\", marker=\"o\", mec=\"white\", label=\"separate planes\"\n",
+ " ),\n",
" plt.Line2D([], [], color=GRAY, ls=\"--\", marker=\"s\", mec=\"white\", label=\"one plane\"),\n",
- " plt.Line2D([], [], color=GRAY, ls=\"none\", marker=\"D\", mfc=\"white\", mew=2, label=\"2 planes x 3 satellites\"),\n",
- " plt.Line2D([], [], color=GRAY, ls=\":\", label=\"observed at any resolution (separate planes)\"),\n",
+ " plt.Line2D(\n",
+ " [],\n",
+ " [],\n",
+ " color=GRAY,\n",
+ " ls=\"none\",\n",
+ " marker=\"D\",\n",
+ " mfc=\"white\",\n",
+ " mew=2,\n",
+ " label=\"2 planes x 3 satellites\",\n",
+ " ),\n",
+ " plt.Line2D(\n",
+ " [], [], color=GRAY, ls=\":\", label=\"observed at any resolution (separate planes)\"\n",
+ " ),\n",
"]\n",
"fig.legend(handles=legend, loc=\"lower center\", ncol=4, fontsize=8, frameon=False)\n",
"fig.suptitle(\n",
@@ -2557,7 +2799,7 @@
"\n",
"* **Satellites in one plane saturate.** Adding satellites to a single plane observes more features up to about four satellites, and then hardly any more (15 to 16% in the ATMS swath for four to six satellites), because they all observe at the same local times (near 13:30 and 01:30).\n",
"* **A second plane gives most of the benefit.** Six satellites in separate planes observe 29% of the features, almost twice as many as six in one plane. Six satellites in two planes (three in each) observe as many (30%): what matters is that the satellites do not duplicate each other's local times, not how many planes there are.\n",
- "* **Planes and resolution trade against each other.** With heritage sensors, six satellites in separate planes resolve 14% of the features with CrIS, more than six satellites with a future infrared sounder in one plane (13%). Finer resolution pays off fully only with separate planes: a future sounder on six satellites in separate (or two) planes resolves 23 to 24% of the features: nearly all of those observed in the CrIS swath, and four fifths of those in the wider ATMS swath.\n",
+ "* **Planes and resolution trade against each other.** With heritage sensors, six satellites in separate planes resolve 14.5% of the features with CrIS, more than six satellites with a future infrared sounder in one plane (13.2%). Finer resolution pays off fully only with separate planes: a future sounder on six satellites in separate (or two) planes resolves 23 to 24% of the features: nearly all of those observed in the CrIS swath, and four fifths of those in the wider ATMS swath.\n",
"* **ATMS is limited by resolution, not sampling.** More planes raise the share resolved by ATMS only from 2% to 4%, because its resolution element is larger than most features wherever they are observed.\n",
"\n",
"The spread between the random phases (the shaded bands) is small compared with these differences. The trade holds the sensors and the altitude fixed; their swaths, altitudes, and resolutions, and orbits other than sun-synchronous ones, are further dimensions of a full trade study."
diff --git a/docs/validation/ValidateCoincidenceGMIAMSR2.ipynb b/docs/validation/ValidateCoincidenceGMIAMSR2.ipynb
new file mode 100644
index 00000000..59a505f3
--- /dev/null
+++ b/docs/validation/ValidateCoincidenceGMIAMSR2.ipynb
@@ -0,0 +1,1029 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "59fcd068",
+ "metadata": {},
+ "source": [
+ "# Coincidence Validation: GMI and AMSR2\n",
+ "\n",
+ "This notebook validates TAT-C's coincidence analyses against the observations of two microwave radiometers on 26 September 2026: the GPM Microwave Imager (GMI), on the Global Precipitation Measurement (GPM) Core Observatory in a 65 deg inclined orbit, and the Advanced Microwave Scanning Radiometer 2 (AMSR2), on GCOM-W in a sun-synchronous orbit. GPM uses GMI as the reference to which it intercalibrates partner radiometers such as AMSR2, from their coincident observations: where the two observe the same place within a short time, here 15 minutes. Their different orbits cross many times a day, but within 15 minutes only where GPM's orbit turns, at high latitudes: on this day, between 55 and 70 deg north and south.\n",
+ "\n",
+ "TAT-C finds coincidences in two ways, both validated here against the instruments' recorded sample positions:\n",
+ "\n",
+ "1. **Passes.** Does `collect_observations` predict the passes of each instrument over a global grid of points, the basis of the point coincidences? (The scan geometry of both instruments is validated in the [AMSR2](ValidateConicalAMSR2.ipynb) and [GMI](ValidateConicalGMI.ipynb) conical scanner notebooks.)\n",
+ "2. **Coincident observations.** Does `find_coincident_observations` find the points observed by both instruments within 15 minutes, and the time difference between their observations?\n",
+ "3. **Coincident ground track.** Does `find_coincident_ground_track` find the areas observed by both instruments within 15 minutes?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3f531c9b",
+ "metadata": {},
+ "source": [
+ "## Reference Data\n",
+ "\n",
+ "The Level 1C products of both instruments (`GPM_1CGPMGMI` and `GPM_1CGCOMW1AMSR2`, version 8, from NASA's [GES DISC](https://disc.gsfc.nasa.gov/); free [NASA Earthdata Login](https://urs.earthdata.nasa.gov/) account required) record the time of each scan and the position of each sample: 221 per scan for GMI's low-frequency feed (S1, 10 to 89 GHz) every 1.875 s, and 243 per scan for AMSR2's low-resolution samples (S1) every 1.5 s. The day's orbit files (16 for GMI and 15 for AMSR2) are downloaded once, and the scan times and sample positions are cached in local `data/gmi` and `data/amsr2` directories (shared with the conical scanner notebooks). GMI recorded the whole day; AMSR2's record has a gap of 3.3 hours, during which coincidences are not compared. GPM flew in its forward orientation (`SCorientation` 0) all day, as in the GMI notebook."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "11b30426",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:12:56.183047Z",
+ "iopub.status.busy": "2026-10-26T00:12:56.182864Z",
+ "iopub.status.idle": "2026-10-26T00:12:57.413194Z",
+ "shell.execute_reply": "2026-10-26T00:12:57.412436Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
orbit files
\n",
+ "
scans
\n",
+ "
samples per scan
\n",
+ "
data gaps (UTC)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
AMSR2
\n",
+ "
14
\n",
+ "
49695
\n",
+ "
243
\n",
+ "
08:38-11:55
\n",
+ "
\n",
+ "
\n",
+ "
GMI
\n",
+ "
16
\n",
+ "
46081
\n",
+ "
221
\n",
+ "
none
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " orbit files scans samples per scan data gaps (UTC)\n",
+ "AMSR2 14 49695 243 08:38-11:55\n",
+ "GMI 16 46081 221 none"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import io\n",
+ "from datetime import datetime, timedelta, timezone\n",
+ "from pathlib import Path\n",
+ "\n",
+ "import h5py\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import requests\n",
+ "\n",
+ "DAY = datetime(2026, 9, 26, tzinfo=timezone.utc)\n",
+ "PRODUCTS = {\n",
+ " # instrument: (GES DISC collection, local directory, cached file, swath groups)\n",
+ " \"AMSR2\": (\n",
+ " \"GPM_1CGCOMW1AMSR2\",\n",
+ " \"amsr2\",\n",
+ " f\"amsr2_l1c_s1_{DAY:%Y%m%d}.npz\",\n",
+ " {\"S1\": \"\"},\n",
+ " ),\n",
+ " \"GMI\": (\n",
+ " \"GPM_1CGPMGMI\",\n",
+ " \"gmi\",\n",
+ " f\"gmi_l1c_{DAY:%Y%m%d}.npz\",\n",
+ " {\"S1\": \"S1_\", \"S2\": \"S2_\"},\n",
+ " ),\n",
+ "}\n",
+ "\n",
+ "\n",
+ "def download(short_name, cache_file, swaths):\n",
+ " \"\"\"Caches the scan times, spacecraft positions, and sample positions of a day of GPM Level 1C files.\"\"\"\n",
+ " import earthaccess\n",
+ "\n",
+ " earthaccess.login()\n",
+ " session = earthaccess.get_requests_https_session()\n",
+ " granules = requests.get(\n",
+ " \"https://cmr.earthdata.nasa.gov/search/granules.umm_json\",\n",
+ " params={\n",
+ " \"short_name\": short_name,\n",
+ " \"version\": \"08\",\n",
+ " \"temporal\": f\"{DAY:%Y-%m-%d}T00:00:00Z,{DAY:%Y-%m-%d}T23:59:59Z\",\n",
+ " \"page_size\": 100,\n",
+ " },\n",
+ " timeout=120,\n",
+ " ).json()[\"items\"]\n",
+ " urls = [\n",
+ " next(\n",
+ " u[\"URL\"]\n",
+ " for u in g[\"umm\"][\"RelatedUrls\"]\n",
+ " if u[\"URL\"].startswith(\"https://data.gesdisc\")\n",
+ " )\n",
+ " for g in granules\n",
+ " ]\n",
+ " parts = []\n",
+ " for url in urls:\n",
+ " with h5py.File(io.BytesIO(session.get(url, timeout=900).content)) as f:\n",
+ " s1 = f[\"S1\"]\n",
+ " seconds = (\n",
+ " (\n",
+ " pd.to_datetime(\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"year\": s1[\"ScanTime/Year\"][:],\n",
+ " \"month\": s1[\"ScanTime/Month\"][:],\n",
+ " \"day\": s1[\"ScanTime/DayOfMonth\"][:],\n",
+ " \"hour\": s1[\"ScanTime/Hour\"][:],\n",
+ " \"minute\": s1[\"ScanTime/Minute\"][:],\n",
+ " \"second\": s1[\"ScanTime/Second\"][:],\n",
+ " \"ms\": s1[\"ScanTime/MilliSecond\"][:],\n",
+ " }\n",
+ " ),\n",
+ " utc=True,\n",
+ " )\n",
+ " - pd.Timestamp(DAY)\n",
+ " )\n",
+ " .dt.total_seconds()\n",
+ " .to_numpy()\n",
+ " )\n",
+ " part = {\n",
+ " \"time\": seconds,\n",
+ " \"sc_lat\": s1[\"SCstatus/SClatitude\"][:],\n",
+ " \"sc_lon\": s1[\"SCstatus/SClongitude\"][:],\n",
+ " \"sc_alt\": s1[\"SCstatus/SCaltitude\"][:],\n",
+ " }\n",
+ " if \"SCorientation\" in s1[\"SCstatus\"]:\n",
+ " part[\"orientation\"] = s1[\"SCstatus/SCorientation\"][:]\n",
+ " for swath, prefix in swaths.items():\n",
+ " part[f\"{prefix}lat\"] = f[f\"{swath}/Latitude\"][:]\n",
+ " part[f\"{prefix}lon\"] = f[f\"{swath}/Longitude\"][:]\n",
+ " parts.append(part)\n",
+ " reduced = {k: np.concatenate([p[k] for p in parts]) for k in parts[0]}\n",
+ " # keep each scan once (orbit files overlap), in time order, within the day\n",
+ " _, first = np.unique(reduced[\"time\"], return_index=True)\n",
+ " keep = first[(reduced[\"time\"][first] >= 0) & (reduced[\"time\"][first] < 86400)]\n",
+ " np.savez_compressed(\n",
+ " cache_file, granules=len(urls), **{k: v[keep] for k, v in reduced.items()}\n",
+ " )\n",
+ "\n",
+ "\n",
+ "data = {}\n",
+ "for instrument, (short_name, directory, file_name, swaths) in PRODUCTS.items():\n",
+ " cache_file = Path(\"data\") / directory / file_name\n",
+ " cache_file.parent.mkdir(parents=True, exist_ok=True)\n",
+ " if not cache_file.exists():\n",
+ " download(short_name, cache_file, swaths)\n",
+ " data[instrument] = dict(np.load(cache_file))\n",
+ "data[\"GMI\"][\"lat\"], data[\"GMI\"][\"lon\"] = (\n",
+ " data[\"GMI\"][\"S1_lat\"],\n",
+ " data[\"GMI\"][\"S1_lon\"],\n",
+ ") # low-frequency feed\n",
+ "\n",
+ "\n",
+ "def data_gaps(seconds, threshold=10):\n",
+ " \"\"\"Gaps (start, end, s) of more than threshold (s) between scans, including before the first and after the last.\"\"\"\n",
+ " i = np.flatnonzero(np.diff(seconds) > threshold)\n",
+ " gaps = [(seconds[k], seconds[k + 1]) for k in i]\n",
+ " if seconds[0] > threshold:\n",
+ " gaps.insert(0, (-np.inf, seconds[0]))\n",
+ " if seconds[-1] < 86400 - threshold:\n",
+ " gaps.append((seconds[-1], np.inf))\n",
+ " return gaps\n",
+ "\n",
+ "\n",
+ "GAPS = {instrument: data_gaps(d[\"time\"]) for instrument, d in data.items()}\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " instrument: {\n",
+ " \"orbit files\": int(d[\"granules\"]),\n",
+ " \"scans\": len(d[\"time\"]),\n",
+ " \"samples per scan\": d[\"lat\"].shape[1],\n",
+ " \"data gaps (UTC)\": \", \".join(\n",
+ " f\"{DAY + timedelta(seconds=max(a, 0)):%H:%M}-{DAY + timedelta(seconds=min(b, 86400)):%H:%M}\"\n",
+ " for a, b in GAPS[instrument]\n",
+ " )\n",
+ " or \"none\",\n",
+ " }\n",
+ " for instrument, d in data.items()\n",
+ " }\n",
+ ").T"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e532d274",
+ "metadata": {},
+ "source": [
+ "## Test 1: Passes\n",
+ "\n",
+ "The instruments are modeled with the `ConicalInstrument` parameters fitted in the conical scanner notebooks (cone angle, and the center and half-width of the scanned sector, relative to the inertial velocity, as neither spacecraft is yaw-steered), on orbits from published two-line element sets (TLEs). The TLE of GPM has an epoch 8 days after the analysis day (as in the GMI notebook), and is about 11 km ahead of GPM's recorded position along track, so GMI's predicted observations come about 1.5 s early; the AMSR2 TLE is within about 1 km.\n",
+ "\n",
+ "The points form a Fibonacci lattice about 50 km apart, between 75 deg south and north (GMI's swath reaches about 70 deg). A point is observed on a pass when a sample lies within 8 km of it (about half the spacing of the samples along and between scans), at the time of the nearest sample; TAT-C's passes are those of `collect_observations` (at their `epoch`, when the scan crosses the point). Its run of about five minutes is cached in a local `data/coincidence` directory. Observed and predicted passes are paired by point within 60 s, outside the instruments' data gaps."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "c1e54db6",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:12:57.415070Z",
+ "iopub.status.busy": "2026-10-26T00:12:57.414837Z",
+ "iopub.status.idle": "2026-10-26T00:13:19.594854Z",
+ "shell.execute_reply": "2026-10-26T00:13:19.594096Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "250925 points; observations outside the instruments' data gaps:\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
observed passes
\n",
+ "
predicted
\n",
+ "
observed passes predicted (%)
\n",
+ "
predicted passes observed (%)
\n",
+ "
time offset, median (s)
\n",
+ "
95% |time offset| (s)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
AMSR2
\n",
+ "
370748.0
\n",
+ "
367886.0
\n",
+ "
99.23
\n",
+ "
100.0
\n",
+ "
0.01
\n",
+ "
1.57
\n",
+ "
\n",
+ "
\n",
+ "
GMI
\n",
+ "
313805.0
\n",
+ "
309418.0
\n",
+ "
98.60
\n",
+ "
100.0
\n",
+ "
-1.51
\n",
+ "
2.49
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " observed passes predicted observed passes predicted (%) \\\n",
+ "AMSR2 370748.0 367886.0 99.23 \n",
+ "GMI 313805.0 309418.0 98.60 \n",
+ "\n",
+ " predicted passes observed (%) time offset, median (s) \\\n",
+ "AMSR2 100.0 0.01 \n",
+ "GMI 100.0 -1.51 \n",
+ "\n",
+ " 95% |time offset| (s) \n",
+ "AMSR2 1.57 \n",
+ "GMI 2.49 "
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pickle\n",
+ "import time\n",
+ "\n",
+ "from scipy.spatial import cKDTree\n",
+ "from shapely.geometry import box\n",
+ "\n",
+ "from tatc.analysis import collect_observations\n",
+ "from tatc.generation import generate_points_fibonacci_lattice\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " ConicalInstrument,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Satellite,\n",
+ ")\n",
+ "from tatc.utils import VelocityFrame\n",
+ "\n",
+ "WINDOW = 900 # s, maximum time difference of coincident observations\n",
+ "RADIUS = 8e3 # m, distance within which a sample observes a point\n",
+ "EARTH_RADIUS = 6371.0088e3 # m, mean\n",
+ "# not yaw-steered: the bodies (and the instruments' views) align with the inertial velocity\n",
+ "INERTIAL = Attitude(velocity_frame=VelocityFrame.INERTIAL)\n",
+ "satellites = {\n",
+ " \"AMSR2\": Satellite(\n",
+ " name=\"GCOM-W\",\n",
+ " attitude=INERTIAL,\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(\n",
+ " [\n",
+ " \"1 38337U 12025A 26277.29678146 .00000240 00000+0 63281-4 0 9990\",\n",
+ " \"2 38337 98.2100 216.2278 0001644 77.4488 41.8708 14.57111943764929\",\n",
+ " ]\n",
+ " ),\n",
+ " instruments=[\n",
+ " ConicalInstrument(\n",
+ " name=\"AMSR2\",\n",
+ " cone_angle=47.564,\n",
+ " scan_center_azimuth=0.498,\n",
+ " scan_half_width=75.332,\n",
+ " along_track_field_of_view=1,\n",
+ " )\n",
+ " ],\n",
+ " ),\n",
+ " \"GMI\": Satellite(\n",
+ " name=\"GPM\",\n",
+ " attitude=INERTIAL,\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(\n",
+ " [\n",
+ " \"1 39574U 14009C 26277.54227627 .00004528 00000+0 10004-3 0 9997\",\n",
+ " \"2 39574 64.9701 301.6724 0010793 268.6572 91.3332 15.45217995714704\",\n",
+ " ]\n",
+ " ),\n",
+ " instruments=[\n",
+ " ConicalInstrument(\n",
+ " name=\"GMI\",\n",
+ " cone_angle=48.460,\n",
+ " scan_center_azimuth=-0.285,\n",
+ " scan_half_width=76.031,\n",
+ " along_track_field_of_view=1,\n",
+ " )\n",
+ " ],\n",
+ " ),\n",
+ "}\n",
+ "points = generate_points_fibonacci_lattice(50e3, mask=box(-180, -75, 180, 75))\n",
+ "point_index = pd.Series(np.arange(len(points)), index=points.point_id)\n",
+ "\n",
+ "\n",
+ "def unit(lon, lat):\n",
+ " \"\"\"Unit vectors of geodetic coordinates (deg) on a sphere, stacked on the last axis.\"\"\"\n",
+ " lon, lat = np.radians(lon), np.radians(lat)\n",
+ " return np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
+ "\n",
+ "\n",
+ "def in_gap(instrument, seconds):\n",
+ " \"\"\"Whether times (s) fall within 30 s of a data gap of an instrument.\"\"\"\n",
+ " seconds = np.asarray(seconds)\n",
+ " return np.any(\n",
+ " [(seconds > a - 30) & (seconds < b + 30) for a, b in GAPS[instrument]]\n",
+ " + [np.zeros(seconds.shape, bool)],\n",
+ " axis=0,\n",
+ " )\n",
+ "\n",
+ "\n",
+ "def true_passes(d):\n",
+ " \"\"\"Each pass of an instrument over each point (samples within RADIUS, separated by at least 10 minutes):\n",
+ " the time (s) of the sample nearest the point.\"\"\"\n",
+ " valid = np.all(np.abs(d[\"lat\"]) <= 90, axis=1)\n",
+ " seconds, lat, lon = (\n",
+ " d[\"time\"][valid],\n",
+ " d[\"lat\"][valid].astype(float),\n",
+ " d[\"lon\"][valid].astype(float),\n",
+ " )\n",
+ " n = lat.shape[1]\n",
+ " samples = unit(lon.ravel(), lat.ravel())\n",
+ " targets = unit(points.geometry.x.to_numpy(), points.geometry.y.to_numpy())\n",
+ " rows = []\n",
+ " for k, hits in enumerate(\n",
+ " cKDTree(samples).query_ball_point(targets, RADIUS / EARTH_RADIUS, workers=-1)\n",
+ " ):\n",
+ " if not hits:\n",
+ " continue\n",
+ " hits = np.array(hits)\n",
+ " t = seconds[hits // n]\n",
+ " distance = np.linalg.norm(samples[hits] - targets[k], axis=1)\n",
+ " order = np.argsort(t)\n",
+ " t, distance = t[order], distance[order]\n",
+ " bounds = np.r_[0, np.flatnonzero(np.diff(t) > 600) + 1, len(t)]\n",
+ " rows += [\n",
+ " (k, t[a + np.argmin(distance[a:b])])\n",
+ " for a, b in zip(bounds[:-1], bounds[1:])\n",
+ " ]\n",
+ " return pd.DataFrame(rows, columns=[\"point\", \"seconds\"])\n",
+ "\n",
+ "\n",
+ "truth = {instrument: true_passes(d) for instrument, d in data.items()}\n",
+ "cache = Path(\"data\") / \"coincidence\" / f\"observations_{DAY:%Y%m%d}.pkl\"\n",
+ "cache.parent.mkdir(parents=True, exist_ok=True)\n",
+ "if not cache.exists():\n",
+ " tic = time.perf_counter()\n",
+ " observations = collect_observations(\n",
+ " list(points.geometry), list(satellites.values()), DAY, DAY + timedelta(days=1)\n",
+ " )\n",
+ " print(\n",
+ " f\"collect_observations: {len(observations)} observations of {len(points)} points in {time.perf_counter() - tic:.0f} s\"\n",
+ " )\n",
+ " observations.to_pickle(cache)\n",
+ "observations = pd.read_pickle(cache)\n",
+ "observations[\"point\"] = point_index.loc[observations.target_hash].to_numpy()\n",
+ "observations[\"seconds\"] = (observations.epoch - pd.Timestamp(DAY)).dt.total_seconds()\n",
+ "\n",
+ "\n",
+ "def pair(left, right, tolerance):\n",
+ " \"\"\"Pairs each row of left with the nearest row of right at the same point within tolerance (s) of time.\"\"\"\n",
+ " return pd.merge_asof(\n",
+ " left.sort_values(\"seconds\"),\n",
+ " right.rename(columns={\"seconds\": \"paired\"}).sort_values(\"paired\"),\n",
+ " left_on=\"seconds\",\n",
+ " right_on=\"paired\",\n",
+ " by=\"point\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=tolerance,\n",
+ " )\n",
+ "\n",
+ "\n",
+ "rows = {}\n",
+ "for instrument in data:\n",
+ " observed = truth[instrument][~in_gap(instrument, truth[instrument].seconds)]\n",
+ " predicted = observations[observations.instrument == instrument][\n",
+ " [\"point\", \"seconds\"]\n",
+ " ]\n",
+ " predicted = predicted[~in_gap(instrument, predicted.seconds)]\n",
+ " forward, backward = pair(observed, predicted, 60), pair(predicted, observed, 60)\n",
+ " offset = (forward.paired - forward.seconds).dropna()\n",
+ " rows[instrument] = {\n",
+ " \"observed passes\": len(observed),\n",
+ " \"predicted\": len(predicted),\n",
+ " \"observed passes predicted (%)\": 100 * forward.paired.notna().mean(),\n",
+ " \"predicted passes observed (%)\": 100 * backward.paired.notna().mean(),\n",
+ " \"time offset, median (s)\": offset.median(),\n",
+ " \"95% |time offset| (s)\": offset.abs().quantile(0.95),\n",
+ " }\n",
+ "print(f\"{len(points)} points; observations outside the instruments' data gaps:\")\n",
+ "pd.DataFrame(rows).T.round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "774726c2",
+ "metadata": {},
+ "source": [
+ "Outside AMSR2's data gap, every pass TAT-C predicts was observed, and TAT-C predicts 99.2% of AMSR2's and 98.6% of GMI's observed passes; the others are at the edges of the swaths, where the outermost samples lie within 8 km of points just outside TAT-C's swath. GMI's predicted passes come 1.5 s early (median), as expected from its TLE, and AMSR2's within 0.01 s; 95% are within 2.5 s (GMI) and 1.6 s (AMSR2)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0f28cc5c",
+ "metadata": {},
+ "source": [
+ "## Test 2: Coincident Observations\n",
+ "\n",
+ "The true coincidences are the pairs of a GMI pass and an AMSR2 pass over the same point within 15 minutes of each other. `find_coincident_observations` widens each observation period by half of the maximum time difference before and after, and reports each period during which the widened periods of both satellites overlap. Each true coincidence is paired with the nearest coincident observation of the same point within 60 s, from the epochs of the GMI and AMSR2 observations that contribute to it.\n",
+ "\n",
+ "The observations of a `ConicalInstrument` are not instantaneous, however: their period (`start` to `end`) is the time the point spends inside the circle the cone traces on the ground, while their `epoch` is the time the scan crosses it. `find_coincident_observations` is therefore run twice: comparing the observations' periods (the default), and with `instantaneous=True`, comparing their epochs, in which case each coincident observation spans the epochs of its contributors, from the first to the last (so that its duration is their time difference)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "001a84ce",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:13:19.596913Z",
+ "iopub.status.busy": "2026-10-26T00:13:19.596646Z",
+ "iopub.status.idle": "2026-10-26T00:13:23.865097Z",
+ "shell.execute_reply": "2026-10-26T00:13:23.862810Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "observation periods: median AMSR2 234 s, GMI 141 s; epochs a median 8 s after the start\n",
+ "instantaneous coincidences: duration minus time difference of their epochs, max |x| 7.12e-12 s\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
true coincidences
\n",
+ "
coincident observations
\n",
+ "
true coincidences found (%)
\n",
+ "
found coincidences true (%)
\n",
+ "
epochs more than 15 minutes apart
\n",
+ "
epoch difference, max (s)
\n",
+ "
time difference error, median (s)
\n",
+ "
95% |error| (s)
\n",
+ "
unpaired true within 20 s of the limit
\n",
+ "
unpaired found within 20 s of the limit
\n",
+ "
time (s)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
observation periods (default)
\n",
+ "
6554.0
\n",
+ "
8525.0
\n",
+ "
97.77
\n",
+ "
75.17
\n",
+ "
2116.0
\n",
+ "
1169.04
\n",
+ "
-1.03
\n",
+ "
2.38
\n",
+ "
6.0
\n",
+ "
2117.0
\n",
+ "
2.00
\n",
+ "
\n",
+ "
\n",
+ "
instantaneous (epochs)
\n",
+ "
6554.0
\n",
+ "
6409.0
\n",
+ "
97.70
\n",
+ "
99.91
\n",
+ "
0.0
\n",
+ "
899.99
\n",
+ "
-1.03
\n",
+ "
2.38
\n",
+ "
11.0
\n",
+ "
6.0
\n",
+ "
1.99
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " true coincidences coincident observations \\\n",
+ "observation periods (default) 6554.0 8525.0 \n",
+ "instantaneous (epochs) 6554.0 6409.0 \n",
+ "\n",
+ " true coincidences found (%) \\\n",
+ "observation periods (default) 97.77 \n",
+ "instantaneous (epochs) 97.70 \n",
+ "\n",
+ " found coincidences true (%) \\\n",
+ "observation periods (default) 75.17 \n",
+ "instantaneous (epochs) 99.91 \n",
+ "\n",
+ " epochs more than 15 minutes apart \\\n",
+ "observation periods (default) 2116.0 \n",
+ "instantaneous (epochs) 0.0 \n",
+ "\n",
+ " epoch difference, max (s) \\\n",
+ "observation periods (default) 1169.04 \n",
+ "instantaneous (epochs) 899.99 \n",
+ "\n",
+ " time difference error, median (s) \\\n",
+ "observation periods (default) -1.03 \n",
+ "instantaneous (epochs) -1.03 \n",
+ "\n",
+ " 95% |error| (s) \\\n",
+ "observation periods (default) 2.38 \n",
+ "instantaneous (epochs) 2.38 \n",
+ "\n",
+ " unpaired true within 20 s of the limit \\\n",
+ "observation periods (default) 6.0 \n",
+ "instantaneous (epochs) 11.0 \n",
+ "\n",
+ " unpaired found within 20 s of the limit \\\n",
+ "observation periods (default) 2117.0 \n",
+ "instantaneous (epochs) 6.0 \n",
+ "\n",
+ " time (s) \n",
+ "observation periods (default) 2.00 \n",
+ "instantaneous (epochs) 1.99 "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from tatc.analysis import find_coincident_observations\n",
+ "\n",
+ "# true coincidences: pairs of passes over a point within WINDOW of each other, outside the data gaps\n",
+ "true_pairs = truth[\"GMI\"].merge(truth[\"AMSR2\"], on=\"point\", suffixes=(\"_gmi\", \"_amsr2\"))\n",
+ "true_pairs[\"dt\"] = true_pairs.seconds_gmi - true_pairs.seconds_amsr2\n",
+ "true_pairs = true_pairs[\n",
+ " (true_pairs.dt.abs() <= WINDOW)\n",
+ " & ~in_gap(\"AMSR2\", true_pairs.seconds_amsr2)\n",
+ " & ~in_gap(\"GMI\", true_pairs.seconds_gmi)\n",
+ "]\n",
+ "true_pairs[\"seconds\"] = (true_pairs.seconds_gmi + true_pairs.seconds_amsr2) / 2\n",
+ "\n",
+ "\n",
+ "def coincidences(instantaneous):\n",
+ " \"\"\"Coincident observations of pairs of satellites within WINDOW (of their periods, or their epochs if\n",
+ " instantaneous), with the epochs (s) of the GMI and AMSR2 observations that contribute to each (whose widened\n",
+ " periods, or epochs, overlap the coincident period).\"\"\"\n",
+ " tic = time.perf_counter()\n",
+ " found = find_coincident_observations(\n",
+ " observations,\n",
+ " max_time_difference=timedelta(seconds=WINDOW),\n",
+ " instantaneous=instantaneous,\n",
+ " )\n",
+ " elapsed = time.perf_counter() - tic\n",
+ " frame = (\n",
+ " observations.assign(start=observations.epoch, end=observations.epoch)\n",
+ " if instantaneous\n",
+ " else observations\n",
+ " )\n",
+ " found[\"point\"] = point_index.loc[found.target_hash].to_numpy()\n",
+ " half = pd.Timedelta(seconds=WINDOW / 2)\n",
+ " joined = (\n",
+ " found[[\"point\", \"start\", \"end\"]]\n",
+ " .reset_index()\n",
+ " .merge(\n",
+ " frame[[\"point\", \"instrument\", \"start\", \"end\", \"seconds\"]],\n",
+ " on=\"point\",\n",
+ " suffixes=(\"\", \"_observation\"),\n",
+ " )\n",
+ " )\n",
+ " joined = joined[\n",
+ " (joined.start_observation - half <= joined.end)\n",
+ " & (joined.end_observation + half >= joined.start)\n",
+ " ]\n",
+ " epochs = joined.groupby([\"index\", \"instrument\"]).seconds.first().unstack()\n",
+ " found[\"seconds_gmi\"], found[\"seconds_amsr2\"] = epochs[\"GMI\"], epochs[\"AMSR2\"]\n",
+ " found[\"dt\"] = found.seconds_gmi - found.seconds_amsr2\n",
+ " found[\"seconds\"] = (found.seconds_gmi + found.seconds_amsr2) / 2\n",
+ " found = found[\n",
+ " ~in_gap(\"AMSR2\", found.seconds_amsr2) & ~in_gap(\"GMI\", found.seconds_gmi)\n",
+ " ]\n",
+ " return found, elapsed\n",
+ "\n",
+ "\n",
+ "rows = {}\n",
+ "for label, instantaneous in [\n",
+ " (\"observation periods (default)\", False),\n",
+ " (\"instantaneous (epochs)\", True),\n",
+ "]:\n",
+ " found, elapsed = coincidences(instantaneous)\n",
+ " forward = pair(\n",
+ " true_pairs[[\"point\", \"seconds\", \"dt\"]],\n",
+ " found[[\"point\", \"seconds\", \"dt\"]].rename(columns={\"dt\": \"dt_found\"}),\n",
+ " 60,\n",
+ " )\n",
+ " backward = pair(\n",
+ " found[[\"point\", \"seconds\", \"dt\"]],\n",
+ " true_pairs[[\"point\", \"seconds\", \"dt\"]].rename(columns={\"dt\": \"dt_true\"}),\n",
+ " 60,\n",
+ " )\n",
+ " error = (forward.dt_found - forward.dt).dropna()\n",
+ " rows[label] = {\n",
+ " \"true coincidences\": len(true_pairs),\n",
+ " \"coincident observations\": len(found),\n",
+ " \"true coincidences found (%)\": 100 * forward.paired.notna().mean(),\n",
+ " \"found coincidences true (%)\": 100 * backward.paired.notna().mean(),\n",
+ " \"epochs more than 15 minutes apart\": int((found.dt.abs() > WINDOW).sum()),\n",
+ " \"epoch difference, max (s)\": found.dt.abs().max(),\n",
+ " \"time difference error, median (s)\": error.median(),\n",
+ " \"95% |error| (s)\": error.abs().quantile(0.95),\n",
+ " \"unpaired true within 20 s of the limit\": int(\n",
+ " (forward.paired.isna() & (forward.dt.abs() > WINDOW - 20)).sum()\n",
+ " ),\n",
+ " \"unpaired found within 20 s of the limit\": int(\n",
+ " (backward.paired.isna() & (backward.dt.abs() > WINDOW - 20)).sum()\n",
+ " ),\n",
+ " \"time (s)\": elapsed,\n",
+ " }\n",
+ " if instantaneous:\n",
+ " # each instantaneous coincidence spans the two epochs: its duration is their time difference\n",
+ " span = (found.end - found.start).dt.total_seconds()\n",
+ " span_error = (span - found.dt.abs()).abs().max()\n",
+ "durations = (observations.end - observations.start).dt.total_seconds()\n",
+ "print(\n",
+ " \"observation periods: median \"\n",
+ " + \", \".join(\n",
+ " f\"{i} {durations[observations.instrument == i].median():.0f} s\" for i in data\n",
+ " )\n",
+ " + f\"; epochs a median {(observations.epoch - observations.start).dt.total_seconds().median():.0f} s after the start\"\n",
+ ")\n",
+ "print(\n",
+ " f\"instantaneous coincidences: duration minus time difference of their epochs, max |x| {span_error:.2e} s\"\n",
+ ")\n",
+ "pd.DataFrame(rows).T.round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bb938861",
+ "metadata": {},
+ "source": [
+ "Comparing the observations' periods (the default), `find_coincident_observations` finds 97.8% of the true coincidences, but a quarter of the coincidences it reports (2,116 of 8,525) pair observations whose epochs are more than 15 minutes apart, by up to 19.5 minutes. Their periods last a median of 234 s (AMSR2) and 141 s (GMI) and begin when the scan first reaches the point (a median of 8 s before the epoch), so the periods of two observations come within 15 minutes of each other while their scans of the point do not.\n",
+ "\n",
+ "With `instantaneous=True`, the coincidences match: 97.7% of the true coincidences are found, and 99.9% of those found are true (the other 6 are within 20 s of the 15 minute limit, as GMI's 1.5 s timing offset implies), with time differences within 1.0 s (median, the timing offset) and 2.4 s (95%) of the true ones. The true coincidences not found are at the edges of the swaths: 97.7% is the product of the shares of each instrument's passes predicted in Test 1. Each instantaneous coincidence spans exactly the two epochs, so its duration is their time difference. Each run takes about 2 s for the 736,000 observations."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6b70485c",
+ "metadata": {},
+ "source": [
+ "## Test 3: Coincident Ground Track\n",
+ "\n",
+ "`collect_ground_track` computes each instrument's footprint (the scanned arc) every 10 s over the day, with an along-track field of view tailored to that time step so that consecutive footprints tile the swath, and `find_coincident_ground_track` finds the pairs of GMI and AMSR2 footprints within 15 minutes of each other that overlap. The union of their overlaps is compared with the points observed by both instruments within 15 minutes (Test 2)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "b2df81c4",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:13:23.870847Z",
+ "iopub.status.busy": "2026-10-26T00:13:23.870155Z",
+ "iopub.status.idle": "2026-10-26T00:13:26.693840Z",
+ "shell.execute_reply": "2026-10-26T00:13:26.693158Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "16087 footprints, 3338 coincident pairs in 1.8 s\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "points observed in common 5479.00\n",
+ "predicted 5429.00\n",
+ "both 5365.00\n",
+ "observed only 114.00\n",
+ "predicted only 64.00\n",
+ "observed points predicted (%) 97.92\n",
+ "predicted points observed (%) 98.82\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import shapely\n",
+ "\n",
+ "from tatc.analysis import collect_ground_track, find_coincident_ground_track\n",
+ "from tatc.constants import EARTH_MEAN_RADIUS\n",
+ "from tatc.utils import compute_along_track_field_of_view\n",
+ "\n",
+ "STEP = 10 # s, ground track time step\n",
+ "tracked = []\n",
+ "for instrument, satellite in satellites.items():\n",
+ " orbit = satellite.orbit.to_gp_orbit()\n",
+ " # footprints that tile the swath: the along-track field of view tailored to the time step\n",
+ " width = compute_along_track_field_of_view(\n",
+ " orbit.get_semimajor_axis() - EARTH_MEAN_RADIUS,\n",
+ " STEP,\n",
+ " orbit.get_inclination(),\n",
+ " eccentricity=orbit.get_eccentricity(),\n",
+ " )\n",
+ " tracked.append(\n",
+ " satellite.model_copy(\n",
+ " update={\n",
+ " \"instruments\": [\n",
+ " satellite.instruments[0].model_copy(\n",
+ " update={\"along_track_field_of_view\": width}\n",
+ " )\n",
+ " ]\n",
+ " }\n",
+ " )\n",
+ " )\n",
+ "times = [DAY + timedelta(seconds=STEP * (i + 0.5)) for i in range(86400 // STEP)]\n",
+ "track = collect_ground_track(tracked, times)\n",
+ "seconds = (track.time - pd.Timestamp(DAY)).dt.total_seconds()\n",
+ "track = track[\n",
+ " ~(\n",
+ " ((track.instrument == \"AMSR2\") & in_gap(\"AMSR2\", seconds))\n",
+ " | ((track.instrument == \"GMI\") & in_gap(\"GMI\", seconds))\n",
+ " )\n",
+ "]\n",
+ "tic = time.perf_counter()\n",
+ "footprint_pairs = find_coincident_ground_track(\n",
+ " track, max_time_difference=timedelta(seconds=WINDOW)\n",
+ ")\n",
+ "elapsed = time.perf_counter() - tic\n",
+ "common = shapely.union_all(footprint_pairs.geometry.to_numpy())\n",
+ "shapely.prepare(common)\n",
+ "predicted = shapely.contains_xy(\n",
+ " common, points.geometry.x.to_numpy(), points.geometry.y.to_numpy()\n",
+ ")\n",
+ "observed = np.zeros(len(points), dtype=bool)\n",
+ "observed[true_pairs.point.unique()] = True\n",
+ "print(\n",
+ " f\"{len(track)} footprints, {len(footprint_pairs)} coincident pairs in {elapsed:.1f} s\"\n",
+ ")\n",
+ "pd.Series(\n",
+ " {\n",
+ " \"points observed in common\": int(observed.sum()),\n",
+ " \"predicted\": int(predicted.sum()),\n",
+ " \"both\": int((observed & predicted).sum()),\n",
+ " \"observed only\": int((observed & ~predicted).sum()),\n",
+ " \"predicted only\": int((predicted & ~observed).sum()),\n",
+ " \"observed points predicted (%)\": 100\n",
+ " * (observed & predicted).sum()\n",
+ " / observed.sum(),\n",
+ " \"predicted points observed (%)\": 100\n",
+ " * (observed & predicted).sum()\n",
+ " / predicted.sum(),\n",
+ " }\n",
+ ").round(2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "b179279f",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:13:26.695578Z",
+ "iopub.status.busy": "2026-10-26T00:13:26.695345Z",
+ "iopub.status.idle": "2026-10-26T00:13:29.094520Z",
+ "shell.execute_reply": "2026-10-26T00:13:29.093743Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import cartopy.crs as ccrs\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "fig = plt.figure(figsize=(12, 5.2))\n",
+ "ax = fig.add_subplot(projection=ccrs.PlateCarree())\n",
+ "ax.coastlines(linewidth=0.4, color=\"#888780\")\n",
+ "ax.set_global()\n",
+ "for geometry in footprint_pairs.geometry.sample(\n",
+ " min(len(footprint_pairs), 2000), random_state=0\n",
+ "):\n",
+ " for part in getattr(geometry, \"geoms\", [geometry]):\n",
+ " if part.geom_type == \"Polygon\":\n",
+ " ax.fill(\n",
+ " *part.exterior.xy,\n",
+ " color=\"#93c5fd\",\n",
+ " alpha=0.5,\n",
+ " lw=0,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
+ "xy = points.geometry\n",
+ "ax.scatter(\n",
+ " xy.x[observed & predicted],\n",
+ " xy.y[observed & predicted],\n",
+ " s=1,\n",
+ " color=\"#1f4e79\",\n",
+ " label=\"observed and predicted\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
+ "ax.scatter(\n",
+ " xy.x[observed & ~predicted],\n",
+ " xy.y[observed & ~predicted],\n",
+ " s=6,\n",
+ " color=\"#b91c1c\",\n",
+ " label=\"observed only\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
+ "ax.scatter(\n",
+ " xy.x[predicted & ~observed],\n",
+ " xy.y[predicted & ~observed],\n",
+ " s=6,\n",
+ " color=\"#d97706\",\n",
+ " label=\"predicted only\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
+ "ax.set_title(\n",
+ " \"GMI and AMSR2 observations within 15 minutes, 26 September 2026 (blue: coincident footprints)\"\n",
+ ")\n",
+ "ax.legend(loc=\"lower left\", markerscale=3, fontsize=8)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1e7a5d57",
+ "metadata": {},
+ "source": [
+ "`find_coincident_ground_track` finds 3,338 pairs of footprints that overlap within 15 minutes, in under 2 s. Their union covers 97.9% of the points observed by both instruments within 15 minutes, and 98.8% of the points it covers were observed by both. The differences lie along the edges of the coincident areas: at the edges of the swaths, as in Test 1, and where the time difference reaches 15 minutes, which footprints 10 s apart resolve only to their time step. A footprint's time is instantaneous, so the ground track coincidences need no adjustment."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a6771635",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "\n",
+ "| Test | Result |\n",
+ "| --- | --- |\n",
+ "| 1. Passes | Every predicted pass observed; 98.6% (GMI) and 99.2% (AMSR2) of the observed passes predicted, within 2.5 s and 1.6 s (95%) |\n",
+ "| 2. Coincident observations | Comparing periods (the default), a quarter of the coincident observations pair epochs more than 15 minutes apart (the periods of conical observations last minutes); with `instantaneous=True`, 97.7% of the true coincidences found and 99.9% of those found true, with time differences within 2.4 s (95%) |\n",
+ "| 3. Coincident ground track | 97.9% of the points observed by both instruments within 15 minutes covered by coincident footprints, and 98.8% of the points covered observed by both |\n",
+ "\n",
+ "**TAT-C's coincidence analyses are validated against GMI and AMSR2.** With the conical scanner models of the companion notebooks and published orbits, TAT-C predicts where and when GMI and AMSR2 observe the same places within 15 minutes, as points (`find_coincident_observations`) and as areas (`find_coincident_ground_track`), to within the edges of their swaths and a couple of seconds, for a day of observations of a quarter of a million points in seconds.\n",
+ "\n",
+ "**Finding: coincidences of observation periods.** `find_coincident_observations` compares the observations' periods (`start` to `end`), not their epochs. For a `ConicalInstrument`, as for a `PointedInstrument`, the period is the time the point spends within reach of the scan, which lasts minutes, while the epoch is the time the scan crosses the point. Coincidences of the samples themselves, as in intercalibration, require comparing the epochs: `find_coincident_observations` does so with `instantaneous=True`, and reports each coincidence from the first contributing epoch to the last, so that its duration is the time difference.\n",
+ "\n",
+ "**Next steps:**\n",
+ "\n",
+ "1. *Polar coincidences.* Compare coincident observations of two sun-synchronous satellites, such as NOAA-20 and Metop, whose simultaneous nadir overpasses occur near the poles.\n",
+ "2. *Aircraft underflights.* Coincidences of satellites with moving platforms, such as research aircraft, which TAT-C does not yet model.\n",
+ "\n",
+ "**Limitations.** This study covers one day and two instruments. GPM's element set is 8 days from the analysis day, which shifts GMI's predicted observations by about 1.5 s, and an instrument observes a point when a sample lies within 8 km of it, which extends the observed swaths slightly beyond TAT-C's."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/validation/ValidateConicalAMSR2.ipynb b/docs/validation/ValidateConicalAMSR2.ipynb
index f12056b5..0a1d16ec 100644
--- a/docs/validation/ValidateConicalAMSR2.ipynb
+++ b/docs/validation/ValidateConicalAMSR2.ipynb
@@ -32,10 +32,10 @@
"id": "dae87e44",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T20:03:02.813744Z",
- "iopub.status.busy": "2026-10-08T20:03:02.813744Z",
- "iopub.status.idle": "2026-10-08T20:03:03.620490Z",
- "shell.execute_reply": "2026-10-08T20:03:03.620490Z"
+ "iopub.execute_input": "2026-10-25T14:01:00.169553Z",
+ "iopub.status.busy": "2026-10-25T14:01:00.169553Z",
+ "iopub.status.idle": "2026-10-25T14:01:01.123396Z",
+ "shell.execute_reply": "2026-10-25T14:01:01.123396Z"
}
},
"outputs": [
@@ -88,7 +88,11 @@
" timeout=120,\n",
" ).json()[\"items\"]\n",
" urls = [\n",
- " next(u[\"URL\"] for u in g[\"umm\"][\"RelatedUrls\"] if u[\"URL\"].startswith(\"https://data.gesdisc\"))\n",
+ " next(\n",
+ " u[\"URL\"]\n",
+ " for u in g[\"umm\"][\"RelatedUrls\"]\n",
+ " if u[\"URL\"].startswith(\"https://data.gesdisc\")\n",
+ " )\n",
" for g in granules\n",
" ]\n",
" parts = []\n",
@@ -96,22 +100,26 @@
" with h5py.File(io.BytesIO(session.get(url, timeout=900).content)) as f:\n",
" s1 = f[\"S1\"]\n",
" seconds = (\n",
- " pd.to_datetime(\n",
- " pd.DataFrame(\n",
- " {\n",
- " \"year\": s1[\"ScanTime/Year\"][:],\n",
- " \"month\": s1[\"ScanTime/Month\"][:],\n",
- " \"day\": s1[\"ScanTime/DayOfMonth\"][:],\n",
- " \"hour\": s1[\"ScanTime/Hour\"][:],\n",
- " \"minute\": s1[\"ScanTime/Minute\"][:],\n",
- " \"second\": s1[\"ScanTime/Second\"][:],\n",
- " \"ms\": s1[\"ScanTime/MilliSecond\"][:],\n",
- " }\n",
- " ),\n",
- " utc=True,\n",
+ " (\n",
+ " pd.to_datetime(\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"year\": s1[\"ScanTime/Year\"][:],\n",
+ " \"month\": s1[\"ScanTime/Month\"][:],\n",
+ " \"day\": s1[\"ScanTime/DayOfMonth\"][:],\n",
+ " \"hour\": s1[\"ScanTime/Hour\"][:],\n",
+ " \"minute\": s1[\"ScanTime/Minute\"][:],\n",
+ " \"second\": s1[\"ScanTime/Second\"][:],\n",
+ " \"ms\": s1[\"ScanTime/MilliSecond\"][:],\n",
+ " }\n",
+ " ),\n",
+ " utc=True,\n",
+ " )\n",
+ " - pd.Timestamp(DAY)\n",
" )\n",
- " - pd.Timestamp(DAY)\n",
- " ).dt.total_seconds().to_numpy()\n",
+ " .dt.total_seconds()\n",
+ " .to_numpy()\n",
+ " )\n",
" parts.append(\n",
" {\n",
" \"time\": seconds,\n",
@@ -126,10 +134,18 @@
" # keep each scan once (orbit files overlap), in time order, within the day\n",
" _, first = np.unique(reduced[\"time\"], return_index=True)\n",
" keep = first[(reduced[\"time\"][first] >= 0) & (reduced[\"time\"][first] < 86400)]\n",
- " np.savez_compressed(CACHE_FILE, granules=len(urls), **{k: v[keep] for k, v in reduced.items()})\n",
+ " np.savez_compressed(\n",
+ " CACHE_FILE, granules=len(urls), **{k: v[keep] for k, v in reduced.items()}\n",
+ " )\n",
"\n",
"amsr2 = dict(np.load(CACHE_FILE))\n",
- "pd.Series({\"orbit files\": int(amsr2[\"granules\"]), \"scans\": len(amsr2[\"time\"]), \"samples per scan\": amsr2[\"lat\"].shape[1]})"
+ "pd.Series(\n",
+ " {\n",
+ " \"orbit files\": int(amsr2[\"granules\"]),\n",
+ " \"scans\": len(amsr2[\"time\"]),\n",
+ " \"samples per scan\": amsr2[\"lat\"].shape[1],\n",
+ " }\n",
+ ")"
]
},
{
@@ -148,10 +164,10 @@
"id": "9d928c88",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T20:03:03.622499Z",
- "iopub.status.busy": "2026-10-08T20:03:03.622499Z",
- "iopub.status.idle": "2026-10-08T20:03:05.210042Z",
- "shell.execute_reply": "2026-10-08T20:03:05.210042Z"
+ "iopub.execute_input": "2026-10-25T14:01:01.125725Z",
+ "iopub.status.busy": "2026-10-25T14:01:01.125725Z",
+ "iopub.status.idle": "2026-10-25T14:01:03.183997Z",
+ "shell.execute_reply": "2026-10-25T14:01:03.183997Z"
}
},
"outputs": [
@@ -183,7 +199,15 @@
"from tatc.generation import generate_points_fibonacci_lattice\n",
"from tatc.constants import EARTH_ROTATION_RATE\n",
"from tatc.analysis import compute_ground_track\n",
- "from tatc.schemas import ConicalInstrument, GeneralPerturbationsOrbit, Instrument, Point, PointedInstrument, Satellite\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " ConicalInstrument,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Instrument,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
"from tatc.utils import (\n",
" VelocityFrame,\n",
" compute_projected_ray_position,\n",
@@ -194,7 +218,11 @@
"GEOD = Geod(ellps=\"WGS84\")\n",
"TO_ECEF = Transformer.from_crs(\"EPSG:4979\", \"EPSG:4978\", always_xy=True)\n",
"TO_GEODETIC = Transformer.from_crs(\"EPSG:4978\", \"EPSG:4979\", always_xy=True)\n",
- "gcomw = Satellite(name=\"GCOM-W\", orbit=GeneralPerturbationsOrbit.from_tle(TLE))\n",
+ "# not yaw-steered: the body (and its instruments' views) aligned with the inertial velocity\n",
+ "INERTIAL = Attitude(velocity_frame=VelocityFrame.INERTIAL)\n",
+ "gcomw = Satellite(\n",
+ " name=\"GCOM-W\", orbit=GeneralPerturbationsOrbit.from_tle(TLE), attitude=INERTIAL\n",
+ ")\n",
"orbit = gcomw.orbit.to_gp_orbit()\n",
"N_SAMPLES = amsr2[\"lat\"].shape[1]\n",
"\n",
@@ -205,13 +233,17 @@
"\n",
"def ecef(lon, lat, height=0.0):\n",
" \"\"\"Earth-fixed position (m) of geodetic coordinates, stacked on the last axis.\"\"\"\n",
- " return np.stack(TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1)\n",
+ " return np.stack(\n",
+ " TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1\n",
+ " )\n",
"\n",
"\n",
"def up(lon, lat):\n",
" \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
" lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
+ " return np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def normalize(x):\n",
@@ -220,29 +252,49 @@
"\n",
"def inertial_velocity(position, velocity):\n",
" \"\"\"Inertial velocity expressed in Earth-fixed coordinates.\"\"\"\n",
- " return velocity + EARTH_ROTATION_RATE * np.stack([-position[..., 1], position[..., 0], np.zeros(position.shape[:-1])], axis=-1)\n",
+ " return velocity + EARTH_ROTATION_RATE * np.stack(\n",
+ " [-position[..., 1], position[..., 0], np.zeros(position.shape[:-1])], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def summarize(x):\n",
" \"\"\"Summary statistics of a residual sample.\"\"\"\n",
" x = np.asarray(x, dtype=float)\n",
" x = x[np.isfinite(x)]\n",
- " return pd.Series({\"n\": x.size, \"median\": np.median(x), \"p95 |x|\": np.percentile(np.abs(x), 95), \"max |x|\": np.abs(x).max()})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": x.size,\n",
+ " \"median\": np.median(x),\n",
+ " \"p95 |x|\": np.percentile(np.abs(x), 95),\n",
+ " \"max |x|\": np.abs(x).max(),\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"def binned(x, y, edges, q=(5, 50, 95)):\n",
" \"\"\"Percentiles of y in bins of x.\"\"\"\n",
" i = np.digitize(x, edges) - 1\n",
- " return np.array([np.percentile(y[i == k], q) if np.any(i == k) else [np.nan] * len(q) for k in range(len(edges) - 1)])\n",
+ " return np.array(\n",
+ " [\n",
+ " np.percentile(y[i == k], q) if np.any(i == k) else [np.nan] * len(q)\n",
+ " for k in range(len(edges) - 1)\n",
+ " ]\n",
+ " )\n",
"\n",
"\n",
"scan_time = amsr2[\"time\"]\n",
- "sc_pos = ecef(amsr2[\"sc_lon\"].astype(float), amsr2[\"sc_lat\"].astype(float), amsr2[\"sc_alt\"].astype(float) * 1e3)\n",
+ "sc_pos = ecef(\n",
+ " amsr2[\"sc_lon\"].astype(float),\n",
+ " amsr2[\"sc_lat\"].astype(float),\n",
+ " amsr2[\"sc_alt\"].astype(float) * 1e3,\n",
+ ")\n",
"sc_vel = np.gradient(sc_pos, scan_time, axis=0)\n",
"# scans whose neighbors are contiguous (no data gap), for velocities\n",
"contiguous = np.r_[np.diff(scan_time) < 2, False] & np.r_[False, np.diff(scan_time) < 2]\n",
"foot_lat, foot_lon = amsr2[\"lat\"].astype(float), amsr2[\"lon\"].astype(float)\n",
- "gaps = [(scan_time[i], scan_time[i + 1]) for i in np.nonzero(np.diff(scan_time) > 60)[0]]\n",
+ "gaps = [\n",
+ " (scan_time[i], scan_time[i + 1]) for i in np.nonzero(np.diff(scan_time) > 60)[0]\n",
+ "]\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
"plt.rcParams.update(\n",
@@ -258,7 +310,9 @@
" {\n",
" \"scans\": len(scan_time),\n",
" \"scan period (s)\": np.median(np.diff(scan_time)),\n",
- " \"data gaps (UTC)\": \", \".join(f\"{a / 3600:.2f} to {b / 3600:.2f} h\" for a, b in gaps),\n",
+ " \"data gaps (UTC)\": \", \".join(\n",
+ " f\"{a / 3600:.2f} to {b / 3600:.2f} h\" for a, b in gaps\n",
+ " ),\n",
" \"altitude range (km)\": f\"{amsr2['sc_alt'].min():.0f} to {amsr2['sc_alt'].max():.0f}\",\n",
" }\n",
")"
@@ -280,10 +334,10 @@
"id": "0bed05f7",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T20:03:05.212048Z",
- "iopub.status.busy": "2026-10-08T20:03:05.212048Z",
- "iopub.status.idle": "2026-10-08T20:03:05.242759Z",
- "shell.execute_reply": "2026-10-08T20:03:05.242759Z"
+ "iopub.execute_input": "2026-10-25T14:01:03.187003Z",
+ "iopub.status.busy": "2026-10-25T14:01:03.186002Z",
+ "iopub.status.idle": "2026-10-25T14:01:03.230395Z",
+ "shell.execute_reply": "2026-10-25T14:01:03.230395Z"
}
},
"outputs": [
@@ -354,14 +408,20 @@
],
"source": [
"i1 = np.nonzero(contiguous)[0][::50]\n",
- "p1 = np.array(orbit.get_orbit_track(to_utc(scan_time[i1])).frame_xyz_and_velocity(itrs)[0].m).T\n",
+ "p1 = np.array(\n",
+ " orbit.get_orbit_track(to_utc(scan_time[i1])).frame_xyz_and_velocity(itrs)[0].m\n",
+ ").T\n",
"offset1 = p1 - sc_pos[i1]\n",
"radial1 = normalize(sc_pos[i1])\n",
- "along1 = normalize(sc_vel[i1] - np.sum(sc_vel[i1] * radial1, axis=-1, keepdims=True) * radial1)\n",
+ "along1 = normalize(\n",
+ " sc_vel[i1] - np.sum(sc_vel[i1] * radial1, axis=-1, keepdims=True) * radial1\n",
+ ")\n",
"pd.DataFrame(\n",
" {\n",
" \"along-track (km)\": summarize(np.sum(offset1 * along1, axis=-1) / 1e3),\n",
- " \"cross-track, right (km)\": summarize(np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3),\n",
+ " \"cross-track, right (km)\": summarize(\n",
+ " np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3\n",
+ " ),\n",
" \"radial (km)\": summarize(np.sum(offset1 * radial1, axis=-1) / 1e3),\n",
" }\n",
").T.round(3)"
@@ -385,10 +445,10 @@
"id": "4670f7ae",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T20:03:05.244766Z",
- "iopub.status.busy": "2026-10-08T20:03:05.244766Z",
- "iopub.status.idle": "2026-10-08T20:03:05.478544Z",
- "shell.execute_reply": "2026-10-08T20:03:05.478544Z"
+ "iopub.execute_input": "2026-10-25T14:01:03.232927Z",
+ "iopub.status.busy": "2026-10-25T14:01:03.231423Z",
+ "iopub.status.idle": "2026-10-25T14:01:03.493998Z",
+ "shell.execute_reply": "2026-10-25T14:01:03.493489Z"
}
},
"outputs": [
@@ -423,19 +483,41 @@
"\n",
"def azimuth(velocity):\n",
" \"\"\"Scan azimuth (deg) of each line of sight from the horizontal direction of a velocity, positive to the left.\"\"\"\n",
- " forward = normalize(velocity - np.sum(velocity * nadir, axis=-1, keepdims=True) * nadir)\n",
+ " forward = normalize(\n",
+ " velocity - np.sum(velocity * nadir, axis=-1, keepdims=True) * nadir\n",
+ " )\n",
" left = np.cross(forward, nadir)\n",
- " horizontal = los - np.sum(los * nadir[:, None], axis=-1, keepdims=True) * nadir[:, None]\n",
- " return np.degrees(np.arctan2(np.sum(horizontal * left[:, None], axis=-1), np.sum(horizontal * forward[:, None], axis=-1)))\n",
+ " horizontal = (\n",
+ " los - np.sum(los * nadir[:, None], axis=-1, keepdims=True) * nadir[:, None]\n",
+ " )\n",
+ " return np.degrees(\n",
+ " np.arctan2(\n",
+ " np.sum(horizontal * left[:, None], axis=-1),\n",
+ " np.sum(horizontal * forward[:, None], axis=-1),\n",
+ " )\n",
+ " )\n",
"\n",
"\n",
"azimuth_earth = azimuth(sc_vel[i2])\n",
"azimuth_inertial = azimuth(inertial_velocity(sc_pos[i2], sc_vel[i2]))\n",
"CONE = float(np.median(cone))\n",
- "SECTOR = float(np.median(azimuth_inertial[:, -1] - azimuth_inertial[:, 0]) / 2) # half-width (deg)\n",
+ "SECTOR = float(\n",
+ " np.median(azimuth_inertial[:, -1] - azimuth_inertial[:, 0]) / 2\n",
+ ") # half-width (deg)\n",
"CENTER = float(np.median(azimuth_inertial[:, -1] + azimuth_inertial[:, 0]) / 2) # deg\n",
- "chord = GEOD.inv(foot_lon[i2, 0], foot_lat[i2, 0], foot_lon[i2, -1], foot_lat[i2, -1])[2] / 1e3\n",
- "ahead = GEOD.inv(np.asarray(sub_lon), np.asarray(sub_lat), foot_lon[i2, N_SAMPLES // 2], foot_lat[i2, N_SAMPLES // 2])[2] / 1e3\n",
+ "chord = (\n",
+ " GEOD.inv(foot_lon[i2, 0], foot_lat[i2, 0], foot_lon[i2, -1], foot_lat[i2, -1])[2]\n",
+ " / 1e3\n",
+ ")\n",
+ "ahead = (\n",
+ " GEOD.inv(\n",
+ " np.asarray(sub_lon),\n",
+ " np.asarray(sub_lat),\n",
+ " foot_lon[i2, N_SAMPLES // 2],\n",
+ " foot_lat[i2, N_SAMPLES // 2],\n",
+ " )[2]\n",
+ " / 1e3\n",
+ ")\n",
"center_earth = (azimuth_earth[:, 0] + azimuth_earth[:, -1]) / 2\n",
"center_inertial = (azimuth_inertial[:, 0] + azimuth_inertial[:, -1]) / 2\n",
"pd.Series(\n",
@@ -446,8 +528,12 @@
" \"scan sector center (deg)\": CENTER,\n",
" \"scan sector half-width (deg)\": SECTOR,\n",
" \"sample spacing (deg)\": np.median(np.diff(azimuth_inertial, axis=1)),\n",
- " \"arc center offset from Earth-fixed velocity, p95 |x| (deg)\": np.percentile(np.abs(center_earth), 95),\n",
- " \"arc center offset from inertial velocity, p95 |x| (deg)\": np.percentile(np.abs(center_inertial), 95),\n",
+ " \"arc center offset from Earth-fixed velocity, p95 |x| (deg)\": np.percentile(\n",
+ " np.abs(center_earth), 95\n",
+ " ),\n",
+ " \"arc center offset from inertial velocity, p95 |x| (deg)\": np.percentile(\n",
+ " np.abs(center_inertial), 95\n",
+ " ),\n",
" \"arc center distance ahead of nadir (km)\": np.median(ahead),\n",
" \"arc end-to-end distance (swath width, km)\": np.median(chord),\n",
" }\n",
@@ -460,10 +546,10 @@
"id": "86dccf0b",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T20:03:05.480579Z",
- "iopub.status.busy": "2026-10-08T20:03:05.480579Z",
- "iopub.status.idle": "2026-10-08T20:03:05.771311Z",
- "shell.execute_reply": "2026-10-08T20:03:05.771311Z"
+ "iopub.execute_input": "2026-10-25T14:01:03.496003Z",
+ "iopub.status.busy": "2026-10-25T14:01:03.496003Z",
+ "iopub.status.idle": "2026-10-25T14:01:03.836337Z",
+ "shell.execute_reply": "2026-10-25T14:01:03.836337Z"
}
},
"outputs": [
@@ -481,12 +567,30 @@
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(11, 3.6))\n",
"axes[0].plot(np.median(azimuth_inertial, axis=0), np.median(cone, axis=0), color=BLUE)\n",
- "axes[0].set(xlabel=\"Scan azimuth from inertial velocity (deg, positive left)\", ylabel=\"Cone angle (deg)\", title=\"AMSR2 scan: constant cone angle\", ylim=(CONE - 1, CONE + 1))\n",
+ "axes[0].set(\n",
+ " xlabel=\"Scan azimuth from inertial velocity (deg, positive left)\",\n",
+ " ylabel=\"Cone angle (deg)\",\n",
+ " title=\"AMSR2 scan: constant cone angle\",\n",
+ " ylim=(CONE - 1, CONE + 1),\n",
+ ")\n",
"asc = sc_vel[i2, 2] > 0\n",
"for mask, color, label in [(asc, BLUE, \"ascending\"), (~asc, AQUA, \"descending\")]:\n",
- " axes[1].scatter(sub_lat[mask], center_earth[mask], s=3, color=color, label=f\"vs. Earth-fixed velocity, {label}\")\n",
- "axes[1].scatter(sub_lat, center_inertial, s=3, color=ORANGE, label=\"vs. inertial velocity, both\")\n",
- "axes[1].set(xlabel=\"Sub-satellite latitude (deg)\", ylabel=\"Arc center azimuth (deg)\", title=\"Orientation of the scan arc\", ylim=(-5, 5))\n",
+ " axes[1].scatter(\n",
+ " sub_lat[mask],\n",
+ " center_earth[mask],\n",
+ " s=3,\n",
+ " color=color,\n",
+ " label=f\"vs. Earth-fixed velocity, {label}\",\n",
+ " )\n",
+ "axes[1].scatter(\n",
+ " sub_lat, center_inertial, s=3, color=ORANGE, label=\"vs. inertial velocity, both\"\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Sub-satellite latitude (deg)\",\n",
+ " ylabel=\"Arc center azimuth (deg)\",\n",
+ " title=\"Orientation of the scan arc\",\n",
+ " ylim=(-5, 5),\n",
+ ")\n",
"axes[1].legend(frameon=False, fontsize=8, markerscale=4, loc=\"center\")\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -518,10 +622,10 @@
"id": "29582e67",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T20:03:05.773318Z",
- "iopub.status.busy": "2026-10-08T20:03:05.773318Z",
- "iopub.status.idle": "2026-10-08T20:03:06.034297Z",
- "shell.execute_reply": "2026-10-08T20:03:06.034297Z"
+ "iopub.execute_input": "2026-10-25T14:01:03.839341Z",
+ "iopub.status.busy": "2026-10-25T14:01:03.839341Z",
+ "iopub.status.idle": "2026-10-25T14:01:04.216418Z",
+ "shell.execute_reply": "2026-10-25T14:01:04.216418Z"
}
},
"outputs": [
@@ -547,12 +651,18 @@
"altitude = float(np.median(amsr2[\"sc_alt\"])) * 1e3\n",
"swath = float(np.median(chord)) * 1e3\n",
"c, a = np.radians(CONE), np.radians(SECTOR)\n",
- "pointed_cross = np.degrees(2 * np.arctan(np.sin(c) * np.sin(a) / (np.cos(c) ** 2 + np.sin(c) ** 2 * np.cos(a))))\n",
+ "pointed_cross = np.degrees(\n",
+ " 2 * np.arctan(np.sin(c) * np.sin(a) / (np.cos(c) ** 2 + np.sin(c) ** 2 * np.cos(a)))\n",
+ ")\n",
"# angle from nadir of the pointed view's corners, which its field of regard must contain\n",
- "pointed_corner = np.degrees(np.arccos(np.cos(c) / np.sqrt(1 + np.tan(np.radians(pointed_cross / 2)) ** 2)))\n",
+ "pointed_corner = np.degrees(\n",
+ " np.arccos(np.cos(c) / np.sqrt(1 + np.tan(np.radians(pointed_cross / 2)) ** 2))\n",
+ ")\n",
"candidates = {\n",
" \"cone field of regard\": Instrument(name=\"AMSR2\", field_of_regard=2 * CONE),\n",
- " \"swath field of regard\": Instrument(name=\"AMSR2\", field_of_regard=swath_width_to_field_of_regard(altitude, swath)),\n",
+ " \"swath field of regard\": Instrument(\n",
+ " name=\"AMSR2\", field_of_regard=swath_width_to_field_of_regard(altitude, swath)\n",
+ " ),\n",
" \"pointed view\": PointedInstrument(\n",
" name=\"AMSR2\",\n",
" field_of_regard=2 * pointed_corner + 2,\n",
@@ -560,7 +670,6 @@
" along_track_field_of_view=1,\n",
" pitch_angle=CONE,\n",
" is_rectangular=True,\n",
- " velocity_frame=VelocityFrame.INERTIAL,\n",
" ),\n",
" \"conical instrument\": ConicalInstrument(\n",
" name=\"AMSR2\",\n",
@@ -568,7 +677,6 @@
" scan_center_azimuth=CENTER,\n",
" scan_half_width=SECTOR,\n",
" along_track_field_of_view=1,\n",
- " velocity_frame=VelocityFrame.INERTIAL,\n",
" ),\n",
"}\n",
"\n",
@@ -576,7 +684,9 @@
"def arc_rays(azimuth_deg, cone_deg=CONE):\n",
" \"\"\"Roll and pitch angles (deg) of rays on a cone at scan azimuths (positive left).\"\"\"\n",
" c, a = np.radians(cone_deg), np.radians(azimuth_deg)\n",
- " return np.degrees(np.arctan2(np.sin(c) * np.sin(a), np.cos(c))), np.degrees(np.arcsin(np.sin(c) * np.cos(a)))\n",
+ " return np.degrees(np.arctan2(np.sin(c) * np.sin(a), np.cos(c))), np.degrees(\n",
+ " np.arcsin(np.sin(c) * np.cos(a))\n",
+ " )\n",
"\n",
"\n",
"# trace the arc at the median scan azimuth of every sixth sample, at every hundredth scan\n",
@@ -587,25 +697,52 @@
"track3 = orbit.get_orbit_track(to_utc(scan_time[i3]))\n",
"for n, j in enumerate(samples3):\n",
" roll, pitch = arc_rays(median_azimuth[j])\n",
- " ray = compute_projected_ray_position(track3, 0, 0, roll, pitch, velocity_frame=VelocityFrame.INERTIAL)\n",
- " residual3[:, n] = GEOD.inv(ray.longitude.degrees, ray.latitude.degrees, foot_lon[i3, j], foot_lat[i3, j])[2] / 1e3\n",
+ " ray = compute_projected_ray_position(\n",
+ " track3, 0, 0, roll, pitch, velocity_frame=VelocityFrame.INERTIAL\n",
+ " )\n",
+ " residual3[:, n] = (\n",
+ " GEOD.inv(\n",
+ " ray.longitude.degrees,\n",
+ " ray.latitude.degrees,\n",
+ " foot_lon[i3, j],\n",
+ " foot_lat[i3, j],\n",
+ " )[2]\n",
+ " / 1e3\n",
+ " )\n",
"swath_width = np.vectorize(field_of_regard_to_swath_width)\n",
"widths = {\n",
" \"cone field of regard\": swath_width(amsr2[\"sc_alt\"][i2] * 1e3, 2 * CONE) / 1e3,\n",
- " \"swath field of regard\": swath_width(amsr2[\"sc_alt\"][i2] * 1e3, candidates[\"swath field of regard\"].field_of_regard) / 1e3,\n",
- " \"conical instrument\": np.vectorize(candidates[\"conical instrument\"].get_swath_width)(amsr2[\"sc_alt\"][i2] * 1e3) / 1e3,\n",
+ " \"swath field of regard\": swath_width(\n",
+ " amsr2[\"sc_alt\"][i2] * 1e3, candidates[\"swath field of regard\"].field_of_regard\n",
+ " )\n",
+ " / 1e3,\n",
+ " \"conical instrument\": np.vectorize(\n",
+ " candidates[\"conical instrument\"].get_swath_width\n",
+ " )(amsr2[\"sc_alt\"][i2] * 1e3)\n",
+ " / 1e3,\n",
"}\n",
"pd.concat(\n",
" [\n",
" pd.Series(\n",
" {\n",
- " \"arc traced with roll and pitch, distance to footprints, median (km)\": np.median(residual3),\n",
- " \"arc traced with roll and pitch, distance to footprints, p95 (km)\": np.percentile(residual3, 95),\n",
- " \"swath field of regard (deg)\": candidates[\"swath field of regard\"].field_of_regard,\n",
+ " \"arc traced with roll and pitch, distance to footprints, median (km)\": np.median(\n",
+ " residual3\n",
+ " ),\n",
+ " \"arc traced with roll and pitch, distance to footprints, p95 (km)\": np.percentile(\n",
+ " residual3, 95\n",
+ " ),\n",
+ " \"swath field of regard (deg)\": candidates[\n",
+ " \"swath field of regard\"\n",
+ " ].field_of_regard,\n",
" \"pointed view cross-track field of view (deg)\": pointed_cross,\n",
" }\n",
" ),\n",
- " pd.Series({f\"swath width minus observed, {k}, median (km)\": np.median(v - chord) for k, v in widths.items()}),\n",
+ " pd.Series(\n",
+ " {\n",
+ " f\"swath width minus observed, {k}, median (km)\": np.median(v - chord)\n",
+ " for k, v in widths.items()\n",
+ " }\n",
+ " ),\n",
" ]\n",
").round(2)"
]
@@ -616,10 +753,10 @@
"id": "6adfd16b",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T20:03:06.036301Z",
- "iopub.status.busy": "2026-10-08T20:03:06.036301Z",
- "iopub.status.idle": "2026-10-08T20:03:07.016866Z",
- "shell.execute_reply": "2026-10-08T20:03:07.016362Z"
+ "iopub.execute_input": "2026-10-25T14:01:04.219422Z",
+ "iopub.status.busy": "2026-10-25T14:01:04.218422Z",
+ "iopub.status.idle": "2026-10-25T14:01:05.852411Z",
+ "shell.execute_reply": "2026-10-25T14:01:05.851907Z"
}
},
"outputs": [
@@ -637,20 +774,44 @@
"source": [
"k = i2[len(i2) // 3]\n",
"track = orbit.get_orbit_track(to_utc(scan_time[k]))\n",
- "projection = ccrs.AzimuthalEquidistant(central_longitude=float(amsr2[\"sc_lon\"][k]), central_latitude=float(amsr2[\"sc_lat\"][k]))\n",
+ "projection = ccrs.AzimuthalEquidistant(\n",
+ " central_longitude=float(amsr2[\"sc_lon\"][k]),\n",
+ " central_latitude=float(amsr2[\"sc_lat\"][k]),\n",
+ ")\n",
"fig, ax = plt.subplots(figsize=(7, 6), subplot_kw={\"projection\": projection})\n",
"for (name, instrument), color in zip(candidates.items(), [BLUE, AQUA, ORANGE, INK]):\n",
- " footprint = instrument.compute_footprint(track)[0]\n",
+ " footprint = (\n",
+ " gcomw.model_copy(update={\"instruments\": [instrument]})\n",
+ " .get_instrument()\n",
+ " .compute_footprint(track)[0]\n",
+ " )\n",
" for part in getattr(footprint, \"geoms\", [footprint]):\n",
" ax.plot(*part.exterior.xy, color=color, transform=ccrs.Geodetic(), label=name)\n",
- "ax.plot(foot_lon[k], foot_lat[k], color=GRAY, lw=6, alpha=0.6, transform=ccrs.Geodetic(), label=\"AMSR2 scan (footprint centers)\")\n",
- "ax.plot(amsr2[\"sc_lon\"][k], amsr2[\"sc_lat\"][k], \"k^\", transform=ccrs.Geodetic(), label=\"sub-satellite point\")\n",
+ "ax.plot(\n",
+ " foot_lon[k],\n",
+ " foot_lat[k],\n",
+ " color=GRAY,\n",
+ " lw=6,\n",
+ " alpha=0.6,\n",
+ " transform=ccrs.Geodetic(),\n",
+ " label=\"AMSR2 scan (footprint centers)\",\n",
+ ")\n",
+ "ax.plot(\n",
+ " amsr2[\"sc_lon\"][k],\n",
+ " amsr2[\"sc_lat\"][k],\n",
+ " \"k^\",\n",
+ " transform=ccrs.Geodetic(),\n",
+ " label=\"sub-satellite point\",\n",
+ ")\n",
"ax.coastlines(color=GRAY, linewidth=0.5)\n",
"ax.set_extent([-1900e3, 1900e3, -1900e3, 1900e3], crs=projection)\n",
"handles, labels = ax.get_legend_handles_labels()\n",
"unique = dict(zip(labels, handles))\n",
"ax.legend(unique.values(), unique.keys(), frameon=False, fontsize=8, loc=\"lower left\")\n",
- "ax.set_title(f\"One AMSR2 scan and candidate TAT-C footprints ({DAY + timedelta(seconds=float(scan_time[k])):%H:%M:%S} UTC)\", fontsize=9)\n",
+ "ax.set_title(\n",
+ " f\"One AMSR2 scan and candidate TAT-C footprints ({DAY + timedelta(seconds=float(scan_time[k])):%H:%M:%S} UTC)\",\n",
+ " fontsize=9,\n",
+ ")\n",
"plt.show()"
]
},
@@ -678,10 +839,10 @@
"id": "2bb7fe8c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T20:03:07.018871Z",
- "iopub.status.busy": "2026-10-08T20:03:07.018871Z",
- "iopub.status.idle": "2026-10-08T20:09:34.032427Z",
- "shell.execute_reply": "2026-10-08T20:09:34.032427Z"
+ "iopub.execute_input": "2026-10-25T14:01:05.854415Z",
+ "iopub.status.busy": "2026-10-25T14:01:05.854415Z",
+ "iopub.status.idle": "2026-10-25T14:07:06.252631Z",
+ "shell.execute_reply": "2026-10-25T14:07:06.252125Z"
}
},
"outputs": [
@@ -731,20 +892,20 @@
"
"
]
@@ -1029,10 +1250,24 @@
"edges4 = np.arange(-72, 73, 4)\n",
"for (feed, model), merged in matched4.items():\n",
" hit = merged.predicted.notna()\n",
- " q = binned(merged.azimuth[hit].to_numpy(), (merged.predicted - merged.time).dt.total_seconds()[hit].to_numpy(), edges4)\n",
- " ax.plot((edges4[:-1] + edges4[1:]) / 2, q[:, 1], color=FEED_COLORS[feed], ls=\"-\" if model == \"conical instrument\" else \":\", label=f\"{feed}, {model}\")\n",
+ " q = binned(\n",
+ " merged.azimuth[hit].to_numpy(),\n",
+ " (merged.predicted - merged.time).dt.total_seconds()[hit].to_numpy(),\n",
+ " edges4,\n",
+ " )\n",
+ " ax.plot(\n",
+ " (edges4[:-1] + edges4[1:]) / 2,\n",
+ " q[:, 1],\n",
+ " color=FEED_COLORS[feed],\n",
+ " ls=\"-\" if model == \"conical instrument\" else \":\",\n",
+ " label=f\"{feed}, {model}\",\n",
+ " )\n",
"ax.axhline(0, color=GRAY, lw=0.8)\n",
- "ax.set(xlabel=\"Scan azimuth of the observation (deg, positive left)\", ylabel=\"TAT-C minus GMI (s)\", title=\"Observation time by position in the scan\")\n",
+ "ax.set(\n",
+ " xlabel=\"Scan azimuth of the observation (deg, positive left)\",\n",
+ " ylabel=\"TAT-C minus GMI (s)\",\n",
+ " title=\"Observation time by position in the scan\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1043,7 +1278,7 @@
"id": "9c236088",
"metadata": {},
"source": [
- "The conical instruments predict 99.7% of the passes observed by the low-frequency feed (3,084 of 3,093) and 99.8% of those observed by the high-frequency feed (2,724 of 2,730), with a single extra prediction. Their epochs follow the observation times by 0.56 s (median) and by no more than 0.69 s (95th percentile), uniformly across the scan. The offset is the orbit's: TAT-C's satellite trails GPM by 4.2 km (Test 1), or about 0.6 s, so the times are otherwise consistent to about 0.1 s.\n",
+ "The conical instruments predict all but one of the passes observed by the low-frequency feed (3,092 of 3,093) and every pass observed by the high-frequency feed (2,730), with a single extra prediction. Their epochs follow the observation times by 0.56 s (median) and by no more than 0.69 s (95th percentile), uniformly across the scan. The offset is the orbit's: TAT-C's satellite trails GPM by 4.2 km (Test 1), or about 0.6 s, so the times are otherwise consistent to about 0.1 s.\n",
"\n",
"This test exposed an error in the access periods within which `collect_observations` searches for cone crossings. Over a full day, Skyfield's `find_events` returned some rise and set times several seconds late, and passes whose cone crossing came within a few seconds of the start of the access period were missed (about 1.5% of the passes, mostly near GPM's northernmost latitudes). TAT-C now refines rise and set times to within a millisecond.\n",
"\n",
@@ -1060,10 +1295,10 @@
"id": "62567c06",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:44:20.930658Z",
- "iopub.status.busy": "2026-10-08T17:44:20.930658Z",
- "iopub.status.idle": "2026-10-08T18:04:41.697254Z",
- "shell.execute_reply": "2026-10-08T18:04:41.697254Z"
+ "iopub.execute_input": "2026-10-25T14:16:26.743621Z",
+ "iopub.status.busy": "2026-10-25T14:16:26.743621Z",
+ "iopub.status.idle": "2026-10-25T14:27:36.250782Z",
+ "shell.execute_reply": "2026-10-25T14:27:36.250782Z"
}
},
"outputs": [
@@ -1193,9 +1428,13 @@
"source": [
"orbit_start = 12 * 3600\n",
"orbit_period = 86400 / float(TLE[1][52:63])\n",
- "scans5 = np.nonzero((scan_time >= orbit_start) & (scan_time < orbit_start + orbit_period))[0]\n",
+ "scans5 = np.nonzero(\n",
+ " (scan_time >= orbit_start) & (scan_time < orbit_start + orbit_period)\n",
+ ")[0]\n",
"STEP5, MARGIN5 = 0.1, 60 # deg, s\n",
- "lon5, lat5 = np.meshgrid(np.arange(-180 + STEP5 / 2, 180, STEP5), np.arange(-90 + STEP5 / 2, 90, STEP5))\n",
+ "lon5, lat5 = np.meshgrid(\n",
+ " np.arange(-180 + STEP5 / 2, 180, STEP5), np.arange(-90 + STEP5 / 2, 90, STEP5)\n",
+ ")\n",
"cell_area5 = (np.cos(np.radians(lat5)) * (STEP5 * 111.32) ** 2).ravel()\n",
"grid5 = up(lon5.ravel(), lat5.ravel())\n",
"inclination5 = float(TLE[1][8:16])\n",
@@ -1208,7 +1447,11 @@
" distance5, nearest5 = tree5.query(grid5, workers=-1)\n",
" nearest_time5 = scan_time[scans5][nearest5 // N_SAMPLES] - scan_time[scans5[0]]\n",
" duration5 = scan_time[scans5[-1]] - scan_time[scans5[0]]\n",
- " compared5 = (distance5 < 2 * np.sin(300 / 6371 / 2)) & (nearest_time5 > MARGIN5) & (nearest_time5 < duration5 - MARGIN5)\n",
+ " compared5 = (\n",
+ " (distance5 < 2 * np.sin(300 / 6371 / 2))\n",
+ " & (nearest_time5 > MARGIN5)\n",
+ " & (nearest_time5 < duration5 - MARGIN5)\n",
+ " )\n",
" observed5 = np.zeros(len(grid5), dtype=bool)\n",
" _, nearest_eight = tree5.query(grid5[compared5], k=8, workers=-1)\n",
" for column in range(8):\n",
@@ -1221,17 +1464,33 @@
" observed5[np.flatnonzero(compared5)] |= inside\n",
" for time_step in [1.875, 10, 30]:\n",
" width = compute_along_track_field_of_view(\n",
- " gpm.orbit.get_semimajor_axis() - EARTH_MEAN_RADIUS, time_step, inclination5, eccentricity=gpm.orbit.get_eccentricity()\n",
+ " gpm.orbit.get_semimajor_axis() - EARTH_MEAN_RADIUS,\n",
+ " time_step,\n",
+ " inclination5,\n",
+ " eccentricity=gpm.orbit.get_eccentricity(),\n",
" )\n",
" first, last = scan_time[scans5[0]], scan_time[scans5[-1]]\n",
- " times = to_utc(first + time_step * (np.arange(int((last - first) // time_step)) + 0.5))\n",
- " instrument = instruments[feed].model_copy(update={\"along_track_field_of_view\": width})\n",
- " geometry5 = compute_ground_track(gpm.model_copy(update={\"instruments\": [instrument]}), times).geometry.iloc[0]\n",
+ " times = to_utc(\n",
+ " first + time_step * (np.arange(int((last - first) // time_step)) + 0.5)\n",
+ " )\n",
+ " instrument = instruments[feed].model_copy(\n",
+ " update={\"along_track_field_of_view\": width}\n",
+ " )\n",
+ " geometry5 = compute_ground_track(\n",
+ " gpm.model_copy(update={\"instruments\": [instrument]}), times\n",
+ " ).geometry.iloc[0]\n",
" prepare(geometry5)\n",
" predicted = np.zeros(len(grid5), dtype=bool)\n",
- " predicted[compared5] = contains_xy(geometry5, lon5.ravel()[compared5], lat5.ravel()[compared5])\n",
+ " predicted[compared5] = contains_xy(\n",
+ " geometry5, lon5.ravel()[compared5], lat5.ravel()[compared5]\n",
+ " )\n",
" area = lambda mask: np.sum(mask * cell_area5) / 1e6\n",
- " rows5[(f\"{feed} ({FEEDS[feed]})\", f\"{time_step:g} s ({width:.2f} deg along track)\")] = {\n",
+ " rows5[\n",
+ " (\n",
+ " f\"{feed} ({FEEDS[feed]})\",\n",
+ " f\"{time_step:g} s ({width:.2f} deg along track)\",\n",
+ " )\n",
+ " ] = {\n",
" \"observed (10^6 km^2)\": area(observed5),\n",
" \"TAT-C (10^6 km^2)\": area(predicted),\n",
" \"IoU\": area(observed5 & predicted) / area(observed5 | predicted),\n",
@@ -1255,7 +1514,7 @@
"| 1. Orbit (CelesTrak TLE vs. reported position) | 4.2 km behind along track (median), within 0.5 km across track and radially, a day or more before the TLE epoch |\n",
"| 2. Scan geometry | constant cone angles of 48.46 deg (low frequency) and 45.28 deg (high frequency); both scan 76.0 deg on either side of a center 0.3 deg right of the *inertial* velocity; arcs 522 and 462 km ahead of nadir; swaths 1,012 and 897 km |\n",
"| 3. Footprints | conical instrument footprints follow both arcs; swath width within 0.1 km (median) and 0.4 km (95th percentile) |\n",
- "| 4. Observations (`collect_observations`) | conical instruments: 99.7 and 99.8% of passes matched, one extra, `epoch` 0.56 s late (the orbit offset) and within 0.69 s (95th percentile); cone field of regard: all passes matched, 3.3% extra |\n",
+ "| 4. Observations (`collect_observations`) | conical instruments: 99.97 and 100% of passes matched, one extra, `epoch` 0.56 s late (the orbit offset) and within 0.69 s (95th percentile); cone field of regard: all passes matched, 3.3% extra |\n",
"| 5. Swath coverage (`compute_ground_track`) | IoU of 0.999 or better for both feeds at time steps from 1.875 to 30 s |\n",
"\n",
"**Generality of the conical instrument.** The `ConicalInstrument` was developed against AMSR2; GMI tests it on a different orbit (non-sun-synchronous, 65 deg inclination, 440 km altitude) and with two feeds. Two conical instruments on one satellite, each with its measured cone angle and the common scan sector, in the inertial velocity frame, reproduce the observed passes, their times to within the orbit error, the swath widths to within half a kilometer, and the scanned areas at any time step tested. No change to the model was needed.\n",
diff --git a/docs/validation/ValidateConstellationIridium.ipynb b/docs/validation/ValidateConstellationIridium.ipynb
index a2fd1857..f77f4550 100644
--- a/docs/validation/ValidateConstellationIridium.ipynb
+++ b/docs/validation/ValidateConstellationIridium.ipynb
@@ -156,7 +156,15 @@
"from tatc.analysis import aggregate_observations, collect_multi_observations\n",
"from tatc.constants import EARTH_MEAN_RADIUS, timescale\n",
"from tatc.generation import generate_points_fibonacci_lattice\n",
- "from tatc.schemas import CircularOrbit, GeneralPerturbationsOrbit, Instrument, Point, Satellite, SOCConstellation, WalkerConstellation\n",
+ "from tatc.schemas import (\n",
+ " CircularOrbit,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Instrument,\n",
+ " Point,\n",
+ " Satellite,\n",
+ " SOCConstellation,\n",
+ " WalkerConstellation,\n",
+ ")\n",
"from tatc.schemas.space.walker import WalkerConfiguration\n",
"from tatc.utils import compute_field_of_regard\n",
"\n",
@@ -166,7 +174,11 @@
"END = START + timedelta(hours=12)\n",
"path = ORBIT_DIR / \"iridium-NEXT.tle\"\n",
"if not path.exists():\n",
- " response = requests.get(\"https://celestrak.org/NORAD/elements/gp.php\", params={\"GROUP\": \"iridium-NEXT\", \"FORMAT\": \"tle\"}, timeout=120)\n",
+ " response = requests.get(\n",
+ " \"https://celestrak.org/NORAD/elements/gp.php\",\n",
+ " params={\"GROUP\": \"iridium-NEXT\", \"FORMAT\": \"tle\"},\n",
+ " timeout=120,\n",
+ " )\n",
" response.raise_for_status()\n",
" path.write_text(response.text)\n",
"lines = [line.rstrip() for line in path.read_text().splitlines() if line.strip()]\n",
@@ -186,15 +198,38 @@
"# planes: clusters of right ascension of ascending node\n",
"operational = operational.sort_values(\"raan\")\n",
"operational[\"plane\"] = (operational.raan.diff() > 5).cumsum()\n",
- "planes = operational.groupby(\"plane\").agg(raan=(\"raan\", \"mean\"), satellites=(\"name\", \"size\"), inclination=(\"inclination\", \"mean\"))\n",
+ "planes = operational.groupby(\"plane\").agg(\n",
+ " raan=(\"raan\", \"mean\"),\n",
+ " satellites=(\"name\", \"size\"),\n",
+ " inclination=(\"inclination\", \"mean\"),\n",
+ ")\n",
"spacing = np.diff(np.r_[planes.raan.to_numpy(), planes.raan.iloc[0] + 360])\n",
"planes[\"spacing to next plane (deg)\"] = spacing\n",
- "ALTITUDE = (398600.4418e9 / (2 * np.pi * operational.mean_motion.median() / 86400) ** 2) ** (1 / 3) - EARTH_MEAN_RADIUS\n",
+ "ALTITUDE = (\n",
+ " 398600.4418e9 / (2 * np.pi * operational.mean_motion.median() / 86400) ** 2\n",
+ ") ** (1 / 3) - EARTH_MEAN_RADIUS\n",
"INCLINATION = operational.inclination.mean()\n",
"MIN_ELEVATION = 8.2\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
- "print(f\"{len(tles)} Iridium NEXT TLEs, {len(operational)} operational; mean altitude {ALTITUDE / 1e3:.0f} km, inclination {INCLINATION:.2f} deg\")\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
+ "print(\n",
+ " f\"{len(tles)} Iridium NEXT TLEs, {len(operational)} operational; mean altitude {ALTITUDE / 1e3:.0f} km, inclination {INCLINATION:.2f} deg\"\n",
+ ")\n",
"planes.round(1)"
]
},
@@ -380,7 +415,13 @@
}
],
"source": [
- "eta = math.degrees(math.asin(EARTH_MEAN_RADIUS / (EARTH_MEAN_RADIUS + ALTITUDE) * math.cos(math.radians(MIN_ELEVATION))))\n",
+ "eta = math.degrees(\n",
+ " math.asin(\n",
+ " EARTH_MEAN_RADIUS\n",
+ " / (EARTH_MEAN_RADIUS + ALTITUDE)\n",
+ " * math.cos(math.radians(MIN_ELEVATION))\n",
+ " )\n",
+ ")\n",
"gamma = 90 - MIN_ELEVATION - eta\n",
"swath_width = 2 * math.radians(gamma) * EARTH_MEAN_RADIUS\n",
"orbit = CircularOrbit(altitude=ALTITUDE, inclination=INCLINATION, epoch=START)\n",
@@ -388,19 +429,51 @@
"\n",
"def polar_streets(gamma, satellites_per_plane):\n",
" \"\"\"Planes and spacings of a polar streets-of-coverage design (Adams and Rider, 1987).\"\"\"\n",
- " c = math.degrees(math.acos(math.cos(math.radians(gamma)) / math.cos(math.pi / satellites_per_plane)))\n",
+ " c = math.degrees(\n",
+ " math.acos(\n",
+ " math.cos(math.radians(gamma)) / math.cos(math.pi / satellites_per_plane)\n",
+ " )\n",
+ " )\n",
" planes = math.ceil((180 - 2 * c) / (gamma + c) + 1)\n",
" return planes, gamma + c, 2 * c\n",
"\n",
"\n",
- "rows1 = {\"Iridium (operational)\": {\"satellites per plane\": 11, \"planes\": len(planes), \"satellites\": 11 * len(planes), \"plane spacing (deg)\": float(np.median(spacing[spacing < 90])), \"seam spacing (deg)\": 180 - (len(planes) - 1) * float(np.median(spacing[spacing < 90])), \"planes span (deg)\": 180}}\n",
+ "rows1 = {\n",
+ " \"Iridium (operational)\": {\n",
+ " \"satellites per plane\": 11,\n",
+ " \"planes\": len(planes),\n",
+ " \"satellites\": 11 * len(planes),\n",
+ " \"plane spacing (deg)\": float(np.median(spacing[spacing < 90])),\n",
+ " \"seam spacing (deg)\": 180\n",
+ " - (len(planes) - 1) * float(np.median(spacing[spacing < 90])),\n",
+ " \"planes span (deg)\": 180,\n",
+ " }\n",
+ "}\n",
"for s in (10, 11, 12):\n",
" p, co, seam = polar_streets(gamma, s)\n",
- " rows1[f\"polar streets of coverage, {s} per plane\"] = {\"satellites per plane\": s, \"planes\": p, \"satellites\": s * p, \"plane spacing (deg)\": co, \"seam spacing (deg)\": seam, \"planes span (deg)\": 180}\n",
+ " rows1[f\"polar streets of coverage, {s} per plane\"] = {\n",
+ " \"satellites per plane\": s,\n",
+ " \"planes\": p,\n",
+ " \"satellites\": s * p,\n",
+ " \"plane spacing (deg)\": co,\n",
+ " \"seam spacing (deg)\": seam,\n",
+ " \"planes span (deg)\": 180,\n",
+ " }\n",
"for packing in (1.0, 0.9):\n",
- " s, p, co, seam = SOCConstellation(name=\"SOC\", orbit=orbit, swath_width=swath_width, packing_distance=packing).get_polar_design()\n",
- " rows1[f\"SOCConstellation (polar), packing distance {packing}\"] = {\"satellites per plane\": s, \"planes\": p, \"satellites\": s * p, \"plane spacing (deg)\": co, \"seam spacing (deg)\": seam, \"planes span (deg)\": 180}\n",
- "walker = SOCConstellation(name=\"SOC\", orbit=orbit, swath_width=swath_width, packing_distance=1.0, polar=False).generate_walker()\n",
+ " s, p, co, seam = SOCConstellation(\n",
+ " name=\"SOC\", orbit=orbit, swath_width=swath_width, packing_distance=packing\n",
+ " ).get_polar_design()\n",
+ " rows1[f\"SOCConstellation (polar), packing distance {packing}\"] = {\n",
+ " \"satellites per plane\": s,\n",
+ " \"planes\": p,\n",
+ " \"satellites\": s * p,\n",
+ " \"plane spacing (deg)\": co,\n",
+ " \"seam spacing (deg)\": seam,\n",
+ " \"planes span (deg)\": 180,\n",
+ " }\n",
+ "walker = SOCConstellation(\n",
+ " name=\"SOC\", orbit=orbit, swath_width=swath_width, packing_distance=1.0, polar=False\n",
+ ").generate_walker()\n",
"rows1[\"SOCConstellation (polar=False), packing distance 1.0\"] = {\n",
" \"satellites per plane\": walker.number_satellites // walker.number_planes,\n",
" \"planes\": walker.number_planes,\n",
@@ -409,7 +482,9 @@
" \"seam spacing (deg)\": np.nan,\n",
" \"planes span (deg)\": 360,\n",
"}\n",
- "print(f\"footprint radius {gamma:.2f} deg ({swath_width / 2e3:.0f} km), swath width {swath_width / 1e3:.0f} km\")\n",
+ "print(\n",
+ " f\"footprint radius {gamma:.2f} deg ({swath_width / 2e3:.0f} km), swath width {swath_width / 1e3:.0f} km\"\n",
+ ")\n",
"pd.DataFrame(rows1).T.round(1)"
]
},
@@ -593,47 +668,124 @@
],
"source": [
"lattice = generate_points_fibonacci_lattice(1000e3)\n",
- "points = [Point(id=i, latitude=r.geometry.y, longitude=r.geometry.x) for i, r in enumerate(lattice.itertuples())]\n",
- "instrument = Instrument(name=\"antenna\", field_of_regard=compute_field_of_regard(ALTITUDE, MIN_ELEVATION))\n",
+ "points = [\n",
+ " Point(id=i, latitude=r.geometry.y, longitude=r.geometry.x)\n",
+ " for i, r in enumerate(lattice.itertuples())\n",
+ "]\n",
+ "instrument = Instrument(\n",
+ " name=\"antenna\", field_of_regard=compute_field_of_regard(ALTITUDE, MIN_ELEVATION)\n",
+ ")\n",
"constellations = {\n",
- " \"Iridium (operational)\": [Satellite(name=r.name, orbit=GeneralPerturbationsOrbit.from_tle(r.tle), instruments=[instrument]) for r in operational.itertuples()],\n",
- " \"Walker star 66/6\": WalkerConstellation(name=\"star\", orbit=orbit, instruments=[instrument], number_satellites=66, number_planes=6, relative_spacing=3, configuration=WalkerConfiguration.STAR).generate_members(),\n",
- " \"Walker star 66/6, 22 deg seam\": WalkerConstellation(name=\"star\", orbit=orbit, instruments=[instrument], number_satellites=66, number_planes=6, relative_spacing=3, configuration=WalkerConfiguration.STAR, seam_spacing=22).generate_members(),\n",
- " \"SOCConstellation (polar)\": SOCConstellation(name=\"SOC\", orbit=orbit, instruments=[instrument], swath_width=swath_width, packing_distance=1.0).generate_members(),\n",
- " \"SOCConstellation (polar=False)\": SOCConstellation(name=\"SOC\", orbit=orbit, instruments=[instrument], swath_width=swath_width, packing_distance=1.0, polar=False).generate_members(),\n",
- " \"Iridium, 10 per plane\": [Satellite(name=r.name, orbit=GeneralPerturbationsOrbit.from_tle(r.tle), instruments=[instrument]) for r in operational.groupby(\"plane\").head(10).itertuples()],\n",
+ " \"Iridium (operational)\": [\n",
+ " Satellite(\n",
+ " name=r.name,\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(r.tle),\n",
+ " instruments=[instrument],\n",
+ " )\n",
+ " for r in operational.itertuples()\n",
+ " ],\n",
+ " \"Walker star 66/6\": WalkerConstellation(\n",
+ " name=\"star\",\n",
+ " orbit=orbit,\n",
+ " instruments=[instrument],\n",
+ " number_satellites=66,\n",
+ " number_planes=6,\n",
+ " relative_spacing=3,\n",
+ " configuration=WalkerConfiguration.STAR,\n",
+ " ).generate_members(),\n",
+ " \"Walker star 66/6, 22 deg seam\": WalkerConstellation(\n",
+ " name=\"star\",\n",
+ " orbit=orbit,\n",
+ " instruments=[instrument],\n",
+ " number_satellites=66,\n",
+ " number_planes=6,\n",
+ " relative_spacing=3,\n",
+ " configuration=WalkerConfiguration.STAR,\n",
+ " seam_spacing=22,\n",
+ " ).generate_members(),\n",
+ " \"SOCConstellation (polar)\": SOCConstellation(\n",
+ " name=\"SOC\",\n",
+ " orbit=orbit,\n",
+ " instruments=[instrument],\n",
+ " swath_width=swath_width,\n",
+ " packing_distance=1.0,\n",
+ " ).generate_members(),\n",
+ " \"SOCConstellation (polar=False)\": SOCConstellation(\n",
+ " name=\"SOC\",\n",
+ " orbit=orbit,\n",
+ " instruments=[instrument],\n",
+ " swath_width=swath_width,\n",
+ " packing_distance=1.0,\n",
+ " polar=False,\n",
+ " ).generate_members(),\n",
+ " \"Iridium, 10 per plane\": [\n",
+ " Satellite(\n",
+ " name=r.name,\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(r.tle),\n",
+ " instruments=[instrument],\n",
+ " )\n",
+ " for r in operational.groupby(\"plane\").head(10).itertuples()\n",
+ " ],\n",
"}\n",
"PERIOD = (END - START).total_seconds()\n",
"\n",
"\n",
"def coverage(satellites):\n",
" \"\"\"Coverage statistics of each point from TAT-C's aggregated observations.\"\"\"\n",
- " observations = Parallel(n_jobs=-1)(delayed(collect_multi_observations)(point, satellites, START, END) for point in points)\n",
+ " observations = Parallel(n_jobs=-1)(\n",
+ " delayed(collect_multi_observations)(point, satellites, START, END)\n",
+ " for point in points\n",
+ " )\n",
"\n",
" def point_coverage(point, obs):\n",
" if obs.empty:\n",
- " return {\"point_id\": point.id, \"latitude\": point.latitude, \"covered (%)\": 0.0, \"max gap (min)\": PERIOD / 60}\n",
+ " return {\n",
+ " \"point_id\": point.id,\n",
+ " \"latitude\": point.latitude,\n",
+ " \"covered (%)\": 0.0,\n",
+ " \"max gap (min)\": PERIOD / 60,\n",
+ " }\n",
" merged = aggregate_observations(obs)\n",
" covered = merged.access.dt.total_seconds().sum()\n",
" # gaps between periods, and before the first and after the last\n",
- " gaps = np.r_[(merged.start.iloc[0] - START).total_seconds(), merged.revisit.dt.total_seconds().dropna().to_numpy(), (END - merged.end.iloc[-1]).total_seconds()]\n",
- " return {\"point_id\": point.id, \"latitude\": point.latitude, \"covered (%)\": 100 * min(covered, PERIOD) / PERIOD, \"max gap (min)\": max(0.0, gaps.max()) / 60}\n",
+ " gaps = np.r_[\n",
+ " (merged.start.iloc[0] - START).total_seconds(),\n",
+ " merged.revisit.dt.total_seconds().dropna().to_numpy(),\n",
+ " (END - merged.end.iloc[-1]).total_seconds(),\n",
+ " ]\n",
+ " return {\n",
+ " \"point_id\": point.id,\n",
+ " \"latitude\": point.latitude,\n",
+ " \"covered (%)\": 100 * min(covered, PERIOD) / PERIOD,\n",
+ " \"max gap (min)\": max(0.0, gaps.max()) / 60,\n",
+ " }\n",
"\n",
- " return pd.DataFrame([point_coverage(point, obs) for point, obs in zip(points, observations)])\n",
+ " return pd.DataFrame(\n",
+ " [point_coverage(point, obs) for point, obs in zip(points, observations)]\n",
+ " )\n",
"\n",
"\n",
"results = {label: coverage(satellites) for label, satellites in constellations.items()}\n",
"\n",
"# independent check: sampled elevation angles of the operational satellites\n",
- "times = timescale.from_datetimes([START + timedelta(seconds=s) for s in range(0, int(PERIOD), 20)])\n",
- "positions = np.stack([s.orbit.to_gp_orbit().elements[0].to_skyfield().at(times).frame_xyz(itrs).m for s in constellations[\"Iridium (operational)\"]])\n",
+ "times = timescale.from_datetimes(\n",
+ " [START + timedelta(seconds=s) for s in range(0, int(PERIOD), 20)]\n",
+ ")\n",
+ "positions = np.stack(\n",
+ " [\n",
+ " s.orbit.to_gp_orbit().elements[0].to_skyfield().at(times).frame_xyz(itrs).m\n",
+ " for s in constellations[\"Iridium (operational)\"]\n",
+ " ]\n",
+ ")\n",
"sampled = []\n",
"for point in points:\n",
" site = wgs84.latlon(point.latitude, point.longitude)\n",
" up = np.array(site.itrs_xyz.m) / np.linalg.norm(site.itrs_xyz.m)\n",
" los = positions - np.array(site.itrs_xyz.m)[None, :, None]\n",
" sin_elevation = np.einsum(\"j,ijk->ik\", up, los) / np.linalg.norm(los, axis=1)\n",
- " sampled.append(100 * np.mean((sin_elevation >= np.sin(np.radians(MIN_ELEVATION))).any(axis=0)))\n",
+ " sampled.append(\n",
+ " 100 * np.mean((sin_elevation >= np.sin(np.radians(MIN_ELEVATION))).any(axis=0))\n",
+ " )\n",
"results[\"Iridium (operational)\"][\"sampled covered (%)\"] = sampled\n",
"\n",
"summary = {}\n",
@@ -676,9 +828,17 @@
],
"source": [
"fig, ax = plt.subplots(figsize=(12, 3.8))\n",
- "for (label, frame), color in zip(results.items(), [INK, BLUE, PURPLE, AQUA, ORANGE, GRAY]):\n",
- " ax.scatter(frame.latitude, frame[\"covered (%)\"], s=8, color=color, label=label, alpha=0.8)\n",
- "ax.set(xlabel=\"Point latitude (deg)\", ylabel=\"Time covered (%)\", title=f\"Coverage above {MIN_ELEVATION} deg elevation over 12 hours\")\n",
+ "for (label, frame), color in zip(\n",
+ " results.items(), [INK, BLUE, PURPLE, AQUA, ORANGE, GRAY]\n",
+ "):\n",
+ " ax.scatter(\n",
+ " frame.latitude, frame[\"covered (%)\"], s=8, color=color, label=label, alpha=0.8\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Point latitude (deg)\",\n",
+ " ylabel=\"Time covered (%)\",\n",
+ " title=f\"Coverage above {MIN_ELEVATION} deg elevation over 12 hours\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8, loc=\"lower center\", ncol=3)\n",
"plt.show()"
]
diff --git a/docs/validation/ValidateDopGNSS.ipynb b/docs/validation/ValidateDopGNSS.ipynb
index e12121c0..732a91c8 100644
--- a/docs/validation/ValidateDopGNSS.ipynb
+++ b/docs/validation/ValidateDopGNSS.ipynb
@@ -75,28 +75,52 @@
"ORBIT_DIR.mkdir(parents=True, exist_ok=True)\n",
"DAY = datetime(2026, 10, 3, tzinfo=timezone.utc)\n",
"BKG = \"https://igs.bkg.bund.de/root_ftp/IGS\"\n",
- "STATIONS = [\"KIR000SWE\", \"WTZR00DEU\", \"GUAM00GUM\", \"NKLG00GAB\", \"HOB200AUS\", \"MCM400ATA\"]\n",
+ "STATIONS = [\n",
+ " \"KIR000SWE\",\n",
+ " \"WTZR00DEU\",\n",
+ " \"GUAM00GUM\",\n",
+ " \"NKLG00GAB\",\n",
+ " \"HOB200AUS\",\n",
+ " \"MCM400ATA\",\n",
+ "]\n",
"FILES = {\n",
" \"BRDC00IGS_R_20262760000_01D_MN.rnx.gz\": f\"{BKG}/BRDC/2026/276/\",\n",
" \"IGS0OPSRAP_20262760000_01D_15M_ORB.SP3.gz\": f\"{BKG}/products/2438/\",\n",
- " **{f\"{station}_R_20262760000_01D_30S_MO.crx.gz\": f\"{BKG}/obs/2026/276/\" for station in STATIONS},\n",
+ " **{\n",
+ " f\"{station}_R_20262760000_01D_30S_MO.crx.gz\": f\"{BKG}/obs/2026/276/\"\n",
+ " for station in STATIONS\n",
+ " },\n",
"}\n",
"for name, base in FILES.items():\n",
" if not (DATA_DIR / name).exists():\n",
" response = requests.get(base + name, timeout=600)\n",
" response.raise_for_status()\n",
" (DATA_DIR / name).write_bytes(response.content)\n",
- "SYSTEMS = {\"G\": (\"GPS\", \"gps-ops\"), \"E\": (\"Galileo\", \"galileo\"), \"C\": (\"BeiDou\", \"beidou\"), \"R\": (\"GLONASS\", \"glo-ops\")}\n",
+ "SYSTEMS = {\n",
+ " \"G\": (\"GPS\", \"gps-ops\"),\n",
+ " \"E\": (\"Galileo\", \"galileo\"),\n",
+ " \"C\": (\"BeiDou\", \"beidou\"),\n",
+ " \"R\": (\"GLONASS\", \"glo-ops\"),\n",
+ "}\n",
"TLES = {}\n",
"for system, (label, group) in SYSTEMS.items():\n",
" path = ORBIT_DIR / f\"{group}.tle\"\n",
" if not path.exists():\n",
- " response = requests.get(\"https://celestrak.org/NORAD/elements/gp.php\", params={\"GROUP\": group, \"FORMAT\": \"tle\"}, timeout=120)\n",
+ " response = requests.get(\n",
+ " \"https://celestrak.org/NORAD/elements/gp.php\",\n",
+ " params={\"GROUP\": group, \"FORMAT\": \"tle\"},\n",
+ " timeout=120,\n",
+ " )\n",
" response.raise_for_status()\n",
" path.write_text(response.text)\n",
" lines = [line.rstrip() for line in path.read_text().splitlines() if line.strip()]\n",
- " TLES[system] = {lines[i].strip(): lines[i + 1 : i + 3] for i in range(0, len(lines) - 2, 3)}\n",
- "pd.Series({label: len(TLES[system]) for system, (label, _) in SYSTEMS.items()}, name=\"satellites in TLE group\")"
+ " TLES[system] = {\n",
+ " lines[i].strip(): lines[i + 1 : i + 3] for i in range(0, len(lines) - 2, 3)\n",
+ " }\n",
+ "pd.Series(\n",
+ " {label: len(TLES[system]) for system, (label, _) in SYSTEMS.items()},\n",
+ " name=\"satellites in TLE group\",\n",
+ ")"
]
},
{
@@ -159,7 +183,15 @@
" if system not in \"GECR\":\n",
" continue\n",
" prn = int(line[1:3])\n",
- " epoch = datetime(int(line[4:8]), int(line[9:11]), int(line[12:14]), int(line[15:17]), int(line[18:20]), int(line[21:23]), tzinfo=timezone.utc)\n",
+ " epoch = datetime(\n",
+ " int(line[4:8]),\n",
+ " int(line[9:11]),\n",
+ " int(line[12:14]),\n",
+ " int(line[15:17]),\n",
+ " int(line[18:20]),\n",
+ " int(line[21:23]),\n",
+ " tzinfo=timezone.utc,\n",
+ " )\n",
" values = [_float(line[23 + 19 * j : 42 + 19 * j]) for j in range(3)]\n",
" for row in block[1:]:\n",
" values += [_float(row[4 + 19 * j : 23 + 19 * j]) for j in range(4)]\n",
@@ -187,7 +219,11 @@
" nu = np.arctan2(np.sqrt(1 - e**2) * np.sin(ecc_anomaly), np.cos(ecc_anomaly) - e)\n",
" phi = nu + w\n",
" u = phi + cus * np.sin(2 * phi) + cuc * np.cos(2 * phi)\n",
- " r = a * (1 - e * np.cos(ecc_anomaly)) + crs * np.sin(2 * phi) + crc * np.cos(2 * phi)\n",
+ " r = (\n",
+ " a * (1 - e * np.cos(ecc_anomaly))\n",
+ " + crs * np.sin(2 * phi)\n",
+ " + crc * np.cos(2 * phi)\n",
+ " )\n",
" i = i0 + cis * np.sin(2 * phi) + cic * np.cos(2 * phi) + idot * tk\n",
" x, y = r * np.cos(u), r * np.sin(u)\n",
" if system == \"C\" and prn in BEIDOU_GEO:\n",
@@ -196,11 +232,21 @@
" yg = x * np.sin(omega) + y * np.cos(i) * np.cos(omega)\n",
" zg = y * np.sin(i)\n",
" f, c = np.radians(-5), omega_e * tk\n",
- " rx = np.array([[1, 0, 0], [0, np.cos(f), np.sin(f)], [0, -np.sin(f), np.cos(f)]])\n",
- " rz = np.array([[np.cos(c), np.sin(c), 0], [-np.sin(c), np.cos(c), 0], [0, 0, 1]])\n",
+ " rx = np.array(\n",
+ " [[1, 0, 0], [0, np.cos(f), np.sin(f)], [0, -np.sin(f), np.cos(f)]]\n",
+ " )\n",
+ " rz = np.array(\n",
+ " [[np.cos(c), np.sin(c), 0], [-np.sin(c), np.cos(c), 0], [0, 0, 1]]\n",
+ " )\n",
" return rz @ rx @ np.array([xg, yg, zg])\n",
" omega = omega0 + (omega_dot - omega_e) * tk - omega_e * toe\n",
- " return np.array([x * np.cos(omega) - y * np.cos(i) * np.sin(omega), x * np.sin(omega) + y * np.cos(i) * np.cos(omega), y * np.sin(i)])\n",
+ " return np.array(\n",
+ " [\n",
+ " x * np.cos(omega) - y * np.cos(i) * np.sin(omega),\n",
+ " x * np.sin(omega) + y * np.cos(i) * np.cos(omega),\n",
+ " y * np.sin(i),\n",
+ " ]\n",
+ " )\n",
"\n",
"\n",
"def _glonass_position(v, dt):\n",
@@ -213,12 +259,24 @@
" x, y, z, vx, vy, vz = s\n",
" r = np.sqrt(x * x + y * y + z * z)\n",
" c = 1.5 * j2 * mu * ae**2 / r**5\n",
- " return np.array([\n",
- " vx, vy, vz,\n",
- " -mu * x / r**3 - c * x * (1 - 5 * z * z / r**2) + omega**2 * x + 2 * omega * vy + acc[0],\n",
- " -mu * y / r**3 - c * y * (1 - 5 * z * z / r**2) + omega**2 * y - 2 * omega * vx + acc[1],\n",
- " -mu * z / r**3 - c * z * (3 - 5 * z * z / r**2) + acc[2],\n",
- " ])\n",
+ " return np.array(\n",
+ " [\n",
+ " vx,\n",
+ " vy,\n",
+ " vz,\n",
+ " -mu * x / r**3\n",
+ " - c * x * (1 - 5 * z * z / r**2)\n",
+ " + omega**2 * x\n",
+ " + 2 * omega * vy\n",
+ " + acc[0],\n",
+ " -mu * y / r**3\n",
+ " - c * y * (1 - 5 * z * z / r**2)\n",
+ " + omega**2 * y\n",
+ " - 2 * omega * vx\n",
+ " + acc[1],\n",
+ " -mu * z / r**3 - c * z * (3 - 5 * z * z / r**2) + acc[2],\n",
+ " ]\n",
+ " )\n",
"\n",
" steps = max(1, int(np.ceil(abs(dt) / 60)))\n",
" h = dt / steps\n",
@@ -268,10 +326,16 @@
" continue\n",
" # GPS/Galileo/BeiDou epochs (time of clock) are in the system's own time scale\n",
" offset = GPS_UTC + (BDT_GPS if system == \"C\" else 0)\n",
- " j = int(np.argmin(np.abs(epochs - ((t - GPS_EPOCH).total_seconds() + offset))))\n",
+ " j = int(\n",
+ " np.argmin(np.abs(epochs - ((t - GPS_EPOCH).total_seconds() + offset)))\n",
+ " )\n",
" if abs(epochs[j] - ((t - GPS_EPOCH).total_seconds() + offset)) > validity:\n",
" continue\n",
- " t_system = t_gps if system in \"GE\" else (t - BDT_EPOCH).total_seconds() + GPS_UTC + BDT_GPS\n",
+ " t_system = (\n",
+ " t_gps\n",
+ " if system in \"GE\"\n",
+ " else (t - BDT_EPOCH).total_seconds() + GPS_UTC + BDT_GPS\n",
+ " )\n",
" out[k] = _kepler_position(system, recs[j][1], recs[j][3], t_system)\n",
" positions[name] = out\n",
" return positions\n",
@@ -284,11 +348,23 @@
" for line in f:\n",
" if line.startswith(\"*\"):\n",
" parts = line.split()\n",
- " gps = datetime(int(parts[1]), int(parts[2]), int(parts[3]), int(parts[4]), int(parts[5]), int(float(parts[6])), tzinfo=timezone.utc)\n",
+ " gps = datetime(\n",
+ " int(parts[1]),\n",
+ " int(parts[2]),\n",
+ " int(parts[3]),\n",
+ " int(parts[4]),\n",
+ " int(parts[5]),\n",
+ " int(float(parts[6])),\n",
+ " tzinfo=timezone.utc,\n",
+ " )\n",
" epochs.append(gps - timedelta(seconds=GPS_UTC))\n",
" elif line.startswith(\"P\") and epochs:\n",
" name = line[1:4].replace(\" \", \"0\")\n",
- " data.setdefault(name, {})[len(epochs) - 1] = [float(line[4:18]) * 1e3, float(line[18:32]) * 1e3, float(line[32:46]) * 1e3]\n",
+ " data.setdefault(name, {})[len(epochs) - 1] = [\n",
+ " float(line[4:18]) * 1e3,\n",
+ " float(line[18:32]) * 1e3,\n",
+ " float(line[32:46]) * 1e3,\n",
+ " ]\n",
" out = {}\n",
" for name, values in data.items():\n",
" array = np.full((len(epochs), 3), np.nan)\n",
@@ -312,7 +388,14 @@
" xs, ps = x[j : j + order], p[j : j + order]\n",
" if np.isnan(ps).any():\n",
" continue\n",
- " weights = np.array([np.prod([(s - xs[m]) / (xs[i] - xs[m]) for m in range(order) if m != i]) for i in range(order)])\n",
+ " weights = np.array(\n",
+ " [\n",
+ " np.prod(\n",
+ " [(s - xs[m]) / (xs[i] - xs[m]) for m in range(order) if m != i]\n",
+ " )\n",
+ " for i in range(order)\n",
+ " ]\n",
+ " )\n",
" result[k] = weights @ ps\n",
" out[name] = result\n",
" return out\n",
@@ -322,7 +405,9 @@
" \"\"\"Station position (m, from the header) and the satellites with a pseudorange observation at each of the given UTC times (GPS time in the file).\"\"\"\n",
" import hatanaka\n",
"\n",
- " text = hatanaka.decompress(open(path, \"rb\").read()).decode(\"ascii\", errors=\"replace\")\n",
+ " text = hatanaka.decompress(open(path, \"rb\").read()).decode(\n",
+ " \"ascii\", errors=\"replace\"\n",
+ " )\n",
" lines = text.splitlines()\n",
" position = None\n",
" types = {}\n",
@@ -332,7 +417,9 @@
" line = lines[k]\n",
" label = line[60:].strip()\n",
" if label == \"APPROX POSITION XYZ\":\n",
- " position = np.array([float(line[0:14]), float(line[14:28]), float(line[28:42])])\n",
+ " position = np.array(\n",
+ " [float(line[0:14]), float(line[14:28]), float(line[28:42])]\n",
+ " )\n",
" if label == \"SYS / # / OBS TYPES\":\n",
" if line[0] != \" \":\n",
" current = line[0]\n",
@@ -347,7 +434,15 @@
" line = lines[k]\n",
" if line.startswith(\">\"):\n",
" count = int(line[32:35])\n",
- " epoch = datetime(int(line[2:6]), int(line[7:9]), int(line[10:12]), int(line[13:15]), int(line[16:18]), int(float(line[19:29])), tzinfo=timezone.utc)\n",
+ " epoch = datetime(\n",
+ " int(line[2:6]),\n",
+ " int(line[7:9]),\n",
+ " int(line[10:12]),\n",
+ " int(line[13:15]),\n",
+ " int(line[16:18]),\n",
+ " int(float(line[19:29])),\n",
+ " tzinfo=timezone.utc,\n",
+ " )\n",
" key = round((epoch - GPS_EPOCH).total_seconds())\n",
" if key in wanted and int(line[31]) in (0, 1):\n",
" sats = set()\n",
@@ -473,9 +568,19 @@
"from pyproj import Transformer\n",
"from skyfield.framelib import itrs\n",
"\n",
- "from tatc.analysis import DopMethod, collect_multi_observations, compute_dop # noqa: F401\n",
+ "from tatc.analysis import (\n",
+ " DopMethod,\n",
+ " collect_multi_observations,\n",
+ " compute_dop,\n",
+ ") # noqa: F401\n",
"from tatc.constants import EARTH_MEAN_RADIUS, timescale\n",
- "from tatc.schemas import CircularOrbit, GeneralPerturbationsOrbit, Point, Satellite, WalkerConstellation\n",
+ "from tatc.schemas import (\n",
+ " CircularOrbit,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Point,\n",
+ " Satellite,\n",
+ " WalkerConstellation,\n",
+ ")\n",
"\n",
"TIMES = [DAY + timedelta(minutes=5 * k, seconds=-GPS_UTC) for k in range(1, 289)]\n",
"MASK = 10 # deg\n",
@@ -484,23 +589,39 @@
"to_geodetic = Transformer.from_crs(\"EPSG:4978\", \"EPSG:4979\", always_xy=True)\n",
"stations = {}\n",
"for station in STATIONS:\n",
- " xyz, tracked = read_tracked(DATA_DIR / f\"{station}_R_20262760000_01D_30S_MO.crx.gz\", TIMES)\n",
+ " xyz, tracked = read_tracked(\n",
+ " DATA_DIR / f\"{station}_R_20262760000_01D_30S_MO.crx.gz\", TIMES\n",
+ " )\n",
" lon, lat, height = to_geodetic.transform(*xyz)\n",
- " stations[station[:4]] = {\"xyz\": xyz, \"lat\": lat, \"lon\": lon, \"height\": height, \"tracked\": tracked}\n",
+ " stations[station[:4]] = {\n",
+ " \"xyz\": xyz,\n",
+ " \"lat\": lat,\n",
+ " \"lon\": lon,\n",
+ " \"height\": height,\n",
+ " \"tracked\": tracked,\n",
+ " }\n",
"# TAT-C satellites from TLEs, their Earth-fixed positions, and their PRNs\n",
"satellites, tle_positions, prn = {}, {}, {}\n",
"sk_times = timescale.from_datetimes(TIMES)\n",
"for system in SYSTEMS:\n",
" for name, (line1, line2) in TLES[system].items():\n",
- " sat = Satellite(name=name, orbit=GeneralPerturbationsOrbit.from_tle([line1, line2]))\n",
- " position = np.array(sat.orbit.to_gp_orbit().get_orbit_track_at_time(sk_times).frame_xyz(itrs).m).T\n",
+ " sat = Satellite(\n",
+ " name=name, orbit=GeneralPerturbationsOrbit.from_tle([line1, line2])\n",
+ " )\n",
+ " position = np.array(\n",
+ " sat.orbit.to_gp_orbit().get_orbit_track_at_time(sk_times).frame_xyz(itrs).m\n",
+ " ).T\n",
" satellites[name], tle_positions[name] = sat, position\n",
" code = re.search(r\"\\(PRN (\\d+)\\)\", name) if system == \"G\" else None\n",
" if code is not None:\n",
" if f\"{system}{int(code.group(1)):02d}\" in broadcast:\n",
" prn[name] = f\"{system}{int(code.group(1)):02d}\"\n",
" continue\n",
- " candidates = {s: np.linalg.norm(p[144] - position[144]) for s, p in broadcast.items() if s[0] == system and np.isfinite(p[144]).all()}\n",
+ " candidates = {\n",
+ " s: np.linalg.norm(p[144] - position[144])\n",
+ " for s, p in broadcast.items()\n",
+ " if s[0] == system and np.isfinite(p[144]).all()\n",
+ " }\n",
" if candidates and min(candidates.values()) < 100e3:\n",
" prn[name] = min(candidates, key=candidates.get)\n",
"pd.DataFrame(\n",
@@ -508,7 +629,9 @@
" label: {\n",
" \"TLEs\": len(TLES[system]),\n",
" \"healthy broadcast satellites\": sum(s[0] == system for s in broadcast),\n",
- " \"TLEs matched to healthy satellites\": sum(p[0] == system for p in prn.values()),\n",
+ " \"TLEs matched to healthy satellites\": sum(\n",
+ " p[0] == system for p in prn.values()\n",
+ " ),\n",
" }\n",
" for system, (label, _) in SYSTEMS.items()\n",
" }\n",
@@ -529,18 +652,35 @@
},
"outputs": [],
"source": [
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
"SYSTEM_COLORS = {\"G\": BLUE, \"E\": ORANGE, \"C\": AQUA, \"R\": PURPLE}\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"\n",
"\n",
"def enu_matrix(lat, lon):\n",
" lat, lon = np.radians(lat), np.radians(lon)\n",
- " return np.array([\n",
- " [-np.sin(lon), np.cos(lon), 0],\n",
- " [-np.sin(lat) * np.cos(lon), -np.sin(lat) * np.sin(lon), np.cos(lat)],\n",
- " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)],\n",
- " ])\n",
+ " return np.array(\n",
+ " [\n",
+ " [-np.sin(lon), np.cos(lon), 0],\n",
+ " [-np.sin(lat) * np.cos(lon), -np.sin(lat) * np.sin(lon), np.cos(lat)],\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)],\n",
+ " ]\n",
+ " )\n",
"\n",
"\n",
"def reference_dop(station, positions, mask=MASK, clocks=\"single\", subsets=None):\n",
@@ -552,7 +692,12 @@
" rotation = enu_matrix(s[\"lat\"], s[\"lon\"])\n",
" rows = []\n",
" for k in range(len(TIMES)):\n",
- " names = [n for n in positions if np.isfinite(positions[n][k]).all() and (subsets is None or n in subsets[k])]\n",
+ " names = [\n",
+ " n\n",
+ " for n in positions\n",
+ " if np.isfinite(positions[n][k]).all()\n",
+ " and (subsets is None or n in subsets[k])\n",
+ " ]\n",
" if not names:\n",
" rows.append({\"n\": 0})\n",
" continue\n",
@@ -562,7 +707,10 @@
" e = e[visible]\n",
" systems = sorted({n[0] for n, v in zip(names, visible) if v})\n",
" if clocks == \"system\":\n",
- " columns = [[1.0 if n[0] == system else 0.0 for n, v in zip(names, visible) if v] for system in systems]\n",
+ " columns = [\n",
+ " [1.0 if n[0] == system else 0.0 for n, v in zip(names, visible) if v]\n",
+ " for system in systems\n",
+ " ]\n",
" h = np.column_stack([e] + [np.array(c) for c in columns])\n",
" else:\n",
" h = np.column_stack([e, np.ones(len(e))])\n",
@@ -570,7 +718,15 @@
" rows.append({\"n\": len(e)})\n",
" continue\n",
" q = np.linalg.inv(h.T @ h)\n",
- " rows.append({\"n\": len(e), \"HDOP\": np.sqrt(q[0, 0] + q[1, 1]), \"VDOP\": np.sqrt(q[2, 2]), \"PDOP\": np.sqrt(np.trace(q[:3, :3])), \"TDOP\": np.sqrt(q[3, 3])})\n",
+ " rows.append(\n",
+ " {\n",
+ " \"n\": len(e),\n",
+ " \"HDOP\": np.sqrt(q[0, 0] + q[1, 1]),\n",
+ " \"VDOP\": np.sqrt(q[2, 2]),\n",
+ " \"PDOP\": np.sqrt(np.trace(q[:3, :3])),\n",
+ " \"TDOP\": np.sqrt(q[3, 3]),\n",
+ " }\n",
+ " )\n",
" return pd.DataFrame(rows, index=TIMES)\n",
"\n",
"\n",
@@ -579,7 +735,12 @@
" s = stations[station]\n",
" point = Point(id=0, latitude=s[\"lat\"], longitude=s[\"lon\"], elevation=s[\"height\"])\n",
" sats = [satellites[n] for n in names]\n",
- " out = {method.value.upper(): compute_dop(TIMES, point, sats, mask, method, systems=systems).dop.to_numpy() for method in [DopMethod.PDOP, DopMethod.HDOP, DopMethod.VDOP, DopMethod.TDOP]}\n",
+ " out = {\n",
+ " method.value.upper(): compute_dop(\n",
+ " TIMES, point, sats, mask, method, systems=systems\n",
+ " ).dop.to_numpy()\n",
+ " for method in [DopMethod.PDOP, DopMethod.HDOP, DopMethod.VDOP, DopMethod.TDOP]\n",
+ " }\n",
" return pd.DataFrame(out, index=TIMES)\n",
"\n",
"\n",
@@ -697,13 +858,40 @@
"source": [
"sp3_epochs, sp3 = read_sp3(DATA_DIR / \"IGS0OPSRAP_20262760000_01D_15M_ORB.SP3.gz\")\n",
"sp3_positions = interpolate_sp3(sp3_epochs, sp3, TIMES[::6])\n",
- "check = np.concatenate([np.linalg.norm(broadcast[s][::6] - sp3_positions[s], axis=1) for s in sp3_positions if s in broadcast])\n",
+ "check = np.concatenate(\n",
+ " [\n",
+ " np.linalg.norm(broadcast[s][::6] - sp3_positions[s], axis=1)\n",
+ " for s in sp3_positions\n",
+ " if s in broadcast\n",
+ " ]\n",
+ ")\n",
"check = check[np.isfinite(check)]\n",
- "rows1 = {\"GPS broadcast vs. IGS rapid (m)\": {\"satellites\": len([s for s in sp3_positions if s in broadcast]), \"median\": np.median(check), \"p95\": np.percentile(check, 95), \"max\": check.max()}}\n",
+ "rows1 = {\n",
+ " \"GPS broadcast vs. IGS rapid (m)\": {\n",
+ " \"satellites\": len([s for s in sp3_positions if s in broadcast]),\n",
+ " \"median\": np.median(check),\n",
+ " \"p95\": np.percentile(check, 95),\n",
+ " \"max\": check.max(),\n",
+ " }\n",
+ "}\n",
"for system, (label, _) in SYSTEMS.items():\n",
- " errors = np.concatenate([np.linalg.norm(tle_positions[n] - broadcast[p], axis=1) for n, p in prn.items() if p[0] == system]) / 1e3\n",
+ " errors = (\n",
+ " np.concatenate(\n",
+ " [\n",
+ " np.linalg.norm(tle_positions[n] - broadcast[p], axis=1)\n",
+ " for n, p in prn.items()\n",
+ " if p[0] == system\n",
+ " ]\n",
+ " )\n",
+ " / 1e3\n",
+ " )\n",
" errors = errors[np.isfinite(errors)]\n",
- " rows1[f\"{label} TLE vs. broadcast (km)\"] = {\"satellites\": sum(p[0] == system for p in prn.values()), \"median\": np.median(errors), \"p95\": np.percentile(errors, 95), \"max\": errors.max()}\n",
+ " rows1[f\"{label} TLE vs. broadcast (km)\"] = {\n",
+ " \"satellites\": sum(p[0] == system for p in prn.values()),\n",
+ " \"median\": np.median(errors),\n",
+ " \"p95\": np.percentile(errors, 95),\n",
+ " \"max\": errors.max(),\n",
+ " }\n",
"pd.DataFrame(rows1).T.round(2)"
]
},
@@ -857,7 +1045,13 @@
}
],
"source": [
- "COMBINATIONS = {\"GPS\": \"G\", \"Galileo\": \"E\", \"BeiDou\": \"C\", \"GLONASS\": \"R\", \"all four\": \"GECR\"}\n",
+ "COMBINATIONS = {\n",
+ " \"GPS\": \"G\",\n",
+ " \"Galileo\": \"E\",\n",
+ " \"BeiDou\": \"C\",\n",
+ " \"GLONASS\": \"R\",\n",
+ " \"all four\": \"GECR\",\n",
+ "}\n",
"rows2, series2 = {}, {}\n",
"for label, systems in COMBINATIONS.items():\n",
" matched = [n for n, p in prn.items() if p[0] in systems]\n",
@@ -873,14 +1067,23 @@
" pooled[\"same\"].append(relative(same.PDOP, reference_same.PDOP))\n",
" pooled[\"group\"].append(relative(tatc_group.PDOP, reference.PDOP))\n",
" series2[(label, station)] = (reference, same, tatc_group)\n",
- " same_all, group_all = np.concatenate(pooled[\"same\"]), np.concatenate(pooled[\"group\"])\n",
+ " same_all, group_all = np.concatenate(pooled[\"same\"]), np.concatenate(\n",
+ " pooled[\"group\"]\n",
+ " )\n",
" rows2[label] = {\n",
" \"TLEs / healthy satellites / matched\": f\"{len(group)} / {len(reference_positions)} / {len(matched)}\",\n",
- " \"PDOP difference, same satellites, median |x| (%)\": 100 * np.median(np.abs(same_all)),\n",
- " \"PDOP difference, same satellites, p95 |x| (%)\": 100 * np.percentile(np.abs(same_all), 95),\n",
+ " \"PDOP difference, same satellites, median |x| (%)\": 100\n",
+ " * np.median(np.abs(same_all)),\n",
+ " \"PDOP difference, same satellites, p95 |x| (%)\": 100\n",
+ " * np.percentile(np.abs(same_all), 95),\n",
" \"PDOP difference, TLE groups, median (%)\": 100 * np.median(group_all),\n",
- " \"PDOP difference, TLE groups, p95 |x| (%)\": 100 * np.percentile(np.abs(group_all), 95),\n",
- " \"median PDOP (reference)\": np.nanmedian(np.concatenate([series2[(label, st)][0].PDOP.to_numpy(dtype=float) for st in stations])),\n",
+ " \"PDOP difference, TLE groups, p95 |x| (%)\": 100\n",
+ " * np.percentile(np.abs(group_all), 95),\n",
+ " \"median PDOP (reference)\": np.nanmedian(\n",
+ " np.concatenate(\n",
+ " [series2[(label, st)][0].PDOP.to_numpy(dtype=float) for st in stations]\n",
+ " )\n",
+ " ),\n",
" }\n",
"pd.DataFrame(rows2).T.round(2)"
]
@@ -914,10 +1117,21 @@
"for ax, label in zip(axes, [\"GPS\", \"Galileo\"]):\n",
" reference, same, group = series2[(label, \"WTZR\")]\n",
" hours = [(t - DAY) / timedelta(hours=1) for t in TIMES]\n",
- " ax.plot(hours, reference.PDOP, color=INK, lw=2.5, alpha=0.4, label=\"reference (healthy broadcast satellites)\")\n",
+ " ax.plot(\n",
+ " hours,\n",
+ " reference.PDOP,\n",
+ " color=INK,\n",
+ " lw=2.5,\n",
+ " alpha=0.4,\n",
+ " label=\"reference (healthy broadcast satellites)\",\n",
+ " )\n",
" ax.plot(hours, same.PDOP, color=BLUE, lw=1, label=\"TAT-C, same satellites\")\n",
" ax.plot(hours, group.PDOP, color=ORANGE, lw=1, ls=\"--\", label=\"TAT-C, TLE group\")\n",
- " ax.set(xlabel=\"Hours (UTC), 3 October 2026\", title=f\"{label} PDOP at Wettzell (10 deg mask)\", xlim=(0, 24))\n",
+ " ax.set(\n",
+ " xlabel=\"Hours (UTC), 3 October 2026\",\n",
+ " title=f\"{label} PDOP at Wettzell (10 deg mask)\",\n",
+ " xlim=(0, 24),\n",
+ " )\n",
"axes[0].set_ylabel(\"PDOP\")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
@@ -1119,22 +1333,33 @@
" if not np.isfinite(p[k]).all():\n",
" continue\n",
" los = p[k] - s[\"xyz\"]\n",
- " elevation = np.degrees(np.arcsin((rotation @ (los / np.linalg.norm(los)))[2]))\n",
+ " elevation = np.degrees(\n",
+ " np.arcsin((rotation @ (los / np.linalg.norm(los)))[2])\n",
+ " )\n",
" if elevation < 0:\n",
" continue\n",
" b = np.searchsorted(BINS, elevation, side=\"right\") - 1\n",
" counts[name[0]][0, b] += 1\n",
" counts[name[0]][1, b] += name in tracked\n",
- " fraction3[station] = {system: c[1] / np.maximum(c[0], 1) for system, c in counts.items()}\n",
+ " fraction3[station] = {\n",
+ " system: c[1] / np.maximum(c[0], 1) for system, c in counts.items()\n",
+ " }\n",
" tracked_sets = [s[\"tracked\"].get(t, set()) for t in TIMES]\n",
" tracked_dop = reference_dop(station, broadcast, subsets=tracked_sets)\n",
" _, _, group = series2[(\"all four\", station)]\n",
" rows3[station] = {\n",
" \"latitude (deg)\": s[\"lat\"],\n",
- " **{f\"{SYSTEMS[sys][0]} tracked above 10 deg (%)\": 100 * c[1, 2:].sum() / max(c[0, 2:].sum(), 1) for sys, c in counts.items()},\n",
+ " **{\n",
+ " f\"{SYSTEMS[sys][0]} tracked above 10 deg (%)\": 100\n",
+ " * c[1, 2:].sum()\n",
+ " / max(c[0, 2:].sum(), 1)\n",
+ " for sys, c in counts.items()\n",
+ " },\n",
" \"satellites tracked above 10 deg (mean)\": tracked_dop.n.mean(),\n",
" \"PDOP, tracked (median)\": np.nanmedian(tracked_dop.PDOP.to_numpy(dtype=float)),\n",
- " \"PDOP, healthy (median)\": np.nanmedian(series2[(\"all four\", station)][0].PDOP.to_numpy(dtype=float)),\n",
+ " \"PDOP, healthy (median)\": np.nanmedian(\n",
+ " series2[(\"all four\", station)][0].PDOP.to_numpy(dtype=float)\n",
+ " ),\n",
" \"PDOP, TAT-C (median)\": np.nanmedian(group.PDOP.to_numpy(dtype=float)),\n",
" }\n",
"table3 = pd.DataFrame(rows3).T\n",
@@ -1170,8 +1395,19 @@
"centers = (BINS[:-1] + BINS[1:]) / 2\n",
"for system, (label, _) in SYSTEMS.items():\n",
" values = np.array([fraction3[station][system] for station in stations])\n",
- " ax.plot(centers, 100 * np.median(values, axis=0), \"o-\", color=SYSTEM_COLORS[system], label=label)\n",
- "ax.set(xlabel=\"Elevation (deg)\", ylabel=\"Satellites tracked (%, median of stations)\", title=\"Fraction of satellites above the horizon tracked\", ylim=(0, 105))\n",
+ " ax.plot(\n",
+ " centers,\n",
+ " 100 * np.median(values, axis=0),\n",
+ " \"o-\",\n",
+ " color=SYSTEM_COLORS[system],\n",
+ " label=label,\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Elevation (deg)\",\n",
+ " ylabel=\"Satellites tracked (%, median of stations)\",\n",
+ " title=\"Fraction of satellites above the horizon tracked\",\n",
+ " ylim=(0, 105),\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1324,29 +1560,71 @@
],
"source": [
"rows4 = {}\n",
- "for label, systems in {\"GPS + Galileo\": \"GE\", \"GPS + GLONASS\": \"GR\", \"all four\": \"GECR\"}.items():\n",
+ "for label, systems in {\n",
+ " \"GPS + Galileo\": \"GE\",\n",
+ " \"GPS + GLONASS\": \"GR\",\n",
+ " \"all four\": \"GECR\",\n",
+ "}.items():\n",
" positions = {p: broadcast[p] for p in broadcast if p[0] in systems}\n",
" names = [n for n, p in prn.items() if p[0] in systems]\n",
" matched_positions = {prn[n]: broadcast[prn[n]] for n in names}\n",
- " single, system_clocks, tatc_values, tatc_system_values, same_one, same_system = [], [], [], [], [], []\n",
+ " single, system_clocks, tatc_values, tatc_system_values, same_one, same_system = (\n",
+ " [],\n",
+ " [],\n",
+ " [],\n",
+ " [],\n",
+ " [],\n",
+ " [],\n",
+ " )\n",
" for station in stations:\n",
- " same_one.append(reference_dop(station, matched_positions).PDOP.to_numpy(dtype=float))\n",
- " same_system.append(reference_dop(station, matched_positions, clocks=\"system\").PDOP.to_numpy(dtype=float))\n",
+ " same_one.append(\n",
+ " reference_dop(station, matched_positions).PDOP.to_numpy(dtype=float)\n",
+ " )\n",
+ " same_system.append(\n",
+ " reference_dop(station, matched_positions, clocks=\"system\").PDOP.to_numpy(\n",
+ " dtype=float\n",
+ " )\n",
+ " )\n",
" single.append(reference_dop(station, positions).PDOP.to_numpy(dtype=float))\n",
- " system_clocks.append(reference_dop(station, positions, clocks=\"system\").PDOP.to_numpy(dtype=float))\n",
+ " system_clocks.append(\n",
+ " reference_dop(station, positions, clocks=\"system\").PDOP.to_numpy(\n",
+ " dtype=float\n",
+ " )\n",
+ " )\n",
" tatc_values.append(tatc_dop(station, names).PDOP.to_numpy(dtype=float))\n",
- " tatc_system_values.append(tatc_dop(station, names, systems=[prn[n][0] for n in names]).PDOP.to_numpy(dtype=float))\n",
- " single, system_clocks, tatc_values, tatc_system_values, same_one, same_system = (np.concatenate(v) for v in (single, system_clocks, tatc_values, tatc_system_values, same_one, same_system))\n",
+ " tatc_system_values.append(\n",
+ " tatc_dop(station, names, systems=[prn[n][0] for n in names]).PDOP.to_numpy(\n",
+ " dtype=float\n",
+ " )\n",
+ " )\n",
+ " single, system_clocks, tatc_values, tatc_system_values, same_one, same_system = (\n",
+ " np.concatenate(v)\n",
+ " for v in (\n",
+ " single,\n",
+ " system_clocks,\n",
+ " tatc_values,\n",
+ " tatc_system_values,\n",
+ " same_one,\n",
+ " same_system,\n",
+ " )\n",
+ " )\n",
" rows4[label] = {\n",
" \"PDOP, one clock (median)\": np.nanmedian(single),\n",
" \"PDOP, clock per system (median)\": np.nanmedian(system_clocks),\n",
- " \"clock per system minus one clock, median (%)\": 100 * np.median(relative(system_clocks, single)),\n",
- " \"clock per system minus one clock, p95 (%)\": 100 * np.percentile(relative(system_clocks, single), 95),\n",
- " \"TAT-C one clock minus clock per system, median (%)\": 100 * np.median(relative(tatc_values, system_clocks)),\n",
- " \"same satellites, one clock: TAT-C minus reference, median |x| (%)\": 100 * np.median(np.abs(relative(tatc_values, same_one))),\n",
- " \"same satellites, one clock: TAT-C minus reference, p95 |x| (%)\": 100 * np.percentile(np.abs(relative(tatc_values, same_one)), 95),\n",
- " \"same satellites, clock per system: TAT-C minus reference, median |x| (%)\": 100 * np.median(np.abs(relative(tatc_system_values, same_system))),\n",
- " \"same satellites, clock per system: TAT-C minus reference, p95 |x| (%)\": 100 * np.percentile(np.abs(relative(tatc_system_values, same_system)), 95),\n",
+ " \"clock per system minus one clock, median (%)\": 100\n",
+ " * np.median(relative(system_clocks, single)),\n",
+ " \"clock per system minus one clock, p95 (%)\": 100\n",
+ " * np.percentile(relative(system_clocks, single), 95),\n",
+ " \"TAT-C one clock minus clock per system, median (%)\": 100\n",
+ " * np.median(relative(tatc_values, system_clocks)),\n",
+ " \"same satellites, one clock: TAT-C minus reference, median |x| (%)\": 100\n",
+ " * np.median(np.abs(relative(tatc_values, same_one))),\n",
+ " \"same satellites, one clock: TAT-C minus reference, p95 |x| (%)\": 100\n",
+ " * np.percentile(np.abs(relative(tatc_values, same_one)), 95),\n",
+ " \"same satellites, clock per system: TAT-C minus reference, median |x| (%)\": 100\n",
+ " * np.median(np.abs(relative(tatc_system_values, same_system))),\n",
+ " \"same satellites, clock per system: TAT-C minus reference, p95 |x| (%)\": 100\n",
+ " * np.percentile(np.abs(relative(tatc_system_values, same_system)), 95),\n",
" }\n",
"pd.DataFrame(rows4).T.round(2)"
]
@@ -1457,27 +1735,65 @@
"source": [
"def fit_walker(names, total=24, planes=3):\n",
" \"\"\"Fit a Walker delta constellation to satellites (TAT-C names), as in the orbit generation notebook.\"\"\"\n",
- " track = [satellites[n].orbit.to_gp_orbit().get_orbit_track_at_time(sk_times[144]) for n in names]\n",
+ " track = [\n",
+ " satellites[n].orbit.to_gp_orbit().get_orbit_track_at_time(sk_times[144])\n",
+ " for n in names\n",
+ " ]\n",
" elements = []\n",
" for g in track:\n",
" r, v = g.position.m, g.velocity.m_per_s\n",
" h = np.cross(r, v)\n",
" raan = np.degrees(np.arctan2(h[0], -h[1])) % 360\n",
" node = np.array([np.cos(np.radians(raan)), np.sin(np.radians(raan)), 0])\n",
- " u = np.degrees(np.arctan2(np.dot(np.cross(node, r), h) / np.linalg.norm(h), np.dot(node, r))) % 360\n",
- " elements.append((np.degrees(np.arccos(h[2] / np.linalg.norm(h))), raan, u, np.linalg.norm(r)))\n",
+ " u = (\n",
+ " np.degrees(\n",
+ " np.arctan2(\n",
+ " np.dot(np.cross(node, r), h) / np.linalg.norm(h), np.dot(node, r)\n",
+ " )\n",
+ " )\n",
+ " % 360\n",
+ " )\n",
+ " elements.append(\n",
+ " (\n",
+ " np.degrees(np.arccos(h[2] / np.linalg.norm(h))),\n",
+ " raan,\n",
+ " u,\n",
+ " np.linalg.norm(r),\n",
+ " )\n",
+ " )\n",
" inc, raan, u, radius = (np.array(x) for x in zip(*elements))\n",
" wrap = lambda x: (x + 180) % 360 - 180\n",
" best = None\n",
" for spacing in range(planes):\n",
" offset_u = offset_raan = 0.0\n",
" for _ in range(4):\n",
- " lead = CircularOrbit(mean_altitude=float(np.median(radius)) - EARTH_MEAN_RADIUS, inclination=float(np.median(inc)), right_ascension_ascending_node=float(raan[0] + offset_raan) % 360, true_anomaly=float(u[0] + offset_u) % 360, epoch=TIMES[144])\n",
- " walker = WalkerConstellation(name=\"walker\", orbit=lead, number_satellites=total, number_planes=planes, relative_spacing=spacing)\n",
+ " lead = CircularOrbit(\n",
+ " mean_altitude=float(np.median(radius)) - EARTH_MEAN_RADIUS,\n",
+ " inclination=float(np.median(inc)),\n",
+ " right_ascension_ascending_node=float(raan[0] + offset_raan) % 360,\n",
+ " true_anomaly=float(u[0] + offset_u) % 360,\n",
+ " epoch=TIMES[144],\n",
+ " )\n",
+ " walker = WalkerConstellation(\n",
+ " name=\"walker\",\n",
+ " orbit=lead,\n",
+ " number_satellites=total,\n",
+ " number_planes=planes,\n",
+ " relative_spacing=spacing,\n",
+ " )\n",
" members = walker.generate_members()\n",
- " d_raan = wrap(raan[:, None] - np.array([m.orbit.get_right_ascension_ascending_node() for m in members])[None, :])\n",
- " d_u = wrap(u[:, None] - np.array([m.orbit.true_anomaly for m in members])[None, :])\n",
- " slot = np.argmin(np.hypot(d_raan * np.sin(np.radians(np.median(inc))), d_u), axis=1)\n",
+ " d_raan = wrap(\n",
+ " raan[:, None]\n",
+ " - np.array(\n",
+ " [m.orbit.get_right_ascension_ascending_node() for m in members]\n",
+ " )[None, :]\n",
+ " )\n",
+ " d_u = wrap(\n",
+ " u[:, None] - np.array([m.orbit.true_anomaly for m in members])[None, :]\n",
+ " )\n",
+ " slot = np.argmin(\n",
+ " np.hypot(d_raan * np.sin(np.radians(np.median(inc))), d_u), axis=1\n",
+ " )\n",
" du, dr = d_u[np.arange(len(slot)), slot], d_raan[np.arange(len(slot)), slot]\n",
" offset_u += float(np.median(du))\n",
" offset_raan += float(np.median(dr))\n",
@@ -1492,7 +1808,15 @@
"for label, system in [(\"Galileo\", \"E\"), (\"BeiDou-3 MEO\", \"C\")]:\n",
" names = [n for n, p in prn.items() if p[0] == system]\n",
" if system == \"C\":\n",
- " names = [n for n in names if abs(satellites[n].orbit.to_gp_orbit().elements[0].mean_motion * 86400 / 360 - 1.86) < 0.05]\n",
+ " names = [\n",
+ " n\n",
+ " for n in names\n",
+ " if abs(\n",
+ " satellites[n].orbit.to_gp_orbit().elements[0].mean_motion * 86400 / 360\n",
+ " - 1.86\n",
+ " )\n",
+ " < 0.05\n",
+ " ]\n",
" members, in_slots = fit_walker(names)\n",
" for m in members:\n",
" satellites[f\"{label} Walker {m.name}\"] = m\n",
@@ -1501,7 +1825,9 @@
" for station in stations:\n",
" walker_values.append(tatc_dop(station, walker_names).PDOP.to_numpy(dtype=float))\n",
" real_values.append(tatc_dop(station, in_slots).PDOP.to_numpy(dtype=float))\n",
- " walker_values, real_values = np.concatenate(walker_values), np.concatenate(real_values)\n",
+ " walker_values, real_values = np.concatenate(walker_values), np.concatenate(\n",
+ " real_values\n",
+ " )\n",
" cdf5[label] = (real_values, walker_values)\n",
" rows5[label] = {\n",
" \"operational satellites in slots\": len(in_slots),\n",
@@ -1509,8 +1835,10 @@
" \"PDOP, Walker (median)\": np.nanmedian(walker_values),\n",
" \"PDOP, operational (p95)\": np.nanpercentile(real_values, 95),\n",
" \"PDOP, Walker (p95)\": np.nanpercentile(walker_values, 95),\n",
- " \"times without a solution, operational (%)\": 100 * np.mean(~np.isfinite(real_values)),\n",
- " \"times without a solution, Walker (%)\": 100 * np.mean(~np.isfinite(walker_values)),\n",
+ " \"times without a solution, operational (%)\": 100\n",
+ " * np.mean(~np.isfinite(real_values)),\n",
+ " \"times without a solution, Walker (%)\": 100\n",
+ " * np.mean(~np.isfinite(walker_values)),\n",
" }\n",
"pd.DataFrame(rows5).T.round(2)"
]
@@ -1542,10 +1870,24 @@
"source": [
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
"for (label, (real_values, walker_values)), color in zip(cdf5.items(), [ORANGE, AQUA]):\n",
- " for values, ls, kind in [(real_values, \"-\", \"operational\"), (walker_values, \"--\", \"Walker\")]:\n",
+ " for values, ls, kind in [\n",
+ " (real_values, \"-\", \"operational\"),\n",
+ " (walker_values, \"--\", \"Walker\"),\n",
+ " ]:\n",
" v = np.sort(values[np.isfinite(values)])\n",
- " ax.plot(v, np.arange(1, len(v) + 1) / len(values), color=color, ls=ls, label=f\"{label}, {kind}\")\n",
- "ax.set(xlabel=\"PDOP (10 deg mask)\", ylabel=\"Cumulative fraction of times\", xlim=(1, 6), title=\"PDOP of operational and Walker constellations (six stations)\")\n",
+ " ax.plot(\n",
+ " v,\n",
+ " np.arange(1, len(v) + 1) / len(values),\n",
+ " color=color,\n",
+ " ls=ls,\n",
+ " label=f\"{label}, {kind}\",\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"PDOP (10 deg mask)\",\n",
+ " ylabel=\"Cumulative fraction of times\",\n",
+ " xlim=(1, 6),\n",
+ " title=\"PDOP of operational and Walker constellations (six stations)\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
diff --git a/docs/validation/ValidateDriftMODIS.ipynb b/docs/validation/ValidateDriftMODIS.ipynb
index 2169a343..544c75f2 100644
--- a/docs/validation/ValidateDriftMODIS.ipynb
+++ b/docs/validation/ValidateDriftMODIS.ipynb
@@ -38,10 +38,10 @@
"id": "0aa9944d",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:36:20.429629Z",
- "iopub.status.busy": "2026-10-08T17:36:20.429629Z",
- "iopub.status.idle": "2026-10-08T17:36:31.008723Z",
- "shell.execute_reply": "2026-10-08T17:36:31.008723Z"
+ "iopub.execute_input": "2026-10-25T15:24:16.021642Z",
+ "iopub.status.busy": "2026-10-25T15:24:16.020644Z",
+ "iopub.status.idle": "2026-10-25T15:24:18.027292Z",
+ "shell.execute_reply": "2026-10-25T15:24:18.027292Z"
}
},
"outputs": [
@@ -102,13 +102,17 @@
" def __init__(self, url, block_size=2**20, prefetch=1):\n",
" self.block_size, self.blocks, self.position = block_size, {}, 0\n",
" response = self._get(url, 0, prefetch * block_size)\n",
- " self.url, self.size = response.url, int(response.headers[\"Content-Range\"].split(\"/\")[1])\n",
+ " self.url, self.size = response.url, int(\n",
+ " response.headers[\"Content-Range\"].split(\"/\")[1]\n",
+ " )\n",
" self._store(0, response.content)\n",
"\n",
" def _get(self, url, start, end):\n",
" for attempt in range(5):\n",
" try:\n",
- " response = https_session().get(url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300)\n",
+ " response = https_session().get(\n",
+ " url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300\n",
+ " )\n",
" response.raise_for_status()\n",
" return response\n",
" except requests.RequestException:\n",
@@ -129,18 +133,30 @@
" return self.position\n",
"\n",
" def seek(self, offset, whence=io.SEEK_SET):\n",
- " self.position = {io.SEEK_SET: 0, io.SEEK_CUR: self.position, io.SEEK_END: self.size}[whence] + offset\n",
+ " self.position = {\n",
+ " io.SEEK_SET: 0,\n",
+ " io.SEEK_CUR: self.position,\n",
+ " io.SEEK_END: self.size,\n",
+ " }[whence] + offset\n",
" return self.position\n",
"\n",
" def readinto(self, buffer):\n",
" n = min(len(buffer), self.size - self.position)\n",
" if n <= 0:\n",
" return 0\n",
- " first, last = self.position // self.block_size, (self.position + n - 1) // self.block_size\n",
- " missing = [block for block in range(first, last + 1) if block not in self.blocks]\n",
+ " first, last = (\n",
+ " self.position // self.block_size,\n",
+ " (self.position + n - 1) // self.block_size,\n",
+ " )\n",
+ " missing = [\n",
+ " block for block in range(first, last + 1) if block not in self.blocks\n",
+ " ]\n",
" if missing:\n",
" end = min((missing[-1] + 1) * self.block_size, self.size)\n",
- " self._store(missing[0], self._get(self.url, missing[0] * self.block_size, end).content)\n",
+ " self._store(\n",
+ " missing[0],\n",
+ " self._get(self.url, missing[0] * self.block_size, end).content,\n",
+ " )\n",
" data = b\"\".join(self.blocks[block] for block in range(first, last + 1))\n",
" offset = self.position - first * self.block_size\n",
" buffer[:n] = data[offset : offset + n]\n",
@@ -172,7 +188,9 @@
"\n",
" np.savez_compressed(\n",
" path,\n",
- " start=attribute(f, \"RangeBeginningDate\") + \"T\" + attribute(f, \"RangeBeginningTime\"),\n",
+ " start=attribute(f, \"RangeBeginningDate\")\n",
+ " + \"T\"\n",
+ " + attribute(f, \"RangeBeginningTime\"),\n",
" ev_center_time=f[\"EV center time\"][:],\n",
" orb_pos=f[\"orb_pos\"][:],\n",
" orb_vel=f[\"orb_vel\"][:],\n",
@@ -202,7 +220,11 @@
"\n",
"\n",
"def url_of(result):\n",
- " return next(link[\"URL\"] for link in result[\"umm\"][\"RelatedUrls\"] if link[\"URL\"].startswith(\"https://data.laads\"))\n",
+ " return next(\n",
+ " link[\"URL\"]\n",
+ " for link in result[\"umm\"][\"RelatedUrls\"]\n",
+ " if link[\"URL\"].startswith(\"https://data.laads\")\n",
+ " )\n",
"\n",
"\n",
"crossings_file = DATA_DIR / \"equator_crossings.csv\"\n",
@@ -211,7 +233,15 @@
"\n",
" urls, day = [], datetime(2018, 1, 1, tzinfo=timezone.utc)\n",
" while day < DAY:\n",
- " found = earthaccess.search_data(short_name=\"MOD03\", version=\"7\", temporal=(day.strftime(\"%Y-%m-%dT%H:%M:%SZ\"), (day + timedelta(minutes=4)).strftime(\"%Y-%m-%dT%H:%M:%SZ\")), count=1)\n",
+ " found = earthaccess.search_data(\n",
+ " short_name=\"MOD03\",\n",
+ " version=\"7\",\n",
+ " temporal=(\n",
+ " day.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " (day + timedelta(minutes=4)).strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " ),\n",
+ " count=1,\n",
+ " )\n",
" urls += [url_of(found[0])] if found else []\n",
" day += timedelta(days=15)\n",
" with concurrent.futures.ThreadPoolExecutor(6) as pool:\n",
@@ -219,19 +249,35 @@
"if not any(DATA_DIR.glob(\"MOD03.*.npz\")):\n",
" import earthaccess\n",
"\n",
- " found = earthaccess.search_data(short_name=\"MOD03\", version=\"7\", temporal=(DAY.strftime(\"%Y-%m-%dT%H:%M:%SZ\"), (DAY + timedelta(days=1) - timedelta(seconds=1)).strftime(\"%Y-%m-%dT%H:%M:%SZ\")))\n",
+ " found = earthaccess.search_data(\n",
+ " short_name=\"MOD03\",\n",
+ " version=\"7\",\n",
+ " temporal=(\n",
+ " DAY.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " (DAY + timedelta(days=1) - timedelta(seconds=1)).strftime(\n",
+ " \"%Y-%m-%dT%H:%M:%SZ\"\n",
+ " ),\n",
+ " ),\n",
+ " )\n",
" with concurrent.futures.ThreadPoolExecutor(6) as pool:\n",
" list(pool.map(reduce_granule, sorted(url_of(r) for r in found)))\n",
"\n",
"crossings = pd.read_csv(crossings_file)\n",
- "crossings[\"time\"] = pd.to_datetime(crossings.date + \" \" + crossings.time.str[:15]).dt.tz_localize(\"UTC\")\n",
- "crossings[\"local time (h)\"] = ((crossings.time - crossings.time.dt.normalize()).dt.total_seconds() / 3600 + crossings.longitude / 15) % 24\n",
+ "crossings[\"time\"] = pd.to_datetime(\n",
+ " crossings.date + \" \" + crossings.time.str[:15]\n",
+ ").dt.tz_localize(\"UTC\")\n",
+ "crossings[\"local time (h)\"] = (\n",
+ " (crossings.time - crossings.time.dt.normalize()).dt.total_seconds() / 3600\n",
+ " + crossings.longitude / 15\n",
+ ") % 24\n",
"granules = []\n",
"for path in sorted(DATA_DIR.glob(\"MOD03.*.npz\")):\n",
" with np.load(path) as d:\n",
" granule = {key: d[key] for key in d.files}\n",
" granule[\"name\"] = path.stem\n",
- " valid = np.all(np.isfinite(granule[\"orb_pos\"]), axis=1) & (np.linalg.norm(granule[\"orb_pos\"], axis=1) > 6e6)\n",
+ " valid = np.all(np.isfinite(granule[\"orb_pos\"]), axis=1) & (\n",
+ " np.linalg.norm(granule[\"orb_pos\"], axis=1) > 6e6\n",
+ " )\n",
" granule[\"valid\"] = valid\n",
" granules.append(granule)\n",
"pd.Series(\n",
@@ -253,7 +299,7 @@
"source": [
"## Setup\n",
"\n",
- "MODIS scan times are given in seconds since 1 January 1993 in International Atomic Time (TAI), converted to UTC with Skyfield."
+ "MODIS scan times are given in seconds of International Atomic Time (TAI) since 1 January 1993 00:00:00 UTC, when TAI was 27 s ahead of UTC, converted to UTC with Skyfield."
]
},
{
@@ -262,10 +308,10 @@
"id": "8737d26b",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:36:31.012329Z",
- "iopub.status.busy": "2026-10-08T17:36:31.012329Z",
- "iopub.status.idle": "2026-10-08T17:36:46.930512Z",
- "shell.execute_reply": "2026-10-08T17:36:46.930004Z"
+ "iopub.execute_input": "2026-10-25T15:24:18.029298Z",
+ "iopub.status.busy": "2026-10-25T15:24:18.029298Z",
+ "iopub.status.idle": "2026-10-25T15:24:19.754383Z",
+ "shell.execute_reply": "2026-10-25T15:24:19.754383Z"
}
},
"outputs": [],
@@ -281,7 +327,14 @@
"from tatc.analysis import collect_observations\n",
"from tatc.constants import timescale\n",
"from tatc.generation import generate_points_fibonacci_lattice\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, Point, PointedInstrument, Satellite, SunSynchronousOrbit\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ " SunSynchronousOrbit,\n",
+ ")\n",
"from tatc.utils import (\n",
" VelocityFrame,\n",
" ViewGeometry,\n",
@@ -291,19 +344,39 @@
")\n",
"\n",
"orbit = GeneralPerturbationsOrbit.from_tle(TLE)\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"\n",
"\n",
"def scan_times(granule, scans=slice(None)):\n",
- " \"\"\"Skyfield times of a granule's scans (EV center times, TAI seconds since 1993).\"\"\"\n",
- " return timescale.tai(1993, 1, 1, 0, 0, 26 + granule[\"ev_center_time\"][scans].astype(float))\n",
+ " \"\"\"Skyfield times of a granule's scans (EV center times, TAI seconds since 1993-01-01 00:00:00 UTC, when TAI - UTC was 27 s).\"\"\"\n",
+ " return timescale.tai(\n",
+ " 1993, 1, 1, 0, 0, 27 + granule[\"ev_center_time\"][scans].astype(float)\n",
+ " )\n",
"\n",
"\n",
"def ephemeris_track(granule, scans):\n",
" \"\"\"Terra's reported (Earth-fixed) position and velocity at scans, as an inertial orbit track.\"\"\"\n",
" return Geocentric.from_time_and_frame_vectors(\n",
- " scan_times(granule, scans), itrs, Distance(m=granule[\"orb_pos\"][scans].T.astype(float)), Velocity(km_per_s=granule[\"orb_vel\"][scans].T.astype(float) / 1e3)\n",
+ " scan_times(granule, scans),\n",
+ " itrs,\n",
+ " Distance(m=granule[\"orb_pos\"][scans].T.astype(float)),\n",
+ " Velocity(km_per_s=granule[\"orb_vel\"][scans].T.astype(float) / 1e3),\n",
" )"
]
},
@@ -323,10 +396,10 @@
"id": "908af07c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:36:46.934035Z",
- "iopub.status.busy": "2026-10-08T17:36:46.934035Z",
- "iopub.status.idle": "2026-10-08T17:36:48.194931Z",
- "shell.execute_reply": "2026-10-08T17:36:48.193921Z"
+ "iopub.execute_input": "2026-10-25T15:24:19.757706Z",
+ "iopub.status.busy": "2026-10-25T15:24:19.757706Z",
+ "iopub.status.idle": "2026-10-25T15:24:20.230009Z",
+ "shell.execute_reply": "2026-10-25T15:24:20.230009Z"
}
},
"outputs": [
@@ -360,31 +433,31 @@
" \n",
"
\n",
"
mean
\n",
- "
-7.610
\n",
+ "
-0.024
\n",
"
0.002
\n",
- "
-0.003
\n",
- "
7.613
\n",
+ "
0.001
\n",
+ "
0.583
\n",
"
\n",
"
\n",
"
50%
\n",
- "
-7.634
\n",
+ "
-0.047
\n",
"
-0.005
\n",
- "
-0.001
\n",
- "
7.637
\n",
+ "
0.003
\n",
+ "
0.620
\n",
"
\n",
"
\n",
"
95%
\n",
- "
-6.622
\n",
+ "
0.960
\n",
"
0.233
\n",
- "
0.240
\n",
- "
8.466
\n",
+ "
0.237
\n",
+ "
0.994
\n",
"
\n",
"
\n",
"
max
\n",
- "
-6.491
\n",
+ "
1.080
\n",
"
0.325
\n",
- "
0.341
\n",
- "
8.629
\n",
+ "
0.336
\n",
+ "
1.091
\n",
"
\n",
" \n",
"\n",
@@ -392,10 +465,10 @@
],
"text/plain": [
" along-track (km) cross-track (km) radial (km) total (km)\n",
- "mean -7.610 0.002 -0.003 7.613\n",
- "50% -7.634 -0.005 -0.001 7.637\n",
- "95% -6.622 0.233 0.240 8.466\n",
- "max -6.491 0.325 0.341 8.629"
+ "mean -0.024 0.002 0.001 0.583\n",
+ "50% -0.047 -0.005 0.003 0.620\n",
+ "95% 0.960 0.233 0.237 0.994\n",
+ "max 1.080 0.325 0.336 1.091"
]
},
"execution_count": 3,
@@ -411,13 +484,24 @@
" continue\n",
" t = scan_times(g, scans)\n",
" tle_xyz = orbit.get_orbit_track(list(t.utc_datetime())).frame_xyz(itrs).m\n",
- " reported, velocity = g[\"orb_pos\"][scans].T.astype(float), g[\"orb_vel\"][scans].T.astype(float)\n",
+ " reported, velocity = g[\"orb_pos\"][scans].T.astype(float), g[\"orb_vel\"][\n",
+ " scans\n",
+ " ].T.astype(float)\n",
" radial = reported / np.linalg.norm(reported, axis=0)\n",
" cross = np.cross(reported, velocity, axis=0)\n",
" cross /= np.linalg.norm(cross, axis=0)\n",
" along = np.cross(cross, radial, axis=0)\n",
" difference = (tle_xyz - reported) / 1e3\n",
- " records.append(pd.DataFrame({\"along-track (km)\": np.sum(difference * along, axis=0), \"cross-track (km)\": np.sum(difference * cross, axis=0), \"radial (km)\": np.sum(difference * radial, axis=0), \"total (km)\": np.linalg.norm(difference, axis=0)}))\n",
+ " records.append(\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"along-track (km)\": np.sum(difference * along, axis=0),\n",
+ " \"cross-track (km)\": np.sum(difference * cross, axis=0),\n",
+ " \"radial (km)\": np.sum(difference * radial, axis=0),\n",
+ " \"total (km)\": np.linalg.norm(difference, axis=0),\n",
+ " }\n",
+ " )\n",
+ " )\n",
"errors = pd.concat(records)\n",
"errors.describe(percentiles=[0.5, 0.95]).loc[[\"mean\", \"50%\", \"95%\", \"max\"]].round(3)"
]
@@ -427,7 +511,7 @@
"id": "422da008",
"metadata": {},
"source": [
- "The propagated TLE trails Terra's reported position by 7.6 km along track (about 1.1 s), consistently over the day, which is about two days before the TLE epoch; the cross-track and radial differences are within 0.35 km.\n",
+ "The propagated TLE matches Terra's reported position to within 1.0 km along track (95th percentile; 0.05 km median) over the day, which is about two days before the TLE epoch; the cross-track and radial differences are within 0.35 km.\n",
"\n",
"## Test 2: Local Time Drift\n",
"\n",
@@ -440,10 +524,10 @@
"id": "60287b5d",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:36:48.197931Z",
- "iopub.status.busy": "2026-10-08T17:36:48.196932Z",
- "iopub.status.idle": "2026-10-08T17:37:01.262997Z",
- "shell.execute_reply": "2026-10-08T17:37:01.262997Z"
+ "iopub.execute_input": "2026-10-25T15:24:20.232014Z",
+ "iopub.status.busy": "2026-10-25T15:24:20.232014Z",
+ "iopub.status.idle": "2026-10-25T15:24:21.681611Z",
+ "shell.execute_reply": "2026-10-25T15:24:21.681611Z"
}
},
"outputs": [
@@ -605,19 +689,39 @@
"def tle_crossing(time):\n",
" \"\"\"Time and local time of the TLE orbit's descending equator crossing nearest a time.\"\"\"\n",
" seconds = np.arange(-3000, 3001, 10)\n",
- " track = orbit.get_orbit_track([time.to_pydatetime() + timedelta(seconds=float(s)) for s in seconds])\n",
+ " track = orbit.get_orbit_track(\n",
+ " [time.to_pydatetime() + timedelta(seconds=float(s)) for s in seconds]\n",
+ " )\n",
" xyz = track.frame_xyz(itrs).m\n",
" k = np.nonzero((xyz[2, :-1] > 0) & (xyz[2, 1:] <= 0))[0]\n",
" k = k[np.argmin(np.abs(seconds[k]))]\n",
" fraction = xyz[2, k] / (xyz[2, k] - xyz[2, k + 1])\n",
" crossing_time = time + pd.Timedelta(seconds=float(seconds[k] + 10 * fraction))\n",
- " longitude = np.degrees(np.arctan2(*(xyz[1, k] + fraction * (xyz[1, k + 1] - xyz[1, k]), xyz[0, k] + fraction * (xyz[0, k + 1] - xyz[0, k]))))\n",
- " return crossing_time, ((crossing_time - crossing_time.normalize()).total_seconds() / 3600 + longitude / 15) % 24\n",
+ " longitude = np.degrees(\n",
+ " np.arctan2(\n",
+ " *(\n",
+ " xyz[1, k] + fraction * (xyz[1, k + 1] - xyz[1, k]),\n",
+ " xyz[0, k] + fraction * (xyz[0, k + 1] - xyz[0, k]),\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ " return (\n",
+ " crossing_time,\n",
+ " (\n",
+ " (crossing_time - crossing_time.normalize()).total_seconds() / 3600\n",
+ " + longitude / 15\n",
+ " )\n",
+ " % 24,\n",
+ " )\n",
"\n",
"\n",
"crossings[\"TAT-C (TLE) local time (h)\"] = [tle_crossing(t)[1] for t in crossings.time]\n",
- "crossings[\"TAT-C minus reported (min)\"] = 60 * (crossings[\"TAT-C (TLE) local time (h)\"] - crossings[\"local time (h)\"])\n",
- "crossings[\"years from TLE epoch\"] = (crossings.time - pd.Timestamp(orbit.get_epoch())).dt.total_seconds() / (365.25 * 86400)\n",
+ "crossings[\"TAT-C minus reported (min)\"] = 60 * (\n",
+ " crossings[\"TAT-C (TLE) local time (h)\"] - crossings[\"local time (h)\"]\n",
+ ")\n",
+ "crossings[\"years from TLE epoch\"] = (\n",
+ " crossings.time - pd.Timestamp(orbit.get_epoch())\n",
+ ").dt.total_seconds() / (365.25 * 86400)\n",
"yearly = crossings.groupby(crossings.time.dt.year).agg(\n",
" **{\n",
" \"reported local time (h)\": (\"local time (h)\", \"mean\"),\n",
@@ -627,13 +731,23 @@
" }\n",
")\n",
"rates = crossings.set_index(\"time\")[\"local time (h)\"]\n",
- "yearly[\"reported drift (min/year)\"] = [60 * np.polyfit(((g.index - g.index[0]).total_seconds() / (365.25 * 86400)), g.to_numpy(), 1)[0] for _, g in rates.groupby(rates.index.year)]\n",
+ "yearly[\"reported drift (min/year)\"] = [\n",
+ " 60\n",
+ " * np.polyfit(\n",
+ " ((g.index - g.index[0]).total_seconds() / (365.25 * 86400)), g.to_numpy(), 1\n",
+ " )[0]\n",
+ " for _, g in rates.groupby(rates.index.year)\n",
+ "]\n",
"recent = crossings[crossings[\"years from TLE epoch\"] > -0.5]\n",
- "print(f\"drift over the last 6 months: reported {60 * np.polyfit(recent['years from TLE epoch'], recent['local time (h)'], 1)[0]:.1f} min/year, TAT-C (TLE) {60 * np.polyfit(recent['years from TLE epoch'], recent['TAT-C (TLE) local time (h)'], 1)[0]:.1f} min/year\")\n",
+ "print(\n",
+ " f\"drift over the last 6 months: reported {60 * np.polyfit(recent['years from TLE epoch'], recent['local time (h)'], 1)[0]:.1f} min/year, TAT-C (TLE) {60 * np.polyfit(recent['years from TLE epoch'], recent['TAT-C (TLE) local time (h)'], 1)[0]:.1f} min/year\"\n",
+ ")\n",
"for horizon in (0.1, 0.25, 0.5, 1, 2, 4):\n",
" near = crossings[(crossings[\"years from TLE epoch\"] + horizon).abs() < 0.05]\n",
" if len(near):\n",
- " print(f\"{horizon:4.2f} years before the TLE epoch: TAT-C minus reported {near['TAT-C minus reported (min)'].mean():6.1f} min\")\n",
+ " print(\n",
+ " f\"{horizon:4.2f} years before the TLE epoch: TAT-C minus reported {near['TAT-C minus reported (min)'].mean():6.1f} min\"\n",
+ " )\n",
"yearly.round(3)"
]
},
@@ -643,10 +757,10 @@
"id": "6de22a45",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:37:01.267538Z",
- "iopub.status.busy": "2026-10-08T17:37:01.267538Z",
- "iopub.status.idle": "2026-10-08T17:37:01.553061Z",
- "shell.execute_reply": "2026-10-08T17:37:01.552554Z"
+ "iopub.execute_input": "2026-10-25T15:24:21.683866Z",
+ "iopub.status.busy": "2026-10-25T15:24:21.683866Z",
+ "iopub.status.idle": "2026-10-25T15:24:21.931255Z",
+ "shell.execute_reply": "2026-10-25T15:24:21.931255Z"
}
},
"outputs": [
@@ -663,13 +777,33 @@
],
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.8))\n",
- "axes[0].plot(crossings.time, crossings[\"local time (h)\"], color=INK, label=\"reported (MOD03)\")\n",
- "axes[0].plot(crossings.time, crossings[\"TAT-C (TLE) local time (h)\"], color=BLUE, ls=\"--\", label=\"TAT-C (single TLE)\")\n",
+ "axes[0].plot(\n",
+ " crossings.time, crossings[\"local time (h)\"], color=INK, label=\"reported (MOD03)\"\n",
+ ")\n",
+ "axes[0].plot(\n",
+ " crossings.time,\n",
+ " crossings[\"TAT-C (TLE) local time (h)\"],\n",
+ " color=BLUE,\n",
+ " ls=\"--\",\n",
+ " label=\"TAT-C (single TLE)\",\n",
+ ")\n",
"axes[0].axhline(10.5, color=GRAY, ls=\":\", label=\"SunSynchronousOrbit (10:30)\")\n",
- "axes[0].set(ylabel=\"Descending node local time (h)\", title=\"Terra local time\", ylim=(8, 13))\n",
+ "axes[0].set(\n",
+ " ylabel=\"Descending node local time (h)\", title=\"Terra local time\", ylim=(8, 13)\n",
+ ")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
- "axes[1].plot(crossings[\"years from TLE epoch\"], crossings[\"TAT-C minus reported (min)\"], color=BLUE)\n",
- "axes[1].set(xlabel=\"Years from TLE epoch\", ylabel=\"TAT-C minus reported (min)\", title=\"Local time error of a single TLE\", xlim=(-2.5, 0.05), ylim=(-10, 120))\n",
+ "axes[1].plot(\n",
+ " crossings[\"years from TLE epoch\"],\n",
+ " crossings[\"TAT-C minus reported (min)\"],\n",
+ " color=BLUE,\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Years from TLE epoch\",\n",
+ " ylabel=\"TAT-C minus reported (min)\",\n",
+ " title=\"Local time error of a single TLE\",\n",
+ " xlim=(-2.5, 0.05),\n",
+ " ylim=(-10, 120),\n",
+ ")\n",
"plt.show()"
]
},
@@ -693,10 +827,10 @@
"id": "e49fe65c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:37:01.556070Z",
- "iopub.status.busy": "2026-10-08T17:37:01.555070Z",
- "iopub.status.idle": "2026-10-08T17:37:07.549160Z",
- "shell.execute_reply": "2026-10-08T17:37:07.549160Z"
+ "iopub.execute_input": "2026-10-25T15:24:21.933475Z",
+ "iopub.status.busy": "2026-10-25T15:24:21.933475Z",
+ "iopub.status.idle": "2026-10-25T15:24:29.276497Z",
+ "shell.execute_reply": "2026-10-25T15:24:29.276497Z"
}
},
"outputs": [
@@ -718,7 +852,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_7272\\4133548599.py:27: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
+ "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_44296\\4133548599.py:27: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
" twist = angles.groupby(\"granule\").apply(lambda g: pd.Series({frame: np.polyfit(g[\"roll (deg)\"], g[f\"pitch, {frame} (deg)\"], 1)[0] for frame in (\"inertial\", \"Earth-fixed\")}))\n"
]
},
@@ -821,7 +955,19 @@
" for j in range(0, len(granule[\"frames\"]), 4):\n",
" values = {}\n",
" for frame in VelocityFrame:\n",
- " angles = [compute_view_angles(track, wgs84.latlon(*(float(granule[k][r, j]) for k in (\"latitude\", \"longitude\", \"height\"))), velocity_frame=frame) for r in (2 * scan, 2 * scan + 1)]\n",
+ " angles = [\n",
+ " compute_view_angles(\n",
+ " track,\n",
+ " wgs84.latlon(\n",
+ " *(\n",
+ " float(granule[k][r, j])\n",
+ " for k in (\"latitude\", \"longitude\", \"height\")\n",
+ " )\n",
+ " ),\n",
+ " velocity_frame=frame,\n",
+ " )\n",
+ " for r in (2 * scan, 2 * scan + 1)\n",
+ " ]\n",
" values[frame.value] = angles\n",
" (r1, a1), (r10, a10) = values[\"inertial\"]\n",
" rows.append(\n",
@@ -829,7 +975,9 @@
" \"frame\": int(granule[\"frames\"][j]),\n",
" \"roll (deg)\": float((r1 + r10) / 2),\n",
" \"pitch, inertial (deg)\": float((a1 + a10) / 2),\n",
- " \"pitch, Earth-fixed (deg)\": float(sum(a for _, a in values[\"earth_fixed\"]) / 2),\n",
+ " \"pitch, Earth-fixed (deg)\": float(\n",
+ " sum(a for _, a in values[\"earth_fixed\"]) / 2\n",
+ " ),\n",
" \"along-track extent, detectors 1 to 10 (deg)\": float(a10 - a1),\n",
" \"granule\": granule[\"name\"],\n",
" }\n",
@@ -837,16 +985,43 @@
" return rows\n",
"\n",
"\n",
- "angles = pd.DataFrame([row for rows in Parallel(n_jobs=-1)(delayed(view_angles)(g) for g in granules[::6]) for row in rows])\n",
+ "angles = pd.DataFrame(\n",
+ " [\n",
+ " row\n",
+ " for rows in Parallel(n_jobs=-1)(delayed(view_angles)(g) for g in granules[::6])\n",
+ " for row in rows\n",
+ " ]\n",
+ ")\n",
"slope, offset = np.polyfit(angles.frame - 676.5, angles[\"roll (deg)\"], 1)\n",
- "angles[\"scan angle residual (deg)\"] = angles[\"roll (deg)\"] - (slope * (angles.frame - 676.5) + offset)\n",
- "twist = angles.groupby(\"granule\").apply(lambda g: pd.Series({frame: np.polyfit(g[\"roll (deg)\"], g[f\"pitch, {frame} (deg)\"], 1)[0] for frame in (\"inertial\", \"Earth-fixed\")}))\n",
- "print(f\"roll = {slope:.5f} deg x (frame - 676.5) {offset:+.3f} deg; residual 95th percentile {angles['scan angle residual (deg)'].abs().quantile(0.95):.3f} deg\")\n",
+ "angles[\"scan angle residual (deg)\"] = angles[\"roll (deg)\"] - (\n",
+ " slope * (angles.frame - 676.5) + offset\n",
+ ")\n",
+ "twist = angles.groupby(\"granule\").apply(\n",
+ " lambda g: pd.Series(\n",
+ " {\n",
+ " frame: np.polyfit(g[\"roll (deg)\"], g[f\"pitch, {frame} (deg)\"], 1)[0]\n",
+ " for frame in (\"inertial\", \"Earth-fixed\")\n",
+ " }\n",
+ " )\n",
+ ")\n",
+ "print(\n",
+ " f\"roll = {slope:.5f} deg x (frame - 676.5) {offset:+.3f} deg; residual 95th percentile {angles['scan angle residual (deg)'].abs().quantile(0.95):.3f} deg\"\n",
+ ")\n",
"print(f\"scan angles {slope * -676.5 + offset:.2f} to {slope * 676.5 + offset:.2f} deg\")\n",
- "print(\"trend of the along-track angle across the scan (deg per deg of roll), by granule:\")\n",
+ "print(\n",
+ " \"trend of the along-track angle across the scan (deg per deg of roll), by granule:\"\n",
+ ")\n",
"print(twist.describe().loc[[\"mean\", \"std\", \"min\", \"max\"]].round(5).to_string())\n",
- "angles[\"scan angle bin (deg)\"] = pd.cut(angles[\"roll (deg)\"], [-56, -45, -30, -15, 0, 15, 30, 45, 56])\n",
- "angles.groupby(\"scan angle bin (deg)\", observed=True)[[\"pitch, inertial (deg)\", \"pitch, Earth-fixed (deg)\", \"along-track extent, detectors 1 to 10 (deg)\"]].median().round(4).T"
+ "angles[\"scan angle bin (deg)\"] = pd.cut(\n",
+ " angles[\"roll (deg)\"], [-56, -45, -30, -15, 0, 15, 30, 45, 56]\n",
+ ")\n",
+ "angles.groupby(\"scan angle bin (deg)\", observed=True)[\n",
+ " [\n",
+ " \"pitch, inertial (deg)\",\n",
+ " \"pitch, Earth-fixed (deg)\",\n",
+ " \"along-track extent, detectors 1 to 10 (deg)\",\n",
+ " ]\n",
+ "].median().round(4).T"
]
},
{
@@ -865,10 +1040,10 @@
"id": "acbef128",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:37:07.552167Z",
- "iopub.status.busy": "2026-10-08T17:37:07.552167Z",
- "iopub.status.idle": "2026-10-08T17:37:08.107881Z",
- "shell.execute_reply": "2026-10-08T17:37:08.107374Z"
+ "iopub.execute_input": "2026-10-25T15:24:29.278546Z",
+ "iopub.status.busy": "2026-10-25T15:24:29.278546Z",
+ "iopub.status.idle": "2026-10-25T15:24:30.057335Z",
+ "shell.execute_reply": "2026-10-25T15:24:30.057335Z"
}
},
"outputs": [
@@ -966,11 +1141,29 @@
}
],
"source": [
- "modis = PointedInstrument(\n",
- " name=\"MODIS\", field_of_regard=112, cross_track_field_of_view=1354 * 0.0812, along_track_field_of_view=10 * 0.0812,\n",
- " cross_track_pixels=1354, along_track_pixels=10, is_rectangular=True, view_geometry=ViewGeometry.SCAN, velocity_frame=VelocityFrame.INERTIAL,\n",
+ "# not yaw-steered: the body (and its instruments' views) aligned with the inertial velocity\n",
+ "INERTIAL = Attitude(velocity_frame=VelocityFrame.INERTIAL)\n",
+ "modis_scan = PointedInstrument(\n",
+ " name=\"MODIS\",\n",
+ " field_of_regard=112,\n",
+ " cross_track_field_of_view=1354 * 0.0812,\n",
+ " along_track_field_of_view=10 * 0.0812,\n",
+ " cross_track_pixels=1354,\n",
+ " along_track_pixels=10,\n",
+ " is_rectangular=True,\n",
+ " view_geometry=ViewGeometry.SCAN,\n",
")\n",
- "modis_frame = modis.model_copy(update={\"view_geometry\": ViewGeometry.FRAME})\n",
+ "terra = Satellite(\n",
+ " name=\"Terra\",\n",
+ " orbit=orbit,\n",
+ " instruments=[\n",
+ " modis_scan,\n",
+ " modis_scan.model_copy(update={\"view_geometry\": ViewGeometry.FRAME}),\n",
+ " ],\n",
+ " attitude=INERTIAL,\n",
+ ")\n",
+ "# the instruments with their views rotated from Terra's body\n",
+ "modis, modis_frame = terra.get_instrument(0), terra.get_instrument(1)\n",
"\n",
"\n",
"def pixel_errors(granule, step=20):\n",
@@ -982,28 +1175,89 @@
" j = sampled.index(frame)\n",
" # MODIS frames run right to left (frame 0 on the right); TAT-C's cross-track index 0 is also on the right\n",
" for detector, r in ((0, 2 * scan), (9, 2 * scan + 1)):\n",
- " lat, lon = float(granule[\"latitude\"][r, j]), float(granule[\"longitude\"][r, j])\n",
+ " lat, lon = float(granule[\"latitude\"][r, j]), float(\n",
+ " granule[\"longitude\"][r, j]\n",
+ " )\n",
" height = float(granule[\"height\"][r, j])\n",
" # TAT-C's along-track index 0 is the most forward detector (detector 10)\n",
- " pixel = modis.compute_projected_pixel_position(track, frame, 9 - detector, elevation=height)\n",
- " rows.append({\"frame\": frame, \"detector\": detector + 1, \"distance (km)\": geodesic_distance(lon, lat, pixel.longitude.degrees, pixel.latitude.degrees) / 1e3})\n",
+ " pixel = modis.compute_projected_pixel_position(\n",
+ " track, frame, 9 - detector, elevation=height\n",
+ " )\n",
+ " rows.append(\n",
+ " {\n",
+ " \"frame\": frame,\n",
+ " \"detector\": detector + 1,\n",
+ " \"distance (km)\": geodesic_distance(\n",
+ " lon, lat, pixel.longitude.degrees, pixel.latitude.degrees\n",
+ " )\n",
+ " / 1e3,\n",
+ " }\n",
+ " )\n",
" # scan footprint lengths along track at nadir and the edges\n",
" for frame in (0, 680, 1353):\n",
" j = sampled.index(frame)\n",
- " first, last = ((float(granule[\"latitude\"][r, j]), float(granule[\"longitude\"][r, j])) for r in (2 * scan, 2 * scan + 1))\n",
- " observed = geodesic_distance(first[1], first[0], last[1], last[0]) / 1e3 * 10 / 9\n",
+ " first, last = (\n",
+ " (float(granule[\"latitude\"][r, j]), float(granule[\"longitude\"][r, j]))\n",
+ " for r in (2 * scan, 2 * scan + 1)\n",
+ " )\n",
+ " observed = (\n",
+ " geodesic_distance(first[1], first[0], last[1], last[0]) / 1e3 * 10 / 9\n",
+ " )\n",
" lengths = {}\n",
- " for label, instrument in ((\"scan geometry\", modis), (\"frame geometry\", modis_frame)):\n",
- " ends = [instrument.compute_projected_pixel_position(track, frame, k) for k in (0, 9)]\n",
- " lengths[label] = geodesic_distance(ends[0].longitude.degrees, ends[0].latitude.degrees, ends[1].longitude.degrees, ends[1].latitude.degrees) / 1e3 * 10 / 9\n",
- " rows.append({\"frame\": frame, \"scan length (km)\": observed, \"TAT-C scan geometry length (km)\": lengths[\"scan geometry\"], \"TAT-C frame geometry length (km)\": lengths[\"frame geometry\"]})\n",
+ " for label, instrument in (\n",
+ " (\"scan geometry\", modis),\n",
+ " (\"frame geometry\", modis_frame),\n",
+ " ):\n",
+ " ends = [\n",
+ " instrument.compute_projected_pixel_position(track, frame, k)\n",
+ " for k in (0, 9)\n",
+ " ]\n",
+ " lengths[label] = (\n",
+ " geodesic_distance(\n",
+ " ends[0].longitude.degrees,\n",
+ " ends[0].latitude.degrees,\n",
+ " ends[1].longitude.degrees,\n",
+ " ends[1].latitude.degrees,\n",
+ " )\n",
+ " / 1e3\n",
+ " * 10\n",
+ " / 9\n",
+ " )\n",
+ " rows.append(\n",
+ " {\n",
+ " \"frame\": frame,\n",
+ " \"scan length (km)\": observed,\n",
+ " \"TAT-C scan geometry length (km)\": lengths[\"scan geometry\"],\n",
+ " \"TAT-C frame geometry length (km)\": lengths[\"frame geometry\"],\n",
+ " }\n",
+ " )\n",
" return rows\n",
"\n",
"\n",
- "pixels = pd.DataFrame([row for rows in Parallel(n_jobs=-1)(delayed(pixel_errors)(g) for g in granules[::4]) for row in rows])\n",
- "position = pixels.dropna(subset=[\"distance (km)\"]).groupby([\"frame\", \"detector\"])[\"distance (km)\"].describe(percentiles=[0.5, 0.95])[[\"count\", \"50%\", \"95%\", \"max\"]]\n",
+ "pixels = pd.DataFrame(\n",
+ " [\n",
+ " row\n",
+ " for rows in Parallel(n_jobs=-1)(delayed(pixel_errors)(g) for g in granules[::4])\n",
+ " for row in rows\n",
+ " ]\n",
+ ")\n",
+ "position = (\n",
+ " pixels.dropna(subset=[\"distance (km)\"])\n",
+ " .groupby([\"frame\", \"detector\"])[\"distance (km)\"]\n",
+ " .describe(percentiles=[0.5, 0.95])[[\"count\", \"50%\", \"95%\", \"max\"]]\n",
+ ")\n",
"print(position.round(2).to_string())\n",
- "lengths = pixels.dropna(subset=[\"scan length (km)\"]).groupby(\"frame\")[[\"scan length (km)\", \"TAT-C scan geometry length (km)\", \"TAT-C frame geometry length (km)\"]].median()\n",
+ "lengths = (\n",
+ " pixels.dropna(subset=[\"scan length (km)\"])\n",
+ " .groupby(\"frame\")[\n",
+ " [\n",
+ " \"scan length (km)\",\n",
+ " \"TAT-C scan geometry length (km)\",\n",
+ " \"TAT-C frame geometry length (km)\",\n",
+ " ]\n",
+ " ]\n",
+ " .median()\n",
+ ")\n",
"lengths[\"ground track advance per scan (km)\"] = 1.477 * 6.75\n",
"lengths.round(2)"
]
@@ -1017,7 +1271,7 @@
"\n",
"## Test 4: Daily Observations\n",
"\n",
- "The points of interest are those of a Fibonacci lattice with a typical spacing of 500 km. For each point and each MODIS pass over it, the observation time is the time of the scan through the point, interpolated between scans from the nearest sampled pixel (within 30 km, excluding the outermost sampled frames). `collect_observations` predicts the observations of the MODIS `PointedInstrument` above with the TLE orbit over the same day."
+ "The points of interest are those of a Fibonacci lattice with a typical spacing of 500 km. For each point and each MODIS pass over it, the observation time is the time of the scan through the point, interpolated between the centers of consecutive scans (midway between their first and last detectors, to which the scan times refer) at the nearest sampled pixel (within 30 km, excluding the outermost sampled frames). `collect_observations` predicts the observations of the MODIS `PointedInstrument` above with the TLE orbit over the same day."
]
},
{
@@ -1026,10 +1280,10 @@
"id": "97737e50",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:37:08.110888Z",
- "iopub.status.busy": "2026-10-08T17:37:08.109888Z",
- "iopub.status.idle": "2026-10-08T17:38:39.339165Z",
- "shell.execute_reply": "2026-10-08T17:38:39.338165Z"
+ "iopub.execute_input": "2026-10-25T15:24:30.059344Z",
+ "iopub.status.busy": "2026-10-25T15:24:30.059344Z",
+ "iopub.status.idle": "2026-10-25T15:25:08.420263Z",
+ "shell.execute_reply": "2026-10-25T15:25:08.420263Z"
}
},
"outputs": [
@@ -1041,9 +1295,9 @@
"points observed by TAT-C 2572.00\n",
"MODIS observations 6826.00\n",
"matched by TAT-C (%) 99.63\n",
- "time difference, median (s) 0.26\n",
- "time difference, 95th percentile (s) 0.70\n",
- "time difference, max (s) 1.19\n",
+ "time difference, median (s) 0.22\n",
+ "time difference, 95th percentile (s) 0.60\n",
+ "time difference, max (s) 0.94\n",
"TAT-C observations 6867.00\n",
"found in MODIS data (%) 99.04\n",
"dtype: float64"
@@ -1056,7 +1310,10 @@
],
"source": [
"lattice = generate_points_fibonacci_lattice(500e3)\n",
- "points = [Point(id=i, latitude=r.geometry.y, longitude=r.geometry.x) for i, r in enumerate(lattice.itertuples())]\n",
+ "points = [\n",
+ " Point(id=i, latitude=r.geometry.y, longitude=r.geometry.x)\n",
+ " for i, r in enumerate(lattice.itertuples())\n",
+ "]\n",
"pixel_xyz, pixel_index = [], []\n",
"for gi, g in enumerate(granules):\n",
" for r in range(0, len(g[\"rows\"]), 2):\n",
@@ -1064,9 +1321,19 @@
" if not g[\"valid\"][scan]:\n",
" continue\n",
" valid = np.isfinite(g[\"latitude\"][r])\n",
- " xyz = wgs84.latlon(g[\"latitude\"][r][valid], g[\"longitude\"][r][valid], g[\"height\"][r][valid]).itrs_xyz.m.T\n",
+ " xyz = wgs84.latlon(\n",
+ " g[\"latitude\"][r][valid], g[\"longitude\"][r][valid], g[\"height\"][r][valid]\n",
+ " ).itrs_xyz.m.T\n",
" pixel_xyz.append(xyz)\n",
- " pixel_index.append(np.column_stack([np.full(valid.sum(), gi), np.full(valid.sum(), scan), np.nonzero(valid)[0]]))\n",
+ " pixel_index.append(\n",
+ " np.column_stack(\n",
+ " [\n",
+ " np.full(valid.sum(), gi),\n",
+ " np.full(valid.sum(), scan),\n",
+ " np.nonzero(valid)[0],\n",
+ " ]\n",
+ " )\n",
+ " )\n",
"pixel_xyz, pixel_index = np.concatenate(pixel_xyz), np.concatenate(pixel_index)\n",
"tree = cKDTree(pixel_xyz)\n",
"reference = []\n",
@@ -1075,35 +1342,78 @@
" nearby = tree.query_ball_point(xyz, 30e3)\n",
" if not nearby:\n",
" continue\n",
- " candidates = pd.DataFrame(pixel_index[nearby], columns=[\"granule\", \"scan\", \"column\"]).assign(distance=np.linalg.norm(pixel_xyz[nearby] - xyz, axis=1))\n",
- " candidates[\"time\"] = [scan_times(granules[g], [s]).utc_datetime()[0] for g, s in zip(candidates.granule, candidates.scan)]\n",
+ " candidates = pd.DataFrame(\n",
+ " pixel_index[nearby], columns=[\"granule\", \"scan\", \"column\"]\n",
+ " ).assign(distance=np.linalg.norm(pixel_xyz[nearby] - xyz, axis=1))\n",
+ " candidates[\"time\"] = [\n",
+ " scan_times(granules[g], [s]).utc_datetime()[0]\n",
+ " for g, s in zip(candidates.granule, candidates.scan)\n",
+ " ]\n",
" candidates = candidates.sort_values(\"time\")\n",
- " for _, group in candidates.groupby((candidates.time.diff().dt.total_seconds() > 600).cumsum()):\n",
+ " for _, group in candidates.groupby(\n",
+ " (candidates.time.diff().dt.total_seconds() > 600).cumsum()\n",
+ " ):\n",
" best = group.loc[group.distance.idxmin()]\n",
" g, s, c = granules[int(best.granule)], int(best.scan), int(best.column)\n",
" if c in (0, len(g[\"frames\"]) - 1):\n",
" continue\n",
" s0, s1 = (s, s + 1) if s + 1 < len(g[\"ev_center_time\"]) else (s - 1, s)\n",
- " x0, x1 = (np.array(wgs84.latlon(g[\"latitude\"][2 * k, c], g[\"longitude\"][2 * k, c]).itrs_xyz.m) for k in (s0, s1))\n",
+ " # the scan centers (midway between the first and last detectors), to which the scan times refer\n",
+ " x0, x1 = (\n",
+ " np.mean(\n",
+ " [\n",
+ " wgs84.latlon(g[\"latitude\"][r, c], g[\"longitude\"][r, c]).itrs_xyz.m\n",
+ " for r in (2 * k, 2 * k + 1)\n",
+ " ],\n",
+ " axis=0,\n",
+ " )\n",
+ " for k in (s0, s1)\n",
+ " )\n",
" fraction = float(np.dot(xyz - x0, x1 - x0) / np.dot(x1 - x0, x1 - x0))\n",
" t0, t1 = (scan_times(g, [k]).utc_datetime()[0] for k in (s0, s1))\n",
- " reference.append({\"point_id\": point.id, \"latitude\": point.latitude, \"time\": pd.Timestamp(t0) + (pd.Timestamp(t1) - pd.Timestamp(t0)) * fraction, \"frame\": int(g[\"frames\"][c])})\n",
+ " reference.append(\n",
+ " {\n",
+ " \"point_id\": point.id,\n",
+ " \"latitude\": point.latitude,\n",
+ " \"time\": pd.Timestamp(t0)\n",
+ " + (pd.Timestamp(t1) - pd.Timestamp(t0)) * fraction,\n",
+ " \"frame\": int(g[\"frames\"][c]),\n",
+ " }\n",
+ " )\n",
"reference = pd.DataFrame(reference)\n",
"\n",
"\n",
"def observe(point):\n",
- " return collect_observations(point, Satellite(name=\"Terra\", orbit=orbit, instruments=[modis]), DAY, DAY + timedelta(days=1)).assign(point_id=point.id)\n",
+ " return collect_observations(point, terra, DAY, DAY + timedelta(days=1)).assign(\n",
+ " point_id=point.id\n",
+ " )\n",
"\n",
"\n",
- "predicted = pd.concat([f for f in Parallel(n_jobs=-1)(delayed(observe)(point) for point in points) if not f.empty])\n",
+ "predicted = pd.concat(\n",
+ " [\n",
+ " f\n",
+ " for f in Parallel(n_jobs=-1)(delayed(observe)(point) for point in points)\n",
+ " if not f.empty\n",
+ " ]\n",
+ ")\n",
"merged = pd.merge_asof(\n",
- " reference.sort_values(\"time\"), predicted[[\"point_id\", \"epoch\"]].sort_values(\"epoch\"),\n",
- " left_on=\"time\", right_on=\"epoch\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=3),\n",
+ " reference.sort_values(\"time\"),\n",
+ " predicted[[\"point_id\", \"epoch\"]].sort_values(\"epoch\"),\n",
+ " left_on=\"time\",\n",
+ " right_on=\"epoch\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=3),\n",
")\n",
"merged[\"difference (s)\"] = (merged.epoch - merged.time).dt.total_seconds()\n",
"found = pd.merge_asof(\n",
- " predicted.sort_values(\"epoch\"), reference[[\"point_id\", \"time\"]].sort_values(\"time\"),\n",
- " left_on=\"epoch\", right_on=\"time\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=3),\n",
+ " predicted.sort_values(\"epoch\"),\n",
+ " reference[[\"point_id\", \"time\"]].sort_values(\"time\"),\n",
+ " left_on=\"epoch\",\n",
+ " right_on=\"time\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=3),\n",
")\n",
"covered = reference.point_id.nunique()\n",
"pd.Series(\n",
@@ -1114,7 +1424,9 @@
" \"MODIS observations\": len(reference),\n",
" \"matched by TAT-C (%)\": 100 * merged.epoch.notna().mean(),\n",
" \"time difference, median (s)\": merged[\"difference (s)\"].abs().median(),\n",
- " \"time difference, 95th percentile (s)\": merged[\"difference (s)\"].abs().quantile(0.95),\n",
+ " \"time difference, 95th percentile (s)\": merged[\"difference (s)\"]\n",
+ " .abs()\n",
+ " .quantile(0.95),\n",
" \"time difference, max (s)\": merged[\"difference (s)\"].abs().max(),\n",
" \"TAT-C observations\": len(predicted),\n",
" \"found in MODIS data (%)\": 100 * found.time.notna().mean(),\n",
@@ -1127,16 +1439,16 @@
"id": "c6797454",
"metadata": {},
"source": [
- "`collect_observations` predicts MODIS's observations: 99.6% of the 6,826 passes over the points are matched by a predicted observation, within 0.26 s (median) and 1.2 s (maximum), and 99.0% of the predicted observations are found in the MODIS data. The remaining differences are at the swath edges, where the sampled pixels are sparse, and at the ends of the day. MODIS observes 99% of the points in a day (2,568 of 2,598); the others lie in the gaps between adjacent swaths near the equator, which TAT-C also predicts (2,572 points observed).\n",
+ "`collect_observations` predicts MODIS's observations: 99.6% of the 6,826 passes over the points are matched by a predicted observation, within 0.22 s (median) and 0.94 s (maximum), and 99.0% of the predicted observations are found in the MODIS data. The remaining differences are at the swath edges, where the sampled pixels are sparse, and at the ends of the day. MODIS observes 99% of the points in a day (2,568 of 2,598); the others lie in the gaps between adjacent swaths near the equator, which TAT-C also predicts (2,572 points observed).\n",
"\n",
"## Summary\n",
"\n",
"| Test | Result |\n",
"| --- | --- |\n",
- "| 1. Orbit (TLE) | 7.6 km along track (1.1 s) two days before the TLE epoch; within 0.35 km across track and radially |\n",
+ "| 1. Orbit (TLE) | within 1.0 km along track (95th percentile) two days before the TLE epoch; within 0.35 km across track and radially |\n",
"| 2. Local time drift | a single TLE reproduces the current drift (39.5 vs. 37.3 minutes per year) and local times within 0.3 minutes over three months, but departs by 4.4 minutes after one year and an hour after four years, as SGP4 keeps the inclination constant |\n",
- "| 3. Scan geometry (`ViewGeometry.SCAN`, `VelocityFrame.INERTIAL`) | scan angles 0.0812 deg per frame; scans perpendicular to the inertial velocity; constant along-track extent (0.731 deg between the first and last detectors); pixels within 1.5 km at nadir and 3 to 5 km at the edges; scan footprints 9.9 km long at nadir and 19.8 km at the edges (19.9 km observed) |\n",
- "| 4. Daily observations (`collect_observations`) | 99.6% of passes matched, within 0.26 s (median); 99.0% of predicted observations found |\n",
+ "| 3. Scan geometry (`ViewGeometry.SCAN`, inertial `Attitude`) | scan angles 0.0812 deg per frame; scans perpendicular to the inertial velocity; constant along-track extent (0.731 deg between the first and last detectors); pixels within 1.5 km at nadir and 3 to 5 km at the edges; scan footprints 9.9 km long at nadir and 19.8 km at the edges (19.9 km observed) |\n",
+ "| 4. Daily observations (`collect_observations`) | 99.6% of passes matched, within 0.22 s (median); 99.0% of predicted observations found |\n",
"\n",
"**Scan geometry.** A `PointedInstrument` in scan geometry with the inertial velocity frame reproduces MODIS's scans, including their growth along track toward the swath edges, confirming the VIIRS validation for a second scanner and a spacecraft without yaw steering.\n",
"\n",
diff --git a/docs/validation/ValidateFeaturesTCPRIMED.ipynb b/docs/validation/ValidateFeaturesTCPRIMED.ipynb
new file mode 100644
index 00000000..cb972541
--- /dev/null
+++ b/docs/validation/ValidateFeaturesTCPRIMED.ipynb
@@ -0,0 +1,2862 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "42c03d4d",
+ "metadata": {},
+ "source": [
+ "# Feature Observation Validation: Tropical Cyclone Overpasses (TC PRIMED)\n",
+ "\n",
+ "This notebook validates TAT-C's feature observations against an archive of real satellite observations of storms: the [Tropical Cyclone PRecipitation, Infrared, Microwave, and Environmental Dataset (TC PRIMED)](https://rammb-data.cira.colostate.edu/tcprimed/), compiled by the Cooperative Institute for Research in the Atmosphere (CIRA) at Colorado State University.\n",
+ "\n",
+ "For every tropical cyclone, TC PRIMED collects the overpasses that cover enough of the storm from the passive microwave imagers and sounders of the Global Precipitation Measurement (GPM) constellation. Whether an overpass is kept is a geometric decision: it depends on how much of a circle around the storm's center the swath covers.\n",
+ "\n",
+ "In TAT-C, `collect_feature_observations` collects observations of *features*: regions that exist for a period of time, such as the storms of a nature run in an observing system simulation experiment (OSSE; see the [hurricane OSSE example](../examples/RunOSSEHurricane.ipynb)). Each observation is one satellite's view of the part of a feature inside its swath, together with the fraction of the feature's area viewed.\n",
+ "\n",
+ "Here, the features are TC PRIMED's circles around each storm, at its best-track position. TAT-C reproduces TC PRIMED's selection of overpasses for the 13 Atlantic tropical cyclones of 2025, by 10 satellites carrying five sensors:\n",
+ "* **Cross-track sounders:** ATMS on Suomi NPP, NOAA-20, and NOAA-21, and MHS on Metop-B and Metop-C.\n",
+ "* **Conical imagers:** AMSR2 on GCOM-W1, GMI on GPM, and SSMIS on DMSP F16, F17, and F18.\n",
+ "\n",
+ "The comparison asks four questions:\n",
+ "\n",
+ "1. **Swaths.** Which geometry (scan angles, cone angles, scan sectors, and velocity frames) reproduces the swath of each sensor in TC PRIMED's geolocation?\n",
+ "2. **Overpasses.** Does TAT-C predict the overpasses TC PRIMED contains, and which does it predict that TC PRIMED does not contain?\n",
+ "3. **Coverage.** Does the fraction of the storm's circle in TAT-C's swath match the coverage TC PRIMED reports?\n",
+ "4. **Sampling of storms.** How often does the constellation observe a storm, as predicted by TAT-C and as archived?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e91db82c",
+ "metadata": {},
+ "source": [
+ "## Reference Data\n",
+ "\n",
+ "TC PRIMED is distributed through the [NOAA Open Data Dissemination](https://www.noaa.gov/nodd) program on AWS ([`noaa-nesdis-tcprimed-pds`](https://registry.opendata.aws/noaa-nesdis-tcprimed-pds/)) and requires no account. This notebook uses the final version (v01r01) of the 2025 North Atlantic season. Each storm has two kinds of file:\n",
+ "\n",
+ "* **One environmental file**, whose metadata groups give the storm's best track every 6 hours (`storm_metadata`), and the time, sensor, platform, and coverage of each of its overpasses (`overpass_metadata` and `overpass_storm_metadata`).\n",
+ "* **One overpass file per overpass**, whose `passive_microwave/S1` group gives the geolocation of the swath used to select the overpass.\n",
+ "\n",
+ "The environmental files also contain large reanalysis fields, so only their metadata groups are read, with HTTP range requests. Test 1 also reads the S1 geolocation of a few overpass files per platform, and of every GPM overpass.\n",
+ "\n",
+ "The selection rule is documented in the [TC PRIMED documentation](https://rammb-data.cira.colostate.edu/tcprimed/TCPRIMED_v01r01_documentation.pdf) (Section 2.2):\n",
+ "\n",
+ "* The storm's center is interpolated from the best track to the time of the observation with a cubic B-spline.\n",
+ "* An overpass is kept if its S1 swath (the region enclosed by the swath's sample centers) covers at least 47.9% of a circle of 750 km radius around that center, or otherwise at least 43.6% of a circle of 250 km radius. Both thresholds correspond to a straight swath edge 25 km beyond the storm's center.\n",
+ "* The coverage of the 750 km circle is reported for each overpass (`coverage_fraction`).\n",
+ "* The time of an overpass is the midpoint of the part of the satellite's orbit (granule) within 20 deg of latitude and longitude of the storm.\n",
+ "\n",
+ "**Element sets.** The satellites' orbits are modeled with the history of their two-line element sets from [Space-Track.org](https://www.space-track.org/), which requires a free account and does not allow the data to be redistributed. To set this up:\n",
+ "\n",
+ "1. Download the element sets of the 10 satellites (NORAD catalog numbers 37849, 43013, 54234, 38771, 43689, 38337, 39574, 28054, 29522, and 35951) with epochs from 15 June to 8 November 2025, in three-line format. For example, use the query `https://www.space-track.org/basicspacedata/query/class/gp_history/NORAD_CAT_ID/37849,43013,54234,38337,39574,38771,43689,28054,29522,35951/EPOCH/2025-06-15--2025-11-08/orderby/NORAD_CAT_ID,EPOCH/format/3le`.\n",
+ "2. Save them as `data/orbits/tcprimed_2025_gp_history.tle`.\n",
+ "\n",
+ "TAT-C propagates each time from the element set nearest to it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3139a3ae",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T15:58:18.146819Z",
+ "iopub.status.busy": "2026-10-25T15:58:18.145819Z",
+ "iopub.status.idle": "2026-10-25T15:58:18.783841Z",
+ "shell.execute_reply": "2026-10-25T15:58:18.783841Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ " storm platform TC PRIMED time TC PRIMED coverage (%) \\\n",
+ "160 AL042025 F17 2025-08-11 19:18:10+00:00 34.6 \n",
+ "203 AL042025 METOPB 2025-08-02 15:00:49+00:00 77.5 \n",
+ "357 AL052025 F17 2025-08-15 21:36:27+00:00 66.4 \n",
+ "597 AL052025 NPP 2025-08-12 16:27:54+00:00 44.4 \n",
+ "630 AL052025 NPP 2025-08-26 13:57:27+00:00 83.7 \n",
+ "982 AL092025 F18 2025-09-30 09:58:47+00:00 41.3 \n",
+ "\n",
+ " TAT-C coverage (%) \n",
+ "160 71.5 \n",
+ "203 69.2 \n",
+ "357 96.3 \n",
+ "597 60.2 \n",
+ "630 100.0 \n",
+ "982 73.0 "
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "outliers = matched[matched[\"coverage difference\"].abs() > 5]\n",
+ "outliers[\n",
+ " [\n",
+ " \"storm\",\n",
+ " \"platform\",\n",
+ " \"TC PRIMED time\",\n",
+ " \"TC PRIMED coverage (%)\",\n",
+ " \"TAT-C coverage (%)\",\n",
+ " ]\n",
+ "].round(1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0a82225f",
+ "metadata": {},
+ "source": [
+ "TAT-C's coverage matches TC PRIMED's to within a fraction of a percentage point:\n",
+ "* the median difference is within 0.2 points for every sensor; and\n",
+ "* 90% of the overpasses (5th to 95th percentile) differ by -1.3 to +1.7 points, with the largest spread for GMI.\n",
+ "\n",
+ "Six overpasses differ by more than 5 points, and in all six TC PRIMED reports less coverage than TAT-C. TC PRIMED computes coverage from the swath it retains, which excludes scans and samples with missing geolocation (fill values; Section 2.2.2 of its documentation). An incomplete swath covers less of the circle than the full swath that TAT-C predicts. Three of these six overpasses are in TC PRIMED only through the 250 km criterion.\n",
+ "\n",
+ "### Observation Times\n",
+ "\n",
+ "The two sources define the time of an overpass differently:\n",
+ "* **TAT-C:** the time of the footprint that views most of the 750 km circle.\n",
+ "* **TC PRIMED:** the midpoint of the part of the granule within 20 deg of latitude and longitude of the storm.\n",
+ "\n",
+ "These definitions need not coincide, so the times are compared only as a check."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "4d5828ff",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T15:59:21.208130Z",
+ "iopub.status.busy": "2026-10-25T15:59:21.208130Z",
+ "iopub.status.idle": "2026-10-25T15:59:21.224151Z",
+ "shell.execute_reply": "2026-10-25T15:59:21.224151Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
n
\n",
+ "
median
\n",
+ "
5th percentile
\n",
+ "
95th percentile
\n",
+ "
max |x|
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
NPP
\n",
+ "
206.0
\n",
+ "
1.0
\n",
+ "
-24.0
\n",
+ "
30.8
\n",
+ "
94.0
\n",
+ "
\n",
+ "
\n",
+ "
NOAA20
\n",
+ "
213.0
\n",
+ "
3.0
\n",
+ "
-27.2
\n",
+ "
25.0
\n",
+ "
67.0
\n",
+ "
\n",
+ "
\n",
+ "
NOAA21
\n",
+ "
209.0
\n",
+ "
3.0
\n",
+ "
-23.0
\n",
+ "
24.6
\n",
+ "
64.0
\n",
+ "
\n",
+ "
\n",
+ "
METOPB
\n",
+ "
174.0
\n",
+ "
0.0
\n",
+ "
-30.0
\n",
+ "
27.0
\n",
+ "
43.0
\n",
+ "
\n",
+ "
\n",
+ "
METOPC
\n",
+ "
182.0
\n",
+ "
2.0
\n",
+ "
-29.0
\n",
+ "
27.9
\n",
+ "
64.0
\n",
+ "
\n",
+ "
\n",
+ "
GCOMW1
\n",
+ "
137.0
\n",
+ "
-30.0
\n",
+ "
-72.0
\n",
+ "
18.0
\n",
+ "
89.0
\n",
+ "
\n",
+ "
\n",
+ "
GPM
\n",
+ "
101.0
\n",
+ "
2.0
\n",
+ "
-78.0
\n",
+ "
68.0
\n",
+ "
126.0
\n",
+ "
\n",
+ "
\n",
+ "
F16
\n",
+ "
66.0
\n",
+ "
-31.0
\n",
+ "
-65.8
\n",
+ "
2.0
\n",
+ "
75.0
\n",
+ "
\n",
+ "
\n",
+ "
F17
\n",
+ "
76.0
\n",
+ "
-33.5
\n",
+ "
-89.5
\n",
+ "
0.8
\n",
+ "
220.0
\n",
+ "
\n",
+ "
\n",
+ "
F18
\n",
+ "
69.0
\n",
+ "
-27.0
\n",
+ "
-89.6
\n",
+ "
9.2
\n",
+ "
247.0
\n",
+ "
\n",
+ "
\n",
+ "
GPM, forward
\n",
+ "
52.0
\n",
+ "
-8.5
\n",
+ "
-57.7
\n",
+ "
89.3
\n",
+ "
126.0
\n",
+ "
\n",
+ "
\n",
+ "
GPM, backward
\n",
+ "
49.0
\n",
+ "
8.0
\n",
+ "
-78.6
\n",
+ "
56.8
\n",
+ "
85.0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " n median 5th percentile 95th percentile max |x|\n",
+ "NPP 206.0 1.0 -24.0 30.8 94.0\n",
+ "NOAA20 213.0 3.0 -27.2 25.0 67.0\n",
+ "NOAA21 209.0 3.0 -23.0 24.6 64.0\n",
+ "METOPB 174.0 0.0 -30.0 27.0 43.0\n",
+ "METOPC 182.0 2.0 -29.0 27.9 64.0\n",
+ "GCOMW1 137.0 -30.0 -72.0 18.0 89.0\n",
+ "GPM 101.0 2.0 -78.0 68.0 126.0\n",
+ "F16 66.0 -31.0 -65.8 2.0 75.0\n",
+ "F17 76.0 -33.5 -89.5 0.8 220.0\n",
+ "F18 69.0 -27.0 -89.6 9.2 247.0\n",
+ "GPM, forward 52.0 -8.5 -57.7 89.3 126.0\n",
+ "GPM, backward 49.0 8.0 -78.6 56.8 85.0"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "matched[\"time difference (s)\"] = (\n",
+ " matched[\"TAT-C time\"] - matched[\"TC PRIMED time\"]\n",
+ ").dt.total_seconds()\n",
+ "times3 = {\n",
+ " platform: summarize(g[\"time difference (s)\"])\n",
+ " for platform, g in matched.groupby(\"platform\")\n",
+ "}\n",
+ "# GPM's overpasses by its orientation (from the attitude schedule)\n",
+ "gpm_overpasses = matched[matched.platform == \"GPM\"]\n",
+ "backward = np.array(\n",
+ " [\n",
+ " gpm_attitude.get_attitude(t.to_pydatetime()).yaw_angle == 180\n",
+ " for t in gpm_overpasses[\"TC PRIMED time\"]\n",
+ " ]\n",
+ ")\n",
+ "times3[\"GPM, forward\"] = summarize(gpm_overpasses[\"time difference (s)\"][~backward])\n",
+ "times3[\"GPM, backward\"] = summarize(gpm_overpasses[\"time difference (s)\"][backward])\n",
+ "pd.DataFrame(times3).T.loc[[*PLATFORMS.index, \"GPM, forward\", \"GPM, backward\"]].round(1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "566bc64a",
+ "metadata": {},
+ "source": [
+ "**Cross-track sounders.** The two times agree within 3 s (median) and 31 s (95th percentile). TC PRIMED's times are given to the nearest second.\n",
+ "\n",
+ "**AMSR2 and SSMIS.** TAT-C's times are about 30 s earlier (median). Their arcs lie 850 to 900 km ahead of nadir at the center of the scan, but much less at its ends. The part of a granule within 20 deg of the storm ends when the arc's ends leave that region, so its midpoint is later than the time at which the arc's center sweeps across the storm.\n",
+ "\n",
+ "**GMI.** GMI's arc is closer to nadir (about 520 km). Its median offset is -8.5 s when GPM flies forward and +8 s when it flies backward, when the arc trails nadir. Modeled as always flying forward, GPM's backward passes would be predicted about 2 minutes early: the arc would be about 1,040 km (about 140 s of flight) from where it really is. With the attitude schedule, the median offset of all of GPM's passes is 2 s.\n",
+ "\n",
+ "The largest offsets (up to 4 minutes, for SSMIS) are again overpasses with incomplete swaths.\n",
+ "\n",
+ "## Test 4: Sampling of Storms\n",
+ "\n",
+ "An OSSE asks how often an observing system observes a feature. For each storm, the time between consecutive overpasses that meet TC PRIMED's criteria (by any of the 10 satellites) is compared three ways: as archived in TC PRIMED, as predicted by TAT-C, and as predicted without the three SSMIS. The overpasses of Hurricane Melissa (AL13), the strongest storm of the season, are shown as an example."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "4eba5e78",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T15:59:21.226322Z",
+ "iopub.status.busy": "2026-10-25T15:59:21.226322Z",
+ "iopub.status.idle": "2026-10-25T15:59:21.404802Z",
+ "shell.execute_reply": "2026-10-25T15:59:21.404297Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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+flhy5YtGD16dJnP8fLyQqNGjSqz2di4cSNSU1ORkpICCwsLeVqNGjXw1VdfYciQIVrPUSqVFR6dYsrsbSyAvP99F9jI4JrILSiFg1LsnKIwhXqJ1vdEy6NJtHyi5dFFxNeBo60FRgbXNHYMnUSsFz0+U3itisQUXgeiZRS9j7FehjF2vUSuj8jZKsusBkE0NWvWDLt27Spzvo2NDRo2bIjc3Fyd86OjozFhwgSsWrWq0hnq168Pe3v7MtdRFR48eAALCwsoFAp5mupxaWlpOc+svhyUFijNgzAfDGWJ6uRm7AgmxRTqJVrfEy2PJtHyiZZHFxFfB45KSyFzAWLWix6fKbxWRWIKrwPRMorex1gvwxi7XiLXR+RslWUWgyC3b99GREQEoqOj0apVKzg5OeH06dNYunQp+vXrB+DhnVs2b96MIUOGwM/PD5IkYc+ePfj666+RkJCgc7njxo1DREQEXF1d9coxb948PHjwAL169YKvry+ys7PxySefoKioCGFhYZXevuvXryMrKwvXr19HSUmJfERKo0aN4OjoiLCwMEyfPh0TJ07E5MmTUVpaivfeew9WVlYIDQ2t9HqJiIiIiIiITIlZDII4OjqiXbt2WLZsGX7//XcUFRXB29sb48aNw8yZMwE8PCrE3t4e06ZNw19//QWlUonGjRtjzZo1GDFihM7lWllZwd3dXe8cISEh+OyzzzBy5EjcvHkTNWrUQEBAAA4cOIAmTZpUevvmzJmjdrpOQEAAAODw4cPo3LkzmjZtij179mD+/PkICgqChYUFAgICsH//foOuLUJERERERERkysxiEESpVCI2NhaxsbFltmnQoAG++OKLcpdTv379cm+f27p1a7X5mu1DQ0MrdeRFRbfsTUxMRGJiYrltVNdCISIiIiIiIjJX1efEHiIiIiIiIiKicnAQhIiIiIiIiIjMAgdBiIiIiIiIiMgsmMU1QYg02XUdhtL8XFjYOhg7CpkZ0fqeaHk0iZZPtDyiY73IWNj36EljHzMM61U+kesjcrbKUkgVXXWTCEBOTg5cXFxw9+5dODs7P7H1ZGbcgIdnnSe2fCIV9jV6GtjP6GlgP6OnhX2Nngb2M8OxZobh6TBEREREREREZBY4CEJEREREREREZoGDIERERERERERkFjgIQkRERERERERmgYMgRERERERERGQWeItconIk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h3PnzgEAWrdurfe2ExEREREREZkyowyCxMXFoVu3blp/3AMPr9uxePFinDlzBoGBgQYtt7xrVTg6OqJdu3ZYtmwZfv/9dxQVFcHb2xvjxo3DzJkzDVrP9OnTsWrVKuTn56tN//jjj9GqVSusWrVKvoNLYGAgdu3ahT59+gB4uO3NmjXTGgABgP79++PVV1/Fnj17kJCQoFeNdu/ejczMTGzYsEHt6BBfX1+kpqbKj3v16oU///xTfhwQEADg4ek1RERERERERObAKIMge/bsKXNeYGCg1h/mZf2hnpiYWO56du3aJf+sVCoRGxuL2NhYvXMCwLx58zBv3jy1aU5OTsjMzNTZPjo6GtHR0WUub8WKFWXO8/DwQHFxMQDg5ZdfLrPdozUKDAzUyqfLowMiREREREREROao+p7oQ0RERERERET0CA6CEBEREREREZFZ4CAIEREREREREZkFo1wThOhpsOs6DKX5ubCwdTB2FADi5dGFGasf0eslWj7R8ugiWkbR8mgSLZ9oeTSJng9gxsoQLY8m0fKJlkeTaPlEy6PJmPl0rZv1Mj6FxNuDkB5ycnLg4uKCu3fvlnsXnseVmXEDHp51ntjyiVTY1+hpYD+jp4H9jJ4W9jV6GtjPDMeaGYanwxARERERERGRWeAgCBERERERERGZBQ6CEBEREREREZFZ4CAIEREREREREZkFDoIQERERERERkVngLXKp2kk8ehu5BaVwUFogqpObsePoJHpG0fKJlkcXkTKKlKUsppBRJKZQL2Y03SxlES2jaHk0iZZPtDyaRMsnWh5NouUTLY8mEfOJmElF5GxPAgdBqNpZl5yFmznFqOVsJeyLWPSMouUTLY8uImUUKUtZTCGjSEyhXsxoulnKIlpG0fJoEi2faHk0iZZPtDyaRMsnWh5NIuYTMZOKyNmeBJ4OQ0RERERERERmgYMgRERERERERGQWOAhCRERERERERGaBgyBEREREREREZBaMPghy7NgxWFpaomfPnvK0qKgoKBSKcr8ebffKK69oLXfChAlQKBSIioqSp2VkZGD8+PHw8fGBUqmEl5cXevTogZSUlDLzzZs3T+c6zp07B4VCgdTUVLXpa9euRdu2beHg4AAnJye88MIL2Lt3r85l//3337CxsUHTpk0NrpHK+fPnMXToUHh7e8POzg7+/v5Yvny5Vruff/4Z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gI2NDTp37gx3d/dnNkB+bWyUZlp/GptseWqSLZ9seWqSPV81mXLKlKUusmeULZ9seWqSLZ9seXSRLaNseWqSPR8gV0aZstRF9owy5pMxUzX1b1vDVmlutPllPje6shn7fDU1k7sS5Ntvv0VJSQkmT55c611g3njjDURHR2uu6qgvc3NzZGVlaT6u6fbt2xgzZgxCQkLQq1cvtGjRAmfPnsXKlSsRHBxc73natWuH8PBwrFq1qkH5iIiIiIiIiMgErwSJjo7GsGHDajVAgKf37UhPT0dqamqDj2tnZ1fnvTJsbW3x6quvYu3atRg0aBC8vLywePFihIaG4pNPPmnQPHPnzoWtrW2D8xERERERERGZOpO7EuTAgQN17vP29oYQQmtbzc+rxcTEPHOeffv2aT5WKpX46KOP8NFHH9U7JwBERkYiMjJSa1uLFi1QXFysta1Dhw515qz2vLxEREREREREv3YmdyUIEREREREREZkmNkGIiIiIiIiIyCSwCUJEREREREREJsHk7glCpkc1dDyelN+HmZWNsaMAkC9PTbLlky1PTbLnqyZTTpmy1EX2jLLlky1PTbLlky2PLrJllC1PTbLnA+TKKFOWusieUcZ8Mmb6JWPmk/nc1JVN5swvSiGed0dNIgBlZWVo2bIl7t69W+e74OhD8a2baNPWpcmOT1SNtUaGwDojQ2CdkaGw1sgQWGcNx3PWMHw5DBERERERERGZBDZBiIiIiIiIiMgksAlCRERERERERCaBTRAiIiIiIiIiMgl8dxiql+r755aVlTXpPPfu3YPSqmnnIAJYa2QYrDMyBNYZGQprjQyBddZwPGfaWrRoAYVCUed+NkGoXu7duwcAcHNzM3ISIiIiIiIiIt2e946mfItcqpcnT57g5s2bz+2qvYiysjK4ubmhoKCgSd+Gl4i1RobAOiNDYJ2RobDWyBBYZw3Hc1YbrwQhvTAzM4Orq6tB5rKzs+NfYDII1hoZAuuMDIF1RobCWiNDYJ01HM9Z/fHGqERERERERERkEtgEISIiIiIiIiKTwCYISUOpVGLJkiVQKpXGjkK/cqw1MgTWGRkC64wMhbVGhsA6azies4bjjVGJiIiIiIiIyCTwShAiIiIiIiIiMglsghARERERERGRSWAThIiIiIiIiIhMApsgRERERERERGQS2AShRisoKMDkyZPh4uIC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aMydO7femTZt2oTHjx9jwIAB2LNnD3Jzc5GVlYX169fD19e33sepboAEBAQgPDwcRUVFKCoqQnFxsWbM+PHjoVQqoVarcfHiRSQmJmLZsmWad4YBnjZAJk6ciNWrV8PHx0dznF9e9fLBBx/g0KFDuHLlCtLT0zF58mSkp6djypQpWpmOHz+O4cOH13sNRERETYlNECIiIjIp1tbWSE5Oxssvv4w//elP8PDwQEhICB4+fPjMl7CEhYUhPj5e87IaAOjQoQOOHz+OvLw8DB8+HP3790dMTAxiYmIwZsyYemd65ZVXkJqaCn9/f8yePRteXl4ICAjA4cOHsXnzZs04tVqNIUOG1Hmcr776CsXFxYiNjYWzs7Pm0b9/f82Yli1b4ocffsD169fRr18/TJ06FeHh4QgPD9eM+fTTT1FVVYVp06ZpHWfGjBmaMaWlpQgLC4OHhweGDx+OGzduIDk5GQMGDNCMKS8vR2JiIkJDQ+t9LoiIiJqSQlTfCYuIiIiI6iSEgI+PD2bOnIlx48YZJcOQIUMwZMgQREZGGmX+htq4cSP279+PpKQkY0chIiICwCtBiIiIiOpFoVBg69atqKqqMsr89+7dQ15eHubMmWOU+RvDwsICGzZsMHYMIiIiDV4JQkREREREREQmgVeCEBEREREREZFJYBOEiIiIiIiIiEwCmyBEREREREREZBLYBCEiIiIiIiIik8AmCBERERERERGZBDZBiIiIiIiIiMgksAlCRERERERERCaBTRAiIiIiIiIiMglsghARERERERGRSWAThIiIiIiIiIhMwv8Bgr29QOfMwvMAAAAASUVORK5CYII=",
+ "text/plain": [
+ "
"
+ ],
+ "text/plain": [
+ " gaps median (h) 5th percentile (h) \\\n",
+ "TC PRIMED (archived overpasses) 1420.0 0.84 0.13 \n",
+ "TAT-C (all satellites) 1678.0 0.83 0.12 \n",
+ "TAT-C (without SSMIS) 1224.0 0.82 0.10 \n",
+ "\n",
+ " 95th percentile (h) max |x| (h) \n",
+ "TC PRIMED (archived overpasses) 4.72 7.65 \n",
+ "TAT-C (all satellites) 3.85 5.67 \n",
+ "TAT-C (without SSMIS) 6.85 8.45 "
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "STORM = \"AL132025\"\n",
+ "storm_name = \"Melissa\"\n",
+ "fig, ax = plt.subplots(figsize=(11, 3.8))\n",
+ "for k, platform in enumerate(PLATFORMS.index):\n",
+ " tatc = included[(included.storm == STORM) & (included.platform == platform)]\n",
+ " archived = matched[(matched.storm == STORM) & (matched.platform == platform)]\n",
+ " ax.plot(\n",
+ " tatc[\"pass\"],\n",
+ " np.full(len(tatc), k + 0.15),\n",
+ " \"|\",\n",
+ " ms=9,\n",
+ " mew=2,\n",
+ " color=BLUE,\n",
+ " label=\"TAT-C\" if k == 0 else None,\n",
+ " )\n",
+ " ax.plot(\n",
+ " archived[\"TC PRIMED time\"],\n",
+ " np.full(len(archived), k - 0.15),\n",
+ " \"|\",\n",
+ " ms=9,\n",
+ " mew=2,\n",
+ " color=ORANGE,\n",
+ " label=\"TC PRIMED\" if k == 0 else None,\n",
+ " )\n",
+ "ax.set_yticks(\n",
+ " range(len(PLATFORMS)), [f\"{PLATFORMS.sensor[p]} {p}\" for p in PLATFORMS.index]\n",
+ ")\n",
+ "ax.set(\n",
+ " title=f\"Overpasses of {storm_name} ({STORM}) meeting the coverage criteria\",\n",
+ " xlabel=\"Time (UTC, 2025)\",\n",
+ ")\n",
+ "ax.xaxis.set_major_formatter(mdates.DateFormatter(\"%b %d\"))\n",
+ "ax.legend(\n",
+ " frameon=False, fontsize=8, ncols=2, loc=\"upper right\", bbox_to_anchor=(1, 1.12)\n",
+ ")\n",
+ "fig.tight_layout()\n",
+ "plt.show()\n",
+ "\n",
+ "\n",
+ "def gaps(times_by_storm):\n",
+ " \"\"\"Hours between consecutive overpasses of each storm (by any of the satellites).\"\"\"\n",
+ " return np.concatenate(\n",
+ " [\n",
+ " np.diff(np.sort(t.to_numpy())).astype(\"timedelta64[s]\").astype(float) / 3600\n",
+ " for t in times_by_storm\n",
+ " ]\n",
+ " )\n",
+ "\n",
+ "\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " \"TC PRIMED (archived overpasses)\": summarize(\n",
+ " gaps([g[\"TC PRIMED time\"] for _, g in matched.groupby(\"storm\")])\n",
+ " ),\n",
+ " \"TAT-C (all satellites)\": summarize(\n",
+ " gaps([g[\"pass\"] for _, g in included.groupby(\"storm\")])\n",
+ " ),\n",
+ " \"TAT-C (without SSMIS)\": summarize(\n",
+ " gaps(\n",
+ " [\n",
+ " g[\"pass\"]\n",
+ " for _, g in included[\n",
+ " ~included.platform.str.startswith(\"F\")\n",
+ " ].groupby(\"storm\")\n",
+ " ]\n",
+ " )\n",
+ " ),\n",
+ " }\n",
+ ").T.rename(columns=lambda c: f\"{c} (h)\" if c != \"n\" else \"gaps\").round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8c762448",
+ "metadata": {},
+ "source": [
+ "The constellation observes a storm about every 50 minutes (a median gap of 0.83 h), whether archived or predicted. The longest gaps differ:\n",
+ "\n",
+ "| Overpasses | 95th percentile of the gaps | Longest gap |\n",
+ "| --- | --- | --- |\n",
+ "| Predicted by TAT-C, all 10 satellites | 3.9 h | 5.7 h |\n",
+ "| Archived in TC PRIMED (many SSMIS overpasses missing) | 4.7 h | 7.7 h |\n",
+ "| Predicted by TAT-C, without SSMIS | 6.9 h | 8.5 h |\n",
+ "\n",
+ "The three DMSP satellites, in different orbit planes from the other seven, fill the longest gaps between their passes. The gaps in the archive therefore follow from the availability of data, not from the constellation's geometry.\n",
+ "\n",
+ "## Summary\n",
+ "\n",
+ "| Test | Result |\n",
+ "| --- | --- |\n",
+ "| 1. Swaths | ATMS +/-52.7 deg (inertial frame) and MHS +/-49.4 deg (Earth-fixed, as Metop is yaw steered); AMSR2, GMI, and SSMIS cones of 47.6, 48.5, and 45.3 to 45.7 deg over sectors of +/-75.0, +/-75.7, and +/-70.8 deg (inertial); GPM flies backward in two of four periods, modeled with an `AttitudeSchedule` |\n",
+ "| 2. Overpasses (`collect_feature_observations`) | all 1,433 TC PRIMED overpasses predicted; 94% to 100% of the predicted passes are in TC PRIMED for the non-SSMIS sensors (12 passes missing from TC PRIMED are within 0.05 of a threshold, a few others fall in data gaps), and 43% to 49% for SSMIS (data availability) |\n",
+ "| 3. Coverage (`viewed_fraction`) | median difference within 0.2 percentage points for every sensor; 5th to 95th percentile -1.3 to +1.7 points; larger differences only where TC PRIMED's swath is incomplete; observation times within 3 s (median) for cross-track sounders, and 30 s apart for conical scanners from the definitions of time |\n",
+ "| 4. Sampling of storms | median gap between overpasses 0.83 h predicted and 0.84 h archived; longest gap 5.7 h predicted and 7.7 h archived (missing SSMIS data) |\n",
+ "\n",
+ "**Feature observations.** With features that exist for a period of time (a storm's circle during a pass), `collect_feature_observations` reproduces a real archive's selection of overpasses one by one, and its coverage to a fraction of a percent. It does so for five sensors on 10 satellites over a season, from public element sets and swath geometry measured from the archive itself. TAT-C can therefore predict how constellations, including planned sensors, would observe storms in an OSSE.\n",
+ "\n",
+ "**Capability and archives.** Most passes that TAT-C predicts but the archive lacks fall in gaps in the data, notably for SSMIS. TAT-C predicts what a constellation can observe, which an archive undercounts wherever data are missing. Comparing the two identifies the gaps.\n",
+ "\n",
+ "**Attitude.** The swaths depend on each spacecraft's attitude: the inertial velocity frame for the satellites that are not yaw steered, the Earth-fixed frame for Metop, and GPM's yaw flips. The flips are recovered from the observations and modeled with an `AttitudeSchedule`, which moves GMI's observation times by about 2 minutes in the periods when GPM flies backward.\n",
+ "\n",
+ "**Limitations.** TAT-C predicts complete swaths; missing scans or samples reduce the coverage of a few archived overpasses. The element sets are a public history with about 3.6 element sets per day per satellite. A storm's circle is centered at its position at the closest approach, which is within a few kilometers of its position at TC PRIMED's time of observation."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/validation/ValidateGeostationaryGOES.ipynb b/docs/validation/ValidateGeostationaryGOES.ipynb
index 6a2595ef..5fe262f5 100644
--- a/docs/validation/ValidateGeostationaryGOES.ipynb
+++ b/docs/validation/ValidateGeostationaryGOES.ipynb
@@ -135,8 +135,14 @@
"def download(product):\n",
" \"\"\"Download the first full-disk file of a product starting in the hour of TIME.\"\"\"\n",
" prefix = f\"{product}/{TIME:%Y}/{TIME.timetuple().tm_yday:03d}/{TIME:%H}/\"\n",
- " root = ET.fromstring(requests.get(BUCKET, params={\"list-type\": \"2\", \"prefix\": prefix}, timeout=120).content)\n",
- " key = root.find(\"{http://s3.amazonaws.com/doc/2006-03-01/}Contents/{http://s3.amazonaws.com/doc/2006-03-01/}Key\").text\n",
+ " root = ET.fromstring(\n",
+ " requests.get(\n",
+ " BUCKET, params={\"list-type\": \"2\", \"prefix\": prefix}, timeout=120\n",
+ " ).content\n",
+ " )\n",
+ " key = root.find(\n",
+ " \"{http://s3.amazonaws.com/doc/2006-03-01/}Contents/{http://s3.amazonaws.com/doc/2006-03-01/}Key\"\n",
+ " ).text\n",
" path = DATA_DIR / key.split(\"/\")[-1]\n",
" if not path.exists():\n",
" response = requests.get(BUCKET + key, timeout=600)\n",
@@ -145,8 +151,18 @@
" return path\n",
"\n",
"\n",
- "paths = {product: sorted(DATA_DIR.glob(f\"OR_{product}-M6_G19_s{TIME:%Y}{TIME.timetuple().tm_yday:03d}{TIME:%H}*.nc\")) for product in [\"ABI-L2-ACMF\", \"ABI-L2-SSTF\", \"ABI-L2-LSTF\"]}\n",
- "paths = {product: found[0] if found else download(product) for product, found in paths.items()}\n",
+ "paths = {\n",
+ " product: sorted(\n",
+ " DATA_DIR.glob(\n",
+ " f\"OR_{product}-M6_G19_s{TIME:%Y}{TIME.timetuple().tm_yday:03d}{TIME:%H}*.nc\"\n",
+ " )\n",
+ " )\n",
+ " for product in [\"ABI-L2-ACMF\", \"ABI-L2-SSTF\", \"ABI-L2-LSTF\"]\n",
+ "}\n",
+ "paths = {\n",
+ " product: found[0] if found else download(product)\n",
+ " for product, found in paths.items()\n",
+ "}\n",
"\n",
"\n",
"def fixed_grid(ds):\n",
@@ -156,20 +172,30 @@
" h = projection[\"perspective_point_height\"] + r_eq\n",
" lon_0 = np.radians(projection[\"longitude_of_projection_origin\"])\n",
" x, y = np.meshgrid(ds.x.values, ds.y.values)\n",
- " a = np.sin(x) ** 2 + np.cos(x) ** 2 * (np.cos(y) ** 2 + (r_eq / r_pol) ** 2 * np.sin(y) ** 2)\n",
+ " a = np.sin(x) ** 2 + np.cos(x) ** 2 * (\n",
+ " np.cos(y) ** 2 + (r_eq / r_pol) ** 2 * np.sin(y) ** 2\n",
+ " )\n",
" b = -2 * h * np.cos(x) * np.cos(y)\n",
" c = h**2 - r_eq**2\n",
" discriminant = b**2 - 4 * a * c\n",
" with np.errstate(invalid=\"ignore\"):\n",
" r_s = (-b - np.sqrt(discriminant)) / (2 * a)\n",
- " s_x, s_y, s_z = r_s * np.cos(x) * np.cos(y), -r_s * np.sin(x), r_s * np.cos(x) * np.sin(y)\n",
- " latitude = np.degrees(np.arctan((r_eq / r_pol) ** 2 * s_z / np.sqrt((h - s_x) ** 2 + s_y**2)))\n",
+ " s_x, s_y, s_z = (\n",
+ " r_s * np.cos(x) * np.cos(y),\n",
+ " -r_s * np.sin(x),\n",
+ " r_s * np.cos(x) * np.sin(y),\n",
+ " )\n",
+ " latitude = np.degrees(\n",
+ " np.arctan((r_eq / r_pol) ** 2 * s_z / np.sqrt((h - s_x) ** 2 + s_y**2))\n",
+ " )\n",
" longitude = np.degrees(lon_0 - np.arctan(s_y / (h - s_x)))\n",
" return latitude, longitude\n",
"\n",
"\n",
"goes19 = GeneralPerturbationsOrbit.from_tle(TLE)\n",
- "satellite_itrs = np.array(goes19.elements[0].to_skyfield().at(timescale.from_datetime(TIME)).frame_xyz(itrs).m)\n",
+ "satellite_itrs = np.array(\n",
+ " goes19.elements[0].to_skyfield().at(timescale.from_datetime(TIME)).frame_xyz(itrs).m\n",
+ ")\n",
"\n",
"\n",
"def elevation(latitude, longitude):\n",
@@ -178,21 +204,53 @@
" a, f = 6378137.0, 1 / 298.257223563\n",
" e2 = f * (2 - f)\n",
" n = a / np.sqrt(1 - e2 * np.sin(lat) ** 2)\n",
- " position = np.stack([n * np.cos(lat) * np.cos(lon), n * np.cos(lat) * np.sin(lon), n * (1 - e2) * np.sin(lat)], axis=-1)\n",
- " up = np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
+ " position = np.stack(\n",
+ " [\n",
+ " n * np.cos(lat) * np.cos(lon),\n",
+ " n * np.cos(lat) * np.sin(lon),\n",
+ " n * (1 - e2) * np.sin(lat),\n",
+ " ],\n",
+ " axis=-1,\n",
+ " )\n",
+ " up = np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
" line_of_sight = satellite_itrs - position\n",
- " return np.degrees(np.arcsin(np.sum(up * line_of_sight, axis=-1) / np.linalg.norm(line_of_sight, axis=-1)))\n",
- "\n",
- "\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ " return np.degrees(\n",
+ " np.arcsin(\n",
+ " np.sum(up * line_of_sight, axis=-1) / np.linalg.norm(line_of_sight, axis=-1)\n",
+ " )\n",
+ " )\n",
+ "\n",
+ "\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"products = {product: xr.open_dataset(path) for product, path in paths.items()}\n",
"pd.DataFrame(\n",
" {\n",
" product.replace(\"ABI-L2-\", \"\").replace(\"F\", \"\"): {\n",
" \"pixels\": f\"{ds.sizes['x']} x {ds.sizes['y']}\",\n",
- " \"retrieval local zenith angles (deg)\": \"0 to {:g}\".format(float(ds.retrieval_local_zenith_angle_bounds[1])),\n",
- " \"good-quality local zenith angles (deg)\": \"0 to {:g}\".format(float(ds.quantitative_local_zenith_angle_bounds[1])),\n",
+ " \"retrieval local zenith angles (deg)\": \"0 to {:g}\".format(\n",
+ " float(ds.retrieval_local_zenith_angle_bounds[1])\n",
+ " ),\n",
+ " \"good-quality local zenith angles (deg)\": \"0 to {:g}\".format(\n",
+ " float(ds.quantitative_local_zenith_angle_bounds[1])\n",
+ " ),\n",
" }\n",
" for product, ds in products.items()\n",
" }\n",
@@ -246,7 +304,9 @@
"latitude, longitude = fixed_grid(acm)\n",
"on_grid = np.isfinite(latitude)\n",
"imaged = np.isfinite(acm.ACM.values)\n",
- "grid_elevation = np.where(on_grid, elevation(np.nan_to_num(latitude), np.nan_to_num(longitude)), np.nan)\n",
+ "grid_elevation = np.where(\n",
+ " on_grid, elevation(np.nan_to_num(latitude), np.nan_to_num(longitude)), np.nan\n",
+ ")\n",
"abi = Instrument(name=\"ABI\", field_of_regard=17.4)\n",
"satellite = Satellite(name=\"GOES-19\", orbit=goes19, instruments=[abi])\n",
"rng = np.random.default_rng(1)\n",
@@ -255,9 +315,17 @@
"\n",
"def observed(index):\n",
" \"\"\"TAT-C's observation of a pixel, and the satellite's elevation angle.\"\"\"\n",
- " point = Point(id=0, latitude=float(latitude.flat[index]), longitude=float(longitude.flat[index]))\n",
+ " point = Point(\n",
+ " id=0,\n",
+ " latitude=float(latitude.flat[index]),\n",
+ " longitude=float(longitude.flat[index]),\n",
+ " )\n",
" obs = collect_observations(point, satellite, TIME, TIME + timedelta(minutes=10))\n",
- " return {\"index\": index, \"observed\": not obs.empty, \"sat_alt\": obs.sat_alt.iloc[0] if not obs.empty else np.nan}\n",
+ " return {\n",
+ " \"index\": index,\n",
+ " \"observed\": not obs.empty,\n",
+ " \"sat_alt\": obs.sat_alt.iloc[0] if not obs.empty else np.nan,\n",
+ " }\n",
"\n",
"\n",
"with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
@@ -269,11 +337,16 @@
" \"grid pixels on the Earth\": int(on_grid.sum()),\n",
" \"pixels on the Earth imaged (%)\": 100 * imaged[on_grid].mean(),\n",
" \"imaged pixels off the Earth\": int((imaged & ~on_grid).sum()),\n",
- " \"minimum elevation angle of imaged pixels (deg)\": float(np.nanmin(grid_elevation[imaged])),\n",
+ " \"minimum elevation angle of imaged pixels (deg)\": float(\n",
+ " np.nanmin(grid_elevation[imaged])\n",
+ " ),\n",
" \"sampled pixels: imaged (%)\": 100 * sample1.imaged.mean(),\n",
" \"sampled pixels: observed by TAT-C (%)\": 100 * sample1.observed.mean(),\n",
- " \"sampled imaged pixels observed by TAT-C (%)\": 100 * sample1.observed[sample1.imaged].mean(),\n",
- " \"TAT-C sat_alt minus elevation, max |x| (deg)\": float((sample1.sat_alt - sample1.elevation).abs().max()),\n",
+ " \"sampled imaged pixels observed by TAT-C (%)\": 100\n",
+ " * sample1.observed[sample1.imaged].mean(),\n",
+ " \"TAT-C sat_alt minus elevation, max |x| (deg)\": float(\n",
+ " (sample1.sat_alt - sample1.elevation).abs().max()\n",
+ " ),\n",
" }\n",
").round(4)"
]
@@ -425,36 +498,69 @@
" ds = ds.isel(x=slice(0, None, step), y=slice(0, None, step))\n",
" lat, lon = fixed_grid(ds)\n",
" valid = np.isfinite(lat)\n",
- " zenith = np.where(valid, 90 - elevation(np.nan_to_num(lat), np.nan_to_num(lon)), np.nan)\n",
+ " zenith = np.where(\n",
+ " valid, 90 - elevation(np.nan_to_num(lat), np.nan_to_num(lon)), np.nan\n",
+ " )\n",
" retrieved = np.isfinite(ds[quality_name].values)\n",
" good = retrieved & (ds.DQF.values == 0)\n",
" good_bound = float(ds.quantitative_local_zenith_angle_bounds[1])\n",
" retrieval_bound = float(ds.retrieval_local_zenith_angle_bounds[1])\n",
- " zenith_by_product[quality_name] = (zenith, retrieved, good, good_bound, retrieval_bound)\n",
+ " zenith_by_product[quality_name] = (\n",
+ " zenith,\n",
+ " retrieved,\n",
+ " good,\n",
+ " good_bound,\n",
+ " retrieval_bound,\n",
+ " )\n",
" field_of_regard = compute_field_of_regard(35786e3, 90 - good_bound)\n",
- " product_satellite = Satellite(name=\"GOES-19\", orbit=goes19, instruments=[Instrument(name=quality_name, field_of_regard=field_of_regard)])\n",
+ " product_satellite = Satellite(\n",
+ " name=\"GOES-19\",\n",
+ " orbit=goes19,\n",
+ " instruments=[Instrument(name=quality_name, field_of_regard=field_of_regard)],\n",
+ " )\n",
" near_bound = retrieved & (np.abs(zenith - good_bound) <= 5)\n",
" picks = rng.choice(np.flatnonzero(near_bound), 2000, replace=False)\n",
"\n",
- " def observed_with_bound(index, lat=lat, lon=lon, product_satellite=product_satellite):\n",
- " point = Point(id=0, latitude=float(lat.flat[index]), longitude=float(lon.flat[index]))\n",
- " return not collect_observations(point, product_satellite, TIME, TIME + timedelta(minutes=10)).empty\n",
+ " def observed_with_bound(\n",
+ " index, lat=lat, lon=lon, product_satellite=product_satellite\n",
+ " ):\n",
+ " point = Point(\n",
+ " id=0, latitude=float(lat.flat[index]), longitude=float(lon.flat[index])\n",
+ " )\n",
+ " return not collect_observations(\n",
+ " point, product_satellite, TIME, TIME + timedelta(minutes=10)\n",
+ " ).empty\n",
"\n",
" with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
" tatc = np.array(list(pool.map(observed_with_bound, picks)))\n",
" picked_zenith, picked_good = zenith.flat[picks], good.flat[picks]\n",
" rows2[quality_name] = {\n",
" \"declared bounds, good / retrieved (deg)\": f\"{good_bound:g} / {retrieval_bound:g}\",\n",
- " \"max local zenith angle, retrieved pixels (deg)\": float(np.nanmax(zenith[retrieved])),\n",
- " \"max local zenith angle, good-quality pixels (deg)\": float(np.nanmax(zenith[good])),\n",
- " \"retrieved pixels beyond the retrieval bound\": int((retrieved & (zenith > retrieval_bound)).sum()),\n",
- " \"good-quality pixels beyond the good bound (%)\": 100 * (good & (zenith > good_bound)).sum() / good.sum(),\n",
+ " \"max local zenith angle, retrieved pixels (deg)\": float(\n",
+ " np.nanmax(zenith[retrieved])\n",
+ " ),\n",
+ " \"max local zenith angle, good-quality pixels (deg)\": float(\n",
+ " np.nanmax(zenith[good])\n",
+ " ),\n",
+ " \"retrieved pixels beyond the retrieval bound\": int(\n",
+ " (retrieved & (zenith > retrieval_bound)).sum()\n",
+ " ),\n",
+ " \"good-quality pixels beyond the good bound (%)\": 100\n",
+ " * (good & (zenith > good_bound)).sum()\n",
+ " / good.sum(),\n",
" \"TAT-C field of regard (deg)\": field_of_regard,\n",
- " \"TAT-C: max local zenith angle observed (deg)\": float(picked_zenith[tatc].max()),\n",
- " \"TAT-C: min local zenith angle not observed (deg)\": float(picked_zenith[~tatc].min()),\n",
- " \"sampled good-quality pixels observed by TAT-C (%)\": 100 * tatc[picked_good].mean(),\n",
- " \"sampled pixels observed by TAT-C that are good quality (%)\": 100 * picked_good[tatc].mean(),\n",
- " \"sampled pixels not observed by TAT-C that are good quality (%)\": 100 * picked_good[~tatc].mean(),\n",
+ " \"TAT-C: max local zenith angle observed (deg)\": float(\n",
+ " picked_zenith[tatc].max()\n",
+ " ),\n",
+ " \"TAT-C: min local zenith angle not observed (deg)\": float(\n",
+ " picked_zenith[~tatc].min()\n",
+ " ),\n",
+ " \"sampled good-quality pixels observed by TAT-C (%)\": 100\n",
+ " * tatc[picked_good].mean(),\n",
+ " \"sampled pixels observed by TAT-C that are good quality (%)\": 100\n",
+ " * picked_good[tatc].mean(),\n",
+ " \"sampled pixels not observed by TAT-C that are good quality (%)\": 100\n",
+ " * picked_good[~tatc].mean(),\n",
" }\n",
"pd.DataFrame(rows2).T.round(3)"
]
@@ -486,16 +592,33 @@
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.6), sharey=True)\n",
"bins = np.arange(0, 91, 1)\n",
- "for ax, (name, (zenith, retrieved, good, good_bound, retrieval_bound)) in zip(axes, zenith_by_product.items()):\n",
+ "for ax, (name, (zenith, retrieved, good, good_bound, retrieval_bound)) in zip(\n",
+ " axes, zenith_by_product.items()\n",
+ "):\n",
" counts_retrieved = np.histogram(zenith[retrieved], bins)[0]\n",
" counts_good = np.histogram(zenith[good], bins)[0]\n",
" total = np.histogram(zenith[np.isfinite(zenith)], bins)[0]\n",
" with np.errstate(invalid=\"ignore\", divide=\"ignore\"):\n",
- " ax.plot(bins[:-1] + 0.5, 100 * counts_retrieved / total, color=GRAY, lw=2, label=\"retrieved\")\n",
- " ax.plot(bins[:-1] + 0.5, 100 * counts_good / total, color=BLUE, lw=1.5, label=\"good quality\")\n",
+ " ax.plot(\n",
+ " bins[:-1] + 0.5,\n",
+ " 100 * counts_retrieved / total,\n",
+ " color=GRAY,\n",
+ " lw=2,\n",
+ " label=\"retrieved\",\n",
+ " )\n",
+ " ax.plot(\n",
+ " bins[:-1] + 0.5,\n",
+ " 100 * counts_good / total,\n",
+ " color=BLUE,\n",
+ " lw=1.5,\n",
+ " label=\"good quality\",\n",
+ " )\n",
" ax.axvline(good_bound, color=BLUE, ls=\"--\", lw=1)\n",
" ax.axvline(retrieval_bound, color=GRAY, ls=\"--\", lw=1)\n",
- " ax.set(xlabel=\"Local zenith angle (deg)\", title=f\"{name} pixels by local zenith angle (dashed: declared bounds)\")\n",
+ " ax.set(\n",
+ " xlabel=\"Local zenith angle (deg)\",\n",
+ " title=f\"{name} pixels by local zenith angle (dashed: declared bounds)\",\n",
+ " )\n",
"axes[0].set_ylabel(\"Pixels on the disk (%)\")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
diff --git a/docs/validation/ValidateGridSMAP.ipynb b/docs/validation/ValidateGridSMAP.ipynb
new file mode 100644
index 00000000..1864030f
--- /dev/null
+++ b/docs/validation/ValidateGridSMAP.ipynb
@@ -0,0 +1,771 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "3be993f6",
+ "metadata": {},
+ "source": [
+ "# Gridded Coverage Validation: SMAP\n",
+ "\n",
+ "This notebook validates TAT-C's coverage statistics and their gridding (`aggregate_observations`, `reduce_observations`, and `grid_observations`) against a day of observations by the radiometer of NASA's [Soil Moisture Active Passive](https://smap.jpl.nasa.gov/) (SMAP) mission on 24 October 2026. SMAP's 6 m antenna rotates at about 14.6 revolutions per minute, so its radiometer scans a full circle on the ground around the satellite, about 1,000 km wide, at an incidence angle of 40 deg, viewing each place twice on each pass: once looking forward and once looking aft, about two minutes later. A `ConicalInstrument` that scans the full circle (a half-width of 180 deg) models this geometry, which the AMSR2 and GMI notebooks (sector scanners) do not test.\n",
+ "\n",
+ "1. **Looks.** Does `collect_observations` predict each forward and aft look at each cell of SMAP's grid?\n",
+ "2. **Statistics by cell.** Do `aggregate_observations` and `reduce_observations` give each cell's observed number of passes, access, and revisit?\n",
+ "3. **Gridded statistics.** Does `grid_observations` combine them correctly into larger cells?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2338c4d9",
+ "metadata": {},
+ "source": [
+ "## Reference Data\n",
+ "\n",
+ "SMAP's Level-1C brightness temperatures (`SPL1CTB`, version 6, from the [NSIDC DAAC](https://nsidc.org/data/smap); free [NASA Earthdata Login](https://urs.earthdata.nasa.gov/) account required) are resampled to the 36 km global Equal-Area Scalable Earth grid (EASE-Grid 2.0), one file per half orbit, and record for each cell the time of the forward and aft looks (the weighted mean time of the footprints centered in it). The day's half orbits are downloaded once (keeping the latest version of each), and the look times are cached in a local `data/smap` directory.\n",
+ "\n",
+ "The look times are converted to UTC from the seconds since J2000 (noon TT on 1 January 2000). The products' own UTC strings (`cell_tb_time_utc_fore` and `_aft`) add these seconds to noon UTC, and are 69.184 s late (the difference between TT and UTC). The archive lacks a few half orbits late in the day, whose times are excluded from the comparisons."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "ff67d07e",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:47:30.878683Z",
+ "iopub.status.busy": "2026-10-25T23:47:30.878459Z",
+ "iopub.status.idle": "2026-10-25T23:47:32.365206Z",
+ "shell.execute_reply": "2026-10-25T23:47:32.364410Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "32 half orbits, 890452 looks within the day of 273726 cells\n",
+ "data gaps (UTC): 21:01-22:35, 23:29-00:00\n"
+ ]
+ }
+ ],
+ "source": [
+ "import re\n",
+ "from datetime import datetime, timedelta, timezone\n",
+ "from pathlib import Path\n",
+ "\n",
+ "import h5py\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "from tatc.constants import timescale\n",
+ "\n",
+ "DATA_DIR = Path(\"data\") / \"smap\"\n",
+ "DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
+ "DAY = datetime(2026, 10, 24, tzinfo=timezone.utc)\n",
+ "CACHE_FILE = DATA_DIR / f\"smap_l1c_tb_{DAY:%Y%m%d}.npz\"\n",
+ "\n",
+ "if not CACHE_FILE.exists():\n",
+ " import earthaccess\n",
+ "\n",
+ " earthaccess.login()\n",
+ " granules = earthaccess.search_data(\n",
+ " short_name=\"SPL1CTB\",\n",
+ " temporal=(\n",
+ " f\"{DAY - timedelta(hours=2):%Y-%m-%dT%H:%M:%S}\",\n",
+ " f\"{DAY + timedelta(hours=26):%Y-%m-%dT%H:%M:%S}\",\n",
+ " ),\n",
+ " )\n",
+ " # the latest version of each half orbit (orbit number and direction)\n",
+ " latest = {}\n",
+ " for g in sorted(granules, key=lambda g: g[\"umm\"][\"GranuleUR\"]):\n",
+ " name = g[\"umm\"][\"GranuleUR\"]\n",
+ " latest[re.search(r\"_TB_(\\d+_[AD])_\", name).group(1)] = g\n",
+ " files = earthaccess.download(list(latest.values()), str(DATA_DIR / \"raw\"))\n",
+ " parts = []\n",
+ " for k, path in enumerate(sorted(files)):\n",
+ " with h5py.File(path) as f:\n",
+ " cells = f[\"Global_Projection\"]\n",
+ " part = {\n",
+ " \"row\": cells[\"cell_row\"][:],\n",
+ " \"col\": cells[\"cell_column\"][:],\n",
+ " \"incidence\": cells[\"cell_boresight_incidence_fore\"][:],\n",
+ " }\n",
+ " for look in (\"fore\", \"aft\"):\n",
+ " # seconds since J2000 (noon TT on 1 January 2000), converted to UTC\n",
+ " seconds = cells[f\"cell_tb_time_seconds_{look}\"][:]\n",
+ " valid = seconds > -9999\n",
+ " utc = pd.to_datetime(\n",
+ " timescale.tt_jd(2451545.0 + seconds[valid] / 86400).utc_datetime(),\n",
+ " utc=True,\n",
+ " )\n",
+ " part[look] = np.full(len(seconds), np.nan)\n",
+ " part[look][valid] = (utc - pd.Timestamp(DAY)).total_seconds()\n",
+ " part[\"half_orbit\"] = np.full(len(part[\"row\"]), k)\n",
+ " parts.append(part)\n",
+ " np.savez_compressed(\n",
+ " CACHE_FILE, **{key: np.concatenate([p[key] for p in parts]) for key in parts[0]}\n",
+ " )\n",
+ " for path in files:\n",
+ " Path(\n",
+ " path\n",
+ " ).unlink() # keep only the cached looks (each half orbit is about 5 MB)\n",
+ "\n",
+ "smap = dict(np.load(CACHE_FILE))\n",
+ "# looks (forward and aft) within the day, by cell\n",
+ "looks = pd.concat(\n",
+ " [\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"row\": smap[\"row\"],\n",
+ " \"col\": smap[\"col\"],\n",
+ " \"half_orbit\": smap[\"half_orbit\"],\n",
+ " \"seconds\": smap[look],\n",
+ " \"look\": look,\n",
+ " }\n",
+ " )\n",
+ " for look in (\"fore\", \"aft\")\n",
+ " ]\n",
+ ").dropna(subset=[\"seconds\"])\n",
+ "looks = looks[(looks.seconds >= 0) & (looks.seconds < 86400)]\n",
+ "# data gaps: periods of more than a minute without a look\n",
+ "covered = looks.groupby(\"half_orbit\").seconds.agg([\"min\", \"max\"]).sort_values(\"min\")\n",
+ "GAPS = [\n",
+ " (a, b)\n",
+ " for a, b in zip(\n",
+ " covered[\"max\"].cummax().to_numpy()[:-1], covered[\"min\"].to_numpy()[1:]\n",
+ " )\n",
+ " if b - a > 60\n",
+ "]\n",
+ "if covered[\"min\"].iloc[0] > 60:\n",
+ " GAPS.insert(0, (0, covered[\"min\"].iloc[0]))\n",
+ "if covered[\"max\"].max() < 86400 - 60:\n",
+ " GAPS.append((covered[\"max\"].max(), 86400))\n",
+ "print(\n",
+ " f\"{smap['half_orbit'].max() + 1} half orbits, {len(looks)} looks within the day of {looks.groupby(['row', 'col']).ngroups} cells\"\n",
+ ")\n",
+ "print(\n",
+ " \"data gaps (UTC): \"\n",
+ " + \", \".join(\n",
+ " f\"{DAY + timedelta(seconds=a):%H:%M}-{DAY + timedelta(seconds=b):%H:%M}\"\n",
+ " for a, b in GAPS\n",
+ " )\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3c8efe70",
+ "metadata": {},
+ "source": [
+ "## Setup\n",
+ "\n",
+ "SMAP is modeled as a `ConicalInstrument` scanning the full circle, with the cone angle of the median incidence angle of its looks at its mean altitude (on a spherical Earth), with an along-track field of view of 0.01 deg (so that each observation period spans the forward to the aft crossing of the circle), on an orbit from a published two-line element set (TLE) with an epoch about a day and a half after the analysis day. The points are the centers of every other cell of every other row of the EASE-Grid 2.0 (about 72 km apart), between about 81 deg south and 84 deg north. `collect_observations` reports each pass over a point as two observations, at the forward and aft crossings of the circle (`epoch`), which share the period during which the point lies inside the circle; its run of about half a minute is cached in `data/smap`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "e5761e9f",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:47:32.367160Z",
+ "iopub.status.busy": "2026-10-25T23:47:32.366817Z",
+ "iopub.status.idle": "2026-10-25T23:48:11.701901Z",
+ "shell.execute_reply": "2026-10-25T23:48:11.701210Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "collect_observations: 230357 observations of 97846 points in 35 s\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "median incidence angle 39.97 deg, mean altitude 689.4 km: cone angle 35.431 deg\n",
+ "97846 points, latitudes -81.5 to 83.6 deg; 230357 observations\n"
+ ]
+ }
+ ],
+ "source": [
+ "import pickle\n",
+ "import time\n",
+ "\n",
+ "from pyproj import Transformer\n",
+ "from shapely.geometry import Point\n",
+ "\n",
+ "from tatc.analysis import (\n",
+ " aggregate_observations,\n",
+ " collect_observations,\n",
+ " grid_observations,\n",
+ " reduce_observations,\n",
+ ")\n",
+ "from tatc.schemas import ConicalInstrument, GeneralPerturbationsOrbit, Satellite\n",
+ "\n",
+ "TLE = [\n",
+ " \"1 40376U 15003A 26298.67804942 .00000247 00000+0 56844-4 0 9999\",\n",
+ " \"2 40376 98.1310 303.9506 0001331 85.8091 274.3263 14.63397245626701\",\n",
+ "]\n",
+ "EARTH_RADIUS = 6371.0088e3 # m, mean\n",
+ "# EASE-Grid 2.0 global, 36 km: cell size (m) and the projected coordinates of the upper left corner\n",
+ "CELL, X0, Y0 = 36032.220840584, -17367530.44516138, 7314540.835948884\n",
+ "\n",
+ "orbit = GeneralPerturbationsOrbit.from_tle(TLE)\n",
+ "incidence = float(np.nanmedian(smap[\"incidence\"]))\n",
+ "# the cone angle (from nadir) of a boresight at the median incidence angle, at the mean altitude (spherical Earth)\n",
+ "cone = float(\n",
+ " np.degrees(\n",
+ " np.arcsin(\n",
+ " EARTH_RADIUS\n",
+ " * np.sin(np.radians(incidence))\n",
+ " / (EARTH_RADIUS + orbit.get_mean_altitude())\n",
+ " )\n",
+ " )\n",
+ ")\n",
+ "smap_sat = Satellite(\n",
+ " name=\"SMAP\",\n",
+ " orbit=orbit,\n",
+ " instruments=[\n",
+ " ConicalInstrument(\n",
+ " name=\"radiometer\",\n",
+ " cone_angle=cone,\n",
+ " scan_center_azimuth=0,\n",
+ " scan_half_width=180,\n",
+ " along_track_field_of_view=0.01,\n",
+ " )\n",
+ " ],\n",
+ ")\n",
+ "# points at the centers of every other cell of every other row\n",
+ "rows, cols = np.meshgrid(np.arange(0, 406, 2), np.arange(0, 964, 2), indexing=\"ij\")\n",
+ "lon, lat = Transformer.from_crs(\"EPSG:6933\", \"EPSG:4326\", always_xy=True).transform(\n",
+ " X0 + (cols.ravel() + 0.5) * CELL, Y0 - (rows.ravel() + 0.5) * CELL\n",
+ ")\n",
+ "points = pd.DataFrame(\n",
+ " {\"row\": rows.ravel(), \"col\": cols.ravel(), \"lon\": lon, \"lat\": lat}\n",
+ ")\n",
+ "point_index = pd.Series(\n",
+ " np.arange(len(points)), index=pd.MultiIndex.from_arrays([points.row, points.col])\n",
+ ")\n",
+ "looks[\"point\"] = point_index.reindex(\n",
+ " pd.MultiIndex.from_arrays([looks.row, looks.col])\n",
+ ").to_numpy()\n",
+ "looks = looks.dropna(subset=[\"point\"]).astype({\"point\": int})\n",
+ "\n",
+ "cache = DATA_DIR / f\"observations_{DAY:%Y%m%d}.pkl\"\n",
+ "if not cache.exists():\n",
+ " tic = time.perf_counter()\n",
+ " found = collect_observations(\n",
+ " [Point(x, y) for x, y in zip(lon, lat)], smap_sat, DAY, DAY + timedelta(days=1)\n",
+ " )\n",
+ " print(\n",
+ " f\"collect_observations: {len(found)} observations of {len(points)} points in {time.perf_counter() - tic:.0f} s\"\n",
+ " )\n",
+ " found.to_pickle(cache)\n",
+ "observations = pd.read_pickle(cache)\n",
+ "hash_index = pd.Series(\n",
+ " np.arange(len(points)), index=[Point(x, y).wkb for x, y in zip(lon, lat)]\n",
+ ")\n",
+ "observations[\"point\"] = observations.geometry.apply(\n",
+ " lambda g: hash_index[Point(g.x, g.y).wkb]\n",
+ ").to_numpy()\n",
+ "observations[\"seconds\"] = (observations.epoch - pd.Timestamp(DAY)).dt.total_seconds()\n",
+ "\n",
+ "\n",
+ "def in_gap(seconds, margin=180):\n",
+ " \"\"\"Whether times (s) fall within a margin (s) of a data gap (a pass's looks span about two minutes).\"\"\"\n",
+ " seconds = np.asarray(seconds)\n",
+ " return np.any(\n",
+ " [(seconds > a - margin) & (seconds < b + margin) for a, b in GAPS]\n",
+ " + [np.zeros(seconds.shape, bool)],\n",
+ " axis=0,\n",
+ " )\n",
+ "\n",
+ "\n",
+ "print(\n",
+ " f\"median incidence angle {incidence:.2f} deg, mean altitude {orbit.get_mean_altitude() / 1e3:.1f} km: cone angle {cone:.3f} deg\"\n",
+ ")\n",
+ "print(\n",
+ " f\"{len(points)} points, latitudes {lat.min():.1f} to {lat.max():.1f} deg; {len(observations)} observations\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3ba858f2",
+ "metadata": {},
+ "source": [
+ "## Test 1: Looks\n",
+ "\n",
+ "Each observed look (forward or aft) at a point is paired with the nearest predicted observation of the same point within 60 s, outside the data gaps."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "b20ad7d0",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:48:11.703932Z",
+ "iopub.status.busy": "2026-10-25T23:48:11.703699Z",
+ "iopub.status.idle": "2026-10-25T23:48:11.925706Z",
+ "shell.execute_reply": "2026-10-25T23:48:11.924929Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
observed looks
\n",
+ "
predicted (%)
\n",
+ "
time offset, median (s)
\n",
+ "
95% |offset| (s)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
fore
\n",
+ "
110535.0
\n",
+ "
95.28
\n",
+ "
-0.19
\n",
+ "
1.60
\n",
+ "
\n",
+ "
\n",
+ "
aft
\n",
+ "
110559.0
\n",
+ "
95.28
\n",
+ "
0.11
\n",
+ "
1.54
\n",
+ "
\n",
+ "
\n",
+ "
all predicted looks
\n",
+ "
208936.0
\n",
+ "
96.63
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " observed looks predicted (%) time offset, median (s) \\\n",
+ "fore 110535.0 95.28 -0.19 \n",
+ "aft 110559.0 95.28 0.11 \n",
+ "all predicted looks 208936.0 96.63 NaN \n",
+ "\n",
+ " 95% |offset| (s) \n",
+ "fore 1.60 \n",
+ "aft 1.54 \n",
+ "all predicted looks NaN "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def pair(left, right, tolerance=60):\n",
+ " \"\"\"Pairs each row of left with the nearest row of right at the same point within tolerance (s) of time.\"\"\"\n",
+ " return pd.merge_asof(\n",
+ " left.sort_values(\"seconds\"),\n",
+ " right.rename(columns={\"seconds\": \"paired\"}).sort_values(\"paired\"),\n",
+ " left_on=\"seconds\",\n",
+ " right_on=\"paired\",\n",
+ " by=\"point\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=tolerance,\n",
+ " )\n",
+ "\n",
+ "\n",
+ "observed = looks[~in_gap(looks.seconds)]\n",
+ "predicted = observations[~in_gap(observations.seconds)]\n",
+ "forward = pair(observed[[\"point\", \"seconds\", \"look\"]], predicted[[\"point\", \"seconds\"]])\n",
+ "backward = pair(predicted[[\"point\", \"seconds\"]], observed[[\"point\", \"seconds\"]])\n",
+ "offset = (forward.paired - forward.seconds).dropna()\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " look: {\n",
+ " \"observed looks\": int((forward.look == look).sum()),\n",
+ " \"predicted (%)\": 100 * forward.paired[forward.look == look].notna().mean(),\n",
+ " \"time offset, median (s)\": offset[forward.look == look].median(),\n",
+ " \"95% |offset| (s)\": offset[forward.look == look].abs().quantile(0.95),\n",
+ " }\n",
+ " for look in (\"fore\", \"aft\")\n",
+ " }\n",
+ " | {\n",
+ " \"all predicted looks\": {\n",
+ " \"observed looks\": len(predicted),\n",
+ " \"predicted (%)\": 100 * backward.paired.notna().mean(),\n",
+ " }\n",
+ " }\n",
+ ").T.round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "60c7477d",
+ "metadata": {},
+ "source": [
+ "A full-circle `ConicalInstrument` reproduces SMAP's two looks per pass: `collect_observations` predicts 95.3% of the forward and the aft looks alike, within 0.2 s (median) and 1.6 s (95%) of their times, and 96.6% of its predicted looks were observed. Every look not predicted belongs to a pass over a point that TAT-C does not predict at all, not to a misplaced one: these points lie just outside TAT-C's swath, where SMAP records a look at a cell whenever a footprint is centered anywhere within it (up to half a cell, 18 km, from its center), and are more common at high latitudes (a median of 64 deg, against 47 deg for all looks), where the edges of successive swaths cross more cells."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4ea62178",
+ "metadata": {},
+ "source": [
+ "## Test 2: Statistics by Cell\n",
+ "\n",
+ "`aggregate_observations` merges each point's overlapping observations into periods (here, a pass's forward and aft observations, which share a period), and `reduce_observations` gives each point's number of samples (passes), mean access (the duration of the periods), and mean revisit (the time between them). The observed statistics are computed the same way from each pass's looks: a period from the first look to the last (forward to aft). Observations within the data gaps are excluded from both."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "f2d4e5f6",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:48:11.927530Z",
+ "iopub.status.busy": "2026-10-25T23:48:11.927306Z",
+ "iopub.status.idle": "2026-10-25T23:48:17.133079Z",
+ "shell.execute_reply": "2026-10-25T23:48:17.132382Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "aggregate_observations and reduce_observations: 230357 observations in 4.1 s\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "points observed 68435.00\n",
+ "predicted 68485.00\n",
+ "same number of passes (%) 89.82\n",
+ "one more predicted (%) 3.86\n",
+ "one fewer predicted (%) 5.63\n",
+ "other (%) 0.70\n",
+ "access difference, median (s) 7.50\n",
+ "95% |access difference| (s) 29.12\n",
+ "revisit difference (same passes), median (s) -7.78\n",
+ "95% |revisit difference| (s) 16.13\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def statistics(periods):\n",
+ " \"\"\"Samples, mean access (s), and mean revisit (s) of each point, from its observation periods (point, start,\n",
+ " end, in s), merged where they overlap (as by aggregate_observations).\"\"\"\n",
+ " periods = periods.sort_values([\"point\", \"start\"])\n",
+ " first = periods.point.ne(periods.point.shift())\n",
+ " reach = periods.groupby(\"point\").end.cummax()\n",
+ " periods = periods.assign(\n",
+ " group=(first | (periods.start > reach.groupby(periods.point).shift())).cumsum()\n",
+ " )\n",
+ " merged = periods.groupby(\"group\").agg(\n",
+ " point=(\"point\", \"first\"), start=(\"start\", \"min\"), end=(\"end\", \"max\")\n",
+ " )\n",
+ " merged[\"access\"] = merged.end - merged.start\n",
+ " merged[\"revisit\"] = merged.start - merged.end.groupby(merged.point).shift()\n",
+ " return merged.groupby(\"point\").agg(\n",
+ " samples=(\"start\", \"size\"),\n",
+ " access=(\"access\", \"mean\"),\n",
+ " revisit=(\"revisit\", \"mean\"),\n",
+ " )\n",
+ "\n",
+ "\n",
+ "# observed: each half orbit's pass over a point, from its first to its last look\n",
+ "passes = (\n",
+ " looks[~in_gap(looks.seconds)]\n",
+ " .groupby([\"point\", \"half_orbit\"])\n",
+ " .seconds.agg(start=\"min\", end=\"max\")\n",
+ " .reset_index()\n",
+ ")\n",
+ "observed = statistics(passes)\n",
+ "# predicted: aggregate_observations and reduce_observations, outside the data gaps\n",
+ "tic = time.perf_counter()\n",
+ "aggregated = aggregate_observations(\n",
+ " observations[~in_gap(observations.seconds)].drop(columns=[\"point\", \"seconds\"])\n",
+ ")\n",
+ "reduced = reduce_observations(aggregated)\n",
+ "elapsed = time.perf_counter() - tic\n",
+ "reduced[\"point\"] = reduced.geometry.apply(\n",
+ " lambda g: hash_index[Point(g.x, g.y).wkb]\n",
+ ").to_numpy()\n",
+ "predicted = reduced.set_index(\"point\")[[\"samples\", \"access\", \"revisit\"]].assign(\n",
+ " access=lambda f: f.access.dt.total_seconds(),\n",
+ " revisit=lambda f: f.revisit.dt.total_seconds(),\n",
+ ")\n",
+ "both = observed.add_suffix(\"_observed\").join(\n",
+ " predicted.add_suffix(\"_predicted\"), how=\"outer\"\n",
+ ")\n",
+ "both[[\"samples_observed\", \"samples_predicted\"]] = both[\n",
+ " [\"samples_observed\", \"samples_predicted\"]\n",
+ "].fillna(0)\n",
+ "difference = both.samples_predicted - both.samples_observed\n",
+ "same = (difference == 0) & both.revisit_observed.notna()\n",
+ "print(\n",
+ " f\"aggregate_observations and reduce_observations: {len(observations)} observations in {elapsed:.1f} s\"\n",
+ ")\n",
+ "pd.Series(\n",
+ " {\n",
+ " \"points observed\": int((both.samples_observed > 0).sum()),\n",
+ " \"predicted\": int((both.samples_predicted > 0).sum()),\n",
+ " \"same number of passes (%)\": 100 * (difference == 0).mean(),\n",
+ " \"one more predicted (%)\": 100 * (difference == 1).mean(),\n",
+ " \"one fewer predicted (%)\": 100 * (difference == -1).mean(),\n",
+ " \"other (%)\": 100 * (difference.abs() > 1).mean(),\n",
+ " \"access difference, median (s)\": (\n",
+ " both.access_predicted - both.access_observed\n",
+ " ).median(),\n",
+ " \"95% |access difference| (s)\": (both.access_predicted - both.access_observed)\n",
+ " .abs()\n",
+ " .quantile(0.95),\n",
+ " \"revisit difference (same passes), median (s)\": (\n",
+ " both.revisit_predicted - both.revisit_observed\n",
+ " )[same].median(),\n",
+ " \"95% |revisit difference| (s)\": (\n",
+ " both.revisit_predicted - both.revisit_observed\n",
+ " )[same]\n",
+ " .abs()\n",
+ " .quantile(0.95),\n",
+ " }\n",
+ ").round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5893eeaa",
+ "metadata": {},
+ "source": [
+ "`aggregate_observations` and `reduce_observations` give the same number of passes for 90% of the points observed or predicted (68,435 and 68,485), one more for 3.9%, and one fewer for 5.6%, at the edges of the swaths as in Test 1, in about 4 s for the 230,000 observations of the day. Their access periods are 7.5 s longer (median) than the observed ones, from the forward to the aft look, and their revisits correspondingly shorter: by default, a `ConicalInstrument`'s field of regard, whose access defines each observation's period, extends 1 deg beyond its cone (about 3.4 s on either side of the circle); the epochs themselves match (Test 1)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "81a94f43",
+ "metadata": {},
+ "source": [
+ "## Test 3: Gridded Statistics\n",
+ "\n",
+ "`grid_observations` combines the statistics of the points within each cell of a coarser grid, here TAT-C's cells about 1,000 km wide (`generate_cells_uniform_spacing`): the total number of samples, the sample-weighted mean access, and the sample-weighted harmonic mean revisit (the mean of the revisit rates). The observed statistics of Test 2 are gridded the same way into the same cells."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "6718731d",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:48:17.134858Z",
+ "iopub.status.busy": "2026-10-25T23:48:17.134621Z",
+ "iopub.status.idle": "2026-10-25T23:48:18.307669Z",
+ "shell.execute_reply": "2026-10-25T23:48:18.307009Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "800 cells, 780 with observations, gridded in 1.1 s; 780 compared\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
5%
\n",
+ "
50%
\n",
+ "
95%
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
samples (predicted / observed)
\n",
+ "
0.841
\n",
+ "
0.976
\n",
+ "
1.086
\n",
+ "
\n",
+ "
\n",
+ "
access (predicted / observed)
\n",
+ "
1.063
\n",
+ "
1.120
\n",
+ "
1.500
\n",
+ "
\n",
+ "
\n",
+ "
revisit (predicted / observed)
\n",
+ "
0.947
\n",
+ "
1.000
\n",
+ "
1.098
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " 5% 50% 95%\n",
+ "samples (predicted / observed) 0.841 0.976 1.086\n",
+ "access (predicted / observed) 1.063 1.120 1.500\n",
+ "revisit (predicted / observed) 0.947 1.000 1.098"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import geopandas as gpd\n",
+ "\n",
+ "from tatc.generation import generate_cells_uniform_spacing\n",
+ "\n",
+ "cells = generate_cells_uniform_spacing(1000e3)\n",
+ "tic = time.perf_counter()\n",
+ "gridded = grid_observations(reduced, cells)\n",
+ "elapsed = time.perf_counter() - tic\n",
+ "# the same statistics gridded from the observed points: total samples, sample-weighted mean access, and\n",
+ "# sample-weighted harmonic mean revisit\n",
+ "located = gpd.GeoDataFrame(\n",
+ " observed.join(points[[\"lon\", \"lat\"]]),\n",
+ " geometry=gpd.points_from_xy(points.lon, points.lat)[observed.index],\n",
+ " crs=\"EPSG:4326\",\n",
+ ").sjoin(cells[[\"cell_id\", \"geometry\"]], predicate=\"within\")\n",
+ "located[\"revisit_samples\"] = located.samples.where(located.revisit.notna(), 0)\n",
+ "located[\"rate\"] = (located.samples / located.revisit).fillna(0)\n",
+ "located[\"access_x_samples\"] = located.access * located.samples\n",
+ "truth = located.groupby(\"cell_id\")[\n",
+ " [\"samples\", \"access_x_samples\", \"revisit_samples\", \"rate\"]\n",
+ "].sum()\n",
+ "truth[\"access\"] = truth.access_x_samples / truth.samples\n",
+ "truth[\"revisit\"] = (truth.revisit_samples / truth.rate).where(truth.rate > 0)\n",
+ "compared = (\n",
+ " gridded.set_index(\"cell_id\")[[\"samples\", \"access\", \"revisit\"]]\n",
+ " .assign(\n",
+ " access=lambda f: pd.to_timedelta(f.access).dt.total_seconds(),\n",
+ " revisit=lambda f: pd.to_timedelta(f.revisit).dt.total_seconds(),\n",
+ " )\n",
+ " .add_suffix(\"_predicted\")\n",
+ " .join(truth[[\"samples\", \"access\", \"revisit\"]].add_suffix(\"_observed\"), how=\"inner\")\n",
+ ")\n",
+ "ratio = compared.samples_predicted / compared.samples_observed\n",
+ "print(\n",
+ " f\"{len(cells)} cells, {len(gridded)} with observations, gridded in {elapsed:.1f} s; {len(compared)} compared\"\n",
+ ")\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " \"samples (predicted / observed)\": ratio.quantile([0.05, 0.5, 0.95]),\n",
+ " \"access (predicted / observed)\": (\n",
+ " compared.access_predicted / compared.access_observed\n",
+ " ).quantile([0.05, 0.5, 0.95]),\n",
+ " \"revisit (predicted / observed)\": (\n",
+ " compared.revisit_predicted / compared.revisit_observed\n",
+ " ).quantile([0.05, 0.5, 0.95]),\n",
+ " }\n",
+ ").T.rename(columns=lambda q: f\"{q:.0%}\").round(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f6528aff",
+ "metadata": {},
+ "source": [
+ "Gridded into 800 cells about 1,000 km wide, the statistics agree with the observed ones gridded the same way: the median cell has 97.6% of the observed samples (84 to 109% for 90% of the cells, from the swath edges of Test 2), the same revisit (a ratio of 1.00, and within 5 to 10% for 90% of the cells), and an access longer by the field of regard's margin (12%, median), in about a second. In cells whose points each have a single sample, the revisit is undefined."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e060c041",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "\n",
+ "| Test | Result |\n",
+ "| --- | --- |\n",
+ "| 1. Looks | 95.3% of SMAP's forward and aft looks predicted, within 0.2 s (median) and 1.6 s (95%); 96.6% of predicted looks observed; the others are whole passes at the swath edges |\n",
+ "| 2. Statistics by cell | Same number of passes for 90% of the points; access 7.5 s longer (median) by the field of regard's default margin |\n",
+ "| 3. Gridded statistics | Samples within 2.4% (median) and revisit equal (median) in 1,000 km cells; access longer by the margin |\n",
+ "\n",
+ "**TAT-C's coverage statistics are validated against SMAP.** A full-circle `ConicalInstrument` predicts SMAP's forward and aft looks to a fraction of a second, and `aggregate_observations`, `reduce_observations`, and `grid_observations` reproduce its passes, revisits, and their gridded means, for a day of observations of nearly 100,000 points in seconds.\n",
+ "\n",
+ "**Findings.** The validation exposed two problems, both corrected: `grid_observations` failed (with an infinite revisit) for a cell whose points each had a single sample, and included those points' samples in the weights of the cell's mean revisit; and `aggregate_observations` took about five minutes for a day of observations of 100,000 points, which it now computes for all points together in a few seconds, with the same results. The reference data needed care too: the products' UTC strings are 69.184 s late (they add seconds since J2000, a TT epoch, to noon UTC), and the archive lacked a few half orbits.\n",
+ "\n",
+ "**Next steps:**\n",
+ "\n",
+ "1. *Polar grids.* SMAP's products also include polar EASE grids, which would extend the comparison over the poles.\n",
+ "2. *Longer periods.* Over SMAP's 8-day repeat cycle, the revisit statistics would compare the variation between days.\n",
+ "\n",
+ "**Limitations.** This study covers one day. The points are the centers of every other cell, where SMAP observes a cell from any footprint centered within it, so passes differ at the swath edges, and the cone angle comes from a spherical Earth."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/validation/ValidateImagerATMS.ipynb b/docs/validation/ValidateImagerATMS.ipynb
index 2449b609..bf4cceb4 100644
--- a/docs/validation/ValidateImagerATMS.ipynb
+++ b/docs/validation/ValidateImagerATMS.ipynb
@@ -47,10 +47,10 @@
"id": "6a685a06",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:19.249243Z",
- "iopub.status.busy": "2026-10-08T17:41:19.248243Z",
- "iopub.status.idle": "2026-10-08T17:41:21.310192Z",
- "shell.execute_reply": "2026-10-08T17:41:21.309658Z"
+ "iopub.execute_input": "2026-10-25T13:48:32.121350Z",
+ "iopub.status.busy": "2026-10-25T13:48:32.121350Z",
+ "iopub.status.idle": "2026-10-25T13:48:32.867917Z",
+ "shell.execute_reply": "2026-10-25T13:48:32.867917Z"
}
},
"outputs": [
@@ -103,7 +103,9 @@
" params[\"continuation-token\"] = token\n",
" listing = requests.get(BUCKET, params=params, timeout=60).text\n",
" keys += re.findall(r\"(.*?)\", listing)\n",
- " match = re.search(r\"(.*?)\", listing)\n",
+ " match = re.search(\n",
+ " r\"(.*?)\", listing\n",
+ " )\n",
" if match is None:\n",
" return keys\n",
" token = match.group(1)\n",
@@ -124,30 +126,57 @@
"TLE_FILE = DATA_DIR / f\"n20_tle_{DAY:%Y%m%d}.txt\"\n",
"if not TLE_FILE.exists():\n",
" # the element set with an epoch at the start of the day\n",
- " key = next(k for k in list_keys(f\"TLE-AUX/{DAY:%Y/%m/%d}/\") if f\"Z_{DAY:%Y%m%d}000000Z_\" in k)\n",
+ " key = next(\n",
+ " k\n",
+ " for k in list_keys(f\"TLE-AUX/{DAY:%Y/%m/%d}/\")\n",
+ " if f\"Z_{DAY:%Y%m%d}000000Z_\" in k\n",
+ " )\n",
" with h5py.File(io.BytesIO(fetch(key))) as f:\n",
- " TLE_FILE.write_text(bytes(f[\"All_Data/TLE-AUX_All/Dataset_Array_0\"][:]).decode().strip() + \"\\n\")\n",
+ " TLE_FILE.write_text(\n",
+ " bytes(f[\"All_Data/TLE-AUX_All/Dataset_Array_0\"][:]).decode().strip() + \"\\n\"\n",
+ " )\n",
"tle = TLE_FILE.read_text().splitlines()\n",
"\n",
"ATMS_FILE = DATA_DIR / f\"atms_gatmo_{DAY:%Y%m%d}.npz\"\n",
"ATMS_FIELDS = [\n",
- " \"StartTime\", \"MidTime\", \"SCPosition\", \"SCVelocity\", \"Latitude\", \"Longitude\", \"Height\",\n",
- " \"SatelliteZenithAngle\", \"QF1_ATMSSDRGEO\",\n",
+ " \"StartTime\",\n",
+ " \"MidTime\",\n",
+ " \"SCPosition\",\n",
+ " \"SCVelocity\",\n",
+ " \"Latitude\",\n",
+ " \"Longitude\",\n",
+ " \"Height\",\n",
+ " \"SatelliteZenithAngle\",\n",
+ " \"QF1_ATMSSDRGEO\",\n",
"]\n",
"if not ATMS_FILE.exists():\n",
"\n",
" def read_granule(key):\n",
" with h5py.File(io.BytesIO(fetch(key))) as f:\n",
- " return {field: f[\"All_Data/ATMS-SDR-GEO_All/\" + field][:] for field in ATMS_FIELDS}\n",
+ " return {\n",
+ " field: f[\"All_Data/ATMS-SDR-GEO_All/\" + field][:]\n",
+ " for field in ATMS_FIELDS\n",
+ " }\n",
"\n",
" keys = list_keys(f\"ATMS-SDR-GEO/{DAY:%Y/%m/%d}/\")\n",
" with concurrent.futures.ThreadPoolExecutor(16) as pool:\n",
" granules = list(pool.map(read_granule, keys))\n",
- " np.savez_compressed(ATMS_FILE, **{field: np.concatenate([g[field] for g in granules]) for field in ATMS_FIELDS})\n",
+ " np.savez_compressed(\n",
+ " ATMS_FILE,\n",
+ " **{\n",
+ " field: np.concatenate([g[field] for g in granules]) for field in ATMS_FIELDS\n",
+ " },\n",
+ " )\n",
"\n",
"atms = dict(np.load(ATMS_FILE))\n",
"print(tle[0], tle[1], sep=\"\\n\")\n",
- "pd.Series({\"granules\": len(atms[\"MidTime\"]) // 12, \"scans\": len(atms[\"MidTime\"]), \"beams per scan\": atms[\"Latitude\"].shape[1]})"
+ "pd.Series(\n",
+ " {\n",
+ " \"granules\": len(atms[\"MidTime\"]) // 12,\n",
+ " \"scans\": len(atms[\"MidTime\"]),\n",
+ " \"beams per scan\": atms[\"Latitude\"].shape[1],\n",
+ " }\n",
+ ")"
]
},
{
@@ -170,10 +199,10 @@
"id": "8c4300e8",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:21.313920Z",
- "iopub.status.busy": "2026-10-08T17:41:21.313389Z",
- "iopub.status.idle": "2026-10-08T17:41:25.250560Z",
- "shell.execute_reply": "2026-10-08T17:41:25.250055Z"
+ "iopub.execute_input": "2026-10-25T13:48:32.870149Z",
+ "iopub.status.busy": "2026-10-25T13:48:32.869150Z",
+ "iopub.status.idle": "2026-10-25T13:48:34.665427Z",
+ "shell.execute_reply": "2026-10-25T13:48:34.665427Z"
}
},
"outputs": [
@@ -204,10 +233,21 @@
"from skyfield.api import wgs84\n",
"from skyfield.framelib import itrs\n",
"\n",
- "from tatc.analysis import collect_ground_pixels, collect_observations, compute_ground_track\n",
+ "from tatc.analysis import (\n",
+ " collect_ground_pixels,\n",
+ " collect_observations,\n",
+ " compute_ground_track,\n",
+ ")\n",
"from tatc.constants import EARTH_MEAN_RADIUS, EARTH_ROTATION_RATE\n",
"from tatc.generation import generate_points_fibonacci_lattice\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, Instrument, Point, PointedInstrument, Satellite\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Instrument,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
"from tatc.utils import (\n",
" VelocityFrame,\n",
" compute_apoapsis_radius,\n",
@@ -223,18 +263,33 @@
"\n",
"\n",
"def iet_to_utc(iet):\n",
- " return IET_EPOCH + pd.to_timedelta(np.asarray(iet) - LEAP_SECONDS * 1_000_000, unit=\"us\")\n",
+ " return IET_EPOCH + pd.to_timedelta(\n",
+ " np.asarray(iet) - LEAP_SECONDS * 1_000_000, unit=\"us\"\n",
+ " )\n",
"\n",
"\n",
"good = (atms[\"QF1_ATMSSDRGEO\"] == 0) & np.all(np.abs(atms[\"Latitude\"]) <= 90, axis=1)\n",
"t_start, t_mid = iet_to_utc(atms[\"StartTime\"][good]), iet_to_utc(atms[\"MidTime\"][good])\n",
- "sc_pos, sc_vel = atms[\"SCPosition\"][good].astype(float), atms[\"SCVelocity\"][good].astype(float)\n",
- "beam_lat, beam_lon = atms[\"Latitude\"][good].astype(float), atms[\"Longitude\"][good].astype(float)\n",
+ "sc_pos, sc_vel = atms[\"SCPosition\"][good].astype(float), atms[\"SCVelocity\"][\n",
+ " good\n",
+ "].astype(float)\n",
+ "beam_lat, beam_lon = atms[\"Latitude\"][good].astype(float), atms[\"Longitude\"][\n",
+ " good\n",
+ "].astype(float)\n",
"beam_height = atms[\"Height\"][good].astype(float)\n",
"beam_zenith = atms[\"SatelliteZenithAngle\"][good].astype(float)\n",
"\n",
"noaa20 = Satellite(name=\"NOAA-20\", orbit=GeneralPerturbationsOrbit.from_tle(tle))\n",
"orbit = noaa20.orbit.to_gp_orbit()\n",
+ "# NOAA-20 is not yaw-steered: its body (and its instruments' views) aligned with the inertial velocity\n",
+ "INERTIAL = Attitude(velocity_frame=VelocityFrame.INERTIAL)\n",
+ "\n",
+ "\n",
+ "def on_noaa20(instrument, attitude=None):\n",
+ " \"\"\"NOAA-20 carrying an instrument, with an attitude.\"\"\"\n",
+ " return noaa20.model_copy(update={\"instruments\": [instrument], \"attitude\": attitude})\n",
+ "\n",
+ "\n",
"atms_pixels = PointedInstrument(\n",
" name=\"ATMS\",\n",
" field_of_regard=2 * EDGE,\n",
@@ -250,13 +305,17 @@
"\n",
"def ecef(lon, lat, height=0.0):\n",
" \"\"\"Earth-fixed position (m) of geodetic coordinates, stacked on the last axis.\"\"\"\n",
- " return np.stack(TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1)\n",
+ " return np.stack(\n",
+ " TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1\n",
+ " )\n",
"\n",
"\n",
"def up(lon, lat):\n",
" \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
" lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
+ " return np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def normalize(x):\n",
@@ -295,7 +354,12 @@
"def binned(x, y, edges, q=(5, 50, 95)):\n",
" \"\"\"Percentiles of y in bins of x.\"\"\"\n",
" i = np.digitize(x, edges) - 1\n",
- " return np.array([np.percentile(y[i == k], q) if np.any(i == k) else [np.nan] * len(q) for k in range(len(edges) - 1)])\n",
+ " return np.array(\n",
+ " [\n",
+ " np.percentile(y[i == k], q) if np.any(i == k) else [np.nan] * len(q)\n",
+ " for k in range(len(edges) - 1)\n",
+ " ]\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
@@ -337,10 +401,10 @@
"id": "0472cd7e",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:25.252567Z",
- "iopub.status.busy": "2026-10-08T17:41:25.252567Z",
- "iopub.status.idle": "2026-10-08T17:41:25.312605Z",
- "shell.execute_reply": "2026-10-08T17:41:25.312236Z"
+ "iopub.execute_input": "2026-10-25T13:48:34.667433Z",
+ "iopub.status.busy": "2026-10-25T13:48:34.667433Z",
+ "iopub.status.idle": "2026-10-25T13:48:34.707300Z",
+ "shell.execute_reply": "2026-10-25T13:48:34.707300Z"
}
},
"outputs": [
@@ -422,13 +486,19 @@
"p1, v1 = orbit.get_orbit_track(list(t_mid[i1])).frame_xyz_and_velocity(itrs)\n",
"offset1 = np.array(p1.m).T - sc_pos[i1]\n",
"radial1 = normalize(sc_pos[i1])\n",
- "along1 = normalize(sc_vel[i1] - np.sum(sc_vel[i1] * radial1, axis=-1, keepdims=True) * radial1)\n",
+ "along1 = normalize(\n",
+ " sc_vel[i1] - np.sum(sc_vel[i1] * radial1, axis=-1, keepdims=True) * radial1\n",
+ ")\n",
"test1 = pd.DataFrame(\n",
" {\n",
" \"along-track (km)\": summarize(np.sum(offset1 * along1, axis=-1) / 1e3),\n",
- " \"cross-track, right (km)\": summarize(np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3),\n",
+ " \"cross-track, right (km)\": summarize(\n",
+ " np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3\n",
+ " ),\n",
" \"radial (km)\": summarize(np.sum(offset1 * radial1, axis=-1) / 1e3),\n",
- " \"velocity (m/s)\": summarize(np.linalg.norm(np.array(v1.m_per_s).T - sc_vel[i1], axis=-1)),\n",
+ " \"velocity (m/s)\": summarize(\n",
+ " np.linalg.norm(np.array(v1.m_per_s).T - sc_vel[i1], axis=-1)\n",
+ " ),\n",
" }\n",
").T\n",
"test1.round(3)"
@@ -458,10 +528,10 @@
"id": "48ce833f",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:25.314347Z",
- "iopub.status.busy": "2026-10-08T17:41:25.314347Z",
- "iopub.status.idle": "2026-10-08T17:41:26.799146Z",
- "shell.execute_reply": "2026-10-08T17:41:26.798140Z"
+ "iopub.execute_input": "2026-10-25T13:48:34.709821Z",
+ "iopub.status.busy": "2026-10-25T13:48:34.708816Z",
+ "iopub.status.idle": "2026-10-25T13:48:35.839181Z",
+ "shell.execute_reply": "2026-10-25T13:48:35.838675Z"
}
},
"outputs": [
@@ -487,10 +557,14 @@
],
"source": [
"dt_beam = 2 * np.median(atms[\"MidTime\"][good] - atms[\"StartTime\"][good]) / 1e6 / N_BEAMS\n",
- "beam_offset = (np.arange(N_BEAMS) - (N_BEAMS - 1) / 2) * dt_beam # s from the middle time\n",
+ "beam_offset = (\n",
+ " np.arange(N_BEAMS) - (N_BEAMS - 1) / 2\n",
+ ") * dt_beam # s from the middle time\n",
"beam_xyz = ecef(beam_lon, beam_lat, beam_height)\n",
"beam_sc = sc_pos[:, np.newaxis] + sc_vel[:, np.newaxis] * beam_offset[:, np.newaxis]\n",
- "sc_lon, sc_lat, _ = TO_GEODETIC.transform(beam_sc[..., 0], beam_sc[..., 1], beam_sc[..., 2])\n",
+ "sc_lon, sc_lat, _ = TO_GEODETIC.transform(\n",
+ " beam_sc[..., 0], beam_sc[..., 1], beam_sc[..., 2]\n",
+ ")\n",
"los = normalize(beam_xyz - beam_sc)\n",
"side = np.where(np.arange(N_BEAMS) < N_BEAMS / 2, 1, -1) # beams 0-47 are to the left\n",
"scan_angle = side * np.degrees(np.arccos(np.sum(los * -up(sc_lon, sc_lat), axis=-1)))\n",
@@ -526,10 +600,10 @@
"id": "2a2744ef",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:26.801146Z",
- "iopub.status.busy": "2026-10-08T17:41:26.800146Z",
- "iopub.status.idle": "2026-10-08T17:41:26.946457Z",
- "shell.execute_reply": "2026-10-08T17:41:26.945449Z"
+ "iopub.execute_input": "2026-10-25T13:48:35.841184Z",
+ "iopub.status.busy": "2026-10-25T13:48:35.840183Z",
+ "iopub.status.idle": "2026-10-25T13:48:35.957752Z",
+ "shell.execute_reply": "2026-10-25T13:48:35.957752Z"
}
},
"outputs": [
@@ -546,10 +620,27 @@
],
"source": [
"fig, ax = plt.subplots(figsize=(7, 3.4))\n",
- "ax.plot(np.arange(N_BEAMS), measured - nominal, color=BLUE, marker=\"o\", ms=3, lw=0, label=\"measured (median)\")\n",
- "ax.plot(np.arange(N_BEAMS), model(fit) - nominal, color=ORANGE, label=f\"fit: spacing {fitted_spacing:.4f} deg, roll {fitted_roll:+.3f} deg\")\n",
+ "ax.plot(\n",
+ " np.arange(N_BEAMS),\n",
+ " measured - nominal,\n",
+ " color=BLUE,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " lw=0,\n",
+ " label=\"measured (median)\",\n",
+ ")\n",
+ "ax.plot(\n",
+ " np.arange(N_BEAMS),\n",
+ " model(fit) - nominal,\n",
+ " color=ORANGE,\n",
+ " label=f\"fit: spacing {fitted_spacing:.4f} deg, roll {fitted_roll:+.3f} deg\",\n",
+ ")\n",
"ax.axhline(0, color=GRAY, lw=0.8)\n",
- "ax.set(xlabel=\"ATMS beam index (0 = left edge)\", ylabel=\"Scan angle minus nominal (deg)\", title=\"ATMS scan angles\")\n",
+ "ax.set(\n",
+ " xlabel=\"ATMS beam index (0 = left edge)\",\n",
+ " ylabel=\"Scan angle minus nominal (deg)\",\n",
+ " title=\"ATMS scan angles\",\n",
+ ")\n",
"ax.legend(frameon=False)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -575,10 +666,10 @@
"id": "de8f33a7",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:26.948456Z",
- "iopub.status.busy": "2026-10-08T17:41:26.948456Z",
- "iopub.status.idle": "2026-10-08T17:41:29.004153Z",
- "shell.execute_reply": "2026-10-08T17:41:29.004153Z"
+ "iopub.execute_input": "2026-10-25T13:48:35.959756Z",
+ "iopub.status.busy": "2026-10-25T13:48:35.959756Z",
+ "iopub.status.idle": "2026-10-25T13:48:37.531840Z",
+ "shell.execute_reply": "2026-10-25T13:48:37.531840Z"
}
},
"outputs": [
@@ -669,7 +760,9 @@
" \"\"\"Signed angle (deg) from the horizontal projection of a reference direction to that of a direction.\"\"\"\n",
" a = normalize(reference - np.sum(reference * u2, axis=-1, keepdims=True) * u2)\n",
" b = normalize(direction - np.sum(direction * u2, axis=-1, keepdims=True) * u2)\n",
- " return np.degrees(np.arctan2(np.sum(np.cross(a, b) * u2, axis=-1), np.sum(a * b, axis=-1)))\n",
+ " return np.degrees(\n",
+ " np.arctan2(np.sum(np.cross(a, b) * u2, axis=-1), np.sum(a * b, axis=-1))\n",
+ " )\n",
"\n",
"\n",
"yaw_earth_fixed = yaw(normal, sc_vel[i2])\n",
@@ -678,11 +771,27 @@
"out_of_plane = np.degrees(np.abs(np.arcsin(np.einsum(\"kjc,kc->kj\", los[i2], normal))))\n",
"\n",
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
- "for mask, color, label in [(ascending, BLUE, \"ascending\"), (~ascending, AQUA, \"descending\")]:\n",
- " ax.scatter(sub_lat[mask], yaw_earth_fixed[mask], s=3, color=color, label=f\"vs. Earth-fixed velocity, {label}\")\n",
- "ax.scatter(sub_lat, yaw_inertial, s=3, color=ORANGE, label=\"vs. inertial velocity, both\")\n",
+ "for mask, color, label in [\n",
+ " (ascending, BLUE, \"ascending\"),\n",
+ " (~ascending, AQUA, \"descending\"),\n",
+ "]:\n",
+ " ax.scatter(\n",
+ " sub_lat[mask],\n",
+ " yaw_earth_fixed[mask],\n",
+ " s=3,\n",
+ " color=color,\n",
+ " label=f\"vs. Earth-fixed velocity, {label}\",\n",
+ " )\n",
+ "ax.scatter(\n",
+ " sub_lat, yaw_inertial, s=3, color=ORANGE, label=\"vs. inertial velocity, both\"\n",
+ ")\n",
"ax.axhline(0, color=GRAY, lw=0.8)\n",
- "ax.set(xlabel=\"Sub-satellite latitude (deg)\", ylabel=\"Scan plane yaw (deg)\", title=\"Orientation of the ATMS scan plane\", ylim=(-5, 5))\n",
+ "ax.set(\n",
+ " xlabel=\"Sub-satellite latitude (deg)\",\n",
+ " ylabel=\"Scan plane yaw (deg)\",\n",
+ " title=\"Orientation of the ATMS scan plane\",\n",
+ " ylim=(-5, 5),\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8, markerscale=4, loc=\"center\")\n",
"fig.tight_layout()\n",
"plt.show()\n",
@@ -700,14 +809,14 @@
"id": "10096da4",
"metadata": {},
"source": [
- "The lines of sight of each scan lie in a plane (to within about 0.03 deg) that faces the inertial velocity at all latitudes, to within a constant 0.06 deg, whereas the Earth-fixed velocity is rotated by up to 4 deg, with opposite signs on ascending and descending passes. A `PointedInstrument` with `velocity_frame=VelocityFrame.INERTIAL` reproduces this orientation; the Earth-fixed default would rotate the scan line about nadir, displacing the swath edges (about 1,280 km from the ground track) by up to about 85 km along track.\n",
+ "The lines of sight of each scan lie in a plane (to within about 0.03 deg) that faces the inertial velocity at all latitudes, to within a constant 0.06 deg, whereas the Earth-fixed velocity is rotated by up to 4 deg, with opposite signs on ascending and descending passes. A satellite with an inertial velocity frame (`Attitude(velocity_frame=VelocityFrame.INERTIAL)`), whose instruments' views are rotated from its body, reproduces this orientation; the Earth-fixed default would rotate the scan line about nadir, displacing the swath edges (about 1,280 km from the ground track) by up to about 85 km along track.\n",
"\n",
"## Test 3: Beam Geolocation\n",
"\n",
"TAT-C pixel positions from `collect_ground_pixels`, at the middle time of every hundredth scan, are compared with the ATMS beam centers. Four configurations isolate the contributions of the along-track reference direction, the scan angles, and scan timing:\n",
"\n",
"* **Nominal, Earth-fixed:** 1.11 deg spacing with TAT-C's default velocity frame.\n",
- "* **Nominal, inertial:** the same with `velocity_frame=VelocityFrame.INERTIAL`.\n",
+ "* **Nominal, inertial:** the same on a satellite with `Attitude(velocity_frame=VelocityFrame.INERTIAL)`.\n",
"* **Fitted, inertial:** the spacing and roll angle fitted in Test 2.\n",
"* **Fitted, inertial, sample times:** the same, but with each pixel projected at its own beam's sample time rather than all at the scan's middle time. TAT-C does not do this; it is computed here (with `PointedInstrument.compute_projected_pixel_position`) to quantify the effect of scan timing.\n",
"\n",
@@ -720,10 +829,10 @@
"id": "876c016d",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:29.007159Z",
- "iopub.status.busy": "2026-10-08T17:41:29.006159Z",
- "iopub.status.idle": "2026-10-08T17:41:43.834942Z",
- "shell.execute_reply": "2026-10-08T17:41:43.834942Z"
+ "iopub.execute_input": "2026-10-25T13:48:37.533891Z",
+ "iopub.status.busy": "2026-10-25T13:48:37.533891Z",
+ "iopub.status.idle": "2026-10-25T13:48:46.533410Z",
+ "shell.execute_reply": "2026-10-25T13:48:46.533410Z"
}
},
"outputs": [
@@ -860,19 +969,21 @@
"i3 = np.arange(0, len(t_mid), 100)\n",
"times3 = list(t_mid[i3])\n",
"configs = {\n",
- " \"nominal, Earth-fixed\": atms_pixels,\n",
- " \"nominal, inertial\": atms_pixels.model_copy(update={\"velocity_frame\": VelocityFrame.INERTIAL}),\n",
- " \"fitted, inertial\": atms_pixels.model_copy(\n",
- " update={\n",
- " \"velocity_frame\": VelocityFrame.INERTIAL,\n",
- " \"cross_track_field_of_view\": N_BEAMS * fitted_spacing,\n",
- " \"roll_angle\": fitted_roll,\n",
- " }\n",
+ " \"nominal, Earth-fixed\": on_noaa20(atms_pixels),\n",
+ " \"nominal, inertial\": on_noaa20(atms_pixels, INERTIAL),\n",
+ " \"fitted, inertial\": on_noaa20(\n",
+ " atms_pixels.model_copy(\n",
+ " update={\n",
+ " \"cross_track_field_of_view\": N_BEAMS * fitted_spacing,\n",
+ " \"roll_angle\": fitted_roll,\n",
+ " }\n",
+ " ),\n",
+ " INERTIAL,\n",
" ),\n",
"}\n",
"pixels = {}\n",
- "for name, instrument in configs.items():\n",
- " track = collect_ground_pixels(noaa20.model_copy(update={\"instruments\": [instrument]}), times3)\n",
+ "for name, satellite in configs.items():\n",
+ " track = collect_ground_pixels(satellite, times3)\n",
" # one row per time and pixel (TAT-C pixel 0 on the right); reverse to ATMS beam order\n",
" pixels[name] = (\n",
" track.geometry.x.to_numpy().reshape(len(i3), N_BEAMS)[:, ::-1],\n",
@@ -880,21 +991,38 @@
" )\n",
"lon3, lat3 = np.zeros((len(i3), N_BEAMS)), np.zeros((len(i3), N_BEAMS))\n",
"for j in range(N_BEAMS):\n",
- " position = configs[\"fitted, inertial\"].compute_projected_pixel_position(\n",
- " orbit.get_orbit_track([t + timedelta(seconds=beam_offset[j]) for t in times3]), N_BEAMS - 1 - j, 0\n",
+ " position = (\n",
+ " configs[\"fitted, inertial\"]\n",
+ " .get_instrument()\n",
+ " .compute_projected_pixel_position(\n",
+ " orbit.get_orbit_track(\n",
+ " [t + timedelta(seconds=beam_offset[j]) for t in times3]\n",
+ " ),\n",
+ " N_BEAMS - 1 - j,\n",
+ " 0,\n",
+ " )\n",
" )\n",
" lon3[:, j], lat3[:, j] = position.longitude.degrees, position.latitude.degrees\n",
"pixels[\"fitted, inertial, sample times\"] = (lon3, lat3)\n",
"\n",
"residuals3 = {\n",
- " name: along_right(beam_lon[i3], beam_lat[i3], ecef(lon, lat) - ecef(beam_lon[i3], beam_lat[i3]), sc_vel[i3, np.newaxis])\n",
+ " name: along_right(\n",
+ " beam_lon[i3],\n",
+ " beam_lat[i3],\n",
+ " ecef(lon, lat) - ecef(beam_lon[i3], beam_lat[i3]),\n",
+ " sc_vel[i3, np.newaxis],\n",
+ " )\n",
" for name, (lon, lat) in pixels.items()\n",
"}\n",
"pd.DataFrame(\n",
" {\n",
" (name, component): summarize(values).loc[[\"median\", \"p95 |x|\", \"max |x|\"]]\n",
" for name, (along, right) in residuals3.items()\n",
- " for component, values in [(\"along\", along), (\"right\", right), (\"horizontal\", np.hypot(along, right))]\n",
+ " for component, values in [\n",
+ " (\"along\", along),\n",
+ " (\"right\", right),\n",
+ " (\"horizontal\", np.hypot(along, right)),\n",
+ " ]\n",
" }\n",
").T.round(2)"
]
@@ -905,10 +1033,10 @@
"id": "e6f60117",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:43.837955Z",
- "iopub.status.busy": "2026-10-08T17:41:43.836949Z",
- "iopub.status.idle": "2026-10-08T17:41:44.487297Z",
- "shell.execute_reply": "2026-10-08T17:41:44.486792Z"
+ "iopub.execute_input": "2026-10-25T13:48:46.536217Z",
+ "iopub.status.busy": "2026-10-25T13:48:46.536217Z",
+ "iopub.status.idle": "2026-10-25T13:48:46.977211Z",
+ "shell.execute_reply": "2026-10-25T13:48:46.976696Z"
}
},
"outputs": [
@@ -985,10 +1113,10 @@
"id": "07443446",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:44.490303Z",
- "iopub.status.busy": "2026-10-08T17:41:44.490303Z",
- "iopub.status.idle": "2026-10-08T17:41:45.045639Z",
- "shell.execute_reply": "2026-10-08T17:41:45.045639Z"
+ "iopub.execute_input": "2026-10-25T13:48:46.979217Z",
+ "iopub.status.busy": "2026-10-25T13:48:46.979217Z",
+ "iopub.status.idle": "2026-10-25T13:48:47.347754Z",
+ "shell.execute_reply": "2026-10-25T13:48:47.347754Z"
}
},
"outputs": [
@@ -1074,32 +1202,63 @@
],
"source": [
"i4 = np.arange(0, len(t_mid), 5)\n",
- "observed_width = np.sum(\n",
- " np.linalg.norm(np.diff(beam_xyz[i4], axis=1), axis=-1), axis=1\n",
- ") / 1e3\n",
+ "observed_width = (\n",
+ " np.sum(np.linalg.norm(np.diff(beam_xyz[i4], axis=1), axis=-1), axis=1) / 1e3\n",
+ ")\n",
"sub4 = wgs84.geographic_position_of(orbit.get_orbit_track(list(t_mid[i4])))\n",
"# as in collect_observations\n",
- "apogee_altitude = compute_apoapsis_radius(noaa20.orbit.get_semimajor_axis(), noaa20.orbit.get_eccentricity()) - EARTH_MEAN_RADIUS\n",
+ "apogee_altitude = (\n",
+ " compute_apoapsis_radius(\n",
+ " noaa20.orbit.get_semimajor_axis(), noaa20.orbit.get_eccentricity()\n",
+ " )\n",
+ " - EARTH_MEAN_RADIUS\n",
+ ")\n",
"swath_width = np.vectorize(field_of_regard_to_swath_width)\n",
"# the field of regard at the geodetic altitude equivalent to the minimum elevation angle in collect_observations\n",
"min_elevation_angle = compute_min_elevation_angle(apogee_altitude, 2 * EDGE)\n",
- "equivalent_field_of_regard = np.vectorize(compute_field_of_regard)(sub4.elevation.m, min_elevation_angle)\n",
+ "equivalent_field_of_regard = np.vectorize(compute_field_of_regard)(\n",
+ " sub4.elevation.m, min_elevation_angle\n",
+ ")\n",
"widths = {\n",
" \"nominal field of regard\": swath_width(sub4.elevation.m, 2 * EDGE) / 1e3,\n",
- " \"nominal field of regard, collect_observations\": swath_width(sub4.elevation.m, equivalent_field_of_regard) / 1e3,\n",
- " \"measured field of regard\": swath_width(sub4.elevation.m, measured[0] - measured[-1]) / 1e3,\n",
+ " \"nominal field of regard, collect_observations\": swath_width(\n",
+ " sub4.elevation.m, equivalent_field_of_regard\n",
+ " )\n",
+ " / 1e3,\n",
+ " \"measured field of regard\": swath_width(\n",
+ " sub4.elevation.m, measured[0] - measured[-1]\n",
+ " )\n",
+ " / 1e3,\n",
"}\n",
"edges4 = np.arange(-90, 91, 5)\n",
"centers4 = (edges4[:-1] + edges4[1:]) / 2\n",
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
- "ax.plot(centers4, binned(sub4.latitude.degrees, observed_width, edges4)[:, 1], color=INK, marker=\"o\", ms=3, label=\"observed (ATMS)\")\n",
+ "ax.plot(\n",
+ " centers4,\n",
+ " binned(sub4.latitude.degrees, observed_width, edges4)[:, 1],\n",
+ " color=INK,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " label=\"observed (ATMS)\",\n",
+ ")\n",
"for (name, width), color in zip(widths.items(), [BLUE, ORANGE, AQUA]):\n",
- " ax.plot(centers4, binned(sub4.latitude.degrees, width, edges4)[:, 1], color=color, label=f\"TAT-C: {name}\")\n",
- "ax.set(xlabel=\"Sub-satellite latitude (deg)\", ylabel=\"Swath width (km)\", title=\"ATMS swath width\")\n",
+ " ax.plot(\n",
+ " centers4,\n",
+ " binned(sub4.latitude.degrees, width, edges4)[:, 1],\n",
+ " color=color,\n",
+ " label=f\"TAT-C: {name}\",\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Sub-satellite latitude (deg)\",\n",
+ " ylabel=\"Swath width (km)\",\n",
+ " title=\"ATMS swath width\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()\n",
- "pd.DataFrame({name: summarize(width - observed_width) for name, width in widths.items()}).T.round(1)"
+ "pd.DataFrame(\n",
+ " {name: summarize(width - observed_width) for name, width in widths.items()}\n",
+ ").T.round(1)"
]
},
{
@@ -1125,10 +1284,10 @@
"id": "5f00a5ef",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:45.049167Z",
- "iopub.status.busy": "2026-10-08T17:41:45.048161Z",
- "iopub.status.idle": "2026-10-08T17:42:44.857993Z",
- "shell.execute_reply": "2026-10-08T17:42:44.857461Z"
+ "iopub.execute_input": "2026-10-25T13:48:47.350168Z",
+ "iopub.status.busy": "2026-10-25T13:48:47.350168Z",
+ "iopub.status.idle": "2026-10-25T13:49:33.623537Z",
+ "shell.execute_reply": "2026-10-25T13:49:33.623030Z"
}
},
"outputs": [
@@ -1246,17 +1405,33 @@
" for dk in (-1, 0):\n",
" for dj in (-1, 0):\n",
" kk, jj = k + dk, j + dj\n",
- " valid = (kk >= 0) & (kk < len(cells) - 1) & (jj >= 0) & (jj < N_BEAMS - 1)\n",
+ " valid = (\n",
+ " (kk >= 0) & (kk < len(cells) - 1) & (jj >= 0) & (jj < N_BEAMS - 1)\n",
+ " )\n",
" kk, jj = np.clip(kk, 0, len(cells) - 2), np.clip(jj, 0, N_BEAMS - 2)\n",
" valid &= contiguous[k0 + kk]\n",
- " corners = [cells[kk, jj], cells[kk, jj + 1], cells[kk + 1, jj + 1], cells[kk + 1, jj]]\n",
- " signs = np.stack([np.sum(np.cross(a, b) * points, axis=-1) for a, b in zip(corners, corners[1:] + corners[:1])])\n",
- " inside |= valid & (np.all(signs >= 0, axis=0) | np.all(signs <= 0, axis=0))\n",
+ " corners = [\n",
+ " cells[kk, jj],\n",
+ " cells[kk, jj + 1],\n",
+ " cells[kk + 1, jj + 1],\n",
+ " cells[kk + 1, jj],\n",
+ " ]\n",
+ " signs = np.stack(\n",
+ " [\n",
+ " np.sum(np.cross(a, b) * points, axis=-1)\n",
+ " for a, b in zip(corners, corners[1:] + corners[:1])\n",
+ " ]\n",
+ " )\n",
+ " inside |= valid & (\n",
+ " np.all(signs >= 0, axis=0) | np.all(signs <= 0, axis=0)\n",
+ " )\n",
" return inside\n",
"\n",
"\n",
"STEP4, MARGIN4 = 0.1, 128 # deg, s\n",
- "lon_grid, lat_grid = np.meshgrid(np.arange(-180 + STEP4 / 2, 180, STEP4), np.arange(-90 + STEP4 / 2, 90, STEP4))\n",
+ "lon_grid, lat_grid = np.meshgrid(\n",
+ " np.arange(-180 + STEP4 / 2, 180, STEP4), np.arange(-90 + STEP4 / 2, 90, STEP4)\n",
+ ")\n",
"cell_area = np.cos(np.radians(lat_grid)) * (STEP4 * 111.32) ** 2 # km^2\n",
"grid_unit = unit_vector(lat_grid.ravel(), lon_grid.ravel())\n",
"orbit_start = datetime(2026, 10, 2, 12, tzinfo=timezone.utc)\n",
@@ -1264,22 +1439,36 @@
"scans4 = np.nonzero((t_mid >= orbit_start) & (t_mid < orbit_start + orbit_period))[0]\n",
"first, last = t_mid[scans4[0]].to_pydatetime(), t_mid[scans4[-1]].to_pydatetime()\n",
"# grid cells near beams sampled away from the ends of the orbit\n",
- "distance, nearest = cKDTree(beam_unit[scans4].reshape(-1, 3)).query(grid_unit, workers=-1)\n",
- "nearest_time = (t_mid[scans4] - t_mid[scans4[0]]).total_seconds().to_numpy()[nearest // N_BEAMS]\n",
- "compared = (distance < 2 * np.sin(300 / 6371 / 2)) & (nearest_time > MARGIN4) & (nearest_time < (last - first).total_seconds() - MARGIN4)\n",
+ "distance, nearest = cKDTree(beam_unit[scans4].reshape(-1, 3)).query(\n",
+ " grid_unit, workers=-1\n",
+ ")\n",
+ "nearest_time = (\n",
+ " (t_mid[scans4] - t_mid[scans4[0]]).total_seconds().to_numpy()[nearest // N_BEAMS]\n",
+ ")\n",
+ "compared = (\n",
+ " (distance < 2 * np.sin(300 / 6371 / 2))\n",
+ " & (nearest_time > MARGIN4)\n",
+ " & (nearest_time < (last - first).total_seconds() - MARGIN4)\n",
+ ")\n",
"observed4 = np.zeros(len(grid_unit), dtype=bool)\n",
"observed4[compared] = observed_cells(grid_unit[compared], scans4)\n",
- "ground_speed = 2 * np.pi * 6371.0088e3 / orbit_period.total_seconds() # m/s, approximate\n",
+ "ground_speed = (\n",
+ " 2 * np.pi * 6371.0088e3 / orbit_period.total_seconds()\n",
+ ") # m/s, approximate\n",
"altitude = float(np.median(sub4.elevation.m))\n",
"\n",
"\n",
- "def swath_area_row(instrument, time_step):\n",
+ "def swath_area_row(instrument, time_step, attitude=None):\n",
" n = int((last - first).total_seconds() // time_step)\n",
" times = [first + timedelta(seconds=time_step * (i + 0.5)) for i in range(n)]\n",
- " geometry = compute_ground_track(noaa20.model_copy(update={\"instruments\": [instrument]}), times).geometry.iloc[0]\n",
+ " geometry = compute_ground_track(\n",
+ " on_noaa20(instrument, attitude), times\n",
+ " ).geometry.iloc[0]\n",
" prepare(geometry)\n",
" predicted = np.zeros(len(grid_unit), dtype=bool)\n",
- " predicted[compared] = contains_xy(geometry, lon_grid.ravel()[compared], lat_grid.ravel()[compared])\n",
+ " predicted[compared] = contains_xy(\n",
+ " geometry, lon_grid.ravel()[compared], lat_grid.ravel()[compared]\n",
+ " )\n",
" area = lambda mask: np.sum(mask * cell_area.ravel()) / 1e6\n",
" return predicted.reshape(lat_grid.shape), {\n",
" \"observed (10^6 km^2)\": area(observed4),\n",
@@ -1291,8 +1480,8 @@
"\n",
"\n",
"swath_rows, swath_maps = {}, {}\n",
- "swath_maps[\"field of regard, 60 s\"], swath_rows[\"field of regard, 60 s\"] = swath_area_row(\n",
- " Instrument(name=\"ATMS\", field_of_regard=2 * EDGE), 60\n",
+ "swath_maps[\"field of regard, 60 s\"], swath_rows[\"field of regard, 60 s\"] = (\n",
+ " swath_area_row(Instrument(name=\"ATMS\", field_of_regard=2 * EDGE), 60)\n",
")\n",
"for time_step in [SCAN_PERIOD, 32, 128]:\n",
" along_fov = np.degrees(2 * np.arctan(ground_speed * time_step / 2 / altitude))\n",
@@ -1304,9 +1493,9 @@
" cross_track_field_of_view=2 * EDGE,\n",
" along_track_field_of_view=along_fov,\n",
" is_rectangular=True,\n",
- " velocity_frame=VelocityFrame.INERTIAL,\n",
" ),\n",
" time_step,\n",
+ " INERTIAL,\n",
" )\n",
"observed4 = observed4.reshape(lat_grid.shape)\n",
"pd.DataFrame(swath_rows).T.round(3)"
@@ -1318,10 +1507,10 @@
"id": "bfe341fe",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:42:44.860636Z",
- "iopub.status.busy": "2026-10-08T17:42:44.860636Z",
- "iopub.status.idle": "2026-10-08T17:42:55.467909Z",
- "shell.execute_reply": "2026-10-08T17:42:55.467909Z"
+ "iopub.execute_input": "2026-10-25T13:49:33.625539Z",
+ "iopub.status.busy": "2026-10-25T13:49:33.625539Z",
+ "iopub.status.idle": "2026-10-25T13:49:40.785662Z",
+ "shell.execute_reply": "2026-10-25T13:49:40.785662Z"
}
},
"outputs": [
@@ -1337,15 +1526,24 @@
}
],
"source": [
- "fig, axes = plt.subplots(1, 2, figsize=(12, 4.2), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, axes = plt.subplots(\n",
+ " 1, 2, figsize=(12, 4.2), subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"for ax, name in zip(axes, [list(swath_maps)[0], list(swath_maps)[-1]]):\n",
" predicted = swath_maps[name]\n",
- " category = np.where(observed4 & predicted, 1, np.where(observed4, 2, np.where(predicted, 3, 0))).astype(float)\n",
+ " category = np.where(\n",
+ " observed4 & predicted, 1, np.where(observed4, 2, np.where(predicted, 3, 0))\n",
+ " ).astype(float)\n",
" category[~compared.reshape(lat_grid.shape)] = 0\n",
" ax.pcolormesh(\n",
- " lon_grid, lat_grid, np.ma.masked_equal(category, 0),\n",
- " cmap=plt.matplotlib.colors.ListedColormap([\"#d9d8d3\", ORANGE, BLUE]), vmin=0.5, vmax=3.5,\n",
- " transform=ccrs.PlateCarree(), shading=\"auto\",\n",
+ " lon_grid,\n",
+ " lat_grid,\n",
+ " np.ma.masked_equal(category, 0),\n",
+ " cmap=plt.matplotlib.colors.ListedColormap([\"#d9d8d3\", ORANGE, BLUE]),\n",
+ " vmin=0.5,\n",
+ " vmax=3.5,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " shading=\"auto\",\n",
" )\n",
" ax.coastlines(color=GRAY, linewidth=0.5)\n",
" ax.set_global()\n",
@@ -1382,10 +1580,10 @@
"id": "b8a9a1f6",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:42:55.471435Z",
- "iopub.status.busy": "2026-10-08T17:42:55.471435Z",
- "iopub.status.idle": "2026-10-08T17:51:57.899165Z",
- "shell.execute_reply": "2026-10-08T17:51:57.898159Z"
+ "iopub.execute_input": "2026-10-25T13:49:40.788669Z",
+ "iopub.status.busy": "2026-10-25T13:49:40.788669Z",
+ "iopub.status.idle": "2026-10-25T13:53:04.410446Z",
+ "shell.execute_reply": "2026-10-25T13:53:04.410446Z"
}
},
"outputs": [
@@ -1449,9 +1647,9 @@
"
\n",
"
PointedInstrument, inertial
\n",
"
7402.0
\n",
+ "
7372.0
\n",
"
7371.0
\n",
- "
7370.0
\n",
- "
32.0
\n",
+ "
31.0
\n",
"
1.0
\n",
"
0.05
\n",
"
0.26
\n",
@@ -1466,7 +1664,7 @@
" observed predicted matched observed only \\\n",
"nadir Instrument 7402.0 7407.0 7380.0 22.0 \n",
"PointedInstrument, Earth-fixed 7402.0 7382.0 7380.0 22.0 \n",
- "PointedInstrument, inertial 7402.0 7371.0 7370.0 32.0 \n",
+ "PointedInstrument, inertial 7402.0 7372.0 7371.0 31.0 \n",
"\n",
" predicted only time, median (s) \\\n",
"nadir Instrument 27.0 0.06 \n",
@@ -1496,17 +1694,40 @@
"mid_s = (t_mid - t_mid[0]).total_seconds().to_numpy()\n",
"beam_s = mid_s[:, np.newaxis] + beam_offset[np.newaxis, :]\n",
"observed_rows = []\n",
- "for p, hits in enumerate(tree5.query_ball_point(point_unit, r=2 * np.sin(60 / 6371 / 2), workers=-1)):\n",
+ "for p, hits in enumerate(\n",
+ " tree5.query_ball_point(point_unit, r=2 * np.sin(60 / 6371 / 2), workers=-1)\n",
+ "):\n",
" if not hits:\n",
" continue\n",
" hits = np.array(hits)\n",
" hits = hits[np.argsort(beam_s.ravel()[hits])]\n",
- " for group in np.split(hits, np.nonzero(np.diff(beam_s.ravel()[hits]) > 1200)[0] + 1):\n",
- " k, j = np.divmod(group[np.argmin(np.linalg.norm(beam_unit.reshape(-1, 3)[group] - point_unit[p], axis=-1))], N_BEAMS)\n",
- " if not observed_cells(point_unit[[p]], np.arange(max(k - 1, 0), min(k + 2, len(t_mid))))[0]:\n",
+ " for group in np.split(\n",
+ " hits, np.nonzero(np.diff(beam_s.ravel()[hits]) > 1200)[0] + 1\n",
+ " ):\n",
+ " k, j = np.divmod(\n",
+ " group[\n",
+ " np.argmin(\n",
+ " np.linalg.norm(\n",
+ " beam_unit.reshape(-1, 3)[group] - point_unit[p], axis=-1\n",
+ " )\n",
+ " )\n",
+ " ],\n",
+ " N_BEAMS,\n",
+ " )\n",
+ " if not observed_cells(\n",
+ " point_unit[[p]], np.arange(max(k - 1, 0), min(k + 2, len(t_mid)))\n",
+ " )[0]:\n",
" continue\n",
" # interpolate between the scans before and after the point\n",
- " k0 = k - 1 if np.sum((point_unit[p] - beam_unit[k, j]) * (beam_unit[k, j] - beam_unit[k - 1, j])) < 0 else k\n",
+ " k0 = (\n",
+ " k - 1\n",
+ " if np.sum(\n",
+ " (point_unit[p] - beam_unit[k, j])\n",
+ " * (beam_unit[k, j] - beam_unit[k - 1, j])\n",
+ " )\n",
+ " < 0\n",
+ " else k\n",
+ " )\n",
" k0 = int(np.clip(k0, 0, len(t_mid) - 2))\n",
" a, b = beam_unit[k0, j], beam_unit[k0 + 1, j]\n",
" f = np.clip(np.sum((point_unit[p] - a) * (b - a)) / np.sum((b - a) ** 2), 0, 1)\n",
@@ -1519,25 +1740,28 @@
" \"point_id\": p,\n",
" \"time\": t_mid[0] + timedelta(seconds=float(seconds)),\n",
" \"scan_angle\": scan_angle[k0, j],\n",
- " \"elevation\": np.degrees(np.arcsin(np.sum(normalize(position - target) * u))),\n",
+ " \"elevation\": np.degrees(\n",
+ " np.arcsin(np.sum(normalize(position - target) * u))\n",
+ " ),\n",
" }\n",
" )\n",
"observed5 = pd.DataFrame(observed_rows)\n",
- "start5, end5 = t_start[0].to_pydatetime(), t_start[-1].to_pydatetime() + timedelta(seconds=SCAN_PERIOD)\n",
+ "start5, end5 = t_start[0].to_pydatetime(), t_start[-1].to_pydatetime() + timedelta(\n",
+ " seconds=SCAN_PERIOD\n",
+ ")\n",
"along_fov5 = np.degrees(2 * np.arctan(ground_speed * SCAN_PERIOD / 2 / altitude))\n",
- "instruments5 = {\n",
- " \"nadir Instrument\": Instrument(name=\"ATMS\", field_of_regard=2 * EDGE),\n",
- " \"PointedInstrument, Earth-fixed\": PointedInstrument(\n",
- " name=\"ATMS\",\n",
- " field_of_regard=2 * EDGE,\n",
- " cross_track_field_of_view=2 * EDGE,\n",
- " along_track_field_of_view=along_fov5,\n",
- " is_rectangular=True,\n",
- " ),\n",
- "}\n",
- "instruments5[\"PointedInstrument, inertial\"] = instruments5[\"PointedInstrument, Earth-fixed\"].model_copy(\n",
- " update={\"velocity_frame\": VelocityFrame.INERTIAL}\n",
+ "pointed5 = PointedInstrument(\n",
+ " name=\"ATMS\",\n",
+ " field_of_regard=2 * EDGE,\n",
+ " cross_track_field_of_view=2 * EDGE,\n",
+ " along_track_field_of_view=along_fov5,\n",
+ " is_rectangular=True,\n",
")\n",
+ "satellites5 = {\n",
+ " \"nadir Instrument\": on_noaa20(Instrument(name=\"ATMS\", field_of_regard=2 * EDGE)),\n",
+ " \"PointedInstrument, Earth-fixed\": on_noaa20(pointed5),\n",
+ " \"PointedInstrument, inertial\": on_noaa20(pointed5, INERTIAL),\n",
+ "}\n",
"\n",
"\n",
"def match(predicted):\n",
@@ -1545,18 +1769,22 @@
" merged = pd.merge_asof(\n",
" observed5.sort_values(\"time\"),\n",
" predicted[[\"point_id\", \"epoch\", \"sat_alt\"]].sort_values(\"epoch\"),\n",
- " left_on=\"time\", right_on=\"epoch\", by=\"point_id\",\n",
- " direction=\"nearest\", tolerance=pd.Timedelta(minutes=10),\n",
+ " left_on=\"time\",\n",
+ " right_on=\"epoch\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=10),\n",
" )\n",
" return merged\n",
"\n",
"\n",
"predicted5, matched5, rows5 = {}, {}, {}\n",
- "for name, instrument in instruments5.items():\n",
- " satellite = noaa20.model_copy(update={\"instruments\": [instrument]})\n",
+ "for name, satellite in satellites5.items():\n",
" predicted5[name] = pd.concat(\n",
" [\n",
- " collect_observations(Point(latitude=g.y, longitude=g.x), satellite, start5, end5).assign(point_id=p)\n",
+ " collect_observations(\n",
+ " Point(latitude=g.y, longitude=g.x), satellite, start5, end5\n",
+ " ).assign(point_id=p)\n",
" for p, g in enumerate(points5.geometry)\n",
" ]\n",
" ).reset_index(drop=True)\n",
@@ -1571,8 +1799,12 @@
" \"predicted only\": len(predicted5[name]) - int(hit.sum()),\n",
" \"time, median (s)\": np.median(dt),\n",
" \"time, p95 |x| (s)\": np.percentile(np.abs(dt), 95),\n",
- " \"elevation, median (deg)\": np.median((matched5[name].sat_alt - matched5[name].elevation)[hit]),\n",
- " \"elevation, p95 |x| (deg)\": np.percentile(np.abs(matched5[name].sat_alt - matched5[name].elevation)[hit], 95),\n",
+ " \"elevation, median (deg)\": np.median(\n",
+ " (matched5[name].sat_alt - matched5[name].elevation)[hit]\n",
+ " ),\n",
+ " \"elevation, p95 |x| (deg)\": np.percentile(\n",
+ " np.abs(matched5[name].sat_alt - matched5[name].elevation)[hit], 95\n",
+ " ),\n",
" }\n",
"pd.DataFrame(rows5).T.round(2)"
]
@@ -1583,16 +1815,16 @@
"id": "bcefd495",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:51:57.903706Z",
- "iopub.status.busy": "2026-10-08T17:51:57.903192Z",
- "iopub.status.idle": "2026-10-08T17:51:58.329050Z",
- "shell.execute_reply": "2026-10-08T17:51:58.329050Z"
+ "iopub.execute_input": "2026-10-25T13:53:04.412662Z",
+ "iopub.status.busy": "2026-10-25T13:53:04.412662Z",
+ "iopub.status.idle": "2026-10-25T13:53:04.692141Z",
+ "shell.execute_reply": "2026-10-25T13:53:04.692141Z"
}
},
"outputs": [
{
"data": {
- "image/png": "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e/dm1apVzJ8/nwMHDtClSxcSExMve14hhBAiR58+fTAajfz000/eZSdPnqRJkybMnTuX7777jldeeYVz585x3XXXFbrm2MMPP0xaWhrLli3zWX7w4EHWr1/PQw89dNn9Z86cyb333kuLFi348ssveeONN9i7dy+dO3fOdW/hdDrp06cPvXr1YtWqVUycOJH33nuPu+66y7vNli1buOuuu2jYsCGffvop33zzDc8++ywul8u7jcVioVu3bixZsoRJkybxv//9j8cff5zFixfTv39/ny9nAFatWsU777zDs88+y3fffUfPnj0ZOXIkX3zxBWaz2WfbTz75BJvN5r3/sdvtpKam8thjj7Fq1So++eQTb++cDz/80CfukJAQ+vTp473PmD9/fr7XbdmyZQwYMIDIyEg++eQTFixYQFpaGt27d2fz5s25th88eDDXXnstX3zxBU888QTLli3jkUceKdR1E6JUU0KIUi8hIUEB6u67777sdnfddZcCVGJiolJKqeeee04B6pFHHvHZ7uOPP1aA+uijj5RSSq1YsUIBavfu3fke+5NPPlGA+uKLL3yWb9++XQFq/vz53mX16tVTRqNR/f777z7bnj9/XgUGBqonn3zSZ/nQoUNV9erVldPpzPPcbrdbOZ1O9fzzz6uqVasqXde961q0aKG6deuWa58TJ04oQC1atMi77Prrr1cxMTEqMzPTu8zlcqmWLVuq2rVre4+7aNEiBagJEyb4HHP27NkKUOfOncszzhwPPfSQyu/Pa7169dSYMWO8z9evX68A1a9fP5/tJk+erAA1adIkn+V33nmnqlKlivf5li1bFKBef/11n+1Onz6tQkJC1NSpUy8bqxBCiIoj5/1t+/bt+W5TvXp11axZs3zXu1wulZWVpcLCwtQbb7zhXZ7zfrZ+/Xrvspz7kIt169ZNxcXF+Sx78MEHVWRkpM/786XS0tJUSEiI6tOnj8/yU6dOqaCgIDV8+HDvsjFjxijAJz6llHrppZcUoDZv3qyUUuq1115TgEpPT8/3vDNnzlQGgyHXNcu5d1qzZo13GaCioqJUamqqz7Z79+5VgHr//fd9lnfs2FG1b98+33O7XC7ldDrVvffeq9q2beuzLiwszOd+Iselr4Pb7Va1atVSrVq1Um6327tdZmamiomJUV26dPEuy3m9Zs+e7XPMCRMmqODgYO99UkGumxClmfQEEaIcURe+jbi0EvuIESN8ng8dOhSTycT69esBiIuLIzAwkPHjx7NkyZI8h1GsXr2aSpUq0a9fP1wul/cRFxdHjRo1cnW7bN26Nddee63PsqpVq9KvXz+WLFmCrusApKWl8dVXXzF69GifYT7r1q2jd+/eREVFYTQaCQgI4NlnnyUlJeWqqtdnZ2fz66+/MmTIEJ+K8UajkVGjRnHmzBl+//13n3369++fq01Ari7AReGOO+7wed6sWTOAXIVdmzVrRmpqqndIzOrVq9E0jZEjR/q8LjVq1KBNmzZSHV4IIUShqEt6NmRlZfH444/TuHFjTCYTJpOJ8PBwsrOz8x2GcjkPP/wwu3fv5ueffwY8Q02WLl3KmDFjLjujy5YtW7BarblmWKtTpw49e/bkxx9/zLXPpfc/w4cPB/De/1x33XWA575o+fLlxMfH5zrG6tWradmyJXFxcT7vs7feemuew0569uxJ5cqVfZa1atWK9u3bs2jRIu+yQ4cOsW3btlxDSD7//HNuuOEGwsPDMZlMBAQEsGDBgqu61gC///47Z8+eZdSoURgMf330Cw8PZ/DgwWzdujXXEKG87n9sNpv3/qsg102I0kySIEKUAdHR0YSGhnLixInLbnfy5ElCQ0OpUqWKz/IaNWr4PDeZTFStWpWUlBQAGjVqxNq1a4mJieGhhx6iUaNGNGrUiDfeeMO7T2JiIunp6QQGBhIQEODzSEhIyNUlNr/hH+PGjSM+Pp4ffvgB8HQFtdvtPjc127Zt45ZbbgHgP//5Dz///DPbt2/nqaeeAsg19KYg0tLSUErlGVetWrUAvNcjR9WqVX2eBwUFXfX5r+TS1ywwMPCyy202G+B5XZRSVK9ePdfrsnXr1nI9PbIQQoiilZ2dTUpKivd9ETyJg3nz5nHffffx3XffsW3bNrZv3061atWu6v1wwIAB1K9f31s/a/HixWRnZ19xKEzOe3R+7+OXvofn3OtcLOd+KGfbrl27smrVKlwuF6NHj6Z27dq0bNmSTz75xLtPYmIie/fuzfUeGxERgVKqUPc/W7Zs4fDhw4Bnhp6goCCGDRvm3ebLL79k6NChxMbG8tFHH7Flyxa2b9/OuHHjvO/7hXWl66brOmlpaT7Lr3T/U5DrJkRpJrPDCFEGGI1GevTowbfffsuZM2fyrAty5swZdu7cye23347RaPRZl5CQQGxsrPe5y+UiJSXF503upptu4qabbsLtdrNjxw7eeustJk+eTPXq1bn77ru9xUG//fbbPGOMiIjweX5pb5Qct956K7Vq1WLRokXceuutLFq0iE6dOtG8eXPvNp9++ikBAQGsXr2a4OBg7/K8poIrqMqVK2MwGDh37lyudTnFTqOjo6/6+P4SHR2Npmls2rTJe5NysbyWCSGEEHn55ptvcLvd3iKbGRkZrF69mueee44nnnjCu11O7YqrYTAYeOihh3jyySd5/fXXmT9/Pr169aJJkyaX3S/nniW/9/FL38PzutdJSEjwORZ4kjIDBgzAbrezdetWZs6cyfDhw6lfvz6dO3cmOjqakJAQFi5cmGdcl543v/ufYcOGMWXKFBYvXsxLL73E0qVLufPOO316jXz00Uc0aNCAzz77zOc4drs9z2MWxJWum8FgyNVzpSCudN2EKM2kJ4gQZcS0adNQSjFhwoRchU/dbjcPPvggSimmTZuWa9+PP/7Y5/ny5ctxuVzem5yLGY1GOnXq5P2GZteuXYBnuEZKSgput5sOHTrkelzp5uXi448aNYpVq1axadMmduzYkasrqKZpmEwmn2SO1Wpl6dKluY4XFBRUoG+iwsLC6NSpE19++aXP9rqu89FHH1G7du1cw3euVnH2GLnUHXfcgVKK+Pj4PF+XVq1aFXsMQgghyr5Tp07x2GOPERUVxf333w943o+VUrkS6h988EGue5HCuO+++wgMDGTEiBH8/vvvTJw48Yr7dO7cmZCQED766COf5WfOnGHdunX06tUr1z6X3v/kFGTN6/4nKCiIbt268corrwDw22+/AZ732WPHjlG1atU832dzZqW7ksqVK3PnnXfy4Ycfsnr1ahISEvK8/wkMDPRJgCQkJOSaHSYn3oLcZzRp0oTY2FiWLVvmM9QpOzubL774wjtjzNXK77oJUZpJTxAhyogbbriBuXPnMnnyZG688UYmTpxI3bp1OXXqFG+//Ta//vorc+fOpUuXLrn2/fLLLzGZTNx8880cOHCAZ555hjZt2jB06FAA3n33XdatW0ffvn2pW7cuNpvN+41H7969Abj77rv5+OOP6dOnDw8//DAdO3YkICCAM2fOsH79egYMGMDAgQML1JZx48bxyiuvMHz4cEJCQnwqtYOnDsacOXMYPnw448ePJyUlhdde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G8IkSoe72gfz8f+OYWj4X9KDYmhqtfN/dz7nHaZampSpJMiOHTt8CuzkDGMZM2YMixcvZurUqVitViZMmEBaWhqdOnXi+++/JyIiwl8hlygtKxWFBsFhPsslESKEEOWHcjnR0z0JELtLkZZdsXqA5EhOTuaee+7h22+/zXO9210xr0tBhQQHc7urBktJ5USrKBYt+ZAHxv/T32GJUuDSD9M5tY0uTRDklzC4eGiV0WjE5co7SauUYty4cT49Ey5eV1CXni/n337Dhg05ePAg69atY+3atUydOpXdu3fne5zw8L++SDSZTD5/Q2w232TTxQlDo9GYb5uVUjz99NOMGzeuQLHnd62u1ubNm5k3bx6//PIL1apV4+uvv/a53he3OT/5xThr1ixv75pXXnmFW2+99bLHcblc7N+/nypVqhAf7ykRoOs6mqaxffv2XFON5yTdRNmglGLGtIc5+cWX2BrU4fYXRvJU11GEhpTOz+FlKgnSvXv3y/5R1DSN6dOnM3369JILqpTRslI8PUKCfMdvO5w6iRkuYiJNmIySCBFCiLJIuV3oaYmgu3FWsKlwLzV58mTS09PZunUrPXr0YOXKlSQmJvLiiy/y+uuv+zu8MuGJAeNZ883znA8J4vv927nXeU+uDyKiZFWd+1P+Ky/5NrXq7O/z37aIC+P37t2b999/nxkzZpCcnMzKlStzDXm4ksjISDIyMrzP+/Xrx+jRo/nnP/9JnTp10HWdXbt20aFDB3r16sXSpUu56667cDqdLFu2jLp16xbqfGfOnKFy5cr079+f2267jVWrVnH69OlcceSlQYMGnDhxgpSUFACWLl1aqHPn6N+/P2+88QZ33nknVapUwel0sn//ftq2bXvZ/fKKcfTo0QwcOJCBAwcW+PxpaWlERkZSpUoVHA4H7713+d5BBbk2OZ544gmeeOKJAsfyxBNP0KRJE5YsWUKPHj1o3749jRs35qabbmLWrFk888wzAJw9exZd12natClWq5WffvqJrl27smLFigLHJkrON7szUApOb13GF198gclk4qP/LOT666/3d2iXVfr6poi/TctKAbsl13KHS+dchhObU/dDVEIIIf4OpbvR05NAd+PWFanZFXs69HXr1vF///d/XHfddRgMBurVq8fIkSOZPXs2M2fO9Hd4ZUJURAR9nZ5i8sdbRbF46Yd+jkho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UC86kBX3RrDyh19446slHOwdh0nXebfprcRWb+jv8IqMfHoVebNloWUker+tzIvDqXMu3UlKlgtdZpARQog8KaXQM86jzCmgFFan1P4oi1wuF08//TQNGjQgJCSEhg0b8vzzz5fr2VOqV6/u/QZ/9uzXaNasGUuWLPFzVOVbqCkw30ewMaDA24YY8/6Qe7V69+7trQOSnJzMypUr6dmzZ6GOERkZSUZGhvd5v379+PDDD701MnRd9w5R6dWrF0uXLsXlcmG1Wlm2rPA9kc6cOYOmafTv35/XXnsNpRSnT5/OFUdeGjRowIkTJ0hJSQE8tUuuRv/+/Zk/f753KI7T6eS333674n55xTh69GhWrlx5VXEAREREcNNNNzFr1izvsrNnz3LmzJl8YzCbzXmus9lsOJ1O6tSpA8Bbb7111XGJ0mXJkiV0bNuclx4bx6+rtlMzIZWnQmrTpU3Zng3mUpIEEflzOTzT6F4Yt56fTKub+HQn2XJDL4QQPpTLiZ6agLJle2d+ScmUmV/KoldeeYV3332XefPmcejQIWbPns2rr75arm/+4+Pj+WXrFno+cjfN3h1PWFQUkyZNIj4+3t+hiRL25ptvsnfvXlq3bk2PHj146qmn8hwKczmjRo1i2bJl3sKoXbt25eWXX2bAgAG0adOGli1b8tlnnwEwfvx46tatS/Pmzenbty833XRToWPet28fXbp0oXXr1rRr145Ro0bRunVrWrduTZMmTWjZsqW34OelYmNjeeyxx+jQoQMDBw6hUqVKhT5/TptHjhxJ9+7dadOmDXFxcaxfv/6K+/Xq1Yvs7GzatGnjLYy6c+dOateufVVx5Pj44485dOgQrVq1olWrVgwePNib6LlU69atadyoUZ7XKTIykueff56OHTvStWtXn54xouyKj4/nX//6lze570638PsTy+jT+k7/BlYMNCUlv33kdOfKyMggMjKyyI5rybKQfLrs3jSokAgIrUSA6zzOgGr5bhccaKBKmIlAkxROvZLkpLNUi6nl7zDKBbmWRUeuZdFJSjhDVYMCpWN1KtItZbP2R0zdWELCQv0dht/dcccdVK9enQULFniXDR48mNDQ0AJ9S1xc9xfFaePGjfTr359mb99HfHgwrdef4qcFK1mzZg1du3b1d3glqiL/bazIbYfS0f7U1FTuuusub62RklIa2u5PFa39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vg5DiDypfkEoFgeKohBs12Mzlc8Wfa+99hrvvPMOX375JcOGDWPYsGF88cUXvPPOO7z66qtFsk2j0UiNGjWIjY3ltddeo2HDhrz77rt5LmsymbwjyVz8EaWTQaenZcsW/PTTTzRq3ZLTjzTkpalj2blTiuIKUZr9sGI5733+IYmp2TRp0oQfvlroTYCIsq3UPAlPmDCBli1bYrVaCQgIyHOZw4cP07VrV2w2GyEhIQwbNoysrKziDdTXFMWTANHl7unksOio4G9AJ/U/xCUqVqzIL7/8kuc8p9NZ6Nu7WhLE5XIV+jYLSpIgoqTzJELsAATadDjKYdfGpKQk7rjjjlzTO3ToUGz1NzRNy9HaQ5Rt9evXp959t5FgMvJT4xDe+HYyq1au8nVYQohrsOD7JUw4+j0/tgik/+B7+PbbbwkKCvJ1WKKYlJokSFZWFvfccw9PPvlknvNdLhddunQhNTWVNWvWMGfOHL755hueffbZYo7UtzR7MBhMuabbTCrBdikBcz00TSMty11oP+nZudeXn95piqLwxhtv0Lx5c6pWrcr06dO985577jluvPFGGjVqxK233sq+ffu8895//31q1KhBq1at+Pjjj73TL20VcnH9//d//0ebNm0YOXLkFWPp378/gwYNon379tSqVYuePXt6E4/ffvstDRo0oFGjRsTExLBo0SI+/vhjfv/9d4YNG0ajRo34/vvvmTFjBnfccQcPPfQQsbGxbNiwIVdrk169ejFjxgzvNgcOHEi7du2oUqUKw4cPZ82atbRu3Zro6Gjefvtt7/v27dtHly5duPHGG2nYsCEffPDBVY/juHHjOH78OL169aJRo0Zs2bLlqudECF9Q/YK9iRB/iw5/a/n6P75bt24sWLAg1/RFixblGsmlMPznP/9h9erVHDp0iO3btzNq1Cji4uLo27dvoW9LlFxTHniB7hnBAPxcO4gPt8xh/rxvfByVEKIgZi/4hjfOreCQnwX/rGzate+Gv7+/r8MSxajU3DFdLC528UHo33766Sd27tzJkSNHvH00/+///o/+/fszYcKEctEMVbP45TkSjNmoEuIoNae6xErP1rhx9J5CXmvObys3jq2N1Xj1ljpms5n169eza9cumjVrxoMPPoher+eFF17gf//7HwBz5szh6aefZsmSJWzbto0JEyawefNmKlSowKBBg664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ffv2ZeHChcDVr1//bn1xscvGjz/+yA033IDdbvcmWcBzf3G568DVXOmeKL/XxzZt2vD333/z9NNP52gZfPG+51ITJ04kOjra+7qw7j3+be7cuTRs2JBKlSrlmD5jxgwqV66M1Wrlrrvu4uzZs7ne++2339K0aVPMZjPVqlVj7NixOJ1O7/zdu3dzyy23YDabqVu3LsuXL0dRFO/5Bbn+irJLkiCizPrqq6+oXbs2tWvX5oEHHmD69Om5Lkj5MWDAAO9DJ3halzz88MM5lrHb7djtdhYuXEhmZma+1ut0OunRowe33nor27ZtY926dTz++OPei+53331Hz5496dKlC5s3b/YmMy7Kysriv//9L1u3bmXhwoUcPHgwR/eci0aNGsX//d//8fvvv6PX63PF/m8Oh4MZM2awc+dO3n33XT766CPeeeedHMscOHCAhQsXsmTJEpYsWcLKlSt5/fXXvfOfeeYZ1q5dy+LFi1m2bBmrV6/mjz/+uOw2NU2jS5cunDx5ku+//55NmzbRpEkT2rVrd8WWNKtXr85xTAD+7//+j08//ZRPPvmENWvWcO7cuVwX75deeonp06fz4YcfsmPHDp5++mkeeOABVq5cCXhumHr16kWPHj3YsmULTzzxBKNGjbricbucn3/+mV27dvHLL7/w5ZdfsmDBAsaOHeud//zzz/PNN98wc+ZM/vjjD2rUqEHHjh29+/3yyy+zc+dOfvjhB3bt2sWHH35ISEhIru1ERUXxzTffAJ7+wydOnODdd9/NtVzfvn1Zv349Bw4c8E7bsWMH27dvp2/fvgB89NFHjBo1igkTJrBr1y5effVVXn75ZWbOnJnv/R4wYABr165lzpw5bNu2jXvuuYc77riDffv25UjGffPNN5w4cYLFixfTu3dv7w3xiRMnaNmypXd9zZo1Y/Xq1fnevhBCiMJnsVi8X4xc7fqVl7S0NN566y1mzZrFqlWrOHz4sLdlyYgRI654HbiSK90T5ff6OH/+fCpVqsS4ceNytQy+msK498jLqlWrct3nrF+/nocffphBgwaxZcsW2rZty/jx43Ms8+OPP/LAAw8wbNgwdu7cydSpU5kxYwYTJkwAwO1206NHD6xWK+vXr2fatGmXvc+R668okzQhyqiWLVtqEydO1DRN07Kzs7WQkBBt2bJluZYDtAULFuSa3q9fP6179+7a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",
+ "image/png": "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Tx/WrFnDwoULOXDgAF27diUxMfGS5xVCCCFy9O3bF6PRyI8//uhdduLECZo2bcr8+fP59ttveemllzh79izXXHNNkWuOPfjgg6SlpbFixYpcyw8ePMjGjRt54IEHLrn/rFmzuPvuu2nZsiWff/45r776Knv37qVLly557i2cTid9+/ald+/erFmzhkmTJvH2229zxx13eLfZunUrd9xxB40aNeLjjz/m66+/5umnn8blcnm3sVgsdO/enWXLljF58mT+97//8eijj7J06VIGDBiQ68sZgDVr1vDmm2/y9NNP8+2339KrVy9GjRrFZ599htlszrXtRx99hM1m897/2O12UlNTeeSRR1izZg0fffSRt3fO+++/nyvuoKAg+vbt673PWLhwYYHXbcWKFQwcOJDw8HA++ugjFi1aRFpaGj169GDLli15th8yZAhXX301n332GY899hgrVqzgoYceKtJ1E6JMU0KIMi8hIUEB6s4777zkdnfccYcCVGJiolJKqWeeeUYB6qGHHsq13YcffqgA9cEHHyillFq1apUC1O7duws89kcffaQA9dlnn+VavmPHDgWohQsXepfVr19fGY1G9fvvv+fa9ty5c8rf3189/vjjuZYPGzZM1ahRQzmdznzP7Xa7ldPpVM8++6yqXr260nXdu65ly5aqe/fuefY5fvy4AtSSJUu8y6699loVHR2tMjMzvctcLpdq1aqVqlOnjve4S5YsUYCaOHFirmPOmTNHAers2bP5xpnjgQceUAX9ea1fv74aO3as9/nGjRsVoPr3759ruylTpihATZ48Odfy22+/XVWrVs37fOvWrQpQr7zySq7tTp06pYKCgtS0adMuGasQQojKI+f9bceOHQVuU6NGDdW8efMC17tcLpWVlaVCQkLUq6++6l2e8362ceNG77Kc+5ALde/eXcXGxuZadv/996vw8PBc788XS0tLU0FBQapv3765lp88eVIFBASoESNGeJeNHTtWAbniU0qpF154QQFqy5YtSimlXn75ZQWo9PT0As87a9YsZTAY8lyznHundevWeZcBKiIiQqWmpubadu/evQpQ77zzTq7lnTp1Uh06dCjw3C6XSzmdTnX33Xerdu3a5VoXEhKS634ix8Wvg9vtVrVr11atW7dWbrfbu11mZqaKjo5WXbt29S7Leb3mzJmT65gTJ05UgYGB3vukwlw3Icoy6QkiRAWizn8bcXEl9pEjR+Z6PmzYMEwmExs3bgQgNjYWf39/JkyYwLJly/IdRrF27VqqVKlC//79cblc3kdsbCw1a9bM0+2yTZs2XH311bmWVa9enf79+7Ns2TJ0XQcgLS2NL774gjFjxuQa5rNhwwb69OlDREQERqMRPz8/nn76aVJSUq6oen12dja//PILQ4cOzVUx3mg0Mnr0aE6fPs3vv/+ea58BAwbkaROQpwtwcbjttttyPW/evDlAnsKuzZs3JzU11TskZu3atWiaxqhRo3K9LjVr1qRt27ZSHV4IIUSRqIt6NmRlZfHoo4/SpEkTTCYTJpOJ0NBQsrOzCxyGcikPPvggu3fv5qeffgI8Q02WL1/O2LFjLzmjy9atW7FarXlmWKtbty69evXihx9+yLPPxfc/I0aMAPDe/1xzzTWA575o5cqVxMfH5znG2rVradWqFbGxsbneZ2+++eZ8h5306tWLqlWr5lrWunVrOnTowJIlS7zLDh06xPbt2/MMIfn000+57rrrCA0NxWQy4efnx6JFi67oWgP8/vvvnDlzhtGjR2Mw/P3RLzQ0lCFDhrBt27Y8Q4Tyu/+x2Wze+6/CXDchyjJJgghRDkRGRhIcHMzx48cvud2JEycIDg6mWrVquZbXrFkz13OTyUT16tVJSUkBoHHjxqxfv57o6GgeeOABGjduTOPGjXn11Ve9+yQmJpKeno6/vz9+fn65HgkJCXm6xBY0/GP8+PHEx8fz/fffA56uoHa7PddNzfbt27npppsAePfdd/npp5/YsWMHTzzxBECeoTeFkZaWhlIq37hq164N4L0eOapXr57reUBAwBWf/3Iufs38/f0vudxmswGe10UpRY0aNfK8Ltu2bavQ0yMLIYQoXtnZ2aSkpHjfF8GTOFiwYAH33HMP3377Ldu3b2fHjh1ERUVd0fvhwIEDadCggbd+1tKlS8nOzr7sUJic9+iC3scvfg/Pude5UM79UM623bp1Y82aNbhcLsaMGUOdOnVo1aoVH330kXefxMRE9u7dm+c9NiwsDKVUke5/tm7dyuHDhwHPDD0BAQEMHz7cu83nn3/OsGHDiImJ4YMPPmDr1q3s2LGD8ePHe9/3i+py103XddLS0nItv9z9T2GumxBlmcwOI0Q5YDQa6dmzJ9988w2nT5/Oty7I6dOn+fXXX7n11lsxGo251iUkJBATE+N97nK5SElJyfUmd8MNN3DDDTfgdrvZuXMnr7/+OlOmTKFGjRrceeed3uKg33zzTb4xhoWF5Xp+cW+UHDfffDO1a9dmyZIl3HzzzSxZsoTOnTvTokUL7zYff/wxfn5+rF27lsDAQO/y/KaCK6yqVatiMBg4e/ZsnnU5xU4jIyOv+Pi+EhkZiaZpbN682XuTcqH8lgkhhBD5+frrr3G73d4imxkZGaxdu5ZnnnmGxx57zLtdTu2KK2EwGHjggQd4/PHHeeWVV1i4cCG9e/emadOml9wv556loPfxi9/D87vXSUhIyHUs8CRlBg4ciN1uZ9u2bcyaNYsRI0bQoEEDunTpQmRkJEFBQSxevDjfuC4+b0H3P8OHD2fq1KksXbqUF154geXLl3P77bfn6jXywQcf0LBhQz755JNcx7Hb7fkeszAud90MBkOeniuFcbnrJkRZJj1BhCgnpk+fjlKKiRMn5il86na7uf/++1FKMX369Dz7fvjhh7mer1y5EpfL5b3JuZDRaKRz587eb2h27doFeIZrpKSk4Ha76dixY57H5W5eLjz+6NGjWbNmDZs3b2bnzp15uoJqmobJZMqVzLFarSxfvjzP8QICAgr1TVRISAidO3fm888/z7W9rut88MEH1KlTJ8/wnStVkj1GLnbbbbehlCI+Pj7f16V169YlHoMQQojy7+TJkzzyyCNERERw7733Ap73Y6VUnoT6e++9l+depCjuuece/P39GTlyJL///juTJk267D5dunQhKCiIDz74INfy06dPs2HDBnr37p1nn4vvf3IKsuZ3/xMQEED37t156aWXAPjtt98Az/vssWPHqF69er7vszmz0l1O1apVuf3223n//fdZu3YtCQkJ+d7/+Pv750qAJCQk5JkdJifewtxnNG3alJiYGFasWJFrqFN2djafffaZd8aYK1XQdROiLJOeIEKUE9dddx3z589nypQpXH/99UyaNIl69epx8uRJ3njjDX755Rfmz59P165d8+z7+eefYzKZuPHGGzlw4ABPPfUUbdu2ZdiwYQC89dZbbNiwgX79+lGvXj1sNpv3G48+ffoAcOedd/Lhhx/St29fHnzwQTp16oSfnx+nT59m48aNDBw4kEGDBhWqLePHj+ell15ixIgRBAUF5arUDp46GPPmzWPEiBFMmDCB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/foEBQXRtWtXduzY4euw8lU3uiY3WyIASO0SzWuvve7jiER5MXLkSACaN2+OyWTyDt347rvv6NKlC61ateLZZ5/19mKIi4ujX79+1KhRA4AJEyZc8vjjx48vdCyDBw8mKCgIo9FIp06dOHbsGAC9e/dmypQpzJkzh71791KlSpUCj3H99dcXOgECcPvttxMQEEBwcDBNmzalT59eGAwGYmJiqFq1KqdPn+b333/nwIED3HnnncTGxtK1a1cyMzM5ePCg9zgXX0cpUizE3+Lj49m0aRPx8fE+Ob/0BClr3C40czIqIhoMRu9ih1MnweyiZrgJg/QIEUIIUUQXJkDSLW6ybZIAKap77rmH/fv3s3z5cmrXrs0HH3xAnz59OHjwIDExMb4OL49pfe/h27hXCHQqPlv3FVOmPEi1atV8HZa4hB0zmxa4znjR7d+PT15d4Lb/5FYxMDDw73Majbhcbk6ePMnkyZPZvn07jRo1Yu/evfTq1QsApYr2JV1oaOg/iMXzReG8efM4cOAAGzduZOzYsYwcOZJp06YV6nwmkylXbRCbLfdMjRefMyAgIE8MmqYRGRl5yeEsBcUuRGW3bNky/vPgQ+guBwaDgddff52xY8eWagzSE6Qscjs9NUL03DeoOYkQ6REihBCiKC5OgGRJAqTIrFYrn332GXPmzKFbt240adKEGTNm0LBhQ958801fh5evmKho3m85CsvbP/PX4SO5ahaIsinY31DgI8DPUOhtA/2K9xY/IyMDf39/atasiVKKBQsWeNf17NmTdevWeXuMLFq0qFjPnZ/Dhw/TsmVLJk2axP3338+2bdsACA8PJyMj45L7Nm7cmF9++QWA48ePs2XLliKfv2nTpgQHB/P+++97l/3xxx+kpqZedt/CxChERRUfH8+D/32Kmnd8QGiLgei6zuTJk0u9R4gkQcoql+N8IiR3YSuHU4bGCCGEKLwLEyAZVkmAXCmXy4Xb7c717S5AUFBQvh+i7HY7ZrM518MXOrVozeOPeQpQvvnmm6Snp/skDlG+tW7dmn/961+0bNmSHj16UK/e37VJ2rRpw+OPP07Xrl25/vrrqV27donHM336dFq2bEm7du1Yvnw5M2bMADxDcZ599llvYdT8PProo3z//fd06NCBJ554gs6dOxf5/CaTia+++oqVK1fSpk0bWrZsyT333IPVar3s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z5/P8uXLueaaawDYuHHjFccjyqdMm5v7lp4iIcNF0/BP2FE3GINSvN7wehrWbeHr8LwqTBKkZs2agKdHSK1atbzLk5KS8vQOudD06dOZOnWq97nZbKZu3bpERtUq1unsLFkWkk/FF9vxLqSCq0Bw3liD/A1EhZsumQQqqso8X3Zxk2tZfORaFh+5lsWnNK6lbs3yDIMxQlq2jtXuLvZzVK0XTVBIcLEf95968803GT9+POPGjfPeA1ysXr16LFq0qJQjK/tqRUXx8MMP8+CDD/J///d/jB8/nsDAQF+HJcqYunXrcvXVV/Pnn3/SvEUi9913H3/88QdKKSZPnuxNIjRo0IC1a9fSqlUrevToQefOnfn55585c+YMN954I2+99Rbr1q3jyy+/ZP369bz33ntMmjSJe+65h+XLl7NgwQKcTidhYWG88cYbtGrVCofDwX/+8x82btxITExMgcnMEydO0LFjRyZOnMjXX39NRkYGr732Gn379sVqtXLXXXexb98+/Pz8qFGjBt999x333XcfJ0+eJDY2lnr16vHll1/SoEED/v3vf7N+/Xpq167Nv//9bx555BF27twJwP79+7nttts4ceKE95z33XcfX3/9NVarlQ8++IB33nmHbdu2ERgYyJo1a6hd2/P3/+WXX2blypW4XC5q1qzJ22+/Td26dZkxYwZHjhwhMzOTY8eOUbNmTVatWoXL5eLpp5/GbDYTGxvLtddey1tvvXXFr+OoUaM4fPgwDoeDevXqsXjxYqKjo4mLi2PKlCl069aNHTt2cN999+V5jSKrV8HlcjFx4kR++uknXC4Xy5Yty7d3yNChQzl27BijR4+mVatWvPzyy3Ts2JFz585x+PBh+vTpw48//kijRo2YO3cuGzdu5OuvvyYxMZHJkydz4sQJbDYbt99+O88++ywAmzdvZuLEiQQFBdGpUyfp6V7GOVw6/1l+miMJduoY49jVzAkY+G9ANL079vd1eLlUmOEwDRs2pGbNmnz//ffeZQ6Hg02bNtG1a9cC9wsICCA8PDzXo7zRLOlgzTsDjlWGxgghRIWl7FZUZioAZptOdgkkQMqyo0ePMn369AITIAD+/v6MHTu2FKMqP0aNGkWH3jfQ/L6bWLRkia/DEecpu7Xgh9Ne+G0d/3za6H379nH48GFatmzB5MmTadasGfv27WPDhg0899xz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7pqooOfHdu3a8ffff/PMM8/kqhl84brnYhMnTiQ6Otr7vqiuPf5t7ty5NG7cmCpVquSaPmPGDKpWrYrVauWuu+4iISEhz2e//fZbmjdvjtlspkaNGowdOxan0+mdv3v3bm666SbMZjP169dn+fLlKIriPb4g519RfkkSRJRbX331FXXr1qVu3bo8+OCDTJ8+Pc8JqSD69+/vvekET+2SRx55JNcydrsdu93OwoULycrKKtB6nU4nPXr04Oabb2bbtm2sXbuWJ554wnvS/e677+jZsyddu3Zl8+bN3mTGBdnZ2bzyyits3bqVhQsXcvDgwVzNcy4YNWoU//d//8cff/yBXq/PE/u/ORwOZsyYwc6dO3n33Xf56KOPeOedd3Itc+DAARYuXMiSJUtYsmQJK1eu5PXXX/fOf/bZZ/n1119ZvHgxy5YtY/Xq1WzatOmS29Q0ja5du3Ly5Em+//57Nm7cSLNmzejQocNla9KsXr06V5kA/N///R+ffvopn3zyCWvWrOHs2bN5Tt4vvvgi06dP58MPP2THjh0888wzPPjgg6xcuRLwXDD16tWLHj16sGXLFp588klGjRp12XK7lJ9//pldu3bxyy+/8OWXX7JgwQLGjh3rnT9ixAi++eYbZs6cyaZNm6hVqxa33Xabd79feukldu7cyQ8//MCuXbv48MMPCQkJybOdqKgovvnmG8DTfvjEiRO8++67eZbr06cP69at48CBA95pO3bsYPv27fTp0weAjz76iFGjRjFhwgR27drFq6++yksvvcTMmTMLvN/9+/fn119/Zc6cOWzbto177rmH22+/nX379uVKxn3zzTecOHGCxYsXc++993oviE+cOEHr1q2962vRogWrV68u8PaFEEIUPYvF4n0wcqXzV37S09N56623mDVrFqtWreLw4cPemiXDhw+/7Hngci53TVTQ8+P8+fOpUqUK48aNy1Mz+EqK4tojP6tWrcpznbNu3ToeeeQRBg4cyJYtW2jfvj3jx4/PtcyPP/7Igw8+yNChQ9m5cydTp05lxowZTJgwAQC3202PHj2wWq2sW7eOadOmXfI6R86/olzShCinWrdurU2cOFHTNE3LycnRQkJCtGXLluVZDtAWLFiQZ3rfvn21O++8Uzt9+rRmMpm0gwcPaocOHdLMZrN2+vRp7c4779T69u3rXX7evHlaYGCg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",
"text/plain": [
""
]
@@ -1608,18 +1840,42 @@
" hit = matched.epoch.notna()\n",
" dt = (matched.epoch - matched.time).dt.total_seconds()\n",
" q = binned(matched.scan_angle[hit].to_numpy(), dt[hit].to_numpy(), edges5)\n",
- " axes[0].fill_between((edges5[:-1] + edges5[1:]) / 2, q[:, 0], q[:, 2], color=color, alpha=0.15, lw=0)\n",
+ " axes[0].fill_between(\n",
+ " (edges5[:-1] + edges5[1:]) / 2, q[:, 0], q[:, 2], color=color, alpha=0.15, lw=0\n",
+ " )\n",
" axes[0].plot((edges5[:-1] + edges5[1:]) / 2, q[:, 1], color=color, label=name)\n",
"axes[0].axhline(0, color=GRAY, lw=0.8)\n",
- "axes[0].set(xlabel=\"ATMS scan angle (deg, positive left)\", ylabel=\"TAT-C minus ATMS (s)\", title=\"Observation time\")\n",
+ "axes[0].set(\n",
+ " xlabel=\"ATMS scan angle (deg, positive left)\",\n",
+ " ylabel=\"TAT-C minus ATMS (s)\",\n",
+ " title=\"Observation time\",\n",
+ ")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
"lat_edges = np.arange(-90, 91, 10)\n",
"point_lat = points5.geometry.y.to_numpy()\n",
"n_points = np.histogram(point_lat, lat_edges)[0]\n",
- "axes[1].plot((lat_edges[:-1] + lat_edges[1:]) / 2, np.histogram(point_lat[observed5.point_id], lat_edges)[0] / n_points, color=INK, marker=\"o\", ms=3, label=\"observed (ATMS)\")\n",
+ "axes[1].plot(\n",
+ " (lat_edges[:-1] + lat_edges[1:]) / 2,\n",
+ " np.histogram(point_lat[observed5.point_id], lat_edges)[0] / n_points,\n",
+ " color=INK,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " label=\"observed (ATMS)\",\n",
+ ")\n",
"for (name, predicted), color in zip(predicted5.items(), [BLUE, ORANGE, AQUA]):\n",
- " axes[1].plot((lat_edges[:-1] + lat_edges[1:]) / 2, np.histogram(point_lat[predicted.point_id.astype(int)], lat_edges)[0] / n_points, color=color, ls=\"--\", label=name)\n",
- "axes[1].set(xlabel=\"Point latitude (deg)\", ylabel=\"Observations per point per day\", title=\"Daily observations\")\n",
+ " axes[1].plot(\n",
+ " (lat_edges[:-1] + lat_edges[1:]) / 2,\n",
+ " np.histogram(point_lat[predicted.point_id.astype(int)], lat_edges)[0]\n",
+ " / n_points,\n",
+ " color=color,\n",
+ " ls=\"--\",\n",
+ " label=name,\n",
+ " )\n",
+ "axes[1].set(\n",
+ " xlabel=\"Point latitude (deg)\",\n",
+ " ylabel=\"Observations per point per day\",\n",
+ " title=\"Daily observations\",\n",
+ ")\n",
"axes[1].legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1653,10 +1909,10 @@
"id": "a7c1e602",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:50:58.824854Z",
- "iopub.status.busy": "2026-10-15T18:50:58.824854Z",
- "iopub.status.idle": "2026-10-15T18:51:15.626878Z",
- "shell.execute_reply": "2026-10-15T18:51:15.626878Z"
+ "iopub.execute_input": "2026-10-25T13:53:04.695147Z",
+ "iopub.status.busy": "2026-10-25T13:53:04.694150Z",
+ "iopub.status.idle": "2026-10-25T13:53:28.200136Z",
+ "shell.execute_reply": "2026-10-25T13:53:28.200136Z"
}
},
"outputs": [
@@ -1732,9 +1988,7 @@
],
"source": [
"# TAT-C's satellite zenith angle (from the satellite's elevation as seen from each pixel) at the fitted configuration, in ATMS beam order\n",
- "track6 = collect_ground_pixels(\n",
- " noaa20.model_copy(update={\"instruments\": [configs[\"fitted, inertial\"]]}), times3, sat_altaz=True\n",
- ")\n",
+ "track6 = collect_ground_pixels(configs[\"fitted, inertial\"], times3, sat_altaz=True)\n",
"zenith_model = (90 - track6[\"sat_alt\"].to_numpy().reshape(len(i3), N_BEAMS))[:, ::-1]\n",
"zenith_reported = beam_zenith[i3]\n",
"range_reported = np.linalg.norm(beam_xyz[i3] - beam_sc[i3], axis=-1)\n",
@@ -1758,8 +2012,12 @@
"range_model = slant_range(altitude6[:, np.newaxis], zenith_model)\n",
"pd.DataFrame(\n",
" {\n",
- " \"zenith angle, TAT-C minus reported (deg)\": summarize(zenith_model - zenith_reported),\n",
- " \"slant range, TAT-C minus reported (km)\": summarize((range_model - range_reported) / 1e3),\n",
+ " \"zenith angle, TAT-C minus reported (deg)\": summarize(\n",
+ " zenith_model - zenith_reported\n",
+ " ),\n",
+ " \"slant range, TAT-C minus reported (km)\": summarize(\n",
+ " (range_model - range_reported) / 1e3\n",
+ " ),\n",
" \"equivalent diameter, TAT-C minus reported (km)\": summarize(\n",
" footprint_size(range_model, zenith_model, BEAMWIDTH)[2]\n",
" - footprint_size(range_reported, zenith_reported, BEAMWIDTH)[2]\n",
@@ -1774,10 +2032,10 @@
"id": "a7c1e603",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:51:15.626878Z",
- "iopub.status.busy": "2026-10-15T18:51:15.626878Z",
- "iopub.status.idle": "2026-10-15T18:51:15.784263Z",
- "shell.execute_reply": "2026-10-15T18:51:15.784263Z"
+ "iopub.execute_input": "2026-10-25T13:53:28.202143Z",
+ "iopub.status.busy": "2026-10-25T13:53:28.202143Z",
+ "iopub.status.idle": "2026-10-25T13:53:28.340788Z",
+ "shell.execute_reply": "2026-10-25T13:53:28.340267Z"
}
},
"outputs": [
@@ -1958,10 +2216,17 @@
],
"source": [
"# measured spacing (km) between adjacent beam centers within a scan and between the same beam on consecutive scans\n",
- "spacing_cross = np.median(np.linalg.norm(np.diff(beam_xyz[i4], axis=1), axis=-1), axis=0) / 1e3\n",
+ "spacing_cross = (\n",
+ " np.median(np.linalg.norm(np.diff(beam_xyz[i4], axis=1), axis=-1), axis=0) / 1e3\n",
+ ")\n",
"spacing_cross = np.append(spacing_cross, spacing_cross[-1])\n",
- "spacing_along = np.median(np.linalg.norm(np.diff(beam_xyz, axis=0), axis=-1)[contiguous], axis=0) / 1e3\n",
- "along_r, cross_r, equivalent_r = footprint_size(range_reported, zenith_reported, BEAMWIDTH)\n",
+ "spacing_along = (\n",
+ " np.median(np.linalg.norm(np.diff(beam_xyz, axis=0), axis=-1)[contiguous], axis=0)\n",
+ " / 1e3\n",
+ ")\n",
+ "along_r, cross_r, equivalent_r = footprint_size(\n",
+ " range_reported, zenith_reported, BEAMWIDTH\n",
+ ")\n",
"rows = [0, 12, 24, 47, 48, 71, 83, 95]\n",
"table6 = pd.DataFrame(\n",
" {\n",
@@ -1985,16 +2250,16 @@
"id": "a7c1e604",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:51:15.784263Z",
- "iopub.status.busy": "2026-10-15T18:51:15.784263Z",
- "iopub.status.idle": "2026-10-15T18:51:15.879292Z",
- "shell.execute_reply": "2026-10-15T18:51:15.879292Z"
+ "iopub.execute_input": "2026-10-25T13:53:28.342794Z",
+ "iopub.status.busy": "2026-10-25T13:53:28.342794Z",
+ "iopub.status.idle": "2026-10-25T13:53:28.477430Z",
+ "shell.execute_reply": "2026-10-25T13:53:28.477430Z"
}
},
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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H/3oRzQ0NCgjBc8+++xJj71s2TJGjRqF0WgkIyNDsXMrBw8eZNKkSRiNRgYOHMiqVavaHWPTpk0MHz5csdnnn3/eLgTkVDZr5dprr+WDDz744f8oieRiQkgkEkkLb731lhg9erQQQohly5aJtLQ04fP52tUDxJIlS9qV33PPPeK6664TL7/8spg2bZpSPm3aNPGXv/xFXHfddeKee+4RQgjhdrtFcHCwmDdvnnA4HJ1u4z333COCg4PFrbfeKvbu3Su+/PJLER0dLX79618rdX7961+LrKwssWLFClFQUCAWLFggDAaD+O6774QQQrhcLvH000+LrVu3isLCQvHuu+8Ks9ksPvroo4DvsVgs4pFHHhG5ubnirbfeEoCYOXOmeP7550V+fr74/e9/L3Q6nSguLj5peydPniwef/xx5X1qaqqIiIgQr776qjh48KCYP3++UKvV4sCBA0IIIZqamkR0dLTy+5YtWyYyMjIEIHbu3CmEEKK0tFRERUWJX/3qV+LAgQNix44dYvr06WLq1KnK9/z85z8Xqampor6+XuTk5AiDwSAWL1580nbu3LlTAKK8vFwpKygoEIDYsWNHQN1rr71W3H333Sc91rvvviuCgoJOub377rsn/fwzzzwjhg0bprx/8803RXx8vPjss89EYWGh+Oyzz0RERIRYuHChEEKIsrIyMWjQIPG///u/oqysTDQ0NIhXXnlFhISEiLKyMlFWViYaGxs7/K4VK1aIkJAQsXDhQlFQUCBWrlwp0tLSxLPPPiuEEMLr9YrBgweLKVOmiJ07d4q1a9eKESNGBFwDVqtVREREiDvvvFPs27dPfP3116J///5nbDMhhPj666+FwWA4o2tCIrlYkSJWIpEoTJgwQbzyyitCCL/IjIqKEqtWrWpX73QitqqqShgMBnH48GFRVFQkjEajqKqqChCxQgjx6aefivDwcGE0GsWECRPEr371K7Fr165TtvGee+4RERERwmazKWWvvfaaCA4OFl6vVzQ1NQmj0Sg2bdoU8Ln7779f3H777Sc97sMPPyzmzJkT8D2pqanC6/UqZZmZmeKyyy5T3ns8HhEUFCQ++OCDkx63IxF75513Ku99Pp+IiYkRr732mhBCiDfeeKPD33e8IPrtb38rZsyYEfA9JSUlAhB5eXlCCCGcTqcYMWKEuOWWW8SgQYPEAw88cNI2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",
"text/plain": [
""
]
@@ -2006,11 +2271,34 @@
"source": [
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
"ax.plot(np.arange(N_BEAMS), along_r.mean(axis=0), color=BLUE, label=\"along-track size\")\n",
- "ax.plot(np.arange(N_BEAMS), cross_r.mean(axis=0), color=ORANGE, label=\"cross-track size\")\n",
- "ax.plot(np.arange(N_BEAMS), equivalent_r.mean(axis=0), color=INK, label=\"equivalent diameter\")\n",
- "ax.plot(np.arange(N_BEAMS), spacing_cross, color=GRAY, ls=\"--\", label=\"cross-track spacing of beams\")\n",
- "ax.plot(np.arange(N_BEAMS), spacing_along, color=GRAY, ls=\":\", label=\"along-track spacing of scans\")\n",
- "ax.set(xlabel=\"ATMS beam index (0 = left edge)\", ylabel=\"Size or spacing (km)\", title=\"ATMS footprint size (2.2 deg beam)\")\n",
+ "ax.plot(\n",
+ " np.arange(N_BEAMS), cross_r.mean(axis=0), color=ORANGE, label=\"cross-track size\"\n",
+ ")\n",
+ "ax.plot(\n",
+ " np.arange(N_BEAMS),\n",
+ " equivalent_r.mean(axis=0),\n",
+ " color=INK,\n",
+ " label=\"equivalent diameter\",\n",
+ ")\n",
+ "ax.plot(\n",
+ " np.arange(N_BEAMS),\n",
+ " spacing_cross,\n",
+ " color=GRAY,\n",
+ " ls=\"--\",\n",
+ " label=\"cross-track spacing of beams\",\n",
+ ")\n",
+ "ax.plot(\n",
+ " np.arange(N_BEAMS),\n",
+ " spacing_along,\n",
+ " color=GRAY,\n",
+ " ls=\":\",\n",
+ " label=\"along-track spacing of scans\",\n",
+ ")\n",
+ "ax.set(\n",
+ " xlabel=\"ATMS beam index (0 = left edge)\",\n",
+ " ylabel=\"Size or spacing (km)\",\n",
+ " title=\"ATMS footprint size (2.2 deg beam)\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -2042,7 +2330,7 @@
"| 5. Daily observations (`collect_observations`) | more than 99% of passes matched for all instruments; epochs within 0.26 s (95th percentile) for an inertial-frame `PointedInstrument`, vs. 11 s for a nadir `Instrument` |\n",
"| 6. Footprint size | zenith angles within 0.03 deg and slant ranges within 1 km (95th percentile) of reported; 32.2 km footprint at nadir for the 2.2 deg beam, growing to an equivalent diameter of 93 km at the swath edge |\n",
"\n",
- "**Along-track reference direction.** The largest difference between TAT-C's default imager geometry and ATMS is the orientation of the scan. Like most Earth observation spacecraft without yaw steering, NOAA-20 keeps its attitude aligned with the orbit plane, so the scan is perpendicular to the inertial velocity, while TAT-C's default view is perpendicular to the ground track (the Earth-fixed velocity, as for a yaw-steered spacecraft). Setting `velocity_frame=VelocityFrame.INERTIAL` on a `PointedInstrument` removes along-track errors of up to 90 km at the swath edges and observation time errors of about 10 s.\n",
+ "**Along-track reference direction.** The largest difference between TAT-C's default imager geometry and ATMS is the orientation of the scan. Like most Earth observation spacecraft without yaw steering, NOAA-20 keeps its attitude aligned with the orbit plane, so the scan is perpendicular to the inertial velocity, while TAT-C's default view is perpendicular to the ground track (the Earth-fixed velocity, as for a yaw-steered spacecraft). Setting the satellite's attitude to the inertial velocity frame (`Attitude(velocity_frame=VelocityFrame.INERTIAL)`, or a `PointedInstrument`'s `velocity_frame` on a satellite without an attitude) removes along-track errors of up to 90 km at the swath edges and observation time errors of about 10 s.\n",
"\n",
"**Scan timing.** TAT-C observes all pixels of a view at one instant, whereas ATMS sweeps its 96 beams over about 1.7 s. The resulting along-track error, about 4.5 km at the swath edges, is a fraction of an ATMS footprint and of the 17.6 km between scans. For coverage, the along-track field of view stands in for the scan: tailored to the time step, consecutive views tile the swath at time steps from one scan to two minutes.\n",
"\n",
@@ -2050,8 +2338,7 @@
"\n",
"**Changes to TAT-C.** This validation led to the `velocity_frame` option and exposed two problems with the rectangular `PointedInstrument`, which have been fixed: rectangular footprint polygons for wide, elongated views were inaccurate (misplaced corners and too few points along the long sides), and `collect_observations` checked a pointed instrument's view only at the midpoint of each access period, missing up to 77% of observations for a view tailored to a scan period. It now checks the view at the time the view sweeps over the point and reports that time as the epoch.\n",
"\n",
- "**Footprint size.** TAT-C's viewing geometry gives the zenith angle and slant range of every pixel, from which the footprint of a beam of known width follows. ATMS's 2.2 deg beam has a 32 km footprint at nadir (confirming the nominal value), which grows to about 93 km (equivalent diameter) at the swath edge. Resolution therefore depends on where in the swath a feature is observed, which the [monsoon OSSE example](../examples/RunOSSEMonsoon.ipynb) accounts for.\n",
- ""
+ "**Footprint size.** TAT-C's viewing geometry gives the zenith angle and slant range of every pixel, from which the footprint of a beam of known width follows. ATMS's 2.2 deg beam has a 32 km footprint at nadir (confirming the nominal value), which grows to about 93 km (equivalent diameter) at the swath edge. Resolution therefore depends on where in the swath a feature is observed, which the [monsoon OSSE example](../examples/RunOSSEMonsoon.ipynb) accounts for.\n"
]
}
],
diff --git a/docs/validation/ValidateImagerCrIS.ipynb b/docs/validation/ValidateImagerCrIS.ipynb
index 3b1c4a49..63544621 100644
--- a/docs/validation/ValidateImagerCrIS.ipynb
+++ b/docs/validation/ValidateImagerCrIS.ipynb
@@ -39,10 +39,10 @@
"id": "aa358a3a",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:36.836904Z",
- "iopub.status.busy": "2026-10-15T18:43:36.836904Z",
- "iopub.status.idle": "2026-10-15T18:43:37.505734Z",
- "shell.execute_reply": "2026-10-15T18:43:37.505734Z"
+ "iopub.execute_input": "2026-10-25T13:54:34.265025Z",
+ "iopub.status.busy": "2026-10-25T13:54:34.265025Z",
+ "iopub.status.idle": "2026-10-25T13:54:42.323375Z",
+ "shell.execute_reply": "2026-10-25T13:54:42.323375Z"
}
},
"outputs": [
@@ -96,7 +96,9 @@
" params[\"continuation-token\"] = token\n",
" listing = requests.get(BUCKET, params=params, timeout=60).content.decode()\n",
" keys += re.findall(r\"(.*?)\", listing)\n",
- " match = re.search(r\"(.*?)\", listing)\n",
+ " match = re.search(\n",
+ " r\"(.*?)\", listing\n",
+ " )\n",
" if match is None:\n",
" return keys\n",
" token = match.group(1)\n",
@@ -117,21 +119,39 @@
"TLE_FILE = DATA_DIR / f\"n20_tle_{DAY:%Y%m%d}.txt\"\n",
"if not TLE_FILE.exists():\n",
" # the element set with an epoch at the start of the day\n",
- " key = next(k for k in list_keys(f\"TLE-AUX/{DAY:%Y/%m/%d}/\") if f\"Z_{DAY:%Y%m%d}000000Z_\" in k)\n",
+ " key = next(\n",
+ " k\n",
+ " for k in list_keys(f\"TLE-AUX/{DAY:%Y/%m/%d}/\")\n",
+ " if f\"Z_{DAY:%Y%m%d}000000Z_\" in k\n",
+ " )\n",
" with h5py.File(io.BytesIO(fetch(key))) as f:\n",
- " TLE_FILE.write_text(bytes(f[\"All_Data/TLE-AUX_All/Dataset_Array_0\"][:]).decode().strip() + \"\\n\")\n",
+ " TLE_FILE.write_text(\n",
+ " bytes(f[\"All_Data/TLE-AUX_All/Dataset_Array_0\"][:]).decode().strip() + \"\\n\"\n",
+ " )\n",
"tle = TLE_FILE.read_text().splitlines()\n",
"\n",
"CRIS_FILE = DATA_DIR / f\"cris_gcrso_{DAY:%Y%m%d}_{HOURS[0]:02d}-{HOURS[1]:02d}h.npz\"\n",
"CRIS_FIELDS = [\n",
- " \"StartTime\", \"MidTime\", \"FORTime\", \"SCPosition\", \"SCVelocity\", \"Latitude\", \"Longitude\", \"Height\",\n",
- " \"SatelliteZenithAngle\", \"SatelliteRange\", \"QF1_CRISSDRGEO\",\n",
+ " \"StartTime\",\n",
+ " \"MidTime\",\n",
+ " \"FORTime\",\n",
+ " \"SCPosition\",\n",
+ " \"SCVelocity\",\n",
+ " \"Latitude\",\n",
+ " \"Longitude\",\n",
+ " \"Height\",\n",
+ " \"SatelliteZenithAngle\",\n",
+ " \"SatelliteRange\",\n",
+ " \"QF1_CRISSDRGEO\",\n",
"]\n",
"if not CRIS_FILE.exists():\n",
"\n",
" def read_granule(key):\n",
" with h5py.File(io.BytesIO(fetch(key))) as f:\n",
- " return {field: f[\"All_Data/CrIS-SDR-GEO_All/\" + field][:] for field in CRIS_FIELDS}\n",
+ " return {\n",
+ " field: f[\"All_Data/CrIS-SDR-GEO_All/\" + field][:]\n",
+ " for field in CRIS_FIELDS\n",
+ " }\n",
"\n",
" keys = [\n",
" k\n",
@@ -140,11 +160,22 @@
" ]\n",
" with concurrent.futures.ThreadPoolExecutor(16) as pool:\n",
" granules = list(pool.map(read_granule, keys))\n",
- " np.savez_compressed(CRIS_FILE, **{field: np.concatenate([g[field] for g in granules]) for field in CRIS_FIELDS})\n",
+ " np.savez_compressed(\n",
+ " CRIS_FILE,\n",
+ " **{\n",
+ " field: np.concatenate([g[field] for g in granules]) for field in CRIS_FIELDS\n",
+ " },\n",
+ " )\n",
"\n",
"cris = dict(np.load(CRIS_FILE))\n",
"print(tle[0], tle[1], sep=\"\\n\")\n",
- "pd.Series({\"scans\": len(cris[\"MidTime\"]), \"FORs per scan\": cris[\"Latitude\"].shape[1], \"FOVs per FOR\": cris[\"Latitude\"].shape[2]})"
+ "pd.Series(\n",
+ " {\n",
+ " \"scans\": len(cris[\"MidTime\"]),\n",
+ " \"FORs per scan\": cris[\"Latitude\"].shape[1],\n",
+ " \"FOVs per FOR\": cris[\"Latitude\"].shape[2],\n",
+ " }\n",
+ ")"
]
},
{
@@ -165,10 +196,10 @@
"id": "ef1bc172",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:37.507277Z",
- "iopub.status.busy": "2026-10-15T18:43:37.507277Z",
- "iopub.status.idle": "2026-10-15T18:43:39.306511Z",
- "shell.execute_reply": "2026-10-15T18:43:39.305583Z"
+ "iopub.execute_input": "2026-10-25T13:54:42.325885Z",
+ "iopub.status.busy": "2026-10-25T13:54:42.325885Z",
+ "iopub.status.idle": "2026-10-25T13:54:44.182940Z",
+ "shell.execute_reply": "2026-10-25T13:54:44.181933Z"
}
},
"outputs": [
@@ -201,35 +232,66 @@
"\n",
"from tatc.analysis import collect_ground_pixels, compute_ground_track\n",
"from tatc.constants import EARTH_MEAN_RADIUS, EARTH_ROTATION_RATE\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, Instrument, PointedInstrument, Satellite\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Instrument,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
"from tatc.utils import VelocityFrame, field_of_regard_to_swath_width\n",
"\n",
"IET_EPOCH = pd.Timestamp(\"1958-01-01\", tz=\"UTC\")\n",
"LEAP_SECONDS = 37\n",
- "N_FOR, N_FOV = 30, 9 # fields of regard per scan, fields of view per field of regard (3 x 3)\n",
+ "N_FOR, N_FOV = (\n",
+ " 30,\n",
+ " 9,\n",
+ ") # fields of regard per scan, fields of view per field of regard (3 x 3)\n",
"EDGE = 48.33 # deg, nominal scan angle of the outermost field of regard\n",
"FOR_SPACING = 2 * EDGE / (N_FOR - 1) # deg\n",
- "FOV_SPACING = FOR_SPACING / 3 # deg, spacing of the 3 x 3 array within a field of regard\n",
+ "FOV_SPACING = (\n",
+ " FOR_SPACING / 3\n",
+ ") # deg, spacing of the 3 x 3 array within a field of regard\n",
"FOV_DIAMETER = 0.963 # deg, nominal instantaneous field of view (diameter)\n",
"SCAN_PERIOD = 8 # s\n",
"\n",
"\n",
"def iet_to_utc(iet):\n",
- " return IET_EPOCH + pd.to_timedelta(np.asarray(iet) - LEAP_SECONDS * 1_000_000, unit=\"us\")\n",
+ " return IET_EPOCH + pd.to_timedelta(\n",
+ " np.asarray(iet) - LEAP_SECONDS * 1_000_000, unit=\"us\"\n",
+ " )\n",
"\n",
"\n",
- "good = (cris[\"QF1_CRISSDRGEO\"] == 0) & np.all(np.abs(cris[\"Latitude\"]) <= 90, axis=(1, 2))\n",
+ "good = (cris[\"QF1_CRISSDRGEO\"] == 0) & np.all(\n",
+ " np.abs(cris[\"Latitude\"]) <= 90, axis=(1, 2)\n",
+ ")\n",
"t_mid = iet_to_utc(cris[\"MidTime\"][good])\n",
"t_for = iet_to_utc(cris[\"FORTime\"][good].ravel()).to_numpy().reshape(-1, N_FOR)\n",
- "dt_for = (cris[\"FORTime\"][good] - cris[\"MidTime\"][good][:, np.newaxis]) / 1e6 # s from the middle time\n",
- "sc_pos, sc_vel = cris[\"SCPosition\"][good].astype(float), cris[\"SCVelocity\"][good].astype(float)\n",
- "fov_lat, fov_lon = cris[\"Latitude\"][good].astype(float), cris[\"Longitude\"][good].astype(float)\n",
- "fov_height = cris[\"Height\"][good].astype(float) if \"Height\" in cris else np.zeros_like(fov_lat)\n",
+ "dt_for = (\n",
+ " cris[\"FORTime\"][good] - cris[\"MidTime\"][good][:, np.newaxis]\n",
+ ") / 1e6 # s from the middle time\n",
+ "sc_pos, sc_vel = cris[\"SCPosition\"][good].astype(float), cris[\"SCVelocity\"][\n",
+ " good\n",
+ "].astype(float)\n",
+ "fov_lat, fov_lon = cris[\"Latitude\"][good].astype(float), cris[\"Longitude\"][good].astype(\n",
+ " float\n",
+ ")\n",
+ "fov_height = (\n",
+ " cris[\"Height\"][good].astype(float) if \"Height\" in cris else np.zeros_like(fov_lat)\n",
+ ")\n",
"fov_zenith = cris[\"SatelliteZenithAngle\"][good].astype(float)\n",
"fov_range = cris[\"SatelliteRange\"][good].astype(float)\n",
"\n",
"noaa20 = Satellite(name=\"NOAA-20\", orbit=GeneralPerturbationsOrbit.from_tle(tle))\n",
"orbit = noaa20.orbit.to_gp_orbit()\n",
+ "# NOAA-20 is not yaw-steered: its body (and its instruments' views) aligned with the inertial velocity\n",
+ "INERTIAL = Attitude(velocity_frame=VelocityFrame.INERTIAL)\n",
+ "\n",
+ "\n",
+ "def on_noaa20(instrument, attitude=None):\n",
+ " \"\"\"NOAA-20 carrying an instrument, with an attitude.\"\"\"\n",
+ " return noaa20.model_copy(update={\"instruments\": [instrument], \"attitude\": attitude})\n",
+ "\n",
"\n",
"TO_ECEF = Transformer.from_crs(\"EPSG:4979\", \"EPSG:4978\", always_xy=True)\n",
"TO_GEODETIC = Transformer.from_crs(\"EPSG:4978\", \"EPSG:4979\", always_xy=True)\n",
@@ -237,13 +299,17 @@
"\n",
"def ecef(lon, lat, height=0.0):\n",
" \"\"\"Earth-fixed position (m) of geodetic coordinates, stacked on the last axis.\"\"\"\n",
- " return np.stack(TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1)\n",
+ " return np.stack(\n",
+ " TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1\n",
+ " )\n",
"\n",
"\n",
"def up(lon, lat):\n",
" \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
" lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
+ " return np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def normalize(x):\n",
@@ -282,7 +348,12 @@
"def binned(x, y, edges, q=(5, 50, 95)):\n",
" \"\"\"Percentiles of y in bins of x.\"\"\"\n",
" i = np.digitize(x, edges) - 1\n",
- " return np.array([np.percentile(y[i == k], q) if np.any(i == k) else [np.nan] * len(q) for k in range(len(edges) - 1)])\n",
+ " return np.array(\n",
+ " [\n",
+ " np.percentile(y[i == k], q) if np.any(i == k) else [np.nan] * len(q)\n",
+ " for k in range(len(edges) - 1)\n",
+ " ]\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
@@ -320,10 +391,10 @@
"id": "19b2daba",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:39.307489Z",
- "iopub.status.busy": "2026-10-15T18:43:39.307489Z",
- "iopub.status.idle": "2026-10-15T18:43:39.353939Z",
- "shell.execute_reply": "2026-10-15T18:43:39.352945Z"
+ "iopub.execute_input": "2026-10-25T13:54:44.185442Z",
+ "iopub.status.busy": "2026-10-25T13:54:44.183938Z",
+ "iopub.status.idle": "2026-10-25T13:54:44.217605Z",
+ "shell.execute_reply": "2026-10-25T13:54:44.217605Z"
}
},
"outputs": [
@@ -358,16 +429,16 @@
"
\n",
"
along-track (km)
\n",
"
180.0
\n",
- "
0.499
\n",
- "
0.688
\n",
- "
0.693
\n",
+ "
0.495
\n",
+ "
0.685
\n",
+ "
0.690
\n",
"
\n",
"
\n",
"
cross-track, right (km)
\n",
"
180.0
\n",
- "
0.023
\n",
- "
0.282
\n",
- "
0.287
\n",
+ "
0.026
\n",
+ "
0.303
\n",
+ "
0.308
\n",
"
\n",
"
\n",
"
radial (km)
\n",
@@ -379,8 +450,8 @@
"
\n",
"
velocity (m/s)
\n",
"
180.0
\n",
- "
0.590
\n",
- "
0.690
\n",
+ "
0.588
\n",
+ "
0.693
\n",
"
0.740
\n",
"
\n",
" \n",
@@ -389,10 +460,10 @@
],
"text/plain": [
" n median p95 |x| max |x|\n",
- "along-track (km) 180.0 0.499 0.688 0.693\n",
- "cross-track, right (km) 180.0 0.023 0.282 0.287\n",
+ "along-track (km) 180.0 0.495 0.685 0.690\n",
+ "cross-track, right (km) 180.0 0.026 0.303 0.308\n",
"radial (km) 180.0 0.042 0.132 0.133\n",
- "velocity (m/s) 180.0 0.590 0.690 0.740"
+ "velocity (m/s) 180.0 0.588 0.693 0.740"
]
},
"execution_count": 3,
@@ -405,13 +476,19 @@
"p1, v1 = orbit.get_orbit_track(list(t_mid[i1])).frame_xyz_and_velocity(itrs)\n",
"offset1 = np.array(p1.m).T - sc_pos[i1]\n",
"radial1 = normalize(sc_pos[i1])\n",
- "along1 = normalize(sc_vel[i1] - np.sum(sc_vel[i1] * radial1, axis=-1, keepdims=True) * radial1)\n",
+ "along1 = normalize(\n",
+ " sc_vel[i1] - np.sum(sc_vel[i1] * radial1, axis=-1, keepdims=True) * radial1\n",
+ ")\n",
"test1 = pd.DataFrame(\n",
" {\n",
" \"along-track (km)\": summarize(np.sum(offset1 * along1, axis=-1) / 1e3),\n",
- " \"cross-track, right (km)\": summarize(np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3),\n",
+ " \"cross-track, right (km)\": summarize(\n",
+ " np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3\n",
+ " ),\n",
" \"radial (km)\": summarize(np.sum(offset1 * radial1, axis=-1) / 1e3),\n",
- " \"velocity (m/s)\": summarize(np.linalg.norm(np.array(v1.m_per_s).T - sc_vel[i1], axis=-1)),\n",
+ " \"velocity (m/s)\": summarize(\n",
+ " np.linalg.norm(np.array(v1.m_per_s).T - sc_vel[i1], axis=-1)\n",
+ " ),\n",
" }\n",
").T\n",
"test1.round(3)"
@@ -441,10 +518,10 @@
"id": "a06ec367",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:39.355060Z",
- "iopub.status.busy": "2026-10-15T18:43:39.355060Z",
- "iopub.status.idle": "2026-10-15T18:43:39.437276Z",
- "shell.execute_reply": "2026-10-15T18:43:39.437276Z"
+ "iopub.execute_input": "2026-10-25T13:54:44.220120Z",
+ "iopub.status.busy": "2026-10-25T13:54:44.220120Z",
+ "iopub.status.idle": "2026-10-25T13:54:44.322414Z",
+ "shell.execute_reply": "2026-10-25T13:54:44.322414Z"
}
},
"outputs": [
@@ -471,9 +548,13 @@
],
"source": [
"# spacecraft position at each field of regard's time (extrapolated linearly from the middle time)\n",
- "sc_for = sc_pos[:, np.newaxis] + sc_vel[:, np.newaxis] * dt_for[..., np.newaxis] # (scan, FOR, xyz)\n",
+ "sc_for = (\n",
+ " sc_pos[:, np.newaxis] + sc_vel[:, np.newaxis] * dt_for[..., np.newaxis]\n",
+ ") # (scan, FOR, xyz)\n",
"fov_xyz = ecef(fov_lon, fov_lat, fov_height) # (scan, FOR, FOV, xyz)\n",
- "sc_lon, sc_lat, _ = TO_GEODETIC.transform(sc_for[..., 0], sc_for[..., 1], sc_for[..., 2])\n",
+ "sc_lon, sc_lat, _ = TO_GEODETIC.transform(\n",
+ " sc_for[..., 0], sc_for[..., 1], sc_for[..., 2]\n",
+ ")\n",
"nadir = -up(sc_lon, sc_lat) # (scan, FOR, xyz)\n",
"los = normalize(fov_xyz - sc_for[:, :, np.newaxis]) # (scan, FOR, FOV, xyz)\n",
"\n",
@@ -485,14 +566,22 @@
"# cross-track (scan) angle in the scan plane, positive to the left, and along-track angle out of it, positive forward\n",
"nadir_plane = normalize(nadir - np.sum(nadir * n_, axis=-1, keepdims=True) * n_)\n",
"left_plane = np.cross(n_, nadir_plane)\n",
- "los_plane = los - np.sum(los * n_[:, :, np.newaxis], axis=-1, keepdims=True) * n_[:, :, np.newaxis]\n",
+ "los_plane = (\n",
+ " los\n",
+ " - np.sum(los * n_[:, :, np.newaxis], axis=-1, keepdims=True) * n_[:, :, np.newaxis]\n",
+ ")\n",
"cross_angle = np.degrees(\n",
- " np.arctan2(np.sum(los_plane * left_plane[:, :, np.newaxis], axis=-1), np.sum(los_plane * nadir_plane[:, :, np.newaxis], axis=-1))\n",
+ " np.arctan2(\n",
+ " np.sum(los_plane * left_plane[:, :, np.newaxis], axis=-1),\n",
+ " np.sum(los_plane * nadir_plane[:, :, np.newaxis], axis=-1),\n",
+ " )\n",
")\n",
"along_angle = np.degrees(np.arcsin(np.einsum(\"kjic,kc->kji\", los, normal)))\n",
"for_angle = cross_angle.mean(axis=2) # scan angle of the center of each field of regard\n",
"measured = np.median(for_angle, axis=0)\n",
- "orientation = np.sign(measured[0] - measured[-1]) # +1 if field of regard 0 is on the left\n",
+ "orientation = np.sign(\n",
+ " measured[0] - measured[-1]\n",
+ ") # +1 if field of regard 0 is on the left\n",
"nominal = orientation * ((N_FOR - 1) / 2 - np.arange(N_FOR)) * FOR_SPACING\n",
"\n",
"\n",
@@ -506,7 +595,8 @@
"pd.Series(\n",
" {\n",
" \"field of regard 0 side\": \"left\" if orientation > 0 else \"right\",\n",
- " \"sample interval, field of regard (ms)\": np.median(np.diff(dt_for, axis=1)) * 1e3,\n",
+ " \"sample interval, field of regard (ms)\": np.median(np.diff(dt_for, axis=1))\n",
+ " * 1e3,\n",
" \"nominal spacing (deg)\": FOR_SPACING,\n",
" \"fitted spacing (deg)\": fitted_spacing,\n",
" \"fitted roll (deg)\": fitted_roll,\n",
@@ -525,16 +615,16 @@
"id": "d1b31837",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:39.439269Z",
- "iopub.status.busy": "2026-10-15T18:43:39.439269Z",
- "iopub.status.idle": "2026-10-15T18:43:39.553727Z",
- "shell.execute_reply": "2026-10-15T18:43:39.553727Z"
+ "iopub.execute_input": "2026-10-25T13:54:44.323928Z",
+ "iopub.status.busy": "2026-10-25T13:54:44.323928Z",
+ "iopub.status.idle": "2026-10-25T13:54:44.465710Z",
+ "shell.execute_reply": "2026-10-25T13:54:44.465710Z"
}
},
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAArEAAAFJCAYAAACM83XEAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAa95JREFUeJzt3Qd4U2XbB/C7LVCghZbSlr2nyBBZoiiKbETWp+ILgoIgCIiAAwQERGSJirwqKgj6ylBkqCg4AJE9VYZsEZBZCi2zlLbnu/43nJikaZqUpGna/++6QpuT5OTJk0Nz5zn3cz8BhmEYQkRERETkRwJ93QAiIiIiIncxiCUiIiIiv8MgloiIiIj8DoNYIiIiIvI7DGKJiIiIyO8wiCUiIiIiv8MgloiIiIj8DoNYIiIiIvI7DGKJiIiIyO8wiCUioixv9OjREhAQ4OtmEFEWwiCWiHKEQ4cOyTPPPCPly5eXvHnzSsGCBeWee+6RqVOnytWrV13aB4Ko/v3722yLiYmRgQMHStWqVSVfvnwSHR0t9evXl5dfflkuXbrkpVdDRES5fN0AIiJv++677+SRRx6R4OBg6datm1SvXl0SExNl7dq18uKLL8ru3bvlo48+cnu/586dk7p168qFCxekR48eGsjGxsbKjh075IMPPpC+fftKaGioV14TEVFOxyCWiLK1w4cPS+fOnaVMmTKycuVKKVasmOW2fv36ycGDBzXITUtKSooGvBi9tTdz5kw5evSorFu3Tu6++26b2xDY5smTx8OvhoiITEwnIKJsbdKkSXpaHwGndQBrqlixoqYD2KcMzJkzR26//XYdvV2+fHmaKQpBQUFy1113pboN6QqOAl9rFy9elOeff17Kli2rz4NUhGbNmsn27dtt7rdp0yZp3bq1FCpUSEJCQqRmzZqaBmHCyO+TTz5pSZUoWrSojgxjVNhRXikCd9w/PDxcwsLC5KmnnpIrV65IetasWaMj2qVLl9b2lipVSgYNGpQqHQP7xgj08ePHpX379vp7VFSUvPDCC5KcnGxzX7TxiSee0P5Ce7p37y5//PGHtnP27Nnptunzzz+XOnXqaCpHRESEfmE5duyYzX0OHDggnTp10n5B/5QsWVLvFx8fn+7+iSjr4kgsEWVr3377rQZ39iOlzmDE9ssvv9RgNjIyUoNMRzC6i6Dsf//7nwZf7urTp4989dVX+jzVqlXTgA4pDnv27JE777xT7/PTTz/JQw89pAE4gm0EYrh96dKlluAb9/nrr780GMXtZnoEfm7cuDHVhKhHH31UypUrJ+PHj9eAecaMGRpAT5w40Wl7FyxYoMEu0iQKFy4smzdvlmnTpsk///yjt1lDv7Ro0UIaNGggb775pvz8888yZcoUqVChgj7eHOVu27at7gfbkI7x9ddfu9yX48aNk5EjR+rrefrppzU/Ge2577775LffftOgGKPoaMe1a9dkwIAB2j8IrtF/cXFxGsQTkZ8yiIiyqfj4eAN/5tq1a+fyY3D/wMBAY/fu3Q5v69evn+X6qVOnjKioKN1etWpVo0+fPsbcuXONuLg4l54rLCzMZn/2kpKSjHLlyhllypQxzp8/b3NbSkqK5fcrV66keuy8efO0Xb/++qtl26hRo3Rbjx49bO7boUMHo3Dhwum219HzjB8/3ggICDCOHDli2da9e3d9ntdee83mvrVr1zbq1Kljub5w4UK93zvvvGPZlpycbDRp0kS3z5o1K1XbTX///bcRFBRkjBs3zuY5du7caeTKlcuy/bffftPHLViwIN3XR0T+hekERJRtIS8VChQo4NbjGjdurCOj6SlSpIie+saI6vnz52X69Onyn//8R0c1x44di4jL6eMxUohUgRMnTji8HaOJyOlFygHua816dBWn0k0JCQly9uxZS4qDfWoCoL3W7r33Xh0FNvsrLdbPc/nyZX0ejHDjdaKtrjwPRoxNSNPInTu39OrVy7ItMDBQc5XTs2jRIh3JxSgs2mFeMNJaqVIlWbVqld7PHGn94YcfXEqZICL/wSCWiLIt5FmauafuwKl2V+E0PyoRnDx5Uvbt2yfvvvuu5n+++uqrmoebXr7url27NLcUZbmQs2od5CHnFlBNIb0qCUgtQFCNQBPPb74GR3mfyGm1hlxbQCDuDCaxId8VuadmnisCfkfPg9xT3G7/PNbPceTIEe2//Pnzp8pTTg/yXBE8I2DF81hfkG5x5swZvR/6YfDgwZoygdQQpBa89957zIclygaYE0tE2TqILV68uAaK7rAecXQVRkYrV66slzZt2mhwhclhyNVMC0YRMTq5ePFi+fHHH2Xy5Mmal4pRxlatWrn83NjP+vXrtVzYHXfcoQEmRilbtmypP+1hMpojzkaOkeOKSWcImFEDF/mrmGSG/FIEtvbPk9ZzeAqeD32+bNkyh89lXdoMubhoI/Jt0c/PPfec5gMjXxiTvIjIPzGIJaJsDZOiMMlpw4YN0rBhw0x5Tkwkw6gjRmfTg5HIZ599Vi8YPcSELkxYQhCLSVCAILxp06YOH4+RzRUrVsiYMWN09Nd6pNKTdu7cKfv375dPP/1Ua+2aMKksozAxDqf9cZrfejQW1RPSg75B0I2RVnxxSE+NGjX0MmLECA34sdAF0j9ef/31DLefiHyL6QRElK299NJLOmKIEdHTp0+nuh2n7K3LVbkD+azIDbWH2fbIMa1SpYrTkU37U9rIpcXIMWbSAwJaBGnvvPOOzqR3NGpqjkLaj6LiMZ7k6Hnwe0b7DnBq//r16/Lxxx/bjLDidH96OnbsqG1C8G7/2nHdLC+GPN+kpCSb2xHMIvfW7Gci8k8ciSWibA0jdnPnzpXHHntMbrvtNpsVuzAih9JQONWcESithZSBDh06aK1SLG6AfMxPPvlEc0JfeeWVNB+LPF2cyv6///s/qVWrlp7+RhmqLVu26OlvQKCFfFuUoUKaAEpoYeR27969Wj4Lk5WQMoGSUsivRUBYokQJPWWOCWGehPQB9CVqvSKFAM+7cOHCdPNonUENWeQCDxkyREdf8RzffPONpiyAfWkwa2gLRlGHDRsmf//9t+4LE/jwupGe0bt3b20ryqWhhBnq22LEFgEt3jcEwKgdS0T+i0EsEWV7Dz/8sC4IgJxT5EUiMESxfiwagIDRena8O5555hk9DY7T+dgvRv0wsah58+YaXNWuXTvNx+JxSCFAwGnOtMeEpvfff99SR9UcrcQpd4w4oq24HwI46zYjSEcNVIxgYhQSz49cUYzqegqqCKDmrplPiiAdwTsCRAThGYFAEqulYVIa0hQQtGOfo0aN0tP96S0WMXToUA1M3377be0fwCQ5vH6854C2oQ/RdgTf6HdsQ/84WqSCiPxHAOps+boRREREpiVLlmgwi4UfEMwSETnCIJaIiHwGS9ZaV4NArjBGUrdu3SqnTp3KUKUIIsoZmE5AREQ+gzQIBLKoHIGJVkitQK7yG2+8wQCWiJziSCwREfkM8nmR64uJXVhtDHnByAlGri0RkTMMYomIiIjI77BOLBERERH5HQaxHoDBbJTW4aA2ERERUeZgEOsBKFoeFhamPzPD2ZhTmfI89C/2uW+w332D/Z752Oe+wX737z5nEOuHDCPF103IcdjnvsF+9w32e+Zjn/sG+92/+5xBLBERERH5HQaxREREROR3GMQSERERkd9hEEtEREREfodBLBERERH5HQaxREREROR3/C6Ife+996Rs2bKSN29eadCggWzevNnp/RcsWCBVq1bV+9eoUUO+//57m9uxQMGrr74qxYoVk3z58knTpk3lwIEDXn4VRERERJRjgtgvvvhCBg8eLKNGjZLt27dLrVq1pEWLFnLmzBmH91+/fr08/vjj0rNnT/ntt9+kffv2etm1a5flPpMmTZJ3331Xpk+fLps2bZKQkBDdZ0JCQia+MiIiIiJyR4DhR2ulYuS1Xr168t///levp6SkSKlSpWTAgAEydOjQVPd/7LHH5PLly7J06VLLtrvuukvuuOMODVrx0osXLy5DhgyRF154QW+Pj4+XIkWKyOzZs6Vz584O23Ht2jW9mLDkLNqBYLpgwYLibWdjTkpkVDGvPw/9i33uG+x332C/Zz72uW+w37NmnwcHB7u0r1ziJxITE2Xbtm0ybNgwy7bAwEA9/b9hwwaHj8F2jNxawyjrkiVL9PfDhw/LqVOndB8mLB+LYBmPTSuIHT9+vIwZMybV9ukfvKtpC0RERESUMS++NDx7BbFnz56V5ORkHSW1hut79+51+BgEqI7uj+3m7ea2tO7jCAJp6+DYHInt0/c5jsRmU+xz32C/+wb7PfOxz32D/e7ffe5WEIvT96tXr5Y1a9bIkSNH5MqVKxIVFSW1a9fW0UwEcjkBhrkdDXWntd3T8uTJkynPQ/9in/sG+9032O+Zj33uG+x3/+5zlyZ2Xb16VV5//XUNUlu3bi3Lli2TuLg4CQoKkoMHD+pEq3LlyultGzduFG+IjIzU5zt9+rTNdlwvWrSow8dgu7P7mz/d2ScRERER+Z5LQWzlypVlx44d8vHHH+upc+SLLly4UD7//HMtWXX06FE5dOiQ3HvvvZpHivt5I3KvU6eOrFixwmZkGNcbNmzo8DHYbn1/+Omnnyz3R+CNYNX6Pnh9qFKQ1j6JiIiIyPdcSif48ccf5bbbbnN6nzJlymiuKGb5I6j1BuShdu/eXerWrSv169eXd955R6sPPPXUU3p7t27dpESJEjrxCgYOHCiNGzeWKVOmSJs2bWT+/PmydetW+eijj/T2gIAAef7553WUuVKlShrUjhw5UisWoBQXEREREflxEJteAGstd+7cUqFCBfEGlMyKiYnRxQkw8QqlspYvX26ZmIXgGRULTHfffbfMnTtXRowYIa+88ooGqqhMUL16dct9XnrpJQ2Ee/furSkSjRo10n2yygARERFRNqoTi7QChzsKCNDAr3Tp0jkuSRopCCjNhRqzmVGdIObMCYmKLu7156F/sc99g/3uG+z3zMc+9w32u3/3udsltjD6iYDV2UgsRkw//PBDjmYSERERUdZYdnbx4sV6Wh55pb///rte8HuVKlX01P3MmTNl5cqVegqfiIiIiMgb3B6JHTdunEydOlVXvjLVqFFDSpYsqZOiNm/eLCEhIbqU65tvvunp9hIRERERuT8Su3PnTq1EYA/bcJuZcnDy5EnPtJCIiIiI6FaD2KpVq8qECRMkMTHRsu369eu6DbfB8ePHUy3lSkRERETks3SC9957Tx5++GFNH6hZs6ZuwwhscnKyLF26VK//9ddf8uyzz3qskUREREREtxTEovbq4cOHZc6cObJ//37d9sgjj8h//vMfKVCggF5/4okn3N0tEREREZH3glhAsNqnT5+MPJSIiIiIKPNzYuF///ufrmyF5VmPHDmi295++235+uuvb71FRERERESeDmI/+OADGTx4sLRq1UrOnz+vubBQqFAheeedd9zdHRERERGR94PYadOmyccffyzDhw+XXLn+zUaoW7eupcQWEREREVGWCmIxqat27dqptgcHB8vly5c91S4iIiIiIs8FseXKldOlZu0tX75cbrvtNnd3R0RERETk/eoEyIft16+fJCQkiGEYuszsvHnzZPz48TJjxgz3W0BERERE5O0g9umnn5Z8+fLJiBEj5MqVK1ofFlUKpk6dKp07d3Z3d0REREREmVMntkuXLnpBEHvp0iWJjo7OyG6IiIiIiDIviDXlz59fL0REREREWS6IRTWCgIAAl3a4ffv2W20TEREREdGtB7Ht27e3/I4JXe+//75Uq1ZNGjZsqNs2btwou3fvlmeffdaV3REREREReT+IHTVqlM3Erueee07Gjh2b6j7Hjh27tdYQEREREXmjTuyCBQukW7duqbZ37dpVFi5c6O7uiIiIiIi8H8SivNa6detSbce2vHnzut8CIiIiIiJvVyd4/vnnpW/fvjqBq379+rpt06ZN8sknn8jIkSPd3R0RERERkfeD2KFDh0r58uV1cYPPP/9ct2G52VmzZsmjjz7qfguIiIiIiDKjTiyCVQasRERERJSlc2INw/B+S4iIiIiIPBnE3n777TJ//nxJTEx0er8DBw5ovuyECRNcfX4iIiIiIu+kE0ybNk1efvllXcygWbNmUrduXSlevLhWIzh//rz8+eefsnbtWl3woH///hrIEhERERH5NIh98MEHZevWrRqofvHFFzJnzhw5cuSIXL16VSIjI3VZWtSO7dKlixQqVMhrjSUiIiIicntiV6NGjfRCRERERORXix0QEREREfma3wSx586d03SFggULSnh4uPTs2VMuXbrk9DEJCQnSr18/KVy4sISGhkqnTp3k9OnTltv/+OMPefzxx6VUqVK6Ehnq3aL+LRERERFlbX4TxCKAxcSxn376SZYuXSq//vqr9O7d2+ljBg0aJN9++60sWLBAVq9eLSdOnJCOHTtabt+2bZtER0frog3Y9/Dhw2XYsGHy3//+NxNeERERERFlVIDhB0Vg9+zZI9WqVZMtW7ZoZQRYvny5tG7dWv755x+tlGAvPj5eoqKiZO7cufJ///d/um3v3r062rphwwa56667HD4XRm7xfCtXrnS5fRcuXJCwsDB9TowUe1vMmRMSFZ36NZP3sM99g/3uG+z3zMc+9w32u3/3uV+MxCLoRAqBGcBC06ZNJTAwUDZt2uTwMRhlvX79ut7PVLVqVSldurTuLy0IRCMiIpy259q1axq4Wl+IiIiIKItVJ3AnSPPGSOSpU6f0tL+1XLlyabCJ29J6TJ48eTT4tVakSJE0H7N+/XotIfbdd985bc/48eNlzJgxqbafjTkp1xKc5+l6QlLSdf0mQ5mHfe4b7HffYL9nPva5b7Dfs2afuzpS61IQi0AwICDA6X2QlYD7JCcni6uGDh0qEydOdHofnNrPDLt27ZJ27drJqFGjpHnz5k7vi7zZwYMH2wT5mBwWGVWM6QTZFPvcN9jvvsF+z3zsc99gv/t3n7sUxK5atUq8YciQIfLkk086vU/58uWlaNGicubMGZvtSUlJWrEAtzmC7VgmNy4uzmY0FtUJ7B+DFcewoAMmio0YMSLddgcHB+uFiIiIiHzDpSC2cePGXnlyTLzCJT0NGzbUYBR5rnXq1NFtmHiVkpIiDRo0cPgY3C937tyyYsUKLa0F+/btk6NHj+r+TKhK0KRJE+nevbuMGzfOY6+NiIiIiLLIil3Wrly5ogEhRjut1axZUzwNFQVatmwpvXr1kunTp+uErf79+0vnzp0tlQmOHz+uo6mfffaZ1K9fX6sFoJYsTvsjdxan+QcMGKABrFmZACkECGBbtGih9zNzZYOCglwKromIiIjIT4LYmJgYeeqpp2TZsmUOb3cnJ9Ydc+bM0cAVgSqqEmB09d1337XcjsAWI60Irk1vv/225b6oKIBg9f3337fc/tVXX+nrQZ1YXExlypSRv//+2yuvg4iIiIh8UCcWiw4cOXJE3nnnHbn//vtl8eLFmmf6+uuvy5QpU6RNmzaS07BObPbHPvcN9rtvsN8zH/vcN9jvOWBilzXkon799ddasxWjnBi1bNasmQZvKD2VE4NYIiIiIspcbi92cPnyZUvN1kKFCunpeKhRo4Zs377d8y0kIiIiIrrVILZKlSqaewq1atWSDz/8UCdVYcJVsWLF3N0dEREREZHb3E4nGDhwoJw8eVJ/x8IAqBqASVdYHWv27Nnut4CIiIiIyNtBbNeuXW1qsWKS1969e6V06dISGRnp7u6IiIiIiDKvTqwpf/78cuedd97qboiIiIiIvBfEog4s0gawEhaWgsWqWfbVC4iIiIiIslxOLIJYlNKqXr26BAQEeKdlRERERESeCmLnz58vX375pbRu3drdhxIRERER+abEFqoQVKxY0TPPTkRERESUGUHskCFDZOrUqeLmarVERERERL5LJ1i7dq2sWrVKli1bJrfffrvkzp3b5vZFixZ5rnVERERERJ4IYsPDw6VDhw7uPoyIiIiIyHdB7KxZszz37EREREREmZETS0RERETkFyOxWJELixsUKlRIateu7bQ27Pbt2z3ZPiIiIiKijAWx7dq1k+DgYP29ffv2rjyEiIiIiMi3QeyoUaMc/k5ERERE5BcTu6xdunRJUlJSbLYVLFjwVttEREREROTZiV2HDx+WNm3aSEhIiISFhWmeLC4ovYWfRERERERZbiS2a9euulrXJ598IkWKFHE6yYuIiIiIKEsEsX/88Yds27ZNqlSp4pUGERERERF5PJ2gXr16cuzYMXcfRkRERETku5HYGTNmSJ8+feT48eNSvXp1yZ07t83tNWvW9FzriIiIiIg8EcTGxMTIoUOH5KmnnrJsQ14s8mTxMzk52d1dEhER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a73YgTUEvagni2UEcV8sLYhl8NJai5qIiIiIfM/t6gRY3eqZZ57RmftYhsx6CTf8/tdff0lOg4ldGPnFShqc2JU9sc99g/3uG+z3zMc+9w32e+bL9Ild1rAkHspS4bQ7Ri6JiIiIiDKb21EoTtcjF5UBLBERERH5ituRKCZLLViwwDutISIiIiLyRjrB+PHj5aGHHtLJTzVq1Eg1Aeqtt95yd5dERERERN4PYn/44QctZgv2E7uIiIiIiLJcEDtlyhT55JNP0l1pi4iIiIgoy+TEYrlVc6UrIiIiIiK/CGKxutW0adO80xoiIiIiIm+kE2zevFlWrlwpS5culdtvvz3VxK5Fixa5u0siIiIiIu8GseHh4dKxY0d3H0ZERERE5LsgdtasWZ57diIiIiKiDOCyW0RERETkdxjEEhEREZHfYRBLRERERH6HQSwRERER5awgNiEhwXMtISIiIiLyVhCbkpIiY8eOlRIlSkhoaKj89ddfun3kyJEyc+ZMd3dHREREROT9IPb111+X2bNny6RJkyRPnjyW7dWrV5cZM2a43wIiIiIiIm8HsZ999pl89NFH0qVLFwkKCrJsr1Wrluzdu9fd3REREREReT+IPX78uFSsWNFhmsH169fdbwERERERkbeD2GrVqsmaNWtSbf/qq6+kdu3a7u6OiIiIiMj7y86++uqr0r17dx2RxejrokWLZN++fZpmsHTpUvdbQERERETk7ZHYdu3aybfffis///yzhISEaFC7Z88e3dasWTN3d0dERERE5P2RWLj33nvlp59+yshD6Radir8uO44lSc3g61I0LLevm0NERETkP0Es+cbCLXEyevFJSTFEAgMOyugOxaRTvXBfN4uIiIgoawaxhQoVkoCAAJd2eO7cuVttE6UxAmsGsICfuH5P5RCOyBIREVGO41IQ+84773i/JeTUkbOJlgDWhOtHYxMZxBIREVGO41IQi2oE5FtlIvNIYMCNwNWE66UL/7tqGhEREVFO4XZ1ggsXLji8XLx4URITE73TStLRVuTAInAF/MR1jsISERFRTuT2xK7w8HCn+bElS5aUJ598UkaNGiWBgW7HyOQEJnEhB3bHwZNSsyIDWCIiIsq53A5iZ8+eLcOHD9dAtX79+rpt8+bN8umnn8qIESMkJiZG3nzzTQkODpZXXnnFG23O0RC4BpXKJVEMYImI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4sWLpVq1avL777977DhnEEuUBnxom5CgjqAWf+i+/PJL6dmzp0/bRuRNnTt3tvxeo0YNPf4rVKigo7MPPvigT9uWXSBPE1+ImWfv+z7v3bu3zfGOSaQ4zvEFDsc9ZQwGgBCwYvT7q6++ku7du2v+qycxncAP4BQHRj/sZ+7hetGiRX3WrpwG3xorV64sBw8e9HVTcgzz+Oax71tIp8HfIR77ntG/f39ZunSprFq1SifAmHBMI30sLi7O5v483r3X545gwAJ4vN8ajLZWrFhR6tSpo1UiMJl06tSpHj3OGcT6yYGAg2DFihU2p0VwHUP1lDkuXbqk38zxLZ0yB05n44+a9bF/4cIFrVLAYz/z/PPPP5oTy2P/1mAeHYIpnFZduXKlHt/W8Hc+d+7cNsc7TmsjF5/Hu3f63BGMHgKPd89C3HLt2jWPHudMJ/ATKK+Fofi6detK/fr15Z133tEk6aeeesrXTcu2XnjhBa2liRQClP9AeTOMiD/++OO+blq2+3JgPeKByVz4EMHECyT6I4ft9ddfl0qVKukH0MiRIzV3DfUeyfN9jgvyv1G3EV8g8MXtpZde0hEVlDajWzudPXfuXPn66681r97M/8NkRdRAxk+kKuHvPd4H1NccMGCAfrDfddddvm5+tuxzHN+4vXXr1lqzFDmxKP903333aRoNZQwmxyElD3/DL168qH2MdKQffvjBs8e5F6ookJdMmzbNKF26tJEnTx4tubVx40ZfNylbe+yxx4xixYppf5coUUKvHzx40NfNynZWrVqlpVXsLyjzZJbZGjlypFGkSBEtrfXggw8a+/bt83Wzs22fX7lyxWjevLkRFRWlZXDKlClj9OrVyzh16pSvm+33HPU5LrNmzbLc5+rVq8azzz6r5Yjy589vdOjQwTh58qRP252d+/zo0aPGfffdZ0REROjfl4oVKxovvviiER8f7+um+7UePXro3w58fuJvCf5u//jjjx4/zgPwTwYDbSIiIiIin2BOLBERERH5HQaxREREROR3GMQSERERkd9hEEtEREREfodBLBERERH5HQaxREREROR3GMQSERERkd9hEEtEREREfodBLBHZ2Lt3ry79lzdvXrnjjjvk77//loCAAMt64q64//77dblYZ8qWLavLJ3uyrf4svT4bPXq0R16jJ/rdFTNnzpTmzZuLr3300UdSqlQpCQwM1NftqX7Myez7cOjQobpsKFFmYxBLlMVgbW98IJQvX16Cg4P1A7ht27ayYsUKp49zFGwuXrxYgzysVY11w2+//fZ0g8tRo0ZJSEiI7Nu3T58Tz3/y5EmpXr26ZDX2bc3OXnjhBb95jQkJCTJy5Eh9f6wtWLBAqlatql86atSoId9//71X23HhwgXp37+/vPzyy3L8+HHp3bu3R/rRlS9pOQn69NNPP5W//vrL102hHIZBLFEWgkC0Tp06snLlSpk8ebLs3LlTli9fLg888ID069cvzcddv3491TZ8UD/22GPSqVMn2bx5s2zbtk3GjRvn8L7WDh06JI0aNZIyZcpI4cKFJSgoSIoWLSq5cuWSrMa+ra5ITEwUX8Eq30lJSRl6bGhoqMuv0de++uorKViwoNxzzz2WbevXr5fHH39cevbsKb/99pu0b99eL7t27fJaO44eParHe5s2baRYsWKSP3/+dPvRl8eHv4qMjJQWLVrIBx984OumUE5jEFGW0apVK6NEiRLGpUuXUt12/vx5y+/4r/v+++8bbdu2NfLnz2+MGjXKOHz4sG7/7bff9D4DBw407r//freeH4+3vjjaL+zcudNo2bKlERISYkRHRxtdu3Y1YmJiLLc3btxYn990+vRp46GHHjLy5s1rlC1b1vj888+NMmXKGG+//XaabUlOTjbGjBmj/ZEnTx6jVq1axrJly5y21RG0pV+/ftqewoULW/okvddw4cIF4z//+Y/2b9GiRY233nor1ev67LPPjDp16hihoaFGkSJFjMcff1xfq2nVqlXatu+//9648847jdy5c+s2vL9PPPGEPjf2/eabb6batz28PvSBqXv37ka7du2MyZMn6z4iIiKMZ5991khMTHSr33Fc9ezZ04iMjDQKFChgPPDAA8bvv/+ut505c0Zf17hx4yz3X7dunb6On3/+Oc22tmnTxnjhhRdstj366KO63VqDBg2MZ555xvCGWbNmpTpGcCyn1Y+vv/66UaxYMe0neO+994yKFSsawcHBenx06tTJcn9H+3UkrX2Yx/fEiRONChUq6PFdqlQpbYPppZdeMipVqmTky5fPKFeunDFixAib99Z8HTgG8Z4WLFjQeOyxx/S4NeGYGjBggPHiiy8ahQoV0vfS/v+Js/ffNH78eG0/jvMePXoYL7/8sk0fwqeffmqULFnS7feJ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",
+ "image/png": "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ERERlYnOSaxSqcS6detw+PBhxMTEQKVSaWw/cuSI3oIjIiIiItJG5yR24sSJWLduHXr37o0mTZpAkiRDxEVEREREVCydk9jNmzfjt99+wyuvvGKIeIiIiIiISqXzElumpqZFHtFKRERERFSRdE5ip0yZguXLl/NxrURERERUaXSeTnDy5EkcPXoU+/btQ+PGjWFiYqKxffv27XoLjoiIiIhIG52TWFtbWwwYMMAQsRARERERlYnOSezatWsNEQcRERERUZnpPCeWiIiIiKiylWkktmXLljh8+DBq1KgBHx+fEteGvXDhgt6CIyIiIiLSpkxJbP/+/SGXywEAr776qiHjISIiIiIqVZmSWH9/f61fExERERFVBp1v7Cro0aNHUKlUGmU2NjZPFBARERERUWl0vrErLCwMvXv3hqWlJRQKBWrUqIEaNWrA1tYWNWrUMESMREREREQadB6JHT58OABgzZo1cHZ2LvEmLyIiIiIiQ9A5ib18+TLOnz+Phg0bGiIeIiIiIqJS6Tyd4Pnnn8fdu3cNEQsRERERUZnoPBL7448/YsyYMbh//z6aNGkCExMTje3NmjXTW3BERERERNronMTGxsYiNDQUI0aMUJdJkgQhBCRJglKp1GuARERERESF6ZzEvvPOO/Dx8cGmTZt4YxcRERERVQqdk9iIiAjs2rUL9erVM0Q8RERERESl0vnGrq5du+LSpUuGiIWIiIiIqEx0Hont27cvPvzwQ1y5cgVNmzYtcmNXv3799BYcEREREZE2OiexY8aMAQB89tlnRbbxxi4iIiIiqgg6J7EqlcoQcRARERERlZnOc2IrS2JiIvz8/KBQKKBQKODn54ekpKQS9xFCICAgAG5ubjA3N0fnzp1x9erVYuv26tULkiRh586d+j8BIiIiItKbciWxx48fR9++fVGvXj3Ur18f/fr1w4kTJ/Qdm4Zhw4YhODgY+/fvx/79+xEcHAw/P78S91m0aBGWLFmCFStW4OzZs3BxcUG3bt2QmppapO6yZcu4XBgRERFRNaFzErthwwa8/PLLsLCwwIQJEzB+/HiYm5vjpZdewsaNGw0RI65fv479+/fjxx9/hK+vL3x9ffHDDz9gz549CAkJ0bqPEALLli3DzJkzMXDgQDRp0gTr169Henp6kTgvXbqEJUuWYM2aNQaJn4iIiIj0S+ck9osvvsCi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",
"text/plain": [
""
]
@@ -545,10 +635,27 @@
],
"source": [
"fig, ax = plt.subplots(figsize=(7, 3.4))\n",
- "ax.plot(np.arange(N_FOR), measured - nominal, color=BLUE, marker=\"o\", ms=3, lw=0, label=\"measured (median)\")\n",
- "ax.plot(np.arange(N_FOR), model(fit) - nominal, color=ORANGE, label=f\"fit: spacing {fitted_spacing:.4f} deg, roll {fitted_roll:+.3f} deg\")\n",
+ "ax.plot(\n",
+ " np.arange(N_FOR),\n",
+ " measured - nominal,\n",
+ " color=BLUE,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " lw=0,\n",
+ " label=\"measured (median)\",\n",
+ ")\n",
+ "ax.plot(\n",
+ " np.arange(N_FOR),\n",
+ " model(fit) - nominal,\n",
+ " color=ORANGE,\n",
+ " label=f\"fit: spacing {fitted_spacing:.4f} deg, roll {fitted_roll:+.3f} deg\",\n",
+ ")\n",
"ax.axhline(0, color=GRAY, lw=0.8)\n",
- "ax.set(xlabel=\"CrIS field of regard index (0 = first scanned)\", ylabel=\"Scan angle minus nominal (deg)\", title=\"CrIS scan angles\")\n",
+ "ax.set(\n",
+ " xlabel=\"CrIS field of regard index (0 = first scanned)\",\n",
+ " ylabel=\"Scan angle minus nominal (deg)\",\n",
+ " title=\"CrIS scan angles\",\n",
+ ")\n",
"ax.legend(frameon=False)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -572,10 +679,10 @@
"id": "3cd3ee82",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:39.555836Z",
- "iopub.status.busy": "2026-10-15T18:43:39.555836Z",
- "iopub.status.idle": "2026-10-15T18:43:39.569728Z",
- "shell.execute_reply": "2026-10-15T18:43:39.569728Z"
+ "iopub.execute_input": "2026-10-25T13:54:44.467909Z",
+ "iopub.status.busy": "2026-10-25T13:54:44.467909Z",
+ "iopub.status.idle": "2026-10-25T13:54:44.485368Z",
+ "shell.execute_reply": "2026-10-25T13:54:44.485368Z"
}
},
"outputs": [
@@ -723,22 +830,36 @@
"# offsets of each view from the center of its field of regard (deg): cross-track (positive left) and along-track (positive forward)\n",
"offset_cross = cross_angle - for_angle[..., np.newaxis]\n",
"offset_along = along_angle - along_angle.mean(axis=2, keepdims=True)\n",
- "fov_offsets = np.stack([np.median(offset_cross, axis=0), np.median(offset_along, axis=0)], axis=-1) # (FOR, FOV, 2)\n",
- "central = [N_FOR // 2 - 1, N_FOR // 2] # fields of regard nearest nadir (symmetric, so their rotations cancel)\n",
+ "fov_offsets = np.stack(\n",
+ " [np.median(offset_cross, axis=0), np.median(offset_along, axis=0)], axis=-1\n",
+ ") # (FOR, FOV, 2)\n",
+ "central = [\n",
+ " N_FOR // 2 - 1,\n",
+ " N_FOR // 2,\n",
+ "] # fields of regard nearest nadir (symmetric, so their rotations cancel)\n",
"reference = fov_offsets[central].mean(axis=0) # (FOV, 2)\n",
"layout = pd.DataFrame(\n",
- " {\"cross-track offset (deg)\": reference[:, 0], \"along-track offset (deg)\": reference[:, 1]},\n",
+ " {\n",
+ " \"cross-track offset (deg)\": reference[:, 0],\n",
+ " \"along-track offset (deg)\": reference[:, 1],\n",
+ " },\n",
" index=pd.RangeIndex(1, N_FOV + 1, name=\"FOV\"),\n",
")\n",
- "fov_pitch = np.sort(np.hypot(*reference.T))[1:5].mean() # distance to the four nearest neighbors of the central view\n",
+ "fov_pitch = np.sort(np.hypot(*reference.T))[\n",
+ " 1:5\n",
+ "].mean() # distance to the four nearest neighbors of the central view\n",
"# TAT-C pixel indices within a field of regard: cross-track 0 (right) to 2 (left), along-track 0 (fore) to 2 (aft)\n",
"pixel_cross = np.round(reference[:, 0] / fov_pitch).astype(int) + 1\n",
"pixel_along = 1 - np.round(reference[:, 1] / fov_pitch).astype(int)\n",
"assert len(set(zip(pixel_cross, pixel_along))) == N_FOV\n",
- "center = int(np.flatnonzero((pixel_cross == 1) & (pixel_along == 1))[0]) # the central view of the array\n",
+ "center = int(\n",
+ " np.flatnonzero((pixel_cross == 1) & (pixel_along == 1))[0]\n",
+ ") # the central view of the array\n",
"layout[\"TAT-C cross-track pixel\"] = pixel_cross\n",
"layout[\"TAT-C along-track pixel\"] = pixel_along\n",
- "print(f\"FOV pitch {fov_pitch:.4f} deg (nominal {FOV_SPACING:.4f}); central view: FOV {center + 1}\")\n",
+ "print(\n",
+ " f\"FOV pitch {fov_pitch:.4f} deg (nominal {FOV_SPACING:.4f}); central view: FOV {center + 1}\"\n",
+ ")\n",
"layout.round(3)"
]
},
@@ -756,16 +877,16 @@
"id": "b20313d0",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:39.571887Z",
- "iopub.status.busy": "2026-10-15T18:43:39.570728Z",
- "iopub.status.idle": "2026-10-15T18:43:39.656251Z",
- "shell.execute_reply": "2026-10-15T18:43:39.656251Z"
+ "iopub.execute_input": "2026-10-25T13:54:44.487879Z",
+ "iopub.status.busy": "2026-10-25T13:54:44.487879Z",
+ "iopub.status.idle": "2026-10-25T13:54:44.599034Z",
+ "shell.execute_reply": "2026-10-25T13:54:44.599034Z"
}
},
"outputs": [
{
"data": {
- "image/png": "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EbyGsA8guMB9JXz+2O/xukBAhYys7saNG+p1hvvBFzJ938d+jv1p0KBB6n98qcTfIrD/7rvvTNsRZUJz5sxR9c06BG56xj2p7DW2J5471oe+z+J5I7DHetEhSEYwZH7/5hCAY33iCwKCcAS9oP8PCM4QTOELVPfu3WXq1KkqEEZgqa9za/Ba6dKliwrwcMQI8EUar78BAwaoy3fv3lXbCst79uwpVapUUQEs9vVLly6p9ySss99++03dF44Y4DX2+++/q/16586dUqlSpVS/Dq3B9dhfsf/jiz3em7A/N2jQQO0T+FJibtSoUWp9I/i9ffu2ehx8UcQXTh32Kax7PEcE69jPsF/jvVr/QpSUp3mvICeiETmRadOmIe2krVmzRgsLC9MuXryozZs3T8uVK5fm6empLusqVaqk+fv7azdu3DAtO3DggObq6qp169bNtOy7775T93nu3LlEj3f//v1Ey5o3b64VLVrUYlnZsmW1Bg0aJLptcHCwum/8D9HR0WpM5cqV0x48eGC63dKlS9XtPvvsM9Oy7t27q2VffvmlxX1WrlxZq1q1arLrKTQ0VDMYDFqzZs20uLg40/KJEyeq+5w6dapp2eeff66WYX0+Tt++fdVtE8K6w/KcOXNqN2/eNC1ftGiRWr5kyRLTsiZNmmjly5fXIiMjTcuMRqMWGBiolShRItnH79Chg7q/W7duaSmhr8OhQ4davc7b29tiGfYL3D579uzqscaMGaMdO3YsRY+1cuXKRM8VWrZsabG/6OsK+3Jq1wnWf+7cuU2XBw0apNWvX1/tU7/88otahv3dxcVFGz9+fLLjtbZvb9u2TY1txowZiV5zdevW1WJjYy1uj30e102aNClF9//OO+9omTNntnietWvX1mrWrGlxuwULFli8bpKC191LL71kulylShWtc+fO6m/17abfF177ukKFCqntr5s7d26Sj4fb4rqNGzdavL7wfvPBBx8kO74BAwZovr6+idabObzmcf8YZ0LYBwB/HxUVZXEdXgPYF3r27PlEr0NrsF3M3y/0+8RzNX8f0t/XypQpYzEu7HNYfujQIXUZ12Es1atX12JiYky3mz59urqd+Xvm07wuyLmxtICcErKMyA4VLFhQZUrwTR0ZDP0b/tWrV2X//v0qa4JDUjpkbp5//nk1aSklcChMh4wDMiXITiBzgcuptXv3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02BoRESUYVtm+cUHn3GhFx/WvlrLvnYUQ/m6SXYeYO9XIueX4oysubNnz8r06dNlxowZcunSJWnatKn06tVLZWtxCltHxYzsk+E3TOfBbek8HHFbomXW8KCr4mqMlfqxe+Q9362S/eo+0/WuWf3EM/Bh39ecjvXcMtq2JOu4LdNJIKvDn65Zs0YFtQsXLhRvb28JDQ0VR8VA9snwhek8uC2dh6NtS2Riu3+zRVpFrZcW0RsluxZ/BknNxUUMz9WOz76Wq5Mh+7462rakpHFb2t5TvSO4uLiIu7u7+h9BLWpoiYiIUlf7ul6iV82TWRF7TcvDXLLLMkN9adS9i1SpXMyuYyQiJwtkL168qGplkYm9cOGC1K9fX3799Vfp1KmT7UdIREROJy70gkRuflj7eveWZH7Y93WHewVZamgo2zwqiebqJq8WDbD3UInIGQLZ6OhoWbBggUydOlXWrVsnefPmle7du6sJX0WLFk3bURIRkcPTYqJV9jVyU5DEnNxtWu6aNZd41mknwVkaykerjWJkyywisnUgmydPHrl//760bt1alixZIs2bNxdXV9eU/jkREWVQcdf+i8++bkf2NfxR54GydcSrbntT7WtrEalWxTlaZhFROgtkP/nkE3n99dclV674s6QQERElm33dvz6+76t59jWb/6POAznyJPo7tswiojQJZAcNGqT+37Vrl/z9999y8uRJdblkyZLStWtXqVatWqoemIiInK/3a67IK4/OunXvdvwNXFzFo1ygeNXtIIaygRmy8wARpY1UvZsMHjxYxowZI1myZDHVxW7YsEHGjx8v//vf/+Tbb79No2ESEVF67f06YsEFqRu9W9pEr5fKsccss6912olXYFur2VciomcWyP7xxx8yYcIE+fHHH+Wdd94xnfgALbd++eUXGTJkiJQtW1a6dev21IMiIqL0L+T0aQmZNUP+id4k2bS7almcuIhL6UDJ1riTeDxXm9lXIkpTKX6H+emnn+Sbb76Rfv36WSxHQPvee+9JbGysTJw4kYEsEZET02KiJGpfsCofcD+1V15+uDzUJYcs9Wyger+OblNZahT1tvNIiSgjSHEge+TIEWnXrl2S1+P0tJ9++qmtxkVEROlIbMh5FbxGbf/XVPuqubjKVveKssTQUHa4VxSji6tqm4WOA0RE6SqQdXNzU71kk4ISA9yGiIic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oH379jJt2jTVv9XNzU215qJnVPt6cGN839ejO+T1h9nXmy6+ssxQX/41NJARHaqz7ysRERE5tRQHsmhlNXnyZGnatKls3bpVOnfuLG+88YZs375dZWNxGcEspZ2465clcssiidy6WLSIG6a+r7vcy6m+r1s8qkisizv7vhIREVGGkOJAdu7cuTJjxgx1MgScbACtrjDZ68CBA2ryF6Vx9nVTkMQc3/Go8wBqXx92Hrh/PotsYt9XIiIiymBSHMheunRJnWgAypUrJ56enqqUgEFs2ogLuxSffd2G7OtN03KPMrXiOw9UqGeqfe2Ui31fiYiIKONJcSAbFxenamNNf+jubjpVLNkw+3ogvvY15th203IXX3QeaCteddqJW674U/ImxL6vRERElNGkOJDFmbR69OihMrEQGRkpvXv3Fm9vywlFCxYssP0onb33q0uY+Bz813r2VZ11q764uD1xgwkiIiIip5Ti6Kh79+4Wl1977bW0GE+GMX/HDVk3919pHRUsxWIPi96B18U3p3gFPsy++uW38yiJiIiInCCQRZstsl0m9uuFV2TO/T8khxYhRnGR3e7lpOorXcS/ViNmX4mIiIhSgBGTHaCcIFrcZY5nC8mi3ZelhoYS4pZLpuUNkNwMYomIiIhShFGTHRTyM6g2WbO9WpmWsfcrERERUeq4pvL2ZAPoLoBerwhegb1fiYiIiFKPGVk76VQ9G3u/EhERET0FBrJ2xN6vRERERE+OpQVERERE5JAYyBIRERGRQ2IgS0REREQOiYEsERERETkkBrJERERE5JDYtcCMpmnq/4iICHsPxaHcuXNHPL24zpwBt6Xz4LZ0HtyWzoPbMnV8fHzExeVh0/0kMJBNsINBwYIF7T0UIiIiogzt9u3b4uvrm+xtXDQ9DUliNBrlypUrKfoGQGLKXiPwv3jx4mN3NkrfuC2dB7el8+C2dB7clqnHjGwqubq6SoECBew9DIeEFyVfmM6B29J5cFs6D25L58FtaVuc7EVEREREDomBLBERERE5JAay9FQ8PT3l888/V/+TY+O2dB7cls6D29J5cFumDU72IiIiIiKHxIwsERERETkkBrJERERE5JAYyBIRERGRQ2IgS0REREQOiYEsPbWoqCipVKmSOvvG/v37La47ePCg1KtXT7y8vNQZTUaPHm23cZJ158+fl169ekmRIkUk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",
+ "image/png": "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",
"text/plain": [
""
]
@@ -801,9 +922,18 @@
"rotation_fit = np.polyfit(measured, rotation, 1)\n",
"fig, ax = plt.subplots(figsize=(7, 3.4))\n",
"ax.plot(measured, rotation, color=BLUE, marker=\"o\", ms=3, lw=0, label=\"measured\")\n",
- "ax.plot(measured, np.polyval(rotation_fit, measured), color=ORANGE, label=f\"fit: {rotation_fit[0]:+.3f} x scan angle {rotation_fit[1]:+.2f} deg\")\n",
+ "ax.plot(\n",
+ " measured,\n",
+ " np.polyval(rotation_fit, measured),\n",
+ " color=ORANGE,\n",
+ " label=f\"fit: {rotation_fit[0]:+.3f} x scan angle {rotation_fit[1]:+.2f} deg\",\n",
+ ")\n",
"ax.axhline(0, color=GRAY, lw=0.8)\n",
- "ax.set(xlabel=\"Scan angle (deg)\", ylabel=\"Rotation of the FOV array (deg)\", title=\"Rotation of the CrIS view array with scan angle\")\n",
+ "ax.set(\n",
+ " xlabel=\"Scan angle (deg)\",\n",
+ " ylabel=\"Rotation of the FOV array (deg)\",\n",
+ " title=\"Rotation of the CrIS view array with scan angle\",\n",
+ ")\n",
"ax.legend(frameon=False)\n",
"fig.tight_layout()\n",
"plt.show()\n",
@@ -811,7 +941,9 @@
" {\n",
" \"rotation per degree of scan angle\": rotation_fit[0],\n",
" \"rotation at nadir (deg)\": rotation_fit[1],\n",
- " \"fit residual, max |x| (deg)\": np.abs(np.polyval(rotation_fit, measured) - rotation).max(),\n",
+ " \"fit residual, max |x| (deg)\": np.abs(\n",
+ " np.polyval(rotation_fit, measured) - rotation\n",
+ " ).max(),\n",
" \"rotation at the left edge (deg)\": rotation[measured.argmax()],\n",
" \"rotation at the right edge (deg)\": rotation[measured.argmin()],\n",
" }\n",
@@ -836,16 +968,16 @@
"id": "dedffedc",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:39.658540Z",
- "iopub.status.busy": "2026-10-15T18:43:39.657490Z",
- "iopub.status.idle": "2026-10-15T18:43:39.787258Z",
- "shell.execute_reply": "2026-10-15T18:43:39.786551Z"
+ "iopub.execute_input": "2026-10-25T13:54:44.601038Z",
+ "iopub.status.busy": "2026-10-25T13:54:44.601038Z",
+ "iopub.status.idle": "2026-10-25T13:54:44.750574Z",
+ "shell.execute_reply": "2026-10-25T13:54:44.750069Z"
}
},
"outputs": [
{
"data": {
- "image/png": "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us9EnhQPQHxyok91CHN6HNnPPvtMDbf166+/SpYsWWT8+PFy5MgReemll6Ro0aLu2UpKgePNkbsgE2stiDX1x4EYmfP3rTS/xogRI+Ttt9823kYHUnQkvX79umzdulWeeOIJlSmsWLGiTJo0SdJj7dq1UrNmTXn88celQoUK8v333xvXIdv6v//9T2VP8VpvvfWWWo5+AHj9a9euqduHDx+WRo0aqQlgkHG1PBMFhw4dknbt2qkzVXjsrFmzVIbSkMnFPrds2VKN/BIfH6/2ce7cuWrdqlWrpE6dOmrZk08+KevXrzc+L56jdOnSah0SCdZcvHhR8uXLZ7Zd2Dd8PsOOHTukYcOGUq1aNdUOixcvtvo82I6qVasaR6HBPhnMmDFD7Rc6+uJ5kJ3ExdDR17Lt0A758+eX2NhY43NgzHFH3k+0I14D24FytitXrqjlOD6QPEGmG+veeOMN42NGjx6tlmP7atSoIbGx99Xy2bNny1NPPaX2C+8zhow0ZPEbN24sr776qnocXu/UqVN22910n8HPz099L+J9wxkBtJPB33//rdoCz4/jDNuG0X6I3BUPGPhUgktzUvbs2bXTp0+r67lz59b27dunrh86dEgrUKCA5smioqLwk0X9zSzXrl50+L634u9pXbbO1Z5YMUr9xW1H1umNM23iSzKjXRKTkrWGI49p5fsdsnvB/ZKSktP0OufOndMiIiK0uLg4dXv69OlamzZt1PWWLVtq8+bNM9731q1bdttkxowZWmhoqFa5cmXjZdy4ccbHJyYmqus3b97UihYtqp0/f17d7tixo1apUiUtOjra+Fz4jLh9+7bxNu7z5JNPavfu3VPPU6tWLbPtM7V+/Xr12gaDBw/WevXqpa4nJydrzZo10z7//HOtR48eWteuXdXykydPajVq1DB+Lh0/flx9lqJtli9frpUvX16tw+PbtWunFStWLMXrol2eeeYZbfHixep2TEyMFh4ert24cUPtS5UqVbRLly6pddevX9ciIyO1CxcuqM/ysLAwtfzq1atmn+lz5szRypUrp14X+1W8eHHjc6AtcDF9vLW2e+2117TJkyer61euXFHvObbNnmvXrhmvjxw5UuvWrZu6jvfU0G6G9xNmzpypVa9eXbtz547xPb986Zy2efNmrXnz5sbjbNOmTao9TY+ZU6dOqdt9+/Y1Pndq7W5t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/OfPn1c1z3gPAPXV1qCu2rRjHhFlPpYWEJFLIZBCx6g5c+bIvn375PTp07J48WIZM2aMCiINp2gxAgECLpweRiefgQMHWn0+nBbG0F0IIpDNRWbO1uD6OP2Mjj8oZUCvewSuCEoMgW/p0qVl9erV8vfff6vX7datmwpgTCFYRXCETlIYlQDBbs+ePVU2DkExng+nwFGSgCGZ7AWE1mBwfbSBodMYTskDMofoCDVhwgQVYO/fv18F4ePGjXPoeRHwIwDFEFUIiFHaYTo2LGAUCQShGMoK4/0aMqSW0A6bNm2SixcvGkdnQBCHx+C9RBt88803KuttCp2q8L7iRwsC6x49epiNWYtyhw8++ED9yEAnNjzPrl271Dan1qkNWeUtW7aYtfe7776r2nDs2LFy/Phx+frrr9VtU+g8h7IFtC06luF9R4becLzhjEGpUqWkY8eO6njFMWNYZwjWASUFCMibNGni0HtBRBkkE+pyiciLoTNPv379tKpVq6pON+jYU6ZMGW3gwIFabGys8X6HDh1SnZjQeatKlSraH3/8YbWz16+//qpVqFBBy5Ili/bkk0+adRqzFB8fr73yyitaZGSkun+hQoW0t99+W7t//76xsxg6HeXMmVPLly+f2qYOHToYOyIBOm/VqFFDbRdeHx2z4NixY1rr1q21XLlyqXVly5bVevfurSUnJzvd2QumTp2qttPf31891mDu3LmqPbD96DBXt25dbcmSJTb32fJ10VmsePHiWnBwsGrfX375JUXHMnSaKlCggObn56d17NjR6vNs2bJFq1Spknoe06+KSZMmqe3OkSOHarsRI0aYdfZC5y48T2hoqGqr999/P0Ubo82++uordVwEBQVpERERWtOmTbWNGzfa3E88L97PlStXmi3//vvvVWcyvCfPPfecNnbsWLPOXoDHoNMh7oPtwnE0ZcoU4/rDhw9rtWvXVm2O9xXHHPbZ9LXQrtheIvIsfvgno4JmIiKitEIGGFlmZMPdCVlZjCuLjmnI1gLOICADjPprIvIcrJElIiJdQCkIyhRiYmJcOk0txrnFaAYoPUHwivKI2rVrG4NYlFagsxhKS4jIszAjS0REPg01tBjmDB3QUIONodswsQNmJiMiz8ZAloiIiIh0iaMWEBEREZEuMZAlIiIiIl1iIEtEREREusRAloiIiIh0iYEsEREREekSA1kiIiIi0iUGskRERESkSwxkiYiIiEiXGMgSERERkejR/wMQahHMBnOZEgAAAABJRU5ErkJggg==",
+ "image/png": "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uHBBdOrUSTg5OQlTU1NRunRp0bRpU3Ho0CGF7T5+/ChmzZolPvnkE2FiYiJKly4tfHx8FN4fv/32m6hZs6YwMzMT5cuXF9988404cuSI0swBOT1HAIgRI0aIdevWicqVKwtjY2Ph4uIidu7cqbCdqlkLnj9/Lrp06SJKlSolLC0txeeffy5u3rwpnJyc5O8hIf6bteDKlStq2xRCs/c3UWEgEUKLCf6IiIhIgUQiwYgRI7S6dTQR5Q7WyBIRERGRXmIiS0RERER6iRd7ERER5QAr9IjyD0dkiYiIiEgvMZElIiIiIr3ERJaIiIiI9FKRSmSFEIiNjWU9ExEREVEhUKQS2bi4OJQoUQJxcXH5FkNUpPL9uIn9ogr7RBn7RDX2izL2iWrsF2XsE9X0pV+KVCJbEAiRkt8hFEjsF2XsE2XsE9XYL8rYJ6qxX5SxT1TTl35hIktEREREeomJLBERERHpJSayRERERKSXmMgSERERkV5iIktEREREeomJLBERERHpJSayRERERKSXmMgSERERkV5iIktEREREeomJLBERERHpJSayRERERKSXmMgSERERkV5iIktEREREeomJLBERERHpJSayRERERKSXmMgSERERkV5iIktEREREeomJLBERERHpJSayRERERKSXmMgSERERkV7S20R20aJFkEgkGDt2bH6HQkRERET5QC8T2StXrmDjxo1wd3fP71CIiIiIKJ/oXSL7/v179OrVC5s2bUKpUqXyOxwiIiIiyid6l8iOGDECbdu2RYsWLfI7FCIiIiLKR0b5HYA2du/ejatXr+LKlSsabZ+YmIjExET549jYWF2FRkRERER5TG8S2WfPnmHMmDE4duwYzMzMNHrOokWLMGfOHKXlUZHhSEx4n9shakQqTUZkxMt82XdBxn5Rxj5Rxj5Rjf2ijH2iGvtFGftEtfzulzK25TTaTiKEEDqOJVccPHgQnTp1gqGhoXyZTCaDRCKBgYEBEhMTFdYBqkdkHR0dERMTAysrqzyLPb3IiJcavzhFCftFGftEGftENfaLMvaJauwXZewT1fSlX/RmRLZ58+a4ceOGwrL+/fvDxcUFkydPVkpiAcDU1BSmpqZ5FSIRERER5SG9SWQtLS3h5uamsKx48eIoXbq00nIiIiIiKvz0JpElItJn0UnxmBx8EFejn8GrlCOWeHZEKZNi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EhEREZGeYiJLRERERHqJiSwRERER6SUmskRERESkl5jIEhEREZFeYiJLRERERHqJiSwRERER6SUmskRERESkl5jIEhEREZFeYiJLRERERHqJiSwRERER6SUmskRERESkl5jIEhEREZFeYiJLRERERHqJiSwRERER6SUmskRERESkl5jIEhEREZFeYiJLRERERHrJKL8DyEtCCABAbGxsvsUQFxcHU7P8239BxX5Rxj5Rxj5Rjf2ijH2iGvtFGftEtYLQL5aWlpBIJFluU6QS2bi4OACAo6NjPkdCRERERFmJiYmBlZVVlttIRNowZRGQkpKCly9fapTh60JsbCwcHR3x7NkztS9MUcJ+UcY+UcY+UY39oox9ohr7RRn7RLWC0i8ckc3AwMAADg4O+R0GrKys+IZRgf2ijH2ijH2iGvtFGftENfaLMvaJavrQL7zYi4iIiIj0EhNZIiIiItJLTGTzkKmpKWbPng1TU9P8DqVAYb8oY58oY5+oxn5Rxj5Rjf2ijH2imj71S5G62IuIiIiICg+OyBIRERGRXmIiS0RERER6iYksEREREeklJrJ55O7du+jQoQNsbGxgZWWFhg0b4vTp0wrbPH36FO3atUPx4sVhY2OD0aNHIykpKZ8izhu///476tWrB3Nzc9jY2KBz584K64tin6RJTEyEh4cHJBIJQkJCFNYVpX55/PgxBg4ciIoVK8Lc3ByVK1fG7NmzlY63KPVJmnXr1qFixYowMzNDrVq1cPbs2fwOKc8sWrQIderUgaWlJWxtbdGxY0eEhYUpbCOEgL+/P8qVKwdzc3M0a9YMt27dyqeI896iRYsgkUgwduxY+bKi2icvXrxA7969Ubp0aRQrVgweHh4ICgqSry+K/SKVSjFjxgz5Z2ulSpUwd+5cpKSkyLfRi34RlCeqVKki2rRpI65duybu3r0rhg8fLooVKybCw8OFEEJIpVLh5uYmvL29xdWrV8Xx48dFuXLlxMiRI/M5ct3Zt2+fKFWqlFi/fr0ICwsTd+7cEXv37pWvL4p9kt7o0aNF69atBQARHBwsX17U+uXIkSPCz89P/Pnnn+LBgwfi119/Fba2tmLChAnybYpanwghxO7du4WxsbHYtGmTCA0NFWPGjBHFixcXT548ye/Q8oSvr68IDAwUN2/eFCEhIaJt27aiQoUK4v379/JtFi9eLCwtLcUvv/wibty4Ib788kthb28vYmNj8zHyvHH58mXh7Ows3N3dxZgxY+TLi2KfvH37Vjg5OQk/Pz9x6dIl8ejRI3HixAlx//59+TZFsV/mz58vSpcuLQ4fPiwePXok9u7dKywsLMSqVavk2+hDvzCRzQORkZECgPj777/ly2JjYwUAceLECSGEEH/88YcwMDAQL168kG/z008/CVNTUxETE5PnMetacnKyKF++vNi8eXOm2xS1Pknvjz/+EC4uLuLWrVtKiWxR7pc0S5cuFRUrVpQ/Lop9UrduXTF06FCFZS4uLmLKlCn5FFH+ioiIEADEX3/9JYQQIiUlRdjZ2YnFixfLt0lISBAlSpQQAQEB+RVmnoiLixOffPKJOH78uGjatKk8kS2qfTJ58mTRqFGjTNcX1X5p27atGDBggMKyzp07i969ewsh9KdfWFqQB0qXLo3q1atj+/bt+PDhA6RSKTZs2ICyZcuiVq1aAIALFy7Azc0N5cqVkz/P19cXiYmJCj9/FBZXr17FixcvYGBgAE9PT9jb26N169YKP1kUtT5J8/r1awwePBg//vgjihUrprS+qPZLejExMbC2tpY/Lmp9kpSUhKCgILRq1UpheatWrXD+/Pl8iip/xcTEAID8vHj06BFevXql0EempqZo2rRpoe+jESNGoG3btmjRooXC8qLaJ4cOHULt2rXRrVs32NrawtPTE5s2bZKvL6r90qhRI5w8eRJ3794FAFy7dg3//PMP2rRpA0B/+sUovwMoCiQSCY4fP44OHTrA0tISBgYGKFu2LI4ePYqSJUsCAF69eoWyZcsqPK9UqVIwMTHBq1ev8iFq3Xr48CEAwN/fHytWrICzszO+/fZbNG3aFHfv3oW1tXWR6xMgtR7Jz88PQ4cORe3atfH48WOlbYpiv6T34MEDrFmzBt9++618WVHrk6ioKMhkMqVjLlu2bKE8XnWEEBg/fjwaNWoENzc3AJD3g6o+evLkSZ7HmFd2796Nq1ev4sqVK0rrimqfPHz4EOvXr8f48eMxbdo0XL58GaNHj4apqSn69u1bZPtl8uTJiImJgYuLCwwNDSGTybBgwQL07NkTgP6cLxyRzQF/f39IJJIs//v3338hhMDw4cNha2uLs2fP4vLly+jQoQO++OILhIeHy9uTSCRK+xBCqFxeUGnaJ2nF5NOnT0eXLl1Qq1YtBAYGQiKRYO/evfL2CkOfAJr3y5o1axAbG4upU6dm2V5h6BdN+yS9ly9f4vPPP0e3bt0waNAghXWFoU+0lfHYCvvxZmbkyJG4fv06fvrpJ6V1RamPnj17hjFjxmDHjh0wMzPLdLui1CcAkJKSAi8vLyxcuBCenp74+uuvMXjwYKxfv15hu6LWL3v27MGOHTuwa9cuXL16Fdu2bcPy5cuxbds2he0Ker9wRDYHRo4ciR49emS5jbOzM06dOoXDhw8jOjoaVlZWAFKvNj5+/Di2bduGKVOmwM7ODpcuXVJ4bnR0NJKTk5X+GirINO2TuLg4AICrq6t8uampKSpVqoSnT58CQKHpE0Dzfpk/fz4uXryodFvA2rVro1evXti2bVuh6RdN+yTNy5cv4e3tjfr162Pjxo0K2xWWPtGUjY0NDA0NlUZfIyIiCuXxZmXUqFE4dOgQ/v77bzg4OMiX29nZAUgdVbK3t5cvL8x9FBQUhIiICHnJGgDIZDL8/fff+P777+WzOhSlPgEAe3t7he8aAKhevTp++eUXAEXzXAGAb775BlOmTJF/DteoUQNPnjzBokWL0K9fP73pFyayOWBjYwMbGxu128XHxwMADAwUB8ANDAzkI5P169fHggULEB4eLj9hjh07BlNTU4UPpYJO0z6pVasWTE1NERYWhkaNGgEAkpOT8fjxYzg5OQEoPH0CaN4v3333HebPny9//PLlS/j6+mLPnj2oV68egMLTL5r2CZA6dY63t7d85D7je6mw9ImmTExMUKtWLRw/fhydOnWSL08rYSoKhBAYNWoUDhw4gDNnzqBixYoK6ytWrAg7OzscP34cnp6eAFJri//66y8sWbIkP0LWuebNm+PGjRsKy/r37w8XFxdMnjwZlSpVKnJ9AgANGzZUmprt7t278u+aoniuAKm5ScbPUkNDQ3leojf9ki+XmBUxkZGRonTp0qJz584iJCREhIWFiYkTJwpjY2MREhIihPhv+qDmzZuLq1evihMnTggHB4dCPX3QmDFjRPny5cWff/4p7ty5IwYOHChsbW3F27dvhRBFs08yevToUabTbxWVfnnx4oWoUqWK8PHxEc+fPxfh4eHy/9IUtT4R4r/pt7Zs2SJCQ0PF2LFjRfHixcXjx4/zO7Q8MWzYMFGiRAlx5swZhXMiPj5evs3ixYtFiRIlxP79+8WNGzdEz549C9zUQbqWftYCIYpmn1y+fFkYGRmJBQsWiHv37omdO3eKYsWKiR07dsi3KYr90q9fP1G+fHn59Fv79+8XNjY2YtKkSfJt9KFfmMjmkStXrohWrVoJa2trYWlpKT777DPxxx9/KGzz5MkT0bZtW2Fubi6sra3FyJEjRUJCQj5FrHtJSUliwoQJwtbWVlhaWooWLVqImzdvKmxT1PokI1WJrBBFq18CAwMFAJX/pVeU+iTN2rVrhZOTkzAxMRFeXl7yqaeKgszOicDAQPk2KSkpYvbs2cLOzk6YmpqKJk2aiBs3buRf0PkgYyJbVPvkt99+E25ubsLU1FS4uLiIjRs3Kqwviv0SGxsrxowZIypUqCDMzMxEpUqVxPTp00ViYqJ8G33oF4kQQuTHSDARERERUU5w1gIiIiIi0ktMZImIiIhILzGRJSIiIiK9xESWiIiIiPQSE1kiIiIi0ktMZImIiIhILzGRJSIiIiK9xESWiIiIiPQSE1kiKpDOnDkDiUSCd+/e5XcoGmnWrBnGjh0rf+zs7IxVq1bJH0skEhw8eFDn+83vdlTx8/NDx44dc9xOWFgY7OzsEBcXl+k2W7duRcmSJXO8r/QiIiJQpkwZvHjxIlfbJaKcYyJLRLkuIiICX3/9NSpUqABTU1PY2dnB19cXFy5cyO/Q1NJVQhceHo7WrVsDAB4/fgyJRIKQkJBc3486mf2BsH//fsybN0/+OGMiXhBMnz4dI0aMgKWlZZ7u19bWFn369MHs2bPzdL9EpJ5RfgdARIVPly5dkJycjG3btqFSpUp4/fo1Tp48ibdv3+Z3aPnGzs4uv0PIkrW1dX6HkKXnz5/j0KFD+ZZc9+/fH3Xr1sWyZctQqlSpfImBiJRxRJaIctW7d+/wzz//YMmSJfD29oaTkxPq1q2LqVOnom3btgBUj0i+e/cOEokEZ86cUWjv3LlzqFmzJszMzFCvXj3cuHEjy/1fu3YN3t7esLS0hJWVFWrVqoV///0XAPDmzRv07NkTDg4OKFasGGrUqIGffvpJ/lw/Pz/89ddfWL16NSQSCSQSCR4/fgwACA0NRZs2bWBhYYGyZcuiT58+iIqK0rhf0pcWVKxYEQDg6ekJiUSCZs2aybcLDAxE9erVYWZmBhcXF6xbt07jfQDAjh07ULt2bVhaWsLOzg5fffUVIiIiAKT2u7e3NwCgVKlSkEgk8PPzA6A4Et2sWTM8efIE48aNk/cDAPj7+8PDw0Nhf6tWrYKzs7P8sUwmw/jx41GyZEmULl0akyZNghBC4TlCCCxduhSVKlWCubk5atasiX379mV5XD///DNq1qwJBwcHheVbt25FhQoVUKxYMXTq1Alv3rxReu5vv/2GWrVqwczMDJUqVcKcOXMglUrl6+/cuYNGjRrBzMwMrq6uOHHihFIpSI0aNWBnZ4cDBw5kGScR5S0mskSUqywsLGBhYYGDBw8iMTExx+198803WL58Oa5cuQJbW1u0b98eycnJmW7fq1cvODg44MqVKwgKCsKUKVNgbGwMAEhISECtWrVw+PBh3Lx5E0OGDEGfPn1w6dIlAMDq1atRv359DB48GOHh4QgPD4ejoyPCw8PRtGlTeHh44N9//8XRo0fx+vVrdO/ePVvHdPnyZQDAiRMnEB4ejv379wMANm3ahOnTp2PBggW4ffs2Fi5ciJkzZ2Lbtm0at52UlIR58+bh2rVrOHjwIB49eiRPVh0dHfHLL78ASK03DQ8Px+rVq5Xa2L9/PxwcHDB37lx5P2jq22+/xQ8//IAtW7bgn3/+wdu3b5WSvxkzZiAwMBDr16/HrVu3MG7cOPTu3Rt//fVXpu3+/fffqF27tsKyS5cuYcCAARg+fDhCQkLg7e2N+fPnK2zz559/onfv3hg9ejRCQ0OxYcMGbN26FQsWLAAApKSkoGPHjihWrBguXbqEjRs3Yvr06SpjqFu3Ls6ePatxXxBRHhBERLls3759olSpUsLMzEw0aNBATJ06VVy7dk2+/tGjRwKACA4Oli+Ljo4WAMTp06eFEEKcPn1aABC7d++Wb/PmzRthbm4u9uzZk+m+LS0txdatWzWOtU2bNmLChAnyx02bNhVjxoxR2GbmzJmiVatWCsuePXsmAIiwsDCVz3NychIrV66UPwYgDhw4IIRQffxCCOHo6Ch27dqlsGzevHmifv36mcavKt70Ll++LACIuLg4IcR//RodHZ1lOxnjF0KI2bNni5o1ayosW7lypXBycpI/tre3F4sXL5Y/Tk5OFg4ODqJDhw5CCCHev38vzMzMxPnz5xXaGThwoOjZs2emx1GzZk0xd+5chWU9e/YUn3/+ucKyL7/8UpQoUUL+uHHjxmLhwoUK2/z444/C3t5eCCHEkSNHhJGRkQgPD5evP378uMLrlWbcuHGiWbNmmcZIRHmPI7JElOu6dOmCly9f4tChQ/D19cWZM2fg5eWFrVu3at1W/fr15f+2trZGtWrVcPv2bQD/jf5aWFhg6NChAIDx48dj0KBBaNGiBRYvXowHDx7Iny+TybBgwQK4u7ujdOnSsLCwwLFjx/D06dMsYwgKCsLp06cV9ufi4gIACu3nRGRkJJ49e4aBAwcq7Gf+/Pla7SM4OBgdOnSAk5MTLC0t5WUL6o4xN8TExCA8PFzhNTMyMlIYSQ0NDUVCQgJatmypcJzbt2/P8jg/fvwIMzMzhWW3b99W2BcApcdBQUGYO3euwr7SRtzj4+MRFhYGR0dHhRrmunXrqozB3Nwc8fHx6juCiPIML/YiIp0wMzNDy5Yt0bJlS8yaNQuDBg3C7Nmz4efnBwOD1L+hRbrayazKBTJKq9lMX2NrZWUFILWO86uvvsLvv/+OI0eOYPbs2di9ezc6deqEb7/9FitXrsSqVatQo0YNFC9eHGPHjkVSUlKW+0tJSUG7du2wZMkSpXX29vYax61uH0BqeUG9evUU1hkaGmrUxocPH9CqVSu0atUKO3bsQJkyZfD06VP4+vqqPUZNGBgYKNW7avO6Af8d5++//47y5csrrDM1Nc30eTY2NoiOjlZYljGWzPY3Z84cdO7cWWmdmZkZhBDy80mdt2/fokyZMhptS0R5g4ksEeUJV1dX+cUzaclAeHg4PD09ASDTqaguXryIChUqAACio6Nx9+5d+WholSpVVD6natWqqFq1KsaNG4eePXsiMDAQnTp1wtmzZ9GhQwf07t0bQGqSc+/ePVSvXl3+XBMTE8hkMoX2vLy88Msvv8DZ2RlGRjn/2DQxMQEAhf2ULVsW5cuXx8OHD9GrV69stXvnzh1ERUVh8eLFcHR0BAD5hW5Z7TuzGDNuU6ZMGbx69Uoh+Uv/upUoUQL29va4ePEimjRpAgCQSqUICgqCl5cXgNTzwNTUFE+fPkXTpk01PjZPT0+EhoYqLHN1dcXFixcVlmV87OXlhbCwsEzPFRcXFzx9+hSvX79G2bJlAQBXrlxRue3NmzcVLswjovzH0gIiylVv3ryBj48PduzYgevXr+PRo0fYu3cvli5dig4dOgBI/Yn2s88+w+LFixEaGoq///4bM2bMUNne3LlzcfLkSdy8eRN+fn6wsbHJdHL9jx8/YuTIkThz5gyePHmCc+fO4cqVK/JEtUqVKjh+/DjOnz+P27dv4+uvv8arV68U2nB2dsalS5fw+PFjREVFISUlBSNGjMDbt2/Rs2dPXL58GQ8fPsSxY8cwYMAAtQmhKra2tjA3N5dfNBYTEwMgdTR50aJFWL16Ne7evYsbN24gMDAQK1as0KjdChUqwMTEBGvWrMHDhw9x6NAhhblhAcDJyQkSiQSHDx9GZGQk3r9/r7ItZ2dn/P3333jx4oV8doZmzZohMjISS5cuxYMHD7B27VocOXJE4XljxozB4sWLceDAAdy5cwfDhw9XmLPW0tISEydOxLhx47Bt2zY8ePAAwcHBWLt2bZYXtaXNQ5y+v0ePHo2jR49i6dKluHv3Lr7//nscPXpU4XmzZs3C9u3b4e/vj1u3buH27dvYs2eP/Hxr2bIlKleujH79+uH69es4d+6c/GKv9CO18fHxCAoKQqtWrTKNkYjyQb5W6BJRoZOQkCCmTJkivLy8RIkSJUSxYsVEtWrVxIwZM0R8fLx8u9DQUPHZZ58Jc3Nz4eHhIY4dO6byYq/ffvtNfPrpp8LExETUqVNHhISEZLrvxMRE0aNHD+Ho6ChMTExEuXLlxMiRI8XHjx+FEKkXi3Xo0EFYWFgIW1tbMWPGDNG3b1/5hUhCCBEWFiaPC4B49OiREEKIu3fvik6dOomSJUsKc3Nz4eLiIsaOHStSUlKEENpd7CWEEJs2bRKOjo7CwMBANG3aVL58586dwsPDQ5iYmIhSpUqJJk2aiP3792d6zBn3u2vXLuHs7CxMTU1F/fr1xaFDh5QuLJs7d66ws7MTEolE9OvXT2U7Fy5cEO7u7sLU1FSk/6pYv369cHR0FMWLFxd9+/YVCxYsULjYKzk5WYwZM0ZYWVmJkiVLivHjxyv1cUpKili9erWoVq2aMDY2FmXKlBG+vr7ir7/+yvQ4pVKpKF++vDh69KjC8i1btggHBwdhbm4u2rVrJ5YvX65wsZcQQhw9elQ0aNBAmJubCysrK1G3bl2xceNG+frbt2+Lhg0bChMTE+Hi4iJ+++03AUBhX7t27RLVqlXLND4iyh8SITQoMiIiIspn69atw6+//oo///xTp/s5d+4cGjVqhPv376Ny5coAUi8AGzt2LL766iud7puItMMaWSIi0gtDhgxBdHQ04uLicvU2tQcOHICFhQU++eQT3L9/H2PGjEHDhg3lSWxERAS6du2Knj175to+iSh3cESWiIiKtO3bt2PevHl49uwZbGxs0KJFC3z77bcoXbp0fodGRGowkSUiIiIivcRZC4iIiIhILzGRJSIiIiK9xESWiIiIiPQSE1kiIiIi0ktMZImIiIhILzGRJSIiIiK9xESWiIiIiPQSE1kiIiIi0ktMZImIiIhIL/0P93QtsmG+K3cAAAAASUVORK5CYII=",
"text/plain": [
""
]
@@ -936,24 +1068,46 @@
" \"\"\"Signed angle (deg) from the horizontal projection of a reference direction to that of a direction.\"\"\"\n",
" a = normalize(reference - np.sum(reference * u2, axis=-1, keepdims=True) * u2)\n",
" b = normalize(direction - np.sum(direction * u2, axis=-1, keepdims=True) * u2)\n",
- " return np.degrees(np.arctan2(np.sum(np.cross(a, b) * u2, axis=-1), np.sum(a * b, axis=-1)))\n",
+ " return np.degrees(\n",
+ " np.arctan2(np.sum(np.cross(a, b) * u2, axis=-1), np.sum(a * b, axis=-1))\n",
+ " )\n",
"\n",
"\n",
"normal2 = normal[i2]\n",
"yaw_earth_fixed = yaw(normal2, sc_vel[i2])\n",
"yaw_inertial = yaw(normal2, inertial_velocity(sc_pos[i2], sc_vel[i2]))\n",
"ascending = sc_vel[i2, 2] > 0\n",
- "out_of_plane = np.degrees(np.abs(np.arcsin(np.einsum(\"kjc,kc->kj\", los_for[i2], normal2))))\n",
+ "out_of_plane = np.degrees(\n",
+ " np.abs(np.arcsin(np.einsum(\"kjc,kc->kj\", los_for[i2], normal2)))\n",
+ ")\n",
"# tilt of the scan plane forward of nadir (positive forward), from the angle between the plane normal and the nadir at each field of regard\n",
- "tilt = -np.degrees(np.arcsin(np.sum(nadir * normal[:, np.newaxis], axis=-1))) # (scan, FOR)\n",
+ "tilt = -np.degrees(\n",
+ " np.arcsin(np.sum(nadir * normal[:, np.newaxis], axis=-1))\n",
+ ") # (scan, FOR)\n",
"scan_plane_tilt = float(np.median(tilt))\n",
"\n",
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
- "for mask, color, label in [(ascending, BLUE, \"ascending\"), (~ascending, AQUA, \"descending\")]:\n",
- " ax.scatter(sub_lat[mask], yaw_earth_fixed[mask], s=6, color=color, label=f\"vs. Earth-fixed velocity, {label}\")\n",
- "ax.scatter(sub_lat, yaw_inertial, s=6, color=ORANGE, label=\"vs. inertial velocity, both\")\n",
+ "for mask, color, label in [\n",
+ " (ascending, BLUE, \"ascending\"),\n",
+ " (~ascending, AQUA, \"descending\"),\n",
+ "]:\n",
+ " ax.scatter(\n",
+ " sub_lat[mask],\n",
+ " yaw_earth_fixed[mask],\n",
+ " s=6,\n",
+ " color=color,\n",
+ " label=f\"vs. Earth-fixed velocity, {label}\",\n",
+ " )\n",
+ "ax.scatter(\n",
+ " sub_lat, yaw_inertial, s=6, color=ORANGE, label=\"vs. inertial velocity, both\"\n",
+ ")\n",
"ax.axhline(0, color=GRAY, lw=0.8)\n",
- "ax.set(xlabel=\"Sub-satellite latitude (deg)\", ylabel=\"Scan plane yaw (deg)\", title=\"Orientation of the CrIS scan plane\", ylim=(-5, 5))\n",
+ "ax.set(\n",
+ " xlabel=\"Sub-satellite latitude (deg)\",\n",
+ " ylabel=\"Scan plane yaw (deg)\",\n",
+ " title=\"Orientation of the CrIS scan plane\",\n",
+ " ylim=(-5, 5),\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8, markerscale=3, loc=\"center\")\n",
"fig.tight_layout()\n",
"plt.show()\n",
@@ -972,14 +1126,14 @@
"id": "e6b6df40",
"metadata": {},
"source": [
- "Like ATMS, the scan plane faces the inertial velocity at all latitudes, to within a constant 0.17 deg, whereas the Earth-fixed velocity is rotated by up to about 4 deg, with opposite signs on ascending and descending passes. A `PointedInstrument` with `velocity_frame=VelocityFrame.INERTIAL` reproduces this orientation. The scan plane is also tilted 0.22 deg forward of nadir on both ascending and descending passes (about 3 km on the ground), which `PointedInstrument.pitch_angle` can reproduce.\n",
+ "Like ATMS, the scan plane faces the inertial velocity at all latitudes, to within a constant 0.17 deg, whereas the Earth-fixed velocity is rotated by up to about 4 deg, with opposite signs on ascending and descending passes. A satellite with an inertial velocity frame (`Attitude(velocity_frame=VelocityFrame.INERTIAL)`), whose instruments' views are rotated from its body, reproduces this orientation. The scan plane is also tilted 0.22 deg forward of nadir on both ascending and descending passes (about 3 km on the ground), which `PointedInstrument.pitch_angle` can reproduce.\n",
"\n",
"## Test 3: Geolocation\n",
"\n",
"TAT-C pixel positions from `collect_ground_pixels`, at the middle time of every twentieth scan, are compared with the reported FOV positions. Five configurations isolate the contributions of the along-track reference direction, the scan angles, the scan plane tilt, and scan timing:\n",
"\n",
"* **Nominal, Earth-fixed:** 3.333 deg FOR spacing with TAT-C's default velocity frame.\n",
- "* **Nominal, inertial:** the same with `velocity_frame=VelocityFrame.INERTIAL`.\n",
+ "* **Nominal, inertial:** the same on a satellite with `Attitude(velocity_frame=VelocityFrame.INERTIAL)`.\n",
"* **Fitted, inertial:** the FOR spacing, roll angle, and FOV pitch fitted in Test 2.\n",
"* **Fitted, inertial, tilted:** the same with the scan plane tilt as `pitch_angle`.\n",
"* **Fitted, inertial, tilted, sample times:** the same, but with each FOR projected at its own sample time rather than all at the scan's middle time. TAT-C does not do this; it is computed here (with `PointedInstrument.compute_projected_pixel_position`) to quantify the effect of scan timing.\n",
@@ -993,10 +1147,10 @@
"id": "853055c9",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:39.788820Z",
- "iopub.status.busy": "2026-10-15T18:43:39.788820Z",
- "iopub.status.idle": "2026-10-15T18:43:43.540486Z",
- "shell.execute_reply": "2026-10-15T18:43:43.540486Z"
+ "iopub.execute_input": "2026-10-25T13:54:44.752578Z",
+ "iopub.status.busy": "2026-10-25T13:54:44.752578Z",
+ "iopub.status.idle": "2026-10-25T13:54:50.505191Z",
+ "shell.execute_reply": "2026-10-25T13:54:50.505191Z"
}
},
"outputs": [
@@ -1033,38 +1187,38 @@
"
along
\n",
"
-2.83
\n",
"
59.21
\n",
- "
93.66
\n",
+ "
93.67
\n",
"
\n",
"
\n",
"
right
\n",
"
-1.73
\n",
"
4.25
\n",
- "
6.02
\n",
+ "
6.00
\n",
"
\n",
"
\n",
"
horizontal
\n",
"
12.42
\n",
"
59.33
\n",
- "
93.69
\n",
+ "
93.70
\n",
"
\n",
"
\n",
"
nominal, inertial
\n",
"
along
\n",
- "
-2.88
\n",
+ "
-2.89
\n",
"
21.22
\n",
"
22.95
\n",
"
\n",
"
\n",
"
right
\n",
- "
-1.77
\n",
+ "
-1.76
\n",
"
3.61
\n",
- "
4.90
\n",
+ "
4.91
\n",
"
\n",
"
\n",
"
horizontal
\n",
- "
10.13
\n",
+ "
10.12
\n",
"
21.51
\n",
- "
23.45
\n",
+ "
23.46
\n",
"
\n",
"
\n",
"
fitted, inertial
\n",
@@ -1088,34 +1242,34 @@
"
\n",
"
fitted, inertial, tilted
\n",
"
along
\n",
- "
0.40
\n",
- "
19.04
\n",
- "
19.59
\n",
+ "
0.39
\n",
+ "
19.05
\n",
+ "
19.58
\n",
"
\n",
"
\n",
"
right
\n",
"
0.01
\n",
- "
0.35
\n",
- "
0.70
\n",
+ "
0.36
\n",
+ "
0.72
\n",
"
\n",
"
\n",
"
horizontal
\n",
- "
10.00
\n",
- "
19.04
\n",
- "
19.59
\n",
+ "
9.99
\n",
+ "
19.05
\n",
+ "
19.58
\n",
"
\n",
"
\n",
"
fitted, inertial, tilted, sample times
\n",
"
along
\n",
- "
0.45
\n",
+ "
0.44
\n",
"
0.67
\n",
- "
0.72
\n",
+ "
0.71
\n",
"
\n",
"
\n",
"
right
\n",
"
0.01
\n",
- "
0.33
\n",
- "
0.65
\n",
+ "
0.35
\n",
+ "
0.66
\n",
"
\n",
"
\n",
"
horizontal
\n",
@@ -1129,20 +1283,20 @@
],
"text/plain": [
" median p95 |x| max |x|\n",
- "nominal, Earth-fixed along -2.83 59.21 93.66\n",
- " right -1.73 4.25 6.02\n",
- " horizontal 12.42 59.33 93.69\n",
- "nominal, inertial along -2.88 21.22 22.95\n",
- " right -1.77 3.61 4.90\n",
- " horizontal 10.13 21.51 23.45\n",
+ "nominal, Earth-fixed along -2.83 59.21 93.67\n",
+ " right -1.73 4.25 6.00\n",
+ " horizontal 12.42 59.33 93.70\n",
+ "nominal, inertial along -2.89 21.22 22.95\n",
+ " right -1.76 3.61 4.91\n",
+ " horizontal 10.12 21.51 23.46\n",
"fitted, inertial along -2.92 21.23 22.86\n",
" right -0.04 0.26 0.49\n",
" horizontal 9.96 21.23 22.86\n",
- "fitted, inertial, tilted along 0.40 19.04 19.59\n",
- " right 0.01 0.35 0.70\n",
- " horizontal 10.00 19.04 19.59\n",
- "fitted, inertial, tilted, sample times along 0.45 0.67 0.72\n",
- " right 0.01 0.33 0.65\n",
+ "fitted, inertial, tilted along 0.39 19.05 19.58\n",
+ " right 0.01 0.36 0.72\n",
+ " horizontal 9.99 19.05 19.58\n",
+ "fitted, inertial, tilted, sample times along 0.44 0.67 0.71\n",
+ " right 0.01 0.35 0.66\n",
" horizontal 0.48 0.70 0.74"
]
},
@@ -1180,15 +1334,15 @@
"
\n",
@@ -1664,15 +1869,15 @@
"rectangular, 128 s (53.36 deg along track) 80.827 \n",
"\n",
" TAT-C (10^6 km^2) IoU \\\n",
- "field of regard, 60 s 79.852 0.986 \n",
- "rectangular, 8 s (3.60 deg along track) 80.248 0.991 \n",
+ "field of regard, 60 s 79.853 0.986 \n",
+ "rectangular, 8 s (3.60 deg along track) 80.249 0.991 \n",
"rectangular, 32 s (14.32 deg along track) 80.323 0.991 \n",
"rectangular, 128 s (53.36 deg along track) 81.167 0.987 \n",
"\n",
" observed only (%) TAT-C only (%) \n",
"field of regard, 60 s 1.281 0.076 \n",
- "rectangular, 8 s (3.60 deg along track) 0.816 0.101 \n",
- "rectangular, 32 s (14.32 deg along track) 0.763 0.139 \n",
+ "rectangular, 8 s (3.60 deg along track) 0.815 0.101 \n",
+ "rectangular, 32 s (14.32 deg along track) 0.762 0.140 \n",
"rectangular, 128 s (53.36 deg along track) 0.440 0.857 "
]
},
@@ -1702,14 +1907,28 @@
" valid = (kk >= 0) & (kk < len(cells) - 1) & (jj >= 0) & (jj < N_FOR - 1)\n",
" kk, jj = np.clip(kk, 0, len(cells) - 2), np.clip(jj, 0, N_FOR - 2)\n",
" valid &= contiguous[k0 + kk]\n",
- " corners = [cells[kk, jj], cells[kk, jj + 1], cells[kk + 1, jj + 1], cells[kk + 1, jj]]\n",
- " signs = np.stack([np.sum(np.cross(a, b) * points, axis=-1) for a, b in zip(corners, corners[1:] + corners[:1])])\n",
- " inside |= valid & (np.all(signs >= 0, axis=0) | np.all(signs <= 0, axis=0))\n",
+ " corners = [\n",
+ " cells[kk, jj],\n",
+ " cells[kk, jj + 1],\n",
+ " cells[kk + 1, jj + 1],\n",
+ " cells[kk + 1, jj],\n",
+ " ]\n",
+ " signs = np.stack(\n",
+ " [\n",
+ " np.sum(np.cross(a, b) * points, axis=-1)\n",
+ " for a, b in zip(corners, corners[1:] + corners[:1])\n",
+ " ]\n",
+ " )\n",
+ " inside |= valid & (\n",
+ " np.all(signs >= 0, axis=0) | np.all(signs <= 0, axis=0)\n",
+ " )\n",
" return inside\n",
"\n",
"\n",
"STEP4, MARGIN4 = 0.1, 128 # deg, s\n",
- "lon_grid, lat_grid = np.meshgrid(np.arange(-180 + STEP4 / 2, 180, STEP4), np.arange(-90 + STEP4 / 2, 90, STEP4))\n",
+ "lon_grid, lat_grid = np.meshgrid(\n",
+ " np.arange(-180 + STEP4 / 2, 180, STEP4), np.arange(-90 + STEP4 / 2, 90, STEP4)\n",
+ ")\n",
"cell_area = np.cos(np.radians(lat_grid)) * (STEP4 * 111.32) ** 2 # km^2\n",
"grid_unit = up(lon_grid.ravel(), lat_grid.ravel())\n",
"orbit_start = datetime(2026, 10, 2, 12, tzinfo=timezone.utc)\n",
@@ -1717,22 +1936,36 @@
"scans4 = np.nonzero((t_mid >= orbit_start) & (t_mid < orbit_start + orbit_period))[0]\n",
"first, last = t_mid[scans4[0]].to_pydatetime(), t_mid[scans4[-1]].to_pydatetime()\n",
"# grid cells near fields of regard sampled away from the ends of the orbit\n",
- "distance, nearest = cKDTree(for_unit[scans4].reshape(-1, 3)).query(grid_unit, workers=-1)\n",
- "nearest_time = (t_mid[scans4] - t_mid[scans4[0]]).total_seconds().to_numpy()[nearest // N_FOR]\n",
- "compared = (distance < 2 * np.sin(300 / 6371 / 2)) & (nearest_time > MARGIN4) & (nearest_time < (last - first).total_seconds() - MARGIN4)\n",
+ "distance, nearest = cKDTree(for_unit[scans4].reshape(-1, 3)).query(\n",
+ " grid_unit, workers=-1\n",
+ ")\n",
+ "nearest_time = (\n",
+ " (t_mid[scans4] - t_mid[scans4[0]]).total_seconds().to_numpy()[nearest // N_FOR]\n",
+ ")\n",
+ "compared = (\n",
+ " (distance < 2 * np.sin(300 / 6371 / 2))\n",
+ " & (nearest_time > MARGIN4)\n",
+ " & (nearest_time < (last - first).total_seconds() - MARGIN4)\n",
+ ")\n",
"observed4 = np.zeros(len(grid_unit), dtype=bool)\n",
"observed4[compared] = observed_cells(grid_unit[compared], scans4)\n",
- "ground_speed = 2 * np.pi * 6371.0088e3 / orbit_period.total_seconds() # m/s, approximate\n",
+ "ground_speed = (\n",
+ " 2 * np.pi * 6371.0088e3 / orbit_period.total_seconds()\n",
+ ") # m/s, approximate\n",
"altitude = float(np.median(sub4.elevation.m))\n",
"\n",
"\n",
- "def swath_area_row(instrument, time_step):\n",
+ "def swath_area_row(instrument, time_step, attitude=None):\n",
" n = int((last - first).total_seconds() // time_step)\n",
" times = [first + timedelta(seconds=time_step * (i + 0.5)) for i in range(n)]\n",
- " geometry = compute_ground_track(noaa20.model_copy(update={\"instruments\": [instrument]}), times).geometry.iloc[0]\n",
+ " geometry = compute_ground_track(\n",
+ " on_noaa20(instrument, attitude), times\n",
+ " ).geometry.iloc[0]\n",
" prepare(geometry)\n",
" predicted = np.zeros(len(grid_unit), dtype=bool)\n",
- " predicted[compared] = contains_xy(geometry, lon_grid.ravel()[compared], lat_grid.ravel()[compared])\n",
+ " predicted[compared] = contains_xy(\n",
+ " geometry, lon_grid.ravel()[compared], lat_grid.ravel()[compared]\n",
+ " )\n",
" area = lambda mask: np.sum(mask * cell_area.ravel()) / 1e6\n",
" return predicted.reshape(lat_grid.shape), {\n",
" \"observed (10^6 km^2)\": area(observed4),\n",
@@ -1744,8 +1977,8 @@
"\n",
"\n",
"swath_rows, swath_maps = {}, {}\n",
- "swath_maps[\"field of regard, 60 s\"], swath_rows[\"field of regard, 60 s\"] = swath_area_row(\n",
- " Instrument(name=\"CrIS\", field_of_regard=2 * EDGE), 60\n",
+ "swath_maps[\"field of regard, 60 s\"], swath_rows[\"field of regard, 60 s\"] = (\n",
+ " swath_area_row(Instrument(name=\"CrIS\", field_of_regard=2 * EDGE), 60)\n",
")\n",
"for time_step in [SCAN_PERIOD, 32, 128]:\n",
" along_fov = np.degrees(2 * np.arctan(ground_speed * time_step / 2 / altitude))\n",
@@ -1757,9 +1990,9 @@
" cross_track_field_of_view=2 * EDGE,\n",
" along_track_field_of_view=along_fov,\n",
" is_rectangular=True,\n",
- " velocity_frame=VelocityFrame.INERTIAL,\n",
" ),\n",
" time_step,\n",
+ " INERTIAL,\n",
" )\n",
"observed4 = observed4.reshape(lat_grid.shape)\n",
"pd.DataFrame(swath_rows).T.round(3)"
@@ -1771,16 +2004,16 @@
"id": "8856aebf",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:43:56.704305Z",
- "iopub.status.busy": "2026-10-15T18:43:56.704305Z",
- "iopub.status.idle": "2026-10-15T18:44:02.789270Z",
- "shell.execute_reply": "2026-10-15T18:44:02.789270Z"
+ "iopub.execute_input": "2026-10-25T13:55:04.648989Z",
+ "iopub.status.busy": "2026-10-25T13:55:04.648989Z",
+ "iopub.status.idle": "2026-10-25T13:55:11.663760Z",
+ "shell.execute_reply": "2026-10-25T13:55:11.663760Z"
}
},
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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",
"text/plain": [
""
]
@@ -1790,15 +2023,24 @@
}
],
"source": [
- "fig, axes = plt.subplots(1, 2, figsize=(12, 4.2), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, axes = plt.subplots(\n",
+ " 1, 2, figsize=(12, 4.2), subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"for ax, name in zip(axes, [list(swath_maps)[0], list(swath_maps)[-1]]):\n",
" predicted = swath_maps[name]\n",
- " category = np.where(observed4 & predicted, 1, np.where(observed4, 2, np.where(predicted, 3, 0))).astype(float)\n",
+ " category = np.where(\n",
+ " observed4 & predicted, 1, np.where(observed4, 2, np.where(predicted, 3, 0))\n",
+ " ).astype(float)\n",
" category[~compared.reshape(lat_grid.shape)] = 0\n",
" ax.pcolormesh(\n",
- " lon_grid, lat_grid, np.ma.masked_equal(category, 0),\n",
- " cmap=plt.matplotlib.colors.ListedColormap([\"#d9d8d3\", ORANGE, BLUE]), vmin=0.5, vmax=3.5,\n",
- " transform=ccrs.PlateCarree(), shading=\"auto\",\n",
+ " lon_grid,\n",
+ " lat_grid,\n",
+ " np.ma.masked_equal(category, 0),\n",
+ " cmap=plt.matplotlib.colors.ListedColormap([\"#d9d8d3\", ORANGE, BLUE]),\n",
+ " vmin=0.5,\n",
+ " vmax=3.5,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " shading=\"auto\",\n",
" )\n",
" ax.coastlines(color=GRAY, linewidth=0.5)\n",
" ax.set_global()\n",
@@ -1831,10 +2073,10 @@
"id": "b3cfb72c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:44:02.791185Z",
- "iopub.status.busy": "2026-10-15T18:44:02.791185Z",
- "iopub.status.idle": "2026-10-15T18:44:10.430323Z",
- "shell.execute_reply": "2026-10-15T18:44:10.430323Z"
+ "iopub.execute_input": "2026-10-25T13:55:11.666765Z",
+ "iopub.status.busy": "2026-10-25T13:55:11.666765Z",
+ "iopub.status.idle": "2026-10-25T13:55:21.336698Z",
+ "shell.execute_reply": "2026-10-25T13:55:21.336192Z"
}
},
"outputs": [
@@ -1911,12 +2153,16 @@
"source": [
"# TAT-C's satellite zenith angle (from the satellite's elevation as seen from each pixel) at the fitted configuration\n",
"track5 = collect_ground_pixels(\n",
- " noaa20.model_copy(update={\"instruments\": [configs[\"fitted, inertial, tilted\"]]}), times3, sat_altaz=True\n",
+ " configs[\"fitted, inertial, tilted\"], times3, sat_altaz=True\n",
")\n",
- "zenith_model = per_for(90 - track5[\"sat_alt\"].to_numpy().reshape(len(i3), N_PIX, 3))[:, :, center] # (scan, FOR)\n",
+ "zenith_model = per_for(90 - track5[\"sat_alt\"].to_numpy().reshape(len(i3), N_PIX, 3))[\n",
+ " :, :, center\n",
+ "] # (scan, FOR)\n",
"zenith_reported = fov_zenith[i3][:, :, center]\n",
"range_reported = fov_range[i3][:, :, center]\n",
- "altitude5 = wgs84.geographic_position_of(orbit.get_orbit_track(times3)).elevation.m # of the sub-satellite point\n",
+ "altitude5 = wgs84.geographic_position_of(\n",
+ " orbit.get_orbit_track(times3)\n",
+ ").elevation.m # of the sub-satellite point\n",
"\n",
"\n",
"def slant_range(altitude, zenith, radius=EARTH_MEAN_RADIUS):\n",
@@ -1935,10 +2181,15 @@
"range_model = slant_range(altitude5[:, np.newaxis], zenith_model)\n",
"test5 = pd.DataFrame(\n",
" {\n",
- " \"zenith angle, TAT-C minus reported (deg)\": summarize(zenith_model - zenith_reported),\n",
- " \"slant range, TAT-C minus reported (km)\": summarize((range_model - range_reported) / 1e3),\n",
+ " \"zenith angle, TAT-C minus reported (deg)\": summarize(\n",
+ " zenith_model - zenith_reported\n",
+ " ),\n",
+ " \"slant range, TAT-C minus reported (km)\": summarize(\n",
+ " (range_model - range_reported) / 1e3\n",
+ " ),\n",
" \"equivalent diameter, TAT-C minus reported (km)\": summarize(\n",
- " footprint_size(range_model, zenith_model, FOV_DIAMETER)[2] - footprint_size(range_reported, zenith_reported, FOV_DIAMETER)[2]\n",
+ " footprint_size(range_model, zenith_model, FOV_DIAMETER)[2]\n",
+ " - footprint_size(range_reported, zenith_reported, FOV_DIAMETER)[2]\n",
" ),\n",
" }\n",
").T\n",
@@ -1951,10 +2202,10 @@
"id": "4ca6f3ea",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:44:10.430323Z",
- "iopub.status.busy": "2026-10-15T18:44:10.430323Z",
- "iopub.status.idle": "2026-10-15T18:44:10.445787Z",
- "shell.execute_reply": "2026-10-15T18:44:10.445787Z"
+ "iopub.execute_input": "2026-10-25T13:55:21.338699Z",
+ "iopub.status.busy": "2026-10-25T13:55:21.337699Z",
+ "iopub.status.idle": "2026-10-25T13:55:21.353277Z",
+ "shell.execute_reply": "2026-10-25T13:55:21.353277Z"
}
},
"outputs": [
@@ -2125,9 +2376,22 @@
],
"source": [
"# measured spacing (km) of the views of an array: the mean distance from the central view to its four nearest neighbors\n",
- "neighbors = [m for m in range(N_FOV) if abs(pixel_cross[m] - 1) + abs(pixel_along[m] - 1) == 1]\n",
- "view_spacing = np.mean([np.linalg.norm(fov_xyz[:, :, m] - fov_xyz[:, :, center], axis=-1) for m in neighbors], axis=0) / 1e3 # (scan, FOR)\n",
- "along_r, cross_r, equivalent_r = footprint_size(range_reported, zenith_reported, FOV_DIAMETER)\n",
+ "neighbors = [\n",
+ " m for m in range(N_FOV) if abs(pixel_cross[m] - 1) + abs(pixel_along[m] - 1) == 1\n",
+ "]\n",
+ "view_spacing = (\n",
+ " np.mean(\n",
+ " [\n",
+ " np.linalg.norm(fov_xyz[:, :, m] - fov_xyz[:, :, center], axis=-1)\n",
+ " for m in neighbors\n",
+ " ],\n",
+ " axis=0,\n",
+ " )\n",
+ " / 1e3\n",
+ ") # (scan, FOR)\n",
+ "along_r, cross_r, equivalent_r = footprint_size(\n",
+ " range_reported, zenith_reported, FOV_DIAMETER\n",
+ ")\n",
"by_for = lambda a: a.mean(axis=0) # mean over scans of each field of regard\n",
"rows = [0, 4, 9, 14, 15, 19, 24, 29]\n",
"table5 = pd.DataFrame(\n",
@@ -2151,16 +2415,16 @@
"id": "2391013a",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:44:10.447832Z",
- "iopub.status.busy": "2026-10-15T18:44:10.446796Z",
- "iopub.status.idle": "2026-10-15T18:44:10.644708Z",
- "shell.execute_reply": "2026-10-15T18:44:10.643381Z"
+ "iopub.execute_input": "2026-10-25T13:55:21.355791Z",
+ "iopub.status.busy": "2026-10-25T13:55:21.354786Z",
+ "iopub.status.idle": "2026-10-25T13:55:21.491876Z",
+ "shell.execute_reply": "2026-10-25T13:55:21.491876Z"
}
},
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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03MmJycb+35Daicuc2LtV5ekPSvRhuxDedeAyiLX/4YQwuwoikJCQoJJY9jZ2T31qsOjR4/44IMP2Lx5M56enty/f5/KlStTq1YtIiIimDRpEidPnqRgwYIMGDAgy/HfeustBg8eTHh4OB4eHuzevRsXFxf8/PxISkpi48aNODg4oNfradOmDatXr6ZDhw5pzvHbb79x8eJFDh06hFqtZvHixXz44YesX78egCNHjnD06FH0uiQ+GvQJc+bM4bPPPuOLL75g06ZNrFq1KsPcvvjiC5ycnDh79iz379+nUqVKdOzYMd1xxYoVY/v27Wg0GhITE6lZsyaNGzcmMDB13evTp0+zY8cO9Ho9xYoVIzY2lt27d3P37l3Kli1L3759sbW1pXPnzixevJhy5cqRkJBA9erVqV69OrNnz2bOnDkcPHgQBwcHAPr27UvdunWZN28eiqLQp08fZs6cabwqHBwczNatW7GyssrymAjxutDfvozhYThYabAqWyXT4y5duoCNjS1FihQ1u6u0uVbA3rx5k48//pi//voLG5vMOz/89w1TFOWpb+LkyZOZMGFCuu33I++SnBT34glngU6XQmTEnYx35vMEjS3EPOB+8F4oUiZHcnodPXUcRI540TFISEiggk9A9if0hDOng7Gzs8t0//btO7hy5QqNG//76ZBer+PI4QOcOXOWhg2CsFDpiYy4Q4cObVmxYjmREXd4cP8eimIwvu64+HiANO9DZORdHOztad68KbNn/8TAAf2YNetH3u7QnsiIOyQkJDLhiy85cuRvFAXu379PmdIlqVe3JvHxsSQkxBMZcYcVK5YRHByCv3/q/QMGvQELtQWREXeIj4+lfv266HVJ6HQp+Pp4c+Z0KJERd4iNiSI5OTHTsdm27S+++mqicX+zpm+SkBBnPO/j+JGR9xk3fgJnTp9FZaHizp277Nu7G683CpGUlECjRg2IiX4AQIkSxaldqzoP7odjbaXC2dmJkFMnMBgMnDlzmg4d3jLGj42J5fDhAxQt4mF8vxIT7AFYu2YN+/fvZ+rUKQAkJSWh16d+n6WkaGnTuhOPoiKz8J2QM+T/I/Mg4/CPw1tQAUpxP+4/epjhIYqisO2vrcTHx1G/fhDFihXLltDPMwbP02o21wrY48ePExERQeXKlY3b9Ho9e/fuZebMmVy4cAFIvRLr6elpPCYi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rhz/+9//XulWsc+S5QJWmIfKlSvz3XffAal/POzatStH4h46tJ8lR05zo0w90GmJXfIlij5nJq0LIYQQuSkl7Axxv00G4GzVd7lxLzLH1nv98ssv2bt3Lw4ODixduhQHBweTxjN3UsDmYT169KBbt24YDAZ69OjBzZumvxqaok1BURT2Km7E2BVAd+kk8SunmTyuEEIIkZsM0feJnTMCdFoUn7qExqVub9y4KQUKuJk09ubNm40XrX788UfKli1r0nh5gRSweZhKpeK7774jICCABw8e0KVLF5KSkkwas3adehQt+gYpOh27S76JTqUmac9KkvatMWlcIYQQIrcouhRi5n2K4VEEao9iuPaaQNduvahTt77J571eu3bNONe1f//+vPXWWyaNl1dkqYBVFIXr16/LcllmxNbWlqVLl+Li4sLx48cZPny4SeNZWFjQslU77O3teRCXwCG/tzGgIm7516RcOmnS2EIIIURuiP/9W3RXTqG3ccSp37dY2Drg7JyP6tVrmTRuYmIiXbp0ITo6mmrVqjFp0iSTxstLslzAli5dmlu3bpkqH/ECvLy8jH2Q58+fz6JFpl0dwMHBgVat2mFhYcHlmCT2l2mOwWAgZu5I9A/umjS2EEIIkZMS960had8aHlk7srZ4c67F5twSksOGDePUqVO4urqyaNEik8+zzUuyVMBaWFhQunRpYyMDYT4aNWpkXBduyJAhBAcHmzRe0Te8aN2mPRYWFlxJseJu0YoocVHEzB6GkixX6IUQQuR9KVdOEb/iGx5ZObDVqzGxSckcPnQgR5oVLF68mIULF6JSqViwYAGFCxc2ecy8JMtzYL/++muGDx/O6dOnTZGPeAnDhw+nWbNmJCcn895775n8D43SpcvSpu1bBDVojE+/Cagc8qO/dZHYRV/kyA+3EEIIYSr6qHvEzB3BIwsbthZtQKLOgJu7O2916GTy5atCQkIYMmQIAJ9//jlBQUEmjZcXZbmA7dKlC3///Tf+/v7Y2tri4uKS5pEVkydPpkqVKjg6OuLu7k7btm25cOFCmmN69OiBSqVK86hevXpW034tWFhYMG/ePEqUKMH169d5//330ev1Jo1ZqlQZAgOronbxwOmDr9Fa2pB4YieJf/xq0rhCCCGEqSgpycTOGUFUopatheuRqFjg5u5Op07vYWtrZ9LYjx49Mt6U3aRJ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",
"text/plain": [
""
]
@@ -2174,8 +2438,18 @@
"ax.plot(np.arange(N_FOR), by_for(along_r), color=BLUE, label=\"along-track size\")\n",
"ax.plot(np.arange(N_FOR), by_for(cross_r), color=ORANGE, label=\"cross-track size\")\n",
"ax.plot(np.arange(N_FOR), by_for(equivalent_r), color=INK, label=\"equivalent diameter\")\n",
- "ax.plot(np.arange(N_FOR), by_for(view_spacing), color=GRAY, ls=\"--\", label=\"spacing of views\")\n",
- "ax.set(xlabel=\"CrIS field of regard index (0 = first scanned)\", ylabel=\"Size or spacing (km)\", title=\"CrIS footprint size\")\n",
+ "ax.plot(\n",
+ " np.arange(N_FOR),\n",
+ " by_for(view_spacing),\n",
+ " color=GRAY,\n",
+ " ls=\"--\",\n",
+ " label=\"spacing of views\",\n",
+ ")\n",
+ "ax.set(\n",
+ " xlabel=\"CrIS field of regard index (0 = first scanned)\",\n",
+ " ylabel=\"Size or spacing (km)\",\n",
+ " title=\"CrIS footprint size\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -2205,10 +2479,10 @@
"id": "724c596c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-15T18:44:10.646692Z",
- "iopub.status.busy": "2026-10-15T18:44:10.646692Z",
- "iopub.status.idle": "2026-10-15T18:44:10.658820Z",
- "shell.execute_reply": "2026-10-15T18:44:10.658820Z"
+ "iopub.execute_input": "2026-10-25T13:55:21.495307Z",
+ "iopub.status.busy": "2026-10-25T13:55:21.494309Z",
+ "iopub.status.idle": "2026-10-25T13:55:21.501443Z",
+ "shell.execute_reply": "2026-10-25T13:55:21.501443Z"
}
},
"outputs": [
@@ -2224,7 +2498,7 @@
"field of regard, between outermost FOR centers (deg) 96.685708\n",
"footprint equivalent diameter at nadir (km) 14.10401\n",
"footprint equivalent diameter at the swath edge (km) 31.942358\n",
- "center geolocation error, 95th percentile (km) 0.696837\n",
+ "center geolocation error, 95th percentile (km) 0.697072\n",
"dtype: object"
]
},
@@ -2242,11 +2516,21 @@
" \"scan plane tilt, pitch angle (deg)\": scan_plane_tilt,\n",
" \"FOV pitch (deg)\": fov_pitch,\n",
" \"FOV diameter, published (deg)\": FOV_DIAMETER,\n",
- " \"field of regard, between outermost FOR centers (deg)\": measured.max() - measured.min(),\n",
- " \"footprint equivalent diameter at nadir (km)\": by_for(equivalent_r)[N_FOR // 2 - 1 : N_FOR // 2 + 1].mean(),\n",
- " \"footprint equivalent diameter at the swath edge (km)\": by_for(equivalent_r)[[0, -1]].mean(),\n",
+ " \"field of regard, between outermost FOR centers (deg)\": measured.max()\n",
+ " - measured.min(),\n",
+ " \"footprint equivalent diameter at nadir (km)\": by_for(equivalent_r)[\n",
+ " N_FOR // 2 - 1 : N_FOR // 2 + 1\n",
+ " ].mean(),\n",
+ " \"footprint equivalent diameter at the swath edge (km)\": by_for(equivalent_r)[\n",
+ " [0, -1]\n",
+ " ].mean(),\n",
" \"center geolocation error, 95th percentile (km)\": summarize(\n",
- " np.hypot(*[per_for(v)[:, :, center] for v in residuals3[\"fitted, inertial, tilted, sample times\"]])\n",
+ " np.hypot(\n",
+ " *[\n",
+ " per_for(v)[:, :, center]\n",
+ " for v in residuals3[\"fitted, inertial, tilted, sample times\"]\n",
+ " ]\n",
+ " )\n",
" ).loc[\"p95 |x|\"],\n",
" }\n",
").round(3)"
@@ -2269,7 +2553,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.16"
+ "version": "3.12.8"
}
},
"nbformat": 4,
diff --git a/docs/validation/ValidateImagerVIIRS.ipynb b/docs/validation/ValidateImagerVIIRS.ipynb
index 70fa81bd..60030667 100644
--- a/docs/validation/ValidateImagerVIIRS.ipynb
+++ b/docs/validation/ValidateImagerVIIRS.ipynb
@@ -9,7 +9,7 @@
"\n",
"This notebook validates TAT-C's representation of horizontal imagers against the [Visible Infrared Imaging Radiometer Suite (VIIRS)](https://www.star.nesdis.noaa.gov/jpss/VIIRS.php) aboard NOAA-20 (JPSS-1). VIIRS is a 22-band visible and infrared radiometer with a rotating telescope that scans perpendicular to the flight direction every 1.79 s, within 56.28 deg of nadir (a swath about 3,040 km wide). Each scan images 16 rows of moderate-resolution (M-band) detectors at once, about 750 m apart at nadir, so a scan covers a strip about 12 km long along track: about the distance NOAA-20's ground track advances in one scan period. Across track, the samples of each row are aggregated on board into 3,200 pixels, in three zones that keep the pixel size more uniform across the scan.\n",
"\n",
- "As described in the companion notebook, [Imager Validation: NOAA-20 ATMS](ValidateImagerATMS.ipynb), TAT-C represents a nadir-pointing imager as an `Instrument` with a field of regard or a `PointedInstrument` with cross-track and along-track fields of view, and does not model the scan mechanism: the along-track field of view stands in for the time the instrument takes to sweep the ground. VIIRS is a natural test of this convention, since its 16-detector array is designed to cover the ground traveled in one scan. The ATMS notebook found that NOAA-20 scans perpendicular to its *inertial* velocity and that `PointedInstrument.velocity_frame=VelocityFrame.INERTIAL` reproduces this. This notebook asks five questions:\n",
+ "As described in the companion notebook, [Imager Validation: NOAA-20 ATMS](ValidateImagerATMS.ipynb), TAT-C represents a nadir-pointing imager as an `Instrument` with a field of regard or a `PointedInstrument` with cross-track and along-track fields of view, and does not model the scan mechanism: the along-track field of view stands in for the time the instrument takes to sweep the ground. VIIRS is a natural test of this convention, since its 16-detector array is designed to cover the ground traveled in one scan. The ATMS notebook found that NOAA-20 scans perpendicular to its *inertial* velocity and that a satellite with an inertial velocity frame (`Attitude(velocity_frame=VelocityFrame.INERTIAL)`), whose instruments' views are rotated from its body, reproduces this. This notebook asks five questions:\n",
"\n",
"1. **Orbit.** Does TAT-C's propagation of the operational two-line element (TLE) set reproduce NOAA-20's position?\n",
"2. **Scan geometry.** What are VIIRS's scan angles and the angular extent of its detector array, and is its scan perpendicular to the inertial velocity like that of ATMS?\n",
@@ -39,10 +39,10 @@
"id": "49f40a34",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:19.249243Z",
- "iopub.status.busy": "2026-10-08T17:41:19.248243Z",
- "iopub.status.idle": "2026-10-08T17:41:21.522460Z",
- "shell.execute_reply": "2026-10-08T17:41:21.522460Z"
+ "iopub.execute_input": "2026-10-25T13:56:18.204395Z",
+ "iopub.status.busy": "2026-10-25T13:56:18.203395Z",
+ "iopub.status.idle": "2026-10-25T13:56:19.134412Z",
+ "shell.execute_reply": "2026-10-25T13:56:19.134412Z"
}
},
"outputs": [
@@ -95,7 +95,9 @@
" params[\"continuation-token\"] = token\n",
" listing = requests.get(BUCKET, params=params, timeout=60).text\n",
" keys += re.findall(r\"(.*?)\", listing)\n",
- " match = re.search(r\"(.*?)\", listing)\n",
+ " match = re.search(\n",
+ " r\"(.*?)\", listing\n",
+ " )\n",
" if match is None:\n",
" return keys\n",
" token = match.group(1)\n",
@@ -117,9 +119,16 @@
" \"\"\"Read-only file object that downloads blocks of a remote object with HTTP range requests on demand.\"\"\"\n",
"\n",
" def __init__(self, key, block_size=2**16):\n",
- " self.url, self.block_size, self.blocks, self.position = BUCKET + key, block_size, {}, 0\n",
+ " self.url, self.block_size, self.blocks, self.position = (\n",
+ " BUCKET + key,\n",
+ " block_size,\n",
+ " {},\n",
+ " 0,\n",
+ " )\n",
" self.session = requests.Session()\n",
- " self.size = int(self.session.head(self.url, timeout=60).headers[\"Content-Length\"])\n",
+ " self.size = int(\n",
+ " self.session.head(self.url, timeout=60).headers[\"Content-Length\"]\n",
+ " )\n",
"\n",
" def readable(self):\n",
" return True\n",
@@ -131,30 +140,48 @@
" return self.position\n",
"\n",
" def seek(self, offset, whence=io.SEEK_SET):\n",
- " self.position = {io.SEEK_SET: 0, io.SEEK_CUR: self.position, io.SEEK_END: self.size}[whence] + offset\n",
+ " self.position = {\n",
+ " io.SEEK_SET: 0,\n",
+ " io.SEEK_CUR: self.position,\n",
+ " io.SEEK_END: self.size,\n",
+ " }[whence] + offset\n",
" return self.position\n",
"\n",
" def fetch(self, start, end):\n",
" \"\"\"Download (block-aligned) bytes [start, end) into the cache.\"\"\"\n",
" for attempt in range(5):\n",
" try:\n",
- " response = self.session.get(self.url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=120)\n",
+ " response = self.session.get(\n",
+ " self.url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=120\n",
+ " )\n",
" response.raise_for_status()\n",
" break\n",
" except requests.RequestException:\n",
" if attempt == 4:\n",
" raise\n",
- " for i, block in enumerate(range(start // self.block_size, (end - 1) // self.block_size + 1)):\n",
- " self.blocks[block] = response.content[i * self.block_size : (i + 1) * self.block_size]\n",
+ " for i, block in enumerate(\n",
+ " range(start // self.block_size, (end - 1) // self.block_size + 1)\n",
+ " ):\n",
+ " self.blocks[block] = response.content[\n",
+ " i * self.block_size : (i + 1) * self.block_size\n",
+ " ]\n",
"\n",
" def readinto(self, buffer):\n",
" n = min(len(buffer), self.size - self.position)\n",
" if n <= 0:\n",
" return 0\n",
- " first, last = self.position // self.block_size, (self.position + n - 1) // self.block_size\n",
- " missing = [block for block in range(first, last + 1) if block not in self.blocks]\n",
+ " first, last = (\n",
+ " self.position // self.block_size,\n",
+ " (self.position + n - 1) // self.block_size,\n",
+ " )\n",
+ " missing = [\n",
+ " block for block in range(first, last + 1) if block not in self.blocks\n",
+ " ]\n",
" if missing:\n",
- " self.fetch(missing[0] * self.block_size, min((missing[-1] + 1) * self.block_size, self.size))\n",
+ " self.fetch(\n",
+ " missing[0] * self.block_size,\n",
+ " min((missing[-1] + 1) * self.block_size, self.size),\n",
+ " )\n",
" data = b\"\".join(self.blocks[block] for block in range(first, last + 1))\n",
" start = self.position - first * self.block_size\n",
" buffer[:n] = data[start : start + n]\n",
@@ -166,16 +193,24 @@
" \"\"\"Open a remote granule, prefetching the metadata at the start and end of the file.\"\"\"\n",
" remote = RemoteFile(key)\n",
" remote.fetch(0, remote.block_size)\n",
- " remote.fetch((remote.size - 2**19) // remote.block_size * remote.block_size, remote.size)\n",
+ " remote.fetch(\n",
+ " (remote.size - 2**19) // remote.block_size * remote.block_size, remote.size\n",
+ " )\n",
" return h5py.File(remote)\n",
"\n",
"\n",
"TLE_FILE = DATA_DIR / f\"n20_tle_{DAY:%Y%m%d}.txt\"\n",
"if not TLE_FILE.exists():\n",
" # the element set with an epoch at the start of the day\n",
- " key = next(k for k in list_keys(f\"TLE-AUX/{DAY:%Y/%m/%d}/\") if f\"Z_{DAY:%Y%m%d}000000Z_\" in k)\n",
+ " key = next(\n",
+ " k\n",
+ " for k in list_keys(f\"TLE-AUX/{DAY:%Y/%m/%d}/\")\n",
+ " if f\"Z_{DAY:%Y%m%d}000000Z_\" in k\n",
+ " )\n",
" with h5py.File(io.BytesIO(fetch(key))) as f:\n",
- " TLE_FILE.write_text(bytes(f[\"All_Data/TLE-AUX_All/Dataset_Array_0\"][:]).decode().strip() + \"\\n\")\n",
+ " TLE_FILE.write_text(\n",
+ " bytes(f[\"All_Data/TLE-AUX_All/Dataset_Array_0\"][:]).decode().strip() + \"\\n\"\n",
+ " )\n",
"tle = TLE_FILE.read_text().splitlines()\n",
"\n",
"GEO = \"All_Data/VIIRS-MOD-GEO-TC_All/\"\n",
@@ -184,7 +219,9 @@
"PIXELS_FILE = DATA_DIR / f\"viirs_gmtco_pixels_{DAY:%Y%m%d}.npz\"\n",
"N_SCANS, N_DETECTORS, N_SAMPLES = 48, 16, 3200\n",
"PIXEL_GRANULES = 10 # every tenth granule\n",
- "COLUMNS = np.unique(np.r_[np.arange(0, N_SAMPLES, 8), N_SAMPLES - 1]) # subsampled columns\n",
+ "COLUMNS = np.unique(\n",
+ " np.r_[np.arange(0, N_SAMPLES, 8), N_SAMPLES - 1]\n",
+ ") # subsampled columns\n",
"ROWS = np.array([0, 7, 8, 15]) # detectors kept for every scan\n",
"\n",
"if not (SCANS_FILE.exists() and PIXELS_FILE.exists()):\n",
@@ -197,12 +234,18 @@
" \"gring_lat\": granule.attrs[\"G-Ring_Latitude\"].ravel(),\n",
" \"gring_lon\": granule.attrs[\"G-Ring_Longitude\"].ravel(),\n",
" \"n_scans\": int(granule.attrs[\"N_Number_Of_Scans\"].ravel()[0]),\n",
- " **{field: f[GEO + field][:] for field in [\"StartTime\", \"MidTime\", \"SCPosition\", \"SCVelocity\"]},\n",
+ " **{\n",
+ " field: f[GEO + field][:]\n",
+ " for field in [\"StartTime\", \"MidTime\", \"SCPosition\", \"SCVelocity\"]\n",
+ " },\n",
" }\n",
"\n",
" def read_pixels(key):\n",
" with open_granule(key) as f:\n",
- " lat, lon, height = (f[GEO + field][:].reshape(N_SCANS, N_DETECTORS, N_SAMPLES) for field in [\"Latitude\", \"Longitude\", \"Height\"])\n",
+ " lat, lon, height = (\n",
+ " f[GEO + field][:].reshape(N_SCANS, N_DETECTORS, N_SAMPLES)\n",
+ " for field in [\"Latitude\", \"Longitude\", \"Height\"]\n",
+ " )\n",
" center = N_SCANS // 2\n",
" return {\n",
" # selected detectors of every scan, at subsampled columns\n",
@@ -218,7 +261,11 @@
" with concurrent.futures.ThreadPoolExecutor(16) as pool:\n",
" scans = list(pool.map(read_scans, keys))\n",
" pixels = list(pool.map(read_pixels, keys[::PIXEL_GRANULES]))\n",
- " np.savez_compressed(SCANS_FILE, keys=np.array(keys), **{field: np.stack([s[field] for s in scans]) for field in scans[0]})\n",
+ " np.savez_compressed(\n",
+ " SCANS_FILE,\n",
+ " keys=np.array(keys),\n",
+ " **{field: np.stack([s[field] for s in scans]) for field in scans[0]},\n",
+ " )\n",
" np.savez_compressed(\n",
" PIXELS_FILE,\n",
" granule=np.arange(len(keys))[::PIXEL_GRANULES],\n",
@@ -255,10 +302,10 @@
"id": "61503429",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:21.525466Z",
- "iopub.status.busy": "2026-10-08T17:41:21.524466Z",
- "iopub.status.idle": "2026-10-08T17:41:24.610803Z",
- "shell.execute_reply": "2026-10-08T17:41:24.609797Z"
+ "iopub.execute_input": "2026-10-25T13:56:19.136416Z",
+ "iopub.status.busy": "2026-10-25T13:56:19.136416Z",
+ "iopub.status.idle": "2026-10-25T13:56:20.785405Z",
+ "shell.execute_reply": "2026-10-25T13:56:20.784901Z"
}
},
"outputs": [
@@ -289,7 +336,14 @@
"from tatc.analysis import collect_observations\n",
"from tatc.constants import EARTH_MEAN_RADIUS, EARTH_ROTATION_RATE\n",
"from tatc.generation import generate_points_fibonacci_lattice\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, Instrument, Point, PointedInstrument, Satellite\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Instrument,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
"from tatc.utils import (\n",
" VelocityFrame,\n",
" ViewGeometry,\n",
@@ -307,16 +361,24 @@
"\n",
"\n",
"def iet_to_utc(iet):\n",
- " return IET_EPOCH + pd.to_timedelta(np.asarray(iet) - LEAP_SECONDS * 1_000_000, unit=\"us\")\n",
+ " return IET_EPOCH + pd.to_timedelta(\n",
+ " np.asarray(iet) - LEAP_SECONDS * 1_000_000, unit=\"us\"\n",
+ " )\n",
"\n",
"\n",
"# scans (granule, scan) of every granule, in time order\n",
"valid_scan = np.arange(N_SCANS)[np.newaxis, :] < viirs[\"n_scans\"][:, np.newaxis]\n",
"scan_mid = iet_to_utc(viirs[\"MidTime\"][valid_scan])\n",
- "scan_pos, scan_vel = viirs[\"SCPosition\"][valid_scan].astype(float), viirs[\"SCVelocity\"][valid_scan].astype(float)\n",
+ "scan_pos, scan_vel = viirs[\"SCPosition\"][valid_scan].astype(float), viirs[\"SCVelocity\"][\n",
+ " valid_scan\n",
+ "].astype(float)\n",
"scan_period = np.median(np.diff(viirs[\"StartTime\"][valid_scan])) / 1e6\n",
"\n",
- "noaa20 = Satellite(name=\"NOAA-20\", orbit=GeneralPerturbationsOrbit.from_tle(tle))\n",
+ "# not yaw-steered: the body (and its instruments' views) aligned with the inertial velocity\n",
+ "INERTIAL = Attitude(velocity_frame=VelocityFrame.INERTIAL)\n",
+ "noaa20 = Satellite(\n",
+ " name=\"NOAA-20\", orbit=GeneralPerturbationsOrbit.from_tle(tle), attitude=INERTIAL\n",
+ ")\n",
"orbit = noaa20.orbit.to_gp_orbit()\n",
"\n",
"TO_ECEF = Transformer.from_crs(\"EPSG:4979\", \"EPSG:4978\", always_xy=True)\n",
@@ -325,13 +387,17 @@
"\n",
"def ecef(lon, lat, height=0.0):\n",
" \"\"\"Earth-fixed position (m) of geodetic coordinates, stacked on the last axis.\"\"\"\n",
- " return np.stack(TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1)\n",
+ " return np.stack(\n",
+ " TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1\n",
+ " )\n",
"\n",
"\n",
"def up(lon, lat):\n",
" \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
" lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
+ " return np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def normalize(x):\n",
@@ -347,7 +413,9 @@
"\n",
"def view_tangents(position, velocity, target):\n",
" \"\"\"Along-track and cross-track (positive left) view angle tangents of targets in TAT-C's instrument frame.\"\"\"\n",
- " lon, lat, _ = TO_GEODETIC.transform(position[..., 0], position[..., 1], position[..., 2])\n",
+ " lon, lat, _ = TO_GEODETIC.transform(\n",
+ " position[..., 0], position[..., 1], position[..., 2]\n",
+ " )\n",
" n = -up(lon, lat)\n",
" v = normalize(velocity)\n",
" c = np.cross(v, n)\n",
@@ -360,13 +428,25 @@
" \"\"\"Summary statistics of a residual sample.\"\"\"\n",
" x = np.asarray(x, dtype=float)\n",
" x = x[np.isfinite(x)]\n",
- " return pd.Series({\"n\": x.size, \"median\": np.median(x), \"p95 |x|\": np.percentile(np.abs(x), 95), \"max |x|\": np.abs(x).max()})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": x.size,\n",
+ " \"median\": np.median(x),\n",
+ " \"p95 |x|\": np.percentile(np.abs(x), 95),\n",
+ " \"max |x|\": np.abs(x).max(),\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"def binned(x, y, edges, q=(5, 50, 95)):\n",
" \"\"\"Percentiles of y in bins of x.\"\"\"\n",
" i = np.digitize(x, edges) - 1\n",
- " return np.array([np.percentile(y[i == k], q) if np.any(i == k) else [np.nan] * len(q) for k in range(len(edges) - 1)])\n",
+ " return np.array(\n",
+ " [\n",
+ " np.percentile(y[i == k], q) if np.any(i == k) else [np.nan] * len(q)\n",
+ " for k in range(len(edges) - 1)\n",
+ " ]\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
@@ -379,7 +459,14 @@
" \"grid.linewidth\": 0.6,\n",
" }\n",
")\n",
- "pd.Series({\"scans\": len(scan_mid), \"first scan (UTC)\": scan_mid[0], \"last scan (UTC)\": scan_mid[-1], \"scan period (s)\": scan_period})"
+ "pd.Series(\n",
+ " {\n",
+ " \"scans\": len(scan_mid),\n",
+ " \"first scan (UTC)\": scan_mid[0],\n",
+ " \"last scan (UTC)\": scan_mid[-1],\n",
+ " \"scan period (s)\": scan_period,\n",
+ " }\n",
+ ")"
]
},
{
@@ -398,10 +485,10 @@
"id": "a43b7848",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:24.612802Z",
- "iopub.status.busy": "2026-10-08T17:41:24.611803Z",
- "iopub.status.idle": "2026-10-08T17:41:24.683187Z",
- "shell.execute_reply": "2026-10-08T17:41:24.682681Z"
+ "iopub.execute_input": "2026-10-25T13:56:20.787407Z",
+ "iopub.status.busy": "2026-10-25T13:56:20.787407Z",
+ "iopub.status.idle": "2026-10-25T13:56:20.832378Z",
+ "shell.execute_reply": "2026-10-25T13:56:20.832378Z"
}
},
"outputs": [
@@ -483,13 +570,19 @@
"p1, v1 = orbit.get_orbit_track(list(scan_mid[i1])).frame_xyz_and_velocity(itrs)\n",
"offset1 = np.array(p1.m).T - scan_pos[i1]\n",
"radial1 = normalize(scan_pos[i1])\n",
- "along1 = normalize(scan_vel[i1] - np.sum(scan_vel[i1] * radial1, axis=-1, keepdims=True) * radial1)\n",
+ "along1 = normalize(\n",
+ " scan_vel[i1] - np.sum(scan_vel[i1] * radial1, axis=-1, keepdims=True) * radial1\n",
+ ")\n",
"pd.DataFrame(\n",
" {\n",
" \"along-track (km)\": summarize(np.sum(offset1 * along1, axis=-1) / 1e3),\n",
- " \"cross-track, right (km)\": summarize(np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3),\n",
+ " \"cross-track, right (km)\": summarize(\n",
+ " np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3\n",
+ " ),\n",
" \"radial (km)\": summarize(np.sum(offset1 * radial1, axis=-1) / 1e3),\n",
- " \"velocity (m/s)\": summarize(np.linalg.norm(np.array(v1.m_per_s).T - scan_vel[i1], axis=-1)),\n",
+ " \"velocity (m/s)\": summarize(\n",
+ " np.linalg.norm(np.array(v1.m_per_s).T - scan_vel[i1], axis=-1)\n",
+ " ),\n",
" }\n",
").T.round(3)"
]
@@ -516,10 +609,10 @@
"id": "3a8f939c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:24.685193Z",
- "iopub.status.busy": "2026-10-08T17:41:24.685193Z",
- "iopub.status.idle": "2026-10-08T17:41:24.911936Z",
- "shell.execute_reply": "2026-10-08T17:41:24.911936Z"
+ "iopub.execute_input": "2026-10-25T13:56:20.834383Z",
+ "iopub.status.busy": "2026-10-25T13:56:20.834383Z",
+ "iopub.status.idle": "2026-10-25T13:56:21.002905Z",
+ "shell.execute_reply": "2026-10-25T13:56:21.002905Z"
}
},
"outputs": [
@@ -543,8 +636,14 @@
"source": [
"granules = viirs_pixels[\"granule\"]\n",
"center = N_SCANS // 2\n",
- "full_xyz = ecef(viirs_pixels[\"lon_full\"], viirs_pixels[\"lat_full\"], viirs_pixels[\"height_full\"]).mean(axis=1) # (granule, sample, 3)\n",
- "full_ok = np.all(np.abs(viirs_pixels[\"lat_full\"]) <= 90, axis=(1, 2)) & (center < viirs[\"n_scans\"][granules])\n",
+ "full_xyz = ecef(\n",
+ " viirs_pixels[\"lon_full\"], viirs_pixels[\"lat_full\"], viirs_pixels[\"height_full\"]\n",
+ ").mean(\n",
+ " axis=1\n",
+ ") # (granule, sample, 3)\n",
+ "full_ok = np.all(np.abs(viirs_pixels[\"lat_full\"]) <= 90, axis=(1, 2)) & (\n",
+ " center < viirs[\"n_scans\"][granules]\n",
+ ")\n",
"pos_c = viirs[\"SCPosition\"][granules, center].astype(float)\n",
"vel_c = inertial_velocity(pos_c, viirs[\"SCVelocity\"][granules, center].astype(float))\n",
"_, cross_full = view_tangents(pos_c[:, np.newaxis], vel_c[:, np.newaxis], full_xyz)\n",
@@ -558,10 +657,17 @@
" {\n",
" \"first sample, measured (deg)\": measured_angle[0],\n",
" \"last sample, measured (deg)\": measured_angle[-1],\n",
- " \"field of regard, measured (deg)\": np.abs(measured_angle[0] - measured_angle[-1]),\n",
+ " \"field of regard, measured (deg)\": np.abs(\n",
+ " measured_angle[0] - measured_angle[-1]\n",
+ " ),\n",
" \"field of regard, nominal (deg)\": 2 * EDGE,\n",
- " \"granule-to-granule std. dev., median (deg)\": np.median(np.std(sample_angle, axis=0)),\n",
- " \"uniform 3,200-pixel grid, max |error| (deg)\": np.abs(measured_angle - np.linspace(measured_angle[0], measured_angle[-1], N_SAMPLES)).max(),\n",
+ " \"granule-to-granule std. dev., median (deg)\": np.median(\n",
+ " np.std(sample_angle, axis=0)\n",
+ " ),\n",
+ " \"uniform 3,200-pixel grid, max |error| (deg)\": np.abs(\n",
+ " measured_angle\n",
+ " - np.linspace(measured_angle[0], measured_angle[-1], N_SAMPLES)\n",
+ " ).max(),\n",
" }\n",
").round(4)"
]
@@ -572,10 +678,10 @@
"id": "dad2115e",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:24.914942Z",
- "iopub.status.busy": "2026-10-08T17:41:24.913943Z",
- "iopub.status.idle": "2026-10-08T17:41:25.273124Z",
- "shell.execute_reply": "2026-10-08T17:41:25.272117Z"
+ "iopub.execute_input": "2026-10-25T13:56:21.004910Z",
+ "iopub.status.busy": "2026-10-25T13:56:21.004910Z",
+ "iopub.status.idle": "2026-10-25T13:56:21.273350Z",
+ "shell.execute_reply": "2026-10-25T13:56:21.273350Z"
}
},
"outputs": [
@@ -685,17 +791,40 @@
],
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(11, 3.6))\n",
- "axes[0].plot(np.arange(N_SAMPLES), measured_angle, color=BLUE, label=\"measured (median)\")\n",
- "axes[0].plot(np.arange(N_SAMPLES), np.linspace(measured_angle[0], measured_angle[-1], N_SAMPLES), color=ORANGE, ls=\"--\", label=\"uniform 3,200-pixel grid\")\n",
- "axes[0].set(xlabel=\"Sample index\", ylabel=\"Scan angle (deg, positive left)\", title=\"VIIRS M-band scan angles\")\n",
+ "axes[0].plot(\n",
+ " np.arange(N_SAMPLES), measured_angle, color=BLUE, label=\"measured (median)\"\n",
+ ")\n",
+ "axes[0].plot(\n",
+ " np.arange(N_SAMPLES),\n",
+ " np.linspace(measured_angle[0], measured_angle[-1], N_SAMPLES),\n",
+ " color=ORANGE,\n",
+ " ls=\"--\",\n",
+ " label=\"uniform 3,200-pixel grid\",\n",
+ ")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Sample index\",\n",
+ " ylabel=\"Scan angle (deg, positive left)\",\n",
+ " title=\"VIIRS M-band scan angles\",\n",
+ ")\n",
"axes[1].plot(np.arange(N_SAMPLES - 1) + 0.5, spacing * 1e3, color=BLUE)\n",
- "axes[1].set(xlabel=\"Sample index\", ylabel=\"Sample spacing (mdeg)\", title=\"Sample spacing (aggregation zones)\", ylim=(0, None))\n",
+ "axes[1].set(\n",
+ " xlabel=\"Sample index\",\n",
+ " ylabel=\"Sample spacing (mdeg)\",\n",
+ " title=\"Sample spacing (aggregation zones)\",\n",
+ " ylim=(0, None),\n",
+ ")\n",
"axes[0].legend(frameon=False)\n",
"fig.tight_layout()\n",
"plt.show()\n",
"pd.DataFrame(\n",
" [\n",
- " {\"first sample\": a, \"last sample\": b, \"samples aggregated\": aggregation[a], \"spacing (mdeg)\": 1e3 * np.median(spacing[a:b]), \"scan angles (deg)\": f\"{measured_angle[a]:.2f} to {measured_angle[b]:.2f}\"}\n",
+ " {\n",
+ " \"first sample\": a,\n",
+ " \"last sample\": b,\n",
+ " \"samples aggregated\": aggregation[a],\n",
+ " \"spacing (mdeg)\": 1e3 * np.median(spacing[a:b]),\n",
+ " \"scan angles (deg)\": f\"{measured_angle[a]:.2f} to {measured_angle[b]:.2f}\",\n",
+ " }\n",
" for a, b in zip(zones[:-1], zones[1:])\n",
" ]\n",
").round(2)"
@@ -721,10 +850,10 @@
"id": "65806c1b",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:25.275425Z",
- "iopub.status.busy": "2026-10-08T17:41:25.275124Z",
- "iopub.status.idle": "2026-10-08T17:41:29.986792Z",
- "shell.execute_reply": "2026-10-08T17:41:29.986792Z"
+ "iopub.execute_input": "2026-10-25T13:56:21.275354Z",
+ "iopub.status.busy": "2026-10-25T13:56:21.275354Z",
+ "iopub.status.idle": "2026-10-25T13:56:24.650515Z",
+ "shell.execute_reply": "2026-10-25T13:56:24.649510Z"
}
},
"outputs": [
@@ -745,23 +874,45 @@
}
],
"source": [
- "px_ok = np.all(np.abs(viirs_pixels[\"lat\"]) <= 90, axis=(2, 3)) & (np.arange(N_SCANS)[np.newaxis, :] < viirs[\"n_scans\"][granules, np.newaxis])\n",
+ "px_ok = np.all(np.abs(viirs_pixels[\"lat\"]) <= 90, axis=(2, 3)) & (\n",
+ " np.arange(N_SCANS)[np.newaxis, :] < viirs[\"n_scans\"][granules, np.newaxis]\n",
+ ")\n",
"pos_p = viirs[\"SCPosition\"][granules].astype(float)[px_ok]\n",
"vel_p = inertial_velocity(pos_p, viirs[\"SCVelocity\"][granules].astype(float)[px_ok])\n",
- "px_xyz = ecef(viirs_pixels[\"lon\"], viirs_pixels[\"lat\"], viirs_pixels[\"height\"])[px_ok] # (scan, detector, column, 3)\n",
- "along_t, cross_t = view_tangents(pos_p[:, np.newaxis, np.newaxis], vel_p[:, np.newaxis, np.newaxis], px_xyz)\n",
- "scan_angle_p = np.degrees(np.arctan((cross_t[:, 1] + cross_t[:, 2]) / 2)) # center detectors\n",
+ "px_xyz = ecef(viirs_pixels[\"lon\"], viirs_pixels[\"lat\"], viirs_pixels[\"height\"])[\n",
+ " px_ok\n",
+ "] # (scan, detector, column, 3)\n",
+ "along_t, cross_t = view_tangents(\n",
+ " pos_p[:, np.newaxis, np.newaxis], vel_p[:, np.newaxis, np.newaxis], px_xyz\n",
+ ")\n",
+ "scan_angle_p = np.degrees(\n",
+ " np.arctan((cross_t[:, 1] + cross_t[:, 2]) / 2)\n",
+ ") # center detectors\n",
"# angle between the lines of sight of detectors 0 and 15, scaled to the full array\n",
"los = normalize(px_xyz - pos_p[:, np.newaxis, np.newaxis])\n",
- "array_angle = 16 / 15 * np.degrees(np.arccos(np.clip(np.sum(los[:, 0] * los[:, 3], axis=-1), -1, 1)))\n",
+ "array_angle = (\n",
+ " 16\n",
+ " / 15\n",
+ " * np.degrees(np.arccos(np.clip(np.sum(los[:, 0] * los[:, 3], axis=-1), -1, 1)))\n",
+ ")\n",
"nadir = np.abs(scan_angle_p) < 5\n",
- "ground_speed = np.median(np.linalg.norm(np.diff(ecef(*TO_GEODETIC.transform(*scan_pos[:2000].T)[:2]), axis=0), axis=-1)) / scan_period\n",
+ "ground_speed = (\n",
+ " np.median(\n",
+ " np.linalg.norm(\n",
+ " np.diff(ecef(*TO_GEODETIC.transform(*scan_pos[:2000].T)[:2]), axis=0),\n",
+ " axis=-1,\n",
+ " )\n",
+ " )\n",
+ " / scan_period\n",
+ ")\n",
"altitude = np.median(TO_GEODETIC.transform(*scan_pos[::100].T)[2])\n",
"tailored = np.degrees(2 * np.arctan(ground_speed * scan_period / 2 / altitude))\n",
"pd.Series(\n",
" {\n",
" \"detector array, near nadir (deg)\": np.median(array_angle[nadir]),\n",
- " \"detector array, |scan angle| > 50 deg (deg)\": np.median(array_angle[np.abs(scan_angle_p) > 50]),\n",
+ " \"detector array, |scan angle| > 50 deg (deg)\": np.median(\n",
+ " array_angle[np.abs(scan_angle_p) > 50]\n",
+ " ),\n",
" \"detector spacing, near nadir (mdeg)\": 1e3 * np.median(array_angle[nadir]) / 16,\n",
" \"ground track advance per scan (km)\": ground_speed * scan_period / 1e3,\n",
" \"along-track field of view tailored to one scan (deg)\": tailored,\n",
@@ -787,10 +938,10 @@
"id": "5ca76d6d",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:29.989800Z",
- "iopub.status.busy": "2026-10-08T17:41:29.988800Z",
- "iopub.status.idle": "2026-10-08T17:41:30.984707Z",
- "shell.execute_reply": "2026-10-08T17:41:30.984707Z"
+ "iopub.execute_input": "2026-10-25T13:56:24.652516Z",
+ "iopub.status.busy": "2026-10-25T13:56:24.652516Z",
+ "iopub.status.idle": "2026-10-25T13:56:25.502569Z",
+ "shell.execute_reply": "2026-10-25T13:56:25.502059Z"
}
},
"outputs": [
@@ -873,14 +1024,18 @@
" \"\"\"Signed angle (deg) from the horizontal projection of a reference direction to that of a direction.\"\"\"\n",
" a = normalize(reference - np.sum(reference * u2, axis=-1, keepdims=True) * u2)\n",
" b = normalize(direction - np.sum(direction * u2, axis=-1, keepdims=True) * u2)\n",
- " return np.degrees(np.arctan2(np.sum(np.cross(a, b) * u2, axis=-1), np.sum(a * b, axis=-1)))\n",
+ " return np.degrees(\n",
+ " np.arctan2(np.sum(np.cross(a, b) * u2, axis=-1), np.sum(a * b, axis=-1))\n",
+ " )\n",
"\n",
"\n",
"pd.DataFrame(\n",
" {\n",
" \"yaw vs. Earth-fixed velocity (deg)\": summarize(yaw(normal, vel_e)),\n",
" \"yaw vs. inertial velocity (deg)\": summarize(yaw(normal, vel_p[i2])),\n",
- " \"line of sight out of plane (deg)\": summarize(np.degrees(np.abs(np.arcsin(np.einsum(\"kjc,kc->kj\", center_los, normal))))),\n",
+ " \"line of sight out of plane (deg)\": summarize(\n",
+ " np.degrees(np.abs(np.arcsin(np.einsum(\"kjc,kc->kj\", center_los, normal))))\n",
+ " ),\n",
" }\n",
").T.round(3)"
]
@@ -905,10 +1060,10 @@
"id": "18c7a1f3",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:30.987228Z",
- "iopub.status.busy": "2026-10-08T17:41:30.987228Z",
- "iopub.status.idle": "2026-10-08T17:41:32.155350Z",
- "shell.execute_reply": "2026-10-08T17:41:32.155350Z"
+ "iopub.execute_input": "2026-10-25T13:56:25.504576Z",
+ "iopub.status.busy": "2026-10-25T13:56:25.504576Z",
+ "iopub.status.idle": "2026-10-25T13:56:26.280304Z",
+ "shell.execute_reply": "2026-10-25T13:56:26.280304Z"
}
},
"outputs": [
@@ -1008,27 +1163,45 @@
" cross_track_field_of_view=2 * EDGE,\n",
" along_track_field_of_view=tailored,\n",
" is_rectangular=True,\n",
- " velocity_frame=VelocityFrame.INERTIAL,\n",
")\n",
"viirs_scan_view = viirs_view.model_copy(update={\"view_geometry\": ViewGeometry.SCAN})\n",
"# observed length and advance (km)\n",
"length = 16 / 15 * np.linalg.norm(px_xyz[:, 0] - px_xyz[:, 3], axis=-1) / 1e3\n",
"scan_center = (px_xyz[:, 1] + px_xyz[:, 2]) / 2\n",
"scan_index = np.flatnonzero(px_ok) # granule * N_SCANS + scan\n",
- "consecutive = np.nonzero((np.diff(scan_index) == 1) & (np.diff(scan_index // N_SCANS) == 0))[0] # scan pairs within a granule\n",
- "advance = np.linalg.norm(scan_center[consecutive + 1] - scan_center[consecutive], axis=-1) / 1e3\n",
+ "consecutive = np.nonzero(\n",
+ " (np.diff(scan_index) == 1) & (np.diff(scan_index // N_SCANS) == 0)\n",
+ ")[\n",
+ " 0\n",
+ "] # scan pairs within a granule\n",
+ "advance = (\n",
+ " np.linalg.norm(scan_center[consecutive + 1] - scan_center[consecutive], axis=-1)\n",
+ " / 1e3\n",
+ ")\n",
"\n",
"# TAT-C lengths and advances at a sample of scans and scan angles\n",
"i3 = np.arange(0, len(pos_p), 25)\n",
"scan_times3 = iet_to_utc(viirs[\"MidTime\"][granules][px_ok][i3])\n",
"angles3 = np.arange(-56, 57, 4.0)\n",
"track3 = orbit.get_orbit_track(list(scan_times3))\n",
- "track3_next = orbit.get_orbit_track([t + timedelta(seconds=scan_period) for t in scan_times3])\n",
- "tatc_length, angular_length, tatc_advance = (np.zeros((len(i3), len(angles3))) for _ in range(3))\n",
+ "track3_next = orbit.get_orbit_track(\n",
+ " [t + timedelta(seconds=scan_period) for t in scan_times3]\n",
+ ")\n",
+ "tatc_length, angular_length, tatc_advance = (\n",
+ " np.zeros((len(i3), len(angles3))) for _ in range(3)\n",
+ ")\n",
"\n",
"\n",
"def distance(a, b):\n",
- " return GEOD.inv(a.longitude.degrees, a.latitude.degrees, b.longitude.degrees, b.latitude.degrees)[2] / 1e3\n",
+ " return (\n",
+ " GEOD.inv(\n",
+ " a.longitude.degrees,\n",
+ " a.latitude.degrees,\n",
+ " b.longitude.degrees,\n",
+ " b.latitude.degrees,\n",
+ " )[2]\n",
+ " / 1e3\n",
+ " )\n",
"\n",
"\n",
"half = viirs_view.along_track_field_of_view / 2\n",
@@ -1037,12 +1210,20 @@
" # rectangular boundary points at the cross-track position of the scan angle (clock angles from the left cross-track axis)\n",
" clock = np.degrees(np.arctan2(tan_half, np.tan(np.radians(angle))))\n",
" edge = lambda c: compute_projected_ray_position(\n",
- " track3, viirs_view.cross_track_field_of_view, viirs_view.along_track_field_of_view, 0, 0, True, c,\n",
+ " track3,\n",
+ " viirs_view.cross_track_field_of_view,\n",
+ " viirs_view.along_track_field_of_view,\n",
+ " 0,\n",
+ " 0,\n",
+ " True,\n",
+ " c,\n",
" velocity_frame=VelocityFrame.INERTIAL,\n",
" )\n",
" tatc_length[:, k] = distance(edge(clock), edge(360 - clock))\n",
" # scan geometry: rays at the along-track edges of the view, rolled to the scan angle\n",
- " ray = lambda track, pitch: compute_projected_ray_position(track, 0, 0, angle, pitch, velocity_frame=viirs_scan_view.velocity_frame)\n",
+ " ray = lambda track, pitch: compute_projected_ray_position(\n",
+ " track, 0, 0, angle, pitch, velocity_frame=VelocityFrame.INERTIAL\n",
+ " )\n",
" angular_length[:, k] = distance(ray(track3, half), ray(track3, -half))\n",
" tatc_advance[:, k] = distance(ray(track3, 0), ray(track3_next, 0))\n",
"\n",
@@ -1054,16 +1235,57 @@
"axes[0].fill_between(mid3, q_len[:, 0], q_len[:, 2], color=INK, alpha=0.12, lw=0)\n",
"axes[0].plot(mid3, q_len[:, 1], color=INK, marker=\"o\", ms=3, label=\"VIIRS scan length\")\n",
"axes[0].plot(mid3, q_adv[:, 1], color=INK, ls=\":\", label=\"VIIRS scan advance\")\n",
- "axes[0].plot(angles3, np.median(tatc_length, axis=0), color=BLUE, label=\"TAT-C frame view length\")\n",
- "axes[0].plot(angles3, np.median(angular_length, axis=0), color=ORANGE, ls=\"--\", label=\"TAT-C scan view length\")\n",
- "axes[0].plot(angles3, np.median(tatc_advance, axis=0), color=BLUE, ls=\":\", label=\"TAT-C advance per scan period\")\n",
- "axes[0].set(xlabel=\"Scan angle (deg, positive left)\", ylabel=\"Along-track distance (km)\", title=\"Along-track length of one scan\", ylim=(0, None))\n",
+ "axes[0].plot(\n",
+ " angles3, np.median(tatc_length, axis=0), color=BLUE, label=\"TAT-C frame view length\"\n",
+ ")\n",
+ "axes[0].plot(\n",
+ " angles3,\n",
+ " np.median(angular_length, axis=0),\n",
+ " color=ORANGE,\n",
+ " ls=\"--\",\n",
+ " label=\"TAT-C scan view length\",\n",
+ ")\n",
+ "axes[0].plot(\n",
+ " angles3,\n",
+ " np.median(tatc_advance, axis=0),\n",
+ " color=BLUE,\n",
+ " ls=\":\",\n",
+ " label=\"TAT-C advance per scan period\",\n",
+ ")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Scan angle (deg, positive left)\",\n",
+ " ylabel=\"Along-track distance (km)\",\n",
+ " title=\"Along-track length of one scan\",\n",
+ " ylim=(0, None),\n",
+ ")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
- "axes[1].plot(mid3, 100 * (1 - q_adv[:, 1] / q_len[:, 1]), color=INK, marker=\"o\", ms=3, label=\"VIIRS\")\n",
- "axes[1].plot(angles3, 100 * (1 - np.median(tatc_advance, axis=0) / np.median(tatc_length, axis=0)), color=BLUE, label=\"TAT-C frame view\")\n",
- "axes[1].plot(angles3, 100 * (1 - np.median(tatc_advance, axis=0) / np.median(angular_length, axis=0)), color=ORANGE, ls=\"--\", label=\"TAT-C scan view\")\n",
+ "axes[1].plot(\n",
+ " mid3,\n",
+ " 100 * (1 - q_adv[:, 1] / q_len[:, 1]),\n",
+ " color=INK,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " label=\"VIIRS\",\n",
+ ")\n",
+ "axes[1].plot(\n",
+ " angles3,\n",
+ " 100 * (1 - np.median(tatc_advance, axis=0) / np.median(tatc_length, axis=0)),\n",
+ " color=BLUE,\n",
+ " label=\"TAT-C frame view\",\n",
+ ")\n",
+ "axes[1].plot(\n",
+ " angles3,\n",
+ " 100 * (1 - np.median(tatc_advance, axis=0) / np.median(angular_length, axis=0)),\n",
+ " color=ORANGE,\n",
+ " ls=\"--\",\n",
+ " label=\"TAT-C scan view\",\n",
+ ")\n",
"axes[1].axhline(0, color=GRAY, lw=0.8)\n",
- "axes[1].set(xlabel=\"Scan angle (deg, positive left)\", ylabel=\"Overlap of consecutive scans (%)\", title=\"Scan-to-scan overlap (bow tie)\")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Scan angle (deg, positive left)\",\n",
+ " ylabel=\"Overlap of consecutive scans (%)\",\n",
+ " title=\"Scan-to-scan overlap (bow tie)\",\n",
+ ")\n",
"axes[1].legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()\n",
@@ -1071,9 +1293,15 @@
" {\n",
" \"VIIRS length (km)\": q_len[[len(mid3) // 2, 0, -1], 1],\n",
" \"VIIRS advance (km)\": q_adv[[len(mid3) // 2, 0, -1], 1],\n",
- " \"TAT-C frame view length (km)\": np.median(tatc_length, axis=0)[[len(angles3) // 2, 0, -1]],\n",
- " \"TAT-C scan view length (km)\": np.median(angular_length, axis=0)[[len(angles3) // 2, 0, -1]],\n",
- " \"TAT-C advance (km)\": np.median(tatc_advance, axis=0)[[len(angles3) // 2, 0, -1]],\n",
+ " \"TAT-C frame view length (km)\": np.median(tatc_length, axis=0)[\n",
+ " [len(angles3) // 2, 0, -1]\n",
+ " ],\n",
+ " \"TAT-C scan view length (km)\": np.median(angular_length, axis=0)[\n",
+ " [len(angles3) // 2, 0, -1]\n",
+ " ],\n",
+ " \"TAT-C advance (km)\": np.median(tatc_advance, axis=0)[\n",
+ " [len(angles3) // 2, 0, -1]\n",
+ " ],\n",
" },\n",
" index=[\"nadir\", \"left edge\", \"right edge\"],\n",
").round(2)"
@@ -1097,10 +1325,10 @@
"id": "3506ef67",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:32.158358Z",
- "iopub.status.busy": "2026-10-08T17:41:32.158358Z",
- "iopub.status.idle": "2026-10-08T17:41:32.715941Z",
- "shell.execute_reply": "2026-10-08T17:41:32.715941Z"
+ "iopub.execute_input": "2026-10-25T13:56:26.282873Z",
+ "iopub.status.busy": "2026-10-25T13:56:26.281869Z",
+ "iopub.status.idle": "2026-10-25T13:56:26.590393Z",
+ "shell.execute_reply": "2026-10-25T13:56:26.590393Z"
}
},
"outputs": [
@@ -1185,28 +1413,55 @@
}
],
"source": [
- "observed_width = np.sum(np.linalg.norm(np.diff(scan_center, axis=1), axis=-1), axis=1) / 1e3\n",
- "sub_lon4, sub_lat4, sub_alt4 = TO_GEODETIC.transform(pos_p[:, 0], pos_p[:, 1], pos_p[:, 2])\n",
+ "observed_width = (\n",
+ " np.sum(np.linalg.norm(np.diff(scan_center, axis=1), axis=-1), axis=1) / 1e3\n",
+ ")\n",
+ "sub_lon4, sub_lat4, sub_alt4 = TO_GEODETIC.transform(\n",
+ " pos_p[:, 0], pos_p[:, 1], pos_p[:, 2]\n",
+ ")\n",
"measured_for = np.abs(measured_angle[0] - measured_angle[-1])\n",
- "apogee_altitude = compute_apoapsis_radius(noaa20.orbit.get_semimajor_axis(), noaa20.orbit.get_eccentricity()) - EARTH_MEAN_RADIUS\n",
+ "apogee_altitude = (\n",
+ " compute_apoapsis_radius(\n",
+ " noaa20.orbit.get_semimajor_axis(), noaa20.orbit.get_eccentricity()\n",
+ " )\n",
+ " - EARTH_MEAN_RADIUS\n",
+ ")\n",
"min_elevation_angle = compute_min_elevation_angle(apogee_altitude, 2 * EDGE)\n",
"swath_width = np.vectorize(field_of_regard_to_swath_width)\n",
"widths = {\n",
" \"nominal field of regard\": swath_width(sub_alt4, 2 * EDGE) / 1e3,\n",
- " \"nominal field of regard, collect_observations\": swath_width(sub_alt4, np.vectorize(compute_field_of_regard)(sub_alt4, min_elevation_angle)) / 1e3,\n",
+ " \"nominal field of regard, collect_observations\": swath_width(\n",
+ " sub_alt4, np.vectorize(compute_field_of_regard)(sub_alt4, min_elevation_angle)\n",
+ " )\n",
+ " / 1e3,\n",
" \"measured field of regard\": swath_width(sub_alt4, measured_for) / 1e3,\n",
"}\n",
"edges4 = np.arange(-90, 91, 10)\n",
"mid4 = (edges4[:-1] + edges4[1:]) / 2\n",
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
- "ax.plot(mid4, binned(sub_lat4, observed_width, edges4)[:, 1], color=INK, marker=\"o\", ms=3, label=\"observed (VIIRS)\")\n",
+ "ax.plot(\n",
+ " mid4,\n",
+ " binned(sub_lat4, observed_width, edges4)[:, 1],\n",
+ " color=INK,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " label=\"observed (VIIRS)\",\n",
+ ")\n",
"for (name, width), color in zip(widths.items(), [BLUE, ORANGE, AQUA]):\n",
- " ax.plot(mid4, binned(sub_lat4, width, edges4)[:, 1], color=color, label=f\"TAT-C: {name}\")\n",
- "ax.set(xlabel=\"Sub-satellite latitude (deg)\", ylabel=\"Swath width (km)\", title=\"VIIRS swath width\")\n",
+ " ax.plot(\n",
+ " mid4, binned(sub_lat4, width, edges4)[:, 1], color=color, label=f\"TAT-C: {name}\"\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Sub-satellite latitude (deg)\",\n",
+ " ylabel=\"Swath width (km)\",\n",
+ " title=\"VIIRS swath width\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()\n",
- "pd.DataFrame({name: summarize(width - observed_width) for name, width in widths.items()}).T.round(1)"
+ "pd.DataFrame(\n",
+ " {name: summarize(width - observed_width) for name, width in widths.items()}\n",
+ ").T.round(1)"
]
},
{
@@ -1231,10 +1486,10 @@
"id": "fd46c4ea",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:41:32.719019Z",
- "iopub.status.busy": "2026-10-08T17:41:32.719019Z",
- "iopub.status.idle": "2026-10-08T17:50:44.259151Z",
- "shell.execute_reply": "2026-10-08T17:50:44.258144Z"
+ "iopub.execute_input": "2026-10-25T13:56:26.592398Z",
+ "iopub.status.busy": "2026-10-25T13:56:26.592398Z",
+ "iopub.status.idle": "2026-10-25T13:59:42.759086Z",
+ "shell.execute_reply": "2026-10-25T13:59:42.759086Z"
}
},
"outputs": [
@@ -1371,7 +1626,10 @@
" if not inside.any():\n",
" continue\n",
" # scan lines through G-ring vertices 2-4 and 6-0; the first is the one nearest the first scan's nadir\n",
- " lines = [normalize(np.cross(vertices[2], vertices[4])), normalize(np.cross(vertices[6], vertices[0]))]\n",
+ " lines = [\n",
+ " normalize(np.cross(vertices[2], vertices[4])),\n",
+ " normalize(np.cross(vertices[6], vertices[0])),\n",
+ " ]\n",
" if np.abs(lines[1] @ first_sub[g]) < np.abs(lines[0] @ first_sub[g]):\n",
" lines = lines[::-1]\n",
" d_first, d_last = (np.abs(point_xyz[inside] @ line) for line in lines)\n",
@@ -1379,24 +1637,40 @@
" times = gran_first[g] + (gran_last[g] - gran_first[g]) * fraction\n",
" for p, t in zip(np.flatnonzero(inside), times):\n",
" observed_rows.append({\"point_id\": p, \"granule\": g, \"time\": t})\n",
- "observed5 = pd.DataFrame(observed_rows).astype({\"point_id\": \"int64\"}).sort_values([\"point_id\", \"time\"])\n",
+ "observed5 = (\n",
+ " pd.DataFrame(observed_rows)\n",
+ " .astype({\"point_id\": \"int64\"})\n",
+ " .sort_values([\"point_id\", \"time\"])\n",
+ ")\n",
"# one observation per pass (granules less than 20 minutes apart)\n",
- "new_pass = observed5.groupby(\"point_id\").time.diff().fillna(pd.Timedelta(days=1)) > pd.Timedelta(minutes=20)\n",
+ "new_pass = observed5.groupby(\"point_id\").time.diff().fillna(\n",
+ " pd.Timedelta(days=1)\n",
+ ") > pd.Timedelta(minutes=20)\n",
"observed5 = observed5[new_pass.to_numpy()].reset_index(drop=True)\n",
"# elevation angle from the reported spacecraft position, interpolated linearly in time between scans\n",
"scan_seconds = (scan_mid - scan_mid[0]).total_seconds().to_numpy()\n",
"obs_seconds = (observed5.time - scan_mid[0]).dt.total_seconds().to_numpy()\n",
"k = np.clip(np.searchsorted(scan_seconds, obs_seconds) - 1, 0, len(scan_seconds) - 2)\n",
"position = scan_pos[k] + scan_vel[k] * (obs_seconds - scan_seconds[k])[:, np.newaxis]\n",
- "target = ecef(points5.geometry.x.to_numpy()[observed5.point_id], points5.geometry.y.to_numpy()[observed5.point_id])\n",
- "observed5[\"elevation\"] = np.degrees(np.arcsin(np.sum(normalize(position - target) * point_xyz[observed5.point_id], axis=-1)))\n",
+ "target = ecef(\n",
+ " points5.geometry.x.to_numpy()[observed5.point_id],\n",
+ " points5.geometry.y.to_numpy()[observed5.point_id],\n",
+ ")\n",
+ "observed5[\"elevation\"] = np.degrees(\n",
+ " np.arcsin(\n",
+ " np.sum(normalize(position - target) * point_xyz[observed5.point_id], axis=-1)\n",
+ " )\n",
+ ")\n",
"\n",
"start5, end5 = scan_mid[0].to_pydatetime(), scan_mid[-1].to_pydatetime()\n",
"instruments5 = {\n",
" \"nadir Instrument\": Instrument(name=\"VIIRS\", field_of_regard=2 * EDGE),\n",
" \"PointedInstrument, inertial\": viirs_view,\n",
" \"PointedInstrument, inertial, measured field of regard\": viirs_view.model_copy(\n",
- " update={\"field_of_regard\": measured_for, \"cross_track_field_of_view\": measured_for}\n",
+ " update={\n",
+ " \"field_of_regard\": measured_for,\n",
+ " \"cross_track_field_of_view\": measured_for,\n",
+ " }\n",
" ),\n",
"}\n",
"\n",
@@ -1406,8 +1680,11 @@
" return pd.merge_asof(\n",
" observed5.sort_values(\"time\"),\n",
" predicted[[\"point_id\", \"epoch\", \"sat_alt\"]].sort_values(\"epoch\"),\n",
- " left_on=\"time\", right_on=\"epoch\", by=\"point_id\",\n",
- " direction=\"nearest\", tolerance=pd.Timedelta(minutes=10),\n",
+ " left_on=\"time\",\n",
+ " right_on=\"epoch\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=10),\n",
" )\n",
"\n",
"\n",
@@ -1415,7 +1692,12 @@
"for name, instrument in instruments5.items():\n",
" satellite = noaa20.model_copy(update={\"instruments\": [instrument]})\n",
" predicted5[name] = pd.concat(\n",
- " [collect_observations(Point(latitude=g.y, longitude=g.x), satellite, start5, end5).assign(point_id=p) for p, g in enumerate(points5.geometry)]\n",
+ " [\n",
+ " collect_observations(\n",
+ " Point(latitude=g.y, longitude=g.x), satellite, start5, end5\n",
+ " ).assign(point_id=p)\n",
+ " for p, g in enumerate(points5.geometry)\n",
+ " ]\n",
" ).reset_index(drop=True)\n",
" predicted5[name][\"point_id\"] = predicted5[name].point_id.astype(\"int64\")\n",
" matched5[name] = match(predicted5[name])\n",
@@ -1429,8 +1711,12 @@
" \"predicted only\": len(predicted5[name]) - int(hit.sum()),\n",
" \"time, median (s)\": np.median(dt),\n",
" \"time, p95 |x| (s)\": np.percentile(np.abs(dt), 95),\n",
- " \"elevation, median (deg)\": np.median((matched5[name].sat_alt - matched5[name].elevation)[hit]),\n",
- " \"elevation, p95 |x| (deg)\": np.percentile(np.abs(matched5[name].sat_alt - matched5[name].elevation)[hit], 95),\n",
+ " \"elevation, median (deg)\": np.median(\n",
+ " (matched5[name].sat_alt - matched5[name].elevation)[hit]\n",
+ " ),\n",
+ " \"elevation, p95 |x| (deg)\": np.percentile(\n",
+ " np.abs(matched5[name].sat_alt - matched5[name].elevation)[hit], 95\n",
+ " ),\n",
" }\n",
"pd.DataFrame(rows5).T.round(2)"
]
@@ -1441,10 +1727,10 @@
"id": "7f814559",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:50:44.262663Z",
- "iopub.status.busy": "2026-10-08T17:50:44.262663Z",
- "iopub.status.idle": "2026-10-08T17:50:44.676088Z",
- "shell.execute_reply": "2026-10-08T17:50:44.675082Z"
+ "iopub.execute_input": "2026-10-25T13:59:42.761090Z",
+ "iopub.status.busy": "2026-10-25T13:59:42.761090Z",
+ "iopub.status.idle": "2026-10-25T13:59:43.139997Z",
+ "shell.execute_reply": "2026-10-25T13:59:43.139997Z"
}
},
"outputs": [
@@ -1464,16 +1750,40 @@
"for (name, matched), color in zip(matched5.items(), [BLUE, AQUA, ORANGE]):\n",
" hit = matched.epoch.notna()\n",
" dt = (matched.epoch - matched.time).dt.total_seconds()\n",
- " axes[0].hist(dt[hit], bins=np.arange(-20, 20.5, 0.5), color=color, histtype=\"step\", lw=1.5, label=name)\n",
+ " axes[0].hist(\n",
+ " dt[hit],\n",
+ " bins=np.arange(-20, 20.5, 0.5),\n",
+ " color=color,\n",
+ " histtype=\"step\",\n",
+ " lw=1.5,\n",
+ " label=name,\n",
+ " )\n",
"axes[0].set(xlabel=\"TAT-C minus VIIRS (s)\", ylabel=\"Passes\", title=\"Observation time\")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
"lat_edges = np.arange(-90, 91, 10)\n",
"point_lat = points5.geometry.y.to_numpy()\n",
"n_points = np.histogram(point_lat, lat_edges)[0]\n",
- "axes[1].plot((lat_edges[:-1] + lat_edges[1:]) / 2, np.histogram(point_lat[observed5.point_id], lat_edges)[0] / n_points, color=INK, marker=\"o\", ms=3, label=\"observed (VIIRS)\")\n",
+ "axes[1].plot(\n",
+ " (lat_edges[:-1] + lat_edges[1:]) / 2,\n",
+ " np.histogram(point_lat[observed5.point_id], lat_edges)[0] / n_points,\n",
+ " color=INK,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " label=\"observed (VIIRS)\",\n",
+ ")\n",
"for (name, predicted), color in zip(predicted5.items(), [BLUE, AQUA, ORANGE]):\n",
- " axes[1].plot((lat_edges[:-1] + lat_edges[1:]) / 2, np.histogram(point_lat[predicted.point_id], lat_edges)[0] / n_points, color=color, ls=\"--\", label=name)\n",
- "axes[1].set(xlabel=\"Point latitude (deg)\", ylabel=\"Observations per point per day\", title=\"Daily observations\")\n",
+ " axes[1].plot(\n",
+ " (lat_edges[:-1] + lat_edges[1:]) / 2,\n",
+ " np.histogram(point_lat[predicted.point_id], lat_edges)[0] / n_points,\n",
+ " color=color,\n",
+ " ls=\"--\",\n",
+ " label=name,\n",
+ " )\n",
+ "axes[1].set(\n",
+ " xlabel=\"Point latitude (deg)\",\n",
+ " ylabel=\"Observations per point per day\",\n",
+ " title=\"Daily observations\",\n",
+ ")\n",
"axes[1].legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1498,7 +1808,7 @@
"| 4. Swath width | 47 km too wide with the nominal field of regard, 3 km with the measured one (median) |\n",
"| 5. Daily observations (`collect_observations`) | all observed passes predicted with the nominal field of regard (2 to 3% extra), 99.8% with the measured one (1.6% extra); epochs within 2 s (95th percentile) for an inertial-frame `PointedInstrument`, vs. 14 s for a nadir `Instrument` |\n",
"\n",
- "**Scan orientation and timing.** VIIRS confirms the ATMS findings: NOAA-20's instruments scan perpendicular to the inertial velocity, so `velocity_frame=VelocityFrame.INERTIAL` is the appropriate setting for a `PointedInstrument` representing either instrument, and it makes the observation epochs of `collect_observations` match the actual scan times. VIIRS's Earth view lasts only 0.56 s, so the along-track error from observing a whole view at one instant is under 2 km at the swath edges.\n",
+ "**Scan orientation and timing.** VIIRS confirms the ATMS findings: NOAA-20's instruments scan perpendicular to the inertial velocity, so the inertial velocity frame (`Attitude(velocity_frame=VelocityFrame.INERTIAL)` of the satellite) is the appropriate setting for either instrument, and it makes the observation epochs of `collect_observations` match the actual scan times. VIIRS's Earth view lasts only 0.56 s, so the along-track error from observing a whole view at one instant is under 2 km at the swath edges.\n",
"\n",
"**Along-track field of view as integration time.** VIIRS's 16-detector array is designed to cover the ground traveled in one scan period, and the along-track field of view tailored to one scan period (0.814 deg) matches its angular extent (0.817 deg). At nadir, TAT-C's footprint therefore matches a VIIRS scan. Toward the swath edges, however, TAT-C's default (frame geometry) view is a rectangle in the plane perpendicular to the boresight, like the focal plane of a framing camera or pushbroom imager, so its angular along-track extent shrinks as the cosine of the scan angle. A scanning imager such as VIIRS keeps a constant angular extent, so its scans grow to about twice their nadir length at the edges and overlap (the bow tie effect). The scan geometry (`view_geometry=ViewGeometry.SCAN`) reproduces this; with the frame geometry, footprints still tile the swath, so coverage and revisit are unaffected, but footprint and pixel sizes near the edges of a scanning imager's swath are underestimated by up to about 40%.\n",
"\n",
diff --git a/docs/validation/ValidateLatencyNOAA20.ipynb b/docs/validation/ValidateLatencyNOAA20.ipynb
index e49dfec5..95554ebb 100644
--- a/docs/validation/ValidateLatencyNOAA20.ipynb
+++ b/docs/validation/ValidateLatencyNOAA20.ipynb
@@ -87,7 +87,10 @@
" response = requests.get(BUCKET, params=params, timeout=120)\n",
" response.raise_for_status()\n",
" root = ET.fromstring(response.content)\n",
- " keys += [c.find(\"s:Key\", namespace).text for c in root.findall(\"s:Contents\", namespace)]\n",
+ " keys += [\n",
+ " c.find(\"s:Key\", namespace).text\n",
+ " for c in root.findall(\"s:Contents\", namespace)\n",
+ " ]\n",
" following = root.find(\"s:NextContinuationToken\", namespace)\n",
" if following is None:\n",
" return keys\n",
@@ -100,24 +103,47 @@
" for day in [DAY, DAY + timedelta(days=1)]:\n",
" for key in listing(f\"ATMS-SDR/{day:%Y/%m/%d}/\"):\n",
" date, start, end, orbit, created = pattern.search(key).groups()\n",
- " rows.append({\"date\": date, \"start\": start, \"end\": end, \"orbit\": int(orbit), \"created\": created})\n",
+ " rows.append(\n",
+ " {\n",
+ " \"date\": date,\n",
+ " \"start\": start,\n",
+ " \"end\": end,\n",
+ " \"orbit\": int(orbit),\n",
+ " \"created\": created,\n",
+ " }\n",
+ " )\n",
" pd.DataFrame(rows).to_csv(GRANULES_FILE, index=False)\n",
"granules = pd.read_csv(GRANULES_FILE, dtype=str)\n",
- "parse = lambda date, clock: pd.to_datetime(date + clock.str[:6], format=\"%Y%m%d%H%M%S\", utc=True)\n",
+ "parse = lambda date, clock: pd.to_datetime(\n",
+ " date + clock.str[:6], format=\"%Y%m%d%H%M%S\", utc=True\n",
+ ")\n",
"granules[\"start\"] = parse(granules.date, granules.start)\n",
"granules[\"end\"] = parse(granules.date, granules.end)\n",
"granules.loc[granules.end < granules.start, \"end\"] += pd.Timedelta(days=1)\n",
"granules[\"created\"] = pd.to_datetime(granules.created, format=\"%Y%m%d%H%M%S\", utc=True)\n",
"granules = granules.drop_duplicates(\"start\").sort_values(\"end\")\n",
- "granules = granules[(granules.end >= DAY) & (granules.end < DAY + timedelta(days=1))].reset_index(drop=True)\n",
+ "granules = granules[\n",
+ " (granules.end >= DAY) & (granules.end < DAY + timedelta(days=1))\n",
+ "].reset_index(drop=True)\n",
"granules[\"latency (min)\"] = (granules.created - granules.end).dt.total_seconds() / 60\n",
"TLE_FILE = ORBIT_DIR / \"weather.tle\"\n",
"if not TLE_FILE.exists():\n",
- " TLE_FILE.write_text(requests.get(\"https://celestrak.org/NORAD/elements/gp.php\", params={\"GROUP\": \"weather\", \"FORMAT\": \"tle\"}, timeout=120).text)\n",
+ " TLE_FILE.write_text(\n",
+ " requests.get(\n",
+ " \"https://celestrak.org/NORAD/elements/gp.php\",\n",
+ " params={\"GROUP\": \"weather\", \"FORMAT\": \"tle\"},\n",
+ " timeout=120,\n",
+ " ).text\n",
+ " )\n",
"lines = [line.rstrip() for line in TLE_FILE.read_text().splitlines() if line.strip()]\n",
"k = next(i for i, line in enumerate(lines) if line.startswith(\"NOAA 20\"))\n",
"TLE = lines[k + 1 : k + 3]\n",
- "pd.concat([pd.Series({\"granules\": len(granules), \"orbits\": granules.orbit.nunique()}), granules[\"latency (min)\"].describe(percentiles=[0.05, 0.5, 0.95])[1:]]).round(1)"
+ "pd.concat(\n",
+ " [\n",
+ " pd.Series({\"granules\": len(granules), \"orbits\": granules.orbit.nunique()}),\n",
+ " granules[\"latency (min)\"].describe(percentiles=[0.05, 0.5, 0.95])[1:],\n",
+ " ]\n",
+ ").round(1)"
]
},
{
@@ -226,19 +252,48 @@
" \"Fairbanks\": (64.86, -147.85),\n",
" \"Inuvik\": (68.40, -133.50),\n",
"}\n",
- "stations = {name: GroundStation(name=name, latitude=lat, longitude=lon, min_elevation_angle=5) for name, (lat, lon) in STATIONS.items()}\n",
- "contacts = {name: collect_downlinks(station, noaa20, DAY - timedelta(hours=3), DAY + timedelta(days=1, hours=3)) for name, station in stations.items()}\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
+ "stations = {\n",
+ " name: GroundStation(name=name, latitude=lat, longitude=lon, min_elevation_angle=5)\n",
+ " for name, (lat, lon) in STATIONS.items()\n",
+ "}\n",
+ "contacts = {\n",
+ " name: collect_downlinks(\n",
+ " station, noaa20, DAY - timedelta(hours=3), DAY + timedelta(days=1, hours=3)\n",
+ " )\n",
+ " for name, station in stations.items()\n",
+ "}\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
"STATION_COLORS = dict(zip(STATIONS, [BLUE, ORANGE, AQUA, PURPLE, GRAY]))\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"\n",
"\n",
"def downlinking_contact(station_names):\n",
" \"\"\"For each granule, the first contact (of the given stations) that has not ended when the granule's observation ends.\"\"\"\n",
- " c = pd.concat([contacts[name] for name in station_names]).sort_values(\"end\").reset_index(drop=True)\n",
+ " c = (\n",
+ " pd.concat([contacts[name] for name in station_names])\n",
+ " .sort_values(\"end\")\n",
+ " .reset_index(drop=True)\n",
+ " )\n",
" return pd.merge_asof(\n",
" granules.sort_values(\"end\"),\n",
- " c[[\"station\", \"start\", \"end\"]].rename(columns={\"start\": \"contact start\", \"end\": \"contact end\"}).sort_values(\"contact end\"),\n",
+ " c[[\"station\", \"start\", \"end\"]]\n",
+ " .rename(columns={\"start\": \"contact start\", \"end\": \"contact end\"})\n",
+ " .sort_values(\"contact end\"),\n",
" left_on=\"end\",\n",
" right_on=\"contact end\",\n",
" direction=\"forward\",\n",
@@ -248,8 +303,12 @@
"pd.DataFrame(\n",
" {\n",
" name: {\n",
- " \"contacts on 3 October\": int(((c.start >= DAY) & (c.start < DAY + timedelta(days=1))).sum()),\n",
- " \"duration, median (min)\": ((c.end - c.start).dt.total_seconds() / 60).median(),\n",
+ " \"contacts on 3 October\": int(\n",
+ " ((c.start >= DAY) & (c.start < DAY + timedelta(days=1))).sum()\n",
+ " ),\n",
+ " \"duration, median (min)\": (\n",
+ " (c.end - c.start).dt.total_seconds() / 60\n",
+ " ).median(),\n",
" }\n",
" for name, c in contacts.items()\n",
" }\n",
@@ -382,13 +441,20 @@
}
],
"source": [
- "SETS = [[\"Svalbard\"], [\"Svalbard\", \"McMurdo\"], [\"Svalbard\", \"McMurdo\", \"Troll\"], [\"Svalbard\", \"McMurdo\", \"Fairbanks\"], [\"Svalbard\", \"McMurdo\", \"Troll\", \"Fairbanks\", \"Inuvik\"]]\n",
+ "SETS = [\n",
+ " [\"Svalbard\"],\n",
+ " [\"Svalbard\", \"McMurdo\"],\n",
+ " [\"Svalbard\", \"McMurdo\", \"Troll\"],\n",
+ " [\"Svalbard\", \"McMurdo\", \"Fairbanks\"],\n",
+ " [\"Svalbard\", \"McMurdo\", \"Troll\", \"Fairbanks\", \"Inuvik\"],\n",
+ "]\n",
"rows1 = {}\n",
"for station_set in SETS:\n",
" merged = downlinking_contact(station_set)\n",
" delay = (merged.created - merged[\"contact start\"]).dt.total_seconds() / 60\n",
" rows1[\" + \".join(station_set)] = {\n",
- " \"created 0 to 20 min after contact start (%)\": 100 * np.mean((delay >= 0) & (delay <= 20)),\n",
+ " \"created 0 to 20 min after contact start (%)\": 100\n",
+ " * np.mean((delay >= 0) & (delay <= 20)),\n",
" \"created before contact start (%)\": 100 * np.mean(delay < 0),\n",
" \"delay after contact start, median (min)\": np.median(delay),\n",
" \"delay after contact start, p90 (min)\": np.percentile(delay, 90),\n",
@@ -427,11 +493,36 @@
"for name in STATIONS:\n",
" for _, c in contacts[name].iterrows():\n",
" if c.end > window[0] and c.start < window[1]:\n",
- " ax.axvspan(c.start, c.end, ymin=0, ymax=1, color=STATION_COLORS[name], alpha=0.25 if name in (\"Svalbard\", \"McMurdo\") else 0.08, lw=0)\n",
- " ax.plot([], [], color=STATION_COLORS[name], lw=6, alpha=0.4, label=f\"{name} contact (TAT-C)\")\n",
+ " ax.axvspan(\n",
+ " c.start,\n",
+ " c.end,\n",
+ " ymin=0,\n",
+ " ymax=1,\n",
+ " color=STATION_COLORS[name],\n",
+ " alpha=0.25 if name in (\"Svalbard\", \"McMurdo\") else 0.08,\n",
+ " lw=0,\n",
+ " )\n",
+ " ax.plot(\n",
+ " [],\n",
+ " [],\n",
+ " color=STATION_COLORS[name],\n",
+ " lw=6,\n",
+ " alpha=0.4,\n",
+ " label=f\"{name} contact (TAT-C)\",\n",
+ " )\n",
"shown = granules[(granules.end > window[0]) & (granules.end < window[1])]\n",
- "ax.scatter(shown.created, (shown.created - shown.end).dt.total_seconds() / 60, s=4, color=INK, label=\"granule creation (latency)\")\n",
- "ax.set(xlim=window, ylabel=\"Latency at creation (min)\", title=\"NOAA-20 ATMS granules and predicted ground station contacts, 3 October 2026, 06:00 to 12:00 UTC\")\n",
+ "ax.scatter(\n",
+ " shown.created,\n",
+ " (shown.created - shown.end).dt.total_seconds() / 60,\n",
+ " s=4,\n",
+ " color=INK,\n",
+ " label=\"granule creation (latency)\",\n",
+ ")\n",
+ "ax.set(\n",
+ " xlim=window,\n",
+ " ylabel=\"Latency at creation (min)\",\n",
+ " title=\"NOAA-20 ATMS granules and predicted ground station contacts, 3 October 2026, 06:00 to 12:00 UTC\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=7, ncol=3, loc=\"upper left\")\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -547,17 +638,26 @@
}
],
"source": [
- "merged[\"delay (min)\"] = (merged.created - merged[\"contact start\"]).dt.total_seconds() / 60\n",
- "merged[\"contact duration (min)\"] = (merged[\"contact end\"] - merged[\"contact start\"]).dt.total_seconds() / 60\n",
+ "merged[\"delay (min)\"] = (\n",
+ " merged.created - merged[\"contact start\"]\n",
+ ").dt.total_seconds() / 60\n",
+ "merged[\"contact duration (min)\"] = (\n",
+ " merged[\"contact end\"] - merged[\"contact start\"]\n",
+ ").dt.total_seconds() / 60\n",
"merged[\"observed during contact\"] = merged.end >= merged[\"contact start\"]\n",
"rows2 = {}\n",
- "for label, subset in [(\"all granules\", merged), (\"observed before the contact\", merged[~merged[\"observed during contact\"]]), (\"observed during the contact\", merged[merged[\"observed during contact\"]])]:\n",
+ "for label, subset in [\n",
+ " (\"all granules\", merged),\n",
+ " (\"observed before the contact\", merged[~merged[\"observed during contact\"]]),\n",
+ " (\"observed during the contact\", merged[merged[\"observed during contact\"]]),\n",
+ "]:\n",
" rows2[label] = {\n",
" \"granules\": len(subset),\n",
" \"delay after contact start, p10 (min)\": subset[\"delay (min)\"].quantile(0.1),\n",
" \"delay after contact start, median (min)\": subset[\"delay (min)\"].median(),\n",
" \"delay after contact start, p90 (min)\": subset[\"delay (min)\"].quantile(0.9),\n",
- " \"created after contact end (%)\": 100 * np.mean(subset.created > subset[\"contact end\"]),\n",
+ " \"created after contact end (%)\": 100\n",
+ " * np.mean(subset.created > subset[\"contact end\"]),\n",
" }\n",
"pd.DataFrame(rows2).T.round(1)"
]
@@ -590,9 +690,25 @@
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
"for station, color in [(\"Svalbard\", BLUE), (\"McMurdo\", ORANGE)]:\n",
" s = merged[merged.station == station]\n",
- " ax.hist(s[\"delay (min)\"].clip(-5, 60), bins=np.arange(-5, 61, 1), color=color, alpha=0.6, label=station)\n",
- "ax.axvline(merged[\"contact duration (min)\"].median(), color=INK, lw=0.8, ls=\"--\", label=\"median contact duration\")\n",
- "ax.set(xlabel=\"Granule creation after contact start (min)\", ylabel=\"Granules\", title=\"Creation of NOAA-20 ATMS granules within contacts\")\n",
+ " ax.hist(\n",
+ " s[\"delay (min)\"].clip(-5, 60),\n",
+ " bins=np.arange(-5, 61, 1),\n",
+ " color=color,\n",
+ " alpha=0.6,\n",
+ " label=station,\n",
+ " )\n",
+ "ax.axvline(\n",
+ " merged[\"contact duration (min)\"].median(),\n",
+ " color=INK,\n",
+ " lw=0.8,\n",
+ " ls=\"--\",\n",
+ " label=\"median contact duration\",\n",
+ ")\n",
+ "ax.set(\n",
+ " xlabel=\"Granule creation after contact start (min)\",\n",
+ " ylabel=\"Granules\",\n",
+ " title=\"Creation of NOAA-20 ATMS granules within contacts\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -764,16 +880,44 @@
"from shapely.geometry import Point as ShapelyPoint\n",
"\n",
"observations[\"geometry\"] = [ShapelyPoint(0, 0)] * len(observations)\n",
- "downlinks = pd.concat([contacts[\"Svalbard\"], contacts[\"McMurdo\"]]).sort_values(\"start\").reset_index(drop=True)\n",
- "latencies = compute_latencies(gpd.GeoDataFrame(observations, crs=\"EPSG:4326\"), downlinks, during_contact=\"next\").sort_values(\"target_hash\").reset_index(drop=True)\n",
- "latencies_end = compute_latencies(gpd.GeoDataFrame(observations, crs=\"EPSG:4326\"), downlinks).sort_values(\"target_hash\").reset_index(drop=True)\n",
+ "downlinks = (\n",
+ " pd.concat([contacts[\"Svalbard\"], contacts[\"McMurdo\"]])\n",
+ " .sort_values(\"start\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
+ "latencies = (\n",
+ " compute_latencies(\n",
+ " gpd.GeoDataFrame(observations, crs=\"EPSG:4326\"),\n",
+ " downlinks,\n",
+ " during_contact=\"next\",\n",
+ " )\n",
+ " .sort_values(\"target_hash\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
+ "latencies_end = (\n",
+ " compute_latencies(gpd.GeoDataFrame(observations, crs=\"EPSG:4326\"), downlinks)\n",
+ " .sort_values(\"target_hash\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
"actual = granules[\"latency (min)\"].to_numpy()\n",
"tatc = latencies.latency.dt.total_seconds().to_numpy() / 60\n",
- "current = ((merged[\"contact start\"] + (merged[\"contact end\"] - merged[\"contact start\"]) / 2 - merged.end).dt.total_seconds() / 60).to_numpy()\n",
+ "current = (\n",
+ " (\n",
+ " merged[\"contact start\"]\n",
+ " + (merged[\"contact end\"] - merged[\"contact start\"]) / 2\n",
+ " - merged.end\n",
+ " ).dt.total_seconds()\n",
+ " / 60\n",
+ ").to_numpy()\n",
"during = merged[\"observed during contact\"].to_numpy()\n",
"playback = latencies_end.latency.dt.total_seconds().to_numpy() / 60\n",
"rows3 = {}\n",
- "for label, values in [(\"actual (creation)\", actual), ('compute_latencies, during_contact=\"next\"', tatc), (\"first contact not ended (midpoint)\", current), ('compute_latencies (default, \"end\")', playback)]:\n",
+ "for label, values in [\n",
+ " (\"actual (creation)\", actual),\n",
+ " ('compute_latencies, during_contact=\"next\"', tatc),\n",
+ " (\"first contact not ended (midpoint)\", current),\n",
+ " ('compute_latencies (default, \"end\")', playback),\n",
+ "]:\n",
" rows3[label] = {\n",
" \"mean (min)\": np.nanmean(values),\n",
" \"median (min)\": np.nanmedian(values),\n",
@@ -783,8 +927,18 @@
" \"mean, observed before contact (min)\": np.nanmean(values[~during]),\n",
" }\n",
"table3 = pd.DataFrame(rows3).T\n",
- "table3[\"difference from actual, median (min)\"] = [0, np.nanmedian(tatc - actual), np.nanmedian(current - actual), np.nanmedian(playback - actual)]\n",
- "table3[\"difference from actual, p95 |x| (min)\"] = [0, np.nanpercentile(np.abs(tatc - actual), 95), np.nanpercentile(np.abs(current - actual), 95), np.nanpercentile(np.abs(playback - actual), 95)]\n",
+ "table3[\"difference from actual, median (min)\"] = [\n",
+ " 0,\n",
+ " np.nanmedian(tatc - actual),\n",
+ " np.nanmedian(current - actual),\n",
+ " np.nanmedian(playback - actual),\n",
+ "]\n",
+ "table3[\"difference from actual, p95 |x| (min)\"] = [\n",
+ " 0,\n",
+ " np.nanpercentile(np.abs(tatc - actual), 95),\n",
+ " np.nanpercentile(np.abs(current - actual), 95),\n",
+ " np.nanpercentile(np.abs(playback - actual), 95),\n",
+ "]\n",
"table3.round(1)"
]
},
@@ -815,16 +969,39 @@
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.6))\n",
"bins = np.arange(0, 75, 2)\n",
- "axes[0].hist(np.clip(actual, 0, 74), bins=bins, color=GRAY, alpha=0.6, label=\"actual (creation)\")\n",
- "axes[0].hist(np.clip(tatc, 0, 74), bins=bins, histtype=\"step\", color=BLUE, lw=1.5, label='during_contact=\"next\"')\n",
- "axes[0].hist(np.clip(playback, 0, 74), bins=bins, histtype=\"step\", color=ORANGE, lw=1.5, label='during_contact=\"end\" (default)')\n",
+ "axes[0].hist(\n",
+ " np.clip(actual, 0, 74), bins=bins, color=GRAY, alpha=0.6, label=\"actual (creation)\"\n",
+ ")\n",
+ "axes[0].hist(\n",
+ " np.clip(tatc, 0, 74),\n",
+ " bins=bins,\n",
+ " histtype=\"step\",\n",
+ " color=BLUE,\n",
+ " lw=1.5,\n",
+ " label='during_contact=\"next\"',\n",
+ ")\n",
+ "axes[0].hist(\n",
+ " np.clip(playback, 0, 74),\n",
+ " bins=bins,\n",
+ " histtype=\"step\",\n",
+ " color=ORANGE,\n",
+ " lw=1.5,\n",
+ " label='during_contact=\"end\" (default)',\n",
+ ")\n",
"axes[0].set(xlabel=\"Latency (min)\", ylabel=\"Granules\", title=\"Latency distributions\")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
"hours = [(t - DAY) / timedelta(hours=1) for t in granules.end]\n",
"axes[1].plot(hours, actual, \".\", ms=2, color=GRAY, label=\"actual (creation)\")\n",
"axes[1].plot(hours, tatc, \".\", ms=2, color=BLUE, label='during_contact=\"next\"')\n",
- "axes[1].plot(hours, playback, \".\", ms=1, color=ORANGE, label='during_contact=\"end\" (default)')\n",
- "axes[1].set(xlim=(6, 12), xlabel=\"Observation time (hours UTC)\", ylabel=\"Latency (min)\", title=\"Latency by observation time\")\n",
+ "axes[1].plot(\n",
+ " hours, playback, \".\", ms=1, color=ORANGE, label='during_contact=\"end\" (default)'\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlim=(6, 12),\n",
+ " xlabel=\"Observation time (hours UTC)\",\n",
+ " ylabel=\"Latency (min)\",\n",
+ " title=\"Latency by observation time\",\n",
+ ")\n",
"axes[1].legend(frameon=False, fontsize=8, markerscale=4)\n",
"fig.tight_layout()\n",
"plt.show()"
diff --git a/docs/validation/ValidateLidarICESat2.ipynb b/docs/validation/ValidateLidarICESat2.ipynb
index 8f269f41..f782ea02 100644
--- a/docs/validation/ValidateLidarICESat2.ipynb
+++ b/docs/validation/ValidateLidarICESat2.ipynb
@@ -87,14 +87,20 @@
"GPS_EPOCH = datetime(1980, 1, 6, tzinfo=timezone.utc)\n",
"GPS_UTC = 18 # s\n",
"BEAMS = [\"gt1l\", \"gt1r\", \"gt2l\", \"gt2r\", \"gt3l\", \"gt3r\"]\n",
- "CROSSINGS_FILE = DATA_DIR / f\"atl08ql_crossings_{START:%Y%m%d}_{END - timedelta(days=1):%Y%m%d}.csv\"\n",
- "SEGMENTS_FILE = DATA_DIR / f\"atl08ql_segments_{START:%Y%m%d}_{END - timedelta(days=1):%Y%m%d}.csv\"\n",
+ "CROSSINGS_FILE = (\n",
+ " DATA_DIR / f\"atl08ql_crossings_{START:%Y%m%d}_{END - timedelta(days=1):%Y%m%d}.csv\"\n",
+ ")\n",
+ "SEGMENTS_FILE = (\n",
+ " DATA_DIR / f\"atl08ql_segments_{START:%Y%m%d}_{END - timedelta(days=1):%Y%m%d}.csv\"\n",
+ ")\n",
"geod = Geod(ellps=\"WGS84\")\n",
"\n",
"\n",
"def gps_seconds_to_utc(seconds):\n",
" \"\"\"UTC times of GPS seconds since 6 January 1980.\"\"\"\n",
- " return pd.to_datetime(GPS_EPOCH) + pd.to_timedelta(np.asarray(seconds) - GPS_UTC, unit=\"s\")\n",
+ " return pd.to_datetime(GPS_EPOCH) + pd.to_timedelta(\n",
+ " np.asarray(seconds) - GPS_UTC, unit=\"s\"\n",
+ " )\n",
"\n",
"\n",
"_sessions = []\n",
@@ -117,13 +123,17 @@
" self.block_size, self.blocks, self.position = block_size, {}, 0\n",
" # follow the Earthdata Login redirects while prefetching the first blocks (file metadata)\n",
" response = self._get(url, 0, prefetch * block_size)\n",
- " self.url, self.size = response.url, int(response.headers[\"Content-Range\"].split(\"/\")[1])\n",
+ " self.url, self.size = response.url, int(\n",
+ " response.headers[\"Content-Range\"].split(\"/\")[1]\n",
+ " )\n",
" self._store(0, response.content)\n",
"\n",
" def _get(self, url, start, end):\n",
" for attempt in range(5):\n",
" try:\n",
- " response = https_session().get(url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300)\n",
+ " response = https_session().get(\n",
+ " url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300\n",
+ " )\n",
" response.raise_for_status()\n",
" return response\n",
" except requests.RequestException:\n",
@@ -144,18 +154,30 @@
" return self.position\n",
"\n",
" def seek(self, offset, whence=io.SEEK_SET):\n",
- " self.position = {io.SEEK_SET: 0, io.SEEK_CUR: self.position, io.SEEK_END: self.size}[whence] + offset\n",
+ " self.position = {\n",
+ " io.SEEK_SET: 0,\n",
+ " io.SEEK_CUR: self.position,\n",
+ " io.SEEK_END: self.size,\n",
+ " }[whence] + offset\n",
" return self.position\n",
"\n",
" def readinto(self, buffer):\n",
" n = min(len(buffer), self.size - self.position)\n",
" if n <= 0:\n",
" return 0\n",
- " first, last = self.position // self.block_size, (self.position + n - 1) // self.block_size\n",
- " missing = [block for block in range(first, last + 1) if block not in self.blocks]\n",
+ " first, last = (\n",
+ " self.position // self.block_size,\n",
+ " (self.position + n - 1) // self.block_size,\n",
+ " )\n",
+ " missing = [\n",
+ " block for block in range(first, last + 1) if block not in self.blocks\n",
+ " ]\n",
" if missing:\n",
" end = min((missing[-1] + 1) * self.block_size, self.size)\n",
- " self._store(missing[0], self._get(self.url, missing[0] * self.block_size, end).content)\n",
+ " self._store(\n",
+ " missing[0],\n",
+ " self._get(self.url, missing[0] * self.block_size, end).content,\n",
+ " )\n",
" data = b\"\".join(self.blocks[block] for block in range(first, last + 1))\n",
" offset = self.position - first * self.block_size\n",
" buffer[:n] = data[offset : offset + n]\n",
@@ -166,13 +188,28 @@
"if not (CROSSINGS_FILE.exists() and SEGMENTS_FILE.exists()):\n",
" import earthaccess\n",
"\n",
- "\n",
- " results = earthaccess.search_data(short_name=\"ATL08QL\", version=\"007\", temporal=(START.strftime(\"%Y-%m-%dT%H:%M:%SZ\"), (END - timedelta(seconds=1)).strftime(\"%Y-%m-%dT%H:%M:%SZ\")))\n",
+ " results = earthaccess.search_data(\n",
+ " short_name=\"ATL08QL\",\n",
+ " version=\"007\",\n",
+ " temporal=(\n",
+ " START.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " (END - timedelta(seconds=1)).strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " ),\n",
+ " )\n",
" names = [r[\"umm\"][\"GranuleUR\"] for r in results]\n",
" rgts = [int(re.search(r\"_(\\d{4})(\\d{2})(\\d{2})_\", n).group(1)) for n in names]\n",
- " urls = [next(link[\"URL\"] for link in r[\"umm\"][\"RelatedUrls\"] if link[\"URL\"].startswith(\"https\") and link[\"URL\"].endswith(\".h5\")) for r in results]\n",
+ " urls = [\n",
+ " next(\n",
+ " link[\"URL\"]\n",
+ " for link in r[\"umm\"][\"RelatedUrls\"]\n",
+ " if link[\"URL\"].startswith(\"https\") and link[\"URL\"].endswith(\".h5\")\n",
+ " )\n",
+ " for r in results\n",
+ " ]\n",
" # one file per RGT for the orbit information, and every 10th file for the segments\n",
- " first_of_rgt = sorted({rgt: i for i, rgt in reversed(list(enumerate(rgts)))}.values())\n",
+ " first_of_rgt = sorted(\n",
+ " {rgt: i for i, rgt in reversed(list(enumerate(rgts)))}.values()\n",
+ " )\n",
" sample = sorted(set(range(0, len(results), 10)) | set(first_of_rgt))\n",
"\n",
" def read(i):\n",
@@ -198,7 +235,13 @@
" {\n",
" \"file\": names[i],\n",
" \"beam\": beam,\n",
- " \"beam_type\": f[beam].attrs[\"atlas_beam_type\"].decode() if isinstance(f[beam].attrs[\"atlas_beam_type\"], bytes) else str(f[beam].attrs[\"atlas_beam_type\"]),\n",
+ " \"beam_type\": (\n",
+ " f[beam].attrs[\"atlas_beam_type\"].decode()\n",
+ " if isinstance(\n",
+ " f[beam].attrs[\"atlas_beam_type\"], bytes\n",
+ " )\n",
+ " else str(f[beam].attrs[\"atlas_beam_type\"])\n",
+ " ),\n",
" # every 10th segment (about 1 km apart)\n",
" \"latitude\": group[\"latitude\"][::10],\n",
" \"longitude\": group[\"longitude\"][::10],\n",
@@ -210,20 +253,41 @@
"\n",
" with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
" outputs = list(pool.map(read, sample))\n",
- " pd.DataFrame([o for o, _ in outputs]).drop_duplicates(\"rgt\").to_csv(CROSSINGS_FILE, index=False)\n",
- " pd.concat([s for _, segments in outputs for s in segments]).to_csv(SEGMENTS_FILE, index=False)\n",
+ " pd.DataFrame([o for o, _ in outputs]).drop_duplicates(\"rgt\").to_csv(\n",
+ " CROSSINGS_FILE, index=False\n",
+ " )\n",
+ " pd.concat([s for _, segments in outputs for s in segments]).to_csv(\n",
+ " SEGMENTS_FILE, index=False\n",
+ " )\n",
"crossings = pd.read_csv(CROSSINGS_FILE)\n",
"crossings[\"time\"] = gps_seconds_to_utc(crossings.crossing_gps_seconds)\n",
"segments = pd.read_csv(SEGMENTS_FILE)\n",
"segments[\"time\"] = gps_seconds_to_utc(segments.gps_seconds)\n",
"icesat2 = GeneralPerturbationsOrbit.from_tle(TLE)\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"pd.Series(\n",
" {\n",
" \"orbits (RGTs)\": len(crossings),\n",
" \"cycle\": \", \".join(map(str, sorted(crossings.cycle.unique()))),\n",
- " \"spacecraft orientation (0: backward, 1: forward)\": \", \".join(map(str, sorted(crossings.sc_orient.unique()))),\n",
+ " \"spacecraft orientation (0: backward, 1: forward)\": \", \".join(\n",
+ " map(str, sorted(crossings.sc_orient.unique()))\n",
+ " ),\n",
" \"files with segments\": segments.file.nunique(),\n",
" \"segments (every 10th)\": len(segments),\n",
" }\n",
@@ -383,27 +447,44 @@
"def ascending_node(time):\n",
" \"\"\"Time and longitude of TAT-C's northward equator crossing nearest a time.\"\"\"\n",
" offsets = np.arange(-120, 120.01, 0.25)\n",
- " times = [time.floor(\"us\").to_pydatetime() + timedelta(seconds=float(s)) for s in offsets]\n",
- " latitude = wgs84.subpoint_of(satrec.at(timescale.from_datetimes(times))).latitude.degrees\n",
+ " times = [\n",
+ " time.floor(\"us\").to_pydatetime() + timedelta(seconds=float(s)) for s in offsets\n",
+ " ]\n",
+ " latitude = wgs84.subpoint_of(\n",
+ " satrec.at(timescale.from_datetimes(times))\n",
+ " ).latitude.degrees\n",
" k = np.nonzero((latitude[:-1] < 0) & (latitude[1:] >= 0))[0][0]\n",
" fraction = -latitude[k] / (latitude[k + 1] - latitude[k])\n",
" crossing = times[k] + (times[k + 1] - times[k]) * fraction\n",
- " longitude = wgs84.subpoint_of(satrec.at(timescale.from_datetime(crossing))).longitude.degrees\n",
+ " longitude = wgs84.subpoint_of(\n",
+ " satrec.at(timescale.from_datetime(crossing))\n",
+ " ).longitude.degrees\n",
" return crossing, float(longitude)\n",
"\n",
"\n",
"nodes = [ascending_node(t) for t in crossings.time]\n",
"crossings[\"days before TLE epoch\"] = (TLE_EPOCH - crossings.time) / timedelta(days=1)\n",
- "crossings[\"time difference (s)\"] = [(t - c).total_seconds() for (t, _), c in zip(nodes, crossings.time)]\n",
- "crossings[\"longitude difference (km)\"] = [((lon - lan + 180) % 360 - 180) * np.pi / 180 * 6378.137 for (_, lon), lan in zip(nodes, crossings.lan)]\n",
+ "crossings[\"time difference (s)\"] = [\n",
+ " (t - c).total_seconds() for (t, _), c in zip(nodes, crossings.time)\n",
+ "]\n",
+ "crossings[\"longitude difference (km)\"] = [\n",
+ " ((lon - lan + 180) % 360 - 180) * np.pi / 180 * 6378.137\n",
+ " for (_, lon), lan in zip(nodes, crossings.lan)\n",
+ "]\n",
"crossings[\"bin\"] = pd.cut(crossings[\"days before TLE epoch\"], [0, 4, 6, 8, 10, 12, 14])\n",
"crossings.groupby(\"bin\", observed=True).agg(\n",
" **{\n",
" \"orbits\": (\"rgt\", \"size\"),\n",
" \"time difference, median (s)\": (\"time difference (s)\", \"median\"),\n",
- " \"time difference, max |x| (s)\": (\"time difference (s)\", lambda x: x.abs().max()),\n",
+ " \"time difference, max |x| (s)\": (\n",
+ " \"time difference (s)\",\n",
+ " lambda x: x.abs().max(),\n",
+ " ),\n",
" \"longitude difference, median (km)\": (\"longitude difference (km)\", \"median\"),\n",
- " \"longitude difference, max |x| (km)\": (\"longitude difference (km)\", lambda x: x.abs().max()),\n",
+ " \"longitude difference, max |x| (km)\": (\n",
+ " \"longitude difference (km)\",\n",
+ " lambda x: x.abs().max(),\n",
+ " ),\n",
" }\n",
").round(3)"
]
@@ -458,8 +539,12 @@
}
],
"source": [
- "default_cycle = GeneralPerturbationsOrbit.from_tle(TLE, remove_drag=True, repeat_cycle=\"auto\").get_repeat_cycle()\n",
- "long_cycle = GeneralPerturbationsOrbit.from_tle(TLE, remove_drag=True, repeat_cycle=\"auto\").get_repeat_cycle(max_search_duration=timedelta(days=100))\n",
+ "default_cycle = GeneralPerturbationsOrbit.from_tle(\n",
+ " TLE, remove_drag=True, repeat_cycle=\"auto\"\n",
+ ").get_repeat_cycle()\n",
+ "long_cycle = GeneralPerturbationsOrbit.from_tle(\n",
+ " TLE, remove_drag=True, repeat_cycle=\"auto\"\n",
+ ").get_repeat_cycle(max_search_duration=timedelta(days=100))\n",
"\n",
"\n",
"def closest_returns(orbit, max_days=100):\n",
@@ -473,40 +558,76 @@
" out = {}\n",
" for days in range(1, max_days + 1):\n",
" center = epoch + timedelta(seconds=days * nodal_day)\n",
- " times = timescale.from_datetimes([center + timedelta(seconds=float(x)) for x in np.arange(-period / 2, period / 2, 5)])\n",
- " out[days] = np.linalg.norm(np.array(satellite.at(times).frame_xyz(itrs).m).T - initial, axis=1).min() / 1e3\n",
+ " times = timescale.from_datetimes(\n",
+ " [\n",
+ " center + timedelta(seconds=float(x))\n",
+ " for x in np.arange(-period / 2, period / 2, 5)\n",
+ " ]\n",
+ " )\n",
+ " out[days] = (\n",
+ " np.linalg.norm(\n",
+ " np.array(satellite.at(times).frame_xyz(itrs).m).T - initial, axis=1\n",
+ " ).min()\n",
+ " / 1e3\n",
+ " )\n",
" return pd.Series(out), 91 * nodal_day / period\n",
"\n",
"\n",
"returns_drag, _ = closest_returns(icesat2)\n",
- "returns_no_drag, orbits_91 = closest_returns(GeneralPerturbationsOrbit.from_tle(TLE, remove_drag=True))\n",
- "declared = GeneralPerturbationsOrbit.from_tle(TLE, remove_drag=True, repeat_cycle=timedelta(days=91)).get_repeat_cycle()\n",
+ "returns_no_drag, orbits_91 = closest_returns(\n",
+ " GeneralPerturbationsOrbit.from_tle(TLE, remove_drag=True)\n",
+ ")\n",
+ "declared = GeneralPerturbationsOrbit.from_tle(\n",
+ " TLE, remove_drag=True, repeat_cycle=timedelta(days=91)\n",
+ ").get_repeat_cycle()\n",
"\n",
"# measured repeat cycle: equator crossings of the same RGTs in consecutive cycles\n",
"REPEAT_FILE = DATA_DIR / \"atl08_rgt_crossings.csv\"\n",
"if not REPEAT_FILE.exists():\n",
" rows = []\n",
" for rgt in [277, 500, 1000]:\n",
- " for short_name, cycle in [(\"ATL08QL\", 33), (\"ATL08QL\", 32), (\"ATL08\", 32), (\"ATL08\", 31)]:\n",
+ " for short_name, cycle in [\n",
+ " (\"ATL08QL\", 33),\n",
+ " (\"ATL08QL\", 32),\n",
+ " (\"ATL08\", 32),\n",
+ " (\"ATL08\", 31),\n",
+ " ]:\n",
" if any(r[\"rgt\"] == rgt and r[\"cycle\"] == cycle for r in rows):\n",
" continue\n",
" response = requests.get(\n",
" \"https://cmr.earthdata.nasa.gov/search/granules.umm_json\",\n",
- " params={\"short_name\": short_name, \"version\": \"007\", \"readable_granule_name\": f\"{short_name}_*_{rgt:04d}{cycle:02d}*\", \"options[readable_granule_name][pattern]\": \"true\", \"page_size\": 1},\n",
+ " params={\n",
+ " \"short_name\": short_name,\n",
+ " \"version\": \"007\",\n",
+ " \"readable_granule_name\": f\"{short_name}_*_{rgt:04d}{cycle:02d}*\",\n",
+ " \"options[readable_granule_name][pattern]\": \"true\",\n",
+ " \"page_size\": 1,\n",
+ " },\n",
" timeout=120,\n",
" )\n",
" items = response.json().get(\"items\", [])\n",
" if not items:\n",
" continue\n",
- " url = next(link[\"URL\"] for link in items[0][\"umm\"][\"RelatedUrls\"] if link[\"URL\"].startswith(\"https\") and link[\"URL\"].endswith(\".h5\"))\n",
+ " url = next(\n",
+ " link[\"URL\"]\n",
+ " for link in items[0][\"umm\"][\"RelatedUrls\"]\n",
+ " if link[\"URL\"].startswith(\"https\") and link[\"URL\"].endswith(\".h5\")\n",
+ " )\n",
" with h5py.File(RemoteFile(url), \"r\") as f:\n",
- " gps_seconds = float(f[\"ancillary_data/atlas_sdp_gps_epoch\"][0]) + float(f[\"orbit_info/crossing_time\"][0])\n",
- " rows.append({\"rgt\": rgt, \"cycle\": cycle, \"crossing_gps_seconds\": gps_seconds})\n",
+ " gps_seconds = float(f[\"ancillary_data/atlas_sdp_gps_epoch\"][0]) + float(\n",
+ " f[\"orbit_info/crossing_time\"][0]\n",
+ " )\n",
+ " rows.append(\n",
+ " {\"rgt\": rgt, \"cycle\": cycle, \"crossing_gps_seconds\": gps_seconds}\n",
+ " )\n",
" pd.DataFrame(rows).to_csv(REPEAT_FILE, index=False)\n",
"rgt_crossings = pd.read_csv(REPEAT_FILE).sort_values([\"rgt\", \"cycle\"])\n",
"rgt_crossings[\"time\"] = gps_seconds_to_utc(rgt_crossings.crossing_gps_seconds)\n",
"measured = rgt_crossings.groupby(\"rgt\").time.diff().dropna()\n",
- "print(\"best returns within 100 nodal days without drag (km):\", {d: round(v, 1) for d, v in returns_no_drag.nsmallest(4).items()})\n",
+ "print(\n",
+ " \"best returns within 100 nodal days without drag (km):\",\n",
+ " {d: round(v, 1) for d, v in returns_no_drag.nsmallest(4).items()},\n",
+ ")\n",
"pd.Series(\n",
" {\n",
" \"repeat cycle, 30-day search (default)\": str(default_cycle),\n",
@@ -516,7 +637,9 @@
" \"closest return after 91 nodal days, without drag (km)\": returns_no_drag[91],\n",
" \"measured repeat cycle (consecutive cycles of 3 RGTs)\": f\"{measured.min()} to {measured.max()}\",\n",
" \"declared repeat cycle (91 days), refined to nodal days\": str(declared),\n",
- " \"declared minus measured (median, s)\": (declared - measured.median()).total_seconds(),\n",
+ " \"declared minus measured (median, s)\": (\n",
+ " declared - measured.median()\n",
+ " ).total_seconds(),\n",
" }\n",
")"
]
@@ -877,21 +1000,46 @@
" track = satrec.at(times)\n",
" ahead = satrec.at(timescale.tt_jd(times.tt + 1 / 86400))\n",
" now, later = wgs84.subpoint_of(track), wgs84.subpoint_of(ahead)\n",
- " heading = geod.inv(now.longitude.degrees, now.latitude.degrees, later.longitude.degrees, later.latitude.degrees)[0]\n",
- " azimuth, _, distance = geod.inv(now.longitude.degrees, now.latitude.degrees, group.longitude.to_numpy(), group.latitude.to_numpy())\n",
+ " heading = geod.inv(\n",
+ " now.longitude.degrees,\n",
+ " now.latitude.degrees,\n",
+ " later.longitude.degrees,\n",
+ " later.latitude.degrees,\n",
+ " )[0]\n",
+ " azimuth, _, distance = geod.inv(\n",
+ " now.longitude.degrees,\n",
+ " now.latitude.degrees,\n",
+ " group.longitude.to_numpy(),\n",
+ " group.latitude.to_numpy(),\n",
+ " )\n",
" angle = np.radians(azimuth - heading)\n",
- " return group.assign(**{\"cross-track (km)\": -distance * np.sin(angle) / 1e3, \"along-track (km)\": distance * np.cos(angle) / 1e3})\n",
+ " return group.assign(\n",
+ " **{\n",
+ " \"cross-track (km)\": -distance * np.sin(angle) / 1e3,\n",
+ " \"along-track (km)\": distance * np.cos(angle) / 1e3,\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"segments = pd.concat([beam_offsets(g) for _, g in segments.groupby(\"file\")])\n",
"segments[\"days before TLE epoch\"] = (TLE_EPOCH - segments.time) / timedelta(days=1)\n",
- "segments[\"region\"] = np.where(segments.latitude < -60, \"Antarctica (south of 60 deg S)\", np.where(segments.latitude > 60, \"north of 60 deg N\", \"60 deg S to 60 deg N\"))\n",
+ "segments[\"region\"] = np.where(\n",
+ " segments.latitude < -60,\n",
+ " \"Antarctica (south of 60 deg S)\",\n",
+ " np.where(segments.latitude > 60, \"north of 60 deg N\", \"60 deg S to 60 deg N\"),\n",
+ ")\n",
"table2 = segments.groupby([\"region\", \"beam\", \"beam_type\"]).agg(\n",
" **{\n",
" \"segments\": (\"latitude\", \"size\"),\n",
" \"cross-track, median (km)\": (\"cross-track (km)\", \"median\"),\n",
- " \"cross-track, 5th percentile (km)\": (\"cross-track (km)\", lambda x: x.quantile(0.05)),\n",
- " \"cross-track, 95th percentile (km)\": (\"cross-track (km)\", lambda x: x.quantile(0.95)),\n",
+ " \"cross-track, 5th percentile (km)\": (\n",
+ " \"cross-track (km)\",\n",
+ " lambda x: x.quantile(0.05),\n",
+ " ),\n",
+ " \"cross-track, 95th percentile (km)\": (\n",
+ " \"cross-track (km)\",\n",
+ " lambda x: x.quantile(0.95),\n",
+ " ),\n",
" \"along-track, median (km)\": (\"along-track (km)\", \"median\"),\n",
" }\n",
")\n",
@@ -927,14 +1075,42 @@
"central = antarctica[antarctica.beam.isin([\"gt2l\", \"gt2r\"])]\n",
"fig, axes = plt.subplots(1, 3, figsize=(15, 3.6))\n",
"for beam, color in zip(BEAMS, [BLUE, BLUE, ORANGE, ORANGE, AQUA, AQUA]):\n",
- " axes[0].hist(antarctica[antarctica.beam == beam][\"cross-track (km)\"], bins=np.arange(-7, 7, 0.05), histtype=\"step\", color=color, label=beam[:3] if beam.endswith(\"l\") else None)\n",
- "axes[0].set(xlabel=\"Distance from TAT-C's ground track (km, positive to the left)\", ylabel=\"Segments\", title=\"Antarctica: beam segments across track\")\n",
+ " axes[0].hist(\n",
+ " antarctica[antarctica.beam == beam][\"cross-track (km)\"],\n",
+ " bins=np.arange(-7, 7, 0.05),\n",
+ " histtype=\"step\",\n",
+ " color=color,\n",
+ " label=beam[:3] if beam.endswith(\"l\") else None,\n",
+ " )\n",
+ "axes[0].set(\n",
+ " xlabel=\"Distance from TAT-C's ground track (km, positive to the left)\",\n",
+ " ylabel=\"Segments\",\n",
+ " title=\"Antarctica: beam segments across track\",\n",
+ ")\n",
"axes[0].legend(frameon=False, fontsize=8, title=\"beam pair\", title_fontsize=8)\n",
- "others = segments[~segments.region.str.startswith(\"Antarctica\") & segments.beam.isin([\"gt2l\", \"gt2r\"])]\n",
+ "others = segments[\n",
+ " ~segments.region.str.startswith(\"Antarctica\") & segments.beam.isin([\"gt2l\", \"gt2r\"])\n",
+ "]\n",
"axes[1].scatter(others.latitude, others[\"cross-track (km)\"], s=1, color=GRAY, alpha=0.3)\n",
- "axes[1].set(xlabel=\"Latitude (deg)\", ylabel=\"Cross-track offset (km)\", title=\"Central pair outside Antarctica (off-pointing)\", ylim=(-20, 20))\n",
- "axes[2].scatter(central[\"days before TLE epoch\"], central[\"cross-track (km)\"], s=1, color=ORANGE, alpha=0.3)\n",
- "axes[2].set(xlabel=\"Days before TLE epoch\", ylabel=\"Cross-track offset (km)\", title=\"Antarctica: central pair\", ylim=(-4, 4))\n",
+ "axes[1].set(\n",
+ " xlabel=\"Latitude (deg)\",\n",
+ " ylabel=\"Cross-track offset (km)\",\n",
+ " title=\"Central pair outside Antarctica (off-pointing)\",\n",
+ " ylim=(-20, 20),\n",
+ ")\n",
+ "axes[2].scatter(\n",
+ " central[\"days before TLE epoch\"],\n",
+ " central[\"cross-track (km)\"],\n",
+ " s=1,\n",
+ " color=ORANGE,\n",
+ " alpha=0.3,\n",
+ ")\n",
+ "axes[2].set(\n",
+ " xlabel=\"Days before TLE epoch\",\n",
+ " ylabel=\"Cross-track offset (km)\",\n",
+ " title=\"Antarctica: central pair\",\n",
+ " ylim=(-4, 4),\n",
+ ")\n",
"axes[2].invert_xaxis()\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1073,11 +1249,21 @@
"def angle(distance):\n",
" \"\"\"Off-nadir angle (deg) of a signed ground distance from nadir, on a spherical Earth.\"\"\"\n",
" theta = distance / EARTH_MEAN_RADIUS\n",
- " return np.degrees(np.arctan2(EARTH_MEAN_RADIUS * np.sin(theta), EARTH_MEAN_RADIUS + ALTITUDE - EARTH_MEAN_RADIUS * np.cos(theta)))\n",
+ " return np.degrees(\n",
+ " np.arctan2(\n",
+ " EARTH_MEAN_RADIUS * np.sin(theta),\n",
+ " EARTH_MEAN_RADIUS + ALTITUDE - EARTH_MEAN_RADIUS * np.cos(theta),\n",
+ " )\n",
+ " )\n",
"\n",
"\n",
"WIDTHS = [100, 250, 500, 1000, 2000, 4000]\n",
- "sample3 = pd.concat([antarctica[antarctica.beam.str[:3] == pair].sample(600, random_state=1) for pair in PAIRS])\n",
+ "sample3 = pd.concat(\n",
+ " [\n",
+ " antarctica[antarctica.beam.str[:3] == pair].sample(600, random_state=1)\n",
+ " for pair in PAIRS\n",
+ " ]\n",
+ ")\n",
"\n",
"\n",
"def predicted(row):\n",
@@ -1089,12 +1275,18 @@
" for width in WIDTHS:\n",
" view = PointedInstrument(\n",
" name=\"pair\",\n",
- " cross_track_field_of_view=angle(offset + width / 2) - angle(offset - width / 2),\n",
+ " cross_track_field_of_view=angle(offset + width / 2)\n",
+ " - angle(offset - width / 2),\n",
" along_track_field_of_view=1,\n",
" roll_angle=(angle(offset + width / 2) + angle(offset - width / 2)) / 2,\n",
" is_rectangular=True,\n",
" )\n",
- " obs = collect_observations(point, Satellite(name=\"ICESat-2\", orbit=icesat2, instruments=[view]), time - timedelta(minutes=2), time + timedelta(minutes=2))\n",
+ " obs = collect_observations(\n",
+ " point,\n",
+ " Satellite(name=\"ICESat-2\", orbit=icesat2, instruments=[view]),\n",
+ " time - timedelta(minutes=2),\n",
+ " time + timedelta(minutes=2),\n",
+ " )\n",
" out[width] = not obs.empty\n",
" return out\n",
"\n",
diff --git a/docs/validation/ValidateLimbMLS.ipynb b/docs/validation/ValidateLimbMLS.ipynb
index 6ec6fc1d..7871f8c2 100644
--- a/docs/validation/ValidateLimbMLS.ipynb
+++ b/docs/validation/ValidateLimbMLS.ipynb
@@ -306,8 +306,12 @@
"\n",
"\n",
"mif_tai = l1[\"sc/MIF_TAI\"][:]\n",
- "tp_lat, tp_lon, tp_alt = (l1[\"GHz/\" + v][:].astype(float) for v in [\"GeodLat\", \"Lon\", \"GeodAlt\"])\n",
- "sc_lat, sc_lon, sc_alt = (l1[\"sc/\" + v][:].astype(float) for v in [\"GeodLat\", \"Lon\", \"GeodAlt\"])\n",
+ "tp_lat, tp_lon, tp_alt = (\n",
+ " l1[\"GHz/\" + v][:].astype(float) for v in [\"GeodLat\", \"Lon\", \"GeodAlt\"]\n",
+ ")\n",
+ "sc_lat, sc_lon, sc_alt = (\n",
+ " l1[\"sc/\" + v][:].astype(float) for v in [\"GeodLat\", \"Lon\", \"GeodAlt\"]\n",
+ ")\n",
"orb_y = l1[\"GHz/OrbY\"][:].astype(float)\n",
"sc_heading = GEOD.inv(sc_lon[:, 0], sc_lat[:, 0], sc_lon[:, 1], sc_lat[:, 1])[0]\n",
"\n",
@@ -330,8 +334,12 @@
" \"upward sweep duration (s)\": elapsed_median[top],\n",
" \"major frames on 14 Aug\": in_day.sum(),\n",
" \"off-nominal major frames\": (~nominal).sum(),\n",
- " \"off-nominal start (UTC)\": maf_utc[np.nonzero(~nominal)[0][0]].strftime(\"%H:%M:%S\"),\n",
- " \"off-nominal end (UTC)\": maf_utc[np.nonzero(~nominal)[0][-1]].strftime(\"%H:%M:%S\"),\n",
+ " \"off-nominal start (UTC)\": maf_utc[np.nonzero(~nominal)[0][0]].strftime(\n",
+ " \"%H:%M:%S\"\n",
+ " ),\n",
+ " \"off-nominal end (UTC)\": maf_utc[np.nonzero(~nominal)[0][-1]].strftime(\n",
+ " \"%H:%M:%S\"\n",
+ " ),\n",
" \"max off-nominal OrbY (km)\": np.abs(orb_y).max() / 1e3,\n",
" }\n",
").to_frame(\"MLS\")"
@@ -625,14 +633,34 @@
"northbound = np.cos(np.radians(sc_heading[mi])) > 0\n",
"north = np.where(northbound, 1, -1)\n",
"fig, axes = plt.subplots(1, 2, figsize=(10, 3.6))\n",
- "axes[0].plot(*binned_median(tp_lat[mi, ji], (alt2 - target) / 1e3, edges), color=BLUE, marker=\"o\", ms=3, label=\"TAT-C\")\n",
- "axes[0].set(xlabel=\"Tangent point latitude (deg)\", ylabel=\"Altitude error (km)\", title=\"Achieved vs. requested altitude\")\n",
+ "axes[0].plot(\n",
+ " *binned_median(tp_lat[mi, ji], (alt2 - target) / 1e3, edges),\n",
+ " color=BLUE,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " label=\"TAT-C\",\n",
+ ")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Tangent point latitude (deg)\",\n",
+ " ylabel=\"Altitude error (km)\",\n",
+ " title=\"Achieved vs. requested altitude\",\n",
+ ")\n",
"for y, color, label in [\n",
" (north * along2, BLUE, \"TAT-C, northward\"),\n",
" (right2, ORANGE, \"TAT-C, cross-track (right)\"),\n",
"]:\n",
- " axes[1].plot(*binned_median(tp_lat[mi, ji], y, edges), color=color, marker=\"o\", ms=3, label=label)\n",
- "axes[1].set(xlabel=\"Tangent point latitude (deg)\", ylabel=\"TAT-C minus MLS (km)\", title=\"Horizontal offset at matched altitude\")\n",
+ " axes[1].plot(\n",
+ " *binned_median(tp_lat[mi, ji], y, edges),\n",
+ " color=color,\n",
+ " marker=\"o\",\n",
+ " ms=3,\n",
+ " label=label,\n",
+ " )\n",
+ "axes[1].set(\n",
+ " xlabel=\"Tangent point latitude (deg)\",\n",
+ " ylabel=\"TAT-C minus MLS (km)\",\n",
+ " title=\"Horizontal offset at matched altitude\",\n",
+ ")\n",
"for ax in axes:\n",
" ax.axhline(0, color=GRAY, lw=0.8)\n",
" ax.legend(frameon=False)\n",
@@ -742,7 +770,9 @@
" def minimize(offsets):\n",
" # offset (m) of minimum geodetic altitude among candidates (shape (N, K))\n",
" points = p[:, :, np.newaxis] + d[:, :, np.newaxis] * offsets\n",
- " altitudes = rectangular_to_geodetic(points.reshape(3, -1))[2].reshape(offsets.shape)\n",
+ " altitudes = rectangular_to_geodetic(points.reshape(3, -1))[2].reshape(\n",
+ " offsets.shape\n",
+ " )\n",
" return offsets[np.arange(len(offsets)), np.argmin(altitudes, axis=1)]\n",
"\n",
" coarse = minimize(np.tile(np.linspace(-1000e3, 1000e3, 401), (p.shape[1], 1)))\n",
@@ -755,8 +785,12 @@
" \"MLS OrbY, nominal (km)\": summarize(orb_y[nominal, :N_GHZ].ravel() / 1e3),\n",
" \"MLS tangency defect (km)\": summarize(\n",
" tangency_defect(\n",
- " sc_lon[mi, ji][sample], sc_lat[mi, ji][sample], sc_alt[mi, ji][sample],\n",
- " tp_lon[mi, ji][sample], tp_lat[mi, ji][sample], tp_alt[mi, ji][sample],\n",
+ " sc_lon[mi, ji][sample],\n",
+ " sc_lat[mi, ji][sample],\n",
+ " sc_alt[mi, ji][sample],\n",
+ " tp_lon[mi, ji][sample],\n",
+ " tp_lat[mi, ji][sample],\n",
+ " tp_alt[mi, ji][sample],\n",
" )\n",
" ),\n",
" }\n",
@@ -977,10 +1011,13 @@
"source": [
"day_idx = np.nonzero(in_day & nominal)[0]\n",
"example_elevations = sorted(\n",
- " pressure_to_altitude(p * 100) for p in [1000, 300, 100, 30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01]\n",
+ " pressure_to_altitude(p * 100)\n",
+ " for p in [1000, 300, 100, 30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01]\n",
")\n",
"configs = {\n",
- " \"example\": dict(scan_elevations=example_elevations, scan_duration=timedelta(seconds=25)),\n",
+ " \"example\": dict(\n",
+ " scan_elevations=example_elevations, scan_duration=timedelta(seconds=25)\n",
+ " ),\n",
" \"matched\": dict(\n",
" scan_elevations=list(np.linspace(alt_median[0], alt_median[top], 11)),\n",
" scan_duration=timedelta(seconds=float(elapsed_median[top])),\n",
@@ -1007,15 +1044,22 @@
"for name, config in configs.items():\n",
" dh, dt_same_alt, dz_same_time, profile = [], [], [], []\n",
" for i in subset:\n",
- " points = _sample_limb_scan(aura, maf_utc[i], 0.0, config[\"scan_elevations\"], config[\"scan_duration\"])\n",
+ " points = _sample_limb_scan(\n",
+ " aura, maf_utc[i], 0.0, config[\"scan_elevations\"], config[\"scan_duration\"]\n",
+ " )\n",
" t, a, la, lo, o = mls_scan(i)\n",
" for p in points:\n",
" elapsed = (p[\"time\"] - maf_utc[i]).total_seconds()\n",
" profile.append((elapsed, p[\"elevation\"] / 1e3))\n",
" if a.min() <= p[\"elevation\"] <= a.max():\n",
" dh.append(\n",
- " GEOD.inv(np.interp(p[\"elevation\"], a[o], lo[o]), np.interp(p[\"elevation\"], a[o], la[o]),\n",
- " p[\"longitude\"], p[\"latitude\"])[2] / 1e3\n",
+ " GEOD.inv(\n",
+ " np.interp(p[\"elevation\"], a[o], lo[o]),\n",
+ " np.interp(p[\"elevation\"], a[o], la[o]),\n",
+ " p[\"longitude\"],\n",
+ " p[\"latitude\"],\n",
+ " )[2]\n",
+ " / 1e3\n",
" )\n",
" dt_same_alt.append(elapsed - np.interp(p[\"elevation\"], a[o], t[o]))\n",
" if t.min() <= elapsed <= t.max():\n",
@@ -1030,9 +1074,18 @@
" t, a, la, lo, o = mls_scan(i)\n",
" z = row.position.z\n",
" position_dh.append(\n",
- " GEOD.inv(np.interp(z, a[o], lo[o]), np.interp(z, a[o], la[o]), row.position.x, row.position.y)[2] / 1e3\n",
+ " GEOD.inv(\n",
+ " np.interp(z, a[o], lo[o]),\n",
+ " np.interp(z, a[o], la[o]),\n",
+ " row.position.x,\n",
+ " row.position.y,\n",
+ " )[2]\n",
+ " / 1e3\n",
+ " )\n",
+ " position_dt.append(\n",
+ " (row.time.to_pydatetime() - maf_utc[i]).total_seconds()\n",
+ " - np.interp(z, a[o], t[o])\n",
" )\n",
- " position_dt.append((row.time.to_pydatetime() - maf_utc[i]).total_seconds() - np.interp(z, a[o], t[o]))\n",
" test3[name] = pd.DataFrame(\n",
" {\n",
" \"sample time offset at same altitude (s)\": summarize(dt_same_alt),\n",
@@ -1080,10 +1133,24 @@
"source": [
"fig, ax = plt.subplots(figsize=(5.5, 3.8))\n",
"ax.plot(elapsed_median, alt_median / 1e3, color=INK, lw=2, label=\"MLS (median scan)\")\n",
- "for name, color, label in [(\"example\", BLUE, \"TAT-C, example configuration\"), (\"matched\", ORANGE, \"TAT-C, matched configuration\")]:\n",
+ "for name, color, label in [\n",
+ " (\"example\", BLUE, \"TAT-C, example configuration\"),\n",
+ " (\"matched\", ORANGE, \"TAT-C, matched configuration\"),\n",
+ "]:\n",
" median_profile = np.median(profiles[name], axis=0)\n",
- " ax.plot(median_profile[:, 0], median_profile[:, 1], color=color, marker=\"o\", ms=4, label=label)\n",
- "ax.set(xlabel=\"Time since scan start (s)\", ylabel=\"Tangent point altitude (km)\", title=\"Vertical scan timing\")\n",
+ " ax.plot(\n",
+ " median_profile[:, 0],\n",
+ " median_profile[:, 1],\n",
+ " color=color,\n",
+ " marker=\"o\",\n",
+ " ms=4,\n",
+ " label=label,\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Time since scan start (s)\",\n",
+ " ylabel=\"Tangent point altitude (km)\",\n",
+ " title=\"Vertical scan timing\",\n",
+ ")\n",
"ax.legend(frameon=False)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1247,24 +1314,45 @@
"l2.set_auto_mask(False)\n",
"geo = l2[\"HDFEOS/SWATHS/Temperature/Geolocation Fields\"]\n",
"l2_time = np.array([tai_to_utc(x) for x in geo[\"Time\"][:]])\n",
- "l2_lat, l2_lon, l2_lst = (geo[v][:].astype(float) for v in [\"Latitude\", \"Longitude\", \"LocalSolarTime\"])\n",
- "keep = (np.abs(l2_lat) <= 90) & np.array([DAY0 <= t < DAY0 + timedelta(days=1) for t in l2_time])\n",
- "l2_time, l2_lat, l2_lon, l2_lst = l2_time[keep], l2_lat[keep], l2_lon[keep], l2_lst[keep]\n",
+ "l2_lat, l2_lon, l2_lst = (\n",
+ " geo[v][:].astype(float) for v in [\"Latitude\", \"Longitude\", \"LocalSolarTime\"]\n",
+ ")\n",
+ "keep = (np.abs(l2_lat) <= 90) & np.array(\n",
+ " [DAY0 <= t < DAY0 + timedelta(days=1) for t in l2_time]\n",
+ ")\n",
+ "l2_time, l2_lat, l2_lon, l2_lst = (\n",
+ " l2_time[keep],\n",
+ " l2_lat[keep],\n",
+ " l2_lon[keep],\n",
+ " l2_lst[keep],\n",
+ ")\n",
"l2_s = np.array([(t - DAY0).total_seconds() for t in l2_time])\n",
"\n",
- "times = [DAY0 + i * timedelta(seconds=25) for i in range(timedelta(days=1) // timedelta(seconds=25))]\n",
- "limb_obs = collect_limb_observations(aura, times, 0, example_elevations, timedelta(seconds=25))\n",
+ "times = [\n",
+ " DAY0 + i * timedelta(seconds=25)\n",
+ " for i in range(timedelta(days=1) // timedelta(seconds=25))\n",
+ "]\n",
+ "limb_obs = collect_limb_observations(\n",
+ " aura, times, 0, example_elevations, timedelta(seconds=25)\n",
+ ")\n",
"obs_s = np.array([(t.to_pydatetime() - DAY0).total_seconds() for t in limb_obs.time])\n",
"obs_lat = np.array([p.y for p in limb_obs.position])\n",
"obs_lon = np.array([p.x for p in limb_obs.position])\n",
"\n",
"dense_s = np.arange(obs_s[0], obs_s[-1], 1.0)\n",
"dense_lat = np.interp(dense_s, obs_s, obs_lat)\n",
- "dense_lon = (np.interp(dense_s, obs_s, np.unwrap(obs_lon, period=360)) + 180) % 360 - 180\n",
+ "dense_lon = (\n",
+ " np.interp(dense_s, obs_s, np.unwrap(obs_lon, period=360)) + 180\n",
+ ") % 360 - 180\n",
"nearest_km, nearest_s = [], []\n",
"for s, la, lo in zip(l2_s, l2_lat, l2_lon):\n",
" w = np.abs(dense_s - s) < 120\n",
- " dist = GEOD.inv(np.full(w.sum(), lo), np.full(w.sum(), la), dense_lon[w], dense_lat[w])[2] / 1e3\n",
+ " dist = (\n",
+ " GEOD.inv(\n",
+ " np.full(w.sum(), lo), np.full(w.sum(), la), dense_lon[w], dense_lat[w]\n",
+ " )[2]\n",
+ " / 1e3\n",
+ " )\n",
" k = np.argmin(dist)\n",
" nearest_km.append(dist[k])\n",
" nearest_s.append(dense_s[w][k] - s)\n",
@@ -1294,7 +1382,10 @@
").T\n",
"display(test4.round(2))\n",
"pd.DataFrame(\n",
- " {\"distance to TAT-C track (km)\": summarize(nearest_km), \"TAT-C time minus L2 time (s)\": summarize(nearest_s)}\n",
+ " {\n",
+ " \"distance to TAT-C track (km)\": summarize(nearest_km),\n",
+ " \"TAT-C time minus L2 time (s)\": summarize(nearest_s),\n",
+ " }\n",
").T.round(3)"
]
},
@@ -1334,22 +1425,49 @@
],
"source": [
"fig, axes = plt.subplots(\n",
- " 1, 2, figsize=(11, 3.6), gridspec_kw={\"width_ratios\": [1.6, 1]},\n",
+ " 1,\n",
+ " 2,\n",
+ " figsize=(11, 3.6),\n",
+ " gridspec_kw={\"width_ratios\": [1.6, 1]},\n",
")\n",
"axes[0].remove()\n",
"ax_map = fig.add_subplot(1, 2, 1, projection=ccrs.PlateCarree())\n",
"half = obs_s < 12 * 3600\n",
- "ax_map.scatter(obs_lon[half], obs_lat[half], s=8, color=BLUE, label=\"TAT-C positions\", transform=ccrs.PlateCarree())\n",
- "ax_map.scatter(l2_lon[l2_s < 12 * 3600], l2_lat[l2_s < 12 * 3600], s=2, color=INK, label=\"MLS Level 2 profiles\", transform=ccrs.PlateCarree())\n",
+ "ax_map.scatter(\n",
+ " obs_lon[half],\n",
+ " obs_lat[half],\n",
+ " s=8,\n",
+ " color=BLUE,\n",
+ " label=\"TAT-C positions\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
+ "ax_map.scatter(\n",
+ " l2_lon[l2_s < 12 * 3600],\n",
+ " l2_lat[l2_s < 12 * 3600],\n",
+ " s=2,\n",
+ " color=INK,\n",
+ " label=\"MLS Level 2 profiles\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
"ax_map.coastlines(color=GRAY, linewidth=0.5)\n",
"ax_map.set_global()\n",
"ax_map.set_title(\"Profile locations, 00:00-12:00 UTC\")\n",
"ax_map.legend(frameon=False, loc=\"upper center\", bbox_to_anchor=(0.5, -0.02), ncol=2)\n",
"bins = np.arange(-90, 91, 10)\n",
"centers = (bins[1:] + bins[:-1]) / 2\n",
- "axes[1].bar(centers - 2.1, np.histogram(l2_lat, bins)[0], width=4, color=INK, label=\"MLS Level 2\")\n",
- "axes[1].bar(centers + 2.1, np.histogram(obs_lat, bins)[0], width=4, color=BLUE, label=\"TAT-C\")\n",
- "axes[1].set(xlabel=\"Latitude (deg)\", ylabel=\"Profiles per day\", title=\"Daily latitude sampling\")\n",
+ "axes[1].bar(\n",
+ " centers - 2.1,\n",
+ " np.histogram(l2_lat, bins)[0],\n",
+ " width=4,\n",
+ " color=INK,\n",
+ " label=\"MLS Level 2\",\n",
+ ")\n",
+ "axes[1].bar(\n",
+ " centers + 2.1, np.histogram(obs_lat, bins)[0], width=4, color=BLUE, label=\"TAT-C\"\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Latitude (deg)\", ylabel=\"Profiles per day\", title=\"Daily latitude sampling\"\n",
+ ")\n",
"axes[1].grid(axis=\"x\", visible=False)\n",
"axes[1].legend(frameon=False, loc=\"upper center\", ncol=2)\n",
"fig.tight_layout()\n",
diff --git a/docs/validation/ValidateLimbSABER.ipynb b/docs/validation/ValidateLimbSABER.ipynb
index ab6ca31f..f40f6bc3 100644
--- a/docs/validation/ValidateLimbSABER.ipynb
+++ b/docs/validation/ValidateLimbSABER.ipynb
@@ -55,7 +55,8 @@
"DATA_DIR.mkdir(exist_ok=True)\n",
"SABER_URL = \"https://data.gats-inc.com/saber/Version2_0/Level2A/2026\"\n",
"saber_files = [\n",
- " DATA_DIR / f\"SABER_L2A_{2026263 if orbit_number == 134529 else 2026264}_{orbit_number}_02.08.nc\"\n",
+ " DATA_DIR\n",
+ " / f\"SABER_L2A_{2026263 if orbit_number == 134529 else 2026264}_{orbit_number}_02.08.nc\"\n",
" for orbit_number in range(134529, 134545)\n",
"]\n",
"for file in saber_files:\n",
@@ -277,12 +278,22 @@
}
],
"source": [
- "FIELDS = [\"time\", \"tpaltitude\", \"tplatitude\", \"tplongitude\", \"sclatitude\", \"sclongitude\", \"scaltitude\"]\n",
+ "FIELDS = [\n",
+ " \"time\",\n",
+ " \"tpaltitude\",\n",
+ " \"tplatitude\",\n",
+ " \"tplongitude\",\n",
+ " \"sclatitude\",\n",
+ " \"sclongitude\",\n",
+ " \"scaltitude\",\n",
+ "]\n",
"events = []\n",
"for file in saber_files:\n",
" ds = nc.Dataset(file)\n",
" ds.set_auto_mask(False)\n",
- " orbit_start_date = datetime.strptime(ds.Data_Start_Time[:7], \"%Y%j\").replace(tzinfo=timezone.utc)\n",
+ " orbit_start_date = datetime.strptime(ds.Data_Start_Time[:7], \"%Y%j\").replace(\n",
+ " tzinfo=timezone.utc\n",
+ " )\n",
" data = {name: ds[name][:] for name in FIELDS}\n",
" for e, mode in enumerate(ds[\"mode\"][:]):\n",
" ok = (\n",
@@ -295,7 +306,9 @@
" continue\n",
" order = np.argsort(data[\"time\"][e][ok])\n",
" event = {name: data[name][e][ok][order].astype(float) for name in FIELDS}\n",
- " event[\"datetime\"] = [orbit_start_date + timedelta(milliseconds=ms) for ms in event[\"time\"]]\n",
+ " event[\"datetime\"] = [\n",
+ " orbit_start_date + timedelta(milliseconds=ms) for ms in event[\"time\"]\n",
+ " ]\n",
" event[\"elapsed\"] = (event[\"time\"] - event[\"time\"][0]) / 1e3\n",
" event[\"upward\"] = bool(mode == 1)\n",
" event[\"northbound\"] = event[\"sclatitude\"][-1] > event[\"sclatitude\"][0]\n",
@@ -307,7 +320,10 @@
" \"\"\"Spacecraft ground track heading (deg) at sample i of an event.\"\"\"\n",
" j = min(i + 1, len(event[\"time\"]) - 1)\n",
" return GEOD.inv(\n",
- " event[\"sclongitude\"][j - 1], event[\"sclatitude\"][j - 1], event[\"sclongitude\"][j], event[\"sclatitude\"][j]\n",
+ " event[\"sclongitude\"][j - 1],\n",
+ " event[\"sclatitude\"][j - 1],\n",
+ " event[\"sclongitude\"][j],\n",
+ " event[\"sclatitude\"][j],\n",
" )[0]\n",
"\n",
"\n",
@@ -319,7 +335,13 @@
"mid = [len(e[\"time\"]) // 2 for e in events]\n",
"view_azimuth = np.array(\n",
" [\n",
- " GEOD.inv(e[\"sclongitude\"][m], e[\"sclatitude\"][m], e[\"tplongitude\"][m], e[\"tplatitude\"][m])[0] - heading(e, m)\n",
+ " GEOD.inv(\n",
+ " e[\"sclongitude\"][m],\n",
+ " e[\"sclatitude\"][m],\n",
+ " e[\"tplongitude\"][m],\n",
+ " e[\"tplatitude\"][m],\n",
+ " )[0]\n",
+ " - heading(e, m)\n",
" for e, m in zip(events, mid)\n",
" ]\n",
")\n",
@@ -332,8 +354,12 @@
" \"scan duration (s)\": np.median(durations),\n",
" \"scan bottom (km)\": np.median(bottoms),\n",
" \"scan top (km)\": np.median(tops),\n",
- " \"start spacing after an upward scan (s)\": np.median(np.diff(starts)[upward[:-1]]),\n",
- " \"start spacing after a downward scan (s)\": np.median(np.diff(starts)[~upward[:-1]]),\n",
+ " \"start spacing after an upward scan (s)\": np.median(\n",
+ " np.diff(starts)[upward[:-1]]\n",
+ " ),\n",
+ " \"start spacing after a downward scan (s)\": np.median(\n",
+ " np.diff(starts)[~upward[:-1]]\n",
+ " ),\n",
" \"tangent point azimuth from heading (deg)\": np.median(view_azimuth),\n",
" \"range of that azimuth (deg)\": np.ptp(view_azimuth),\n",
" }\n",
@@ -458,7 +484,9 @@
" {\n",
" \"along-track (km)\": summarize(along1),\n",
" \"cross-track (km)\": summarize(right1),\n",
- " \"altitude (km)\": summarize(g1.elevation.km - [e[\"scaltitude\"][m] for e, m in zip(events, mid)]),\n",
+ " \"altitude (km)\": summarize(\n",
+ " g1.elevation.km - [e[\"scaltitude\"][m] for e, m in zip(events, mid)]\n",
+ " ),\n",
" }\n",
").T\n",
"test1.round(3)"
@@ -603,10 +631,18 @@
"tp_p, in_domain = _limb_tangent_point(orbit.get_orbit_track(t2), 90.0, target)\n",
"g2 = wgs84.geographic_position_of(Geocentric(Distance(m=tp_p).au, None, ts2))\n",
"along2, right2 = along_right(\n",
- " ref_lon, ref_lat, g2.longitude.degrees, g2.latitude.degrees, np.array([heading(e, i) for e, i in samples])\n",
+ " ref_lon,\n",
+ " ref_lat,\n",
+ " g2.longitude.degrees,\n",
+ " g2.latitude.degrees,\n",
+ " np.array([heading(e, i) for e, i in samples]),\n",
")\n",
"d_north = (g2.latitude.degrees - ref_lat) * 111.2\n",
- "d_east = ((g2.longitude.degrees - ref_lon + 180) % 360 - 180) * 111.2 * np.cos(np.radians(ref_lat))\n",
+ "d_east = (\n",
+ " ((g2.longitude.degrees - ref_lon + 180) % 360 - 180)\n",
+ " * 111.2\n",
+ " * np.cos(np.radians(ref_lat))\n",
+ ")\n",
"test2 = pd.DataFrame(\n",
" {\n",
" \"altitude error (km)\": summarize((g2.elevation.m - target) / 1e3),\n",
@@ -655,9 +691,24 @@
"source": [
"edges = np.arange(-60, 91, 10)\n",
"fig, axes = plt.subplots(1, 2, figsize=(10, 3.6), sharey=True)\n",
- "for ax, mask, title in [(axes[0], northbound, \"Ascending passes\"), (axes[1], ~northbound, \"Descending passes\")]:\n",
- " ax.plot(*binned_median(ref_lat[mask], d_east[mask], edges), color=BLUE, marker=\"o\", ms=4, label=\"Eastward\")\n",
- " ax.plot(*binned_median(ref_lat[mask], d_north[mask], edges), color=ORANGE, marker=\"o\", ms=4, label=\"Northward\")\n",
+ "for ax, mask, title in [\n",
+ " (axes[0], northbound, \"Ascending passes\"),\n",
+ " (axes[1], ~northbound, \"Descending passes\"),\n",
+ "]:\n",
+ " ax.plot(\n",
+ " *binned_median(ref_lat[mask], d_east[mask], edges),\n",
+ " color=BLUE,\n",
+ " marker=\"o\",\n",
+ " ms=4,\n",
+ " label=\"Eastward\",\n",
+ " )\n",
+ " ax.plot(\n",
+ " *binned_median(ref_lat[mask], d_north[mask], edges),\n",
+ " color=ORANGE,\n",
+ " marker=\"o\",\n",
+ " ms=4,\n",
+ " label=\"Northward\",\n",
+ " )\n",
" ax.axhline(0, color=GRAY, lw=0.8)\n",
" ax.set(xlabel=\"Tangent point latitude (deg)\", title=title)\n",
" ax.legend(frameon=False)\n",
@@ -781,7 +832,9 @@
" def minimize(offsets):\n",
" # offset (m) of minimum geodetic altitude among candidates (shape (N, K))\n",
" points = p[:, :, np.newaxis] + d[:, :, np.newaxis] * offsets\n",
- " altitudes = rectangular_to_geodetic(points.reshape(3, -1))[2].reshape(offsets.shape)\n",
+ " altitudes = rectangular_to_geodetic(points.reshape(3, -1))[2].reshape(\n",
+ " offsets.shape\n",
+ " )\n",
" return offsets[np.arange(len(offsets)), np.argmin(altitudes, axis=1)]\n",
"\n",
" coarse = minimize(np.tile(np.linspace(-1000e3, 1000e3, 401), (p.shape[1], 1)))\n",
@@ -790,9 +843,15 @@
"\n",
"check = samples[::5]\n",
"defect = tangency_defect(\n",
- " *(np.array([e[name][i] for e, i in check]) for name in [\"sclongitude\", \"sclatitude\"]),\n",
+ " *(\n",
+ " np.array([e[name][i] for e, i in check])\n",
+ " for name in [\"sclongitude\", \"sclatitude\"]\n",
+ " ),\n",
" np.array([e[\"scaltitude\"][i] * 1e3 for e, i in check]),\n",
- " *(np.array([e[name][i] for e, i in check]) for name in [\"tplongitude\", \"tplatitude\"]),\n",
+ " *(\n",
+ " np.array([e[name][i] for e, i in check])\n",
+ " for name in [\"tplongitude\", \"tplatitude\"]\n",
+ " ),\n",
" np.array([e[\"tpaltitude\"][i] * 1e3 for e, i in check]),\n",
")\n",
"check_alt = np.array([e[\"tpaltitude\"][i] for e, i in check])\n",
@@ -950,13 +1009,16 @@
"TO_GEODETIC = Transformer.from_crs(\"EPSG:4978\", \"EPSG:4979\", always_xy=True)\n",
"precession = compute_precession(ts2[len(ts2) // 2].tdb)\n",
"# small-angle rotation vector (rad) of the precession since J2000\n",
- "w = np.array(\n",
- " [\n",
- " precession[2, 1] - precession[1, 2],\n",
- " precession[0, 2] - precession[2, 0],\n",
- " precession[1, 0] - precession[0, 1],\n",
- " ]\n",
- ") / 2\n",
+ "w = (\n",
+ " np.array(\n",
+ " [\n",
+ " precession[2, 1] - precession[1, 2],\n",
+ " precession[0, 2] - precession[2, 0],\n",
+ " precession[1, 0] - precession[0, 1],\n",
+ " ]\n",
+ " )\n",
+ " / 2\n",
+ ")\n",
"print(f\"precession rotation vector (deg): {np.degrees(w).round(3)}\")\n",
"\n",
"\n",
@@ -970,16 +1032,27 @@
"\n",
"fix_lon, fix_lat, fix_alt = remove_precession(ref_lon, ref_lat, target, ts2)\n",
"fixed_defect = tangency_defect(\n",
- " *(np.array([e[name][i] for e, i in check]) for name in [\"sclongitude\", \"sclatitude\"]),\n",
+ " *(\n",
+ " np.array([e[name][i] for e, i in check])\n",
+ " for name in [\"sclongitude\", \"sclatitude\"]\n",
+ " ),\n",
" np.array([e[\"scaltitude\"][i] * 1e3 for e, i in check]),\n",
" fix_lon[::5],\n",
" fix_lat[::5],\n",
" fix_alt[::5],\n",
")\n",
"along2f, right2f = along_right(\n",
- " fix_lon, fix_lat, g2.longitude.degrees, g2.latitude.degrees, np.array([heading(e, i) for e, i in samples])\n",
+ " fix_lon,\n",
+ " fix_lat,\n",
+ " g2.longitude.degrees,\n",
+ " g2.latitude.degrees,\n",
+ " np.array([heading(e, i) for e, i in samples]),\n",
+ ")\n",
+ "d_east_f = (\n",
+ " ((g2.longitude.degrees - fix_lon + 180) % 360 - 180)\n",
+ " * 111.2\n",
+ " * np.cos(np.radians(fix_lat))\n",
")\n",
- "d_east_f = ((g2.longitude.degrees - fix_lon + 180) % 360 - 180) * 111.2 * np.cos(np.radians(fix_lat))\n",
"d_north_f = (g2.latitude.degrees - fix_lat) * 111.2\n",
"pd.DataFrame(\n",
" {\n",
@@ -1165,7 +1238,9 @@
"test3, profiles = {}, {}\n",
"for direction in [ScanDirection.UPWARD, ScanDirection.DOWNWARD]:\n",
" dh, dt_same_alt, dz_same_time, profile = [], [], [], []\n",
- " selected = [e for e in events if e[\"upward\"] == (direction == ScanDirection.UPWARD)][::4]\n",
+ " selected = [\n",
+ " e for e in events if e[\"upward\"] == (direction == ScanDirection.UPWARD)\n",
+ " ][::4]\n",
" for e in selected:\n",
" points = _sample_limb_scan(\n",
" timed,\n",
@@ -1182,12 +1257,21 @@
" profile.append((elapsed, p[\"elevation\"] / 1e3))\n",
" if a.min() <= p[\"elevation\"] <= a.max():\n",
" dh.append(\n",
- " GEOD.inv(np.interp(p[\"elevation\"], a[o], lon[o]), np.interp(p[\"elevation\"], a[o], e[\"tplatitude\"][o]),\n",
- " p[\"longitude\"], p[\"latitude\"])[2] / 1e3\n",
+ " GEOD.inv(\n",
+ " np.interp(p[\"elevation\"], a[o], lon[o]),\n",
+ " np.interp(p[\"elevation\"], a[o], e[\"tplatitude\"][o]),\n",
+ " p[\"longitude\"],\n",
+ " p[\"latitude\"],\n",
+ " )[2]\n",
+ " / 1e3\n",
+ " )\n",
+ " dt_same_alt.append(\n",
+ " elapsed - np.interp(p[\"elevation\"], a[o], e[\"elapsed\"][o])\n",
" )\n",
- " dt_same_alt.append(elapsed - np.interp(p[\"elevation\"], a[o], e[\"elapsed\"][o]))\n",
" if e[\"elapsed\"][0] <= elapsed <= e[\"elapsed\"][-1]:\n",
- " dz_same_time.append((p[\"elevation\"] - np.interp(elapsed, e[\"elapsed\"], a)) / 1e3)\n",
+ " dz_same_time.append(\n",
+ " (p[\"elevation\"] - np.interp(elapsed, e[\"elapsed\"], a)) / 1e3\n",
+ " )\n",
" profiles[direction.value] = np.array(profile).reshape(len(selected), -1, 2)\n",
" test3[direction.value] = pd.DataFrame(\n",
" {\n",
@@ -1236,12 +1320,30 @@
"grid = np.linspace(0, np.median(durations), 50)\n",
"for up, color, label in [(True, BLUE, \"upward\"), (False, ORANGE, \"downward\")]:\n",
" measured = np.median(\n",
- " [np.interp(grid, e[\"elapsed\"], e[\"tpaltitude\"]) for e in events if e[\"upward\"] == up], axis=0\n",
+ " [\n",
+ " np.interp(grid, e[\"elapsed\"], e[\"tpaltitude\"])\n",
+ " for e in events\n",
+ " if e[\"upward\"] == up\n",
+ " ],\n",
+ " axis=0,\n",
" )\n",
" ax.plot(grid, measured, color=color, lw=2, label=f\"SABER, {label} (median)\")\n",
" simulated = np.median(profiles[label], axis=0)\n",
- " ax.plot(simulated[:, 0], simulated[:, 1], color=color, lw=0, marker=\"o\", ms=5, mfc=\"white\", label=f\"TAT-C, {label}\")\n",
- "ax.set(xlabel=\"Time since scan start (s)\", ylabel=\"Tangent point altitude (km)\", title=\"Vertical scan timing\")\n",
+ " ax.plot(\n",
+ " simulated[:, 0],\n",
+ " simulated[:, 1],\n",
+ " color=color,\n",
+ " lw=0,\n",
+ " marker=\"o\",\n",
+ " ms=5,\n",
+ " mfc=\"white\",\n",
+ " label=f\"TAT-C, {label}\",\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Time since scan start (s)\",\n",
+ " ylabel=\"Tangent point altitude (km)\",\n",
+ " title=\"Vertical scan timing\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1402,8 +1504,17 @@
" t += gap_after_down\n",
"limb_obs = pd.concat(\n",
" [\n",
- " collect_limb_observations(timed, up_times, 90.0, scan_elevations, scan_duration, ScanDirection.UPWARD),\n",
- " collect_limb_observations(timed, down_times, 90.0, scan_elevations, scan_duration, ScanDirection.DOWNWARD),\n",
+ " collect_limb_observations(\n",
+ " timed, up_times, 90.0, scan_elevations, scan_duration, ScanDirection.UPWARD\n",
+ " ),\n",
+ " collect_limb_observations(\n",
+ " timed,\n",
+ " down_times,\n",
+ " 90.0,\n",
+ " scan_elevations,\n",
+ " scan_duration,\n",
+ " ScanDirection.DOWNWARD,\n",
+ " ),\n",
" ]\n",
").sort_values(\"time\", ignore_index=True)\n",
"sample_elevation = (min(scan_elevations) + max(scan_elevations)) / 2\n",
@@ -1417,19 +1528,35 @@
" a = e[\"tpaltitude\"] * 1e3\n",
" o = np.argsort(a)\n",
" if a.min() <= sample_elevation <= a.max():\n",
- " ref_s.append((e[\"datetime\"][0] - DAY0).total_seconds() + np.interp(sample_elevation, a[o], e[\"elapsed\"][o]))\n",
+ " ref_s.append(\n",
+ " (e[\"datetime\"][0] - DAY0).total_seconds()\n",
+ " + np.interp(sample_elevation, a[o], e[\"elapsed\"][o])\n",
+ " )\n",
" ref_lat4.append(np.interp(sample_elevation, a[o], e[\"tplatitude\"][o]))\n",
- " ref_lon4.append(np.interp(sample_elevation, a[o], np.unwrap(e[\"tplongitude\"], period=360)[o]))\n",
+ " ref_lon4.append(\n",
+ " np.interp(\n",
+ " sample_elevation, a[o], np.unwrap(e[\"tplongitude\"], period=360)[o]\n",
+ " )\n",
+ " )\n",
"ref_s, ref_lat4 = np.array(ref_s), np.array(ref_lat4)\n",
"ref_lon4 = (np.array(ref_lon4) + 180) % 360 - 180\n",
"\n",
"dense_s = np.arange(obs_s[0], obs_s[-1], 1.0)\n",
"dense_lat = np.interp(dense_s, obs_s, obs_lat)\n",
- "dense_lon = (np.interp(dense_s, obs_s, np.unwrap(obs_lon, period=360)) + 180) % 360 - 180\n",
+ "dense_lon = (\n",
+ " np.interp(dense_s, obs_s, np.unwrap(obs_lon, period=360)) + 180\n",
+ ") % 360 - 180\n",
"nearest_km = []\n",
"for s, la, lo in zip(ref_s, ref_lat4, ref_lon4):\n",
" w = np.abs(dense_s - s) < 300\n",
- " nearest_km.append(np.min(GEOD.inv(np.full(w.sum(), lo), np.full(w.sum(), la), dense_lon[w], dense_lat[w])[2]) / 1e3)\n",
+ " nearest_km.append(\n",
+ " np.min(\n",
+ " GEOD.inv(\n",
+ " np.full(w.sum(), lo), np.full(w.sum(), la), dense_lon[w], dense_lat[w]\n",
+ " )[2]\n",
+ " )\n",
+ " / 1e3\n",
+ " )\n",
"\n",
"\n",
"def equator_lst(seconds, lat, lon, ascending):\n",
@@ -1482,21 +1609,45 @@
}
],
"source": [
- "fig, axes = plt.subplots(1, 2, figsize=(11, 3.6), gridspec_kw={\"width_ratios\": [1.6, 1]})\n",
+ "fig, axes = plt.subplots(\n",
+ " 1, 2, figsize=(11, 3.6), gridspec_kw={\"width_ratios\": [1.6, 1]}\n",
+ ")\n",
"axes[0].remove()\n",
"ax_map = fig.add_subplot(1, 2, 1, projection=ccrs.PlateCarree())\n",
"half = obs_s < 12 * 3600\n",
- "ax_map.scatter(obs_lon[half], obs_lat[half], s=10, color=BLUE, label=\"TAT-C positions\", transform=ccrs.PlateCarree())\n",
- "ax_map.scatter(ref_lon4[ref_s < 12 * 3600], ref_lat4[ref_s < 12 * 3600], s=3, color=INK, label=\"SABER profiles\", transform=ccrs.PlateCarree())\n",
+ "ax_map.scatter(\n",
+ " obs_lon[half],\n",
+ " obs_lat[half],\n",
+ " s=10,\n",
+ " color=BLUE,\n",
+ " label=\"TAT-C positions\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
+ "ax_map.scatter(\n",
+ " ref_lon4[ref_s < 12 * 3600],\n",
+ " ref_lat4[ref_s < 12 * 3600],\n",
+ " s=3,\n",
+ " color=INK,\n",
+ " label=\"SABER profiles\",\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
"ax_map.coastlines(color=GRAY, linewidth=0.5)\n",
"ax_map.set_global()\n",
- "ax_map.set_title(f\"Profile locations at {sample_elevation / 1e3:.0f} km, 00:00-12:00 UTC\")\n",
+ "ax_map.set_title(\n",
+ " f\"Profile locations at {sample_elevation / 1e3:.0f} km, 00:00-12:00 UTC\"\n",
+ ")\n",
"ax_map.legend(frameon=False, loc=\"upper center\", bbox_to_anchor=(0.5, -0.02), ncol=2)\n",
"bins = np.arange(-90, 91, 10)\n",
"centers = (bins[1:] + bins[:-1]) / 2\n",
- "axes[1].bar(centers - 2.1, np.histogram(ref_lat4, bins)[0], width=4, color=INK, label=\"SABER\")\n",
- "axes[1].bar(centers + 2.1, np.histogram(obs_lat, bins)[0], width=4, color=BLUE, label=\"TAT-C\")\n",
- "axes[1].set(xlabel=\"Latitude (deg)\", ylabel=\"Profiles per day\", title=\"Daily latitude sampling\")\n",
+ "axes[1].bar(\n",
+ " centers - 2.1, np.histogram(ref_lat4, bins)[0], width=4, color=INK, label=\"SABER\"\n",
+ ")\n",
+ "axes[1].bar(\n",
+ " centers + 2.1, np.histogram(obs_lat, bins)[0], width=4, color=BLUE, label=\"TAT-C\"\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Latitude (deg)\", ylabel=\"Profiles per day\", title=\"Daily latitude sampling\"\n",
+ ")\n",
"axes[1].grid(axis=\"x\", visible=False)\n",
"axes[1].legend(frameon=False, loc=\"upper left\")\n",
"fig.tight_layout()\n",
diff --git a/docs/validation/ValidateMaintainedOrbitLandsat9.ipynb b/docs/validation/ValidateMaintainedOrbitLandsat9.ipynb
index c2d60def..34bf3f88 100644
--- a/docs/validation/ValidateMaintainedOrbitLandsat9.ipynb
+++ b/docs/validation/ValidateMaintainedOrbitLandsat9.ipynb
@@ -75,27 +75,61 @@
"\n",
"HISTORY_FILE = Path(\"data\") / \"orbits\" / \"landsat9_gp_history.tle\"\n",
"if not HISTORY_FILE.exists():\n",
- " raise FileNotFoundError(f\"Save the Landsat 9 TLE history from Space-Track.org as {HISTORY_FILE} (see above).\")\n",
- "lines = [line.rstrip() for line in HISTORY_FILE.read_text().splitlines() if line.strip()]\n",
+ " raise FileNotFoundError(\n",
+ " f\"Save the Landsat 9 TLE history from Space-Track.org as {HISTORY_FILE} (see above).\"\n",
+ " )\n",
+ "lines = [\n",
+ " line.rstrip() for line in HISTORY_FILE.read_text().splitlines() if line.strip()\n",
+ "]\n",
"tles = [lines[i + 1 : i + 3] for i in range(0, len(lines), 3)]\n",
"rows = []\n",
"for tle in tles:\n",
" satrec = Satrec.twoline2rv(*tle)\n",
" rows.append(\n",
" {\n",
- " \"epoch\": pd.Timestamp(satrec.jdsatepoch + satrec.jdsatepochF - 2440587.5, unit=\"D\", tz=\"UTC\"),\n",
+ " \"epoch\": pd.Timestamp(\n",
+ " satrec.jdsatepoch + satrec.jdsatepochF - 2440587.5, unit=\"D\", tz=\"UTC\"\n",
+ " ),\n",
" \"semimajor axis (km)\": satrec.a * satrec.radiusearthkm,\n",
" \"inclination (deg)\": np.degrees(satrec.inclo),\n",
" }\n",
" )\n",
"history = pd.DataFrame(rows)\n",
- "history = history.assign(tle=tles).drop_duplicates(\"epoch\").sort_values(\"epoch\").reset_index(drop=True)\n",
+ "history = (\n",
+ " history.assign(tle=tles)\n",
+ " .drop_duplicates(\"epoch\")\n",
+ " .sort_values(\"epoch\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
"orbits = [GeneralPerturbationsOrbit.from_tle(tle) for tle in history.tle]\n",
"START, END = history.epoch.iloc[0], history.epoch.iloc[-1]\n",
"first = history.tle.iloc[0]\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
- "pd.Series({\"TLEs\": len(tles), \"unique epochs\": len(history), \"first epoch\": f\"{START:%Y-%m-%d %H:%M}\", \"last epoch\": f\"{END:%Y-%m-%d %H:%M}\", \"median interval (h)\": history.epoch.diff().median() / pd.Timedelta(hours=1)})"
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
+ "pd.Series(\n",
+ " {\n",
+ " \"TLEs\": len(tles),\n",
+ " \"unique epochs\": len(history),\n",
+ " \"first epoch\": f\"{START:%Y-%m-%d %H:%M}\",\n",
+ " \"last epoch\": f\"{END:%Y-%m-%d %H:%M}\",\n",
+ " \"median interval (h)\": history.epoch.diff().median() / pd.Timedelta(hours=1),\n",
+ " }\n",
+ ")"
]
},
{
@@ -154,29 +188,66 @@
"\n",
"def ltan(time, longitude):\n",
" \"\"\"Local mean solar time (h) of a crossing.\"\"\"\n",
- " return (time.hour + time.minute / 60 + (time.second + time.microsecond / 1e6) / 3600 + longitude / 15) % 24\n",
+ " return (\n",
+ " time.hour\n",
+ " + time.minute / 60\n",
+ " + (time.second + time.microsecond / 1e6) / 3600\n",
+ " + longitude / 15\n",
+ " ) % 24\n",
"\n",
"\n",
"# reference crossings: one per day, from the TLE closest to noon\n",
- "days = pd.date_range(START.normalize() + pd.Timedelta(days=1), END.normalize(), freq=\"D\", tz=\"UTC\")\n",
- "reference = sorted({int(np.argmin(np.abs((history.epoch - (d + pd.Timedelta(hours=12))).dt.total_seconds()))) for d in days})\n",
+ "days = pd.date_range(\n",
+ " START.normalize() + pd.Timedelta(days=1), END.normalize(), freq=\"D\", tz=\"UTC\"\n",
+ ")\n",
+ "reference = sorted(\n",
+ " {\n",
+ " int(\n",
+ " np.argmin(\n",
+ " np.abs(\n",
+ " (history.epoch - (d + pd.Timedelta(hours=12))).dt.total_seconds()\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ " for d in days\n",
+ " }\n",
+ ")\n",
"nodes = []\n",
"for i in reference:\n",
- " time, longitude = ascending_node(orbits[i], (history.epoch[i] + pd.Timedelta(minutes=50)).floor(\"us\").to_pydatetime())\n",
- " nodes.append({\"time\": time, \"longitude\": longitude, \"LTAN (h)\": ltan(time, longitude)})\n",
+ " time, longitude = ascending_node(\n",
+ " orbits[i],\n",
+ " (history.epoch[i] + pd.Timedelta(minutes=50)).floor(\"us\").to_pydatetime(),\n",
+ " )\n",
+ " nodes.append(\n",
+ " {\"time\": time, \"longitude\": longitude, \"LTAN (h)\": ltan(time, longitude)}\n",
+ " )\n",
"nodes = pd.DataFrame(nodes)\n",
"nodes[\"elapsed (days)\"] = (pd.to_datetime(nodes.time) - START) / pd.Timedelta(days=1)\n",
"\n",
- "daily = history.set_index(\"epoch\")[[\"semimajor axis (km)\", \"inclination (deg)\"]].resample(\"D\").median().dropna()\n",
+ "daily = (\n",
+ " history.set_index(\"epoch\")[[\"semimajor axis (km)\", \"inclination (deg)\"]]\n",
+ " .resample(\"D\")\n",
+ " .median()\n",
+ " .dropna()\n",
+ ")\n",
"burns = daily[daily[\"semimajor axis (km)\"].diff() > 0.030]\n",
"inclination_maneuvers = daily[daily[\"inclination (deg)\"].diff().abs() > 0.01]\n",
- "drift = daily[\"inclination (deg)\"].diff()[daily[\"inclination (deg)\"].diff().abs() < 0.005].mean() * 365.25\n",
+ "drift = (\n",
+ " daily[\"inclination (deg)\"]\n",
+ " .diff()[daily[\"inclination (deg)\"].diff().abs() < 0.005]\n",
+ " .mean()\n",
+ " * 365.25\n",
+ ")\n",
"pd.Series(\n",
" {\n",
" \"semimajor axis, range (km)\": f\"{history['semimajor axis (km)'].min():.3f} to {history['semimajor axis (km)'].max():.3f}\",\n",
" \"semimajor axis maneuvers (daily increase > 30 m)\": len(burns),\n",
- " \"semimajor axis maneuvers, median increase (m)\": 1e3 * daily[\"semimajor axis (km)\"].diff()[burns.index].median(),\n",
- " \"inclination maneuvers\": \", \".join(f\"{t:%Y-%m-%d} ({daily['inclination (deg)'].diff()[t]:+.3f} deg)\" for t in inclination_maneuvers.index),\n",
+ " \"semimajor axis maneuvers, median increase (m)\": 1e3\n",
+ " * daily[\"semimajor axis (km)\"].diff()[burns.index].median(),\n",
+ " \"inclination maneuvers\": \", \".join(\n",
+ " f\"{t:%Y-%m-%d} ({daily['inclination (deg)'].diff()[t]:+.3f} deg)\"\n",
+ " for t in inclination_maneuvers.index\n",
+ " ),\n",
" \"inclination drift between maneuvers (deg/yr)\": drift,\n",
" \"LTAN, range (minutes after 22:00)\": f\"{(nodes['LTAN (h)'].min() - 22) * 60:.2f} to {(nodes['LTAN (h)'].max() - 22) * 60:.2f}\",\n",
" }\n",
@@ -209,12 +280,21 @@
],
"source": [
"fig, axes = plt.subplots(1, 3, figsize=(15, 3.6))\n",
- "axes[0].plot(history.epoch, history[\"semimajor axis (km)\"] - 7077, \".\", ms=1.5, color=BLUE)\n",
- "axes[0].set(ylabel=\"Semimajor axis minus 7,077 km (km)\", title=\"Mean semimajor axis (drag and maneuvers)\")\n",
+ "axes[0].plot(\n",
+ " history.epoch, history[\"semimajor axis (km)\"] - 7077, \".\", ms=1.5, color=BLUE\n",
+ ")\n",
+ "axes[0].set(\n",
+ " ylabel=\"Semimajor axis minus 7,077 km (km)\",\n",
+ " title=\"Mean semimajor axis (drag and maneuvers)\",\n",
+ ")\n",
"axes[1].plot(history.epoch, history[\"inclination (deg)\"], \".\", ms=1.5, color=ORANGE)\n",
"axes[1].set(ylabel=\"Inclination (deg)\", title=\"Mean inclination\")\n",
- "axes[2].plot(pd.to_datetime(nodes.time), nodes[\"LTAN (h)\"] * 60 - 22 * 60, \".\", ms=2, color=AQUA)\n",
- "axes[2].set(ylabel=\"Minutes after 22:00\", title=\"Local mean solar time of ascending node\")\n",
+ "axes[2].plot(\n",
+ " pd.to_datetime(nodes.time), nodes[\"LTAN (h)\"] * 60 - 22 * 60, \".\", ms=2, color=AQUA\n",
+ ")\n",
+ "axes[2].set(\n",
+ " ylabel=\"Minutes after 22:00\", title=\"Local mean solar time of ascending node\"\n",
+ ")\n",
"for ax in axes:\n",
" ax.tick_params(axis=\"x\", rotation=30)\n",
"fig.tight_layout()\n",
@@ -461,32 +541,67 @@
"import warnings\n",
"\n",
"# the SGP4 models propagate the first TLE directly, with drag, for 19 months on purpose\n",
- "warnings.filterwarnings(\"ignore\", message=\"Propagating general perturbations elements with drag\")\n",
+ "warnings.filterwarnings(\n",
+ " \"ignore\", message=\"Propagating general perturbations elements with drag\"\n",
+ ")\n",
"models = {\n",
" \"SGP4\": GeneralPerturbationsOrbit.from_tle(first),\n",
" \"SGP4 without drag\": GeneralPerturbationsOrbit.from_tle(first, remove_drag=True),\n",
- " \"detected repeat cycle\": GeneralPerturbationsOrbit.from_tle(first, remove_drag=True, repeat_cycle=\"auto\"),\n",
- " \"declared repeat cycle\": GeneralPerturbationsOrbit.from_tle(first, remove_drag=True, repeat_cycle=timedelta(days=16)),\n",
+ " \"detected repeat cycle\": GeneralPerturbationsOrbit.from_tle(\n",
+ " first, remove_drag=True, repeat_cycle=\"auto\"\n",
+ " ),\n",
+ " \"declared repeat cycle\": GeneralPerturbationsOrbit.from_tle(\n",
+ " first, remove_drag=True, repeat_cycle=timedelta(days=16)\n",
+ " ),\n",
"}\n",
"period = orbits[0].get_orbit_period().total_seconds()\n",
"for name, orbit in models.items():\n",
" offsets = []\n",
- " for reference_time, reference_longitude, reference_ltan in zip(nodes.time, nodes.longitude, nodes[\"LTAN (h)\"]):\n",
+ " for reference_time, reference_longitude, reference_ltan in zip(\n",
+ " nodes.time, nodes.longitude, nodes[\"LTAN (h)\"]\n",
+ " ):\n",
" time, longitude = ascending_node(orbit, reference_time)\n",
- " offsets.append(((time - reference_time).total_seconds(), ((longitude - reference_longitude + 180) % 360 - 180) * 111.32, (ltan(time, longitude) - reference_ltan) * 60))\n",
+ " offsets.append(\n",
+ " (\n",
+ " (time - reference_time).total_seconds(),\n",
+ " ((longitude - reference_longitude + 180) % 360 - 180) * 111.32,\n",
+ " (ltan(time, longitude) - reference_ltan) * 60,\n",
+ " )\n",
+ " )\n",
" offsets = np.array(offsets)\n",
" valid = np.abs(offsets[:, 0]) < period / 2 - 60\n",
" nodes[f\"{name}: time (s)\"] = np.where(valid, offsets[:, 0], np.nan)\n",
" nodes[f\"{name}: ground track (km)\"] = np.where(valid, offsets[:, 1], np.nan)\n",
" nodes[f\"{name}: LTAN (min)\"] = np.where(valid, offsets[:, 2], np.nan)\n",
- "print(\"repeat cycles:\", {name: str(orbit.get_repeat_cycle()) for name, orbit in models.items() if orbit.repeat_cycle is not None})\n",
- "bins = pd.cut(nodes[\"elapsed (days)\"], [0, 30, 91, 182, 365, 600], labels=[\"first month\", \"1 to 3 months\", \"3 to 6 months\", \"6 to 12 months\", \"12 to 19 months\"])\n",
+ "print(\n",
+ " \"repeat cycles:\",\n",
+ " {\n",
+ " name: str(orbit.get_repeat_cycle())\n",
+ " for name, orbit in models.items()\n",
+ " if orbit.repeat_cycle is not None\n",
+ " },\n",
+ ")\n",
+ "bins = pd.cut(\n",
+ " nodes[\"elapsed (days)\"],\n",
+ " [0, 30, 91, 182, 365, 600],\n",
+ " labels=[\n",
+ " \"first month\",\n",
+ " \"1 to 3 months\",\n",
+ " \"3 to 6 months\",\n",
+ " \"6 to 12 months\",\n",
+ " \"12 to 19 months\",\n",
+ " ],\n",
+ ")\n",
"table2 = {}\n",
"for name in models:\n",
" for quantity in [\"time (s)\", \"ground track (km)\"]:\n",
" column = nodes[f\"{name}: {quantity}\"]\n",
- " table2[(name, f\"{quantity}, max |x|\")] = column.abs().groupby(bins, observed=False).max()\n",
- " table2[(name, \"excluded (%)\")] = 100 * column.isna().groupby(bins, observed=False).mean()\n",
+ " table2[(name, f\"{quantity}, max |x|\")] = (\n",
+ " column.abs().groupby(bins, observed=False).max()\n",
+ " )\n",
+ " table2[(name, \"excluded (%)\")] = (\n",
+ " 100 * column.isna().groupby(bins, observed=False).mean()\n",
+ " )\n",
"pd.DataFrame(table2).T.round(1)"
]
},
@@ -518,12 +633,48 @@
"fig, axes = plt.subplots(1, 3, figsize=(15, 3.6))\n",
"colors = dict(zip(models, [GRAY, PURPLE, BLUE, ORANGE]))\n",
"for name in models:\n",
- " axes[0].plot(nodes[\"elapsed (days)\"], nodes[f\"{name}: time (s)\"], \".\", ms=2, color=colors[name], label=name)\n",
- " axes[1].plot(nodes[\"elapsed (days)\"], nodes[f\"{name}: ground track (km)\"], \".\", ms=2, color=colors[name])\n",
- " axes[2].plot(nodes[\"elapsed (days)\"], nodes[f\"{name}: LTAN (min)\"], \".\", ms=2, color=colors[name])\n",
- "axes[0].set(xlabel=\"Days since first TLE\", ylabel=\"TAT-C minus Landsat 9 (s)\", title=\"Ascending node time\", yscale=\"symlog\", ylim=(-3000, 3000))\n",
- "axes[1].set(xlabel=\"Days since first TLE\", ylabel=\"TAT-C minus Landsat 9 (km)\", title=\"Ascending node longitude (at the equator)\", yscale=\"symlog\", ylim=(-2000, 2000))\n",
- "axes[2].set(xlabel=\"Days since first TLE\", ylabel=\"TAT-C minus Landsat 9 (min)\", title=\"LTAN\", ylim=(-6, 6))\n",
+ " axes[0].plot(\n",
+ " nodes[\"elapsed (days)\"],\n",
+ " nodes[f\"{name}: time (s)\"],\n",
+ " \".\",\n",
+ " ms=2,\n",
+ " color=colors[name],\n",
+ " label=name,\n",
+ " )\n",
+ " axes[1].plot(\n",
+ " nodes[\"elapsed (days)\"],\n",
+ " nodes[f\"{name}: ground track (km)\"],\n",
+ " \".\",\n",
+ " ms=2,\n",
+ " color=colors[name],\n",
+ " )\n",
+ " axes[2].plot(\n",
+ " nodes[\"elapsed (days)\"],\n",
+ " nodes[f\"{name}: LTAN (min)\"],\n",
+ " \".\",\n",
+ " ms=2,\n",
+ " color=colors[name],\n",
+ " )\n",
+ "axes[0].set(\n",
+ " xlabel=\"Days since first TLE\",\n",
+ " ylabel=\"TAT-C minus Landsat 9 (s)\",\n",
+ " title=\"Ascending node time\",\n",
+ " yscale=\"symlog\",\n",
+ " ylim=(-3000, 3000),\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Days since first TLE\",\n",
+ " ylabel=\"TAT-C minus Landsat 9 (km)\",\n",
+ " title=\"Ascending node longitude (at the equator)\",\n",
+ " yscale=\"symlog\",\n",
+ " ylim=(-2000, 2000),\n",
+ ")\n",
+ "axes[2].set(\n",
+ " xlabel=\"Days since first TLE\",\n",
+ " ylabel=\"TAT-C minus Landsat 9 (min)\",\n",
+ " title=\"LTAN\",\n",
+ " ylim=(-6, 6),\n",
+ ")\n",
"axes[0].legend(frameon=False, fontsize=8, markerscale=4)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -632,24 +783,57 @@
}
],
"source": [
- "oli = Instrument(name=\"OLI\", field_of_regard=utils.swath_width_to_field_of_regard(705e3, 185e3))\n",
+ "oli = Instrument(\n",
+ " name=\"OLI\", field_of_regard=utils.swath_width_to_field_of_regard(705e3, 185e3)\n",
+ ")\n",
"lattice = generate_points_fibonacci_lattice(3000e3)\n",
"lattice = lattice[lattice.geometry.y.abs() < 81].reset_index(drop=True)\n",
- "points = [Point(id=i, latitude=g.y, longitude=g.x) for i, g in enumerate(lattice.geometry)]\n",
- "reference_orbit = GeneralPerturbationsOrbit.from_tle([line for tle in history.tle for line in tle])\n",
- "predictions = {\"reference\": reference_orbit, \"detected repeat cycle\": models[\"detected repeat cycle\"], \"declared repeat cycle\": models[\"declared repeat cycle\"]}\n",
- "start, end = (START + pd.Timedelta(hours=1)).floor(\"us\").to_pydatetime(), END.floor(\"us\").to_pydatetime()\n",
+ "points = [\n",
+ " Point(id=i, latitude=g.y, longitude=g.x) for i, g in enumerate(lattice.geometry)\n",
+ "]\n",
+ "reference_orbit = GeneralPerturbationsOrbit.from_tle(\n",
+ " [line for tle in history.tle for line in tle]\n",
+ ")\n",
+ "predictions = {\n",
+ " \"reference\": reference_orbit,\n",
+ " \"detected repeat cycle\": models[\"detected repeat cycle\"],\n",
+ " \"declared repeat cycle\": models[\"declared repeat cycle\"],\n",
+ "}\n",
+ "start, end = (START + pd.Timedelta(hours=1)).floor(\"us\").to_pydatetime(), END.floor(\n",
+ " \"us\"\n",
+ ").to_pydatetime()\n",
"observations = {}\n",
"for name, orbit in predictions.items():\n",
" satellite = Satellite(name=\"Landsat 9\", orbit=orbit, instruments=[oli])\n",
- " frames = Parallel(n_jobs=-1)(delayed(collect_observations)(point, satellite, start, end) for point in points)\n",
- " observations[name] = pd.concat([frame.assign(point_id=point.id) for point, frame in zip(points, frames)], ignore_index=True)\n",
+ " frames = Parallel(n_jobs=-1)(\n",
+ " delayed(collect_observations)(point, satellite, start, end) for point in points\n",
+ " )\n",
+ " observations[name] = pd.concat(\n",
+ " [frame.assign(point_id=point.id) for point, frame in zip(points, frames)],\n",
+ " ignore_index=True,\n",
+ " )\n",
"rows3 = {}\n",
"reference_obs = observations[\"reference\"].sort_values(\"epoch\")\n",
"for name in [\"detected repeat cycle\", \"declared repeat cycle\"]:\n",
" predicted = observations[name].sort_values(\"epoch\")\n",
- " pairs = pd.merge_asof(reference_obs[[\"point_id\", \"epoch\"]], predicted[[\"point_id\", \"epoch\"]].rename(columns={\"epoch\": \"predicted\"}), left_on=\"epoch\", right_on=\"predicted\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=10))\n",
- " back = pd.merge_asof(predicted[[\"point_id\", \"epoch\"]], reference_obs[[\"point_id\", \"epoch\"]].rename(columns={\"epoch\": \"actual\"}), left_on=\"epoch\", right_on=\"actual\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=10))\n",
+ " pairs = pd.merge_asof(\n",
+ " reference_obs[[\"point_id\", \"epoch\"]],\n",
+ " predicted[[\"point_id\", \"epoch\"]].rename(columns={\"epoch\": \"predicted\"}),\n",
+ " left_on=\"epoch\",\n",
+ " right_on=\"predicted\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=10),\n",
+ " )\n",
+ " back = pd.merge_asof(\n",
+ " predicted[[\"point_id\", \"epoch\"]],\n",
+ " reference_obs[[\"point_id\", \"epoch\"]].rename(columns={\"epoch\": \"actual\"}),\n",
+ " left_on=\"epoch\",\n",
+ " right_on=\"actual\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=10),\n",
+ " )\n",
" error = (pairs.predicted - pairs.epoch).dt.total_seconds()\n",
" elapsed = (pairs.epoch - START) / pd.Timedelta(days=1)\n",
" rows3[name] = {\n",
@@ -693,7 +877,11 @@
"for name, color in [(\"detected repeat cycle\", BLUE), (\"declared repeat cycle\", ORANGE)]:\n",
" pairs = observations[name + \" pairs\"]\n",
" ax.plot(pairs.elapsed, pairs.error, \".\", ms=2, color=color, label=name)\n",
- "ax.set(xlabel=\"Days since first TLE\", ylabel=\"Predicted minus reference (s)\", title=\"Observation epoch errors\")\n",
+ "ax.set(\n",
+ " xlabel=\"Days since first TLE\",\n",
+ " ylabel=\"Predicted minus reference (s)\",\n",
+ " title=\"Observation epoch errors\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8, markerscale=4)\n",
"plt.show()"
]
diff --git a/docs/validation/ValidateOrbitGeneration.ipynb b/docs/validation/ValidateOrbitGeneration.ipynb
index e7ab7ca7..555cbbcc 100644
--- a/docs/validation/ValidateOrbitGeneration.ipynb
+++ b/docs/validation/ValidateOrbitGeneration.ipynb
@@ -74,24 +74,57 @@
"DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
"T = datetime(2026, 10, 4, 12, tzinfo=timezone.utc)\n",
"CELESTRAK = \"https://celestrak.org/NORAD/elements/gp.php\"\n",
- "GROUPS = [\"weather\", \"resource\", \"galileo\", \"beidou\", \"glo-ops\", \"gps-ops\", \"oneweb\", \"goes\"]\n",
- "NAMES = {\"meridian\": [\"MERIDIAN\", \"COSMOS 2510\", \"COSMOS 2518\", \"COSMOS 2541\", \"COSMOS 2552\", \"COSMOS 2563\"], \"qzss\": [\"QZS\"]}\n",
+ "GROUPS = [\n",
+ " \"weather\",\n",
+ " \"resource\",\n",
+ " \"galileo\",\n",
+ " \"beidou\",\n",
+ " \"glo-ops\",\n",
+ " \"gps-ops\",\n",
+ " \"oneweb\",\n",
+ " \"goes\",\n",
+ "]\n",
+ "NAMES = {\n",
+ " \"meridian\": [\n",
+ " \"MERIDIAN\",\n",
+ " \"COSMOS 2510\",\n",
+ " \"COSMOS 2518\",\n",
+ " \"COSMOS 2541\",\n",
+ " \"COSMOS 2552\",\n",
+ " \"COSMOS 2563\",\n",
+ " ],\n",
+ " \"qzss\": [\"QZS\"],\n",
+ "}\n",
"\n",
"\n",
"def fetch(path, params_list):\n",
" if not path.exists():\n",
" text = \"\"\n",
" for params in params_list:\n",
- " response = requests.get(CELESTRAK, params={**params, \"FORMAT\": \"tle\"}, timeout=120)\n",
+ " response = requests.get(\n",
+ " CELESTRAK, params={**params, \"FORMAT\": \"tle\"}, timeout=120\n",
+ " )\n",
" response.raise_for_status()\n",
- " text += \"\\n\".join(line for line in response.text.splitlines() if \"No GP data\" not in line) + \"\\n\"\n",
+ " text += (\n",
+ " \"\\n\".join(\n",
+ " line\n",
+ " for line in response.text.splitlines()\n",
+ " if \"No GP data\" not in line\n",
+ " )\n",
+ " + \"\\n\"\n",
+ " )\n",
" path.write_text(text)\n",
" lines = [line.rstrip() for line in path.read_text().splitlines() if line.strip()]\n",
" return {lines[i].strip(): lines[i + 1 : i + 3] for i in range(0, len(lines) - 2, 3)}\n",
"\n",
"\n",
"TLES = {group: fetch(DATA_DIR / f\"{group}.tle\", [{\"GROUP\": group}]) for group in GROUPS}\n",
- "TLES.update({key: fetch(DATA_DIR / f\"{key}.tle\", [{\"NAME\": name} for name in names]) for key, names in NAMES.items()})\n",
+ "TLES.update(\n",
+ " {\n",
+ " key: fetch(DATA_DIR / f\"{key}.tle\", [{\"NAME\": name} for name in names])\n",
+ " for key, names in NAMES.items()\n",
+ " }\n",
+ ")\n",
"pd.Series({group: len(tles) for group, tles in TLES.items()}, name=\"satellites\")"
]
},
@@ -153,19 +186,43 @@
" hn = np.linalg.norm(h, axis=0)\n",
" inclination = np.degrees(np.arccos(h[2] / hn))\n",
" raan = np.degrees(np.arctan2(h[0], -h[1])) % 360\n",
- " node = np.array([np.cos(np.radians(raan)), np.sin(np.radians(raan)), np.zeros_like(raan)])\n",
- " u = np.degrees(np.arctan2(np.sum(np.cross(node, r, axis=0) * h, axis=0) / hn, np.sum(node * r, axis=0))) % 360\n",
+ " node = np.array(\n",
+ " [np.cos(np.radians(raan)), np.sin(np.radians(raan)), np.zeros_like(raan)]\n",
+ " )\n",
+ " u = (\n",
+ " np.degrees(\n",
+ " np.arctan2(\n",
+ " np.sum(np.cross(node, r, axis=0) * h, axis=0) / hn,\n",
+ " np.sum(node * r, axis=0),\n",
+ " )\n",
+ " )\n",
+ " % 360\n",
+ " )\n",
" return inclination, raan, u, np.linalg.norm(r, axis=0)\n",
"\n",
"\n",
"def node_local_time(at, start, days=1, step=20):\n",
" \"\"\"Median local mean solar time (hours) of northbound equator crossings over a period.\"\"\"\n",
" seconds = np.arange(0, days * 86400, step)\n",
- " p = at(timescale.from_datetimes([start + timedelta(seconds=float(s)) for s in seconds])).frame_xyz(itrs).m\n",
+ " p = (\n",
+ " at(\n",
+ " timescale.from_datetimes(\n",
+ " [start + timedelta(seconds=float(s)) for s in seconds]\n",
+ " )\n",
+ " )\n",
+ " .frame_xyz(itrs)\n",
+ " .m\n",
+ " )\n",
" k = np.nonzero((p[2][:-1] < 0) & (p[2][1:] >= 0))[0]\n",
" f = -p[2][k] / (p[2][k + 1] - p[2][k])\n",
- " longitude = np.degrees(np.arctan2(p[1][k] + f * (p[1][k + 1] - p[1][k]), p[0][k] + f * (p[0][k + 1] - p[0][k])))\n",
- " hours = (start - start.replace(hour=0, minute=0, second=0, microsecond=0)) / timedelta(hours=1) + (seconds[k] + f * step) / 3600\n",
+ " longitude = np.degrees(\n",
+ " np.arctan2(\n",
+ " p[1][k] + f * (p[1][k + 1] - p[1][k]), p[0][k] + f * (p[0][k + 1] - p[0][k])\n",
+ " )\n",
+ " )\n",
+ " hours = (\n",
+ " start - start.replace(hour=0, minute=0, second=0, microsecond=0)\n",
+ " ) / timedelta(hours=1) + (seconds[k] + f * step) / 3600\n",
" return float(np.median(np.mod(hours + longitude / 15, 24)))\n",
"\n",
"\n",
@@ -175,11 +232,25 @@
"\n",
"def summarize(x):\n",
" x = np.abs(np.asarray(x, dtype=float))\n",
- " return pd.Series({\"median |x|\": np.median(x), \"p90 |x|\": np.percentile(x, 90), \"max |x|\": x.max()})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"median |x|\": np.median(x),\n",
+ " \"p90 |x|\": np.percentile(x, 90),\n",
+ " \"max |x|\": x.max(),\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})"
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")"
]
},
{
@@ -410,16 +481,28 @@
],
"source": [
"SSO_MISSIONS = [\n",
- " (\"weather\", \"SUOMI NPP\"), (\"weather\", \"NOAA 20 (JPSS-1)\"), (\"weather\", \"NOAA 21 (JPSS-2)\"), (\"weather\", \"METOP-B\"), (\"weather\", \"METOP-C\"),\n",
- " (\"resource\", \"LANDSAT 8\"), (\"resource\", \"LANDSAT 9\"), (\"resource\", \"SENTINEL-2A\"), (\"resource\", \"SENTINEL-2B\"), (\"resource\", \"SENTINEL-2C\"),\n",
- " (\"resource\", \"SENTINEL-3A\"), (\"resource\", \"SENTINEL-3B\"), (\"resource\", \"SENTINEL-5P\"),\n",
+ " (\"weather\", \"SUOMI NPP\"),\n",
+ " (\"weather\", \"NOAA 20 (JPSS-1)\"),\n",
+ " (\"weather\", \"NOAA 21 (JPSS-2)\"),\n",
+ " (\"weather\", \"METOP-B\"),\n",
+ " (\"weather\", \"METOP-C\"),\n",
+ " (\"resource\", \"LANDSAT 8\"),\n",
+ " (\"resource\", \"LANDSAT 9\"),\n",
+ " (\"resource\", \"SENTINEL-2A\"),\n",
+ " (\"resource\", \"SENTINEL-2B\"),\n",
+ " (\"resource\", \"SENTINEL-2C\"),\n",
+ " (\"resource\", \"SENTINEL-3A\"),\n",
+ " (\"resource\", \"SENTINEL-3B\"),\n",
+ " (\"resource\", \"SENTINEL-5P\"),\n",
"]\n",
"rows1 = {}\n",
"for group, name in SSO_MISSIONS:\n",
" sat = satellite(group, name)\n",
" epoch = sat.epoch.utc_datetime()\n",
" ltan = node_local_time(sat.at, epoch)\n",
- " altitude = (EARTH_MU / (sat.model.no_kozai / 60) ** 2) ** (1 / 3) - EARTH_MEAN_RADIUS\n",
+ " altitude = (EARTH_MU / (sat.model.no_kozai / 60) ** 2) ** (\n",
+ " 1 / 3\n",
+ " ) - EARTH_MEAN_RADIUS\n",
" hours, minutes = divmod(ltan * 60, 60)\n",
" orbit = SunSynchronousOrbit(\n",
" mean_altitude=altitude,\n",
@@ -436,7 +519,9 @@
" \"TAT-C inclination (deg)\": orbit.get_inclination(),\n",
" \"local time of ascending node (h)\": ltan,\n",
" \"TAT-C minus mission (min)\": 60 * wrap(15 * (ltan_generated - ltan)) / 15,\n",
- " \"TAT-C drift over a year (min)\": 60 * wrap(15 * (ltan_year - ltan_generated)) / 15,\n",
+ " \"TAT-C drift over a year (min)\": 60\n",
+ " * wrap(15 * (ltan_year - ltan_generated))\n",
+ " / 15,\n",
" }\n",
"table1 = pd.DataFrame(rows1).T\n",
"table1.round(3)"
@@ -481,13 +566,20 @@
" epoch = day.to_pydatetime()\n",
" t = timescale.from_datetime(epoch)\n",
" ra, _, _ = de421[\"earth\"].at(t).observe(de421[\"sun\"]).radec()\n",
- " legacy = (ra._degrees + 360 * 13.5 / 24 + 180) % 360 # pylint: disable=protected-access\n",
- " current = SunSynchronousOrbit(mean_altitude=800e3, equator_crossing_time=time(13, 30), epoch=epoch).get_right_ascension_ascending_node()\n",
+ " legacy = (\n",
+ " ra._degrees + 360 * 13.5 / 24 + 180\n",
+ " ) % 360 # pylint: disable=protected-access\n",
+ " current = SunSynchronousOrbit(\n",
+ " mean_altitude=800e3, equator_crossing_time=time(13, 30), epoch=epoch\n",
+ " ).get_right_ascension_ascending_node()\n",
" offsets.append(4 * wrap(legacy - current)) # 4 minutes per degree\n",
"fig, ax = plt.subplots(figsize=(7, 3.2))\n",
"ax.plot(days, offsets, color=BLUE)\n",
"ax.axhline(0, color=GRAY, lw=0.8)\n",
- "ax.set(ylabel=\"Node local time offset (min)\", title=\"Ascending node offset of the previous convention (apparent Sun, J2000)\")\n",
+ "ax.set(\n",
+ " ylabel=\"Node local time offset (min)\",\n",
+ " title=\"Ascending node offset of the previous convention (apparent Sun, J2000)\",\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()"
]
@@ -669,9 +761,23 @@
" for name in TLES[group]:\n",
" sat = satellite(group, name)\n",
" inclination, raan, u, radius = state_elements(sat.at(t_ref))\n",
- " rows.append({\"name\": name, \"inclination\": inclination, \"raan\": raan, \"u\": u, \"radius\": radius, \"eccentricity\": sat.model.ecco, \"n\": sat.model.no_kozai})\n",
+ " rows.append(\n",
+ " {\n",
+ " \"name\": name,\n",
+ " \"inclination\": inclination,\n",
+ " \"raan\": raan,\n",
+ " \"u\": u,\n",
+ " \"radius\": radius,\n",
+ " \"eccentricity\": sat.model.ecco,\n",
+ " \"n\": sat.model.no_kozai,\n",
+ " }\n",
+ " )\n",
" frame = pd.DataFrame(rows)\n",
- " nominal = (frame.eccentricity < 0.02) & ((frame.n / frame.n.median() - 1).abs() < 0.003) & ((frame.inclination - frame.inclination.median()).abs() < 5)\n",
+ " nominal = (\n",
+ " (frame.eccentricity < 0.02)\n",
+ " & ((frame.n / frame.n.median() - 1).abs() < 0.003)\n",
+ " & ((frame.inclination - frame.inclination.median()).abs() < 5)\n",
+ " )\n",
" return frame[nominal].reset_index(drop=True)\n",
"\n",
"\n",
@@ -688,14 +794,29 @@
" true_anomaly=float(frame.u[0] + offset_u) % 360,\n",
" epoch=T,\n",
" )\n",
- " walker = WalkerConstellation(name=\"walker\", orbit=lead, number_satellites=total, number_planes=planes, relative_spacing=spacing, configuration=configuration)\n",
+ " walker = WalkerConstellation(\n",
+ " name=\"walker\",\n",
+ " orbit=lead,\n",
+ " number_satellites=total,\n",
+ " number_planes=planes,\n",
+ " relative_spacing=spacing,\n",
+ " configuration=configuration,\n",
+ " )\n",
" members = walker.generate_members()\n",
- " slot_raan = np.array([m.orbit.get_right_ascension_ascending_node() for m in members])\n",
+ " slot_raan = np.array(\n",
+ " [m.orbit.get_right_ascension_ascending_node() for m in members]\n",
+ " )\n",
" slot_u = np.array([m.orbit.true_anomaly for m in members])\n",
" d_raan = wrap(frame.raan.to_numpy()[:, None] - slot_raan[None, :])\n",
" d_u = wrap(frame.u.to_numpy()[:, None] - slot_u[None, :])\n",
- " slot = np.argmin(np.hypot(d_raan * np.sin(np.radians(frame.inclination.median())), d_u), axis=1)\n",
- " du, draan = d_u[np.arange(len(slot)), slot], d_raan[np.arange(len(slot)), slot]\n",
+ " slot = np.argmin(\n",
+ " np.hypot(d_raan * np.sin(np.radians(frame.inclination.median())), d_u),\n",
+ " axis=1,\n",
+ " )\n",
+ " du, draan = (\n",
+ " d_u[np.arange(len(slot)), slot],\n",
+ " d_raan[np.arange(len(slot)), slot],\n",
+ " )\n",
" offset_u += float(np.median(du))\n",
" offset_raan += float(np.median(draan))\n",
" if best is None or np.median(np.abs(du)) < best[0]:\n",
@@ -752,9 +873,28 @@
"for ax, label in zip(axes, [\"Galileo\", \"GPS\", \"OneWeb\"]):\n",
" frame, walker, _, _, _ = fits[label]\n",
" members = walker.generate_members()\n",
- " ax.scatter([m.orbit.get_right_ascension_ascending_node() for m in members], [m.orbit.true_anomaly for m in members], s=30 if label != \"OneWeb\" else 6, facecolors=\"none\", edgecolors=GRAY, label=\"Walker slots\")\n",
- " ax.scatter(frame.raan, frame.u, s=10 if label != \"OneWeb\" else 2, color=BLUE, label=\"operational satellites\")\n",
- " ax.set(xlabel=\"Right ascension of ascending node (deg)\", ylabel=\"Argument of latitude (deg)\", title=f\"{label}: {rows2[label]['pattern (T/P/F)']}\", xlim=(0, 360), ylim=(0, 360))\n",
+ " ax.scatter(\n",
+ " [m.orbit.get_right_ascension_ascending_node() for m in members],\n",
+ " [m.orbit.true_anomaly for m in members],\n",
+ " s=30 if label != \"OneWeb\" else 6,\n",
+ " facecolors=\"none\",\n",
+ " edgecolors=GRAY,\n",
+ " label=\"Walker slots\",\n",
+ " )\n",
+ " ax.scatter(\n",
+ " frame.raan,\n",
+ " frame.u,\n",
+ " s=10 if label != \"OneWeb\" else 2,\n",
+ " color=BLUE,\n",
+ " label=\"operational satellites\",\n",
+ " )\n",
+ " ax.set(\n",
+ " xlabel=\"Right ascension of ascending node (deg)\",\n",
+ " ylabel=\"Argument of latitude (deg)\",\n",
+ " title=f\"{label}: {rows2[label]['pattern (T/P/F)']}\",\n",
+ " xlim=(0, 360),\n",
+ " ylim=(0, 360),\n",
+ " )\n",
"axes[0].legend(frameon=False, fontsize=8, loc=\"lower left\")\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1000,14 +1140,20 @@
"\n",
"def mean_visible(tracks, times, min_elevation=10):\n",
" \"\"\"Mean number of satellites above an elevation angle at each latitude.\"\"\"\n",
- " position = np.stack([track.frame_xyz(itrs).m for track in tracks], axis=1) # (3, satellites, times)\n",
+ " position = np.stack(\n",
+ " [track.frame_xyz(itrs).m for track in tracks], axis=1\n",
+ " ) # (3, satellites, times)\n",
" counts = []\n",
" for latitude in LATITUDES:\n",
" site = wgs84.latlon(latitude, 0)\n",
" p = np.array(site.itrs_xyz.m)[:, None, None]\n",
- " up = np.array([np.cos(np.radians(latitude)), 0, np.sin(np.radians(latitude))])[:, None, None]\n",
+ " up = np.array([np.cos(np.radians(latitude)), 0, np.sin(np.radians(latitude))])[\n",
+ " :, None, None\n",
+ " ]\n",
" line = position - p\n",
- " elevation = np.degrees(np.arcsin(np.sum(line * up, axis=0) / np.linalg.norm(line, axis=0)))\n",
+ " elevation = np.degrees(\n",
+ " np.arcsin(np.sum(line * up, axis=0) / np.linalg.norm(line, axis=0))\n",
+ " )\n",
" counts.append(np.mean(np.sum(elevation >= min_elevation, axis=0)))\n",
" return np.array(counts)\n",
"\n",
@@ -1019,13 +1165,31 @@
" # the operational satellite closest to each occupied slot\n",
" cost = np.abs(fits[label][2])\n",
" closest = pd.Series(cost).groupby(slot).idxmin()\n",
- " duration, step = (timedelta(days=1), timedelta(minutes=10)) if label != \"OneWeb\" else (timedelta(hours=2), timedelta(minutes=2))\n",
- " times = timescale.from_datetimes([T + k * step for k in range(int(duration / step))])\n",
- " real_tracks = [satellite(group, frame.name[i]).at(times) for i in closest.to_numpy()]\n",
- " walker_tracks = [members[k].orbit.to_gp_orbit().elements[0].to_skyfield().at(times) for k in closest.index]\n",
- " visible[label] = (mean_visible(real_tracks, times), mean_visible(walker_tracks, times))\n",
+ " duration, step = (\n",
+ " (timedelta(days=1), timedelta(minutes=10))\n",
+ " if label != \"OneWeb\"\n",
+ " else (timedelta(hours=2), timedelta(minutes=2))\n",
+ " )\n",
+ " times = timescale.from_datetimes(\n",
+ " [T + k * step for k in range(int(duration / step))]\n",
+ " )\n",
+ " real_tracks = [\n",
+ " satellite(group, frame.name[i]).at(times) for i in closest.to_numpy()\n",
+ " ]\n",
+ " walker_tracks = [\n",
+ " members[k].orbit.to_gp_orbit().elements[0].to_skyfield().at(times)\n",
+ " for k in closest.index\n",
+ " ]\n",
+ " visible[label] = (\n",
+ " mean_visible(real_tracks, times),\n",
+ " mean_visible(walker_tracks, times),\n",
+ " )\n",
"pd.DataFrame(\n",
- " {(label, kind): counts for label, (real_counts, walker_counts) in visible.items() for kind, counts in [(\"operational\", real_counts), (\"Walker\", walker_counts)]},\n",
+ " {\n",
+ " (label, kind): counts\n",
+ " for label, (real_counts, walker_counts) in visible.items()\n",
+ " for kind, counts in [(\"operational\", real_counts), (\"Walker\", walker_counts)]\n",
+ " },\n",
" index=pd.Index(LATITUDES, name=\"latitude (deg)\"),\n",
").round(1)"
]
@@ -1216,28 +1380,66 @@
" (\"resource\", \"LANDSAT 8\", \"LANDSAT 9\", timedelta(days=8), True),\n",
"]\n",
"SIDEREAL_DAY = 86164.0905\n",
- "day_times = timescale.from_datetimes([T + timedelta(minutes=k) for k in range(0, 1440, 5)])\n",
+ "day_times = timescale.from_datetimes(\n",
+ " [T + timedelta(minutes=k) for k in range(0, 1440, 5)]\n",
+ ")\n",
"rows3 = {}\n",
"for group, lead_name, follow_name, interval, repeat in TRAIN_CASES:\n",
" lead_sat, follow_sat = satellite(group, lead_name), satellite(group, follow_name)\n",
" inclination, raan, u, _ = state_elements(lead_sat.at(t_ref))\n",
" _, raan_follow, u_follow, _ = state_elements(follow_sat.at(t_ref))\n",
" semimajor_axis = (EARTH_MU / (lead_sat.model.no_kozai / 60) ** 2) ** (1 / 3)\n",
- " lead = KeplerianOrbit(semimajor_axis=semimajor_axis, eccentricity=0, inclination=float(inclination), right_ascension_ascending_node=float(raan), perigee_argument=0, true_anomaly=float(u), epoch=T)\n",
+ " lead = KeplerianOrbit(\n",
+ " semimajor_axis=semimajor_axis,\n",
+ " eccentricity=0,\n",
+ " inclination=float(inclination),\n",
+ " right_ascension_ascending_node=float(raan),\n",
+ " perigee_argument=0,\n",
+ " true_anomaly=float(u),\n",
+ " epoch=T,\n",
+ " )\n",
" if interval is None:\n",
" interval = lead.get_orbit_period() * (float(wrap(u - u_follow)) % 360 / 360)\n",
- " train = TrainConstellation(name=\"train\", orbit=lead, number_satellites=2, interval=interval, repeat_ground_track=repeat)\n",
+ " train = TrainConstellation(\n",
+ " name=\"train\",\n",
+ " orbit=lead,\n",
+ " number_satellites=2,\n",
+ " interval=interval,\n",
+ " repeat_ground_track=repeat,\n",
+ " )\n",
" member = train.generate_members()[1].orbit\n",
- " legacy = lead.get_derived_orbit(-360 * interval / lead.get_orbit_period(), 360 * interval.total_seconds() / SIDEREAL_DAY if repeat else 0)\n",
+ " legacy = lead.get_derived_orbit(\n",
+ " -360 * interval / lead.get_orbit_period(),\n",
+ " 360 * interval.total_seconds() / SIDEREAL_DAY if repeat else 0,\n",
+ " )\n",
" real_points = wgs84.subpoint_of(follow_sat.at(day_times))\n",
" for version, orbit in [(\"TAT-C\", member), (\"previous\", legacy)]:\n",
- " generated_points = wgs84.subpoint_of(orbit.to_gp_orbit().elements[0].to_skyfield().at(day_times))\n",
- " distance = np.array([geodesic_distance(*a) for a in zip(real_points.longitude.degrees, real_points.latitude.degrees, generated_points.longitude.degrees, generated_points.latitude.degrees)]) / 1e3\n",
+ " generated_points = wgs84.subpoint_of(\n",
+ " orbit.to_gp_orbit().elements[0].to_skyfield().at(day_times)\n",
+ " )\n",
+ " distance = (\n",
+ " np.array(\n",
+ " [\n",
+ " geodesic_distance(*a)\n",
+ " for a in zip(\n",
+ " real_points.longitude.degrees,\n",
+ " real_points.latitude.degrees,\n",
+ " generated_points.longitude.degrees,\n",
+ " generated_points.latitude.degrees,\n",
+ " )\n",
+ " ]\n",
+ " )\n",
+ " / 1e3\n",
+ " )\n",
" rows3[(f\"{lead_name} → {follow_name}\", version)] = {\n",
" \"interval\": str(interval).split(\".\")[0],\n",
" \"repeat ground track\": repeat,\n",
- " \"right ascension difference (deg)\": float(wrap(orbit.get_right_ascension_ascending_node() - raan_follow)),\n",
- " \"argument of latitude difference (deg)\": float(wrap(orbit.true_anomaly - u_follow)),\n",
+ " \"right ascension difference (deg)\": float(\n",
+ " wrap(orbit.get_right_ascension_ascending_node() - raan_follow)\n",
+ " ),\n",
+ " \"argument of latitude difference (deg)\": float(\n",
+ " wrap(orbit.true_anomaly - u_follow)\n",
+ " ),\n",
" \"position difference, median (km)\": np.median(distance),\n",
" \"position difference, max (km)\": distance.max(),\n",
" }\n",
@@ -1530,18 +1732,30 @@
"source": [
"def apogee_drift(at, revolutions, days=30):\n",
" \"\"\"Apogee longitudes and their drift rate (deg/day, mean over each daily apogee).\"\"\"\n",
- " times = timescale.from_datetimes([T + timedelta(minutes=k) for k in range(0, days * 1440, 2)])\n",
+ " times = timescale.from_datetimes(\n",
+ " [T + timedelta(minutes=k) for k in range(0, days * 1440, 2)]\n",
+ " )\n",
" track = at(times)\n",
" radius = np.linalg.norm(track.position.m, axis=0)\n",
" k = np.nonzero((radius[1:-1] > radius[:-2]) & (radius[1:-1] >= radius[2:]))[0] + 1\n",
" points = wgs84.subpoint_of(track[k])\n",
" elapsed = times.tt[k] - t_ref.tt\n",
- " rates = [np.polyfit(elapsed[i::revolutions], np.degrees(np.unwrap(np.radians(points.longitude.degrees[i::revolutions]))), 1)[0] for i in range(revolutions)]\n",
+ " rates = [\n",
+ " np.polyfit(\n",
+ " elapsed[i::revolutions],\n",
+ " np.degrees(np.unwrap(np.radians(points.longitude.degrees[i::revolutions]))),\n",
+ " 1,\n",
+ " )[0]\n",
+ " for i in range(revolutions)\n",
+ " ]\n",
" return float(np.mean(rates)), float(np.median(points.latitude.degrees))\n",
"\n",
"\n",
"rows4 = {}\n",
- "for group, cls, revolutions in [(\"meridian\", MolniyaOrbit, 2), (\"qzss\", TundraOrbit, 1)]:\n",
+ "for group, cls, revolutions in [\n",
+ " (\"meridian\", MolniyaOrbit, 2),\n",
+ " (\"qzss\", TundraOrbit, 1),\n",
+ "]:\n",
" for name in TLES[group]:\n",
" sat = satellite(group, name)\n",
" m = sat.model\n",
@@ -1553,12 +1767,15 @@
" orbit = cls(\n",
" perigee_altitude=semimajor_axis * (1 - m.ecco) - EARTH_MEAN_RADIUS,\n",
" inclination=math.degrees(m.inclo),\n",
- " right_ascension_ascending_node=math.degrees(m.nodeo + m.nodedot * minutes) % 360,\n",
+ " right_ascension_ascending_node=math.degrees(m.nodeo + m.nodedot * minutes)\n",
+ " % 360,\n",
" true_anomaly=float(mean_anomaly_to_true_anomaly(mean_anomaly, m.ecco)),\n",
" epoch=T,\n",
" )\n",
" real_drift, real_latitude = apogee_drift(sat.at, revolutions)\n",
- " tatc_drift, tatc_latitude = apogee_drift(orbit.to_gp_orbit().elements[0].to_skyfield().at, revolutions)\n",
+ " tatc_drift, tatc_latitude = apogee_drift(\n",
+ " orbit.to_gp_orbit().elements[0].to_skyfield().at, revolutions\n",
+ " )\n",
" rows4[name] = {\n",
" \"TAT-C orbit\": cls.__name__,\n",
" \"semimajor axis (km)\": semimajor_axis / 1e3,\n",
@@ -1708,7 +1925,9 @@
"source": [
"def apogee_longitudes(at, days=30):\n",
" \"\"\"Longitudes (deg) of the apogees of a propagated orbit, sampled every 20 s.\"\"\"\n",
- " times = timescale.from_datetimes([T + timedelta(seconds=20 * k) for k in range(days * 4320)])\n",
+ " times = timescale.from_datetimes(\n",
+ " [T + timedelta(seconds=20 * k) for k in range(days * 4320)]\n",
+ " )\n",
" track = at(times)\n",
" radius = np.linalg.norm(track.position.m, axis=0)\n",
" k = np.nonzero((radius[1:-1] > radius[:-2]) & (radius[1:-1] >= radius[2:]))[0] + 1\n",
@@ -1728,7 +1947,11 @@
" float(real[0]),\n",
" perigee_altitude=semimajor_axis * (1 - m.ecco) - EARTH_MEAN_RADIUS,\n",
" inclination=math.degrees(m.inclo),\n",
- " true_anomaly=float(mean_anomaly_to_true_anomaly(math.degrees(m.mo + m.mdot * minutes) % 360, m.ecco)),\n",
+ " true_anomaly=float(\n",
+ " mean_anomaly_to_true_anomaly(\n",
+ " math.degrees(m.mo + m.mdot * minutes) % 360, m.ecco\n",
+ " )\n",
+ " ),\n",
" epoch=T,\n",
" )\n",
" generated = apogee_longitudes(orbit.to_gp_orbit().elements[0].to_skyfield().at)\n",
@@ -1739,7 +1962,11 @@
" \"argument of perigee (deg)\": math.degrees(m.argpo),\n",
" \"right ascension (deg)\": raan,\n",
" \"TAT-C right ascension (deg)\": orbit.right_ascension_ascending_node,\n",
- " \"right ascension difference (deg)\": (orbit.right_ascension_ascending_node - raan + 180) % 360 - 180,\n",
+ " \"right ascension difference (deg)\": (\n",
+ " orbit.right_ascension_ascending_node - raan + 180\n",
+ " )\n",
+ " % 360\n",
+ " - 180,\n",
" \"apogee longitude range over 30 days (deg)\": np.ptp(real),\n",
" \"TAT-C apogee longitude range over 30 days (deg)\": np.ptp(generated),\n",
" }\n",
@@ -1854,18 +2081,37 @@
],
"source": [
"rows5 = {}\n",
- "times30 = timescale.from_datetimes([T + timedelta(hours=k) for k in range(0, 30 * 24 + 1, 6)])\n",
- "for label, longitude, name in [(\"GOES 19\", None, \"GOES 19\"), (\"GOES 18\", None, \"GOES 18\"), (\"0 deg\", 0.0, None), (\"105 deg E\", 105.0, None)]:\n",
+ "times30 = timescale.from_datetimes(\n",
+ " [T + timedelta(hours=k) for k in range(0, 30 * 24 + 1, 6)]\n",
+ ")\n",
+ "for label, longitude, name in [\n",
+ " (\"GOES 19\", None, \"GOES 19\"),\n",
+ " (\"GOES 18\", None, \"GOES 18\"),\n",
+ " (\"0 deg\", 0.0, None),\n",
+ " (\"105 deg E\", 105.0, None),\n",
+ "]:\n",
" if name is not None:\n",
" sat = satellite(\"goes\", name)\n",
- " real = np.degrees(np.unwrap(np.radians(wgs84.subpoint_of(sat.at(times30)).longitude.degrees)))\n",
+ " real = np.degrees(\n",
+ " np.unwrap(np.radians(wgs84.subpoint_of(sat.at(times30)).longitude.degrees))\n",
+ " )\n",
" longitude = float(real[0])\n",
" orbit = GeosynchronousOrbit(longitude=longitude, epoch=T)\n",
- " generated = np.degrees(np.unwrap(np.radians(wgs84.subpoint_of(orbit.to_gp_orbit().elements[0].to_skyfield().at(times30)).longitude.degrees)))\n",
+ " generated = np.degrees(\n",
+ " np.unwrap(\n",
+ " np.radians(\n",
+ " wgs84.subpoint_of(\n",
+ " orbit.to_gp_orbit().elements[0].to_skyfield().at(times30)\n",
+ " ).longitude.degrees\n",
+ " )\n",
+ " )\n",
+ " )\n",
" rows5[label] = {\n",
" \"longitude (deg)\": longitude,\n",
" \"TAT-C longitude at epoch (deg)\": generated[0],\n",
- " \"operational longitude range over 30 days (deg)\": np.ptp(real) if name is not None else np.nan,\n",
+ " \"operational longitude range over 30 days (deg)\": (\n",
+ " np.ptp(real) if name is not None else np.nan\n",
+ " ),\n",
" \"TAT-C longitude change over 30 days (deg)\": generated[-1] - generated[0],\n",
" }\n",
"pd.DataFrame(rows5).T.round(3)"
diff --git a/docs/validation/ValidateOrbitISS.ipynb b/docs/validation/ValidateOrbitISS.ipynb
index 8fbcadd9..2e5a89df 100644
--- a/docs/validation/ValidateOrbitISS.ipynb
+++ b/docs/validation/ValidateOrbitISS.ipynb
@@ -32,10 +32,10 @@
"id": "d5bf30de",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:56:51.047486Z",
- "iopub.status.busy": "2026-10-08T17:56:51.046485Z",
- "iopub.status.idle": "2026-10-08T17:56:54.856547Z",
- "shell.execute_reply": "2026-10-08T17:56:54.856041Z"
+ "iopub.execute_input": "2026-10-25T13:31:29.969550Z",
+ "iopub.status.busy": "2026-10-25T13:31:29.968551Z",
+ "iopub.status.idle": "2026-10-25T13:31:32.459854Z",
+ "shell.execute_reply": "2026-10-25T13:31:32.459183Z"
}
},
"outputs": [
@@ -73,7 +73,15 @@
"from tatc import utils\n",
"from tatc.analysis import collect_observations\n",
"from tatc.constants import EARTH_MEAN_RADIUS, timescale\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, Instrument, Point, PointedInstrument, Satellite\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " AttitudeSchedule,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Instrument,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
"\n",
"DATA_DIR = Path(\"data\") / \"iss\"\n",
"DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
@@ -93,26 +101,61 @@
" import earthaccess\n",
"\n",
" earthaccess.login()\n",
- " results = earthaccess.search_data(short_name=\"ECO_L1B_ATT\", version=\"002\", temporal=(START.strftime(\"%Y-%m-%dT%H:%M:%SZ\"), END.strftime(\"%Y-%m-%dT%H:%M:%SZ\")))\n",
+ " results = earthaccess.search_data(\n",
+ " short_name=\"ECO_L1B_ATT\",\n",
+ " version=\"002\",\n",
+ " temporal=(\n",
+ " START.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " END.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " ),\n",
+ " )\n",
" earthaccess.download(results[::4], str(DATA_DIR))\n",
" attitude_files = sorted(DATA_DIR.glob(\"ECOv002_L1B_ATT_*.h5\"))\n",
"frames, attitudes = [], []\n",
"for path in attitude_files:\n",
" with h5py.File(path, \"r\") as f:\n",
- " frames.append(pd.DataFrame(np.c_[f[\"Ephemeris/time_j2000\"][::30], f[\"Ephemeris/eci_position\"][::30], f[\"Ephemeris/eci_velocity\"][::30]], columns=[\"tt_j2000\", \"x\", \"y\", \"z\", \"vx\", \"vy\", \"vz\"]))\n",
+ " frames.append(\n",
+ " pd.DataFrame(\n",
+ " np.c_[\n",
+ " f[\"Ephemeris/time_j2000\"][::30],\n",
+ " f[\"Ephemeris/eci_position\"][::30],\n",
+ " f[\"Ephemeris/eci_velocity\"][::30],\n",
+ " ],\n",
+ " columns=[\"tt_j2000\", \"x\", \"y\", \"z\", \"vx\", \"vy\", \"vz\"],\n",
+ " )\n",
+ " )\n",
" # attitude quaternions (scalar first, spacecraft to J2000), every 5 minutes\n",
- " attitudes.append(pd.DataFrame(np.c_[f[\"Attitude/time_j2000\"][::300], f[\"Attitude/quaternion\"][::300]], columns=[\"tt_j2000\", \"qw\", \"qx\", \"qy\", \"qz\"]))\n",
- "ephemeris = pd.concat(frames).drop_duplicates(\"tt_j2000\").sort_values(\"tt_j2000\").reset_index(drop=True)\n",
+ " attitudes.append(\n",
+ " pd.DataFrame(\n",
+ " np.c_[f[\"Attitude/time_j2000\"][::300], f[\"Attitude/quaternion\"][::300]],\n",
+ " columns=[\"tt_j2000\", \"qw\", \"qx\", \"qy\", \"qz\"],\n",
+ " )\n",
+ " )\n",
+ "ephemeris = (\n",
+ " pd.concat(frames)\n",
+ " .drop_duplicates(\"tt_j2000\")\n",
+ " .sort_values(\"tt_j2000\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
"times = timescale.tt_jd(2451545.0 + ephemeris.tt_j2000.to_numpy() / 86400)\n",
"ephemeris[\"time\"] = pd.to_datetime(times.utc_datetime())\n",
"\n",
- "SCENES_FILE = DATA_DIR / f\"emit_scenes_{SCENES_START:%Y%m%d}_{SCENES_END - timedelta(days=1):%Y%m%d}.json\"\n",
+ "SCENES_FILE = (\n",
+ " DATA_DIR\n",
+ " / f\"emit_scenes_{SCENES_START:%Y%m%d}_{SCENES_END - timedelta(days=1):%Y%m%d}.json\"\n",
+ ")\n",
"if not SCENES_FILE.exists():\n",
" items, page = [], 1\n",
" while True:\n",
" response = requests.get(\n",
" \"https://cmr.earthdata.nasa.gov/search/granules.umm_json\",\n",
- " params={\"short_name\": \"EMITL1BRAD\", \"version\": \"002\", \"temporal\": f\"{SCENES_START:%Y-%m-%dT%H:%M:%SZ},{SCENES_END:%Y-%m-%dT%H:%M:%SZ}\", \"page_size\": 2000, \"page_num\": page},\n",
+ " params={\n",
+ " \"short_name\": \"EMITL1BRAD\",\n",
+ " \"version\": \"002\",\n",
+ " \"temporal\": f\"{SCENES_START:%Y-%m-%dT%H:%M:%SZ},{SCENES_END:%Y-%m-%dT%H:%M:%SZ}\",\n",
+ " \"page_size\": 2000,\n",
+ " \"page_num\": page,\n",
+ " },\n",
" timeout=300,\n",
" )\n",
" response.raise_for_status()\n",
@@ -120,10 +163,26 @@
" items += [\n",
" {\n",
" \"id\": item[\"umm\"][\"GranuleUR\"],\n",
- " \"start\": item[\"umm\"][\"TemporalExtent\"][\"RangeDateTime\"][\"BeginningDateTime\"],\n",
+ " \"start\": item[\"umm\"][\"TemporalExtent\"][\"RangeDateTime\"][\n",
+ " \"BeginningDateTime\"\n",
+ " ],\n",
" \"end\": item[\"umm\"][\"TemporalExtent\"][\"RangeDateTime\"][\"EndingDateTime\"],\n",
- " \"polygon\": [[p[\"Longitude\"], p[\"Latitude\"]] for p in item[\"umm\"][\"SpatialExtent\"][\"HorizontalSpatialDomain\"][\"Geometry\"][\"GPolygons\"][0][\"Boundary\"][\"Points\"]],\n",
- " \"solar_zenith\": float(next((a[\"Values\"][0] for a in item[\"umm\"].get(\"AdditionalAttributes\", []) if a[\"Name\"] == \"SOLAR_ZENITH\"), \"nan\")),\n",
+ " \"polygon\": [\n",
+ " [p[\"Longitude\"], p[\"Latitude\"]]\n",
+ " for p in item[\"umm\"][\"SpatialExtent\"][\"HorizontalSpatialDomain\"][\n",
+ " \"Geometry\"\n",
+ " ][\"GPolygons\"][0][\"Boundary\"][\"Points\"]\n",
+ " ],\n",
+ " \"solar_zenith\": float(\n",
+ " next(\n",
+ " (\n",
+ " a[\"Values\"][0]\n",
+ " for a in item[\"umm\"].get(\"AdditionalAttributes\", [])\n",
+ " if a[\"Name\"] == \"SOLAR_ZENITH\"\n",
+ " ),\n",
+ " \"nan\",\n",
+ " )\n",
+ " ),\n",
" }\n",
" for item in batch\n",
" ]\n",
@@ -137,8 +196,23 @@
"scenes[\"mid\"] = scenes.start + (scenes.end - scenes.start) / 2\n",
"iss = GeneralPerturbationsOrbit.from_tle(TLE)\n",
"satrec = iss.elements[0].to_skyfield()\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"pd.Series(\n",
" {\n",
" \"ephemeris files (orbits)\": len(attitude_files),\n",
@@ -165,10 +239,10 @@
"id": "7d983c44",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:56:54.860066Z",
- "iopub.status.busy": "2026-10-08T17:56:54.859066Z",
- "iopub.status.idle": "2026-10-08T17:56:55.076462Z",
- "shell.execute_reply": "2026-10-08T17:56:55.075455Z"
+ "iopub.execute_input": "2026-10-25T13:31:32.461188Z",
+ "iopub.status.busy": "2026-10-25T13:31:32.461188Z",
+ "iopub.status.idle": "2026-10-25T13:31:32.600992Z",
+ "shell.execute_reply": "2026-10-25T13:31:32.600992Z"
}
},
"outputs": [
@@ -531,20 +605,29 @@
"ephemeris[\"radial (km)\"] = np.sum(difference * radial, axis=1) / 1e3\n",
"ephemeris[\"along-track (km)\"] = np.sum(difference * along, axis=1) / 1e3\n",
"ephemeris[\"cross-track (km)\"] = np.sum(difference * normal, axis=1) / 1e3\n",
- "ephemeris[\"along-track (s)\"] = ephemeris[\"along-track (km)\"] * 1e3 / np.linalg.norm(velocity, axis=1)\n",
- "ephemeris[\"days before TLE epoch\"] = (pd.Timestamp(TLE_EPOCH) - ephemeris.time) / pd.Timedelta(days=1)\n",
+ "ephemeris[\"along-track (s)\"] = (\n",
+ " ephemeris[\"along-track (km)\"] * 1e3 / np.linalg.norm(velocity, axis=1)\n",
+ ")\n",
+ "ephemeris[\"days before TLE epoch\"] = (\n",
+ " pd.Timestamp(TLE_EPOCH) - ephemeris.time\n",
+ ") / pd.Timedelta(days=1)\n",
"ephemeris[\"day\"] = ephemeris.time.dt.floor(\"D\")\n",
"table1 = ephemeris.groupby(\"day\").agg(\n",
" **{\n",
" \"days before TLE epoch\": (\"days before TLE epoch\", \"mean\"),\n",
" \"along-track, median (km)\": (\"along-track (km)\", \"median\"),\n",
" \"along-track, median (s)\": (\"along-track (s)\", \"median\"),\n",
- " \"cross-track, p95 |x| (km)\": (\"cross-track (km)\", lambda x: x.abs().quantile(0.95)),\n",
+ " \"cross-track, p95 |x| (km)\": (\n",
+ " \"cross-track (km)\",\n",
+ " lambda x: x.abs().quantile(0.95),\n",
+ " ),\n",
" }\n",
")\n",
"table1.index = table1.index.strftime(\"%Y-%m-%d\")\n",
"departure = ephemeris[ephemeris[\"along-track (km)\"].abs() > 20].time.max()\n",
- "print(f\"last ephemeris time with an along-track offset above 20 km: {departure:%Y-%m-%d %H:%M} UTC\")\n",
+ "print(\n",
+ " f\"last ephemeris time with an along-track offset above 20 km: {departure:%Y-%m-%d %H:%M} UTC\"\n",
+ ")\n",
"table1.round(2)"
]
},
@@ -554,10 +637,10 @@
"id": "24c0c799",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:56:55.079466Z",
- "iopub.status.busy": "2026-10-08T17:56:55.079466Z",
- "iopub.status.idle": "2026-10-08T17:56:55.801998Z",
- "shell.execute_reply": "2026-10-08T17:56:55.800990Z"
+ "iopub.execute_input": "2026-10-25T13:31:32.603507Z",
+ "iopub.status.busy": "2026-10-25T13:31:32.602500Z",
+ "iopub.status.idle": "2026-10-25T13:31:32.986786Z",
+ "shell.execute_reply": "2026-10-25T13:31:32.986786Z"
}
},
"outputs": [
@@ -574,11 +657,33 @@
],
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.6))\n",
- "axes[0].plot(ephemeris[\"days before TLE epoch\"], ephemeris[\"along-track (km)\"], \".\", ms=1, color=BLUE)\n",
- "axes[0].set(xlabel=\"Days before TLE epoch\", ylabel=\"TAT-C minus ISS (km)\", title=\"Along-track offset\", yscale=\"symlog\")\n",
+ "axes[0].plot(\n",
+ " ephemeris[\"days before TLE epoch\"],\n",
+ " ephemeris[\"along-track (km)\"],\n",
+ " \".\",\n",
+ " ms=1,\n",
+ " color=BLUE,\n",
+ ")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Days before TLE epoch\",\n",
+ " ylabel=\"TAT-C minus ISS (km)\",\n",
+ " title=\"Along-track offset\",\n",
+ " yscale=\"symlog\",\n",
+ ")\n",
"axes[0].invert_xaxis()\n",
- "axes[1].plot(ephemeris[\"days before TLE epoch\"], ephemeris[\"cross-track (km)\"], \".\", ms=1, color=ORANGE)\n",
- "axes[1].set(xlabel=\"Days before TLE epoch\", ylabel=\"TAT-C minus ISS (km)\", title=\"Cross-track offset\", ylim=(-6, 6))\n",
+ "axes[1].plot(\n",
+ " ephemeris[\"days before TLE epoch\"],\n",
+ " ephemeris[\"cross-track (km)\"],\n",
+ " \".\",\n",
+ " ms=1,\n",
+ " color=ORANGE,\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Days before TLE epoch\",\n",
+ " ylabel=\"TAT-C minus ISS (km)\",\n",
+ " title=\"Cross-track offset\",\n",
+ " ylim=(-6, 6),\n",
+ ")\n",
"axes[1].invert_xaxis()\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -602,10 +707,10 @@
"id": "381b115c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:56:55.805132Z",
- "iopub.status.busy": "2026-10-08T17:56:55.805132Z",
- "iopub.status.idle": "2026-10-08T18:00:12.745589Z",
- "shell.execute_reply": "2026-10-08T18:00:12.744580Z"
+ "iopub.execute_input": "2026-10-25T13:31:32.989717Z",
+ "iopub.status.busy": "2026-10-25T13:31:32.988791Z",
+ "iopub.status.idle": "2026-10-25T13:33:28.017059Z",
+ "shell.execute_reply": "2026-10-25T13:33:28.017059Z"
}
},
"outputs": [
@@ -751,7 +856,12 @@
"scenes[\"width (km)\"] = scenes.polygon.map(scene_width)\n",
"scenes[\"center\"] = scenes.polygon.map(lambda p: Polygon(p).centroid)\n",
"ALTITUDE = float(np.median(np.linalg.norm(recorded, axis=1))) - 6378137.0\n",
- "emit = Instrument(name=\"EMIT\", field_of_regard=utils.swath_width_to_field_of_regard(ALTITUDE, scenes[\"width (km)\"].median() * 1e3))\n",
+ "emit = Instrument(\n",
+ " name=\"EMIT\",\n",
+ " field_of_regard=utils.swath_width_to_field_of_regard(\n",
+ " ALTITUDE, scenes[\"width (km)\"].median() * 1e3\n",
+ " ),\n",
+ ")\n",
"satellite = Satellite(name=\"ISS\", orbit=iss, instruments=[emit])\n",
"\n",
"\n",
@@ -759,7 +869,13 @@
" \"\"\"TAT-C's observation of a scene's center near its midpoint time.\"\"\"\n",
" point = Point(id=0, latitude=scene.center.y, longitude=scene.center.x)\n",
" mid = scene.mid.floor(\"us\").to_pydatetime()\n",
- " obs = collect_observations(point, satellite, mid - timedelta(minutes=30), mid + timedelta(minutes=30), omit_solar=False)\n",
+ " obs = collect_observations(\n",
+ " point,\n",
+ " satellite,\n",
+ " mid - timedelta(minutes=30),\n",
+ " mid + timedelta(minutes=30),\n",
+ " omit_solar=False,\n",
+ " )\n",
" if obs.empty:\n",
" return {\"id\": scene.id, \"observed\": False}\n",
" o = obs.iloc[np.argmin(np.abs((obs.epoch - scene.mid).dt.total_seconds()))]\n",
@@ -775,18 +891,28 @@
"with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
" observed = pd.DataFrame(list(pool.map(observe, scenes.itertuples())))\n",
"scenes = scenes.merge(observed, on=\"id\")\n",
- "scenes[\"days before TLE epoch\"] = (pd.Timestamp(TLE_EPOCH) - scenes.mid) / pd.Timedelta(days=1)\n",
+ "scenes[\"days before TLE epoch\"] = (pd.Timestamp(TLE_EPOCH) - scenes.mid) / pd.Timedelta(\n",
+ " days=1\n",
+ ")\n",
"scenes[\"bin\"] = pd.cut(scenes[\"days before TLE epoch\"], [1, 3, 5, 7, 9, 11, 13, 15])\n",
"table2 = scenes.groupby(\"bin\", observed=True).agg(\n",
" **{\n",
" \"scenes\": (\"id\", \"size\"),\n",
" \"observed by TAT-C (%)\": (\"observed\", lambda x: 100 * x.mean()),\n",
" \"epoch minus midpoint, median (s)\": (\"epoch minus midpoint (s)\", \"median\"),\n",
- " \"solar zenith difference, max |x| (deg)\": (\"solar zenith difference (deg)\", lambda x: x.abs().max()),\n",
- " \"local solar time, range (h)\": (\"local solar time (h)\", lambda x: f\"{x.min():.1f} to {x.max():.1f}\"),\n",
+ " \"solar zenith difference, max |x| (deg)\": (\n",
+ " \"solar zenith difference (deg)\",\n",
+ " lambda x: x.abs().max(),\n",
+ " ),\n",
+ " \"local solar time, range (h)\": (\n",
+ " \"local solar time (h)\",\n",
+ " lambda x: f\"{x.min():.1f} to {x.max():.1f}\",\n",
+ " ),\n",
" }\n",
")\n",
- "print(f\"median scene width {scenes['width (km)'].median():.1f} km; station altitude {ALTITUDE / 1e3:.0f} km; field of regard {emit.field_of_regard:.2f} deg\")\n",
+ "print(\n",
+ " f\"median scene width {scenes['width (km)'].median():.1f} km; station altitude {ALTITUDE / 1e3:.0f} km; field of regard {emit.field_of_regard:.2f} deg\"\n",
+ ")\n",
"table2.round(2)"
]
},
@@ -796,10 +922,10 @@
"id": "ccbab319",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:00:12.747588Z",
- "iopub.status.busy": "2026-10-08T18:00:12.747588Z",
- "iopub.status.idle": "2026-10-08T18:00:13.226787Z",
- "shell.execute_reply": "2026-10-08T18:00:13.226279Z"
+ "iopub.execute_input": "2026-10-25T13:33:28.019065Z",
+ "iopub.status.busy": "2026-10-25T13:33:28.019065Z",
+ "iopub.status.idle": "2026-10-25T13:33:28.246801Z",
+ "shell.execute_reply": "2026-10-25T13:33:28.246447Z"
}
},
"outputs": [
@@ -816,14 +942,37 @@
],
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.6))\n",
- "axes[0].plot(scenes[\"days before TLE epoch\"], scenes[\"epoch minus midpoint (s)\"], \".\", ms=3, color=BLUE, label=\"EMIT scenes (TAT-C epoch minus scene midpoint)\")\n",
+ "axes[0].plot(\n",
+ " scenes[\"days before TLE epoch\"],\n",
+ " scenes[\"epoch minus midpoint (s)\"],\n",
+ " \".\",\n",
+ " ms=3,\n",
+ " color=BLUE,\n",
+ " label=\"EMIT scenes (TAT-C epoch minus scene midpoint)\",\n",
+ ")\n",
"hourly = ephemeris[ephemeris[\"days before TLE epoch\"] < 16]\n",
- "axes[0].plot(hourly[\"days before TLE epoch\"], -hourly[\"along-track (s)\"], \".\", ms=1, color=GRAY, label=\"minus along-track offset (Test 1)\")\n",
- "axes[0].set(xlabel=\"Days before TLE epoch\", ylabel=\"Time (s)\", title=\"Observation time offset\")\n",
+ "axes[0].plot(\n",
+ " hourly[\"days before TLE epoch\"],\n",
+ " -hourly[\"along-track (s)\"],\n",
+ " \".\",\n",
+ " ms=1,\n",
+ " color=GRAY,\n",
+ " label=\"minus along-track offset (Test 1)\",\n",
+ ")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Days before TLE epoch\", ylabel=\"Time (s)\", title=\"Observation time offset\"\n",
+ ")\n",
"axes[0].invert_xaxis()\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
- "axes[1].scatter(scenes.mid.dt.tz_convert(None), scenes[\"local solar time (h)\"], s=3, color=ORANGE)\n",
- "axes[1].set(ylabel=\"Local solar time (h)\", title=\"Local solar time of EMIT scenes (TAT-C)\", ylim=(0, 24), yticks=range(0, 25, 4))\n",
+ "axes[1].scatter(\n",
+ " scenes.mid.dt.tz_convert(None), scenes[\"local solar time (h)\"], s=3, color=ORANGE\n",
+ ")\n",
+ "axes[1].set(\n",
+ " ylabel=\"Local solar time (h)\",\n",
+ " title=\"Local solar time of EMIT scenes (TAT-C)\",\n",
+ " ylim=(0, 24),\n",
+ " yticks=range(0, 25, 4),\n",
+ ")\n",
"axes[1].tick_params(axis=\"x\", rotation=30)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -838,7 +987,7 @@
"\n",
"The observation epochs follow the orbit's along-track offset, except for a constant offset: where the orbit is accurate, TAT-C observes the scene centers 8.5 s (7.2 to 9.0 s) before the scenes' midpoint times, which is about 60 km along track.\n",
"\n",
- "The station does not fly level: its attitude, recorded with the ephemeris, is expressed relative to the local orbital frame (forward, cross-track, and nadir axes) as yaw, pitch, and roll angles. EMIT is then modeled as a rectangular `PointedInstrument` with the same cross-track field of view, tilted by the station's median pitch angle (positive pitch looks forward), and the observation epochs of the scenes are compared again."
+ "The station does not fly level: its attitude, recorded with the ephemeris, is expressed relative to the local orbital frame (forward, cross-track, and nadir axes) as yaw, pitch, and roll angles. EMIT is then modeled as a rectangular `PointedInstrument` with the same cross-track field of view, tilted by the station's median pitch angle (positive pitch looks forward), and the observation epochs of the scenes are compared again. The station's attitude is also represented directly, as the satellite's: an `AttitudeSchedule` of its recorded yaw, pitch, and roll angles (every 5 minutes, in the orbits with data, each from 2.5 minutes before its sample; TAT-C's yaw is positive to the left, the station's to the right), with EMIT viewing along the station's vertical axis."
]
},
{
@@ -847,10 +996,10 @@
"id": "3ed3beb1",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:00:13.232798Z",
- "iopub.status.busy": "2026-10-08T18:00:13.231796Z",
- "iopub.status.idle": "2026-10-08T18:00:13.293468Z",
- "shell.execute_reply": "2026-10-08T18:00:13.292455Z"
+ "iopub.execute_input": "2026-10-25T13:33:28.248754Z",
+ "iopub.status.busy": "2026-10-25T13:33:28.248754Z",
+ "iopub.status.idle": "2026-10-25T13:33:28.268322Z",
+ "shell.execute_reply": "2026-10-25T13:33:28.268322Z"
}
},
"outputs": [
@@ -923,23 +1072,39 @@
}
],
"source": [
- "attitude = pd.concat(attitudes).drop_duplicates(\"tt_j2000\").sort_values(\"tt_j2000\").reset_index(drop=True)\n",
+ "attitude = (\n",
+ " pd.concat(attitudes)\n",
+ " .drop_duplicates(\"tt_j2000\")\n",
+ " .sort_values(\"tt_j2000\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
"attitude_times = timescale.tt_jd(2451545.0 + attitude.tt_j2000.to_numpy() / 86400)\n",
- "nearest = np.searchsorted(ephemeris.tt_j2000.to_numpy(), attitude.tt_j2000.to_numpy()).clip(0, len(ephemeris) - 1)\n",
+ "nearest = np.searchsorted(\n",
+ " ephemeris.tt_j2000.to_numpy(), attitude.tt_j2000.to_numpy()\n",
+ ").clip(0, len(ephemeris) - 1)\n",
"r_eci, v_eci = recorded[nearest], velocity[nearest]\n",
"nadir = -r_eci / np.linalg.norm(r_eci, axis=1, keepdims=True)\n",
"cross = -np.cross(r_eci, v_eci)\n",
"cross /= np.linalg.norm(cross, axis=1, keepdims=True)\n",
"forward = np.cross(cross, nadir)\n",
"orbital = np.stack([forward, cross, nadir], axis=1) # rows: orbital frame axes in J2000\n",
- "body = Rotation.from_quat(attitude[[\"qx\", \"qy\", \"qz\", \"qw\"]].to_numpy()).as_matrix() # columns: body axes in J2000\n",
+ "body = Rotation.from_quat(\n",
+ " attitude[[\"qx\", \"qy\", \"qz\", \"qw\"]].to_numpy()\n",
+ ").as_matrix() # columns: body axes in J2000\n",
"angles = Rotation.from_matrix(orbital @ body).as_euler(\"ZYX\", degrees=True)\n",
"attitude[\"yaw (deg)\"], attitude[\"pitch (deg)\"], attitude[\"roll (deg)\"] = angles.T\n",
"attitude[\"time\"] = pd.to_datetime(attitude_times.utc_datetime())\n",
- "in_scenes = attitude[(attitude.time >= pd.Timestamp(SCENES_START)) & (attitude.time < pd.Timestamp(SCENES_END))]\n",
+ "in_scenes = attitude[\n",
+ " (attitude.time >= pd.Timestamp(SCENES_START))\n",
+ " & (attitude.time < pd.Timestamp(SCENES_END))\n",
+ "]\n",
"PITCH = float(in_scenes[\"pitch (deg)\"].median())\n",
- "print(f\"station attitude, {SCENES_START:%d %b} to {SCENES_END - timedelta(days=1):%d %b} (median and 5th to 95th percentiles):\")\n",
- "in_scenes[[\"yaw (deg)\", \"pitch (deg)\", \"roll (deg)\"]].describe(percentiles=[0.05, 0.5, 0.95]).loc[[\"5%\", \"50%\", \"95%\"]].round(2)"
+ "print(\n",
+ " f\"station attitude, {SCENES_START:%d %b} to {SCENES_END - timedelta(days=1):%d %b} (median and 5th to 95th percentiles):\"\n",
+ ")\n",
+ "in_scenes[[\"yaw (deg)\", \"pitch (deg)\", \"roll (deg)\"]].describe(\n",
+ " percentiles=[0.05, 0.5, 0.95]\n",
+ ").loc[[\"5%\", \"50%\", \"95%\"]].round(2)"
]
},
{
@@ -948,13 +1113,20 @@
"id": "7d5136de",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:00:13.298465Z",
- "iopub.status.busy": "2026-10-08T18:00:13.297465Z",
- "iopub.status.idle": "2026-10-08T18:02:11.771635Z",
- "shell.execute_reply": "2026-10-08T18:02:11.771129Z"
+ "iopub.execute_input": "2026-10-25T13:33:28.270760Z",
+ "iopub.status.busy": "2026-10-25T13:33:28.269760Z",
+ "iopub.status.idle": "2026-10-25T13:35:51.327203Z",
+ "shell.execute_reply": "2026-10-25T13:35:51.327203Z"
}
},
"outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "214 attitude segments\n"
+ ]
+ },
{
"data": {
"text/html": [
@@ -978,6 +1150,7 @@
"
\n",
"
nadir instrument
\n",
"
instrument pitched -8.9 deg
\n",
+ "
station attitude schedule
\n",
"
\n",
" \n",
" \n",
@@ -985,21 +1158,25 @@
"
scenes observed (within 9 days of the TLE epoch)
\n",
"
1698.00
\n",
"
1698.00
\n",
+ "
1691.00
\n",
" \n",
"
\n",
"
epoch minus midpoint, 5% (s)
\n",
"
-9.04
\n",
"
0.65
\n",
+ "
0.47
\n",
"
\n",
"
\n",
"
epoch minus midpoint, 50% (s)
\n",
"
-8.47
\n",
"
1.22
\n",
+ "
1.14
\n",
"
\n",
"
\n",
"
epoch minus midpoint, 95% (s)
\n",
"
-7.18
\n",
"
2.51
\n",
+ "
1.77
\n",
"
\n",
" \n",
"\n",
@@ -1012,11 +1189,17 @@
"epoch minus midpoint, 50% (s) -8.47 \n",
"epoch minus midpoint, 95% (s) -7.18 \n",
"\n",
- " instrument pitched -8.9 deg \n",
- "scenes observed (within 9 days of the TLE epoch) 1698.00 \n",
- "epoch minus midpoint, 5% (s) 0.65 \n",
- "epoch minus midpoint, 50% (s) 1.22 \n",
- "epoch minus midpoint, 95% (s) 2.51 "
+ " instrument pitched -8.9 deg \\\n",
+ "scenes observed (within 9 days of the TLE epoch) 1698.00 \n",
+ "epoch minus midpoint, 5% (s) 0.65 \n",
+ "epoch minus midpoint, 50% (s) 1.22 \n",
+ "epoch minus midpoint, 95% (s) 2.51 \n",
+ "\n",
+ " station attitude schedule \n",
+ "scenes observed (within 9 days of the TLE epoch) 1691.00 \n",
+ "epoch minus midpoint, 5% (s) 0.47 \n",
+ "epoch minus midpoint, 50% (s) 1.14 \n",
+ "epoch minus midpoint, 95% (s) 1.77 "
]
},
"execution_count": 7,
@@ -1025,15 +1208,50 @@
}
],
"source": [
- "emit_pitched = PointedInstrument(name=\"EMIT\", cross_track_field_of_view=emit.field_of_regard, along_track_field_of_view=1, pitch_angle=PITCH, is_rectangular=True)\n",
+ "emit_pitched = PointedInstrument(\n",
+ " name=\"EMIT\",\n",
+ " cross_track_field_of_view=emit.field_of_regard,\n",
+ " along_track_field_of_view=1,\n",
+ " pitch_angle=PITCH,\n",
+ " is_rectangular=True,\n",
+ ")\n",
"pitched_satellite = Satellite(name=\"ISS\", orbit=iss, instruments=[emit_pitched])\n",
"\n",
"\n",
- "def observe_pitched(scene):\n",
- " \"\"\"Observation epoch of a scene's center by the pitched instrument, relative to its midpoint time.\"\"\"\n",
+ "# the station's recorded attitude as the satellite's: a schedule of the attitude of each sample\n",
+ "samples = attitude[\n",
+ " (attitude.time >= pd.Timestamp(SCENES_START) - pd.Timedelta(hours=1))\n",
+ " & (attitude.time < pd.Timestamp(SCENES_END))\n",
+ "]\n",
+ "station_attitude = AttitudeSchedule.from_attitudes(\n",
+ " [t.floor(\"us\").to_pydatetime() - timedelta(minutes=2.5) for t in samples.time],\n",
+ " [\n",
+ " Attitude(\n",
+ " yaw_angle=-row[\"yaw (deg)\"],\n",
+ " pitch_angle=row[\"pitch (deg)\"],\n",
+ " roll_angle=row[\"roll (deg)\"],\n",
+ " )\n",
+ " for _, row in samples.iterrows()\n",
+ " ],\n",
+ ")\n",
+ "emit_body = PointedInstrument(\n",
+ " name=\"EMIT\",\n",
+ " cross_track_field_of_view=emit.field_of_regard,\n",
+ " along_track_field_of_view=1,\n",
+ " is_rectangular=True,\n",
+ ")\n",
+ "scheduled_satellite = Satellite(\n",
+ " name=\"ISS\", orbit=iss, instruments=[emit_body], attitude=station_attitude\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def observe_offset(satellite, scene):\n",
+ " \"\"\"Observation epoch of a scene's center by a satellite's instrument, relative to its midpoint time.\"\"\"\n",
" point = Point(id=0, latitude=scene.center.y, longitude=scene.center.x)\n",
" mid = scene.mid.floor(\"us\").to_pydatetime()\n",
- " obs = collect_observations(point, pitched_satellite, mid - timedelta(minutes=30), mid + timedelta(minutes=30))\n",
+ " obs = collect_observations(\n",
+ " point, satellite, mid - timedelta(minutes=30), mid + timedelta(minutes=30)\n",
+ " )\n",
" if obs.empty:\n",
" return np.nan\n",
" offsets = (obs.epoch - scene.mid).dt.total_seconds().to_numpy()\n",
@@ -1042,13 +1260,42 @@
"\n",
"recent = scenes[scenes[\"days before TLE epoch\"] < 9]\n",
"with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
- " pitched_offsets = np.array(list(pool.map(observe_pitched, recent.itertuples())))\n",
+ " pitched_offsets = np.array(\n",
+ " list(\n",
+ " pool.map(\n",
+ " lambda scene: observe_offset(pitched_satellite, scene),\n",
+ " recent.itertuples(),\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ " scheduled_offsets = np.array(\n",
+ " list(\n",
+ " pool.map(\n",
+ " lambda scene: observe_offset(scheduled_satellite, scene),\n",
+ " recent.itertuples(),\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ "print(f\"{len(station_attitude.segments)} attitude segments\")\n",
"pd.DataFrame(\n",
" {\n",
- " \"nadir instrument\": recent[\"epoch minus midpoint (s)\"].describe(percentiles=[0.05, 0.5, 0.95]),\n",
- " f\"instrument pitched {PITCH:.1f} deg\": pd.Series(pitched_offsets).describe(percentiles=[0.05, 0.5, 0.95]),\n",
+ " \"nadir instrument\": recent[\"epoch minus midpoint (s)\"].describe(\n",
+ " percentiles=[0.05, 0.5, 0.95]\n",
+ " ),\n",
+ " f\"instrument pitched {PITCH:.1f} deg\": pd.Series(pitched_offsets).describe(\n",
+ " percentiles=[0.05, 0.5, 0.95]\n",
+ " ),\n",
+ " \"station attitude schedule\": pd.Series(scheduled_offsets).describe(\n",
+ " percentiles=[0.05, 0.5, 0.95]\n",
+ " ),\n",
" }\n",
- ").loc[[\"count\", \"5%\", \"50%\", \"95%\"]].round(2).rename(index=lambda i: f\"epoch minus midpoint, {i} (s)\" if i != \"count\" else \"scenes observed (within 9 days of the TLE epoch)\")"
+ ").loc[[\"count\", \"5%\", \"50%\", \"95%\"]].round(2).rename(\n",
+ " index=lambda i: (\n",
+ " f\"epoch minus midpoint, {i} (s)\"\n",
+ " if i != \"count\"\n",
+ " else \"scenes observed (within 9 days of the TLE epoch)\"\n",
+ " )\n",
+ ")"
]
},
{
@@ -1056,18 +1303,18 @@
"id": "3f919cba",
"metadata": {},
"source": [
- "The station flies pitched by -8.9 deg (between -9.4 and -7.6 deg) relative to its local orbital frame, with a yaw of -4 deg and a roll of 0.9 deg, as the station's attitude is chosen to minimize the torques on it. EMIT, fixed to the station, thus views about 9 deg aft of nadir. With this pitch, TAT-C's observation epochs agree with the scenes' midpoint times to within 1.2 s (median; 0.7 to 2.5 s), instead of 8.5 s, the remainder reflecting the variations of the station's attitude and EMIT's alignment.\n",
+ "The station flies pitched by -8.9 deg (between -9.4 and -7.6 deg) relative to its local orbital frame, with a yaw of -4 deg and a roll of 0.9 deg, as the station's attitude is chosen to minimize the torques on it. EMIT, fixed to the station, thus views about 9 deg aft of nadir. With this pitch, TAT-C's observation epochs agree with the scenes' midpoint times to within 1.2 s (median; 0.7 to 2.5 s), instead of 8.5 s, the remainder reflecting the variations of the station's attitude and EMIT's alignment. With the station's recorded attitude as an `AttitudeSchedule`, which follows these variations, the epochs agree within 1.1 s (median; 0.5 to 1.8 s). Seven of the 1,698 scenes are then missed, all on 26 September, after a 14-hour gap in the attitude samples during which the station turned from flying backward (a yaw of 176 deg, around its maneuver of 25 September) to flying forward: the schedule holds the backward attitude through the gap. With attitude samples throughout the period, the schedule represents such changes of the station's attitude, which a fixed pitch angle does not.\n",
"\n",
"## Summary\n",
"\n",
"| Test | Result |\n",
"| --- | --- |\n",
"| 1. Orbit | TLE within 6 km along track and 2 km across track back to the station's last maneuver (9 days before the TLE epoch); along-track errors grow by about 250 km per day before it |\n",
- "| 2. Observations | all EMIT scenes predicted within 9 days of the TLE epoch, with solar zenith angles within 0.05 deg; observation epochs within 1.2 s (median) when EMIT is modeled with the station's 8.9 deg pitch, 8.5 s when viewing nadir |\n",
+ "| 2. Observations | all EMIT scenes predicted within 9 days of the TLE epoch, with solar zenith angles within 0.05 deg; observation epochs within 1.1 s (median; 1.8 s at the 95th percentile) with the station's recorded attitude as an `AttitudeSchedule`, 1.2 s (2.5 s) with its median 8.9 deg pitch, and 8.5 s when viewing nadir |\n",
"\n",
"**Orbit.** A TLE propagated by SGP4 represents the ISS's low orbit well (a few kilometers) until the station's last maneuver, but not before it: the station is reboosted every few weeks, and a TLE describes the orbit only since the last reboost. Analyses of past ISS observations need TLEs that bracket the period (a multi-element `GeneralPerturbationsOrbit`), and predictions for the future are limited by the next maneuver and by drag.\n",
"\n",
- "**Observations.** TAT-C predicts the scenes of an ISS instrument and their solar geometry, including the drift of local solar time of a precessing orbit. Instruments fixed to the station view along the station's axes rather than nadir: the station's attitude (here, a pitch of about 9 deg) shifts their observations along track and can be modeled with the pitch (and roll) angles of a `PointedInstrument`."
+ "**Observations.** TAT-C predicts the scenes of an ISS instrument and their solar geometry, including the drift of local solar time of a precessing orbit. Instruments fixed to the station view along the station's axes rather than nadir: the station's attitude (here, a pitch of about 9 deg, and at times flying backward) shifts their observations along track. It is modeled as the satellite's `Attitude` (or an `AttitudeSchedule` of the recorded attitude), from which the instruments' views are rotated, or approximately with the pitch (and roll) angles of a `PointedInstrument`."
]
}
],
diff --git a/docs/validation/ValidatePointingOCO2.ipynb b/docs/validation/ValidatePointingOCO2.ipynb
index 17cea3a9..d99df60b 100644
--- a/docs/validation/ValidatePointingOCO2.ipynb
+++ b/docs/validation/ValidatePointingOCO2.ipynb
@@ -15,12 +15,14 @@
"\n",
"Throughout, the spacecraft yaws so that the slit stays perpendicular to the plane containing the Sun and the line of sight (the solar principal plane), which keeps the polarization of the measured light constant.\n",
"\n",
- "TAT-C represents a pointed instrument as a `PointedInstrument` whose roll and pitch angles may vary around the orbit (`roll_angle_profile` and `pitch_angle_profile`, as functions of the argument of latitude), and whose field of view is aligned with the ground track. This notebook asks:\n",
+ "TAT-C represents a pointed instrument as a `PointedInstrument`, whose view is rotated from the axes of the spacecraft's body, and the spacecraft's attitude: an `Attitude` whose yaw, roll, and pitch angles may vary around the orbit (as functions of the argument of latitude), a `TargetAttitude` that points at ground targets, a `GlintAttitude` that points at or near the sun glint (the specular point), or an `AttitudeSchedule` that switches between them over time. This notebook asks:\n",
"\n",
"1. **Operating modes.** How does OCO-2 schedule its modes?\n",
- "2. **Nadir mode.** Does a nadir `PointedInstrument` reproduce OCO-2's footprints and swath?\n",
- "3. **Glint mode.** Can roll and pitch angle profiles represent glint pointing, and for how long?\n",
- "4. **Repeat cycle.** Does TAT-C find OCO-2's 16-day repeat cycle, and does the ground track repeat?"
+ "2. **Nadir mode.** Does a nadir `PointedInstrument` reproduce OCO-2's footprints, and a yaw angle profile its slit?\n",
+ "3. **Glint mode.** Does TAT-C locate the glint spot, and does a `GlintAttitude` reproduce OCO-2's glint pointing over weeks (compared with roll and pitch angle profiles)?\n",
+ "4. **Repeat cycle.** Does TAT-C find OCO-2's 16-day repeat cycle, and does the ground track repeat?\n",
+ "5. **Target mode.** Does a `TargetAttitude` reproduce OCO-2's target observations?\n",
+ "6. **Mode schedule.** Does one satellite with an `AttitudeSchedule` reproduce all of OCO-2's modes?"
]
},
{
@@ -39,10 +41,10 @@
"id": "03090d73",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:29:30.772166Z",
- "iopub.status.busy": "2026-10-08T18:29:30.771167Z",
- "iopub.status.idle": "2026-10-08T18:29:32.978805Z",
- "shell.execute_reply": "2026-10-08T18:29:32.978805Z"
+ "iopub.execute_input": "2026-10-25T18:16:09.986445Z",
+ "iopub.status.busy": "2026-10-25T18:16:09.986445Z",
+ "iopub.status.idle": "2026-10-25T18:16:13.743312Z",
+ "shell.execute_reply": "2026-10-25T18:16:13.742305Z"
}
},
"outputs": [
@@ -160,13 +162,17 @@
" def __init__(self, url, block_size=2**20, prefetch=1):\n",
" self.block_size, self.blocks, self.position = block_size, {}, 0\n",
" response = self._get(url, 0, prefetch * block_size)\n",
- " self.url, self.size = response.url, int(response.headers[\"Content-Range\"].split(\"/\")[1])\n",
+ " self.url, self.size = response.url, int(\n",
+ " response.headers[\"Content-Range\"].split(\"/\")[1]\n",
+ " )\n",
" self._store(0, response.content)\n",
"\n",
" def _get(self, url, start, end):\n",
" for attempt in range(5):\n",
" try:\n",
- " response = https_session().get(url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300)\n",
+ " response = https_session().get(\n",
+ " url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300\n",
+ " )\n",
" response.raise_for_status()\n",
" return response\n",
" except requests.RequestException:\n",
@@ -187,18 +193,30 @@
" return self.position\n",
"\n",
" def seek(self, offset, whence=io.SEEK_SET):\n",
- " self.position = {io.SEEK_SET: 0, io.SEEK_CUR: self.position, io.SEEK_END: self.size}[whence] + offset\n",
+ " self.position = {\n",
+ " io.SEEK_SET: 0,\n",
+ " io.SEEK_CUR: self.position,\n",
+ " io.SEEK_END: self.size,\n",
+ " }[whence] + offset\n",
" return self.position\n",
"\n",
" def readinto(self, buffer):\n",
" n = min(len(buffer), self.size - self.position)\n",
" if n <= 0:\n",
" return 0\n",
- " first, last = self.position // self.block_size, (self.position + n - 1) // self.block_size\n",
- " missing = [block for block in range(first, last + 1) if block not in self.blocks]\n",
+ " first, last = (\n",
+ " self.position // self.block_size,\n",
+ " (self.position + n - 1) // self.block_size,\n",
+ " )\n",
+ " missing = [\n",
+ " block for block in range(first, last + 1) if block not in self.blocks\n",
+ " ]\n",
" if missing:\n",
" end = min((missing[-1] + 1) * self.block_size, self.size)\n",
- " self._store(missing[0], self._get(self.url, missing[0] * self.block_size, end).content)\n",
+ " self._store(\n",
+ " missing[0],\n",
+ " self._get(self.url, missing[0] * self.block_size, end).content,\n",
+ " )\n",
" data = b\"\".join(self.blocks[block] for block in range(first, last + 1))\n",
" offset = self.position - first * self.block_size\n",
" buffer[:n] = data[offset : offset + n]\n",
@@ -217,11 +235,44 @@
" np.savez_compressed(\n",
" path,\n",
" frame_time_tai93=f[\"FrameHeader/frame_time_tai93\"][:][k],\n",
- " **{name: fg[name][:][k] for name in [\"spacecraft_position\", \"spacecraft_velocity\", \"spacecraft_lat\", \"spacecraft_lon\", \"spacecraft_alt\", \"roll\", \"pitch\", \"yaw\", \"glint_spot_latitude\", \"glint_spot_longitude\", \"glint_off_pointing_angle\", \"ground_track\"]},\n",
- " **{name: sg[name][:][k] for name in [\"sounding_time_tai93\", \"sounding_latitude\", \"sounding_longitude\", \"sounding_altitude\", \"sounding_zenith\", \"sounding_azimuth\", \"sounding_solar_zenith\", \"sounding_solar_azimuth\", \"sounding_polarization_angle\"]},\n",
+ " **{\n",
+ " name: fg[name][:][k]\n",
+ " for name in [\n",
+ " \"spacecraft_position\",\n",
+ " \"spacecraft_velocity\",\n",
+ " \"spacecraft_lat\",\n",
+ " \"spacecraft_lon\",\n",
+ " \"spacecraft_alt\",\n",
+ " \"roll\",\n",
+ " \"pitch\",\n",
+ " \"yaw\",\n",
+ " \"glint_spot_latitude\",\n",
+ " \"glint_spot_longitude\",\n",
+ " \"glint_off_pointing_angle\",\n",
+ " \"ground_track\",\n",
+ " ]\n",
+ " },\n",
+ " **{\n",
+ " name: sg[name][:][k]\n",
+ " for name in [\n",
+ " \"sounding_time_tai93\",\n",
+ " \"sounding_latitude\",\n",
+ " \"sounding_longitude\",\n",
+ " \"sounding_altitude\",\n",
+ " \"sounding_zenith\",\n",
+ " \"sounding_azimuth\",\n",
+ " \"sounding_solar_zenith\",\n",
+ " \"sounding_solar_azimuth\",\n",
+ " \"sounding_polarization_angle\",\n",
+ " ]\n",
+ " },\n",
" sounding_operation_mode=sg[\"sounding_operation_mode\"][:][k].astype(\"U3\"),\n",
- " vertex_latitude=f[\"FootprintGeometry/footprint_vertex_latitude\"][::100, :, 0, :],\n",
- " vertex_longitude=f[\"FootprintGeometry/footprint_vertex_longitude\"][::100, :, 0, :],\n",
+ " vertex_latitude=f[\"FootprintGeometry/footprint_vertex_latitude\"][\n",
+ " ::100, :, 0, :\n",
+ " ],\n",
+ " vertex_longitude=f[\"FootprintGeometry/footprint_vertex_longitude\"][\n",
+ " ::100, :, 0, :\n",
+ " ],\n",
" )\n",
" return path\n",
"\n",
@@ -229,8 +280,18 @@
"if not any(DATA_DIR.glob(\"oco2_L1bSc*.npz\")):\n",
" import earthaccess\n",
"\n",
- " results = earthaccess.search_data(short_name=\"OCO2_L1B_Science\", temporal=(\"2026-09-14T00:00:00Z\", \"2026-09-30T23:59:59Z\"))\n",
- " urls = sorted(next(link[\"URL\"] for link in r[\"umm\"][\"RelatedUrls\"] if link[\"URL\"].startswith(\"https\") and link[\"URL\"].endswith(\".h5\")) for r in results)\n",
+ " results = earthaccess.search_data(\n",
+ " short_name=\"OCO2_L1B_Science\",\n",
+ " temporal=(\"2026-09-14T00:00:00Z\", \"2026-09-30T23:59:59Z\"),\n",
+ " )\n",
+ " urls = sorted(\n",
+ " next(\n",
+ " link[\"URL\"]\n",
+ " for link in r[\"umm\"][\"RelatedUrls\"]\n",
+ " if link[\"URL\"].startswith(\"https\") and link[\"URL\"].endswith(\".h5\")\n",
+ " )\n",
+ " for r in results\n",
+ " )\n",
" with concurrent.futures.ThreadPoolExecutor(6) as pool:\n",
" list(pool.map(reduce_file, urls))\n",
"\n",
@@ -239,13 +300,45 @@
" match = re.match(r\"oco2_L1bSc(\\w\\w)_(\\d+)(\\w)_\", path.name)\n",
" with np.load(path) as d:\n",
" record = {key: d[key] for key in d.files}\n",
- " valid = (record[\"frame_time_tai93\"] > 0) & np.all(np.abs(record[\"sounding_latitude\"]) <= 90, axis=1)\n",
- " record = {key: (value[valid] if key not in (\"vertex_latitude\", \"vertex_longitude\") and len(value) == len(valid) else value) for key, value in record.items()}\n",
- " record.update({\"name\": path.stem, \"mode\": match.group(1), \"orbit\": int(match.group(2)), \"segment\": match.group(3)})\n",
+ " valid = (record[\"frame_time_tai93\"] > 0) & np.all(\n",
+ " np.abs(record[\"sounding_latitude\"]) <= 90, axis=1\n",
+ " )\n",
+ " record = {\n",
+ " key: (\n",
+ " value[valid]\n",
+ " if key not in (\"vertex_latitude\", \"vertex_longitude\")\n",
+ " and len(value) == len(valid)\n",
+ " else value\n",
+ " )\n",
+ " for key, value in record.items()\n",
+ " }\n",
+ " record.update(\n",
+ " {\n",
+ " \"name\": path.stem,\n",
+ " \"mode\": match.group(1),\n",
+ " \"orbit\": int(match.group(2)),\n",
+ " \"segment\": match.group(3),\n",
+ " }\n",
+ " )\n",
" if len(record[\"frame_time_tai93\"]):\n",
" files.append(record)\n",
- "catalog = pd.DataFrame([{\"mode\": f[\"mode\"], \"orbit\": f[\"orbit\"], \"frames\": len(f[\"frame_time_tai93\"]), \"start\": pd.Timestamp(\"1993-01-01\", tz=\"UTC\") + pd.to_timedelta(f[\"frame_time_tai93\"][0] - 11, unit=\"s\")} for f in files])\n",
- "catalog.groupby(\"mode\").agg(files=(\"orbit\", \"size\"), orbits=(\"orbit\", \"nunique\"), hours=(\"frames\", lambda x: x.sum() * FRAME_STEP / 3 / 3600)).round(1)"
+ "catalog = pd.DataFrame(\n",
+ " [\n",
+ " {\n",
+ " \"mode\": f[\"mode\"],\n",
+ " \"orbit\": f[\"orbit\"],\n",
+ " \"frames\": len(f[\"frame_time_tai93\"]),\n",
+ " \"start\": pd.Timestamp(\"1993-01-01\", tz=\"UTC\")\n",
+ " + pd.to_timedelta(f[\"frame_time_tai93\"][0] - 11, unit=\"s\"),\n",
+ " }\n",
+ " for f in files\n",
+ " ]\n",
+ ")\n",
+ "catalog.groupby(\"mode\").agg(\n",
+ " files=(\"orbit\", \"size\"),\n",
+ " orbits=(\"orbit\", \"nunique\"),\n",
+ " hours=(\"frames\", lambda x: x.sum() * FRAME_STEP / 3 / 3600),\n",
+ ").round(1)"
]
},
{
@@ -255,7 +348,7 @@
"source": [
"## Setup\n",
"\n",
- "Frame times are given in seconds since 1 January 1993 in International Atomic Time (TAI), converted to UTC with Skyfield. The footprint of a frame is represented by the mean location of its eight soundings, and its pointing by TAT-C's roll (positive left) and pitch (positive forward) angles of that location from the spacecraft (`compute_view_angles`), relative to the geodetic nadir and the Earth-fixed velocity."
+ "Frame times are given in seconds of International Atomic Time (TAI) since 1 January 1993 00:00:00 UTC, when TAI was 27 s ahead of UTC, converted to UTC with Skyfield. The footprint of a frame is represented by the mean location of its eight soundings, and its pointing by TAT-C's roll (positive left) and pitch (positive forward) angles of that location from the spacecraft (`compute_view_angles`), relative to the geodetic nadir and the Earth-fixed velocity."
]
},
{
@@ -264,10 +357,10 @@
"id": "64bf4c92",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:29:32.981813Z",
- "iopub.status.busy": "2026-10-08T18:29:32.980812Z",
- "iopub.status.idle": "2026-10-08T18:29:45.342238Z",
- "shell.execute_reply": "2026-10-08T18:29:45.341231Z"
+ "iopub.execute_input": "2026-10-25T18:16:13.745309Z",
+ "iopub.status.busy": "2026-10-25T18:16:13.745309Z",
+ "iopub.status.idle": "2026-10-25T18:16:29.675942Z",
+ "shell.execute_reply": "2026-10-25T18:16:29.675942Z"
}
},
"outputs": [
@@ -287,18 +380,57 @@
"from skyfield.units import Distance, Velocity\n",
"\n",
"from tatc.constants import timescale\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, PointedInstrument\n",
- "from tatc.utils import compute_argument_of_latitude, compute_projected_ray_position, compute_view_angles, geodesic_distance\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " AttitudeSchedule,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " GlintAttitude,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ " TargetAttitude,\n",
+ ")\n",
+ "from tatc.utils import (\n",
+ " compute_argument_of_latitude,\n",
+ " compute_projected_ray_position,\n",
+ " compute_specular_point,\n",
+ " compute_view_angles,\n",
+ " geodesic_distance,\n",
+ ")\n",
"\n",
"orbit = GeneralPerturbationsOrbit.from_tle(TLE)\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"\n",
"\n",
"def frame_track(record, k):\n",
" \"\"\"OCO-2's reported (inertial) position and velocity at frames k.\"\"\"\n",
- " t = timescale.tai(1993, 1, 1, 0, 0, 26 + record[\"frame_time_tai93\"][k].astype(float))\n",
- " return Geocentric(Distance(m=record[\"spacecraft_position\"][k].T.astype(float)).au, Velocity(km_per_s=record[\"spacecraft_velocity\"][k].T.astype(float) / 1e3).au_per_d, t)\n",
+ " # TAI seconds since 1993-01-01 00:00:00 UTC, when TAI - UTC was 27 s\n",
+ " t = timescale.tai(\n",
+ " 1993, 1, 1, 0, 0, 27 + record[\"frame_time_tai93\"][k].astype(float)\n",
+ " )\n",
+ " return Geocentric(\n",
+ " Distance(m=record[\"spacecraft_position\"][k].T.astype(float)).au,\n",
+ " Velocity(\n",
+ " km_per_s=record[\"spacecraft_velocity\"][k].T.astype(float) / 1e3\n",
+ " ).au_per_d,\n",
+ " t,\n",
+ " )\n",
"\n",
"\n",
"def frame_geometry(record, step=3):\n",
@@ -310,18 +442,36 @@
" center_lon = np.degrees(np.angle(np.exp(1j * np.radians(lon)).mean(axis=1)))\n",
" angles = np.array(\n",
" [\n",
- " [compute_view_angles(track[i], wgs84.latlon(a, b)) for a, b in ((center_lat[i], center_lon[i]), (lat[i, 0], lon[i, 0]), (lat[i, 7], lon[i, 7]))]\n",
+ " [\n",
+ " compute_view_angles(track[i], wgs84.latlon(a, b))\n",
+ " for a, b in (\n",
+ " (center_lat[i], center_lon[i]),\n",
+ " (lat[i, 0], lon[i, 0]),\n",
+ " (lat[i, 7], lon[i, 7]),\n",
+ " )\n",
+ " ]\n",
" for i in range(len(k))\n",
" ]\n",
" ) # (frame, footprint, roll/pitch)\n",
" return pd.DataFrame(\n",
" {\n",
- " \"file\": record[\"name\"], \"mode\": record[\"mode\"], \"orbit\": record[\"orbit\"], \"index\": k,\n",
+ " \"file\": record[\"name\"],\n",
+ " \"mode\": record[\"mode\"],\n",
+ " \"orbit\": record[\"orbit\"],\n",
+ " \"index\": k,\n",
" \"time\": track.t.utc_datetime(),\n",
- " \"argument of latitude (deg)\": compute_argument_of_latitude(track.position.m, track.velocity.m_per_s),\n",
- " \"latitude (deg)\": center_lat, \"longitude (deg)\": center_lon,\n",
- " \"roll (deg)\": angles[:, 0, 0], \"pitch (deg)\": angles[:, 0, 1],\n",
- " \"slit angle from cross-track (deg)\": np.degrees(np.arctan2(angles[:, 2, 1] - angles[:, 1, 1], angles[:, 2, 0] - angles[:, 1, 0])),\n",
+ " \"argument of latitude (deg)\": compute_argument_of_latitude(\n",
+ " track.position.m, track.velocity.m_per_s\n",
+ " ),\n",
+ " \"latitude (deg)\": center_lat,\n",
+ " \"longitude (deg)\": center_lon,\n",
+ " \"roll (deg)\": angles[:, 0, 0],\n",
+ " \"pitch (deg)\": angles[:, 0, 1],\n",
+ " \"slit angle from cross-track (deg)\": np.degrees(\n",
+ " np.arctan2(\n",
+ " angles[:, 2, 1] - angles[:, 1, 1], angles[:, 2, 0] - angles[:, 1, 0]\n",
+ " )\n",
+ " ),\n",
" \"spacecraft yaw (deg)\": record[\"yaw\"][k],\n",
" \"glint off-pointing (deg)\": record[\"glint_off_pointing_angle\"][k],\n",
" \"solar zenith (deg)\": record[\"sounding_solar_zenith\"][k].mean(axis=1),\n",
@@ -329,7 +479,11 @@
" )\n",
"\n",
"\n",
- "frames = Parallel(n_jobs=-1)(delayed(frame_geometry)(record) for record in files if record[\"mode\"] in (\"GL\", \"ND\"))\n",
+ "frames = Parallel(n_jobs=-1)(\n",
+ " delayed(frame_geometry)(record)\n",
+ " for record in files\n",
+ " if record[\"mode\"] in (\"GL\", \"ND\")\n",
+ ")\n",
"frames = pd.concat(frames).sort_values(\"time\").reset_index(drop=True)\n",
"frames[\"day\"] = pd.DatetimeIndex(frames.time).strftime(\"%Y-%m-%d\")\n",
"record_by_name = {record[\"name\"]: record for record in files}\n",
@@ -352,10 +506,10 @@
"id": "32aef3ff",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:29:45.343748Z",
- "iopub.status.busy": "2026-10-08T18:29:45.343748Z",
- "iopub.status.idle": "2026-10-08T18:29:45.368699Z",
- "shell.execute_reply": "2026-10-08T18:29:45.367692Z"
+ "iopub.execute_input": "2026-10-25T18:16:29.677947Z",
+ "iopub.status.busy": "2026-10-25T18:16:29.677947Z",
+ "iopub.status.idle": "2026-10-25T18:16:29.701505Z",
+ "shell.execute_reply": "2026-10-25T18:16:29.700497Z"
}
},
"outputs": [
@@ -564,10 +718,21 @@
}
],
"source": [
- "orbit_modes = catalog[catalog[\"mode\"].isin([\"GL\", \"ND\"])].groupby(\"orbit\")[\"mode\"].agg(lambda x: \"+\".join(sorted(set(x))))\n",
+ "orbit_modes = (\n",
+ " catalog[catalog[\"mode\"].isin([\"GL\", \"ND\"])]\n",
+ " .groupby(\"orbit\")[\"mode\"]\n",
+ " .agg(lambda x: \"+\".join(sorted(set(x))))\n",
+ ")\n",
"catalog[\"day\"] = catalog.start.dt.strftime(\"%Y-%m-%d\")\n",
"table1 = catalog.groupby([\"day\", \"mode\"]).orbit.nunique().unstack(fill_value=0)\n",
- "print(\"consecutive orbits:\", \" \".join(orbit_modes.loc[orbit_modes.index[:40]].str.replace(\"GL\", \"G\").str.replace(\"ND\", \"N\")))\n",
+ "print(\n",
+ " \"consecutive orbits:\",\n",
+ " \" \".join(\n",
+ " orbit_modes.loc[orbit_modes.index[:40]]\n",
+ " .str.replace(\"GL\", \"G\")\n",
+ " .str.replace(\"ND\", \"N\")\n",
+ " ),\n",
+ ")\n",
"parity = pd.crosstab(orbit_modes.index % 2, orbit_modes)\n",
"print(parity)\n",
"table1"
@@ -578,7 +743,7 @@
"id": "fecc7b5d",
"metadata": {},
"source": [
- "OCO-2 alternates its modes by orbit: odd-numbered orbits are in glint mode, and most even-numbered orbits in nadir mode (86 of 124), with others in glint mode (34) or both (4). Over the 17 days, it observed for 119 hours in glint mode and 68 hours in nadir mode, with ten target observations (about 4 minutes each) and short special segments. TAT-C does not schedule modes: a mode can be modeled as a separate instrument (or satellite) for the orbits in which it is used, or a single analysis can represent one mode.\n",
+ "OCO-2 alternates its modes by orbit: odd-numbered orbits are in glint mode, and most even-numbered orbits in nadir mode (86 of 124), with others in glint mode (34) or both (4). Over the 17 days, it observed for 119 hours in glint mode and 68 hours in nadir mode, with ten target observations (about 4 minutes each) and short special segments. TAT-C represents such a schedule with an `AttitudeSchedule` of the spacecraft's attitudes in each mode (Test 6).\n",
"\n",
"## Test 2: Nadir Mode\n",
"\n",
@@ -591,10 +756,10 @@
"id": "c55f705f",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:29:45.370698Z",
- "iopub.status.busy": "2026-10-08T18:29:45.370698Z",
- "iopub.status.idle": "2026-10-08T18:29:47.210694Z",
- "shell.execute_reply": "2026-10-08T18:29:47.210694Z"
+ "iopub.execute_input": "2026-10-25T18:16:29.703505Z",
+ "iopub.status.busy": "2026-10-25T18:16:29.703505Z",
+ "iopub.status.idle": "2026-10-25T18:16:31.199884Z",
+ "shell.execute_reply": "2026-10-25T18:16:31.199884Z"
}
},
"outputs": [
@@ -603,19 +768,19 @@
"output_type": "stream",
"text": [
" reported orbit (km) TLE orbit (km)\n",
- "50% 2.068 5.956\n",
- "95% 2.778 9.314\n",
- "max 2.972 10.583\n"
+ "50% 2.115 2.250\n",
+ "95% 2.761 6.406\n",
+ "max 2.949 8.358\n"
]
},
{
"data": {
"text/plain": [
"days before TLE epoch (bin)\n",
- "(5, 10] 6.85\n",
- "(10, 15] 6.07\n",
- "(15, 20] 5.42\n",
- "(20, 25] 4.68\n",
+ "(5, 10] 2.32\n",
+ "(10, 15] 2.27\n",
+ "(15, 20] 2.05\n",
+ "(20, 25] 2.28\n",
"Name: TLE orbit (km), dtype: float64"
]
},
@@ -626,25 +791,57 @@
],
"source": [
"nadir = frames[frames[\"mode\"] == \"ND\"].iloc[::5]\n",
- "nadir_view = PointedInstrument(name=\"OCO-2 nadir\", field_of_regard=5, cross_track_field_of_view=0.8, along_track_field_of_view=0.1, is_rectangular=True)\n",
+ "nadir_view = PointedInstrument(\n",
+ " name=\"OCO-2 nadir\",\n",
+ " field_of_regard=5,\n",
+ " cross_track_field_of_view=0.8,\n",
+ " along_track_field_of_view=0.1,\n",
+ " is_rectangular=True,\n",
+ ")\n",
"rows2 = []\n",
"for name, group in nadir.groupby(\"file\"):\n",
" record = record_by_name[name]\n",
" track = frame_track(record, group[\"index\"].to_numpy())\n",
" reported = nadir_view.compute_footprint_center(track)\n",
- " tle = nadir_view.compute_footprint_center(orbit.get_orbit_track(list(track.t.utc_datetime())))\n",
- " for i, (lat, lon) in enumerate(zip(group[\"latitude (deg)\"], group[\"longitude (deg)\"])):\n",
+ " tle = nadir_view.compute_footprint_center(\n",
+ " orbit.get_orbit_track(list(track.t.utc_datetime()))\n",
+ " )\n",
+ " for i, (lat, lon) in enumerate(\n",
+ " zip(group[\"latitude (deg)\"], group[\"longitude (deg)\"])\n",
+ " ):\n",
" rows2.append(\n",
" {\n",
- " \"reported orbit (km)\": geodesic_distance(lon, lat, reported.longitude.degrees[i], reported.latitude.degrees[i]) / 1e3,\n",
- " \"TLE orbit (km)\": geodesic_distance(lon, lat, tle.longitude.degrees[i], tle.latitude.degrees[i]) / 1e3,\n",
- " \"days before TLE epoch\": (orbit.get_epoch() - track.t.utc_datetime()[i]).total_seconds() / 86400,\n",
+ " \"reported orbit (km)\": geodesic_distance(\n",
+ " lon,\n",
+ " lat,\n",
+ " reported.longitude.degrees[i],\n",
+ " reported.latitude.degrees[i],\n",
+ " )\n",
+ " / 1e3,\n",
+ " \"TLE orbit (km)\": geodesic_distance(\n",
+ " lon, lat, tle.longitude.degrees[i], tle.latitude.degrees[i]\n",
+ " )\n",
+ " / 1e3,\n",
+ " \"days before TLE epoch\": (\n",
+ " orbit.get_epoch() - track.t.utc_datetime()[i]\n",
+ " ).total_seconds()\n",
+ " / 86400,\n",
" }\n",
" )\n",
"footprints = pd.DataFrame(rows2)\n",
- "footprints[\"days before TLE epoch (bin)\"] = pd.cut(footprints[\"days before TLE epoch\"], [5, 10, 15, 20, 25])\n",
- "print(footprints[[\"reported orbit (km)\", \"TLE orbit (km)\"]].describe(percentiles=[0.5, 0.95]).loc[[\"50%\", \"95%\", \"max\"]].round(3).to_string())\n",
- "footprints.groupby(\"days before TLE epoch (bin)\", observed=True)[\"TLE orbit (km)\"].median().round(2)"
+ "footprints[\"days before TLE epoch (bin)\"] = pd.cut(\n",
+ " footprints[\"days before TLE epoch\"], [5, 10, 15, 20, 25]\n",
+ ")\n",
+ "print(\n",
+ " footprints[[\"reported orbit (km)\", \"TLE orbit (km)\"]]\n",
+ " .describe(percentiles=[0.5, 0.95])\n",
+ " .loc[[\"50%\", \"95%\", \"max\"]]\n",
+ " .round(3)\n",
+ " .to_string()\n",
+ ")\n",
+ "footprints.groupby(\"days before TLE epoch (bin)\", observed=True)[\n",
+ " \"TLE orbit (km)\"\n",
+ "].median().round(2)"
]
},
{
@@ -652,7 +849,7 @@
"id": "34be11f5",
"metadata": {},
"source": [
- "In nadir mode, TAT-C's nadir view, projected from the reported orbit, is within 2.1 km (median) and 3.0 km (maximum) of the center of the eight footprints, which lies up to 0.2 deg from the geodetic nadir along track, within a footprint length. With the TLE orbit, propagated 5 to 25 days back from its epoch, the differences are 6 km (median) and 11 km (maximum), mostly along track.\n",
+ "In nadir mode, TAT-C's nadir view, projected from the reported orbit, is within 2.1 km (median) and 2.9 km (maximum) of the center of the eight footprints, which lies up to 0.2 deg from the geodetic nadir along track, within a footprint length. With the TLE orbit, propagated 5 to 25 days back from its epoch, the differences are 2.3 km (median) and 8.4 km (maximum), whatever the TLE's age.\n",
"\n",
"**Swath.** The slit's orientation is the direction from the first to the eighth footprint, in TAT-C's view angles (0 deg: across track, to the left; 90 deg: forward). TAT-C aligns a `PointedInstrument`'s field of view with the ground track, so the cross-track extent of the eight footprints is compared with the length of the slit on the ground."
]
@@ -663,10 +860,10 @@
"id": "51acef3f",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:29:47.212700Z",
- "iopub.status.busy": "2026-10-08T18:29:47.212700Z",
- "iopub.status.idle": "2026-10-08T18:29:47.300786Z",
- "shell.execute_reply": "2026-10-08T18:29:47.300786Z"
+ "iopub.execute_input": "2026-10-25T18:16:31.202397Z",
+ "iopub.status.busy": "2026-10-25T18:16:31.202397Z",
+ "iopub.status.idle": "2026-10-25T18:16:31.287972Z",
+ "shell.execute_reply": "2026-10-25T18:16:31.287467Z"
}
},
"outputs": [
@@ -735,14 +932,14 @@
" \n",
"
"
]
@@ -840,11 +1053,35 @@
"for mode, color in [(\"ND\", BLUE), (\"GL\", ORANGE)]:\n",
" subset = frames[frames[\"mode\"] == mode].iloc[::20]\n",
" u = (subset[\"argument of latitude (deg)\"] + 90) % 360 - 90\n",
- " axes[0].scatter(u, subset[\"slit angle from cross-track (deg)\"], s=2, color=color, label={\"ND\": \"nadir\", \"GL\": \"glint\"}[mode])\n",
- "axes[0].set(xlabel=\"Argument of latitude (deg)\", ylabel=\"Slit angle from cross-track (deg)\", title=\"Slit orientation\")\n",
+ " axes[0].scatter(\n",
+ " u,\n",
+ " subset[\"slit angle from cross-track (deg)\"],\n",
+ " s=2,\n",
+ " color=color,\n",
+ " label={\"ND\": \"nadir\", \"GL\": \"glint\"}[mode],\n",
+ " )\n",
+ "axes[0].set(\n",
+ " xlabel=\"Argument of latitude (deg)\",\n",
+ " ylabel=\"Slit angle from cross-track (deg)\",\n",
+ " title=\"Slit orientation\",\n",
+ ")\n",
"axes[0].legend(frameon=False, markerscale=5)\n",
- "axes[1].plot((swath[\"argument of latitude (deg)\"] + 90) % 360 - 90, swath[\"cross-track extent (km)\"], \".\", ms=2, color=BLUE, label=\"cross-track extent of the footprints\")\n",
- "axes[1].plot((swath[\"argument of latitude (deg)\"] + 90) % 360 - 90, swath[\"slit length (km)\"], \".\", ms=2, color=GRAY, label=\"slit length (TAT-C swath without yaw)\")\n",
+ "axes[1].plot(\n",
+ " (swath[\"argument of latitude (deg)\"] + 90) % 360 - 90,\n",
+ " swath[\"cross-track extent (km)\"],\n",
+ " \".\",\n",
+ " ms=2,\n",
+ " color=BLUE,\n",
+ " label=\"cross-track extent of the footprints\",\n",
+ ")\n",
+ "axes[1].plot(\n",
+ " (swath[\"argument of latitude (deg)\"] + 90) % 360 - 90,\n",
+ " swath[\"slit length (km)\"],\n",
+ " \".\",\n",
+ " ms=2,\n",
+ " color=GRAY,\n",
+ " label=\"slit length (TAT-C swath without yaw)\",\n",
+ ")\n",
"axes[1].set(xlabel=\"Argument of latitude (deg)\", ylabel=\"km\", title=\"Nadir swath width\")\n",
"axes[1].legend(frameon=False, markerscale=5)\n",
"plt.show()"
@@ -855,32 +1092,265 @@
"id": "bdc349ee",
"metadata": {},
"source": [
- "OCO-2 rotates its slit with the spacecraft's yaw to keep it perpendicular to the solar principal plane. Over the southern part of the day side, the slit lies within about 13 deg of the cross-track direction, so the eight footprints span 10 km across track, as for TAT-C's view. North of the equator, the slit turns toward the ground track: it lies along the track near an argument of latitude of 20 deg (about 20 deg north), where the footprints cover only one footprint width across track (about 1.3 km), and at 115 to 130 deg from the cross-track direction at higher latitudes, where they span 4 to 6 km. Since a `PointedInstrument`'s view is aligned with the ground track, TAT-C overestimates OCO-2's nadir swath by a factor of 3.7 (median) between the equator and 30 deg north, and by 1.5 to 2.4 at higher northern latitudes. Representing it requires a rotation of the view about its boresight (a yaw angle) that varies around the orbit, which TAT-C does not model.\n",
+ "OCO-2 rotates its slit with the spacecraft's yaw to keep it perpendicular to the solar principal plane. Over the southern part of the day side, the slit lies within about 13 deg of the cross-track direction, so the eight footprints span 10 km across track, as for TAT-C's view. North of the equator, the slit turns toward the ground track: it lies along the track near an argument of latitude of 20 deg (about 20 deg north), where the footprints cover only one footprint width across track (about 1.3 km), and at 115 to 130 deg from the cross-track direction at higher latitudes, where they span 4 to 6 km. Since a `PointedInstrument`'s view is aligned with the ground track, TAT-C overestimates OCO-2's nadir swath by a factor of 3.7 (median) between the equator and 30 deg north, and by 1.5 to 2.4 at higher northern latitudes. The slit's rotation is the spacecraft's yaw, so it is represented by an `Attitude` with a yaw angle profile (`yaw_angle_profile`): the negative of the slit angle from the cross-track direction (TAT-C's positive yaw turns the body's front to the left), in 2 deg bins of argument of latitude, fitted to the nadir orbits of the first day and of each day. The slit is a view of eight pixels across track (0.82 deg), and the first and eighth footprints are compared with TAT-C's first and eighth pixels (`compute_projected_pixel_position`), with the reported orbit."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "a5e84eb9",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T18:16:31.598980Z",
+ "iopub.status.busy": "2026-10-25T18:16:31.598980Z",
+ "iopub.status.idle": "2026-10-25T18:16:32.889908Z",
+ "shell.execute_reply": "2026-10-25T18:16:32.889403Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
slit ends, median (km)
\n",
+ "
slit ends, 95th percentile (km)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
no yaw
\n",
+ "
4.13
\n",
+ "
8.18
\n",
+ "
\n",
+ "
\n",
+ "
first-day yaw profile
\n",
+ "
2.08
\n",
+ "
3.19
\n",
+ "
\n",
+ "
\n",
+ "
same-day yaw profile
\n",
+ "
2.08
\n",
+ "
3.16
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " slit ends, median (km) slit ends, 95th percentile (km)\n",
+ "no yaw 4.13 8.18\n",
+ "first-day yaw profile 2.08 3.19\n",
+ "same-day yaw profile 2.08 3.16"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# the slit: a view of eight pixels across track, rotated by the spacecraft's yaw (TAT-C's pixel 0 is the first footprint)\n",
+ "slit = PointedInstrument(\n",
+ " name=\"OCO-2\",\n",
+ " field_of_regard=120,\n",
+ " cross_track_field_of_view=0.82,\n",
+ " along_track_field_of_view=0.1,\n",
+ " cross_track_pixels=8,\n",
+ " is_rectangular=True,\n",
+ ")\n",
+ "nadir_frames = frames[frames[\"mode\"] == \"ND\"]\n",
+ "nadir_days = sorted(nadir_frames.day.unique())\n",
+ "\n",
+ "\n",
+ "def fit_yaw_profile(subset):\n",
+ " \"\"\"Yaw angle profile: the negative of the median slit angle in 2 deg bins of argument of latitude.\"\"\"\n",
+ " bins = (subset[\"argument of latitude (deg)\"] // 2) * 2 + 1\n",
+ " return [\n",
+ " (float(u), float(-a))\n",
+ " for u, a in subset.groupby(bins)[\"slit angle from cross-track (deg)\"]\n",
+ " .median()\n",
+ " .items()\n",
+ " ]\n",
+ "\n",
+ "\n",
+ "def slit_end_errors(attitude, subset):\n",
+ " \"\"\"Distances (km) of the first and eighth footprints from TAT-C's first and eighth pixels.\"\"\"\n",
+ " instrument = Satellite(\n",
+ " name=\"OCO-2\", orbit=orbit, instruments=[slit], attitude=attitude\n",
+ " ).get_instrument()\n",
+ " distances = []\n",
+ " for name, group in subset.groupby(\"file\"):\n",
+ " record = record_by_name[name]\n",
+ " k = group[\"index\"].to_numpy()\n",
+ " track = frame_track(record, k)\n",
+ " for footprint in (0, 7):\n",
+ " position = instrument.compute_projected_pixel_position(track, footprint, 0)\n",
+ " distances += list(\n",
+ " geodesic_distance(\n",
+ " record[\"sounding_longitude\"][k, footprint],\n",
+ " record[\"sounding_latitude\"][k, footprint],\n",
+ " position.longitude.degrees,\n",
+ " position.latitude.degrees,\n",
+ " )\n",
+ " / 1e3\n",
+ " )\n",
+ " return np.array(distances)\n",
+ "\n",
"\n",
+ "first_yaw = fit_yaw_profile(nadir_frames[nadir_frames.day == nadir_days[1]])\n",
+ "errors2c = {\"no yaw\": [], \"first-day yaw profile\": [], \"same-day yaw profile\": []}\n",
+ "for day in nadir_days[1:]:\n",
+ " subset = nadir_frames[nadir_frames.day == day].iloc[::6]\n",
+ " errors2c[\"no yaw\"].append(slit_end_errors(None, subset))\n",
+ " errors2c[\"first-day yaw profile\"].append(\n",
+ " slit_end_errors(Attitude(yaw_angle_profile=first_yaw), subset)\n",
+ " )\n",
+ " errors2c[\"same-day yaw profile\"].append(\n",
+ " slit_end_errors(\n",
+ " Attitude(\n",
+ " yaw_angle_profile=fit_yaw_profile(nadir_frames[nadir_frames.day == day])\n",
+ " ),\n",
+ " subset,\n",
+ " )\n",
+ " )\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " label: {\n",
+ " \"slit ends, median (km)\": np.median(np.concatenate(e)),\n",
+ " \"slit ends, 95th percentile (km)\": np.quantile(np.concatenate(e), 0.95),\n",
+ " }\n",
+ " for label, e in errors2c.items()\n",
+ " }\n",
+ ").T.round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "36e9b223",
+ "metadata": {},
+ "source": [
+ "The yaw angle profile rotates TAT-C's slit with OCO-2's: the first and eighth footprints are within 2.1 km (median) and 3.2 km (95th percentile) of TAT-C's first and eighth pixels, instead of 4.1 and 8.2 km with the view aligned with the ground track; the remainder is the footprint center's offset along track from nadir (above). Unlike the glint mode's roll and pitch (Test 3), the slit's yaw does not drift: the first day's profile is as accurate as each day's over the 17 days. With the yaw, TAT-C's nadir swath is the cross-track extent of the eight footprints, rather than 3.7 times wider (median between the equator and 30 deg north)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab12961f",
+ "metadata": {},
+ "source": [
"## Test 3: Glint Mode\n",
"\n",
- "In glint mode, the footprint's roll and pitch angles vary around the orbit. Roll and pitch angle profiles (`roll_angle_profile`, `pitch_angle_profile`) are fitted to the glint orbits of the first day (the median angles in 2 deg bins of argument of latitude), and a `PointedInstrument` with these profiles is evaluated (`compute_footprint_center`) on the glint orbits of every day, with the reported orbit; its footprint centers are compared with the reported ones. As a baseline, profiles fitted to each day are evaluated on the same day."
+ "**Glint spot.** TAT-C's specular point (`compute_specular_point`) is the point on the WGS 84 ellipsoid where the surface normal bisects the directions toward the satellite and the Sun. It is computed from the reported orbit at each glint frame and compared with the glint spot reported by OCO-2.\n",
+ "\n",
+ "**Pointing.** OCO-2 points its footprints along the line from nadir to the glint spot, but short of the spot. The offset is the difference between the specular point's angle from nadir and the footprint's (both from TAT-C's roll and pitch angles from the spacecraft).\n",
+ "\n",
+ "A `GlintAttitude` points the spacecraft's body at the specular point, or short of it toward nadir by an offset angle. Its offset can be a function of the specular point's angle from nadir (`offset_angle_profile`), fitted here to the glint orbits of the first complete day (the median offset in 2 deg bins).\n",
+ "\n",
+ "A nadir `PointedInstrument` on a satellite with this attitude is evaluated (`compute_footprint_center`) on the glint orbits of every day, with the reported orbit, and its view centers are compared with the reported footprint centers. Two alternatives that do not compute the glint are compared with it:\n",
+ "* roll and pitch angle profiles of the spacecraft's `Attitude` (`roll_angle_profile` and `pitch_angle_profile`, the median angles in 2 deg bins of argument of latitude) fitted to the first day; and\n",
+ "* the same profiles fitted to each day and evaluated on the same day."
]
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 8,
"id": "07e4d443",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:29:47.615141Z",
- "iopub.status.busy": "2026-10-08T18:29:47.615141Z",
- "iopub.status.idle": "2026-10-08T18:29:49.388201Z",
- "shell.execute_reply": "2026-10-08T18:29:49.387695Z"
+ "iopub.execute_input": "2026-10-25T18:16:32.891909Z",
+ "iopub.status.busy": "2026-10-25T18:16:32.891909Z",
+ "iopub.status.idle": "2026-10-25T18:16:38.454149Z",
+ "shell.execute_reply": "2026-10-25T18:16:38.453645Z"
}
},
"outputs": [
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "glint off-pointing angle: median 7.0 deg, range 4.0 to 9.3 deg (5th to 95th percentile)\n"
- ]
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
count
\n",
+ "
min
\n",
+ "
50%
\n",
+ "
95%
\n",
+ "
max
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
specular point from reported glint spot (km)
\n",
+ "
42831.0
\n",
+ "
0.016
\n",
+ "
0.053
\n",
+ "
0.152
\n",
+ "
0.186
\n",
+ "
\n",
+ "
\n",
+ "
offset toward nadir (deg)
\n",
+ "
42831.0
\n",
+ "
3.793
\n",
+ "
7.013
\n",
+ "
9.304
\n",
+ "
9.558
\n",
+ "
\n",
+ "
\n",
+ "
offset minus first day's profile (deg)
\n",
+ "
42831.0
\n",
+ "
0.000
\n",
+ "
0.018
\n",
+ "
0.065
\n",
+ "
0.220
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " count min 50% 95% \\\n",
+ "specular point from reported glint spot (km) 42831.0 0.016 0.053 0.152 \n",
+ "offset toward nadir (deg) 42831.0 3.793 7.013 9.304 \n",
+ "offset minus first day's profile (deg) 42831.0 0.000 0.018 0.065 \n",
+ "\n",
+ " max \n",
+ "specular point from reported glint spot (km) 0.186 \n",
+ "offset toward nadir (deg) 9.558 \n",
+ "offset minus first day's profile (deg) 0.220 "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
{
"data": {
@@ -903,7 +1373,9 @@
" \n",
"
"
]
},
"metadata": {},
@@ -1199,15 +1847,38 @@
}
],
"source": [
- "fig, axes = plt.subplots(1, 2, figsize=(12, 3.8))\n",
+ "fig, axes = plt.subplots(1, 3, figsize=(15, 3.8))\n",
"for day, color in [(days[1], BLUE), (days[len(days) // 2], PURPLE), (days[-1], ORANGE)]:\n",
" subset = glint[glint.day == day].iloc[::10]\n",
" u = (subset[\"argument of latitude (deg)\"] + 90) % 360 - 90\n",
" axes[0].scatter(u, subset[\"roll (deg)\"], s=2, color=color, label=day)\n",
" axes[1].scatter(u, subset[\"pitch (deg)\"], s=2, color=color, label=day)\n",
- "axes[0].set(xlabel=\"Argument of latitude (deg)\", ylabel=\"Roll (deg, positive left)\", title=\"Glint mode roll\")\n",
- "axes[1].set(xlabel=\"Argument of latitude (deg)\", ylabel=\"Pitch (deg, positive forward)\", title=\"Glint mode pitch\")\n",
+ " axes[2].scatter(\n",
+ " subset[\"specular point off nadir (deg)\"],\n",
+ " subset[\"offset (deg)\"],\n",
+ " s=2,\n",
+ " color=color,\n",
+ " label=day,\n",
+ " )\n",
+ "axes[2].plot(*zip(*offset_profile), color=INK, lw=1, label=\"profile (first day)\")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Argument of latitude (deg)\",\n",
+ " ylabel=\"Roll (deg, positive left)\",\n",
+ " title=\"Glint mode roll\",\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Argument of latitude (deg)\",\n",
+ " ylabel=\"Pitch (deg, positive forward)\",\n",
+ " title=\"Glint mode pitch\",\n",
+ ")\n",
+ "axes[2].set(\n",
+ " xlabel=\"Specular point's angle from nadir (deg)\",\n",
+ " ylabel=\"Offset toward nadir (deg)\",\n",
+ " title=\"Offset from the specular point\",\n",
+ ")\n",
"axes[0].legend(frameon=False, markerscale=5)\n",
+ "axes[2].legend(frameon=False, markerscale=5, fontsize=8)\n",
+ "fig.tight_layout()\n",
"plt.show()"
]
},
@@ -1216,7 +1887,13 @@
"id": "cdca695d",
"metadata": {},
"source": [
- "In glint mode, OCO-2 points 16 to 28 deg to the left of its ground track and from 45 deg forward (in the south) to 45 deg aft (in the north), following the glint spot, which lies on the Sun's side (west) of the afternoon orbit. It does not point exactly at the glint spot but 4.0 to 9.3 deg from it (median 7.0 deg), toward nadir. The angles vary smoothly around the orbit, so roll and pitch angle profiles fitted to one day reproduce the footprint centers of that day's other glint orbits within 1.3 km (median) and 3.3 km (95th percentile), on every day. As the Sun's declination changes, however, the glint geometry moves: the profiles of the first day are 4 km off (median) the next day, 30 km after a week, and 68 km after 16 days, as both angles change (the roll angle by about 0.1 deg per day, and the pitch angle by up to several degrees, in steps). Glint-mode analyses of more than a few days need profiles fitted to each day, or pointing computed from the Sun's position (toward the glint spot), which TAT-C does not model.\n",
+ "**Glint spot.** TAT-C's specular point is within 0.05 km (median) and 0.19 km (maximum) of OCO-2's reported glint spot.\n",
+ "\n",
+ "**Pointing.** In glint mode, OCO-2 points 16 to 28 deg to the left of its ground track, and from 45 deg forward (in the south) to 45 deg aft (in the north). It follows the glint, which lies on the Sun's side (west) of the afternoon orbit. It points 3.8 to 9.6 deg short of the specular point, toward nadir. This offset depends on the specular point's angle from nadir alone: it grows from about 4 deg at 20 deg to 9 deg at 60 deg, and the first day's profile matches the offsets of every day within 0.02 deg (median) and 0.07 deg (95th percentile).\n",
+ "\n",
+ "The `GlintAttitude` with the first day's offsets places the view within 1.4 to 1.6 km (median) and 2.0 to 2.3 km (95th percentile) of the footprint centers on every day, with no drift over the 17 days. That is as close as roll and pitch angle profiles fitted to each day (1.3 to 1.5 km median, 3.1 to 3.4 km 95th percentile).\n",
+ "\n",
+ "Profiles of argument of latitude cannot follow the Sun, however. As the Sun's declination changes, the glint geometry moves: the first day's profiles are 4 km off (median) the next day, 30 km after a week, and 68 km after 16 days. Pointing computed from the Sun's position follows the glint over any period.\n",
"\n",
"## Test 4: Repeat Cycle\n",
"\n",
@@ -1225,14 +1902,14 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 10,
"id": "57ef3edc",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:29:49.849820Z",
- "iopub.status.busy": "2026-10-08T18:29:49.849820Z",
- "iopub.status.idle": "2026-10-08T18:29:50.053071Z",
- "shell.execute_reply": "2026-10-08T18:29:50.053071Z"
+ "iopub.execute_input": "2026-10-25T18:16:38.836991Z",
+ "iopub.status.busy": "2026-10-25T18:16:38.836991Z",
+ "iopub.status.idle": "2026-10-25T18:16:39.051473Z",
+ "shell.execute_reply": "2026-10-25T18:16:39.050958Z"
}
},
"outputs": [
@@ -1247,18 +1924,28 @@
"dtype: object"
]
},
- "execution_count": 9,
+ "execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# the repeat cycle of the orbit maintained on its repeat ground track (without drag)\n",
- "repeat_cycle = GeneralPerturbationsOrbit.from_tle(TLE, remove_drag=True, repeat_cycle=\"auto\").get_repeat_cycle()\n",
+ "repeat_cycle = GeneralPerturbationsOrbit.from_tle(\n",
+ " TLE, remove_drag=True, repeat_cycle=\"auto\"\n",
+ ").get_repeat_cycle()\n",
"positions = []\n",
"for record in files:\n",
" k = np.arange(0, len(record[\"frame_time_tai93\"]), 6)\n",
- " positions.append(pd.DataFrame({\"orbit\": record[\"orbit\"], \"latitude\": record[\"spacecraft_lat\"][k], \"longitude\": record[\"spacecraft_lon\"][k]}))\n",
+ " positions.append(\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"orbit\": record[\"orbit\"],\n",
+ " \"latitude\": record[\"spacecraft_lat\"][k],\n",
+ " \"longitude\": record[\"spacecraft_lon\"][k],\n",
+ " }\n",
+ " )\n",
+ " )\n",
"positions = pd.concat(positions).drop_duplicates()\n",
"rows4 = []\n",
"for number, group in positions.groupby(\"orbit\"):\n",
@@ -1266,17 +1953,33 @@
" if later.empty:\n",
" continue\n",
" for lat in np.arange(-60, 61, 10):\n",
- " a, b = group.iloc[(group.latitude - lat).abs().argsort()[:1]], later.iloc[(later.latitude - lat).abs().argsort()[:1]]\n",
+ " a, b = (\n",
+ " group.iloc[(group.latitude - lat).abs().argsort()[:1]],\n",
+ " later.iloc[(later.latitude - lat).abs().argsort()[:1]],\n",
+ " )\n",
" if abs(a.latitude.iloc[0] - lat) < 0.2 and abs(b.latitude.iloc[0] - lat) < 0.2:\n",
- " rows4.append({\"orbit\": number, \"latitude\": lat, \"distance (km)\": geodesic_distance(a.longitude.iloc[0], lat, b.longitude.iloc[0], lat) / 1e3})\n",
+ " rows4.append(\n",
+ " {\n",
+ " \"orbit\": number,\n",
+ " \"latitude\": lat,\n",
+ " \"distance (km)\": geodesic_distance(\n",
+ " a.longitude.iloc[0], lat, b.longitude.iloc[0], lat\n",
+ " )\n",
+ " / 1e3,\n",
+ " }\n",
+ " )\n",
"repeat = pd.DataFrame(rows4)\n",
"pd.Series(\n",
" {\n",
" \"TAT-C repeat cycle (TLE)\": repeat_cycle,\n",
- " \"TAT-C repeat cycle (days)\": repeat_cycle / timedelta(days=1) if repeat_cycle else np.nan,\n",
+ " \"TAT-C repeat cycle (days)\": (\n",
+ " repeat_cycle / timedelta(days=1) if repeat_cycle else np.nan\n",
+ " ),\n",
" \"orbit pairs 233 revolutions apart\": repeat.orbit.nunique(),\n",
" \"ground track repeat distance, median (km)\": repeat[\"distance (km)\"].median(),\n",
- " \"ground track repeat distance, 95th percentile (km)\": repeat[\"distance (km)\"].quantile(0.95),\n",
+ " \"ground track repeat distance, 95th percentile (km)\": repeat[\n",
+ " \"distance (km)\"\n",
+ " ].quantile(0.95),\n",
" }\n",
")"
]
@@ -1286,24 +1989,540 @@
"id": "5d888d4c",
"metadata": {},
"source": [
- "`get_repeat_cycle` finds OCO-2's 16-day repeat cycle (233 orbits) from the TLE. The reported sub-satellite points of the six orbits whose repeats lie within the data are within 9 km (median) and 13 km (95th percentile) of those 233 orbits earlier, consistent with OCO-2's maintenance of the A-Train's reference ground track. Since the cycle has an odd number of orbits, an orbit observed in glint mode in one cycle is usually observed in nadir mode in the next.\n",
+ "`get_repeat_cycle` finds OCO-2's 16-day repeat cycle (233 orbits) from the TLE. The reported sub-satellite points of the six orbits whose repeats lie within the data are within 9 km (median) and 13 km (95th percentile) of those 233 orbits earlier, consistent with OCO-2's maintenance of the A-Train's reference ground track. Since the cycle has an odd number of orbits, an orbit observed in glint mode in one cycle is usually observed in nadir mode in the next."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a36e003b",
+ "metadata": {},
+ "source": [
+ "## Test 5: Target Mode\n",
+ "\n",
+ "In target mode, OCO-2 points at a ground site (in these data, calibration and validation sites such as Sodankylä, East Trout Lake, Edwards, Wollongong, Gobabeb, Saga, and Izaña) during an overpass. Each target observation's site is taken as the median of its footprint centers, and a satellite with a `TargetAttitude` pointing at the site is evaluated with the reported orbit: the center of its nadir `PointedInstrument`'s view (`compute_footprint_center`) is compared with the reported footprint centers, and the site's angle from nadir at the start and end of the observation is compared with the `TargetAttitude`'s maximum off-nadir angle. The duration of the target pointing predicted with the TLE orbit (the time the site lies within the maximum off-nadir angle) is compared with the observation's."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "c984ebb7",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T18:16:39.053273Z",
+ "iopub.status.busy": "2026-10-25T18:16:39.053273Z",
+ "iopub.status.idle": "2026-10-25T18:16:39.180229Z",
+ "shell.execute_reply": "2026-10-25T18:16:39.180229Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
site (deg)
\n",
+ "
observed (s)
\n",
+ "
predicted (s)
\n",
+ "
site off nadir at start, end (deg)
\n",
+ "
TAT-C view to footprints, median (km)
\n",
+ "
TAT-C view to footprints, 95th percentile (km)
\n",
+ "
nadir to footprints, median (km)
\n",
+ "
\n",
+ "
\n",
+ "
orbit
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
64907
\n",
+ "
67.37, 26.64
\n",
+ "
256.7
\n",
+ "
286.0
\n",
+ "
49.5, 47.4
\n",
+ "
5.1
\n",
+ "
11.8
\n",
+ "
440.5
\n",
+ "
\n",
+ "
\n",
+ "
64942
\n",
+ "
39.91, -104.24
\n",
+ "
266.7
\n",
+ "
283.0
\n",
+ "
49.4, 49.8
\n",
+ "
5.0
\n",
+ "
13.2
\n",
+ "
465.4
\n",
+ "
\n",
+ "
\n",
+ "
64967
\n",
+ "
-23.57, 15.04
\n",
+ "
260.0
\n",
+ "
279.0
\n",
+ "
49.1, 50.0
\n",
+ "
5.4
\n",
+ "
12.3
\n",
+ "
494.3
\n",
+ "
\n",
+ "
\n",
+ "
64976
\n",
+ "
-34.46, 150.86
\n",
+ "
263.3
\n",
+ "
282.0
\n",
+ "
48.9, 50.1
\n",
+ "
5.4
\n",
+ "
12.3
\n",
+ "
489.7
\n",
+ "
\n",
+ "
\n",
+ "
65000
\n",
+ "
54.36, -104.99
\n",
+ "
266.7
\n",
+ "
284.0
\n",
+ "
49.5, 49.8
\n",
+ "
5.1
\n",
+ "
12.8
\n",
+ "
476.5
\n",
+ "
\n",
+ "
\n",
+ "
65030
\n",
+ "
34.95, -117.88
\n",
+ "
266.7
\n",
+ "
284.0
\n",
+ "
49.5, 49.8
\n",
+ "
5.1
\n",
+ "
12.7
\n",
+ "
470.0
\n",
+ "
\n",
+ "
\n",
+ "
65049
\n",
+ "
33.24, 130.29
\n",
+ "
246.7
\n",
+ "
276.0
\n",
+ "
49.5, 47.7
\n",
+ "
5.2
\n",
+ "
11.8
\n",
+ "
481.5
\n",
+ "
\n",
+ "
\n",
+ "
65073
\n",
+ "
39.92, -104.24
\n",
+ "
250.0
\n",
+ "
281.0
\n",
+ "
49.3, 47.4
\n",
+ "
4.7
\n",
+ "
11.5
\n",
+ "
456.4
\n",
+ "
\n",
+ "
\n",
+ "
65102
\n",
+ "
54.36, -104.99
\n",
+ "
266.7
\n",
+ "
285.0
\n",
+ "
49.4, 49.6
\n",
+ "
5.2
\n",
+ "
12.1
\n",
+ "
459.7
\n",
+ "
\n",
+ "
\n",
+ "
65128
\n",
+ "
28.29, -16.52
\n",
+ "
256.7
\n",
+ "
274.0
\n",
+ "
49.2, 49.9
\n",
+ "
5.4
\n",
+ "
12.4
\n",
+ "
506.2
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " site (deg) observed (s) predicted (s) \\\n",
+ "orbit \n",
+ "64907 67.37, 26.64 256.7 286.0 \n",
+ "64942 39.91, -104.24 266.7 283.0 \n",
+ "64967 -23.57, 15.04 260.0 279.0 \n",
+ "64976 -34.46, 150.86 263.3 282.0 \n",
+ "65000 54.36, -104.99 266.7 284.0 \n",
+ "65030 34.95, -117.88 266.7 284.0 \n",
+ "65049 33.24, 130.29 246.7 276.0 \n",
+ "65073 39.92, -104.24 250.0 281.0 \n",
+ "65102 54.36, -104.99 266.7 285.0 \n",
+ "65128 28.29, -16.52 256.7 274.0 \n",
+ "\n",
+ " site off nadir at start, end (deg) \\\n",
+ "orbit \n",
+ "64907 49.5, 47.4 \n",
+ "64942 49.4, 49.8 \n",
+ "64967 49.1, 50.0 \n",
+ "64976 48.9, 50.1 \n",
+ "65000 49.5, 49.8 \n",
+ "65030 49.5, 49.8 \n",
+ "65049 49.5, 47.7 \n",
+ "65073 49.3, 47.4 \n",
+ "65102 49.4, 49.6 \n",
+ "65128 49.2, 49.9 \n",
+ "\n",
+ " TAT-C view to footprints, median (km) \\\n",
+ "orbit \n",
+ "64907 5.1 \n",
+ "64942 5.0 \n",
+ "64967 5.4 \n",
+ "64976 5.4 \n",
+ "65000 5.1 \n",
+ "65030 5.1 \n",
+ "65049 5.2 \n",
+ "65073 4.7 \n",
+ "65102 5.2 \n",
+ "65128 5.4 \n",
+ "\n",
+ " TAT-C view to footprints, 95th percentile (km) \\\n",
+ "orbit \n",
+ "64907 11.8 \n",
+ "64942 13.2 \n",
+ "64967 12.3 \n",
+ "64976 12.3 \n",
+ "65000 12.8 \n",
+ "65030 12.7 \n",
+ "65049 11.8 \n",
+ "65073 11.5 \n",
+ "65102 12.1 \n",
+ "65128 12.4 \n",
+ "\n",
+ " nadir to footprints, median (km) \n",
+ "orbit \n",
+ "64907 440.5 \n",
+ "64942 465.4 \n",
+ "64967 494.3 \n",
+ "64976 489.7 \n",
+ "65000 476.5 \n",
+ "65030 470.0 \n",
+ "65049 481.5 \n",
+ "65073 456.4 \n",
+ "65102 459.7 \n",
+ "65128 506.2 "
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "MAX_OFF_NADIR = (\n",
+ " 51 # deg, from the site's angle from nadir at the start and end of the observations\n",
+ ")\n",
+ "\n",
"\n",
+ "def frame_centers(record, k):\n",
+ " \"\"\"Mean latitudes and longitudes of the eight footprints of frames k.\"\"\"\n",
+ " lat = record[\"sounding_latitude\"][k].mean(axis=1).astype(float)\n",
+ " lon = np.degrees(\n",
+ " np.angle(np.exp(1j * np.radians(record[\"sounding_longitude\"][k])).mean(axis=1))\n",
+ " )\n",
+ " return lat, lon\n",
+ "\n",
+ "\n",
+ "targets, rows5 = {}, []\n",
+ "for record in [r for r in files if r[\"mode\"] == \"TG\"]:\n",
+ " k = np.arange(len(record[\"frame_time_tai93\"]))\n",
+ " track = frame_track(record, k)\n",
+ " lat, lon = frame_centers(record, k)\n",
+ " site = Point(latitude=float(np.median(lat)), longitude=float(np.median(lon)))\n",
+ " targets[record[\"name\"]] = site\n",
+ " attitude = TargetAttitude(targets=[site], max_off_nadir_angle=MAX_OFF_NADIR)\n",
+ " center = (\n",
+ " Satellite(name=\"OCO-2\", orbit=orbit, instruments=[view], attitude=attitude)\n",
+ " .get_instrument()\n",
+ " .compute_footprint_center(track)\n",
+ " )\n",
+ " nadir_point = wgs84.subpoint_of(track)\n",
+ " to_target = (\n",
+ " geodesic_distance(lon, lat, center.longitude.degrees, center.latitude.degrees)\n",
+ " / 1e3\n",
+ " )\n",
+ " to_nadir = (\n",
+ " geodesic_distance(\n",
+ " lon, lat, nadir_point.longitude.degrees, nadir_point.latitude.degrees\n",
+ " )\n",
+ " / 1e3\n",
+ " )\n",
+ " roll, pitch = np.array(\n",
+ " [\n",
+ " compute_view_angles(track[i], wgs84.latlon(site.latitude, site.longitude))\n",
+ " for i in (0, len(k) - 1)\n",
+ " ]\n",
+ " ).T\n",
+ " off_nadir = np.degrees(\n",
+ " np.arccos(np.cos(np.radians(roll)) * np.cos(np.radians(pitch)))\n",
+ " )\n",
+ " # the target pointing predicted with the TLE orbit, at 1 s steps around the observation\n",
+ " times = track.t.utc_datetime()\n",
+ " window = [\n",
+ " times[0] + timedelta(seconds=s)\n",
+ " for s in range(-180, int((times[-1] - times[0]).total_seconds()) + 181)\n",
+ " ]\n",
+ " predicted = np.sum(attitude.get_target_index(orbit.get_orbit_track(window)) >= 0)\n",
+ " rows5.append(\n",
+ " {\n",
+ " \"orbit\": record[\"orbit\"],\n",
+ " \"site (deg)\": f\"{site.latitude:.2f}, {site.longitude:.2f}\",\n",
+ " \"observed (s)\": float(\n",
+ " record[\"frame_time_tai93\"][-1] - record[\"frame_time_tai93\"][0]\n",
+ " ),\n",
+ " \"predicted (s)\": float(predicted),\n",
+ " \"site off nadir at start, end (deg)\": f\"{off_nadir[0]:.1f}, {off_nadir[1]:.1f}\",\n",
+ " \"TAT-C view to footprints, median (km)\": np.median(to_target),\n",
+ " \"TAT-C view to footprints, 95th percentile (km)\": np.quantile(\n",
+ " to_target, 0.95\n",
+ " ),\n",
+ " \"nadir to footprints, median (km)\": np.median(to_nadir),\n",
+ " }\n",
+ " )\n",
+ "pd.DataFrame(rows5).set_index(\"orbit\").round(1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b3eb7b44",
+ "metadata": {},
+ "source": [
+ "In target mode, OCO-2 points at its site from when the site is about 49.5 deg from nadir (48.9 to 49.5 deg at the first sampled frames) until it is 47 to 50 deg from nadir again, for 247 to 267 s (between the first and last sampled frames). A `TargetAttitude` pointing at the site within 51 deg of nadir places the view within 4.7 to 5.4 km (median) and 12 to 13 km (95th percentile) of the footprints of each observation, the extent of OCO-2's sweeps of its slit across the site, rather than 440 to 510 km for a nadir view. Its predicted pointing, with the TLE orbit, lasts 274 to 286 s, 16 to 31 s longer than observed (whose durations, between sampled frames, are up to 7 s short), as OCO-2 starts pointing within the maximum off-nadir angle. TAT-C's view stays on the site, rather than sweeping across it."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "add73009",
+ "metadata": {},
+ "source": [
+ "## Test 6: Mode Schedule\n",
+ "\n",
+ "A single satellite represents OCO-2's 17 days of operations with an `AttitudeSchedule` whose segments start with each file (and so follow the modes by orbit, Test 1): in glint mode, the `GlintAttitude` with the first day's offsets (Test 3); in nadir mode, the yaw angle profile of its day (Test 2), from the nearest complete day for the partial first day; in target mode, a `TargetAttitude` at its site (Test 5); and in the short special segments, nadir. Its instrument is the slit of Test 2. The center of its view is compared with the reported footprint centers of every ninth sampled frame (every 30 s) of all glint, nadir, and target files, with the reported orbit."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "a32d5f68",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T18:16:39.183269Z",
+ "iopub.status.busy": "2026-10-25T18:16:39.183269Z",
+ "iopub.status.idle": "2026-10-25T18:16:40.714198Z",
+ "shell.execute_reply": "2026-10-25T18:16:40.713896Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "358 segments\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
count
\n",
+ "
50%
\n",
+ "
95%
\n",
+ "
max
\n",
+ "
\n",
+ "
\n",
+ "
mode
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
glint
\n",
+ "
14299.0
\n",
+ "
1.48
\n",
+ "
2.14
\n",
+ "
9.69
\n",
+ "
\n",
+ "
\n",
+ "
nadir
\n",
+ "
8176.0
\n",
+ "
2.12
\n",
+ "
2.76
\n",
+ "
2.98
\n",
+ "
\n",
+ "
\n",
+ "
target
\n",
+ "
90.0
\n",
+ "
5.53
\n",
+ "
13.77
\n",
+ "
16.11
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " count 50% 95% max\n",
+ "mode \n",
+ "glint 14299.0 1.48 2.14 9.69\n",
+ "nadir 8176.0 2.12 2.76 2.98\n",
+ "target 90.0 5.53 13.77 16.11"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# yaw profiles of the complete days (from the second), to cover the whole orbit\n",
+ "nadir_profiles = {\n",
+ " day: fit_yaw_profile(nadir_frames[nadir_frames.day == day])\n",
+ " for day in nadir_days[1:]\n",
+ "}\n",
+ "\n",
+ "\n",
+ "def nearest(profiles, day):\n",
+ " \"\"\"The profiles of the nearest complete day.\"\"\"\n",
+ " return profiles[\n",
+ " min(profiles, key=lambda d: abs(pd.Timestamp(d) - pd.Timestamp(day)))\n",
+ " ]\n",
+ "\n",
+ "\n",
+ "def mode_attitude(record, day):\n",
+ " \"\"\"The spacecraft's attitude in the mode of an orbit file.\"\"\"\n",
+ " if record[\"mode\"] == \"GL\":\n",
+ " # pointing near the glint, with the first day's offsets (Test 3)\n",
+ " return glint_attitude\n",
+ " if record[\"mode\"] == \"ND\":\n",
+ " return Attitude(yaw_angle_profile=nearest(nadir_profiles, day))\n",
+ " if record[\"mode\"] == \"TG\":\n",
+ " return TargetAttitude(\n",
+ " targets=[targets[record[\"name\"]]], max_off_nadir_angle=MAX_OFF_NADIR\n",
+ " )\n",
+ " return Attitude()\n",
+ "\n",
+ "\n",
+ "# each segment starts a second before its file's first frame (whose time, as a datetime, is rounded to a microsecond)\n",
+ "starts = [\n",
+ " frame_track(record, np.array([0])).t.utc_datetime()[0] - timedelta(seconds=1)\n",
+ " for record in files\n",
+ "]\n",
+ "order = np.argsort(starts)\n",
+ "schedule = AttitudeSchedule.from_attitudes(\n",
+ " [starts[i] for i in order],\n",
+ " [mode_attitude(files[i], starts[i].strftime(\"%Y-%m-%d\")) for i in order],\n",
+ ")\n",
+ "oco2 = Satellite(name=\"OCO-2\", orbit=orbit, instruments=[slit], attitude=schedule)\n",
+ "instrument = oco2.get_instrument()\n",
+ "rows6 = []\n",
+ "for record in files:\n",
+ " if record[\"mode\"] not in (\"GL\", \"ND\", \"TG\"):\n",
+ " continue\n",
+ " k = np.arange(0, len(record[\"frame_time_tai93\"]), 9)\n",
+ " lat, lon = frame_centers(record, k)\n",
+ " center = instrument.compute_footprint_center(frame_track(record, k))\n",
+ " rows6.append(\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"mode\": record[\"mode\"],\n",
+ " \"distance (km)\": geodesic_distance(\n",
+ " lon, lat, center.longitude.degrees, center.latitude.degrees\n",
+ " )\n",
+ " / 1e3,\n",
+ " }\n",
+ " )\n",
+ " )\n",
+ "errors6 = pd.concat(rows6)\n",
+ "print(f\"{len(schedule.segments)} segments\")\n",
+ "errors6.groupby(\"mode\")[\"distance (km)\"].describe(percentiles=[0.5, 0.95])[\n",
+ " [\"count\", \"50%\", \"95%\", \"max\"]\n",
+ "].rename(index={\"GL\": \"glint\", \"ND\": \"nadir\", \"TG\": \"target\"}).round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2cb0fe7a",
+ "metadata": {},
+ "source": [
+ "One satellite with a schedule of 358 attitudes reproduces OCO-2's 17 days of operations. The centers of its views are within these distances of the reported footprint centers:\n",
+ "\n",
+ "| Mode | Median | 95th percentile |\n",
+ "| --- | --- | --- |\n",
+ "| Glint | 1.5 km | 2.1 km |\n",
+ "| Nadir | 2.1 km | 2.8 km |\n",
+ "| Target | 5.5 km | 13.8 km |\n",
+ "\n",
+ "These match the tests of each mode, and the glint mode is modeled with a single attitude for the 17 days.\n",
+ "\n",
+ "TAT-C thus models OCO-2's schedule of modes, each with its attitude, in a single analysis (for example, of its observations of points with `collect_observations`). The schedule is built here from the reported modes. A prediction would need the planned schedule of modes and targets, while the glint pointing follows from the Sun's position."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "25fa5071",
+ "metadata": {},
+ "source": [
"## Summary\n",
"\n",
"| Test | Result |\n",
"| --- | --- |\n",
- "| 1. Operating modes | glint and nadir modes alternate by orbit (odd orbits in glint mode); not scheduled by TAT-C |\n",
- "| 2. Nadir mode (`PointedInstrument`) | footprint centers within 2.1 km (median) with the reported orbit and 6 km with the TLE; the slit rotates with the spacecraft's yaw, so TAT-C overestimates the swath by a factor of 3.7 between the equator and 30 deg north |\n",
- "| 3. Glint mode (`roll_angle_profile`, `pitch_angle_profile`) | same-day profiles within 1.3 km (median); the first day's profiles drift by 4 km per day (68 km after 16 days) |\n",
+ "| 1. Operating modes | glint and nadir modes alternate by orbit (odd orbits in glint mode), with ten target observations |\n",
+ "| 2. Nadir mode (`PointedInstrument`, `Attitude.yaw_angle_profile`) | footprint centers within 2.1 km (median) with the reported orbit and 2.3 km with the TLE; with a yaw angle profile, the slit's ends within 2.1 km (4.1 km without) and the swath its true width (3.7 times narrower between the equator and 30 deg north) |\n",
+ "| 3. Glint mode (`compute_specular_point`, `GlintAttitude`) | specular point within 0.05 km (median) of the reported glint spot; pointing 3.8 to 9.6 deg short of it toward nadir, as a function of its angle from nadir; a `GlintAttitude` with the first day's offsets within 1.5 km (median) and 2.3 km (95th percentile) on every day, where roll and pitch angle profiles drift by 4 km per day |\n",
"| 4. Repeat cycle (`get_repeat_cycle`) | 16 days (233 orbits), as designed; ground track repeats within 9 km |\n",
+ "| 5. Target mode (`TargetAttitude`) | views within 5 km (median) of the footprints at ten sites (440 to 510 km for a nadir view); pointing from about 50 deg from nadir |\n",
+ "| 6. Mode schedule (`AttitudeSchedule`) | one satellite reproduces all modes over 17 days: 1.5 km (glint), 2.1 km (nadir), and 5.5 km (target), median |\n",
"\n",
- "**Pointing profiles.** Roll and pitch angle profiles in argument of latitude represent pointing that varies around the orbit, such as OCO-2's glint mode, for analyses of about a day; over longer periods, pointing that follows the Sun moves with the season.\n",
- "\n",
- "**Limitations and possible additions.** Three features of OCO-2's operations are not modeled by TAT-C:\n",
+ "**Pointing.** The spacecraft's attitude represents OCO-2's pointing in each mode, with a schedule of the modes over time:\n",
+ "* **Nadir mode:** a yaw angle profile in argument of latitude for the slit's yaw, which is stable over weeks.\n",
+ "* **Glint mode:** a `GlintAttitude` pointing near the glint, computed from the Sun's position, which follows the season, unlike roll and pitch angle profiles.\n",
+ "* **Target mode:** pointing at ground sites.\n",
"\n",
- "* a rotation of the view about its boresight (yaw), which varies around the orbit and narrows OCO-2's nadir swath by a factor of up to about 7 north of the equator;\n",
- "* pointing computed from the Sun's position (toward or near the glint spot), which would follow the seasonal motion of the glint geometry;\n",
- "* a schedule of modes (such as alternating glint and nadir orbits)."
+ "**Limitations.** TAT-C models target mode as a stare at the site rather than OCO-2's sweeps of its slit across it, and turns instantly between attitudes."
]
}
],
diff --git a/docs/validation/ValidatePushbroomMSI.ipynb b/docs/validation/ValidatePushbroomMSI.ipynb
index 3464ebe4..fae41ba5 100644
--- a/docs/validation/ValidatePushbroomMSI.ipynb
+++ b/docs/validation/ValidatePushbroomMSI.ipynb
@@ -41,10 +41,10 @@
"id": "32bd3918",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:59:46.810548Z",
- "iopub.status.busy": "2026-10-08T17:59:46.810548Z",
- "iopub.status.idle": "2026-10-08T17:59:47.776357Z",
- "shell.execute_reply": "2026-10-08T17:59:47.775850Z"
+ "iopub.execute_input": "2026-10-25T14:01:55.757294Z",
+ "iopub.status.busy": "2026-10-25T14:01:55.757294Z",
+ "iopub.status.idle": "2026-10-25T14:01:56.606358Z",
+ "shell.execute_reply": "2026-10-25T14:01:56.606358Z"
}
},
"outputs": [
@@ -169,13 +169,21 @@
"\n",
"ITEMS_FILE = DATA_DIR / f\"s2_items_{DAY:%Y%m%d}.json\"\n",
"if not ITEMS_FILE.exists():\n",
- " body = {\"collections\": [\"sentinel-2-l2a\"], \"datetime\": f\"{DAY:%Y-%m-%d}T00:00:00Z/{DAY:%Y-%m-%d}T23:59:59Z\", \"limit\": 1000}\n",
+ " body = {\n",
+ " \"collections\": [\"sentinel-2-l2a\"],\n",
+ " \"datetime\": f\"{DAY:%Y-%m-%d}T00:00:00Z/{DAY:%Y-%m-%d}T23:59:59Z\",\n",
+ " \"limit\": 1000,\n",
+ " }\n",
" items, url = [], STAC\n",
" while url:\n",
" page = requests.post(url, json=body, timeout=300).json()\n",
" items += page[\"features\"]\n",
" following = [link for link in page[\"links\"] if link[\"rel\"] == \"next\"]\n",
- " url, body = (following[0][\"href\"], following[0].get(\"body\", body)) if following else (None, None)\n",
+ " url, body = (\n",
+ " (following[0][\"href\"], following[0].get(\"body\", body))\n",
+ " if following\n",
+ " else (None, None)\n",
+ " )\n",
" ITEMS_FILE.write_text(\n",
" json.dumps(\n",
" [\n",
@@ -195,7 +203,11 @@
" )\n",
"tiles = pd.DataFrame(json.loads(ITEMS_FILE.read_text()))\n",
"tiles[\"datetime\"] = pd.to_datetime(tiles[\"datetime\"], utc=True)\n",
- "tiles.groupby(\"platform\").agg(tiles=(\"id\", \"size\"), datatakes=(\"datatake\", \"nunique\"), datastrips=(\"datastrip\", \"nunique\"))"
+ "tiles.groupby(\"platform\").agg(\n",
+ " tiles=(\"id\", \"size\"),\n",
+ " datatakes=(\"datatake\", \"nunique\"),\n",
+ " datastrips=(\"datastrip\", \"nunique\"),\n",
+ ")"
]
},
{
@@ -212,10 +224,10 @@
"id": "2489c788",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:59:47.779874Z",
- "iopub.status.busy": "2026-10-08T17:59:47.779874Z",
- "iopub.status.idle": "2026-10-08T17:59:47.825472Z",
- "shell.execute_reply": "2026-10-08T17:59:47.824464Z"
+ "iopub.execute_input": "2026-10-25T14:01:56.609365Z",
+ "iopub.status.busy": "2026-10-25T14:01:56.609365Z",
+ "iopub.status.idle": "2026-10-25T14:01:56.638122Z",
+ "shell.execute_reply": "2026-10-25T14:01:56.638122Z"
}
},
"outputs": [
@@ -286,17 +298,41 @@
" token = get(TOKEN).json()[\"token\"]\n",
"\n",
" def read_times(row):\n",
- " head = get(f\"{row.datastrip_metadata}?{token}\", headers={\"Range\": \"bytes=0-16383\"}).text\n",
- " times = {tag: re.search(f\"<{tag}>(.*?){tag}>\", head).group(1) for tag in [\"DATASTRIP_SENSING_START\", \"DATASTRIP_SENSING_STOP\"]}\n",
- " return {\"datastrip\": row.datastrip, \"start\": times[\"DATASTRIP_SENSING_START\"], \"stop\": times[\"DATASTRIP_SENSING_STOP\"]}\n",
+ " head = get(\n",
+ " f\"{row.datastrip_metadata}?{token}\", headers={\"Range\": \"bytes=0-16383\"}\n",
+ " ).text\n",
+ " times = {\n",
+ " tag: re.search(f\"<{tag}>(.*?){tag}>\", head).group(1)\n",
+ " for tag in [\"DATASTRIP_SENSING_START\", \"DATASTRIP_SENSING_STOP\"]\n",
+ " }\n",
+ " return {\n",
+ " \"datastrip\": row.datastrip,\n",
+ " \"start\": times[\"DATASTRIP_SENSING_START\"],\n",
+ " \"stop\": times[\"DATASTRIP_SENSING_STOP\"],\n",
+ " }\n",
"\n",
" first = tiles.drop_duplicates(\"datastrip\")\n",
" with concurrent.futures.ThreadPoolExecutor(16) as pool:\n",
- " pd.DataFrame(pool.map(read_times, first.itertuples())).to_csv(DATASTRIPS_FILE, index=False)\n",
+ " pd.DataFrame(pool.map(read_times, first.itertuples())).to_csv(\n",
+ " DATASTRIPS_FILE, index=False\n",
+ " )\n",
"datastrips = pd.read_csv(DATASTRIPS_FILE, parse_dates=[\"start\", \"stop\"]).merge(\n",
- " tiles.groupby(\"datastrip\").agg(platform=(\"platform\", \"first\"), datatake=(\"datatake\", \"first\"), tiles=(\"id\", \"size\")).reset_index()\n",
+ " tiles.groupby(\"datastrip\")\n",
+ " .agg(\n",
+ " platform=(\"platform\", \"first\"),\n",
+ " datatake=(\"datatake\", \"first\"),\n",
+ " tiles=(\"id\", \"size\"),\n",
+ " )\n",
+ " .reset_index()\n",
+ ")\n",
+ "selected = (\n",
+ " tiles.groupby([\"platform\", \"datatake\"])\n",
+ " .size()\n",
+ " .reset_index(name=\"tiles\")\n",
+ " .sort_values(\"tiles\")\n",
+ " .groupby(\"platform\")\n",
+ " .tail(1)\n",
")\n",
- "selected = tiles.groupby([\"platform\", \"datatake\"]).size().reset_index(name=\"tiles\").sort_values(\"tiles\").groupby(\"platform\").tail(1)\n",
"selected"
]
},
@@ -314,10 +350,10 @@
"id": "a0ed02ee",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:59:47.828473Z",
- "iopub.status.busy": "2026-10-08T17:59:47.828473Z",
- "iopub.status.idle": "2026-10-08T17:59:48.195243Z",
- "shell.execute_reply": "2026-10-08T17:59:48.194235Z"
+ "iopub.execute_input": "2026-10-25T14:01:56.640126Z",
+ "iopub.status.busy": "2026-10-25T14:01:56.640126Z",
+ "iopub.status.idle": "2026-10-25T14:01:56.855916Z",
+ "shell.execute_reply": "2026-10-25T14:01:56.855916Z"
}
},
"outputs": [
@@ -345,14 +381,23 @@
" chosen = tiles[tiles.datatake.isin(selected.datatake)]\n",
"\n",
" def read_ephemeris(row):\n",
- " root = ET.fromstring(strip_namespaces(get(f\"{row.datastrip_metadata}?{token}\").text))\n",
+ " root = ET.fromstring(\n",
+ " strip_namespaces(get(f\"{row.datastrip_metadata}?{token}\").text)\n",
+ " )\n",
" return pd.DataFrame(\n",
" {\n",
" \"platform\": row.platform,\n",
" \"datastrip\": row.datastrip,\n",
- " \"time\": [pd.Timestamp(p.find(\"GPS_TIME\").text, tz=\"UTC\") - pd.Timedelta(seconds=GPS_UTC) for p in root.findall(\".//GPS_Point\")],\n",
+ " \"time\": [\n",
+ " pd.Timestamp(p.find(\"GPS_TIME\").text, tz=\"UTC\")\n",
+ " - pd.Timedelta(seconds=GPS_UTC)\n",
+ " for p in root.findall(\".//GPS_Point\")\n",
+ " ],\n",
" **{\n",
- " f\"{kind}_{axis}\": [float(p.find(f\"{kind.upper()}_VALUES\").text.split()[i]) / 1e3 for p in root.findall(\".//GPS_Point\")]\n",
+ " f\"{kind}_{axis}\": [\n",
+ " float(p.find(f\"{kind.upper()}_VALUES\").text.split()[i]) / 1e3\n",
+ " for p in root.findall(\".//GPS_Point\")\n",
+ " ]\n",
" for kind in [\"position\", \"velocity\"]\n",
" for i, axis in enumerate(\"xyz\")\n",
" },\n",
@@ -360,31 +405,59 @@
" )\n",
"\n",
" def read_grids(row):\n",
- " root = ET.fromstring(strip_namespaces(get(f\"{row.granule_metadata}?{token}\").text))\n",
+ " root = ET.fromstring(\n",
+ " strip_namespaces(get(f\"{row.granule_metadata}?{token}\").text)\n",
+ " )\n",
" epsg = int(root.find(\".//HORIZONTAL_CS_CODE\").text.split(\":\")[1])\n",
- " geoposition = next(g for g in root.findall(\".//Geoposition\") if g.get(\"resolution\") == \"10\")\n",
- " ulx, uly = float(geoposition.find(\"ULX\").text), float(geoposition.find(\"ULY\").text)\n",
+ " geoposition = next(\n",
+ " g for g in root.findall(\".//Geoposition\") if g.get(\"resolution\") == \"10\"\n",
+ " )\n",
+ " ulx, uly = float(geoposition.find(\"ULX\").text), float(\n",
+ " geoposition.find(\"ULY\").text\n",
+ " )\n",
" to_lonlat = Transformer.from_crs(epsg, 4326, always_xy=True)\n",
" records = []\n",
" for grid in root.findall(\".//Viewing_Incidence_Angles_Grids\"):\n",
" if grid.get(\"bandId\") != BAND:\n",
" continue\n",
- " zenith = np.array([[float(v) for v in r.text.split()] for r in grid.find(\"Zenith/Values_List\")])\n",
- " azimuth = np.array([[float(v) for v in r.text.split()] for r in grid.find(\"Azimuth/Values_List\")])\n",
+ " zenith = np.array(\n",
+ " [\n",
+ " [float(v) for v in r.text.split()]\n",
+ " for r in grid.find(\"Zenith/Values_List\")\n",
+ " ]\n",
+ " )\n",
+ " azimuth = np.array(\n",
+ " [\n",
+ " [float(v) for v in r.text.split()]\n",
+ " for r in grid.find(\"Azimuth/Values_List\")\n",
+ " ]\n",
+ " )\n",
" i, j = np.nonzero(np.isfinite(zenith))\n",
" lon, lat = to_lonlat.transform(ulx + j * 5000.0, uly - i * 5000.0)\n",
" records.append(\n",
" pd.DataFrame(\n",
- " {\"tile\": row.id, \"platform\": row.platform, \"datastrip\": row.datastrip, \"detector\": int(grid.get(\"detectorId\")),\n",
- " \"lon\": lon, \"lat\": lat, \"zenith\": zenith[i, j], \"azimuth\": azimuth[i, j]}\n",
+ " {\n",
+ " \"tile\": row.id,\n",
+ " \"platform\": row.platform,\n",
+ " \"datastrip\": row.datastrip,\n",
+ " \"detector\": int(grid.get(\"detectorId\")),\n",
+ " \"lon\": lon,\n",
+ " \"lat\": lat,\n",
+ " \"zenith\": zenith[i, j],\n",
+ " \"azimuth\": azimuth[i, j],\n",
+ " }\n",
" )\n",
" )\n",
" # tiles without valid data have no viewing grids\n",
" return pd.concat(records) if records else None\n",
"\n",
" with concurrent.futures.ThreadPoolExecutor(16) as pool:\n",
- " ephemeris = pd.concat(pool.map(read_ephemeris, chosen.drop_duplicates(\"datastrip\").itertuples()))\n",
- " sampled = pd.concat([g.sort_values(\"datetime\").iloc[::5] for _, g in chosen.groupby(\"datatake\")])\n",
+ " ephemeris = pd.concat(\n",
+ " pool.map(read_ephemeris, chosen.drop_duplicates(\"datastrip\").itertuples())\n",
+ " )\n",
+ " sampled = pd.concat(\n",
+ " [g.sort_values(\"datetime\").iloc[::5] for _, g in chosen.groupby(\"datatake\")]\n",
+ " )\n",
" grids = pd.concat(pool.map(read_grids, sampled.itertuples()))\n",
" ephemeris.to_csv(EPHEMERIS_FILE, index=False)\n",
" grids.to_csv(GRIDS_FILE, index=False)\n",
@@ -416,10 +489,10 @@
"id": "16320023",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:59:48.198750Z",
- "iopub.status.busy": "2026-10-08T17:59:48.198750Z",
- "iopub.status.idle": "2026-10-08T17:59:51.832883Z",
- "shell.execute_reply": "2026-10-08T17:59:51.831871Z"
+ "iopub.execute_input": "2026-10-25T14:01:56.858920Z",
+ "iopub.status.busy": "2026-10-25T14:01:56.857921Z",
+ "iopub.status.idle": "2026-10-25T14:01:58.844191Z",
+ "shell.execute_reply": "2026-10-25T14:01:58.843186Z"
}
},
"outputs": [],
@@ -436,19 +509,33 @@
"\n",
"from tatc.analysis import collect_observations, compute_ground_track\n",
"from tatc.constants import EARTH_MEAN_RADIUS, EARTH_ROTATION_RATE\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, Instrument, Point, PointedInstrument, Satellite\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Instrument,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
"from tatc.utils import NadirReference, VelocityFrame, compute_along_track_field_of_view\n",
"\n",
"TO_ECEF = Transformer.from_crs(\"EPSG:4979\", \"EPSG:4978\", always_xy=True)\n",
"TO_GEODETIC = Transformer.from_crs(\"EPSG:4978\", \"EPSG:4979\", always_xy=True)\n",
- "satellites = {name: Satellite(name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle)) for name, tle in TLES.items()}\n",
+ "satellites = {\n",
+ " name: Satellite(name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle))\n",
+ " for name, tle in TLES.items()\n",
+ "}\n",
"PLATFORMS = list(TLES)\n",
"\n",
"\n",
"def seconds(times):\n",
" \"\"\"Seconds since the start of the analysis day.\"\"\"\n",
" delta = pd.to_datetime(times, utc=True) - pd.Timestamp(DAY)\n",
- " return delta.dt.total_seconds().to_numpy() if isinstance(delta, pd.Series) else delta.total_seconds()\n",
+ " return (\n",
+ " delta.dt.total_seconds().to_numpy()\n",
+ " if isinstance(delta, pd.Series)\n",
+ " else delta.total_seconds()\n",
+ " )\n",
"\n",
"\n",
"def to_utc(values):\n",
@@ -457,13 +544,17 @@
"\n",
"def ecef(lon, lat, height=0.0):\n",
" \"\"\"Earth-fixed position (m) of geodetic coordinates, stacked on the last axis.\"\"\"\n",
- " return np.stack(TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1)\n",
+ " return np.stack(\n",
+ " TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1\n",
+ " )\n",
"\n",
"\n",
"def up(lon, lat):\n",
" \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
" lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
+ " return np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def normalize(x):\n",
@@ -472,14 +563,23 @@
"\n",
"def inertial_velocity(position, velocity):\n",
" \"\"\"Inertial velocity expressed in Earth-fixed coordinates.\"\"\"\n",
- " return velocity + EARTH_ROTATION_RATE * np.stack([-position[..., 1], position[..., 0], np.zeros(position.shape[:-1])], axis=-1)\n",
+ " return velocity + EARTH_ROTATION_RATE * np.stack(\n",
+ " [-position[..., 1], position[..., 0], np.zeros(position.shape[:-1])], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def summarize(x):\n",
" \"\"\"Summary statistics of a residual sample.\"\"\"\n",
" x = np.asarray(x, dtype=float)\n",
" x = x[np.isfinite(x)]\n",
- " return pd.Series({\"n\": x.size, \"median\": np.median(x), \"p95 |x|\": np.percentile(np.abs(x), 95), \"max |x|\": np.abs(x).max()})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": x.size,\n",
+ " \"median\": np.median(x),\n",
+ " \"p95 |x|\": np.percentile(np.abs(x), 95),\n",
+ " \"max |x|\": np.abs(x).max(),\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"ephemeris[\"t\"] = seconds(ephemeris[\"time\"])\n",
@@ -512,10 +612,10 @@
"id": "c8128abc",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:59:51.837880Z",
- "iopub.status.busy": "2026-10-08T17:59:51.836879Z",
- "iopub.status.idle": "2026-10-08T17:59:51.918777Z",
- "shell.execute_reply": "2026-10-08T17:59:51.917261Z"
+ "iopub.execute_input": "2026-10-25T14:01:58.846227Z",
+ "iopub.status.busy": "2026-10-25T14:01:58.846227Z",
+ "iopub.status.idle": "2026-10-25T14:01:58.888167Z",
+ "shell.execute_reply": "2026-10-25T14:01:58.888167Z"
}
},
"outputs": [
@@ -642,12 +742,26 @@
" e = ephemeris[ephemeris.platform == platform].iloc[::10]\n",
" position = e[[f\"position_{a}\" for a in \"xyz\"]].to_numpy()\n",
" velocity = e[[f\"velocity_{a}\" for a in \"xyz\"]].to_numpy()\n",
- " predicted = np.array(satellites[platform].orbit.to_gp_orbit().get_orbit_track(to_utc(e.t)).frame_xyz_and_velocity(itrs)[0].m).T\n",
+ " predicted = np.array(\n",
+ " satellites[platform]\n",
+ " .orbit.to_gp_orbit()\n",
+ " .get_orbit_track(to_utc(e.t))\n",
+ " .frame_xyz_and_velocity(itrs)[0]\n",
+ " .m\n",
+ " ).T\n",
" offset = predicted - position\n",
" radial = normalize(position)\n",
- " along = normalize(velocity - np.sum(velocity * radial, axis=-1, keepdims=True) * radial)\n",
- " for name, component in [(\"along-track\", along), (\"cross-track, right\", np.cross(along, radial)), (\"radial\", radial)]:\n",
- " rows1[(platform, f\"{name} (km)\")] = summarize(np.sum(offset * component, axis=-1) / 1e3)\n",
+ " along = normalize(\n",
+ " velocity - np.sum(velocity * radial, axis=-1, keepdims=True) * radial\n",
+ " )\n",
+ " for name, component in [\n",
+ " (\"along-track\", along),\n",
+ " (\"cross-track, right\", np.cross(along, radial)),\n",
+ " (\"radial\", radial),\n",
+ " ]:\n",
+ " rows1[(platform, f\"{name} (km)\")] = summarize(\n",
+ " np.sum(offset * component, axis=-1) / 1e3\n",
+ " )\n",
"pd.DataFrame(rows1).T.round(3)"
]
},
@@ -671,10 +785,10 @@
"id": "b19e8078",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:59:51.922776Z",
- "iopub.status.busy": "2026-10-08T17:59:51.922776Z",
- "iopub.status.idle": "2026-10-08T17:59:52.691649Z",
- "shell.execute_reply": "2026-10-08T17:59:52.690132Z"
+ "iopub.execute_input": "2026-10-25T14:01:58.890177Z",
+ "iopub.status.busy": "2026-10-25T14:01:58.890177Z",
+ "iopub.status.idle": "2026-10-25T14:01:59.386347Z",
+ "shell.execute_reply": "2026-10-25T14:01:59.386347Z"
}
},
"outputs": [
@@ -811,31 +925,55 @@
" t_e = e.t.to_numpy()\n",
" position_e = e[[f\"position_{a}\" for a in \"xyz\"]].to_numpy()\n",
" velocity_e = e[[f\"velocity_{a}\" for a in \"xyz\"]].to_numpy()\n",
- " interpolate = lambda t, values: np.stack([np.interp(t, t_e, values[:, k]) for k in range(3)], axis=-1)\n",
+ " interpolate = lambda t, values: np.stack(\n",
+ " [np.interp(t, t_e, values[:, k]) for k in range(3)], axis=-1\n",
+ " )\n",
" lon, lat = platform_grids.lon.to_numpy(), platform_grids.lat.to_numpy()\n",
" point = ecef(lon, lat)\n",
- " u, east = up(lon, lat), normalize(np.stack([-np.sin(np.radians(lon)), np.cos(np.radians(lon)), 0 * lon], axis=-1))\n",
+ " u, east = up(lon, lat), normalize(\n",
+ " np.stack([-np.sin(np.radians(lon)), np.cos(np.radians(lon)), 0 * lon], axis=-1)\n",
+ " )\n",
" north = np.cross(u, east)\n",
- " zenith, azimuth = np.radians(platform_grids.zenith.to_numpy())[:, None], np.radians(platform_grids.azimuth.to_numpy())[:, None]\n",
- " toward = np.cos(zenith) * u + np.sin(zenith) * (np.sin(azimuth) * east + np.cos(azimuth) * north)\n",
+ " zenith, azimuth = (\n",
+ " np.radians(platform_grids.zenith.to_numpy())[:, None],\n",
+ " np.radians(platform_grids.azimuth.to_numpy())[:, None],\n",
+ " )\n",
+ " toward = np.cos(zenith) * u + np.sin(zenith) * (\n",
+ " np.sin(azimuth) * east + np.cos(azimuth) * north\n",
+ " )\n",
" b = np.sum(point * toward, axis=1)\n",
" t = np.full(len(point), np.median(t_e))\n",
" for _ in range(8):\n",
" p, v = interpolate(t, position_e), interpolate(t, velocity_e)\n",
" radius = np.linalg.norm(p, axis=1)\n",
- " location = point + (-b + np.sqrt(b**2 - np.sum(point**2, axis=1) + radius**2))[:, None] * toward\n",
+ " location = (\n",
+ " point\n",
+ " + (-b + np.sqrt(b**2 - np.sum(point**2, axis=1) + radius**2))[:, None]\n",
+ " * toward\n",
+ " )\n",
" t = t - np.sum((p - location) * v, axis=1) / np.sum(v * v, axis=1)\n",
" p, v = interpolate(t, position_e), interpolate(t, velocity_e)\n",
" los = normalize(point - p)\n",
" sub_lon, sub_lat, _ = TO_GEODETIC.transform(*p.T)\n",
" nadir = -up(sub_lon, sub_lat)\n",
- " result = {\"t\": t, \"miss\": np.linalg.norm(np.cross(p - location, normalize(v)), axis=1) / 1e3}\n",
- " for frame, velocity, nadir in [(\"earth_fixed\", v, nadir), (\"inertial\", inertial_velocity(p, v), nadir), (\"geocentric\", v, -normalize(p))]:\n",
+ " result = {\n",
+ " \"t\": t,\n",
+ " \"miss\": np.linalg.norm(np.cross(p - location, normalize(v)), axis=1) / 1e3,\n",
+ " }\n",
+ " for frame, velocity, nadir in [\n",
+ " (\"earth_fixed\", v, nadir),\n",
+ " (\"inertial\", inertial_velocity(p, v), nadir),\n",
+ " (\"geocentric\", v, -normalize(p)),\n",
+ " ]:\n",
" cross_axis = normalize(np.cross(velocity, nadir))\n",
" along_axis = np.cross(nadir, cross_axis)\n",
" down = np.sum(los * nadir, axis=1)\n",
- " result[f\"along_{frame}\"] = np.degrees(np.arctan(np.sum(los * along_axis, axis=1) / down))\n",
- " result[f\"cross_{frame}\"] = np.degrees(np.arctan(np.sum(los * cross_axis, axis=1) / down))\n",
+ " result[f\"along_{frame}\"] = np.degrees(\n",
+ " np.arctan(np.sum(los * along_axis, axis=1) / down)\n",
+ " )\n",
+ " result[f\"cross_{frame}\"] = np.degrees(\n",
+ " np.arctan(np.sum(los * cross_axis, axis=1) / down)\n",
+ " )\n",
" return pd.DataFrame(result, index=platform_grids.index)\n",
"\n",
"\n",
@@ -847,13 +985,19 @@
" \"\"\"Per-detector along-track angle offsets plus common linear (yaw) and quadratic terms in the cross-track angle.\"\"\"\n",
" x = grids[f\"cross_{frame}\"].to_numpy()\n",
" design = np.column_stack([pd.get_dummies(grids.detector).to_numpy(float), x, x**2])\n",
- " coefficients, *_ = np.linalg.lstsq(design, grids[f\"along_{frame}\"].to_numpy(), rcond=None)\n",
+ " coefficients, *_ = np.linalg.lstsq(\n",
+ " design, grids[f\"along_{frame}\"].to_numpy(), rcond=None\n",
+ " )\n",
" residual = grids[f\"along_{frame}\"].to_numpy() - design @ coefficients\n",
" return coefficients, residual\n",
"\n",
"\n",
"rows2 = {}\n",
- "for frame, label in [(\"earth_fixed\", \"earth_fixed\"), (\"inertial\", \"inertial\"), (\"geocentric\", \"earth_fixed, geocentric nadir\")]:\n",
+ "for frame, label in [\n",
+ " (\"earth_fixed\", \"earth_fixed\"),\n",
+ " (\"inertial\", \"inertial\"),\n",
+ " (\"geocentric\", \"earth_fixed, geocentric nadir\"),\n",
+ "]:\n",
" coefficients, residual = fit(frame)\n",
" grids[f\"residual_{frame}\"] = residual\n",
" rows2[label] = {\n",
@@ -862,7 +1006,10 @@
" \"fit residual, p95 (deg)\": np.percentile(np.abs(residual), 95),\n",
" }\n",
"detectors = grids.groupby(\"detector\").agg(\n",
- " along=(\"along_earth_fixed\", \"median\"), cross_min=(\"cross_earth_fixed\", \"min\"), cross_max=(\"cross_earth_fixed\", \"max\"), points=(\"t\", \"size\")\n",
+ " along=(\"along_earth_fixed\", \"median\"),\n",
+ " cross_min=(\"cross_earth_fixed\", \"min\"),\n",
+ " cross_max=(\"cross_earth_fixed\", \"max\"),\n",
+ " points=(\"t\", \"size\"),\n",
")\n",
"pd.concat(\n",
" [\n",
@@ -870,11 +1017,17 @@
" pd.DataFrame(\n",
" {\n",
" \"value\": {\n",
- " \"imaging time recovery, miss distance p95 (km)\": np.percentile(grids.miss, 95),\n",
+ " \"imaging time recovery, miss distance p95 (km)\": np.percentile(\n",
+ " grids.miss, 95\n",
+ " ),\n",
" \"cross-track view angle, minimum (deg)\": grids.cross_earth_fixed.min(),\n",
" \"cross-track view angle, maximum (deg)\": grids.cross_earth_fixed.max(),\n",
- " \"odd detectors, along-track angle (deg)\": grids[grids.odd].along_earth_fixed.median(),\n",
- " \"even detectors, along-track angle (deg)\": grids[~grids.odd].along_earth_fixed.median(),\n",
+ " \"odd detectors, along-track angle (deg)\": grids[\n",
+ " grids.odd\n",
+ " ].along_earth_fixed.median(),\n",
+ " \"even detectors, along-track angle (deg)\": grids[\n",
+ " ~grids.odd\n",
+ " ].along_earth_fixed.median(),\n",
" }\n",
" }\n",
" ).round(3),\n",
@@ -888,10 +1041,10 @@
"id": "63bd637c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:59:52.694653Z",
- "iopub.status.busy": "2026-10-08T17:59:52.694653Z",
- "iopub.status.idle": "2026-10-08T17:59:53.592728Z",
- "shell.execute_reply": "2026-10-08T17:59:53.592219Z"
+ "iopub.execute_input": "2026-10-25T14:01:59.389351Z",
+ "iopub.status.busy": "2026-10-25T14:01:59.388352Z",
+ "iopub.status.idle": "2026-10-25T14:02:00.024640Z",
+ "shell.execute_reply": "2026-10-25T14:02:00.023633Z"
}
},
"outputs": [
@@ -1025,19 +1178,38 @@
}
],
"source": [
- "fig, axes = plt.subplots(1, 3, figsize=(14, 3.8), gridspec_kw={\"width_ratios\": [1, 1, 0.8]})\n",
+ "fig, axes = plt.subplots(\n",
+ " 1, 3, figsize=(14, 3.8), gridspec_kw={\"width_ratios\": [1, 1, 0.8]}\n",
+ ")\n",
"for ax, frame in zip(axes[:2], [\"earth_fixed\", \"inertial\"]):\n",
- " for odd, color, label in [(True, BLUE, \"odd detectors\"), (False, ORANGE, \"even detectors\")]:\n",
- " g = grids[grids.odd == odd].sample(min(4000, int((grids.odd == odd).sum())), random_state=0)\n",
- " ax.scatter(g[f\"cross_{frame}\"], g[f\"along_{frame}\"], s=2, color=color, label=label)\n",
- " ax.set(xlabel=\"Cross-track view angle (deg, positive left)\", title=f\"{frame.replace('_', '-')} velocity frame\")\n",
+ " for odd, color, label in [\n",
+ " (True, BLUE, \"odd detectors\"),\n",
+ " (False, ORANGE, \"even detectors\"),\n",
+ " ]:\n",
+ " g = grids[grids.odd == odd].sample(\n",
+ " min(4000, int((grids.odd == odd).sum())), random_state=0\n",
+ " )\n",
+ " ax.scatter(\n",
+ " g[f\"cross_{frame}\"], g[f\"along_{frame}\"], s=2, color=color, label=label\n",
+ " )\n",
+ " ax.set(\n",
+ " xlabel=\"Cross-track view angle (deg, positive left)\",\n",
+ " title=f\"{frame.replace('_', '-')} velocity frame\",\n",
+ " )\n",
"axes[1].sharey(axes[0])\n",
"axes[0].set_ylabel(\"Along-track view angle (deg, positive forward)\")\n",
"axes[0].legend(frameon=False, markerscale=4)\n",
"g = grids.sample(6000, random_state=0)\n",
- "for frame, color, label in [(\"earth_fixed\", BLUE, \"geodetic nadir (TAT-C)\"), (\"geocentric\", ORANGE, \"geocentric nadir\")]:\n",
+ "for frame, color, label in [\n",
+ " (\"earth_fixed\", BLUE, \"geodetic nadir (TAT-C)\"),\n",
+ " (\"geocentric\", ORANGE, \"geocentric nadir\"),\n",
+ "]:\n",
" axes[2].scatter(g.lat, g[f\"residual_{frame}\"], s=2, color=color, label=label)\n",
- "axes[2].set(xlabel=\"Latitude (deg)\", ylabel=\"Along-track fit residual (deg)\", title=\"Nadir reference (Earth-fixed frame)\")\n",
+ "axes[2].set(\n",
+ " xlabel=\"Latitude (deg)\",\n",
+ " ylabel=\"Along-track fit residual (deg)\",\n",
+ " title=\"Nadir reference (Earth-fixed frame)\",\n",
+ ")\n",
"axes[2].legend(frameon=False, markerscale=4, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()\n",
@@ -1066,10 +1238,10 @@
"id": "5e1316a2",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T17:59:53.596738Z",
- "iopub.status.busy": "2026-10-08T17:59:53.596738Z",
- "iopub.status.idle": "2026-10-08T18:00:05.688722Z",
- "shell.execute_reply": "2026-10-08T18:00:05.687714Z"
+ "iopub.execute_input": "2026-10-25T14:02:00.027148Z",
+ "iopub.status.busy": "2026-10-25T14:02:00.025642Z",
+ "iopub.status.idle": "2026-10-25T14:02:08.334093Z",
+ "shell.execute_reply": "2026-10-25T14:02:08.334093Z"
}
},
"outputs": [
@@ -1190,11 +1362,20 @@
"TIME_STEP = 10 # s\n",
"cross_fov = grids.cross_earth_fixed.max() - grids.cross_earth_fixed.min()\n",
"roll = (grids.cross_earth_fixed.max() + grids.cross_earth_fixed.min()) / 2\n",
- "altitude = float(np.median(np.linalg.norm(ephemeris[[f\"position_{a}\" for a in \"xyz\"]].to_numpy(), axis=1))) - 6371.0088e3\n",
+ "altitude = (\n",
+ " float(\n",
+ " np.median(\n",
+ " np.linalg.norm(\n",
+ " ephemeris[[f\"position_{a}\" for a in \"xyz\"]].to_numpy(), axis=1\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ " - 6371.0088e3\n",
+ ")\n",
"inclination = float(TLES[\"Sentinel-2A\"][1][8:16])\n",
"\n",
"\n",
- "def msi_view(time_step, velocity_frame=VelocityFrame.EARTH_FIXED):\n",
+ "def msi_view(time_step):\n",
" return PointedInstrument(\n",
" name=\"MSI\",\n",
" field_of_regard=cross_fov + 10,\n",
@@ -1207,34 +1388,65 @@
" ),\n",
" roll_angle=roll,\n",
" is_rectangular=True,\n",
- " velocity_frame=velocity_frame,\n",
" )\n",
"\n",
"\n",
"def unwrap(geometry):\n",
" \"\"\"Shift longitudes of geometries that cross the antimeridian to be continuous.\"\"\"\n",
- " lon = np.concatenate([np.array(g.exterior.coords)[:, 0] for g in getattr(geometry, \"geoms\", [geometry])])\n",
+ " lon = np.concatenate(\n",
+ " [\n",
+ " np.array(g.exterior.coords)[:, 0]\n",
+ " for g in getattr(geometry, \"geoms\", [geometry])\n",
+ " ]\n",
+ " )\n",
" if lon.max() - lon.min() > 180:\n",
- " return shapely.ops.transform(lambda x, y, z=None: (np.where(np.asarray(x) < 0, np.asarray(x) + 360, x), y), geometry)\n",
+ " return shapely.ops.transform(\n",
+ " lambda x, y, z=None: (\n",
+ " np.where(np.asarray(x) < 0, np.asarray(x) + 360, x),\n",
+ " y,\n",
+ " ),\n",
+ " geometry,\n",
+ " )\n",
" return geometry\n",
"\n",
"\n",
"def footprint_row(row):\n",
- " observed = unwrap(shapely.unary_union([shape(g) for g in tiles.geometry[tiles.datastrip == row.datastrip]]))\n",
+ " observed = unwrap(\n",
+ " shapely.unary_union(\n",
+ " [shape(g) for g in tiles.geometry[tiles.datastrip == row.datastrip]]\n",
+ " )\n",
+ " )\n",
" center = observed.centroid\n",
- " project = Transformer.from_crs(\"EPSG:4326\", f\"+proj=aeqd +lat_0={center.y} +lon_0={center.x} +units=m\", always_xy=True).transform\n",
+ " project = Transformer.from_crs(\n",
+ " \"EPSG:4326\",\n",
+ " f\"+proj=aeqd +lat_0={center.y} +lon_0={center.x} +units=m\",\n",
+ " always_xy=True,\n",
+ " ).transform\n",
" a = shapely.ops.transform(project, observed).buffer(0)\n",
" start, stop = seconds(row.start), seconds(row.stop)\n",
" n = max(1, int(round((stop - start) / TIME_STEP)))\n",
" step = (stop - start) / n\n",
" times = to_utc(start + step * (np.arange(n) + 0.5))\n",
- " result = {\"datastrip\": row.datastrip, \"platform\": row.platform, \"tiles\": row.tiles, \"duration (s)\": stop - start, \"latitude\": center.y}\n",
+ " result = {\n",
+ " \"datastrip\": row.datastrip,\n",
+ " \"platform\": row.platform,\n",
+ " \"tiles\": row.tiles,\n",
+ " \"duration (s)\": stop - start,\n",
+ " \"latitude\": center.y,\n",
+ " }\n",
" for frame in [VelocityFrame.EARTH_FIXED, VelocityFrame.INERTIAL]:\n",
- " satellite = satellites[row.platform].model_copy(update={\"instruments\": [msi_view(step, frame)]})\n",
+ " satellite = satellites[row.platform].model_copy(\n",
+ " update={\n",
+ " \"instruments\": [msi_view(step)],\n",
+ " \"attitude\": Attitude(velocity_frame=frame),\n",
+ " }\n",
+ " )\n",
" predicted = compute_ground_track(satellite, times).geometry.iloc[0]\n",
" b = shapely.ops.transform(project, unwrap(predicted)).buffer(0)\n",
" result[f\"IoU, {frame.value}\"] = a.intersection(b).area / a.union(b).area\n",
- " result[f\"observed only (%), {frame.value}\"] = 100 * a.difference(b).area / a.area\n",
+ " result[f\"observed only (%), {frame.value}\"] = (\n",
+ " 100 * a.difference(b).area / a.area\n",
+ " )\n",
" result[f\"TAT-C only (%), {frame.value}\"] = 100 * b.difference(a).area / b.area\n",
" return result\n",
"\n",
@@ -1242,7 +1454,9 @@
"footprints = pd.DataFrame([footprint_row(row) for row in datastrips.itertuples()])\n",
"pd.concat(\n",
" [\n",
- " footprints.drop(columns=[\"datastrip\", \"platform\"]).describe(percentiles=[0.05, 0.5]).T[[\"count\", \"5%\", \"50%\", \"mean\"]],\n",
+ " footprints.drop(columns=[\"datastrip\", \"platform\"])\n",
+ " .describe(percentiles=[0.05, 0.5])\n",
+ " .T[[\"count\", \"5%\", \"50%\", \"mean\"]],\n",
" ]\n",
").round(3)"
]
@@ -1253,10 +1467,10 @@
"id": "71fad055",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:00:05.693240Z",
- "iopub.status.busy": "2026-10-08T18:00:05.692241Z",
- "iopub.status.idle": "2026-10-08T18:00:18.982781Z",
- "shell.execute_reply": "2026-10-08T18:00:18.981773Z"
+ "iopub.execute_input": "2026-10-25T14:02:08.337097Z",
+ "iopub.status.busy": "2026-10-25T14:02:08.337097Z",
+ "iopub.status.idle": "2026-10-25T14:02:18.876942Z",
+ "shell.execute_reply": "2026-10-25T14:02:18.876942Z"
}
},
"outputs": [
@@ -1278,15 +1492,32 @@
"ax.coastlines(color=GRAY, linewidth=0.5)\n",
"for platform in PLATFORMS:\n",
" geometries = [shape(g) for g in tiles.geometry[tiles.platform == platform]]\n",
- " ax.add_geometries(geometries, crs=ccrs.PlateCarree(), facecolor=PLATFORM_COLORS[platform], edgecolor=\"none\", alpha=0.6)\n",
+ " ax.add_geometries(\n",
+ " geometries,\n",
+ " crs=ccrs.PlateCarree(),\n",
+ " facecolor=PLATFORM_COLORS[platform],\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.6,\n",
+ " )\n",
" ax.plot([], [], color=PLATFORM_COLORS[platform], lw=6, alpha=0.6, label=platform)\n",
"ax.legend(frameon=False, fontsize=8, loc=\"lower left\")\n",
"ax.set_title(f\"Sentinel-2 tiles, {DAY:%d %B %Y}\", fontsize=9)\n",
"ax2 = fig.add_subplot(1, 2, 2)\n",
"for platform in PLATFORMS:\n",
" f = footprints[footprints.platform == platform]\n",
- " ax2.scatter(f[\"duration (s)\"], f[\"IoU, earth_fixed\"], s=10, color=PLATFORM_COLORS[platform], label=platform)\n",
- "ax2.set(xscale=\"log\", xlabel=\"Datastrip duration (s)\", ylabel=\"IoU (TAT-C vs. tile footprints)\", title=\"Datastrip footprint agreement (Earth-fixed frame)\")\n",
+ " ax2.scatter(\n",
+ " f[\"duration (s)\"],\n",
+ " f[\"IoU, earth_fixed\"],\n",
+ " s=10,\n",
+ " color=PLATFORM_COLORS[platform],\n",
+ " label=platform,\n",
+ " )\n",
+ "ax2.set(\n",
+ " xscale=\"log\",\n",
+ " xlabel=\"Datastrip duration (s)\",\n",
+ " ylabel=\"IoU (TAT-C vs. tile footprints)\",\n",
+ " title=\"Datastrip footprint agreement (Earth-fixed frame)\",\n",
+ ")\n",
"ax2.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1321,10 +1552,10 @@
"id": "bea7887f",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:00:18.986782Z",
- "iopub.status.busy": "2026-10-08T18:00:18.986782Z",
- "iopub.status.idle": "2026-10-08T18:19:10.549339Z",
- "shell.execute_reply": "2026-10-08T18:19:10.549339Z"
+ "iopub.execute_input": "2026-10-25T14:02:18.880455Z",
+ "iopub.status.busy": "2026-10-25T14:02:18.879451Z",
+ "iopub.status.idle": "2026-10-25T14:13:23.659015Z",
+ "shell.execute_reply": "2026-10-25T14:13:23.659015Z"
}
},
"outputs": [
@@ -1423,8 +1654,12 @@
}
],
"source": [
- "single = {frame.value: msi_view(TIME_STEP, frame) for frame in [VelocityFrame.EARTH_FIXED, VelocityFrame.INERTIAL]}\n",
- "nadir = Instrument(name=\"MSI\", field_of_regard=2 * max(abs(grids.cross_earth_fixed.min()), grids.cross_earth_fixed.max()))\n",
+ "single = msi_view(TIME_STEP)\n",
+ "nadir = Instrument(\n",
+ " name=\"MSI\",\n",
+ " field_of_regard=2\n",
+ " * max(abs(grids.cross_earth_fixed.min()), grids.cross_earth_fixed.max()),\n",
+ ")\n",
"modules = [\n",
" PointedInstrument(\n",
" name=f\"MSI detector {d}\",\n",
@@ -1438,7 +1673,11 @@
" for d, row in detectors.iterrows()\n",
"]\n",
"# the same, with the view angles measured from (and the views rotated from) the geocentric nadir\n",
- "detectors_geocentric = grids.groupby(\"detector\").agg(along=(\"along_geocentric\", \"median\"), cross_min=(\"cross_geocentric\", \"min\"), cross_max=(\"cross_geocentric\", \"max\"))\n",
+ "detectors_geocentric = grids.groupby(\"detector\").agg(\n",
+ " along=(\"along_geocentric\", \"median\"),\n",
+ " cross_min=(\"cross_geocentric\", \"min\"),\n",
+ " cross_max=(\"cross_geocentric\", \"max\"),\n",
+ ")\n",
"modules_geocentric = [\n",
" PointedInstrument(\n",
" name=f\"MSI detector {d}\",\n",
@@ -1454,19 +1693,31 @@
"]\n",
"sample4 = grids.iloc[:: max(1, len(grids) // 1000)]\n",
"rows4, dt4 = {}, {}\n",
- "for name, instruments in [\n",
- " (\"single view, earth_fixed\", [single[\"earth_fixed\"]]),\n",
- " (\"single view, inertial\", [single[\"inertial\"]]),\n",
- " (\"nadir field of regard\", [nadir]),\n",
- " (\"detector views\", modules),\n",
- " (\"detector views, geocentric nadir\", modules_geocentric),\n",
+ "for name, instruments, attitude in [\n",
+ " (\"single view, earth_fixed\", [single], None),\n",
+ " (\n",
+ " \"single view, inertial\",\n",
+ " [single],\n",
+ " Attitude(velocity_frame=VelocityFrame.INERTIAL),\n",
+ " ),\n",
+ " (\"nadir field of regard\", [nadir], None),\n",
+ " (\"detector views\", modules, None),\n",
+ " (\"detector views, geocentric nadir\", modules_geocentric, None),\n",
"]:\n",
" differences, missed = [], 0\n",
" for point in sample4.itertuples():\n",
" truth = pd.Timestamp(DAY) + pd.Timedelta(seconds=float(point.t))\n",
- " satellite = satellites[point.platform].model_copy(update={\"instruments\": instruments})\n",
+ " satellite = satellites[point.platform].model_copy(\n",
+ " update={\"instruments\": instruments, \"attitude\": attitude}\n",
+ " )\n",
" epochs = [\n",
- " collect_observations(Point(id=0, latitude=point.lat, longitude=point.lon), satellite, truth - pd.Timedelta(minutes=5), truth + pd.Timedelta(minutes=5), index).epoch\n",
+ " collect_observations(\n",
+ " Point(id=0, latitude=point.lat, longitude=point.lon),\n",
+ " satellite,\n",
+ " truth - pd.Timedelta(minutes=5),\n",
+ " truth + pd.Timedelta(minutes=5),\n",
+ " index,\n",
+ " ).epoch\n",
" for index in range(len(instruments))\n",
" ]\n",
" epochs = pd.concat(epochs) if epochs else pd.Series(dtype=\"datetime64[ns, UTC]\")\n",
@@ -1477,8 +1728,19 @@
" differences.append(delta[np.argmin(np.abs(delta))])\n",
" dt4[name] = np.array(differences)\n",
" lat4 = sample4.lat.to_numpy()\n",
- " rows4[name] = pd.concat([pd.Series({\"points\": len(sample4), \"missed\": missed}), summarize(differences).drop(\"n\")])\n",
- "pd.DataFrame(rows4).T.rename(columns={\"median\": \"time, median (s)\", \"p95 |x|\": \"time, p95 |x| (s)\", \"max |x|\": \"time, max |x| (s)\"}).round(3)"
+ " rows4[name] = pd.concat(\n",
+ " [\n",
+ " pd.Series({\"points\": len(sample4), \"missed\": missed}),\n",
+ " summarize(differences).drop(\"n\"),\n",
+ " ]\n",
+ " )\n",
+ "pd.DataFrame(rows4).T.rename(\n",
+ " columns={\n",
+ " \"median\": \"time, median (s)\",\n",
+ " \"p95 |x|\": \"time, p95 |x| (s)\",\n",
+ " \"max |x|\": \"time, max |x| (s)\",\n",
+ " }\n",
+ ").round(3)"
]
},
{
@@ -1487,10 +1749,10 @@
"id": "f7097a93",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:19:10.551347Z",
- "iopub.status.busy": "2026-10-08T18:19:10.551347Z",
- "iopub.status.idle": "2026-10-08T18:19:10.830120Z",
- "shell.execute_reply": "2026-10-08T18:19:10.830120Z"
+ "iopub.execute_input": "2026-10-25T14:13:23.662019Z",
+ "iopub.status.busy": "2026-10-25T14:13:23.661019Z",
+ "iopub.status.idle": "2026-10-25T14:13:23.939211Z",
+ "shell.execute_reply": "2026-10-25T14:13:23.939211Z"
}
},
"outputs": [
@@ -1511,7 +1773,11 @@
" if len(dt4[name]) == len(lat4):\n",
" ax.scatter(lat4, dt4[name], s=4, color=color, label=name)\n",
"ax.axhline(0, color=INK, lw=0.6)\n",
- "ax.set(xlabel=\"Latitude (deg)\", ylabel=\"TAT-C epoch minus imaging time (s)\", title=\"Observation time error\")\n",
+ "ax.set(\n",
+ " xlabel=\"Latitude (deg)\",\n",
+ " ylabel=\"TAT-C epoch minus imaging time (s)\",\n",
+ " title=\"Observation time error\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8, markerscale=3)\n",
"fig.tight_layout()\n",
"plt.show()"
diff --git a/docs/validation/ValidateROCOSMIC2.ipynb b/docs/validation/ValidateROCOSMIC2.ipynb
index 9478ac3f..4f2be8a7 100644
--- a/docs/validation/ValidateROCOSMIC2.ipynb
+++ b/docs/validation/ValidateROCOSMIC2.ipynb
@@ -37,10 +37,10 @@
"id": "36f949b1",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:01:25.814887Z",
- "iopub.status.busy": "2026-10-08T18:01:25.814887Z",
- "iopub.status.idle": "2026-10-08T18:02:43.539926Z",
- "shell.execute_reply": "2026-10-08T18:02:43.539926Z"
+ "iopub.execute_input": "2026-10-25T20:49:49.903347Z",
+ "iopub.status.busy": "2026-10-25T20:49:49.903187Z",
+ "iopub.status.idle": "2026-10-25T20:51:01.936272Z",
+ "shell.execute_reply": "2026-10-25T20:51:01.935492Z"
}
},
"outputs": [
@@ -64,7 +64,9 @@
"CONSTELLATIONS = {\"G\": \"GPS\", \"R\": \"GLONASS\", \"E\": \"Galileo\"}\n",
"\n",
"DATA_DIR = os.path.join(\"data\", \"ro\")\n",
- "rodb = RODatabaseClient(metadata_root=os.path.join(DATA_DIR, \"metadata\"), version=\"v1.1\")\n",
+ "rodb = RODatabaseClient(\n",
+ " metadata_root=os.path.join(DATA_DIR, \"metadata\"), version=\"v1.1\"\n",
+ ")\n",
"occultations = rodb.query(\n",
" missions=\"cosmic2\", datetimerange=(\"2026-05-14\", \"2026-05-14T23:59:59\"), silent=True\n",
")\n",
@@ -77,12 +79,20 @@
" availablefiletypes=[\"ucar_calibratedPhase\", \"ucar_refractivityRetrieval\"],\n",
" )\n",
" rng = np.random.default_rng(20260514 + k)\n",
- " sample._data += [pool._data[i] for i in sorted(rng.choice(pool.size, 200, replace=False))]\n",
- " print(f\"{CONSTELLATIONS[code]}: {pool.size} occultations with a retrieval, 200 sampled\")\n",
+ " sample._data += [\n",
+ " pool._data[i] for i in sorted(rng.choice(pool.size, 200, replace=False))\n",
+ " ]\n",
+ " print(\n",
+ " f\"{CONSTELLATIONS[code]}: {pool.size} occultations with a retrieval, 200 sampled\"\n",
+ " )\n",
"sample.size = len(sample._data)\n",
"# flat layout keeps local paths short (Windows limits paths to 260 characters)\n",
- "sample.download(\"ucar_calibratedPhase\", data_root=DATA_DIR, keep_aws_structure=False, silent=True)\n",
- "print(f\"{occultations.size} COSMIC-2 occultations on 14 May 2026, {sample.size} sampled\")"
+ "sample.download(\n",
+ " \"ucar_calibratedPhase\", data_root=DATA_DIR, keep_aws_structure=False, silent=True\n",
+ ")\n",
+ "print(\n",
+ " f\"{occultations.size} COSMIC-2 occultations on 14 May 2026, {sample.size} sampled\"\n",
+ ")"
]
},
{
@@ -112,10 +122,10 @@
"id": "f77450b8",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:02:43.543770Z",
- "iopub.status.busy": "2026-10-08T18:02:43.543770Z",
- "iopub.status.idle": "2026-10-08T18:03:01.029710Z",
- "shell.execute_reply": "2026-10-08T18:03:01.028701Z"
+ "iopub.execute_input": "2026-10-25T20:51:01.938710Z",
+ "iopub.status.busy": "2026-10-25T20:51:01.938419Z",
+ "iopub.status.idle": "2026-10-25T20:51:10.342171Z",
+ "shell.execute_reply": "2026-10-25T20:51:10.341473Z"
}
},
"outputs": [
@@ -175,9 +185,9 @@
"
\n",
" \n",
"\n",
@@ -273,17 +283,17 @@
"text/plain": [
" satellites median error (km) max error (km) excluded sets \\\n",
"group \n",
- "Galileo 26 1.73 15.62 0 \n",
- "GPS 32 1.25 4.71 1 \n",
- "GLONASS 19 1.23 6.91 0 \n",
- "receivers 5 0.52 1.21 0 \n",
+ "Galileo 26 1.70 15.67 0 \n",
+ "GPS 32 1.28 4.66 1 \n",
+ "GLONASS 19 1.23 6.88 0 \n",
+ "receivers 5 0.53 1.19 0 \n",
"\n",
" closest next-best satellite (km) \n",
"group \n",
- "Galileo 7121.80 \n",
- "GPS 2150.95 \n",
- "GLONASS 3901.38 \n",
- "receivers 3338.25 "
+ "Galileo 7121.83 \n",
+ "GPS 2151.02 \n",
+ "GLONASS 3901.41 \n",
+ "receivers 3338.26 "
]
},
"execution_count": 2,
@@ -311,7 +321,12 @@
"# element sets per NORAD catalog number, keyed by epoch (later duplicates win)\n",
"tle_lines = [\n",
" line.rstrip()\n",
- " for path in [\"gps_2026-05-14.3le\", \"glonass_2026-05-14.3le\", \"galileo_2026-05-14.3le\", \"cosmic2_2026-05-14.3le\"]\n",
+ " for path in [\n",
+ " \"gps_2026-05-14.3le\",\n",
+ " \"glonass_2026-05-14.3le\",\n",
+ " \"galileo_2026-05-14.3le\",\n",
+ " \"cosmic2_2026-05-14.3le\",\n",
+ " ]\n",
" for line in open(path)\n",
" if line.strip()\n",
"]\n",
@@ -342,35 +357,68 @@
" recorded_m = np.array([p for _, p in positions]).T\n",
"\n",
" def errors(sets):\n",
- " orbit = GeneralPerturbationsOrbit.from_tle(sum((sets[e] for e in sorted(sets)), []))\n",
- " p = np.einsum(\"ij...,j...->i...\", rotation, np.array(orbit.get_orbit_track_at_time(ts).position.m))\n",
+ " orbit = GeneralPerturbationsOrbit.from_tle(\n",
+ " sum((sets[e] for e in sorted(sets)), [])\n",
+ " )\n",
+ " p = np.einsum(\n",
+ " \"ij...,j...->i...\",\n",
+ " rotation,\n",
+ " np.array(orbit.get_orbit_track_at_time(ts).position.m),\n",
+ " )\n",
" return np.linalg.norm(p - recorded_m, axis=0) / 1e3\n",
"\n",
- " best = {norad: min(np.median(errors({e: s})) for e, s in sets.items()) for norad, sets in element_sets.items()}\n",
+ " best = {\n",
+ " norad: min(np.median(errors({e: s})) for e, s in sets.items())\n",
+ " for norad, sets in element_sets.items()\n",
+ " }\n",
" norad = min(best, key=best.get)\n",
- " kept = {e: s for e, s in element_sets[norad].items() if errors({e: s}).max() <= max_error}\n",
- " return norad, kept, errors(kept) if kept else None, sorted(best.values())[1], len(element_sets[norad]) - len(kept)\n",
+ " kept = {\n",
+ " e: s\n",
+ " for e, s in element_sets[norad].items()\n",
+ " if errors({e: s}).max() <= max_error\n",
+ " }\n",
+ " return (\n",
+ " norad,\n",
+ " kept,\n",
+ " errors(kept) if kept else None,\n",
+ " sorted(best.values())[1],\n",
+ " len(element_sets[norad]) - len(kept),\n",
+ " )\n",
"\n",
"\n",
"# recorded positions of each receiver and transmitter\n",
"recorded = collections.defaultdict(list)\n",
"for record in sample._data:\n",
- " l1 = nc.Dataset(os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"])))\n",
+ " l1 = nc.Dataset(\n",
+ " os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"]))\n",
+ " )\n",
" l1.set_auto_mask(False)\n",
" for k in [0, l1[\"time\"].size // 2, l1[\"time\"].size - 1]:\n",
- " t = GPS_EPOCH + timedelta(seconds=float(l1[\"startTime\"][...]) - GPS_UTC_OFFSET + float(l1[\"time\"][k]))\n",
+ " t = GPS_EPOCH + timedelta(\n",
+ " seconds=float(l1[\"startTime\"][...]) - GPS_UTC_OFFSET + float(l1[\"time\"][k])\n",
+ " )\n",
" recorded[record[\"transmitter\"]].append((t, l1[\"positionGNSS\"][k].astype(float)))\n",
" recorded[record[\"receiver\"]].append((t, l1[\"positionLEO\"][k].astype(float)))\n",
"\n",
"\n",
"keys = sorted(recorded)\n",
- "results = Parallel(n_jobs=N_JOBS)(delayed(identify)(recorded[key], element_sets, MAX_ERROR) for key in keys)\n",
+ "results = Parallel(n_jobs=N_JOBS)(\n",
+ " delayed(identify)(recorded[key], element_sets, MAX_ERROR) for key in keys\n",
+ ")\n",
"rows, satellites = [], {}\n",
"for key, (norad, kept, errors, next_best, excluded) in zip(keys, results):\n",
- " row = {\"key\": key, \"NORAD\": norad, \"name\": names[norad], \"element sets\": len(kept), \"excluded sets\": excluded}\n",
+ " row = {\n",
+ " \"key\": key,\n",
+ " \"NORAD\": norad,\n",
+ " \"name\": names[norad],\n",
+ " \"element sets\": len(kept),\n",
+ " \"excluded sets\": excluded,\n",
+ " }\n",
" if kept: # identified: at least one element set reproduces the recorded positions\n",
" satellites[key] = Satellite(name=key, orbit=to_orbit(kept))\n",
- " row.update({\"median error (km)\": np.median(errors), \"max error (km)\": errors.max()})\n",
+ " row.update(\n",
+ " {\"median error (km)\": np.median(errors), \"max error (km)\": errors.max()}\n",
+ " )\n",
" row[\"next-best satellite (km)\"] = next_best\n",
" rows.append(row)\n",
"orbit_check = pd.DataFrame(rows).set_index(\"key\")\n",
@@ -378,8 +426,12 @@
"receivers = [satellites[k] for k in sorted(satellites) if k.startswith(\"cosmic2\")]\n",
"transmitters = [satellites[k] for k in sorted(satellites) if k[0] in CONSTELLATIONS]\n",
"unidentified = sorted(k for k in recorded if k not in satellites)\n",
- "print(f\"{len(receivers)} receivers and {len(transmitters)} transmitters identified; unidentified: {unidentified or 'none'}\")\n",
- "display(orbit_check[orbit_check[\"excluded sets\"] > 0].round(2)) # element sets excluded as poor\n",
+ "print(\n",
+ " f\"{len(receivers)} receivers and {len(transmitters)} transmitters identified; unidentified: {unidentified or 'none'}\"\n",
+ ")\n",
+ "display(\n",
+ " orbit_check[orbit_check[\"excluded sets\"] > 0].round(2)\n",
+ ") # element sets excluded as poor\n",
"orbit_check.groupby(\"group\", sort=False).agg(\n",
" **{\n",
" \"satellites\": (\"NORAD\", \"size\"),\n",
@@ -409,10 +461,10 @@
"id": "7eaf75b3",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:01.033225Z",
- "iopub.status.busy": "2026-10-08T18:03:01.032224Z",
- "iopub.status.idle": "2026-10-08T18:03:09.491589Z",
- "shell.execute_reply": "2026-10-08T18:03:09.491589Z"
+ "iopub.execute_input": "2026-10-25T20:51:10.344121Z",
+ "iopub.status.busy": "2026-10-25T20:51:10.343828Z",
+ "iopub.status.idle": "2026-10-25T20:51:15.326551Z",
+ "shell.execute_reply": "2026-10-25T20:51:15.325778Z"
}
},
"outputs": [
@@ -511,7 +563,8 @@
"source": [
"def crossing_times(receiver, transmitter, stamps, window=600):\n",
" \"\"\"Time at which the straight line reaches -80 km, and the transmitter yaw angle in the\n",
- " receiver frame at that time, within window (s) of each time stamp (NaT/NaN if not reached).\"\"\"\n",
+ " receiver frame at that time, within window (s) of each time stamp (NaT/NaN if not reached).\n",
+ " \"\"\"\n",
" from datetime import timedelta\n",
"\n",
" import numpy as np\n",
@@ -529,9 +582,15 @@
" ts = timescale.from_datetimes([stamp + timedelta(seconds=s) for s in offsets])\n",
" rx_pv = receiver.orbit.to_gp_orbit().get_orbit_track_at_time(ts)\n",
" tx_pv = transmitter.orbit.to_gp_orbit().get_orbit_track_at_time(ts)\n",
- " tp, tp_sign, _, yaw = _tangent_point_geometry(tx_pv, rx_pv, *compute_vnb_frame(rx_pv))\n",
- " height = wgs84.geographic_position_of(Geocentric(Distance(m=tp).au, None, ts)).elevation.m\n",
- " height[tp_sign > 0] = np.nan # tangent point not between receiver and transmitter\n",
+ " tp, tp_sign, _, yaw = _tangent_point_geometry(\n",
+ " tx_pv, rx_pv, *compute_vnb_frame(rx_pv)\n",
+ " )\n",
+ " height = wgs84.geographic_position_of(\n",
+ " Geocentric(Distance(m=tp).au, None, ts)\n",
+ " ).elevation.m\n",
+ " height[tp_sign > 0] = (\n",
+ " np.nan\n",
+ " ) # tangent point not between receiver and transmitter\n",
" s = np.sign(height + 80e3)\n",
" crossings = np.nonzero(s[:-1] * s[1:] < 0)[0]\n",
" if len(crossings) == 0:\n",
@@ -540,7 +599,10 @@
" j = crossings[0]\n",
" w = (height[j] + 80e3) / (height[j] - height[j + 1])\n",
" results.append(\n",
- " (stamp + timedelta(seconds=offsets[j] + w), yaw[j] + w * (((yaw[j + 1] - yaw[j] + 180) % 360) - 180))\n",
+ " (\n",
+ " stamp + timedelta(seconds=offsets[j] + w),\n",
+ " yaw[j] + w * (((yaw[j + 1] - yaw[j] + 180) % 360) - 180),\n",
+ " )\n",
" )\n",
" return results\n",
"\n",
@@ -560,13 +622,18 @@
" ]\n",
")\n",
"# occultations of satellites without an orbit cannot be compared\n",
- "without_orbit = ~observed.transmitter.isin(satellites.keys()) | ~observed.receiver.isin(satellites.keys())\n",
- "print(f\"{int(without_orbit.sum())} observed occultations without an identified orbit, excluded\")\n",
+ "without_orbit = ~observed.transmitter.isin(satellites.keys()) | ~observed.receiver.isin(\n",
+ " satellites.keys()\n",
+ ")\n",
+ "print(\n",
+ " f\"{int(without_orbit.sum())} observed occultations without an identified orbit, excluded\"\n",
+ ")\n",
"observed = observed[~without_orbit].reset_index(drop=True)\n",
"# one parallel task per receiver-transmitter combination\n",
"groups = list(observed.groupby([\"receiver\", \"transmitter\"]).groups.items())\n",
"results = Parallel(n_jobs=N_JOBS)(\n",
- " delayed(crossing_times)(satellites[rx], satellites[tx], list(observed.stamp[index])) for (rx, tx), index in groups\n",
+ " delayed(crossing_times)(satellites[rx], satellites[tx], list(observed.stamp[index]))\n",
+ " for (rx, tx), index in groups\n",
")\n",
"t80, yaw80 = [pd.NaT] * len(observed), [np.nan] * len(observed)\n",
"for (_, index), group_results in zip(groups, results):\n",
@@ -575,7 +642,9 @@
"observed[\"t80\"] = pd.to_datetime(t80)\n",
"observed[\"yaw80\"] = yaw80\n",
"unresolved = int(observed.t80.isna().sum())\n",
- "observed = observed[(observed.t80 >= DAY0) & (observed.t80 < DAY0 + timedelta(days=1))].reset_index(drop=True)\n",
+ "observed = observed[\n",
+ " (observed.t80 >= DAY0) & (observed.t80 < DAY0 + timedelta(days=1))\n",
+ "].reset_index(drop=True)\n",
"\n",
"\n",
"def folded(yaw):\n",
@@ -584,10 +653,14 @@
" return np.minimum(yaw, 180 - yaw)\n",
"\n",
"\n",
- "print(f\"{len(observed)} observed occultations reach -80 km on 14 May ({unresolved} not resolved within the search window)\")\n",
+ "print(\n",
+ " f\"{len(observed)} observed occultations reach -80 km on 14 May ({unresolved} not resolved within the search window)\"\n",
+ ")\n",
"pd.DataFrame(\n",
" {\n",
- " c: np.percentile(folded(observed.yaw80[observed.constellation == c]), [50, 90, 95, 99, 100])\n",
+ " c: np.percentile(\n",
+ " folded(observed.yaw80[observed.constellation == c]), [50, 90, 95, 99, 100]\n",
+ " )\n",
" for c in CONSTELLATIONS.values()\n",
" },\n",
" index=[\"50%\", \"90%\", \"95%\", \"99%\", \"max\"],\n",
@@ -612,10 +685,10 @@
"id": "c2238b02",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:09.495596Z",
- "iopub.status.busy": "2026-10-08T18:03:09.495596Z",
- "iopub.status.idle": "2026-10-08T18:03:11.149190Z",
- "shell.execute_reply": "2026-10-08T18:03:11.148685Z"
+ "iopub.execute_input": "2026-10-25T20:51:15.328356Z",
+ "iopub.status.busy": "2026-10-25T20:51:15.328124Z",
+ "iopub.status.idle": "2026-10-25T20:51:35.451885Z",
+ "shell.execute_reply": "2026-10-25T20:51:35.451099Z"
}
},
"outputs": [
@@ -750,7 +823,12 @@
" # order (as a single collect_ro_observations call over all transmitters would return them)\n",
" results = Parallel(n_jobs=N_JOBS)(\n",
" delayed(collect_ro_observations)(\n",
- " receiver, transmitter, DAY0, DAY0 + timedelta(days=1), time_step=timedelta(seconds=1), max_yaw=MAX_YAW\n",
+ " receiver,\n",
+ " transmitter,\n",
+ " DAY0,\n",
+ " DAY0 + timedelta(days=1),\n",
+ " time_step=timedelta(seconds=1),\n",
+ " max_yaw=MAX_YAW,\n",
" )\n",
" for receiver in receivers\n",
" for transmitter in transmitters\n",
@@ -758,9 +836,9 @@
" n = len(transmitters)\n",
" pd.concat(\n",
" [\n",
- " pd.concat([r for r in results[k * n : (k + 1) * n] if len(r)], ignore_index=True).sort_values(\n",
- " \"time\", ignore_index=True\n",
- " )\n",
+ " pd.concat(\n",
+ " [r for r in results[k * n : (k + 1) * n] if len(r)], ignore_index=True\n",
+ " ).sort_values(\"time\", ignore_index=True)\n",
" for k in range(len(receivers))\n",
" ],\n",
" ignore_index=True,\n",
@@ -774,8 +852,13 @@
" candidates = []\n",
" for (rx, tx), p in pred.groupby([\"receiver\", \"transmitter\"]):\n",
" o = obs[(obs.receiver == rx) & (obs.transmitter == tx)]\n",
- " dt = np.abs((p.time.values[:, None] - o.t80.values[None, :]) / np.timedelta64(1, \"s\"))\n",
- " candidates += [(dt[i, j], p.index[i], o.index[j]) for i, j in zip(*np.nonzero(dt < tolerance))]\n",
+ " dt = np.abs(\n",
+ " (p.time.values[:, None] - o.t80.values[None, :]) / np.timedelta64(1, \"s\")\n",
+ " )\n",
+ " candidates += [\n",
+ " (dt[i, j], p.index[i], o.index[j])\n",
+ " for i, j in zip(*np.nonzero(dt < tolerance))\n",
+ " ]\n",
" used_p, used_o, pairs = set(), set(), []\n",
" for _, i, j in sorted(candidates):\n",
" if i not in used_p and j not in used_o:\n",
@@ -799,7 +882,8 @@
" \"share of observed that were predicted\": len(m) / len(o),\n",
" \"share of predicted that were observed\": len(m) / len(p),\n",
" \"rising/setting agreement (matched)\": np.mean(\n",
- " predicted.loc[m.pred, \"is_rising\"].values == ~observed.loc[m.obs, \"setting\"].values\n",
+ " predicted.loc[m.pred, \"is_rising\"].values\n",
+ " == ~observed.loc[m.obs, \"setting\"].values\n",
" ),\n",
" }\n",
"print(f\"max_yaw = {MAX_YAW} deg\")\n",
@@ -824,16 +908,16 @@
"id": "39cb1dbb",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:11.152197Z",
- "iopub.status.busy": "2026-10-08T18:03:11.152197Z",
- "iopub.status.idle": "2026-10-08T18:03:25.630975Z",
- "shell.execute_reply": "2026-10-08T18:03:25.630468Z"
+ "iopub.execute_input": "2026-10-25T20:51:35.453657Z",
+ "iopub.status.busy": "2026-10-25T20:51:35.453415Z",
+ "iopub.status.idle": "2026-10-25T20:51:43.481280Z",
+ "shell.execute_reply": "2026-10-25T20:51:43.480545Z"
}
},
"outputs": [
{
"data": {
- "image/png": "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Fli9ejWsrKywZ88ezJ8/H6ampigsLER0dLTmNi9jTJ48GVFRUfD29oZSqUT9+vURFxeHL774AocPH0ZWVhbWr18PAHjllVcQFRWFTp064eOPP0a/fv1QWFiI/Px8hISEwNfXF7m5uWjSpAlyc3Px8OFDODk5YdiwYZgzZ47RbSQiIiIiIiKiKqKkR71X5cfAt2vXTvOUryclJCQUmzdy5EjNk7+eFB4ejvDwcM3r6dOnay2PiYmR/H+lUono6GhER0drlY+KikJUVJTONoeFhUk+El6lUuH69es6c0RERERERET0AqtCYwDJ7gAiIiIiIiIiInohvMhXABERERERERERvQgUJiZQmOjp5NG3rIJhBxARERERERERkQSFQiH55PMnCpRdY54RO4CIiIiIiIiIiKQo/jvpW15JsAOIiIiIiIiIiEgCrwAiIiIiIiIiIqri2AFERERERERERFTFmZQwCLTgINBERERERERERJUcxwAiIiIiIiIiIqraeAsYEREREREREVEVp1CghA6gsmvLs2IHEBERERERERGRBBNFCWMAKTgGEBERERERERFR5VaFxgCqPF1VRERERERERERl6b9jAOmajB0DaNGiRWjUqBEsLCzQunVr7N+/X2/5X375BV5eXqhWrRrq1auHkSNH4u7du7LqZAcQEREREREREZEEfZ0/JQ4QrUNsbCzGjx+PqKgoHD16FB07dkSvXr1w9epVyfIHDhzA8OHDMXr0aJw+fRqrV69GYmIiXn/9dVn1sgOIiIiIiIiIiEjC8+gAmj9/PkaPHo3XX38drq6uWLBgARo0aIBvvvlGsvwff/wBFxcXjBs3Do0aNUKHDh3w5ptvIikpSVa97AAiIiIiIiIiIpKgMFGUOAFAenq61pSbmyu5vry8PPz1118ICgrSmh8UFIRDhw5JZgICAnD9+nXExcVBCIHbt29jzZo1CAkJkbUtHAT6GaUdS4LCTGVwebueyfIrsbKVn8l6WCb1VK9dU349ABzq15CduXFV3v2NAJCdlS07k3X8gOyMiU8n2RlLK0vZmeYRm2VnGjetKztzPMGI4xRA84h02Zn6DWrJzvx95ZLsjOeH22Rnrv19WXbGvFo12ZkBPx6WnREPUmVnHqTJb5tdHTvZGQB4ZGn4ebHI5dQs2ZncNPn7QenoKDtTo4b8fXfu8EnZGTy8LTty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VJedOXvpnuyMm2vdkgs9Xc9V+e+Pp6u97AwAxGw/Lzsz2MNRdsaY80Jwl+ayM2tWJ8jOODWQf2w7N6whO5P9yEt2xhhn/vrHqFyDZg1lZzbtv2xUXXJZViv+o6wkp47LP6cqLZSyM3m5ebIz+dnyv4sOH5W/PQDQsIWL7Iy1tfz9fe60/rEQpPQIbCo7c7ia/PeomhGZzAz571F6doHsTBNbI76L7qWXXEiCysxUdsbMiAEzklPlfye3qS//PHwq9YHsTLdG8n9j/MvBWnbmXqb880IHRS3ZGQDIziuUnfnr9gPZmdsP5X8mjGFpxHHqXLua7IxtNfm/UZclXZGduZ1lxLkkR/57CgAjfOV/j6em58rOnE/LlJ1pUkv+58gYJY3zU7SsQQPtvyOnTZuG6dOn68lpr1QIIflEscLCQoSFhWHGjBlo1qyZwe2Wwg4gIiIiIiIiIiIJJY3zU7Ts2rVrsLH53z/yS139AwC1a9eGqalpsat97ty5U+yqIADIyMhAUlISjh49infeeQcAoFarIYSAmZkZduzYga5duxq2LQaVIiIiIiIiIiJ6wRh6BZCNjY1WB5AuSqUSrVu3xs6dO9G/f3/N/J07d6Jfv37FytvY2ODkyZNa8xYtWoT4+HisWbMGjRo1MmxDwA4gIiIiIiIiIiJJJlDARE8PkL7xgXSJiIjAsGHD4OvrC39/f3z//fe4evUqxowZAwCYMmUKbty4gaVLl8LExATu7u5aeXt7e1hYWBSbXxJ2ABERERERERERSTD0CiA5Bg8ejLt372LmzJm4desW3N3dERcXB2fnx2O+3rp1C1evyh8HryTsACIiIiIiIiIikmDy30nfcmOMHTsWY8eOlVwWExOjNzt9+nS9A0zrwg4gIiIiIiIiIiIJJooSbgEz5hKgcsIOICIiIiIiIiIiCewAIiIiIiIiIiJ6AVSeLh792AFERERERERERCTheQwCXV7YAUREREREREREJEGhUEChp5dH37KKhh1AREREREREREQSTBUKmOrp5NG3rKJhBxARERERERERkQQF9I8BVHm6f9gBREREREREREQkibeAERERERERERFVcSb/nfQtryzYAUREREREREREJMFEoYCJnqt89C2raNgBREREREREREQkoSo9Br7CX600depUxMbG6i0THx8PPz8/uLm5wd3dHVFRURBClLjuPXv2oFq1amjVqpVmys7OLq2mExEREREREVElZgJFiVNlUeGvAJo5c2aJZezs7LBy5Uo0btwYOTk56N69O1auXImwsLASs25ubkhKSiqNphIRERERERFRFfJCXwGUkJCAjh07wsvLC56enti4cSOSkpLg7+8PT09PtG3bFgcPHgQApKamIigoCB4eHvD09MTIkSMBADExMQgKCsKQIUPQokULdO3aFadPn0ZISAiaNWuGIUOGQK1WAwDCw8Px1VdfAQDy8vIwceJEeHh4wMvLCz179gQAeHt7o3HjxgAACwsLtGrVChcvXtS0edmyZfDz84OPjw8CAwNx6tSpZ9hlRERERERERPQiUBjwX2Uh6wqge/fuoX///li3bh0CAgKgVquRlpYGX19f/PDDDwgODsaBAwcwcOBAnD9/HsuXL4eLiwt27NihyRdJTEzEyZMn4eTkhD59+iAsLAz79u2DlZUVfHx8sGvXLgQFBWnVP2fOHFy4cAFJSUlQqVRITU0t1saUlBSsWbMGcXFxAICDBw9i1apV2LdvH1QqFfbv34+hQ4fi+PHjAIC///4bPj4+MDU1xciRIzF27FjJbc/NzUVubq7mdXp6upxdR0RERERERESVjIlCAdMXcRDohIQEuLm5ISAgAABgYmKC27dvQ6lUIjg4GADQoUMH2Nvb48SJE2jXrh0+//xzREZGIjAwUFMGANq3bw8nJycAj6/gcXFxga2tLQDAy8tL6wqeIlu2bMG8efOgUqkAAHXq1NFanp6ejtDQUEyaNAk+Pj4AgI0bN+L48ePw8/PTlEtNTUVeXh58fHxw/fp12Nra4vr16+jduzdq166NQYMGFat7zpw5mDFjhpzdRURERERERESV2At9C9jThBBQSGyxQqGAv78/jh07Bj8/P6xduxZt2rRBYWEhgMe3ahUxNTUt9rqgoEBWOzIyMtCzZ0/07dsXERERWu0bNWoUjh07pplu3rwJpVIJGxsbTaeTk5MTXn31Vezfv19y/VOmTMHDhw8107Vr12S1j4iIiIiIiIgql6IOIH1TZSGrAyggIADJyck4dOgQAECtVsPBwQG5ubmIj48HABw6dAh37tyBh4cHLl26BGtrawwaNAgLFy7EuXPnkJmZaXRj+/btiwULFmhuxSq6BSwzMxM9e/ZEcHAwPvroI61MaGgoli5dqumwUavVmkGfb926pRlrKCMjA1u2bIG3t7dk3SqVCjY2NloTEREREREREVVdL+wYQHZ2dli/fj0iIyORkZEBhUKBWbNmYe3atRg3bhyysrJgYWGB1atXw8rKCnv27MH8+fNhamqKwsJCREdHa664McbkyZMRFRUFb29vKJVK1K9fH3Fxcfjiiy9w+PBhZGVlYf369QCAV155BVFRUejUqRM+/vhj9OvXD4WFhcjPz0dISAh8fX2xdu1afPPNNzAzM0NBQQFeeeUVzUDVRERERERERPRiMy1hDCB9yyoa2Y+Bb9euneYpX09KSEgoNm/kyJGSHSrh4eEIDw/XvJ4+fbrW8piYGMn/VyqViI6ORnR0tFb5qKgoREVF6WxzWFiY5CPh33nnHbzzzjs6c0RERERERET04qpKYwDJ7gAiIiIiIiIiInoRKAC9t3lVov4fdgAREREREREREUkxUTye9C2vLNgBREREREREREQkoaSBnqvsINBERERERERERC8KXgFERERERERERFTFmUABEz0jPZvwCiAiIiIiIiIiospNAf0DPVee7h92ABERERERERERSatCPUDsACIiIiIiIiIiksBBoImIiIiIiIiIqjhFCYNA6xkeqMJhBxARERERERERkRTeAkZEREREREREVLVVpVvATMq7AUREREREREREFZFCUfJkjEWLFqFRo0awsLBA69atsX//fp1l161bhx49eqBOnTqwsbGBv78/tm/fLrtOdgAREREREREREUl4Hh1AsbGxGD9+PKKionD06FF07NgRvXr1wtWrVyXL79u3Dz169EBcXBz++usvdOnSBaGhoTh69KisetkBREREREREREQkQWHAf3LNnz8fo0ePxuuvvw5XV1csWLAADRo0wDfffCNZfsGCBZg0aRLatGmDpk2b4uOPP0bTpk2xefNmWfWyA4iIiIiIiIiISEJpXwGUl5eHv/76C0FBQVrzg4KCcOjQIYPWoVarkZGRgZo1a8qqm4NAExERERERERFJMPQhYOnp6VrzVSoVVCpVsfJpaWkoLCxE3bp1tebXrVsXKSkpBrVp3rx5yMrKwqBBgwwqX4QdQM9IrVYDarXB5QsLDS9bJCMjV3bGGH6t6snO7IhPL7mQhIt/35CdsahmITtjrjSXnTl5LlV2xrVJLdmZ81cfyM7k5hXKzvx9IEl2xqt7O9kZALj4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WFtbY9CgQVi4cCHOnTuHzMxMoxvbt29fLFiwQHMrVtEtYJmZmejZsyeCg4Px0UcfaWVCQ0OxdOlSTYeNWq1GUlISAGDQoEFITEzU3M61bds2eHl5SdatUqlgY2OjNRERERERERFR1VWVrgCSNQaQnZ0d1q9fj8jISGRkZEChUGDWrFlYu3Ytxo0bh6ysLFhYWGD16tWwsrLCnj17MH/+fJiamqKwsBDR0dGwtbU1urGTJ09GVFQUvL29oVQqUb9+fcTFxeGLL77A4cOHkZWVhfXr1wMAXnnlFURFRaFTp074+OOP0a9fPxQWFiI/Px8hISHw9fVFw4YNMWXKFPj7+8PMzAyOjo74/vvvjW4fEREREREREVUdCoVC8q6nJ5dXFrIfA9+uXTvNU76elJCQUGzeyJEjNU/+elJ4eDjCw8M1r6dPn661PCYmRvL/lUoloqOjER0drVU+KioKUVFROtscFham85Hww4cPx/Dhw3VmiYiIiIiIiOjFVHWGgDaiA4iIiIiIiIiI6EVQ0m1elegCIHYAERERERERERFJUfz3P33LKwt2ABERERERERERSalC94CxA4iIiIiIiIiISIKJ4vGkb3llwQ4gIiIiIiIiIiJJ+m8Bq0yXALEDiIiIiIiIiIhIQlUaBNqkvBtARERERERERETPF68AIiIiIiIiIiKSYKJQwETPZT76llU07AAiIiIiIiIiIpJQlW4BYwcQEREREREREZGEKvQUeHYAERERERERERFJqkI9QBwEmoiIiIiIiIhIgsKA/4yxaNEiNGrUCBYWFmjdujX279+vt/zevXvRunVrWFhYoHHjxvj2229l18kOICIiIiIiIiIiCSaKkie5YmNjMX78eERFReHo0aPo2LEjevXqhatXr0qWv3TpEnr37o2OHTvi6NGj+PDDDzFu3DisXbtW3rbIbyoRERERERER0QtAYcAk0/z58zF69Gi8/vrrcHV1xYIFC9CgQQN88803kuW//fZbNGzYEAsWLICrqytef/11jBo1Cp999pmsetkBREREREREREQkobRvAcvLy8Nff/2FoKAgrflBQUE4dOiQZCYhIaFY+eDgYCQlJSE/P9/gujkItJGEEAAAdd4jWbnCXPXzaE7xevLl15OfnSk7I3f7i4j8PCPqkr9NapjLzhTmyo4gP1tlRD1ZsjMFOYWyM6Igx4h6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A65duyb55KTKkKno7WOmYmcqevuMyYgnRm0QT43g8PRrZipP+5ip2JmK3j5mjH9fX1QcFrsUtGrVCj///HOx+cuWLYOXlxczzOjMVPT2McNjgZmyzxibK3qiGfD4iRgNGjQo8Q/kipyp6O1jpmJnKnr7jMkoFArJ/5d6zUzlaR8zFTtT0dvHjPHv64uKg0CXghs3buCll16CjY0NWrVqBYVCgaNHjyI9PR0bNmyQHHyLGWYqQ/uY4bHATNlnjM2ZmZlpHqErhMCDBw9gZ2cHIQQUCgXu3LlTqTIVvX3MVOxMRW/fs2SeLF+Uf/jwIfLy8piRyFT09jFTsTMVvX3MGP++vqjYAVSKdu3aheTkZAgh4Obmhu7duzPDjEGZit4+ZngsMFP2mWfJERERERE9jR1ARERERERERERVHMcAIiIiIiIiIiKq4tgBRERERERERERUxbEDiIiIiIiIiIioimMHEBERERERERFRFccOICIiIiIiIiKiKo4dQEREREREREREVRw7gIiIiIiIiIiIqjh2ABERERERERERVXHsACIiIiIiIiIiquLYAUREREREREREVMWxA4iIiIiIiIiIqIpjBxARERERERERURXHDiAiIiIiIiIioiqOHUBERESVWExMDBQKhdZUp04ddO7cGVu2bCnv5j1XnTt3RufOncu7GeXi8uXLUCgUiImJ0Vuu6PhISkoqm4YRERFRhWVW3g0gIiKiZ7dkyRK0aNECQgikpKTgq6++QmhoKDZt2oTQ0NDybt5zsWjRovJuAhEREVGlwQ4gIiKiKsDd3R2+vr6a1z179oSdnR1Wrlz53DqAhBDIycmBpaXlc1l/Sdzc3Mq8zvLe5souPz8fCoUCZmb8CUpERFTWeAsYERFRFWRhYQGlUglzc3MAjzsumjZtiuDg4GJlMzMzYWtri7ffflvvOhUKBd555x18++23cHV1hUqlws8//wwA+OeffxAWFgZ7e3uoVCq4urri66+/LraOBw8eIDIyEo0bN4ZKpYK9vT169+6Ns2fPasrk5eVh9uzZaNGiBVQqFerUqYORI0ciNTVVa11P3gKWn58Pe3t7DBs2TLJOS0tLREREaOalp6djwoQJaNSoEZRKJRwdHTF+/HhkZWUZvM1SYmNjERQUhHr16sHS0hKurq744IMPiq03PDwc1tbWOH/+PHr37g1ra2s0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Wvlz587h77//NnqgaCIiInr+2AFERERUBZw6dQoFBQUAHt/Os27dOuzcuRP9+/cv1snRo0cPuLm5Yffu3Xjttdee+alMX3zxBTp06ICOHTvirbfegouLCzIyMnD+/Hls3rxZ86Sp8ePHIzY2Fv369cMHH3yAtm3bIjs7G3v37kWfPn3QpUsXDBkyBL/88gt69+6N9957D23btoW5uTmuX7+O3bt3o1+/fujfv7/e9owaNQqxsbF455134OTkVGzMofHjx2Pt2rXo1KkT3n//fXh6ekKtVuPq1avYsWMHIiMjjep8CggIgJ2dHcaMGYNp06bB3Nwcv/zyC44fPy57XUWGDx+Ozz//HMOHD8d//vMfNG3aFHFxcdi+fbvR65TSvHlzvPHGG1i4cCFMTEzQq1cvzVPAGjRogPfff19TdtiwYXjttdcwduxYDBgwAFeuXMHcuXOLdTQSERFRxcIOICIioiqg6BHnAGBra4tGjRph/vz5GDt2rGT5QYMGYfr06QYP/qyPm5sbjhw5glmzZuH//u//cOfOHdSoUQNNmzbVjAMEPL5968CBA5g+fTq+//57zJgxA3Z2dmjTpg3eeOMNAICpqSk2bdqEL774AsuWLcOcOXNgZmYGJycnBAYGwsPDo8T2dO/eHQ0aNMC1a9cQFRUFExPtIQ+trKywf/9+fPLJJ/j+++9x6dIlWFpaomHDhujevTtcXFyM2g+1atXCb7/9hsjISLz22muwsrJCv379EBsbCx8fH6PWWa1aNcTHx+O9997DBx98AIVCgaCgIKxatQoBAQFGrVOXb775Bk2aNMFPP/2Er7/+Gra2tujZsyfmzJmjNYZQWFgYbt68iW+//RZLliyBu7s7vvnmG8yYMaNU20NERESlSyGEEOXdCCIiIipbvr6+UCgUSExMLO+mEBEREVEZ4BVAREREL4j09HScOnUKW7ZswV9//YX169eXd5OIiIiIqIywA4iIiOgFceTIEXTp0gW1atXCtGnT8NJLL5V3k4iIiIiojPAWMCIiIiIiIiKiKs6k5CJERERERERERPQs9u3bh9DQUNSvXx8KhQIbNmwoMbN37160bt0aFhYWaNy4Mb799luj62cHEBERERERERHRc5aVlQUvLy989dVXBpW/dOkSevfujY4dO+Lo0aP48MMPMW7cOKxdu9ao+nkLGBERERERERFR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Y5Wenq6TJ09aHcul1NRURUdHKzY2Vn379tXevXutjuTW008/7fX/9mFhYeratatiY2MVGxurVatWWR3JpdLSUv3mN79R586d1b17dz344INWR6rm66+/dj6PsbGx6tKlixo1aqQLFy5YHa2aDz74QD169FBcXJwiIyP1xhtvWB3Jpffff18JCQmKjo5WUlKS9u3bZ3UkSe7f28+ePav09HR17txZkZGR2rZtm4Up3eecM2eObrnlFtlsNr333nsWJrzKXc4xY8bolltuUWxsrPr162f5+727nKNHj3ael3r27KmPPvrIwpTX/uzxxhtvyDAMy//t3eW89dZbFR4e7nwvfeGFFyxM6T6naZqaNWuWunTposjISN16663WhZT7nCkpKc7nMjIyUoZhaP/+/V6XMycnR8nJyYqLi1O3bt303HPPWZZRcp9z165d6t27t/M1v2nTJgtT1vwZ3pvOSTXl9KZzUk05vemcVFNObzsn+TwTXuO2224zX3/9ddM0TXPNmjVmUlKStYFc+Pjjj828vDyzY8eO5oEDB6yO49a3335r/s///I/pcDhM0zTNhQsXmnfccYfFqVz76quvnH9ft26dGRcXZ12YGuzevdtMT083O3To4NX/9t7+f7PS5MmTzUcffdT5f/T06dMWJ7q2efPmmYMHD7Y6RjUOh8O88cYbzX379pmmaZonTpww7Xa7WVRUZHGyqi5cuGA2b97cPHTokGmaprl582aze/fuFqe6yt17++jRo82nnnrKNE3T3Llzp9mhQwfzypUrFqV0n/OTTz4xjx49avbv39989913LctXyV3O9evXO5+/d9991+zcubNVEU3TdJ/z389Le/bsMZs3b+58r7JCTZ898vLyzOTkZDMpKcnyf3t3Ob3l/2UldzkXLFhg3nvvvWZpaalpmtaflzz5zLlmzRozMjLyR05WlbucsbGx5vr1603TNM3z58+bLVu2NA8ePGhVTJc5HQ6H2b59e3PTpk2maZrm4cOHzZCQEPObb76xLGdNn+G96ZxUU05vOifVlNObzkk15fS2c5KvYwSQlzh79qw+/fRT5yiAn//85zpx4oTXjVrp16+fQkJCrI5xTQEBAbrrrrtkGIYkKSkpScePH7c4lWs33HCD8+8XL16UzeZ9L8vS0lJNnDhRixcvdj6nqLuSkhK9/vrrmjNnjvP5bNu2rcWpru3111/X2LFjrY7h1tdffy1JKioqUvPmzb3uqhHHjh1Tq1at1K1bN0lXr+jwxRdf1NtVHX4Id+/tq1ev1sSJEyVJPXv2VOvWrS39jau7nImJibrpppssSOSau5xDhw5Vo0ZXL8CalJSkL774Qg6H48eO5+Qu57+fl77++mvL3/dr+uzxq1/9Si+88IJXvN595TOSu5zz5s3TH/7wB/n7+0uy/rzkyfP52muvWX5eqiln5XmppKRE/v7+uvHGG3/EZFW5ynn+/HlduHBBt912mySpa9euuuGGG/T3v//dioiSav4M703npJpyetM5qaac3nROqimnt52TfJ33fdP8icrLy1O7du2cL0LDMNShQwfl5uZanKxh+NOf/qQhQ4ZYHcOthx9+WKGhofqv//ovr5y6MnPmTD344IPq1KmT1VE8MnLkSEVFRWncuHEqLCy0Ok41x44dU/PmzfXss88qISFBffv29frhrDt27ND58+c1ePBgq6NUYxiGVq9erXvvvVcdO3ZUnz599MYbbzi/xHiLzp07q7CwUJ988okkad26dbp06ZLXFfornT9/Xg6HQy1btnS2hYWFcV6qJy+++KLuuusuryz6S9ITTzyhm266Sffee6/WrFnjlR+4lyxZou7duysxMdHqKNc0bdo0RUVF6YEHHvDKX0gVFRWpsLBQ69atU1JSkpKSkrx2CnWlL7/8Ups3b/bKKdTS1V+aPPnkk+rQoYO6dOmiuXPnqk2bNlbHqqJFixZq3bq1MjMzJUn/+Mc/9Pnnn3vVeanyM7y3n5O8/btGJXc5ve2c9P2cvnBO8hXe8S8MSar2H9k0TYuSNCxz5szRkSNH9Lvf/c7qKG4tX75ceXl5evbZZzVt2jSr41SxY8cO7dq1SxMmTLA6ike2bNmiffv26dNPP1Xz5s31yCOPWB2pmitXruj48eOKiIhQTk6OFi1apOHDh3tlsarSa6+9pocffthZpPYm5eXlmjt3rtavX68vvvhCH330kR555BGvW6soODhYmZmZeuKJJ9SjRw9t3rxZERERaty4sdXR3OK89J+xYsUKrV69Wi+//LLVUdz6/e9/r2PHjmn16tWaNm2aysrKrI5UxYkTJ7R06VLNnj3b6ijX9Oabb+rw4cPav3+/+vbt65WF9CtXrqisrEzffvutPvnkE61evVpTpkzx6jX/li1bpsGDB6tFixZWR3Fp3rx5mjdvnnJzc3Xw4EFlZGToX//6l9Wxqlm/fr1effVVxcfHa/HixerTp4/XnJe+/xneW89JvvBdQ3Kf09vOSa5yevs5yZdQAPISoaGhOnXqlMrLyyVdfUPLy8tThw4dLE7m2/74xz9q7dq1+vvf/67rr7/e6jjX9Mgjj+h///d/df78eaujOH388cf65z//qU6dOiksLEynTp1SWlqapcODa1L5mmncuLEmT56srVu3Wpyouo4dO8pms2nkyJGSpJiYGHXq1EkHDx60OJlrJSUlWrVqlcaMGWN1FJf27t2r06dPq3fv3pKuDgtv166d1yyw/O/69eunzZs3a/fu3Xruued0+vRp55Qwb9O8eXNJqlKY/OKLLzgv/UCrVq3S008/rY0bN6pVq1ZWx7mmgQMHqri4WAcOHLA6ShU7duxwvn7CwsL0ySefaOzYsVq6dKnV0aoJDQ2VdPXL629+8xsdP37cq87z0tXXe5MmTZyjaTp06KDevXsrJyfH4mSumabp1dOSz507p3Xr1mnYsGGSpPDwcCUmJio7O9viZNVFR0fr73//uz799FO98cYbOn36tCIiIqyOVe0zvLeek3zlu4a7nN52TrrW8+mt5yRfQgHIS7Rq1UpxcXFasWKFJCkzM1NhYWEKCwuzNpgPmz9/vlauXKmNGzdWmTvqTYqKinT69Gnnz+vWrVPz5s0tnSP+fU888YROnz6tkydP6uTJkwoJCdEHH3ygO++80+po1ZSUlDjn20vSypUrFRcXZ10gN1q0aKHbb79dH3zwgaSrH2BOnDihW265xeJkrq1Zs0bR0dHq2rWr1VFcqiygV/5m9ejRozp27Ji6dOlicbLq8vPznX9/5plnNGDAAN18880WJqrZ/fffr5deeknS1SvFFBQUqE+fPhan8l2rV6/Wf/3Xf+nDDz+0/EuLO+Xl5Tpy5Ijz5507d+rs2bMKDw+3MFV1I0aMUEFBgfPclJSUpL/85S/65S9/aXW0KsrLy3XmzBnnz5mZmWrdurXzy6w3+cUvfqH3339fkvTVV19p586dio6OtjiVax9//LHKysp0xx13WB3FpWbNmikgIEAff/yxpKsFoU8++USRkZEWJ6uuoKDA+felS5cqMDBQAwYMsDCR+8/w3nZO8oXvGpL7nN52TnKV01fOST7F0iWoUcU///lPMykpyezcubPZo0cP87PPPrM6UjUTJkww27dvb/r5+ZmtW7c2b7rpJqsjuZSXl2dKMsPDw82YmBgzJibG7NWrl9WxqsnNzTV79uxpRkZGmtHR0ebtt99u7tmzx+pYNfLmq2wdO3bMjI2NNaOioszIyEhz6NCh5okTJ6yO5dKxY8fM/v37m5GRkWZMTIy5du1aqyO51adPH/O1116zOkaN/vrXvzpfR1FRUebKlSutjuTS2LFjzVtuucW86aabzAcffLDKlS2s5O69vaCgwLzjjjvMm2++2YyIiDA3b97slTnnzJljtm/f3vT39zebN29utm/f3jx79qzX5WzUqJEZEhLiPC/FxMSY586d86qcly9fNlNSUszu3bub0dHRZnJysvnRRx9ZltFdzu/zhqvtuMp56dIls0ePHs73pwEDBph79+71upymaZqFhYXm4MGDze7du5vdu3c3//znP3tlTtM0zQcffNCcOXOmhen+j7ucGzduNOPj483o6GizW7du5oIFC7wy56xZs8zOnTubN998szlkyBAzNzfX0pw1fYb3pnNSTTm96ZxUU05vOie5y+mN5yRfZ5iml0yeBAAAAAAAwH8EU8AAAAAAAAAaOApAAAAAAAAADRwFIAAAAAAAgAaOAhAAAAAAAEADRwEIAAAAAACggaMABAAAAAAA0MBRAAIAAAAAAGjgKAABAAC4sWnTJnXt2lUOh8OSx7/vvvs0f/58Sx4bAAA0LBSAAACApUaNGqWf/exn1do3b94swzD09ddf/+iZKk2fPl0ZGRmy2a5+ZJo1a5ZiY2Or9fv6669lGIY2b96sWbNmyTCMGreTJ0+qrKxMzz33nGJiYnT99derRYsW6t27t15//XVduXJFkjRz5kz97ne/U1FR0Y952AAAoAGiAAQAAH7SKost35edna0jR47o/vvvr9X9PfbYY8rPz3duISEhmj17dpW2tm3bKi0tTb///e/1q1/9StnZ2dq5c6cmTpyohQsX6uDBg5Kk6OhohYWF6a233vrBxwkAAH7aKAABAACfkZmZqe7du8tutyssLEzPP/98ldsNw9B///d/V2m74YYbtGzZMknSyZMnZRiGVq9erVtvvVUBAQFasWKFy8d6++23lZqaqoCAgFplbNKkidq0aePc/Pz81LRp0yptL774orZs2aKPPvpIEydOVGxsrMLDwzVixAj94x//UOfOnZ33N3ToUK1cubJWGQAAAL6PAhAAAPAJu3fv1rBhwzR8+HAdOHBAs2bN0pNPPuks7tTG448/rkmTJunw4cNKS0tz2WfLli1KSEj4galde+uttzRw4EDFxcVVu61x48YKDAx0/tyrVy/t3LlTpaWl/5EsAADgp6GR1QEAAADee+89NWnSpEpbRUVFlZ/nz5+v22+/XU8++aQkqUuXLjp06JDmzZunUaNG1erxJk+erHvvvbfGPidPnlS7du1qdb+eOnLkiG699VaP+rZv316lpaUqKChQx44d/yN5AABAw8cIIAAAYLnbbrtNe/furbK9+uqrVfocPnxYvXv3rtLWu3dvHTlypFqx6Fo8Gdnz7bff1nr6l6dM05RhGB71ve666yRJ33zzzX8kCwAA+GlgBBAAALBcYGCgbr755iptp06dqvKzq6KJaZpVfjYMo1qbq0We/32KlTstWrTQV199VaUtKChIFy9erNa38kplwcHB17xf6eropcOHD3vU98KFC5Kkli1betQfAADAFUYAAQAAnxAREaFt27ZVacvOzlaXLl3k5+cn6WqRJD8/33n7kSNH6jxyJi4uTocOHarS1rVrV506dUoFBQVV2nft2iWbzVatiOXOiBEj9OGHH2rPnj3VbisvL1dJSYnz588++0whISFq0aJFHY4CAADgKgpAAADAJ0ydOlUfffSRnnnmGX3++ed64403tGjRIj322GPOPgMGDNCiRYv06aefKicnR+PHj1fjxo3r9HhpaWnVCk6pqanq1q2bhg8fru3bt+vEiRNav369HnvsMY0fP15Nmzb16L4nT56s3r176/bbb9dLL72kffv26fjx41q9erUSExN15MgRZ9+tW7cqNTW1TscAAABQiQIQAADwCfHx8Vq9erXefvttRUZGaubMmZo9e3aVBaCff/55hYaGql+/fhoxYoQee+wxXX/99XV6vAcffFCHDh3Sv/71L2dbo0aNtGHDBoWHh2vkyJHq3r27nnjiCY0bN07z58/3+L7tdrs2btyo6dOn6+WXX1ZSUpJ69uypP/3pT5o0aZIiIyMlSZcvX9a6dev0y1/+sk7HAAAAUMkwvz9RHgAAAJKk6dOn6+LFi3r55ZctefyXXnpJ69ev14YNGyx5fAAA0HAwAggAAMCNjIwMdezYsdZXGasvjRs31sKFCy15bAAA0LAwAggAAAAAAKCBYwQQAAAAAABAA0cBCAAAAAAAoIGjAAQAAAAAANDAUQACAAAAAABo4CgAAQAAAAAANHAUgAAAAAAAABo4CkAAAAAAAAANHAUgAAAAAACABo4CEAAAAAAAQANHAQgAAAAAAKCB+/8BeXYkGEq9DPYAAAAASUVORK5CYII=",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABIAAAAISCAYAAAC01rQoAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAA4T1JREFUeJzs3QW8FOX+x/HfnkN3N1IqAiIqJoIFJoLdqBjYXruuhYmK1+5CRcROLBQTBRHwIhKCooBId+f+X9/H/5w7Z5mZ3VngwB4+7/va62F3n5165plnfvNEIplMJg0AAAAAAADFVt7mXgEAAAAAAABsWgSAAAAAAAAAijkCQAAAAAAAAMUcASAAAAAAAIBijgAQAAAAAABAMUcACAAAAAAAoJgjAAQAAAAAAFDMEQACAAAAAAAo5ggAAQAAAAAAFHMEgADklDlz5lgikbD77rvPipMxY8ZYx44drVKlSm773nzzTduSde/e3erUqVPovU6dOtlee+1lW/p65prNsV+3xGOZjd12281ty9ZoQ/L+1rjfZsyY4creRx991LZWJUqUsKuuumpzr8YWh7wBoDghAARgizBv3jy78cYbrVWrVlahQgV343LAAQfYs88+a0uXLrXi7tRTT7VkMmlTpkxx/z3uuONsa9G+fXv3QtHuM/Y7gLj+/PNPFyh78sknt+qdF7Uf2EcAtmQlNvcKAMCSJUtca4Nly5bZ448/bvvuu6+tXbvWXn75Zbv88stdq5/rrruu2O6oRYsW2ahRo+z++++3KlWqWK76/PPPN/cqYCPhWGJro4cOCr4D5A0AxRkBIACb3euvv24TJ060/v37W9euXQvev/TSS+3ggw+24cOHW3E2e/Zs99+yZctu7lUBAAAAUEzRBQzAFtH9S+rXr7/eZy1atLDTTjstMN3HH39sO+20k5UpU8Z97+23317vOzVq1HDNtPUqWbKkNWrUyC655BJbuHBh4LhC7733nrVp08ZKlSrlWiDJtGnTrEePHm799H7jxo3t3//+t61cuTLttv3888925JFHWrVq1dx6tm7d2h577LGCJ83nn3++bbvttu7vCy64wK2H1jnMgw8+6L6jrmKXXXaZ1axZ03WZU+Bs0qRJgd+dOnWqXXPNNVa3bl33b8/AgQMLxh1S8GnPPfe0Dz74oNBvaD179+5tTZo0cd9RS62hQ4fGGjfms88+c4G8qlWrumWpa98XX3zhPmvQoIF999137uUdp9Tt39jrGeb555+3XXbZxaVXS6zDDjvMfvzxx1jbk+l31NpAY7Sk6tatm9snUdLtM/2G935eXp77THnwl19+yfg3wo5lJvvIGz/mjz/+sEMPPdTKly/v8t4NN9xg69atK/RdLV/7SflY+2mPPfawF198cb3vbcjxknHjxtmBBx5o5cqVc+ex1mXNmjVZrUsm+dHbBxMmTHD7QOeojsvJJ5/s8sTy5cvXW8dzzz3XfW/x4sVFnvfDpNtvKpu174O66Z599tnrbU+qsP0kq1evtjvvvNOV7aVLl7bq1au7/aeyz2/VqlXWq1cv23HHHd32K2+rvJ4+fXrBdzL5rdRxXrTeWp9zzjlnvfVW2a8yXV134yxj/PjxbhkvvPCC9evXz1q2bOnG3fnkk09C95F3fuql60+zZs3s2muvdS1mg35XD1R22GEHd73RtUxlUSpt6ymnnGKVK1d2x09lUdRx8nz11Vcun/mvV3rpWpTJ9m2KbXnggQfcsdexqlevnh199NGuRW3Q77300ku23XbbuTJJ5cXff//tvqPPtt9+e7ecffbZx+X71P3lzxtR+yHdPtqUeQUAMpIEgM3s+++/VzQkecQRRyTnzp0b+d3Zs2e77x577LHJc845J/nnn38mZ86cmTz11FOTJUqUSE6aNCk07eLFi5Off/55skmTJskjjzxyvd/Ue6effrr7jXHjxiW/+OKL5JQpU5J169ZN7rHHHskffvjB/caXX36Z3GabbQr9RpCff/45Wb58+eSBBx6YHDt2rNu2hx9+2K3n5ZdfXvC9iRMnuuU/8cQTaffVAw884L570kknJfv06ZOcP39+8qeffkruvPPOyXr16rltSf3uKaecknzuuefc8p966in3mdImEonkVVdd5bZRn913333J/Pz85Ouvv17wG//+97/d+j7yyCPJefPmJceMGZM87LDDkh07dkzWrl270LrpvT333LPQe88884xbzoUXXpicMGFCctGiRcmvv/660L7bZ5993CvIpljPILfeemsyLy8veddddyVnzZrljknXrl2TpUuXdvkzzvZk8h2t0xlnnLHeeigf169fP+1+jdpnfqtWrUr+8ssvyc6dO7t87D+/on4jaJmZ7qO2bdu68+Xoo49O/vjjj8mFCxe6vK28qH3j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rEATg0ADAAAAAAAESeSlf21kmiHs2WefddO/S5cuXeyDDz6wpUuXFrROevPNN937cRAAAgAAAAAACJKXn/4Vw/z5811wR6/ly5fbsGHD3N+a5t3z1VdfWY8ePWz16n/GiLrssstc66KOHTta79697bDDDnNdwG688cZYyyYABAAAAAAAEDY5RbpXDAr6DB061L2OP/54F9jR37/++mvBd1q0aGFnn312wexemnxKgaKTTjrJdQU7+OCD7aeffrJ69erFWjZjAAEAAAAAAARK180rXrsaBW3U4ifKfvvt515+ChSpJdCGIAAEAAAAAAAQJF0rn5gtgDYnAkAAAAAAAABB0o3zE3MMoM2JABAAAAAAAECQdDN9bYJZwDYVAkAAAAAAAABB6AIGAAAAAABQzCVoAQQAAAAAALAVtADKi/48R9AFDAAAAAAAIEh+/j+vMEkGgQYAAAAAAMhtCaaBBwAAAAAAKN4SjAEEAAAAAABQvCWKTwugnJiw/oILLrA1a9ZEfmfOnDnWu3dvu/LKK+29997L+LfvuOMOO+ecc9xr0qRJG2FtAQAAAABAsZCXn/6VI3IiALTnnntaIiKqNnPmTOvQoYPNnj3b6tata5dccokL7GSidevWttdee9n7779vs2bN2ohrDQAAAAAAikUXsETEqzjOArZq1Sp78cUX7eeff7bly5e7VjMKnixZssSefvppmzp1qu2+++528sknFwRsBg0aZB9++KEtWrTIatSoYXfffbd7X2nVWqd///6Wn59vl19+uY0fP95eeeUVa9y4sV100UVWsmRJ990ffvjBunXrFroOO+64o3333XdWrVo1951tt93WbrvtNrvxxhvdv1evXm19+vSxMWPGuN9WmooVK7rPjjzySPdfb70AAAAAAACKWxewjANAyWTSDjroIBeUUdCkbNmyVrNmTVu7dq3tu+++1rRpU9tnn31cIGX48OF2//33208//WRnnnmmXXrppdayZcuCoIs899xz9scff1jXrl1twIAB9sknn1ilSpXs8MMPt379+rmA0c033+y+q+DNAw884AJFQetQoUKFQuuqQI9a9njr3blzZ9tuu+2sVatWNmrUKOvUqZMNHTo0slVRkJUrV7qXR+sIAAAAAACKq7w0rXyKYQugb7/91qZPn27jxo1zgRjPl19+6YIib7zxhguoHHvssS7YovF41KWqdu3a1rFjR9tpp50sL6/wjnnhhResYcOGdvDBB9uuu+5qc+fOtXLlyrlgUVCLnLB18Pviiy9cC6Gvv/7a/Vstg0aPHm3bbLONjRw50r2n9Ao+KWgVR69evezWW2+NlQYAAAAAAOSovLzocX5S4hzFIgA0bdo022GHHdYLvCggo4CP15pGgZYSJUq4YI4COyNGjLDTTjvNfU+DOd9+++0FaRX8EbUMql69ugv+eP9eunRpxuvgGThwoGtt9Omnn7qxgETd0mrVquW6qnn0d5UqVSyu66+/3q644opCLYC8bQAAAAAAAMVMYiucBl7dp4YNG2YLFiwoFDxp3ry5/fjjj7Zs2TIXwNF3Spcu7bpmKSj073//2700ULPG6jnrrLOsSZMmWa1s2DqIBnG++uqrXVcy/+8rjQJH6jKmddoQ2i69AAAAAADAViCxFY4BpC5cJ510kgvi7L///lamTJmCQaAPPPBA23nnnV03Lg36fN9997ngj7ph9e3b16WfMmWKC8DUr18/65UNWwd1MzvuuOPce3feeaf7rgaEvvfee10afUdjAmk9FaRSukcffbRgLKIhQ4a4GcTUxatOnTr21FNPZb2OAAAAAACgmEhshS2A5MEHH3SDOmsGLo3747WoUZDn+++/d0EedfFSlzBRYEYBIo39c8wxx7ixgEqVKuU+e+aZZwp+V8EajRnkadasmWs15HnyyScLZgQLWofKlSvb448/Xmhdy5cvX/C3xhM644wz7L///a/rWub9lrcsDRTtdRFLHacIAAAAAABspRJbYQsgT5s2bdwrVbt27dzLT+P16BVErXI8apWjqeM9CupodjBP9+7d066D//eCtGjRwr1SqdWQXgAAAAAAAIVoAOjIQaAjPsv1ABAAAAAAAMDWIJFIFEx6FfIFyxUEgAAAAAAAAAIQAAIAAAAAACjuEv//ivo8R9ACCAAAAAAAIIAmikpETBaVzKGJpAgAAQAAAAAABKALGAAAAAAAQDFHAAgAAAAAAKC4SzAGEAAAAAAAQLGWYBp4AAAAAACA4i1PAaCoQaATuTMNGINAAwAAAAAABKAFEAAAAAAAQHGX2PhjAE2dOtX+85//2MSJE61Ro0Z26aWXWvPmzSPTfP3119avXz/7+++/rVatWnbsscda586dYy03dyasBwAAAAAAKEqJREEroKCXPo9j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6dKli/30009Wp06dgu+0atXKzjvvvNDp3vfff3876qij4i2YLmAAAAAAAADB8hMJ9woT9VkYdf26+OKLQz/v0KGDe4Xp1q2bZYMxgAAAAAAAAAIovBMV4okf/tl8CAABAAAAAABswCxguYAAEAAAAAAAQIjcCfFEIwAEAAAAAAAQIC8v4V5hoj7b0hAAAgAAAAAACJk6Pa+YTK1OAAgAAAAAACBAIpFwrzBRn21pCAABAAAAAAAEYBYwAAAAAACAYi4/kXCvqM9zBS2AAAAAAAAAAtAFDAAAAAAAoJhLpJkGPnfa/+RIC6CzzjrLnnrqKStZsmTod2bMmGHPPPOM++++++5rJ5xwQkaDMd1www02efLkgn+fcsopdvjhh2+0dQcAAAAAALkpkfjnFfV5rsiJGcsOOuggy8/PD/1cQZ8DDjjAVq9ebS1atLDrr7/eevbsmdFvf/jhh9ayZUs79NBD3atJkyYbcc0BAAAAAECuyrNE2lexbAG0YsUK18rm559/tuXLl9uFF15o7dq1swULFtjjjz9uU6dOtd133926d+9ueXl5BQEWvRYtWmQ1a9a0Bx54wL3frVs3u/rqq61fv34uuHPNNdfYL7/84v7duHFju/zyy6106dLuu5999pkdd9xx7jeD1qFNmzY2dOhQq1y5svt+w4YN7dZbb3Uvb72ffvppGzNmjPvt888/36pWrVqwXWrxs/POO2+8vQoAAAAAAHJeXiLhXlGfF7sA0Lp16+zAAw90gZOjjjrKypYta3Xr1rU1a9ZYhw4dXBBmn332cYGgkSNH2qOPPmojRoywiy66yAV6FJypUKFCwe8p0DNr1iw79thj7f3333etfOrUqWNdunSxl156yQV3vADOK6+84n5XgaKgdShfvnyhdf3vf/9bENDReivAs8suu9iee+5po0aNsk6dOtmPP/5YEKTq3bu3ValSxa3/SSedVPB+qpUrV7qXR0EtAAAAAABQPCWKURewjANA33zzjc2bN88GDx5cKEAyaNAg99+XX37Z/bdr167WtGlTe/DBB933q1WrZm3btnWv1DF8+vTpY/Xr17f999/fBWj022XKlLFtt93W7rrrrozXwe/TTz+1/v37u++Kvjt27FirV6+ezZw50703YcIE++OPP6xZs2ZuOfrNuXPn2u233+6+r2BTkF69ehUEpQAAAAAAQPGW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lfpnYPEXXnjBVqxYsd7v1KtXL9ZyCQABAAAAAABkPwlYbLVr13avIArs+IM7e+0Vf4bmIASAAAAAAAAAAiQSCfcKE/XZloYAEAAAAAAAQBF1AdtcCAABAAAAAAAUYRewzYEAEAAAAAAAQDGPABEAAgAAAAAAKIJp4DcnAkAAAAAAAAAhY/zkMQYQAAAAAABAMZagCxgAAAAAAECxlqALGAAAAAAAQPGWYBp4AAAAAACA4i1RjAJAeZYDqlSpYitXroz8zssvv2xt2rSx2rVr2/HHH28zZszI6LdXr15tV111ldWvX9/Kli1r++2330ZaawAAAAAAUBy6gCUi/pcrciIANHPmTCtdunTo57///rsNHDjQ+vbta6NGjbJEImGXXHJJRr99ww032Pfff+/Sz58/3z777LONuOYAAAAAACCnx4BORLzMimcAaNiwYa6FTNWqVa1MmTLWv39/9/7nn39uu+66q9WsWdMOP/xw+/PPPwta15x99tlWq1Yt9/3mzZsX/Jb+3bt3b2vatKltt912NnjwYNcSp0aNGrbbbrvZb7/9VvBdterxWgAFrUOzZs3spZdesp122snq1Kljp59+esE6yPDhw23fffe16tWrW9u2bW3QoEHu/RUrVtijjz5qzzzzjLVq1cr9XqlSpTZ0nwIAAAAAgGI0CVgi4lXsAkDz5s2zzp0722mnnWaTJk2yBQsW2IknnmizZs1yXa5uuukmGzt2rLVo0cK6devm0qhVjQI5o0ePdt//+eefC35PAR299+OPP9oFF1xghxxyiDVq1Mh+/fVX23///e3OO+8s+K4CNclkMnQd/PS95557zk444QT3b31HQah77rnH/vjjD3vwwQftjDPOsOXLl7vfUMui119/3QWHFAR6++23Q/eB1nnRokWFXgAAAAAAoHhKJBJpX8UuAKQWOjvuuKOdc845Ba1v8vLyXPcptao5+uijXQugXr16uVY6S5YssSZNmriAjlr6qJVQqhtvvNEFXo499lj3e+q2pX/rtyZOnJjxOviDP5deeqmVL1/errzySvfet99+a7/88osdcMABriXSQQcdZH///bfrNqYWSgsXLrR169bZhAkT7O6773bBIX0eRNtWuXLlglfDhg0z3X0AAAAAACDHJKK6f6UZIDpnA0AKkpQoUSLw/fz8/P/9YF6ei4Dp/ZYtW7qgjQJD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7r3Ro0cnW7VqFZrm2WefTVasWNEdH+Ul7Y9q1aol33///dA0Tz31VKG8kJeXl3zsscfc32HHSPt4/vz5yfHjx7vt1/6rUaNG8sMPPwxdziGHHJL873//6/5+6aWXXD7db7/9kgcddFBoms6dO7vj8tBDD7nlZWLixInu+Gjb77zzzuTOO++c3H///ZONGjVKLlmyJDDNmjVrkmeccYbbDp1/2ibtR+2DMNo3Z555pvt+165dk0cffXSyWbNmyYMPPji5dOnSZBxvvPGGy0th/vOf/7htOvTQQ5N//fWXe+/bb791+S7M/fff787rPffc053vXl748ssvA7+/evXqQvngwQcfTJYuXdr9rXwV5tJLL02uWLEi+dNPPyUbN27s9qHy7VdffRWaZq+99kr+8ccf7u9HHnnEpdM5e9xxx4Wm0bbusssuySeffDK5aNGiZCZGjRrlykLlNe0P5aX27dsnW7RokVy1alVgmpUrV7pjofy8zTbbJLfddltXzvXt2zd0Odp3KusaNmyYPPLII5NHHXWUy2/KE/q9OJ555pnk2WefHfp5z5493T7WMrzy8YMPPnDnSphHH33UHROda5MnT87oWqQyoEKFCu47upZ4+efTTz8NPR/8+UfpVZbob5UxYa688kp3Xqps0/mjbdO1ReVjmB133NHl6+effz7jc+27775zx1F5Qftj++23d/kw6lqk9Tr88MNdHmrSpInLp1q3t99+O6Nlpm6nrmlBtHyv/Dn33HMLrsH6vtIFmTBhQqH9rbJI26K/Bw0aFJhm3Lhx7ryWxx9/3JVx2jade3PmzAlMozJe5bRH16wOHTq4cyOsjqF8WaJECZf/P/nkk9D9m0rrVqlSJbefdf1TPUCvq666KjTN2LFjk61bty647um81b/1ftQ1Qr+76667ujJH5arSPfzww8m4dN7p/Auickq/XbduXXfeevtB57fO8yDDhg0rdFwPO+wwd33R3yNGjAhdjx49erj8o3zgnRMqW1XHCXPOOecky5Qp4+pcN910k8vjOj+8sjnVzJkzC63bNddc49Lo77BzQvnq3//+t/tb9RDlN63nDjvs4I5DEF1PVH56dE7oOq7yW/sxTNWqVV29T3XSsPI9leqlyjsq33RMVAZpWSpfw8yaNcudM1qe6gqqA+h8+Prrr0PTqB6qMkvbreuL6o/aD1F5O+qa+8ADDwR+tnbt2uRpp53mfvuCCy5w+1J69eqVvPbaa0N/8+STT3bXe+3ryy+/3O0HbdPff/8d+H3dn3jni/KZV5bo+jpv3rzANL/88kuhOq/KlX333dddN1VfDaPzS+tTtmzZ5G677ebqNapPxq1zS9Qt7hdffOHKd+WF9957z/1X+zHqnuCOO+5w92hTpkxx+UbliK4zUdujfa1lyYABA1zdTvVGXWt1/ILo+qB9cM8997j8lwnVa7t16+a2Qee1rnk6Tipbw2j5p59+eqF6bdOmTV05tmzZsmQc2gcnnnhi6OdXX321O6a6xqp+pnNe66q6QBDdA/jLH5UF2nf6+9VXXw1Ms3DhQrfdHm2b9rPO27vvvjvW9mwNmAVsI9CTkRdeeGG99/UUNSoyefHFF1v//v2tevXqdt5559mzzz5r5cuXj1zW1Vdf7Z4oKOp82GGHuWi6nmb06NHDTj311MA0N954o3Xq1Kngt5V23LhxVqZMmdDotZ70HH300da7d2+X9j//+Y+LKB9++OHu/ZIlSwY+HfOe5vXr18/uvfdeO+2006xVq1auNVCbNm0Cl3X22We7tLvttpu1a9fO7Yv99tsvdB+88sordsghh7j9deSRR9quu+5qjzzyiB1//PGulU7qaOmi6LYi22r1ccYZZ7j1qlWrltuHe+yxR+DytL1K9/vvvxc6Llrfhx56yG6++ebAp8c6pqmiWgjoKdxVV13lliVaf21jOsoLas2kJySnnHKKe0Kl/XznnXdaly5dAtNcc801dtxxx7lj73+aqukF9bc3zaBf37597aKLLnJplcduuukm90TrzDPPdC0ngihPek/Alf6JJ56wI444who2bOj2UaNGjQLTXXDBBe4pjPLKgQce6PLCXnvtFboPdN5169bN5dMDDjjALeP222+3gw46yD096tq163pp3njjDff0RU8Qjz32WLddon2255572i677LJeGrUA05M/7WtvRgHtL+U55cN//etf66VRfnvnnXfWe/+XX36JfGJ16623uqeSeuJx8sknu/VN97RMMx3o2OvJz6WXXuqerig/3Xfffbb//vsHPq3RdivflChRwj3RU5mkdYuaMUHbescdd7hlXHHFFXbJJZe49bvwwgtDW8dpO7yni3qCo5eOac2aNd3T2MqVKwem029rm1R+6DxVXtC5Hubpp5+2yy67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K/btt9+65Wo/tGnTZr3f1f5+4YUX3P7W52effbbFtW7duoyWNWvWLHdMx48f747J3nvvbSeccIKVLFmy4Dsae0j74dxzz11v+8eNG2cPP/xw1vsQAABsOnQBAwCgmPnjjz9s1KhR1qFDh4L3WrVqZe+++649+OCD633/ySefdMGB5s2bh/6mbuzV3ezll1+2f//739awYUObPXu2+2zChAnu9++66y73fuvWrV0QQf/VungUVGjZsqXdeOONLjiiz3/44QcXZPBk+lsa00Zj4Hg09pGCU0FjAt1yyy02efLkguBPpsv46KOP3HJOP/10Fyjafvvt7c8//wzdRwqoqCueXgcccICVLVvWBTqOOuqoQt/zflcBlOHDh7t0+u8ee+zh/uv35ZdfuvX66quvXODk77//dr+3Zs0aiyOTZX3//fcuDyhQo+NUo0YNu/TSS22vvfayBQsWFHzvzTffdN9NpeDO22+/Hbitme5DAACwCWkQaAAAkHveeecdTeSQbNeuXfLUU091r0MPPTRZvnz5ZPfu3ZNz584t9P3zzjsvWa5cueT8+fML3lu1alWydu3ayU6dOkUu64EHHnDLOvbYY5Nr16517y1btiy5bt26ZJs2bZLbbrttcsmSJYV+d8cdd0wefPDB7t9Ko383adIkuWDBgkK/PXXqVPffTH9LOnbsmNxzzz0L/r1w4UK3bT169Cj024MHD3br/cILL8ReRtu2bd1v9u3bt+A9bXMcQ4cOdcv/8MMPC/2ujtHrr79eaPn16tVLHnXUUQXvrV69OtmwYcPk3nvv7f72fP755269dNzSibOsRo0aJVu3bp1cvnx5wftjx45NlihRInnOOecUvKflnnHGGestS/mvfv366y1/Q/chAADYOGgBBABAjvO3PDniiCNcNy619hk4cGCh71100UW2bNkye/HFFwvee+utt2zmzJkZdys666yzXPcmUQuXYcOGudZGailSvnz5gu+py5C++9lnn9n8+fNdy5xffvnFrrzyStdax69Bgwbuv5n+VhB1azr++ONdty5to+e5554r+CybZaj70sknn1zwb21zFLXUUQsp/Za6WT3yyCPufS3TT/vAWydv+QceeKCNHDmy4L3Bgwe77nk6biVKlCg0/pEG+85UJstS6x21klL3LnUh9LRo0cLlKXWjU5e9bMTdhwAAYNNgDCAA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jz76yP37uOOOs2222cZ69OhhkydPtm+++cbuvPNO+9e//uW+FxddwAAAAAAAAIIk8s3y8gM/snUh74do3ry5zZgxo+DfVapUsTJlytiCBQvcv/Py8lzrofz8f35XQZ6BAwfapZde6mYD0wRU5513nt16662WDQJAAAAAAAAAQTTYctiAyzEHYv7zzz8jP2/atKlrFeTXrFkzGzBggG0MBIAAAAAAAACC5EW0AAp7fwtFAAgAAAAAACBI1Fg/MccA2twIAAEAAAAAAGziLmCbGwEgAAAAAACA0C5gIaGTvDWWSwgAAQAAAAAABMlL/PMK+yyHEAACAAAAAAAIwiDQAAAAAAAAxVyi+AwCnRNre/jhh9vq1asjv/Prr7/aRRddZMcee6w99NBDab/vUZpOnTq517hx4zbSGgMAAAAAgGLTAigv5JVDciIAdPXVV1t+fviOnTZtmp144onWqlUrO/nkk+3555+3a6+9NqPfPuOMM+y6665zwZ+FCxduxLUGAAAAAADFYhawRMiruI4BNH/+fLvvvvvs559/tuXLl9v1119vHTt2tL/++svuvfdemzp1qu2+++525ZVXWunSpV0aBWMGDBhgixYtsjp16tjLL7/s3leLmxtvvNF9ruDOHXfcYT/88IO99NJL1rhxY7v99tutYsWK7ru9e/e29u3bW15eXuA67LPPPjZs2DArVaqU+37ZsmXtpptuKrTe+o0xY8a4377qqqusYcOG7rM99tijIA0AAAAAAEBxHAMo4xZAq1atckGYv//+284991zXakYtblasWGEdOnSwkiVL2umnn25ffPGFnX322S7N4MGDXWDo1FNPdd+/4IILCn5v0KBBrquWumytWbPGDjjgAHv77bftzDPPtAkTJthtt91W8F395tq1a0PXoUyZMgXBH/nqq6+sXbt27m91BTv00EOtatWqdt5557kg1CGHHOJ+L66VK1e6QJb/BQAAAAAAiqu8/40DlPrKjU5V8VsAffPNNy7I06dPn0Lvf/rpp1a9enX7z3/+4/697777uiCLWvasW7fOEomEa+Gzyy67uO/5PfPMM1ajRg0XxNl5553thRdesBIlSljlypWtZ8+eGa+DX79+/VxwSUEgL81vv/3m1lMvmTx5sv3++++2/fbbWxy9evWyW2+9NVYaAAAAAACQo/LyIloAFdMA0Ny5cwu6Tfmpe1W9evUK/q0gj4I0ah2jYJC6Yj333HN2zjnn2GGHHWYvvvii68olCv6IWvBUqVLFBX+8f6tlUabr4FFg6NFHH7XPPvvMKlWq5N6bM2eONWvWzLUW8vOvc6bU3eyKK64o+Le2MWp9AAAAAABADksUn1nAMg4A7brrrnbhhRfan3/+6cbR8ey000528cUX26xZs6xWrVr20UcfWbVq1QqCO6eccop7KaCjYInSN23aNKuVDVsHeeKJJ+zZZ5+1gQMHFmpppDTqUqZlN2/e3DaExjXyxjYCAAAAAADFXF7xGQMo4wDQdtttZzfccIPrqrXjjju6VjreINAaW6dFixbuOxMnTnStfESDPz/44IPubw0QrWBRo0aNsl7ZsHVo0KCBCwy1bdvWzQYmNWvWtP79+7s0GmB6r732cutYrlw5N+DzBx984L5399132+eff+7GFfrXv/7lxgryuooBAAAAAICtWCJitq/iPAuYuj9poGdNma4BkTV2j9x5550uAKMgj4IsGsNHNO6Pul6py5fGBWrZsmXBb6mblkfBmldffbXg3/reI488UvDvjz/+uGCQ56B1qFChQqHfEwWHPGqh1K1bN5dm6dKlBV3NpEuXLrbbbrsV/NvrngYAAAAAALZyeVthCyCPunZp1q9U9evXd69073k0DbxH3ao0u5dH4/doOnmPZghLtw7+3wuiMYb23nvv9d5XAMkLZAEAAAAAAHg0sZVeW10LIAAAAAAAgK1FIi/hXoHC3t9CEQACAAAAAAAIQAsgAAAAAACAYi4vL88SIWMFJ3NsDGFaAAEAAAAAAASgBRAAAAAAAEAxl2AMIAAAAAAAgOItkfinFVDwh5ZT6AIGAAAAAAAQIKH/hU73Hj8CNHfuXBsxYoRVrFjR9thjD8vPz0+bZvLkyTZhwgQrV66c7bTTTi5tNggAAQAAAAAAbOIuYC+99JJdeOGF1rp1a5s+fbqVLVvWPv30U9tmm20Cv7927Vo7/fTT7b333rO9997bBY8mTZpkTz31lJ144omxlu1WN3YKAAAAAACArUHinxZAQS/XPyxDasXTo0cPu//++23IkCE2ceJEq1Gjhp133nmhad59913r37+/DR8+3D777DMbOXKknX/++S7NunXrYm8KASAAAAAAAICQaeCjXpl67bXXrEKFCnbWWWe5f5csWdIuvfRS1wJo5syZgWmWLl3qvte0adOC93bYYQdbsWKFax0UF13AAAAAAAAAgqiRT5ohgBYtWlTo7dKlS7uX36hRo6xVq1ZWosT/wjA777yzJZNJ++WXX6x27drr/fzxxx9v/fr1s2OPPdZOPvlkmzdvnj344IP28MMPu8BQXASANoKZs5dYfumkbcnKVyxnuWDdui17P+aakqVy4xSvWLFw4bilKlW6lOWC6jXKWy5YtGil5YL+X0yyXHBKx2aWC/oM/M1yQdmy8StVm8ND3/1huaBEfm40Ot+lTX3LBWVLpR8wdEsw/OcZlgvqNqhuueCyI7azXHDWyyMtF0z5c57lguo1sxvst6itqFDWiqu8qJY+//9+w4YNC719yy23WM+ePQu9t3DhQqtatWqh96pX/6f8WbBgQeDPa4ygww47zO677z5btmyZGwOoWrVq1rZt26y2JTfuDgEAAAAAAIpYwhvvJ+QzmTp1qlWqVKng/dTWP1KqVClbvHhxofeWLFkS+n15/vnn7cYbb3Rj/2y//fbuvTvvvNMOOugg+/3339cLKKWTG49jAAAAAAAANtMsYImQlyj4438FBXQ0jo8CRX7ev5s0aRK47C+++MJ22223guCPnHrqqTZ//nw3lXxcBIAAAAAAAAAChM0AFtUyKIi6cv36669uvB/PG2+84aaAb9myZcGgz5r5yxsUul69evbnn3/amjVrCtJMmDCh4LO46AIGAAAAAACQ5RhAmejYsaMdccQRdvTRR9tVV13lpoV/5JFH7NVXXy0IJE2fPt19/sEHH7jvXnDBBfb0009bly5d7JRTTnGDQN9777125JFHFgSN4iAABAAAAAAAkOUsYJl6++237amnnrKvvvrKKlasaF9++aV16NCh4HNNE6/gTp06dQq6ho0bN86eeeYZN118+fLlrVevXq4bWDYIAAEAAAAAAGzCFkCiqdsvvvhi9wqiwI+6gPnVrVvXbr75ZtsYCAABAAAAAAAESFjELGBxmwBtZgSAAAAAAAAAAvhn+wr6LJcQAAIAAAAAAAgQNdtXnFnAtgQEgAAAAAAAAALk5SXcKxAtgAAAAAAAAHJfIhHe0ifHGgDRAggAAAAAACBsnJ+wFkBJWgBtfGvXrrX8/PxN8MsAAAAAAABRLYDCP8sl8Sat30wqV65sK1euDP183bp19uSTT1qzZs2sfPnydthhh9nUqVPT/m626QAAAAAAwNYzBlBeyKvYB4CSyaStWbPG/TdT+r5a8vj/namFCxda6dKlQ9dh8uTJ9vPPP9tnn31mM2bMsJo1a9oll1yS9nezTQcAAAAAAIq/vK01APTNN99Y27ZtrWzZslamTBnr37+/e//999+37bff3r2/77772oQJE9z7arVz4oknutY1+n7z5s0LfqtkyZJ2yy23WK1ataxu3br2+eef2/nnn+9+Y4cddrBx48YVfFfpV6xYEboOTZo0sccff9yaNm1qFStWtOOPP96mT59ekP7bb7+1XXfdtWAdBgwY4N5Plw4AAAAAAGy9EonoV7EMAM2ePduOPvpou/rqq23RokWu9c0pp5ziAiann366PfbYYzZv3jzbb7/9rFu3bi6NWtbMmTPHZs2a5b7/22+/FfrNUqVK2ZQpU1wgqHPnzrbHHnvYggULXCDmrrvuyngdUrt1KajjrcPcuXPtoosusueee86lefnll+28886zZcuWRaYLooCWfsP/AgAAAAAAxVNeXl7kK5dkvLbfffed7bLLLnbSSSe5wI1nyJAhtueee9pBBx3kWuUomDNq1CgXHFGroDFjxtiVV15pr776qi1ZsqTQb+p9tcrR2DtqgXPWWWe5rl6HHnqoTZo0KeN18AdxevToYQ0bNrSLL77YvTd48GD75ZdfbPfdd7dy5crZ3nvvbTNnziz0+0HpgvTq1cuNR+S99H0AAAAAAFA8JbbGFkCa916BknTva0wevfS+AkAjRoyw1q1b2+uvv2477bRToZY3Cv6IZvjy/vb+7R8vKN06iFoDnXbaaVaiRAl76qmn3Hc96pamz/2vHXfcMW26VNdff70bj8h7MWA0AAAAAADFV14iYgygHIsAZRwAat++vY0ePdr69u3rWvJ4AzC3a9fOhg8fbh988IHrvnXTTTfZbrvt5lr06PPatWu7Llf33XefaxWkLmHZCluH1atXu1ZBauHz6KOPuuCRF0BSmrFjx7rgjtdtzPssKl0QtU6qVKlSoRcAAAAAACieEolE5KtYBoCqV6/uBnvWODkK6ngDMOtv/feGG26wxo0b28iRI904O/LMM8+47ynAsv/++9s111xj22yzTUErH492mlrghP1bf+u9sHVQgOfdd9+1Pn36FAwOrandvfX+6KOPXBc0ddnSZ3pPotIBAAAAAICtW14xmgUskYwzlzsKUYsijQXU8pp3Lb90+S167yxduspywbp1ZMeNKVcKpIoVS1sumD+v8ODxW6rqNbbs8sizaNFKywUlSuTG4H4nHdDUcsEb3/xhuaBs2ZKbexUy0rJJNcsF83OkHpIrypb634PULdnwn2dYLsiVeshlR2xnueD5b6ZYLpj022zLBdVrVrRcsGLFGssFE+49NPb9/q43DbD8MsH167UrltrI249wQ8TkQg+h/zWzAQAAAAAAQIFEREufdTnywN1DAAgAAAAAACBA1Fg/uTYGEAEgAAAAAACAAFFj/eTKkBseAkAAAAAAAAAB1MgnrKFPjjUAIgAEAAAAAAAQJC8vz73CPssltAACAAAAAAAIQAsgAAAAAACAYi6PMYAAAAAAAACKt8RGnAUsmUza22+/bd99951VrFjRTjrpJGvRokXadH///be9+uqr9tdff9nee+9txx13XFYzkOVWhzUAAAAAAIAikp9IWH5eyCtmEOass86yiy++2CpXrmxTp061nXfe2T777LPINIMGDbIddtjBhgwZYo0aNbIPP/zQLrzwwqy2hTGAAAAAAAAANuEYQArgvPDCC+6/e+21V8Eg0pdccomNHz8+MM3ChQtdK6Hzzz/f7r333oL3p0yZYtmgBRAAAAAAAECA0NY////K1Pvvv29NmjQpCP5It27d7Ndff7UJEyYEpnnjjTds/vz5du211xZ6f5tttrFs0AIIAAAAAAAgiGsBFNYE6J//LFq0qNDbpUuXdi+/iRMnugCQn/fv3377zbbffvv1fn7EiBGu+9e8efPsgQcesLVr19qee+5pRx55ZFZjABEA2koctV9TywWT5yy1XDB9bm6s5+LFqywXdD+wcEG4pXrm098sF5QunW+54J7TdrZcMHPpSssFq9ass1zQdZ9GlgsaVS1cadtS9X5zrOWCtq3rWC74V7vcuB69NGqa5YKSJelssDHdnSPne+nSuXGL+f61HS0XDJ8xz3JB/6G5US5tqi5gDRs2LPT+LbfcYj179iz03vLly93Az36VKlVy/122bFng7y9evNi1AOrataudcsoptm7dOtcdrF+/fq51UFy5cXYCAAAAAABsjkGgE8ERoHX//74GdPaCOZLa+kf0+fTp0wu9p+CO91kQva8ZwAYMGGC77LKLe++ggw6yffbZx4YOHVqoO1kmCMsDAAAAAABE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NALYddddFwoebdq0ySpXrmwzZsxwjytWrOgee1OpUqXc/EqVKlnRokVz8V4AAAAAAABwjNRA7Cm7SpYsae+++65Nnz7dihcvbjVq1LCmTZvaY489Flrn6NGjrkNor9TrZKMEDAAAAAAAIAINvR5t+PWcDsveokUL1w/Qnj17rGDBgi4jKFz16tVdf0JlypSJ+PwuXbq45QUKFLDcIAAEAAAAAAAQgTfke7RluVG6dOnIr5ea6kq9olHQKNby4yEABAAAAAAAEEXuwjz+QwAIAAAAAAAggpSUgJuiLUskBIAAAAAAAACijJyVkiSjahEAAgAAAAAAiMAb8j3askRCAAgAAAAAAOB3HgUs3ggAAQAAAAAAnKJRwOIlIQJAd9xxhz300EOWJ0/05u7du9defvll++6776xly5Z26aWXZuu177//ftu2bVvocbdu3axNmzYnpd0AAAAAACBxBWKMApZY4Z8E6bPorLPOiplatXPnTrvgggvsq6++soIFC1rfvn3tgQceyNZrT5o0yYoWLWp169Z1U+nSpU9iywEAAAAAQKJnAKVGmZI2A+jo0aM2ceJEW7FihR08eNCuv/56O//88+3nn3+28ePH29atW93j7t27h54zd+5cmzZtmqWlpbngyogRI9z8v/zlL/bXv/7VXn/9dUtNTXWPFcBRQKZatWp28803u/myfv16CwaDUdugwM2sWbOsXLlybp369evb6NGjbfDgwe5xenq6TZgwwVavXu1eW88pVKhQqI09e/a0c84552RsTwAAAAAAkCQCgV+naMuSMgNIAZgOHTrYM888Y2XLlnVBl+LFi1tGRoa1bt3a3n//fStWrJgNHTrUhgwZ4p6jIE2vXr2scOHCbv2aNWuGXu/JJ58MBXn0XL323/72NytZsqQ9/fTTrjTL89///tcFfqK1QRk8XvBHFEiqV69e6HHnzp1t9uzZbp0FCxZYu3btQgElGTt2rGu3AlWxHDp0yAWywicAAAAAAJDco4ClRJmSMgPos88+s40bN9ratWstb968ofnKvFEgRIEVlWkp4KPgizJwtm/fbpUrV7YePXpELON64YUXXEZOp06d7Nxzz7Xdu3dbkSJFrEmTJvbggw+6oEx22hBOGUfPPvusffLJJ+7xvHnz7PPPP3dZSRs2bHDBopUrV9qmTZusevXqdvfdd9uuXbtsz549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jTfecBcE+hIbzxNELEOHDrXHHnvMXczOmDHD9erufWnwI32p0b66YMEC86O5c+faN9984/ZRTeXKlTM/2rlzp7vwnzlzplWsWNG1NSXFf4djBSnCt+Xjjz/uywClLrTuvPNOF0z5/vvv3XCZX331lfmNLgLvuusu1059WdVxyi/OPPNMq1y5sjseHT58ONMynZsUsFBA5dprr7XXX3/dl+2MtexUU1uqVq3q2hJ+TP/888/dRfb27dtt37599j//8z/2zjvvxK2daqM+32pneHBCP+vie+3atZY3b167/fbb3ZdHv7XToy8vCmroGKXAWrxUqVLFtTNSO/773/+646h3TI3nTb5Y7VSwVzd4FPjVOmeccUbc26nRb/R58WhEIG87atJ5Xzf84t1O/Y29gJUXrND5SNfMGtXnhRdesCuvvNJ37dTPTZo0cTcntF/edNNN7st2POhvefHFF7sv+groX3HFFTZ+/PjQ8j//+c9uf9D1/R133GH/+c9/4tJO3bxTsETXGvo766b4uHHjQssrVarktrXmKbARL7Haebz3cCopqHvRRRfZ+vXrLT093V13jB07NrRcCQf67qH9c+TIkW5IdJwAjQKG+LvooouC48ePdz8fOXIkWLly5eDChQuDfnX99dcHH3rooaBfrVu3LvTzrl27NNJdMC0tLeg3mzZtCv2cnp4eLFCgQHDDhg1BP5o5c2bwmmuuCQ4YMCA4bNiwoB8NHjw4eN999wX9buDAgW5bJhIdn9q0aRP0oy5dugSfeeaZ0OMLL7ww+Oabbwb9pnTp0sFly5aFHtevXz84Z86coF8cPHjQHSv37dsXmrdy5cpgyZIl3TJ56623gk2aNPFdO7Oz7FTTuVxt+fHHH0Pztm/fnulcNGrUqODVV18djDe1U+dKz6FDh4I7duwIPX7ppZeCl1xySdBv7fT07t07OGvWrGBqamrw22+/DcZbpHYUL148077gB1nbqc+NjlOffvpp0E/y588f3Lp1a9TlLVq0CL7xxhvBeCtcuHBw48aNocf6DOXLly949OhR93jFihXBcuXKBf3WTm27Zs2ahR7Pnj072KBBg7i0TZ/vPXv2hB6PHTs22L59e/ez9tWCBQuGjgELFiwIVqpUKZiRkXHK27l79243ecaNGxfxGKnP09q1a4PxEqud2X0Pp4L+5jt37sx0zdmyZcuI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mjVrXNaN1pk/f77t3LnTrrrqqmN+z6FDh+zZZ5+1V155JUftGz16dOhnlY4pAHTvvfdaixYtMr12u3btLH/+/LZhwwYrV65caJkyiJT547nuuuusUaNGtn37dhc8AgAAyA0CQAAAICGozKpr164uAKTAj4I9Kpl67733XFmVvPjiiy6LJjwA9NFHH9mYMWNCAaD/+7//s+eee849R1k5ZcuWjRgAUnBIGTwtW7Y86e/l5ZdftpUrV7rSr/Dgj5x99tmZHqsETW1UdtFNN9100tsCAABODwSAAABA3E2aNOmYeVnLwh555BGXvaOsGgVN1M9Os2bNbNSoUfbggw/m6Pcpg+jNN990AaVoFGg688wzrXDhwnayqexLffs0bNgwW+trvcWLFxMAAgAAuUYACAAAxN1bb7113ACQgkQ33HBDKGOmVKlS1r9/f3vsscdyHABSfz2xgj+ye/duK1mypP0evvvuO6tatWq211c71B4AAIDcIgAEAAB8mQGkzpbDbd682WrUqJFpnkYIUwfMR48edZ1GZ1eFChWOu446ZT5w4ECmeepvKFKH1d688P6IYilatKjreyi71I4yZcpke30AAICsUo6ZAwAA4EMKgGQdXl2PlR3jBX9SUlLccOrhfvnll2NeKzuBGpVoacj39PT00Lzy5cu70buy8oI52QksiUrX1DF1eGfPsWgksvDh4QEAAHKKABAAAEgIf/jDH1wHzlmzhDTfo1GyvCHYPZ988kmufl+rVq1c8OiLL77IFLjZt2+fzZs375g+fUqUKGG1a9fO1mvffPPNLgj1z3/+85hlCjhplLLwINfatWvdUPIAAAC5RQkYAABICCNHjrTzzjvP9d2jEb1mzJhhc+fOtQULFoTWufLKK+2ee+6xvn37usDQzJkz3Whe3ihhOc040u+aOHGi+71ywQUX2I033ujmDxw40CpWrOgCROPGjbOnnnrKChYsmK3XVqBqypQp1rNnTxfc6datm+tsWiOYqT8kBYZ69+7t1n3jjTfcMPAa+QwAACC3yAACAABxU716dRcEiUTzNcy7p1q1am7YdA2TPmfOHNcfkIIv9evXD62jjpUXLVrkysKWLl3qAkUTJkywK664IrROgwYNrF27dtlqnwIxL730kqWlpYXmKdij4eb379/vAlAaSl6/s0+fPsc8X1lBeh+R+u9p3769y1bq3r27rVixwj777DMXqJo6dWoo+KNytieffDJiphAAAEBOBIKRejIEAACAM2bMGBd0UsDmVNOQ988//7w98sgj/DUAAMAJIQAEAAAAAACQ5CgBAwAAAAAASHIEgAAAAAAAAJIcASAAAAAAAIAkRwAIAAAAAAAgyREAAgAAAAAASHIEgAAAAAAAAJIcASAAAAAAAIAkRwAIAAAAAAAgyREAAgAAAAAASHIEgAAAAAAAAJIcASAAAAAAAABLbv8POp0IKjZYKfEAAAAASUVORK5CYII=",
"text/plain": [
""
]
@@ -846,7 +930,13 @@
"import matplotlib.pyplot as plt\n",
"\n",
"plt.rcParams.update(\n",
- " {\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6}\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
")\n",
"\n",
"pred = predicted.copy()\n",
@@ -854,28 +944,38 @@
"pred.loc[pairs.pred, \"seen\"] = True\n",
"pred[\"yaw\"] = folded(pred.rx_tx_yaw)\n",
"pred[\"hour\"] = pred.time.dt.hour\n",
- "pred[\"concurrent\"] = [ # other predicted occultations of the same receiver and direction overlapping in time\n",
- " int(\n",
- " (\n",
- " (pred.receiver == r.receiver)\n",
- " & (pred.is_rising == r.is_rising)\n",
- " & (pred.start < r.end)\n",
- " & (pred.end > r.start)\n",
- " & (pred.index != r.Index)\n",
- " ).sum()\n",
- " )\n",
- " for r in pred.itertuples()\n",
- "]\n",
+ "pred[\"concurrent\"] = (\n",
+ " [ # other predicted occultations of the same receiver and direction overlapping in time\n",
+ " int(\n",
+ " (\n",
+ " (pred.receiver == r.receiver)\n",
+ " & (pred.is_rising == r.is_rising)\n",
+ " & (pred.start < r.end)\n",
+ " & (pred.end > r.start)\n",
+ " & (pred.index != r.Index)\n",
+ " ).sum()\n",
+ " )\n",
+ " for r in pred.itertuples()\n",
+ " ]\n",
+ ")\n",
"order = sorted(pred.transmitter.unique(), key=lambda tx: (\"GRE\".index(tx[0]), tx))\n",
- "by_pair = pred.pivot_table(index=\"receiver\", columns=\"transmitter\", values=\"seen\", aggfunc=\"mean\")[order]\n",
- "hourly = pred.groupby([\"hour\", \"receiver\"])[\"seen\"].mean().unstack() # hours x receivers\n",
- "\n",
- "fig, axes = plt.subplots(2, 1, figsize=(13, 5.4), gridspec_kw={\"height_ratios\": [1.2, 1]})\n",
+ "by_pair = pred.pivot_table(\n",
+ " index=\"receiver\", columns=\"transmitter\", values=\"seen\", aggfunc=\"mean\"\n",
+ ")[order]\n",
+ "hourly = (\n",
+ " pred.groupby([\"hour\", \"receiver\"])[\"seen\"].mean().unstack()\n",
+ ") # hours x receivers\n",
+ "\n",
+ "fig, axes = plt.subplots(\n",
+ " 2, 1, figsize=(13, 5.4), gridspec_kw={\"height_ratios\": [1.2, 1]}\n",
+ ")\n",
"im = axes[0].imshow(by_pair.values, cmap=\"Blues\", vmin=0, vmax=1, aspect=\"auto\")\n",
"axes[0].set_xticks(range(by_pair.shape[1]), by_pair.columns, rotation=90, fontsize=7)\n",
"axes[0].set_yticks(range(by_pair.shape[0]), by_pair.index, fontsize=8)\n",
"axes[0].grid(False)\n",
- "axes[0].set_title(\"Share of predicted occultations observed, by receiver and transmitter\")\n",
+ "axes[0].set_title(\n",
+ " \"Share of predicted occultations observed, by receiver and transmitter\"\n",
+ ")\n",
"fig.colorbar(im, ax=axes[0], pad=0.01)\n",
"im = axes[1].imshow(hourly.T.values, cmap=\"Blues\", vmin=0, vmax=1, aspect=\"auto\")\n",
"axes[1].set_xticks(range(hourly.shape[0]), hourly.index, fontsize=8)\n",
@@ -901,10 +1001,10 @@
"id": "53e49c95",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:25.633983Z",
- "iopub.status.busy": "2026-10-08T18:03:25.633983Z",
- "iopub.status.idle": "2026-10-08T18:03:25.677316Z",
- "shell.execute_reply": "2026-10-08T18:03:25.676810Z"
+ "iopub.execute_input": "2026-10-25T20:51:43.483866Z",
+ "iopub.status.busy": "2026-10-25T20:51:43.483440Z",
+ "iopub.status.idle": "2026-10-25T20:51:43.508824Z",
+ "shell.execute_reply": "2026-10-25T20:51:43.508130Z"
}
},
"outputs": [
@@ -1070,19 +1170,28 @@
"seen_rate = pred.groupby([\"receiver\", \"transmitter\"])[\"seen\"].transform(\"mean\")\n",
"tracked = pred[seen_rate > 0.1]\n",
"groups = {\n",
- " \"constellation\": pd.Categorical(tracked.constellation, categories=list(CONSTELLATIONS.values())),\n",
+ " \"constellation\": pd.Categorical(\n",
+ " tracked.constellation, categories=list(CONSTELLATIONS.values())\n",
+ " ),\n",
" # arcs cut off by the yaw limit report a yaw of exactly max_yaw (up to round-off)\n",
" \"yaw from fore/aft (deg)\": pd.cut(\n",
- " tracked.yaw.clip(upper=MAX_YAW), [b for b in [0, 15, 30, 45, 55, 60, 65, 70, 75, 80] if b < MAX_YAW] + [MAX_YAW]\n",
+ " tracked.yaw.clip(upper=MAX_YAW),\n",
+ " [b for b in [0, 15, 30, 45, 55, 60, 65, 70, 75, 80] if b < MAX_YAW] + [MAX_YAW],\n",
" ),\n",
" \"direction\": tracked.is_rising.map({True: \"rising\", False: \"setting\"}),\n",
" \"other same-direction occultations at the same time\": pd.Categorical(\n",
- " tracked.concurrent.clip(upper=3).astype(str).replace(\"3\", \"3 or more\"), categories=[\"0\", \"1\", \"2\", \"3 or more\"]\n",
+ " tracked.concurrent.clip(upper=3).astype(str).replace(\"3\", \"3 or more\"),\n",
+ " categories=[\"0\", \"1\", \"2\", \"3 or more\"],\n",
" ),\n",
"}\n",
- "print(f\"{len(tracked)} of {len(pred)} predicted occultations in receiver-transmitter combinations observed at least 10% of the time\")\n",
+ "print(\n",
+ " f\"{len(tracked)} of {len(pred)} predicted occultations in receiver-transmitter combinations observed at least 10% of the time\"\n",
+ ")\n",
"pd.concat(\n",
- " {name: tracked.groupby(key, observed=True)[\"seen\"].agg([\"mean\", \"size\"]) for name, key in groups.items()}\n",
+ " {\n",
+ " name: tracked.groupby(key, observed=True)[\"seen\"].agg([\"mean\", \"size\"])\n",
+ " for name, key in groups.items()\n",
+ " }\n",
").rename(columns={\"mean\": \"share observed\", \"size\": \"predicted\"}).round(2)"
]
},
@@ -1106,10 +1215,10 @@
"id": "9bc440a5",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:25.680218Z",
- "iopub.status.busy": "2026-10-08T18:03:25.680218Z",
- "iopub.status.idle": "2026-10-08T18:03:32.843257Z",
- "shell.execute_reply": "2026-10-08T18:03:32.842752Z"
+ "iopub.execute_input": "2026-10-25T20:51:43.510576Z",
+ "iopub.status.busy": "2026-10-25T20:51:43.510389Z",
+ "iopub.status.idle": "2026-10-25T20:51:47.875253Z",
+ "shell.execute_reply": "2026-10-25T20:51:47.874529Z"
}
},
"outputs": [
@@ -1146,7 +1255,7 @@
" \n",
" \n",
"
\n",
- "
GPS
\n",
+ "
GPS
\n",
"
TAT-C time minus true time at -80 km (s)
\n",
"
199.0
\n",
"
-0.053
\n",
@@ -1157,17 +1266,27 @@
"
0.267
\n",
"
\n",
"
\n",
+ "
|TAT-C time minus true time| at -80 km (s)
\n",
+ "
199.0
\n",
+ "
0.101
\n",
+ "
0.082
\n",
+ "
0.000
\n",
+ "
0.085
\n",
+ "
0.249
\n",
+ "
0.499
\n",
+ "
\n",
+ "
\n",
"
TAT-C position: -80 km point to truth (km)
\n",
"
199.0
\n",
- "
0.480
\n",
- "
0.410
\n",
- "
0.009
\n",
- "
0.378
\n",
- "
1.195
\n",
- "
2.777
\n",
+ "
0.476
\n",
+ "
0.405
\n",
+ "
0.017
\n",
+ "
0.384
\n",
+ "
1.180
\n",
+ "
2.759
\n",
"
\n",
"
\n",
- "
GLONASS
\n",
+ "
GLONASS
\n",
"
TAT-C time minus true time at -80 km (s)
\n",
"
198.0
\n",
"
-0.019
\n",
@@ -1178,17 +1297,27 @@
"
0.351
\n",
"
\n",
"
\n",
+ "
|TAT-C time minus true time| at -80 km (s)
\n",
+ "
198.0
\n",
+ "
0.094
\n",
+ "
0.080
\n",
+ "
0.001
\n",
+ "
0.075
\n",
+ "
0.252
\n",
+ "
0.409
\n",
+ "
\n",
+ "
\n",
"
TAT-C position: -80 km point to truth (km)
\n",
"
198.0
\n",
- "
0.480
\n",
+ "
0.476
\n",
"
0.441
\n",
- "
0.022
\n",
- "
0.344
\n",
- "
1.303
\n",
- "
2.497
\n",
+ "
0.021
\n",
+ "
0.343
\n",
+ "
1.284
\n",
+ "
2.516
\n",
"
\n",
"
\n",
- "
Galileo
\n",
+ "
Galileo
\n",
"
TAT-C time minus true time at -80 km (s)
\n",
"
197.0
\n",
"
-0.062
\n",
@@ -1199,14 +1328,24 @@
"
0.462
\n",
"
\n",
"
\n",
+ "
|TAT-C time minus true time| at -80 km (s)
\n",
+ "
197.0
\n",
+ "
0.118
\n",
+ "
0.095
\n",
+ "
0.001
\n",
+ "
0.093
\n",
+ "
0.295
\n",
+ "
0.554
\n",
+ "
\n",
+ "
\n",
"
TAT-C position: -80 km point to truth (km)
\n",
"
197.0
\n",
- "
0.559
\n",
+ "
0.550
\n",
"
0.554
\n",
- "
0.052
\n",
- "
0.372
\n",
- "
1.659
\n",
- "
3.207
\n",
+ "
0.043
\n",
+ "
0.365
\n",
+ "
1.673
\n",
+ "
3.225
\n",
"
\n",
" \n",
"\n",
@@ -1215,19 +1354,25 @@
"text/plain": [
" count mean std \\\n",
"GPS TAT-C time minus true time at -80 km (s) 199.0 -0.053 0.119 \n",
- " TAT-C position: -80 km point to truth (km) 199.0 0.480 0.410 \n",
+ " |TAT-C time minus true time| at -80 km (s) 199.0 0.101 0.082 \n",
+ " TAT-C position: -80 km point to truth (km) 199.0 0.476 0.405 \n",
"GLONASS TAT-C time minus true time at -80 km (s) 198.0 -0.019 0.122 \n",
- " TAT-C position: -80 km point to truth (km) 198.0 0.480 0.441 \n",
+ " |TAT-C time minus true time| at -80 km (s) 198.0 0.094 0.080 \n",
+ " TAT-C position: -80 km point to truth (km) 198.0 0.476 0.441 \n",
"Galileo TAT-C time minus true time at -80 km (s) 197.0 -0.062 0.138 \n",
- " TAT-C position: -80 km point to truth (km) 197.0 0.559 0.554 \n",
+ " |TAT-C time minus true time| at -80 km (s) 197.0 0.118 0.095 \n",
+ " TAT-C position: -80 km point to truth (km) 197.0 0.550 0.554 \n",
"\n",
" min 50% 95% max \n",
"GPS TAT-C time minus true time at -80 km (s) -0.499 -0.049 0.137 0.267 \n",
- " TAT-C position: -80 km point to truth (km) 0.009 0.378 1.195 2.777 \n",
+ " |TAT-C time minus true time| at -80 km (s) 0.000 0.085 0.249 0.499 \n",
+ " TAT-C position: -80 km point to truth (km) 0.017 0.384 1.180 2.759 \n",
"GLONASS TAT-C time minus true time at -80 km (s) -0.409 -0.011 0.179 0.351 \n",
- " TAT-C position: -80 km point to truth (km) 0.022 0.344 1.303 2.497 \n",
+ " |TAT-C time minus true time| at -80 km (s) 0.001 0.075 0.252 0.409 \n",
+ " TAT-C position: -80 km point to truth (km) 0.021 0.343 1.284 2.516 \n",
"Galileo TAT-C time minus true time at -80 km (s) -0.554 -0.067 0.151 0.462 \n",
- " TAT-C position: -80 km point to truth (km) 0.052 0.372 1.659 3.207 "
+ " |TAT-C time minus true time| at -80 km (s) 0.001 0.093 0.295 0.554 \n",
+ " TAT-C position: -80 km point to truth (km) 0.043 0.365 1.673 3.225 "
]
},
"execution_count": 7,
@@ -1272,10 +1417,16 @@
"# from the recorded receiver and transmitter positions (subsampled to 10 Hz)\n",
"truth = {}\n",
"for record in sample._data:\n",
- " l1 = nc.Dataset(os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"])))\n",
+ " l1 = nc.Dataset(\n",
+ " os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"]))\n",
+ " )\n",
" l1.set_auto_mask(False)\n",
" t, rx, tx = l1[\"time\"][:], l1[\"positionLEO\"][:].T, l1[\"positionGNSS\"][:].T\n",
- " ok = (np.abs(t) < 1e10) & np.all(np.abs(rx) < 1e10, axis=0) & np.all(np.abs(tx) < 1e10, axis=0)\n",
+ " ok = (\n",
+ " (np.abs(t) < 1e10)\n",
+ " & np.all(np.abs(rx) < 1e10, axis=0)\n",
+ " & np.all(np.abs(tx) < 1e10, axis=0)\n",
+ " )\n",
" i = np.nonzero(ok)[0][::10]\n",
" start = float(l1[\"startTime\"][...])\n",
" # GPS seconds since 1980-01-06 are TAI - 19 s\n",
@@ -1283,7 +1434,11 @@
" t_80 = crossing(t[i], to_lla(points)[2], -80e3)\n",
" if np.isfinite(t_80):\n",
" lon, lat, _ = to_lla(interpolate(t[i], points, [t_80]))\n",
- " truth[record[\"occid\"]] = (GPS_EPOCH + timedelta(seconds=start - GPS_UTC_OFFSET + t_80), lon[0], lat[0])\n",
+ " truth[record[\"occid\"]] = (\n",
+ " GPS_EPOCH + timedelta(seconds=start - GPS_UTC_OFFSET + t_80),\n",
+ " lon[0],\n",
+ " lat[0],\n",
+ " )\n",
"\n",
"rows = []\n",
"for i, j in zip(pairs.pred, pairs.obs):\n",
@@ -1293,14 +1448,25 @@
" rows.append(\n",
" {\n",
" \"constellation\": o.constellation,\n",
- " \"TAT-C time minus true time at -80 km (s)\": (p.time.to_pydatetime() - true_time).total_seconds(),\n",
- " \"TAT-C position: -80 km point to truth (km)\": GEOD.inv(p.position.x, p.position.y, lon, lat)[2] / 1e3,\n",
+ " \"TAT-C time minus true time at -80 km (s)\": (\n",
+ " p.time.to_pydatetime() - true_time\n",
+ " ).total_seconds(),\n",
+ " \"|TAT-C time minus true time| at -80 km (s)\": abs(\n",
+ " (p.time.to_pydatetime() - true_time).total_seconds()\n",
+ " ),\n",
+ " \"TAT-C position: -80 km point to truth (km)\": GEOD.inv(\n",
+ " p.position.x, p.position.y, lon, lat\n",
+ " )[2]\n",
+ " / 1e3,\n",
" }\n",
" )\n",
"accuracy = pd.DataFrame(rows)\n",
"pd.concat(\n",
" {\n",
- " c: accuracy[accuracy.constellation == c].drop(columns=\"constellation\").describe(percentiles=[0.5, 0.95]).T\n",
+ " c: accuracy[accuracy.constellation == c]\n",
+ " .drop(columns=\"constellation\")\n",
+ " .describe(percentiles=[0.5, 0.95])\n",
+ " .T\n",
" for c in CONSTELLATIONS.values()\n",
" }\n",
").round(3)"
@@ -1311,7 +1477,7 @@
"id": "610f189a",
"metadata": {},
"source": [
- "For all three constellations, TAT-C's `time` agrees with the true time at which the straight line reaches -80 km to within 0.14 to 0.18 s (95th percentile), and its `position` with the true straight-line tangent point to 0.34 to 0.38 km (median) and 1.2 to 1.7 km (95th percentile), limited by orbit accuracy; Galileo, with the least accurate element sets, has the largest position errors."
+ "For all three constellations, TAT-C's `time` agrees with the true time at which the straight line reaches -80 km to within 0.25 to 0.30 s (95th percentile of the absolute difference; on average, TAT-C's `time` is 0.02 to 0.06 s early), and its `position` with the true straight-line tangent point to 0.34 to 0.38 km (median) and 1.2 to 1.7 km (95th percentile), limited by orbit accuracy; Galileo, with the least accurate element sets, has the largest position errors."
]
},
{
@@ -1326,7 +1492,7 @@
"| 1. Orbits (TLEs vs. recorded positions) | All 77 transmitters (32 GPS, 19 GLONASS, 26 Galileo) and 5 receivers identified; within about 5 km (GPS), 7 km (GLONASS), and 16 km (Galileo), after excluding one poor GPS element set |\n",
"| 2. Predicted vs. observed (default `max_yaw` = 65 deg) | All 5,699 observed occultations predicted, with correct rising/setting; recorded share of predictions 69% (GPS), 81% (GLONASS), and 37% (Galileo) |\n",
"| 3. Detection | Unrecorded predictions mostly explained by receiver operations (untracked transmitters, data gaps, selective Galileo tracking) and the antenna's coverage edge (60-65 deg yaw) |\n",
- "| 4. Timing and location | `time` within 0.14 to 0.18 s (95th percentile); `position` 0.34 to 0.38 km (median) and 1.2 to 1.7 km (95th percentile) from the true tangent point |\n",
+ "| 4. Timing and location | `time` within 0.25 to 0.30 s (95th percentile); `position` 0.34 to 0.38 km (median) and 1.2 to 1.7 km (95th percentile) from the true tangent point |\n",
"\n",
"**TAT-C's RO geometry is validated end to end for GPS, GLONASS, and Galileo.** With published orbits, `collect_ro_observations` predicts every occultation COSMIC-2 recorded from the three constellations on this day, labels each correctly as rising or setting, and reports its time to a fraction of a second and its position to within a few hundred meters (median), limited by orbit accuracy. The default `max_yaw` of 65 deg matches COSMIC-2's observed coverage, which extends to about 64 deg from the forward or rearward direction for every constellation. Predicted counts are upper bounds on recorded counts: COSMIC-2 recorded 69% of the predicted GPS occultations, 81% of GLONASS, and 37% of Galileo, for operational reasons outside TAT-C's model.\n",
"\n",
@@ -1356,7 +1522,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.12.8"
+ "version": "3.14.9"
}
},
"nbformat": 4,
diff --git a/docs/validation/ValidateROPlanetiQ.ipynb b/docs/validation/ValidateROPlanetiQ.ipynb
index a8b172dd..943d47ca 100644
--- a/docs/validation/ValidateROPlanetiQ.ipynb
+++ b/docs/validation/ValidateROPlanetiQ.ipynb
@@ -35,10 +35,10 @@
"id": "13ba3bde",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:02:19.167028Z",
- "iopub.status.busy": "2026-10-08T18:02:19.167028Z",
- "iopub.status.idle": "2026-10-08T18:03:35.929237Z",
- "shell.execute_reply": "2026-10-08T18:03:35.929237Z"
+ "iopub.execute_input": "2026-10-25T20:51:51.756967Z",
+ "iopub.status.busy": "2026-10-25T20:51:51.756760Z",
+ "iopub.status.idle": "2026-10-25T20:53:01.587114Z",
+ "shell.execute_reply": "2026-10-25T20:53:01.586374Z"
}
},
"outputs": [
@@ -62,9 +62,13 @@
"CONSTELLATIONS = {\"G\": \"GPS\", \"R\": \"GLONASS\", \"E\": \"Galileo\"}\n",
"\n",
"DATA_DIR = os.path.join(\"data\", \"ro\")\n",
- "rodb = RODatabaseClient(metadata_root=os.path.join(DATA_DIR, \"metadata\"), version=\"v1.1\")\n",
+ "rodb = RODatabaseClient(\n",
+ " metadata_root=os.path.join(DATA_DIR, \"metadata\"), version=\"v1.1\"\n",
+ ")\n",
"occultations = rodb.query(\n",
- " missions=\"planetiq\", datetimerange=(\"2026-05-14\", \"2026-05-14T23:59:59\"), silent=True\n",
+ " missions=\"planetiq\",\n",
+ " datetimerange=(\"2026-05-14\", \"2026-05-14T23:59:59\"),\n",
+ " silent=True,\n",
")\n",
"# seeded random sample of 200 occultations with a retrieval from each constellation\n",
"sample = occultations[0:0]\n",
@@ -75,12 +79,20 @@
" availablefiletypes=[\"ucar_calibratedPhase\", \"ucar_refractivityRetrieval\"],\n",
" )\n",
" rng = np.random.default_rng(20260514 + k)\n",
- " sample._data += [pool._data[i] for i in sorted(rng.choice(pool.size, 200, replace=False))]\n",
- " print(f\"{CONSTELLATIONS[code]}: {pool.size} occultations with a retrieval, 200 sampled\")\n",
+ " sample._data += [\n",
+ " pool._data[i] for i in sorted(rng.choice(pool.size, 200, replace=False))\n",
+ " ]\n",
+ " print(\n",
+ " f\"{CONSTELLATIONS[code]}: {pool.size} occultations with a retrieval, 200 sampled\"\n",
+ " )\n",
"sample.size = len(sample._data)\n",
"# flat layout keeps local paths short (Windows limits paths to 260 characters)\n",
- "sample.download(\"ucar_calibratedPhase\", data_root=DATA_DIR, keep_aws_structure=False, silent=True)\n",
- "print(f\"{occultations.size} PlanetiQ occultations on 14 May 2026, {sample.size} sampled\")"
+ "sample.download(\n",
+ " \"ucar_calibratedPhase\", data_root=DATA_DIR, keep_aws_structure=False, silent=True\n",
+ ")\n",
+ "print(\n",
+ " f\"{occultations.size} PlanetiQ occultations on 14 May 2026, {sample.size} sampled\"\n",
+ ")"
]
},
{
@@ -107,10 +119,10 @@
"id": "76972489",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:35.932247Z",
- "iopub.status.busy": "2026-10-08T18:03:35.932247Z",
- "iopub.status.idle": "2026-10-08T18:03:51.675486Z",
- "shell.execute_reply": "2026-10-08T18:03:51.675486Z"
+ "iopub.execute_input": "2026-10-25T20:53:01.589198Z",
+ "iopub.status.busy": "2026-10-25T20:53:01.588865Z",
+ "iopub.status.idle": "2026-10-25T20:53:10.424592Z",
+ "shell.execute_reply": "2026-10-25T20:53:10.423736Z"
}
},
"outputs": [
@@ -217,26 +229,26 @@
"
\n",
"
Galileo
\n",
"
26
\n",
- "
1.53
\n",
- "
15.58
\n",
+ "
1.47
\n",
+ "
15.63
\n",
"
0
\n",
- "
5397.50
\n",
+ "
5397.44
\n",
"
\n",
"
\n",
"
GPS
\n",
"
26
\n",
- "
1.32
\n",
- "
4.65
\n",
+ "
1.35
\n",
+ "
4.60
\n",
"
0
\n",
- "
1829.68
\n",
+ "
1829.62
\n",
"
\n",
"
\n",
"
GLONASS
\n",
"
19
\n",
- "
1.46
\n",
- "
6.81
\n",
+ "
1.45
\n",
+ "
6.77
\n",
"
0
\n",
- "
3838.61
\n",
+ "
3838.64
\n",
"
\n",
"
\n",
"
receivers
\n",
@@ -244,7 +256,7 @@
"
0.62
\n",
"
1.39
\n",
"
0
\n",
- "
2330.33
\n",
+ "
2330.34
\n",
"
\n",
" \n",
"\n",
@@ -253,17 +265,17 @@
"text/plain": [
" satellites median error (km) max error (km) excluded sets \\\n",
"group \n",
- "Galileo 26 1.53 15.58 0 \n",
- "GPS 26 1.32 4.65 0 \n",
- "GLONASS 19 1.46 6.81 0 \n",
+ "Galileo 26 1.47 15.63 0 \n",
+ "GPS 26 1.35 4.60 0 \n",
+ "GLONASS 19 1.45 6.77 0 \n",
"receivers 2 0.62 1.39 0 \n",
"\n",
" closest next-best satellite (km) \n",
"group \n",
- "Galileo 5397.50 \n",
- "GPS 1829.68 \n",
- "GLONASS 3838.61 \n",
- "receivers 2330.33 "
+ "Galileo 5397.44 \n",
+ "GPS 1829.62 \n",
+ "GLONASS 3838.64 \n",
+ "receivers 2330.34 "
]
},
"execution_count": 2,
@@ -291,7 +303,12 @@
"# element sets per NORAD catalog number, keyed by epoch (later duplicates win)\n",
"tle_lines = [\n",
" line.rstrip()\n",
- " for path in [\"gps_2026-05-14.3le\", \"glonass_2026-05-14.3le\", \"galileo_2026-05-14.3le\", \"planetiq_2026-05-14.3le\"]\n",
+ " for path in [\n",
+ " \"gps_2026-05-14.3le\",\n",
+ " \"glonass_2026-05-14.3le\",\n",
+ " \"galileo_2026-05-14.3le\",\n",
+ " \"planetiq_2026-05-14.3le\",\n",
+ " ]\n",
" for line in open(path)\n",
" if line.strip()\n",
"]\n",
@@ -322,35 +339,68 @@
" recorded_m = np.array([p for _, p in positions]).T\n",
"\n",
" def errors(sets):\n",
- " orbit = GeneralPerturbationsOrbit.from_tle(sum((sets[e] for e in sorted(sets)), []))\n",
- " p = np.einsum(\"ij...,j...->i...\", rotation, np.array(orbit.get_orbit_track_at_time(ts).position.m))\n",
+ " orbit = GeneralPerturbationsOrbit.from_tle(\n",
+ " sum((sets[e] for e in sorted(sets)), [])\n",
+ " )\n",
+ " p = np.einsum(\n",
+ " \"ij...,j...->i...\",\n",
+ " rotation,\n",
+ " np.array(orbit.get_orbit_track_at_time(ts).position.m),\n",
+ " )\n",
" return np.linalg.norm(p - recorded_m, axis=0) / 1e3\n",
"\n",
- " best = {norad: min(np.median(errors({e: s})) for e, s in sets.items()) for norad, sets in element_sets.items()}\n",
+ " best = {\n",
+ " norad: min(np.median(errors({e: s})) for e, s in sets.items())\n",
+ " for norad, sets in element_sets.items()\n",
+ " }\n",
" norad = min(best, key=best.get)\n",
- " kept = {e: s for e, s in element_sets[norad].items() if errors({e: s}).max() <= max_error}\n",
- " return norad, kept, errors(kept) if kept else None, sorted(best.values())[1], len(element_sets[norad]) - len(kept)\n",
+ " kept = {\n",
+ " e: s\n",
+ " for e, s in element_sets[norad].items()\n",
+ " if errors({e: s}).max() <= max_error\n",
+ " }\n",
+ " return (\n",
+ " norad,\n",
+ " kept,\n",
+ " errors(kept) if kept else None,\n",
+ " sorted(best.values())[1],\n",
+ " len(element_sets[norad]) - len(kept),\n",
+ " )\n",
"\n",
"\n",
"# recorded positions of each receiver and transmitter\n",
"recorded = collections.defaultdict(list)\n",
"for record in sample._data:\n",
- " l1 = nc.Dataset(os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"])))\n",
+ " l1 = nc.Dataset(\n",
+ " os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"]))\n",
+ " )\n",
" l1.set_auto_mask(False)\n",
" for k in [0, l1[\"time\"].size // 2, l1[\"time\"].size - 1]:\n",
- " t = GPS_EPOCH + timedelta(seconds=float(l1[\"startTime\"][...]) - GPS_UTC_OFFSET + float(l1[\"time\"][k]))\n",
+ " t = GPS_EPOCH + timedelta(\n",
+ " seconds=float(l1[\"startTime\"][...]) - GPS_UTC_OFFSET + float(l1[\"time\"][k])\n",
+ " )\n",
" recorded[record[\"transmitter\"]].append((t, l1[\"positionGNSS\"][k].astype(float)))\n",
" recorded[record[\"receiver\"]].append((t, l1[\"positionLEO\"][k].astype(float)))\n",
"\n",
"\n",
"keys = sorted(recorded)\n",
- "results = Parallel(n_jobs=N_JOBS)(delayed(identify)(recorded[key], element_sets, MAX_ERROR) for key in keys)\n",
+ "results = Parallel(n_jobs=N_JOBS)(\n",
+ " delayed(identify)(recorded[key], element_sets, MAX_ERROR) for key in keys\n",
+ ")\n",
"rows, satellites = [], {}\n",
"for key, (norad, kept, errors, next_best, excluded) in zip(keys, results):\n",
- " row = {\"key\": key, \"NORAD\": norad, \"name\": names[norad], \"element sets\": len(kept), \"excluded sets\": excluded}\n",
+ " row = {\n",
+ " \"key\": key,\n",
+ " \"NORAD\": norad,\n",
+ " \"name\": names[norad],\n",
+ " \"element sets\": len(kept),\n",
+ " \"excluded sets\": excluded,\n",
+ " }\n",
" if kept: # identified: at least one element set reproduces the recorded positions\n",
" satellites[key] = Satellite(name=key, orbit=to_orbit(kept))\n",
- " row.update({\"median error (km)\": np.median(errors), \"max error (km)\": errors.max()})\n",
+ " row.update(\n",
+ " {\"median error (km)\": np.median(errors), \"max error (km)\": errors.max()}\n",
+ " )\n",
" row[\"next-best satellite (km)\"] = next_best\n",
" rows.append(row)\n",
"orbit_check = pd.DataFrame(rows).set_index(\"key\")\n",
@@ -358,8 +408,12 @@
"receivers = [satellites[k] for k in sorted(satellites) if k.startswith(\"planetiq\")]\n",
"transmitters = [satellites[k] for k in sorted(satellites) if k[0] in CONSTELLATIONS]\n",
"unidentified = sorted(k for k in recorded if k not in satellites)\n",
- "print(f\"{len(receivers)} receivers and {len(transmitters)} transmitters identified; unidentified: {unidentified or 'none'}\")\n",
- "display(orbit_check[orbit_check[\"excluded sets\"] > 0].round(2)) # element sets excluded as poor\n",
+ "print(\n",
+ " f\"{len(receivers)} receivers and {len(transmitters)} transmitters identified; unidentified: {unidentified or 'none'}\"\n",
+ ")\n",
+ "display(\n",
+ " orbit_check[orbit_check[\"excluded sets\"] > 0].round(2)\n",
+ ") # element sets excluded as poor\n",
"orbit_check.groupby(\"group\", sort=False).agg(\n",
" **{\n",
" \"satellites\": (\"NORAD\", \"size\"),\n",
@@ -389,10 +443,10 @@
"id": "dc491949",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:51.678493Z",
- "iopub.status.busy": "2026-10-08T18:03:51.678493Z",
- "iopub.status.idle": "2026-10-08T18:03:57.327130Z",
- "shell.execute_reply": "2026-10-08T18:03:57.327130Z"
+ "iopub.execute_input": "2026-10-25T20:53:10.426924Z",
+ "iopub.status.busy": "2026-10-25T20:53:10.426537Z",
+ "iopub.status.idle": "2026-10-25T20:53:13.937506Z",
+ "shell.execute_reply": "2026-10-25T20:53:13.936787Z"
}
},
"outputs": [
@@ -491,7 +545,8 @@
"source": [
"def crossing_times(receiver, transmitter, stamps, window=600):\n",
" \"\"\"Time at which the straight line reaches -80 km, and the transmitter yaw angle in the\n",
- " receiver frame at that time, within window (s) of each time stamp (NaT/NaN if not reached).\"\"\"\n",
+ " receiver frame at that time, within window (s) of each time stamp (NaT/NaN if not reached).\n",
+ " \"\"\"\n",
" from datetime import timedelta\n",
"\n",
" import numpy as np\n",
@@ -509,9 +564,15 @@
" ts = timescale.from_datetimes([stamp + timedelta(seconds=s) for s in offsets])\n",
" rx_pv = receiver.orbit.to_gp_orbit().get_orbit_track_at_time(ts)\n",
" tx_pv = transmitter.orbit.to_gp_orbit().get_orbit_track_at_time(ts)\n",
- " tp, tp_sign, _, yaw = _tangent_point_geometry(tx_pv, rx_pv, *compute_vnb_frame(rx_pv))\n",
- " height = wgs84.geographic_position_of(Geocentric(Distance(m=tp).au, None, ts)).elevation.m\n",
- " height[tp_sign > 0] = np.nan # tangent point not between receiver and transmitter\n",
+ " tp, tp_sign, _, yaw = _tangent_point_geometry(\n",
+ " tx_pv, rx_pv, *compute_vnb_frame(rx_pv)\n",
+ " )\n",
+ " height = wgs84.geographic_position_of(\n",
+ " Geocentric(Distance(m=tp).au, None, ts)\n",
+ " ).elevation.m\n",
+ " height[tp_sign > 0] = (\n",
+ " np.nan\n",
+ " ) # tangent point not between receiver and transmitter\n",
" s = np.sign(height + 80e3)\n",
" crossings = np.nonzero(s[:-1] * s[1:] < 0)[0]\n",
" if len(crossings) == 0:\n",
@@ -520,7 +581,10 @@
" j = crossings[0]\n",
" w = (height[j] + 80e3) / (height[j] - height[j + 1])\n",
" results.append(\n",
- " (stamp + timedelta(seconds=offsets[j] + w), yaw[j] + w * (((yaw[j + 1] - yaw[j] + 180) % 360) - 180))\n",
+ " (\n",
+ " stamp + timedelta(seconds=offsets[j] + w),\n",
+ " yaw[j] + w * (((yaw[j + 1] - yaw[j] + 180) % 360) - 180),\n",
+ " )\n",
" )\n",
" return results\n",
"\n",
@@ -540,13 +604,18 @@
" ]\n",
")\n",
"# occultations of satellites without an orbit cannot be compared\n",
- "without_orbit = ~observed.transmitter.isin(satellites.keys()) | ~observed.receiver.isin(satellites.keys())\n",
- "print(f\"{int(without_orbit.sum())} observed occultations without an identified orbit, excluded\")\n",
+ "without_orbit = ~observed.transmitter.isin(satellites.keys()) | ~observed.receiver.isin(\n",
+ " satellites.keys()\n",
+ ")\n",
+ "print(\n",
+ " f\"{int(without_orbit.sum())} observed occultations without an identified orbit, excluded\"\n",
+ ")\n",
"observed = observed[~without_orbit].reset_index(drop=True)\n",
"# one parallel task per receiver-transmitter combination\n",
"groups = list(observed.groupby([\"receiver\", \"transmitter\"]).groups.items())\n",
"results = Parallel(n_jobs=N_JOBS)(\n",
- " delayed(crossing_times)(satellites[rx], satellites[tx], list(observed.stamp[index])) for (rx, tx), index in groups\n",
+ " delayed(crossing_times)(satellites[rx], satellites[tx], list(observed.stamp[index]))\n",
+ " for (rx, tx), index in groups\n",
")\n",
"t80, yaw80 = [pd.NaT] * len(observed), [np.nan] * len(observed)\n",
"for (_, index), group_results in zip(groups, results):\n",
@@ -555,7 +624,9 @@
"observed[\"t80\"] = pd.to_datetime(t80)\n",
"observed[\"yaw80\"] = yaw80\n",
"unresolved = int(observed.t80.isna().sum())\n",
- "observed = observed[(observed.t80 >= DAY0) & (observed.t80 < DAY0 + timedelta(days=1))].reset_index(drop=True)\n",
+ "observed = observed[\n",
+ " (observed.t80 >= DAY0) & (observed.t80 < DAY0 + timedelta(days=1))\n",
+ "].reset_index(drop=True)\n",
"\n",
"\n",
"def folded(yaw):\n",
@@ -564,10 +635,14 @@
" return np.minimum(yaw, 180 - yaw)\n",
"\n",
"\n",
- "print(f\"{len(observed)} observed occultations reach -80 km on 14 May ({unresolved} not resolved within the search window)\")\n",
+ "print(\n",
+ " f\"{len(observed)} observed occultations reach -80 km on 14 May ({unresolved} not resolved within the search window)\"\n",
+ ")\n",
"pd.DataFrame(\n",
" {\n",
- " c: np.percentile(folded(observed.yaw80[observed.constellation == c]), [50, 90, 95, 99, 100])\n",
+ " c: np.percentile(\n",
+ " folded(observed.yaw80[observed.constellation == c]), [50, 90, 95, 99, 100]\n",
+ " )\n",
" for c in CONSTELLATIONS.values()\n",
" },\n",
" index=[\"50%\", \"90%\", \"95%\", \"99%\", \"max\"],\n",
@@ -592,10 +667,10 @@
"id": "b83fed25",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:57.330652Z",
- "iopub.status.busy": "2026-10-08T18:03:57.329652Z",
- "iopub.status.idle": "2026-10-08T18:03:57.939566Z",
- "shell.execute_reply": "2026-10-08T18:03:57.939566Z"
+ "iopub.execute_input": "2026-10-25T20:53:13.939299Z",
+ "iopub.status.busy": "2026-10-25T20:53:13.939065Z",
+ "iopub.status.idle": "2026-10-25T20:53:24.118236Z",
+ "shell.execute_reply": "2026-10-25T20:53:24.117479Z"
}
},
"outputs": [
@@ -647,11 +722,11 @@
" \n",
"
\n",
"
GPS
\n",
- "
1578
\n",
+ "
1582
\n",
"
1382
\n",
"
1382
\n",
"
1.0
\n",
- "
0.876
\n",
+ "
0.874
\n",
"
1.0
\n",
"
\n",
"
\n",
@@ -665,20 +740,20 @@
"
\n",
"
\n",
"
Galileo
\n",
- "
1581
\n",
+ "
1585
\n",
"
1384
\n",
"
1384
\n",
"
1.0
\n",
- "
0.875
\n",
+ "
0.873
\n",
"
1.0
\n",
"
\n",
"
\n",
"
all
\n",
- "
4360
\n",
+ "
4368
\n",
"
3838
\n",
"
3838
\n",
"
1.0
\n",
- "
0.880
\n",
+ "
0.879
\n",
"
1.0
\n",
"
\n",
" \n",
@@ -688,10 +763,10 @@
"text/plain": [
" predicted observed matched \\\n",
"constellation \n",
- "GPS 1578 1382 1382 \n",
+ "GPS 1582 1382 1382 \n",
"GLONASS 1201 1072 1072 \n",
- "Galileo 1581 1384 1384 \n",
- "all 4360 3838 3838 \n",
+ "Galileo 1585 1384 1384 \n",
+ "all 4368 3838 3838 \n",
"\n",
" share of observed that were predicted \\\n",
"constellation \n",
@@ -702,10 +777,10 @@
"\n",
" share of predicted that were observed \\\n",
"constellation \n",
- "GPS 0.876 \n",
+ "GPS 0.874 \n",
"GLONASS 0.893 \n",
- "Galileo 0.875 \n",
- "all 0.880 \n",
+ "Galileo 0.873 \n",
+ "all 0.879 \n",
"\n",
" rising/setting agreement (matched) \n",
"constellation \n",
@@ -730,7 +805,12 @@
" # order (as a single collect_ro_observations call over all transmitters would return them)\n",
" results = Parallel(n_jobs=N_JOBS)(\n",
" delayed(collect_ro_observations)(\n",
- " receiver, transmitter, DAY0, DAY0 + timedelta(days=1), time_step=timedelta(seconds=1), max_yaw=MAX_YAW\n",
+ " receiver,\n",
+ " transmitter,\n",
+ " DAY0,\n",
+ " DAY0 + timedelta(days=1),\n",
+ " time_step=timedelta(seconds=1),\n",
+ " max_yaw=MAX_YAW,\n",
" )\n",
" for receiver in receivers\n",
" for transmitter in transmitters\n",
@@ -738,9 +818,9 @@
" n = len(transmitters)\n",
" pd.concat(\n",
" [\n",
- " pd.concat([r for r in results[k * n : (k + 1) * n] if len(r)], ignore_index=True).sort_values(\n",
- " \"time\", ignore_index=True\n",
- " )\n",
+ " pd.concat(\n",
+ " [r for r in results[k * n : (k + 1) * n] if len(r)], ignore_index=True\n",
+ " ).sort_values(\"time\", ignore_index=True)\n",
" for k in range(len(receivers))\n",
" ],\n",
" ignore_index=True,\n",
@@ -754,8 +834,13 @@
" candidates = []\n",
" for (rx, tx), p in pred.groupby([\"receiver\", \"transmitter\"]):\n",
" o = obs[(obs.receiver == rx) & (obs.transmitter == tx)]\n",
- " dt = np.abs((p.time.values[:, None] - o.t80.values[None, :]) / np.timedelta64(1, \"s\"))\n",
- " candidates += [(dt[i, j], p.index[i], o.index[j]) for i, j in zip(*np.nonzero(dt < tolerance))]\n",
+ " dt = np.abs(\n",
+ " (p.time.values[:, None] - o.t80.values[None, :]) / np.timedelta64(1, \"s\")\n",
+ " )\n",
+ " candidates += [\n",
+ " (dt[i, j], p.index[i], o.index[j])\n",
+ " for i, j in zip(*np.nonzero(dt < tolerance))\n",
+ " ]\n",
" used_p, used_o, pairs = set(), set(), []\n",
" for _, i, j in sorted(candidates):\n",
" if i not in used_p and j not in used_o:\n",
@@ -779,7 +864,8 @@
" \"share of observed that were predicted\": len(m) / len(o),\n",
" \"share of predicted that were observed\": len(m) / len(p),\n",
" \"rising/setting agreement (matched)\": np.mean(\n",
- " predicted.loc[m.pred, \"is_rising\"].values == ~observed.loc[m.obs, \"setting\"].values\n",
+ " predicted.loc[m.pred, \"is_rising\"].values\n",
+ " == ~observed.loc[m.obs, \"setting\"].values\n",
" ),\n",
" }\n",
"print(f\"max_yaw = {MAX_YAW} deg\")\n",
@@ -791,7 +877,7 @@
"id": "1b8fb905",
"metadata": {},
"source": [
- "With a `max_yaw` of 85 deg, TAT-C predicts every one of the 3,838 observed occultations (1,382 from GPS, 1,072 from GLONASS, and 1,384 from Galileo) and labels each correctly as rising or setting. TAT-C predicts 4,360 occultations, of which 88% were recorded (88% for GPS and Galileo, 89% for GLONASS), a much higher share than for COSMIC-2 (61% overall); Test 3 examines the rest.\n",
+ "With a `max_yaw` of 85 deg, TAT-C predicts every one of the 3,838 observed occultations (1,382 from GPS, 1,072 from GLONASS, and 1,384 from Galileo) and labels each correctly as rising or setting. TAT-C predicts 4,368 occultations, of which 88% were recorded (87% for GPS and Galileo, 89% for GLONASS), a much higher share than for COSMIC-2 (61% overall); Test 3 examines the rest.\n",
"\n",
"## Test 3: Which Predicted Occultations Are Observed?\n",
"\n",
@@ -804,16 +890,16 @@
"id": "12496669",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:03:57.942571Z",
- "iopub.status.busy": "2026-10-08T18:03:57.942571Z",
- "iopub.status.idle": "2026-10-08T18:04:02.581506Z",
- "shell.execute_reply": "2026-10-08T18:04:02.581506Z"
+ "iopub.execute_input": "2026-10-25T20:53:24.120254Z",
+ "iopub.status.busy": "2026-10-25T20:53:24.120004Z",
+ "iopub.status.idle": "2026-10-25T20:53:28.005959Z",
+ "shell.execute_reply": "2026-10-25T20:53:28.005236Z"
}
},
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABIIAAAISCAYAAACwI2QVAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAApaBJREFUeJzs3Xmcj9X///HnNTvD2I19BoXJbgbZd7IlJUpZQqUpYqSST7Z8UiopQn6RT1FNIkWyZEuhxpZCpSxjm6xjxjpm5vz+0Ly/3mbey7wtM2Me927XLXOu87rOud7Xe5vXnHMuyxhjBAAAAAAAgNueV1Z3AAAAAAAAALcGiSAAAAAAAIBcgkQQAAAAAABALkEiCAAAAAAAIJcgEQQAAAAAAJBLkAgCAAAAAADIJUgEAQAAAAAA5BIkggAAAAAAAHIJEkEAAAAAAAC5BIkgADnWTz/9pK5du6pcuXLy9/dXcHCwGjRooGHDhtnVCw0NVadOnbKolzfHqVOn9NBDD6l48eKyLEv33XdfVnfJqTFjxsiyLLuy0NBQ9e3bN1PHOX/+vMaMGaO1a9feuM79a+3atbIs66Yc+1bJ6HGeNm2a5syZc13HffXVV7Vo0aJ05bfDYybdnu8R7rie67d//35ZlqU333zzxncsG0s77+t9TeVUGb3HZOSTTz7R5MmTb36HsoE5c+bIsizt37/fVubo/G/mZxgAZIZPVncAADzxzTff6N5771Xz5s01ceJElSxZUkePHtXmzZv12Wef6a233srqLt5Ur7zyir788kvNnj1bFStWVOHChbO6S5n25ZdfKigoKFMx58+f19ixYyVJzZs3vwm9uv1MmzZNRYsWzXTS7WqvvvqqunXrli7hWKdOHW3cuFF33XXX9XUSyCFKliypjRs3qmLFilndlWztk08+0W+//aYhQ4ZkdVduuo4dO2rjxo0qWbKkrczR+fMZBiC7IBEEIEeaOHGiypcvr+XLl8vH5//eyh566CFNnDjxlvcnJSVFycnJ8vf3vyXt/fbbb6pYsaIeeeSRm9rO5cuXZVmW3WN8o9SuXfuGHxO3VlBQkO6+++6s7sZt42a+3m4nFy5cUEBAgFsjU240f3//LHnOZ+U532y3+vPzRitWrJiKFSuWpX3gvQNAZjE1DECOdPLkSRUtWjTDLz1eXhm/tS1btkx16tRRnjx5VKVKFc2ePdtu//HjxxUZGam77rpL+fLlU/HixdWyZUutX7/erl7a1ICJEydq/PjxKl++vPz9/bVmzRpJ0ubNm3XvvfeqcOHCCggIUO3atfX555+7dV6nTp1SZGSkSpcuLT8/P1WoUEEjR47UpUuX7Nr+7rvvtHv3blmW5XJqR9q0ly+//FI1atRQQECAKlSooHfffdeuXto0kY8//ljDhg1T6dKl5e/vr7/++kuS9N1336lVq1YKCgpS3rx51ahRI61atSpde998841q1aolf39/lS9f3uHUkYymhsXHx2vYsGGqUKGC/P39Vbx4cXXo0EG///679u/fb/uyPXbsWNu5X32MPXv2qGfPnipevLj8/f0VFham9957L13bv//+u+655x7lzZtXRYsW1cCBA5WYmOjwMbzWDz/8oFatWil//vzKmzevGjZsqG+++SZdvcOHD+uJJ55Q2bJl5efnp1KlSqlbt276559/3DpnyfH0HXemqISGhmrnzp1at26d7fEKDQ2VJF28eFHDhg1TrVq1VKBAARUuXFgNGjTQV199ZXcMy7J07tw5/e9//7MdI+0v2Y769vXXX6tBgwbKmzev8ufPrzZt2mjjxo12ddKmmOzcuVMPP/ywChQooODgYPXr109nzpyxqzt//nzVr19fBQoUUN68eVWhQgX169fP4XmnuXjxokaMGKHy5cvLz89PpUuX1tNPP634+PgM67t6jaSmpmr8+PGqXLmy8uTJo4IFC6pGjRp655137Oq58zx09HrbuXOnLMvSrFmz0vXv22+/lWVZ+vrrrzPVlnT9z3lHUlNT9d///lflypVTQECAIiIi7N4X1q9fL8uy9Omnn6aL/eijj2RZlmJiYhweP23azYoVK9SvXz8VK1ZMefPmtb0nRkdHq0GDBgoMDFS+fPnUrl07bdu2Ld1xfvrpJ3Xu3FlFihRRQECAKlasmG60hjuP5bWvu0WLFsmyrAzfC6dPny7LsrRjxw5bmTufD67O+VruvpalK6/nZ555Rh9//LHCwsKUN29e1axZU0uWLElX19338ms1b95c33zzjQ4cOGB7z0hLYDn7/LwZ53H8+HHbe7C/v7+KFSumRo0a6bvvvrPrb7Vq1bRx40Y1bNhQefLkUWhoqD788EPb41CnTh3lzZtX1atX17Jly+zauHZqmKPzv1GfYa4+qwHALQYAcqAB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w7i9e/eabt26mVKlStnaKlWqlOnWrZv566+/3O731Zxd98OHD5vevXub1q1bm4kTJ5qkpCTbvvvvv99h3K2+7rf6+t3q63C7v/54HWVs/vz5pkyZMqZGjRqmevXqZtOmTbZ9tWvXdhj3//7f/zMVKlQwoaGhZtq0aaZRo0bmqaeeMlWrVjXvv/++w7jhw4fbbc8995wpWLCg7WdHHn/8cdu/161bZ0JCQkz79u1NaGio+frrrx3G5cmTxxQrVsw89NBD5ssvvzSXLl1yWPdqzz77rGnUqJGpX7++GTlypGnevLl54403TMeOHc2QIUMcxs2dO9c0atTIPP300yYsLMz06dPHDBgwwNSsWdNs27bNrbavVbZsWYf7PL1+t/o61KhRw5w+fdoYY8yrr75qWrRoYd544w3TuXNnM2zYMIdxt/r6GeP5Nfzggw/MnXfeaYYMGWLeeOMN88Ybb5hnn33WVKpUyXzwwQdu9fta2enaG2PMmjVrzNy5c82hQ4fsyufMmeM0btGiRearr74yxhjz3XffmWeeecZMnTo1U5+lxhjTsWPHTNU3xpjvv//evPXWW2bZsmVO6/3444/mzJkzxhhjzp49a0aOHGk6depkhg8fbnvuZmTo0KFm3bp1me7X6dOnzWuvvWb+97//mdTUVDN+/HjTsWNHExUVZU6cOOE0duXKleapp54y9957r7n//vvN888/b/744w+XbX7zzTdm4MCBpnPnzubee+81Tz75pFmyZEmm+55mypQpTvdn5fPlZl93Yzy/Do64ejxzwuPi6evBmJzzvL6V72fX8/zMbUgEZRPffPNNhtuSJUtMsWLFHMY1adLELF261Hz22WembNmy5ssvvzTGGLNixQrTokULh3GWZZm7777btGjRwjRv3tw0b97cBAQEmObNmzuNu/qLUp8+fcx///tf888//5gZM2Y4fXFWq1bN9u+mTZuaX3/91RhjzP79+02dOnUcxlWuXNl88MEHpm3btqZEiRLmiSeeMKtWrTKpqakOY4wxpmbNmmb37t3mp59+MoULF7Z9Ed27d6+pVauWw7imTZuan3/+2RhjzLJly0xkZKS5dOmSee2110zfvn0dxtWtW9d89dVXdv1KTU01ixYtMhEREQ7jPL3ubdq0MR988IHZunWrGTx4sKlfv76Ji4szxhin53err/utvn63+jrc7q8/XkcZq1mzpjl27JgxxpiYmBhz1113mXnz5rmMq1Gjhrlw4YI5efKkCQwMtB3jzJkzpmbNmg7jQkJCTI8ePcz//vc/M2fOHDNnzhxTtGhR278dufr50qRJE1ty8uDBg05/6a1Vq5Y5e/as+eSTT8x9991nihcvbnr16mWWLFliLl++7DCuatWqJjU11Vy4cMEUKVLElvRLTk62ew5eq3r16ra6p0+fNi1btjTGGPP777+bevXqOYx78MEHM9y6detmAgMDHcZ5ev1u9XW46667bP8ODw+3JXRSUlJM9erVHcbd6utnjOfXsFKlSiYxMTFdeUJCgrnzzjsdxuWUa//SSy+ZFi1amMGDB5uKFSuat99+27bP2bWPjIw0PXr0MPfee6955JFHTM+ePU10dLTp3bu3efrppx3G1a1b126LiIgwAQEBtp8dubov06ZNM/Xq1TOvv/66admypXnllVccxt111122X+T69etnXnrpJRMTE2PeeOMNc++99zqMK1asmGncuLEpU6aMefbZZ82GDRsc1r1au3btzAsvvGCefvpp07RpU/PCCy+YmJgY89prrzn9DIyKijKRkZFm/vz55tFHHzXDhw83c+fONfXr17dd/4w89dRTpmvXrubLL780MTExJiYmxnz55Zema9euZuDAgW71+VrOEpW3+vlyq6+7p9fBGWePZ055XDx9PeSU5/Wtfj/z9DrkRiSCsglfX1/Tp08f07dv33Rbvnz5HMZd/cXl2i9Nzj40Fi9ebFq1amUWLFhgKwsNDXXZz6uPee0vLs6+RIWFhZlz584ZY4xp0KCB3S96VatWdau9EydOmJkzZ5pWrVqZ0qVLm8jISIdxV/elVKlSdvtq1KjhMO7afVf/klylShWHcXfccYfDfRUrVnS4z9Prfu1jv3DhQhMWFmZ+/fXXbHXdb/X1u9XX4XZ//fE6ytjVv6Abc+W53bRpUzN27FincZ5ev/Pnz5uRI0eabt26mT179hhjjClfvrzD+hm1d20izd3XrTFXfin/+OOPTefOnU2JEiUcxlWtWtUkJSWZ+Ph4ExQUZOLj440xxly6dMmEhYW5jDPmSlLs6ueLs+dnoUKFzJIlS8zatWvttjVr1pjixYs7jPP0+t3q69CiRQvz448/GmOMuffee83hw4eNMcbEx8c7TQTd6ut3dawxmbuGlStXNkePHk1XfuTIEVOpUiWHcTnl2levXt2kpKQYY648Lvfff7954oknTHJyssuksTHGXL582RQtWtSWwEtOTnZ67R944AHTo0cP89tvv5n9+/ebffv2mTJlypj9+/eb/fv3O4y7ui/h4eHm1KlTxhhjLly44DQJWLlyZdu/r/2jgrPkdlp7hw4dMpMnTzYNGzY0ISEh5rnnnrP9EcFVP0uXLu1w37WuPofU1FTToEEDY4wxiYmJ6Z4TV3OWjHT2eVWsWLEMt6JFixofHx+Hcbf6+XKrr7un18HTxzOnPC6evh5yyvP6Vr+feXodciOfrJ6ahitq1qypqKgo1ahRI92+7777zmHc1fPvX375Zbt9ly5dchjXqVMntWnTRhMnTtTs2bM1YcIEWZblsp+HDx/W888/L2OMTp48qcuXL8vX11eSlJyc7DDupZdeUsuWLTV48GA1bdpUjz76qLp06aLVq1erZcuWDuOMMbZ/FylSRI8//rgef/xxHTt2TAsXLnQYV7p0aY0cOVKJiYmqXLmyRo4cqfvvv1/fffedihUr5jAuJCREb7zxhlq1aqWFCxeqatWqtnNzttZB69at1b17d/Xq1UulS5eWdOWx+vjjj9WqVSuHcddz3RMTE5U/f35JUteuXVWmTBk98MADtvVHMnKrr/utvn5ZcR3S3I6vP15HGStevLh27Nhha69IkSJauXKl+vTpox07djiM8/Hx0cWLFxUQEKB169bZyl2toZQnTx6NHz9ef/31l5577jlVrlxZKSkpTmMkaceOHSpevLiMMUpISFBcXJxKlCihpKQkp/FXv24lKX/+/Hr00Uf16KOPKiEhwWFc//79FRYWppSUFP33v/9Vjx49dOedd2rDhg164IEHHMb17dtXDRo0UMOGDbVmzRoNGjRI0pU1lAoUKOAwrnnz5sqXL5+aNWuWbl/t2rUdxnl6/W7EdUhMTHT7OsyePVt9+/aVn5+fAgMDVbNmTdWtW1f//POPJk6c6DDuVl8/Kf01HDx4sCTX1/DNN99Us2bNVK1aNdtr/tChQ9q5c6feeusth3E55donJSXJy+vKcpxBQUFasGCBnn/+eXXo0EHnz593GJf2eeDj46PmzZvLx+fK13Vvb2+nnxVffPGFvvvuOw0aNEiPPfaYevXqJV9fX4WEhDjt58WLF7V7926lpqYqOTlZhQoVkiQFBATI29vbYVyDBg302muvKSoqSg0bNtSyZct0zz33aNOmTcqXL5/L8ytdurSeffZZPfvsszp06JA+//xzDR48WBs3bnQY99dffykhIUGXLl2yXcsDBw44/Qz08fHRwYMHVbZsWe3atct2TfLly5fu9XK1AgUK6Ntvv1X79u3tyr/55hunz+s8efLo559/VnBwcLp9ZcuWdRh3q58vt/q6e3odPH08c8rj4unrIac8r2/1+5mn1yFXypr8E671888/2/7ad61du3Y5jJs/f77tL/1X++uvv8y4cePcanvfvn2mW7dupkKFCi7rpg2DTtvSsuRxcXHmxRdfdBr7+++/m+HDh5v77rvPdOzY0Tz55JPmm2++cRrzxhtvuHUO10pISDBvvfWWmTRpkjl79qyZP3++6dixoxk4cKDDx9kYY06dOmWGDRtmOnToYF588UXbHNP4+Hizfv16p20uXrzYPPHEE6ZTp06mY8eO5oknnjBff/2102lQnl73uXPn2q1tkGbfvn1mwIABTvuZZv/+/Tf9ut+o6/fFF1+Yjh07mqeeesrp9TPm1l6H2/315+l1uN1fRwcPHsxwFIMxxvzwww8O4xITE21/7b3aP//8Y7Zs2eIw7lpfffWVGTFihNv1r3X69GmnQ8+vZ72G48eP29ajOn36tJk/f36Gj/G1fv31V/P55587vV43iqfX71o3+zqk2blzp1m0aJGZP3++2bhxo8s1FbLi+hnj+TVMTk42GzZsMF988YWZP3++2bBhQ6bXjXDXrb72PXv2zHA9tenTpzv9C/qjjz6a4ZS5/fv32/7q78zly5fN66+/blq1apVuNGdG0qYop21pj9GJEydMeHi4w7iLFy+a//znPyY0NNTccccdxrIsU7BgQdO9e3ezd+9eh3FNmjRx2aeMrFq1ylSvXt3UrFnT/Pjjj6Zbt26matWqJjg42G6E7bVWrFhhQkJCTLVq1Uz58uVt1/rYsWNm6NChDuP+/vtv88ADD5hSpUqZ6tWrm+rVq5vSpUubBx54wDYyLCPjx483mzdvznDfmDFjHMbd6ufLrb7uadehevXqpnz58rYRj66ug6ePZ055XDx9PXj6eF77vK5WrZopVarUTXte3+r3M0+vQ25kGeMkZQgAANJJTU1VTEyMDh8+LMuyVLJkSdWrV8/2Fznibk2cI8eOHVPx4sWJy+I4d2ONMen+Mnz69GnbX+JzetyNkpKSopSUFPn5+blV/8iRI9q+fbs6dOjgcXuXLl1S3rx5XdY9c+aMLl++rKJFi3rUlqdOnDihQoUKOR2pIV25didOnHA6mtWZkydPyhhzy8/vemT2+XJ13M267td7HW6E7Pi4eConP6/TRlzdzPezrHpfyim4fXw2cerUKQ0fPlxVqlRRyZIlVbJkSYWFhWn48OFOb/Oc0+LCwsJuy34688gjjxB3i+LOnj2rMWPG6PHHH9cXX3xhty9tuomruPnz59/Wcbf6cclMe8ePH9eQIUMUFRWlU6dOacyYMapevboefPDBDG/37CyuWrVqNy3um2++UZUqVfTaa69p9erVWrVqlV577TVVqVJF33zzDXG3KM6ZiIgI4rJBnKvYdevWqWLFiipZsqQ6duxou3W9JKfTQXNKnCTt2rVLr7/+ugYPHqxnn31Wr732mlu3qs8o7vfff3f5S9PVca+//rp27NhxXe25+qU3Le7ll1/WK6+8cl3n50ncBx98oD/++MNl3O7duzV79uxMt5emSJEidr9MfvXVV27HXu1Wxnl7e+vbb7/1KG7lypVu1S1QoECmHhfLsjJMWriK27t3r3788UdduHDBrtxVPzOK8/b2tpuenZm4H3/80a04Pz8/u8fFk366E7dv3z79+eefmY775ZdftGPHDhUpUkTHjh3TW2+9paVLlzqNuTpOuvJafOutt9z6nM4o7ttvv3X5fnZ1XHx8vHbv3p2p9goUKJCp88ttGBGUTbRq1Ur33XefevXqpYIFC0q68oT/3//+p0WLFmnNmjXZJq5Lly7q3bv3bdtPT+J27dqVYbkxRm3atNGRI0eIuwVxDzzwgO666y7VqVNHc+bMkWVZ+vTTT5UnTx7VqVNHW7duJS4bx7Vv31733nuvEhMT9fHHH6t///7q2bOnvvrqK3311VdasmRJtoirUqWKVq1aZVvTJM2hQ4fUunVr/f7778Tdgrjnn38+w3JjjGbOnKkzZ84Qdwvirie2bt26mjt3ripXrqyFCxdqxIgRmjlzppo1a6batWtr27ZtOTrulVde0eLFi9WzZ0+VKVNG0pXn9aeffqpOnTqlW1uOuOwV50y5cuUUGxtL3C2Imzp1qqZNm6Y777xTv/76q9566y117dpVkpx+pyAu47jx48dr6dKlunz5slq3bq1t27ap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gIAA+fn5ydfXV9KVBMadd96pdu3apat79uxZFShQQE8//bTTY1qWpWeeeUYzZsxQWFiY/P399b///U+StGfPHvXs2VPFixeXv7+/wsLC9N5776U7Rnx8vIYNG6YKFSrI399fxYsXV4cOHfT777/b6iQlJWn8+PGqUqWK/P39VaxYMT322GM6fvy43bGunhp2+fJlFS9eXL169cqwzTx58igqKspWlpCQoOeee07ly5eXn5+fSpcurSFDhujcuXNun3NGoqOj1bZtW5UsWVJ58uRRWFiYXnzxxXTH7du3r/Lly6e//vpLHTp0UL58+VS2bFkNGzZMly5dsqt75MgRde/eXfnz51eBAgXUo0cPxcXFOexDRhITE/XUU0+paNGiKlKkiO6//34dOXLErk5qaqomTpxoe9yLFy+u3r1769ChQ3b1QkND1bdv33RtXDtVb+3atbIsSx9//LGGDRum0qVLy9/fX3/99Vem+g4AANzHn1oAAMglUlJSlJycLGOM/vnnH73xxhs6d+6cevbsKelKQmPQoEEaMmSI9uzZozvvvNMW+9FHHykhIcFlIkiSFi1apPXr12vUqFEqUaKEihcvrl27dqlhw4YqV66c3nrrLZUoUULLly/X4MGDdeLECY0ePVrSlWRE48aNtX//fr3wwguqX7++zp49q++//15Hjx5VlSpVlJqaqi5dumj9+vV6/vnn1bBhQx04cECjR49W8+bNtXnz5gxH4/j6+urRRx/VjBkz9N577ykoKMi279NPP9XFixf12GOPSZLOnz+vZs2a6dChQ3rppZdUo0YN7dy5U6NGjdKvv/6q7777TpZlOT1nR/bs2aMOHTpoyJAhCgwM1O+//67XX39dP//8s1avXm1X9/Lly7r33nvVv39/DRs2TN9//71eeeUVFShQQKNGjZIkXbhwQa1bt9aRI0c0YcIEVapUSd9884169Ojh8lpdbcCAAerYsaM++eQTHTx4UMOHD9ejjz5q16ennnpKM2fO1DPPPKNOnTpp//79evnll7V27Vpt3bpVRYsWzVSbaUaMGKEGDRpoxowZ8vLycvr4AQCA62QAAMBt7cMPPzSS0m3+/v5m2rRpdnUTEhJM/vz5zbPPPmtXftddd5kWLVq4bEuSKVCggDl16pRdebt27UyZMmXMmTNn7MqfeeYZExAQYKs/btw4I8msXLnS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EVF9VpMJQSUlJXrtNjY2sLExvB7w1atXcefOHTg4OOi1Ozg4oKCgZtd6e++993Djxg2MGTOmRv3vxRlBRERERERERERmSJJkdgEAJycntGjRQl6MneJ1/zbvJYQwaDMmJiYGkZGRiI2NRZs2tb/RD2cEERERERERERGZUZPbx+fm5urdNczYbCAAsLe3h6WlpcHsn8uXLxvMErpfbGwspkyZgl27dmHw4ME1fwL34IwgIiIiIiIiIiIzpGoWAGjevLneYqoQZG1tDX9/fyQmJuq1JyYmok+fPiYzxMTEYPLkyfjoo4/wl7/85YGfC2cEERERERERERGZce8pYMbW1dasWbPw3HPPISAgAL1798b777+PnJwchIWFAQBef/11/PLLL/jwww8BVBWBJk6ciJUrVyIwMFCeTfTII4+gRYsWtdo3C0FERERERERERGbU5NSw2hg7diwKCwsRFRWF/Px8+Pj4YO/evXBxcQEA5OfnIycnR+6/ceNGVFRUYPr06Zg+fbrcPmnSJGzbtq1W+2YhiIiIiIiIiIjIjLouBAHAtGnTMG3aNKPr7i/uJCUlPdhOjGAhiIiIiIiIiIjIDOl//5lapyUsBBERERERERERmWEhVS2m1mkJC0FERERERERERObce3swY+s0hIUgIiIiIiIiIiIzJEmCRR3eNUxJLAQREREREREREZlRjyYEsRBERERERERERGSOJEkmZ/5wRhARERERERERUT3yR9w+XiksBBERERERERERmcFCEBERERERERFRAyH97z9T67SEhSAiIiIiIiIiIjMkmJkR9KcmeXgsBBERERERERERmWEhVS2m1mkJC0FERERERERERGbVnxvIsxBERERERERERGQGZwQRERERERERETUQvGsYEREREREREVEDIUkSJBMVH1PtasVCEBERERERERGRGfXnCkEsBBERERERERERmWUhSbAwMfPHVLtasRBERERERERERGROPZoSxEIQEREREREREZEZvGsYEREREREREVGDIUGqJ1OCWAgiIiIiIiIiIjKDt48nIiIiIiIiImogWAgiIiIiIiIiImogJDOnhpk+ZUydWAgiIiIiIiIiIjKjPl0s2kLpAEREREREREREqiZVszyAdevWoUOHDrC1tYW/vz8OHz5stn9ycjL8/f1ha2sLNzc3bNiw4YH2y0IQERER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kiThs88+02tr2bIltm3bBgDIzs6GJEmIi4vDgAEDYGtrix07dhjd18cff4zQ0FDY2trWKmPTpk3Rtm1bebG0tESzZs302lauXIlDhw7hwIEDmD59OnQ6Hdzc3DBu3DgcP34c7u7u8vaeeOIJxMTE1CoDERERNUwsBBEREVG9kZqaijFjxuCZZ57Bd999h8jISCxYsEAu8tTGa6+9hvDwcKSnp2Po0KFG+xw6dAgBAQEPmdq4nTt3YvDgwfDz8zNYZ2VlhSZNmsiPe/bsiRMnTqC0tPQPyUJERET1RyOlAxARERHVxOeff46mTZvqtd25c0fv8fLlyzFo0CAsWLAAAODh4YHz589j2bJlmDx5cq32N2PGDIwaNcpsn+zsbLRr165W262pjIwMDBgwoEZ927dvj9LSUhQUFMDFxeUPyUNERET1A2cEERERkSYMHDgQaWlpesumTZv0+qSnpyMoKEivLSgoCBkZGQZFo+rUZKbPrVu3an1aWE0JISBJUo36PvLIIwCAmzdv/iFZiIiIqP7gjCAiIiLShCZNmqBTp056bZcuXdJ7bKx4IoTQeyxJkkGbsYtB33vqlSn29vb47bff9NqaN2+O4uJig75372zWokWLarcLVM1mSk9Pr1Hfa9euAQBat25do/5ERETUcHFGEBEREdUbXbp0wTfffKPXduTIEXh4eMDS0hJAVbEkPz9fXp+RkfHAM2n8/Pxw/vx5vTZPT09cunQJBQUFeu0nT56EhYWFQTHLlHHjxuGrr77C6dOnDdZVVFTgxo0b8uPvv/8ejo6OsLe3f4BnQURERA0JC0FERERUb/zjH//AgQMH8NZbb+Gnn37C9u3bsWbNGsyePVvuExISgjVr1uDUqVNISUlBWFgYrKysHmh/Q4cONSg8hYaGwsvLC8888wy+/fZbZGVlISEhAbNnz0ZYWBiaNWtWo23PmDEDQUFBGDRoENauXYszZ87gwoULiIuLQ69evZCRkSH3PXz4MEJDQx/oORAREVHDwkIQERER1Rvdu3dHXFwcPv74Y/j4+CAiIgJRUVF6F4p+77334OTkhH79+mHcuHGYPXs2Gjdu/ED7mzBhAs6fP48ff/xRbmvUqBH2798PNzc3jB8/Ht7e3pg3bx6mTp2K5cuX13jbNjY2SExMxNy5c7Fx40YEBgaiR48eWLVqFcLDw+Hj4wMAuH37Nnbv3o0XX3zxgZ4DERERNSySuP8keSIiIiKqsblz56K4uBgbN25UZP9r165FQkIC9u/fr8j+iYiISFs4I4iIiIjoIcyfPx8uLi61vitZXbGyssLq1asV2TcRERFpD2cEERERERERERE1EJwRRERERERERETUQLAQRERERERERETUQLAQRERERERERETUQLAQRERERERERETUQLAQRERERERERETUQLAQRERERERERETUQLAQRERERERERETUQLAQRERERERERETUQLAQRERERERERETUQLAQRERERERERETUQPwXDXZaov/VNKsAAAAASUVORK5CYII=",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABIIAAAISCAYAAACwI2QVAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAuzNJREFUeJzs3Qe4E9XWxvGdHHrvIB2liBQLKCJiQQS7YkWxK4i9V0TUq6LX3hti773jRRTFLiAiSLMgRRGQ3jmQ73k3Tr5JyMwkwykJ+f/uk+shyU4m02fN2mtHYrFYzAAAAAAAAGCrFy3tCQAAAAAAAEDJIBAEAAAAAACQJwgEAQAAAAAA5AkCQQAAAAAAAHmCQBAAAAAAAECeIBAEAAAAAACQJwgEAQAAAAAA5AkCQQAAAAAAAHmCQBAAAAAAAECeIBAEYKvUuXNn07NnT7M1Wb58uTnjjDNMgwYNTCQSMWeeeabJZi+99JKdzgkTJsSfu+OOO+xzS5YsMdk8nbmmNOZrNi7LMK699lr7OwoLC02+2ZJ1P1/n20477WQOOeQQk6/029u3b1/ak5GV8n3dAJBbCAQByBkbNmwwTz75pNl9991NnTp1TPXq1c0uu+xirrvuOjN79myztbv55pvNG2+8YT777DMTi8XMsGHDTL646aab7EXnihUrSntS8mqeMd8BhLH99tubI444Iu9nnt98YB4BKE0EggDkDGXA6HHMMceYn376yfz555/mxhtvNK+88oo56aSTzNZOAaDddtvNtGnTxuSqyy67zAaxatSoUdqTgi3EskQ+UvbUe++9V9qTgSzEugEglxAIApATFPR56qmnbMDn0ksvNdtss42pXLmyTcMeN26c2X///c3WbuHChaZixYqlPRkAAAAAchiBIAA5YdGiRfa/jRo12uw1BYQGDRqUst3vv/9uDjjgAPseBY/0vo0bNya858QTT7RdaPSIRqO229nhhx9uJk2alLLu0PTp0+1nVqlSxbaV9evX265bbdu2NeXLlze1a9c2xx9/vJk1a1bgb1u8eLE5//zzTZMmTUy5cuXsfy+88EKzdOlS+/pbb71lp+2XX34xb7/9dnxax44dm/Lzpk6dal9X4EyPli1bmgoVKthudB9++KHne59//nmzww47mDJlypgRI0bY13/99VcbfFNdIk2bPuuWW26x3fTc/ve//9n5o+/ZdtttzeOPP55RXRl9zymnnGKXr4JdHTt2NA8++KD9HmWBDR482L6vatWqKX9/UU+nl2+++cYue3VL1HRqnj799NObvc/v96T7nlNPPdX+nmTPPfec/f3J66db0DxzPsN5aF3u2rWrefXVV9P+DK9lmc48curLrFy50lxwwQV2e9F3HHXUUWbBggWbBYFPP/10u11UqlTJbmPXXHNNfPsoiuUlmhb95po1a9r3H3fccfa7w0xLOuujMw+WLVtmzjnnHFOvXj1Tt25dO316fvTo0ZtNo7qG6jX3dlxS676XoPmm/Yqm+eOPP96srdY3vfbBBx94fr7XfHK8+eabZs8997TrsJZJ9+7dzaeffrrZ5+h9e++9t51GZST27t3bfPvtt5u9J+izkuvA6CZE06ZNNzuuyJFHHmnq169vjw+ZfEfz5s1N3759bYbJvvvua9930UUXec4jrePO9llQUGC/89hjj7XrRqrPnTx5stlnn33sNqF1+bbbbtvsM7X+qNt148aN7fdr3ikTNx1ax6ZNm5ZwvFI3qHR+X3H8Fq37mn7tZ7Tsu3XrZl577bWUnzd+/Hi7fDRNHTp0iC8b7fe0rPS8th/3vtJr3fCbD0HzqLjWFQCIiwFADli7dm2sXr16saZNm8Z++umnwPd36tQptttuu8X69OkT+/7772NLly6NPfzwwzHt9h5//HHPduvWrYtNmjQpdvDBB8e22Wab2D///JPwmbvuumvsgAMOiH333Xex+fPnx1588cVYYWFhrHfv3rG6devGXn311diSJUti06dPj/Xq1SvWuHHj2IIFCzy/b9WqVbGOHTvGGjVqFBs5cqSdzv/973/2u3feeefY6tWr4+/dbrvtYocffnjgb58yZYr9nXrv+eefH5s7d25s1qxZsdNPPz1WUFBgvyf5vUcccUTsvPPOs+8bN25c7JtvvrGv1axZM9ajR4/YhAkTYsuXL4+9//779neeccYZ8c/45JNPYmXKlImdfPLJsZkzZ8b+/PPP2MUXX2w/U5/9ww8/xN97++232+cWL14cf07zu3r16rE99tjDfq++R8+de+65sa+//tq+5z//+Y9tp9dS/d6ins5UxowZEytXrpx9/y+//GKX/0033RSLRCKxm2++OaPfk857TjnllFj9+vU3m45nn33WTq97O0g1X/3mmdvGjRtjc+bMiQ0e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1x977DH7WfpsBWz02TJp0iTzySef2M/R54q6f5122mnmyCOPTJjmm266ydx4443xz3T89ttv5tdff7VZRVqw+u/PP/9s5syZY1/X+zVPHnzwwcD5pwymZcuWJTwAAAAAAEB2i+RrRpCoBs4///xjvvrqK3P55ZfbocuSTZw40T7/yy+/mIMOOsjcdtttCa+rC5Wyhj7//HNz9dVX2+eU6XPppZea119/3QZa3n33XVsASVk8zz77rK3Vo+CL3lepUqX4ZynIdNVVV9kMIU2Xu86PAkGtWrUyderUsf9WBpLa66F6QW677LKL6dq162YBHf0OBZacuj/6r/7tBIIGDx5szj77bBuECqKh4BSwch5NmjRJa54DAAAAAIDSrxEUCXhslYEgZec4NXTUxer777/frCizulKparVq7yiwooCQm16Xzp0726wYden6+uuvbbXsgw8+2Gb9HHHEEba7lhNw8aIA0D777GPatWtn/63gkUPVtt11hNQ9TJ+tqtoXXnjhZp+lrKA77rgjIVNHn5HcDU61ihQQ+uabb8z48eNtBpSCS3rfokWLbMZSKgp6KQDlPNRNDQAAAAAAZLdIPmcEuYMcqplTrly5hNeV5aMAier0LFy40AwbNmyzQIq7jYI9Ch4psKIgjZOx4zzatm1r3+c1Q/VZydPkUAHomTNnxgNRyvrRZ1533XUpP0vZQ4cffri5/fbb48+pS5mCUSo6Lfrvn3/+aQtPjx071kyePNlOtx6qRaRuZ++8807Kz1dNo2rVqiU8AAAAAABAdotE0ntslYGgK664wo6m9dxzz5kff/zR7LHHHokfGI3aItHK7lG2kOrupGOvvfayGTI333yzrcujgI2GdXdoKHd1R3OKRTu6d+9uv0d1gDRdqhHkUB2hM8880xx22GHm7bfftp87ZcoUmxnkDAufbMiQIebRRx+NF7pWly/9Rv3uqVOn2v/uu+++tobReeedlxC0UrFofY8KVAMAAAAAgK1DxAZ6gjKCzNYZCOrRo4c55phjzAMPPGDr+ahotDRo0MD+cAV0+vTpYx8KmvTr188GcRz169dP+Dz9W+2UHTNq1CgzYcIEs//++9sMG9XscXfbGjBgQLxYtPN9+uzXXnvN3H///ebYY481vXv3Tvh8Tee5555rbr31VhvA0dDxLVq0MPfee2/CNDiBIQV+NCpY5cqV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az/++KPNvGnUqJHp1q2bGTNmjH2+b9++NiijrCC1X7lypf0OJyPof//7n9lpp53sdA0bNsy+TxSYefLJJ22A54ADDrCf27lzZ3PbbbeZU089NWGar7vuOjNo0CCbQeT2559/2gCQAknNmzc3N910k/n888/N/Pnz4++pWrVqPCMoneAUAAAAAADIHZE0H1tdIEhZMmPHjrWBl2uuucYcd9xxZtGiRZu97/vvv7dBmG+++cbUq1fP3HrrrQmfMXHiRPsZCrwMHDgw/vzJJ59srr76avPDDz+Y66+/3pxwwglmzZo1NqOnoKDA/Prrr/ZzK1euHM8QUnaPAkWDBw82H330kfnqq6/sa6JpbdGihdl2220Df5u6fGlan3vuuYTn9X0KIFWqVMn+W9/dsGFDM2vWrPh7Dj30UNOsWTM7vXPnzvX8DgWuli1blvAAAAAAAADZLWoiJhoJeGytXcNuueUWm+lzzDHH2Lo7X3/99WbvUeBGGT0dO3Y0jz/+uPnpp58SXld2TePGjW3gRBk369evt9k/U6ZMMX369DGtW7e2n6/XFPxR8EWqV69us27cvvjiC7P77rubo446yjRt2jQh6KQsorJly8b/rcCQk7mjLmPJhg4dagNQ7vpByhBSEMpN/3a6jWm69fs++eQTmw2kDCgv+nz9Bueh+QgAAAAAALJbJF+7hkm5cuXifyvwUVhYuFk20P3332+eeeYZW3dHQSF3YEWcwI47qKL3dO3aNV5rR49//vnHbL/99r7To+93d8dy/92hQwdb8HnBggX23+rOps+97LLLzKpVqzb7LBWSVhezRx55JP6cAlZz5syJ/wb9V1k/et7dLUwFpxXgUkaSV9FsZTsp88l5uItOAwAAAACA7BTJ52LRd955p82SUcDnyy+/NLvttlvC66oHpGwX1etRNo4CQelQBpEya0aNGmWqVasWz9xxsnH03Lx58zZrp2ygzz77zIwbN84GlP773//GX1MdItUcOv74421QKhqNmipVqtggjF/Gk7KK1CVNVBdIGUr33XefDTrpvwowqbtYcrevhx56yLRv395EPMKAClLpd7gfAAAAAAAgy0XSyAbKjThQ5oEgBUNq165tAyz33nuv2WabbRJe33fffW22TM2aNW0x6HTq84iGZn/ttdds1ywFaxQEcrJuRLWEWrVqFS8W7dB77r77btOz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y5cv933f33//bcJavXp1vP0///xjRo0aFfh9jt9//918+umnZvz48fZz0vXTTz+Zd99914wcOdL8+eefoad9xYoVZu3ataa4/e9//zM///xzxu00ZOGaNWsC37dgwYL4upkp/f6//vor/n1afkuWLEmr7dSpU837779vh1KcNWuWCWvlypVp/U7nNxYWFprp06ebDRs2ZPQ9Y8aMsetamPVE23ymZs+ebd544434/PWj3zR37lz7t75Ly0HLNR3qz6zf9vXXX9t9Wbp+++038+GHH5oPPvjA/PLLLyYsbbth5k9xc9YX/Vfry7p16zJq/8MPP9gRIsLMj3T2gdrOwu5/Nm7caObMmRNfdz755JP4+hNE++mvvvrKrjP6OyxNu7aN4qb9jPYxYaYvk+3Bfbx988037TrjR8s47HqvdVLLS8tRf2s90/EwHfpNzuglmRy79V7tV9555x0zYcIEE5bORXSsKG5av1977bVi/x73sVPLIN3zF/f+9+WXX874e3X8WrRoUaj9i5ah9k9B63+6x/JUdNxy9pla3yZPnpxWO20TY8eOted2mZwXaLsbPXq0PWfVUM2ZHt8d2qb0WSWxvmgdzXQZavrC7He1n9exWvvudOicSuuItnkd67fk96bzG93zRetOuucv7vYLFy7MePo0P0eMGGE+//zzwM+fP3++2ZL93o8//mjn54wZM9Jup+3hiy++sOv1l19+mda5rpd05o97OWgZpHP+mUz1cMJsfzoP0XUZ1XBSUI0gZK+999479umnn3q+Pn369FirVq1iNWrUiL3yyiux7bffPta0adPYKaec4vu577//fuzhhx+OP3bYYYfY+eefb/+eNWuWZ7v77rsvNnny5NiiRYti3bt3j9WuXTtWtWrV2AMPPOD7fSeeeGJs5MiR9u8PP/wwVq9evVjv3r1jO+20U6ywsNCz3eGHHx5r27Zt7J577rHfma4ff/zRTlujRo1id911l/19e+65p/2sdevWebZbtmxZbP/994/VqlUrtt1229l5Wb9+/dh7773n+33//PNPrEuXLnb+H3XUUbFDDjnE/sbLLrssFka/fv1izz77rOfrixcvju23336xhg0bxm6++ea0233yyScJy3333XePnXzyyfbvqVOnerbTZ37xxRexNWvWxA499FC7vlWpUiU2aNAg399x1llnxVq0aBG75ZZbYvPmzYul67fffos1aNAg1rhx49iNN94Y22WXXWL77LNPrEmTJrHly5d7tluxYkWsZ8+edtn16dMndthhh9l5dMYZZ8Q2btwYy9SFF14Yu/vuuz1fX7JkSWyPPfaIVaxY0W4bPXr0iLVs2dKuC+vXr/ds9/XXXycsB02z1hv9PWHCBM92b775ZmzEiBGxDRs22G2qWrVqdvs7++yzfX/HrbfeGv8dv/76q902tG1pHv/999+e7fRas2bN7Hy/+OKL7TLQeqd12295avpOP/10+75tttnGbhdaX4L2E5pnxxxzjP0+Td8RRxxhv1/Lcu3atbFM/ec///FdRzWdJ510kp1OzUOt3zJ06NDYlVde6dlO65L2sWo3YMCA2OrVq+3zt99+e+zSSy/1bKd9nbaf8uXLx6644orYaaedZtcXPfz2bxMnTkxYXzSPtK7p7y+//NKznY4dL730kv1b+yItA227Rx55pO/6qc/VOqLfMm3atFi6NB86duxo97vHHnts7Pjjj7frjPanOm74ueqqq+y6ou/t0KFDrEKFCrHBgwfHwnjyyScDj4GXXHKJXX6aRm3Hzn5O+1C/4617OWj57bbbbvbvUaNGebb7/vvvY8OGDbN/a1+o5VCzZs1Yr169YitXrvRs9+6778bOPPPM+LzVfu3AAw+0x6SvvvrKs92rr75q9w3nnnuuXXfSpe1B5xxaDvvuu6/d/3Xr1s0uk88//9y3rdZ97a/1vTvvvLNdx88555zA/e6QIUNidevWjR100EGxo48+2i57nRf89ddfsUzp3ELnFX40/zX/dIx2vkPnJtqveZk7d27Ccte+UOdd+vvtt9/2/b7//ve/9vv0+/7888/4dqn57Ofqq6+2xxX9nnvvvdeei2g++R0ftL92T6f2MTr+6u833njDs90ff/xh54uzDVSvXj1Wp04duxz1271oWtzzW+dY+l1aD7QOevnhhx/s9q1j2JgxY2KZ0Dan+aD9jI5rOjfQ/PU775Hnnnsu1rx581ilSpVinTt3tt+v9c3Zd3t59NFH7bzQtqr97q677hrbdtttYz///HMsUzNmzLDbcNB06pxF83LKlCn2ud9//90eB/3o/EP7FU3fM888Y5eB9rsff/yx73mk9rvONYF+p/aJrVu39t3vz58/326nDu3rtR/UcUzn6n60T9M80Lqt5VC5cmW7Djn74EwsWLDA7pv8PPXUU/YcqX379rGXX345Pl90LuVF5wHa98no0aPteZLmi9YfrbtetC/XuuHQOZDWT53/3HTTTZ7ttA5Go1G7T9L88bsmSvbZZ5/F2rRpY9frTp062f2v1p2g/aeWt7Ybba9ar/faay+73/c7jvkJCie89dZb9txDy17zXucIWt+eeOIJ33aPP/54wj6tTJkysfvvv9/+7TeftL0453PaD+oaUMeViy66KNTv25oxaliWeOGFF1LeoQi6a3HnnXeaY445xlx++eVmp512MhdeeKE555xzTLNmzexd/yZNmqRs9/DDD5toNBp/XXdPZ86caSPYe++9t+f3KcuiVatW5vnnnzeNGjWyd0kU0d91113tdNSrVy9lO93Jcu7Q6rfedNNNpn///qZTp072Dk2XLl08v3PgwIE2cqzft88++5izzjrL7LHHHr7z5bHHHjMXXXSRHVavc+fO5vTTTzeXXnqpnU5lJ+y1116e83O33Xazv1PfpaH5dAfolFNOMdOmTTO1a9dO2e7uu++20/fII4/En9Pv1XPHH3+82WWXXVK2e++992x2VDLd4TrggAM8f5++R0MIat4pQn7llVea2267zQTRvNedxe23397+W3fldPdX07Dzzjt7ttNy1t2CiRMn2t+lO7hqq9933HHHmQ4dOni21bzTHaOuXbva5a3lt99++5lIJOLZ5umnn7afe88995iePXuaXr16maFDh5oDDzzQZjEdeeSRKdsNGzbMVK9e3d4VcT5fdx/13boboM9JRXdSvv/++82e1/xt3ry553Q+++yzdp3XvOjdu7fZdttt7Wftueee5uOPP/Zchm+//bbNetD8c+6m6G6qloO2Ly/ffPONqVGjhr3rrXVE24XuBmmd1V3OfffdN2U7fbaT2aa7P5q3Dz74oDnjjDNshoGWSSpa//VbnnvuOdumZcuW5vHHHzcnnXSS/Q0DBgxI2U7ZRrqzqPXk2GOPtdtiuXLlzMEHH2y3dW2Tqbz++uu2jfYpGgpTtE/SfHzppZfMySefnLKd7kSmuuumeaxt3ovuYurO5Lhx42wGkobg1PcEURaI1hetH1ofTzjhhLTuvOs7tMyUOXHqqafau5laV/W9aq99XSr6bZrvWhaiz9A+VetL3bp1Pb9PrytrpWnTpnZZah+v/Ya2vxdffNEuRy+a59tt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eT5x4kTbLS/V77/11lvjwcdM5yEAANgydA0DACAP6QL+/ffftxfv22+/vX2uSpUqNphz9dVXb1Y4eMyYMeb+++831atX9/zMpUuX2m5oo0aNMkcffbQNdNSuXdt+5tq1a21XraOOOso+v9tuu9kgUfv27c2bb74Z/wwFAA466CBz6KGH2iLP6sa2ePFis++++9qaP5LuZzk1gvRbRb9TgSEFqJI98sgjNiDhzIt0v8Opr6PAx3//+1+beaXf62WbbbaJd9FToEXv13frc+fPn7/Z5yo4cvvtt5s2bdqYWCxmjjzySPtvN7Xr1KmTufPOO+3nVa1a1fTt29d2/8uEgmRB36WAWJcuXczFF19s6tWrZ3bYYQc7nWqjgJU74KP5mey3336z71+yZEnoeQgAALZQDAAAbLVWr14d0+G+RYsWsX79+tlHnz59Yo0aNYp17do1Nm7cuIT3v/nmm/b977zzTsLzxx9/fKxSpUqxpUuXen7XlClTbNvGjRvHFi5cGH9+1apVsSuuuCJWpkyZ2NixYxPaXHDBBbFq1arFFi9ebP998cUXx6LRaOzrr79OeN+KFStiixYtsn+n+1m33367nR7n39KzZ89Ys2bNYhs2bIg/t3bt2ljt2rVjffv2jT+X7ncMGjTIfkf//v0Tfm8mVq5caZfH+eefH3/O+Vz3c3LSSSfFatSoYZer49RTT41VrFgxNmvWrPhzmlfNmze3n/HDDz/4fn8m33X66afHypYtG5s6dWrC723Xrp1dx9avX2+fO+WUU2L169ff7LueffZZ+10//fTTZt+/JfMQAACkj4wgAADygDsTRZkuytiZPHmyefrppxOyf5SJo+5f7m45yjhRd51jjjnGVKtWLfC71J1ImUCO8uXL225LvXv3tpkrbgMHDjTLli2zXbA0HU8++aTNCNp9990T3qcuVOo6pfek81lezjjjDPPHH3/YrCWHuiWpC5pekzDfceaZZyaMyubnl19+MbfddpsZMGCA7VKl/6pe048//rjZe92fK5omZdOo+Leo3auvvmozl7TcHJpXxx57rO90hPkudQk75JBDbAaQ+/eef/759n3KBAork3kIAADCo0YQAAB5WCxa1MVHtWlUo8a5CC8oKLA1fgYPHmy78Wy77bbmiSeesN2rnEBJkJYtWyb8W4EkdSlSoODUU0+13Y5E/3W6bSk4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qlatausHZYKMIAAAAAAAgDRGDfN6iIJA7keqwM62224bDxq56d9ew8FrVLF//vknoRuYPqdr1662cHSmCAQBAAAAAAD48BoxzC9TKJWWLVvax+uvvx5/btq0aeann34yBx54YPw5jSamIeKlYcOG9r8aZcyhOkPKCnJeK5WuYcOGDbNDmRUUFBTVRwIAAAAAAJS6qN/oYBmMGiZ33nmnOfLII02lSpXMdtttZ+666y7b9csdCLruuutMhQoVzHvvvWezf4499ljTv39/c8UVV9haQSoW/ddff5nzzjsv899iioi+fP369aa4PPbYYyYWiyUEnhQBS8fatWttutSTTz5pPv30U7N69eqE159++mnz8ccfJzz3zDPPJBRqGjdunG0/fvz4lN8xd+5c88gjj5h58+Zl+MsAAAAAAEBOjBoW8Xhk4LDDDjOff/65jTl88skntvbPu+++m5BZ1K1bN9v1y6Gh5RVAmj59uvnwww9Np06dzNSpU03r1q233mLR55xzjjn99NNNmTJl4n3k3IEhLz/88IM54ogjbEVuDcemiNmcOXNsoGe33Xaz77n00kttEOvXX381derUsc8pyqbXa9SoYe6//35bkKlHjx7myiuvNDfddJMZMGBA/Ds0Hfr3l19+adq3b28aNGhQbPMBAAAAAADkbkaQ7LHHHvbh5YYbbkj4t75bNYLCDBefLKOpVcaLqlW//fbb5qOPPjIbN25M+T4FWfTe559/3vZZS/6MlStXmnfeecdGvJKzepRx8+yzz5oxY8bEn1O0S8EWZQWpfWFhodlxxx3j0TJNx4gRI+x0qdK23icK7ijdShW0J0yYYD9XmT96lC1bNuF7FeS55ZZbNvst69ats0EgTetLL71k/3v99dcnZD9pmhSpIwAEAAAAAMDWJ2J8agRlmhJUyjLKCFK60gsvvGCaNGliAyvt2rUzr7zyymbvmzx5slm6dKkN+CizRl2qevXqFf+M1157zQZNJk6caAskPfXUU/a1iy66yBZD2mGHHWyhpDZt2pjnnnvO/P777zYQpCwgzWQFj9QV7cQTT7Q1iY455hhbXKljx462b50yc5wMnWXLltksHrfGjRvbh9ugQYPMQQcdZC6++GL7+xxKu1LkrUuXLvbf+q++X9OkFCz9VwGiUaNG2WkN6qKmh0PTBgAAAAAAslvENTpYqtdyScZd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s4I2f5ickjMljZ5++umEQNBee+1lomlUZHr55ZfNLrvsYubOnWs6duxoVq5caY4//njz7rvvxt/z4osvmmuvvdZMnTo1od3SpUvt3xdddJEZPny4adu2rXniiSfMlVdeGX/fO++8Y7bddluzzz772EeTJk2K8FcDAAAAAIBsqREU8fjfVlssWhkvCoI888wzpkKFCjaTplatWpu9T9k0CqJUrVrVBmyOPvpoE/k3V0qfMWjQIPPkk0/a5/TeevXq2dfWrVtnhg0bZiZPnmyaN29uBgwYYKpXr27uueceGwRSVpDaPProo+bzzz83ffv2NQUFBeaff/4x999/v1m7dq39/P/+9782YLNs2TKbOfTSSy+ZQw45JD59119/vZk/f37CNOuzFQx67bXXEp7XZ2halUXUtGlTc+SRR5r27dubG264wVSuXNm+57DDDjM77bRTJrMSAAAAAADkiIhPF7CtumuYsnIGDhxoGjZsaGbMmGH23XfflN3B9thjD5sds/3225s777zTPP744wmfce6559rPmDlzpjn22GPt87FYzBx00EFm2rRpZscdd7Sv9ezZ0z7foUMHGwDae++97ecq+ON0RVO3LT3/66+/mm222cYGfvQd8sUXX9hAkjsIJGXKlLHf76ZpGjt2rH24/fLLL6ZOnTo2CCT6b40aNczvv/8ef89dd91lA1qvvPKKnV4vClQpsOR+AAAAAACA7FZgvLqFRexrW/Xw8aqV065dO5sNpIDNl19+abN+3JQx88ILL5h58+bZrCDVzVF2j0PZOupCpZo7CtQo20efM2nSJNO4cWPz1Vdf2fepq5YCLvvtt58NBJ188sk2iOP22WefmfLly9vAkCg4tfPOO9u/Fy9eHM82EgWLVCtI9txzT3PmmWfGX9NnDBkyxFx99dVm5MiR8eeV2VSlSpWE79RvWrJkif37xhtvNIsWLbJZSYMHDzZjxoyx2UmpqD6RMokAAAAAAEDuiPz78Hptq64RtN1228X/btmypQ32uM2aNcsGY1S/p2vXrjZYlJz54tTRKVu2rH2fuoTNmTPHNGjQIF5rRw8FVJR94+fvv/+20+GeJvf3KJDkZC1Vq1bNfu6aNWtstlAyBZr+/PNPM2rUqPhzCiQtXLgw4X0LFiww9evXj3cLU3e0Sy+91NYLeuqppzyzghRkUmDJecyePdv3twEA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jcq5vf3223Za165da44++miz5557mmxy0UUXbfbcoEGDsm7d/O6778yHH35o95v77ruvfWQb7X80POisWbPMHnvsYQ499FCTDW6++WazYMEC+/c111xj6tWrF39N81PTPG3aNNOlS5dQQ5kW97Emm45DV155pd2WZejQoaZixYpZdxwaMWKEfUivXr3MQQcdlHXHoXXr1pkrrrjC/l22bFlz++23Z+VxyH2sUfFPbdeOF154we6XHJ07dzYnnnhiiU/j/PnzzS233GL/1rLU/jsbj0OPP/64LZYqGi2nQ4cOWXcc+uWXX8wDDzxg/952223NBRdckJXHIW0vc+fOtX9feumlpkmTJvHXVqxYYffps2fPtss5bEHaovDJJ5+Y0aNHmwYNGthto1q1avHXpk6dal588UVbRPiUU04xjRo1KpVp1PajbXnZsmWmd+/e9jjouO666+zzcsMNN5jq1aub0vL+++/bbbhFixamX79+dkSqdF4rSTr30T5T+/fDDjssYRtfsmSJefbZZ+25iNZLHZsQDhlBW4nzzz/f3H333XaDveqqq8x///tfk22qVq1qmjdvbn799VczcuRIk41++OEHOySfDorLly83e++9t3n33XdNttFFg3PhoAubnXfe2R6ws9Fvv/1mbrzxRnPvvfeabKR1cd68eXbd1CPbghaOM888027blSpVstOp7SnbOPNQDx28dRCvWbOmySY6mdQJmi5iIpGIDQTogjubaN5pGFBdJGg5X3311Xb/ng10gq3lO2zYMLNo0aKE184++2xz33332ePQZZddZu66666sO9Zk03GoWbNmpmnTpnbf6ASEsu04VKNGDTu/NE061mTjcUjbsaZR+5r7778/a49DtWvXttOpi9mJEycmvPa///3PXkSW9nFIgTR9v+bpk08+mbXHofr169vvf+edd+y2nI3HIe0HNQ3ahp3gczYehxo2bGinUwGfv//+O/68pk3Bcq2bVapUMZdffrnn9lXc9N0KUGr9VKBCN7xXrVplX5sxY4YNuGj0JP2922672Xle0hSM0r565syZZvXq1Xb5upepAmyazxr6uzSmz3HSSSfFhyPXMtc0b9y4MfC1kqTjyYEHHmgDPf/8849dD0eNGmVf078VNP3999/ttqNAcLacH+UkjRqG3LZw4cJYxYoVY3PnzrX/njBhQqxevXqx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",
"text/plain": [
"
other same-direction occultations at the same time
\n",
@@ -1009,17 +1111,17 @@
"
\n",
"
1
\n",
"
0.90
\n",
- "
693
\n",
+ "
690
\n",
"
\n",
"
\n",
"
2
\n",
"
0.90
\n",
- "
1136
\n",
+ "
1142
\n",
"
\n",
"
\n",
"
3 or more
\n",
"
0.86
\n",
- "
2335
\n",
+ "
2340
\n",
"
\n",
" \n",
"\n",
@@ -1027,9 +1129,9 @@
],
"text/plain": [
" share observed \\\n",
- "constellation GPS 0.88 \n",
+ "constellation GPS 0.87 \n",
" GLONASS 0.89 \n",
- " Galileo 0.88 \n",
+ " Galileo 0.87 \n",
"yaw from fore/aft (deg) (0, 15] 0.90 \n",
" (15, 30] 0.92 \n",
" (30, 45] 0.90 \n",
@@ -1039,7 +1141,7 @@
" (65, 70] 0.82 \n",
" (70, 75] 0.74 \n",
" (75, 80] 0.67 \n",
- " (80, 85] 0.37 \n",
+ " (80, 85] 0.32 \n",
"direction rising 0.85 \n",
" setting 0.91 \n",
"other same-direction occultations at the same time 0 0.92 \n",
@@ -1048,9 +1150,9 @@
" 3 or more 0.86 \n",
"\n",
" predicted \n",
- "constellation GPS 1578 \n",
+ "constellation GPS 1582 \n",
" GLONASS 1201 \n",
- " Galileo 1581 \n",
+ " Galileo 1585 \n",
"yaw from fore/aft (deg) (0, 15] 945 \n",
" (15, 30] 1087 \n",
" (30, 45] 1148 \n",
@@ -1060,13 +1162,13 @@
" (65, 70] 92 \n",
" (70, 75] 105 \n",
" (75, 80] 64 \n",
- " (80, 85] 51 \n",
- "direction rising 2183 \n",
- " setting 2177 \n",
+ " (80, 85] 59 \n",
+ "direction rising 2186 \n",
+ " setting 2182 \n",
"other same-direction occultations at the same time 0 196 \n",
- " 1 693 \n",
- " 2 1136 \n",
- " 3 or more 2335 "
+ " 1 690 \n",
+ " 2 1142 \n",
+ " 3 or more 2340 "
]
},
"execution_count": 6,
@@ -1078,19 +1180,28 @@
"seen_rate = pred.groupby([\"receiver\", \"transmitter\"])[\"seen\"].transform(\"mean\")\n",
"tracked = pred[seen_rate > 0.1]\n",
"groups = {\n",
- " \"constellation\": pd.Categorical(tracked.constellation, categories=list(CONSTELLATIONS.values())),\n",
+ " \"constellation\": pd.Categorical(\n",
+ " tracked.constellation, categories=list(CONSTELLATIONS.values())\n",
+ " ),\n",
" # arcs cut off by the yaw limit report a yaw of exactly max_yaw (up to round-off)\n",
" \"yaw from fore/aft (deg)\": pd.cut(\n",
- " tracked.yaw.clip(upper=MAX_YAW), [b for b in [0, 15, 30, 45, 55, 60, 65, 70, 75, 80] if b < MAX_YAW] + [MAX_YAW]\n",
+ " tracked.yaw.clip(upper=MAX_YAW),\n",
+ " [b for b in [0, 15, 30, 45, 55, 60, 65, 70, 75, 80] if b < MAX_YAW] + [MAX_YAW],\n",
" ),\n",
" \"direction\": tracked.is_rising.map({True: \"rising\", False: \"setting\"}),\n",
" \"other same-direction occultations at the same time\": pd.Categorical(\n",
- " tracked.concurrent.clip(upper=3).astype(str).replace(\"3\", \"3 or more\"), categories=[\"0\", \"1\", \"2\", \"3 or more\"]\n",
+ " tracked.concurrent.clip(upper=3).astype(str).replace(\"3\", \"3 or more\"),\n",
+ " categories=[\"0\", \"1\", \"2\", \"3 or more\"],\n",
" ),\n",
"}\n",
- "print(f\"{len(tracked)} of {len(pred)} predicted occultations in receiver-transmitter combinations observed at least 10% of the time\")\n",
+ "print(\n",
+ " f\"{len(tracked)} of {len(pred)} predicted occultations in receiver-transmitter combinations observed at least 10% of the time\"\n",
+ ")\n",
"pd.concat(\n",
- " {name: tracked.groupby(key, observed=True)[\"seen\"].agg([\"mean\", \"size\"]) for name, key in groups.items()}\n",
+ " {\n",
+ " name: tracked.groupby(key, observed=True)[\"seen\"].agg([\"mean\", \"size\"])\n",
+ " for name, key in groups.items()\n",
+ " }\n",
").rename(columns={\"mean\": \"share observed\", \"size\": \"predicted\"}).round(2)"
]
},
@@ -1099,7 +1210,7 @@
"id": "cedb8daf",
"metadata": {},
"source": [
- "Unlike COSMIC-2, PlanetiQ tracks the three constellations alike (86 to 90% of predicted occultations recorded for every receiver and constellation) and shows no extended data gaps: both receivers recorded at least 64% of the predicted occultations in every hour. The one exception is GLONASS R19, which both receivers recorded for only 18% of its predicted occultations, although COSMIC-2 recorded most of them; every other transmitter was recorded at least 68% of the time (lowest for Galileo E19 and GPS G25). The recorded share is nearly independent of yaw angle up to 65 deg (81 to 93% for each constellation) and falls beyond it as PlanetiQ's antenna coverage tapers off: to 71 to 89% between 65 and 75 deg, 59 to 76% between 75 and 80 deg, and 37% between 80 and 85 deg, where GLONASS (71%) fares much better than GPS (31%) and Galileo (11%). Setting occultations were recorded more often than rising ones for GPS and Galileo (91 to 92% vs 83 to 84%) but hardly for GLONASS (90% vs 88%), and the share decreases only slightly when several occultations compete for the same receiver. Since TAT-C predicts all of PlanetiQ's recorded occultations, PlanetiQ recorded 88% (GPS and Galileo) to 89% (GLONASS) as many occultations as TAT-C predicts with an 85 deg `max_yaw`.\n",
+ "Unlike COSMIC-2, PlanetiQ tracks the three constellations alike (85 to 90% of predicted occultations recorded for every receiver and constellation) and shows no extended data gaps: both receivers recorded at least 64% of the predicted occultations in every hour. The one exception is GLONASS R19, which both receivers recorded for only 18% of its predicted occultations, although COSMIC-2 recorded most of them; every other transmitter was recorded at least 66% of the time (lowest for Galileo E19, then GPS G17 and G25). The recorded share is nearly independent of yaw angle up to 65 deg (81 to 93% for each constellation) and falls beyond it as PlanetiQ's antenna coverage tapers off: to 74 to 86% between 65 and 75 deg, 59 to 77% between 75 and 80 deg, and 32% between 80 and 85 deg, where GLONASS (71%) fares much better than GPS (25%) and Galileo (9%). Setting occultations were recorded more often than rising ones for GPS and Galileo (91 to 92% vs 83 to 84%) but hardly for GLONASS (90% vs 88%), and the share decreases only slightly when several occultations compete for the same receiver. Since TAT-C predicts all of PlanetiQ's recorded occultations, PlanetiQ recorded 87% (GPS and Galileo) to 89% (GLONASS) as many occultations as TAT-C predicts with an 85 deg `max_yaw`.\n",
"\n",
"## Test 4: Timing and Location of Matched Occultations\n",
"\n",
@@ -1112,10 +1223,10 @@
"id": "cbe65f5a",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:02.612371Z",
- "iopub.status.busy": "2026-10-08T18:04:02.612371Z",
- "iopub.status.idle": "2026-10-08T18:04:08.729104Z",
- "shell.execute_reply": "2026-10-08T18:04:08.729104Z"
+ "iopub.execute_input": "2026-10-25T20:53:28.031794Z",
+ "iopub.status.busy": "2026-10-25T20:53:28.031536Z",
+ "iopub.status.idle": "2026-10-25T20:53:33.396577Z",
+ "shell.execute_reply": "2026-10-25T20:53:33.395762Z"
}
},
"outputs": [
@@ -1152,7 +1263,7 @@
" \n",
" \n",
"
\n",
- "
GPS
\n",
+ "
GPS
\n",
"
TAT-C time minus true time at -80 km (s)
\n",
"
200.0
\n",
"
0.013
\n",
@@ -1163,17 +1274,27 @@
"
0.366
\n",
"
\n",
"
\n",
+ "
|TAT-C time minus true time| at -80 km (s)
\n",
+ "
200.0
\n",
+ "
0.103
\n",
+ "
0.079
\n",
+ "
0.000
\n",
+ "
0.090
\n",
+ "
0.251
\n",
+ "
0.371
\n",
+ "
\n",
+ "
\n",
"
TAT-C position: -80 km point to truth (km)
\n",
"
200.0
\n",
"
0.454
\n",
"
0.364
\n",
"
0.012
\n",
- "
0.332
\n",
- "
1.164
\n",
- "
1.851
\n",
+ "
0.335
\n",
+ "
1.162
\n",
+ "
1.846
\n",
"
\n",
"
\n",
- "
GLONASS
\n",
+ "
GLONASS
\n",
"
TAT-C time minus true time at -80 km (s)
\n",
"
200.0
\n",
"
0.018
\n",
@@ -1184,17 +1305,27 @@
"
0.508
\n",
"
\n",
"
\n",
+ "
|TAT-C time minus true time| at -80 km (s)
\n",
+ "
200.0
\n",
+ "
0.103
\n",
+ "
0.081
\n",
+ "
0.001
\n",
+ "
0.084
\n",
+ "
0.245
\n",
+ "
0.508
\n",
+ "
\n",
+ "
\n",
"
TAT-C position: -80 km point to truth (km)
\n",
"
200.0
\n",
- "
0.498
\n",
- "
0.438
\n",
- "
0.008
\n",
- "
0.368
\n",
- "
1.220
\n",
- "
3.075
\n",
+ "
0.497
\n",
+ "
0.437
\n",
+ "
0.009
\n",
+ "
0.372
\n",
+ "
1.213
\n",
+ "
3.080
\n",
"
\n",
"
\n",
- "
Galileo
\n",
+ "
Galileo
\n",
"
TAT-C time minus true time at -80 km (s)
\n",
"
200.0
\n",
"
-0.003
\n",
@@ -1205,13 +1336,23 @@
"
0.578
\n",
"
\n",
"
\n",
+ "
|TAT-C time minus true time| at -80 km (s)
\n",
+ "
200.0
\n",
+ "
0.099
\n",
+ "
0.098
\n",
+ "
0.000
\n",
+ "
0.075
\n",
+ "
0.263
\n",
+ "
0.692
\n",
+ "
\n",
+ "
\n",
"
TAT-C position: -80 km point to truth (km)
\n",
"
200.0
\n",
- "
0.466
\n",
+ "
0.465
\n",
"
0.554
\n",
- "
0.020
\n",
- "
0.335
\n",
- "
1.179
\n",
+ "
0.025
\n",
+ "
0.334
\n",
+ "
1.184
\n",
"
4.108
\n",
"
\n",
" \n",
@@ -1221,19 +1362,25 @@
"text/plain": [
" count mean std \\\n",
"GPS TAT-C time minus true time at -80 km (s) 200.0 0.013 0.129 \n",
+ " |TAT-C time minus true time| at -80 km (s) 200.0 0.103 0.079 \n",
" TAT-C position: -80 km point to truth (km) 200.0 0.454 0.364 \n",
"GLONASS TAT-C time minus true time at -80 km (s) 200.0 0.018 0.129 \n",
- " TAT-C position: -80 km point to truth (km) 200.0 0.498 0.438 \n",
+ " |TAT-C time minus true time| at -80 km (s) 200.0 0.103 0.081 \n",
+ " TAT-C position: -80 km point to truth (km) 200.0 0.497 0.437 \n",
"Galileo TAT-C time minus true time at -80 km (s) 200.0 -0.003 0.140 \n",
- " TAT-C position: -80 km point to truth (km) 200.0 0.466 0.554 \n",
+ " |TAT-C time minus true time| at -80 km (s) 200.0 0.099 0.098 \n",
+ " TAT-C position: -80 km point to truth (km) 200.0 0.465 0.554 \n",
"\n",
" min 50% 95% max \n",
"GPS TAT-C time minus true time at -80 km (s) -0.371 0.004 0.212 0.366 \n",
- " TAT-C position: -80 km point to truth (km) 0.012 0.332 1.164 1.851 \n",
+ " |TAT-C time minus true time| at -80 km (s) 0.000 0.090 0.251 0.371 \n",
+ " TAT-C position: -80 km point to truth (km) 0.012 0.335 1.162 1.846 \n",
"GLONASS TAT-C time minus true time at -80 km (s) -0.229 0.007 0.245 0.508 \n",
- " TAT-C position: -80 km point to truth (km) 0.008 0.368 1.220 3.075 \n",
+ " |TAT-C time minus true time| at -80 km (s) 0.001 0.084 0.245 0.508 \n",
+ " TAT-C position: -80 km point to truth (km) 0.009 0.372 1.213 3.080 \n",
"Galileo TAT-C time minus true time at -80 km (s) -0.692 0.004 0.184 0.578 \n",
- " TAT-C position: -80 km point to truth (km) 0.020 0.335 1.179 4.108 "
+ " |TAT-C time minus true time| at -80 km (s) 0.000 0.075 0.263 0.692 \n",
+ " TAT-C position: -80 km point to truth (km) 0.025 0.334 1.184 4.108 "
]
},
"execution_count": 7,
@@ -1278,10 +1425,16 @@
"# from the recorded receiver and transmitter positions (subsampled to 10 Hz)\n",
"truth = {}\n",
"for record in sample._data:\n",
- " l1 = nc.Dataset(os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"])))\n",
+ " l1 = nc.Dataset(\n",
+ " os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"]))\n",
+ " )\n",
" l1.set_auto_mask(False)\n",
" t, rx, tx = l1[\"time\"][:], l1[\"positionLEO\"][:].T, l1[\"positionGNSS\"][:].T\n",
- " ok = (np.abs(t) < 1e10) & np.all(np.abs(rx) < 1e10, axis=0) & np.all(np.abs(tx) < 1e10, axis=0)\n",
+ " ok = (\n",
+ " (np.abs(t) < 1e10)\n",
+ " & np.all(np.abs(rx) < 1e10, axis=0)\n",
+ " & np.all(np.abs(tx) < 1e10, axis=0)\n",
+ " )\n",
" i = np.nonzero(ok)[0][::10]\n",
" start = float(l1[\"startTime\"][...])\n",
" # GPS seconds since 1980-01-06 are TAI - 19 s\n",
@@ -1289,7 +1442,11 @@
" t_80 = crossing(t[i], to_lla(points)[2], -80e3)\n",
" if np.isfinite(t_80):\n",
" lon, lat, _ = to_lla(interpolate(t[i], points, [t_80]))\n",
- " truth[record[\"occid\"]] = (GPS_EPOCH + timedelta(seconds=start - GPS_UTC_OFFSET + t_80), lon[0], lat[0])\n",
+ " truth[record[\"occid\"]] = (\n",
+ " GPS_EPOCH + timedelta(seconds=start - GPS_UTC_OFFSET + t_80),\n",
+ " lon[0],\n",
+ " lat[0],\n",
+ " )\n",
"\n",
"rows = []\n",
"for i, j in zip(pairs.pred, pairs.obs):\n",
@@ -1299,14 +1456,25 @@
" rows.append(\n",
" {\n",
" \"constellation\": o.constellation,\n",
- " \"TAT-C time minus true time at -80 km (s)\": (p.time.to_pydatetime() - true_time).total_seconds(),\n",
- " \"TAT-C position: -80 km point to truth (km)\": GEOD.inv(p.position.x, p.position.y, lon, lat)[2] / 1e3,\n",
+ " \"TAT-C time minus true time at -80 km (s)\": (\n",
+ " p.time.to_pydatetime() - true_time\n",
+ " ).total_seconds(),\n",
+ " \"|TAT-C time minus true time| at -80 km (s)\": abs(\n",
+ " (p.time.to_pydatetime() - true_time).total_seconds()\n",
+ " ),\n",
+ " \"TAT-C position: -80 km point to truth (km)\": GEOD.inv(\n",
+ " p.position.x, p.position.y, lon, lat\n",
+ " )[2]\n",
+ " / 1e3,\n",
" }\n",
" )\n",
"accuracy = pd.DataFrame(rows)\n",
"pd.concat(\n",
" {\n",
- " c: accuracy[accuracy.constellation == c].drop(columns=\"constellation\").describe(percentiles=[0.5, 0.95]).T\n",
+ " c: accuracy[accuracy.constellation == c]\n",
+ " .drop(columns=\"constellation\")\n",
+ " .describe(percentiles=[0.5, 0.95])\n",
+ " .T\n",
" for c in CONSTELLATIONS.values()\n",
" }\n",
").round(3)"
@@ -1317,7 +1485,7 @@
"id": "ca89b353",
"metadata": {},
"source": [
- "For all three constellations, TAT-C's `time` agrees with the true time at which the straight line reaches -80 km to within 0.18 to 0.25 s (95th percentile), and its `position` with the true straight-line tangent point to 0.33 to 0.37 km (median) and 1.2 km (95th percentile), for all 200 sampled occultations of each constellation, limited by orbit accuracy."
+ "For all three constellations, TAT-C's `time` agrees with the true time at which the straight line reaches -80 km to within 0.25 to 0.26 s (95th percentile of the absolute difference, with a mean difference of at most 0.02 s), and its `position` with the true straight-line tangent point to 0.33 to 0.37 km (median) and 1.2 km (95th percentile), for all 200 sampled occultations of each constellation, limited by orbit accuracy."
]
},
{
@@ -1330,13 +1498,13 @@
"| Test | Result |\n",
"| --- | --- |\n",
"| 1. Orbits (TLEs vs. recorded positions) | All 71 transmitters (26 GPS, 19 GLONASS, 26 Galileo) and both receivers identified; within about 5 km (GPS), 7 km (GLONASS), and 16 km (Galileo), with no element sets excluded |\n",
- "| 2. Predicted vs. observed (`max_yaw` = 85 deg) | All 3,838 observed occultations predicted, with correct rising/setting; 88% of the 4,360 predicted occultations recorded (88 to 89% per constellation) |\n",
- "| 3. Detection | Constellations tracked alike, with no untracked combinations or data gaps (except GLONASS R19, 18% recorded); recorded share nearly independent of yaw angle up to 65 deg, falling to 37% at 80-85 deg |\n",
- "| 4. Timing and location | `time` within 0.18 to 0.25 s (95th percentile); `position` 0.33 to 0.37 km (median) and 1.2 km (95th percentile) from the true tangent point |\n",
+ "| 2. Predicted vs. observed (`max_yaw` = 85 deg) | All 3,838 observed occultations predicted, with correct rising/setting; 88% of the 4,368 predicted occultations recorded (87 to 89% per constellation) |\n",
+ "| 3. Detection | Constellations tracked alike, with no untracked combinations or data gaps (except GLONASS R19, 18% recorded); recorded share nearly independent of yaw angle up to 65 deg, falling to 32% at 80-85 deg |\n",
+ "| 4. Timing and location | `time` within 0.25 to 0.26 s (95th percentile); `position` 0.33 to 0.37 km (median) and 1.2 km (95th percentile) from the true tangent point |\n",
"\n",
"**TAT-C's RO geometry is validated for a polar orbit and three constellations.** With published orbits and a `max_yaw` of 85 deg, `collect_ro_observations` predicts every GPS, GLONASS, and Galileo occultation PlanetiQ recorded on this day, labels each correctly as rising or setting, and reports its time to a fraction of a second and its position to a third of a kilometer (median), limited by orbit accuracy. PlanetiQ recorded 88% of TAT-C's predictions, with no untracked transmitters or data gaps apart from GLONASS R19, so predicted counts are close to recorded counts for every constellation.\n",
"\n",
- "**PlanetiQ's coverage extends beyond the default `max_yaw`.** The 65 deg default matches COSMIC-2's coverage, but PlanetiQ observes occultations up to 84 deg from its forward or rearward direction for all three constellations, and a `max_yaw` of 85 deg predicts all of them. Predictions beyond 65 deg are recorded progressively less often as the antenna coverage tapers off (59 to 76% between 75 and 80 deg and 37% between 80 and 85 deg), so they add more predicted than recorded occultations; a smaller `max_yaw` trades a few missed occultations for a closer match between predicted and recorded counts.\n",
+ "**PlanetiQ's coverage extends beyond the default `max_yaw`.** The 65 deg default matches COSMIC-2's coverage, but PlanetiQ observes occultations up to 84 deg from its forward or rearward direction for all three constellations, and a `max_yaw` of 85 deg predicts all of them. Predictions beyond 65 deg are recorded progressively less often as the antenna coverage tapers off (59 to 77% between 75 and 80 deg and 32% between 80 and 85 deg), so they add more predicted than recorded occultations; a smaller `max_yaw` trades a few missed occultations for a closer match between predicted and recorded counts.\n",
"\n",
"**Next steps:**\n",
"\n",
@@ -1364,7 +1532,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.12.8"
+ "version": "3.14.9"
}
},
"nbformat": 4,
diff --git a/docs/validation/ValidateRadarNEXRAD.ipynb b/docs/validation/ValidateRadarNEXRAD.ipynb
index fe9a4904..9300f0fc 100644
--- a/docs/validation/ValidateRadarNEXRAD.ipynb
+++ b/docs/validation/ValidateRadarNEXRAD.ipynb
@@ -84,7 +84,9 @@
" params[\"continuation-token\"] = token\n",
" listing = requests.get(BUCKET, params=params, timeout=60).text\n",
" keys += re.findall(r\"(.*?)\", listing)\n",
- " match = re.search(r\"(.*?)\", listing)\n",
+ " match = re.search(\n",
+ " r\"(.*?)\", listing\n",
+ " )\n",
" if match is None:\n",
" return [key for key in keys if key.endswith(\"_V06\")]\n",
" token = match.group(1)\n",
@@ -101,7 +103,9 @@
" data, chunk = b\"\", 2**21\n",
" while True:\n",
" response = requests.get(\n",
- " BUCKET + key, headers={\"Range\": f\"bytes={len(data)}-{len(data) + chunk - 1}\"}, timeout=120\n",
+ " BUCKET + key,\n",
+ " headers={\"Range\": f\"bytes={len(data)}-{len(data) + chunk - 1}\"},\n",
+ " timeout=120,\n",
" )\n",
" if response.status_code == 206:\n",
" data += response.content\n",
@@ -112,7 +116,11 @@
" if end + 4 + size > len(data):\n",
" break\n",
" end, count = end + 4 + size, count + 1\n",
- " if count == n_records or response.status_code != 206 or len(response.content) < chunk:\n",
+ " if (\n",
+ " count == n_records\n",
+ " or response.status_code != 206\n",
+ " or len(response.content) < chunk\n",
+ " ):\n",
" return data[:end]\n",
"\n",
"\n",
@@ -125,7 +133,9 @@
" \"\"\"Number of records from the start of a volume through the first cut at or above an elevation angle.\"\"\"\n",
" n_records = 1 # metadata record\n",
" for cut in Level2File(io.BytesIO(raw)).vcp_info.els:\n",
- " n_records += (720 if \"0.5 azimuth and 0.25km range res.\" in cut.super_res else 360) // 120\n",
+ " n_records += (\n",
+ " 720 if \"0.5 azimuth and 0.25km range res.\" in cut.super_res else 360\n",
+ " ) // 120\n",
" if wrap(cut.el_angle) >= angle - 0.1:\n",
" break\n",
" return n_records + 1 # one record of margin\n",
@@ -148,8 +158,12 @@
" header = sweep[0][4][b\"REF\"][0]\n",
" sweeps.append(\n",
" {\n",
- " \"commanded\": round(wrap(radar.vcp_info.els[sweep[0][0].el_num - 1].el_angle), 2),\n",
- " \"measured\": float(np.median([wrap(radial[0].el_angle) for radial in sweep])),\n",
+ " \"commanded\": round(\n",
+ " wrap(radar.vcp_info.els[sweep[0][0].el_num - 1].el_angle), 2\n",
+ " ),\n",
+ " \"measured\": float(\n",
+ " np.median([wrap(radial[0].el_angle) for radial in sweep])\n",
+ " ),\n",
" \"radials\": len(sweep),\n",
" \"ref_range\": header.first_gate + header.gate_width * header.num_gates,\n",
" }\n",
@@ -277,7 +291,9 @@
" with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
" reduced = list(pool.map(reduce_volume, jobs))\n",
" pd.DataFrame([volume for volume, _ in reduced]).to_csv(VOLUMES_FILE, index=False)\n",
- " pd.DataFrame([sweep for _, sweeps in reduced for sweep in sweeps]).to_csv(SWEEPS_FILE, index=False)\n",
+ " pd.DataFrame([sweep for _, sweeps in reduced for sweep in sweeps]).to_csv(\n",
+ " SWEEPS_FILE, index=False\n",
+ " )\n",
"\n",
"volumes = pd.read_csv(VOLUMES_FILE, parse_dates=[\"time\"])\n",
"sweeps = pd.read_csv(SWEEPS_FILE, parse_dates=[\"time\"])\n",
@@ -386,12 +402,18 @@
" continue # Doppler-only cut of a split cut, or an incomplete sweep\n",
" header = moments[b\"REF\"][0]\n",
" n_gates = int((RANGE_BINS - header.first_gate) / header.gate_width)\n",
- " range_bin = (header.first_gate + header.gate_width * np.arange(n_gates)).astype(int)\n",
+ " range_bin = (header.first_gate + header.gate_width * np.arange(n_gates)).astype(\n",
+ " int\n",
+ " )\n",
" z, n = np.zeros((360, RANGE_BINS)), np.zeros((360, RANGE_BINS))\n",
" for radial in sweep:\n",
" dbz = radial[4][b\"REF\"][1][:n_gates]\n",
" azimuth = int(radial[0].az_angle) % 360\n",
- " np.add.at(z[azimuth], range_bin[: len(dbz)], np.where(np.isfinite(dbz), 10 ** (dbz / 10), 0))\n",
+ " np.add.at(\n",
+ " z[azimuth],\n",
+ " range_bin[: len(dbz)],\n",
+ " np.where(np.isfinite(dbz), 10 ** (dbz / 10), 0),\n",
+ " )\n",
" np.add.at(n[azimuth], range_bin[: len(dbz)], 1)\n",
" commanded = round(wrap(radar.vcp_info.els[sweep[0][0].el_num - 1].el_angle), 1)\n",
" measured = np.median([wrap(radial[0].el_angle) for radial in sweep])\n",
@@ -405,9 +427,16 @@
" keys = [key for day in EVENTS for key in list_volumes(day, station)[::6]]\n",
" with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
" results = list(pool.map(accumulate, keys))\n",
- " tilts = sorted({tilt for _, volume in results for tilt in volume if tilt <= REFERENCE_TILT})\n",
+ " tilts = sorted(\n",
+ " {tilt for _, volume in results for tilt in volume if tilt <= REFERENCE_TILT}\n",
+ " )\n",
" shape = (len(tilts), 360, RANGE_BINS)\n",
- " z, n, z_ref, n_ref = np.zeros(shape), np.zeros(shape), np.zeros(shape), np.zeros(shape)\n",
+ " z, n, z_ref, n_ref = (\n",
+ " np.zeros(shape),\n",
+ " np.zeros(shape),\n",
+ " np.zeros(shape),\n",
+ " np.zeros(shape),\n",
+ " )\n",
" measured = [[] for _ in tilts]\n",
" for _, volume in results:\n",
" if REFERENCE_TILT not in volume:\n",
@@ -514,13 +543,17 @@
" height = compute_radar_beam_height(slant_range, elevation_angle, antenna)\n",
" theta = np.radians(elevation_angle)\n",
" return EFFECTIVE_RADIUS * np.arcsin(\n",
- " np.minimum(slant_range * np.cos(theta) / (EFFECTIVE_RADIUS + height - antenna), 1)\n",
+ " np.minimum(\n",
+ " slant_range * np.cos(theta) / (EFFECTIVE_RADIUS + height - antenna), 1\n",
+ " )\n",
" )\n",
"\n",
"\n",
"def interpolate_mask(mask):\n",
" \"\"\"Minimum elevation angle (deg) of a terrain mask at 1-deg azimuth bin centers.\"\"\"\n",
- " return np.array([mask.get_min_elevation_angle(azimuth) for azimuth in np.arange(360) + 0.5])\n",
+ " return np.array(\n",
+ " [mask.get_min_elevation_angle(azimuth) for azimuth in np.arange(360) + 0.5]\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
@@ -677,14 +710,24 @@
"NCEI_FILE = DATA_DIR / \"nexrad-stations.txt\"\n",
"if not NCEI_FILE.exists():\n",
" NCEI_FILE.write_bytes(\n",
- " requests.get(\"https://www.ncei.noaa.gov/access/homr/file/nexrad-stations.txt\", timeout=60).content\n",
+ " requests.get(\n",
+ " \"https://www.ncei.noaa.gov/access/homr/file/nexrad-stations.txt\", timeout=60\n",
+ " ).content\n",
" )\n",
- "lines = [line for line in NCEI_FILE.read_text(encoding=\"utf-8\").splitlines() if line.strip()]\n",
+ "lines = [\n",
+ " line for line in NCEI_FILE.read_text(encoding=\"utf-8\").splitlines() if line.strip()\n",
+ "]\n",
"spans = [(m.start(), m.end()) for m in re.finditer(r\"-+\", lines[1])]\n",
- "ncei = pd.read_fwf(io.StringIO(\"\\n\".join(lines)), colspecs=spans, skiprows=[1]).set_index(\"ICAO\")\n",
+ "ncei = pd.read_fwf(\n",
+ " io.StringIO(\"\\n\".join(lines)), colspecs=spans, skiprows=[1]\n",
+ ").set_index(\"ICAO\")\n",
"\n",
- "pyproj.network.set_network_enabled(True) # downloads the EGM96 geoid grid if not installed\n",
- "to_ellipsoid = pyproj.Transformer.from_crs(\"EPSG:4326+5773\", \"EPSG:4979\", always_xy=True)\n",
+ "pyproj.network.set_network_enabled(\n",
+ " True\n",
+ ") # downloads the EGM96 geoid grid if not installed\n",
+ "to_ellipsoid = pyproj.Transformer.from_crs(\n",
+ " \"EPSG:4326+5773\", \"EPSG:4979\", always_xy=True\n",
+ ")\n",
"\n",
"site = volumes.groupby(\"station\")[[\"lat\", \"lon\", \"ground\", \"feedhorn\"]].first()\n",
"site[\"antenna\"] = site.ground + site.feedhorn\n",
@@ -693,7 +736,9 @@
" lat, lon, elevation = EXAMPLE[name]\n",
" undulation = to_ellipsoid.transform(site.lon[name], site.lat[name], 0)[2]\n",
" test1[name] = {\n",
- " \"example horizontal offset (m)\": GEOD.inv(lon, lat, site.lon[name], site.lat[name])[2],\n",
+ " \"example horizontal offset (m)\": GEOD.inv(\n",
+ " lon, lat, site.lon[name], site.lat[name]\n",
+ " )[2],\n",
" \"NCEI horizontal offset (m)\": GEOD.inv(\n",
" ncei.LON[name], ncei.LAT[name], site.lon[name], site.lat[name]\n",
" )[2],\n",
@@ -868,22 +913,37 @@
}
],
"source": [
- "cuts = sweeps.groupby([\"station\", \"key\", \"commanded\"]).agg(measured=(\"measured\", \"median\"), ref_range=(\"ref_range\", \"max\")).reset_index()\n",
- "per_volume = cuts.groupby([\"station\", \"key\"]).agg(\n",
- " lowest=(\"measured\", \"min\"), highest=(\"measured\", \"max\"), n_cuts=(\"measured\", \"size\"), ref_range=(\"ref_range\", \"max\")\n",
- ").join(volumes.set_index([\"station\", \"key\"])[[\"vcp\", \"planned_top\"]])\n",
+ "cuts = (\n",
+ " sweeps.groupby([\"station\", \"key\", \"commanded\"])\n",
+ " .agg(measured=(\"measured\", \"median\"), ref_range=(\"ref_range\", \"max\"))\n",
+ " .reset_index()\n",
+ ")\n",
+ "per_volume = (\n",
+ " cuts.groupby([\"station\", \"key\"])\n",
+ " .agg(\n",
+ " lowest=(\"measured\", \"min\"),\n",
+ " highest=(\"measured\", \"max\"),\n",
+ " n_cuts=(\"measured\", \"size\"),\n",
+ " ref_range=(\"ref_range\", \"max\"),\n",
+ " )\n",
+ " .join(volumes.set_index([\"station\", \"key\"])[[\"vcp\", \"planned_top\"]])\n",
+ ")\n",
"test2 = {}\n",
"for name in STATIONS:\n",
" v = per_volume.loc[name]\n",
" vcps = pd.Series(blockage[name][\"vcp\"]).value_counts(normalize=True)\n",
" test2[name] = {\n",
- " \"VCPs used (share)\": \", \".join(f\"{vcp} ({share:.0%})\" for vcp, share in vcps.items()),\n",
+ " \"VCPs used (share)\": \", \".join(\n",
+ " f\"{vcp} ({share:.0%})\" for vcp, share in vcps.items()\n",
+ " ),\n",
" \"lowest tilt (deg)\": v.lowest.median(),\n",
" \"highest tilt, VCP 212: min (deg)\": v.highest[v.vcp == 212].min(),\n",
" \"highest tilt, VCP 212: median (deg)\": v.highest[v.vcp == 212].median(),\n",
" \"highest tilt, VCP 212: max (deg)\": v.highest[v.vcp == 212].max(),\n",
" \"highest tilt, VCP 35: median (deg)\": v.highest[v.vcp == 35].median(),\n",
- " \"VCP 212 volumes ended early\": np.mean(v.highest[v.vcp == 212] < v.planned_top[v.vcp == 212] - 0.2),\n",
+ " \"VCP 212 volumes ended early\": np.mean(\n",
+ " v.highest[v.vcp == 212] < v.planned_top[v.vcp == 212] - 0.2\n",
+ " ),\n",
" \"reflectivity range, low tilts (km)\": v.ref_range.median(),\n",
" }\n",
"pd.DataFrame(test2).round(2)"
@@ -939,18 +999,47 @@
" )\n",
" example = example_stations[name]\n",
" s = np.linspace(0, example.max_range, 300)\n",
- " lowest, highest = example.min_elevation_angle - example.beam_width / 2, example.get_effective_max_elevation_angle()\n",
+ " lowest, highest = (\n",
+ " example.min_elevation_angle - example.beam_width / 2,\n",
+ " example.get_effective_max_elevation_angle(),\n",
+ " )\n",
" arc = np.linspace(lowest, highest, 100)\n",
" for x, y in [\n",
- " *[(ground_range(s, el, example.elevation), compute_radar_beam_height(s, el, example.elevation)) for el in (lowest, highest)],\n",
- " (ground_range(example.max_range, arc, example.elevation), compute_radar_beam_height(example.max_range, arc, example.elevation)),\n",
+ " *[\n",
+ " (\n",
+ " ground_range(s, el, example.elevation),\n",
+ " compute_radar_beam_height(s, el, example.elevation),\n",
+ " )\n",
+ " for el in (lowest, highest)\n",
+ " ],\n",
+ " (\n",
+ " ground_range(example.max_range, arc, example.elevation),\n",
+ " compute_radar_beam_height(example.max_range, arc, example.elevation),\n",
+ " ),\n",
" ]:\n",
" ax.plot(x / 1e3, y / 1e3, color=ORANGE, lw=1.5)\n",
" for height in HEIGHTS:\n",
" ax.axhline(height / 1e3, color=GRAY, ls=\":\", lw=1)\n",
- " ax.plot([], [], color=BLUE, alpha=0.4, lw=6, label=f\"Level II beams ({volume_time(key):%d %b %H:%M} UTC)\")\n",
- " ax.plot([], [], color=ORANGE, label=f\"TAT-C example ({lowest:.2f} to {highest:.2f} deg, {example.max_range / 1e3:.0f} km)\")\n",
- " ax.set(xlim=(0, 470), ylim=(0, 16), xlabel=\"Ground range (km)\", title=f\"{name} (antenna {antenna:.0f} m MSL)\")\n",
+ " ax.plot(\n",
+ " [],\n",
+ " [],\n",
+ " color=BLUE,\n",
+ " alpha=0.4,\n",
+ " lw=6,\n",
+ " label=f\"Level II beams ({volume_time(key):%d %b %H:%M} UTC)\",\n",
+ " )\n",
+ " ax.plot(\n",
+ " [],\n",
+ " [],\n",
+ " color=ORANGE,\n",
+ " label=f\"TAT-C example ({lowest:.2f} to {highest:.2f} deg, {example.max_range / 1e3:.0f} km)\",\n",
+ " )\n",
+ " ax.set(\n",
+ " xlim=(0, 470),\n",
+ " ylim=(0, 16),\n",
+ " xlabel=\"Ground range (km)\",\n",
+ " title=f\"{name} (antenna {antenna:.0f} m MSL)\",\n",
+ " )\n",
" ax.legend(frameon=False, loc=\"upper right\", fontsize=8)\n",
"axes[0].set_ylabel(\"Height (km MSL)\")\n",
"fig.tight_layout()\n",
@@ -1204,7 +1293,10 @@
" warnings.simplefilter(\"ignore\", RuntimeWarning) # all-NaN azimuths\n",
" deficit = np.nanmedian(ratio[lower], axis=2)\n",
" deficit[np.sum(np.isfinite(ratio[lower]), axis=2) < 10] = np.nan\n",
- " return deficit - np.nanpercentile(deficit, 75, axis=1, keepdims=True), stats[\"measured\"][lower]\n",
+ " return (\n",
+ " deficit - np.nanpercentile(deficit, 75, axis=1, keepdims=True),\n",
+ " stats[\"measured\"][lower],\n",
+ " )\n",
"\n",
"\n",
"deficits = {name: blockage_deficit(blockage[name]) for name in STATIONS}\n",
@@ -1266,11 +1358,20 @@
"fig, axes = plt.subplots(4, 1, figsize=(11, 12))\n",
"for ax, name in zip(axes, STATIONS):\n",
" deficit, tilts = deficits[name]\n",
- " edges = np.r_[tilts[0] - (tilts[1] - tilts[0]) / 2, (tilts[1:] + tilts[:-1]) / 2, tilts[-1] + (tilts[-1] - tilts[-2]) / 2]\n",
+ " edges = np.r_[\n",
+ " tilts[0] - (tilts[1] - tilts[0]) / 2,\n",
+ " (tilts[1:] + tilts[:-1]) / 2,\n",
+ " tilts[-1] + (tilts[-1] - tilts[-2]) / 2,\n",
+ " ]\n",
" ax.set_facecolor(\"#d9d8d3\")\n",
" mesh = ax.pcolormesh(np.arange(361), edges, deficit, cmap=\"RdBu\", vmin=-15, vmax=15)\n",
" ax.plot(np.arange(360) + 0.5, mask_angle[name], color=INK, lw=1.2, label=\"DEM mask\")\n",
- " ax.set(xlim=(0, 360), ylim=(edges[0] - 0.3, edges[-1] + 0.6), ylabel=\"Elevation (deg)\", title=name)\n",
+ " ax.set(\n",
+ " xlim=(0, 360),\n",
+ " ylim=(edges[0] - 0.3, edges[-1] + 0.6),\n",
+ " ylabel=\"Elevation (deg)\",\n",
+ " title=name,\n",
+ " )\n",
" ax.set_xticks(range(0, 361, 45))\n",
" ax.grid(False)\n",
" fig.colorbar(mesh, ax=ax, label=\"Deficit (dB)\", pad=0.01)\n",
@@ -1329,7 +1430,12 @@
}
],
"source": [
- "x = np.concatenate([(mask_angle[n][np.newaxis, :] - deficits[n][1][:, np.newaxis]).ravel() for n in STATIONS])\n",
+ "x = np.concatenate(\n",
+ " [\n",
+ " (mask_angle[n][np.newaxis, :] - deficits[n][1][:, np.newaxis]).ravel()\n",
+ " for n in STATIONS\n",
+ " ]\n",
+ ")\n",
"y = np.concatenate([deficits[n][0].ravel() for n in STATIONS])\n",
"valid = np.isfinite(y)\n",
"x, y = x[valid], y[valid]\n",
@@ -1340,19 +1446,46 @@
"\n",
"edges = np.arange(-1.5, 1.51, 0.1)\n",
"centers = (edges[1:] + edges[:-1]) / 2\n",
- "quantiles = np.array([np.percentile(y[(x >= lo) & (x < hi)], [25, 50, 75]) if np.sum((x >= lo) & (x < hi)) > 5 else [np.nan] * 3 for lo, hi in zip(edges[:-1], edges[1:])])\n",
+ "quantiles = np.array(\n",
+ " [\n",
+ " (\n",
+ " np.percentile(y[(x >= lo) & (x < hi)], [25, 50, 75])\n",
+ " if np.sum((x >= lo) & (x < hi)) > 5\n",
+ " else [np.nan] * 3\n",
+ " )\n",
+ " for lo, hi in zip(edges[:-1], edges[1:])\n",
+ " ]\n",
+ ")\n",
"\n",
"fig, axes = plt.subplots(1, 2, figsize=(11, 3.8))\n",
- "axes[0].fill_between(centers, quantiles[:, 0], quantiles[:, 2], color=BLUE, alpha=0.25, lw=0, label=\"interquartile range\")\n",
+ "axes[0].fill_between(\n",
+ " centers,\n",
+ " quantiles[:, 0],\n",
+ " quantiles[:, 2],\n",
+ " color=BLUE,\n",
+ " alpha=0.25,\n",
+ " lw=0,\n",
+ " label=\"interquartile range\",\n",
+ ")\n",
"axes[0].plot(centers, quantiles[:, 1], color=BLUE, marker=\"o\", ms=3, label=\"median\")\n",
"axes[0].axhline(-3, color=GRAY, ls=\":\", lw=1)\n",
"axes[0].axvline(0, color=INK, lw=1, label=\"beam-center criterion\")\n",
- "axes[0].axvline(-BEAMWIDTH / 2, color=ORANGE, lw=1, ls=\"--\", label=\"lower half-power edge\")\n",
- "axes[0].set(xlabel=\"DEM mask angle minus tilt (deg)\", ylabel=\"Observed deficit (dB)\", title=\"Blockage vs. terrain angle\")\n",
+ "axes[0].axvline(\n",
+ " -BEAMWIDTH / 2, color=ORANGE, lw=1, ls=\"--\", label=\"lower half-power edge\"\n",
+ ")\n",
+ "axes[0].set(\n",
+ " xlabel=\"DEM mask angle minus tilt (deg)\",\n",
+ " ylabel=\"Observed deficit (dB)\",\n",
+ " title=\"Blockage vs. terrain angle\",\n",
+ ")\n",
"axes[0].legend(frameon=False, fontsize=8, loc=\"lower left\")\n",
"axes[1].plot(offsets, np.array(agreement) * 100, color=BLUE, marker=\"o\", ms=3)\n",
"axes[1].axvline(0, color=INK, lw=1)\n",
- "axes[1].set(xlabel=\"Offset (deg)\", ylabel=\"Agreement (%)\", title=\"Blocked if mask > tilt - offset\")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Offset (deg)\",\n",
+ " ylabel=\"Agreement (%)\",\n",
+ " title=\"Blocked if mask > tilt - offset\",\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()\n",
"pd.Series(\n",
@@ -1753,7 +1886,13 @@
" spans = (lower <= height) & (upper >= height)\n",
" if spans.any():\n",
" ring = np.zeros(460, dtype=bool)\n",
- " ring[np.clip((ground_range(s[spans], cut.measured, antenna) / 1e3).astype(int), 0, 459)] = True\n",
+ " ring[\n",
+ " np.clip(\n",
+ " (ground_range(s[spans], cut.measured, antenna) / 1e3).astype(int),\n",
+ " 0,\n",
+ " 459,\n",
+ " )\n",
+ " ] = True\n",
" coverage[~blocked_azimuths(name, cut.measured)] |= ring\n",
" return coverage\n",
"\n",
@@ -1783,7 +1922,12 @@
"cell_lonlat = {}\n",
"for name in STATIONS:\n",
" az, rng = np.meshgrid(GRID_AZIMUTH, GRID_RANGE, indexing=\"ij\")\n",
- " lon, lat, _ = GEOD.fwd(np.full(az.shape, site.lon[name]), np.full(az.shape, site.lat[name]), az, rng * 1e3)\n",
+ " lon, lat, _ = GEOD.fwd(\n",
+ " np.full(az.shape, site.lon[name]),\n",
+ " np.full(az.shape, site.lat[name]),\n",
+ " az,\n",
+ " rng * 1e3,\n",
+ " )\n",
" cell_lonlat[name] = (lon, lat)\n",
"\n",
"\n",
@@ -1809,19 +1953,55 @@
"rows = []\n",
"for height in HEIGHTS:\n",
" for name in STATIONS:\n",
- " example_track = rasterize(name, collect_radar_track(example_stations[name], elevation=height).geometry.iloc[0])\n",
+ " example_track = rasterize(\n",
+ " name,\n",
+ " collect_radar_track(example_stations[name], elevation=height).geometry.iloc[\n",
+ " 0\n",
+ " ],\n",
+ " )\n",
" for key in per_volume.loc[name].index:\n",
" observed = observed_coverage(name, key, height)\n",
" for config, predicted in [\n",
" (\"example\", example_track),\n",
- " (\"matched\", rasterize(name, collect_radar_track(matched_station(name, key), elevation=height).geometry.iloc[0])),\n",
- " (\"matched, beam centers\", rasterize(name, collect_radar_track(matched_station(name, key, 0), elevation=height).geometry.iloc[0])),\n",
+ " (\n",
+ " \"matched\",\n",
+ " rasterize(\n",
+ " name,\n",
+ " collect_radar_track(\n",
+ " matched_station(name, key), elevation=height\n",
+ " ).geometry.iloc[0],\n",
+ " ),\n",
+ " ),\n",
+ " (\n",
+ " \"matched, beam centers\",\n",
+ " rasterize(\n",
+ " name,\n",
+ " collect_radar_track(\n",
+ " matched_station(name, key, 0), elevation=height\n",
+ " ).geometry.iloc[0],\n",
+ " ),\n",
+ " ),\n",
" ]:\n",
- " rows.append({\"height (m)\": height, \"station\": name, \"key\": key, \"config\": config, **compare(observed, predicted)})\n",
+ " rows.append(\n",
+ " {\n",
+ " \"height (m)\": height,\n",
+ " \"station\": name,\n",
+ " \"key\": key,\n",
+ " \"config\": config,\n",
+ " **compare(observed, predicted),\n",
+ " }\n",
+ " )\n",
"test4 = pd.DataFrame(rows)\n",
- "summary4 = test4.groupby([\"height (m)\", \"station\", \"config\"], sort=False)[[\"observed area\", \"TAT-C area\", \"IoU\", \"observed inside TAT-C\"]].median()\n",
+ "summary4 = test4.groupby([\"height (m)\", \"station\", \"config\"], sort=False)[\n",
+ " [\"observed area\", \"TAT-C area\", \"IoU\", \"observed inside TAT-C\"]\n",
+ "].median()\n",
"summary4[[\"observed area\", \"TAT-C area\"]] /= 1e3\n",
- "summary4.rename(columns={\"observed area\": \"observed area (1000 km^2)\", \"TAT-C area\": \"TAT-C area (1000 km^2)\"}).unstack(\"config\").round(2)"
+ "summary4.rename(\n",
+ " columns={\n",
+ " \"observed area\": \"observed area (1000 km^2)\",\n",
+ " \"TAT-C area\": \"TAT-C area (1000 km^2)\",\n",
+ " }\n",
+ ").unstack(\"config\").round(2)"
]
},
{
@@ -1949,11 +2129,23 @@
"for height in [3048, 6096]:\n",
" for name in STATIONS:\n",
" for key in per_volume.loc[name].index:\n",
- " station = matched_station(name, key).model_copy(update={\"terrain_mask\": None})\n",
- " predicted = rasterize(name, collect_radar_track(station, elevation=height).geometry.iloc[0])\n",
- " rows.append({\"height (m)\": height, \"station\": name, **compare(observed_coverage(name, key, height), predicted)})\n",
+ " station = matched_station(name, key).model_copy(\n",
+ " update={\"terrain_mask\": None}\n",
+ " )\n",
+ " predicted = rasterize(\n",
+ " name, collect_radar_track(station, elevation=height).geometry.iloc[0]\n",
+ " )\n",
+ " rows.append(\n",
+ " {\n",
+ " \"height (m)\": height,\n",
+ " \"station\": name,\n",
+ " **compare(observed_coverage(name, key, height), predicted),\n",
+ " }\n",
+ " )\n",
"blocked_azimuths = observed_blockage\n",
- "pd.DataFrame(rows).groupby([\"height (m)\", \"station\"], sort=False)[[\"IoU\", \"observed inside TAT-C\"]].median().unstack(\"station\").round(3)"
+ "pd.DataFrame(rows).groupby([\"height (m)\", \"station\"], sort=False)[\n",
+ " [\"IoU\", \"observed inside TAT-C\"]\n",
+ "].median().unstack(\"station\").round(3)"
]
},
{
@@ -2094,21 +2286,37 @@
"source": [
"SNAPSHOT = datetime(2026, 9, 29, 12)\n",
"snapshot = {\n",
- " name: per_volume.loc[name].index[np.argmin(np.abs(volumes.set_index(\"key\").loc[per_volume.loc[name].index, \"time\"] - SNAPSHOT))]\n",
+ " name: per_volume.loc[name].index[\n",
+ " np.argmin(\n",
+ " np.abs(\n",
+ " volumes.set_index(\"key\").loc[per_volume.loc[name].index, \"time\"]\n",
+ " - SNAPSHOT\n",
+ " )\n",
+ " )\n",
+ " ]\n",
" for name in STATIONS\n",
"}\n",
- "lon_grid, lat_grid = np.meshgrid(np.arange(-118, -106.99, 0.02), np.arange(28, 38.01, 0.02))\n",
+ "lon_grid, lat_grid = np.meshgrid(\n",
+ " np.arange(-118, -106.99, 0.02), np.arange(28, 38.01, 0.02)\n",
+ ")\n",
"grid_area = np.cos(np.radians(lat_grid)) * (0.02 * 111.32) ** 2\n",
"range_edges = np.arange(461) * 1e3\n",
"corner_lonlat = {}\n",
"for name in STATIONS:\n",
" az, rng = np.meshgrid(np.arange(361), range_edges, indexing=\"ij\")\n",
- " lon, lat, _ = GEOD.fwd(np.full(az.shape, site.lon[name]), np.full(az.shape, site.lat[name]), az, rng)\n",
+ " lon, lat, _ = GEOD.fwd(\n",
+ " np.full(az.shape, site.lon[name]), np.full(az.shape, site.lat[name]), az, rng\n",
+ " )\n",
" corner_lonlat[name] = (lon, lat)\n",
"\n",
"\n",
"def observed_on_grid(name, coverage):\n",
- " az, _, dist = GEOD.inv(np.full(lon_grid.shape, site.lon[name]), np.full(lon_grid.shape, site.lat[name]), lon_grid, lat_grid)\n",
+ " az, _, dist = GEOD.inv(\n",
+ " np.full(lon_grid.shape, site.lon[name]),\n",
+ " np.full(lon_grid.shape, site.lat[name]),\n",
+ " lon_grid,\n",
+ " lat_grid,\n",
+ " )\n",
" i, j = (np.asarray(az) % 360).astype(int), (dist / 1e3).astype(int)\n",
" inside = j < 460\n",
" out = np.zeros(lon_grid.shape, dtype=bool)\n",
@@ -2116,26 +2324,49 @@
" return out\n",
"\n",
"\n",
- "fig, axes = plt.subplots(1, 3, figsize=(15, 5.6), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, axes = plt.subplots(\n",
+ " 1, 3, figsize=(15, 5.6), subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"composite_rows = {}\n",
"for ax, height in zip(axes, HEIGHTS):\n",
" observed_union = np.zeros(lon_grid.shape, dtype=bool)\n",
" for name in STATIONS:\n",
" coverage = observed_coverage(name, snapshot[name], height)\n",
" observed_union |= observed_on_grid(name, coverage)\n",
- " ax.pcolormesh(*corner_lonlat[name], np.ma.masked_where(~coverage, coverage), cmap=ListedColormap([BLUE]), alpha=0.35, transform=ccrs.PlateCarree())\n",
+ " ax.pcolormesh(\n",
+ " *corner_lonlat[name],\n",
+ " np.ma.masked_where(~coverage, coverage),\n",
+ " cmap=ListedColormap([BLUE]),\n",
+ " alpha=0.35,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
" composites = {\n",
- " \"example\": compute_radar_track(list(example_stations.values()), elevation=height),\n",
- " \"matched\": compute_radar_track([matched_station(name, snapshot[name]) for name in STATIONS], elevation=height),\n",
+ " \"example\": compute_radar_track(\n",
+ " list(example_stations.values()), elevation=height\n",
+ " ),\n",
+ " \"matched\": compute_radar_track(\n",
+ " [matched_station(name, snapshot[name]) for name in STATIONS],\n",
+ " elevation=height,\n",
+ " ),\n",
" }\n",
- " for (config, composite), color, style in zip(composites.items(), [ORANGE, INK], [\"--\", \"-\"]):\n",
+ " for (config, composite), color, style in zip(\n",
+ " composites.items(), [ORANGE, INK], [\"--\", \"-\"]\n",
+ " ):\n",
" if not composite.empty:\n",
- " composite.boundary.plot(ax=ax, color=color, ls=style, lw=1.2, transform=ccrs.PlateCarree())\n",
+ " composite.boundary.plot(\n",
+ " ax=ax, color=color, ls=style, lw=1.2, transform=ccrs.PlateCarree()\n",
+ " )\n",
" geometry = composite.geometry.iloc[0]\n",
" else:\n",
" geometry = shapely.Polygon()\n",
- " predicted = shapely.contains_xy(geometry, lon_grid, lat_grid) if not geometry.is_empty else np.zeros(lon_grid.shape, dtype=bool)\n",
- " a_obs, a_pred = (observed_union * grid_area).sum(), (predicted * grid_area).sum()\n",
+ " predicted = (\n",
+ " shapely.contains_xy(geometry, lon_grid, lat_grid)\n",
+ " if not geometry.is_empty\n",
+ " else np.zeros(lon_grid.shape, dtype=bool)\n",
+ " )\n",
+ " a_obs, a_pred = (observed_union * grid_area).sum(), (\n",
+ " predicted * grid_area\n",
+ " ).sum()\n",
" a_both = ((observed_union & predicted) * grid_area).sum()\n",
" composite_rows[(height, config)] = {\n",
" \"observed area (1000 km^2)\": a_obs / 1e3,\n",
@@ -2150,7 +2381,9 @@
"axes[0].plot([], [], color=BLUE, alpha=0.5, lw=6, label=\"observed (Level II)\")\n",
"axes[0].plot([], [], color=ORANGE, ls=\"--\", label=\"TAT-C, example\")\n",
"axes[0].plot([], [], color=INK, label=\"TAT-C, matched\")\n",
- "fig.legend(*axes[0].get_legend_handles_labels(), loc=\"lower center\", ncol=3, frameon=False)\n",
+ "fig.legend(\n",
+ " *axes[0].get_legend_handles_labels(), loc=\"lower center\", ncol=3, frameon=False\n",
+ ")\n",
"fig.tight_layout(rect=(0, 0.06, 1, 1))\n",
"plt.show()\n",
"pd.DataFrame(composite_rows).T.round(2)"
diff --git a/docs/validation/ValidateRegionPolarSentinel1.ipynb b/docs/validation/ValidateRegionPolarSentinel1.ipynb
new file mode 100644
index 00000000..8331ed41
--- /dev/null
+++ b/docs/validation/ValidateRegionPolarSentinel1.ipynb
@@ -0,0 +1,1062 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "735022a9",
+ "metadata": {},
+ "source": [
+ "# Polar Region Validation: Sentinel-1C\n",
+ "\n",
+ "This notebook validates TAT-C's observations of regions (`collect_region_observations`) at the poles and across the anti-meridian, where regions are hardest to represent in longitude and latitude, against the acquisitions of the C-band synthetic aperture radar (SAR) of [Sentinel-1C](https://sentiwiki.copernicus.eu/web/s1-mission) over a week, 29 September to 5 October 2026. Sentinel-1 looks to the right of its sun-synchronous orbit, so it reaches closer to the North Pole (about 87.6 deg) than to the South Pole, and over sea ice and polar oceans it mostly acquires its Extra Wide swath (EW) mode. The [Sentinel-2 region notebook](ValidateRegionSentinel2.ipynb) validates regions at lower latitudes and across the anti-meridian (Fiji); here, four regions test the polar cases:\n",
+ "\n",
+ "* **Antarctica**, a polygon around the South Pole, drawn with edges along the pole and the anti-meridian;\n",
+ "* the **Arctic cap**, everything north of 80 deg, a box around the North Pole;\n",
+ "* **Greenland**, reaching 83.6 deg north, near but not around the pole; and\n",
+ "* the **Chukchi Sea** (64 to 75 deg north, 170 deg east to 170 deg west), a box split in two across the anti-meridian.\n",
+ "\n",
+ "The comparison asks two questions:\n",
+ "\n",
+ "1. **Passes.** Does `collect_region_observations` predict every pass on which Sentinel-1C acquired any part of each region?\n",
+ "2. **Swaths and polar coverage.** Do the predicted swaths contain the acquired products, and reach as close to the poles as Sentinel-1C does?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "be7aaefe",
+ "metadata": {},
+ "source": [
+ "## Reference Data\n",
+ "\n",
+ "The Sentinel-1 Level-1 Ground Range Detected (GRD) products of Sentinel-1C over the week are listed in the [Microsoft Planetary Computer](https://planetarycomputer.microsoft.com/dataset/sentinel-1-grd) catalog (no account required), with each product's mode, orbit, times, and footprint; the catalog search is cached in a local `data/sentinel1` directory. The EW and Interferometric Wide swath (IW) products are compared (a few stripmap products are not).\n",
+ "\n",
+ "The catalog footprints are polygons of the four corners of each product, with straight edges in longitude and latitude. Near the poles, a straight edge in longitude and latitude between corners tens of degrees of longitude apart lies far from the true edge of the product, which follows (nearly) a great circle toward the pole, so the footprints are redrawn with geodesic edges between their corners."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "4b85e540",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:23:57.936998Z",
+ "iopub.status.busy": "2026-10-25T23:23:57.936830Z",
+ "iopub.status.idle": "2026-10-25T23:23:59.299204Z",
+ "shell.execute_reply": "2026-10-25T23:23:59.298476Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "3728 EW and IW products ({'IW': 3028, 'EW': 700}), 29 Sep to 06 Oct 2026\n",
+ "catalog footprints with 4 corners (5 vertices): 99.1%\n"
+ ]
+ }
+ ],
+ "source": [
+ "import json\n",
+ "from datetime import datetime, timezone\n",
+ "from pathlib import Path\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import requests\n",
+ "import shapely\n",
+ "from pyproj import Geod\n",
+ "from shapely.geometry import shape\n",
+ "\n",
+ "DATA_DIR = Path(\"data\") / \"sentinel1\"\n",
+ "DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
+ "START = datetime(2026, 9, 29, tzinfo=timezone.utc)\n",
+ "END = datetime(2026, 10, 6, tzinfo=timezone.utc)\n",
+ "STAC = \"https://planetarycomputer.microsoft.com/api/stac/v1/search\"\n",
+ "MODES = [\"EW\", \"IW\"]\n",
+ "GEOD = Geod(ellps=\"WGS84\")\n",
+ "\n",
+ "ITEMS_FILE = DATA_DIR / f\"s1c_grd_{START:%Y%m%d}_{END:%Y%m%d}.json\"\n",
+ "if not ITEMS_FILE.exists():\n",
+ " body = {\n",
+ " \"collections\": [\"sentinel-1-grd\"],\n",
+ " \"datetime\": f\"{START:%Y-%m-%dT%H:%M:%SZ}/{END:%Y-%m-%dT%H:%M:%SZ}\",\n",
+ " \"limit\": 1000,\n",
+ " \"query\": {\"platform\": {\"eq\": \"sentinel-1c\"}},\n",
+ " }\n",
+ " items, url = [], STAC\n",
+ " while url:\n",
+ " page = requests.post(url, json=body, timeout=300).json()\n",
+ " items += page[\"features\"]\n",
+ " following = [link for link in page[\"links\"] if link[\"rel\"] == \"next\"]\n",
+ " url, body = (\n",
+ " (following[0][\"href\"], following[0].get(\"body\", body))\n",
+ " if following\n",
+ " else (None, None)\n",
+ " )\n",
+ " ITEMS_FILE.write_text(json.dumps(items))\n",
+ "\n",
+ "\n",
+ "def geodesic(geometry, points=50):\n",
+ " \"\"\"A footprint with geodesic edges between its corners (rather than straight edges in longitude and latitude).\"\"\"\n",
+ " parts = []\n",
+ " for part in getattr(geometry, \"geoms\", [geometry]):\n",
+ " corners = np.asarray(part.exterior.coords)\n",
+ " ring = []\n",
+ " for (x0, y0), (x1, y1) in zip(corners[:-1], corners[1:]):\n",
+ " ring += [(x0, y0)] + list(GEOD.npts(x0, y0, x1, y1, points))\n",
+ " parts.append(shapely.Polygon(ring))\n",
+ " return parts[0] if len(parts) == 1 else shapely.MultiPolygon(parts)\n",
+ "\n",
+ "\n",
+ "items = [\n",
+ " i\n",
+ " for i in json.loads(ITEMS_FILE.read_text())\n",
+ " if i[\"properties\"][\"sar:instrument_mode\"] in MODES\n",
+ "]\n",
+ "products = pd.DataFrame(\n",
+ " [\n",
+ " {\n",
+ " \"mode\": i[\"properties\"][\"sar:instrument_mode\"],\n",
+ " \"orbit\": i[\"properties\"][\"sat:absolute_orbit\"],\n",
+ " \"start\": pd.Timestamp(i[\"properties\"][\"start_datetime\"]),\n",
+ " \"end\": pd.Timestamp(i[\"properties\"][\"end_datetime\"]),\n",
+ " \"corners\": shape(i[\"geometry\"]),\n",
+ " }\n",
+ " for i in items\n",
+ " ]\n",
+ ")\n",
+ "products[\"footprint\"] = products.corners.apply(geodesic)\n",
+ "vertices = products.corners.apply(lambda g: len(shapely.get_coordinates(g)))\n",
+ "print(\n",
+ " f\"{len(products)} EW and IW products ({products['mode'].value_counts().to_dict()}), {START:%d %b} to {END:%d %b %Y}\"\n",
+ ")\n",
+ "print(f\"catalog footprints with 4 corners (5 vertices): {(vertices == 5).mean():.1%}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6b9b02fc",
+ "metadata": {},
+ "source": [
+ "## Setup\n",
+ "\n",
+ "Sentinel-1C is modeled as in the [Sentinel-1 notebook](ValidateSARSentinel1.ipynb): a right-looking, rectangular `PointedInstrument` for each mode, with the roll angle and cross-track field of view fitted to the products there (EW: 28.95 deg and 23.56 deg; IW: 33.76 and 13.27 deg), oriented to the Earth-fixed velocity (the zero-Doppler geometry of SAR images). Sentinel-1 also steers its roll angle around the orbit to keep its slant range nearly constant, which the Sentinel-1 notebook fits as a satellite `Attitude` with a roll angle profile (by argument of latitude) for each mode; both the fixed roll angle and the roll steering are compared. `collect_region_observations` splits each region along the anti-meridian and the poles (`split_polygon`) before observing it, which should preserve its shape."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "d82c0951",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:23:59.301190Z",
+ "iopub.status.busy": "2026-10-25T23:23:59.300901Z",
+ "iopub.status.idle": "2026-10-25T23:24:43.044094Z",
+ "shell.execute_reply": "2026-10-25T23:24:43.043337Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
type
\n",
+ "
bounds
\n",
+ "
area (deg^2)
\n",
+ "
split area (deg^2)
\n",
+ "
symmetric difference (deg^2)
\n",
+ "
observations (fixed roll)
\n",
+ "
observations (roll steering)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
Antarctica
\n",
+ "
MultiPolygon
\n",
+ "
-180.0, -90.0, 180.0, -63.3
\n",
+ "
6028.836194
\n",
+ "
6028.836194
\n",
+ "
0.0
\n",
+ "
370
\n",
+ "
378
\n",
+ "
\n",
+ "
\n",
+ "
Arctic cap
\n",
+ "
Polygon
\n",
+ "
-180.0, 80.0, 180.0, 90.0
\n",
+ "
3600.0
\n",
+ "
3600.0
\n",
+ "
0.0
\n",
+ "
204
\n",
+ "
204
\n",
+ "
\n",
+ "
\n",
+ "
Greenland
\n",
+ "
Polygon
\n",
+ "
-73.3, 60.0, -12.2, 83.6
\n",
+ "
677.509565
\n",
+ "
677.509565
\n",
+ "
0.0
\n",
+ "
127
\n",
+ "
126
\n",
+ "
\n",
+ "
\n",
+ "
Chukchi Sea
\n",
+ "
MultiPolygon
\n",
+ "
-180.0, 64.0, 180.0, 75.0
\n",
+ "
220.0
\n",
+ "
220.0
\n",
+ "
0.0
\n",
+ "
43
\n",
+ "
43
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " type bounds area (deg^2) \\\n",
+ "Antarctica MultiPolygon -180.0, -90.0, 180.0, -63.3 6028.836194 \n",
+ "Arctic cap Polygon -180.0, 80.0, 180.0, 90.0 3600.0 \n",
+ "Greenland Polygon -73.3, 60.0, -12.2, 83.6 677.509565 \n",
+ "Chukchi Sea MultiPolygon -180.0, 64.0, 180.0, 75.0 220.0 \n",
+ "\n",
+ " split area (deg^2) symmetric difference (deg^2) \\\n",
+ "Antarctica 6028.836194 0.0 \n",
+ "Arctic cap 3600.0 0.0 \n",
+ "Greenland 677.509565 0.0 \n",
+ "Chukchi Sea 220.0 0.0 \n",
+ "\n",
+ " observations (fixed roll) observations (roll steering) \n",
+ "Antarctica 370 378 \n",
+ "Arctic cap 204 204 \n",
+ "Greenland 127 126 \n",
+ "Chukchi Sea 43 43 "
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import cartopy.io.shapereader as shpreader\n",
+ "from pyproj import Transformer\n",
+ "from shapely.geometry import MultiPolygon, box\n",
+ "\n",
+ "from tatc.analysis import collect_region_observations\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
+ "from tatc.utils import hash_geometry, split_polygon\n",
+ "\n",
+ "TLE = [\n",
+ " \"1 62261U 24235A 26275.78977191 -.00000047 00000+0 -21660-6 0 9997\",\n",
+ " \"2 62261 98.1826 281.5711 0001343 90.3841 269.7512 14.59198718 97106\",\n",
+ "]\n",
+ "# roll angle and cross-track field of view (deg) of each mode, and the farthest look angle, from ValidateSARSentinel1\n",
+ "VIEWS = {\"EW\": (28.951, 23.563), \"IW\": (33.760, 13.265)}\n",
+ "FAR_LOOK = 40.73\n",
+ "# roll steering (roll angle by argument of latitude, deg), fitted in ValidateSARSentinel1 (Test 6)\n",
+ "ROLL_PROFILES = {\n",
+ " \"EW\": [\n",
+ " (55, -29.25),\n",
+ " (65, -29.099),\n",
+ " (75, -28.824),\n",
+ " (85, -28.978),\n",
+ " (95, -28.909),\n",
+ " (105, -29.02),\n",
+ " (115, -29.184),\n",
+ " (125, -29.385),\n",
+ " (135, -29.668),\n",
+ " (245, -28.101),\n",
+ " (255, -27.764),\n",
+ " (275, -27.997),\n",
+ " (285, -27.89),\n",
+ " (295, -28.191),\n",
+ " ],\n",
+ " \"IW\": [\n",
+ " (5, -33.998),\n",
+ " (15, -33.98),\n",
+ " (25, -34.22),\n",
+ " (35, -34.069),\n",
+ " (45, -33.855),\n",
+ " (55, -33.651),\n",
+ " (65, -33.445),\n",
+ " (75, -33.202),\n",
+ " (95, -33.467),\n",
+ " (105, -33.236),\n",
+ " (115, -33.485),\n",
+ " (125, -33.651),\n",
+ " (135, -33.864),\n",
+ " (145, -34.0),\n",
+ " (155, -34.206),\n",
+ " (165, -33.998),\n",
+ " (175, -33.984),\n",
+ " (185, -33.922),\n",
+ " (195, -34.148),\n",
+ " (205, -33.664),\n",
+ " (215, -33.239),\n",
+ " (225, -32.825),\n",
+ " (255, -32.581),\n",
+ " (275, -32.402),\n",
+ " (305, -32.765),\n",
+ " (315, -33.07),\n",
+ " (325, -33.247),\n",
+ " (335, -33.485),\n",
+ " (345, -33.824),\n",
+ " (355, -34.014),\n",
+ " ],\n",
+ "}\n",
+ "countries = {\n",
+ " r.attributes[\"NAME\"]: r.geometry\n",
+ " for r in shpreader.Reader(\n",
+ " shpreader.natural_earth(\n",
+ " resolution=\"110m\", category=\"cultural\", name=\"admin_0_countries\"\n",
+ " )\n",
+ " ).records()\n",
+ "}\n",
+ "regions = {\n",
+ " \"Antarctica\": countries[\"Antarctica\"],\n",
+ " \"Arctic cap\": box(-180, 80, 180, 90),\n",
+ " \"Greenland\": countries[\"Greenland\"],\n",
+ " \"Chukchi Sea\": MultiPolygon([box(170, 64, 180, 75), box(-180, 64, -170, 75)]),\n",
+ "}\n",
+ "region_names = {hash_geometry(geometry): name for name, geometry in regions.items()}\n",
+ "\n",
+ "\n",
+ "def satellites(steering):\n",
+ " \"\"\"Sentinel-1C in each mode, with a fixed roll angle or roll steering.\"\"\"\n",
+ " return [\n",
+ " Satellite(\n",
+ " name=f\"Sentinel-1C {mode}\",\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(TLE),\n",
+ " attitude=(\n",
+ " Attitude(\n",
+ " roll_angle_profile=[(u, r + roll) for u, r in ROLL_PROFILES[mode]]\n",
+ " )\n",
+ " if steering\n",
+ " else None\n",
+ " ),\n",
+ " instruments=[\n",
+ " PointedInstrument(\n",
+ " name=mode,\n",
+ " field_of_regard=2 * (FAR_LOOK + 1),\n",
+ " cross_track_field_of_view=fov,\n",
+ " along_track_field_of_view=1,\n",
+ " roll_angle=-roll,\n",
+ " is_rectangular=True,\n",
+ " )\n",
+ " ],\n",
+ " )\n",
+ " for mode, (roll, fov) in VIEWS.items()\n",
+ " ]\n",
+ "\n",
+ "\n",
+ "observations = {}\n",
+ "for label, steering in [(\"fixed roll\", False), (\"roll steering\", True)]:\n",
+ " found = collect_region_observations(\n",
+ " list(regions.values()), satellites(steering), START, END\n",
+ " )\n",
+ " found[\"region\"] = found.target_hash.map(region_names)\n",
+ " observations[label] = found\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " name: {\n",
+ " \"type\": geometry.geom_type,\n",
+ " \"bounds\": \", \".join(f\"{b:.1f}\" for b in geometry.bounds),\n",
+ " \"area (deg^2)\": geometry.area,\n",
+ " \"split area (deg^2)\": split_polygon(geometry).area,\n",
+ " \"symmetric difference (deg^2)\": geometry.symmetric_difference(\n",
+ " split_polygon(geometry)\n",
+ " ).area,\n",
+ " \"observations (fixed roll)\": int(\n",
+ " (observations[\"fixed roll\"].region == name).sum()\n",
+ " ),\n",
+ " \"observations (roll steering)\": int(\n",
+ " (observations[\"roll steering\"].region == name).sum()\n",
+ " ),\n",
+ " }\n",
+ " for name, geometry in regions.items()\n",
+ " }\n",
+ ").T.round(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "086da51b",
+ "metadata": {},
+ "source": [
+ "`split_polygon` preserves each region exactly, including Antarctica, whose boundary already includes edges along the South Pole and the anti-meridian, and whose coastline doubles back in longitude around the Antarctic Peninsula and along Victoria Land. (An earlier version reconstructed polygons around a pole by sorting their vertices by longitude, which this validation exposed: it removed or added strips of Antarctica along those coasts, about 160 and 270 deg^2, so that 12% of the area Sentinel-1C acquired in Antarctica fell outside the predicted swaths.)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "979f856a",
+ "metadata": {},
+ "source": [
+ "## Test 1: Passes\n",
+ "\n",
+ "A pass acquired a region if any of its products (by orbit and mode) intersects the region, and is predicted if an observation of the region by the same mode overlaps the products in time. Sentinel-1C acquires its modes according to its acquisition plan, so not every predicted pass is acquired; the comparison is of the acquired passes. The table also counts the products that intersect a region only with their catalog footprints' straight edges."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "678b95f1",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:24:43.046134Z",
+ "iopub.status.busy": "2026-10-25T23:24:43.045823Z",
+ "iopub.status.idle": "2026-10-25T23:24:43.279211Z",
+ "shell.execute_reply": "2026-10-25T23:24:43.278496Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
acquired passes
\n",
+ "
predicted
\n",
+ "
predicted (%)
\n",
+ "
observations
\n",
+ "
products intersecting only with straight edges
\n",
+ "
only with geodesic edges
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
Antarctica
\n",
+ "
fixed roll
\n",
+ "
49.0
\n",
+ "
48.0
\n",
+ "
97.96
\n",
+ "
370.0
\n",
+ "
0.0
\n",
+ "
2.0
\n",
+ "
\n",
+ "
\n",
+ "
Arctic cap
\n",
+ "
fixed roll
\n",
+ "
84.0
\n",
+ "
84.0
\n",
+ "
100.00
\n",
+ "
204.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
\n",
+ "
\n",
+ "
Greenland
\n",
+ "
fixed roll
\n",
+ "
59.0
\n",
+ "
59.0
\n",
+ "
100.00
\n",
+ "
127.0
\n",
+ "
9.0
\n",
+ "
2.0
\n",
+ "
\n",
+ "
\n",
+ "
Chukchi Sea
\n",
+ "
fixed roll
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
100.00
\n",
+ "
43.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
\n",
+ "
\n",
+ "
Antarctica
\n",
+ "
roll steering
\n",
+ "
49.0
\n",
+ "
49.0
\n",
+ "
100.00
\n",
+ "
378.0
\n",
+ "
0.0
\n",
+ "
2.0
\n",
+ "
\n",
+ "
\n",
+ "
Arctic cap
\n",
+ "
roll steering
\n",
+ "
84.0
\n",
+ "
84.0
\n",
+ "
100.00
\n",
+ "
204.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
\n",
+ "
\n",
+ "
Greenland
\n",
+ "
roll steering
\n",
+ "
59.0
\n",
+ "
59.0
\n",
+ "
100.00
\n",
+ "
126.0
\n",
+ "
9.0
\n",
+ "
2.0
\n",
+ "
\n",
+ "
\n",
+ "
Chukchi Sea
\n",
+ "
roll steering
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
100.00
\n",
+ "
43.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " acquired passes predicted predicted (%) \\\n",
+ "Antarctica fixed roll 49.0 48.0 97.96 \n",
+ "Arctic cap fixed roll 84.0 84.0 100.00 \n",
+ "Greenland fixed roll 59.0 59.0 100.00 \n",
+ "Chukchi Sea fixed roll 18.0 18.0 100.00 \n",
+ "Antarctica roll steering 49.0 49.0 100.00 \n",
+ "Arctic cap roll steering 84.0 84.0 100.00 \n",
+ "Greenland roll steering 59.0 59.0 100.00 \n",
+ "Chukchi Sea roll steering 18.0 18.0 100.00 \n",
+ "\n",
+ " observations \\\n",
+ "Antarctica fixed roll 370.0 \n",
+ "Arctic cap fixed roll 204.0 \n",
+ "Greenland fixed roll 127.0 \n",
+ "Chukchi Sea fixed roll 43.0 \n",
+ "Antarctica roll steering 378.0 \n",
+ "Arctic cap roll steering 204.0 \n",
+ "Greenland roll steering 126.0 \n",
+ "Chukchi Sea roll steering 43.0 \n",
+ "\n",
+ " products intersecting only with straight edges \\\n",
+ "Antarctica fixed roll 0.0 \n",
+ "Arctic cap fixed roll 0.0 \n",
+ "Greenland fixed roll 9.0 \n",
+ "Chukchi Sea fixed roll 0.0 \n",
+ "Antarctica roll steering 0.0 \n",
+ "Arctic cap roll steering 0.0 \n",
+ "Greenland roll steering 9.0 \n",
+ "Chukchi Sea roll steering 0.0 \n",
+ "\n",
+ " only with geodesic edges \n",
+ "Antarctica fixed roll 2.0 \n",
+ "Arctic cap fixed roll 0.0 \n",
+ "Greenland fixed roll 2.0 \n",
+ "Chukchi Sea fixed roll 0.0 \n",
+ "Antarctica roll steering 2.0 \n",
+ "Arctic cap roll steering 0.0 \n",
+ "Greenland roll steering 2.0 \n",
+ "Chukchi Sea roll steering 0.0 "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "EQUAL_AREA = {\n",
+ " 1: Transformer.from_crs(\n",
+ " \"EPSG:4326\", \"+proj=laea +lat_0=90 +lon_0=0 +units=m\", always_xy=True\n",
+ " ),\n",
+ " -1: Transformer.from_crs(\n",
+ " \"EPSG:4326\", \"+proj=laea +lat_0=-90 +lon_0=0 +units=m\", always_xy=True\n",
+ " ),\n",
+ "}\n",
+ "\n",
+ "\n",
+ "def project(geometry, pole, densify=True):\n",
+ " \"\"\"A geometry in a polar Lambert azimuthal equal-area projection, with its edges (straight in longitude and\n",
+ " latitude, as TAT-C's regions and swaths) densified first, unless they already are (geodesic footprints).\n",
+ " \"\"\"\n",
+ " if densify:\n",
+ " geometry = shapely.segmentize(geometry, 0.25)\n",
+ " transform = EQUAL_AREA[pole].transform\n",
+ " return shapely.transform(\n",
+ " geometry, lambda xy: np.column_stack(transform(xy[:, 0], xy[:, 1]))\n",
+ " ).buffer(0)\n",
+ "\n",
+ "\n",
+ "def acquired_passes(name):\n",
+ " \"\"\"The passes (by orbit and mode) whose products intersect a region, with their time spans and footprints.\"\"\"\n",
+ " region = regions[name]\n",
+ " hits = products[products.footprint.apply(region.intersects)]\n",
+ " return (\n",
+ " hits.groupby([\"orbit\", \"mode\"])\n",
+ " .agg(\n",
+ " start=(\"start\", \"min\"),\n",
+ " end=(\"end\", \"max\"),\n",
+ " footprint=(\"footprint\", lambda g: shapely.union_all(list(g))),\n",
+ " )\n",
+ " .reset_index()\n",
+ " )\n",
+ "\n",
+ "\n",
+ "passes = {name: acquired_passes(name) for name in regions}\n",
+ "# products intersecting each region with their catalog footprints (straight edges) and with geodesic edges\n",
+ "straight = {\n",
+ " name: products.corners.apply(region.intersects) for name, region in regions.items()\n",
+ "}\n",
+ "true_edges = {\n",
+ " name: products.footprint.apply(region.intersects)\n",
+ " for name, region in regions.items()\n",
+ "}\n",
+ "rows = {}\n",
+ "for label, found in observations.items():\n",
+ " for name in regions:\n",
+ " p, o = passes[name], found[found.region == name]\n",
+ " predicted = [\n",
+ " ((o.instrument == q.mode) & (o.start <= q.end) & (o.end >= q.start)).any()\n",
+ " for q in p.itertuples()\n",
+ " ]\n",
+ " rows[(name, label)] = {\n",
+ " \"acquired passes\": len(p),\n",
+ " \"predicted\": int(np.sum(predicted)),\n",
+ " \"predicted (%)\": 100 * np.mean(predicted),\n",
+ " \"observations\": len(o),\n",
+ " \"products intersecting only with straight edges\": int(\n",
+ " (straight[name] & ~true_edges[name]).sum()\n",
+ " ),\n",
+ " \"only with geodesic edges\": int((true_edges[name] & ~straight[name]).sum()),\n",
+ " }\n",
+ "pd.DataFrame(rows).T.round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ebd179d5",
+ "metadata": {},
+ "source": [
+ "With roll steering, `collect_region_observations` predicts every one of the 210 passes on which Sentinel-1C acquired part of a region, including all 84 over the Arctic cap and all 49 over Antarctica. With a fixed roll angle, it misses one Antarctic pass, whose products touch the coast for about 5 km^2 and end less than a second before the predicted observation begins.\n",
+ "\n",
+ "The catalog footprints' straight edges in longitude and latitude would mislead the comparison near the poles: 9 products appear to intersect Greenland only because of them (and 4 intersect a region only with geodesic edges). These products cross the Arctic cap north of Greenland, where a straight edge in longitude and latitude between corners tens of degrees of longitude apart lies up to about 80 km from the product's true edge."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3ae5095a",
+ "metadata": {},
+ "source": [
+ "## Test 2: Swaths and Polar Coverage\n",
+ "\n",
+ "For each region, the part acquired (the union of the acquired products, within the region) is compared with the swaths of the observations predicted for the acquired passes, which cover each whole pass over the region (and so contain the acquired products, if they are accurate). The union of the swaths of all predicted observations gives the part of each region Sentinel-1C can observe in a week, and the farthest latitude reached, its polar gap. Areas are computed in polar Lambert azimuthal equal-area projections."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "64fc3dd3",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:24:43.281102Z",
+ "iopub.status.busy": "2026-10-25T23:24:43.280854Z",
+ "iopub.status.idle": "2026-10-25T23:24:57.386895Z",
+ "shell.execute_reply": "2026-10-25T23:24:57.386301Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
region area (10^6 km^2)
\n",
+ "
acquired (%)
\n",
+ "
acquired within predicted swaths (%)
\n",
+ "
predicted swaths of all passes (%)
\n",
+ "
farthest latitude acquired (deg)
\n",
+ "
farthest latitude predicted (deg)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
Antarctica
\n",
+ "
fixed roll
\n",
+ "
12.337
\n",
+ "
18.672
\n",
+ "
99.720
\n",
+ "
71.349
\n",
+ "
-78.633
\n",
+ "
-79.843
\n",
+ "
\n",
+ "
\n",
+ "
Arctic cap
\n",
+ "
fixed roll
\n",
+ "
3.909
\n",
+ "
84.257
\n",
+ "
100.000
\n",
+ "
94.111
\n",
+ "
87.570
\n",
+ "
87.577
\n",
+ "
\n",
+ "
\n",
+ "
Greenland
\n",
+ "
fixed roll
\n",
+ "
2.207
\n",
+ "
100.000
\n",
+ "
100.000
\n",
+ "
100.000
\n",
+ "
83.645
\n",
+ "
83.645
\n",
+ "
\n",
+ "
\n",
+ "
Chukchi Sea
\n",
+ "
fixed roll
\n",
+ "
0.958
\n",
+ "
89.701
\n",
+ "
99.944
\n",
+ "
100.000
\n",
+ "
75.000
\n",
+ "
75.000
\n",
+ "
\n",
+ "
\n",
+ "
Antarctica
\n",
+ "
roll steering
\n",
+ "
12.337
\n",
+ "
18.672
\n",
+ "
100.000
\n",
+ "
71.957
\n",
+ "
-78.633
\n",
+ "
-79.970
\n",
+ "
\n",
+ "
\n",
+ "
Arctic cap
\n",
+ "
roll steering
\n",
+ "
3.909
\n",
+ "
84.257
\n",
+ "
100.000
\n",
+ "
94.103
\n",
+ "
87.570
\n",
+ "
87.575
\n",
+ "
\n",
+ "
\n",
+ "
Greenland
\n",
+ "
roll steering
\n",
+ "
2.207
\n",
+ "
100.000
\n",
+ "
100.000
\n",
+ "
100.000
\n",
+ "
83.645
\n",
+ "
83.645
\n",
+ "
\n",
+ "
\n",
+ "
Chukchi Sea
\n",
+ "
roll steering
\n",
+ "
0.958
\n",
+ "
89.701
\n",
+ "
100.000
\n",
+ "
100.000
\n",
+ "
75.000
\n",
+ "
75.000
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " region area (10^6 km^2) acquired (%) \\\n",
+ "Antarctica fixed roll 12.337 18.672 \n",
+ "Arctic cap fixed roll 3.909 84.257 \n",
+ "Greenland fixed roll 2.207 100.000 \n",
+ "Chukchi Sea fixed roll 0.958 89.701 \n",
+ "Antarctica roll steering 12.337 18.672 \n",
+ "Arctic cap roll steering 3.909 84.257 \n",
+ "Greenland roll steering 2.207 100.000 \n",
+ "Chukchi Sea roll steering 0.958 89.701 \n",
+ "\n",
+ " acquired within predicted swaths (%) \\\n",
+ "Antarctica fixed roll 99.720 \n",
+ "Arctic cap fixed roll 100.000 \n",
+ "Greenland fixed roll 100.000 \n",
+ "Chukchi Sea fixed roll 99.944 \n",
+ "Antarctica roll steering 100.000 \n",
+ "Arctic cap roll steering 100.000 \n",
+ "Greenland roll steering 100.000 \n",
+ "Chukchi Sea roll steering 100.000 \n",
+ "\n",
+ " predicted swaths of all passes (%) \\\n",
+ "Antarctica fixed roll 71.349 \n",
+ "Arctic cap fixed roll 94.111 \n",
+ "Greenland fixed roll 100.000 \n",
+ "Chukchi Sea fixed roll 100.000 \n",
+ "Antarctica roll steering 71.957 \n",
+ "Arctic cap roll steering 94.103 \n",
+ "Greenland roll steering 100.000 \n",
+ "Chukchi Sea roll steering 100.000 \n",
+ "\n",
+ " farthest latitude acquired (deg) \\\n",
+ "Antarctica fixed roll -78.633 \n",
+ "Arctic cap fixed roll 87.570 \n",
+ "Greenland fixed roll 83.645 \n",
+ "Chukchi Sea fixed roll 75.000 \n",
+ "Antarctica roll steering -78.633 \n",
+ "Arctic cap roll steering 87.570 \n",
+ "Greenland roll steering 83.645 \n",
+ "Chukchi Sea roll steering 75.000 \n",
+ "\n",
+ " farthest latitude predicted (deg) \n",
+ "Antarctica fixed roll -79.843 \n",
+ "Arctic cap fixed roll 87.577 \n",
+ "Greenland fixed roll 83.645 \n",
+ "Chukchi Sea fixed roll 75.000 \n",
+ "Antarctica roll steering -79.970 \n",
+ "Arctic cap roll steering 87.575 \n",
+ "Greenland roll steering 83.645 \n",
+ "Chukchi Sea roll steering 75.000 "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def latitudes(geometry):\n",
+ " return np.concatenate(\n",
+ " [\n",
+ " np.asarray(p.exterior.coords)[:, 1]\n",
+ " for p in getattr(geometry, \"geoms\", [geometry])\n",
+ " if not p.is_empty\n",
+ " ]\n",
+ " )\n",
+ "\n",
+ "\n",
+ "rows = {}\n",
+ "for label, found in observations.items():\n",
+ " for name, region in regions.items():\n",
+ " pole = -1 if region.bounds[1] < 0 else 1\n",
+ " area = project(region, pole)\n",
+ " p, o = passes[name], found[found.region == name]\n",
+ " acquired = shapely.union_all(\n",
+ " [project(g, pole, densify=False) for g in p.footprint]\n",
+ " ).intersection(area)\n",
+ " matched = [\n",
+ " o[(o.instrument == q.mode) & (o.start <= q.end) & (o.end >= q.start)]\n",
+ " for q in p.itertuples()\n",
+ " ]\n",
+ " swaths = shapely.union_all(\n",
+ " [project(g, pole) for m in matched for g in m.geometry]\n",
+ " )\n",
+ " everything = shapely.union_all(\n",
+ " [project(g, pole) for g in o.geometry]\n",
+ " ).intersection(area)\n",
+ " reach = np.nanmax if pole > 0 else np.nanmin\n",
+ " rows[(name, label)] = {\n",
+ " \"region area (10^6 km^2)\": area.area / 1e12,\n",
+ " \"acquired (%)\": 100 * acquired.area / area.area,\n",
+ " \"acquired within predicted swaths (%)\": 100\n",
+ " * acquired.intersection(swaths).area\n",
+ " / acquired.area,\n",
+ " \"predicted swaths of all passes (%)\": 100 * everything.area / area.area,\n",
+ " \"farthest latitude acquired (deg)\": reach(\n",
+ " np.concatenate([latitudes(g.intersection(region)) for g in p.footprint])\n",
+ " ),\n",
+ " \"farthest latitude predicted (deg)\": reach(\n",
+ " np.concatenate([latitudes(g) for g in o.geometry])\n",
+ " ),\n",
+ " }\n",
+ "coverage = pd.DataFrame(rows).T\n",
+ "coverage.round(3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "0ffd63ed",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T23:24:57.388801Z",
+ "iopub.status.busy": "2026-10-25T23:24:57.388551Z",
+ "iopub.status.idle": "2026-10-25T23:25:12.257461Z",
+ "shell.execute_reply": "2026-10-25T23:25:12.256709Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "D:\\github\\tatc\\.venv\\Lib\\site-packages\\cartopy\\mpl\\geoaxes.py:792: UserWarning: Approximating coordinate system \n",
+ "Name: unknown\n",
+ "Axis Info [ellipsoidal]:\n",
+ "- lon[east]: Longitude (degree)\n",
+ "- lat[north]: Latitude (degree)\n",
+ "Area of Use:\n",
+ "- undefined\n",
+ "Datum: World Geodetic System 1984\n",
+ "- Ellipsoid: WGS 84\n",
+ "- Prime Meridian: Greenwich\n",
+ " with the PlateCarree projection.\n",
+ " warnings.warn(f'Approximating coordinate system {crs!r} with '\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import cartopy.crs as ccrs\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "fig = plt.figure(figsize=(12, 6))\n",
+ "for k, (pole, title) in enumerate([(1, \"Arctic\"), (-1, \"Antarctic\")]):\n",
+ " ax = fig.add_subplot(\n",
+ " 1,\n",
+ " 2,\n",
+ " k + 1,\n",
+ " projection=ccrs.NorthPolarStereo() if pole > 0 else ccrs.SouthPolarStereo(),\n",
+ " )\n",
+ " ax.set_extent([-180, 180, 60 * pole, 90 * pole], ccrs.PlateCarree())\n",
+ " ax.coastlines(linewidth=0.4, color=\"#888780\")\n",
+ " names = [n for n, r in regions.items() if (r.bounds[1] < 0) == (pole < 0)]\n",
+ " found = observations[\"roll steering\"]\n",
+ " swaths = [g for g in found[found.region.isin(names)].geometry]\n",
+ " ax.add_geometries(\n",
+ " swaths, ccrs.PlateCarree(), facecolor=\"#93c5fd\", edgecolor=\"none\", alpha=0.35\n",
+ " )\n",
+ " footprints = [\n",
+ " shapely.segmentize(g, 0.5) for n in names for g in passes[n].footprint\n",
+ " ]\n",
+ " ax.add_geometries(\n",
+ " footprints,\n",
+ " ccrs.Geodetic(),\n",
+ " facecolor=\"none\",\n",
+ " edgecolor=\"#1f4e79\",\n",
+ " linewidth=0.3,\n",
+ " )\n",
+ " for n in names:\n",
+ " ax.add_geometries(\n",
+ " [shapely.segmentize(regions[n], 0.5)],\n",
+ " ccrs.PlateCarree(),\n",
+ " facecolor=\"none\",\n",
+ " edgecolor=\"#b91c1c\",\n",
+ " linewidth=0.8,\n",
+ " )\n",
+ " ax.set_title(\n",
+ " f\"{title}: predicted swaths (blue fill), acquired products (outlines), regions (red)\",\n",
+ " fontsize=9,\n",
+ " )\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5819665b",
+ "metadata": {},
+ "source": [
+ "The predicted swaths contain all the area Sentinel-1C acquired in every region with roll steering (99.7% of Antarctica's with a fixed roll angle), on both sides of the anti-meridian and around both poles. Over the week, Sentinel-1C could observe 94.1% of the Arctic cap: its swaths reach 87.58 deg north, as its products do (87.57 deg), leaving a gap of about 270 km around the North Pole. They reach only about 80 deg south (looking away from the South Pole), so it could observe 72% of Antarctica, of which it acquired about a quarter (19% of the continent) in this week's acquisition plan, along the coasts. Greenland and the Chukchi Sea are observed entirely."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "20af5099",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "\n",
+ "| Test | Result |\n",
+ "| --- | --- |\n",
+ "| Regions | Each region preserved exactly by `split_polygon`, including Antarctica around the South Pole (after a correction exposed by this validation) |\n",
+ "| 1. Passes | All 210 acquired passes predicted with roll steering (one marginal Antarctic pass missed with a fixed roll angle) |\n",
+ "| 2. Swaths and polar coverage | All acquired area within the predicted swaths with roll steering (99.7% for Antarctica with a fixed roll angle); swaths reach 87.58 deg north (products 87.57 deg) |\n",
+ "\n",
+ "**TAT-C's region observations are validated at the poles and across the anti-meridian.** Over a week of Sentinel-1C acquisitions, `collect_region_observations` predicts every pass over regions around both poles, near the North Pole, and split across the anti-meridian, and its swaths contain the acquired products and reproduce Sentinel-1's polar gap.\n",
+ "\n",
+ "**Findings.** The validation exposed an error in `split_polygon`, which reconstructed a polygon around a pole by sorting its vertices by longitude, valid only for boundaries monotonic in longitude: Antarctica lost and gained strips along its coasts, and 12% of the acquired area fell outside the predicted swaths. `split_polygon` now keeps the order of the vertices, unrolled across the anti-meridian. The catalog footprints of the products, by contrast, need care near the poles: their edges are straight in longitude and latitude, and only geodesic edges represent the products there.\n",
+ "\n",
+ "**Next steps:**\n",
+ "\n",
+ "1. *Seasonal acquisitions.* Repeat in another season, when Sentinel-1's acquisition plan covers more of Antarctica.\n",
+ "2. *Other instruments.* Compare left-looking or nadir-viewing instruments, whose polar gaps differ (for example, a left-looking radar reaches closer to the South Pole).\n",
+ "\n",
+ "**Limitations.** This study covers one week, one satellite, and coarse (1:110 million) region outlines. The roll steering profiles were fitted to one day of products in the Sentinel-1 notebook, partly from other parts of the orbit."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/validation/ValidateRegionSentinel2.ipynb b/docs/validation/ValidateRegionSentinel2.ipynb
index e1ce6fa5..988273a1 100644
--- a/docs/validation/ValidateRegionSentinel2.ipynb
+++ b/docs/validation/ValidateRegionSentinel2.ipynb
@@ -207,8 +207,16 @@
"PLATFORMS = list(TLES)\n",
"REGION_NAMES = [\"Iceland\", \"Japan\", \"Chile\", \"Fiji\", \"Norway\", \"Switzerland\"]\n",
"\n",
- "countries = shpreader.Reader(shpreader.natural_earth(resolution=\"110m\", category=\"cultural\", name=\"admin_0_countries\"))\n",
- "regions = {r.attributes[\"NAME\"]: r.geometry for r in countries.records() if r.attributes[\"NAME\"] in REGION_NAMES}\n",
+ "countries = shpreader.Reader(\n",
+ " shpreader.natural_earth(\n",
+ " resolution=\"110m\", category=\"cultural\", name=\"admin_0_countries\"\n",
+ " )\n",
+ ")\n",
+ "regions = {\n",
+ " r.attributes[\"NAME\"]: r.geometry\n",
+ " for r in countries.records()\n",
+ " if r.attributes[\"NAME\"] in REGION_NAMES\n",
+ "}\n",
"regions = {name: regions[name] for name in REGION_NAMES}\n",
"REGION_IDS = {name: i for i, name in enumerate(REGION_NAMES)}\n",
"\n",
@@ -223,7 +231,10 @@
" \"intersects\": region.__geo_interface__,\n",
" \"datetime\": f\"{START:%Y-%m-%dT%H:%M:%SZ}/{END - timedelta(seconds=1):%Y-%m-%dT%H:%M:%SZ}\",\n",
" \"limit\": 1000,\n",
- " \"fields\": {\"include\": [\"id\", \"properties.platform\", \"properties.s2:datatake_id\"], \"exclude\": [\"geometry\"]},\n",
+ " \"fields\": {\n",
+ " \"include\": [\"id\", \"properties.platform\", \"properties.s2:datatake_id\"],\n",
+ " \"exclude\": [\"geometry\"],\n",
+ " },\n",
" }\n",
" rows = []\n",
" while body is not None:\n",
@@ -239,24 +250,39 @@
" # back off (the catalog limits request rates)\n",
" time.sleep(2**attempt)\n",
" rows += [\n",
- " {\"region\": name, \"product\": f[\"id\"], \"platform\": f[\"properties\"][\"platform\"], \"datatake\": f[\"properties\"][\"s2:datatake_id\"]}\n",
+ " {\n",
+ " \"region\": name,\n",
+ " \"product\": f[\"id\"],\n",
+ " \"platform\": f[\"properties\"][\"platform\"],\n",
+ " \"datatake\": f[\"properties\"][\"s2:datatake_id\"],\n",
+ " }\n",
" for f in page[\"features\"]\n",
" ]\n",
- " following = [link for link in page.get(\"links\", []) if link.get(\"rel\") == \"next\"]\n",
+ " following = [\n",
+ " link for link in page.get(\"links\", []) if link.get(\"rel\") == \"next\"\n",
+ " ]\n",
" body = following[0].get(\"body\") if following else None\n",
" cache.write_text(json.dumps(rows))\n",
" return rows\n",
"\n",
"\n",
- "products = pd.DataFrame([row for name, region in regions.items() for row in search(name, region)])\n",
- "products[\"datatake_start\"] = pd.to_datetime(products.datatake.str.extract(r\"_(\\d{8}T\\d{6})_\")[0], format=\"%Y%m%dT%H%M%S\", utc=True)\n",
+ "products = pd.DataFrame(\n",
+ " [row for name, region in regions.items() for row in search(name, region)]\n",
+ ")\n",
+ "products[\"datatake_start\"] = pd.to_datetime(\n",
+ " products.datatake.str.extract(r\"_(\\d{8}T\\d{6})_\")[0],\n",
+ " format=\"%Y%m%dT%H%M%S\",\n",
+ " utc=True,\n",
+ ")\n",
"observed = (\n",
" products[products.platform.isin(PLATFORMS)]\n",
" .groupby([\"region\", \"platform\", \"datatake\"], as_index=False)\n",
" .agg(datatake_start=(\"datatake_start\", \"first\"), products=(\"product\", \"size\"))\n",
" .sort_values([\"region\", \"datatake_start\"], ignore_index=True)\n",
")\n",
- "products.groupby([\"region\", \"platform\"]).agg(products=(\"product\", \"size\"), passes=(\"datatake\", \"nunique\")).unstack(fill_value=0).reindex(REGION_NAMES)"
+ "products.groupby([\"region\", \"platform\"]).agg(\n",
+ " products=(\"product\", \"size\"), passes=(\"datatake\", \"nunique\")\n",
+ ").unstack(fill_value=0).reindex(REGION_NAMES)"
]
},
{
@@ -296,7 +322,12 @@
"import geopandas as gpd\n",
"import matplotlib.pyplot as plt\n",
"\n",
- "from tatc.analysis import aggregate_observations, collect_ground_track, collect_multi_region_observations, reduce_observations\n",
+ "from tatc.analysis import (\n",
+ " aggregate_observations,\n",
+ " collect_ground_track,\n",
+ " collect_multi_region_observations,\n",
+ " reduce_observations,\n",
+ ")\n",
"from skyfield.api import wgs84\n",
"\n",
"from tatc.constants import de421, timescale\n",
@@ -314,14 +345,26 @@
")\n",
"SPLIT_REGIONS = {name: split_polygon(region) for name, region in regions.items()}\n",
"REGION_NAMES_BY_HASH = {hash_geometry(region): name for name, region in regions.items()}\n",
- "satellites = {name: Satellite(name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle), instruments=[msi]) for name, tle in TLES.items()}\n",
+ "satellites = {\n",
+ " name: Satellite(\n",
+ " name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle), instruments=[msi]\n",
+ " )\n",
+ " for name, tle in TLES.items()\n",
+ "}\n",
"\n",
"\n",
"def summarize(x):\n",
" \"\"\"Summary statistics of a residual sample.\"\"\"\n",
" x = np.asarray(x, dtype=float)\n",
" x = x[np.isfinite(x)]\n",
- " return pd.Series({\"n\": x.size, \"median\": np.median(x), \"p95 |x|\": np.percentile(np.abs(x), 95), \"max |x|\": np.abs(x).max()})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": x.size,\n",
+ " \"median\": np.median(x),\n",
+ " \"p95 |x|\": np.percentile(np.abs(x), 95),\n",
+ " \"max |x|\": np.abs(x).max(),\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
@@ -340,10 +383,23 @@
"ax = fig.add_subplot(1, 1, 1, projection=ccrs.Robinson(central_longitude=150))\n",
"ax.set_global()\n",
"ax.coastlines(color=GRAY, linewidth=0.5)\n",
- "ax.add_geometries(list(regions.values()), crs=ccrs.PlateCarree(), facecolor=BLUE, edgecolor=INK, linewidth=0.4)\n",
+ "ax.add_geometries(\n",
+ " list(regions.values()),\n",
+ " crs=ccrs.PlateCarree(),\n",
+ " facecolor=BLUE,\n",
+ " edgecolor=INK,\n",
+ " linewidth=0.4,\n",
+ ")\n",
"for name, region in regions.items():\n",
" point = region.representative_point()\n",
- " ax.annotate(name, (point.x, point.y), xytext=(6, 4), textcoords=\"offset points\", fontsize=8, transform=ccrs.PlateCarree())\n",
+ " ax.annotate(\n",
+ " name,\n",
+ " (point.x, point.y),\n",
+ " xytext=(6, 4),\n",
+ " textcoords=\"offset points\",\n",
+ " fontsize=8,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
"ax.set_title(\"Regions of interest\", fontsize=9)\n",
"plt.show()"
]
@@ -497,56 +553,94 @@
"def solar_elevation(row, instrument):\n",
" \"\"\"Solar elevation (deg) at an observation's midpoint, at the point of the region within the footprint at which TAT-C checks illumination.\"\"\"\n",
" midpoint = (row.start + (row.end - row.start) / 2).round(\"us\").to_pydatetime()\n",
- " orbit_track = satellites[row.platform].orbit.to_gp_orbit().get_orbit_track([midpoint])\n",
+ " orbit_track = (\n",
+ " satellites[row.platform].orbit.to_gp_orbit().get_orbit_track([midpoint])\n",
+ " )\n",
" region = SPLIT_REGIONS[row.region]\n",
" view = instrument.compute_footprint(orbit_track)[0].intersection(region)\n",
" point = (view if not view.is_empty else region).representative_point()\n",
" topos = de421[\"earth\"] + wgs84.latlon(point.y, point.x)\n",
- " return topos.at(timescale.from_datetime(midpoint)).observe(de421[\"sun\"]).apparent().altaz()[0].degrees\n",
+ " return (\n",
+ " topos.at(timescale.from_datetime(midpoint))\n",
+ " .observe(de421[\"sun\"])\n",
+ " .apparent()\n",
+ " .altaz()[0]\n",
+ " .degrees\n",
+ " )\n",
"\n",
"\n",
"def predict(instrument=msi):\n",
" \"\"\"Predicted observations of each region by each satellite, grouped into passes.\"\"\"\n",
- " members = [s.model_copy(update={\"instruments\": [instrument]}) for s in satellites.values()]\n",
+ " members = [\n",
+ " s.model_copy(update={\"instruments\": [instrument]}) for s in satellites.values()\n",
+ " ]\n",
" frames = []\n",
" for name, region in regions.items():\n",
" o = collect_multi_region_observations(region, members, START, END)\n",
" frames.append(o.assign(region=name).rename(columns={\"satellite\": \"platform\"}))\n",
- " o = pd.concat(frames, ignore_index=True).sort_values([\"region\", \"platform\", \"start\"], ignore_index=True)\n",
+ " o = pd.concat(frames, ignore_index=True).sort_values(\n",
+ " [\"region\", \"platform\", \"start\"], ignore_index=True\n",
+ " )\n",
" o[\"solar_alt\"] = [solar_elevation(row, instrument) for row in o.itertuples()]\n",
- " new_pass = (o.region != o.region.shift()) | (o.platform != o.platform.shift()) | (o.start - o.end.shift() > pd.Timedelta(minutes=10))\n",
+ " new_pass = (\n",
+ " (o.region != o.region.shift())\n",
+ " | (o.platform != o.platform.shift())\n",
+ " | (o.start - o.end.shift() > pd.Timedelta(minutes=10))\n",
+ " )\n",
" o[\"pass\"] = new_pass.cumsum()\n",
" return o\n",
"\n",
"\n",
"def passes(o):\n",
" \"\"\"Predicted passes: the span of each group of observations.\"\"\"\n",
- " return o.groupby(\"pass\").agg(\n",
- " region=(\"region\", \"first\"), platform=(\"platform\", \"first\"), start=(\"start\", \"min\"), end=(\"end\", \"max\"),\n",
- " observations=(\"start\", \"size\"), solar_alt=(\"solar_alt\", \"max\"),\n",
- " ).reset_index()\n",
+ " return (\n",
+ " o.groupby(\"pass\")\n",
+ " .agg(\n",
+ " region=(\"region\", \"first\"),\n",
+ " platform=(\"platform\", \"first\"),\n",
+ " start=(\"start\", \"min\"),\n",
+ " end=(\"end\", \"max\"),\n",
+ " observations=(\"start\", \"size\"),\n",
+ " solar_alt=(\"solar_alt\", \"max\"),\n",
+ " )\n",
+ " .reset_index()\n",
+ " )\n",
"\n",
"\n",
"def match(predicted_passes):\n",
" \"\"\"Match predicted passes to observed passes (datatakes) of the same region and satellite.\"\"\"\n",
" pairs = predicted_passes.merge(observed, on=[\"region\", \"platform\"])\n",
- " pairs = pairs[(pairs.datatake_start >= pairs.start - pd.Timedelta(minutes=45)) & (pairs.datatake_start <= pairs.end + pd.Timedelta(minutes=1))]\n",
+ " pairs = pairs[\n",
+ " (pairs.datatake_start >= pairs.start - pd.Timedelta(minutes=45))\n",
+ " & (pairs.datatake_start <= pairs.end + pd.Timedelta(minutes=1))\n",
+ " ]\n",
" p = predicted_passes.assign(acquired=predicted_passes[\"pass\"].isin(pairs[\"pass\"]))\n",
- " o = observed.assign(predicted=observed.set_index([\"region\", \"datatake\"]).index.isin(pairs.set_index([\"region\", \"datatake\"]).index))\n",
+ " o = observed.assign(\n",
+ " predicted=observed.set_index([\"region\", \"datatake\"]).index.isin(\n",
+ " pairs.set_index([\"region\", \"datatake\"]).index\n",
+ " )\n",
+ " )\n",
" return p, o\n",
"\n",
"\n",
"predicted = predict()\n",
"predicted_passes, observed1 = match(passes(predicted))\n",
- "table1 = pd.DataFrame(\n",
- " {\n",
- " \"observed passes\": observed1.groupby(\"region\").size(),\n",
- " \"observed passes predicted\": observed1.groupby(\"region\").predicted.sum(),\n",
- " \"predicted passes\": predicted_passes.groupby(\"region\").size(),\n",
- " \"predicted passes acquired\": predicted_passes.groupby(\"region\").acquired.sum(),\n",
- " \"predicted observations\": predicted.groupby(\"region\").size(),\n",
- " }\n",
- ").reindex(REGION_NAMES).fillna(0).astype(int)\n",
+ "table1 = (\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"observed passes\": observed1.groupby(\"region\").size(),\n",
+ " \"observed passes predicted\": observed1.groupby(\"region\").predicted.sum(),\n",
+ " \"predicted passes\": predicted_passes.groupby(\"region\").size(),\n",
+ " \"predicted passes acquired\": predicted_passes.groupby(\n",
+ " \"region\"\n",
+ " ).acquired.sum(),\n",
+ " \"predicted observations\": predicted.groupby(\"region\").size(),\n",
+ " }\n",
+ " )\n",
+ " .reindex(REGION_NAMES)\n",
+ " .fillna(0)\n",
+ " .astype(int)\n",
+ ")\n",
"table1.loc[\"total\"] = table1.sum()\n",
"table1"
]
@@ -686,16 +780,38 @@
"source": [
"# swath edge: passes not predicted with the cross-track field of view of the\n",
"# swath in which all bands have valid data (+/-10.2 deg)\n",
- "narrow = predict(msi.model_copy(update={\"name\": \"MSI (valid swath)\", \"cross_track_field_of_view\": 20.4}))\n",
+ "narrow = predict(\n",
+ " msi.model_copy(\n",
+ " update={\"name\": \"MSI (valid swath)\", \"cross_track_field_of_view\": 20.4}\n",
+ " )\n",
+ ")\n",
"narrow_passes = passes(narrow)\n",
- "overlap = predicted_passes.merge(narrow_passes, on=[\"region\", \"platform\"], suffixes=(\"\", \"_narrow\"))\n",
- "overlap = overlap[(overlap.start_narrow <= overlap.end) & (overlap.end_narrow >= overlap.start)]\n",
+ "overlap = predicted_passes.merge(\n",
+ " narrow_passes, on=[\"region\", \"platform\"], suffixes=(\"\", \"_narrow\")\n",
+ ")\n",
+ "overlap = overlap[\n",
+ " (overlap.start_narrow <= overlap.end) & (overlap.end_narrow >= overlap.start)\n",
+ "]\n",
"predicted_passes[\"cause\"] = \"acquired\"\n",
"missed = ~predicted_passes.acquired\n",
"predicted_passes.loc[missed & (predicted_passes.solar_alt < 10), \"cause\"] = \"low Sun\"\n",
- "predicted_passes.loc[missed & (predicted_passes.cause == \"acquired\") & ~predicted_passes[\"pass\"].isin(overlap[\"pass\"]), \"cause\"] = \"swath edge\"\n",
+ "predicted_passes.loc[\n",
+ " missed\n",
+ " & (predicted_passes.cause == \"acquired\")\n",
+ " & ~predicted_passes[\"pass\"].isin(overlap[\"pass\"]),\n",
+ " \"cause\",\n",
+ "] = \"swath edge\"\n",
"predicted_passes.loc[missed & (predicted_passes.cause == \"acquired\"), \"cause\"] = \"other\"\n",
- "causes1 = predicted_passes.groupby([\"region\", \"cause\"]).size().unstack(fill_value=0).reindex(index=REGION_NAMES, columns=[\"acquired\", \"low Sun\", \"swath edge\", \"other\"], fill_value=0)\n",
+ "causes1 = (\n",
+ " predicted_passes.groupby([\"region\", \"cause\"])\n",
+ " .size()\n",
+ " .unstack(fill_value=0)\n",
+ " .reindex(\n",
+ " index=REGION_NAMES,\n",
+ " columns=[\"acquired\", \"low Sun\", \"swath edge\", \"other\"],\n",
+ " fill_value=0,\n",
+ " )\n",
+ ")\n",
"causes1.loc[\"total\"] = causes1.sum()\n",
"causes1"
]
@@ -1242,8 +1358,16 @@
"# solar elevation (deg) at the region within the footprint, of acquired and other predicted passes\n",
"display(predicted_passes.groupby(\"cause\").solar_alt.describe().round(1))\n",
"# predicted passes not acquired, and observed passes not predicted\n",
- "display(predicted_passes[predicted_passes.cause != \"acquired\"][[\"region\", \"platform\", \"start\", \"end\", \"observations\", \"solar_alt\", \"cause\"]])\n",
- "display(observed1[~observed1.predicted][[\"region\", \"platform\", \"datatake\", \"datatake_start\", \"products\"]])"
+ "display(\n",
+ " predicted_passes[predicted_passes.cause != \"acquired\"][\n",
+ " [\"region\", \"platform\", \"start\", \"end\", \"observations\", \"solar_alt\", \"cause\"]\n",
+ " ]\n",
+ ")\n",
+ "display(\n",
+ " observed1[~observed1.predicted][\n",
+ " [\"region\", \"platform\", \"datatake\", \"datatake_start\", \"products\"]\n",
+ " ]\n",
+ ")"
]
},
{
@@ -1345,22 +1469,47 @@
"def footprint_times(row, center):\n",
" \"\"\"Times, at 0.1 s intervals within 2 s of a time, at which the footprint intersects the region.\"\"\"\n",
" center = center.round(\"us\")\n",
- " times = pd.date_range(center - pd.Timedelta(seconds=2), center + pd.Timedelta(seconds=2), freq=\"100ms\").to_pydatetime().tolist()\n",
- " return collect_ground_track(satellites[row.platform], times, mask=regions[row.region]).time\n",
+ " times = (\n",
+ " pd.date_range(\n",
+ " center - pd.Timedelta(seconds=2),\n",
+ " center + pd.Timedelta(seconds=2),\n",
+ " freq=\"100ms\",\n",
+ " )\n",
+ " .to_pydatetime()\n",
+ " .tolist()\n",
+ " )\n",
+ " return collect_ground_track(\n",
+ " satellites[row.platform], times, mask=regions[row.region]\n",
+ " ).time\n",
"\n",
"\n",
"def footprint_period(row):\n",
" \"\"\"First footprint intersecting the region near the start, and last near the end.\"\"\"\n",
" first, last = footprint_times(row, row.start), footprint_times(row, row.end)\n",
- " return pd.Series({\"first\": first.min() if len(first) else pd.NaT, \"last\": last.max() if len(last) else pd.NaT})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"first\": first.min() if len(first) else pd.NaT,\n",
+ " \"last\": last.max() if len(last) else pd.NaT,\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"periods2 = pd.concat([predicted, predicted.apply(footprint_period, axis=1)], axis=1)\n",
- "periods2[\"start difference (s)\"] = (periods2[\"first\"] - periods2.start).dt.total_seconds()\n",
+ "periods2[\"start difference (s)\"] = (\n",
+ " periods2[\"first\"] - periods2.start\n",
+ ").dt.total_seconds()\n",
"periods2[\"end difference (s)\"] = (periods2.end - periods2[\"last\"]).dt.total_seconds()\n",
"periods2[\"duration (s)\"] = (periods2.end - periods2.start).dt.total_seconds()\n",
- "print(\"observations without an intersecting footprint:\", int(periods2[\"first\"].isna().sum()))\n",
- "pd.DataFrame({column: summarize(periods2[column]) for column in [\"duration (s)\", \"start difference (s)\", \"end difference (s)\"]}).T"
+ "print(\n",
+ " \"observations without an intersecting footprint:\",\n",
+ " int(periods2[\"first\"].isna().sum()),\n",
+ ")\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " column: summarize(periods2[column])\n",
+ " for column in [\"duration (s)\", \"start difference (s)\", \"end difference (s)\"]\n",
+ " }\n",
+ ").T"
]
},
{
@@ -1390,11 +1539,25 @@
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
"for k, (name, frame) in enumerate(periods2.groupby(\"region\", sort=False)):\n",
" y = np.full(len(frame), REGION_IDS[name])\n",
- " ax.scatter(frame[\"start difference (s)\"], y - 0.12, s=10, color=BLUE, label=\"first footprint after start\" if k == 0 else None)\n",
- " ax.scatter(frame[\"end difference (s)\"], y + 0.12, s=10, color=ORANGE, label=\"last footprint before end\" if k == 0 else None)\n",
+ " ax.scatter(\n",
+ " frame[\"start difference (s)\"],\n",
+ " y - 0.12,\n",
+ " s=10,\n",
+ " color=BLUE,\n",
+ " label=\"first footprint after start\" if k == 0 else None,\n",
+ " )\n",
+ " ax.scatter(\n",
+ " frame[\"end difference (s)\"],\n",
+ " y + 0.12,\n",
+ " s=10,\n",
+ " color=ORANGE,\n",
+ " label=\"last footprint before end\" if k == 0 else None,\n",
+ " )\n",
"ax.set_yticks(range(len(REGION_NAMES)), REGION_NAMES)\n",
"ax.axvline(0, color=GRAY, lw=0.8)\n",
- "ax.set(xlabel=\"Time (s)\", title=\"Observation periods vs. footprints sampled every 0.1 s\")\n",
+ "ax.set(\n",
+ " xlabel=\"Time (s)\", title=\"Observation periods vs. footprints sampled every 0.1 s\"\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1510,11 +1673,19 @@
"def footprint_union(row):\n",
" \"\"\"Union of the footprints sampled every 1 s over an observation (and at its end), clipped to the region.\"\"\"\n",
" start, end = row.start.round(\"us\"), row.end.round(\"us\")\n",
- " times = pd.date_range(start, end, freq=\"1s\").to_pydatetime().tolist() + [end.to_pydatetime()]\n",
- " track = collect_ground_track(satellites[row.platform], times, mask=regions[row.region])\n",
+ " times = pd.date_range(start, end, freq=\"1s\").to_pydatetime().tolist() + [\n",
+ " end.to_pydatetime()\n",
+ " ]\n",
+ " track = collect_ground_track(\n",
+ " satellites[row.platform], times, mask=regions[row.region]\n",
+ " )\n",
" if not len(track):\n",
" return None\n",
- " return polygonal(shapely.union_all(track.geometry.to_numpy(), grid_size=GRID).intersection(SPLIT_REGIONS[row.region], grid_size=GRID))\n",
+ " return polygonal(\n",
+ " shapely.union_all(track.geometry.to_numpy(), grid_size=GRID).intersection(\n",
+ " SPLIT_REGIONS[row.region], grid_size=GRID\n",
+ " )\n",
+ " )\n",
"\n",
"\n",
"EQUAL_AREA = \"EPSG:6933\"\n",
@@ -1522,7 +1693,10 @@
"\n",
"def area(geometries):\n",
" \"\"\"Area (km2) in an equal-area projection.\"\"\"\n",
- " return gpd.GeoSeries(geometries, crs=\"EPSG:4326\").to_crs(EQUAL_AREA).area.to_numpy() / 1e6\n",
+ " return (\n",
+ " gpd.GeoSeries(geometries, crs=\"EPSG:4326\").to_crs(EQUAL_AREA).area.to_numpy()\n",
+ " / 1e6\n",
+ " )\n",
"\n",
"\n",
"sampled = [footprint_union(row) for row in predicted.itertuples()]\n",
@@ -1568,15 +1742,35 @@
"source": [
"name = \"Japan\"\n",
"frame = predicted[predicted.region == name]\n",
- "fig, axes = plt.subplots(1, 2, figsize=(10, 4.6), subplot_kw={\"projection\": ccrs.PlateCarree()})\n",
+ "fig, axes = plt.subplots(\n",
+ " 1, 2, figsize=(10, 4.6), subplot_kw={\"projection\": ccrs.PlateCarree()}\n",
+ ")\n",
"for ax, platform in zip(axes, PLATFORMS):\n",
" ax.set_extent([127, 147, 29, 46], crs=ccrs.PlateCarree())\n",
" ax.coastlines(color=GRAY, linewidth=0.5)\n",
" swaths = frame[frame.platform == platform]\n",
- " ax.add_geometries(swaths.geometry, crs=ccrs.PlateCarree(), facecolor=PLATFORM_COLORS[platform], edgecolor=\"none\", alpha=0.3)\n",
- " ax.add_geometries([regions[name]], crs=ccrs.PlateCarree(), facecolor=\"none\", edgecolor=INK, linewidth=0.6)\n",
- " ax.set_title(f\"{platform}: {swaths['pass'].nunique()} passes, {len(swaths)} swaths\", fontsize=9)\n",
- "fig.suptitle(f\"Predicted swaths over {name}, {START:%d} to {END - timedelta(days=1):%d %B %Y} (overlaps darker)\", fontsize=10)\n",
+ " ax.add_geometries(\n",
+ " swaths.geometry,\n",
+ " crs=ccrs.PlateCarree(),\n",
+ " facecolor=PLATFORM_COLORS[platform],\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.3,\n",
+ " )\n",
+ " ax.add_geometries(\n",
+ " [regions[name]],\n",
+ " crs=ccrs.PlateCarree(),\n",
+ " facecolor=\"none\",\n",
+ " edgecolor=INK,\n",
+ " linewidth=0.6,\n",
+ " )\n",
+ " ax.set_title(\n",
+ " f\"{platform}: {swaths['pass'].nunique()} passes, {len(swaths)} swaths\",\n",
+ " fontsize=9,\n",
+ " )\n",
+ "fig.suptitle(\n",
+ " f\"Predicted swaths over {name}, {START:%d} to {END - timedelta(days=1):%d %B %Y} (overlaps darker)\",\n",
+ " fontsize=10,\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()"
]
@@ -1761,14 +1955,21 @@
" reduced = reduce_observations(aggregate_observations(frame))\n",
" reduced[\"region\"] = reduced.target_hash.map(REGION_NAMES_BY_HASH)\n",
" reduced[\"revisit (days)\"] = reduced.revisit.dt.total_seconds() / 86400\n",
- " return reduced.set_index(\"region\")[[\"samples\", \"revisit (days)\"]].reindex(REGION_NAMES)\n",
+ " return reduced.set_index(\"region\")[[\"samples\", \"revisit (days)\"]].reindex(\n",
+ " REGION_NAMES\n",
+ " )\n",
"\n",
"\n",
- "midpoints = predicted_passes.assign(midpoint=predicted_passes.start + (predicted_passes.end - predicted_passes.start) / 2)\n",
+ "midpoints = predicted_passes.assign(\n",
+ " midpoint=predicted_passes.start\n",
+ " + (predicted_passes.end - predicted_passes.start) / 2\n",
+ ")\n",
"o3 = revisit_statistics(as_observations(observed1, \"datatake_start\"))\n",
"p3 = revisit_statistics(as_observations(midpoints, \"midpoint\"))\n",
"a3 = revisit_statistics(as_observations(midpoints[midpoints.acquired], \"midpoint\"))\n",
- "pd.concat({\"observed\": o3, \"predicted\": p3, \"predicted, acquired passes\": a3}, axis=1).round(2)"
+ "pd.concat(\n",
+ " {\"observed\": o3, \"predicted\": p3, \"predicted, acquired passes\": a3}, axis=1\n",
+ ").round(2)"
]
},
{
@@ -1867,13 +2068,31 @@
"source": [
"def coverage(frame):\n",
" \"\"\"Percentage of the area of each region within the union of its swaths (see reduce_observations).\"\"\"\n",
- " reduced = reduce_observations(aggregate_observations(frame.rename(columns={\"platform\": \"satellite\"})[[\"target_hash\", \"geometry\", \"satellite\", \"instrument\", \"start\", \"end\"]]))\n",
+ " reduced = reduce_observations(\n",
+ " aggregate_observations(\n",
+ " frame.rename(columns={\"platform\": \"satellite\"})[\n",
+ " [\"target_hash\", \"geometry\", \"satellite\", \"instrument\", \"start\", \"end\"]\n",
+ " ]\n",
+ " )\n",
+ " )\n",
" reduced[\"region\"] = reduced.target_hash.map(REGION_NAMES_BY_HASH)\n",
- " return pd.Series(100 * area(reduced.geometry) / area([SPLIT_REGIONS[name] for name in reduced.region]), index=reduced.region).reindex(REGION_NAMES)\n",
+ " return pd.Series(\n",
+ " 100\n",
+ " * area(reduced.geometry)\n",
+ " / area([SPLIT_REGIONS[name] for name in reduced.region]),\n",
+ " index=reduced.region,\n",
+ " ).reindex(REGION_NAMES)\n",
"\n",
"\n",
- "acquired = predicted[\"pass\"].isin(predicted_passes.loc[predicted_passes.acquired, \"pass\"])\n",
- "pd.DataFrame({\"predicted passes\": coverage(predicted), \"predicted passes, acquired\": coverage(predicted[acquired])}).round(1).rename_axis(\"region coverage (%)\", axis=1)"
+ "acquired = predicted[\"pass\"].isin(\n",
+ " predicted_passes.loc[predicted_passes.acquired, \"pass\"]\n",
+ ")\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " \"predicted passes\": coverage(predicted),\n",
+ " \"predicted passes, acquired\": coverage(predicted[acquired]),\n",
+ " }\n",
+ ").round(1).rename_axis(\"region coverage (%)\", axis=1)"
]
},
{
diff --git a/docs/validation/ValidateRevisitSentinel2.ipynb b/docs/validation/ValidateRevisitSentinel2.ipynb
index 6995fcf3..e59c3794 100644
--- a/docs/validation/ValidateRevisitSentinel2.ipynb
+++ b/docs/validation/ValidateRevisitSentinel2.ipynb
@@ -102,10 +102,20 @@
"}\n",
"GPS_UTC = 18 # s\n",
"\n",
- "land = unary_union(list(shpreader.Reader(shpreader.natural_earth(resolution=\"110m\", category=\"physical\", name=\"land\")).geometries()))\n",
+ "land = unary_union(\n",
+ " list(\n",
+ " shpreader.Reader(\n",
+ " shpreader.natural_earth(resolution=\"110m\", category=\"physical\", name=\"land\")\n",
+ " ).geometries()\n",
+ " )\n",
+ ")\n",
"prepare(land)\n",
"lattice = generate_points_fibonacci_lattice(500e3)\n",
- "on_land = contains_xy(land, lattice.geometry.x, lattice.geometry.y) & (lattice.geometry.y > -56) & (lattice.geometry.y < 82.8)\n",
+ "on_land = (\n",
+ " contains_xy(land, lattice.geometry.x, lattice.geometry.y)\n",
+ " & (lattice.geometry.y > -56)\n",
+ " & (lattice.geometry.y < 82.8)\n",
+ ")\n",
"points = lattice[on_land].reset_index(drop=True)\n",
"points[\"point_id\"] = points.index\n",
"\n",
@@ -126,10 +136,22 @@
" \"\"\"Catalog products whose valid data footprint contains a point during the analysis period.\"\"\"\n",
" body = {\n",
" \"collections\": [\"sentinel-2-l2a\"],\n",
- " \"intersects\": {\"type\": \"Point\", \"coordinates\": [point.geometry.x, point.geometry.y]},\n",
+ " \"intersects\": {\n",
+ " \"type\": \"Point\",\n",
+ " \"coordinates\": [point.geometry.x, point.geometry.y],\n",
+ " },\n",
" \"datetime\": f\"{START:%Y-%m-%dT%H:%M:%SZ}/{END - timedelta(seconds=1):%Y-%m-%dT%H:%M:%SZ}\",\n",
" \"limit\": 1000,\n",
- " \"fields\": {\"include\": [\"id\", \"properties.platform\", \"properties.s2:datatake_id\", \"properties.s2:datastrip_id\", \"assets.datastrip-metadata.href\"], \"exclude\": [\"links\", \"geometry\"]},\n",
+ " \"fields\": {\n",
+ " \"include\": [\n",
+ " \"id\",\n",
+ " \"properties.platform\",\n",
+ " \"properties.s2:datatake_id\",\n",
+ " \"properties.s2:datastrip_id\",\n",
+ " \"assets.datastrip-metadata.href\",\n",
+ " ],\n",
+ " \"exclude\": [\"links\", \"geometry\"],\n",
+ " },\n",
" }\n",
" cache = SEARCH_DIR / f\"{point.point_id}.json\"\n",
" if cache.exists():\n",
@@ -164,11 +186,17 @@
"if not PRODUCTS_FILE.exists():\n",
" SEARCH_DIR.mkdir(exist_ok=True)\n",
" with concurrent.futures.ThreadPoolExecutor(4) as pool:\n",
- " pd.DataFrame([r for rows in pool.map(search, points.itertuples()) for r in rows]).to_csv(PRODUCTS_FILE, index=False)\n",
+ " pd.DataFrame(\n",
+ " [r for rows in pool.map(search, points.itertuples()) for r in rows]\n",
+ " ).to_csv(PRODUCTS_FILE, index=False)\n",
"products = pd.read_csv(PRODUCTS_FILE)\n",
"# one observed pass per point and datatake (adjacent tiles overlap)\n",
"observed = products.drop_duplicates([\"point_id\", \"datatake\"]).copy()\n",
- "observed[\"datatake_start\"] = pd.to_datetime(observed.datatake.str.extract(r\"_(\\d{8}T\\d{6})_\")[0], format=\"%Y%m%dT%H%M%S\", utc=True)\n",
+ "observed[\"datatake_start\"] = pd.to_datetime(\n",
+ " observed.datatake.str.extract(r\"_(\\d{8}T\\d{6})_\")[0],\n",
+ " format=\"%Y%m%dT%H%M%S\",\n",
+ " utc=True,\n",
+ ")\n",
"pd.Series(\n",
" {\n",
" \"points\": len(points),\n",
@@ -289,27 +317,54 @@
"if not EPHEMERIS_FILE.exists():\n",
" token = get(TOKEN).json()[\"token\"]\n",
" strips = products.drop_duplicates(\"datastrip\").copy()\n",
- " strips[\"day\"] = pd.to_datetime(strips.datastrip.str.extract(r\"_S(\\d{8})T\")[0], format=\"%Y%m%d\", utc=True)\n",
- " strips = strips[((strips.day - pd.Timestamp(START)).dt.days % 2) == 0].groupby([\"platform\", \"day\"]).head(1)\n",
+ " strips[\"day\"] = pd.to_datetime(\n",
+ " strips.datastrip.str.extract(r\"_S(\\d{8})T\")[0], format=\"%Y%m%d\", utc=True\n",
+ " )\n",
+ " strips = (\n",
+ " strips[((strips.day - pd.Timestamp(START)).dt.days % 2) == 0]\n",
+ " .groupby([\"platform\", \"day\"])\n",
+ " .head(1)\n",
+ " )\n",
"\n",
" def read_ephemeris(row):\n",
- " root = ET.fromstring(strip_namespaces(get(f\"{row.datastrip_metadata}?{token}\").text))\n",
- " values = lambda p, kind: [float(v) / 1e3 for v in p.find(f\"{kind.upper()}_VALUES\").text.split()]\n",
+ " root = ET.fromstring(\n",
+ " strip_namespaces(get(f\"{row.datastrip_metadata}?{token}\").text)\n",
+ " )\n",
+ " values = lambda p, kind: [\n",
+ " float(v) / 1e3 for v in p.find(f\"{kind.upper()}_VALUES\").text.split()\n",
+ " ]\n",
" gps = root.findall(\".//GPS_Point\")\n",
" return pd.DataFrame(\n",
" {\n",
" \"platform\": row.platform,\n",
" \"datastrip\": row.datastrip,\n",
- " \"time\": [pd.Timestamp(p.find(\"GPS_TIME\").text, tz=\"UTC\") - pd.Timedelta(seconds=GPS_UTC) for p in gps],\n",
- " **{f\"position_{a}\": [values(p, \"position\")[i] for p in gps] for i, a in enumerate(\"xyz\")},\n",
- " **{f\"velocity_{a}\": [values(p, \"velocity\")[i] for p in gps] for i, a in enumerate(\"xyz\")},\n",
+ " \"time\": [\n",
+ " pd.Timestamp(p.find(\"GPS_TIME\").text, tz=\"UTC\")\n",
+ " - pd.Timedelta(seconds=GPS_UTC)\n",
+ " for p in gps\n",
+ " ],\n",
+ " **{\n",
+ " f\"position_{a}\": [values(p, \"position\")[i] for p in gps]\n",
+ " for i, a in enumerate(\"xyz\")\n",
+ " },\n",
+ " **{\n",
+ " f\"velocity_{a}\": [values(p, \"velocity\")[i] for p in gps]\n",
+ " for i, a in enumerate(\"xyz\")\n",
+ " },\n",
" }\n",
" )\n",
"\n",
" with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
- " pd.concat(pool.map(read_ephemeris, strips.itertuples())).to_csv(EPHEMERIS_FILE, index=False)\n",
+ " pd.concat(pool.map(read_ephemeris, strips.itertuples())).to_csv(\n",
+ " EPHEMERIS_FILE, index=False\n",
+ " )\n",
"ephemeris = pd.read_csv(EPHEMERIS_FILE, parse_dates=[\"time\"])\n",
- "ephemeris.groupby(\"platform\").agg(datastrips=(\"datastrip\", \"nunique\"), points=(\"time\", \"size\"), first=(\"time\", \"min\"), last=(\"time\", \"max\"))"
+ "ephemeris.groupby(\"platform\").agg(\n",
+ " datastrips=(\"datastrip\", \"nunique\"),\n",
+ " points=(\"time\", \"size\"),\n",
+ " first=(\"time\", \"min\"),\n",
+ " last=(\"time\", \"max\"),\n",
+ ")"
]
},
{
@@ -340,7 +395,11 @@
"import matplotlib.pyplot as plt\n",
"from skyfield.framelib import itrs\n",
"\n",
- "from tatc.analysis import aggregate_observations, collect_multi_observations, reduce_observations\n",
+ "from tatc.analysis import (\n",
+ " aggregate_observations,\n",
+ " collect_multi_observations,\n",
+ " reduce_observations,\n",
+ ")\n",
"from tatc.schemas import GeneralPerturbationsOrbit, Point, PointedInstrument, Satellite\n",
"\n",
"PLATFORMS = list(TLES)\n",
@@ -353,8 +412,15 @@
" is_rectangular=True,\n",
" req_target_sunlit=True,\n",
")\n",
- "satellites = {name: Satellite(name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle), instruments=[msi]) for name, tle in TLES.items()}\n",
- "TLE_EPOCH = {name: s.orbit.to_gp_orbit().elements[0].epoch for name, s in satellites.items()}\n",
+ "satellites = {\n",
+ " name: Satellite(\n",
+ " name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle), instruments=[msi]\n",
+ " )\n",
+ " for name, tle in TLES.items()\n",
+ "}\n",
+ "TLE_EPOCH = {\n",
+ " name: s.orbit.to_gp_orbit().elements[0].epoch for name, s in satellites.items()\n",
+ "}\n",
"\n",
"\n",
"def normalize(x):\n",
@@ -365,7 +431,14 @@
" \"\"\"Summary statistics of a residual sample.\"\"\"\n",
" x = np.asarray(x, dtype=float)\n",
" x = x[np.isfinite(x)]\n",
- " return pd.Series({\"n\": x.size, \"median\": np.median(x), \"p95 |x|\": np.percentile(np.abs(x), 95), \"max |x|\": np.abs(x).max()})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": x.size,\n",
+ " \"median\": np.median(x),\n",
+ " \"p95 |x|\": np.percentile(np.abs(x), 95),\n",
+ " \"max |x|\": np.abs(x).max(),\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
@@ -517,31 +590,57 @@
" e = ephemeris[ephemeris.platform == platform].iloc[::10]\n",
" position = e[[f\"position_{a}\" for a in \"xyz\"]].to_numpy()\n",
" velocity = e[[f\"velocity_{a}\" for a in \"xyz\"]].to_numpy()\n",
- " predicted = np.array(satellites[platform].orbit.to_gp_orbit().get_orbit_track(e.time.dt.to_pydatetime().tolist()).frame_xyz_and_velocity(itrs)[0].m).T\n",
+ " predicted = np.array(\n",
+ " satellites[platform]\n",
+ " .orbit.to_gp_orbit()\n",
+ " .get_orbit_track(e.time.dt.to_pydatetime().tolist())\n",
+ " .frame_xyz_and_velocity(itrs)[0]\n",
+ " .m\n",
+ " ).T\n",
" offset = predicted - position\n",
" radial = normalize(position)\n",
- " along = normalize(velocity - np.sum(velocity * radial, axis=-1, keepdims=True) * radial)\n",
+ " along = normalize(\n",
+ " velocity - np.sum(velocity * radial, axis=-1, keepdims=True) * radial\n",
+ " )\n",
" rows1.append(\n",
" pd.DataFrame(\n",
" {\n",
" \"platform\": platform,\n",
" \"datastrip\": e.datastrip.to_numpy(),\n",
- " \"days before TLE epoch\": (TLE_EPOCH[platform] - e.time).dt.total_seconds().to_numpy() / 86400,\n",
+ " \"days before TLE epoch\": (TLE_EPOCH[platform] - e.time)\n",
+ " .dt.total_seconds()\n",
+ " .to_numpy()\n",
+ " / 86400,\n",
" \"along-track (km)\": np.sum(offset * along, axis=-1) / 1e3,\n",
- " \"cross-track, right (km)\": np.sum(offset * np.cross(along, radial), axis=-1) / 1e3,\n",
+ " \"cross-track, right (km)\": np.sum(\n",
+ " offset * np.cross(along, radial), axis=-1\n",
+ " )\n",
+ " / 1e3,\n",
" \"radial (km)\": np.sum(offset * radial, axis=-1) / 1e3,\n",
" }\n",
" )\n",
" )\n",
"orbit1 = pd.concat(rows1)\n",
- "orbit1.groupby([\"platform\", \"datastrip\"]).median(numeric_only=True).reset_index().groupby(\"platform\").agg(\n",
+ "orbit1.groupby([\"platform\", \"datastrip\"]).median(\n",
+ " numeric_only=True\n",
+ ").reset_index().groupby(\"platform\").agg(\n",
" datastrips=(\"datastrip\", \"size\"),\n",
" days_min=(\"days before TLE epoch\", \"min\"),\n",
" days_max=(\"days before TLE epoch\", \"max\"),\n",
" along_max=(\"along-track (km)\", lambda x: x.abs().max()),\n",
" cross_max=(\"cross-track, right (km)\", lambda x: x.abs().max()),\n",
" radial_max=(\"radial (km)\", lambda x: x.abs().max()),\n",
- ").rename(columns={\"days_min\": \"days before epoch, min\", \"days_max\": \"days before epoch, max\", \"along_max\": \"along-track, max |x| (km)\", \"cross_max\": \"cross-track, max |x| (km)\", \"radial_max\": \"radial, max |x| (km)\"}).round(2)"
+ ").rename(\n",
+ " columns={\n",
+ " \"days_min\": \"days before epoch, min\",\n",
+ " \"days_max\": \"days before epoch, max\",\n",
+ " \"along_max\": \"along-track, max |x| (km)\",\n",
+ " \"cross_max\": \"cross-track, max |x| (km)\",\n",
+ " \"radial_max\": \"radial, max |x| (km)\",\n",
+ " }\n",
+ ").round(\n",
+ " 2\n",
+ ")"
]
},
{
@@ -570,13 +669,26 @@
],
"source": [
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
- "strips1 = orbit1.groupby([\"platform\", \"datastrip\"]).median(numeric_only=True).reset_index()\n",
+ "strips1 = (\n",
+ " orbit1.groupby([\"platform\", \"datastrip\"]).median(numeric_only=True).reset_index()\n",
+ ")\n",
"for platform in PLATFORMS:\n",
" s = strips1[strips1.platform == platform].sort_values(\"days before TLE epoch\")\n",
- " ax.plot(s[\"days before TLE epoch\"], s[\"along-track (km)\"], \"o-\", ms=4, color=PLATFORM_COLORS[platform], label=platform)\n",
+ " ax.plot(\n",
+ " s[\"days before TLE epoch\"],\n",
+ " s[\"along-track (km)\"],\n",
+ " \"o-\",\n",
+ " ms=4,\n",
+ " color=PLATFORM_COLORS[platform],\n",
+ " label=platform,\n",
+ " )\n",
"ax.axhline(0, color=GRAY, lw=0.8)\n",
"ax.invert_xaxis()\n",
- "ax.set(xlabel=\"Days before TLE epoch\", ylabel=\"Along-track offset, TAT-C minus GPS (km)\", title=\"Orbit propagation error over the analysis period\")\n",
+ "ax.set(\n",
+ " xlabel=\"Days before TLE epoch\",\n",
+ " ylabel=\"Along-track offset, TAT-C minus GPS (km)\",\n",
+ " title=\"Orbit propagation error over the analysis period\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -701,18 +813,45 @@
"source": [
"def predict(point, constellation=None):\n",
" constellation = list((constellation or satellites).values())\n",
- " return collect_multi_observations(Point(latitude=point.geometry.y, longitude=point.geometry.x), constellation, START, END, omit_solar=False).assign(point_id=point.point_id)\n",
+ " return collect_multi_observations(\n",
+ " Point(latitude=point.geometry.y, longitude=point.geometry.x),\n",
+ " constellation,\n",
+ " START,\n",
+ " END,\n",
+ " omit_solar=False,\n",
+ " ).assign(point_id=point.point_id)\n",
"\n",
"\n",
"def match(predicted):\n",
" \"\"\"Match predicted passes (epochs) to observed passes (datatakes) of the same satellite and point.\"\"\"\n",
- " p = predicted[[\"point_id\", \"satellite\", \"epoch\", \"start\", \"end\", \"solar_alt\"]].rename(columns={\"satellite\": \"platform\"}).sort_values(\"epoch\")\n",
- " o = observed[[\"point_id\", \"platform\", \"datatake\", \"datatake_start\"]].sort_values(\"datatake_start\")\n",
+ " p = (\n",
+ " predicted[[\"point_id\", \"satellite\", \"epoch\", \"start\", \"end\", \"solar_alt\"]]\n",
+ " .rename(columns={\"satellite\": \"platform\"})\n",
+ " .sort_values(\"epoch\")\n",
+ " )\n",
+ " o = observed[[\"point_id\", \"platform\", \"datatake\", \"datatake_start\"]].sort_values(\n",
+ " \"datatake_start\"\n",
+ " )\n",
" p[\"point_id\"] = p.point_id.astype(\"int64\")\n",
- " merged = pd.merge_asof(p, o, left_on=\"epoch\", right_on=\"datatake_start\", by=[\"point_id\", \"platform\"], direction=\"backward\", tolerance=pd.Timedelta(minutes=46))\n",
- " merged = merged[merged.datatake.isna() | (merged.epoch - merged.datatake_start <= pd.Timedelta(minutes=45))]\n",
+ " merged = pd.merge_asof(\n",
+ " p,\n",
+ " o,\n",
+ " left_on=\"epoch\",\n",
+ " right_on=\"datatake_start\",\n",
+ " by=[\"point_id\", \"platform\"],\n",
+ " direction=\"backward\",\n",
+ " tolerance=pd.Timedelta(minutes=46),\n",
+ " )\n",
+ " merged = merged[\n",
+ " merged.datatake.isna()\n",
+ " | (merged.epoch - merged.datatake_start <= pd.Timedelta(minutes=45))\n",
+ " ]\n",
" hit = merged.datatake.notna()\n",
- " observed_only = o[~o.set_index([\"point_id\", \"datatake\"]).index.isin(merged[hit].set_index([\"point_id\", \"datatake\"]).index)]\n",
+ " observed_only = o[\n",
+ " ~o.set_index([\"point_id\", \"datatake\"]).index.isin(\n",
+ " merged[hit].set_index([\"point_id\", \"datatake\"]).index\n",
+ " )\n",
+ " ]\n",
" return merged, observed_only\n",
"\n",
"\n",
@@ -730,7 +869,10 @@
" \"observed only\": int((observed_only2.platform == platform).sum()),\n",
" \"observed passes matched (%)\": 100 * m.datatake.notna().sum() / n_observed,\n",
" \"predicted passes acquired (%)\": 100 * m.datatake.notna().sum() / len(m),\n",
- " \"epoch after datatake start, max (min)\": (m.epoch - m.datatake_start).max().total_seconds() / 60,\n",
+ " \"epoch after datatake start, max (min)\": (m.epoch - m.datatake_start)\n",
+ " .max()\n",
+ " .total_seconds()\n",
+ " / 60,\n",
" }\n",
"pd.DataFrame(rows2).T.round(1)"
]
@@ -769,7 +911,16 @@
" m = merged2[merged2.platform == platform]\n",
" acquired = m.groupby(\"point_id\").datatake.apply(lambda d: d.notna().mean())\n",
" xy = points.set_index(\"point_id\").loc[acquired.index].geometry\n",
- " sc = ax.scatter(xy.x, xy.y, c=100 * acquired.to_numpy(), s=8, cmap=\"viridis\", vmin=0, vmax=100, transform=ccrs.PlateCarree())\n",
+ " sc = ax.scatter(\n",
+ " xy.x,\n",
+ " xy.y,\n",
+ " c=100 * acquired.to_numpy(),\n",
+ " s=8,\n",
+ " cmap=\"viridis\",\n",
+ " vmin=0,\n",
+ " vmax=100,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ " )\n",
" ax.set_title(f\"{platform}: predicted passes acquired (%)\", fontsize=9)\n",
"fig.colorbar(sc, ax=fig.axes, shrink=0.6, label=\"Predicted passes acquired (%)\")\n",
"plt.show()"
@@ -935,12 +1086,23 @@
"nominal = merged2[merged2.platform.isin([\"Sentinel-2B\", \"Sentinel-2C\"])].copy()\n",
"nominal[\"acquired\"] = nominal.datatake.notna()\n",
"nominal[\"t\"] = (nominal.epoch - pd.Timestamp(START)).dt.total_seconds()\n",
- "acquired_epochs = {platform: np.sort(g.t[g.acquired].to_numpy()) for platform, g in nominal.groupby(\"platform\")}\n",
+ "acquired_epochs = {\n",
+ " platform: np.sort(g.t[g.acquired].to_numpy())\n",
+ " for platform, g in nominal.groupby(\"platform\")\n",
+ "}\n",
"\n",
"\n",
"def cross_track_angle(row):\n",
- " track = satellites[row.platform].orbit.to_gp_orbit().get_orbit_track(row.epoch.to_pydatetime())\n",
- " _, cross = compute_view_tangents(track, wgs84.latlon(geometry.loc[row.point_id].y, geometry.loc[row.point_id].x), msi.velocity_frame)\n",
+ " track = (\n",
+ " satellites[row.platform]\n",
+ " .orbit.to_gp_orbit()\n",
+ " .get_orbit_track(row.epoch.to_pydatetime())\n",
+ " )\n",
+ " _, cross = compute_view_tangents(\n",
+ " track,\n",
+ " wgs84.latlon(geometry.loc[row.point_id].y, geometry.loc[row.point_id].x),\n",
+ " msi.velocity_frame,\n",
+ " )\n",
" return float(np.degrees(np.arctan(np.ravel(cross)[0])))\n",
"\n",
"\n",
@@ -954,21 +1116,43 @@
"nominal[\"cross\"] = [cross_track_angle(row) for row in nominal.itertuples()]\n",
"missed = ~nominal.acquired\n",
"nominal[\"cause\"] = \"acquired\"\n",
- "gap = missed & np.array([nearest_acquisition(row) > 300 for row in nominal.itertuples()])\n",
+ "gap = missed & np.array(\n",
+ " [nearest_acquisition(row) > 300 for row in nominal.itertuples()]\n",
+ ")\n",
"nominal.loc[gap, \"cause\"] = \"catalog gap\"\n",
"nominal.loc[missed & ~gap & (nominal.solar_alt < 10), \"cause\"] = \"low Sun\"\n",
- "nominal.loc[missed & ~gap & (nominal.solar_alt >= 10) & (nominal.cross.abs() > 10.2), \"cause\"] = \"swath edge\"\n",
+ "nominal.loc[\n",
+ " missed & ~gap & (nominal.solar_alt >= 10) & (nominal.cross.abs() > 10.2), \"cause\"\n",
+ "] = \"swath edge\"\n",
"nominal.loc[(nominal.cause == \"acquired\") & missed, \"cause\"] = \"other\"\n",
- "causes = nominal.groupby([\"platform\", \"cause\"]).size().unstack(fill_value=0)[[\"acquired\", \"catalog gap\", \"low Sun\", \"swath edge\", \"other\"]]\n",
- "causes[\"acquired, excluding catalog gaps (%)\"] = 100 * causes.acquired / (causes.sum(axis=1) - causes[\"catalog gap\"])\n",
+ "causes = (\n",
+ " nominal.groupby([\"platform\", \"cause\"])\n",
+ " .size()\n",
+ " .unstack(fill_value=0)[\n",
+ " [\"acquired\", \"catalog gap\", \"low Sun\", \"swath edge\", \"other\"]\n",
+ " ]\n",
+ ")\n",
+ "causes[\"acquired, excluding catalog gaps (%)\"] = (\n",
+ " 100 * causes.acquired / (causes.sum(axis=1) - causes[\"catalog gap\"])\n",
+ ")\n",
"pd.concat(\n",
" [\n",
" causes,\n",
" pd.DataFrame(\n",
" {\n",
- " \"acquired passes, solar elevation, min (deg)\": nominal[nominal.acquired].groupby(\"platform\").solar_alt.min(),\n",
- " \"acquired passes, |cross-track angle|, max (deg)\": nominal[nominal.acquired].groupby(\"platform\").cross.apply(lambda x: x.abs().max()),\n",
- " \"swath edge passes acquired (%)\": nominal[nominal.cross.abs() > 10.2].groupby(\"platform\").apply(lambda g: 100 * g.acquired.sum() / (g.cause != \"catalog gap\").sum()),\n",
+ " \"acquired passes, solar elevation, min (deg)\": nominal[nominal.acquired]\n",
+ " .groupby(\"platform\")\n",
+ " .solar_alt.min(),\n",
+ " \"acquired passes, |cross-track angle|, max (deg)\": nominal[\n",
+ " nominal.acquired\n",
+ " ]\n",
+ " .groupby(\"platform\")\n",
+ " .cross.apply(lambda x: x.abs().max()),\n",
+ " \"swath edge passes acquired (%)\": nominal[nominal.cross.abs() > 10.2]\n",
+ " .groupby(\"platform\")\n",
+ " .apply(\n",
+ " lambda g: 100 * g.acquired.sum() / (g.cause != \"catalog gap\").sum()\n",
+ " ),\n",
" }\n",
" ),\n",
" ],\n",
@@ -1096,16 +1280,46 @@
}
],
"source": [
- "msi_daylight = PointedInstrument(**{**msi.model_dump(), \"req_target_sunlit\": None, \"min_target_solar_elevation\": 5})\n",
- "daylight = {name: s.model_copy(update={\"instruments\": [msi_daylight]}) for name, s in satellites.items()}\n",
- "predicted5 = pd.concat([predict(p, daylight) for p in points.itertuples()]).reset_index(drop=True)\n",
+ "msi_daylight = PointedInstrument(\n",
+ " **{**msi.model_dump(), \"req_target_sunlit\": None, \"min_target_solar_elevation\": 5}\n",
+ ")\n",
+ "daylight = {\n",
+ " name: s.model_copy(update={\"instruments\": [msi_daylight]})\n",
+ " for name, s in satellites.items()\n",
+ "}\n",
+ "predicted5 = pd.concat([predict(p, daylight) for p in points.itertuples()]).reset_index(\n",
+ " drop=True\n",
+ ")\n",
"merged5, observed_only5 = match(predicted5)\n",
- "key = lambda frame: frame.assign(point_id=frame.point_id.astype(\"int64\")).set_index([\"point_id\", \"platform\", \"epoch\"]).index\n",
- "nominal5 = nominal.set_index([\"point_id\", \"platform\", \"epoch\"]).loc[nominal.set_index([\"point_id\", \"platform\", \"epoch\"]).index.isin(key(merged5))]\n",
- "causes5 = nominal5.groupby([\"platform\", \"cause\"]).size().unstack(fill_value=0).reindex(columns=[\"acquired\", \"catalog gap\", \"low Sun\", \"swath edge\", \"other\"], fill_value=0)\n",
- "causes5[\"acquired, excluding catalog gaps (%)\"] = 100 * causes5.acquired / (causes5.sum(axis=1) - causes5[\"catalog gap\"])\n",
- "causes5[\"predicted passes removed\"] = nominal.groupby(\"platform\").size() - nominal5.groupby(\"platform\").size()\n",
- "causes5[\"observed only\"] = observed_only5[observed_only5.platform.isin(causes5.index)].groupby(\"platform\").size().reindex(causes5.index, fill_value=0)\n",
+ "key = (\n",
+ " lambda frame: frame.assign(point_id=frame.point_id.astype(\"int64\"))\n",
+ " .set_index([\"point_id\", \"platform\", \"epoch\"])\n",
+ " .index\n",
+ ")\n",
+ "nominal5 = nominal.set_index([\"point_id\", \"platform\", \"epoch\"]).loc[\n",
+ " nominal.set_index([\"point_id\", \"platform\", \"epoch\"]).index.isin(key(merged5))\n",
+ "]\n",
+ "causes5 = (\n",
+ " nominal5.groupby([\"platform\", \"cause\"])\n",
+ " .size()\n",
+ " .unstack(fill_value=0)\n",
+ " .reindex(\n",
+ " columns=[\"acquired\", \"catalog gap\", \"low Sun\", \"swath edge\", \"other\"],\n",
+ " fill_value=0,\n",
+ " )\n",
+ ")\n",
+ "causes5[\"acquired, excluding catalog gaps (%)\"] = (\n",
+ " 100 * causes5.acquired / (causes5.sum(axis=1) - causes5[\"catalog gap\"])\n",
+ ")\n",
+ "causes5[\"predicted passes removed\"] = (\n",
+ " nominal.groupby(\"platform\").size() - nominal5.groupby(\"platform\").size()\n",
+ ")\n",
+ "causes5[\"observed only\"] = (\n",
+ " observed_only5[observed_only5.platform.isin(causes5.index)]\n",
+ " .groupby(\"platform\")\n",
+ " .size()\n",
+ " .reindex(causes5.index, fill_value=0)\n",
+ ")\n",
"causes5.round(1)"
]
},
@@ -1277,10 +1491,21 @@
"def as_observations(frame, time_column, satellite_column):\n",
" \"\"\"A data frame of instantaneous observations, as accepted by aggregate_observations.\"\"\"\n",
" t = frame[time_column]\n",
- " geometry = points.set_index(\"point_id\").geometry.loc[frame.point_id.astype(\"int64\")].to_numpy()\n",
+ " geometry = (\n",
+ " points.set_index(\"point_id\")\n",
+ " .geometry.loc[frame.point_id.astype(\"int64\")]\n",
+ " .to_numpy()\n",
+ " )\n",
" return pd.DataFrame(\n",
- " {\"target_hash\": [hash_geometry(g) for g in geometry], \"geometry\": geometry,\n",
- " \"satellite\": frame[satellite_column].to_numpy(), \"instrument\": \"MSI\", \"start\": t.to_numpy(), \"epoch\": t.to_numpy(), \"end\": t.to_numpy()}\n",
+ " {\n",
+ " \"target_hash\": [hash_geometry(g) for g in geometry],\n",
+ " \"geometry\": geometry,\n",
+ " \"satellite\": frame[satellite_column].to_numpy(),\n",
+ " \"instrument\": \"MSI\",\n",
+ " \"start\": t.to_numpy(),\n",
+ " \"epoch\": t.to_numpy(),\n",
+ " \"end\": t.to_numpy(),\n",
+ " }\n",
" )\n",
"\n",
"\n",
@@ -1290,32 +1515,64 @@
" aggregated = aggregate_observations(gpd.GeoDataFrame(frame, crs=\"EPSG:4326\"))\n",
" reduced = reduce_observations(aggregated)\n",
" reduced.index = reduced.target_hash.map(POINT_IDS)\n",
- " reduced[\"max revisit\"] = aggregated.groupby(aggregated.target_hash.map(POINT_IDS)).revisit.max()\n",
+ " reduced[\"max revisit\"] = aggregated.groupby(\n",
+ " aggregated.target_hash.map(POINT_IDS)\n",
+ " ).revisit.max()\n",
" return reduced[[\"samples\", \"revisit\", \"max revisit\"]].reindex(points.point_id)\n",
"\n",
"\n",
- "gaps = nominal[nominal.cause == \"catalog gap\"].set_index([\"point_id\", \"platform\", \"epoch\"]).index\n",
- "in_gap = predicted.assign(point_id=predicted.point_id.astype(\"int64\")).set_index([\"point_id\", \"satellite\", \"epoch\"]).index.isin(gaps)\n",
- "in_gap5 = predicted5.assign(point_id=predicted5.point_id.astype(\"int64\")).set_index([\"point_id\", \"satellite\", \"epoch\"]).index.isin(gaps)\n",
+ "gaps = (\n",
+ " nominal[nominal.cause == \"catalog gap\"]\n",
+ " .set_index([\"point_id\", \"platform\", \"epoch\"])\n",
+ " .index\n",
+ ")\n",
+ "in_gap = (\n",
+ " predicted.assign(point_id=predicted.point_id.astype(\"int64\"))\n",
+ " .set_index([\"point_id\", \"satellite\", \"epoch\"])\n",
+ " .index.isin(gaps)\n",
+ ")\n",
+ "in_gap5 = (\n",
+ " predicted5.assign(point_id=predicted5.point_id.astype(\"int64\"))\n",
+ " .set_index([\"point_id\", \"satellite\", \"epoch\"])\n",
+ " .index.isin(gaps)\n",
+ ")\n",
"rows3, stats3 = {}, {}\n",
"for label, members, frame, frame_in_gap in [\n",
" (\"2B + 2C\", [\"Sentinel-2B\", \"Sentinel-2C\"], predicted, in_gap),\n",
- " (\"2B + 2C, solar elevation >= 5 deg\", [\"Sentinel-2B\", \"Sentinel-2C\"], predicted5, in_gap5),\n",
+ " (\n",
+ " \"2B + 2C, solar elevation >= 5 deg\",\n",
+ " [\"Sentinel-2B\", \"Sentinel-2C\"],\n",
+ " predicted5,\n",
+ " in_gap5,\n",
+ " ),\n",
" (\"2A + 2B + 2C\", PLATFORMS, predicted, in_gap),\n",
"]:\n",
- " o = revisit_statistics(as_observations(observed[observed.platform.isin(members)], \"datatake_start\", \"platform\"))\n",
- " p = revisit_statistics(as_observations(frame[frame.satellite.isin(members) & ~frame_in_gap], \"epoch\", \"satellite\"))\n",
+ " o = revisit_statistics(\n",
+ " as_observations(\n",
+ " observed[observed.platform.isin(members)], \"datatake_start\", \"platform\"\n",
+ " )\n",
+ " )\n",
+ " p = revisit_statistics(\n",
+ " as_observations(\n",
+ " frame[frame.satellite.isin(members) & ~frame_in_gap], \"epoch\", \"satellite\"\n",
+ " )\n",
+ " )\n",
" stats3[label] = (o, p)\n",
" days = lambda x: x.dt.total_seconds() / 86400\n",
" rows3[label] = {\n",
" \"points observed\": int(o.samples.notna().sum()),\n",
" \"samples per point, observed (median)\": o.samples.median(),\n",
" \"samples per point, predicted (median)\": p.samples.median(),\n",
- " \"points with equal samples (%)\": 100 * np.mean(o.samples.fillna(0) == p.samples.fillna(0)),\n",
- " \"samples, predicted minus observed (mean)\": np.mean(p.samples.fillna(0) - o.samples.fillna(0)),\n",
+ " \"points with equal samples (%)\": 100\n",
+ " * np.mean(o.samples.fillna(0) == p.samples.fillna(0)),\n",
+ " \"samples, predicted minus observed (mean)\": np.mean(\n",
+ " p.samples.fillna(0) - o.samples.fillna(0)\n",
+ " ),\n",
" \"mean revisit, observed (median, days)\": days(o.revisit).median(),\n",
" \"mean revisit, predicted (median, days)\": days(p.revisit).median(),\n",
- " \"mean revisit difference, p95 |x| (days)\": np.nanpercentile(np.abs(days(p.revisit) - days(o.revisit)), 95),\n",
+ " \"mean revisit difference, p95 |x| (days)\": np.nanpercentile(\n",
+ " np.abs(days(p.revisit) - days(o.revisit)), 95\n",
+ " ),\n",
" \"max revisit, observed (median, days)\": days(o[\"max revisit\"]).median(),\n",
" \"max revisit, predicted (median, days)\": days(p[\"max revisit\"]).median(),\n",
" }\n",
@@ -1353,15 +1610,36 @@
"ax.set_global()\n",
"ax.coastlines(color=GRAY, linewidth=0.5)\n",
"xy = points.set_index(\"point_id\").geometry\n",
- "sc = ax.scatter(xy.x, xy.y, c=(p.revisit.dt.total_seconds() / 86400).to_numpy(), s=8, cmap=\"viridis_r\", vmin=0, vmax=5, transform=ccrs.PlateCarree())\n",
+ "sc = ax.scatter(\n",
+ " xy.x,\n",
+ " xy.y,\n",
+ " c=(p.revisit.dt.total_seconds() / 86400).to_numpy(),\n",
+ " s=8,\n",
+ " cmap=\"viridis_r\",\n",
+ " vmin=0,\n",
+ " vmax=5,\n",
+ " transform=ccrs.PlateCarree(),\n",
+ ")\n",
"fig.colorbar(sc, ax=ax, shrink=0.7, label=\"Mean revisit, TAT-C (days)\")\n",
"ax.set_title(\"Predicted mean revisit, Sentinel-2B and 2C\", fontsize=9)\n",
"ax2 = fig.add_subplot(1, 2, 2)\n",
"for label, color in [(\"2B + 2C\", BLUE), (\"2A + 2B + 2C\", ORANGE)]:\n",
" o, p = stats3[label]\n",
- " ax2.scatter(o.revisit.dt.total_seconds() / 86400, p.revisit.dt.total_seconds() / 86400, s=6, color=color, label=label)\n",
+ " ax2.scatter(\n",
+ " o.revisit.dt.total_seconds() / 86400,\n",
+ " p.revisit.dt.total_seconds() / 86400,\n",
+ " s=6,\n",
+ " color=color,\n",
+ " label=label,\n",
+ " )\n",
"ax2.plot([0, 6], [0, 6], color=GRAY, lw=0.8)\n",
- "ax2.set(xlim=(0, 6), ylim=(0, 6), xlabel=\"Observed mean revisit (days)\", ylabel=\"Predicted mean revisit (days)\", title=\"Mean revisit per point\")\n",
+ "ax2.set(\n",
+ " xlim=(0, 6),\n",
+ " ylim=(0, 6),\n",
+ " xlabel=\"Observed mean revisit (days)\",\n",
+ " ylabel=\"Predicted mean revisit (days)\",\n",
+ " title=\"Mean revisit per point\",\n",
+ ")\n",
"ax2.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1424,20 +1702,49 @@
],
"source": [
"# the same satellites, propagated maintained on their repeat ground tracks\n",
- "maintained = {name: Satellite(name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle, remove_drag=True, repeat_cycle=\"auto\"), instruments=[msi]) for name, tle in TLES.items()}\n",
- "print(\"repeat cycles:\", {name: str(s.orbit.get_repeat_cycle()) for name, s in maintained.items()})\n",
- "repeated = pd.concat([predict(p, maintained) for p in points.itertuples()]).reset_index(drop=True)\n",
+ "maintained = {\n",
+ " name: Satellite(\n",
+ " name=name,\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(\n",
+ " tle, remove_drag=True, repeat_cycle=\"auto\"\n",
+ " ),\n",
+ " instruments=[msi],\n",
+ " )\n",
+ " for name, tle in TLES.items()\n",
+ "}\n",
+ "print(\n",
+ " \"repeat cycles:\",\n",
+ " {name: str(s.orbit.get_repeat_cycle()) for name, s in maintained.items()},\n",
+ ")\n",
+ "repeated = pd.concat([predict(p, maintained) for p in points.itertuples()]).reset_index(\n",
+ " drop=True\n",
+ ")\n",
"merged4, observed_only4 = match(repeated)\n",
"pair = pd.merge_asof(\n",
- " repeated.assign(point_id=repeated.point_id.astype(\"int64\")).sort_values(\"epoch\")[[\"point_id\", \"satellite\", \"epoch\"]],\n",
- " predicted.assign(point_id=predicted.point_id.astype(\"int64\"), epoch_direct=predicted.epoch).sort_values(\"epoch\")[[\"point_id\", \"satellite\", \"epoch\", \"epoch_direct\"]],\n",
- " on=\"epoch\", by=[\"point_id\", \"satellite\"], direction=\"nearest\", tolerance=pd.Timedelta(minutes=10),\n",
+ " repeated.assign(point_id=repeated.point_id.astype(\"int64\")).sort_values(\"epoch\")[\n",
+ " [\"point_id\", \"satellite\", \"epoch\"]\n",
+ " ],\n",
+ " predicted.assign(\n",
+ " point_id=predicted.point_id.astype(\"int64\"), epoch_direct=predicted.epoch\n",
+ " ).sort_values(\"epoch\")[[\"point_id\", \"satellite\", \"epoch\", \"epoch_direct\"]],\n",
+ " on=\"epoch\",\n",
+ " by=[\"point_id\", \"satellite\"],\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=10),\n",
")\n",
"pair = pair.merge(\n",
- " repeated.assign(point_id=repeated.point_id.astype(\"int64\"))[[\"point_id\", \"satellite\", \"epoch\", \"start\", \"end\"]], on=[\"point_id\", \"satellite\", \"epoch\"]\n",
+ " repeated.assign(point_id=repeated.point_id.astype(\"int64\"))[\n",
+ " [\"point_id\", \"satellite\", \"epoch\", \"start\", \"end\"]\n",
+ " ],\n",
+ " on=[\"point_id\", \"satellite\", \"epoch\"],\n",
").merge(\n",
- " predicted.assign(point_id=predicted.point_id.astype(\"int64\"))[[\"point_id\", \"satellite\", \"epoch\", \"start\", \"end\"]].rename(columns={\"epoch\": \"epoch_direct\", \"start\": \"start_direct\", \"end\": \"end_direct\"}),\n",
- " on=[\"point_id\", \"satellite\", \"epoch_direct\"], how=\"left\",\n",
+ " predicted.assign(point_id=predicted.point_id.astype(\"int64\"))[\n",
+ " [\"point_id\", \"satellite\", \"epoch\", \"start\", \"end\"]\n",
+ " ].rename(\n",
+ " columns={\"epoch\": \"epoch_direct\", \"start\": \"start_direct\", \"end\": \"end_direct\"}\n",
+ " ),\n",
+ " on=[\"point_id\", \"satellite\", \"epoch_direct\"],\n",
+ " how=\"left\",\n",
")\n",
"pair[\"difference (s)\"] = (pair.epoch - pair.epoch_direct).dt.total_seconds()\n",
"pair[\"start difference (s)\"] = (pair.start - pair.start_direct).dt.total_seconds()\n",
@@ -1446,12 +1753,24 @@
"rows4 = {\n",
" \"passes, maintained orbit\": len(repeated),\n",
" \"passes, direct propagation\": len(predicted),\n",
- " \"passes predicted only one way\": int(pair.epoch_direct.isna().sum()) + len(predicted) - int(pair.epoch_direct.notna().sum()),\n",
- " \"epoch difference, first cycle, p95 |x| (s)\": np.percentile(np.abs(pair[\"difference (s)\"][pair.day < 10].dropna()), 95),\n",
- " \"epoch difference, second cycle, p95 |x| (s)\": np.percentile(np.abs(pair[\"difference (s)\"][pair.day >= 10].dropna()), 95),\n",
- " \"access start difference, first cycle, p95 |x| (s)\": np.percentile(np.abs(pair[\"start difference (s)\"][pair.day < 10].dropna()), 95),\n",
- " \"access start difference, second cycle, p95 |x| (s)\": np.percentile(np.abs(pair[\"start difference (s)\"][pair.day >= 10].dropna()), 95),\n",
- " \"access end difference, second cycle, p95 |x| (s)\": np.percentile(np.abs(pair[\"end difference (s)\"][pair.day >= 10].dropna()), 95),\n",
+ " \"passes predicted only one way\": int(pair.epoch_direct.isna().sum())\n",
+ " + len(predicted)\n",
+ " - int(pair.epoch_direct.notna().sum()),\n",
+ " \"epoch difference, first cycle, p95 |x| (s)\": np.percentile(\n",
+ " np.abs(pair[\"difference (s)\"][pair.day < 10].dropna()), 95\n",
+ " ),\n",
+ " \"epoch difference, second cycle, p95 |x| (s)\": np.percentile(\n",
+ " np.abs(pair[\"difference (s)\"][pair.day >= 10].dropna()), 95\n",
+ " ),\n",
+ " \"access start difference, first cycle, p95 |x| (s)\": np.percentile(\n",
+ " np.abs(pair[\"start difference (s)\"][pair.day < 10].dropna()), 95\n",
+ " ),\n",
+ " \"access start difference, second cycle, p95 |x| (s)\": np.percentile(\n",
+ " np.abs(pair[\"start difference (s)\"][pair.day >= 10].dropna()), 95\n",
+ " ),\n",
+ " \"access end difference, second cycle, p95 |x| (s)\": np.percentile(\n",
+ " np.abs(pair[\"end difference (s)\"][pair.day >= 10].dropna()), 95\n",
+ " ),\n",
" \"matched observed passes, maintained orbit\": int(merged4.datatake.notna().sum()),\n",
" \"matched observed passes, direct\": int(merged2.datatake.notna().sum()),\n",
"}\n",
diff --git a/docs/validation/ValidateSARNISAR.ipynb b/docs/validation/ValidateSARNISAR.ipynb
index c5a2e553..4d2b53cf 100644
--- a/docs/validation/ValidateSARNISAR.ipynb
+++ b/docs/validation/ValidateSARNISAR.ipynb
@@ -44,10 +44,10 @@
"id": "43440b02",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:55.946511Z",
- "iopub.status.busy": "2026-10-08T18:04:55.945509Z",
- "iopub.status.idle": "2026-10-08T18:04:56.532744Z",
- "shell.execute_reply": "2026-10-08T18:04:56.532744Z"
+ "iopub.execute_input": "2026-10-25T14:00:45.227032Z",
+ "iopub.status.busy": "2026-10-25T14:00:45.227032Z",
+ "iopub.status.idle": "2026-10-25T14:00:45.897628Z",
+ "shell.execute_reply": "2026-10-25T14:00:45.897628Z"
}
},
"outputs": [
@@ -223,7 +223,9 @@
" ]\n",
")\n",
"# products that start on the analysis day\n",
- "catalog = catalog[catalog.start >= pd.Timestamp(DAY)].sort_values(\"start\", ignore_index=True)\n",
+ "catalog = catalog[catalog.start >= pd.Timestamp(DAY)].sort_values(\n",
+ " \"start\", ignore_index=True\n",
+ ")\n",
"catalog.groupby([\"mode\", \"direction\"]).size().unstack(fill_value=0)"
]
},
@@ -246,10 +248,10 @@
"id": "936bd1bc",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:56.535405Z",
- "iopub.status.busy": "2026-10-08T18:04:56.534399Z",
- "iopub.status.idle": "2026-10-08T18:04:56.652486Z",
- "shell.execute_reply": "2026-10-08T18:04:56.652486Z"
+ "iopub.execute_input": "2026-10-25T14:00:45.900635Z",
+ "iopub.status.busy": "2026-10-25T14:00:45.899632Z",
+ "iopub.status.idle": "2026-10-25T14:00:46.017087Z",
+ "shell.execute_reply": "2026-10-25T14:00:46.017087Z"
}
},
"outputs": [
@@ -273,7 +275,10 @@
"BOUNDS_FILE = DATA_DIR / f\"nisar_rslc_bounds_{DAY:%Y%m%d}.csv\"\n",
"SAMPLE_FILE = DATA_DIR / f\"nisar_rslc_metadata_{DAY:%Y%m%d}.npz\"\n",
"sample = pd.concat(\n",
- " [g.iloc[np.unique(np.linspace(0, len(g) - 1, 4).round().astype(int))] for _, g in catalog.groupby(\"mode\")]\n",
+ " [\n",
+ " g.iloc[np.unique(np.linspace(0, len(g) - 1, 4).round().astype(int))]\n",
+ " for _, g in catalog.groupby(\"mode\")\n",
+ " ]\n",
").sort_values(\"start\", ignore_index=True)\n",
"N_RANGE = 41 # resampled slant ranges across the image\n",
"\n",
@@ -290,13 +295,17 @@
" self.block_size, self.blocks, self.position = block_size, {}, 0\n",
" # follow the Earthdata Login redirects while prefetching the first blocks (file metadata)\n",
" response = self._get(url, 0, prefetch * block_size)\n",
- " self.url, self.size = response.url, int(response.headers[\"Content-Range\"].split(\"/\")[1])\n",
+ " self.url, self.size = response.url, int(\n",
+ " response.headers[\"Content-Range\"].split(\"/\")[1]\n",
+ " )\n",
" self._store(0, response.content)\n",
"\n",
" def _get(self, url, start, end):\n",
" for attempt in range(5):\n",
" try:\n",
- " response = session.get(url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300)\n",
+ " response = session.get(\n",
+ " url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300\n",
+ " )\n",
" response.raise_for_status()\n",
" return response\n",
" except requests.RequestException:\n",
@@ -305,7 +314,9 @@
"\n",
" def _store(self, first, content):\n",
" for i in range(0, len(content), self.block_size):\n",
- " self.blocks[first + i // self.block_size] = content[i : i + self.block_size]\n",
+ " self.blocks[first + i // self.block_size] = content[\n",
+ " i : i + self.block_size\n",
+ " ]\n",
"\n",
" def readable(self):\n",
" return True\n",
@@ -317,18 +328,30 @@
" return self.position\n",
"\n",
" def seek(self, offset, whence=io.SEEK_SET):\n",
- " self.position = {io.SEEK_SET: 0, io.SEEK_CUR: self.position, io.SEEK_END: self.size}[whence] + offset\n",
+ " self.position = {\n",
+ " io.SEEK_SET: 0,\n",
+ " io.SEEK_CUR: self.position,\n",
+ " io.SEEK_END: self.size,\n",
+ " }[whence] + offset\n",
" return self.position\n",
"\n",
" def readinto(self, buffer):\n",
" n = min(len(buffer), self.size - self.position)\n",
" if n <= 0:\n",
" return 0\n",
- " first, last = self.position // self.block_size, (self.position + n - 1) // self.block_size\n",
- " missing = [block for block in range(first, last + 1) if block not in self.blocks]\n",
+ " first, last = (\n",
+ " self.position // self.block_size,\n",
+ " (self.position + n - 1) // self.block_size,\n",
+ " )\n",
+ " missing = [\n",
+ " block for block in range(first, last + 1) if block not in self.blocks\n",
+ " ]\n",
" if missing:\n",
" end = min((missing[-1] + 1) * self.block_size, self.size)\n",
- " self._store(missing[0], self._get(self.url, missing[0] * self.block_size, end).content)\n",
+ " self._store(\n",
+ " missing[0],\n",
+ " self._get(self.url, missing[0] * self.block_size, end).content,\n",
+ " )\n",
" data = b\"\".join(self.blocks[block] for block in range(first, last + 1))\n",
" offset = self.position - first * self.block_size\n",
" buffer[:n] = data[offset : offset + n]\n",
@@ -338,7 +361,10 @@
" def seconds_since_day(dataset):\n",
" \"\"\"Times of a dataset in seconds since the start of the analysis day.\"\"\"\n",
" epoch = re.search(r\"since (\\S+)\", dataset.attrs[\"units\"].decode()).group(1)\n",
- " return dataset[:] + (pd.Timestamp(epoch, tz=\"UTC\") - pd.Timestamp(DAY)).total_seconds()\n",
+ " return (\n",
+ " dataset[:]\n",
+ " + (pd.Timestamp(epoch, tz=\"UTC\") - pd.Timestamp(DAY)).total_seconds()\n",
+ " )\n",
"\n",
" def read_bounds(url):\n",
" with h5py.File(RemoteFile(url)) as f:\n",
@@ -346,7 +372,9 @@
" return {\n",
" \"url\": url,\n",
" \"polygon\": identification[\"boundingPolygon\"][()].decode(),\n",
- " \"zero_doppler_start\": identification[\"zeroDopplerStartTime\"][()].decode(),\n",
+ " \"zero_doppler_start\": identification[\"zeroDopplerStartTime\"][\n",
+ " ()\n",
+ " ].decode(),\n",
" \"zero_doppler_end\": identification[\"zeroDopplerEndTime\"][()].decode(),\n",
" }\n",
"\n",
@@ -356,17 +384,27 @@
" grid = rslc[\"metadata/geolocationGrid\"]\n",
" layer = int(np.argmin(np.abs(grid[\"heightAboveEllipsoid\"][:])))\n",
" grid_range = grid[\"slantRange\"][:]\n",
- " frequency = sorted(k for k in rslc[\"swaths\"] if k.startswith(\"frequency\"))[0]\n",
+ " frequency = sorted(k for k in rslc[\"swaths\"] if k.startswith(\"frequency\"))[\n",
+ " 0\n",
+ " ]\n",
" image_range = rslc[f\"swaths/{frequency}/slantRange\"][[0, -1]]\n",
" # resample the grid to slant ranges spanning the image, from near to far range\n",
" ranges = np.linspace(image_range[0], image_range[1], N_RANGE)\n",
- " resample = lambda x: np.array([np.interp(ranges, grid_range, row) for row in x])\n",
+ " resample = lambda x: np.array(\n",
+ " [np.interp(ranges, grid_range, row) for row in x]\n",
+ " )\n",
" return {\n",
- " \"look_direction\": f[\"science/LSAR/identification/lookDirection\"][()].decode(),\n",
+ " \"look_direction\": f[\"science/LSAR/identification/lookDirection\"][\n",
+ " ()\n",
+ " ].decode(),\n",
" \"time\": seconds_since_day(grid[\"zeroDopplerTime\"]),\n",
" \"slant_range\": ranges,\n",
" # unwrap longitudes so that interpolation does not cross the antimeridian\n",
- " \"lon\": (resample(np.unwrap(grid[\"coordinateX\"][layer], period=360)) + 180) % 360 - 180,\n",
+ " \"lon\": (\n",
+ " resample(np.unwrap(grid[\"coordinateX\"][layer], period=360)) + 180\n",
+ " )\n",
+ " % 360\n",
+ " - 180,\n",
" \"lat\": resample(grid[\"coordinateY\"][layer]),\n",
" \"incidence\": resample(grid[\"incidenceAngle\"][layer]),\n",
" \"orbit_time\": seconds_since_day(rslc[\"metadata/orbit/time\"]),\n",
@@ -385,21 +423,51 @@
" n_time=[len(r[\"time\"]) for r in records],\n",
" n_orbit=[len(r[\"orbit_time\"]) for r in records],\n",
" slant_range=np.stack([r[\"slant_range\"] for r in records]),\n",
- " **{k: np.concatenate([r[k] for r in records]) for k in [\"time\", \"lon\", \"lat\", \"incidence\", \"orbit_time\", \"orbit_position\", \"orbit_velocity\"]},\n",
+ " **{\n",
+ " k: np.concatenate([r[k] for r in records])\n",
+ " for k in [\n",
+ " \"time\",\n",
+ " \"lon\",\n",
+ " \"lat\",\n",
+ " \"incidence\",\n",
+ " \"orbit_time\",\n",
+ " \"orbit_position\",\n",
+ " \"orbit_velocity\",\n",
+ " ]\n",
+ " },\n",
" )\n",
"\n",
"catalog = catalog.merge(pd.read_csv(BOUNDS_FILE), on=\"url\")\n",
"cache = dict(np.load(SAMPLE_FILE))\n",
"split = lambda key, n: np.split(cache[key], np.cumsum(cache[n])[:-1])\n",
"meta = [\n",
- " {\"look_direction\": cache[\"look_direction\"][i], \"slant_range\": cache[\"slant_range\"][i], **dict(zip(keys, values))}\n",
+ " {\n",
+ " \"look_direction\": cache[\"look_direction\"][i],\n",
+ " \"slant_range\": cache[\"slant_range\"][i],\n",
+ " **dict(zip(keys, values)),\n",
+ " }\n",
" for i, values in enumerate(\n",
" zip(\n",
- " split(\"time\", \"n_time\"), split(\"lon\", \"n_time\"), split(\"lat\", \"n_time\"), split(\"incidence\", \"n_time\"),\n",
- " split(\"orbit_time\", \"n_orbit\"), split(\"orbit_position\", \"n_orbit\"), split(\"orbit_velocity\", \"n_orbit\"),\n",
+ " split(\"time\", \"n_time\"),\n",
+ " split(\"lon\", \"n_time\"),\n",
+ " split(\"lat\", \"n_time\"),\n",
+ " split(\"incidence\", \"n_time\"),\n",
+ " split(\"orbit_time\", \"n_orbit\"),\n",
+ " split(\"orbit_position\", \"n_orbit\"),\n",
+ " split(\"orbit_velocity\", \"n_orbit\"),\n",
" )\n",
" )\n",
- " for keys in [(\"time\", \"lon\", \"lat\", \"incidence\", \"orbit_time\", \"orbit_position\", \"orbit_velocity\")]\n",
+ " for keys in [\n",
+ " (\n",
+ " \"time\",\n",
+ " \"lon\",\n",
+ " \"lat\",\n",
+ " \"incidence\",\n",
+ " \"orbit_time\",\n",
+ " \"orbit_position\",\n",
+ " \"orbit_velocity\",\n",
+ " )\n",
+ " ]\n",
"]\n",
"pd.Series(\n",
" {\n",
@@ -428,10 +496,10 @@
"id": "1dcc5ea2",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:56.654868Z",
- "iopub.status.busy": "2026-10-08T18:04:56.654868Z",
- "iopub.status.idle": "2026-10-08T18:04:58.331495Z",
- "shell.execute_reply": "2026-10-08T18:04:58.331495Z"
+ "iopub.execute_input": "2026-10-25T14:00:46.019125Z",
+ "iopub.status.busy": "2026-10-25T14:00:46.019125Z",
+ "iopub.status.idle": "2026-10-25T14:00:47.823582Z",
+ "shell.execute_reply": "2026-10-25T14:00:47.823077Z"
}
},
"outputs": [],
@@ -450,7 +518,13 @@
"\n",
"from tatc.analysis import collect_observations, compute_ground_track\n",
"from tatc.constants import EARTH_ROTATION_RATE\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, Point, PointedInstrument, Satellite\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
"from tatc.utils import VelocityFrame, compute_projected_ray_position\n",
"\n",
"GEOD = Geod(ellps=\"WGS84\")\n",
@@ -466,13 +540,17 @@
"\n",
"def ecef(lon, lat, height=0.0):\n",
" \"\"\"Earth-fixed position (m) of geodetic coordinates, stacked on the last axis.\"\"\"\n",
- " return np.stack(TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1)\n",
+ " return np.stack(\n",
+ " TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1\n",
+ " )\n",
"\n",
"\n",
"def up(lon, lat):\n",
" \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
" lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
+ " return np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def normalize(x):\n",
@@ -493,23 +571,42 @@
" k = np.clip(np.searchsorted(t, seconds) - 1, 0, len(t) - 2)\n",
" h = (t[k + 1] - t[k])[:, None]\n",
" s = ((seconds - t[k]) / (t[k + 1] - t[k]))[:, None]\n",
- " h00, h10, h01, h11 = 2 * s**3 - 3 * s**2 + 1, s**3 - 2 * s**2 + s, -2 * s**3 + 3 * s**2, s**3 - s**2\n",
+ " h00, h10, h01, h11 = (\n",
+ " 2 * s**3 - 3 * s**2 + 1,\n",
+ " s**3 - 2 * s**2 + s,\n",
+ " -2 * s**3 + 3 * s**2,\n",
+ " s**3 - s**2,\n",
+ " )\n",
" position = h00 * p[k] + h10 * h * v[k] + h01 * p[k + 1] + h11 * h * v[k + 1]\n",
- " d00, d10, d01, d11 = (6 * s**2 - 6 * s) / h, 3 * s**2 - 4 * s + 1, (-6 * s**2 + 6 * s) / h, 3 * s**2 - 2 * s\n",
+ " d00, d10, d01, d11 = (\n",
+ " (6 * s**2 - 6 * s) / h,\n",
+ " 3 * s**2 - 4 * s + 1,\n",
+ " (-6 * s**2 + 6 * s) / h,\n",
+ " 3 * s**2 - 2 * s,\n",
+ " )\n",
" velocity = d00 * p[k] + d10 * v[k] + d01 * p[k + 1] + d11 * v[k + 1]\n",
" return position, velocity\n",
"\n",
"\n",
"def inertial_velocity(position, velocity):\n",
" \"\"\"Inertial velocity expressed in Earth-fixed coordinates.\"\"\"\n",
- " return velocity + EARTH_ROTATION_RATE * np.stack([-position[..., 1], position[..., 0], np.zeros(position.shape[:-1])], axis=-1)\n",
+ " return velocity + EARTH_ROTATION_RATE * np.stack(\n",
+ " [-position[..., 1], position[..., 0], np.zeros(position.shape[:-1])], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def summarize(x):\n",
" \"\"\"Summary statistics of a residual sample.\"\"\"\n",
" x = np.asarray(x, dtype=float)\n",
" x = x[np.isfinite(x)]\n",
- " return pd.Series({\"n\": x.size, \"median\": np.median(x), \"p95 |x|\": np.percentile(np.abs(x), 95), \"max |x|\": np.abs(x).max()})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": x.size,\n",
+ " \"median\": np.median(x),\n",
+ " \"p95 |x|\": np.percentile(np.abs(x), 95),\n",
+ " \"max |x|\": np.abs(x).max(),\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
@@ -540,10 +637,10 @@
"id": "1ab6cc4a",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:58.334503Z",
- "iopub.status.busy": "2026-10-08T18:04:58.334503Z",
- "iopub.status.idle": "2026-10-08T18:04:58.497742Z",
- "shell.execute_reply": "2026-10-08T18:04:58.497742Z"
+ "iopub.execute_input": "2026-10-25T14:00:47.825584Z",
+ "iopub.status.busy": "2026-10-25T14:00:47.825584Z",
+ "iopub.status.idle": "2026-10-25T14:00:48.022251Z",
+ "shell.execute_reply": "2026-10-25T14:00:48.022251Z"
}
},
"outputs": [
@@ -629,19 +726,29 @@
"p1, v1 = orbit.get_orbit_track(to_utc(orbit_time)).frame_xyz_and_velocity(itrs)\n",
"offset1 = np.array(p1.m).T - orbit_position\n",
"radial1 = normalize(orbit_position)\n",
- "along1 = normalize(orbit_velocity - np.sum(orbit_velocity * radial1, axis=-1, keepdims=True) * radial1)\n",
+ "along1 = normalize(\n",
+ " orbit_velocity - np.sum(orbit_velocity * radial1, axis=-1, keepdims=True) * radial1\n",
+ ")\n",
"along1_km = np.sum(offset1 * along1, axis=-1) / 1e3\n",
- "epoch = datetime(2026, 1, 1, tzinfo=timezone.utc) + timedelta(days=float(TLE[0][20:32]) - 1)\n",
+ "epoch = datetime(2026, 1, 1, tzinfo=timezone.utc) + timedelta(\n",
+ " days=float(TLE[0][20:32]) - 1\n",
+ ")\n",
"hours_before_epoch = (epoch - DAY).total_seconds() / 3600 - orbit_time / 3600\n",
"fig, ax = plt.subplots(figsize=(7, 3.2))\n",
"ax.scatter(hours_before_epoch, along1_km, s=4, color=BLUE)\n",
- "ax.set(xlabel=\"Hours before TLE epoch\", ylabel=\"Along-track error (km)\", title=\"TLE vs. NISAR orbit ephemeris\")\n",
+ "ax.set(\n",
+ " xlabel=\"Hours before TLE epoch\",\n",
+ " ylabel=\"Along-track error (km)\",\n",
+ " title=\"TLE vs. NISAR orbit ephemeris\",\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()\n",
"pd.DataFrame(\n",
" {\n",
" \"along-track (km)\": summarize(along1_km),\n",
- " \"cross-track, right (km)\": summarize(np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3),\n",
+ " \"cross-track, right (km)\": summarize(\n",
+ " np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3\n",
+ " ),\n",
" \"radial (km)\": summarize(np.sum(offset1 * radial1, axis=-1) / 1e3),\n",
" }\n",
").T.round(3)"
@@ -669,10 +776,10 @@
"id": "c97aedd0",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:58.500750Z",
- "iopub.status.busy": "2026-10-08T18:04:58.499750Z",
- "iopub.status.idle": "2026-10-08T18:04:58.755512Z",
- "shell.execute_reply": "2026-10-08T18:04:58.755006Z"
+ "iopub.execute_input": "2026-10-25T14:00:48.024767Z",
+ "iopub.status.busy": "2026-10-25T14:00:48.024767Z",
+ "iopub.status.idle": "2026-10-25T14:00:48.227190Z",
+ "shell.execute_reply": "2026-10-25T14:00:48.227190Z"
}
},
"outputs": [
@@ -911,8 +1018,21 @@
" left = normalize(np.cross(normalize(velocity), nadir))\n",
" look = np.degrees(np.arccos(np.sum(los * nadir[:, None], axis=-1)))\n",
" side_all.append(np.sign(np.sum(los * left[:, None], axis=-1)).ravel())\n",
- " plane_earth.append(np.degrees(np.arcsin(np.sum(los * normalize(velocity)[:, None], axis=-1))).ravel())\n",
- " plane_inertial.append(np.degrees(np.arcsin(np.sum(los * normalize(inertial_velocity(position, velocity))[:, None], axis=-1))).ravel())\n",
+ " plane_earth.append(\n",
+ " np.degrees(\n",
+ " np.arcsin(np.sum(los * normalize(velocity)[:, None], axis=-1))\n",
+ " ).ravel()\n",
+ " )\n",
+ " plane_inertial.append(\n",
+ " np.degrees(\n",
+ " np.arcsin(\n",
+ " np.sum(\n",
+ " los * normalize(inertial_velocity(position, velocity))[:, None],\n",
+ " axis=-1,\n",
+ " )\n",
+ " )\n",
+ " ).ravel()\n",
+ " )\n",
" rows2.append(\n",
" {\n",
" \"latitude\": np.median(sub_lat),\n",
@@ -923,10 +1043,16 @@
" \"far incidence (deg)\": np.median(m[\"incidence\"][:, -1]),\n",
" }\n",
" )\n",
- "geometry = pd.concat([sample[[\"granule\", \"mode\", \"direction\"]], pd.DataFrame(rows2)], axis=1)\n",
- "side_all, plane_earth, plane_inertial = map(np.concatenate, (side_all, plane_earth, plane_inertial))\n",
+ "geometry = pd.concat(\n",
+ " [sample[[\"granule\", \"mode\", \"direction\"]], pd.DataFrame(rows2)], axis=1\n",
+ ")\n",
+ "side_all, plane_earth, plane_inertial = map(\n",
+ " np.concatenate, (side_all, plane_earth, plane_inertial)\n",
+ ")\n",
"# roll angle and cross-track field of view of each mode, from the median edge look angles\n",
- "modes = geometry.groupby(\"mode\")[[\"near look (deg)\", \"far look (deg)\", \"near incidence (deg)\", \"far incidence (deg)\"]].median()\n",
+ "modes = geometry.groupby(\"mode\")[\n",
+ " [\"near look (deg)\", \"far look (deg)\", \"near incidence (deg)\", \"far incidence (deg)\"]\n",
+ "].median()\n",
"modes[\"roll (deg)\"] = (modes[\"near look (deg)\"] + modes[\"far look (deg)\"]) / 2\n",
"modes[\"field of view (deg)\"] = modes[\"far look (deg)\"] - modes[\"near look (deg)\"]\n",
"modes[\"products\"] = catalog.groupby(\"mode\").size()\n",
@@ -934,12 +1060,22 @@
" pd.Series(\n",
" {\n",
" \"lines of sight on the left (%)\": 100 * np.mean(side_all > 0),\n",
- " \"angle to Earth-fixed zero-Doppler plane, max |x| (deg)\": np.abs(plane_earth).max(),\n",
- " \"angle to inertial zero-Doppler plane, p95 |x| (deg)\": np.percentile(np.abs(plane_inertial), 95),\n",
- " \"near look angle, range within modes (deg)\": (geometry.groupby(\"mode\")[\"near look (deg)\"].agg(np.ptp)).max(),\n",
- " \"far look angle, range within modes (deg)\": (geometry.groupby(\"mode\")[\"far look (deg)\"].agg(np.ptp)).max(),\n",
+ " \"angle to Earth-fixed zero-Doppler plane, max |x| (deg)\": np.abs(\n",
+ " plane_earth\n",
+ " ).max(),\n",
+ " \"angle to inertial zero-Doppler plane, p95 |x| (deg)\": np.percentile(\n",
+ " np.abs(plane_inertial), 95\n",
+ " ),\n",
+ " \"near look angle, range within modes (deg)\": (\n",
+ " geometry.groupby(\"mode\")[\"near look (deg)\"].agg(np.ptp)\n",
+ " ).max(),\n",
+ " \"far look angle, range within modes (deg)\": (\n",
+ " geometry.groupby(\"mode\")[\"far look (deg)\"].agg(np.ptp)\n",
+ " ).max(),\n",
" }\n",
- " ).round(5).to_string()\n",
+ " )\n",
+ " .round(5)\n",
+ " .to_string()\n",
")\n",
"modes.round(2)"
]
@@ -950,10 +1086,10 @@
"id": "17b83820",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:58.757524Z",
- "iopub.status.busy": "2026-10-08T18:04:58.757524Z",
- "iopub.status.idle": "2026-10-08T18:04:58.909062Z",
- "shell.execute_reply": "2026-10-08T18:04:58.908055Z"
+ "iopub.execute_input": "2026-10-25T14:00:48.230315Z",
+ "iopub.status.busy": "2026-10-25T14:00:48.229151Z",
+ "iopub.status.idle": "2026-10-25T14:00:48.518458Z",
+ "shell.execute_reply": "2026-10-25T14:00:48.517448Z"
}
},
"outputs": [
@@ -970,9 +1106,25 @@
],
"source": [
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
- "for column, color in [(\"near look (deg)\", BLUE), (\"far look (deg)\", BLUE), (\"near incidence (deg)\", ORANGE), (\"far incidence (deg)\", ORANGE)]:\n",
- " ax.scatter(geometry.latitude, geometry[column], s=12, color=color, marker=\"o\" if \"near\" in column else \"^\", label=column.replace(\" (deg)\", \"\"))\n",
- "ax.set(xlabel=\"Sub-satellite latitude (deg)\", ylabel=\"Angle (deg)\", title=\"NISAR look and incidence angles at the image edges\")\n",
+ "for column, color in [\n",
+ " (\"near look (deg)\", BLUE),\n",
+ " (\"far look (deg)\", BLUE),\n",
+ " (\"near incidence (deg)\", ORANGE),\n",
+ " (\"far incidence (deg)\", ORANGE),\n",
+ "]:\n",
+ " ax.scatter(\n",
+ " geometry.latitude,\n",
+ " geometry[column],\n",
+ " s=12,\n",
+ " color=color,\n",
+ " marker=\"o\" if \"near\" in column else \"^\",\n",
+ " label=column.replace(\" (deg)\", \"\"),\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Sub-satellite latitude (deg)\",\n",
+ " ylabel=\"Angle (deg)\",\n",
+ " title=\"NISAR look and incidence angles at the image edges\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8, ncols=2)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -998,10 +1150,10 @@
"id": "7008ab69",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:58.911062Z",
- "iopub.status.busy": "2026-10-08T18:04:58.911062Z",
- "iopub.status.idle": "2026-10-08T18:04:59.418013Z",
- "shell.execute_reply": "2026-10-08T18:04:59.418013Z"
+ "iopub.execute_input": "2026-10-25T14:00:48.521459Z",
+ "iopub.status.busy": "2026-10-25T14:00:48.521459Z",
+ "iopub.status.idle": "2026-10-25T14:00:49.370331Z",
+ "shell.execute_reply": "2026-10-25T14:00:49.369314Z"
}
},
"outputs": [
@@ -1127,9 +1279,20 @@
" look_angle = modes.loc[mode, f\"{edge} look (deg)\"]\n",
" times = m[\"time\"][::4]\n",
" _, velocity = interpolate_orbit(m, times)\n",
- " ray = compute_projected_ray_position(orbit.get_orbit_track(to_utc(times)), 0, 0, look_angle, velocity_frame=frame)\n",
+ " ray = compute_projected_ray_position(\n",
+ " orbit.get_orbit_track(to_utc(times)),\n",
+ " 0,\n",
+ " 0,\n",
+ " look_angle,\n",
+ " velocity_frame=frame,\n",
+ " )\n",
" lon, lat = m[\"lon\"][::4, column], m[\"lat\"][::4, column]\n",
- " along, right = along_right(lon, lat, ecef(ray.longitude.degrees, ray.latitude.degrees) - ecef(lon, lat), velocity)\n",
+ " along, right = along_right(\n",
+ " lon,\n",
+ " lat,\n",
+ " ecef(ray.longitude.degrees, ray.latitude.degrees) - ecef(lon, lat),\n",
+ " velocity,\n",
+ " )\n",
" along_all.append(along)\n",
" right_all.append(right)\n",
" rows3[(frame.value, edge, \"along\")] = summarize(np.concatenate(along_all))\n",
@@ -1155,10 +1318,10 @@
"id": "f80b0a1d",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:04:59.420019Z",
- "iopub.status.busy": "2026-10-08T18:04:59.420019Z",
- "iopub.status.idle": "2026-10-08T18:05:17.398683Z",
- "shell.execute_reply": "2026-10-08T18:05:17.398683Z"
+ "iopub.execute_input": "2026-10-25T14:00:49.372860Z",
+ "iopub.status.busy": "2026-10-25T14:00:49.372860Z",
+ "iopub.status.idle": "2026-10-25T14:01:06.296143Z",
+ "shell.execute_reply": "2026-10-25T14:01:06.296143Z"
}
},
"outputs": [
@@ -1405,16 +1568,17 @@
"altitude = float(np.median(geometry[\"altitude (km)\"])) * 1e3\n",
"\n",
"\n",
- "def nisar_view(mode, time_step=TIME_STEP, velocity_frame=VelocityFrame.EARTH_FIXED):\n",
+ "def nisar_view(mode, time_step=TIME_STEP):\n",
" \"\"\"Rectangular, left-looking view of a NISAR mode, with the along-track field of view tailored to a time step (s).\"\"\"\n",
" return PointedInstrument(\n",
" name=\"NISAR L-SAR\",\n",
" field_of_regard=2 * (modes[\"far look (deg)\"].max() + 1),\n",
" cross_track_field_of_view=modes.loc[mode, \"field of view (deg)\"],\n",
- " along_track_field_of_view=np.degrees(2 * np.arctan(ground_speed * time_step / 2 / altitude)),\n",
+ " along_track_field_of_view=np.degrees(\n",
+ " 2 * np.arctan(ground_speed * time_step / 2 / altitude)\n",
+ " ),\n",
" roll_angle=modes.loc[mode, \"roll (deg)\"],\n",
" is_rectangular=True,\n",
- " velocity_frame=velocity_frame,\n",
" )\n",
"\n",
"\n",
@@ -1422,21 +1586,37 @@
" \"\"\"Shift longitudes of a polygon that crosses the antimeridian to be continuous.\"\"\"\n",
" lon = np.array(geometry.exterior.coords)[:, 0]\n",
" if lon.max() - lon.min() > 180:\n",
- " return shapely.ops.transform(lambda x, y, z=None: (np.where(np.asarray(x) < 0, np.asarray(x) + 360, x), y), geometry)\n",
+ " return shapely.ops.transform(\n",
+ " lambda x, y, z=None: (\n",
+ " np.where(np.asarray(x) < 0, np.asarray(x) + 360, x),\n",
+ " y,\n",
+ " ),\n",
+ " geometry,\n",
+ " )\n",
" return geometry\n",
"\n",
"\n",
"def footprint_row(product):\n",
- " start, end = pd.Timestamp(product.zero_doppler_start, tz=\"UTC\"), pd.Timestamp(product.zero_doppler_end, tz=\"UTC\")\n",
+ " start, end = pd.Timestamp(product.zero_doppler_start, tz=\"UTC\"), pd.Timestamp(\n",
+ " product.zero_doppler_end, tz=\"UTC\"\n",
+ " )\n",
" n = max(1, int(round((end - start).total_seconds() / TIME_STEP)))\n",
" step = (end - start) / n\n",
" times = [(start + step * (i + 0.5)).floor(\"us\").to_pydatetime() for i in range(n)]\n",
- " satellite = nisar.model_copy(update={\"instruments\": [nisar_view(product[\"mode\"], step.total_seconds())]})\n",
+ " satellite = nisar.model_copy(\n",
+ " update={\"instruments\": [nisar_view(product[\"mode\"], step.total_seconds())]}\n",
+ " )\n",
" predicted = compute_ground_track(satellite, times).geometry.iloc[0]\n",
" observed = unwrap(shapely.force_2d(shapely.from_wkt(product.polygon)))\n",
" center = observed.centroid\n",
- " project = Transformer.from_crs(\"EPSG:4326\", f\"+proj=aeqd +lat_0={center.y} +lon_0={center.x} +units=m\", always_xy=True).transform\n",
- " a, b = transform_geometry(project, observed).buffer(0), transform_geometry(project, predicted).buffer(0)\n",
+ " project = Transformer.from_crs(\n",
+ " \"EPSG:4326\",\n",
+ " f\"+proj=aeqd +lat_0={center.y} +lon_0={center.x} +units=m\",\n",
+ " always_xy=True,\n",
+ " ).transform\n",
+ " a, b = transform_geometry(project, observed).buffer(0), transform_geometry(\n",
+ " project, predicted\n",
+ " ).buffer(0)\n",
" return {\n",
" \"granule\": product.granule,\n",
" \"observed (km^2)\": a.area / 1e6,\n",
@@ -1446,12 +1626,18 @@
" }\n",
"\n",
"\n",
- "footprints = pd.DataFrame([footprint_row(product) for _, product in catalog.iterrows()]).merge(catalog[[\"granule\", \"mode\", \"direction\", \"coverage\"]])\n",
+ "footprints = pd.DataFrame(\n",
+ " [footprint_row(product) for _, product in catalog.iterrows()]\n",
+ ").merge(catalog[[\"granule\", \"mode\", \"direction\", \"coverage\"]])\n",
"pd.concat(\n",
" [\n",
" footprints[[\"IoU\"]].describe(percentiles=[0.05, 0.5]).T.assign(group=\"all\"),\n",
- " footprints.groupby(\"coverage\").IoU.describe(percentiles=[0.05, 0.5]).assign(group=\"coverage\"),\n",
- " footprints.groupby(\"mode\").IoU.describe(percentiles=[0.05, 0.5]).assign(group=\"mode\"),\n",
+ " footprints.groupby(\"coverage\")\n",
+ " .IoU.describe(percentiles=[0.05, 0.5])\n",
+ " .assign(group=\"coverage\"),\n",
+ " footprints.groupby(\"mode\")\n",
+ " .IoU.describe(percentiles=[0.05, 0.5])\n",
+ " .assign(group=\"mode\"),\n",
" ]\n",
").round(3)"
]
@@ -1462,10 +1648,10 @@
"id": "b45eb238",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:17.400722Z",
- "iopub.status.busy": "2026-10-08T18:05:17.400722Z",
- "iopub.status.idle": "2026-10-08T18:05:27.052101Z",
- "shell.execute_reply": "2026-10-08T18:05:27.051094Z"
+ "iopub.execute_input": "2026-10-25T14:01:06.298147Z",
+ "iopub.status.busy": "2026-10-25T14:01:06.298147Z",
+ "iopub.status.idle": "2026-10-25T14:01:14.369320Z",
+ "shell.execute_reply": "2026-10-25T14:01:14.369320Z"
}
},
"outputs": [
@@ -1488,12 +1674,27 @@
"for polygon in catalog.polygon:\n",
" # split footprints that cross the antimeridian for plotting\n",
" footprint = unwrap(shapely.force_2d(shapely.from_wkt(polygon)))\n",
- " parts = [footprint.intersection(shapely.box(-180, -90, 180, 90)), shapely.affinity.translate(footprint.intersection(shapely.box(180, -90, 540, 90)), -360)]\n",
- " ax.add_geometries([part for part in parts if not part.is_empty], crs=ccrs.PlateCarree(), facecolor=BLUE, edgecolor=\"none\", alpha=0.6)\n",
+ " parts = [\n",
+ " footprint.intersection(shapely.box(-180, -90, 180, 90)),\n",
+ " shapely.affinity.translate(\n",
+ " footprint.intersection(shapely.box(180, -90, 540, 90)), -360\n",
+ " ),\n",
+ " ]\n",
+ " ax.add_geometries(\n",
+ " [part for part in parts if not part.is_empty],\n",
+ " crs=ccrs.PlateCarree(),\n",
+ " facecolor=BLUE,\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.6,\n",
+ " )\n",
"ax.set_title(f\"NISAR RSLC frames, {DAY:%d %B %Y}\", fontsize=9)\n",
"ax2 = fig.add_subplot(1, 2, 2)\n",
"ax2.scatter(footprints.latitude, footprints.IoU, s=6, color=BLUE)\n",
- "ax2.set(xlabel=\"Frame center latitude (deg)\", ylabel=\"IoU (TAT-C vs. bounding polygon)\", title=\"Frame footprint agreement\")\n",
+ "ax2.set(\n",
+ " xlabel=\"Frame center latitude (deg)\",\n",
+ " ylabel=\"IoU (TAT-C vs. bounding polygon)\",\n",
+ " title=\"Frame footprint agreement\",\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()"
]
@@ -1516,10 +1717,10 @@
"id": "f20d1904",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:27.054101Z",
- "iopub.status.busy": "2026-10-08T18:05:27.053101Z",
- "iopub.status.idle": "2026-10-08T18:06:24.539159Z",
- "shell.execute_reply": "2026-10-08T18:06:24.539159Z"
+ "iopub.execute_input": "2026-10-25T14:01:14.373326Z",
+ "iopub.status.busy": "2026-10-25T14:01:14.373326Z",
+ "iopub.status.idle": "2026-10-25T14:01:50.095134Z",
+ "shell.execute_reply": "2026-10-25T14:01:50.094626Z"
}
},
"outputs": [
@@ -1592,19 +1793,52 @@
"for frame in [VelocityFrame.EARTH_FIXED, VelocityFrame.INERTIAL]:\n",
" differences, missed = [], 0\n",
" for mode, m in zip(geometry[\"mode\"], meta):\n",
- " satellite = nisar.model_copy(update={\"instruments\": [nisar_view(mode, velocity_frame=frame)]})\n",
+ " satellite = nisar.model_copy(\n",
+ " update={\n",
+ " \"instruments\": [nisar_view(mode)],\n",
+ " \"attitude\": Attitude(velocity_frame=frame),\n",
+ " }\n",
+ " )\n",
" for i in np.linspace(1, len(m[\"time\"]) - 2, 3).astype(int):\n",
- " for j in (np.linspace(0.1, 0.9, 5) * (len(m[\"slant_range\"]) - 1)).round().astype(int):\n",
- " point = Point(id=0, latitude=float(m[\"lat\"][i, j]), longitude=float(m[\"lon\"][i, j]))\n",
+ " for j in (\n",
+ " (np.linspace(0.1, 0.9, 5) * (len(m[\"slant_range\"]) - 1))\n",
+ " .round()\n",
+ " .astype(int)\n",
+ " ):\n",
+ " point = Point(\n",
+ " id=0,\n",
+ " latitude=float(m[\"lat\"][i, j]),\n",
+ " longitude=float(m[\"lon\"][i, j]),\n",
+ " )\n",
" truth = DAY + timedelta(seconds=float(m[\"time\"][i]))\n",
- " observations = collect_observations(point, satellite, truth - timedelta(minutes=5), truth + timedelta(minutes=5))\n",
+ " observations = collect_observations(\n",
+ " point,\n",
+ " satellite,\n",
+ " truth - timedelta(minutes=5),\n",
+ " truth + timedelta(minutes=5),\n",
+ " )\n",
" if observations.empty:\n",
" missed += 1\n",
" continue\n",
- " seconds = (observations.epoch - pd.Timestamp(truth)).dt.total_seconds().to_numpy()\n",
+ " seconds = (\n",
+ " (observations.epoch - pd.Timestamp(truth))\n",
+ " .dt.total_seconds()\n",
+ " .to_numpy()\n",
+ " )\n",
" differences.append(seconds[np.argmin(np.abs(seconds))])\n",
- " rows5[frame.value] = pd.concat([pd.Series({\"points\": len(differences) + missed, \"missed\": missed}), summarize(differences).drop(\"n\")])\n",
- "pd.DataFrame(rows5).T.rename(columns={\"median\": \"time, median (s)\", \"p95 |x|\": \"time, p95 |x| (s)\", \"max |x|\": \"time, max |x| (s)\"}).round(3)"
+ " rows5[frame.value] = pd.concat(\n",
+ " [\n",
+ " pd.Series({\"points\": len(differences) + missed, \"missed\": missed}),\n",
+ " summarize(differences).drop(\"n\"),\n",
+ " ]\n",
+ " )\n",
+ "pd.DataFrame(rows5).T.rename(\n",
+ " columns={\n",
+ " \"median\": \"time, median (s)\",\n",
+ " \"p95 |x|\": \"time, p95 |x| (s)\",\n",
+ " \"max |x|\": \"time, max |x| (s)\",\n",
+ " }\n",
+ ").round(3)"
]
},
{
diff --git a/docs/validation/ValidateSARSentinel1.ipynb b/docs/validation/ValidateSARSentinel1.ipynb
index 281a4d7d..655f9d05 100644
--- a/docs/validation/ValidateSARSentinel1.ipynb
+++ b/docs/validation/ValidateSARSentinel1.ipynb
@@ -18,7 +18,7 @@
"3. **Swath edges.** How closely do the edges of TAT-C's view match the near-range and far-range edges of the images?\n",
"4. **Product footprints.** Does `compute_ground_track` reproduce the footprints of all the products acquired in a day?\n",
"5. **Observation times.** Does `collect_observations` predict when Sentinel-1C images a point?\n",
- "6. **Roll steering.** Does a roll angle that varies around the orbit (`roll_angle_profile`) reproduce Sentinel-1's roll steering?"
+ "6. **Roll steering.** Does a satellite attitude whose roll angle varies around the orbit (an `Attitude` with a `roll_angle_profile`) reproduce Sentinel-1's roll steering?"
]
},
{
@@ -45,10 +45,10 @@
"id": "8fc47306",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:33.924607Z",
- "iopub.status.busy": "2026-10-08T18:05:33.924607Z",
- "iopub.status.idle": "2026-10-08T18:05:34.437920Z",
- "shell.execute_reply": "2026-10-08T18:05:34.437920Z"
+ "iopub.execute_input": "2026-10-25T13:59:23.384863Z",
+ "iopub.status.busy": "2026-10-25T13:59:23.384863Z",
+ "iopub.status.idle": "2026-10-25T13:59:24.029443Z",
+ "shell.execute_reply": "2026-10-25T13:59:24.029443Z"
}
},
"outputs": [
@@ -144,10 +144,20 @@
" page = requests.post(url, json=body, timeout=300).json()\n",
" items += page[\"features\"]\n",
" following = [link for link in page[\"links\"] if link[\"rel\"] == \"next\"]\n",
- " url, body = (following[0][\"href\"], following[0].get(\"body\", body)) if following else (None, None)\n",
+ " url, body = (\n",
+ " (following[0][\"href\"], following[0].get(\"body\", body))\n",
+ " if following\n",
+ " else (None, None)\n",
+ " )\n",
" ITEMS_FILE.write_text(json.dumps(items))\n",
- "items = [item for item in json.loads(ITEMS_FILE.read_text()) if item[\"properties\"][\"sar:instrument_mode\"] in MODES]\n",
- "pd.DataFrame([item[\"properties\"] for item in items]).groupby([\"sar:instrument_mode\", \"sat:orbit_state\"]).size().unstack(fill_value=0)"
+ "items = [\n",
+ " item\n",
+ " for item in json.loads(ITEMS_FILE.read_text())\n",
+ " if item[\"properties\"][\"sar:instrument_mode\"] in MODES\n",
+ "]\n",
+ "pd.DataFrame([item[\"properties\"] for item in items]).groupby(\n",
+ " [\"sar:instrument_mode\", \"sat:orbit_state\"]\n",
+ ").size().unstack(fill_value=0)"
]
},
{
@@ -164,10 +174,10 @@
"id": "67f7f29f",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:34.439928Z",
- "iopub.status.busy": "2026-10-08T18:05:34.439928Z",
- "iopub.status.idle": "2026-10-08T18:05:34.560654Z",
- "shell.execute_reply": "2026-10-08T18:05:34.560654Z"
+ "iopub.execute_input": "2026-10-25T13:59:24.031861Z",
+ "iopub.status.busy": "2026-10-25T13:59:24.031861Z",
+ "iopub.status.idle": "2026-10-25T13:59:24.150707Z",
+ "shell.execute_reply": "2026-10-25T13:59:24.150707Z"
}
},
"outputs": [
@@ -202,7 +212,9 @@
" polarization = item[\"properties\"][\"sar:polarizations\"][0].lower()\n",
" for attempt in range(5):\n",
" try:\n",
- " response = requests.get(f\"{base}/annotation/{mode}-{polarization}.xml?{token}\", timeout=120)\n",
+ " response = requests.get(\n",
+ " f\"{base}/annotation/{mode}-{polarization}.xml?{token}\", timeout=120\n",
+ " )\n",
" response.raise_for_status()\n",
" break\n",
" except requests.RequestException:\n",
@@ -212,7 +224,9 @@
" points = root.findall(\".//geolocationGridPoint\")\n",
" lines = sorted({int(p.find(\"line\").text) for p in points})\n",
" samples = sorted({int(p.find(\"pixel\").text) for p in points})\n",
- " grid = lambda tag, f=float: np.array([f(p.find(tag).text) for p in points]).reshape(len(lines), len(samples))\n",
+ " grid = lambda tag, f=float: np.array(\n",
+ " [f(p.find(tag).text) for p in points]\n",
+ " ).reshape(len(lines), len(samples))\n",
" orbits = root.findall(\".//orbitList/orbit\")\n",
" return {\n",
" \"id\": item[\"id\"],\n",
@@ -224,8 +238,12 @@
" \"lat\": grid(\"latitude\"),\n",
" \"incidence\": grid(\"incidenceAngle\"),\n",
" \"orbit_time\": np.array([seconds(o.find(\"time\").text) for o in orbits]),\n",
- " \"orbit_position\": np.array([[float(o.find(f\"position/{c}\").text) for c in \"xyz\"] for o in orbits]),\n",
- " \"orbit_velocity\": np.array([[float(o.find(f\"velocity/{c}\").text) for c in \"xyz\"] for o in orbits]),\n",
+ " \"orbit_position\": np.array(\n",
+ " [[float(o.find(f\"position/{c}\").text) for c in \"xyz\"] for o in orbits]\n",
+ " ),\n",
+ " \"orbit_velocity\": np.array(\n",
+ " [[float(o.find(f\"velocity/{c}\").text) for c in \"xyz\"] for o in orbits]\n",
+ " ),\n",
" }\n",
"\n",
" with concurrent.futures.ThreadPoolExecutor(16) as pool:\n",
@@ -238,8 +256,14 @@
" n_line=[len(r[\"time\"]) for r in records],\n",
" n_sample=[r[\"time\"].shape[1] for r in records],\n",
" n_orbit=[len(r[\"orbit_time\"]) for r in records],\n",
- " **{k: np.concatenate([r[k].ravel() for r in records]) for k in [\"time\", \"slant_range\", \"lon\", \"lat\", \"incidence\"]},\n",
- " **{k: np.concatenate([r[k] for r in records]) for k in [\"orbit_time\", \"orbit_position\", \"orbit_velocity\"]},\n",
+ " **{\n",
+ " k: np.concatenate([r[k].ravel() for r in records])\n",
+ " for k in [\"time\", \"slant_range\", \"lon\", \"lat\", \"incidence\"]\n",
+ " },\n",
+ " **{\n",
+ " k: np.concatenate([r[k] for r in records])\n",
+ " for k in [\"orbit_time\", \"orbit_position\", \"orbit_velocity\"]\n",
+ " },\n",
" )\n",
"\n",
"cache = dict(np.load(GRID_FILE))\n",
@@ -248,8 +272,14 @@
"meta = []\n",
"for i, (t, sr, lon, lat, inc, ot, op, ov) in enumerate(\n",
" zip(\n",
- " cut(\"time\", size), cut(\"slant_range\", cache[\"n_sample\"]), cut(\"lon\", size), cut(\"lat\", size), cut(\"incidence\", size),\n",
- " cut(\"orbit_time\", cache[\"n_orbit\"]), cut(\"orbit_position\", cache[\"n_orbit\"]), cut(\"orbit_velocity\", cache[\"n_orbit\"]),\n",
+ " cut(\"time\", size),\n",
+ " cut(\"slant_range\", cache[\"n_sample\"]),\n",
+ " cut(\"lon\", size),\n",
+ " cut(\"lat\", size),\n",
+ " cut(\"incidence\", size),\n",
+ " cut(\"orbit_time\", cache[\"n_orbit\"]),\n",
+ " cut(\"orbit_position\", cache[\"n_orbit\"]),\n",
+ " cut(\"orbit_velocity\", cache[\"n_orbit\"]),\n",
" )\n",
"):\n",
" shape2 = (cache[\"n_line\"][i], cache[\"n_sample\"][i])\n",
@@ -273,8 +303,12 @@
" \"\"\"Well-known text of the polygon outlining a product's geolocation grid.\"\"\"\n",
" ring = [(m[\"lon\"][0, j], m[\"lat\"][0, j]) for j in range(m[\"lon\"].shape[1])]\n",
" ring += [(m[\"lon\"][i, -1], m[\"lat\"][i, -1]) for i in range(1, m[\"lon\"].shape[0])]\n",
- " ring += [(m[\"lon\"][-1, j], m[\"lat\"][-1, j]) for j in range(m[\"lon\"].shape[1] - 2, -1, -1)]\n",
- " ring += [(m[\"lon\"][i, 0], m[\"lat\"][i, 0]) for i in range(m[\"lon\"].shape[0] - 2, -1, -1)]\n",
+ " ring += [\n",
+ " (m[\"lon\"][-1, j], m[\"lat\"][-1, j]) for j in range(m[\"lon\"].shape[1] - 2, -1, -1)\n",
+ " ]\n",
+ " ring += [\n",
+ " (m[\"lon\"][i, 0], m[\"lat\"][i, 0]) for i in range(m[\"lon\"].shape[0] - 2, -1, -1)\n",
+ " ]\n",
" return \"POLYGON ((\" + \", \".join(f\"{x} {y}\" for x, y in ring) + \"))\"\n",
"\n",
"\n",
@@ -284,8 +318,12 @@
" \"mode\": cache[\"mode\"],\n",
" \"direction\": cache[\"direction\"],\n",
" \"polygon\": [outline(m) for m in meta],\n",
- " \"zero_doppler_start\": [str(pd.Timestamp(DAY) + pd.Timedelta(seconds=m[\"time\"][0])) for m in meta],\n",
- " \"zero_doppler_end\": [str(pd.Timestamp(DAY) + pd.Timedelta(seconds=m[\"time\"][-1])) for m in meta],\n",
+ " \"zero_doppler_start\": [\n",
+ " str(pd.Timestamp(DAY) + pd.Timedelta(seconds=m[\"time\"][0])) for m in meta\n",
+ " ],\n",
+ " \"zero_doppler_end\": [\n",
+ " str(pd.Timestamp(DAY) + pd.Timedelta(seconds=m[\"time\"][-1])) for m in meta\n",
+ " ],\n",
" }\n",
")\n",
"sample = catalog\n",
@@ -314,10 +352,10 @@
"id": "26a557d1",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:34.562660Z",
- "iopub.status.busy": "2026-10-08T18:05:34.562660Z",
- "iopub.status.idle": "2026-10-08T18:05:36.212179Z",
- "shell.execute_reply": "2026-10-08T18:05:36.211674Z"
+ "iopub.execute_input": "2026-10-25T13:59:24.152711Z",
+ "iopub.status.busy": "2026-10-25T13:59:24.152711Z",
+ "iopub.status.idle": "2026-10-25T13:59:26.020447Z",
+ "shell.execute_reply": "2026-10-25T13:59:26.020447Z"
}
},
"outputs": [],
@@ -336,7 +374,13 @@
"\n",
"from tatc.analysis import collect_observations, compute_ground_track\n",
"from tatc.constants import EARTH_ROTATION_RATE\n",
- "from tatc.schemas import GeneralPerturbationsOrbit, Point, PointedInstrument, Satellite\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
"from tatc.utils import VelocityFrame, compute_projected_ray_position\n",
"\n",
"GEOD = Geod(ellps=\"WGS84\")\n",
@@ -352,13 +396,17 @@
"\n",
"def ecef(lon, lat, height=0.0):\n",
" \"\"\"Earth-fixed position (m) of geodetic coordinates, stacked on the last axis.\"\"\"\n",
- " return np.stack(TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1)\n",
+ " return np.stack(\n",
+ " TO_ECEF.transform(lon, lat, np.broadcast_to(height, np.shape(lon))), axis=-1\n",
+ " )\n",
"\n",
"\n",
"def up(lon, lat):\n",
" \"\"\"Geodetic up unit vector, stacked on the last axis.\"\"\"\n",
" lon, lat = np.radians(lon), np.radians(lat)\n",
- " return np.stack([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1)\n",
+ " return np.stack(\n",
+ " [np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def normalize(x):\n",
@@ -379,23 +427,42 @@
" k = np.clip(np.searchsorted(t, seconds) - 1, 0, len(t) - 2)\n",
" h = (t[k + 1] - t[k])[:, None]\n",
" s = ((seconds - t[k]) / (t[k + 1] - t[k]))[:, None]\n",
- " h00, h10, h01, h11 = 2 * s**3 - 3 * s**2 + 1, s**3 - 2 * s**2 + s, -2 * s**3 + 3 * s**2, s**3 - s**2\n",
+ " h00, h10, h01, h11 = (\n",
+ " 2 * s**3 - 3 * s**2 + 1,\n",
+ " s**3 - 2 * s**2 + s,\n",
+ " -2 * s**3 + 3 * s**2,\n",
+ " s**3 - s**2,\n",
+ " )\n",
" position = h00 * p[k] + h10 * h * v[k] + h01 * p[k + 1] + h11 * h * v[k + 1]\n",
- " d00, d10, d01, d11 = (6 * s**2 - 6 * s) / h, 3 * s**2 - 4 * s + 1, (-6 * s**2 + 6 * s) / h, 3 * s**2 - 2 * s\n",
+ " d00, d10, d01, d11 = (\n",
+ " (6 * s**2 - 6 * s) / h,\n",
+ " 3 * s**2 - 4 * s + 1,\n",
+ " (-6 * s**2 + 6 * s) / h,\n",
+ " 3 * s**2 - 2 * s,\n",
+ " )\n",
" velocity = d00 * p[k] + d10 * v[k] + d01 * p[k + 1] + d11 * v[k + 1]\n",
" return position, velocity\n",
"\n",
"\n",
"def inertial_velocity(position, velocity):\n",
" \"\"\"Inertial velocity expressed in Earth-fixed coordinates.\"\"\"\n",
- " return velocity + EARTH_ROTATION_RATE * np.stack([-position[..., 1], position[..., 0], np.zeros(position.shape[:-1])], axis=-1)\n",
+ " return velocity + EARTH_ROTATION_RATE * np.stack(\n",
+ " [-position[..., 1], position[..., 0], np.zeros(position.shape[:-1])], axis=-1\n",
+ " )\n",
"\n",
"\n",
"def summarize(x):\n",
" \"\"\"Summary statistics of a residual sample.\"\"\"\n",
" x = np.asarray(x, dtype=float)\n",
" x = x[np.isfinite(x)]\n",
- " return pd.Series({\"n\": x.size, \"median\": np.median(x), \"p95 |x|\": np.percentile(np.abs(x), 95), \"max |x|\": np.abs(x).max()})\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": x.size,\n",
+ " \"median\": np.median(x),\n",
+ " \"p95 |x|\": np.percentile(np.abs(x), 95),\n",
+ " \"max |x|\": np.abs(x).max(),\n",
+ " }\n",
+ " )\n",
"\n",
"\n",
"BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
@@ -426,10 +493,10 @@
"id": "2aef6f21",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:36.215187Z",
- "iopub.status.busy": "2026-10-08T18:05:36.215187Z",
- "iopub.status.idle": "2026-10-08T18:05:36.423890Z",
- "shell.execute_reply": "2026-10-08T18:05:36.423890Z"
+ "iopub.execute_input": "2026-10-25T13:59:26.022964Z",
+ "iopub.status.busy": "2026-10-25T13:59:26.022964Z",
+ "iopub.status.idle": "2026-10-25T13:59:26.250297Z",
+ "shell.execute_reply": "2026-10-25T13:59:26.250297Z"
}
},
"outputs": [
@@ -515,19 +582,29 @@
"p1, v1 = orbit.get_orbit_track(to_utc(orbit_time)).frame_xyz_and_velocity(itrs)\n",
"offset1 = np.array(p1.m).T - orbit_position\n",
"radial1 = normalize(orbit_position)\n",
- "along1 = normalize(orbit_velocity - np.sum(orbit_velocity * radial1, axis=-1, keepdims=True) * radial1)\n",
+ "along1 = normalize(\n",
+ " orbit_velocity - np.sum(orbit_velocity * radial1, axis=-1, keepdims=True) * radial1\n",
+ ")\n",
"along1_km = np.sum(offset1 * along1, axis=-1) / 1e3\n",
- "epoch = datetime(2026, 1, 1, tzinfo=timezone.utc) + timedelta(days=float(TLE[0][20:32]) - 1)\n",
+ "epoch = datetime(2026, 1, 1, tzinfo=timezone.utc) + timedelta(\n",
+ " days=float(TLE[0][20:32]) - 1\n",
+ ")\n",
"hours_before_epoch = (epoch - DAY).total_seconds() / 3600 - orbit_time / 3600\n",
"fig, ax = plt.subplots(figsize=(7, 3.2))\n",
"ax.scatter(hours_before_epoch, along1_km, s=4, color=BLUE)\n",
- "ax.set(xlabel=\"Hours before TLE epoch\", ylabel=\"Along-track error (km)\", title=\"TLE vs. Sentinel-1C restituted orbit\")\n",
+ "ax.set(\n",
+ " xlabel=\"Hours before TLE epoch\",\n",
+ " ylabel=\"Along-track error (km)\",\n",
+ " title=\"TLE vs. Sentinel-1C restituted orbit\",\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()\n",
"pd.DataFrame(\n",
" {\n",
" \"along-track (km)\": summarize(along1_km),\n",
- " \"cross-track, right (km)\": summarize(np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3),\n",
+ " \"cross-track, right (km)\": summarize(\n",
+ " np.sum(offset1 * np.cross(along1, radial1), axis=-1) / 1e3\n",
+ " ),\n",
" \"radial (km)\": summarize(np.sum(offset1 * radial1, axis=-1) / 1e3),\n",
" }\n",
").T.round(3)"
@@ -555,10 +632,10 @@
"id": "74c69429",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:36.426898Z",
- "iopub.status.busy": "2026-10-08T18:05:36.425898Z",
- "iopub.status.idle": "2026-10-08T18:05:36.791157Z",
- "shell.execute_reply": "2026-10-08T18:05:36.790650Z"
+ "iopub.execute_input": "2026-10-25T13:59:26.252302Z",
+ "iopub.status.busy": "2026-10-25T13:59:26.252302Z",
+ "iopub.status.idle": "2026-10-25T13:59:26.570899Z",
+ "shell.execute_reply": "2026-10-25T13:59:26.570392Z"
}
},
"outputs": [
@@ -665,8 +742,21 @@
" left = normalize(np.cross(normalize(velocity), nadir))\n",
" look = np.degrees(np.arccos(np.sum(los * nadir[:, None], axis=-1)))\n",
" side_all.append(np.sign(np.sum(los * left[:, None], axis=-1)).ravel())\n",
- " plane_earth.append(np.degrees(np.arcsin(np.sum(los * normalize(velocity)[:, None], axis=-1))).ravel())\n",
- " plane_inertial.append(np.degrees(np.arcsin(np.sum(los * normalize(inertial_velocity(position, velocity))[:, None], axis=-1))).ravel())\n",
+ " plane_earth.append(\n",
+ " np.degrees(\n",
+ " np.arcsin(np.sum(los * normalize(velocity)[:, None], axis=-1))\n",
+ " ).ravel()\n",
+ " )\n",
+ " plane_inertial.append(\n",
+ " np.degrees(\n",
+ " np.arcsin(\n",
+ " np.sum(\n",
+ " los * normalize(inertial_velocity(position, velocity))[:, None],\n",
+ " axis=-1,\n",
+ " )\n",
+ " )\n",
+ " ).ravel()\n",
+ " )\n",
" rows2.append(\n",
" {\n",
" \"latitude\": np.median(sub_lat),\n",
@@ -677,10 +767,16 @@
" \"far incidence (deg)\": np.median(m[\"incidence\"][:, -1]),\n",
" }\n",
" )\n",
- "geometry = pd.concat([sample[[\"granule\", \"mode\", \"direction\"]], pd.DataFrame(rows2)], axis=1)\n",
- "side_all, plane_earth, plane_inertial = map(np.concatenate, (side_all, plane_earth, plane_inertial))\n",
+ "geometry = pd.concat(\n",
+ " [sample[[\"granule\", \"mode\", \"direction\"]], pd.DataFrame(rows2)], axis=1\n",
+ ")\n",
+ "side_all, plane_earth, plane_inertial = map(\n",
+ " np.concatenate, (side_all, plane_earth, plane_inertial)\n",
+ ")\n",
"# roll angle and cross-track field of view of each mode, from the median edge look angles\n",
- "modes = geometry.groupby(\"mode\")[[\"near look (deg)\", \"far look (deg)\", \"near incidence (deg)\", \"far incidence (deg)\"]].median()\n",
+ "modes = geometry.groupby(\"mode\")[\n",
+ " [\"near look (deg)\", \"far look (deg)\", \"near incidence (deg)\", \"far incidence (deg)\"]\n",
+ "].median()\n",
"modes[\"roll (deg)\"] = (modes[\"near look (deg)\"] + modes[\"far look (deg)\"]) / 2\n",
"modes[\"field of view (deg)\"] = modes[\"far look (deg)\"] - modes[\"near look (deg)\"]\n",
"modes[\"products\"] = catalog.groupby(\"mode\").size()\n",
@@ -688,12 +784,22 @@
" pd.Series(\n",
" {\n",
" \"lines of sight on the right (%)\": 100 * np.mean(side_all < 0),\n",
- " \"angle to Earth-fixed zero-Doppler plane, max |x| (deg)\": np.abs(plane_earth).max(),\n",
- " \"angle to inertial zero-Doppler plane, p95 |x| (deg)\": np.percentile(np.abs(plane_inertial), 95),\n",
- " \"near look angle, range within modes (deg)\": (geometry.groupby(\"mode\")[\"near look (deg)\"].agg(np.ptp)).max(),\n",
- " \"far look angle, range within modes (deg)\": (geometry.groupby(\"mode\")[\"far look (deg)\"].agg(np.ptp)).max(),\n",
+ " \"angle to Earth-fixed zero-Doppler plane, max |x| (deg)\": np.abs(\n",
+ " plane_earth\n",
+ " ).max(),\n",
+ " \"angle to inertial zero-Doppler plane, p95 |x| (deg)\": np.percentile(\n",
+ " np.abs(plane_inertial), 95\n",
+ " ),\n",
+ " \"near look angle, range within modes (deg)\": (\n",
+ " geometry.groupby(\"mode\")[\"near look (deg)\"].agg(np.ptp)\n",
+ " ).max(),\n",
+ " \"far look angle, range within modes (deg)\": (\n",
+ " geometry.groupby(\"mode\")[\"far look (deg)\"].agg(np.ptp)\n",
+ " ).max(),\n",
" }\n",
- " ).round(5).to_string()\n",
+ " )\n",
+ " .round(5)\n",
+ " .to_string()\n",
")\n",
"modes.round(2)"
]
@@ -704,10 +810,10 @@
"id": "744d7fe8",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:36.793581Z",
- "iopub.status.busy": "2026-10-08T18:05:36.793171Z",
- "iopub.status.idle": "2026-10-08T18:05:36.970407Z",
- "shell.execute_reply": "2026-10-08T18:05:36.970407Z"
+ "iopub.execute_input": "2026-10-25T13:59:26.572899Z",
+ "iopub.status.busy": "2026-10-25T13:59:26.572899Z",
+ "iopub.status.idle": "2026-10-25T13:59:26.805526Z",
+ "shell.execute_reply": "2026-10-25T13:59:26.805526Z"
}
},
"outputs": [
@@ -724,9 +830,25 @@
],
"source": [
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
- "for column, color in [(\"near look (deg)\", BLUE), (\"far look (deg)\", BLUE), (\"near incidence (deg)\", ORANGE), (\"far incidence (deg)\", ORANGE)]:\n",
- " ax.scatter(geometry.latitude, geometry[column], s=12, color=color, marker=\"o\" if \"near\" in column else \"^\", label=column.replace(\" (deg)\", \"\"))\n",
- "ax.set(xlabel=\"Sub-satellite latitude (deg)\", ylabel=\"Angle (deg)\", title=\"Sentinel-1C look and incidence angles at the image edges\")\n",
+ "for column, color in [\n",
+ " (\"near look (deg)\", BLUE),\n",
+ " (\"far look (deg)\", BLUE),\n",
+ " (\"near incidence (deg)\", ORANGE),\n",
+ " (\"far incidence (deg)\", ORANGE),\n",
+ "]:\n",
+ " ax.scatter(\n",
+ " geometry.latitude,\n",
+ " geometry[column],\n",
+ " s=12,\n",
+ " color=color,\n",
+ " marker=\"o\" if \"near\" in column else \"^\",\n",
+ " label=column.replace(\" (deg)\", \"\"),\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Sub-satellite latitude (deg)\",\n",
+ " ylabel=\"Angle (deg)\",\n",
+ " title=\"Sentinel-1C look and incidence angles at the image edges\",\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8, ncols=2)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -752,10 +874,10 @@
"id": "ff0d749c",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:36.973414Z",
- "iopub.status.busy": "2026-10-08T18:05:36.973414Z",
- "iopub.status.idle": "2026-10-08T18:05:41.555919Z",
- "shell.execute_reply": "2026-10-08T18:05:41.555919Z"
+ "iopub.execute_input": "2026-10-25T13:59:26.807557Z",
+ "iopub.status.busy": "2026-10-25T13:59:26.807557Z",
+ "iopub.status.idle": "2026-10-25T13:59:30.955008Z",
+ "shell.execute_reply": "2026-10-25T13:59:30.954501Z"
}
},
"outputs": [
@@ -881,9 +1003,20 @@
" look_angle = modes.loc[mode, f\"{edge} look (deg)\"]\n",
" times = m[\"time\"]\n",
" _, velocity = interpolate_orbit(m, times)\n",
- " ray = compute_projected_ray_position(orbit.get_orbit_track(to_utc(times)), 0, 0, -look_angle, velocity_frame=frame)\n",
+ " ray = compute_projected_ray_position(\n",
+ " orbit.get_orbit_track(to_utc(times)),\n",
+ " 0,\n",
+ " 0,\n",
+ " -look_angle,\n",
+ " velocity_frame=frame,\n",
+ " )\n",
" lon, lat = m[\"lon\"][:, column], m[\"lat\"][:, column]\n",
- " along, right = along_right(lon, lat, ecef(ray.longitude.degrees, ray.latitude.degrees) - ecef(lon, lat), velocity)\n",
+ " along, right = along_right(\n",
+ " lon,\n",
+ " lat,\n",
+ " ecef(ray.longitude.degrees, ray.latitude.degrees) - ecef(lon, lat),\n",
+ " velocity,\n",
+ " )\n",
" along_all.append(along)\n",
" right_all.append(right)\n",
" rows3[(frame.value, edge, \"along\")] = summarize(np.concatenate(along_all))\n",
@@ -909,10 +1042,10 @@
"id": "742aee6b",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:41.559444Z",
- "iopub.status.busy": "2026-10-08T18:05:41.558444Z",
- "iopub.status.idle": "2026-10-08T18:05:52.821736Z",
- "shell.execute_reply": "2026-10-08T18:05:52.821736Z"
+ "iopub.execute_input": "2026-10-25T13:59:30.957013Z",
+ "iopub.status.busy": "2026-10-25T13:59:30.957013Z",
+ "iopub.status.idle": "2026-10-25T13:59:40.662746Z",
+ "shell.execute_reply": "2026-10-25T13:59:40.661741Z"
}
},
"outputs": [
@@ -1027,16 +1160,17 @@
"altitude = float(np.median(geometry[\"altitude (km)\"])) * 1e3\n",
"\n",
"\n",
- "def sentinel1_view(mode, time_step=TIME_STEP, velocity_frame=VelocityFrame.EARTH_FIXED):\n",
+ "def sentinel1_view(mode, time_step=TIME_STEP):\n",
" \"\"\"Rectangular, right-looking view of a Sentinel-1 mode, with the along-track field of view tailored to a time step (s).\"\"\"\n",
" return PointedInstrument(\n",
" name=\"Sentinel-1C C-SAR\",\n",
" field_of_regard=2 * (modes[\"far look (deg)\"].max() + 1),\n",
" cross_track_field_of_view=modes.loc[mode, \"field of view (deg)\"],\n",
- " along_track_field_of_view=np.degrees(2 * np.arctan(ground_speed * time_step / 2 / altitude)),\n",
+ " along_track_field_of_view=np.degrees(\n",
+ " 2 * np.arctan(ground_speed * time_step / 2 / altitude)\n",
+ " ),\n",
" roll_angle=-modes.loc[mode, \"roll (deg)\"],\n",
" is_rectangular=True,\n",
- " velocity_frame=velocity_frame,\n",
" )\n",
"\n",
"\n",
@@ -1044,21 +1178,41 @@
" \"\"\"Shift longitudes of a polygon that crosses the antimeridian to be continuous.\"\"\"\n",
" lon = np.array(geometry.exterior.coords)[:, 0]\n",
" if lon.max() - lon.min() > 180:\n",
- " return shapely.ops.transform(lambda x, y, z=None: (np.where(np.asarray(x) < 0, np.asarray(x) + 360, x), y), geometry)\n",
+ " return shapely.ops.transform(\n",
+ " lambda x, y, z=None: (\n",
+ " np.where(np.asarray(x) < 0, np.asarray(x) + 360, x),\n",
+ " y,\n",
+ " ),\n",
+ " geometry,\n",
+ " )\n",
" return geometry\n",
"\n",
"\n",
- "def footprint_row(product, view=sentinel1_view):\n",
- " start, end = pd.Timestamp(product.zero_doppler_start, tz=\"UTC\"), pd.Timestamp(product.zero_doppler_end, tz=\"UTC\")\n",
+ "def footprint_row(product, attitudes=None):\n",
+ " \"\"\"Footprint of a product, with the satellite's attitude in each mode (default: nadir, Earth-fixed).\"\"\"\n",
+ " start, end = pd.Timestamp(product.zero_doppler_start, tz=\"UTC\"), pd.Timestamp(\n",
+ " product.zero_doppler_end, tz=\"UTC\"\n",
+ " )\n",
" n = max(1, int(round((end - start).total_seconds() / TIME_STEP)))\n",
" step = (end - start) / n\n",
" times = [(start + step * (i + 0.5)).floor(\"us\").to_pydatetime() for i in range(n)]\n",
- " satellite = sentinel1.model_copy(update={\"instruments\": [view(product[\"mode\"], step.total_seconds())]})\n",
+ " satellite = sentinel1.model_copy(\n",
+ " update={\n",
+ " \"instruments\": [sentinel1_view(product[\"mode\"], step.total_seconds())],\n",
+ " \"attitude\": None if attitudes is None else attitudes[product[\"mode\"]],\n",
+ " }\n",
+ " )\n",
" predicted = compute_ground_track(satellite, times).geometry.iloc[0]\n",
" observed = unwrap(shapely.force_2d(shapely.from_wkt(product.polygon)))\n",
" center = observed.centroid\n",
- " project = Transformer.from_crs(\"EPSG:4326\", f\"+proj=aeqd +lat_0={center.y} +lon_0={center.x} +units=m\", always_xy=True).transform\n",
- " a, b = transform_geometry(project, observed).buffer(0), transform_geometry(project, predicted).buffer(0)\n",
+ " project = Transformer.from_crs(\n",
+ " \"EPSG:4326\",\n",
+ " f\"+proj=aeqd +lat_0={center.y} +lon_0={center.x} +units=m\",\n",
+ " always_xy=True,\n",
+ " ).transform\n",
+ " a, b = transform_geometry(project, observed).buffer(0), transform_geometry(\n",
+ " project, predicted\n",
+ " ).buffer(0)\n",
" return {\n",
" \"granule\": product.granule,\n",
" \"observed (km^2)\": a.area / 1e6,\n",
@@ -1068,12 +1222,18 @@
" }\n",
"\n",
"\n",
- "footprints = pd.DataFrame([footprint_row(product) for _, product in catalog.iterrows()]).merge(catalog[[\"granule\", \"mode\", \"direction\"]])\n",
+ "footprints = pd.DataFrame(\n",
+ " [footprint_row(product) for _, product in catalog.iterrows()]\n",
+ ").merge(catalog[[\"granule\", \"mode\", \"direction\"]])\n",
"pd.concat(\n",
" [\n",
" footprints[[\"IoU\"]].describe(percentiles=[0.05, 0.5]).T.assign(group=\"all\"),\n",
- " footprints.groupby(\"direction\").IoU.describe(percentiles=[0.05, 0.5]).assign(group=\"direction\"),\n",
- " footprints.groupby(\"mode\").IoU.describe(percentiles=[0.05, 0.5]).assign(group=\"mode\"),\n",
+ " footprints.groupby(\"direction\")\n",
+ " .IoU.describe(percentiles=[0.05, 0.5])\n",
+ " .assign(group=\"direction\"),\n",
+ " footprints.groupby(\"mode\")\n",
+ " .IoU.describe(percentiles=[0.05, 0.5])\n",
+ " .assign(group=\"mode\"),\n",
" ]\n",
").round(3)"
]
@@ -1084,10 +1244,10 @@
"id": "c77d816e",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:52.825246Z",
- "iopub.status.busy": "2026-10-08T18:05:52.824742Z",
- "iopub.status.idle": "2026-10-08T18:05:59.157049Z",
- "shell.execute_reply": "2026-10-08T18:05:59.156518Z"
+ "iopub.execute_input": "2026-10-25T13:59:40.664751Z",
+ "iopub.status.busy": "2026-10-25T13:59:40.663750Z",
+ "iopub.status.idle": "2026-10-25T13:59:45.587125Z",
+ "shell.execute_reply": "2026-10-25T13:59:45.587125Z"
}
},
"outputs": [
@@ -1110,12 +1270,27 @@
"for polygon in catalog.polygon:\n",
" # split footprints that cross the antimeridian for plotting\n",
" footprint = unwrap(shapely.force_2d(shapely.from_wkt(polygon)))\n",
- " parts = [footprint.intersection(shapely.box(-180, -90, 180, 90)), shapely.affinity.translate(footprint.intersection(shapely.box(180, -90, 540, 90)), -360)]\n",
- " ax.add_geometries([part for part in parts if not part.is_empty], crs=ccrs.PlateCarree(), facecolor=BLUE, edgecolor=\"none\", alpha=0.6)\n",
+ " parts = [\n",
+ " footprint.intersection(shapely.box(-180, -90, 180, 90)),\n",
+ " shapely.affinity.translate(\n",
+ " footprint.intersection(shapely.box(180, -90, 540, 90)), -360\n",
+ " ),\n",
+ " ]\n",
+ " ax.add_geometries(\n",
+ " [part for part in parts if not part.is_empty],\n",
+ " crs=ccrs.PlateCarree(),\n",
+ " facecolor=BLUE,\n",
+ " edgecolor=\"none\",\n",
+ " alpha=0.6,\n",
+ " )\n",
"ax.set_title(f\"Sentinel-1C IW and EW products, {DAY:%d %B %Y}\", fontsize=9)\n",
"ax2 = fig.add_subplot(1, 2, 2)\n",
"ax2.scatter(footprints.latitude, footprints.IoU, s=6, color=BLUE)\n",
- "ax2.set(xlabel=\"Product center latitude (deg)\", ylabel=\"IoU (TAT-C vs. geolocation grid)\", title=\"Product footprint agreement\")\n",
+ "ax2.set(\n",
+ " xlabel=\"Product center latitude (deg)\",\n",
+ " ylabel=\"IoU (TAT-C vs. geolocation grid)\",\n",
+ " title=\"Product footprint agreement\",\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()"
]
@@ -1138,10 +1313,10 @@
"id": "ae19443f",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:05:59.160667Z",
- "iopub.status.busy": "2026-10-08T18:05:59.160141Z",
- "iopub.status.idle": "2026-10-08T18:07:08.280716Z",
- "shell.execute_reply": "2026-10-08T18:07:08.279709Z"
+ "iopub.execute_input": "2026-10-25T13:59:45.590130Z",
+ "iopub.status.busy": "2026-10-25T13:59:45.590130Z",
+ "iopub.status.idle": "2026-10-25T14:00:26.110700Z",
+ "shell.execute_reply": "2026-10-25T14:00:26.110700Z"
}
},
"outputs": [
@@ -1214,19 +1389,52 @@
"for frame in [VelocityFrame.EARTH_FIXED, VelocityFrame.INERTIAL]:\n",
" differences, missed = [], 0\n",
" for mode, m in zip(geometry[\"mode\"][::10], meta[::10]):\n",
- " satellite = sentinel1.model_copy(update={\"instruments\": [sentinel1_view(mode, velocity_frame=frame)]})\n",
+ " satellite = sentinel1.model_copy(\n",
+ " update={\n",
+ " \"instruments\": [sentinel1_view(mode)],\n",
+ " \"attitude\": Attitude(velocity_frame=frame),\n",
+ " }\n",
+ " )\n",
" for i in np.linspace(1, len(m[\"time\"]) - 2, 3).astype(int):\n",
- " for j in (np.linspace(0.1, 0.9, 5) * (len(m[\"slant_range\"]) - 1)).round().astype(int):\n",
- " point = Point(id=0, latitude=float(m[\"lat\"][i, j]), longitude=float(m[\"lon\"][i, j]))\n",
+ " for j in (\n",
+ " (np.linspace(0.1, 0.9, 5) * (len(m[\"slant_range\"]) - 1))\n",
+ " .round()\n",
+ " .astype(int)\n",
+ " ):\n",
+ " point = Point(\n",
+ " id=0,\n",
+ " latitude=float(m[\"lat\"][i, j]),\n",
+ " longitude=float(m[\"lon\"][i, j]),\n",
+ " )\n",
" truth = DAY + timedelta(seconds=float(m[\"time\"][i]))\n",
- " observations = collect_observations(point, satellite, truth - timedelta(minutes=5), truth + timedelta(minutes=5))\n",
+ " observations = collect_observations(\n",
+ " point,\n",
+ " satellite,\n",
+ " truth - timedelta(minutes=5),\n",
+ " truth + timedelta(minutes=5),\n",
+ " )\n",
" if observations.empty:\n",
" missed += 1\n",
" continue\n",
- " seconds = (observations.epoch - pd.Timestamp(truth)).dt.total_seconds().to_numpy()\n",
+ " seconds = (\n",
+ " (observations.epoch - pd.Timestamp(truth))\n",
+ " .dt.total_seconds()\n",
+ " .to_numpy()\n",
+ " )\n",
" differences.append(seconds[np.argmin(np.abs(seconds))])\n",
- " rows5[frame.value] = pd.concat([pd.Series({\"points\": len(differences) + missed, \"missed\": missed}), summarize(differences).drop(\"n\")])\n",
- "pd.DataFrame(rows5).T.rename(columns={\"median\": \"time, median (s)\", \"p95 |x|\": \"time, p95 |x| (s)\", \"max |x|\": \"time, max |x| (s)\"}).round(3)"
+ " rows5[frame.value] = pd.concat(\n",
+ " [\n",
+ " pd.Series({\"points\": len(differences) + missed, \"missed\": missed}),\n",
+ " summarize(differences).drop(\"n\"),\n",
+ " ]\n",
+ " )\n",
+ "pd.DataFrame(rows5).T.rename(\n",
+ " columns={\n",
+ " \"median\": \"time, median (s)\",\n",
+ " \"p95 |x|\": \"time, p95 |x| (s)\",\n",
+ " \"max |x|\": \"time, max |x| (s)\",\n",
+ " }\n",
+ ").round(3)"
]
},
{
@@ -1238,7 +1446,7 @@
"\n",
"## Test 6: Roll Steering\n",
"\n",
- "A `PointedInstrument` can vary its roll angle around the orbit with a `roll_angle_profile`: a table of roll angles at arguments of latitude (the angle around the orbit from the ascending node), interpolated linearly. For each grid line of the products of Test 2, the satellite's argument of latitude is computed from the TLE at the line's zero-Doppler time, and the roll angle (the mean of the near and far look angles) from the grid. Each mode's profile is the median roll angle in 10 deg bins of argument of latitude, from the even-numbered products; the swath edges of Test 3 are then compared for the odd-numbered products, with the fixed roll angle and with the profile (and the same field of view), and the frame footprints of Test 4 are recomputed with the profiles."
+ "Sentinel-1 steers by rolling the spacecraft, so the steering is represented as the satellite's `Attitude`, whose roll angle can vary around the orbit with a `roll_angle_profile`: a table of roll angles at arguments of latitude (the angle around the orbit from the ascending node), interpolated linearly. The instrument's view is rotated from the satellite's body, so the instrument keeps the fixed roll angle of its mode, and the attitude's profile is the steering relative to it. For each grid line of the products of Test 2, the satellite's argument of latitude is computed from the TLE at the line's zero-Doppler time, and the roll angle (the mean of the near and far look angles) from the grid. Each mode's profile is the median roll angle in 10 deg bins of argument of latitude, from the even-numbered products; the swath edges of Test 3 are then compared for the odd-numbered products, with the fixed roll angle and with the profile (and the same field of view), and the frame footprints of Test 4 are recomputed with the profiles."
]
},
{
@@ -1247,10 +1455,10 @@
"id": "81d83e50",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:07:08.282716Z",
- "iopub.status.busy": "2026-10-08T18:07:08.282716Z",
- "iopub.status.idle": "2026-10-08T18:07:23.078184Z",
- "shell.execute_reply": "2026-10-08T18:07:23.078184Z"
+ "iopub.execute_input": "2026-10-25T14:00:26.112705Z",
+ "iopub.status.busy": "2026-10-25T14:00:26.112705Z",
+ "iopub.status.idle": "2026-10-25T14:00:39.441398Z",
+ "shell.execute_reply": "2026-10-25T14:00:39.441398Z"
}
},
"outputs": [
@@ -1390,7 +1598,9 @@
" {\n",
" \"product\": k,\n",
" \"mode\": mode,\n",
- " \"argument of latitude (deg)\": compute_argument_of_latitude(track.position.m, track.velocity.m_per_s),\n",
+ " \"argument of latitude (deg)\": compute_argument_of_latitude(\n",
+ " track.position.m, track.velocity.m_per_s\n",
+ " ),\n",
" \"roll (deg)\": (look[:, 0] + look[:, -1]) / 2,\n",
" \"field of view (deg)\": look[:, -1] - look[:, 0],\n",
" }\n",
@@ -1406,32 +1616,59 @@
" profiles[mode] = [(float(u), -float(r)) for u, r in medians.items()]\n",
"\n",
"\n",
- "def steered_view(mode, time_step=TIME_STEP, velocity_frame=VelocityFrame.EARTH_FIXED):\n",
- " \"\"\"Right-looking view of a Sentinel-1 mode with its roll angle profile.\"\"\"\n",
- " return sentinel1_view(mode, time_step, velocity_frame).model_copy(update={\"roll_angle_profile\": profiles[mode]})\n",
- "\n",
+ "# roll steering rolls the spacecraft: the satellite's attitude, relative to the instrument's (fixed) roll of each mode\n",
+ "steering = {\n",
+ " mode: Attitude(\n",
+ " roll_angle_profile=[(u, r + modes.loc[mode, \"roll (deg)\"]) for u, r in profile]\n",
+ " )\n",
+ " for mode, profile in profiles.items()\n",
+ "}\n",
"\n",
"rows6 = {}\n",
- "for label, view in [(\"fixed roll\", sentinel1_view), (\"roll profile\", steered_view)]:\n",
+ "for label, attitudes in [(\"fixed roll\", None), (\"roll profile\", steering)]:\n",
" for edge, column, sign in [(\"near\", 0, 1), (\"far\", -1, -1)]:\n",
" along_all, right_all = [], []\n",
" for k, (mode, m) in enumerate(zip(geometry[\"mode\"], meta)):\n",
" if k % 2 == 0:\n",
" continue\n",
- " instrument = view(mode)\n",
+ " instrument = sentinel1_view(mode)\n",
" track = orbit.get_orbit_track(to_utc(m[\"time\"]))\n",
" _, velocity = interpolate_orbit(m, m[\"time\"])\n",
- " # the edge of the view, half the field of view from the (negative) roll angle\n",
- " ray = compute_projected_ray_position(track, 0, 0, instrument.get_roll_angle(track) + sign * instrument.cross_track_field_of_view / 2)\n",
+ " # the edge of the view, half the field of view from the instrument's (negative) roll angle, rotated by the attitude\n",
+ " attitude = None if attitudes is None else attitudes[mode]\n",
+ " ray = compute_projected_ray_position(\n",
+ " track,\n",
+ " 0,\n",
+ " 0,\n",
+ " instrument.roll_angle + sign * instrument.cross_track_field_of_view / 2,\n",
+ " attitude=attitude,\n",
+ " )\n",
" lon, lat = m[\"lon\"][:, column], m[\"lat\"][:, column]\n",
- " along, right = along_right(lon, lat, ecef(ray.longitude.degrees, ray.latitude.degrees) - ecef(lon, lat), velocity)\n",
+ " along, right = along_right(\n",
+ " lon,\n",
+ " lat,\n",
+ " ecef(ray.longitude.degrees, ray.latitude.degrees) - ecef(lon, lat),\n",
+ " velocity,\n",
+ " )\n",
" along_all.append(along)\n",
" right_all.append(right)\n",
" rows6[(label, edge, \"along\")] = summarize(np.concatenate(along_all))\n",
" rows6[(label, edge, \"right\")] = summarize(np.concatenate(right_all))\n",
- "steered_footprints = pd.DataFrame([footprint_row(product, steered_view) for _, product in catalog.iterrows()]).merge(catalog[[\"granule\", \"mode\"]])\n",
- "print(\"product footprint IoU (median): fixed roll\", footprints.groupby(\"mode\").IoU.median().round(3).to_dict(), \"| roll profile\", steered_footprints.groupby(\"mode\").IoU.median().round(3).to_dict())\n",
- "print(\"product footprint IoU (5th percentile): fixed roll\", footprints.groupby(\"mode\").IoU.quantile(0.05).round(3).to_dict(), \"| roll profile\", steered_footprints.groupby(\"mode\").IoU.quantile(0.05).round(3).to_dict())\n",
+ "steered_footprints = pd.DataFrame(\n",
+ " [footprint_row(product, steering) for _, product in catalog.iterrows()]\n",
+ ").merge(catalog[[\"granule\", \"mode\"]])\n",
+ "print(\n",
+ " \"product footprint IoU (median): fixed roll\",\n",
+ " footprints.groupby(\"mode\").IoU.median().round(3).to_dict(),\n",
+ " \"| roll profile\",\n",
+ " steered_footprints.groupby(\"mode\").IoU.median().round(3).to_dict(),\n",
+ ")\n",
+ "print(\n",
+ " \"product footprint IoU (5th percentile): fixed roll\",\n",
+ " footprints.groupby(\"mode\").IoU.quantile(0.05).round(3).to_dict(),\n",
+ " \"| roll profile\",\n",
+ " steered_footprints.groupby(\"mode\").IoU.quantile(0.05).round(3).to_dict(),\n",
+ ")\n",
"pd.DataFrame(rows6).T.round(2)"
]
},
@@ -1441,10 +1678,10 @@
"id": "5e0e8a38",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:07:23.080191Z",
- "iopub.status.busy": "2026-10-08T18:07:23.080191Z",
- "iopub.status.idle": "2026-10-08T18:07:23.467077Z",
- "shell.execute_reply": "2026-10-08T18:07:23.467077Z"
+ "iopub.execute_input": "2026-10-25T14:00:39.443402Z",
+ "iopub.status.busy": "2026-10-25T14:00:39.443402Z",
+ "iopub.status.idle": "2026-10-25T14:00:39.606325Z",
+ "shell.execute_reply": "2026-10-25T14:00:39.606325Z"
}
},
"outputs": [
@@ -1462,10 +1699,23 @@
"source": [
"fig, ax = plt.subplots(figsize=(7, 3.6))\n",
"for (mode, group), color in zip(lines6.groupby(\"mode\"), [BLUE, ORANGE]):\n",
- " ax.scatter(group[\"argument of latitude (deg)\"], group[\"roll (deg)\"], s=3, color=color, alpha=0.4, label=f\"{mode} grid lines\")\n",
+ " ax.scatter(\n",
+ " group[\"argument of latitude (deg)\"],\n",
+ " group[\"roll (deg)\"],\n",
+ " s=3,\n",
+ " color=color,\n",
+ " alpha=0.4,\n",
+ " label=f\"{mode} grid lines\",\n",
+ " )\n",
" u, r = zip(*profiles[mode])\n",
" ax.plot(u, -np.array(r), \"-\", color=INK, lw=1)\n",
- "ax.set(xlabel=\"Argument of latitude (deg)\", ylabel=\"Roll angle to the right (deg)\", title=\"Sentinel-1C roll steering (lines: fitted profiles)\", xlim=(0, 360), xticks=range(0, 361, 90))\n",
+ "ax.set(\n",
+ " xlabel=\"Argument of latitude (deg)\",\n",
+ " ylabel=\"Roll angle to the right (deg)\",\n",
+ " title=\"Sentinel-1C roll steering (lines: fitted profiles)\",\n",
+ " xlim=(0, 360),\n",
+ " xticks=range(0, 361, 90),\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -1487,11 +1737,11 @@
"| 3. Swath edges | 3 km along track and 14 to 20 km across track (95th percentile) with the Earth-fixed frame; 24 to 41 km along track with the inertial frame |\n",
"| 4. Product footprints (`compute_ground_track`) | IoU 0.93 (IW) and 0.96 (EW), median, for all 499 products |\n",
"| 5. Observation times (`collect_observations`) | 0.44 s (95th percentile) with the Earth-fixed frame; up to 6 s with the inertial frame |\n",
- "| 6. Roll steering (`roll_angle_profile`) | swath edges within 6 to 7 km across track (95th percentile), instead of 14 to 20 km with a fixed roll angle; footprint IoU 5th percentile 0.92 (IW) and 0.94 (EW) |\n",
+ "| 6. Roll steering (`Attitude` with a `roll_angle_profile`) | swath edges within 6 to 7 km across track (95th percentile), instead of 14 to 20 km with a fixed roll angle; footprint IoU 5th percentile 0.92 (IW) and 0.94 (EW) |\n",
"\n",
"**Velocity frame.** As for NISAR, Sentinel-1's zero-Doppler images lie in the plane perpendicular to the Earth-fixed velocity, which TAT-C's default `VelocityFrame.EARTH_FIXED` reproduces; the inertial frame would displace swath edges by up to 41 km along track and observation times by up to 6 s.\n",
"\n",
- "**Roll steering.** A right-looking `PointedInstrument` with a negative roll angle and rigid rotation reproduces Sentinel-1C's swath geometry, with per-mode parameters. Sentinel-1 steers its roll angle around the orbit, so its look angles vary by up to 2.5 deg; a fixed roll angle and field of view, set to the median look angles, misplace the swath edges by up to about 20 km (95th percentile) where the look angles depart most from the median. A roll angle profile (`roll_angle_profile`, as a function of argument of latitude) models the roll steering and reduces these errors to about 7 km."
+ "**Roll steering.** A right-looking `PointedInstrument` with a negative roll angle and rigid rotation reproduces Sentinel-1C's swath geometry, with per-mode parameters. Sentinel-1 steers its roll angle around the orbit, so its look angles vary by up to 2.5 deg; a fixed roll angle and field of view, set to the median look angles, misplace the swath edges by up to about 20 km (95th percentile) where the look angles depart most from the median. The satellite's attitude with a roll angle profile (an `Attitude` with a `roll_angle_profile`, as a function of argument of latitude), from which the instrument's fixed view is rotated, models the roll steering and reduces these errors to about 7 km."
]
}
],
diff --git a/docs/validation/ValidateSampleSizes.ipynb b/docs/validation/ValidateSampleSizes.ipynb
new file mode 100644
index 00000000..5729c1be
--- /dev/null
+++ b/docs/validation/ValidateSampleSizes.ipynb
@@ -0,0 +1,2817 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "a13219d4",
+ "metadata": {},
+ "source": [
+ "# Sample Size Validation: Cross-Track and Conical Scanners\n",
+ "\n",
+ "This notebook validates TAT-C's sample sizes against operational scanning instruments. `compute_sample_sizes` adds to each observation the size on the ground of the observing instrument's pixel at the target (`sample_along` and `sample_cross`) and the spacing between neighboring pixels (`spacing_along` and `spacing_cross`). Together they bound the detail an observation can resolve, as used by the observing system simulation experiments (OSSEs) in the examples. For a `PointedInstrument`, TAT-C projects angular extents onto the WGS 84 ellipsoid around the line of sight to the target: the instantaneous field of view of a pixel for its size, and the angle between pixels for their spacing. For a `ConicalInstrument`, the size is that of its beam (`beam_width`), the spacing along the scanned arc follows from the azimuth between samples (`scan_sample_spacing`), and the spacing between scans is the distance the arc advances in one scan.\n",
+ "\n",
+ "Geolocation products report where each sample is centered, so the spacing of the samples can be measured directly; the sizes of the footprints cannot, and are instead compared with the values published for each instrument. The comparison uses six instruments, whose scan geometry is validated in the companion notebooks:\n",
+ "\n",
+ "* the cross-track scanners [ATMS](ValidateImagerATMS.ipynb) (a microwave sounder with one beam per scan position) and [CrIS](ValidateImagerCrIS.ipynb) (an infrared sounder) on NOAA-20;\n",
+ "* the cross-track imagers [VIIRS](ValidateImagerVIIRS.ipynb) on NOAA-20 and [MODIS](ValidateDriftMODIS.ipynb) on Terra, whose arrays of detectors image several lines per scan; and\n",
+ "* the conical scanners [AMSR2](ValidateConicalAMSR2.ipynb) on GCOM-W and [GMI](ValidateConicalGMI.ipynb) on GPM.\n",
+ "\n",
+ "The comparison asks four questions:\n",
+ "\n",
+ "1. **Cross-track spacing.** Does TAT-C reproduce the spacing of samples across the scan, which grows toward the swath edges?\n",
+ "2. **Along-track spacing.** Does it reproduce the spacing of samples along track, between detectors and between scans?\n",
+ "3. **Conical spacing.** Does it reproduce the spacing of a conical scanner's samples along the arc and between scans?\n",
+ "4. **Footprint sizes.** Do its sample sizes match the footprint sizes published for each instrument?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "00a8bd92",
+ "metadata": {},
+ "source": [
+ "## Reference Data\n",
+ "\n",
+ "This notebook reuses the geolocation products downloaded (and cached in `data/`) by the companion notebooks, which must be run first:\n",
+ "\n",
+ "* **ATMS** ([ATMS validation](ValidateImagerATMS.ipynb)): the center of each of the 96 beams of every scan of 2 October 2026 (`GATMO`), with the NOAA-20 two-line element set (TLE) of that day.\n",
+ "* **VIIRS** ([VIIRS validation](ValidateImagerVIIRS.ipynb)): the moderate-resolution (M-band) geolocation (`GMTCO`) of every tenth granule of the same day: all 3,200 samples of the two center detectors of each granule's middle scan, and detectors 1, 8, 9, and 16 of every scan at every eighth sample.\n",
+ "* **MODIS** ([MODIS validation](ValidateDriftMODIS.ipynb)): the 1 km geolocation (`MOD03`) of 4 October 2026: the first and last of the 10 detectors of every scan, at every eighth frame and the last; every twelfth 5-minute granule is used here.\n",
+ "* **AMSR2** ([AMSR2 validation](ValidateConicalAMSR2.ipynb)): the 243 low-resolution samples of every scan of 26 September 2026.\n",
+ "* **GMI** ([GMI validation](ValidateConicalGMI.ipynb)): the 221 samples of each of its two feeds (S1, 10 to 89 GHz; S2, 166 and 183 GHz) of every scan of 3 October 2026."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "01f9c6e1",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T16:05:55.877040Z",
+ "iopub.status.busy": "2026-10-25T16:05:55.877040Z",
+ "iopub.status.idle": "2026-10-25T16:05:57.865316Z",
+ "shell.execute_reply": "2026-10-25T16:05:57.865316Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "ATMS scans 32400\n",
+ "VIIRS granules with pixels 102\n",
+ "MODIS granules 24\n",
+ "AMSR2 scans 49695\n",
+ "GMI scans 46081\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from datetime import datetime, timedelta, timezone\n",
+ "from pathlib import Path\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "DATA_DIR = Path(\"data\")\n",
+ "FILES = {\n",
+ " \"ATMS geolocation (ValidateImagerATMS)\": DATA_DIR\n",
+ " / \"jpss\"\n",
+ " / \"atms_gatmo_20261002.npz\",\n",
+ " \"NOAA-20 TLE (ValidateImagerATMS)\": DATA_DIR / \"jpss\" / \"n20_tle_20261002.txt\",\n",
+ " \"VIIRS geolocation (ValidateImagerVIIRS)\": DATA_DIR\n",
+ " / \"jpss\"\n",
+ " / \"viirs_gmtco_pixels_20261002.npz\",\n",
+ " \"VIIRS scans (ValidateImagerVIIRS)\": DATA_DIR\n",
+ " / \"jpss\"\n",
+ " / \"viirs_gmtco_scans_20261002.npz\",\n",
+ " \"MODIS geolocation (ValidateDriftMODIS)\": DATA_DIR\n",
+ " / \"modis\"\n",
+ " / \"MOD03.A2026277.0000.007.2026277065153.npz\",\n",
+ " \"AMSR2 geolocation (ValidateConicalAMSR2)\": DATA_DIR\n",
+ " / \"amsr2\"\n",
+ " / \"amsr2_l1c_s1_20260926.npz\",\n",
+ " \"GMI geolocation (ValidateConicalGMI)\": DATA_DIR / \"gmi\" / \"gmi_l1c_20261003.npz\",\n",
+ "}\n",
+ "missing = [name for name, path in FILES.items() if not path.exists()]\n",
+ "if missing:\n",
+ " raise FileNotFoundError(\n",
+ " \"run the companion notebooks first, to download: \" + \"; \".join(missing)\n",
+ " )\n",
+ "\n",
+ "tle = FILES[\"NOAA-20 TLE (ValidateImagerATMS)\"].read_text().splitlines()\n",
+ "atms = dict(np.load(FILES[\"ATMS geolocation (ValidateImagerATMS)\"]))\n",
+ "viirs = dict(np.load(FILES[\"VIIRS scans (ValidateImagerVIIRS)\"]))\n",
+ "viirs_pixels = dict(np.load(FILES[\"VIIRS geolocation (ValidateImagerVIIRS)\"]))\n",
+ "# every twelfth MODIS granule (5 minutes each) of 4 October 2026\n",
+ "modis_granules = [\n",
+ " dict(np.load(path))\n",
+ " for path in sorted((DATA_DIR / \"modis\").glob(\"MOD03.A2026277.*.npz\"))[::12]\n",
+ "]\n",
+ "amsr2 = dict(np.load(FILES[\"AMSR2 geolocation (ValidateConicalAMSR2)\"]))\n",
+ "gmi = dict(np.load(FILES[\"GMI geolocation (ValidateConicalGMI)\"]))\n",
+ "pd.Series(\n",
+ " {\n",
+ " \"ATMS scans\": len(atms[\"MidTime\"]),\n",
+ " \"VIIRS granules with pixels\": len(viirs_pixels[\"granule\"]),\n",
+ " \"MODIS granules\": len(modis_granules),\n",
+ " \"AMSR2 scans\": len(amsr2[\"time\"]),\n",
+ " \"GMI scans\": len(gmi[\"time\"]),\n",
+ " }\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e376e0b3",
+ "metadata": {},
+ "source": [
+ "## Setup\n",
+ "\n",
+ "The instruments are modeled as in the companion notebooks, with the parameters fitted there, on satellites whose bodies are aligned with the inertial velocity (an inertial `Attitude`, as none of these spacecraft is yaw steered):\n",
+ "\n",
+ "* **ATMS:** a `PointedInstrument` of 96 pixels across track, spaced 1.112 deg and rolled 0.04 deg to the left, with one pixel along track spanning the same angle. The beams of channels 3 to 16 are 2.2 deg wide, about twice their spacing, so the pixels overlap: an oversampling of 1 - 1.112 / 2.2 = 0.49 in each direction. Its scan period of 8/3 s (`scan_period`) spaces its scans along track.\n",
+ "* **MODIS:** a `PointedInstrument` in scan geometry (`ViewGeometry.SCAN`) of 1,354 pixels across track and 10 along track, each 0.0812 deg, with its scan period (1.477 s).\n",
+ "* **VIIRS:** a `PointedInstrument` in scan geometry with 16 pixels (detectors) along track, 0.05104 deg apart, and its scan period (1.787 s), defined in Test 1.\n",
+ "* **AMSR2 and GMI:** `ConicalInstrument`s with the measured cone angles and scan sectors, defined in Test 3.\n",
+ "\n",
+ "The measured spacing at a sample is half the distance between the samples on either side of it (across the scan, between consecutive samples of a scan; along track, between consecutive scans, or between the first and last detectors of a scan divided by the number of detector pitches between them). TAT-C's sizes and spacings are computed by `compute_sample_sizes`, for observations of targets at the sample centers by the instrument at the sample times (the scan times, offset by the beam's time within the scan for ATMS)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "96fb4117",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T16:05:57.867835Z",
+ "iopub.status.busy": "2026-10-25T16:05:57.867835Z",
+ "iopub.status.idle": "2026-10-25T16:05:59.663057Z",
+ "shell.execute_reply": "2026-10-25T16:05:59.663057Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import geopandas as gpd\n",
+ "import matplotlib.pyplot as plt\n",
+ "from pyproj import Transformer\n",
+ "\n",
+ "from tatc.analysis import compute_sample_sizes\n",
+ "from tatc.constants import EARTH_MEAN_RADIUS, timescale\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " CircularOrbit,\n",
+ " ConicalInstrument,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
+ "from tatc.utils import (\n",
+ " VelocityFrame,\n",
+ " ViewGeometry,\n",
+ " compute_along_track_field_of_view,\n",
+ " compute_projected_ray_position,\n",
+ ")\n",
+ "\n",
+ "IET_EPOCH = pd.Timestamp(\"1958-01-01\", tz=\"UTC\")\n",
+ "LEAP_SECONDS = 37\n",
+ "TO_ECEF = Transformer.from_crs(\"EPSG:4979\", \"EPSG:4978\", always_xy=True)\n",
+ "# not yaw-steered: the bodies (and the instruments' views) of NOAA-20, Terra, GCOM-W, and GPM align with the inertial velocity\n",
+ "INERTIAL = Attitude(velocity_frame=VelocityFrame.INERTIAL)\n",
+ "\n",
+ "\n",
+ "def iet_to_utc(iet):\n",
+ " \"\"\"UTC times of IDPS Epoch Times (microseconds since 1958, including leap seconds).\"\"\"\n",
+ " return IET_EPOCH + pd.to_timedelta(\n",
+ " np.asarray(iet) - LEAP_SECONDS * 1_000_000, unit=\"us\"\n",
+ " )\n",
+ "\n",
+ "\n",
+ "def ecef(lon, lat):\n",
+ " \"\"\"Earth-fixed position (m) of geodetic coordinates on the ellipsoid, stacked on the last axis.\"\"\"\n",
+ " return np.stack(TO_ECEF.transform(lon, lat, np.zeros(np.shape(lat))), axis=-1)\n",
+ "\n",
+ "\n",
+ "def neighbor_spacing(xyz, axis):\n",
+ " \"\"\"Spacing (km) between neighboring samples along an axis: half the distance between the samples on either side\n",
+ " of each sample (NaN at the ends).\"\"\"\n",
+ " xyz = np.moveaxis(xyz, axis, 0)\n",
+ " spacing = np.full(xyz.shape[:-1], np.nan)\n",
+ " spacing[1:-1] = np.linalg.norm(xyz[2:] - xyz[:-2], axis=-1) / 2e3\n",
+ " return np.moveaxis(spacing, 0, axis)\n",
+ "\n",
+ "\n",
+ "def sample_sizes(satellite, instrument, lon, lat, epochs):\n",
+ " \"\"\"TAT-C's sample sizes and spacings (km) of an instrument at targets, each observed at an epoch.\"\"\"\n",
+ " observations = gpd.GeoDataFrame(\n",
+ " {\n",
+ " \"satellite\": satellite.name,\n",
+ " \"instrument\": instrument,\n",
+ " \"epoch\": pd.DatetimeIndex(epochs),\n",
+ " },\n",
+ " geometry=gpd.points_from_xy(np.ravel(lon), np.ravel(lat)),\n",
+ " crs=\"EPSG:4326\",\n",
+ " )\n",
+ " sizes = compute_sample_sizes(observations, satellite)\n",
+ " columns = [\n",
+ " \"sample_along\",\n",
+ " \"sample_cross\",\n",
+ " \"spacing_along\",\n",
+ " \"spacing_cross\",\n",
+ " \"sat_range\",\n",
+ " ]\n",
+ " return pd.DataFrame(\n",
+ " {\n",
+ " \"scan_angle\": sizes.scan_angle.to_numpy(),\n",
+ " **{c: sizes[c].to_numpy() / 1e3 for c in columns},\n",
+ " }\n",
+ " )\n",
+ "\n",
+ "\n",
+ "def ratio_summary(predicted, measured):\n",
+ " \"\"\"Percentiles of the ratio of TAT-C's to the measured spacing.\"\"\"\n",
+ " ratio = np.asarray(predicted / measured, dtype=float)\n",
+ " ratio = ratio[np.isfinite(ratio)]\n",
+ " return pd.Series(\n",
+ " {\n",
+ " \"n\": ratio.size,\n",
+ " \"5th percentile\": np.percentile(ratio, 5),\n",
+ " \"median\": np.median(ratio),\n",
+ " \"95th percentile\": np.percentile(ratio, 95),\n",
+ " }\n",
+ " )\n",
+ "\n",
+ "\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\"\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
+ "\n",
+ "# ATMS (ValidateImagerATMS): 96 beams on a fitted spacing of 1.112 deg, rolled 0.04 deg left; 2.2 deg beams (channels 3-16)\n",
+ "ATMS_BEAMS, ATMS_SPACING, ATMS_ROLL, ATMS_BEAM_WIDTH = 96, 1.112, 0.04, 2.2\n",
+ "ATMS_SCAN_PERIOD = 8 / 3 # s\n",
+ "atms_instrument = PointedInstrument(\n",
+ " name=\"ATMS\",\n",
+ " field_of_regard=ATMS_BEAMS * ATMS_SPACING,\n",
+ " cross_track_field_of_view=ATMS_BEAMS * ATMS_SPACING,\n",
+ " along_track_field_of_view=ATMS_SPACING,\n",
+ " cross_track_pixels=ATMS_BEAMS,\n",
+ " roll_angle=ATMS_ROLL,\n",
+ " is_rectangular=True,\n",
+ " # beams wider than their spacing overlap: a positive oversampling\n",
+ " cross_track_oversampling=1 - ATMS_SPACING / ATMS_BEAM_WIDTH,\n",
+ " along_track_oversampling=1 - ATMS_SPACING / ATMS_BEAM_WIDTH,\n",
+ " # one beam per scan position: the scans are spaced by their advance in one period\n",
+ " scan_period=ATMS_SCAN_PERIOD,\n",
+ ")\n",
+ "noaa20 = Satellite(\n",
+ " name=\"NOAA-20\",\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(tle),\n",
+ " instruments=[atms_instrument],\n",
+ " attitude=INERTIAL,\n",
+ ")\n",
+ "\n",
+ "# MODIS (ValidateDriftMODIS): 1,354 frames of 0.0812 deg across track, 10 detectors of 0.0812 deg along track, scan geometry\n",
+ "MODIS_SCAN_PERIOD = float(np.median(np.diff(modis_granules[0][\"ev_center_time\"]))) # s\n",
+ "modis_instrument = PointedInstrument(\n",
+ " name=\"MODIS\",\n",
+ " field_of_regard=112,\n",
+ " cross_track_field_of_view=1354 * 0.0812,\n",
+ " along_track_field_of_view=10 * 0.0812,\n",
+ " cross_track_pixels=1354,\n",
+ " along_track_pixels=10,\n",
+ " is_rectangular=True,\n",
+ " view_geometry=ViewGeometry.SCAN,\n",
+ " scan_period=MODIS_SCAN_PERIOD,\n",
+ ")\n",
+ "TERRA_TLE = [\n",
+ " \"1 25994U 99068A 26279.29978334 .00000220 00000+0 53719-4 0 9994\",\n",
+ " \"2 25994 97.9333 324.3740 0001348 204.7527 222.4948 14.61170513425833\",\n",
+ "]\n",
+ "terra = Satellite(\n",
+ " name=\"Terra\",\n",
+ " orbit=GeneralPerturbationsOrbit.from_tle(TERRA_TLE),\n",
+ " instruments=[modis_instrument],\n",
+ " attitude=INERTIAL,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a417b344",
+ "metadata": {},
+ "source": [
+ "## Test 1: Cross-Track Spacing\n",
+ "\n",
+ "**ATMS** samples its 96 beams at a constant angular rate. **MODIS** samples 1,354 frames per scan at a constant angular rate. **VIIRS** samples its detectors at a constant angular rate too, but aggregates the samples on board into 3,200 pixels: three samples per pixel near nadir, two at intermediate scan angles, and one at the swath edges, which keeps its pixels nearly the same size across the swath. The [VIIRS validation](ValidateImagerVIIRS.ipynb) found that a single `PointedInstrument` of 3,200 equal pixels cannot represent these zones. Here, each zone is instead represented by its own `PointedInstrument`, with the zone's pixels, angular spacing, and center (roll angle) taken from the measured scan angles, and each sample is assigned to the instrument of its zone."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "4f6867f2",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T16:05:59.668703Z",
+ "iopub.status.busy": "2026-10-25T16:05:59.668138Z",
+ "iopub.status.idle": "2026-10-25T16:06:00.261822Z",
+ "shell.execute_reply": "2026-10-25T16:06:00.261822Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ " n TAT-C / measured, 5th percentile \\\n",
+ "ATMS 20304.0 0.9919 \n",
+ "MODIS 44616.0 0.9972 \n",
+ "VIIRS, aggregation zones 325380.0 0.9915 \n",
+ "VIIRS, 3,200 equal pixels 325380.0 0.6564 \n",
+ "\n",
+ " TAT-C / measured, median \\\n",
+ "ATMS 0.9996 \n",
+ "MODIS 0.9994 \n",
+ "VIIRS, aggregation zones 1.0001 \n",
+ "VIIRS, 3,200 equal pixels 0.9852 \n",
+ "\n",
+ " TAT-C / measured, 95th percentile \n",
+ "ATMS 1.0074 \n",
+ "MODIS 1.0038 \n",
+ "VIIRS, aggregation zones 1.0091 \n",
+ "VIIRS, 3,200 equal pixels 1.9737 "
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def binned_median(df, value, edges=np.arange(-57, 58, 2.0)):\n",
+ " \"\"\"Median of a value in bins of scan angle.\"\"\"\n",
+ " middle = (edges[:-1] + edges[1:]) / 2\n",
+ " return (\n",
+ " middle,\n",
+ " df.groupby(pd.cut(df.scan_angle, edges), observed=False)[value]\n",
+ " .median()\n",
+ " .to_numpy(),\n",
+ " )\n",
+ "\n",
+ "\n",
+ "viirs_inner = viirs_sizes[~viirs_sizes.boundary]\n",
+ "fig, axes = plt.subplots(1, 3, figsize=(13, 3.8))\n",
+ "for ax, (name, df) in zip(axes, [(\"ATMS\", atms_sizes), (\"MODIS\", modis_sizes)]):\n",
+ " ax.plot(\n",
+ " *binned_median(df, \"measured_cross\"),\n",
+ " \"o\",\n",
+ " color=INK,\n",
+ " ms=3,\n",
+ " label=\"measured (median)\",\n",
+ " )\n",
+ " ax.plot(\n",
+ " *binned_median(df, \"spacing_cross\"), color=BLUE, lw=1.5, label=\"TAT-C (median)\"\n",
+ " )\n",
+ " ax.set(\n",
+ " xlabel=\"Scan angle (deg, positive left)\",\n",
+ " ylabel=\"Cross-track spacing (km)\",\n",
+ " title=name,\n",
+ " ylim=(0, None),\n",
+ " )\n",
+ " ax.legend(frameon=False, fontsize=8)\n",
+ "# VIIRS: medians of each sample, whose spacing jumps at the zone boundaries\n",
+ "by_sample = viirs_inner.groupby(\"sample\")[\n",
+ " [\"scan_angle\", \"measured_cross\", \"uniform_cross\", \"spacing_cross\"]\n",
+ "].median()\n",
+ "axes[2].plot(\n",
+ " by_sample.scan_angle,\n",
+ " by_sample.measured_cross,\n",
+ " \".\",\n",
+ " color=INK,\n",
+ " ms=2,\n",
+ " label=\"measured (median)\",\n",
+ ")\n",
+ "axes[2].plot(\n",
+ " by_sample.scan_angle,\n",
+ " by_sample.spacing_cross,\n",
+ " color=BLUE,\n",
+ " lw=1,\n",
+ " label=\"TAT-C, aggregation zones\",\n",
+ ")\n",
+ "axes[2].plot(\n",
+ " by_sample.scan_angle,\n",
+ " by_sample.uniform_cross,\n",
+ " color=ORANGE,\n",
+ " lw=1.5,\n",
+ " ls=\"--\",\n",
+ " label=\"TAT-C, 3,200 equal pixels\",\n",
+ ")\n",
+ "axes[2].set(\n",
+ " xlabel=\"Scan angle (deg, positive left)\",\n",
+ " ylabel=\"Cross-track spacing (km)\",\n",
+ " title=\"VIIRS (M bands)\",\n",
+ " ylim=(0, 3.5),\n",
+ ")\n",
+ "axes[2].legend(frameon=False, fontsize=8, markerscale=3)\n",
+ "fig.tight_layout()\n",
+ "plt.show()\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " \"ATMS\": ratio_summary(atms_sizes.spacing_cross, atms_sizes.measured_cross),\n",
+ " \"MODIS\": ratio_summary(modis_sizes.spacing_cross, modis_sizes.measured_cross),\n",
+ " \"VIIRS, aggregation zones\": ratio_summary(\n",
+ " viirs_inner.spacing_cross, viirs_inner.measured_cross\n",
+ " ),\n",
+ " \"VIIRS, 3,200 equal pixels\": ratio_summary(\n",
+ " viirs_inner.uniform_cross, viirs_inner.measured_cross\n",
+ " ),\n",
+ " }\n",
+ ").T.rename(columns=lambda c: f\"TAT-C / measured, {c}\" if c != \"n\" else c).round(4)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3d2759db",
+ "metadata": {},
+ "source": [
+ "Across the scan, TAT-C's spacing matches the measured spacing of ATMS and MODIS to within 1% (between the 5th and 95th percentiles of the ratio), as both grow toward the swath edges with the slant range and the obliquity of the view: from 16.2 km at nadir to 65 km at the outermost beams for ATMS, and from 0.99 km to 4.6 km for MODIS.\n",
+ "\n",
+ "The VIIRS zones found here match those of the [VIIRS validation](ValidateImagerVIIRS.ipynb). With one `PointedInstrument` per zone, TAT-C reproduces the measured spacing of VIIRS to within 1%: 0.78 km at nadir, rising to 1.17 km at the end of the 3:1 zone (32 deg), dropping when fewer samples are aggregated, and reaching 1.65 km at the edges. A single view of 3,200 equal pixels misses this pattern by -34% to +97%. A satellite with several `PointedInstrument`s, one per aggregation zone, thus represents the sampling of VIIRS; the zones' views tile the swath.\n",
+ "\n",
+ "## Test 2: Along-Track Spacing\n",
+ "\n",
+ "MODIS and VIIRS image several lines per scan with arrays of detectors (10 and 16) at a fixed angular pitch. The measured spacing is the distance between the first and last detectors of a scan, divided by the number of pitches between them (9 and 15). The advance from one scan to the next, per detector, is also measured. ATMS has a single beam per scan position, so its samples are spaced along track by the distance the scan advances in one scan period (8/3 s).\n",
+ "\n",
+ "In TAT-C, the along-track spacing is the angle between pixels along track (the along-track field of view divided by the number of pixels), projected around the line of sight to the target. For a scanning instrument with a scan period (`scan_period`), it is instead the larger of two distances:\n",
+ "* the angular spacing within a scan, if there is more than one pixel along track; and\n",
+ "* the distance the scan advances on the ground at the target in one period, divided among the pixels along track (`compute_ground_advance`).\n",
+ "\n",
+ "The measured spacing is correspondingly the larger of the detector pitch and the scan's advance per detector."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "a99fa48e",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T16:06:12.998122Z",
+ "iopub.status.busy": "2026-10-25T16:06:12.998122Z",
+ "iopub.status.idle": "2026-10-25T16:06:13.402243Z",
+ "shell.execute_reply": "2026-10-25T16:06:13.402243Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABQkAAAFyCAYAAABWVFzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA6u5JREFUeJzs3Xdc1dX/wPHXvZc9FQUE3OBATcWRM0eiZmq5UrOUtPmrxFUWWaZZmg13ZcOBWmpuLS01V+6JZZgK4rqCgLL3vffz+wO5XwlQ0IsXLu/n43Efdc89n899H+44ft73DJWiKApCCCGEEEIIIYQQQogKS23uAIQQQgghhBBCCCGEEOYlSUIhhBBCCCGEEEIIISo4SRIKIYQQQgghhBBCCFHBSZJQCCGEEEIIIYQQQogKTpKEQgghhBBCCCGEEEJUcJIkFEIIIYQQQgghhBCigpMkoRBCCCGEEEIIIYQQFZwkCYUQQgghhBBCCCGEqOAkSSiEEEIIIYQQQgghRAUnSUIhStG8efNQqVQ0adLEWFa7dm1UKtU9b0uXLgUw3n/hhRcKfY6PPvrIWOfSpUvGckVRWLVqFY899hgeHh7Y2dlRvXp1evbsyQ8//FCKrRZCCFHWLV261Nh37Nmzp8DjiqLg5+eHSqWiS5cu+R67efMmISEhNGrUCAcHB1xcXGjbti1fffUVOTk5Bc51Z9+m0WioXLkyzZo149VXX+Xw4cMF6l+6dAmVSsUXX3yRr/zs2bMMHz6cunXrYmdnR9WqVWnRogVvvvkmycnJD/T3EEIIAf3798fe3p7ExMQi6zz33HNYW1tz48YNIPc7/s033zQ+Xth3+J49ewr0Be7u7vTt25fjx48XeA5TXMfk5OTQsGFDPv30U2PZg/R9halduzZ9+vQpVjwPy5QpU1CpVCU65vz589jY2HDy5MlSikqUJ5IkFKIULV68GIB//vmHI0eOALBhwwYOHTpkvL344osA/Pbbb/nKe/fubTyPs7Mza9asISUlJd/5FUVh6dKluLi4FHjukJAQnn32Wfz9/fnhhx/Ytm0bH3/8MZ6enmzatKm0miyEEKIccXZ2ZtGiRQXK9+7dS2RkJM7OzvnK//33XwICAvj222957rnn+PXXX1m1ahUtWrRgzJgxdO/enfT09ALnGzRoEIcOHWL//v2sWrWKESNGcPjwYdq1a8eYMWPuGeepU6do2bIl4eHhTJ48md9++42FCxfSu3dvfv/9d27dunX/fwQhhBAAvPjii2RmZvLTTz8V+nhSUhIbNmygT58+eHp6lvj806dP59ChQ+zZs4cPPviAgwcP0rlzZy5cuJCvnimuY77++msSEhIYPXp0gcdK2vdZuvr16/Pcc88xbtw4c4ciygJFCFEqjh07pgBK7969FUB5+eWXC6334YcfKoASFxdX6OOA8vzzzyv29vbKd999l++xnTt3Gs8NKFFRUYqiKEp6erpia2urjBgxotBz6vX6+2+YEEKIcm/JkiUKoLz00kuKvb29kpSUlO/x559/XmnXrp3SuHFjpXPnzoqiKIpOp1MaNWqkuLq6KufOnStwzlWrVimA8uqrr+YrB5Q33nijQH2dTqeMGjVKAZSvv/7aWB4VFaUAyueff24sGzFihOLo6KgkJycX2h6DwVDstgshhCicTqdTvL29lZYtWxb6+DfffKMAypYtW4xl//2OL+w7fPfu3QqgrFmzJt/5QkNDFUCZPHmyscwU1zE5OTmKj4+P8u677+Yrv5++725q1aql9O7d+571Hqa8a8uSOn78uAIoBw4cKIWoRHkiIwmFKCV5v059+umntG/fnlWrVhU6uqI4XF1d6d+/v3FkYp7FixfToUMH6tevn688LS2NrKwsvLy8Cj2fWi0ffSGEEPDss88CsHLlSmNZUlIS69atY9SoUfnqbtiwgfDwcN59990C/Q7AkCFD6NGjB4sWLSImJuaez63RaFiwYAFVq1bl888/v2vdmzdv4uLigpOTU6GPl3RqlRBCiII0Gg1BQUGcOHGCv//+u8DjS5YswcvLi169epnk+Vq1agVgnLoMprmO2bx5M1qtluHDhxf6eEn6vuLYsGEDTZs2xc7Ojrp16zJv3rx8j2dmZjJhwgSaN2+Oq6srbm5utGvXrtBRkXnTt5cvX46/vz8ODg40a9aMX375pUDdX3/9lebNm2Nra0udOnUKLNORZ82aNbRp0wZXV1ccHByoW7dugXa2bNkSf39/Fi5cWOL2C8simQIhSkFGRgYrV66kdevWNGnShFGjRpGSksKaNWvu+5wvvvgihw8f5uzZswAkJiayfv1643TlO1WtWhU/Pz++/vprZs2axb///ouiKPf93EIIISyTi4sLgwYNyvcj1MqVK1Gr1QwZMiRf3R07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LNns3LkTfn5+eOONN+Dk5ARvb2+sWrUq13WSk5ORkJCgcSMiIuNU0DlERERkCMw3IiIyhCL9W62bN29i+fLlmDBhAj788EOcPn0aY8eOhVqtxttvv611nblz5yIoKChb+73YaCQnPS7oIReqtLRUxMZEGXoYhY51mxbWbVzKOVUw9BCIiIiIiIhIi5eaJHRzc4OlpaW+xpJNRkYG/Pz8MGfOHACAt7c3Ll26hOXLl+c4SThlyhRMmDBBuZ+QkABXV1eULecCBweHAhurIcTGRJnkB27WbVpYN+WmoHOIiIjIEJhvRERkCC81SfjXX3/paxxaubi4wN3dXaOtbt262Lp1a47rqNVqqNXqAh0XEREVDQWdQ0RERIbAfCMiIkPQeZLwwoULWttVKhWsra1RuXJlvU3SNW3aFNeuXdNou379unJVLiIiMj2FmUNERESFhflGRESGpvMkoZeXF1QqFQBARJR/Z7G0tETv3r3x9ddfw9ra+qUG995776FJkyaYM2cOevXqhdOnT2PlypVYuXLlS/VLRETFV2HmEBERUWFhvhERkaHpfHXj7du3o2bNmli5ciXOnz+P0NBQrFy5ErVr18aGDRuwevVq/PHHH5g2bdpLD65hw4bYvn07Nm7cCA8PD3z88cdYvHgx+vXr99J9ExFR8VSYOURERFRYmG9ERGRoOh9JOHv2bHzxxRfo0KGD0la/fn1UqlQJ06dPx+nTp2FnZ4eJEydiwYIFLz3AV199Fa+++upL90NERMahsHOIiIioMDDfiIjI0HQ+kvDixYtazwno5uaGixcvAsg8VD46OvrlR0dERPQc5hARERkj5hsRERmazpOEderUwbx585CSkqK0paamYt68eahTpw4AIDIyEuXLl9ffKImIiP4fc4iIiIwR842IiAxN558bf/XVV+jatSsqVaqE+vXrQ6VS4cKFC0hPT8cvv/wCALh58yZGjhyp98ESERExh4iIyBgx34iIyNB0niRs0qQJbt26he+//x7Xr1+HiKBnz5548803YW9vDwDo37+/3gdKREQEMIeIiMg4Md+IiMjQdJ4kBIASJUpgxIgR+h4LERFRnjCHiIjIGDHfiIjIkPI1SXj9+nUcPHgQMTExyMjI0Hjso48+0svAiIiIcsIcIiIiY8R8IyIiQ9J5knDVqlV49913UbZsWTg7O0OlUimPqVQq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QKxZswbvv/8+atSoAU9PT4wZMwaurq4FMWQiIjJxuWXX2bNn89QHs4uIiAoTs4uICFCJSMFeXsrAEhIS4OjoiPj4eDg4OBh6OHoVGxOFck4VDD2MQse6TQvrJlOUU3aZyuvCVOoEWKuxYq1kiphdxl+nKdQIsE5jYwp16rNGHklIRERERERERERk4jhJSEREREREREREZOI4SUhERERERERERGTiOElIRERERERERERk4jhJSEREREREREREZOI4SUhERERERERERGTiisUk4bJly1C1alVYW1vD19cXR44cMfSQiIjISOiaMYcOHYKvry+sra1RrVo1rFixItsyW7duhbu7O9RqNdzd3bF9+/aCGj4REZFWBZFvRERk3Ir8JOHmzZsxfvx4TJ06FaGhoWjevDk6duyI8PBwQw+NiIiKOV0zJiwsDJ06dULz5s0RGhqKDz/8EGPHjsXWrVuVZU6cOIHevXujf//+OH/+PPr3749evXrh1KlThVUWERGZuILINyIiMn4qERFDDyI3jRo1go+PD5YvX6601a1bF927d8fcuXNfuH5CQgIcHR0RHx8PBweHghxqoYuNiUI5pwqGHkahY92mhXVTQdI1YyZNmoSdO3fiypUrStuIESNw/vx5nDhxAgDQu3dvJCQk4LffflOWeeWVV1CqVCls3LgxT+PKKbtM5XVhKnUCrNVYsVYytILItxdhdhl/naZQI8A6jY0p1KnPGov0kYQpKSkICQlBYGCgRntgYCCOHz9uoFEREZExyE/GnDhxItvyHTp0wJkzZ5CamprrMswtIiIqDAWVb0REZPwsDD2A3Ny7dw/p6ekoX768Rnv58uVx9+5dreskJycjOTlZuR8fHw8g85stY/Po0SOorY2vrhdh3aaFdRsfe3t7qFQqQw8jXxlz9+5drcunpaXh3r17cHFxyXGZnPoE8p5dxvy6eJap1AmwVmPFWo1PUcmuvCiofHses0uTKdRpCjUCrNPYmEKdOdWYn+wq0pOEWZ4vSkRyLHTu3LkICgrK1u7q6logYyMiIt0UtdM/6JIxOS3/fLuufTK7iIiKtqKWXXlREPn2LGYXEVHRlp/sKtKThGXLloW5uXm2b7xiYmKyfdOVZcqUKZgwYYJyPyMjAw8ePECZMmWKzbd/eZGQkABXV1fcuXOn2P3B8jJYN+s2BcZet729vaGH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",
+ "text/plain": [
+ "
"
+ ],
+ "text/plain": [
+ " n TAT-C / measured, 5th percentile TAT-C / measured, median \\\n",
+ "ATMS 20736.0 0.9917 1.0000 \n",
+ "MODIS 45144.0 0.9992 0.9997 \n",
+ "VIIRS 40902.0 0.9997 1.0001 \n",
+ "\n",
+ " TAT-C / measured, 95th percentile \n",
+ "ATMS 1.0084 \n",
+ "MODIS 1.0017 \n",
+ "VIIRS 1.0017 "
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig, axes = plt.subplots(1, 3, figsize=(13, 3.8))\n",
+ "panels = [\n",
+ " (\"ATMS\", atms_sizes, [(\"measured_advance\", \"measured, scan to scan\")]),\n",
+ " (\n",
+ " \"MODIS\",\n",
+ " modis_sizes,\n",
+ " [\n",
+ " (\"measured_pitch\", \"measured, detector to detector\"),\n",
+ " (\"measured_advance\", \"measured, scan to scan (per detector)\"),\n",
+ " ],\n",
+ " ),\n",
+ " (\n",
+ " \"VIIRS (M bands)\",\n",
+ " viirs_sizes.dropna(subset=[\"measured_along\"]),\n",
+ " [\n",
+ " (\"measured_pitch\", \"measured, detector to detector\"),\n",
+ " (\"measured_advance\", \"measured, scan to scan (per detector)\"),\n",
+ " ],\n",
+ " ),\n",
+ "]\n",
+ "for ax, (name, df, measured) in zip(axes, panels):\n",
+ " for (column, label), marker in zip(measured, [\"o\", \"s\"]):\n",
+ " ax.plot(\n",
+ " *binned_median(df, column),\n",
+ " marker,\n",
+ " color=INK if marker == \"o\" else GRAY,\n",
+ " ms=3,\n",
+ " label=label,\n",
+ " )\n",
+ " ax.plot(*binned_median(df, \"spacing_along\"), color=BLUE, lw=1.5, label=\"TAT-C\")\n",
+ " ax.set(\n",
+ " xlabel=\"Scan angle (deg, positive left)\",\n",
+ " ylabel=\"Along-track spacing (km)\",\n",
+ " title=name,\n",
+ " ylim=(0, None),\n",
+ " )\n",
+ " ax.legend(frameon=False, fontsize=8)\n",
+ "fig.tight_layout()\n",
+ "plt.show()\n",
+ "\n",
+ "\n",
+ "def nadir_edge(df, columns):\n",
+ " \"\"\"Medians of columns near nadir (within 2 deg) and at the swath edges (beyond 50 deg).\"\"\"\n",
+ " return pd.concat(\n",
+ " {\n",
+ " \"nadir\": df[df.scan_angle.abs() < 2][columns].median(),\n",
+ " \"edges\": df[df.scan_angle.abs() > 50][columns].median(),\n",
+ " },\n",
+ " axis=1,\n",
+ " ).T\n",
+ "\n",
+ "\n",
+ "COLUMNS2 = [\"measured_pitch\", \"measured_advance\", \"measured_along\", \"spacing_along\"]\n",
+ "display(\n",
+ " pd.concat(\n",
+ " {\n",
+ " \"ATMS\": nadir_edge(atms_sizes.assign(measured_pitch=np.nan), COLUMNS2),\n",
+ " \"MODIS\": nadir_edge(modis_sizes, COLUMNS2),\n",
+ " \"VIIRS\": nadir_edge(viirs_sizes, COLUMNS2),\n",
+ " }\n",
+ " )\n",
+ " .rename(\n",
+ " columns={\n",
+ " \"measured_pitch\": \"measured, detector pitch (km)\",\n",
+ " \"measured_advance\": \"measured, scan advance per detector (km)\",\n",
+ " \"measured_along\": \"measured, along track (km)\",\n",
+ " \"spacing_along\": \"TAT-C, along track (km)\",\n",
+ " }\n",
+ " )\n",
+ " .round(3)\n",
+ ")\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " \"ATMS\": ratio_summary(atms_sizes.spacing_along, atms_sizes.measured_along),\n",
+ " \"MODIS\": ratio_summary(modis_sizes.spacing_along, modis_sizes.measured_along),\n",
+ " \"VIIRS\": ratio_summary(viirs_sizes.spacing_along, viirs_sizes.measured_along),\n",
+ " }\n",
+ ").T.rename(columns=lambda c: f\"TAT-C / measured, {c}\" if c != \"n\" else c).round(4)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4666c9af",
+ "metadata": {},
+ "source": [
+ "TAT-C's along-track spacing matches the measured spacing of all three instruments to within 0.8% (5th to 95th percentile), and to within 0.2% for MODIS and VIIRS.\n",
+ "\n",
+ "* **MODIS:** 1.01 km at nadir and 1.84 km beyond 50 deg. At nadir its scans advance slightly farther (1.01 km per detector) than its detector pitch (0.99 km).\n",
+ "* **VIIRS:** 0.75 km at nadir and 1.44 km beyond 50 deg.\n",
+ "* **ATMS:** a nearly constant 17.7 km at nadir and 17.4 km at the edges (17.5 km measured).\n",
+ "\n",
+ "The scans of MODIS and VIIRS advance a nearly constant distance per detector (1.0 and 0.74 km). Toward the edges, where the detector pitch doubles, consecutive scans therefore overlap (the bow tie). Their samples coincide rather than interleave, so a scan's detector pitch sets the sampling along track.\n",
+ "\n",
+ "The samples of ATMS, one per scan position, are spaced by the scan's advance. Without a scan period, TAT-C would project the along-track angle (1.112 deg) around the line of sight: 16.2 km at nadir, growing like the cross-track spacing to 30 km at the edges (-8% to +70%). Angular spacing describes an array of detectors, not a single beam scanned at a fixed period.\n",
+ "\n",
+ "## Test 3: Conical Spacing\n",
+ "\n",
+ "AMSR2 and GMI sample their scanned arcs at a constant rate, and their arcs advance with the satellite from one scan to the next. Each `ConicalInstrument` has the cone angle and scan sector measured in the companion notebooks, and the azimuth between samples (`scan_sample_spacing`):\n",
+ "* **AMSR2:** 0.6225 deg, as measured in the [AMSR2 validation](ValidateConicalAMSR2.ipynb).\n",
+ "* **GMI:** 152.06 / 220 = 0.691 deg between its 221 samples, which is the 3.6 ms integration time of the [GMI L1B ATBD](https://gpm.nasa.gov/sites/default/files/document_files/GMIL1B_ATBD.pdf) at 32 rpm.\n",
+ "\n",
+ "Each also has an along-track field of view tailored to one scan period (1.5 s for AMSR2, 1.875 s for GMI) with `compute_along_track_field_of_view`. TAT-C's spacing along the arc is the azimuth between samples times the arc's radius on the ground. Its spacing between scans is the distance the arc advances in one scan."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "25564a27",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T16:06:13.404248Z",
+ "iopub.status.busy": "2026-10-25T16:06:13.404248Z",
+ "iopub.status.idle": "2026-10-25T16:06:17.656949Z",
+ "shell.execute_reply": "2026-10-25T16:06:17.656949Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "AMSR2: 243 samples per scan, 249 scans; along-track field of view 0.829 deg\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "GMI, low frequency (S1): 221 samples per scan, 231 scans; along-track field of view 1.744 deg\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "GMI, high frequency (S2): 221 samples per scan, 231 scans; along-track field of view 1.744 deg\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
measured, median (km)
\n",
+ "
TAT-C, median (km)
\n",
+ "
TAT-C / measured, 5th percentile
\n",
+ "
TAT-C / measured, median
\n",
+ "
TAT-C / measured, 95th percentile
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
AMSR2
\n",
+ "
along the arc
\n",
+ "
9.130
\n",
+ "
9.159
\n",
+ "
0.999
\n",
+ "
1.003
\n",
+ "
1.005
\n",
+ "
\n",
+ "
\n",
+ "
scan to scan
\n",
+ "
10.206
\n",
+ "
10.318
\n",
+ "
0.991
\n",
+ "
1.010
\n",
+ "
1.036
\n",
+ "
\n",
+ "
\n",
+ "
GMI, low frequency (S1)
\n",
+ "
along the arc
\n",
+ "
6.287
\n",
+ "
6.327
\n",
+ "
0.998
\n",
+ "
1.008
\n",
+ "
1.013
\n",
+ "
\n",
+ "
\n",
+ "
scan to scan
\n",
+ "
13.048
\n",
+ "
13.358
\n",
+ "
1.018
\n",
+ "
1.024
\n",
+ "
1.030
\n",
+ "
\n",
+ "
\n",
+ "
GMI, high frequency (S2)
\n",
+ "
along the arc
\n",
+ "
5.569
\n",
+ "
5.606
\n",
+ "
0.998
\n",
+ "
1.008
\n",
+ "
1.014
\n",
+ "
\n",
+ "
\n",
+ "
scan to scan
\n",
+ "
13.051
\n",
+ "
13.358
\n",
+ "
1.019
\n",
+ "
1.024
\n",
+ "
1.029
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " measured, median (km) \\\n",
+ "AMSR2 along the arc 9.130 \n",
+ " scan to scan 10.206 \n",
+ "GMI, low frequency (S1) along the arc 6.287 \n",
+ " scan to scan 13.048 \n",
+ "GMI, high frequency (S2) along the arc 5.569 \n",
+ " scan to scan 13.051 \n",
+ "\n",
+ " TAT-C, median (km) \\\n",
+ "AMSR2 along the arc 9.159 \n",
+ " scan to scan 10.318 \n",
+ "GMI, low frequency (S1) along the arc 6.327 \n",
+ " scan to scan 13.358 \n",
+ "GMI, high frequency (S2) along the arc 5.606 \n",
+ " scan to scan 13.358 \n",
+ "\n",
+ " TAT-C / measured, 5th percentile \\\n",
+ "AMSR2 along the arc 0.999 \n",
+ " scan to scan 0.991 \n",
+ "GMI, low frequency (S1) along the arc 0.998 \n",
+ " scan to scan 1.018 \n",
+ "GMI, high frequency (S2) along the arc 0.998 \n",
+ " scan to scan 1.019 \n",
+ "\n",
+ " TAT-C / measured, median \\\n",
+ "AMSR2 along the arc 1.003 \n",
+ " scan to scan 1.010 \n",
+ "GMI, low frequency (S1) along the arc 1.008 \n",
+ " scan to scan 1.024 \n",
+ "GMI, high frequency (S2) along the arc 1.008 \n",
+ " scan to scan 1.024 \n",
+ "\n",
+ " TAT-C / measured, 95th percentile \n",
+ "AMSR2 along the arc 1.005 \n",
+ " scan to scan 1.036 \n",
+ "GMI, low frequency (S1) along the arc 1.013 \n",
+ " scan to scan 1.030 \n",
+ "GMI, high frequency (S2) along the arc 1.014 \n",
+ " scan to scan 1.029 "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "CONICAL = {\n",
+ " # cone angle, scan sector center and half-width, from ValidateConicalAMSR2 and ValidateConicalGMI; azimuth between samples (deg)\n",
+ " \"AMSR2\": dict(\n",
+ " data=amsr2,\n",
+ " lat=\"lat\",\n",
+ " lon=\"lon\",\n",
+ " day=datetime(2026, 9, 26, tzinfo=timezone.utc),\n",
+ " period=1.5,\n",
+ " tle=[\n",
+ " \"1 38337U 12025A 26277.29678146 .00000240 00000+0 63281-4 0 9990\",\n",
+ " \"2 38337 98.2100 216.2278 0001644 77.4488 41.8708 14.57111943764929\",\n",
+ " ],\n",
+ " cone=47.564,\n",
+ " center=0.498,\n",
+ " half_width=75.332,\n",
+ " spacing=0.6225,\n",
+ " ),\n",
+ " \"GMI, low frequency (S1)\": dict(\n",
+ " data=gmi,\n",
+ " lat=\"S1_lat\",\n",
+ " lon=\"S1_lon\",\n",
+ " day=datetime(2026, 10, 3, tzinfo=timezone.utc),\n",
+ " period=1.875,\n",
+ " tle=[\n",
+ " \"1 39574U 14009C 26277.54227627 .00004528 00000+0 10004-3 0 9997\",\n",
+ " \"2 39574 64.9701 301.6724 0010793 268.6572 91.3332 15.45217995714704\",\n",
+ " ],\n",
+ " cone=48.460,\n",
+ " center=-0.285,\n",
+ " half_width=76.031,\n",
+ " spacing=2 * 76.031 / 220,\n",
+ " ),\n",
+ " \"GMI, high frequency (S2)\": dict(\n",
+ " data=gmi,\n",
+ " lat=\"S2_lat\",\n",
+ " lon=\"S2_lon\",\n",
+ " day=datetime(2026, 10, 3, tzinfo=timezone.utc),\n",
+ " period=1.875,\n",
+ " tle=[\n",
+ " \"1 39574U 14009C 26277.54227627 .00004528 00000+0 10004-3 0 9997\",\n",
+ " \"2 39574 64.9701 301.6724 0010793 268.6572 91.3332 15.45217995714704\",\n",
+ " ],\n",
+ " cone=45.284,\n",
+ " center=-0.341,\n",
+ " half_width=76.024,\n",
+ " spacing=2 * 76.024 / 220,\n",
+ " ),\n",
+ "}\n",
+ "conical_sizes, conical_rows = {}, {}\n",
+ "for name, c in CONICAL.items():\n",
+ " orbit = GeneralPerturbationsOrbit.from_tle(c[\"tle\"])\n",
+ " gp = orbit.to_gp_orbit()\n",
+ " # the along-track field of view tailored to one scan period: the scan-to-scan advance\n",
+ " along_fov = compute_along_track_field_of_view(\n",
+ " gp.get_semimajor_axis() - EARTH_MEAN_RADIUS,\n",
+ " c[\"period\"],\n",
+ " gp.get_inclination(),\n",
+ " eccentricity=gp.get_eccentricity(),\n",
+ " )\n",
+ " instrument = ConicalInstrument(\n",
+ " name=name,\n",
+ " cone_angle=c[\"cone\"],\n",
+ " scan_center_azimuth=c[\"center\"],\n",
+ " scan_half_width=c[\"half_width\"],\n",
+ " along_track_field_of_view=along_fov,\n",
+ " scan_sample_spacing=c[\"spacing\"],\n",
+ " )\n",
+ " satellite = Satellite(\n",
+ " name=name, orbit=orbit, instruments=[instrument], attitude=INERTIAL\n",
+ " )\n",
+ " lat, lon, t = (\n",
+ " c[\"data\"][c[\"lat\"]].astype(float),\n",
+ " c[\"data\"][c[\"lon\"]].astype(float),\n",
+ " c[\"data\"][\"time\"],\n",
+ " )\n",
+ " period = np.diff(t)\n",
+ " usable = np.zeros(len(t), dtype=bool)\n",
+ " usable[1:-1] = (\n",
+ " np.all(np.abs(lat[1:-1]) <= 90, axis=1)\n",
+ " & (np.abs(period[:-1] - c[\"period\"]) < 0.05)\n",
+ " & (np.abs(period[1:] - c[\"period\"]) < 0.05)\n",
+ " )\n",
+ " usable[1:-1] &= np.all(np.abs(lat[:-2]) <= 90, axis=1) & np.all(\n",
+ " np.abs(lat[2:]) <= 90, axis=1\n",
+ " )\n",
+ " scans = np.nonzero(usable)[0][::200]\n",
+ " xyz = ecef(lon, lat)\n",
+ " n = lat.shape[1]\n",
+ " epochs = np.repeat(\n",
+ " pd.DatetimeIndex([c[\"day\"] + timedelta(seconds=float(s)) for s in t[scans]]), n\n",
+ " )\n",
+ " sizes = sample_sizes(satellite, name, lon[scans], lat[scans], epochs).assign(\n",
+ " sample=np.tile(np.arange(n), len(scans)),\n",
+ " measured_cross=neighbor_spacing(xyz[scans], 1).ravel(),\n",
+ " measured_along=(\n",
+ " np.linalg.norm(xyz[scans + 1] - xyz[scans - 1], axis=-1) / 2e3\n",
+ " ).ravel(),\n",
+ " )\n",
+ " conical_sizes[name] = sizes\n",
+ " for direction, label in [(\"cross\", \"along the arc\"), (\"along\", \"scan to scan\")]:\n",
+ " conical_rows[(name, label)] = pd.concat(\n",
+ " [\n",
+ " pd.Series(\n",
+ " {\n",
+ " \"measured, median (km)\": sizes[\n",
+ " f\"measured_{direction}\"\n",
+ " ].median(),\n",
+ " \"TAT-C, median (km)\": sizes[f\"spacing_{direction}\"].median(),\n",
+ " }\n",
+ " ),\n",
+ " ratio_summary(\n",
+ " sizes[f\"spacing_{direction}\"], sizes[f\"measured_{direction}\"]\n",
+ " )\n",
+ " .drop(\"n\")\n",
+ " .rename(lambda c: f\"TAT-C / measured, {c}\"),\n",
+ " ]\n",
+ " )\n",
+ " print(\n",
+ " f\"{name}: {n} samples per scan, {len(scans)} scans; along-track field of view {along_fov:.3f} deg\"\n",
+ " )\n",
+ "pd.DataFrame(conical_rows).T.round(3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "9d7a4841",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T16:06:17.658953Z",
+ "iopub.status.busy": "2026-10-25T16:06:17.658953Z",
+ "iopub.status.idle": "2026-10-25T16:06:17.901016Z",
+ "shell.execute_reply": "2026-10-25T16:06:17.901016Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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7zJgwAAGDRpEXl4eNput0Qowuxo8eDCXXnopTz75JABXXXUVwWCQ8847j/z8fPLz86msrGzDKxRCCCGEEIebVk2M2mD+/PnMnz+fsrKyJjPpz549u00qJoQQ4uj2ySefNJu+bNkyAC688MJm92/evDn+/B//+Mcey3/kkUeapL3yyivx55FIpNnjyst27LFMIYQQQghxZGt1EGT69Ok8+uijDB06lOzsbBTl0HanFkIIIYQQQgghhGiJVgdBZs6cyZw5c7jmmmsORn2EEEIIIYQQQgghDooWzQmyq3A4zIknnngw6iKEEEIIIYQQQghx0LQ6CHLDDTfwr3/962DURQghhBBCCCGEEOKgafVwmGAwyMsvv8znn3/OoEGDsFgsjfb/6U9/arPKCSGEEEIIIYQQQrSVVgdBfv75Z/Lz8wFYuXJlo30ySaoQQgghhBBCCCEOV60Ognz55ZcHox5CCCGEEEIIIYQQB1Wr5wQRQggh2kokEmH69On06dOH/v37M3jwYM4//3wKCgoAWLBgAYqicPvttzc6btKkSSiKEu+ReO211/Liiy/u83yPPPIId911V1tfBgAffPABffv2JT8/nxUrVhyUcxxOduzYwQknnICu6wC8++67HH/88eTn59O3b1/GjRsX3/fkk0/Su3dvVFXlo48+alTOnXfeyRtvvNHu9RdCCCHEsanVPUEAfvzxR/7973+zZcsWwuFwo33vvvtum1RMCCHE0e+6667D6/WyaNEiUlJSAPjwww9ZtWpVfOhl7969ef/995kxYwZWq5W6ujq+++47OnbseAhr3tTMmTN59NFHueSSS5rs0zQNs3m/PnIPW48//ji/+c1vUFWVkpISpk6dyo8//kjXrl0BWLp0aXyY7Lhx47jsssu4/vrrm5Rzzz33MHr0aC677DJUVX6bEUIIIcTB1eq7jTfffJOTTjqJ1atX89577xGJRFi9ejVffPEFSUlJB6OOQggh2phhGBihwMF9GMZe67B+/Xree+89Zs+eHQ+AAEycOJGrrroq/trtdnPqqafywQcfALHPoYsuuuiAgwrRaJS77rqLAQMGMGDAAH77298SDofx+nykpqYSiUQAGDJkSLw+mzZtIjc3t0lZt956K19//TX33HNPfBl5RVH44x//yJgxY7jvvvvweDzceOONnHDCCQwaNIipU6fGz7F69WqGDx8eP9eIESPiPSbGjBnTqPfExRdfzJw5cwD2WuaYMWPiAYbc3FymTp0aL6O2tpYbbriBgQMHkpeXx5QpUwgGg2RlZbF169Z4vvvuu4977rmnyfUGg0Hmzp3LxRdfDEBxcTFms5m0tLR4niFDhsSDIMOHD2+23QAyMjLo3r078+fP3+O/lRBCCCFEW2n1HeSTTz7Js88+yy233EJCQgLPP/883bt351e/+hXZ2dmtKmvhwoU8/fTT/PTTTxQXF/Pee+9x/vnn7/WYr776imnTprFq1SpycnL43e9+1+jGbldvvvkmV1xxBeeddx7vv/9+q+omhBBHtXCQyttPPqinSHtuIdgce9y/bNkyevbsSWpq6j7LmjJlCk888QSXXHIJs2fP5tVXX2Xu3LkHVL+XX36Zn376iZ9++gmTycS5557L888/z7WTr6J///4sWrSI/v37E41G+fHHHwGYN28ep512WpOyXnjhBX7++WfuuusuzjnnnHh6KBRiwYIFANx0002cfPLJ/O1vf8MwDG688UZefPFF7rjjDq655hpuvfVWJk+ezPfff89JJ53Uomu4884791gmwMaNG1mwYAHhcJh+/fqxaNEiRo4cye23347b7Wb58uWoqkp5eTl2u53rr7+ev/71rzz++OOEQiFeeeUVvv/++ybn/fHHH+nZsydOpxOAvLw8Ro4cSZcuXTjllFM48cQTufLKK1vcW+fEE09k/vz5nH766S3KL4QQQgixv1rdE2Tjxo2cffbZANhsNnw+H4qicMcdd/Dyyy+3qiyfz0deXl6LxnEDFBYWctZZZzF69GiWLVvG/fffz6233so777zTJG9RURF33XUXo0ePblWdhBBCtJ9dVxXbuHEj+fn59O7dmxtvvLFRvlGjRlFUVMSnn36K2Wymd+/eB3zuzz//nOuvvx6bzYbZbObGG2/k888/B+C0007j888/54svvmD8+PH07t2blStX8vnnnzcbBNmTKVOmxJ+///77PP300+Tn5zN48GC+/vpr1q9fT11dHStXruSaa64BYMSIEQwcOLBF5e+pzAaXX345JpMJh8NBfn4+GzduBOCjjz7i7rvvjg8/SU9PB+Dmm29mzpw5hMNh3nzzTYYPH063bt2anHfbtm1kZWXFX6uqyjvvvMN3333HmWeeybfffkv//v3ZsGFDi64jKyuLbdu2tSiv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gwcP5vzzz6egoACITRCqKAq33357o+MmTZqEoiisXLkSiC2H/uKLL+7zfI888gh33XVXs/v+85//cPfdd++zjAULFjB06NB95gOoqqpi1KhR5Ofn88QTT7TomCPdhRdeyKJFiwDYunUr5557LoMGDWLgwIHk5+fzxRdfADB37lxOHXcGAwYMYODAgfzf/+1cInf58uWcddZZh6T+QgghhDi6tagnSNeuXePPL7nkEl544YVGNyeDBg2ic+fO/L//9/84//zz27ySQgghjk7XXXcdXq+XRYsWkZKSAsCHH37IqlWryM/PB6B37968//77zJgxA6vVSl1dHd999x0dO3Zs07qce+65nHvuubFlW9vIvHnzSEpK4ptvvmmyT9M0zOYWfQwfMX744QdqamoYOXIkADfffDOnnXYat912GwAVFRX4/X4AOnXqxBtvvM6AAfnU1tZy/PHHM2TIEE466STy8vIwm80sWLCAMWPGHKrLEUIIIcRRqEU9QXa1YsUKunfv3iS9e/furF69uk0qJYQQ4ui3fv163nvvPWbPnh0PgABMnDiRq666Kv7a7XZz6qmn8sEHHwDw5ptvctFFF+13AGHHjh1MnDiRfv36ceqpp1JVVQXE5pC6+OKL4/keeOABevbsyfDhw7n77rsb9f7QNI2bb76ZvLw8+vfvz5IlS5qc5/PPP+fuu+/m22+/JT8/n88//5xrr72WW2+9lTPPPJO8vDwA/vGPfzB8+HCGDBnCKaecEu/dEg6H+dWvfkWvXr0YO3Ysv/71r+P1272uH330UaNgwZ7KnDNnDuPHj+eKK65g4MCBDB06lE2bNsWPe+WVV8jPzycvL4+hQ4eyefNmbrnlFp566ql4nrVr19K5c2c0TWtyzX/9618b/dtt2bKl0fL0HTp0oEuXLgCcdNJJZGZkAJCUlESfPn0oLCyM573yyiv529/+1uQcQgghhBAHotVBkL59+/L4448TDAbjaaFQiMcff5y+ffu2aeWEEEIcHIZh4NfCB/Wxt4mvAZYtW0bPnj3jS7DvzZQpU5g9ezYAs2fPZsqUKft97YsXL+bVV19l9erVZGRk8Ne//rVJng8//JCPPvqI5cuXs2jRIjZu3Nho/6pVq5gyZQrLly/nt7/9LQ888ECTMk477TQeffRRTjvtNAoKCjjttNMA+Oabb3j77bdZtWoV3377LW+++SYLFy5k6dKlPP744/Egwl//+lcKCwtZtWoVH3/8MT/++GOLrm9vZTZc/+9//3tWrFjBaaedxh/+8AcgNszniSee4JNPPmH58uUsXLiQjIwMbrvtNl5++eX4nF8vvvgiN910U7NBqAULFnDiiSfGX997771MnjyZUaNGceedd7Jw4cJm67x69WoWLVrEqaeeGk878cQTmT9/fouuWQghhBCipVr9M9rMmTOZOHEinTt3jv+KtXz5chRF4aOPPmrzCgohhGh7gWiEXh9NP6jnWHfOwzjN1r3m2XWy7Y0bN3LRRRcRCAQ4+eSTG/UCGDVqFEVFRXz66aeYzWZ69+693/WaMGFCPPAycuRIVqxY0STPl19+yaWXXorL5QJiS7c/9thj8f29e/eO9wwZOXIkzzzzTIvPf+mll+J2uwH44IMPWL58OcOHD4/vLy8vJxwO8+WXXzJ58mQsFgsWi4Wrr7662WE1u9tbmRBry4ZhriNHjozPxfHxxx8zadIksrOzAXA6nQD06tWLvn378tFHHzFu3DjefPPNeM+S3W3bto2srKz46yuuuIIzzzyTL7/8km+//ZbzzjuP+++/v9HcK9u2beO8885j5syZ5OTkxNOzsrIoLS0lEolgsVj2ed1CCCGEEC3R6iDICSecQGFhIa+//jpr1qzBMAwuu+wyrrzyyvjNohBCCLEvgwcPZv369VRXV5OSkkJubi4FBQXMmTOn2aD6pEmTuPrqq/n9739/QOe12+3x5yaTqdlhHftaDa0lZexJQwCk4TxTpkzh0UcfbbYOe2I2mxutxrZr78y9lbm/db/tttv44x//yLZt2zjjjDPIzMxsNp/T6SQQCDQa3pSSksKFF17IhRdeyLBhw3jyySfjQZCSkhIuufRKHnzwQS655JJGZQWDwXgASAghhBCirezXgGqn08lNN93U1nURQgjRThwmC+vOefign2NvjjvuOM477zyuv/56Zs+eTXJyMgA+n6/Z/A1DYC677LK9lvvDDz9w3333HdBQirFjx/Lwww9z++23Y7fb+cc//rHfZe3NxIkTmTRpEjfeeCOdO3dG13WWLl3K0KFDGTduHP/4xz+47LLLiEQi/Otf/4rPp5Gbm8vy5csJBoOYzWb+9a9/tajMfdVlypQp3HTTTWRlZcUnMHU6nZxxxhnccccdPPXUU/z73//eYxmD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ERE1CGyCEBEREREREVGDwCYIERERERERETUIFjVBsrKyYDAYyi3X6/XIysqyWlBERERERERERNZmdhNkx44dCA0NRUFBQbl1hYWF6NChA7777jurBkdEREREREREZC1mN0HWrFmDWbNmQavVllun1Wrxxhtv4IMPPrBqcERERERERERE1mJ2E+T06dPo3r17peu7du2K33//3RoxERERERERERFZndlNkIyMDJSUlFS6vri4GBkZGVYJioiIiIiIiIjI2sxugvj7++PYsWOVrj927Bj8/PysEhQRERERERERkbWZ3QR57rnnMGfOHNy8ebPcupSUFMydOxdDhw61anBERERERERERNaiNHfg7Nmz8c0336BZs2YYOXIkgoKCIJPJcPbsWWzevBm+vr6YPXt2TcZKRERERERERFRtZjdBHBwccPjwYURFRWHr1q3G+T+cnZ0xcuRIvPXWW3BwcKixQImIiIiIiIiIHobZt8MAgKOjI1avXo20tDTcvHkTKSkpSEtLw+rVq+Hk5FStAFavXo0mTZpArVYjJCQEBw8erHL8qlWr0KJFC2g0GgQFBWHjxo3lxqxYsQJBQUHQaDTw9fXFtGnTUFBQUK34iIiIiIiIiKh+sKgJUkYmk8Hd3R3r169HZmZmtQ++detWTJ06FXPmzMGJEyfwl7/8BX379kViYmKF49esWYOoqCgsWLAAZ86cwcKFCzFp0iR89913xjGbN2/G7NmzMX/+fJw9exbr1q3D1q1bERUVVe04iYiIiIiIiKjuq1YTpMxbb72F9PT0am8fHR2NMWPGYOzYsWjRogVWrFgBX19frFmzpsLxmzZtwiuvvIKIiAgEBARg+PDhGDNmDJYuXWocc/ToUXTp0gUvvvgi/P390adPH7zwwgtVPtmGiIiIiIiIiOq/h2qCCCGqvW1RURHi4uLQp08fk+V9+vTBkSNHKtymsLAQarXaZJlGo0FsbCyKi4sBAE899RTi4uIQGxsLALhy5Qp27dqF/v37VxpLYWEhsrKyTF5ERETUcLAWICIiahjMnhh10aJFmDFjBrRarVUOnJaWBr1eD09PT5Plnp6eSElJqXCb8PBwfPLJJxgyZAiCg4MRFxeH9evXo7i4GGlpafD29sbw4cNx69YtPPXUUxBCoKSkBK+++mqVT655++23sXDhwvIx3kpGYUHOw53ofUpK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jIULF2L27Nnw9PSsdMbqTz/9FCEhIRgwYADCwsIghMCuXbvKXSZpiQkTJuC5555DREQEOnXqhNu3b2PixIkPde7mGDFiBKKiojBjxgzj5aaRkZFQq9WVbmNunv5MJpNh165d6Nq1K15++WU0b94cw4cPx9WrVyv9ArS3t8fSpUsRGhqKDh064OrVq9i1a5exaNi+fTs6dOiAF154AS1btsSsWbOMvz7MmzcPwcHBCA8PR/fu3eHl5YUhQ4aYnRtzNWrUCIcPH4Zer0d4eDhatWqFKVOmwNHR0RjnO++8g65du2LQoEHo3bs3nnrqKYSEhFS53/feew/Ozs7o3LkzBg4ciPDwcAQHBz8wnubNm2Pv3r347bff0LFjR4SFheGbb76BUln53ZPjx4/H5s2bTZbNmjULU6dOxcSJExEaGoqkpCTs3bsXDg4Ole5n3LhxCAoKMt7PfvjwYWi1WuzZswfp6eno0KEDnn/+efTq1QsffPBBlecxduxYtG/fHh999BEuXLiA9u3bo3379rhx44ZxzBdffIERI0ZAq9U+MC9EVH+xFmAtwFrAFGsBqu9k4mFu2iMi+pOnn34aXl5e2LRp06MOhSRSUFCAoKAgbNmypc78knLr1i08/vjjOHbsGJo0afKowyEiqldYCzQ8rAWoLuHEqERUbXl5efjwww8RHh4OhUKBL774Avv27TO5/5PqP7VajY0bN1Z6mWxtlJCQgNWrV7PoISJ6SKwFCGAtQHULrwQhomrLz8/HwIEDcfz4cRQWFiIoKAhz587Fc88996hDIyIiIgmwFiCiuoZNECIiIiIiIiJqEDgxKhERERERERE1CGyCEBEREREREVGDwCYIERERERERETUIbIIQERERERERUYPAJggRERERERERNQhsghARERERERFRg8AmCBERERERERE1CGyCEBEREREREVGDwCYIERERERERETUI/w/vCtoEBuc4bQAAAABJRU5ErkJggg==",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, axes = plt.subplots(1, 2, figsize=(11, 3.6), sharey=True)\n",
+ "for (name, sizes), color in zip(conical_sizes.items(), [BLUE, ORANGE, AQUA]):\n",
+ " for ax, direction in zip(axes, [\"cross\", \"along\"]):\n",
+ " ratio = (\n",
+ " (sizes[f\"spacing_{direction}\"] / sizes[f\"measured_{direction}\"])\n",
+ " .groupby(sizes[\"sample\"])\n",
+ " .median()\n",
+ " )\n",
+ " ax.plot(ratio.index / ratio.index.max(), ratio, color=color, lw=1.5, label=name)\n",
+ "for ax, title in zip(axes, [\"Along the arc\", \"Scan to scan\"]):\n",
+ " ax.axhline(1, color=GRAY, lw=0.8)\n",
+ " ax.set(\n",
+ " xlabel=\"Position along the scanned arc (0 to 1)\", title=title, ylim=(0.97, 1.05)\n",
+ " )\n",
+ "axes[0].set_ylabel(\"TAT-C / measured spacing (median)\")\n",
+ "axes[0].legend(frameon=False, fontsize=8)\n",
+ "fig.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "63c901fe",
+ "metadata": {},
+ "source": [
+ "Along the arc, TAT-C's spacing matches the measured spacing to within 1.4% (95th percentile):\n",
+ "* **AMSR2:** 9.16 km (9.13 km measured; JAXA's nominal sampling interval is 10 km).\n",
+ "* **GMI:** 6.33 and 5.61 km for its two feeds (6.29 and 5.57 km measured).\n",
+ "\n",
+ "Between scans, TAT-C overestimates the spacing by 1.0% for AMSR2 and 2.4% for GMI (median). The cause is `compute_along_track_field_of_view`, which tailors the along-track field of view to the fastest ground speed over the orbit (relative to the rotating Earth, at perigee), so that consecutive footprints never leave gaps, rather than to the advance at a given time. Both spacings are nearly uniform along the arc.\n",
+ "\n",
+ "## Test 4: Footprint Sizes\n",
+ "\n",
+ "Published footprint sizes are computed for nominal altitudes:\n",
+ "* 824 km for the JPSS instruments (the altitude of Suomi NPP);\n",
+ "* 705 km for MODIS;\n",
+ "* 700 km for AMSR2; and\n",
+ "* 407 km for GMI (the nominal altitude in its ATBD) and 435 km after GPM's orbit boost of November 2023, the altitude [TC PRIMED](https://rammb-data.cira.colostate.edu/tcprimed/) uses.\n",
+ "\n",
+ "Each is compared with TAT-C's sample size for a circular orbit at the same altitude (`CircularOrbit`), along track by across track. Cross-track scanners use a `PointedInstrument` whose fields of view are the beam width or pixel field of view:\n",
+ "* **ATMS:** beams of 5.2, 2.2, and 1.1 deg.\n",
+ "* **CrIS:** 0.963 deg.\n",
+ "* **VIIRS:** the detector pitch along track; across track, three aggregated samples of 0.01779 deg at nadir and one at the edges.\n",
+ "* **MODIS:** 0.0812 deg.\n",
+ "\n",
+ "Their footprints are evaluated at nadir and at the edge of the swath: 52.725 deg for ATMS, 49.43 deg for CrIS (its outermost field of view), 56.0 deg for VIIRS, and 55.0 deg for MODIS. Conical scanners use a `ConicalInstrument` with the beam width, evaluated at the center of the scan with the nominal cone angle: 47.5 deg for AMSR2, and 48.5 deg (10 to 89 GHz) and 45.36 deg (166 and 183 GHz) for GMI.\n",
+ "\n",
+ "Sources:\n",
+ "* **ATMS:** the sensor IFOV tables of the [TC PRIMED documentation](https://rammb-data.cira.colostate.edu/tcprimed/TCPRIMED_v01r01_documentation.pdf) (version v01r01), which also give GMI's footprints after its orbit boost.\n",
+ "* **CrIS:** the [NWP SAF](https://nwp-saf.eumetsat.int/site/download/documentation/aapp/NWPSAF-MF-UD-011_viirs-cris-mapping.pdf).\n",
+ "* **VIIRS:** [NOAA/CIMSS](https://www.ssec.wisc.edu/mcidas/mug_meeting/2012/presentations/cimss_suomi_npp_basics.pdf) (band M16).\n",
+ "* **MODIS:** [NASA LAADS](https://ladsweb.modaps.eosdis.nasa.gov/missions-and-measurements/products/MOD021KM).\n",
+ "* **AMSR2:** [JAXA](https://suzaku.eorc.jaxa.jp/GCOM_W/w_amsr2/amsr2_body_main.html).\n",
+ "* **GMI:** the [GMI L1B ATBD](https://gpm.nasa.gov/sites/default/files/document_files/GMIL1B_ATBD.pdf) (Table 1-1), and TC PRIMED after the orbit boost."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "d3baa478",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T16:06:17.903874Z",
+ "iopub.status.busy": "2026-10-25T16:06:17.903019Z",
+ "iopub.status.idle": "2026-10-25T16:06:17.987923Z",
+ "shell.execute_reply": "2026-10-25T16:06:17.987923Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
sensor
\n",
+ "
beam
\n",
+ "
location
\n",
+ "
altitude (km)
\n",
+ "
published (km)
\n",
+ "
TAT-C (km)
\n",
+ "
TAT-C / published, along
\n",
+ "
TAT-C / published, across
\n",
+ "
source
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
ATMS
\n",
+ "
channels 1-2
\n",
+ "
nadir
\n",
+ "
824
\n",
+ "
74.8 x 74.8
\n",
+ "
74.6 x 74.6
\n",
+ "
0.998
\n",
+ "
0.998
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
ATMS
\n",
+ "
channels 1-2
\n",
+ "
edge
\n",
+ "
824
\n",
+ "
141.8 x 323.1
\n",
+ "
141 x 327
\n",
+ "
0.998
\n",
+ "
1.014
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
ATMS
\n",
+ "
channels 3-16
\n",
+ "
nadir
\n",
+ "
824
\n",
+ "
31.6 x 31.6
\n",
+ "
31.5 x 31.5
\n",
+ "
0.998
\n",
+ "
0.998
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
ATMS
\n",
+ "
channels 3-16
\n",
+ "
edge
\n",
+ "
824
\n",
+ "
60 x 136.7
\n",
+ "
59.8 x 136
\n",
+ "
0.997
\n",
+ "
0.998
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
ATMS
\n",
+ "
channels 17-22
\n",
+ "
nadir
\n",
+ "
824
\n",
+ "
15.8 x 15.8
\n",
+ "
15.8 x 15.8
\n",
+ "
0.998
\n",
+ "
0.998
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
5
\n",
+ "
ATMS
\n",
+ "
channels 17-22
\n",
+ "
edge
\n",
+ "
824
\n",
+ "
30 x 68.4
\n",
+ "
29.9 x 68
\n",
+ "
0.996
\n",
+ "
0.995
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
6
\n",
+ "
CrIS
\n",
+ "
field of view
\n",
+ "
nadir
\n",
+ "
824
\n",
+ "
14 x 14
\n",
+ "
13.8 x 13.8
\n",
+ "
0.986
\n",
+ "
0.986
\n",
+ "
NWP SAF
\n",
+ "
\n",
+ "
\n",
+ "
7
\n",
+ "
CrIS
\n",
+ "
field of view
\n",
+ "
edge
\n",
+ "
824
\n",
+ "
24 x 48
\n",
+ "
23.5 x 45.8
\n",
+ "
0.981
\n",
+ "
0.953
\n",
+ "
NWP SAF
\n",
+ "
\n",
+ "
\n",
+ "
8
\n",
+ "
VIIRS
\n",
+ "
M bands
\n",
+ "
nadir
\n",
+ "
824
\n",
+ "
0.742 x 0.776
\n",
+ "
0.732 x 0.765
\n",
+ "
0.986
\n",
+ "
0.986
\n",
+ "
NOAA/CIMSS
\n",
+ "
\n",
+ "
\n",
+ "
9
\n",
+ "
VIIRS
\n",
+ "
M bands
\n",
+ "
edge
\n",
+ "
824
\n",
+ "
1.6 x 1.58
\n",
+ "
1.58 x 1.57
\n",
+ "
0.990
\n",
+ "
0.991
\n",
+ "
NOAA/CIMSS
\n",
+ "
\n",
+ "
\n",
+ "
10
\n",
+ "
MODIS
\n",
+ "
1 km bands
\n",
+ "
nadir
\n",
+ "
705
\n",
+ "
1 x 1
\n",
+ "
0.996 x 0.996
\n",
+ "
0.996
\n",
+ "
0.996
\n",
+ "
NASA LAADS
\n",
+ "
\n",
+ "
\n",
+ "
11
\n",
+ "
MODIS
\n",
+ "
1 km bands
\n",
+ "
edge
\n",
+ "
705
\n",
+ "
2 x 4.8
\n",
+ "
2 x 4.8
\n",
+ "
0.998
\n",
+ "
1.000
\n",
+ "
NASA LAADS
\n",
+ "
\n",
+ "
\n",
+ "
12
\n",
+ "
AMSR2
\n",
+ "
6.925 GHz
\n",
+ "
scan center
\n",
+ "
700
\n",
+ "
62 x 35
\n",
+ "
60.8 x 34.9
\n",
+ "
0.980
\n",
+ "
0.998
\n",
+ "
JAXA
\n",
+ "
\n",
+ "
\n",
+ "
13
\n",
+ "
AMSR2
\n",
+ "
10.65 GHz
\n",
+ "
scan center
\n",
+ "
700
\n",
+ "
42 x 24
\n",
+ "
40.5 x 23.3
\n",
+ "
0.964
\n",
+ "
0.970
\n",
+ "
JAXA
\n",
+ "
\n",
+ "
\n",
+ "
14
\n",
+ "
AMSR2
\n",
+ "
18.7 GHz
\n",
+ "
scan center
\n",
+ "
700
\n",
+ "
22 x 14
\n",
+ "
21.9 x 12.6
\n",
+ "
0.997
\n",
+ "
0.901
\n",
+ "
JAXA
\n",
+ "
\n",
+ "
\n",
+ "
15
\n",
+ "
AMSR2
\n",
+ "
23.8 GHz
\n",
+ "
scan center
\n",
+ "
700
\n",
+ "
26 x 15
\n",
+ "
25.3 x 14.5
\n",
+ "
0.973
\n",
+ "
0.970
\n",
+ "
JAXA
\n",
+ "
\n",
+ "
\n",
+ "
16
\n",
+ "
AMSR2
\n",
+ "
36.5 GHz
\n",
+ "
scan center
\n",
+ "
700
\n",
+ "
12 x 7
\n",
+ "
11.8 x 6.79
\n",
+ "
0.984
\n",
+ "
0.970
\n",
+ "
JAXA
\n",
+ "
\n",
+ "
\n",
+ "
17
\n",
+ "
AMSR2
\n",
+ "
89.0 GHz
\n",
+ "
scan center
\n",
+ "
700
\n",
+ "
5 x 3
\n",
+ "
5.06 x 2.91
\n",
+ "
1.012
\n",
+ "
0.970
\n",
+ "
JAXA
\n",
+ "
\n",
+ "
\n",
+ "
18
\n",
+ "
GMI
\n",
+ "
10.65 GHz
\n",
+ "
scan center
\n",
+ "
407
\n",
+ "
32.1 x 19.4
\n",
+ "
31.8 x 19.2
\n",
+ "
0.991
\n",
+ "
0.991
\n",
+ "
GMI L1B ATBD
\n",
+ "
\n",
+ "
\n",
+ "
19
\n",
+ "
GMI
\n",
+ "
18.7 GHz
\n",
+ "
scan center
\n",
+ "
407
\n",
+ "
18.1 x 10.9
\n",
+ "
17.9 x 10.8
\n",
+ "
0.991
\n",
+ "
0.995
\n",
+ "
GMI L1B ATBD
\n",
+ "
\n",
+ "
\n",
+ "
20
\n",
+ "
GMI
\n",
+ "
23.8 GHz
\n",
+ "
scan center
\n",
+ "
407
\n",
+ "
16 x 9.7
\n",
+ "
15.8 x 9.57
\n",
+ "
0.989
\n",
+ "
0.986
\n",
+ "
GMI L1B ATBD
\n",
+ "
\n",
+ "
\n",
+ "
21
\n",
+ "
GMI
\n",
+ "
36.5 GHz
\n",
+ "
scan center
\n",
+ "
407
\n",
+ "
15.6 x 9.4
\n",
+ "
15.5 x 9.36
\n",
+ "
0.992
\n",
+ "
0.996
\n",
+ "
GMI L1B ATBD
\n",
+ "
\n",
+ "
\n",
+ "
22
\n",
+ "
GMI
\n",
+ "
89.0 GHz
\n",
+ "
scan center
\n",
+ "
407
\n",
+ "
7.2 x 4.4
\n",
+ "
7.16 x 4.33
\n",
+ "
0.994
\n",
+ "
0.984
\n",
+ "
GMI L1B ATBD
\n",
+ "
\n",
+ "
\n",
+ "
23
\n",
+ "
GMI
\n",
+ "
166 GHz
\n",
+ "
scan center
\n",
+ "
407
\n",
+ "
6.3 x 4.1
\n",
+ "
6.28 x 4.11
\n",
+ "
0.997
\n",
+ "
1.002
\n",
+ "
GMI L1B ATBD
\n",
+ "
\n",
+ "
\n",
+ "
24
\n",
+ "
GMI
\n",
+ "
183.31 GHz
\n",
+ "
scan center
\n",
+ "
407
\n",
+ "
5.8 x 3.8
\n",
+ "
5.73 x 3.75
\n",
+ "
0.988
\n",
+ "
0.986
\n",
+ "
GMI L1B ATBD
\n",
+ "
\n",
+ "
\n",
+ "
25
\n",
+ "
GMI
\n",
+ "
10.65 GHz
\n",
+ "
scan center
\n",
+ "
435
\n",
+ "
35 x 21
\n",
+ "
34.4 x 20.6
\n",
+ "
0.982
\n",
+ "
0.982
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
26
\n",
+ "
GMI
\n",
+ "
36.64 GHz
\n",
+ "
scan center
\n",
+ "
435
\n",
+ "
16.7 x 10
\n",
+ "
16.7 x 10
\n",
+ "
1.001
\n",
+ "
1.004
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
27
\n",
+ "
GMI
\n",
+ "
89.0 GHz
\n",
+ "
scan center
\n",
+ "
435
\n",
+ "
7.7 x 4.6
\n",
+ "
7.74 x 4.64
\n",
+ "
1.005
\n",
+ "
1.010
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ "
\n",
+ "
28
\n",
+ "
GMI
\n",
+ "
166 GHz
\n",
+ "
scan center
\n",
+ "
435
\n",
+ "
6.7 x 4.3
\n",
+ "
6.77 x 4.4
\n",
+ "
1.011
\n",
+ "
1.024
\n",
+ "
TC PRIMED
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sensor beam location altitude (km) published (km) \\\n",
+ "0 ATMS channels 1-2 nadir 824 74.8 x 74.8 \n",
+ "1 ATMS channels 1-2 edge 824 141.8 x 323.1 \n",
+ "2 ATMS channels 3-16 nadir 824 31.6 x 31.6 \n",
+ "3 ATMS channels 3-16 edge 824 60 x 136.7 \n",
+ "4 ATMS channels 17-22 nadir 824 15.8 x 15.8 \n",
+ "5 ATMS channels 17-22 edge 824 30 x 68.4 \n",
+ "6 CrIS field of view nadir 824 14 x 14 \n",
+ "7 CrIS field of view edge 824 24 x 48 \n",
+ "8 VIIRS M bands nadir 824 0.742 x 0.776 \n",
+ "9 VIIRS M bands edge 824 1.6 x 1.58 \n",
+ "10 MODIS 1 km bands nadir 705 1 x 1 \n",
+ "11 MODIS 1 km bands edge 705 2 x 4.8 \n",
+ "12 AMSR2 6.925 GHz scan center 700 62 x 35 \n",
+ "13 AMSR2 10.65 GHz scan center 700 42 x 24 \n",
+ "14 AMSR2 18.7 GHz scan center 700 22 x 14 \n",
+ "15 AMSR2 23.8 GHz scan center 700 26 x 15 \n",
+ "16 AMSR2 36.5 GHz scan center 700 12 x 7 \n",
+ "17 AMSR2 89.0 GHz scan center 700 5 x 3 \n",
+ "18 GMI 10.65 GHz scan center 407 32.1 x 19.4 \n",
+ "19 GMI 18.7 GHz scan center 407 18.1 x 10.9 \n",
+ "20 GMI 23.8 GHz scan center 407 16 x 9.7 \n",
+ "21 GMI 36.5 GHz scan center 407 15.6 x 9.4 \n",
+ "22 GMI 89.0 GHz scan center 407 7.2 x 4.4 \n",
+ "23 GMI 166 GHz scan center 407 6.3 x 4.1 \n",
+ "24 GMI 183.31 GHz scan center 407 5.8 x 3.8 \n",
+ "25 GMI 10.65 GHz scan center 435 35 x 21 \n",
+ "26 GMI 36.64 GHz scan center 435 16.7 x 10 \n",
+ "27 GMI 89.0 GHz scan center 435 7.7 x 4.6 \n",
+ "28 GMI 166 GHz scan center 435 6.7 x 4.3 \n",
+ "\n",
+ " TAT-C (km) TAT-C / published, along TAT-C / published, across \\\n",
+ "0 74.6 x 74.6 0.998 0.998 \n",
+ "1 141 x 327 0.998 1.014 \n",
+ "2 31.5 x 31.5 0.998 0.998 \n",
+ "3 59.8 x 136 0.997 0.998 \n",
+ "4 15.8 x 15.8 0.998 0.998 \n",
+ "5 29.9 x 68 0.996 0.995 \n",
+ "6 13.8 x 13.8 0.986 0.986 \n",
+ "7 23.5 x 45.8 0.981 0.953 \n",
+ "8 0.732 x 0.765 0.986 0.986 \n",
+ "9 1.58 x 1.57 0.990 0.991 \n",
+ "10 0.996 x 0.996 0.996 0.996 \n",
+ "11 2 x 4.8 0.998 1.000 \n",
+ "12 60.8 x 34.9 0.980 0.998 \n",
+ "13 40.5 x 23.3 0.964 0.970 \n",
+ "14 21.9 x 12.6 0.997 0.901 \n",
+ "15 25.3 x 14.5 0.973 0.970 \n",
+ "16 11.8 x 6.79 0.984 0.970 \n",
+ "17 5.06 x 2.91 1.012 0.970 \n",
+ "18 31.8 x 19.2 0.991 0.991 \n",
+ "19 17.9 x 10.8 0.991 0.995 \n",
+ "20 15.8 x 9.57 0.989 0.986 \n",
+ "21 15.5 x 9.36 0.992 0.996 \n",
+ "22 7.16 x 4.33 0.994 0.984 \n",
+ "23 6.28 x 4.11 0.997 1.002 \n",
+ "24 5.73 x 3.75 0.988 0.986 \n",
+ "25 34.4 x 20.6 0.982 0.982 \n",
+ "26 16.7 x 10 1.001 1.004 \n",
+ "27 7.74 x 4.64 1.005 1.010 \n",
+ "28 6.77 x 4.4 1.011 1.024 \n",
+ "\n",
+ " source \n",
+ "0 TC PRIMED \n",
+ "1 TC PRIMED \n",
+ "2 TC PRIMED \n",
+ "3 TC PRIMED \n",
+ "4 TC PRIMED \n",
+ "5 TC PRIMED \n",
+ "6 NWP SAF \n",
+ "7 NWP SAF \n",
+ "8 NOAA/CIMSS \n",
+ "9 NOAA/CIMSS \n",
+ "10 NASA LAADS \n",
+ "11 NASA LAADS \n",
+ "12 JAXA \n",
+ "13 JAXA \n",
+ "14 JAXA \n",
+ "15 JAXA \n",
+ "16 JAXA \n",
+ "17 JAXA \n",
+ "18 GMI L1B ATBD \n",
+ "19 GMI L1B ATBD \n",
+ "20 GMI L1B ATBD \n",
+ "21 GMI L1B ATBD \n",
+ "22 GMI L1B ATBD \n",
+ "23 GMI L1B ATBD \n",
+ "24 GMI L1B ATBD \n",
+ "25 TC PRIMED \n",
+ "26 TC PRIMED \n",
+ "27 TC PRIMED \n",
+ "28 TC PRIMED "
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# published sizes (km, along track x across track) at nominal altitudes, with the scan angle (pointed) or cone angle (conical)\n",
+ "EPOCH = datetime(2026, 10, 1, tzinfo=timezone.utc)\n",
+ "PUBLISHED = [\n",
+ " # sensor, beam, altitude (km), inclination (deg), kind, angle (deg), location, beam width or pixel (along, cross, deg), published (along, cross), source\n",
+ " (\n",
+ " \"ATMS\",\n",
+ " \"channels 1-2\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 0,\n",
+ " \"nadir\",\n",
+ " (5.2, 5.2),\n",
+ " (74.8, 74.8),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"ATMS\",\n",
+ " \"channels 1-2\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 52.725,\n",
+ " \"edge\",\n",
+ " (5.2, 5.2),\n",
+ " (141.8, 323.1),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"ATMS\",\n",
+ " \"channels 3-16\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 0,\n",
+ " \"nadir\",\n",
+ " (2.2, 2.2),\n",
+ " (31.6, 31.6),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"ATMS\",\n",
+ " \"channels 3-16\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 52.725,\n",
+ " \"edge\",\n",
+ " (2.2, 2.2),\n",
+ " (60.0, 136.7),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"ATMS\",\n",
+ " \"channels 17-22\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 0,\n",
+ " \"nadir\",\n",
+ " (1.1, 1.1),\n",
+ " (15.8, 15.8),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"ATMS\",\n",
+ " \"channels 17-22\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 52.725,\n",
+ " \"edge\",\n",
+ " (1.1, 1.1),\n",
+ " (30.0, 68.4),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"CrIS\",\n",
+ " \"field of view\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 0,\n",
+ " \"nadir\",\n",
+ " (0.963, 0.963),\n",
+ " (14, 14),\n",
+ " \"NWP SAF\",\n",
+ " ),\n",
+ " (\n",
+ " \"CrIS\",\n",
+ " \"field of view\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 48.33 + 1.1,\n",
+ " \"edge\",\n",
+ " (0.963, 0.963),\n",
+ " (24, 48),\n",
+ " \"NWP SAF\",\n",
+ " ),\n",
+ " (\n",
+ " \"VIIRS\",\n",
+ " \"M bands\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 0,\n",
+ " \"nadir\",\n",
+ " (DETECTOR_PITCH, 3 * 0.01779),\n",
+ " (0.742, 0.776),\n",
+ " \"NOAA/CIMSS\",\n",
+ " ),\n",
+ " (\n",
+ " \"VIIRS\",\n",
+ " \"M bands\",\n",
+ " 824,\n",
+ " 98.7,\n",
+ " \"pointed\",\n",
+ " 56.0,\n",
+ " \"edge\",\n",
+ " (DETECTOR_PITCH, 0.01779),\n",
+ " (1.60, 1.58),\n",
+ " \"NOAA/CIMSS\",\n",
+ " ),\n",
+ " (\n",
+ " \"MODIS\",\n",
+ " \"1 km bands\",\n",
+ " 705,\n",
+ " 98.2,\n",
+ " \"pointed\",\n",
+ " 0,\n",
+ " \"nadir\",\n",
+ " (0.0812, 0.0812),\n",
+ " (1.0, 1.0),\n",
+ " \"NASA LAADS\",\n",
+ " ),\n",
+ " (\n",
+ " \"MODIS\",\n",
+ " \"1 km bands\",\n",
+ " 705,\n",
+ " 98.2,\n",
+ " \"pointed\",\n",
+ " 55.0,\n",
+ " \"edge\",\n",
+ " (0.0812, 0.0812),\n",
+ " (2.0, 4.8),\n",
+ " \"NASA LAADS\",\n",
+ " ),\n",
+ " (\n",
+ " \"AMSR2\",\n",
+ " \"6.925 GHz\",\n",
+ " 700,\n",
+ " 98.2,\n",
+ " \"conical\",\n",
+ " 47.5,\n",
+ " \"scan center\",\n",
+ " (1.8, 1.8),\n",
+ " (62, 35),\n",
+ " \"JAXA\",\n",
+ " ),\n",
+ " (\n",
+ " \"AMSR2\",\n",
+ " \"10.65 GHz\",\n",
+ " 700,\n",
+ " 98.2,\n",
+ " \"conical\",\n",
+ " 47.5,\n",
+ " \"scan center\",\n",
+ " (1.2, 1.2),\n",
+ " (42, 24),\n",
+ " \"JAXA\",\n",
+ " ),\n",
+ " (\n",
+ " \"AMSR2\",\n",
+ " \"18.7 GHz\",\n",
+ " 700,\n",
+ " 98.2,\n",
+ " \"conical\",\n",
+ " 47.5,\n",
+ " \"scan center\",\n",
+ " (0.65, 0.65),\n",
+ " (22, 14),\n",
+ " \"JAXA\",\n",
+ " ),\n",
+ " (\n",
+ " \"AMSR2\",\n",
+ " \"23.8 GHz\",\n",
+ " 700,\n",
+ " 98.2,\n",
+ " \"conical\",\n",
+ " 47.5,\n",
+ " \"scan center\",\n",
+ " (0.75, 0.75),\n",
+ " (26, 15),\n",
+ " \"JAXA\",\n",
+ " ),\n",
+ " (\n",
+ " \"AMSR2\",\n",
+ " \"36.5 GHz\",\n",
+ " 700,\n",
+ " 98.2,\n",
+ " \"conical\",\n",
+ " 47.5,\n",
+ " \"scan center\",\n",
+ " (0.35, 0.35),\n",
+ " (12, 7),\n",
+ " \"JAXA\",\n",
+ " ),\n",
+ " (\n",
+ " \"AMSR2\",\n",
+ " \"89.0 GHz\",\n",
+ " 700,\n",
+ " 98.2,\n",
+ " \"conical\",\n",
+ " 47.5,\n",
+ " \"scan center\",\n",
+ " (0.15, 0.15),\n",
+ " (5, 3),\n",
+ " \"JAXA\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"10.65 GHz\",\n",
+ " 407,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 48.5,\n",
+ " \"scan center\",\n",
+ " (1.732, 1.732),\n",
+ " (32.1, 19.4),\n",
+ " \"GMI L1B ATBD\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"18.7 GHz\",\n",
+ " 407,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 48.5,\n",
+ " \"scan center\",\n",
+ " (0.977, 0.977),\n",
+ " (18.1, 10.9),\n",
+ " \"GMI L1B ATBD\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"23.8 GHz\",\n",
+ " 407,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 48.5,\n",
+ " \"scan center\",\n",
+ " (0.862, 0.862),\n",
+ " (16.0, 9.7),\n",
+ " \"GMI L1B ATBD\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"36.5 GHz\",\n",
+ " 407,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 48.5,\n",
+ " \"scan center\",\n",
+ " (0.843, 0.843),\n",
+ " (15.6, 9.4),\n",
+ " \"GMI L1B ATBD\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"89.0 GHz\",\n",
+ " 407,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 48.5,\n",
+ " \"scan center\",\n",
+ " (0.390, 0.390),\n",
+ " (7.2, 4.4),\n",
+ " \"GMI L1B ATBD\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"166 GHz\",\n",
+ " 407,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 45.36,\n",
+ " \"scan center\",\n",
+ " (0.396, 0.396),\n",
+ " (6.3, 4.1),\n",
+ " \"GMI L1B ATBD\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"183.31 GHz\",\n",
+ " 407,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 45.36,\n",
+ " \"scan center\",\n",
+ " (0.361, 0.361),\n",
+ " (5.8, 3.8),\n",
+ " \"GMI L1B ATBD\",\n",
+ " ),\n",
+ " # after the orbit boost of November 2023\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"10.65 GHz\",\n",
+ " 435,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 48.5,\n",
+ " \"scan center\",\n",
+ " (1.732, 1.732),\n",
+ " (35.0, 21.0),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"36.64 GHz\",\n",
+ " 435,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 48.5,\n",
+ " \"scan center\",\n",
+ " (0.843, 0.843),\n",
+ " (16.7, 10.0),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"89.0 GHz\",\n",
+ " 435,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 48.5,\n",
+ " \"scan center\",\n",
+ " (0.390, 0.390),\n",
+ " (7.7, 4.6),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ " (\n",
+ " \"GMI\",\n",
+ " \"166 GHz\",\n",
+ " 435,\n",
+ " 65.0,\n",
+ " \"conical\",\n",
+ " 45.36,\n",
+ " \"scan center\",\n",
+ " (0.396, 0.396),\n",
+ " (6.7, 4.3),\n",
+ " \"TC PRIMED\",\n",
+ " ),\n",
+ "]\n",
+ "rows4 = []\n",
+ "for (\n",
+ " sensor,\n",
+ " beam,\n",
+ " altitude,\n",
+ " inclination,\n",
+ " kind,\n",
+ " angle,\n",
+ " location,\n",
+ " (along_ifov, cross_ifov),\n",
+ " (pub_along, pub_cross),\n",
+ " source,\n",
+ ") in PUBLISHED:\n",
+ " orbit = CircularOrbit(altitude=altitude * 1e3, inclination=inclination, epoch=EPOCH)\n",
+ " track = orbit.to_gp_orbit().get_orbit_track(EPOCH + timedelta(minutes=10))\n",
+ " if kind == \"pointed\":\n",
+ " instrument = PointedInstrument(\n",
+ " name=sensor,\n",
+ " field_of_regard=120,\n",
+ " cross_track_field_of_view=cross_ifov,\n",
+ " along_track_field_of_view=along_ifov,\n",
+ " )\n",
+ " target = compute_projected_ray_position(track, 0, 0, angle)\n",
+ " else:\n",
+ " instrument = ConicalInstrument(\n",
+ " name=sensor,\n",
+ " cone_angle=angle,\n",
+ " along_track_field_of_view=1,\n",
+ " beam_width=along_ifov,\n",
+ " )\n",
+ " target = compute_projected_ray_position(track, 0, 0, 0, angle)\n",
+ " along, cross = instrument.compute_sample_size(track, target)\n",
+ " rows4.append(\n",
+ " {\n",
+ " \"sensor\": sensor,\n",
+ " \"beam\": beam,\n",
+ " \"location\": location,\n",
+ " \"altitude (km)\": altitude,\n",
+ " \"published (km)\": f\"{pub_along:g} x {pub_cross:g}\",\n",
+ " \"TAT-C (km)\": f\"{float(along) / 1e3:.3g} x {float(cross) / 1e3:.3g}\",\n",
+ " \"TAT-C / published, along\": float(along) / 1e3 / pub_along,\n",
+ " \"TAT-C / published, across\": float(cross) / 1e3 / pub_cross,\n",
+ " \"source\": source,\n",
+ " }\n",
+ " )\n",
+ "sizes4 = pd.DataFrame(rows4)\n",
+ "sizes4.round(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "03dce215",
+ "metadata": {},
+ "source": [
+ "TAT-C's sample sizes match the published footprint sizes across six instruments and 29 combinations of beam, location, and altitude: 55 of the 58 dimensions agree within 3%.\n",
+ "\n",
+ "* **ATMS:** within 0.5%, from 74.6, 31.5, and 15.8 km at nadir to 141 x 327 km (published 141.8 x 323.1 km), 59.8 x 136 km (60.0 x 136.7 km), and 29.9 x 68 km (30.0 x 68.4 km) at the swath edges.\n",
+ "* **MODIS:** from 1 km at nadir to 2.0 x 4.8 km at the edges.\n",
+ "* **VIIRS:** nearly constant, 0.73 x 0.77 km at nadir and 1.58 x 1.57 km at the edges, as aggregation intends.\n",
+ "* **Conical scanners:** the elongated footprints match, longer along the view (along track at the center of the scan) by about 1 / cos of the incidence angle. GMI's footprints match at both altitudes, before and after its orbit boost.\n",
+ "\n",
+ "The other differences are mostly within about 1.5%, comparable to the rounding of the published values.\n",
+ "\n",
+ "Three dimensions differ by more than 3%:\n",
+ "* **CrIS, edge, across track:** 5% smaller. The NWP SAF gives this size as an approximate maximum (\"up to\" 48 x 24 km).\n",
+ "* **AMSR2 10.65 GHz, along track:** 3.6% smaller.\n",
+ "* **AMSR2 18.7 GHz, across track:** 10% smaller. JAXA's 14 km is wider than the 0.65 deg beam gives at this geometry: for comparison, the 0.75 deg beam at 23.8 GHz gives 14.5 km, and JAXA lists 15 km."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab046fba",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "\n",
+ "| Test | Result |\n",
+ "| --- | --- |\n",
+ "| 1. Cross-track spacing (`compute_sample_sizes`) | ATMS and MODIS within 1% (5th to 95th percentile) from nadir to the swath edges, where the spacing grows by factors of 4.0 and 4.6; VIIRS within 1% with one `PointedInstrument` per aggregation zone (-34% to +97% with 3,200 equal pixels) |\n",
+ "| 2. Along-track spacing (`scan_period`) | MODIS and VIIRS within 0.2% (the detector pitch, or the scan advance per detector at nadir for MODIS); ATMS, one beam per scan position, within 0.8% (the scan advance, 17.4 to 17.7 km; -8% to +70% without a scan period) |\n",
+ "| 3. Conical spacing | AMSR2 and GMI within 1.4% along the arc; 1.0% (AMSR2) and 2.4% (GMI) larger between scans, as the along-track field of view is tailored to the fastest ground speed |\n",
+ "| 4. Footprint sizes | 55 of 58 published dimensions within 3% (ATMS, CrIS, VIIRS, MODIS, AMSR2, and GMI; 29 beams, locations, and altitudes); AMSR2's published 18.7 GHz footprint is 10% wider across track than its beam width implies |\n",
+ "\n",
+ "**Sample geometry.** Projecting angular extents around the line of sight onto the ellipsoid reproduces how the samples of cross-track scanners grow toward the swath edges, with the slant range across track and also with the obliquity of the view. It also reproduces the elongated beams of conical scanners. So the sample sizes that the OSSE examples use to judge whether a feature is resolved are consistent with the real instruments.\n",
+ "\n",
+ "**Aggregation zones.** An instrument that aggregates samples on board in zones, as VIIRS does to keep its pixels nearly the same size across the swath, is represented by one `PointedInstrument` per zone, with the zone's pixels, spacing, and roll angle.\n",
+ "\n",
+ "**Scanners.** The angular along-track spacing of a `PointedInstrument` suits arrays of detectors (MODIS, VIIRS, and the 3 x 3 array of CrIS) but not microwave sounders such as ATMS, which scan one beam per position: their samples are spaced along track by the advance per scan, nearly constant across the swath. A `scan_period` accounts for the advance, which sets the spacing of single-beam scanners, and of arrays of detectors wherever the scans do not overlap.\n",
+ "\n",
+ "**Conical scans.** The spacing between scans of a `ConicalInstrument` follows its along-track field of view. Tailored with `compute_along_track_field_of_view` to the fastest ground speed of the orbit, it overestimates the spacing by 1 to 2.5%."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/validation/ValidateSolarLandsat.ipynb b/docs/validation/ValidateSolarLandsat.ipynb
index 41723dec..9866fca6 100644
--- a/docs/validation/ValidateSolarLandsat.ipynb
+++ b/docs/validation/ValidateSolarLandsat.ipynb
@@ -142,14 +142,27 @@
"START = datetime(2026, 9, 17, tzinfo=timezone.utc)\n",
"END = datetime(2026, 10, 3, tzinfo=timezone.utc)\n",
"STAC = \"https://landsatlook.usgs.gov/stac-server/search\"\n",
- "SCENES_FILE = DATA_DIR / f\"landsat_c2l1_scenes_{START:%Y%m%d}_{END - timedelta(days=1):%Y%m%d}.geojson\"\n",
+ "SCENES_FILE = (\n",
+ " DATA_DIR\n",
+ " / f\"landsat_c2l1_scenes_{START:%Y%m%d}_{END - timedelta(days=1):%Y%m%d}.geojson\"\n",
+ ")\n",
"if not SCENES_FILE.exists():\n",
" body = {\n",
" \"collections\": [\"landsat-c2l1\"],\n",
" \"datetime\": f\"{START:%Y-%m-%dT%H:%M:%SZ}/{END - timedelta(seconds=1):%Y-%m-%dT%H:%M:%SZ}\",\n",
" \"limit\": 500,\n",
" \"fields\": {\n",
- " \"include\": [\"id\", \"geometry\", \"properties.datetime\", \"properties.platform\", \"properties.view:sun_elevation\", \"properties.view:sun_azimuth\", \"properties.view:off_nadir\", \"properties.landsat:wrs_path\", \"properties.landsat:wrs_row\"],\n",
+ " \"include\": [\n",
+ " \"id\",\n",
+ " \"geometry\",\n",
+ " \"properties.datetime\",\n",
+ " \"properties.platform\",\n",
+ " \"properties.view:sun_elevation\",\n",
+ " \"properties.view:sun_azimuth\",\n",
+ " \"properties.view:off_nadir\",\n",
+ " \"properties.landsat:wrs_path\",\n",
+ " \"properties.landsat:wrs_row\",\n",
+ " ],\n",
" \"exclude\": [\"links\", \"assets\"],\n",
" },\n",
" }\n",
@@ -166,12 +179,22 @@
" raise\n",
" time.sleep(2**attempt)\n",
" features += page[\"features\"]\n",
- " following = [link for link in page.get(\"links\", []) if link.get(\"rel\") == \"next\"]\n",
+ " following = [\n",
+ " link for link in page.get(\"links\", []) if link.get(\"rel\") == \"next\"\n",
+ " ]\n",
" if not following or not page[\"features\"]:\n",
" break\n",
" body = following[0][\"body\"]\n",
- " SCENES_FILE.write_text(json.dumps({\"type\": \"FeatureCollection\", \"features\": features}))\n",
- "scenes = gpd.read_file(SCENES_FILE).rename(columns={\"view:sun_elevation\": \"sun_elevation\", \"view:sun_azimuth\": \"sun_azimuth\", \"view:off_nadir\": \"off_nadir\"})\n",
+ " SCENES_FILE.write_text(\n",
+ " json.dumps({\"type\": \"FeatureCollection\", \"features\": features})\n",
+ " )\n",
+ "scenes = gpd.read_file(SCENES_FILE).rename(\n",
+ " columns={\n",
+ " \"view:sun_elevation\": \"sun_elevation\",\n",
+ " \"view:sun_azimuth\": \"sun_azimuth\",\n",
+ " \"view:off_nadir\": \"off_nadir\",\n",
+ " }\n",
+ ")\n",
"scenes[\"time\"] = pd.to_datetime(scenes[\"datetime\"], utc=True, format=\"ISO8601\")\n",
"scenes[\"satellite\"] = scenes.platform.str.replace(\"LANDSAT_\", \"Landsat \")\n",
"\n",
@@ -179,7 +202,12 @@
"def scene_center(geometry):\n",
" \"\"\"Center of a scene footprint, unwrapping footprints split at the antimeridian.\"\"\"\n",
" if isinstance(geometry, MultiPolygon):\n",
- " geometry = unary_union([translate(part, xoff=360) if part.centroid.x < 0 else part for part in geometry.geoms])\n",
+ " geometry = unary_union(\n",
+ " [\n",
+ " translate(part, xoff=360) if part.centroid.x < 0 else part\n",
+ " for part in geometry.geoms\n",
+ " ]\n",
+ " )\n",
" center = geometry.centroid\n",
" return (center.x + 180) % 360 - 180, center.y\n",
"\n",
@@ -196,17 +224,45 @@
" ],\n",
"}\n",
"SWATH = 185e3\n",
- "oli = Instrument(name=\"OLI\", field_of_regard=utils.swath_width_to_field_of_regard(705e3, SWATH))\n",
- "satellites = {name: Satellite(name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle), instruments=[oli]) for name, tle in TLES.items()}\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "oli = Instrument(\n",
+ " name=\"OLI\", field_of_regard=utils.swath_width_to_field_of_regard(705e3, SWATH)\n",
+ ")\n",
+ "satellites = {\n",
+ " name: Satellite(\n",
+ " name=name, orbit=GeneralPerturbationsOrbit.from_tle(tle), instruments=[oli]\n",
+ " )\n",
+ " for name, tle in TLES.items()\n",
+ "}\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"pd.DataFrame(\n",
" {\n",
" \"scenes\": scenes.groupby(\"satellite\").size(),\n",
- " \"night scenes (sun below horizon)\": scenes[scenes.sun_elevation < 0].groupby(\"satellite\").size(),\n",
+ " \"night scenes (sun below horizon)\": scenes[scenes.sun_elevation < 0]\n",
+ " .groupby(\"satellite\")\n",
+ " .size(),\n",
" \"off-nadir scenes\": scenes[scenes.off_nadir > 0].groupby(\"satellite\").size(),\n",
- " \"first scene\": scenes.groupby(\"satellite\").time.min().dt.strftime(\"%Y-%m-%d %H:%M\"),\n",
- " \"last scene\": scenes.groupby(\"satellite\").time.max().dt.strftime(\"%Y-%m-%d %H:%M\"),\n",
+ " \"first scene\": scenes.groupby(\"satellite\")\n",
+ " .time.min()\n",
+ " .dt.strftime(\"%Y-%m-%d %H:%M\"),\n",
+ " \"last scene\": scenes.groupby(\"satellite\")\n",
+ " .time.max()\n",
+ " .dt.strftime(\"%Y-%m-%d %H:%M\"),\n",
" }\n",
")"
]
@@ -334,7 +390,12 @@
],
"source": [
"scenes = scenes[scenes.off_nadir.fillna(0) == 0].reset_index(drop=True)\n",
- "sample = pd.concat([scenes[scenes.sun_elevation >= 0].sample(600, random_state=1), scenes[scenes.sun_elevation < 0].sample(300, random_state=1)])\n",
+ "sample = pd.concat(\n",
+ " [\n",
+ " scenes[scenes.sun_elevation >= 0].sample(600, random_state=1),\n",
+ " scenes[scenes.sun_elevation < 0].sample(300, random_state=1),\n",
+ " ]\n",
+ ")\n",
"\n",
"\n",
"def scene_geometry(scene):\n",
@@ -342,7 +403,13 @@
" point = Point(id=0, latitude=scene.center_lat, longitude=scene.center_lon)\n",
" window = timedelta(minutes=5)\n",
" time = scene.time.floor(\"us\")\n",
- " obs = collect_observations(point, satellites[scene.satellite], (time - window).to_pydatetime(), (time + window).to_pydatetime(), omit_solar=False)\n",
+ " obs = collect_observations(\n",
+ " point,\n",
+ " satellites[scene.satellite],\n",
+ " (time - window).to_pydatetime(),\n",
+ " (time + window).to_pydatetime(),\n",
+ " omit_solar=False,\n",
+ " )\n",
" if obs.empty:\n",
" return {\"id\": scene.id, \"found\": False}\n",
" o = obs.iloc[0]\n",
@@ -354,7 +421,8 @@
" \"sun elevation\": scene.sun_elevation,\n",
" \"TAT-C solar elevation\": o.solar_alt,\n",
" \"solar elevation difference (deg)\": o.solar_alt - scene.sun_elevation,\n",
- " \"solar azimuth difference (deg)\": (o.solar_az - scene.sun_azimuth + 180) % 360 - 180,\n",
+ " \"solar azimuth difference (deg)\": (o.solar_az - scene.sun_azimuth + 180) % 360\n",
+ " - 180,\n",
" \"local solar time (h)\": o.solar_time,\n",
" \"latitude\": scene.center_lat,\n",
" }\n",
@@ -364,13 +432,24 @@
" geometry1 = pd.DataFrame(list(pool.map(scene_geometry, sample.itertuples())))\n",
"found = geometry1[geometry1.found]\n",
"table1 = {}\n",
- "for label, subset in [(\"day scenes\", found[~found.night.astype(bool)]), (\"night scenes\", found[found.night.astype(bool)])]:\n",
+ "for label, subset in [\n",
+ " (\"day scenes\", found[~found.night.astype(bool)]),\n",
+ " (\"night scenes\", found[found.night.astype(bool)]),\n",
+ "]:\n",
" table1[label] = {\"scenes\": len(subset)}\n",
- " for column in [\"epoch difference (s)\", \"solar elevation difference (deg)\", \"solar azimuth difference (deg)\"]:\n",
+ " for column in [\n",
+ " \"epoch difference (s)\",\n",
+ " \"solar elevation difference (deg)\",\n",
+ " \"solar azimuth difference (deg)\",\n",
+ " ]:\n",
" table1[label][f\"{column}, median\"] = subset[column].median()\n",
" table1[label][f\"{column}, max |x|\"] = subset[column].abs().max()\n",
- " table1[label][\"local solar time, range (h)\"] = f\"{subset['local solar time (h)'].min():.2f} to {subset['local solar time (h)'].max():.2f}\"\n",
- "pd.DataFrame(table1).T.assign(**{\"scenes found\": f\"{geometry1.found.sum()} of {len(geometry1)}\"})"
+ " table1[label][\n",
+ " \"local solar time, range (h)\"\n",
+ " ] = f\"{subset['local solar time (h)'].min():.2f} to {subset['local solar time (h)'].max():.2f}\"\n",
+ "pd.DataFrame(table1).T.assign(\n",
+ " **{\"scenes found\": f\"{geometry1.found.sum()} of {len(geometry1)}\"}\n",
+ ")"
]
},
{
@@ -400,13 +479,47 @@
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.8))\n",
"night = found.night.astype(bool)\n",
- "axes[0].scatter(found.latitude[~night], found[\"solar elevation difference (deg)\"][~night], s=6, color=BLUE, label=\"day scenes\")\n",
- "axes[0].scatter(found.latitude[night], found[\"solar elevation difference (deg)\"][night], s=6, color=PURPLE, label=\"night scenes\")\n",
- "axes[0].set(xlabel=\"Scene latitude (deg)\", ylabel=\"TAT-C minus scene (deg)\", title=\"Solar elevation at scene center\")\n",
+ "axes[0].scatter(\n",
+ " found.latitude[~night],\n",
+ " found[\"solar elevation difference (deg)\"][~night],\n",
+ " s=6,\n",
+ " color=BLUE,\n",
+ " label=\"day scenes\",\n",
+ ")\n",
+ "axes[0].scatter(\n",
+ " found.latitude[night],\n",
+ " found[\"solar elevation difference (deg)\"][night],\n",
+ " s=6,\n",
+ " color=PURPLE,\n",
+ " label=\"night scenes\",\n",
+ ")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Scene latitude (deg)\",\n",
+ " ylabel=\"TAT-C minus scene (deg)\",\n",
+ " title=\"Solar elevation at scene center\",\n",
+ ")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
- "axes[1].scatter(found.latitude[~night], found[\"local solar time (h)\"][~night], s=6, color=BLUE, label=\"day scenes (descending)\")\n",
- "axes[1].scatter(found.latitude[night], found[\"local solar time (h)\"][night], s=6, color=PURPLE, label=\"night scenes (ascending)\")\n",
- "axes[1].set(xlabel=\"Scene latitude (deg)\", ylabel=\"Local solar time (h)\", title=\"Local solar time of TAT-C observations\", ylim=(0, 24), yticks=range(0, 25, 4))\n",
+ "axes[1].scatter(\n",
+ " found.latitude[~night],\n",
+ " found[\"local solar time (h)\"][~night],\n",
+ " s=6,\n",
+ " color=BLUE,\n",
+ " label=\"day scenes (descending)\",\n",
+ ")\n",
+ "axes[1].scatter(\n",
+ " found.latitude[night],\n",
+ " found[\"local solar time (h)\"][night],\n",
+ " s=6,\n",
+ " color=PURPLE,\n",
+ " label=\"night scenes (ascending)\",\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Scene latitude (deg)\",\n",
+ " ylabel=\"Local solar time (h)\",\n",
+ " title=\"Local solar time of TAT-C observations\",\n",
+ " ylim=(0, 24),\n",
+ " yticks=range(0, 25, 4),\n",
+ ")\n",
"axes[1].legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
"plt.show()"
@@ -512,26 +625,46 @@
}
],
"source": [
- "land = unary_union(list(shpreader.Reader(shpreader.natural_earth(resolution=\"110m\", category=\"physical\", name=\"land\")).geometries()))\n",
+ "land = unary_union(\n",
+ " list(\n",
+ " shpreader.Reader(\n",
+ " shpreader.natural_earth(resolution=\"110m\", category=\"physical\", name=\"land\")\n",
+ " ).geometries()\n",
+ " )\n",
+ ")\n",
"prepare(land)\n",
"lattice = generate_points_fibonacci_lattice(500e3)\n",
- "points = lattice[contains_xy(land, lattice.geometry.x, lattice.geometry.y) & (lattice.geometry.y.abs() < 81.8)].reset_index(drop=True)\n",
+ "points = lattice[\n",
+ " contains_xy(land, lattice.geometry.x, lattice.geometry.y)\n",
+ " & (lattice.geometry.y.abs() < 81.8)\n",
+ "].reset_index(drop=True)\n",
"points[\"point_id\"] = points.index\n",
- "END_BY_SATELLITE = {\"Landsat 8\": datetime(2026, 9, 27, tzinfo=timezone.utc), \"Landsat 9\": END}\n",
+ "END_BY_SATELLITE = {\n",
+ " \"Landsat 8\": datetime(2026, 9, 27, tzinfo=timezone.utc),\n",
+ " \"Landsat 9\": END,\n",
+ "}\n",
"\n",
"\n",
"def predict(point, instrument=oli):\n",
" \"\"\"Predicted passes of each satellite over a point.\"\"\"\n",
- " target = Point(id=point.point_id, latitude=point.geometry.y, longitude=point.geometry.x)\n",
+ " target = Point(\n",
+ " id=point.point_id, latitude=point.geometry.y, longitude=point.geometry.x\n",
+ " )\n",
" frames = []\n",
" for name, satellite in satellites.items():\n",
" satellite = satellite.model_copy(update={\"instruments\": [instrument]})\n",
- " frames.append(collect_observations(target, satellite, START, END_BY_SATELLITE[name], omit_solar=False))\n",
+ " frames.append(\n",
+ " collect_observations(\n",
+ " target, satellite, START, END_BY_SATELLITE[name], omit_solar=False\n",
+ " )\n",
+ " )\n",
" return pd.concat(frames).assign(point_id=point.point_id)\n",
"\n",
"\n",
"with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
- " predicted = pd.concat(list(pool.map(predict, points.itertuples()))).reset_index(drop=True)\n",
+ " predicted = pd.concat(list(pool.map(predict, points.itertuples()))).reset_index(\n",
+ " drop=True\n",
+ " )\n",
"\n",
"# acquired passes: scenes containing each point, one per point, satellite, and pass\n",
"tree = STRtree(scenes.geometry.values)\n",
@@ -540,35 +673,73 @@
" for k in tree.query(point.geometry, predicate=\"intersects\"):\n",
" scene = scenes.iloc[k]\n",
" if scene.time < END_BY_SATELLITE[scene.satellite]:\n",
- " rows.append({\"point_id\": point.point_id, \"satellite\": scene.satellite, \"time\": scene.time, \"sun_elevation\": scene.sun_elevation})\n",
+ " rows.append(\n",
+ " {\n",
+ " \"point_id\": point.point_id,\n",
+ " \"satellite\": scene.satellite,\n",
+ " \"time\": scene.time,\n",
+ " \"sun_elevation\": scene.sun_elevation,\n",
+ " }\n",
+ " )\n",
"acquired = pd.DataFrame(rows).sort_values(\"time\")\n",
- "new_pass = acquired.groupby([\"point_id\", \"satellite\"]).time.diff() > pd.Timedelta(minutes=5)\n",
+ "new_pass = acquired.groupby([\"point_id\", \"satellite\"]).time.diff() > pd.Timedelta(\n",
+ " minutes=5\n",
+ ")\n",
"acquired[\"pass\"] = new_pass.groupby([acquired.point_id, acquired.satellite]).cumsum()\n",
- "acquired = acquired.groupby([\"point_id\", \"satellite\", \"pass\"]).agg(time=(\"time\", \"mean\"), sun_elevation=(\"sun_elevation\", \"mean\")).reset_index()\n",
+ "acquired = (\n",
+ " acquired.groupby([\"point_id\", \"satellite\", \"pass\"])\n",
+ " .agg(time=(\"time\", \"mean\"), sun_elevation=(\"sun_elevation\", \"mean\"))\n",
+ " .reset_index()\n",
+ ")\n",
"\n",
"\n",
"def match(predicted, acquired):\n",
" \"\"\"Flag predicted passes that were acquired, and acquired passes that were predicted.\"\"\"\n",
" tolerance = pd.Timedelta(minutes=3)\n",
- " pairs = pd.merge_asof(predicted.sort_values(\"epoch\"), acquired[[\"point_id\", \"satellite\", \"time\"]].sort_values(\"time\"), left_on=\"epoch\", right_on=\"time\", by=[\"point_id\", \"satellite\"], direction=\"nearest\", tolerance=tolerance)\n",
+ " pairs = pd.merge_asof(\n",
+ " predicted.sort_values(\"epoch\"),\n",
+ " acquired[[\"point_id\", \"satellite\", \"time\"]].sort_values(\"time\"),\n",
+ " left_on=\"epoch\",\n",
+ " right_on=\"time\",\n",
+ " by=[\"point_id\", \"satellite\"],\n",
+ " direction=\"nearest\",\n",
+ " tolerance=tolerance,\n",
+ " )\n",
" pairs[\"acquired\"] = pairs.time.notna()\n",
- " back = pd.merge_asof(acquired.sort_values(\"time\"), predicted[[\"point_id\", \"satellite\", \"epoch\"]].sort_values(\"epoch\"), left_on=\"time\", right_on=\"epoch\", by=[\"point_id\", \"satellite\"], direction=\"nearest\", tolerance=tolerance)\n",
+ " back = pd.merge_asof(\n",
+ " acquired.sort_values(\"time\"),\n",
+ " predicted[[\"point_id\", \"satellite\", \"epoch\"]].sort_values(\"epoch\"),\n",
+ " left_on=\"time\",\n",
+ " right_on=\"epoch\",\n",
+ " by=[\"point_id\", \"satellite\"],\n",
+ " direction=\"nearest\",\n",
+ " tolerance=tolerance,\n",
+ " )\n",
" back[\"predicted\"] = back.epoch.notna()\n",
" return pairs, back\n",
"\n",
"\n",
"pairs, back = match(predicted, acquired)\n",
- "pairs = pairs.merge(points[[\"point_id\"]].assign(latitude=points.geometry.y), on=\"point_id\")\n",
- "pairs[\"region\"] = np.where(pairs.latitude < -60, \"Antarctica (south of 60 deg S)\", np.where(pairs.latitude > 60, \"north of 60 deg N\", \"60 deg S to 60 deg N\"))\n",
+ "pairs = pairs.merge(\n",
+ " points[[\"point_id\"]].assign(latitude=points.geometry.y), on=\"point_id\"\n",
+ ")\n",
+ "pairs[\"region\"] = np.where(\n",
+ " pairs.latitude < -60,\n",
+ " \"Antarctica (south of 60 deg S)\",\n",
+ " np.where(pairs.latitude > 60, \"north of 60 deg N\", \"60 deg S to 60 deg N\"),\n",
+ ")\n",
"BINS = [-90, -10, 0, 2, 4, 5, 6, 8, 10, 15, 20, 30, 90]\n",
"pairs[\"solar elevation (deg)\"] = pd.cut(pairs.solar_alt, BINS)\n",
"pd.DataFrame(\n",
" {\n",
" \"points\": len(points),\n",
" \"predicted passes\": pairs.groupby(\"satellite\").size(),\n",
- " \"predicted passes by day\": pairs[pairs.solar_alt >= 0].groupby(\"satellite\").size(),\n",
+ " \"predicted passes by day\": pairs[pairs.solar_alt >= 0]\n",
+ " .groupby(\"satellite\")\n",
+ " .size(),\n",
" \"acquired passes\": back.groupby(\"satellite\").size(),\n",
- " \"acquired passes predicted (%)\": 100 * back.groupby(\"satellite\").predicted.mean(),\n",
+ " \"acquired passes predicted (%)\": 100\n",
+ " * back.groupby(\"satellite\").predicted.mean(),\n",
" }\n",
").round(1)"
]
@@ -762,8 +933,15 @@
}
],
"source": [
- "table2 = pairs.groupby([\"solar elevation (deg)\", \"satellite\"], observed=True).acquired.agg([\"mean\", \"size\"]).unstack()\n",
- "table2.columns = [f\"{satellite}: {'acquired (%)' if stat == 'mean' else 'predicted passes'}\" for stat, satellite in table2.columns]\n",
+ "table2 = (\n",
+ " pairs.groupby([\"solar elevation (deg)\", \"satellite\"], observed=True)\n",
+ " .acquired.agg([\"mean\", \"size\"])\n",
+ " .unstack()\n",
+ ")\n",
+ "table2.columns = [\n",
+ " f\"{satellite}: {'acquired (%)' if stat == 'mean' else 'predicted passes'}\"\n",
+ " for stat, satellite in table2.columns\n",
+ "]\n",
"for column in [c for c in table2.columns if \"acquired\" in c]:\n",
" table2[column] *= 100\n",
"table2.round(1)"
@@ -797,13 +975,29 @@
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.8), sharey=True)\n",
"centers = [(max(a, -20) + min(b, 40)) / 2 for a, b in zip(BINS[:-1], BINS[1:])]\n",
"for ax, satellite in zip(axes, satellites):\n",
- " for region, color in zip([\"60 deg S to 60 deg N\", \"north of 60 deg N\", \"Antarctica (south of 60 deg S)\"], [BLUE, AQUA, ORANGE]):\n",
+ " for region, color in zip(\n",
+ " [\"60 deg S to 60 deg N\", \"north of 60 deg N\", \"Antarctica (south of 60 deg S)\"],\n",
+ " [BLUE, AQUA, ORANGE],\n",
+ " ):\n",
" subset = pairs[(pairs.satellite == satellite) & (pairs.region == region)]\n",
- " stats = subset.groupby(\"solar elevation (deg)\", observed=False).acquired.agg([\"mean\", \"size\"])\n",
+ " stats = subset.groupby(\"solar elevation (deg)\", observed=False).acquired.agg(\n",
+ " [\"mean\", \"size\"]\n",
+ " )\n",
" # omit bins with fewer than 5 passes (breaking the line)\n",
- " ax.plot(centers, 100 * stats[\"mean\"].where(stats[\"size\"] >= 5), \"o-\", color=color, ms=4, label=region)\n",
+ " ax.plot(\n",
+ " centers,\n",
+ " 100 * stats[\"mean\"].where(stats[\"size\"] >= 5),\n",
+ " \"o-\",\n",
+ " color=color,\n",
+ " ms=4,\n",
+ " label=region,\n",
+ " )\n",
" ax.axvline(5, color=GRAY, ls=\"--\", lw=1)\n",
- " ax.set(xlabel=\"Predicted target solar elevation (deg)\", title=f\"{satellite} passes acquired\", xlim=(-20, 40))\n",
+ " ax.set(\n",
+ " xlabel=\"Predicted target solar elevation (deg)\",\n",
+ " title=f\"{satellite} passes acquired\",\n",
+ " xlim=(-20, 40),\n",
+ " )\n",
"axes[0].set_ylabel(\"Acquired (%)\")\n",
"axes[0].legend(frameon=False, fontsize=8)\n",
"fig.tight_layout()\n",
@@ -1038,7 +1232,9 @@
}
],
"source": [
- "wide = Instrument(name=\"wide\", field_of_regard=utils.swath_width_to_field_of_regard(705e3, 300e3))\n",
+ "wide = Instrument(\n",
+ " name=\"wide\", field_of_regard=utils.swath_width_to_field_of_regard(705e3, 300e3)\n",
+ ")\n",
"\n",
"\n",
"def ground_track_distance(row):\n",
@@ -1047,18 +1243,44 @@
" satellite = satellites[row.satellite].model_copy(update={\"instruments\": [wide]})\n",
" window = timedelta(minutes=5)\n",
" time = row.time.floor(\"us\")\n",
- " obs = collect_observations(Point(id=0, latitude=point.y, longitude=point.x), satellite, (time - window).to_pydatetime(), (time + window).to_pydatetime())\n",
+ " obs = collect_observations(\n",
+ " Point(id=0, latitude=point.y, longitude=point.x),\n",
+ " satellite,\n",
+ " (time - window).to_pydatetime(),\n",
+ " (time + window).to_pydatetime(),\n",
+ " )\n",
" if obs.empty:\n",
" return np.nan\n",
" epoch = obs.epoch.iloc[0].floor(\"us\").to_pydatetime()\n",
- " subpoint = wgs84.subpoint_of(satellites[row.satellite].orbit.to_gp_orbit().elements[0].to_skyfield().at(timescale.from_datetime(epoch)))\n",
- " return utils.geometry.geodesic_distance(point.x, point.y, subpoint.longitude.degrees, subpoint.latitude.degrees) / 1e3\n",
+ " subpoint = wgs84.subpoint_of(\n",
+ " satellites[row.satellite]\n",
+ " .orbit.to_gp_orbit()\n",
+ " .elements[0]\n",
+ " .to_skyfield()\n",
+ " .at(timescale.from_datetime(epoch))\n",
+ " )\n",
+ " return (\n",
+ " utils.geometry.geodesic_distance(\n",
+ " point.x, point.y, subpoint.longitude.degrees, subpoint.latitude.degrees\n",
+ " )\n",
+ " / 1e3\n",
+ " )\n",
"\n",
"\n",
"unpredicted = back[~back.predicted].copy()\n",
- "unpredicted[\"distance from ground track (km)\"] = [ground_track_distance(row) for row in unpredicted.itertuples()]\n",
+ "unpredicted[\"distance from ground track (km)\"] = [\n",
+ " ground_track_distance(row) for row in unpredicted.itertuples()\n",
+ "]\n",
"unpredicted[\"time\"] = unpredicted.time.dt.strftime(\"%Y-%m-%d %H:%M:%S\")\n",
- "unpredicted[[\"point_id\", \"satellite\", \"time\", \"sun_elevation\", \"distance from ground track (km)\"]].round(1)"
+ "unpredicted[\n",
+ " [\n",
+ " \"point_id\",\n",
+ " \"satellite\",\n",
+ " \"time\",\n",
+ " \"sun_elevation\",\n",
+ " \"distance from ground track (km)\",\n",
+ " ]\n",
+ "].round(1)"
]
},
{
@@ -1230,10 +1452,15 @@
"source": [
"oli_5 = oli.model_copy(update={\"min_target_solar_elevation\": 5})\n",
"with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
- " predicted_5 = pd.concat(list(pool.map(lambda point: predict(point, oli_5), points.itertuples()))).reset_index(drop=True)\n",
+ " predicted_5 = pd.concat(\n",
+ " list(pool.map(lambda point: predict(point, oli_5), points.itertuples()))\n",
+ " ).reset_index(drop=True)\n",
"pairs_5, back_5 = match(predicted_5, acquired)\n",
"rows3 = {}\n",
- "for label, p, b in [(\"no solar requirement\", pairs, back), (\"min_target_solar_elevation = 5\", pairs_5, back_5)]:\n",
+ "for label, p, b in [\n",
+ " (\"no solar requirement\", pairs, back),\n",
+ " (\"min_target_solar_elevation = 5\", pairs_5, back_5),\n",
+ "]:\n",
" for satellite in satellites:\n",
" ps, bs = p[p.satellite == satellite], b[b.satellite == satellite]\n",
" rows3[(label, satellite)] = {\n",
@@ -1242,10 +1469,17 @@
" \"predicted passes acquired (%)\": 100 * ps.acquired.mean(),\n",
" \"acquired passes predicted (%)\": 100 * bs.predicted.mean(),\n",
" \"predicted, not acquired\": int((~ps.acquired).sum()),\n",
- " \"predicted, not acquired, south of 60 deg S (%)\": 100 * np.mean(ps[~ps.acquired].point_id.map(points.geometry.y) < -60),\n",
- " \"acquired, not predicted: Sun below horizon\": int((~bs.predicted & (bs.sun_elevation < 0)).sum()),\n",
- " \"acquired, not predicted: Sun 0 to 5 deg\": int((~bs.predicted & (bs.sun_elevation >= 0) & (bs.sun_elevation < 5)).sum()),\n",
- " \"acquired, not predicted: Sun above 5 deg\": int((~bs.predicted & (bs.sun_elevation >= 5)).sum()),\n",
+ " \"predicted, not acquired, south of 60 deg S (%)\": 100\n",
+ " * np.mean(ps[~ps.acquired].point_id.map(points.geometry.y) < -60),\n",
+ " \"acquired, not predicted: Sun below horizon\": int(\n",
+ " (~bs.predicted & (bs.sun_elevation < 0)).sum()\n",
+ " ),\n",
+ " \"acquired, not predicted: Sun 0 to 5 deg\": int(\n",
+ " (~bs.predicted & (bs.sun_elevation >= 0) & (bs.sun_elevation < 5)).sum()\n",
+ " ),\n",
+ " \"acquired, not predicted: Sun above 5 deg\": int(\n",
+ " (~bs.predicted & (bs.sun_elevation >= 5)).sum()\n",
+ " ),\n",
" }\n",
"pd.DataFrame(rows3).T.round(1)"
]
diff --git a/docs/validation/ValidateSpaceCOSMIC2.ipynb b/docs/validation/ValidateSpaceCOSMIC2.ipynb
new file mode 100644
index 00000000..2d672854
--- /dev/null
+++ b/docs/validation/ValidateSpaceCOSMIC2.ipynb
@@ -0,0 +1,1549 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "8333bf4f",
+ "metadata": {},
+ "source": [
+ "# Satellite-to-Satellite Validation: COSMIC-2\n",
+ "\n",
+ "This notebook validates TAT-C's satellite-to-satellite analysis (`collect_space_observations`, see the [Space-Based Coverage](../examples/CollectSpace.ipynb) example) against the radio occultations recorded by the [COSMIC-2](https://www.cosmic.ucar.edu/what-we-do/cosmic-2) constellation on 14 May 2026. `collect_space_observations` finds the periods when one satellite can observe another, as by a sensor or a radio link, subject to the slant range and to the Earth's occlusion of the straight line of sight between them: its minimum WGS 84 geodetic altitude must be at least `min_grazing_altitude`.\n",
+ "\n",
+ "A radio occultation (RO) is such an occlusion event. As a GNSS satellite sets behind the Earth as seen from a receiver in low Earth orbit (or rises from behind it), the line of sight between them sweeps down (or up) through the atmosphere, which the receiver profiles from the bending of the signal. TAT-C's RO analysis (`collect_ro_observations`, validated in [Radio Occultation Validation: COSMIC-2](ValidateROCOSMIC2.ipynb)) reports each occultation at the time the straight line reaches its `sample_elevation`, by default -80 km (refraction is not modeled). With `min_grazing_altitude` set to the same -80 km, each window of `collect_space_observations` from a receiver to a transmitter should therefore start with a rising occultation and end with a setting one. The satellites' recorded positions provide an independent truth for the occlusion constraint, the search for window edges, and the analysis of many pairs of satellites at once:\n",
+ "\n",
+ "1. **Observed occultations.** Is every occultation COSMIC-2 recorded at the edge of a window: a start if rising, an end if setting?\n",
+ "2. **Timing.** How closely do the edges match the true times, from the recorded positions?\n",
+ "3. **Consistency with the RO analysis.** Do the edges match the occultations of `collect_ro_observations` one for one?\n",
+ "4. **Symmetry, resolution, and cost.** Are the windows the same in both directions and for any `min_duration`, and how long does the analysis take?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "940660e8",
+ "metadata": {},
+ "source": [
+ "## Reference Data\n",
+ "\n",
+ "This notebook reuses the data downloaded (and cached in `data/ro`) by the [COSMIC-2 RO validation](ValidateROCOSMIC2.ipynb), which must be run first: the [AWS Registry of Open Data](https://registry.opendata.aws/gnss-ro-opendata/) metadata database, which lists the 5,710 occultations COSMIC-2 recorded on 14 May 2026 with their receiver, transmitter, and rising or setting flag, and the **calibratedPhase** (Level 1A) files of the same seeded random sample of 200 occultations from each constellation (GPS, GLONASS, and Galileo), which record the receiver and transmitter positions at 100 Hz. The orbits are the two-line element sets (TLEs) included with that notebook (`gps_2026-05-14.3le`, `glonass_2026-05-14.3le`, `galileo_2026-05-14.3le`, and `cosmic2_2026-05-14.3le`, from [Space-Track](https://www.space-track.org))."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "52b931ef",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:17:40.439815Z",
+ "iopub.status.busy": "2026-10-26T00:17:40.439534Z",
+ "iopub.status.idle": "2026-10-26T00:18:50.703603Z",
+ "shell.execute_reply": "2026-10-26T00:18:50.702826Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "5710 COSMIC-2 occultations on 14 May 2026, 600 sampled\n"
+ ]
+ }
+ ],
+ "source": [
+ "import os\n",
+ "\n",
+ "import numpy as np\n",
+ "from awsgnssroutils.database import RODatabaseClient\n",
+ "\n",
+ "CONSTELLATIONS = {\"G\": \"GPS\", \"R\": \"GLONASS\", \"E\": \"Galileo\"}\n",
+ "\n",
+ "DATA_DIR = os.path.join(\"data\", \"ro\")\n",
+ "if not os.path.isdir(os.path.join(DATA_DIR, \"metadata\")):\n",
+ " raise FileNotFoundError(\n",
+ " \"run ValidateROCOSMIC2 first, to download the COSMIC-2 occultation database\"\n",
+ " )\n",
+ "rodb = RODatabaseClient(\n",
+ " metadata_root=os.path.join(DATA_DIR, \"metadata\"), version=\"v1.1\"\n",
+ ")\n",
+ "occultations = rodb.query(\n",
+ " missions=\"cosmic2\", datetimerange=(\"2026-05-14\", \"2026-05-14T23:59:59\"), silent=True\n",
+ ")\n",
+ "# the RO validation's seeded random sample of 200 occultations with a retrieval from each constellation\n",
+ "sample = occultations[0:0]\n",
+ "sample._data = []\n",
+ "for k, code in enumerate(CONSTELLATIONS):\n",
+ " pool = occultations.filter(\n",
+ " GNSSconstellations=code,\n",
+ " availablefiletypes=[\"ucar_calibratedPhase\", \"ucar_refractivityRetrieval\"],\n",
+ " )\n",
+ " rng = np.random.default_rng(20260514 + k)\n",
+ " sample._data += [\n",
+ " pool._data[i] for i in sorted(rng.choice(pool.size, 200, replace=False))\n",
+ " ]\n",
+ "sample.size = len(sample._data)\n",
+ "missing = [\n",
+ " r[\"occid\"]\n",
+ " for r in sample._data\n",
+ " if not os.path.exists(\n",
+ " os.path.join(DATA_DIR, os.path.basename(r[\"ucar_calibratedPhase\"]))\n",
+ " )\n",
+ "]\n",
+ "if missing:\n",
+ " raise FileNotFoundError(\n",
+ " f\"run ValidateROCOSMIC2 first, to download {len(missing)} calibratedPhase files\"\n",
+ " )\n",
+ "print(\n",
+ " f\"{occultations.size} COSMIC-2 occultations on 14 May 2026, {sample.size} sampled\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "78c1342a",
+ "metadata": {},
+ "source": [
+ "## Orbits\n",
+ "\n",
+ "The receivers and transmitters are identified, and poor element sets excluded, exactly as in the COSMIC-2 RO validation (see its Test 1): each is matched to the satellite whose element sets best reproduce the positions recorded in the sampled Level 1A files, and element sets more than 20 km from those positions are excluded. This takes about a minute and a half."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "82df8912",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:18:50.705579Z",
+ "iopub.status.busy": "2026-10-26T00:18:50.705245Z",
+ "iopub.status.idle": "2026-10-26T00:18:58.983936Z",
+ "shell.execute_reply": "2026-10-26T00:18:58.983205Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "5 receivers and 77 transmitters identified; unidentified: none\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
satellites
\n",
+ "
median error (km)
\n",
+ "
max error (km)
\n",
+ "
excluded sets
\n",
+ "
closest next-best satellite (km)
\n",
+ "
\n",
+ "
\n",
+ "
group
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
Galileo
\n",
+ "
26
\n",
+ "
1.70
\n",
+ "
15.67
\n",
+ "
0
\n",
+ "
7121.83
\n",
+ "
\n",
+ "
\n",
+ "
GPS
\n",
+ "
32
\n",
+ "
1.28
\n",
+ "
4.66
\n",
+ "
1
\n",
+ "
2151.02
\n",
+ "
\n",
+ "
\n",
+ "
GLONASS
\n",
+ "
19
\n",
+ "
1.23
\n",
+ "
6.88
\n",
+ "
0
\n",
+ "
3901.41
\n",
+ "
\n",
+ "
\n",
+ "
receivers
\n",
+ "
5
\n",
+ "
0.53
\n",
+ "
1.19
\n",
+ "
0
\n",
+ "
3338.26
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " satellites median error (km) max error (km) excluded sets \\\n",
+ "group \n",
+ "Galileo 26 1.70 15.67 0 \n",
+ "GPS 32 1.28 4.66 1 \n",
+ "GLONASS 19 1.23 6.88 0 \n",
+ "receivers 5 0.53 1.19 0 \n",
+ "\n",
+ " closest next-best satellite (km) \n",
+ "group \n",
+ "Galileo 7121.83 \n",
+ "GPS 2151.02 \n",
+ "GLONASS 3901.41 \n",
+ "receivers 3338.26 "
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import collections\n",
+ "from datetime import datetime, timedelta, timezone\n",
+ "\n",
+ "import netCDF4 as nc\n",
+ "import pandas as pd\n",
+ "from joblib import Parallel, delayed\n",
+ "\n",
+ "from tatc.constants import timescale\n",
+ "from tatc.schemas import GeneralPerturbationsOrbit, Satellite\n",
+ "\n",
+ "DAY0 = datetime(2026, 5, 14, tzinfo=timezone.utc)\n",
+ "GPS_EPOCH = datetime(1980, 1, 6, tzinfo=timezone.utc)\n",
+ "GPS_UTC_OFFSET = 18 # s, GPS time minus UTC in 2026\n",
+ "MAX_ERROR = 20 # km, largest acceptable position error of an element set\n",
+ "N_JOBS = min(16, os.cpu_count()) # parallel worker processes\n",
+ "\n",
+ "# element sets per NORAD catalog number, keyed by epoch (later duplicates win)\n",
+ "tle_lines = [\n",
+ " line.rstrip()\n",
+ " for path in [\n",
+ " \"gps_2026-05-14.3le\",\n",
+ " \"glonass_2026-05-14.3le\",\n",
+ " \"galileo_2026-05-14.3le\",\n",
+ " \"cosmic2_2026-05-14.3le\",\n",
+ " ]\n",
+ " for line in open(path)\n",
+ " if line.strip()\n",
+ "]\n",
+ "element_sets, names = collections.defaultdict(dict), {}\n",
+ "for i in range(0, len(tle_lines), 3):\n",
+ " line1, line2 = tle_lines[i + 1], tle_lines[i + 2]\n",
+ " names[line1[2:7]] = tle_lines[i][2:].strip()\n",
+ " element_sets[line1[2:7]][float(line1[18:32])] = [line1, line2]\n",
+ "\n",
+ "\n",
+ "def to_orbit(sets):\n",
+ " return GeneralPerturbationsOrbit.from_tle(sum((sets[e] for e in sorted(sets)), []))\n",
+ "\n",
+ "\n",
+ "def identify(positions, element_sets, max_error):\n",
+ " \"\"\"Matches recorded Earth-fixed positions [(datetime, m)] to the satellite whose element sets\n",
+ " reproduce them best, keeping that satellite's element sets within max_error (km) of all of them.\n",
+ " Returns the NORAD catalog number, kept element sets, their position errors (km), the next-best\n",
+ " satellite's median error (km), and the number of excluded element sets.\"\"\"\n",
+ " import numpy as np\n",
+ " from skyfield.framelib import itrs\n",
+ "\n",
+ " from tatc.constants import timescale\n",
+ " from tatc.schemas import GeneralPerturbationsOrbit\n",
+ "\n",
+ " ts = timescale.from_datetimes([t for t, _ in positions])\n",
+ " rotation = itrs.rotation_at(ts)\n",
+ " recorded_m = np.array([p for _, p in positions]).T\n",
+ "\n",
+ " def errors(sets):\n",
+ " orbit = GeneralPerturbationsOrbit.from_tle(\n",
+ " sum((sets[e] for e in sorted(sets)), [])\n",
+ " )\n",
+ " p = np.einsum(\n",
+ " \"ij...,j...->i...\",\n",
+ " rotation,\n",
+ " np.array(orbit.get_orbit_track_at_time(ts).position.m),\n",
+ " )\n",
+ " return np.linalg.norm(p - recorded_m, axis=0) / 1e3\n",
+ "\n",
+ " best = {\n",
+ " norad: min(np.median(errors({e: s})) for e, s in sets.items())\n",
+ " for norad, sets in element_sets.items()\n",
+ " }\n",
+ " norad = min(best, key=best.get)\n",
+ " kept = {\n",
+ " e: s\n",
+ " for e, s in element_sets[norad].items()\n",
+ " if errors({e: s}).max() <= max_error\n",
+ " }\n",
+ " return (\n",
+ " norad,\n",
+ " kept,\n",
+ " errors(kept) if kept else None,\n",
+ " sorted(best.values())[1],\n",
+ " len(element_sets[norad]) - len(kept),\n",
+ " )\n",
+ "\n",
+ "\n",
+ "# recorded positions of each receiver and transmitter\n",
+ "recorded = collections.defaultdict(list)\n",
+ "for record in sample._data:\n",
+ " l1 = nc.Dataset(\n",
+ " os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"]))\n",
+ " )\n",
+ " l1.set_auto_mask(False)\n",
+ " for k in [0, l1[\"time\"].size // 2, l1[\"time\"].size - 1]:\n",
+ " t = GPS_EPOCH + timedelta(\n",
+ " seconds=float(l1[\"startTime\"][...]) - GPS_UTC_OFFSET + float(l1[\"time\"][k])\n",
+ " )\n",
+ " recorded[record[\"transmitter\"]].append((t, l1[\"positionGNSS\"][k].astype(float)))\n",
+ " recorded[record[\"receiver\"]].append((t, l1[\"positionLEO\"][k].astype(float)))\n",
+ "\n",
+ "\n",
+ "keys = sorted(recorded)\n",
+ "results = Parallel(n_jobs=N_JOBS)(\n",
+ " delayed(identify)(recorded[key], element_sets, MAX_ERROR) for key in keys\n",
+ ")\n",
+ "rows, satellites = [], {}\n",
+ "for key, (norad, kept, errors, next_best, excluded) in zip(keys, results):\n",
+ " row = {\n",
+ " \"key\": key,\n",
+ " \"NORAD\": norad,\n",
+ " \"name\": names[norad],\n",
+ " \"element sets\": len(kept),\n",
+ " \"excluded sets\": excluded,\n",
+ " }\n",
+ " if kept: # identified: at least one element set reproduces the recorded positions\n",
+ " satellites[key] = Satellite(name=key, orbit=to_orbit(kept))\n",
+ " row.update(\n",
+ " {\"median error (km)\": np.median(errors), \"max error (km)\": errors.max()}\n",
+ " )\n",
+ " row[\"next-best satellite (km)\"] = next_best\n",
+ " rows.append(row)\n",
+ "orbit_check = pd.DataFrame(rows).set_index(\"key\")\n",
+ "orbit_check[\"group\"] = [CONSTELLATIONS.get(k[0], \"receivers\") for k in keys]\n",
+ "receivers = [satellites[k] for k in sorted(satellites) if k.startswith(\"cosmic2\")]\n",
+ "transmitters = [satellites[k] for k in sorted(satellites) if k[0] in CONSTELLATIONS]\n",
+ "unidentified = sorted(k for k in recorded if k not in satellites)\n",
+ "print(\n",
+ " f\"{len(receivers)} receivers and {len(transmitters)} transmitters identified; unidentified: {unidentified or 'none'}\"\n",
+ ")\n",
+ "orbit_check.groupby(\"group\", sort=False).agg(\n",
+ " **{\n",
+ " \"satellites\": (\"NORAD\", \"size\"),\n",
+ " \"median error (km)\": (\"median error (km)\", \"median\"),\n",
+ " \"max error (km)\": (\"max error (km)\", \"max\"),\n",
+ " \"excluded sets\": (\"excluded sets\", \"sum\"),\n",
+ " \"closest next-best satellite (km)\": (\"next-best satellite (km)\", \"min\"),\n",
+ " }\n",
+ ").round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b07acb00",
+ "metadata": {},
+ "source": [
+ "As in the RO validation, all 5 receivers and 77 transmitters (32 GPS, 19 GLONASS, and 26 Galileo satellites) are identified, and one poor GPS element set is excluded.\n",
+ "\n",
+ "## Windows\n",
+ "\n",
+ "`collect_space_observations` is run from the 5 receivers to the 77 transmitters over the day, with a `min_grazing_altitude` of -80 km, no range limits, and the default `min_duration` (60 s). Within the day, each window's start is a rising occultation, when the line of sight rises above -80 km, and each window's end a setting one; windows that span the start or end of the day are cut off there."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "bc62ed7b",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:18:58.986000Z",
+ "iopub.status.busy": "2026-10-26T00:18:58.985678Z",
+ "iopub.status.idle": "2026-10-26T00:19:01.834319Z",
+ "shell.execute_reply": "2026-10-26T00:19:01.833592Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "5265 windows of 385 receiver-transmitter pairs found in 2.8 s, with 10073 edges within the day (5034 rising, 5039 setting)\n"
+ ]
+ }
+ ],
+ "source": [
+ "import time\n",
+ "\n",
+ "from tatc.analysis import collect_space_observations\n",
+ "\n",
+ "SAMPLE_ELEVATION = -80e3 # m, collect_ro_observations' default sample_elevation\n",
+ "DAY1 = DAY0 + timedelta(days=1)\n",
+ "\n",
+ "tic = time.perf_counter()\n",
+ "links = collect_space_observations(\n",
+ " receivers,\n",
+ " DAY0,\n",
+ " DAY1,\n",
+ " to_satellites=transmitters,\n",
+ " min_grazing_altitude=SAMPLE_ELEVATION,\n",
+ ")\n",
+ "elapsed = time.perf_counter() - tic\n",
+ "# window edges within the day: a start is a rising occultation, an end a setting one\n",
+ "edges = pd.concat(\n",
+ " [\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"receiver\": links.from_satellite,\n",
+ " \"transmitter\": links.to_satellite,\n",
+ " \"time\": links[key],\n",
+ " \"rising\": key == \"start\",\n",
+ " }\n",
+ " )\n",
+ " for key in [\"start\", \"end\"]\n",
+ " ],\n",
+ " ignore_index=True,\n",
+ ")\n",
+ "edges = edges[(edges.time > DAY0) & (edges.time < DAY1)].sort_values(\n",
+ " \"time\", ignore_index=True\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def nearest_edges(events, tolerance):\n",
+ " \"\"\"The nearest window edge (index in edges, or -1 if none within tolerance, in s) of the same receiver\n",
+ " and transmitter to each event (by its time), and the time from the event to the edge (s).\n",
+ " \"\"\"\n",
+ " index, offset = np.full(len(events), -1), np.full(len(events), np.nan)\n",
+ " groups = edges.groupby([\"receiver\", \"transmitter\"]).indices\n",
+ " for key, rows in events.groupby([\"receiver\", \"transmitter\"]).indices.items():\n",
+ " if key not in groups:\n",
+ " continue\n",
+ " candidates = groups[key]\n",
+ " dt = (\n",
+ " edges.time.values[candidates][None, :] - events.time.values[rows][:, None]\n",
+ " ) / np.timedelta64(1, \"s\")\n",
+ " j = np.argmin(np.abs(dt), axis=1)\n",
+ " d = dt[np.arange(len(rows)), j]\n",
+ " ok = np.abs(d) <= tolerance\n",
+ " index[rows[ok]] = candidates[j[ok]]\n",
+ " offset[rows[ok]] = d[ok]\n",
+ " return index, offset\n",
+ "\n",
+ "\n",
+ "print(\n",
+ " f\"{len(links)} windows of {len(receivers) * len(transmitters)} receiver-transmitter pairs found in {elapsed:.1f} s, \"\n",
+ " f\"with {len(edges)} edges within the day ({edges.rising.sum()} rising, {(~edges.rising).sum()} setting)\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "999de648",
+ "metadata": {},
+ "source": [
+ "## Test 1: Observed Occultations\n",
+ "\n",
+ "Each occultation in the database is paired with the nearest window edge of the same receiver and transmitter within 10 minutes of its time stamp. The time stamp (the minute in the `occid`) marks the start of the record for a setting occultation and its end for a rising one, when the straight line is near 130 km for GPS (see the RO validation). A setting occultation's edge (a window's end) should therefore follow its time stamp, and a rising occultation's edge (a window's start) precede it, by one to a few minutes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "d67d410c",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:19:01.836411Z",
+ "iopub.status.busy": "2026-10-26T00:19:01.836187Z",
+ "iopub.status.idle": "2026-10-26T00:19:01.898792Z",
+ "shell.execute_reply": "2026-10-26T00:19:01.898110Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "5710 observed occultations; without a window edge within 10 minutes:\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ " at an edge of the right kind \\\n",
+ "constellation direction \n",
+ "GLONASS setting 955 955 \n",
+ " rising 866 866 \n",
+ "GPS setting 1485 1485 \n",
+ " rising 1199 1199 \n",
+ "Galileo setting 980 980 \n",
+ " rising 214 214 \n",
+ "\n",
+ " edge minus time stamp, 1% (s) 50% (s) 99% (s) \n",
+ "constellation direction \n",
+ "GLONASS setting 68.0 117.7 213.7 \n",
+ " rising -227.0 -113.8 -62.7 \n",
+ "GPS setting 68.8 116.9 209.7 \n",
+ " rising -207.6 -111.6 -63.8 \n",
+ "Galileo setting 68.2 115.7 220.6 \n",
+ " rising -211.0 -111.8 -63.4 "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "observed = pd.DataFrame(\n",
+ " [\n",
+ " {\n",
+ " \"occid\": r[\"occid\"],\n",
+ " \"receiver\": r[\"receiver\"],\n",
+ " \"transmitter\": r[\"transmitter\"],\n",
+ " \"constellation\": CONSTELLATIONS[r[\"transmitter\"][0]],\n",
+ " \"time\": datetime.fromisoformat(r[\"time\"]).replace(tzinfo=timezone.utc),\n",
+ " \"setting\": bool(r[\"setting\"]),\n",
+ " }\n",
+ " for r in occultations._data\n",
+ " if r[\"transmitter\"][0] in CONSTELLATIONS\n",
+ " ]\n",
+ ")\n",
+ "observed[\"edge\"], observed[\"offset\"] = nearest_edges(observed, 600)\n",
+ "at_edge = observed.edge >= 0\n",
+ "observed[\"right kind\"] = at_edge & (\n",
+ " edges.rising.values[observed.edge.clip(lower=0)] != observed.setting\n",
+ ")\n",
+ "observed[\"direction\"] = observed.setting.map({True: \"setting\", False: \"rising\"})\n",
+ "print(\n",
+ " f\"{len(observed)} observed occultations; without a window edge within 10 minutes:\"\n",
+ ")\n",
+ "display(observed.loc[~at_edge, [\"occid\", \"direction\", \"time\"]])\n",
+ "observed[at_edge].groupby([\"constellation\", \"direction\"], sort=False).agg(\n",
+ " **{\n",
+ " \"at an edge\": (\"occid\", \"size\"),\n",
+ " \"of the right kind\": (\"right kind\", \"sum\"),\n",
+ " \"edge minus time stamp, 1% (s)\": (\"offset\", lambda x: x.quantile(0.01)),\n",
+ " \"50% (s)\": (\"offset\", \"median\"),\n",
+ " \"99% (s)\": (\"offset\", lambda x: x.quantile(0.99)),\n",
+ " }\n",
+ ").round(1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6447ec62",
+ "metadata": {},
+ "source": [
+ "All 5,699 occultations whose straight line reaches -80 km within the day are at a window edge of the right kind: setting occultations at a window's end, 68 to 221 s after their time stamp, and rising ones at a window's start, 63 to 227 s before it (1st to 99th percentiles, for every constellation). The other 11 were recorded within 2 minutes of midnight, so their straight lines reach -80 km on the previous or next day, outside the analysis; the RO validation excludes them too."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dbfd1b34",
+ "metadata": {},
+ "source": [
+ "## Test 2: Timing\n",
+ "\n",
+ "For each sampled occultation, the true time at which the straight line reaches -80 km is computed from the recorded receiver and transmitter positions (subsampled to 10 Hz) with TAT-C's tangent point routine, as in the RO validation's Test 4, and paired with the nearest window edge within 60 s. To explain the differences, the along-track errors of the receiver's and transmitter's orbits are also computed at the middle of each occultation, from the recorded positions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "c265b0b7",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:19:01.900711Z",
+ "iopub.status.busy": "2026-10-26T00:19:01.900493Z",
+ "iopub.status.idle": "2026-10-26T00:19:06.484704Z",
+ "shell.execute_reply": "2026-10-26T00:19:06.484011Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "600 sampled occultations, 594 reaching -80 km within the day\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
sampled
\n",
+ "
at an edge of the right kind
\n",
+ "
mean edge minus truth (s)
\n",
+ "
median |edge minus truth| (s)
\n",
+ "
95% (s)
\n",
+ "
max (s)
\n",
+ "
transmitter along-track error, median (km)
\n",
+ "
receiver along-track error, median (km)
\n",
+ "
\n",
+ "
\n",
+ "
constellation
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
GPS
\n",
+ "
199
\n",
+ "
199
\n",
+ "
-0.053
\n",
+ "
0.085
\n",
+ "
0.249
\n",
+ "
0.499
\n",
+ "
-0.326
\n",
+ "
0.061
\n",
+ "
\n",
+ "
\n",
+ "
GLONASS
\n",
+ "
198
\n",
+ "
198
\n",
+ "
-0.019
\n",
+ "
0.074
\n",
+ "
0.252
\n",
+ "
0.409
\n",
+ "
-0.103
\n",
+ "
0.011
\n",
+ "
\n",
+ "
\n",
+ "
Galileo
\n",
+ "
197
\n",
+ "
197
\n",
+ "
-0.062
\n",
+ "
0.093
\n",
+ "
0.295
\n",
+ "
0.554
\n",
+ "
-1.037
\n",
+ "
0.051
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sampled at an edge of the right kind \\\n",
+ "constellation \n",
+ "GPS 199 199 \n",
+ "GLONASS 198 198 \n",
+ "Galileo 197 197 \n",
+ "\n",
+ " mean edge minus truth (s) median |edge minus truth| (s) \\\n",
+ "constellation \n",
+ "GPS -0.053 0.085 \n",
+ "GLONASS -0.019 0.074 \n",
+ "Galileo -0.062 0.093 \n",
+ "\n",
+ " 95% (s) max (s) transmitter along-track error, median (km) \\\n",
+ "constellation \n",
+ "GPS 0.249 0.499 -0.326 \n",
+ "GLONASS 0.252 0.409 -0.103 \n",
+ "Galileo 0.295 0.554 -1.037 \n",
+ "\n",
+ " receiver along-track error, median (km) \n",
+ "constellation \n",
+ "GPS 0.061 \n",
+ "GLONASS 0.011 \n",
+ "Galileo 0.051 "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from pyproj import Transformer\n",
+ "from skyfield.framelib import itrs\n",
+ "\n",
+ "from tatc.utils import compute_tangent_point\n",
+ "\n",
+ "TO_LLA = Transformer.from_crs(\"EPSG:4978\", \"EPSG:4979\", always_xy=True)\n",
+ "\n",
+ "\n",
+ "def crossing(t, h, value):\n",
+ " \"\"\"Time at which h(t) first crosses value (linear interpolation), or NaN.\"\"\"\n",
+ " c = np.nonzero(np.diff(np.sign(h - value)))[0]\n",
+ " if len(c) == 0:\n",
+ " return np.nan\n",
+ " j = c[0]\n",
+ " return t[j] + (value - h[j]) / (h[j + 1] - h[j]) * (t[j + 1] - t[j])\n",
+ "\n",
+ "\n",
+ "def along_track_error(satellite, t, recorded):\n",
+ " \"\"\"Along-track error (km) of a satellite's orbit at datetime t, from its recorded Earth-fixed position (m).\"\"\"\n",
+ " ts = timescale.from_datetimes([t, t + timedelta(seconds=1)])\n",
+ " p = np.einsum(\n",
+ " \"ij...,j...->i...\",\n",
+ " itrs.rotation_at(ts),\n",
+ " satellite.orbit.to_gp_orbit().get_orbit_track_at_time(ts).position.m,\n",
+ " )\n",
+ " direction = (p[:, 1] - p[:, 0]) / np.linalg.norm(p[:, 1] - p[:, 0])\n",
+ " return (p[:, 0] - recorded) @ direction / 1e3\n",
+ "\n",
+ "\n",
+ "# true time at which each sampled occultation's straight line reaches -80 km, from the recorded receiver\n",
+ "# and transmitter positions (subsampled to 10 Hz), and the orbits' along-track errors at mid-occultation\n",
+ "rows = []\n",
+ "for record in sample._data:\n",
+ " l1 = nc.Dataset(\n",
+ " os.path.join(DATA_DIR, os.path.basename(record[\"ucar_calibratedPhase\"]))\n",
+ " )\n",
+ " l1.set_auto_mask(False)\n",
+ " t, rx, tx = l1[\"time\"][:], l1[\"positionLEO\"][:].T, l1[\"positionGNSS\"][:].T\n",
+ " ok = (\n",
+ " (np.abs(t) < 1e10)\n",
+ " & np.all(np.abs(rx) < 1e10, axis=0)\n",
+ " & np.all(np.abs(tx) < 1e10, axis=0)\n",
+ " )\n",
+ " i = np.nonzero(ok)[0][::10]\n",
+ " start = float(l1[\"startTime\"][...])\n",
+ " # GPS seconds since 1980-01-06 are TAI - 19 s\n",
+ " heights = TO_LLA.transform(*compute_tangent_point(rx[:, i], tx[:, i] - rx[:, i]))[2]\n",
+ " t_80 = crossing(t[i], np.asarray(heights), SAMPLE_ELEVATION)\n",
+ " k = i[len(i) // 2]\n",
+ " t_mid = GPS_EPOCH + timedelta(seconds=start - GPS_UTC_OFFSET + float(t[k]))\n",
+ " rows.append(\n",
+ " {\n",
+ " \"occid\": record[\"occid\"],\n",
+ " \"receiver\": record[\"receiver\"],\n",
+ " \"transmitter\": record[\"transmitter\"],\n",
+ " \"constellation\": CONSTELLATIONS[record[\"transmitter\"][0]],\n",
+ " \"setting\": bool(record[\"setting\"]),\n",
+ " \"time\": (\n",
+ " GPS_EPOCH + timedelta(seconds=start - GPS_UTC_OFFSET + t_80)\n",
+ " if np.isfinite(t_80)\n",
+ " else pd.NaT\n",
+ " ),\n",
+ " \"receiver along-track error (km)\": along_track_error(\n",
+ " satellites[record[\"receiver\"]], t_mid, rx[:, k]\n",
+ " ),\n",
+ " \"transmitter along-track error (km)\": along_track_error(\n",
+ " satellites[record[\"transmitter\"]], t_mid, tx[:, k]\n",
+ " ),\n",
+ " }\n",
+ " )\n",
+ "truth = pd.DataFrame(rows)\n",
+ "truth[\"time\"] = pd.to_datetime(truth.time, utc=True)\n",
+ "in_day = (truth.time >= DAY0) & (truth.time < DAY1)\n",
+ "print(\n",
+ " f\"{len(truth)} sampled occultations, {int(in_day.sum())} reaching -80 km within the day\"\n",
+ ")\n",
+ "truth = truth[in_day].reset_index(drop=True)\n",
+ "truth[\"edge\"], truth[\"offset\"] = nearest_edges(truth, 60)\n",
+ "truth[\"right kind\"] = (truth.edge >= 0) & (\n",
+ " edges.rising.values[truth.edge.clip(lower=0)] != truth.setting\n",
+ ")\n",
+ "truth[\"abs offset\"] = truth.offset.abs()\n",
+ "truth.groupby(\"constellation\", sort=False).agg(\n",
+ " **{\n",
+ " \"sampled\": (\"occid\", \"size\"),\n",
+ " \"at an edge of the right kind\": (\"right kind\", \"sum\"),\n",
+ " \"mean edge minus truth (s)\": (\"offset\", \"mean\"),\n",
+ " \"median |edge minus truth| (s)\": (\"abs offset\", \"median\"),\n",
+ " \"95% (s)\": (\"abs offset\", lambda x: x.quantile(0.95)),\n",
+ " \"max (s)\": (\"abs offset\", \"max\"),\n",
+ " \"transmitter along-track error, median (km)\": (\n",
+ " \"transmitter along-track error (km)\",\n",
+ " \"median\",\n",
+ " ),\n",
+ " \"receiver along-track error, median (km)\": (\n",
+ " \"receiver along-track error (km)\",\n",
+ " \"median\",\n",
+ " ),\n",
+ " }\n",
+ ").round(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "846b31ec",
+ "metadata": {},
+ "source": [
+ "Every sampled occultation is at a window edge of the right kind, within 0.25 to 0.30 s of the true time (95th percentile of the absolute difference, by constellation). On average the edges come 0.02 s (GLONASS) to 0.06 s (Galileo) early, for rising and setting occultations alike:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "f62be92b",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:19:06.486437Z",
+ "iopub.status.busy": "2026-10-26T00:19:06.486269Z",
+ "iopub.status.idle": "2026-10-26T00:19:06.495139Z",
+ "shell.execute_reply": "2026-10-26T00:19:06.494516Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
mean edge minus truth (s)
\n",
+ "
setting
\n",
+ "
rising
\n",
+ "
\n",
+ "
\n",
+ "
constellation
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
GPS
\n",
+ "
-0.045
\n",
+ "
-0.062
\n",
+ "
\n",
+ "
\n",
+ "
GLONASS
\n",
+ "
-0.001
\n",
+ "
-0.036
\n",
+ "
\n",
+ "
\n",
+ "
Galileo
\n",
+ "
-0.059
\n",
+ "
-0.080
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "mean edge minus truth (s) setting rising\n",
+ "constellation \n",
+ "GPS -0.045 -0.062\n",
+ "GLONASS -0.001 -0.036\n",
+ "Galileo -0.059 -0.080"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "truth.assign(\n",
+ " direction=truth.setting.map({True: \"setting\", False: \"rising\"})\n",
+ ").pivot_table(\n",
+ " index=\"constellation\",\n",
+ " columns=\"direction\",\n",
+ " values=\"offset\",\n",
+ " aggfunc=\"mean\",\n",
+ " sort=False,\n",
+ ").rename_axis(\n",
+ " columns=\"mean edge minus truth (s)\"\n",
+ ").round(\n",
+ " 3\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "234975d9",
+ "metadata": {},
+ "source": [
+ "The bias has the same sign for rising and setting occultations, so it is not an offset in the altitude of the line of sight, which would shift rising and setting edges in opposite directions. Nor does it come from the orbits: the receivers' orbits are accurate along track (median errors of 0.01 to 0.06 km), and the [PlanetiQ RO validation](ValidateROPlanetiQ.ipynb), with the same transmitter orbits, finds no bias (0.00 to 0.02 s). It appears specific to COSMIC-2's recorded times or positions; its cause is not identified here.\n",
+ "\n",
+ "`collect_ro_observations` reports the same times (Test 3), and the RO validation's Test 4 finds the same differences."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e85c4431",
+ "metadata": {},
+ "source": [
+ "## Test 3: Consistency with the RO Analysis\n",
+ "\n",
+ "`collect_ro_observations` is run for the same receivers and transmitters with a 1 s `time_step` and a `max_yaw` of 90 deg, which removes the receiver antenna's yaw limit, so that it reports every occultation the geometry allows. It finds each RO observation's arc from its tangent point track, samples the arc every second within an elevation range (by default -200 to 60 km), and interpolates the time at -80 km (`time`); `collect_space_observations` instead finds the window edges directly, from the minimum altitude of the line of sight. Each RO `time` is paired with the nearest window edge of the same receiver and transmitter within 1 s. The run takes about a minute in parallel worker processes, and its results are cached in `data/ro`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "05f85d61",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:19:06.496791Z",
+ "iopub.status.busy": "2026-10-26T00:19:06.496577Z",
+ "iopub.status.idle": "2026-10-26T00:19:07.218508Z",
+ "shell.execute_reply": "2026-10-26T00:19:07.217789Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "10154 RO occultations (max_yaw = 90 deg), 10073 window edges\n",
+ "paired one to one within 1 s: 10073; |RO time minus edge| median 0.14 ms, max 1.69 ms\n",
+ "RO occultations without an edge: 81\n",
+ " cut off at the start or end of the day: 25\n",
+ " not cut off, straight line never crossing -80 km: 56 (lowest elevations, km: -200, -200, -200, -200, -200, -200, -200, -174, -152, -142, -130, -126, -109, -97, -79, -79, -79, -79, -76, -76, -72, -72, -62, -62, -39, -39, -37, -37, -31, -31, -21, -21, -17, -17, -4, -4, 3, 3, 20, 20, 25, 25, 32, 32, 33, 33, 37, 37, 42, 42, 48, 48, 57, 57, 60, 60)\n",
+ " other: 0\n",
+ "edges without an RO occultation: 0, of which within an RO observation paired with another edge: 0\n",
+ "paired occultations disagreeing on direction: 0 of 10073 (0 of the 359 more than 75 deg from fore/aft)\n"
+ ]
+ }
+ ],
+ "source": [
+ "import shapely\n",
+ "\n",
+ "from tatc.analysis import collect_ro_observations\n",
+ "\n",
+ "\n",
+ "def folded(yaw):\n",
+ " \"\"\"Yaw angle from the nearer of the forward and rearward directions (deg).\"\"\"\n",
+ " yaw = np.abs(np.asarray(yaw, dtype=float))\n",
+ " return np.minimum(yaw, 180 - yaw)\n",
+ "\n",
+ "\n",
+ "cache = os.path.join(DATA_DIR, \"predicted_cosmic2_yaw90_gnss.pkl\")\n",
+ "if not os.path.exists(cache):\n",
+ " # one parallel task per receiver, all transmitters together\n",
+ " results = Parallel(n_jobs=N_JOBS)(\n",
+ " delayed(collect_ro_observations)(\n",
+ " receiver,\n",
+ " transmitters,\n",
+ " DAY0,\n",
+ " DAY1,\n",
+ " time_step=timedelta(seconds=1),\n",
+ " max_yaw=90,\n",
+ " )\n",
+ " for receiver in receivers\n",
+ " )\n",
+ " pd.concat(results, ignore_index=True).to_pickle(cache)\n",
+ "ro = pd.read_pickle(cache)\n",
+ "ro[\"edge\"], ro[\"offset\"] = nearest_edges(ro, 1)\n",
+ "paired = ro[ro.edge >= 0]\n",
+ "if paired.edge.duplicated().any():\n",
+ " raise ValueError(\"an edge is paired with more than one RO occultation\")\n",
+ "# tangent point elevations of each RO observation's samples\n",
+ "elevations = ro.geometry.apply(\n",
+ " lambda g: shapely.get_coordinates(g, include_z=True)[:, 2]\n",
+ ")\n",
+ "crosses = elevations.apply(lambda z: z.min() <= SAMPLE_ELEVATION <= z.max())\n",
+ "truncated = (ro.start == DAY0) | (ro.end == DAY1)\n",
+ "unpaired = ro.edge < 0\n",
+ "# edges without an RO occultation, and whether each falls within an RO observation paired with another edge\n",
+ "unpaired_edges = edges.drop(paired.edge)\n",
+ "within = [\n",
+ " (\n",
+ " (paired.receiver == e.receiver)\n",
+ " & (paired.transmitter == e.transmitter)\n",
+ " & (paired.start <= e.time)\n",
+ " & (paired.end >= e.time)\n",
+ " ).any()\n",
+ " for e in unpaired_edges.itertuples()\n",
+ "]\n",
+ "disagree = paired[\n",
+ " paired.is_rising.astype(bool).values != edges.rising.values[paired.edge]\n",
+ "]\n",
+ "print(f\"{len(ro)} RO occultations (max_yaw = 90 deg), {len(edges)} window edges\")\n",
+ "print(\n",
+ " f\"paired one to one within 1 s: {len(paired)}; |RO time minus edge| median {1e3 * paired.offset.abs().median():.2f} ms, max {1e3 * paired.offset.abs().max():.2f} ms\"\n",
+ ")\n",
+ "print(f\"RO occultations without an edge: {int(unpaired.sum())}\")\n",
+ "print(f\" cut off at the start or end of the day: {int((unpaired & truncated).sum())}\")\n",
+ "print(\n",
+ " f\" not cut off, straight line never crossing -80 km: {int((unpaired & ~truncated & ~crosses).sum())} (lowest elevations, km: {', '.join(f'{z.min() / 1e3:.0f}' for z in elevations[unpaired & ~truncated].sort_values(key=lambda s: s.apply(min)))})\"\n",
+ ")\n",
+ "print(f\" other: {int((unpaired & ~truncated & crosses).sum())}\")\n",
+ "print(\n",
+ " f\"edges without an RO occultation: {len(unpaired_edges)}, of which within an RO observation paired with another edge: {sum(within)}\"\n",
+ ")\n",
+ "abeam = folded(paired.rx_tx_yaw) > 75\n",
+ "print(\n",
+ " f\"paired occultations disagreeing on direction: {len(disagree)} of {len(paired)} \"\n",
+ " f\"({int(disagree.index.isin(paired.index[abeam]).sum())} of the {int(abeam.sum())} more than 75 deg from fore/aft)\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "85c8a388",
+ "metadata": {},
+ "source": [
+ "The two analyses agree: every one of the 10,073 window edges pairs one to one with an RO occultation, with times within 2 ms (median 0.14 ms), and they agree on the direction (rising or setting) of every one, including the 359 nearly abeam of the receiver. The other 81 RO occultations never cross -80 km within the day: 25 are cut off at the start or end of the day before reaching it, and 56 are parts of grazing occultations, nearly side-on to the receiver, whose straight line turns back before reaching -80 km (42, at lowest between -79 and 60 km) or stays below it (14). As documented, `collect_ro_observations` reports each with a `time` and `position` at the end of its profile nearest -80 km.\n",
+ "\n",
+ "`collect_ro_observations` splits a grazing occultation, whose tangent point descends and rises again, into a setting and a rising observation where the tangent point turns, and determines each observation's direction from its profile. This comparison exposed two earlier approximations: a grazing occultation crossing -80 km twice was reported as one observation with one `time`, which left 54 edges without an RO occultation, and the direction, approximated from the transmitter's pitch at the observation's first sample, was wrong for 20 occultations (0.2%), all 75 to 90 deg from the receiver's forward or rearward direction: outside COSMIC-2's yaw limit of 65 deg, but within PlanetiQ's (85 deg)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6dbd417a",
+ "metadata": {},
+ "source": [
+ "## Test 4: Symmetry, Resolution, and Cost\n",
+ "\n",
+ "The line-of-sight constraints are symmetric, so the windows from the transmitters to the receivers should be the same as those from the receivers to the transmitters. All 82 satellites are also analyzed together (with `to_satellites` omitted), as 6,642 ordered pairs, including those between receivers and between transmitters, of which the receiver-transmitter windows should again be the same. Finally, `min_duration` sets the sampling of the search for window edges (at half its value): windows shorter than `min_duration` may be missed, but longer ones should be found at any value."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "907da483",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:19:07.220595Z",
+ "iopub.status.busy": "2026-10-26T00:19:07.220314Z",
+ "iopub.status.idle": "2026-10-26T00:19:32.735616Z",
+ "shell.execute_reply": "2026-10-26T00:19:32.734889Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "shortest window within the day: 462 s\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
pairs
\n",
+ "
windows
\n",
+ "
receiver-transmitter windows
\n",
+ "
largest difference (s)
\n",
+ "
time (s)
\n",
+ "
\n",
+ "
\n",
+ "
analysis
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
transmitters to receivers
\n",
+ "
385
\n",
+ "
5265
\n",
+ "
5265
\n",
+ "
0.000
\n",
+ "
2.706
\n",
+ "
\n",
+ "
\n",
+ "
all satellites, both directions
\n",
+ "
6642
\n",
+ "
20602
\n",
+ "
5265
\n",
+ "
0.000
\n",
+ "
6.605
\n",
+ "
\n",
+ "
\n",
+ "
min_duration = 5 s
\n",
+ "
385
\n",
+ "
5265
\n",
+ "
5265
\n",
+ "
0.001
\n",
+ "
4.678
\n",
+ "
\n",
+ "
\n",
+ "
min_duration = 20 s
\n",
+ "
385
\n",
+ "
5265
\n",
+ "
5265
\n",
+ "
0.001
\n",
+ "
3.147
\n",
+ "
\n",
+ "
\n",
+ "
min_duration = 60 s
\n",
+ "
385
\n",
+ "
5265
\n",
+ "
5265
\n",
+ "
0.000
\n",
+ "
2.762
\n",
+ "
\n",
+ "
\n",
+ "
min_duration = 300 s
\n",
+ "
385
\n",
+ "
5265
\n",
+ "
5265
\n",
+ "
0.001
\n",
+ "
2.729
\n",
+ "
\n",
+ "
\n",
+ "
min_duration = 1200 s
\n",
+ "
385
\n",
+ "
5262
\n",
+ "
5262
\n",
+ "
NaN
\n",
+ "
2.863
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " pairs windows receiver-transmitter windows \\\n",
+ "analysis \n",
+ "transmitters to receivers 385 5265 5265 \n",
+ "all satellites, both directions 6642 20602 5265 \n",
+ "min_duration = 5 s 385 5265 5265 \n",
+ "min_duration = 20 s 385 5265 5265 \n",
+ "min_duration = 60 s 385 5265 5265 \n",
+ "min_duration = 300 s 385 5265 5265 \n",
+ "min_duration = 1200 s 385 5262 5262 \n",
+ "\n",
+ " largest difference (s) time (s) \n",
+ "analysis \n",
+ "transmitters to receivers 0.000 2.706 \n",
+ "all satellites, both directions 0.000 6.605 \n",
+ "min_duration = 5 s 0.001 4.678 \n",
+ "min_duration = 20 s 0.001 3.147 \n",
+ "min_duration = 60 s 0.000 2.762 \n",
+ "min_duration = 300 s 0.001 2.729 \n",
+ "min_duration = 1200 s NaN 2.863 "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def windows(frame, reverse=False):\n",
+ " \"\"\"Windows by receiver and transmitter (observed and observing satellites, if reverse) and start.\"\"\"\n",
+ " columns = (\n",
+ " [\"to_satellite\", \"from_satellite\"]\n",
+ " if reverse\n",
+ " else [\"from_satellite\", \"to_satellite\"]\n",
+ " )\n",
+ " return (\n",
+ " frame[columns + [\"start\", \"end\"]]\n",
+ " .set_axis([\"receiver\", \"transmitter\", \"start\", \"end\"], axis=1)\n",
+ " .sort_values([\"receiver\", \"transmitter\", \"start\"], ignore_index=True)\n",
+ " )\n",
+ "\n",
+ "\n",
+ "def difference(a, b):\n",
+ " \"\"\"Largest difference of window start or end (s) between two sets of windows, or None if they differ in number.\"\"\"\n",
+ " if (\n",
+ " len(a) != len(b)\n",
+ " or not (a[[\"receiver\", \"transmitter\"]] == b[[\"receiver\", \"transmitter\"]])\n",
+ " .all()\n",
+ " .all()\n",
+ " ):\n",
+ " return None\n",
+ " return max(\n",
+ " (a.start - b.start).abs().max(), (a.end - b.end).abs().max()\n",
+ " ).total_seconds()\n",
+ "\n",
+ "\n",
+ "rows = []\n",
+ "tic = time.perf_counter()\n",
+ "reverse = collect_space_observations(\n",
+ " transmitters,\n",
+ " DAY0,\n",
+ " DAY1,\n",
+ " to_satellites=receivers,\n",
+ " min_grazing_altitude=SAMPLE_ELEVATION,\n",
+ ")\n",
+ "rows.append(\n",
+ " {\n",
+ " \"analysis\": \"transmitters to receivers\",\n",
+ " \"pairs\": len(transmitters) * len(receivers),\n",
+ " \"windows\": len(reverse),\n",
+ " \"receiver-transmitter windows\": len(reverse),\n",
+ " \"largest difference (s)\": difference(\n",
+ " windows(links), windows(reverse, reverse=True)\n",
+ " ),\n",
+ " \"time (s)\": time.perf_counter() - tic,\n",
+ " }\n",
+ ")\n",
+ "tic = time.perf_counter()\n",
+ "everything = collect_space_observations(\n",
+ " receivers + transmitters, DAY0, DAY1, min_grazing_altitude=SAMPLE_ELEVATION\n",
+ ")\n",
+ "elapsed = time.perf_counter() - tic\n",
+ "subset = everything[\n",
+ " everything.from_satellite.str.startswith(\"cosmic2\")\n",
+ " & everything.to_satellite.str[0].isin(list(CONSTELLATIONS))\n",
+ "]\n",
+ "n = len(receivers) + len(transmitters)\n",
+ "rows.append(\n",
+ " {\n",
+ " \"analysis\": \"all satellites, both directions\",\n",
+ " \"pairs\": n * (n - 1),\n",
+ " \"windows\": len(everything),\n",
+ " \"receiver-transmitter windows\": len(subset),\n",
+ " \"largest difference (s)\": difference(windows(links), windows(subset)),\n",
+ " \"time (s)\": elapsed,\n",
+ " }\n",
+ ")\n",
+ "for seconds in [5, 20, 60, 300, 1200]:\n",
+ " tic = time.perf_counter()\n",
+ " result = collect_space_observations(\n",
+ " receivers,\n",
+ " DAY0,\n",
+ " DAY1,\n",
+ " to_satellites=transmitters,\n",
+ " min_grazing_altitude=SAMPLE_ELEVATION,\n",
+ " min_duration=timedelta(seconds=seconds),\n",
+ " )\n",
+ " rows.append(\n",
+ " {\n",
+ " \"analysis\": f\"min_duration = {seconds} s\",\n",
+ " \"pairs\": len(receivers) * len(transmitters),\n",
+ " \"windows\": len(result),\n",
+ " \"receiver-transmitter windows\": len(result),\n",
+ " \"largest difference (s)\": difference(windows(links), windows(result)),\n",
+ " \"time (s)\": time.perf_counter() - tic,\n",
+ " }\n",
+ " )\n",
+ "inner = links[(links.start > DAY0) & (links.end < DAY1)]\n",
+ "print(\n",
+ " f\"shortest window within the day: {(inner.end - inner.start).min().total_seconds():.0f} s\"\n",
+ ")\n",
+ "pd.DataFrame(rows).set_index(\"analysis\").round(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a4cde0e2",
+ "metadata": {},
+ "source": [
+ "The windows are the same in both directions, and the receiver-transmitter windows are the same within the analysis of all 82 satellites. They are also the same (within 1 ms) for every `min_duration` from 5 to 300 s, since the shortest window within the day lasts nearly 8 minutes; at 1,200 s, 3 windows are missed, as documented. The analysis is fast: about 3 s for the 385 receiver-transmitter pairs over a day, and 7 s for all 6,642 pairs, including the closest approach in each window."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "220ea385",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "\n",
+ "| Test | Result |\n",
+ "| --- | --- |\n",
+ "| 1. Observed occultations | All 5,699 occultations reaching -80 km within the day at a window edge of the right kind (setting at a window's end, rising at its start) |\n",
+ "| 2. Timing | Edges within 0.25 to 0.30 s of the true times (95th percentile); a bias of 0.02 to 0.06 s early, specific to COSMIC-2 |\n",
+ "| 3. Consistency with `collect_ro_observations` | All 10,073 edges paired one to one with RO occultations within 2 ms, with the same direction; the other 81 occultations never cross -80 km within the day |\n",
+ "| 4. Symmetry, resolution, and cost | The same windows in both directions, within the analysis of all satellites, and for `min_duration` from 5 to 300 s; about 3 s for 385 pairs over a day, 7 s for 6,642 |\n",
+ "\n",
+ "**TAT-C's satellite-to-satellite occlusion is validated against COSMIC-2.** With published orbits, `collect_space_observations` places every occultation COSMIC-2 recorded on this day at the edge of a window of the right kind, within a few tenths of a second of the true time (limited by orbit accuracy), and agrees with `collect_ro_observations` to a millisecond, while analyzing all of a day's receiver-transmitter pairs in a few seconds.\n",
+ "\n",
+ "**Findings for the RO analysis.** The comparison corrected two properties of `collect_ro_observations` for grazing occultations nearly abeam of the receiver, outside COSMIC-2's yaw limit but within reach of receivers with wider antennas: their direction (`is_rising`), and their splitting into a setting and a rising observation where the tangent point turns, so that an occultation crossing -80 km twice is reported with both crossings (Test 3). Observations whose straight line never crosses -80 km are reported, as documented, at the end of the profile nearest -80 km.\n",
+ "\n",
+ "**Next steps:**\n",
+ "\n",
+ "1. *Range and brief windows.* The companion notebooks validate the slant range constraints against precise orbits ([GRACE-FO](ValidateSpaceGRACEFO.ipynb)) and brief windows against predicted close approaches ([SOCRATES](ValidateSpaceSOCRATES.ipynb)).\n",
+ "2. *Pointing limits.* `collect_space_observations` does not model the observing satellite's pointing limits, such as an antenna's field of view: its windows include the occultations outside COSMIC-2's yaw limit of 65 deg, which `collect_ro_observations` excludes with `max_yaw`.\n",
+ "\n",
+ "**Limitations.** This study covers one day and one constellation of receivers in low-inclination orbits (24 deg). The occlusion constraint is tested at one altitude (-80 km) and without range limits, and the timing (Test 2) uses random samples of 200 occultations per constellation."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/validation/ValidateSpaceGRACEFO.ipynb b/docs/validation/ValidateSpaceGRACEFO.ipynb
new file mode 100644
index 00000000..9ef1097b
--- /dev/null
+++ b/docs/validation/ValidateSpaceGRACEFO.ipynb
@@ -0,0 +1,1195 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "4c0a51c3",
+ "metadata": {},
+ "source": [
+ "# Satellite-to-Satellite Validation: GRACE-FO\n",
+ "\n",
+ "This notebook validates TAT-C's satellite-to-satellite analysis (`collect_space_observations`, see the [Space-Based Coverage](../examples/CollectSpace.ipynb) example) against the precise orbits of the two [GRACE-FO](https://gracefo.jpl.nasa.gov/) satellites over a week, 17 to 23 September 2026. The satellites follow each other in the same near-polar orbit, at an altitude of about 490 km and roughly 175 to 180 km apart, so the line of sight between them is always clear of the Earth, but its length and its minimum altitude vary around each orbit. A companion notebook, [Satellite-to-Satellite Validation: COSMIC-2](ValidateSpaceCOSMIC2.ipynb), validates the Earth's occlusion of the line of sight against radio occultations; this one validates the slant range constraints (`min_range` and `max_range`) and the occlusion constraint at an altitude well above the surface (`min_grazing_altitude`), and the orbit track positions they depend on:\n",
+ "\n",
+ "1. **Orbits.** How closely do published orbits, as propagated by TAT-C (`collect_orbit_track` in Earth-fixed coordinates), reproduce each satellite's precise orbit?\n",
+ "2. **Range.** How accurately does TAT-C compute the range between the satellites?\n",
+ "3. **Range windows.** Does `collect_space_observations` find the periods when the range is within limits?\n",
+ "4. **Occlusion windows.** Does it find the periods when the line of sight stays above a given altitude?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1492e69c",
+ "metadata": {},
+ "source": [
+ "## Reference Data\n",
+ "\n",
+ "The GRACE-FO Level-1B data (`GRACEFO_L1B_ASCII_GRAV_JPL_RL04`, from [PO.DAAC](https://podaac.jpl.nasa.gov/), free [NASA Earthdata Login](https://urs.earthdata.nasa.gov/) account required) include each satellite's precise orbit (**GNV1B**), determined from its GPS receiver to a few centimeters: Earth-fixed positions and velocities every second, time-tagged in GPS seconds since 1 January 2000, 12:00. The daily archives (about 140 MB each) are downloaded once, and only the orbits of both satellites (GRACE-FO 1, identifier C, and GRACE-FO 2, identifier D) are kept, in a local `data/gracefo` directory.\n",
+ "\n",
+ "TAT-C needs published orbits for the week: the two-line element sets (TLEs) of GRACE-FO 1 and 2 (NORAD 43476 and 43477), obtained from [Space-Track](https://www.space-track.org) (free account required) with the `gp_history` query\n",
+ "\n",
+ "```\n",
+ "https://www.space-track.org/basicspacedata/query/class/gp_history/NORAD_CAT_ID/43476,43477/EPOCH/2026-09-14--2026-10-02/orderby/NORAD_CAT_ID%20asc,EPOCH%20asc/format/3le\n",
+ "```\n",
+ "\n",
+ "and saved as `data/orbits/gracefo_gp_history.tle` (Space-Track's terms do not allow redistributing them, so the notebook raises an error if the file is missing). Element sets were published about every 6 to 8 hours (once a gap of 23 hours), for both satellites within about 25 s of each other. The week starts after a change in both satellites' mean motion on 15 to 17 September, apparently a maneuver."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "10679556",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:19:36.371266Z",
+ "iopub.status.busy": "2026-10-26T00:19:36.371096Z",
+ "iopub.status.idle": "2026-10-26T00:19:36.925854Z",
+ "shell.execute_reply": "2026-10-26T00:19:36.925172Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "604800 positions of each satellite, 2026-09-16 23:59:42+00:00 to 2026-09-23 23:59:41+00:00, every [1.] s\n"
+ ]
+ }
+ ],
+ "source": [
+ "import collections\n",
+ "import io\n",
+ "import tarfile\n",
+ "from datetime import datetime, timedelta, timezone\n",
+ "from pathlib import Path\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "DATA_DIR = Path(\"data\") / \"gracefo\"\n",
+ "DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
+ "TLE_FILE = Path(\"data\") / \"orbits\" / \"gracefo_gp_history.tle\"\n",
+ "if not TLE_FILE.exists():\n",
+ " raise FileNotFoundError(\n",
+ " f\"download the GRACE-FO element sets from Space-Track to {TLE_FILE} (see above)\"\n",
+ " )\n",
+ "DAYS = pd.date_range(\"2026-09-17\", \"2026-09-23\", freq=\"D\", tz=\"UTC\")\n",
+ "J2000_GPS = datetime(\n",
+ " 2000, 1, 1, 12, tzinfo=timezone.utc\n",
+ ") # origin of GRACE-FO's GPS time\n",
+ "GPS_UTC_OFFSET = 18 # s, GPS time minus UTC in 2026\n",
+ "HEADER_END = \"# End of YAML header\"\n",
+ "\n",
+ "\n",
+ "def read_gnv1b(text):\n",
+ " \"\"\"GPS seconds (since 2000-01-01 12:00 GPS time), Earth-fixed positions (m, (3, N)), and Earth-fixed\n",
+ " velocities (m/s, (3, N)) of the records of a GNV1B file.\"\"\"\n",
+ " records = np.loadtxt(\n",
+ " io.StringIO(text.split(HEADER_END, 1)[1]), usecols=(0, 3, 4, 5, 9, 10, 11)\n",
+ " )\n",
+ " return records[:, 0], records[:, 1:4].T, records[:, 4:7].T\n",
+ "\n",
+ "\n",
+ "def cache_path(day):\n",
+ " return DATA_DIR / f\"gnv1b_{day:%Y%m%d}.npz\"\n",
+ "\n",
+ "\n",
+ "missing = [day for day in DAYS if not cache_path(day).exists()]\n",
+ "if missing:\n",
+ " import earthaccess\n",
+ "\n",
+ " earthaccess.login()\n",
+ " for day in missing:\n",
+ " granules = [\n",
+ " g\n",
+ " for g in earthaccess.search_data(\n",
+ " short_name=\"GRACEFO_L1B_ASCII_GRAV_JPL_RL04\",\n",
+ " temporal=(f\"{day:%Y-%m-%d}T00:00:00\", f\"{day:%Y-%m-%d}T23:59:59\"),\n",
+ " )\n",
+ " if g[\"umm\"][\"GranuleUR\"] == f\"gracefo_1B_{day:%Y-%m-%d}_RL04.ascii.noLRI\"\n",
+ " ]\n",
+ " archive = Path(earthaccess.download(granules, str(DATA_DIR))[0])\n",
+ " data = {}\n",
+ " with tarfile.open(archive) as tar:\n",
+ " for member in tar.getmembers():\n",
+ " if member.name.startswith(\"GNV1B_\") and member.name.endswith(\".txt\"):\n",
+ " satellite = member.name.split(\"_\")[\n",
+ " 2\n",
+ " ] # C (GRACE-FO 1) or D (GRACE-FO 2)\n",
+ " t, p, v = read_gnv1b(tar.extractfile(member).read().decode())\n",
+ " (\n",
+ " data[f\"time_{satellite}\"],\n",
+ " data[f\"position_{satellite}\"],\n",
+ " data[f\"velocity_{satellite}\"],\n",
+ " ) = (t, p, v)\n",
+ " np.savez_compressed(cache_path(day), **data)\n",
+ " archive.unlink() # keep only the orbits (each daily archive is about 140 MB)\n",
+ "\n",
+ "cached = [np.load(cache_path(day)) for day in DAYS]\n",
+ "if not all(np.array_equal(d[\"time_C\"], d[\"time_D\"]) for d in cached):\n",
+ " raise ValueError(\"the satellites' orbits are not sampled at the same times\")\n",
+ "gps_time = np.concatenate([d[\"time_C\"] for d in cached])\n",
+ "position = {\n",
+ " k: np.concatenate([d[f\"position_{k}\"] for d in cached], axis=1) for k in \"CD\"\n",
+ "}\n",
+ "velocity = {\n",
+ " k: np.concatenate([d[f\"velocity_{k}\"] for d in cached], axis=1) for k in \"CD\"\n",
+ "}\n",
+ "times = pd.to_datetime(J2000_GPS) + pd.to_timedelta(gps_time - GPS_UTC_OFFSET, unit=\"s\")\n",
+ "print(\n",
+ " f\"{len(times)} positions of each satellite, {times[0]} to {times[-1]}, every {np.unique(np.diff(gps_time))} s\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "20b8df33",
+ "metadata": {},
+ "source": [
+ "## Test 1: Orbits\n",
+ "\n",
+ "Each satellite's orbit is built from its element sets (keeping the later of the one pair published less than a second apart), and `collect_orbit_track` computes its Earth-fixed position at every second of the week, using the element set nearest in time. The difference from the precise orbit is resolved into radial, along-track, and cross-track components (the along-track direction following the velocity relative to inertial space)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "f02cd921",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:19:36.928098Z",
+ "iopub.status.busy": "2026-10-26T00:19:36.927806Z",
+ "iopub.status.idle": "2026-10-26T00:19:46.963003Z",
+ "shell.execute_reply": "2026-10-26T00:19:46.962092Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "GRACE-FO 1: 62 element sets\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "GRACE-FO 2: 62 element sets\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
mean (km)
\n",
+ "
median |error| (km)
\n",
+ "
95% (km)
\n",
+ "
max (km)
\n",
+ "
\n",
+ "
\n",
+ "
satellite
\n",
+ "
error
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
GRACE-FO 1
\n",
+ "
radial
\n",
+ "
0.011
\n",
+ "
0.081
\n",
+ "
0.195
\n",
+ "
0.964
\n",
+ "
\n",
+ "
\n",
+ "
along-track
\n",
+ "
-0.119
\n",
+ "
0.510
\n",
+ "
1.192
\n",
+ "
4.676
\n",
+ "
\n",
+ "
\n",
+ "
cross-track
\n",
+ "
-0.001
\n",
+ "
0.132
\n",
+ "
0.313
\n",
+ "
0.483
\n",
+ "
\n",
+ "
\n",
+ "
GRACE-FO 2
\n",
+ "
radial
\n",
+ "
0.011
\n",
+ "
0.082
\n",
+ "
0.195
\n",
+ "
0.957
\n",
+ "
\n",
+ "
\n",
+ "
along-track
\n",
+ "
-0.120
\n",
+ "
0.513
\n",
+ "
1.186
\n",
+ "
4.624
\n",
+ "
\n",
+ "
\n",
+ "
cross-track
\n",
+ "
-0.001
\n",
+ "
0.133
\n",
+ "
0.309
\n",
+ "
0.483
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " mean (km) median |error| (km) 95% (km) max (km)\n",
+ "satellite error \n",
+ "GRACE-FO 1 radial 0.011 0.081 0.195 0.964\n",
+ " along-track -0.119 0.510 1.192 4.676\n",
+ " cross-track -0.001 0.132 0.313 0.483\n",
+ "GRACE-FO 2 radial 0.011 0.082 0.195 0.957\n",
+ " along-track -0.120 0.513 1.186 4.624\n",
+ " cross-track -0.001 0.133 0.309 0.483"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from tatc.analysis import OrbitCoordinate, OrbitOutput, collect_orbit_track\n",
+ "from tatc.schemas import GeneralPerturbationsOrbit, Satellite\n",
+ "\n",
+ "NAMES = {\"C\": \"GRACE-FO 1\", \"D\": \"GRACE-FO 2\"} # by GNV1B satellite identifier\n",
+ "NORAD = {\"C\": \"43476\", \"D\": \"43477\"}\n",
+ "EARTH_ROTATION = 7.2921150e-5 # rad/s\n",
+ "\n",
+ "# element sets per NORAD catalog number, keyed by epoch\n",
+ "tle_lines = [line.rstrip() for line in open(TLE_FILE) if line.strip()]\n",
+ "element_sets = collections.defaultdict(dict)\n",
+ "for i in range(0, len(tle_lines), 3):\n",
+ " line1, line2 = tle_lines[i + 1], tle_lines[i + 2]\n",
+ " element_sets[line1[2:7]][float(line1[18:32])] = [line1, line2]\n",
+ "\n",
+ "\n",
+ "def to_orbit(sets):\n",
+ " \"\"\"An orbit from element sets, keeping the later of any published less than 1 s apart (duplicates).\"\"\"\n",
+ " epochs = sorted(sets)\n",
+ " kept = [\n",
+ " e\n",
+ " for k, e in enumerate(epochs)\n",
+ " if k + 1 == len(epochs) or epochs[k + 1] - e > 1 / 86400\n",
+ " ]\n",
+ " return GeneralPerturbationsOrbit.from_tle(sum((sets[e] for e in kept), []))\n",
+ "\n",
+ "\n",
+ "def earth_fixed_positions(satellite):\n",
+ " \"\"\"TAT-C's Earth-fixed positions (m, (3, N)) of a satellite at every time of the week.\"\"\"\n",
+ " track = collect_orbit_track(\n",
+ " satellite,\n",
+ " list(times.to_pydatetime()),\n",
+ " instrument_index=None,\n",
+ " coordinates=OrbitCoordinate.ECEF,\n",
+ " orbit_output=OrbitOutput.POSITION_VELOCITY,\n",
+ " )\n",
+ " return np.array([track.geometry.x, track.geometry.y, track.geometry.z])\n",
+ "\n",
+ "\n",
+ "satellites = {\n",
+ " k: Satellite(name=NAMES[k], orbit=to_orbit(element_sets[NORAD[k]])) for k in \"CD\"\n",
+ "}\n",
+ "predicted = {}\n",
+ "rows = []\n",
+ "for k in \"CD\":\n",
+ " predicted[k] = earth_fixed_positions(satellites[k])\n",
+ " error = predicted[k] - position[k]\n",
+ " # radial, along-track, and cross-track directions, from the velocity relative to inertial space\n",
+ " inertial_velocity = velocity[k] + np.cross([0, 0, EARTH_ROTATION], position[k].T).T\n",
+ " radial = position[k] / np.linalg.norm(position[k], axis=0)\n",
+ " cross = np.cross(position[k].T, inertial_velocity.T).T\n",
+ " cross /= np.linalg.norm(cross, axis=0)\n",
+ " along = np.cross(cross.T, radial.T).T\n",
+ " for name, axis in [\n",
+ " (\"radial\", radial),\n",
+ " (\"along-track\", along),\n",
+ " (\"cross-track\", cross),\n",
+ " ]:\n",
+ " component = np.einsum(\"ij,ij->j\", error, axis) / 1e3\n",
+ " rows.append(\n",
+ " {\n",
+ " \"satellite\": NAMES[k],\n",
+ " \"error\": name,\n",
+ " \"mean (km)\": component.mean(),\n",
+ " \"median |error| (km)\": np.median(np.abs(component)),\n",
+ " \"95% (km)\": np.quantile(np.abs(component), 0.95),\n",
+ " \"max (km)\": np.abs(component).max(),\n",
+ " }\n",
+ " )\n",
+ " print(f\"{NAMES[k]}: {len(satellites[k].orbit.elements)} element sets\")\n",
+ "pd.DataFrame(rows).set_index([\"satellite\", \"error\"]).round(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "777be877",
+ "metadata": {},
+ "source": [
+ "TAT-C's positions from the published orbits are within about half a kilometer of the precise orbits along track (median), 1.2 km for 95% of the week, and 4.7 km at most, and within 0.08 km radially and 0.13 km cross track (median), as is typical of TLEs. The mean errors, at most 0.12 km along track and 0.01 km radially and cross track, show no offset in the Earth-fixed coordinates of `collect_orbit_track`, as errors in its conversion between frames would produce. The two satellites' errors are nearly the same, since their element sets are fitted to nearly the same orbit at nearly the same epochs, so their difference, which determines the range, is much smaller (Test 2)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "33c06dbd",
+ "metadata": {},
+ "source": [
+ "## Test 2: Range\n",
+ "\n",
+ "The range between the satellites is computed every second from TAT-C's positions and from the precise orbits. By default, TAT-C uses each satellite's element set nearest in time, so it switches element sets midway between consecutive epochs, separately for each satellite. Since the two satellites' element sets are published about 20 to 25 s apart, for that long after each switch their positions come from element sets of different epochs. The range errors during these switch intervals are reported separately, and again with the satellites switching element sets at common times (`tatc.utils.align_element_switches`, which sets each orbit's `element_switch_times`)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "9d691517",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:19:46.964911Z",
+ "iopub.status.busy": "2026-10-26T00:19:46.964633Z",
+ "iopub.status.idle": "2026-10-26T00:20:07.083554Z",
+ "shell.execute_reply": "2026-10-26T00:20:07.082821Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "true range 174.5 to 181.3 km\n",
+ "28 element set switches, each 22.9 to 23.7 s between the satellites\n",
+ "largest range error during each switch: median 28 m, 1 above 1 km, at most 4.3 km\n",
+ "aligned: 60 and 60 element sets, common switch times\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "from tatc.utils import align_element_switches\n",
+ "\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
+ "\n",
+ "true_range = np.linalg.norm(position[\"C\"] - position[\"D\"], axis=0)\n",
+ "predicted_range = np.linalg.norm(predicted[\"C\"] - predicted[\"D\"], axis=0)\n",
+ "range_error = predicted_range - true_range\n",
+ "\n",
+ "\n",
+ "def switch_times(orbit):\n",
+ " \"\"\"Times at which TAT-C switches element sets: midway between consecutive epochs.\"\"\"\n",
+ " epochs = [element.epoch for element in orbit.elements]\n",
+ " return pd.DatetimeIndex([a + (b - a) / 2 for a, b in zip(epochs[:-1], epochs[1:])])\n",
+ "\n",
+ "\n",
+ "# switch intervals: from one satellite's switch to the other's nearest, during which the satellites'\n",
+ "# positions come from element sets of different epochs\n",
+ "switches = {k: switch_times(satellites[k].orbit) for k in \"CD\"}\n",
+ "intervals = [\n",
+ " (min(a, b), max(a, b))\n",
+ " for a in switches[\"C\"][(switches[\"C\"] > times[0]) & (switches[\"C\"] < times[-1])]\n",
+ " for b in [switches[\"D\"][np.argmin(np.abs(switches[\"D\"] - a))]]\n",
+ "]\n",
+ "at_switch = np.zeros(len(times), dtype=bool)\n",
+ "for a, b in intervals:\n",
+ " at_switch |= (times >= a - pd.Timedelta(seconds=1)) & (\n",
+ " times <= b + pd.Timedelta(seconds=1)\n",
+ " )\n",
+ "durations = np.array([(b - a).total_seconds() for a, b in intervals])\n",
+ "print(f\"true range {true_range.min() / 1e3:.1f} to {true_range.max() / 1e3:.1f} km\")\n",
+ "print(\n",
+ " f\"{len(intervals)} element set switches, each {durations.min():.1f} to {durations.max():.1f} s between the satellites\"\n",
+ ")\n",
+ "peaks = np.array(\n",
+ " [np.abs(range_error[(times >= a) & (times <= b)]).max() for a, b in intervals]\n",
+ ")\n",
+ "print(\n",
+ " f\"largest range error during each switch: median {np.median(peaks):.0f} m, \"\n",
+ " f\"{int((peaks > 1000).sum())} above 1 km, at most {peaks.max() / 1e3:.1f} km\"\n",
+ ")\n",
+ "\n",
+ "# the same orbits, switching element sets at common times\n",
+ "aligned = dict(zip(\"CD\", align_element_switches([satellites[\"C\"], satellites[\"D\"]])))\n",
+ "common = set(aligned[\"C\"].orbit.element_switch_times) == set(\n",
+ " aligned[\"D\"].orbit.element_switch_times\n",
+ ")\n",
+ "print(\n",
+ " f\"aligned: {len(aligned['C'].orbit.elements)} and {len(aligned['D'].orbit.elements)} element sets, \"\n",
+ " f\"{'common' if common else 'different'} switch times\"\n",
+ ")\n",
+ "aligned_range = np.linalg.norm(\n",
+ " earth_fixed_positions(aligned[\"C\"]) - earth_fixed_positions(aligned[\"D\"]), axis=0\n",
+ ")\n",
+ "aligned_error = aligned_range - true_range\n",
+ "display(\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " label: {\n",
+ " \"samples (s)\": int(selected.sum()),\n",
+ " \"mean error (m)\": error[selected].mean(),\n",
+ " \"standard deviation (m)\": error[selected].std(),\n",
+ " \"95% |error| (m)\": np.quantile(np.abs(error[selected]), 0.95),\n",
+ " \"max |error| (m)\": np.abs(error[selected]).max(),\n",
+ " }\n",
+ " for label, error, selected in [\n",
+ " (\"between switches\", range_error, ~at_switch),\n",
+ " (\"during switches\", range_error, at_switch),\n",
+ " (\"during switches, aligned\", aligned_error, at_switch),\n",
+ " (\"whole week, aligned\", aligned_error, np.ones(len(times), dtype=bool)),\n",
+ " ]\n",
+ " }\n",
+ " ).T.round(1)\n",
+ ")\n",
+ "\n",
+ "fig, axes = plt.subplots(2, 1, figsize=(12, 5.5), sharex=True)\n",
+ "axes[0].plot(times, true_range / 1e3, color=\"#1f4e79\", lw=1, label=\"true (GNV1B)\")\n",
+ "axes[0].plot(\n",
+ " times, predicted_range / 1e3, color=\"#d97706\", lw=0.6, label=\"TAT-C (TLEs)\"\n",
+ ")\n",
+ "axes[0].set(ylabel=\"Range (km)\", title=\"Range between GRACE-FO 1 and 2\")\n",
+ "axes[0].legend(loc=\"upper left\")\n",
+ "axes[1].plot(times[~at_switch], range_error[~at_switch], \".\", color=\"#1f4e79\", ms=0.5)\n",
+ "for a, _ in intervals:\n",
+ " axes[1].axvline(a, color=\"#b91c1c\", lw=0.6, alpha=0.5)\n",
+ "axes[1].set(\n",
+ " ylabel=\"TAT-C minus true (m)\",\n",
+ " title=\"Range error between element set switches (red lines: switches)\",\n",
+ ")\n",
+ "fig.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "31c2024c",
+ "metadata": {},
+ "source": [
+ "Between element set switches, TAT-C's range is accurate to 21 m (standard deviation), 47 m for 95% of the week, and 117 m at most, over separations of 174.5 to 181.3 km: some 25 times more accurate than the positions themselves, because the two satellites' errors cancel. The predicted range follows the true range closely, through its oscillation of about ±0.8 km each orbit and its drift of about 0.9 km a day as the satellites separate.\n",
+ "\n",
+ "With independent switches, the element set switches are the exception. TAT-C switched element sets 28 times during the week, about every 6 hours, each time 23 s later for GRACE-FO 2 than for GRACE-FO 1. For those 23 s, the satellites' positions come from element sets of different epochs, whose errors no longer cancel: the range error reached 28 m (median) and, at one switch on 17 September, 4.3 km, where GRACE-FO 1's successive element sets differ by about that much along track.\n",
+ "\n",
+ "Aligning the switches removes these errors. `align_element_switches` groups the two satellites' epochs into publication events, keeps the element sets of the events both satellites share (60 of each satellite's 63, dropping each satellite's duplicate and the sets only one satellite has, all outside this week), and switches both satellites midway between consecutive events. During the former switch intervals, the range error is then 80 m at most, as between switches, and over the whole week the range is accurate to 21 m (standard deviation) and 117 m at most."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b61931c9",
+ "metadata": {},
+ "source": [
+ "## Test 3: Range Windows\n",
+ "\n",
+ "`collect_space_observations` is run from GRACE-FO 1 to GRACE-FO 2 over the week with a `max_range` of 177, 178, or 179 km, or a `min_range` of 178 km, without the occlusion constraint and with the default `min_duration` (60 s), for the satellites switching element sets independently (by default) and at common times (aligned, as in Test 2). As the range drifts through each limit over a day or two, oscillating around each orbit, the windows open and close about twice per orbit. The true windows are found from the precise orbits, by interpolating the range every second, and each true window edge is paired with the nearest predicted edge of the same kind (start or end) within 15 minutes. For each true edge left unpaired, the table reports how far the true range goes past the limit before the nearer neighboring true edge, a measure of how marginal that window (or gap between windows) is."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "aedbf9f4",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:20:07.085485Z",
+ "iopub.status.busy": "2026-10-26T00:20:07.085156Z",
+ "iopub.status.idle": "2026-10-26T00:20:08.799171Z",
+ "shell.execute_reply": "2026-10-26T00:20:08.798448Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
true edges
\n",
+ "
predicted edges
\n",
+ "
matched
\n",
+ "
|time difference| median (s)
\n",
+ "
95% (s)
\n",
+ "
max (s)
\n",
+ "
unmatched predicted edges
\n",
+ "
of which at switches
\n",
+ "
unmatched true edges
\n",
+ "
their largest true excursion (m)
\n",
+ "
\n",
+ "
\n",
+ "
switch times
\n",
+ "
limit
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
independent
\n",
+ "
max_range = 177 km
\n",
+ "
25.0
\n",
+ "
25.0
\n",
+ "
23.0
\n",
+ "
16.1
\n",
+ "
49.3
\n",
+ "
60.6
\n",
+ "
2.0
\n",
+ "
2.0
\n",
+ "
2.0
\n",
+ "
1.4
\n",
+ "
\n",
+ "
\n",
+ "
max_range = 178 km
\n",
+ "
25.0
\n",
+ "
27.0
\n",
+ "
23.0
\n",
+ "
42.8
\n",
+ "
156.9
\n",
+ "
165.3
\n",
+ "
4.0
\n",
+ "
2.0
\n",
+ "
2.0
\n",
+ "
53.9
\n",
+ "
\n",
+ "
\n",
+ "
max_range = 179 km
\n",
+ "
27.0
\n",
+ "
27.0
\n",
+ "
25.0
\n",
+ "
20.1
\n",
+ "
56.7
\n",
+ "
64.4
\n",
+ "
2.0
\n",
+ "
2.0
\n",
+ "
2.0
\n",
+ "
3.2
\n",
+ "
\n",
+ "
\n",
+ "
min_range = 178 km
\n",
+ "
25.0
\n",
+ "
27.0
\n",
+ "
23.0
\n",
+ "
42.8
\n",
+ "
156.9
\n",
+ "
165.3
\n",
+ "
4.0
\n",
+ "
2.0
\n",
+ "
2.0
\n",
+ "
53.9
\n",
+ "
\n",
+ "
\n",
+ "
aligned
\n",
+ "
max_range = 177 km
\n",
+ "
25.0
\n",
+ "
23.0
\n",
+ "
23.0
\n",
+ "
16.1
\n",
+ "
49.3
\n",
+ "
60.6
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
2.0
\n",
+ "
1.4
\n",
+ "
\n",
+ "
\n",
+ "
max_range = 178 km
\n",
+ "
25.0
\n",
+ "
25.0
\n",
+ "
23.0
\n",
+ "
42.8
\n",
+ "
156.9
\n",
+ "
165.3
\n",
+ "
2.0
\n",
+ "
0.0
\n",
+ "
2.0
\n",
+ "
53.9
\n",
+ "
\n",
+ "
\n",
+ "
max_range = 179 km
\n",
+ "
27.0
\n",
+ "
25.0
\n",
+ "
25.0
\n",
+ "
20.1
\n",
+ "
56.7
\n",
+ "
64.4
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
2.0
\n",
+ "
3.2
\n",
+ "
\n",
+ "
\n",
+ "
min_range = 178 km
\n",
+ "
25.0
\n",
+ "
25.0
\n",
+ "
23.0
\n",
+ "
42.8
\n",
+ "
156.9
\n",
+ "
165.3
\n",
+ "
2.0
\n",
+ "
0.0
\n",
+ "
2.0
\n",
+ "
53.9
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " true edges predicted edges matched \\\n",
+ "switch times limit \n",
+ "independent max_range = 177 km 25.0 25.0 23.0 \n",
+ " max_range = 178 km 25.0 27.0 23.0 \n",
+ " max_range = 179 km 27.0 27.0 25.0 \n",
+ " min_range = 178 km 25.0 27.0 23.0 \n",
+ "aligned max_range = 177 km 25.0 23.0 23.0 \n",
+ " max_range = 178 km 25.0 25.0 23.0 \n",
+ " max_range = 179 km 27.0 25.0 25.0 \n",
+ " min_range = 178 km 25.0 25.0 23.0 \n",
+ "\n",
+ " |time difference| median (s) 95% (s) \\\n",
+ "switch times limit \n",
+ "independent max_range = 177 km 16.1 49.3 \n",
+ " max_range = 178 km 42.8 156.9 \n",
+ " max_range = 179 km 20.1 56.7 \n",
+ " min_range = 178 km 42.8 156.9 \n",
+ "aligned max_range = 177 km 16.1 49.3 \n",
+ " max_range = 178 km 42.8 156.9 \n",
+ " max_range = 179 km 20.1 56.7 \n",
+ " min_range = 178 km 42.8 156.9 \n",
+ "\n",
+ " max (s) unmatched predicted edges \\\n",
+ "switch times limit \n",
+ "independent max_range = 177 km 60.6 2.0 \n",
+ " max_range = 178 km 165.3 4.0 \n",
+ " max_range = 179 km 64.4 2.0 \n",
+ " min_range = 178 km 165.3 4.0 \n",
+ "aligned max_range = 177 km 60.6 0.0 \n",
+ " max_range = 178 km 165.3 2.0 \n",
+ " max_range = 179 km 64.4 0.0 \n",
+ " min_range = 178 km 165.3 2.0 \n",
+ "\n",
+ " of which at switches unmatched true edges \\\n",
+ "switch times limit \n",
+ "independent max_range = 177 km 2.0 2.0 \n",
+ " max_range = 178 km 2.0 2.0 \n",
+ " max_range = 179 km 2.0 2.0 \n",
+ " min_range = 178 km 2.0 2.0 \n",
+ "aligned max_range = 177 km 0.0 2.0 \n",
+ " max_range = 178 km 0.0 2.0 \n",
+ " max_range = 179 km 0.0 2.0 \n",
+ " min_range = 178 km 0.0 2.0 \n",
+ "\n",
+ " their largest true excursion (m) \n",
+ "switch times limit \n",
+ "independent max_range = 177 km 1.4 \n",
+ " max_range = 178 km 53.9 \n",
+ " max_range = 179 km 3.2 \n",
+ " min_range = 178 km 53.9 \n",
+ "aligned max_range = 177 km 1.4 \n",
+ " max_range = 178 km 53.9 \n",
+ " max_range = 179 km 3.2 \n",
+ " min_range = 178 km 53.9 "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from tatc.analysis import collect_space_observations\n",
+ "\n",
+ "START = datetime(2026, 9, 17, tzinfo=timezone.utc)\n",
+ "END = datetime(2026, 9, 23, 23, 59, tzinfo=timezone.utc)\n",
+ "in_window = (times >= START) & (times <= END)\n",
+ "window_times = times[in_window]\n",
+ "seconds = (window_times - window_times[0]).total_seconds().to_numpy()\n",
+ "\n",
+ "\n",
+ "def true_edges(residual):\n",
+ " \"\"\"Window edges where a residual (sampled at window_times) changes sign, by linear interpolation:\n",
+ " starts where it becomes non-positive, ends where it becomes positive.\"\"\"\n",
+ " inside = residual <= 0\n",
+ " j = np.flatnonzero(inside[:-1] != inside[1:])\n",
+ " crossing = seconds[j] - residual[j] / (residual[j + 1] - residual[j]) * (\n",
+ " seconds[j + 1] - seconds[j]\n",
+ " )\n",
+ " return pd.DataFrame(\n",
+ " {\n",
+ " \"time\": window_times[0] + pd.to_timedelta(crossing, unit=\"s\"),\n",
+ " \"start\": inside[j + 1],\n",
+ " }\n",
+ " )\n",
+ "\n",
+ "\n",
+ "def predicted_edges(windows):\n",
+ " \"\"\"Edges of predicted windows within the analysis period.\"\"\"\n",
+ " edges = pd.concat(\n",
+ " [\n",
+ " pd.DataFrame({\"time\": windows.start, \"start\": True}),\n",
+ " pd.DataFrame({\"time\": windows.end, \"start\": False}),\n",
+ " ]\n",
+ " )\n",
+ " inner = (edges.time > pd.Timestamp(START)) & (edges.time < pd.Timestamp(END))\n",
+ " return edges[inner].sort_values(\"time\", ignore_index=True)\n",
+ "\n",
+ "\n",
+ "def near_switch(edge_times, margin=30):\n",
+ " \"\"\"Whether each time is within margin (s) of an element set switch interval.\"\"\"\n",
+ " margin = pd.Timedelta(seconds=margin)\n",
+ " return np.array(\n",
+ " [any(a - margin <= x <= b + margin for a, b in intervals) for x in edge_times]\n",
+ " )\n",
+ "\n",
+ "\n",
+ "def compare(truth, model, residual, tolerance=900):\n",
+ " \"\"\"Pairs each true edge with the nearest predicted edge of the same kind within tolerance (s).\"\"\"\n",
+ " dt = (\n",
+ " model.time.to_numpy()[None, :] - truth.time.to_numpy()[:, None]\n",
+ " ) / np.timedelta64(1, \"s\")\n",
+ " dt = np.where(\n",
+ " truth.start.to_numpy()[:, None] == model.start.to_numpy()[None, :], dt, np.inf\n",
+ " )\n",
+ " j = np.argmin(np.abs(dt), axis=1)\n",
+ " offset = dt[np.arange(len(truth)), j]\n",
+ " matched = np.abs(offset) <= tolerance\n",
+ " extra = model.drop(index=np.unique(j[matched]))\n",
+ " # for each unmatched true edge, how far the true residual goes past zero between it and the nearer\n",
+ " # neighboring true edge (the other edge of a brief window or gap)\n",
+ " bounds = pd.DatetimeIndex([window_times[0], *truth.time, window_times[-1]])\n",
+ " excursion = []\n",
+ " for k in np.flatnonzero(~matched):\n",
+ " before, edge, after = bounds[k], bounds[k + 1], bounds[k + 2]\n",
+ " other = before if edge - before < after - edge else after\n",
+ " span = (window_times >= min(edge, other)) & (window_times <= max(edge, other))\n",
+ " excursion.append(np.abs(residual[span]).max())\n",
+ " return {\n",
+ " \"true edges\": len(truth),\n",
+ " \"predicted edges\": len(model),\n",
+ " \"matched\": int(matched.sum()),\n",
+ " \"|time difference| median (s)\": np.median(np.abs(offset[matched])),\n",
+ " \"95% (s)\": np.quantile(np.abs(offset[matched]), 0.95),\n",
+ " \"max (s)\": np.abs(offset[matched]).max(),\n",
+ " \"unmatched predicted edges\": len(extra),\n",
+ " \"of which at switches\": int(near_switch(extra.time).sum()),\n",
+ " \"unmatched true edges\": int((~matched).sum()),\n",
+ " \"their largest true excursion (m)\": max(excursion) if excursion else np.nan,\n",
+ " }\n",
+ "\n",
+ "\n",
+ "range_in_window = true_range[in_window]\n",
+ "rows = {}\n",
+ "for label, pair in [(\"independent\", satellites), (\"aligned\", aligned)]:\n",
+ " for kind, value in [\n",
+ " (\"max_range\", 177e3),\n",
+ " (\"max_range\", 178e3),\n",
+ " (\"max_range\", 179e3),\n",
+ " (\"min_range\", 178e3),\n",
+ " ]:\n",
+ " residual = (\n",
+ " range_in_window - value if kind == \"max_range\" else value - range_in_window\n",
+ " )\n",
+ " windows = collect_space_observations(\n",
+ " pair[\"C\"],\n",
+ " START,\n",
+ " END,\n",
+ " to_satellites=pair[\"D\"],\n",
+ " min_grazing_altitude=None,\n",
+ " **{kind: value},\n",
+ " )\n",
+ " rows[(label, f\"{kind} = {value / 1e3:.0f} km\")] = compare(\n",
+ " true_edges(residual), predicted_edges(windows), residual\n",
+ " )\n",
+ "pd.DataFrame(rows).T.rename_axis([\"switch times\", \"limit\"]).round(1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f6b20ffb",
+ "metadata": {},
+ "source": [
+ "`collect_space_observations` finds the windows when the range is within limits, with edges within 16 to 43 s (median) and 49 to 157 s (95th percentile) of the true times. The timing errors are large in seconds only because the range changes slowly, by 0.25 m/s (median) and at most 0.55 m/s, so a range error of about 20 m shifts the edges by about a minute, and more where the range turns near the limit. The windows differ in two ways:\n",
+ "\n",
+ "* **Element set switches.** With independent switches, at every limit, the 4.3 km range error at the switch of 17 September creates a spurious gap of 23 s in a window (for `max_range`), or a spurious window (for `min_range`), although the true range was 2 to 4 km from the limit. With aligned switches, there is none.\n",
+ "* **Marginal windows.** At each limit, the true range enters one window (or gap between windows) by only 1.4 to 54 m, which the predicted range misses; at 178 km, the predicted range also opens one window (on 20 September, 21:01 to 21:08) that the true range misses by 2.8 m. Such windows are within the range accuracy of Test 2."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b56ca0bb",
+ "metadata": {},
+ "source": [
+ "## Test 4: Occlusion Windows\n",
+ "\n",
+ "The minimum WGS 84 geodetic altitude of the line of sight between the satellites, its tangent point, varies around each orbit, mostly with latitude, as the Earth's flattening lowers the surface toward the poles. `collect_space_observations` is run with a `min_grazing_altitude` of 450, 460, or 470 km (and no range limits), and its windows are compared with the true windows, found from the precise orbits as in Test 3. With its default `min_grazing_altitude` of 0, the line of sight is never occluded, and a single window should span the week."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "fc5d6a06",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:20:08.801041Z",
+ "iopub.status.busy": "2026-10-26T00:20:08.800809Z",
+ "iopub.status.idle": "2026-10-26T00:20:11.411056Z",
+ "shell.execute_reply": "2026-10-26T00:20:11.410297Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "true minimum altitude of the line of sight: 444.7 to 481.3 km\n",
+ "default constraints (min_grazing_altitude = 0): 1 window(s), 2026-09-17 00:00:00+00:00 to 2026-09-23 23:59:00+00:00\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
true edges
\n",
+ "
predicted edges
\n",
+ "
matched
\n",
+ "
|time difference| median (s)
\n",
+ "
95% (s)
\n",
+ "
max (s)
\n",
+ "
unmatched predicted edges
\n",
+ "
of which at switches
\n",
+ "
unmatched true edges
\n",
+ "
their largest true excursion (m)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
min_grazing_altitude = 450 km
\n",
+ "
431.0
\n",
+ "
431.0
\n",
+ "
431.0
\n",
+ "
6.3
\n",
+ "
15.9
\n",
+ "
47.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
min_grazing_altitude = 460 km
\n",
+ "
215.0
\n",
+ "
215.0
\n",
+ "
215.0
\n",
+ "
2.8
\n",
+ "
6.5
\n",
+ "
28.7
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
min_grazing_altitude = 470 km
\n",
+ "
215.0
\n",
+ "
215.0
\n",
+ "
215.0
\n",
+ "
2.5
\n",
+ "
6.4
\n",
+ "
31.3
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " true edges predicted edges matched \\\n",
+ "min_grazing_altitude = 450 km 431.0 431.0 431.0 \n",
+ "min_grazing_altitude = 460 km 215.0 215.0 215.0 \n",
+ "min_grazing_altitude = 470 km 215.0 215.0 215.0 \n",
+ "\n",
+ " |time difference| median (s) 95% (s) max (s) \\\n",
+ "min_grazing_altitude = 450 km 6.3 15.9 47.0 \n",
+ "min_grazing_altitude = 460 km 2.8 6.5 28.7 \n",
+ "min_grazing_altitude = 470 km 2.5 6.4 31.3 \n",
+ "\n",
+ " unmatched predicted edges \\\n",
+ "min_grazing_altitude = 450 km 0.0 \n",
+ "min_grazing_altitude = 460 km 0.0 \n",
+ "min_grazing_altitude = 470 km 0.0 \n",
+ "\n",
+ " of which at switches unmatched true edges \\\n",
+ "min_grazing_altitude = 450 km 0.0 0.0 \n",
+ "min_grazing_altitude = 460 km 0.0 0.0 \n",
+ "min_grazing_altitude = 470 km 0.0 0.0 \n",
+ "\n",
+ " their largest true excursion (m) \n",
+ "min_grazing_altitude = 450 km NaN \n",
+ "min_grazing_altitude = 460 km NaN \n",
+ "min_grazing_altitude = 470 km NaN "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from pyproj import Transformer\n",
+ "\n",
+ "from tatc.utils import compute_tangent_point\n",
+ "\n",
+ "TO_LLA = Transformer.from_crs(\"EPSG:4978\", \"EPSG:4979\", always_xy=True)\n",
+ "# minimum WGS 84 geodetic altitude of the true line of sight: its tangent point, which lies between the\n",
+ "# satellites at their separation\n",
+ "tangent_point = compute_tangent_point(position[\"C\"], position[\"D\"] - position[\"C\"])\n",
+ "true_altitude = np.asarray(TO_LLA.transform(*tangent_point)[2])[in_window]\n",
+ "print(\n",
+ " f\"true minimum altitude of the line of sight: {true_altitude.min() / 1e3:.1f} to {true_altitude.max() / 1e3:.1f} km\"\n",
+ ")\n",
+ "everything = collect_space_observations(\n",
+ " satellites[\"C\"], START, END, to_satellites=satellites[\"D\"]\n",
+ ")\n",
+ "print(\n",
+ " f\"default constraints (min_grazing_altitude = 0): {len(everything)} window(s), {everything.start.min()} to {everything.end.max()}\"\n",
+ ")\n",
+ "rows = {}\n",
+ "for value in [450e3, 460e3, 470e3]:\n",
+ " residual = value - true_altitude\n",
+ " windows = collect_space_observations(\n",
+ " satellites[\"C\"],\n",
+ " START,\n",
+ " END,\n",
+ " to_satellites=satellites[\"D\"],\n",
+ " min_grazing_altitude=value,\n",
+ " )\n",
+ " rows[f\"min_grazing_altitude = {value / 1e3:.0f} km\"] = compare(\n",
+ " true_edges(residual), predicted_edges(windows), residual\n",
+ " )\n",
+ "pd.DataFrame(rows).T.round(1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8b5f44b0",
+ "metadata": {},
+ "source": [
+ "The occlusion constraint is reproduced at altitude: every true window edge is predicted, and no others, at all three limits (215 to 431 edges over the week), within 2.5 to 6 s (median) and 6 to 16 s (95th percentile) of the true times. The minimum altitude of the line of sight changes much faster than the range, by up to 37 km in a quarter of an orbit as the Earth's flattening (21 km from equator to pole) and the orbit's eccentricity (about ±6 km) combine, so the satellites' position errors shift the edges by only a few seconds, and by up to 47 s where the altitude turns near the limit. The 450 km limit is crossed four times per orbit, the 460 and 470 km limits twice. The element set switches have no visible effect: the minimum altitude depends little on the satellites' separation along track. With the default `min_grazing_altitude` of 0, a single window spans the week."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eefa1a7e",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "\n",
+ "| Test | Result |\n",
+ "| --- | --- |\n",
+ "| 1. Orbits | Published orbits within 0.5 km along track (median; 4.7 km at most), 0.08 km radially, and 0.13 km cross track of the precise orbits; no offset in the Earth-fixed coordinates of `collect_orbit_track` |\n",
+ "| 2. Range | Within 21 m (standard deviation) and 117 m (at most) between element set switches; up to 4.3 km during the 23 s of each switch, unless the switches are aligned |\n",
+ "| 3. Range windows | Edges within 16 to 43 s (median), limited by the slow change of range; one spurious 23 s gap or window from an element set switch (none with aligned switches), and one marginal window per limit (within about 50 m of it) missed |\n",
+ "| 4. Occlusion windows | All 215 to 431 edges per limit predicted, and no others, within 2.5 to 6 s (median) |\n",
+ "\n",
+ "**TAT-C's slant range and occlusion constraints are validated against GRACE-FO.** From published orbits, TAT-C computes the range between two satellites flying in formation to about 20 m, far better than their positions, and `collect_space_observations` finds the windows within range limits and above an altitude accordingly, in about a second of computation for a week.\n",
+ "\n",
+ "**Element set switches in formations.** By default, TAT-C switches each satellite's element set midway between its epochs, independently for each satellite. When the satellites' element sets are published at slightly different times, as here and for most formations and constellations, their relative positions jump for the seconds between the switches, by up to the difference between successive element sets (here up to 4.3 km, for 23 s), and can create spurious windows or gaps when a range limit is near the true range. Analyses of satellites flying in formation should align their switches with `tatc.utils.align_element_switches`, which removes these jumps (Tests 2 and 3).\n",
+ "\n",
+ "**Next steps:**\n",
+ "\n",
+ "1. *Brief windows.* The [SOCRATES](ValidateSpaceSOCRATES.ipynb) notebook tests windows of about a second, at the close approaches between satellites.\n",
+ "2. *Formations.* Compare the relative motion of TAT-C's generated formations (such as `TrainConstellation` and `MOGConstellation`) with that of GRACE-FO and other formations.\n",
+ "\n",
+ "**Limitations.** This study covers one week and one pair of satellites in the same orbit at a nearly constant separation (175 to 181 km). The range accuracy reflects their common orbit errors, which cancel, and would be lower for satellites in different orbits."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/validation/ValidateSpaceSOCRATES.ipynb b/docs/validation/ValidateSpaceSOCRATES.ipynb
new file mode 100644
index 00000000..dbd19c5f
--- /dev/null
+++ b/docs/validation/ValidateSpaceSOCRATES.ipynb
@@ -0,0 +1,707 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "339ffa88",
+ "metadata": {},
+ "source": [
+ "# Satellite-to-Satellite Validation: SOCRATES\n",
+ "\n",
+ "This notebook tests TAT-C's satellite-to-satellite analysis (`collect_space_observations`) on very brief windows: the close approaches between satellites, which pass within a few kilometers of each other at up to 15 km/s, so that they stay within a range limit of 10 km for as little as a second. The reference is CelesTrak's [SOCRATES](https://celestrak.org/SOCRATES/) (Satellite Orbital Conjunction Reports Assessing Threatening Encounters in Space), which lists the close approaches predicted from published two-line element sets (TLEs) over the following week, with their time and range of closest approach. SOCRATES and TAT-C both propagate TLEs with SGP4, so this is a comparison of two implementations from the same element sets, rather than with truth: it tests TAT-C's propagation and its search for windows at the extremes of brevity. Two companion notebooks validate the range and occlusion constraints with truth: [COSMIC-2](ValidateSpaceCOSMIC2.ipynb) (radio occultations) and [GRACE-FO](ValidateSpaceGRACEFO.ipynb) (precise orbits).\n",
+ "\n",
+ "1. **Closest approach.** Do TAT-C's propagated orbits reproduce SOCRATES's times and ranges of closest approach?\n",
+ "2. **Brief windows.** Does `collect_space_observations` find every window at least `min_duration` long, as documented, and how many shorter ones?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b6ca8c3c",
+ "metadata": {},
+ "source": [
+ "## Reference Data\n",
+ "\n",
+ "SOCRATES publishes only its current run (three runs a day). The run of 25 October 2026 (06:00 UTC) listed 195,380 close approaches within 5 km over the following week, each with the two objects, the time and range of closest approach (`TCA` and `TCA_RANGE`), their relative speed, and the days from each object's element set epoch to the closest approach (`DSE_1` and `DSE_2`, to 0.001 day), which identify the element sets used. CelesTrak's element sets of active satellites, downloaded the same day, match those epochs (within 60 s) for both objects of 79,845 approaches. A seeded random sample of 100 of them in each of five relative speed bands (0 to 0.1, 0.1 to 1, 1 to 5, 5 to 10, and 10 to 16 km/s), and the element sets of their 732 satellites, are included with this notebook (`socrates_2026-10-25.csv` and `socrates_2026-10-25.tle`, data from CelesTrak). If a newer SOCRATES run (`sort-minRange.csv`) and active element sets (`active.tle`, `gp.php?GROUP=active&FORMAT=tle`) are saved in a local `data/socrates` directory, the notebook draws a new sample from them.\n",
+ "\n",
+ "The approaches of the slowest band are between satellites flying in formation or nearly the same orbit, such as Starlink satellites of the same orbital shell, whose range changes slowly and repeatedly around the orbit; the fastest are between satellites in crossing orbits."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "1c5de2d0",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:09:03.664656Z",
+ "iopub.status.busy": "2026-10-26T00:09:03.664395Z",
+ "iopub.status.idle": "2026-10-26T00:09:04.786380Z",
+ "shell.execute_reply": "2026-10-26T00:09:04.785664Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "79845 of 195380 approaches with matching element sets\n",
+ "500 approaches of 732 satellites, 2026-10-25 06:16 to 2026-11-01 05:44\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
approaches
\n",
+ "
minimum range, median (km)
\n",
+ "
relative speed, median (km/s)
\n",
+ "
days since epoch, max
\n",
+ "
\n",
+ "
\n",
+ "
band
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0 to 0.1 km/s
\n",
+ "
100
\n",
+ "
1.950
\n",
+ "
0.003
\n",
+ "
10.693
\n",
+ "
\n",
+ "
\n",
+ "
0.1 to 1 km/s
\n",
+ "
100
\n",
+ "
3.528
\n",
+ "
0.442
\n",
+ "
10.901
\n",
+ "
\n",
+ "
\n",
+ "
1 to 5 km/s
\n",
+ "
100
\n",
+ "
3.305
\n",
+ "
3.012
\n",
+ "
8.505
\n",
+ "
\n",
+ "
\n",
+ "
5 to 10 km/s
\n",
+ "
100
\n",
+ "
3.525
\n",
+ "
7.635
\n",
+ "
8.350
\n",
+ "
\n",
+ "
\n",
+ "
10 to 16 km/s
\n",
+ "
100
\n",
+ "
3.647
\n",
+ "
14.212
\n",
+ "
10.699
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " approaches minimum range, median (km) \\\n",
+ "band \n",
+ "0 to 0.1 km/s 100 1.950 \n",
+ "0.1 to 1 km/s 100 3.528 \n",
+ "1 to 5 km/s 100 3.305 \n",
+ "5 to 10 km/s 100 3.525 \n",
+ "10 to 16 km/s 100 3.647 \n",
+ "\n",
+ " relative speed, median (km/s) days since epoch, max \n",
+ "band \n",
+ "0 to 0.1 km/s 0.003 10.693 \n",
+ "0.1 to 1 km/s 0.442 10.901 \n",
+ "1 to 5 km/s 3.012 8.505 \n",
+ "5 to 10 km/s 7.635 8.350 \n",
+ "10 to 16 km/s 14.212 10.699 "
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from datetime import datetime, timedelta, timezone\n",
+ "from pathlib import Path\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "SAMPLE_FILE = Path(\"socrates_2026-10-25.csv\")\n",
+ "TLE_FILE = Path(\"socrates_2026-10-25.tle\")\n",
+ "SNAPSHOT_DIR = (\n",
+ " Path(\"data\") / \"socrates\"\n",
+ ") # optional: a fresh SOCRATES run and active element sets\n",
+ "BANDS = [-0.01, 0.1, 1, 5, 10, 16] # km/s, relative speed bands\n",
+ "LABELS = [\n",
+ " \"0 to 0.1 km/s\",\n",
+ " \"0.1 to 1 km/s\",\n",
+ " \"1 to 5 km/s\",\n",
+ " \"5 to 10 km/s\",\n",
+ " \"10 to 16 km/s\",\n",
+ "]\n",
+ "\n",
+ "\n",
+ "def epoch(line1):\n",
+ " \"\"\"Epoch of a TLE from its first line.\"\"\"\n",
+ " return datetime(2000 + int(line1[18:20]), 1, 1, tzinfo=timezone.utc) + timedelta(\n",
+ " days=float(line1[20:32]) - 1\n",
+ " )\n",
+ "\n",
+ "\n",
+ "if (SNAPSHOT_DIR / \"sort-minRange.csv\").exists() and (\n",
+ " SNAPSHOT_DIR / \"active.tle\"\n",
+ ").exists():\n",
+ " # resample from a SOCRATES run: approaches whose element sets (epochs, from the days since epoch at the\n",
+ " # time of closest approach, to 0.001 day) are those in the active satellites' element sets\n",
+ " run = pd.read_csv(SNAPSHOT_DIR / \"sort-minRange.csv\")\n",
+ " lines = [\n",
+ " line.rstrip() for line in open(SNAPSHOT_DIR / \"active.tle\") if line.strip()\n",
+ " ]\n",
+ " element_sets = {\n",
+ " int(lines[i + 1][2:7]): lines[i : i + 3] for i in range(0, len(lines), 3)\n",
+ " }\n",
+ " tca = pd.to_datetime(run.TCA, utc=True)\n",
+ " matched = np.ones(len(run), dtype=bool)\n",
+ " for k in (1, 2):\n",
+ " epochs = pd.to_datetime(\n",
+ " run[f\"NORAD_CAT_ID_{k}\"].map(\n",
+ " lambda n: epoch(element_sets[n][1]) if n in element_sets else None\n",
+ " ),\n",
+ " utc=True,\n",
+ " )\n",
+ " matched &= (\n",
+ " (epochs - (tca - pd.to_timedelta(run[f\"DSE_{k}\"], unit=\"D\")))\n",
+ " .abs()\n",
+ " .le(pd.Timedelta(seconds=60))\n",
+ " .to_numpy()\n",
+ " )\n",
+ " print(f\"{matched.sum()} of {len(run)} approaches with matching element sets\")\n",
+ " candidates = run[matched]\n",
+ " sample = (\n",
+ " candidates.groupby(pd.cut(candidates.TCA_RELATIVE_SPEED, BANDS), observed=True)\n",
+ " .sample(100, random_state=20261025)\n",
+ " .sort_values(\"TCA\")\n",
+ " .reset_index(drop=True)\n",
+ " )\n",
+ " sample.to_csv(SAMPLE_FILE, index=False)\n",
+ " ids = sorted(set(sample.NORAD_CAT_ID_1) | set(sample.NORAD_CAT_ID_2))\n",
+ " TLE_FILE.write_text(\"\\n\".join(line for n in ids for line in element_sets[n]) + \"\\n\")\n",
+ "sample = pd.read_csv(SAMPLE_FILE)\n",
+ "sample[\"tca\"] = pd.to_datetime(sample.TCA, utc=True)\n",
+ "sample[\"band\"] = pd.cut(sample.TCA_RELATIVE_SPEED, BANDS, labels=LABELS)\n",
+ "sample[\"days since epoch\"] = sample[[\"DSE_1\", \"DSE_2\"]].max(axis=1)\n",
+ "lines = [line.rstrip() for line in open(TLE_FILE) if line.strip()]\n",
+ "tles = {int(lines[i + 1][2:7]): lines[i + 1 : i + 3] for i in range(0, len(lines), 3)}\n",
+ "print(\n",
+ " f\"{len(sample)} approaches of {len(tles)} satellites, {sample.tca.min():%Y-%m-%d %H:%M} to {sample.tca.max():%Y-%m-%d %H:%M}\"\n",
+ ")\n",
+ "sample.groupby(\"band\", observed=True).agg(\n",
+ " approaches=(\"TCA\", \"size\"),\n",
+ " **{\n",
+ " \"minimum range, median (km)\": (\"TCA_RANGE\", \"median\"),\n",
+ " \"relative speed, median (km/s)\": (\"TCA_RELATIVE_SPEED\", \"median\"),\n",
+ " \"days since epoch, max\": (\"days since epoch\", \"max\"),\n",
+ " },\n",
+ ").round(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cee75b1e",
+ "metadata": {},
+ "source": [
+ "## Test 1: Closest Approach\n",
+ "\n",
+ "`collect_space_observations` reports the closest approach of the satellites in each window: its time (`closest_time`) and slant range (`closest_range`), the least range among the samples of its search refined to 0.1 ms. It is run for each approach over an hour centered on SOCRATES's time of closest approach, with a `max_range` of 10 km (within which every sampled approach passes), no occlusion constraint, and a `min_duration` of 1 s, and the closest approach of the window nearest SOCRATES's is compared with it. SOCRATES reports ranges to a meter and times to a millisecond."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "ad52d59d",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:09:04.788250Z",
+ "iopub.status.busy": "2026-10-26T00:09:04.787999Z",
+ "iopub.status.idle": "2026-10-26T00:09:27.425431Z",
+ "shell.execute_reply": "2026-10-26T00:09:27.424629Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "22 approaches differ by more than 10 m in range, 91% involving Starlink (all approaches: 59%), 6.6 days after epoch (median; all approaches: 5.1)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
|range difference|, median (m)
\n",
+ "
95% (m)
\n",
+ "
max (m)
\n",
+ "
|time difference|, median (ms)
\n",
+ "
95% (ms)
\n",
+ "
\n",
+ "
\n",
+ "
band
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0 to 0.1 km/s
\n",
+ "
0.30
\n",
+ "
3.19
\n",
+ "
666.68
\n",
+ "
20.52
\n",
+ "
479.25
\n",
+ "
\n",
+ "
\n",
+ "
0.1 to 1 km/s
\n",
+ "
0.64
\n",
+ "
14.29
\n",
+ "
37.21
\n",
+ "
0.31
\n",
+ "
0.96
\n",
+ "
\n",
+ "
\n",
+ "
1 to 5 km/s
\n",
+ "
0.70
\n",
+ "
13.52
\n",
+ "
161.25
\n",
+ "
0.25
\n",
+ "
1.00
\n",
+ "
\n",
+ "
\n",
+ "
5 to 10 km/s
\n",
+ "
0.75
\n",
+ "
9.75
\n",
+ "
73.91
\n",
+ "
0.23
\n",
+ "
1.15
\n",
+ "
\n",
+ "
\n",
+ "
10 to 16 km/s
\n",
+ "
0.31
\n",
+ "
1.38
\n",
+ "
59.60
\n",
+ "
0.25
\n",
+ "
0.59
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " |range difference|, median (m) 95% (m) max (m) \\\n",
+ "band \n",
+ "0 to 0.1 km/s 0.30 3.19 666.68 \n",
+ "0.1 to 1 km/s 0.64 14.29 37.21 \n",
+ "1 to 5 km/s 0.70 13.52 161.25 \n",
+ "5 to 10 km/s 0.75 9.75 73.91 \n",
+ "10 to 16 km/s 0.31 1.38 59.60 \n",
+ "\n",
+ " |time difference|, median (ms) 95% (ms) \n",
+ "band \n",
+ "0 to 0.1 km/s 20.52 479.25 \n",
+ "0.1 to 1 km/s 0.31 0.96 \n",
+ "1 to 5 km/s 0.25 1.00 \n",
+ "5 to 10 km/s 0.23 1.15 \n",
+ "10 to 16 km/s 0.25 0.59 "
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from tatc.analysis import collect_space_observations\n",
+ "from tatc.constants import timescale\n",
+ "from tatc.schemas import GeneralPerturbationsOrbit, Satellite\n",
+ "\n",
+ "satellites = {\n",
+ " n: Satellite(name=str(n), orbit=GeneralPerturbationsOrbit.from_tle(tle))\n",
+ " for n, tle in tles.items()\n",
+ "}\n",
+ "\n",
+ "\n",
+ "def slant_range(a, b, times):\n",
+ " \"\"\"Range (m) between two satellites at times (list of datetimes).\"\"\"\n",
+ " t = timescale.from_datetimes(list(times))\n",
+ " return np.linalg.norm(\n",
+ " a.orbit.get_orbit_track_at_time(t).position.m\n",
+ " - b.orbit.get_orbit_track_at_time(t).position.m,\n",
+ " axis=0,\n",
+ " )\n",
+ "\n",
+ "\n",
+ "LIMIT = 10e3 # m, max_range\n",
+ "HALF_WINDOW = timedelta(minutes=30) # analysis period around each closest approach\n",
+ "\n",
+ "rows = []\n",
+ "for approach in sample.itertuples():\n",
+ " a, b = satellites[approach.NORAD_CAT_ID_1], satellites[approach.NORAD_CAT_ID_2]\n",
+ " tca = approach.tca.to_pydatetime()\n",
+ " windows = collect_space_observations(\n",
+ " a,\n",
+ " tca - HALF_WINDOW,\n",
+ " tca + HALF_WINDOW,\n",
+ " to_satellites=b,\n",
+ " max_range=LIMIT,\n",
+ " min_grazing_altitude=None,\n",
+ " min_duration=timedelta(seconds=1),\n",
+ " )\n",
+ " # the window whose closest approach is nearest SOCRATES's\n",
+ " nearest = windows.iloc[\n",
+ " np.argmin(np.abs((windows.closest_time - approach.tca).dt.total_seconds()))\n",
+ " ]\n",
+ " rows.append({\"tatc_tca\": nearest.closest_time, \"tatc_range\": nearest.closest_range})\n",
+ "sample = pd.concat([sample, pd.DataFrame(rows)], axis=1)\n",
+ "sample[\"range difference (m)\"] = sample.tatc_range - sample.TCA_RANGE * 1e3\n",
+ "sample[\"time difference (ms)\"] = (\n",
+ " pd.to_datetime(sample.tatc_tca, utc=True) - sample.tca\n",
+ ").dt.total_seconds() * 1e3\n",
+ "sample[\"starlink\"] = sample.OBJECT_NAME_1.str.contains(\n",
+ " \"STARLINK\"\n",
+ ") | sample.OBJECT_NAME_2.str.contains(\"STARLINK\")\n",
+ "summary = sample.groupby(\"band\", observed=True).agg(\n",
+ " **{\n",
+ " \"|range difference|, median (m)\": (\n",
+ " \"range difference (m)\",\n",
+ " lambda x: x.abs().median(),\n",
+ " ),\n",
+ " \"95% (m)\": (\"range difference (m)\", lambda x: x.abs().quantile(0.95)),\n",
+ " \"max (m)\": (\"range difference (m)\", lambda x: x.abs().max()),\n",
+ " \"|time difference|, median (ms)\": (\n",
+ " \"time difference (ms)\",\n",
+ " lambda x: x.abs().median(),\n",
+ " ),\n",
+ " \"95% (ms)\": (\"time difference (ms)\", lambda x: x.abs().quantile(0.95)),\n",
+ " }\n",
+ ")\n",
+ "large = sample[sample[\"range difference (m)\"].abs() > 10]\n",
+ "print(\n",
+ " f\"{len(large)} approaches differ by more than 10 m in range, {large.starlink.mean():.0%} involving Starlink \"\n",
+ " f\"(all approaches: {sample.starlink.mean():.0%}), {large['days since epoch'].median():.1f} days after epoch \"\n",
+ " f\"(median; all approaches: {sample['days since epoch'].median():.1f})\"\n",
+ ")\n",
+ "summary.round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f2cc4c17",
+ "metadata": {},
+ "source": [
+ "The closest approaches `collect_space_observations` reports agree with SOCRATES's. Ranges agree to within a meter (a median of 0.3 to 0.75 m by band, about the precision of SOCRATES's ranges) and within 14 m for 95% of approaches. Times agree within 0.3 ms (median) and about 1 ms (95%), except for satellites in nearly the same orbit (0 to 0.1 km/s), whose range changes so slowly near its minimum that its time is defined only to tens of milliseconds.\n",
+ "\n",
+ "Twenty approaches (4%) differ by 13 to 161 m in range, almost all involving a Starlink satellite and further from their element sets' epochs (6.6 days, median, against 5.1 days for all approaches). Differences that grow with propagation from epoch, for element sets with large drag terms, are consistent with small differences between implementations of SGP4 (for example, in their options), and are well within the accuracy of the element sets themselves. One pair in nearly the same orbit stays within 10 km for the whole hour, so its window spans two of SOCRATES's approaches; `collect_space_observations` reports the least range within the window (2.4 km, at its start), not SOCRATES's 3.1 km."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aa58d4b3",
+ "metadata": {},
+ "source": [
+ "## Test 2: Brief Windows\n",
+ "\n",
+ "`collect_space_observations` is run for each approach over an hour centered on SOCRATES's time of closest approach, with a `max_range` of 10 km (within which every sampled approach passes), no occlusion constraint, and a `min_duration` of 60, 10, 1, or 0.1 s. The search samples the range at half of `min_duration` and refines each change between samples, so it is guaranteed to find windows at least `min_duration` long, but may miss shorter ones (falling between samples). The true window is found from finely sampled ranges around TAT-C's closest approach (Test 1), within the hour, and is found if a window contains that closest approach."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "85afea0f",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-26T00:09:27.427504Z",
+ "iopub.status.busy": "2026-10-26T00:09:27.427179Z",
+ "iopub.status.idle": "2026-10-26T00:12:52.754186Z",
+ "shell.execute_reply": "2026-10-26T00:12:52.753446Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "true window within 10 km, median (s): 0 to 0.1 km/s 3599.7, 0.1 to 1 km/s 42.4, 1 to 5 km/s 6.0, 5 to 10 km/s 2.4, 10 to 16 km/s 1.3; shortest 1.15 s\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
windows at least min_duration
\n",
+ "
found (%)
\n",
+ "
shorter windows
\n",
+ "
shorter found (%)
\n",
+ "
time per hour analyzed, median (ms)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
min_duration = 60 s
\n",
+ "
137.0
\n",
+ "
100.0
\n",
+ "
363.0
\n",
+ "
10.47
\n",
+ "
3.62
\n",
+ "
\n",
+ "
\n",
+ "
min_duration = 10 s
\n",
+ "
224.0
\n",
+ "
100.0
\n",
+ "
276.0
\n",
+ "
18.48
\n",
+ "
28.63
\n",
+ "
\n",
+ "
\n",
+ "
min_duration = 1 s
\n",
+ "
500.0
\n",
+ "
100.0
\n",
+ "
0.0
\n",
+ "
NaN
\n",
+ "
43.30
\n",
+ "
\n",
+ "
\n",
+ "
min_duration = 0.1 s
\n",
+ "
500.0
\n",
+ "
100.0
\n",
+ "
0.0
\n",
+ "
NaN
\n",
+ "
190.82
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " windows at least min_duration found (%) \\\n",
+ "min_duration = 60 s 137.0 100.0 \n",
+ "min_duration = 10 s 224.0 100.0 \n",
+ "min_duration = 1 s 500.0 100.0 \n",
+ "min_duration = 0.1 s 500.0 100.0 \n",
+ "\n",
+ " shorter windows shorter found (%) \\\n",
+ "min_duration = 60 s 363.0 10.47 \n",
+ "min_duration = 10 s 276.0 18.48 \n",
+ "min_duration = 1 s 0.0 NaN \n",
+ "min_duration = 0.1 s 0.0 NaN \n",
+ "\n",
+ " time per hour analyzed, median (ms) \n",
+ "min_duration = 60 s 3.62 \n",
+ "min_duration = 10 s 28.63 \n",
+ "min_duration = 1 s 43.30 \n",
+ "min_duration = 0.1 s 190.82 "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import time\n",
+ "\n",
+ "DURATIONS = [60, 10, 1, 0.1] # s, min_duration\n",
+ "\n",
+ "\n",
+ "def true_window(a, b, tca, speed, start, end):\n",
+ " \"\"\"Duration (s) of the window around the closest approach when the range is within LIMIT, within the analysis\n",
+ " period (from finely sampled ranges).\"\"\"\n",
+ " half = min(HALF_WINDOW.total_seconds(), 2 * LIMIT / max(speed * 1e3, 1e-3) + 5)\n",
+ " offsets = np.linspace(-half, half, 40001)\n",
+ " times = [tca + timedelta(seconds=float(s)) for s in offsets]\n",
+ " inside = (slant_range(a, b, times) <= LIMIT) & np.array(\n",
+ " [start <= t <= end for t in times]\n",
+ " )\n",
+ " k = len(offsets) // 2\n",
+ " if not inside[k]:\n",
+ " return 0.0\n",
+ " lo = k - np.argmin(inside[k::-1]) + 1 if not inside[: k + 1].all() else 0\n",
+ " hi = k + np.argmin(inside[k:]) if not inside[k:].all() else len(offsets)\n",
+ " return offsets[hi - 1] - offsets[lo]\n",
+ "\n",
+ "\n",
+ "rows = []\n",
+ "for approach in sample.itertuples():\n",
+ " a, b = satellites[approach.NORAD_CAT_ID_1], satellites[approach.NORAD_CAT_ID_2]\n",
+ " tca = pd.Timestamp(approach.tatc_tca).floor(\"us\").to_pydatetime()\n",
+ " start, end = (\n",
+ " approach.tca.to_pydatetime() - HALF_WINDOW,\n",
+ " approach.tca.to_pydatetime() + HALF_WINDOW,\n",
+ " )\n",
+ " row = {\n",
+ " \"band\": approach.band,\n",
+ " \"window (s)\": true_window(a, b, tca, approach.TCA_RELATIVE_SPEED, start, end),\n",
+ " }\n",
+ " for duration in DURATIONS:\n",
+ " tic = time.perf_counter()\n",
+ " windows = collect_space_observations(\n",
+ " a,\n",
+ " start,\n",
+ " end,\n",
+ " to_satellites=b,\n",
+ " max_range=LIMIT,\n",
+ " min_grazing_altitude=None,\n",
+ " min_duration=timedelta(seconds=duration),\n",
+ " )\n",
+ " row[f\"time {duration} s\"] = time.perf_counter() - tic\n",
+ " row[f\"found {duration} s\"] = bool(\n",
+ " (\n",
+ " (windows.start <= pd.Timestamp(tca))\n",
+ " & (windows.end >= pd.Timestamp(tca))\n",
+ " ).any()\n",
+ " )\n",
+ " rows.append(row)\n",
+ "found = pd.DataFrame(rows)\n",
+ "found[\"band\"] = pd.Categorical(found.band, categories=LABELS, ordered=True)\n",
+ "print(\n",
+ " \"true window within 10 km, median (s): \"\n",
+ " + \", \".join(\n",
+ " f\"{b} {w:.1f}\"\n",
+ " for b, w in found.groupby(\"band\", observed=True)[\"window (s)\"].median().items()\n",
+ " )\n",
+ " + f\"; shortest {found['window (s)'].min():.2f} s\"\n",
+ ")\n",
+ "pd.DataFrame(\n",
+ " {\n",
+ " f\"min_duration = {d} s\": {\n",
+ " \"windows at least min_duration\": int((found[\"window (s)\"] >= d).sum()),\n",
+ " \"found (%)\": 100\n",
+ " * found.loc[found[\"window (s)\"] >= d, f\"found {d} s\"].mean(),\n",
+ " \"shorter windows\": int((found[\"window (s)\"] < d).sum()),\n",
+ " \"shorter found (%)\": (\n",
+ " 100 * found.loc[found[\"window (s)\"] < d, f\"found {d} s\"].mean()\n",
+ " if (found[\"window (s)\"] < d).any()\n",
+ " else np.nan\n",
+ " ),\n",
+ " \"time per hour analyzed, median (ms)\": 1e3 * found[f\"time {d} s\"].median(),\n",
+ " }\n",
+ " for d in DURATIONS\n",
+ " }\n",
+ ").T.round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6baa8767",
+ "metadata": {},
+ "source": [
+ "`collect_space_observations` finds every window at least `min_duration` long, for every `min_duration` from 60 s to 0.1 s, as documented, and 10 to 18% of the shorter windows, those its samples happen to fall in. The windows within 10 km last from 1.15 s (a median of 1.3 s at 10 to 16 km/s) to the whole hour (satellites in nearly the same orbit), so a `min_duration` of 1 s finds all of them. The cost grows as `min_duration` shrinks, since the search samples the whole analysis period at half of it: for a pair of satellites, a median of 4 ms per hour analyzed at 60 s, 43 ms at 1 s, and 191 ms at 0.1 s, including the refinement of each window's closest approach (about 20 ms per call)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9385da16",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "\n",
+ "| Test | Result |\n",
+ "| --- | --- |\n",
+ "| 1. Closest approach | `closest_range` within 1 m (median) and 14 m (95%) of SOCRATES's ranges, `closest_time` within 0.3 ms (median), except for satellites in nearly the same orbit; 4% of approaches (almost all involving Starlink) differ by 13 to 161 m |\n",
+ "| 2. Brief windows | Every window at least `min_duration` long found, for `min_duration` from 60 to 0.1 s, and 10 to 18% of shorter windows; 43 ms per hour analyzed for a pair of satellites with a `min_duration` of 1 s, including the closest approach |\n",
+ "\n",
+ "**TAT-C's propagation and window search hold for close approaches.** From the same element sets, `collect_space_observations` reproduces SOCRATES's closest approaches to about a meter and a millisecond, and finds every window within a range limit that lasts at least `min_duration`, down to windows of about a second at relative speeds up to 15 km/s.\n",
+ "\n",
+ "**Closest approaches and cost.** `collect_space_observations` reports each window's closest approach (`closest_time` and `closest_range`), which reproduces SOCRATES's, except where a window spans several approaches, when it is the least of them. The cost of a fine `min_duration`, which samples the whole analysis period, grows quickly for many pairs of satellites over long periods: with a `min_duration` of 1 s, about 4 s per pair for a week.\n",
+ "\n",
+ "**Next steps:**\n",
+ "\n",
+ "1. *Debris.* Extend the sample to approaches involving debris, whose element sets are not in CelesTrak's active satellites (for example, from Space-Track's history of element sets).\n",
+ "2. *Sub-second windows.* Test smaller range limits, whose windows last a fraction of a second.\n",
+ "\n",
+ "**Limitations.** This is a comparison of two implementations from the same element sets, not with truth, and covers active satellites only. With a range limit of 10 km, the shortest window lasts about a second."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/validation/ValidateSwathSWOT.ipynb b/docs/validation/ValidateSwathSWOT.ipynb
index 475d2a6c..63df9057 100644
--- a/docs/validation/ValidateSwathSWOT.ipynb
+++ b/docs/validation/ValidateSwathSWOT.ipynb
@@ -269,7 +269,11 @@
"def granule_key(name):\n",
" \"\"\"Cycle, pass, and start time of a granule name.\"\"\"\n",
" match = re.search(r\"_(\\d{3})_(\\d{3})_(\\d{8}T\\d{6})_\", name)\n",
- " return int(match.group(1)), int(match.group(2)), datetime.strptime(match.group(3), \"%Y%m%dT%H%M%S\").replace(tzinfo=timezone.utc)\n",
+ " return (\n",
+ " int(match.group(1)),\n",
+ " int(match.group(2)),\n",
+ " datetime.strptime(match.group(3), \"%Y%m%dT%H%M%S\").replace(tzinfo=timezone.utc),\n",
+ " )\n",
"\n",
"\n",
"files = sorted(DATA_DIR.glob(\"SWOT_L2_LR_SSH_Basic_*.nc\"))\n",
@@ -277,13 +281,21 @@
" import earthaccess\n",
"\n",
" earthaccess.login()\n",
- " results = earthaccess.search_data(short_name=\"SWOT_L2_LR_SSH_BASIC_D\", temporal=(START.strftime(\"%Y-%m-%dT%H:%M:%SZ\"), END.strftime(\"%Y-%m-%dT%H:%M:%SZ\")))\n",
+ " results = earthaccess.search_data(\n",
+ " short_name=\"SWOT_L2_LR_SSH_BASIC_D\",\n",
+ " temporal=(\n",
+ " START.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " END.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " ),\n",
+ " )\n",
" keys = [granule_key(r[\"umm\"][\"GranuleUR\"]) for r in results]\n",
" # the first pass starting after midnight every two days, and pass 566 of cycles 55 and 56\n",
" selected = set()\n",
" for day in range(0, (END - START).days, 2):\n",
" midnight = START + timedelta(days=day)\n",
- " selected.add(min((k[2] - midnight, i) for i, k in enumerate(keys) if k[2] >= midnight)[1])\n",
+ " selected.add(\n",
+ " min((k[2] - midnight, i) for i, k in enumerate(keys) if k[2] >= midnight)[1]\n",
+ " )\n",
" selected |= {i for i, k in enumerate(keys) if k[1] == 566 and k[0] in (55, 56)}\n",
" earthaccess.download([results[i] for i in sorted(selected)], str(DATA_DIR))\n",
" files = sorted(DATA_DIR.glob(\"SWOT_L2_LR_SSH_Basic_*.nc\"))\n",
@@ -306,8 +318,23 @@
"granules = [read_granule(path) for path in files]\n",
"NADIR = 34 # grid column on the reference ground track\n",
"swot = GeneralPerturbationsOrbit.from_tle(TLE)\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"pd.DataFrame(\n",
" [\n",
" {\n",
@@ -562,16 +589,28 @@
" \"\"\"Along- and cross-track offsets of TAT-C's ground track from the reference ground track.\"\"\"\n",
" lines = np.arange(100, len(granule[\"time\"]) - 100, 100)\n",
" lat, lon = granule[\"latitude\"][lines, NADIR], granule[\"longitude\"][lines, NADIR]\n",
- " next_lat, next_lon = granule[\"latitude\"][lines + 1, NADIR], granule[\"longitude\"][lines + 1, NADIR]\n",
+ " next_lat, next_lon = (\n",
+ " granule[\"latitude\"][lines + 1, NADIR],\n",
+ " granule[\"longitude\"][lines + 1, NADIR],\n",
+ " )\n",
" heading, _, step = geod.inv(lon, lat, next_lon, next_lat)\n",
- " speed = step / ((granule[\"time\"][lines + 1] - granule[\"time\"][lines]).total_seconds().to_numpy())\n",
- " subpoints = wgs84.subpoint_of(swot.elements[0].to_skyfield().at(timescale.from_datetimes(granule[\"time\"][lines].to_pydatetime())))\n",
- " azimuth, _, distance = geod.inv(lon, lat, subpoints.longitude.degrees, subpoints.latitude.degrees)\n",
+ " speed = step / (\n",
+ " (granule[\"time\"][lines + 1] - granule[\"time\"][lines]).total_seconds().to_numpy()\n",
+ " )\n",
+ " subpoints = wgs84.subpoint_of(\n",
+ " swot.elements[0]\n",
+ " .to_skyfield()\n",
+ " .at(timescale.from_datetimes(granule[\"time\"][lines].to_pydatetime()))\n",
+ " )\n",
+ " azimuth, _, distance = geod.inv(\n",
+ " lon, lat, subpoints.longitude.degrees, subpoints.latitude.degrees\n",
+ " )\n",
" angle = np.radians(azimuth - heading)\n",
" return pd.DataFrame(\n",
" {\n",
" \"file\": granule[\"name\"],\n",
- " \"days before TLE epoch\": (TLE_EPOCH - granule[\"time\"][lines]) / timedelta(days=1),\n",
+ " \"days before TLE epoch\": (TLE_EPOCH - granule[\"time\"][lines])\n",
+ " / timedelta(days=1),\n",
" \"latitude\": lat,\n",
" \"along-track offset (km)\": distance * np.cos(angle) / 1e3,\n",
" \"along-track offset (s)\": distance * np.cos(angle) / speed,\n",
@@ -588,7 +627,10 @@
" \"along-track offset, median (s)\": (\"along-track offset (s)\", \"median\"),\n",
" \"along-track offset, median (km)\": (\"along-track offset (km)\", \"median\"),\n",
" \"cross-track offset, median (km)\": (\"cross-track offset (km)\", \"median\"),\n",
- " \"cross-track offset, max |x| (km)\": (\"cross-track offset (km)\", lambda x: x.abs().max()),\n",
+ " \"cross-track offset, max |x| (km)\": (\n",
+ " \"cross-track offset (km)\",\n",
+ " lambda x: x.abs().max(),\n",
+ " ),\n",
" }\n",
")\n",
"table1.sort_values(\"days before TLE epoch\").round(2)"
@@ -620,11 +662,27 @@
],
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.6))\n",
- "axes[0].plot(offsets[\"days before TLE epoch\"], offsets[\"along-track offset (s)\"], \".\", ms=3, color=BLUE)\n",
- "axes[0].set(xlabel=\"Days before TLE epoch\", ylabel=\"TAT-C minus SWOT (s)\", title=\"Along-track (time) offset\")\n",
+ "axes[0].plot(\n",
+ " offsets[\"days before TLE epoch\"],\n",
+ " offsets[\"along-track offset (s)\"],\n",
+ " \".\",\n",
+ " ms=3,\n",
+ " color=BLUE,\n",
+ ")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Days before TLE epoch\",\n",
+ " ylabel=\"TAT-C minus SWOT (s)\",\n",
+ " title=\"Along-track (time) offset\",\n",
+ ")\n",
"axes[0].invert_xaxis()\n",
- "axes[1].plot(offsets[\"latitude\"], offsets[\"cross-track offset (km)\"], \".\", ms=3, color=ORANGE)\n",
- "axes[1].set(xlabel=\"Latitude (deg)\", ylabel=\"TAT-C left of reference (km)\", title=\"Cross-track offset from reference ground track\")\n",
+ "axes[1].plot(\n",
+ " offsets[\"latitude\"], offsets[\"cross-track offset (km)\"], \".\", ms=3, color=ORANGE\n",
+ ")\n",
+ "axes[1].set(\n",
+ " xlabel=\"Latitude (deg)\",\n",
+ " ylabel=\"TAT-C left of reference (km)\",\n",
+ " title=\"Cross-track offset from reference ground track\",\n",
+ ")\n",
"fig.tight_layout()\n",
"plt.show()"
]
@@ -673,25 +731,59 @@
"source": [
"first, second = (g for g in granules if g[\"pass\"] == 566)\n",
"lines = np.arange(0, min(len(first[\"time\"]), len(second[\"time\"])), 500)\n",
- "measured_cycle = pd.to_timedelta(np.median((second[\"time\"][lines] - first[\"time\"][lines]).total_seconds()), unit=\"s\")\n",
- "repeat_cycle = GeneralPerturbationsOrbit.from_tle(TLE, remove_drag=True, repeat_cycle=\"auto\").get_repeat_cycle()\n",
+ "measured_cycle = pd.to_timedelta(\n",
+ " np.median((second[\"time\"][lines] - first[\"time\"][lines]).total_seconds()), unit=\"s\"\n",
+ ")\n",
+ "repeat_cycle = GeneralPerturbationsOrbit.from_tle(\n",
+ " TLE, remove_drag=True, repeat_cycle=\"auto\"\n",
+ ").get_repeat_cycle()\n",
"lines = lines[(lines > 0) & (lines < len(second[\"time\"]) - 1)]\n",
"times = second[\"time\"][lines].to_pydatetime()\n",
- "now = wgs84.subpoint_of(swot.elements[0].to_skyfield().at(timescale.from_datetimes(times)))\n",
- "later = wgs84.subpoint_of(swot.elements[0].to_skyfield().at(timescale.from_datetimes([t + repeat_cycle for t in times])))\n",
- "heading = geod.inv(second[\"longitude\"][lines, NADIR], second[\"latitude\"][lines, NADIR], second[\"longitude\"][lines + 1, NADIR], second[\"latitude\"][lines + 1, NADIR])[0]\n",
- "azimuth, _, shift = geod.inv(now.longitude.degrees, now.latitude.degrees, later.longitude.degrees, later.latitude.degrees)\n",
+ "now = wgs84.subpoint_of(\n",
+ " swot.elements[0].to_skyfield().at(timescale.from_datetimes(times))\n",
+ ")\n",
+ "later = wgs84.subpoint_of(\n",
+ " swot.elements[0]\n",
+ " .to_skyfield()\n",
+ " .at(timescale.from_datetimes([t + repeat_cycle for t in times]))\n",
+ ")\n",
+ "heading = geod.inv(\n",
+ " second[\"longitude\"][lines, NADIR],\n",
+ " second[\"latitude\"][lines, NADIR],\n",
+ " second[\"longitude\"][lines + 1, NADIR],\n",
+ " second[\"latitude\"][lines + 1, NADIR],\n",
+ ")[0]\n",
+ "azimuth, _, shift = geod.inv(\n",
+ " now.longitude.degrees,\n",
+ " now.latitude.degrees,\n",
+ " later.longitude.degrees,\n",
+ " later.latitude.degrees,\n",
+ ")\n",
"along_shift = shift * np.cos(np.radians(azimuth - heading)) / 1e3\n",
"cross_shift = -shift * np.sin(np.radians(azimuth - heading)) / 1e3\n",
"pd.Series(\n",
" {\n",
" \"SWOT repeat cycle (pass 566, cycles 55 to 56)\": str(measured_cycle),\n",
- " \"same grid in both cycles (max position difference, m)\": float(np.nanmax(np.hypot(first[\"latitude\"][lines] - second[\"latitude\"][lines], first[\"longitude\"][lines] - second[\"longitude\"][lines])) * 111e3),\n",
+ " \"same grid in both cycles (max position difference, m)\": float(\n",
+ " np.nanmax(\n",
+ " np.hypot(\n",
+ " first[\"latitude\"][lines] - second[\"latitude\"][lines],\n",
+ " first[\"longitude\"][lines] - second[\"longitude\"][lines],\n",
+ " )\n",
+ " )\n",
+ " * 111e3\n",
+ " ),\n",
" \"TAT-C repeat cycle (get_repeat_cycle)\": str(repeat_cycle),\n",
" \"difference (s)\": (repeat_cycle - measured_cycle).total_seconds(),\n",
- " \"SGP4 ground track shift after one TAT-C repeat cycle, along track, median (km)\": float(np.median(along_shift)),\n",
- " \"SGP4 ground track shift after one TAT-C repeat cycle, across track, median (km)\": float(np.median(cross_shift)),\n",
- " \"SGP4 ground track shift after one TAT-C repeat cycle, across track, max |x| (km)\": float(np.max(np.abs(cross_shift))),\n",
+ " \"SGP4 ground track shift after one TAT-C repeat cycle, along track, median (km)\": float(\n",
+ " np.median(along_shift)\n",
+ " ),\n",
+ " \"SGP4 ground track shift after one TAT-C repeat cycle, across track, median (km)\": float(\n",
+ " np.median(cross_shift)\n",
+ " ),\n",
+ " \"SGP4 ground track shift after one TAT-C repeat cycle, across track, max |x| (km)\": float(\n",
+ " np.max(np.abs(cross_shift))\n",
+ " ),\n",
" }\n",
")"
]
@@ -781,7 +873,12 @@
"def off_nadir_angle(distance, altitude=ALTITUDE):\n",
" \"\"\"Off-nadir angle (deg) to a ground distance from nadir, on a spherical Earth.\"\"\"\n",
" theta = distance / EARTH_MEAN_RADIUS\n",
- " return np.degrees(np.arctan2(EARTH_MEAN_RADIUS * np.sin(theta), EARTH_MEAN_RADIUS + altitude - EARTH_MEAN_RADIUS * np.cos(theta)))\n",
+ " return np.degrees(\n",
+ " np.arctan2(\n",
+ " EARTH_MEAN_RADIUS * np.sin(theta),\n",
+ " EARTH_MEAN_RADIUS + altitude - EARTH_MEAN_RADIUS * np.cos(theta),\n",
+ " )\n",
+ " )\n",
"\n",
"\n",
"INNER, OUTER = 10e3, 60e3\n",
@@ -797,7 +894,15 @@
" for side, sign in [(\"left\", 1), (\"right\", -1)]\n",
"}\n",
"satellite = Satellite(name=\"SWOT\", orbit=swot, instruments=list(karin.values()))\n",
- "pd.DataFrame({side: {\"roll angle (deg)\": i.roll_angle, \"cross-track field of view (deg)\": i.cross_track_field_of_view} for side, i in karin.items()}).T.round(3)"
+ "pd.DataFrame(\n",
+ " {\n",
+ " side: {\n",
+ " \"roll angle (deg)\": i.roll_angle,\n",
+ " \"cross-track field of view (deg)\": i.cross_track_field_of_view,\n",
+ " }\n",
+ " for side, i in karin.items()\n",
+ " }\n",
+ ").T.round(3)"
]
},
{
@@ -831,21 +936,47 @@
"def signed_distance(granule, line):\n",
" \"\"\"Distance (km) of each pixel of a line from the ground track, positive to the left of the direction of motion.\"\"\"\n",
" lat, lon = granule[\"latitude\"][line], granule[\"longitude\"][line]\n",
- " heading = geod.inv(lon[NADIR], lat[NADIR], granule[\"longitude\"][line + 1, NADIR], granule[\"latitude\"][line + 1, NADIR])[0]\n",
- " azimuth, _, distance = geod.inv(np.full(69, lon[NADIR]), np.full(69, lat[NADIR]), lon, lat)\n",
+ " heading = geod.inv(\n",
+ " lon[NADIR],\n",
+ " lat[NADIR],\n",
+ " granule[\"longitude\"][line + 1, NADIR],\n",
+ " granule[\"latitude\"][line + 1, NADIR],\n",
+ " )[0]\n",
+ " azimuth, _, distance = geod.inv(\n",
+ " np.full(69, lon[NADIR]), np.full(69, lat[NADIR]), lon, lat\n",
+ " )\n",
" return -np.sign(np.sin(np.radians(azimuth - heading))) * distance / 1e3\n",
"\n",
"\n",
"def observe_pixel(args):\n",
" \"\"\"TAT-C observations of a grid pixel by each instrument near its line's time.\"\"\"\n",
" granule, line, pixel = args\n",
- " point = Point(id=0, latitude=float(granule[\"latitude\"][line, pixel]), longitude=float(granule[\"longitude\"][line, pixel]))\n",
+ " point = Point(\n",
+ " id=0,\n",
+ " latitude=float(granule[\"latitude\"][line, pixel]),\n",
+ " longitude=float(granule[\"longitude\"][line, pixel]),\n",
+ " )\n",
" time = granule[\"time\"][line].floor(\"us\").to_pydatetime()\n",
- " row = {\"file\": granule[\"name\"], \"line\": line, \"pixel\": pixel, \"good\": bool(granule[\"good\"][line, pixel])}\n",
+ " row = {\n",
+ " \"file\": granule[\"name\"],\n",
+ " \"line\": line,\n",
+ " \"pixel\": pixel,\n",
+ " \"good\": bool(granule[\"good\"][line, pixel]),\n",
+ " }\n",
" for index, side in enumerate(karin):\n",
- " obs = collect_observations(point, satellite, time - timedelta(minutes=2), time + timedelta(minutes=2), instrument_index=index)\n",
+ " obs = collect_observations(\n",
+ " point,\n",
+ " satellite,\n",
+ " time - timedelta(minutes=2),\n",
+ " time + timedelta(minutes=2),\n",
+ " instrument_index=index,\n",
+ " )\n",
" row[f\"observed {side}\"] = not obs.empty\n",
- " row[f\"epoch difference {side} (s)\"] = (obs.epoch.iloc[0] - granule[\"time\"][line]).total_seconds() if not obs.empty else np.nan\n",
+ " row[f\"epoch difference {side} (s)\"] = (\n",
+ " (obs.epoch.iloc[0] - granule[\"time\"][line]).total_seconds()\n",
+ " if not obs.empty\n",
+ " else np.nan\n",
+ " )\n",
" return row\n",
"\n",
"\n",
@@ -857,7 +988,9 @@
" tasks += [(granule, line, pixel) for pixel in range(69)]\n",
"with concurrent.futures.ThreadPoolExecutor(8) as pool:\n",
" pixels = pd.DataFrame(list(pool.map(observe_pixel, tasks)))\n",
- "pixels[\"distance (km)\"] = [distances[(f, l)][p] for f, l, p in zip(pixels.file, pixels.line, pixels.pixel)]\n",
+ "pixels[\"distance (km)\"] = [\n",
+ " distances[(f, l)][p] for f, l, p in zip(pixels.file, pixels.line, pixels.pixel)\n",
+ "]\n",
"by_pixel = pixels.groupby(\"pixel\").agg(\n",
" **{\n",
" \"distance (km)\": (\"distance (km)\", \"median\"),\n",
@@ -867,7 +1000,13 @@
" }\n",
")\n",
"by_pixel[[\"good-quality (%)\", \"TAT-C left (%)\", \"TAT-C right (%)\"]] *= 100\n",
- "pd.Series({\"files\": len({t[0][\"name\"] for t in tasks}), \"ocean lines\": len(distances), \"pixels\": len(pixels)})"
+ "pd.Series(\n",
+ " {\n",
+ " \"files\": len({t[0][\"name\"] for t in tasks}),\n",
+ " \"ocean lines\": len(distances),\n",
+ " \"pixels\": len(pixels),\n",
+ " }\n",
+ ")"
]
},
{
@@ -896,12 +1035,38 @@
],
"source": [
"fig, ax = plt.subplots(figsize=(12, 3.6))\n",
- "ax.bar(by_pixel[\"distance (km)\"], by_pixel[\"good-quality (%)\"], width=1.8, color=GRAY, alpha=0.5, label=\"SWOT good-quality heights\")\n",
- "ax.step(by_pixel[\"distance (km)\"], by_pixel[\"TAT-C left (%)\"], where=\"mid\", color=BLUE, lw=1.5, label=\"TAT-C left instrument\")\n",
- "ax.step(by_pixel[\"distance (km)\"], by_pixel[\"TAT-C right (%)\"], where=\"mid\", color=ORANGE, lw=1.5, label=\"TAT-C right instrument\")\n",
+ "ax.bar(\n",
+ " by_pixel[\"distance (km)\"],\n",
+ " by_pixel[\"good-quality (%)\"],\n",
+ " width=1.8,\n",
+ " color=GRAY,\n",
+ " alpha=0.5,\n",
+ " label=\"SWOT good-quality heights\",\n",
+ ")\n",
+ "ax.step(\n",
+ " by_pixel[\"distance (km)\"],\n",
+ " by_pixel[\"TAT-C left (%)\"],\n",
+ " where=\"mid\",\n",
+ " color=BLUE,\n",
+ " lw=1.5,\n",
+ " label=\"TAT-C left instrument\",\n",
+ ")\n",
+ "ax.step(\n",
+ " by_pixel[\"distance (km)\"],\n",
+ " by_pixel[\"TAT-C right (%)\"],\n",
+ " where=\"mid\",\n",
+ " color=ORANGE,\n",
+ " lw=1.5,\n",
+ " label=\"TAT-C right instrument\",\n",
+ ")\n",
"for edge in (-OUTER, -INNER, INNER, OUTER):\n",
" ax.axvline(edge / 1e3, color=INK, lw=0.6, ls=\":\")\n",
- "ax.set(xlabel=\"Distance from ground track (km, positive to the left of the direction of motion)\", ylabel=\"Pixels (%)\", title=\"KaRIn swaths: SWOT good-quality pixels and TAT-C observations (ocean lines)\", xlim=(-70, 70))\n",
+ "ax.set(\n",
+ " xlabel=\"Distance from ground track (km, positive to the left of the direction of motion)\",\n",
+ " ylabel=\"Pixels (%)\",\n",
+ " title=\"KaRIn swaths: SWOT good-quality pixels and TAT-C observations (ocean lines)\",\n",
+ " xlim=(-70, 70),\n",
+ ")\n",
"ax.legend(frameon=False, fontsize=8, loc=\"center\")\n",
"plt.show()"
]
@@ -942,23 +1107,45 @@
],
"source": [
"pixels[\"observed\"] = pixels[\"observed left\"] | pixels[\"observed right\"]\n",
- "pixels[\"epoch difference (s)\"] = pixels[\"epoch difference left (s)\"].fillna(pixels[\"epoch difference right (s)\"])\n",
+ "pixels[\"epoch difference (s)\"] = pixels[\"epoch difference left (s)\"].fillna(\n",
+ " pixels[\"epoch difference right (s)\"]\n",
+ ")\n",
"inside = pixels[\"distance (km)\"].abs().between(INNER / 1e3 + 1, OUTER / 1e3 - 1)\n",
- "outside = (pixels[\"distance (km)\"].abs() < INNER / 1e3 - 1) | (pixels[\"distance (km)\"].abs() > OUTER / 1e3 + 1)\n",
+ "outside = (pixels[\"distance (km)\"].abs() < INNER / 1e3 - 1) | (\n",
+ " pixels[\"distance (km)\"].abs() > OUTER / 1e3 + 1\n",
+ ")\n",
"left = pixels[\"distance (km)\"] > 0\n",
- "corrected = pixels[\"epoch difference (s)\"] + pixels.file.map(table1[\"along-track offset, median (s)\"])\n",
+ "corrected = pixels[\"epoch difference (s)\"] + pixels.file.map(\n",
+ " table1[\"along-track offset, median (s)\"]\n",
+ ")\n",
"pd.Series(\n",
" {\n",
- " \"pixels 11 to 59 km from the ground track: good quality (%)\": 100 * pixels.good[inside].mean(),\n",
- " \"pixels 11 to 59 km from the ground track: observed by TAT-C (%)\": 100 * pixels.observed[inside].mean(),\n",
- " \"pixels 11 to 59 km from the ground track: observed by the instrument on their side (%)\": 100 * np.mean(np.where(left[inside], pixels[\"observed left\"][inside], pixels[\"observed right\"][inside])),\n",
- " \"pixels within 9 km or beyond 61 km: good quality (%)\": 100 * pixels.good[outside].mean(),\n",
- " \"pixels within 9 km or beyond 61 km: observed by TAT-C (%)\": 100 * pixels.observed[outside].mean(),\n",
- " \"good-quality pixels observed by TAT-C (%)\": 100 * pixels.observed[pixels.good].mean(),\n",
+ " \"pixels 11 to 59 km from the ground track: good quality (%)\": 100\n",
+ " * pixels.good[inside].mean(),\n",
+ " \"pixels 11 to 59 km from the ground track: observed by TAT-C (%)\": 100\n",
+ " * pixels.observed[inside].mean(),\n",
+ " \"pixels 11 to 59 km from the ground track: observed by the instrument on their side (%)\": 100\n",
+ " * np.mean(\n",
+ " np.where(\n",
+ " left[inside],\n",
+ " pixels[\"observed left\"][inside],\n",
+ " pixels[\"observed right\"][inside],\n",
+ " )\n",
+ " ),\n",
+ " \"pixels within 9 km or beyond 61 km: good quality (%)\": 100\n",
+ " * pixels.good[outside].mean(),\n",
+ " \"pixels within 9 km or beyond 61 km: observed by TAT-C (%)\": 100\n",
+ " * pixels.observed[outside].mean(),\n",
+ " \"good-quality pixels observed by TAT-C (%)\": 100\n",
+ " * pixels.observed[pixels.good].mean(),\n",
" \"epoch minus line time, median (s)\": pixels[\"epoch difference (s)\"].median(),\n",
- " \"epoch minus line time, p95 |x| (s)\": pixels[\"epoch difference (s)\"].abs().quantile(0.95),\n",
+ " \"epoch minus line time, p95 |x| (s)\": pixels[\"epoch difference (s)\"]\n",
+ " .abs()\n",
+ " .quantile(0.95),\n",
" \"epoch minus line time, corrected for the orbit's along-track offset (Test 1), median (s)\": corrected.median(),\n",
- " \"epoch minus line time, corrected for the orbit's along-track offset (Test 1), p95 |x| (s)\": corrected.abs().quantile(0.95),\n",
+ " \"epoch minus line time, corrected for the orbit's along-track offset (Test 1), p95 |x| (s)\": corrected.abs().quantile(\n",
+ " 0.95\n",
+ " ),\n",
" }\n",
").round(2)"
]
diff --git a/docs/validation/ValidateTiltPACE.ipynb b/docs/validation/ValidateTiltPACE.ipynb
index 650ebcfc..22075494 100644
--- a/docs/validation/ValidateTiltPACE.ipynb
+++ b/docs/validation/ValidateTiltPACE.ipynb
@@ -14,7 +14,8 @@
"1. **Orbit.** Does TAT-C's propagation of the operational two-line element (TLE) set reproduce PACE's position?\n",
"2. **Scan geometry.** Does a tilted scan view reproduce OCI's geolocated pixels, and with which sign conventions and velocity frame?\n",
"3. **Tilt schedule.** Where does OCI's tilt flip, and can a pitch angle profile represent it?\n",
- "4. **Observation times.** Does `collect_observations` predict when OCI observes points on the ground?"
+ "4. **Observation times.** Does `collect_observations` predict when OCI observes points on the ground?\n",
+ "5. **Glint avoidance.** Does the tilt keep OCI's scans out of the sun glint, and do the glint angles (`compute_glint_angle`) explain where it changes?"
]
},
{
@@ -35,10 +36,10 @@
"id": "a111bc33",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:19.361283Z",
- "iopub.status.busy": "2026-10-08T18:11:19.361283Z",
- "iopub.status.idle": "2026-10-08T18:11:23.314653Z",
- "shell.execute_reply": "2026-10-08T18:11:23.314653Z"
+ "iopub.execute_input": "2026-10-25T18:36:05.701826Z",
+ "iopub.status.busy": "2026-10-25T18:36:05.701637Z",
+ "iopub.status.idle": "2026-10-25T18:36:07.056313Z",
+ "shell.execute_reply": "2026-10-25T18:36:07.055575Z"
}
},
"outputs": [
@@ -101,13 +102,17 @@
" def __init__(self, url, block_size=2**20, prefetch=1):\n",
" self.block_size, self.blocks, self.position = block_size, {}, 0\n",
" response = self._get(url, 0, prefetch * block_size)\n",
- " self.url, self.size = response.url, int(response.headers[\"Content-Range\"].split(\"/\")[1])\n",
+ " self.url, self.size = response.url, int(\n",
+ " response.headers[\"Content-Range\"].split(\"/\")[1]\n",
+ " )\n",
" self._store(0, response.content)\n",
"\n",
" def _get(self, url, start, end):\n",
" for attempt in range(5):\n",
" try:\n",
- " response = https_session().get(url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300)\n",
+ " response = https_session().get(\n",
+ " url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300\n",
+ " )\n",
" response.raise_for_status()\n",
" return response\n",
" except requests.RequestException:\n",
@@ -128,18 +133,30 @@
" return self.position\n",
"\n",
" def seek(self, offset, whence=io.SEEK_SET):\n",
- " self.position = {io.SEEK_SET: 0, io.SEEK_CUR: self.position, io.SEEK_END: self.size}[whence] + offset\n",
+ " self.position = {\n",
+ " io.SEEK_SET: 0,\n",
+ " io.SEEK_CUR: self.position,\n",
+ " io.SEEK_END: self.size,\n",
+ " }[whence] + offset\n",
" return self.position\n",
"\n",
" def readinto(self, buffer):\n",
" n = min(len(buffer), self.size - self.position)\n",
" if n <= 0:\n",
" return 0\n",
- " first, last = self.position // self.block_size, (self.position + n - 1) // self.block_size\n",
- " missing = [block for block in range(first, last + 1) if block not in self.blocks]\n",
+ " first, last = (\n",
+ " self.position // self.block_size,\n",
+ " (self.position + n - 1) // self.block_size,\n",
+ " )\n",
+ " missing = [\n",
+ " block for block in range(first, last + 1) if block not in self.blocks\n",
+ " ]\n",
" if missing:\n",
" end = min((missing[-1] + 1) * self.block_size, self.size)\n",
- " self._store(missing[0], self._get(self.url, missing[0] * self.block_size, end).content)\n",
+ " self._store(\n",
+ " missing[0],\n",
+ " self._get(self.url, missing[0] * self.block_size, end).content,\n",
+ " )\n",
" data = b\"\".join(self.blocks[block] for block in range(first, last + 1))\n",
" offset = self.position - first * self.block_size\n",
" buffer[:n] = data[offset : offset + n]\n",
@@ -159,7 +176,9 @@
" rows = slice(None, None, SCAN_STEP)\n",
"\n",
" def grid(name, scale=1.0):\n",
- " values = f[f\"geolocation_data/{name}\"][:][rows][:, columns].astype(np.float32)\n",
+ " values = f[f\"geolocation_data/{name}\"][:][rows][:, columns].astype(\n",
+ " np.float32\n",
+ " )\n",
" values[values <= -32767] = np.nan\n",
" return values * scale\n",
"\n",
@@ -174,7 +193,9 @@
" orb_vel=f[\"navigation_data/orb_vel\"][:][rows],\n",
" att_ang=f[\"navigation_data/att_ang\"][:][rows],\n",
" columns=columns,\n",
- " scan_angle=np.nanmedian(f[\"navigation_data/CCD_scan_angles\"][::100][:, columns], axis=0),\n",
+ " scan_angle=np.nanmedian(\n",
+ " f[\"navigation_data/CCD_scan_angles\"][::100][:, columns], axis=0\n",
+ " ),\n",
" latitude=grid(\"latitude\"),\n",
" longitude=grid(\"longitude\"),\n",
" sensor_zenith=grid(\"sensor_zenith\", 0.01),\n",
@@ -187,8 +208,22 @@
"if not any(DATA_DIR.glob(\"PACE_OCI.*.npz\")):\n",
" import earthaccess\n",
"\n",
- " results = earthaccess.search_data(short_name=\"PACE_OCI_L1B_SCI\", temporal=(START.strftime(\"%Y-%m-%dT%H:%M:%SZ\"), END.strftime(\"%Y-%m-%dT%H:%M:%SZ\")))\n",
- " urls = sorted(next(link[\"URL\"] for link in r[\"umm\"][\"RelatedUrls\"] if link[\"URL\"].startswith(\"https://obdaac-tea\") and link[\"URL\"].endswith(\".nc\")) for r in results)\n",
+ " results = earthaccess.search_data(\n",
+ " short_name=\"PACE_OCI_L1B_SCI\",\n",
+ " temporal=(\n",
+ " START.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " END.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n",
+ " ),\n",
+ " )\n",
+ " urls = sorted(\n",
+ " next(\n",
+ " link[\"URL\"]\n",
+ " for link in r[\"umm\"][\"RelatedUrls\"]\n",
+ " if link[\"URL\"].startswith(\"https://obdaac-tea\")\n",
+ " and link[\"URL\"].endswith(\".nc\")\n",
+ " )\n",
+ " for r in results\n",
+ " )\n",
" with concurrent.futures.ThreadPoolExecutor(6) as pool:\n",
" list(pool.map(reduce_granule, urls))\n",
"\n",
@@ -196,27 +231,45 @@
"for path in sorted(DATA_DIR.glob(\"PACE_OCI.*.npz\")):\n",
" with np.load(path) as d:\n",
" granule = {key: d[key] for key in d.files}\n",
- " times = pd.Timestamp(str(granule[\"day\"]), tz=\"UTC\") + pd.to_timedelta(granule[\"seconds\"], unit=\"s\")\n",
- " granule[\"name\"], granule[\"times\"], granule[\"nav_times\"] = path.stem, times, times[granule[\"nav_rows\"]]\n",
- " if granule[\"nav_times\"][0] >= pd.Timestamp(START) and granule[\"nav_times\"][0] < pd.Timestamp(END):\n",
+ " times = pd.Timestamp(str(granule[\"day\"]), tz=\"UTC\") + pd.to_timedelta(\n",
+ " granule[\"seconds\"], unit=\"s\"\n",
+ " )\n",
+ " granule[\"name\"], granule[\"times\"], granule[\"nav_times\"] = (\n",
+ " path.stem,\n",
+ " times,\n",
+ " times[granule[\"nav_rows\"]],\n",
+ " )\n",
+ " if granule[\"nav_times\"][0] >= pd.Timestamp(START) and granule[\"nav_times\"][\n",
+ " 0\n",
+ " ] < pd.Timestamp(END):\n",
" granules.append(granule)\n",
- "scans = pd.concat([pd.DataFrame({\"time\": g[\"times\"], \"tilt\": g[\"tilt\"]}) for g in granules]).sort_values(\"time\").reset_index(drop=True)\n",
- "nav = pd.concat(\n",
- " [\n",
- " pd.DataFrame(\n",
- " np.column_stack([g[\"orb_pos\"], g[\"orb_vel\"], g[\"att_ang\"]]),\n",
- " columns=[\"x\", \"y\", \"z\", \"vx\", \"vy\", \"vz\", \"roll\", \"pitch\", \"yaw\"],\n",
- " ).assign(time=g[\"nav_times\"], granule=g[\"name\"])\n",
- " for g in granules\n",
- " ]\n",
- ").sort_values(\"time\").reset_index(drop=True)\n",
+ "scans = (\n",
+ " pd.concat([pd.DataFrame({\"time\": g[\"times\"], \"tilt\": g[\"tilt\"]}) for g in granules])\n",
+ " .sort_values(\"time\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
+ "nav = (\n",
+ " pd.concat(\n",
+ " [\n",
+ " pd.DataFrame(\n",
+ " np.column_stack([g[\"orb_pos\"], g[\"orb_vel\"], g[\"att_ang\"]]),\n",
+ " columns=[\"x\", \"y\", \"z\", \"vx\", \"vy\", \"vz\", \"roll\", \"pitch\", \"yaw\"],\n",
+ " ).assign(time=g[\"nav_times\"], granule=g[\"name\"])\n",
+ " for g in granules\n",
+ " ]\n",
+ " )\n",
+ " .sort_values(\"time\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
"pd.Series(\n",
" {\n",
" \"granules\": len(granules),\n",
" \"scans\": len(scans),\n",
" \"first scan\": scans.time.min(),\n",
" \"last scan\": scans.time.max(),\n",
- " \"tilt angles (deg)\": \", \".join(f\"{v:.3f}\" for v in sorted(scans.tilt.round(3).value_counts().index[:2])),\n",
+ " \"tilt angles (deg)\": \", \".join(\n",
+ " f\"{v:.3f}\" for v in sorted(scans.tilt.round(3).value_counts().index[:2])\n",
+ " ),\n",
" \"spacecraft roll, 95th percentile (deg)\": nav.roll.abs().quantile(0.95),\n",
" \"spacecraft pitch, 95th percentile (deg)\": nav.pitch.abs().quantile(0.95),\n",
" \"spacecraft yaw, range (deg)\": f\"{nav.yaw.min():.2f} to {nav.yaw.max():.2f}\",\n",
@@ -240,10 +293,10 @@
"id": "edb82bc2",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:23.317174Z",
- "iopub.status.busy": "2026-10-08T18:11:23.317174Z",
- "iopub.status.idle": "2026-10-08T18:11:27.838449Z",
- "shell.execute_reply": "2026-10-08T18:11:27.837442Z"
+ "iopub.execute_input": "2026-10-25T18:36:07.058156Z",
+ "iopub.status.busy": "2026-10-25T18:36:07.057894Z",
+ "iopub.status.idle": "2026-10-25T18:36:09.746281Z",
+ "shell.execute_reply": "2026-10-25T18:36:09.745308Z"
}
},
"outputs": [
@@ -251,7 +304,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_27580\\1808415648.py:29: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
+ "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_43032\\3749224625.py:30: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
" return timescale.from_datetimes([t.to_pydatetime() for t in pd.DatetimeIndex(values)])\n"
]
}
@@ -273,19 +326,37 @@
" VelocityFrame,\n",
" ViewGeometry,\n",
" compute_argument_of_latitude,\n",
+ " compute_glint_angle,\n",
" compute_projected_ray_position,\n",
" compute_view_angles,\n",
" geodesic_distance,\n",
")\n",
"\n",
"orbit = GeneralPerturbationsOrbit.from_tle(TLE)\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"\n",
"\n",
"def times_of(values):\n",
" \"\"\"Skyfield times of pandas timestamps.\"\"\"\n",
- " return timescale.from_datetimes([t.to_pydatetime() for t in pd.DatetimeIndex(values)])\n",
+ " return timescale.from_datetimes(\n",
+ " [t.to_pydatetime() for t in pd.DatetimeIndex(values)]\n",
+ " )\n",
"\n",
"\n",
"def ephemeris_track(frame):\n",
@@ -298,7 +369,9 @@
" )\n",
"\n",
"\n",
- "nav[\"argument_of_latitude\"] = compute_argument_of_latitude(*(lambda track: (track.position.m, track.velocity.m_per_s))(ephemeris_track(nav)))"
+ "nav[\"argument_of_latitude\"] = compute_argument_of_latitude(\n",
+ " *(lambda track: (track.position.m, track.velocity.m_per_s))(ephemeris_track(nav))\n",
+ ")"
]
},
{
@@ -317,21 +390,13 @@
"id": "2e107ee4",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:27.840449Z",
- "iopub.status.busy": "2026-10-08T18:11:27.840449Z",
- "iopub.status.idle": "2026-10-08T18:11:27.933895Z",
- "shell.execute_reply": "2026-10-08T18:11:27.932887Z"
+ "iopub.execute_input": "2026-10-25T18:36:09.748738Z",
+ "iopub.status.busy": "2026-10-25T18:36:09.748311Z",
+ "iopub.status.idle": "2026-10-25T18:36:09.797081Z",
+ "shell.execute_reply": "2026-10-25T18:36:09.796311Z"
}
},
"outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_27580\\174024740.py:2: FutureWarning: The behavior of DatetimeProperties.to_pydatetime is deprecated, in a future version this will return a Series containing python datetime objects instead of an ndarray. To retain the old behavior, call `np.array` on the result\n",
- " tle_xyz = orbit.get_orbit_track(list(sample.time.dt.to_pydatetime())).frame_xyz(itrs).km\n"
- ]
- },
{
"data": {
"text/html": [
@@ -362,31 +427,31 @@
" \n",
"
"
]
@@ -865,12 +1032,18 @@
],
"source": [
"fig, axes = plt.subplots(1, 2, figsize=(12, 3.8))\n",
- "for (day, frame), color in zip(nav.groupby(nav.time.dt.strftime(\"%Y-%m-%d\")), [BLUE, ORANGE]):\n",
+ "for (day, frame), color in zip(\n",
+ " nav.groupby(nav.time.dt.strftime(\"%Y-%m-%d\")), [BLUE, ORANGE]\n",
+ "):\n",
" tilt = np.interp(frame.time.astype(\"int64\"), scans.time.astype(\"int64\"), scans.tilt)\n",
" u = (frame.argument_of_latitude + 180) % 360 - 180\n",
" axes[0].scatter(u, tilt, s=1, color=color, label=day)\n",
" axes[1].scatter(u, tilt, s=4, color=color, label=day)\n",
- "axes[0].set(xlabel=\"Argument of latitude (deg, from the ascending node)\", ylabel=\"OCI tilt (deg, positive forward)\", title=\"Tilt over the day side\")\n",
+ "axes[0].set(\n",
+ " xlabel=\"Argument of latitude (deg, from the ascending node)\",\n",
+ " ylabel=\"OCI tilt (deg, positive forward)\",\n",
+ " title=\"Tilt over the day side\",\n",
+ ")\n",
"axes[1].set(xlabel=\"Argument of latitude (deg)\", xlim=(-10, 5), title=\"Tilt changes\")\n",
"axes[0].legend(frameon=False, markerscale=6)\n",
"plt.show()"
@@ -900,10 +1073,10 @@
"id": "364c3783",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:48.180529Z",
- "iopub.status.busy": "2026-10-08T18:11:48.180529Z",
- "iopub.status.idle": "2026-10-08T18:13:46.647291Z",
- "shell.execute_reply": "2026-10-08T18:13:46.646283Z"
+ "iopub.execute_input": "2026-10-25T18:36:27.116158Z",
+ "iopub.status.busy": "2026-10-25T18:36:27.115968Z",
+ "iopub.status.idle": "2026-10-25T18:37:34.423924Z",
+ "shell.execute_reply": "2026-10-25T18:37:34.422956Z"
}
},
"outputs": [
@@ -911,7 +1084,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_27580\\510968519.py:86: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
+ "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_43032\\1465380329.py:86: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
" track = orbit.get_orbit_track(row.epoch.to_pydatetime())\n"
]
},
@@ -919,7 +1092,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_27580\\510968519.py:86: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
+ "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_43032\\1465380329.py:86: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
" track = orbit.get_orbit_track(row.epoch.to_pydatetime())\n"
]
},
@@ -927,7 +1100,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_27580\\510968519.py:86: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
+ "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_43032\\1465380329.py:86: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
" track = orbit.get_orbit_track(row.epoch.to_pydatetime())\n"
]
},
@@ -981,7 +1154,7 @@
"
7533.0
\n",
"
99.91
\n",
"
0.15
\n",
- "
0.49
\n",
+ "
0.50
\n",
"
77.86
\n",
"
618.0
\n",
"
77.86
\n",
@@ -1017,7 +1190,7 @@
"\n",
" time difference, 95th percentile (s) \\\n",
"pitch profile, per day 0.45 \n",
- "pitch profile, first day 0.49 \n",
+ "pitch profile, first day 0.50 \n",
"no tilt 42.94 \n",
"\n",
" time difference, max (s) \\\n",
@@ -1053,7 +1226,10 @@
],
"source": [
"lattice = generate_points_fibonacci_lattice(500e3)\n",
- "points = [Point(id=i, latitude=r.geometry.y, longitude=r.geometry.x) for i, r in enumerate(lattice.itertuples())]\n",
+ "points = [\n",
+ " Point(id=i, latitude=r.geometry.y, longitude=r.geometry.x)\n",
+ " for i, r in enumerate(lattice.itertuples())\n",
+ "]\n",
"point_xyz = np.array([wgs84.latlon(p.latitude, p.longitude).itrs_xyz.m for p in points])\n",
"\n",
"# OCI observation times from the sampled pixels\n",
@@ -1061,37 +1237,72 @@
"for gi, g in enumerate(granules):\n",
" valid = ~np.isnan(g[\"latitude\"])\n",
" rows, cols = np.nonzero(valid)\n",
- " position = wgs84.latlon(g[\"latitude\"][valid], g[\"longitude\"][valid], g[\"height\"][valid]).itrs_xyz.m.T\n",
+ " position = wgs84.latlon(\n",
+ " g[\"latitude\"][valid], g[\"longitude\"][valid], g[\"height\"][valid]\n",
+ " ).itrs_xyz.m.T\n",
" pixel_xyz.append(position)\n",
" pixel_index.append(np.column_stack([np.full(len(rows), gi), rows, cols]))\n",
"pixel_xyz, pixel_index = np.concatenate(pixel_xyz), np.concatenate(pixel_index)\n",
"tree = cKDTree(pixel_xyz)\n",
- "flip_times = pd.DatetimeIndex(np.concatenate([flips.start.to_numpy(), flips.end.to_numpy()]))\n",
+ "flip_times = pd.DatetimeIndex(\n",
+ " np.concatenate([flips.start.to_numpy(), flips.end.to_numpy()])\n",
+ ")\n",
"reference = []\n",
"for pid, xyz in enumerate(point_xyz):\n",
" nearby = tree.query_ball_point(xyz, 30e3)\n",
" if not nearby:\n",
" continue\n",
- " candidates = pd.DataFrame(pixel_index[nearby], columns=[\"granule\", \"row\", \"column\"]).assign(distance=np.linalg.norm(pixel_xyz[nearby] - xyz, axis=1))\n",
- " candidates[\"time\"] = [granules[g][\"nav_times\"][r] for g, r in zip(candidates.granule, candidates.row)]\n",
- " candidates[\"pass\"] = (candidates.sort_values(\"time\").time.diff().dt.total_seconds() > 600).cumsum().reindex(candidates.index)\n",
- " for _, group in candidates.sort_values(\"time\").groupby((candidates.sort_values(\"time\").time.diff().dt.total_seconds() > 600).cumsum()):\n",
+ " candidates = pd.DataFrame(\n",
+ " pixel_index[nearby], columns=[\"granule\", \"row\", \"column\"]\n",
+ " ).assign(distance=np.linalg.norm(pixel_xyz[nearby] - xyz, axis=1))\n",
+ " candidates[\"time\"] = [\n",
+ " granules[g][\"nav_times\"][r] for g, r in zip(candidates.granule, candidates.row)\n",
+ " ]\n",
+ " candidates[\"pass\"] = (\n",
+ " (candidates.sort_values(\"time\").time.diff().dt.total_seconds() > 600)\n",
+ " .cumsum()\n",
+ " .reindex(candidates.index)\n",
+ " )\n",
+ " for _, group in candidates.sort_values(\"time\").groupby(\n",
+ " (candidates.sort_values(\"time\").time.diff().dt.total_seconds() > 600).cumsum()\n",
+ " ):\n",
" best = group.loc[group.distance.idxmin()]\n",
" g, r, c = granules[int(best.granule)], int(best.row), int(best.column)\n",
" if c in (0, len(g[\"columns\"]) - 1):\n",
" continue\n",
" # interpolate the time of the scan through the point between adjacent sampled scans\n",
" r0, r1 = (r, r + 1) if r + 1 < len(g[\"nav_rows\"]) else (r - 1, r)\n",
- " x0, x1 = (wgs84.latlon(g[\"latitude\"][k, c], g[\"longitude\"][k, c], g[\"height\"][k, c]).itrs_xyz.m for k in (r0, r1))\n",
+ " x0, x1 = (\n",
+ " wgs84.latlon(\n",
+ " g[\"latitude\"][k, c], g[\"longitude\"][k, c], g[\"height\"][k, c]\n",
+ " ).itrs_xyz.m\n",
+ " for k in (r0, r1)\n",
+ " )\n",
" fraction = np.dot(xyz - x0, x1 - x0) / np.dot(x1 - x0, x1 - x0)\n",
- " time = g[\"nav_times\"][r0] + (g[\"nav_times\"][r1] - g[\"nav_times\"][r0]) * float(fraction)\n",
- " if ((flips.start - pd.Timedelta(seconds=2) <= time) & (time <= flips.end + pd.Timedelta(seconds=2))).any():\n",
+ " time = g[\"nav_times\"][r0] + (g[\"nav_times\"][r1] - g[\"nav_times\"][r0]) * float(\n",
+ " fraction\n",
+ " )\n",
+ " if (\n",
+ " (flips.start - pd.Timedelta(seconds=2) <= time)\n",
+ " & (time <= flips.end + pd.Timedelta(seconds=2))\n",
+ " ).any():\n",
" continue\n",
- " reference.append({\"point_id\": points[pid].id, \"latitude\": points[pid].latitude, \"time\": time, \"scan angle (deg)\": float(g[\"scan_angle\"][c])})\n",
+ " reference.append(\n",
+ " {\n",
+ " \"point_id\": points[pid].id,\n",
+ " \"latitude\": points[pid].latitude,\n",
+ " \"time\": time,\n",
+ " \"scan angle (deg)\": float(g[\"scan_angle\"][c]),\n",
+ " }\n",
+ " )\n",
"reference = pd.DataFrame(reference)\n",
- "reference = reference[(reference.time >= pd.Timestamp(START)) & (reference.time < pd.Timestamp(END))].reset_index(drop=True)\n",
+ "reference = reference[\n",
+ " (reference.time >= pd.Timestamp(START)) & (reference.time < pd.Timestamp(END))\n",
+ "].reset_index(drop=True)\n",
"# time from the nearest tilt change\n",
- "reference[\"from tilt change (s)\"] = [np.min(np.abs((flip_times - t).total_seconds())) for t in reference.time]\n",
+ "reference[\"from tilt change (s)\"] = [\n",
+ " np.min(np.abs((flip_times - t).total_seconds())) for t in reference.time\n",
+ "]\n",
"# periods of OCI data collection (scans less than 5 s apart)\n",
"collecting = scans.time.diff().dt.total_seconds().gt(5).cumsum()\n",
"collection = scans.groupby(collecting).time.agg([\"min\", \"max\"])\n",
@@ -1100,8 +1311,15 @@
"def profile(day):\n",
" \"\"\"Pitch angle profile of a day's tilt schedule.\"\"\"\n",
" rows = flips[(flips.day == day) & (flips.direction == \"aft to forward\")]\n",
- " start, end = np.median(rows[\"argument of latitude, start (deg)\"]), np.median(rows[\"argument of latitude, end (deg)\"])\n",
- " return [(float(start), -19.827), (float(end), 19.863), (178.0, 19.863), (182.0, -19.827)]\n",
+ " start, end = np.median(rows[\"argument of latitude, start (deg)\"]), np.median(\n",
+ " rows[\"argument of latitude, end (deg)\"]\n",
+ " )\n",
+ " return [\n",
+ " (float(start), -19.827),\n",
+ " (float(end), 19.863),\n",
+ " (178.0, 19.863),\n",
+ " (182.0, -19.827),\n",
+ " ]\n",
"\n",
"\n",
"days = sorted(flips.day.unique())\n",
@@ -1109,14 +1327,24 @@
"\n",
"def oci(**kwargs):\n",
" return PointedInstrument(\n",
- " name=\"OCI\", field_of_regard=120, cross_track_field_of_view=112.9, along_track_field_of_view=0.1,\n",
- " is_rectangular=True, view_geometry=ViewGeometry.SCAN, min_target_solar_elevation=-8, **kwargs,\n",
+ " name=\"OCI\",\n",
+ " field_of_regard=120,\n",
+ " cross_track_field_of_view=112.9,\n",
+ " along_track_field_of_view=0.1,\n",
+ " is_rectangular=True,\n",
+ " view_geometry=ViewGeometry.SCAN,\n",
+ " min_target_solar_elevation=-8,\n",
+ " **kwargs,\n",
" )\n",
"\n",
"\n",
"models = {\n",
- " \"pitch profile, per day\": [(oci(pitch_angle_profile=profile(day)), day) for day in days],\n",
- " \"pitch profile, first day\": [(oci(pitch_angle_profile=profile(days[0])), day) for day in days],\n",
+ " \"pitch profile, per day\": [\n",
+ " (oci(pitch_angle_profile=profile(day)), day) for day in days\n",
+ " ],\n",
+ " \"pitch profile, first day\": [\n",
+ " (oci(pitch_angle_profile=profile(days[0])), day) for day in days\n",
+ " ],\n",
" \"no tilt\": [(oci(), day) for day in days],\n",
"}\n",
"\n",
@@ -1124,13 +1352,21 @@
"def observe(point, instrument, day):\n",
" satellite = Satellite(name=\"PACE\", orbit=orbit, instruments=[instrument])\n",
" start = datetime.fromisoformat(day).replace(tzinfo=timezone.utc)\n",
- " return collect_observations(point, satellite, start, start + timedelta(days=1)).assign(point_id=point.id)\n",
+ " return collect_observations(\n",
+ " point, satellite, start, start + timedelta(days=1), omit_solar=False\n",
+ " ).assign(point_id=point.id)\n",
"\n",
"\n",
"predicted = {}\n",
"for label, runs in models.items():\n",
- " frames = Parallel(n_jobs=-1)(delayed(observe)(point, instrument, day) for instrument, day in runs for point in points)\n",
- " predicted[label] = pd.concat([f for f in frames if not f.empty])[[\"point_id\", \"epoch\", \"geometry\"]]\n",
+ " frames = Parallel(n_jobs=-1)(\n",
+ " delayed(observe)(point, instrument, day)\n",
+ " for instrument, day in runs\n",
+ " for point in points\n",
+ " )\n",
+ " predicted[label] = pd.concat([f for f in frames if not f.empty])[\n",
+ " [\"point_id\", \"epoch\", \"geometry\", \"glint_angle\"]\n",
+ " ]\n",
"\n",
"\n",
"def scan_angle(frame, instrument_by_day):\n",
@@ -1139,16 +1375,25 @@
" for row in frame.itertuples():\n",
" track = orbit.get_orbit_track(row.epoch.to_pydatetime())\n",
" instrument = instrument_by_day[row.epoch.strftime(\"%Y-%m-%d\")]\n",
- " roll, _ = compute_view_angles(track, wgs84.latlon(row.geometry.y, row.geometry.x), tilt_angle=instrument.get_pitch_angle(track))\n",
+ " roll, _ = compute_view_angles(\n",
+ " track,\n",
+ " wgs84.latlon(row.geometry.y, row.geometry.x),\n",
+ " tilt_angle=instrument.get_pitch_angle(track),\n",
+ " )\n",
" angles.append(-float(roll))\n",
" return angles\n",
"\n",
+ "\n",
"rows4, matched4, found4 = {}, {}, {}\n",
"for label, frame in predicted.items():\n",
" merged = pd.merge_asof(\n",
" reference.sort_values(\"time\"),\n",
" frame.rename(columns={\"epoch\": \"predicted\"}).sort_values(\"predicted\"),\n",
- " left_on=\"time\", right_on=\"predicted\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=3),\n",
+ " left_on=\"time\",\n",
+ " right_on=\"predicted\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=3),\n",
" )\n",
" merged[\"difference (s)\"] = (merged.predicted - merged.time).dt.total_seconds()\n",
" matched4[label] = merged\n",
@@ -1157,22 +1402,40 @@
" inside = np.zeros(len(frame), bool)\n",
" for start, end in collection.itertuples(index=False):\n",
" inside |= (frame.epoch >= start).to_numpy() & (frame.epoch <= end).to_numpy()\n",
- " candidates = frame[inside & np.array([np.min(np.abs((flip_times - t).total_seconds())) > 30 for t in frame.epoch])].copy()\n",
- " candidates[\"scan angle (deg)\"] = scan_angle(candidates, dict(zip(days, [instrument for instrument, _ in models[label]])))\n",
+ " candidates = frame[\n",
+ " inside\n",
+ " & np.array(\n",
+ " [np.min(np.abs((flip_times - t).total_seconds())) > 30 for t in frame.epoch]\n",
+ " )\n",
+ " ].copy()\n",
+ " candidates[\"scan angle (deg)\"] = scan_angle(\n",
+ " candidates, dict(zip(days, [instrument for instrument, _ in models[label]]))\n",
+ " )\n",
" candidates = candidates[candidates[\"scan angle (deg)\"].abs() < 55.5]\n",
" found = pd.merge_asof(\n",
- " candidates.sort_values(\"epoch\"), reference[[\"point_id\", \"time\"]].sort_values(\"time\"),\n",
- " left_on=\"epoch\", right_on=\"time\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=3),\n",
+ " candidates.sort_values(\"epoch\"),\n",
+ " reference[[\"point_id\", \"time\"]].sort_values(\"time\"),\n",
+ " left_on=\"epoch\",\n",
+ " right_on=\"time\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=3),\n",
" )\n",
" found4[label] = found\n",
" rows4[label] = {\n",
" \"OCI observations\": len(merged),\n",
" \"matched (%)\": 100 * merged.predicted.notna().mean(),\n",
" \"time difference, median (s)\": merged[\"difference (s)\"].abs().median(),\n",
- " \"time difference, 95th percentile (s)\": merged[\"difference (s)\"].abs().quantile(0.95),\n",
+ " \"time difference, 95th percentile (s)\": merged[\"difference (s)\"]\n",
+ " .abs()\n",
+ " .quantile(0.95),\n",
" \"time difference, max (s)\": merged[\"difference (s)\"].abs().max(),\n",
" \"within 2 min of a tilt change: observations\": int(near.sum()),\n",
- " \"within 2 min of a tilt change: time difference, max (s)\": merged.loc[near, \"difference (s)\"].abs().max(),\n",
+ " \"within 2 min of a tilt change: time difference, max (s)\": merged.loc[\n",
+ " near, \"difference (s)\"\n",
+ " ]\n",
+ " .abs()\n",
+ " .max(),\n",
" \"TAT-C observations in OCI's collection and swath\": len(found),\n",
" \"found in OCI data (%)\": 100 * found.time.notna().mean(),\n",
" }\n",
@@ -1185,10 +1448,10 @@
"id": "baedbc76",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:13:46.651291Z",
- "iopub.status.busy": "2026-10-08T18:13:46.651291Z",
- "iopub.status.idle": "2026-10-08T18:13:46.704248Z",
- "shell.execute_reply": "2026-10-08T18:13:46.703240Z"
+ "iopub.execute_input": "2026-10-25T18:37:34.425829Z",
+ "iopub.status.busy": "2026-10-25T18:37:34.425582Z",
+ "iopub.status.idle": "2026-10-25T18:37:34.442400Z",
+ "shell.execute_reply": "2026-10-25T18:37:34.441491Z"
}
},
"outputs": [
@@ -1286,8 +1549,12 @@
"source": [
"found = found4[\"pitch profile, per day\"]\n",
"found[\"day\"] = found.epoch.dt.strftime(\"%Y-%m-%d\")\n",
- "found[\"scan angle bin (deg)\"] = pd.cut(found[\"scan angle (deg)\"].abs(), [0, 20, 40, 50, 55.5])\n",
- "found.groupby([\"day\", \"scan angle bin (deg)\"], observed=True).time.agg(predicted=\"size\", found=lambda x: 100 * x.notna().mean()).rename(columns={\"found\": \"found in OCI data (%)\"}).round(2).unstack(0)"
+ "found[\"scan angle bin (deg)\"] = pd.cut(\n",
+ " found[\"scan angle (deg)\"].abs(), [0, 20, 40, 50, 55.5]\n",
+ ")\n",
+ "found.groupby([\"day\", \"scan angle bin (deg)\"], observed=True).time.agg(\n",
+ " predicted=\"size\", found=lambda x: 100 * x.notna().mean()\n",
+ ").rename(columns={\"found\": \"found in OCI data (%)\"}).round(2).unstack(0)"
]
},
{
@@ -1296,16 +1563,16 @@
"id": "8710dde7",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:13:46.706259Z",
- "iopub.status.busy": "2026-10-08T18:13:46.706259Z",
- "iopub.status.idle": "2026-10-08T18:13:46.903313Z",
- "shell.execute_reply": "2026-10-08T18:13:46.902301Z"
+ "iopub.execute_input": "2026-10-25T18:37:34.444081Z",
+ "iopub.status.busy": "2026-10-25T18:37:34.443905Z",
+ "iopub.status.idle": "2026-10-25T18:37:34.601139Z",
+ "shell.execute_reply": "2026-10-25T18:37:34.600278Z"
}
},
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/AAAAF4CAYAAADzIxKSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA829JREFUeJzs3Xd8FGX+wPHPzLZssumVECCgoBQpShE4BeUUD1QEPUX0p+ideqdiPfU8G3CWs6PYTr0DPAU8T1FsiKIURQURbCDSAiG9160z8/tjsptsGhBCSfy+Xy9fsrNTnplnNrvfeZ7n+yiGYRgIIYQQQgghhBDiqKYe6QIIIYQQQgghhBBi3ySAF0IIIYQQQgghOgAJ4IUQQgghhBBCiA5AAnghhBBCCCGEEKIDkABeCCGEEEIIIYToACSAF0IIIYQQQgghOgAJ4IUQQgghhBBCiA5AAnghhBBCCCGEEKIDkABeCCGEEEIIIYToACSAF0IIcdh99dVX/P73v6dLly7Y7XbS0tK44IIL+PLLL5usO3PmTBRFobi4+AiU9PB47rnnmD9/fpPlWVlZKIrS7HuH2gcffMDMmTObfS8zM5Pp06cf1vK0RfDeaai5sm/cuJExY8YQGxuLoijMmTMHgBUrVjB06FCioqJQFIW333778BRcCCGEaIH1SBdACCHEr8vcuXO56aabGD58OI888gg9evRgz549PPvss/zmN7/hqaee4vrrrz/SxTysnnvuOZKSkpoEll26dOHLL7/kmGOOOexl+uCDD3j22WebDeKXLFlCTEzMYS9Te2iu7FdeeSU1NTUsXryY+Ph4MjMzMQyDCy+8kD59+rB06VKioqI47rjjjlCphRBCCJME8EIIIQ6bL774gptuuokJEyawZMkSrNb6r6GpU6cyefJkbrzxRoYMGcLo0aOPYEmb53a7cTqdh+14DoeDk08++bAdb38NGTLkSBehzZor+48//shVV13F7373u9CynJwcSktLmTx5MuPGjWuXY/v9fhRFCbvvhRBCiAMhXeiFEEIcNg899BCKovD88883CWKsVivPPfcciqLwj3/8o8m22dnZTJkyhZiYGGJjY7n00kspKioKW+fTTz9l7NixJCYm4nQ66d69O+effz61tbWhdXw+H/fffz/HH388DoeD5ORkrrjiiib7yszM5Oyzz+att95iyJAhREREMGvWLIYMGcIpp5zSpHyaptG1a1emTJkSWjZr1ixGjBhBQkICMTExnHjiifzrX//CMIyw4/z000+sWrUKRVFQFIXMzEyg5S70n3/+OePGjSM6OprIyEhGjRrF+++/H7bO/PnzURSFzz77jD//+c8kJSWRmJjIlClTyM3NbaZ26k2fPp1nn30WIFQmRVHIysoKlblhb4GVK1eiKAoLFy7kjjvuoEuXLrhcLs455xwKCgqoqqri6quvJikpiaSkJK644gqqq6vDjmkYBs899xyDBw/G6XQSHx/PBRdcwM6dO1sta9D777/P4MGDcTgc9OzZk8cee6zZ9RqWPXiNAoEAzz//fOg8Z86cSUZGBgB33HFHWJ0AbNu2jWnTppGSkoLD4aBv376h69X4mvznP//h1ltvpWvXrjgcDrZv3w7AJ598wrhx44iJiSEyMpLRo0ezYsWKsH0EhwD89NNPXHzxxcTGxpKamsqVV15JRUVF2Lq6rjN37tzQ9YuLi+Pkk09m6dKlYeu9/vrrjBw5kqioKFwuF+PHj2fjxo1h6+zcuZOpU6eSnp6Ow+EgNTWVcePGsWnTpv2qCyGEEIeOPAIWQghxWGiaxmeffcbQoUNDwVFj3bp146STTuLTTz9F0zQsFkvovcmTJ3PhhRfypz/9iZ9++ol77rmHzZs38/XXX2Oz2cjKymLixImccsop/Pvf/yYuLo6cnByWLVuGz+cjMjISXdeZNGkSa9as4fbbb2fUqFHs3r2b++67j7Fjx/LNN9+EtbB/++23bNmyhbvvvpuePXsSFRVFeno6N954I9u2baN3796hdZcvX05ubi5XXHFFaFlWVhbXXHMN3bt3B8yx/zNmzCAnJ4d7770XMLt0X3DBBcTGxvLcc88BZst7S1atWsUZZ5zBwIED+de//oXD4eC5557jnHPOYdGiRVx00UVh6//xj39k4sSJLFy4kOzsbG677TYuvfRSPv300xaPcc8991BTU8P//ve/sLwEXbp0aXEbgL/97W+cdtppzJ8/n6ysLP7yl79w8cUXY7VaGTRoEIsWLWLjxo387W9/Izo6mqeffjq07TXXXMP8+fO54YYbePjhhyktLWX27NmMGjWK7777jtTU1BaPu2LFCiZNmsTIkSNZvHgxmqbxyCOPUFBQ0Gp5J06cyJdffsnIkSO54IILuPXWWwHIyMhg0KBBTJkyhRkzZjBt2rRQnWzevJlRo0bRvXt3Hn/8cdLS0vjoo4+44YYbKC4u5r777gs7xp133snIkSN54YUXUFWVlJQUXn31VS677DImTZrEggULsNls/POf/2T8+PF89NFHTVr8zz//fC666CL+8Ic/8MMPP3DnnXcC8O9//zu0zvTp03n11Vf5wx/+wOzZs7Hb7Xz77behhy4ADz74IHfffTdXXHEFd999Nz6fj0cffZRTTjmFdevW0a9fPwAmTJgQuobdu3enuLiYtWvXUl5e3ur1FEIIcRgYQgghxGGQn59vAMbUqVNbXe+iiy4yAKOgoMAwDMO47777DMC4+eabw9Z77bXXDMB49dVXDcMwjP/9738GYGzatKnFfS9atMgAjDfffDNs+fr16w3AeO6550LLevToYVgsFmPr1q1h6xYXFxt2u93429/+Frb8wgsvNFJTUw2/39/ssTVNM/x+vzF79mwjMTHR0HU99F7//v2NMWPGNNlm165dBmDMmzcvtOzkk082UlJSjKqqqtCyQCBgDBgwwMjIyAjtd968eQZgXHvttWH7fOSRRwzAyMvLa7acQdddd53R0s+EHj16GJdffnno9WeffWYAxjnnnBO23k033WQAxg033BC2/LzzzjMSEhJCr7/88ksDMB5//PGw9bKzsw2n02ncfvvtrZZ1xIgRRnp6uuF2u0PLKisrjYSEhCbn0LjshmEYgHHdddeFLQte+0cffTRs+fjx442MjAyjoqIibPn1119vREREGKWlpYZh1F+TU089NWy9mpoaIyEhocm10jTNGDRokDF8+PDQsuC9/8gjj4Ste+211xoRERGhul69erUBGHfddVez18cwDGPPnj2G1Wo1ZsyYEba8qqrKSEtLMy688ELDMMz7GzDmzJnT4r6EEEIcOdKFXgghxFHFqOte3jh7+CWXXBL2+sILL8RqtfLZZ58BMHjwYOx2O1dffTULFixotuv1e++9R1xcHOeccw6BQCD03+DBg0lLS2PlypVh6w8cOJA+ffqELUtMTOScc85hwYIF6LoOQFlZGe+88w6XXXZZ2NCATz/9lN/+9rfExsZisViw2Wzce++9lJSUUFhYeMDXpqamhq+//poLLrgAl8sVWm6xWPi///s/9u7dy9atW8O2Offcc5ucE8Du3bsP+Pj7cvbZZ4e97tu3L2C2dDdeXlpaGupG/95776EoCpdeemlYvaSlpTFo0KAm9dJQTU0N69evZ8qUKURERISWR0dHc84557TTmZk8Hg8rVqxg8uTJREZGhpV1woQJeDwevvrqq7Btzj///LDXa9eupbS0lMsvvzxse13XOeuss1i/fj01NTVh2zRXhx6PJ3QPffjhhwBcd911LZb9o48+IhAIcNlll4UdNyIigjFjxoSucUJCAscccwyPPvooTzzxBBs3bgzd50IIIY48CeCFEEIcFklJSURGRrJr165W18vKyiIyMpKEhISw5WlpaWGvrVYriYmJlJSUAHDMMcfwySefkJKSwnXXXccxxxzDMcccw1NPPRXapqCggPLycux2OzabLey//Pz8JlPVtdRl/MorryQnJ4ePP/4YgEWLFuH1esPGha9bt44zzzwTgJdeeokvvviC9evXc9dddwFmQrwDVVZWhmEYzZYrPT0dIHQ9ghITE8NeB7uCt+X4+9K4zux2e6vLPR4PYNaLYRikpqY2qZevvvqq1SkEy8rK0HW9yf0BTe+Zg1VSUkIgEGDu3LlNyjlhwgSAfd5DwW79F1xwQZN9PPzwwxiGQWlpadg2+6rDoqIiLBZLq+cbPO6wYcOaHPf1118PlVtRFFasWMH48eN55JFHOPHEE0lOTuaGG26gqqrqgK6XEEKI9idj4IUQQhwWFouF0047jWXLlrF3795mx8Hv3buXDRs28Lvf/S5s/DtAfn4+Xbt2Db0OBAKUlJSEBTennHIKp5xyCpqm8c0334SmrEtNTWXq1KmhRG7Lli1rtozR0dFhrxv3AggaP3486enpzJs3j/HjxzNv3jxGjBgRGkMMsHjxYmw2G++9915Yy/DBzCUeHx+Pqqrk5eU1eS+YmC4pKanN+z9SkpKSUBSFNWvWNDv+v7WcAPHx8SiKQn5+fpP3mlt2MOLj40O9HVpq7e7Zs2fY68b3ULB+5s6d2+IMA62N929OcnIymqaRn5/f4kOn4HH/97//0aNHj1b316NHD/71r38B8Msvv/Df//6XmTNn4vP5eOGFFw6obEIIIdqXBPBCCCEOmzvvvJMPP/yQa6+9liVLloQF6Zqm8ec//xnDMEJJuhp67bXXOOmkk0Kv//vf/xIIBBg7dmyTdS0WCyNGjOD444/ntdde49tvv2Xq1KmcffbZoSRnI0aMaPN5BIO4OXPmsGbNGr755hv++c9/hq0TnC6s4Tm63W7+85//NNmfw+HYrxbxqKgoRowYwVtvvcVjjz0WSrin6zqvvvoqGRkZTbr8t1XDVt5DPXXe2WefzT/+8Q9ycnK48MILD2jbqKgohg8fzltvvcWjjz4aelhSVVXFu+++267ljIyM5LTTTmPjxo0MHDgw1JPgQIwePZq4uDg2b97M9ddf3y7l+t3vfsdDDz3E888/z+zZs5tdZ/z48VitVnbs2NGkW39r+vTpw913382bb77Jt99+2y7lFUII0XYSwAshhDhsRo8ezZw5c7jpppv4zW9+w/XXX0/37t3Zs2cPzz77LF9//TVz5sxh1KhRTbZ96623sFqtnHHGGaEs9IMGDQoFfC+88AKffvopEydOpHv37ng8nlCW7t/+9reAOdf8a6+9xoQJE7jxxhsZPnw4NpuNvXv38tlnnzFp0iQmT568X+dy5ZVX8vDDDzNt2jScTmeT7O8TJ07kiSeeYNq0aVx99dWUlJTw2GOPNduafMIJJ7B48WJef/11evXqRUREBCeccEKzx33ooYc444wzOO200/jLX/6C3W7nueee48cff2TRokUt9ho4UMHjP/zww6EeEW0NWvdl9OjRXH311VxxxRV88803nHrqqURFRZGXl8fnn3/OCSecwJ///OcWt//73//OWWedxRlnnMGtt96Kpmk8/PDDREVFNemOfrCeeuopfvOb33DKKafw5z//mczMTKqqqti+fTvvvvtuq9n9AVwuF3PnzuXyyy+ntLSUCy64gJSUFIqKivjuu+8oKiri+eefP6AynXLKKfzf//0f999/PwUFBZx99tk4HA42btxIZGQkM2bMIDMzk9mzZ3PXXXexc+dOzjrrLOLj4ykoKGDdunVERUUxa9Ysvv/+e66//np+//vf07t3b+x2O59++inff/89f/3rXw/m0gkhhGgHEsALIYQ4rGbMmMGwYcN4/PHHufXWWykpKSEhIYHf/OY3fP7554wcObLZ7d566y1mzpwZmq/7nHPOYc6cOaGAcvDgwSxfvpz77ruP/Px8XC4XAwYMYOnSpaGx6BaLhaVLl/LUU0/xn//8h4ceegir1UpGRgZjxoxpMWhuTp8+fRg1ahRr167lkksuITY2Nuz9008/nX//+988/PDDnHPOOXTt2pWrrrqKlJQU/vCHP4StO2vWLPLy8rjq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MTGRSZMmkZWV1eo5NJaZmcnf//53pk2bhsvlIj09nblz54atU1FRwdVXX01KSgoxMTGcfvrpfPfdd6H3Z86cyeDBg/n3v/9Nr169cDgcYdekofnz59O9e3ciIyOZPHkyJSUlYe/v2LGDSZMmkZqaisvlYtiwYXzyySeh92fPns0JJ5zQZL8nnXRSWK/wQ00CeCGEEEIclGBX/IriAJ4qjZ9WV1BbEZCkeEKIA1ZSHeCllSXkV/g5JsVORoKd5GgrGQl2jkmxk1fh56WVJZRUH5q/LwsWLMBqtfL111/z9NNP8+STT/Lyyy83u+769esBmDdvHnl5eaHX77//PlOmTGHixIls3LiRFStWMHTo0LBtH3/8cYYOHcrGjRu59tpr+fOf/8zPP/980GV79NFHGTBgABs2bOCee+5hw4YNXHjhhUydOpUffviBmTNncs899zB//nyz7P9+iauuuoqRI0eSl5fHW2+9tc9rVFtby2mnnYbL5WL16tV8/vnnuFwuzjrrLHw+3z63b1zegQMH8u2333LnnXdy8803h5KSG4bBxIkTyc/P54MPPmDDhg2ceOKJjBs3jtLS0tA+tm/fzn//+1/efPNNNm3a1Oxxvv76a6688kquvfZaNm3axGmnncb9998ftk51dTUTJkzgk08+YePGjYwfP55zzjmHPXv2AHDllVeyefPmUD0DfP/992zcuJHp06cf0HkfjA7ThV4IIYQQR6dgV/xt66v5aXUFMYlWtIA5Jl7GwwshDsS6nbXklpnBu6qGj3tXVYWeSXZ2FPpYv7OWswbGtPvxu3XrxpNPPomiKBx33HH88MMPPPnkk6HW7IaC3czj4uJCU1oDPPDAA0ydOpVZs2aFlg0aNChs2wkTJnDttdcCcMcdd/Dkk0+ycuVKjj/++IMq2+mnn85f/vKX0OtLLrmEcePGcc899wDQp08fNm/ezKOPPsr06dOJj48nMjISu90edg6tWbx4Maqq8vLLL4dyE8ybN4+4uDhWrlzJmWeeuV/7ARg9ejR//etfQ2X74osvePLJJznjjDP47LPP+OGHHygsLAxN+/3YY4/x9ttv87///Y+rr74aMIcK/Oc//2m12/9TTz3F+PHjw461du1ali1bFlpn0KBBYfV0//33s2TJEpYuXcr1119PRkYG48ePZ968eQwbNix03mPGjKFXr177fc4HS1rghRBCCBHirgqQu829X63nDdd1RlvpPcxFQhc71WUaFitEuNT93pcQQgB8vb0Gp11pErwHqaqC067w1faaQ3L8k08+OSxh3siRI9m2bRuapu33PjZt2sS4ceNaXWfgwIGhfyuKQlpaGoWFhQddtsYt/Vu2bGH06NFhy0aPHn3A59TQhg0b2L59O9HR0bhcLlwuFwkJCXg8Hnbs2HFA+xo5cmST11u2bAkdp7q6msTExNBxXC4Xu3btCjtOjx499jlmf8uWLc0eq6Gamhpuv/12+vXrR1xcHC6Xi59//jnUAg9w1VVXsWjRIjweD36/n9dee40rr7zygM75YB3wY/GKigqWLFnCmjVryMrKora2luTkZIYMGcL48eNlznUhhBCig2ouGV1LLegtrRtMiqdGlbB+ael+7UsIIcDsMl3h1nDYWm9jdFhVKtzaUZWdviGn07nPdRonWlMUBV3XD/rYjTPHN3eNWhojvr90Xeekk07itddea/JeeyS/C5ZX13W6dOnCypUrm6zTcPq3/cmWvz/nfNttt/HRRx/x2GOPceyxx+J0OrngggvChgWcc845OBwOlixZgsPhwOv1cv755+/7pNrRfn+T5uXlce+99/Laa6+RlpbG8OHDGTx4ME6nk9LSUj777DMee+wxevTowX333cdFF110KMsthBBCiHbW3LzwLQXdLa0b/C93L/u9LyGEADNwi3Va2FvW+jhqb0AnOdp+SIL3r776qsnr3r17Y7FYml3fZrM1ackeOHAgK1as4IorrjiiZQPo168fn3/+ediytWvX0qdPn1a3a82JJ57I66+/HkosdzCaO6fgMIITTzyR/Px8rFZrWILAtujXr1+zx2pozZo1TJ8+ncmTJwPmmPjGifmsViuXX3458+bNw+FwMHXqVCIjIw+qbAdqv79JBw0axGWXXca6devCphhoyO128/bbb/PEE0+QnZ0dNv5CCCGEEEcvd1UAb62GK8FCdam2z3nh9zWHvMWqtNsc80KIX48Rx0ax7Qsvum40241e1w3cPoOTjz00c5RnZ2dzyy23cM011/Dtt98yd+7csKztjWVmZrJixQpGjx6Nw+EgPj6e++67j3HjxnHMMccwdepUAoEAH374IbfffvthLRvArbfeyrBhw/j73//ORRddxJdffskzzzzDc8891+ZyXHLJJTz66KNMmjSJ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CCGEOPqV5fspzfFh6Aa6blCa6wsLwINzxQcz0geD94YJ7VSVsC74ES61SbZ6IYRorFv/SPw+HUNvPog3dAO/T6db/8hDcvzs7GxuueUWtm7dyqJFi5g7dy433nhji+tnZmayYsUK8vPzKSsrA8yka4sWLeK+++5jy5Yt/PDDDzzyyCOHvWwAt956KytWrODvf/87v/zyCwsWLOCZZ54JG9t9oC655BKSkpKYNGkSa9asYdeuXaxatYobb7yRvXv3tnm/++vee+/lnXfeYfv27fz000+899579O3bF4CUlBScTifLli2joKCAioqKZvfxpz/9iR07doSu58KFC0OJ/YKOPfZYPv74Y9auXcuWLVu45ppryM/Pb7KvSy65hJycHF566aWwsfqHSpsC+Llz5/LSSy9x1113hT25GTp0KD/88EO7FU4IIYQQh198mo2ErmYCKVVVSEi3h42BB0IZ6cGcRi5/pycs6Z2uEwryh52bwPqlpWHZ6oUQojnd+kYSk2yjNN/fJIg3dIPSfD8xyTa69T00Afxll12G2+1m+PDhXHfddcyYMYOrr766xfUff/xxPv74Y7p168aQIUMAc4q0N954g6VLlzJ48GBOP/30UObyw1k2MFvL//vf/7J48WIGDBjAvffey+zZs5k+fXqbyxEZGcnq1avp3r07U6ZMoW/fvlx55ZW43W5iYszEgitXrkRRlAOaWm5/2e127rzzTgYOHMipp56KxWJh8eLFAFitVp5++mn++c9/kp6ezqRJk5rdR/fu3XnzzTd59913GTRoEC+88AIPPvhg2Dr33HMPJ554IuPHj2fs2LGkpaVx3nnnNdlXTEwM559/Pi6Xq9n325titGEQhNPp5Oeff6ZHjx5ER0fz3XffhboUDBw4ELfbfSjKelhUVlYSGxtLRUVF6AYUR5eiwlySU9KPdDHEISR13PlJHR/93FUB8nd6AEjrFQGYLfPxabYm08iVF/hxJZgP9KtLNVwJFgafa5AQn4Yz2kruNjdrFhXhirdQXaZxysXJoeBfdFzyOe78jlQdF2d7Wbe0hMpiPza7itWuEPCZLe8xyTaGn5NIUjdHux937NixDB48+KjsUXyoynao6nj+/Pk88MADbN68ucl4/87ojDPOoG/fvjz99NOH/FhtyibTs2dPNm3aRI8ePcKWf/jhh/Tr169dCiaEEEKI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yy/T0NDAySefjNaam266aWcUVwzBJ598guu63H777cyYMYOPPvqI0047jY6ODq677rqMaeVcHp3uvfdezjnnHG655RYOOeQQbr/9do466ihWrFjB5MmTd3bxxBC98MIL/OQnP2H//fcnkUhw8cUXs3DhQlasWEF2dnZquiOPPJKlS5emXgcCgZ1RXDFMu+++O88880zqtW3bqb9/+9vfcv3113P33Xczc+ZMrrrqKo444ghWrlxJbm7uziiuGKK33noLx3FSrz/66COOOOIIvvvd76bek3N4dJEAXnzuBQKBjLvB8XicRx55hDPPPBOlVMa0BQUFGdOK0Sc3N7ffOnzqqadYsWIFmzZtYsKECQAsWbKExYsXc/XVV5OXl/dZFlUM0ZFHHpkRlE+bNo2VK1dy66239grg5Vwena6//npOPfVUfvjDHwJw44038uSTT3Lrrbfyq1/9aieXTgzVE088kfF66dKllJaWsmzZMg477LDU+8FgUM7XUczn8/VZf1prbrzxRi6++GK+/e1vA3DPPfdQVlbGX//6V3784x9/1kUVw1BSUpLx+te//jXTp0/n8MMPT70n5/DoIl3oxajzyCOPUF9fz+LFi3t9duaZZ1JcXMz+++/Pbbfdhuu6n30BxXb5zW9+Q1FREfvssw9XX311Rvfq1157jT322CMVvAMsWrSIaDTKsmXLdkZxxXZqaWlh3Lhxvd6Xc3n0icViLFu2jIULF2a8v3DhQl599dWdVCoxklpaWgB6nbPPP/88paWlzJw5k9NOO43a2tqdUTwxTKtWrWLChAlMnTqV448/nrVr1wKwbt06ampqMs7pYDDI4YcfLuf0KBWLxfjzn//MKaecktEIJufw6CIt8GLUufPOO1m0aBEVFRUZ71955ZV85StfIRwO869//Yvzzz+f+vp6Lrnkkp1UUjFUZ599Nvvttx+FhYW8+eabXHTRRaxbt44//vGPANTU1FBWVpYxT2FhIYFAgJqamp1RZLEd1qxZw0033cSSJUsy3pdzeXSqr6/HcZxe52hZWZmcn2OA1przzjuPQw89lD322CP1/lFHHcV3v/tdpkyZwrp16/jFL37Bl7/8ZZYtW0YwGNyJJRaDccABB/CnP/2JmTNnsnXrVq666ioOPvhgli9fnjpv+zqnN2zYsDOKK7bTQw89RHNzc0YjmJzDo5AWYie59NJLNTDgv7feeitjnk2bNmnLsvT999+/zeVfd911Oi8vb0cVXwzScOo56f7779eArq+v11prfdppp+mFCxf2ms7v9+v//d//3aHbIfo3nDresmWLnjFjhj711FO3uXw5l0eHLVu2aEC/+uqrGe9fddVVetasWTupVGKknHHGGXrKlCl606ZNA05XVVWl/X6/fuCBBz6jkomR1N7ersvKyvSSJUv0K6+8ogFdVVWVMc0Pf/hDvWjRop1UQrE9Fi5cqL/+9a8POI2cw59/0gIvdpozzzyT448/fsBpKisrM14vXbqUoqIivvnNb25z+QceeCCtra1s3bq1191j8dkZTj0nJbOgrl69mqKiIsrLy3njjTcypmlqaiIej0sd70RDreOqqioWLFjAQQcdxB133LHN5cu5PDoUFxdj23av1vba2lqpt1HurLPO4pFHHuHFF19k0qRJA047fvx4pkyZwqpVqz6j0omRlJ2dzZ577smqVas45phjANP7bfz48alp5JwenTZs2MAzzzzD3//+9wGnk3P4808CeLHTFBcXU1xcPOjptdYsXbqUH/zgB/j9/m1O/+677xIKhSgoKNiOUortNdR6Tvfuu+8CpH44HHTQQVx99dVUV1en3nvqqacIBoPMmTNnZAoshmwodbxlyxYWLFjAnDlzWLp0KZa17VQsci6PDoFAgDlz5vD0009z7LHHpt5/+umn+da3vrUTSyaGS2vNWWedxYMPPsjzzz/P1KlTtzlPQ0MDmzZtygj4xOgRjUb5+OOP+dKXvsTUqVMpLy/n6aefZt999wXMGOoXXniB3/zmNzu5pGKokkkojz766AGnk3P4808CeDFqPPvss6xbt45TTz2112ePPvooNTU1HHTQQYTDYZ577jkuvvhifvSjH8n4nVHitdde4/XXX2fBggXk5+fz1ltvce655/LNb34z9fiphQsXMnv2bE466SSuvfZaGhsbueCCCzjttNMkA/0oUFVVxfz585k8eTLXXXcddXV1qc+S2W/lXB7dzjvvPE466STmzp2b6mGxceNGTj/99J1dNDEMP/nJT/jrX//Kww8/TG5ubqp3RX5+PuFwmPb2di677DKOO+44xo8fz/r16/nv//5viouLM27iiM+vCy64gG984xtMnjyZ2tparrrqKlpbWzn55JNRSnHOOedwzTXXsMsuu7DLLrtwzTXXkJWVxQknnLCziy6GwHVdli5dysknn4zP1x3+yTk8Su3sPvxCDNb3v/99ffDBB/f52T//+U+9zz776JycHJ2VlaX32GMPfeONN+p4PP4Zl1IM17Jly/QBBxyg8/PzdSgU0rNmzdKXXnqp7ujoyJhuw4YN+uijj9bhcFiPGzdOn3nmmToSieykUouhWLp0ab9j5JPkXB79br75Zj1lyhQdCAT0fvvtp1944YWdXSQxTP2dr0uXLtVaa93Z2akXLlyoS0pKtN/v15MnT9Ynn3yy3rhx484tuBi0733ve3r8+PHa7/frCRMm6G9/+9t6+fLlqc9d19WXXnqpLi8v18FgUB922GH6ww8/3IklFsPx5JNPakCvXLky4305h0cnpbXWO+XOgRBCCCGEEEIIIQZNngMvhBBCCCGEEEKMAhLACyGEEEIIIYQQo4AE8EIIIYQQQgghxCggAbwQQgghhBBCCDEKSAAvhBBCCCGEEEKMAhLACyGEEEIIIYQQo4AE8EIIIYQQQgghxCggAbwQQgjxOfD888+jlKK5uXnElz1//nzOOeecz81y+rJ48WKOOeaY7V7OypUrKS8vp62trd9p7r77bgoKCrZ7Xelqa2spKSlhy5YtI7pcIYQQIp0E8EIIIcQIWLx4MUoplFL4/X6mTZvGBRdcQEdHx6DmP/jgg6muriY/P39I6xyJoLen/m4m/P3vf+fKK69Mva6srOTGG28c8fVvj4svvpif/OQn5ObmfqbrLS0t5aSTTuLSSy/9TNcrhBDii0UCeCGEEGKEHHnkkVRXV7N27VquuuoqbrnlFi644IJBzRsIBCgvL0cptYNLOXzjxo37zAPjodi8eTOPPPII//Ef/7FT1v8f//Ef/OUvf6GpqWmnrF8IIcTYJwG8EEIIMUKCwSDl5eVUVFRwwgkn8O///u889NBDAESjUX76059SWlpKKBTi0EMP5a233krN27PVO9nN+8knn2S33XYjJycndYMA4LLLLuOee+7h4YcfTrX8P//884Mq55///Gfmzp1Lbm4u5eXlnHDCCdTW1gKwfv16FixYAEBhYSFKKRYvXgxkdqGfP38+GzZs4Nxzz02tP1muffbZJ2N9N954I5WVlanXjuNw3nnnUVBQQFFRERdeeCFa64x5tNb89re/Zdq0aYTDYfbee2/uv//+Abfrb3/7G3vvvTeTJk3KeP/uu+9m8uTJZGVlceyxx9LQ0NBr3kcffZQ5c+YQCoWYNm0al19+OYlEIvX5J598wqGHHkooFGL27Nk888wzKKVS9Quw5557Ul5ezoMPPjhgOYUQQojhkgBeCCGE2EHC4TDxeByACy+8kAceeIB77rmHd955hxkzZrBo0SIaGxv7nb+zs5PrrruO//f//h8vvvgiGzduTLXoX3DBBfzbv/1bKqivrq7m4IMPHlS5YrEYV155Je+//z4PPfQQ69atSwXpFRUVPPDAA4AZT15dXc3vfve7Xsv4+9//zqRJk7jiiitS6x+sJUuWcNddd3HnnXfy8ssv09jY2CvoveSSS1i6dCm33nory5cv59xzz+XEE0/khRde6He5L774InPnzs1474033uCUU07hjDPO4L333mPBggVcddVVGdM8+eSTnHjiifz0pz9lxYoV3H777dx9991cffXVALiuyzHHHENWVhZvvPEGd9xxBxdffHGfZZg3bx4vvfTSoPeFEEIIMRS+nV0AIYQQYix68803+etf/8pXvvIVOjo6uPXWW7n77rs56qijAPif//kfnn76ae68805+9rOf9bmMeDzObbfdxvTp0wE488wzueKKKwDIyckhHA4TjUYpLy8fUtlOOeWU1N/Tpk3j97//PfPmzaO9vZ2cnBzGjRsHmHHd/SV7GzduHLZtp1rxh+LGG2/koosu4rjjjgPgtttu48knn0x93tHRwfXXX8+zzz7LQQcdlCrnyy+/zO23387hhx/e53LXr1/PnDlzMt773e9+x6JFi/j5z38OwMyZM3n11Vd54oknUtNcffXV/PznP+fkk09OrevKK6/kwgsv5NJLL+Wpp55izZo1PP/886ltvfrqqzniiCN6lWHixIm8++67Q9ofQgghxGBJAC+EEEKMkMcee4ycnBwSiQTxeJxvfetb3HTTTaxZs4Z4PM4hhxySmtbv9zNv3jw+/vjjfpeXlZWVCt4Bxo8fn+rqvj3effddLrvsMt577z0aGxtxXReAjRs3Mnv27O1e/kBaWlqorq5OBeYAPp+PuXPnprrRr1ixgkgk0itAjsVi7Lvvvv0uu6uri1AolPHexx9/zLHHHpvx3kEHHZQRwC9btoy33nor1eIOppt/JBKhs7OTlStXUlFRkXGjYt68eX2WIRwO09nZ2W8ZhRBCiO0hAbwQQggxQhYsWMCtt96K3+9nwoQJ+P1+gFT38p4J6rTWAyatS86fpJTqNVZ8qDo6Oli4cCELFy7kz3/+MyUlJWzcuJFFixYRi8W2a9kAlmX1KmNyGMFgJW8oPP7440ycODHjs2Aw2O98xcXFvRLIDWZ/ua7L5Zdfzre//e1en4VCoW3WU7rGxkZKSkoGNa0QQggxVBLACyGEECMkOzubGTNm9Hp/xowZBAIBXn75ZU444QTABLVvv/32dj1XPRAI4DjOkOb55JNPqK+v59e//jUVFRUAvP32272WC2xz2X2tv6SkhJqamoyg97333kt9np+fz/jx43n99dc57LDDAEgkEixbtoz99tsPgNmzZxMMBtm4cWO/3eX7su+++7JixYqM92bPns3rr7+e8V7P1/vttx8rV67ss+4Adt11VzZu3MjWrVspKysDyEhAmO6jjz5i/vz5gy6zEEIIMRSSxE4IIYTYwbKzs/nP//xPfvazn/HEE0+wYsUKTjvtNDo7Ozn11FOHvdzKyko++OADVq5cSX19/aBauidPnkwgEOCmm25i7dq1PPLIIxnPdgeYMmUKSikee+wx6urqaG9v73f9L774Ilu2bKG+vh4w2enr6ur47W9/y5o1a7j55pv55z//mTHf2Wefza9//WsefPBBPvnkE84444yMZ87n5uZywQUXcO6553LPPfewZs0a3n33XW6++Wbuueeefrdt0aJFvPbaaxk3FX7605/yxBNP8Nvf/pZPP/2UP/zhDxnd5wF++ctf8qc//YnLLruM5cuX8/HHH3PvvfdyySWXAHDEEUcwffp0Tj75ZD744ANeeeWVVBK79Jb5zs5Oli1bxsKFC/stoxBCCLE9JIAXQgghPgO//vWvOe644zjppJPYb7/9WL16NU8++SSFhYXDXuZpp53GrFmzmDt3LiUlJbzyyivbnKekpIS7776b++67j9mzZ/PrX/+a6667LmOaiRMncvnll/Pzn/+csrIyzjzzzD6XdcUVV7B+/XqmT5+e6ja+2267ccstt3DzzTez99578+abb6Yy5yedf/75/OAHP2Dx4sUcdNBB5Obm9hqnfuWVV/LLX/6SX/3qV+y2224sWrSIRx99lKlTp/a7bV/72tfw+/0888wzqfcOPPBA/vjHP3LTTTexzz778NRTT6UC86RFixbx2GOP8fTTT7P//vtz4IEHcv311zNlyhQAbNvmoYceor29nf33358f/vCHqWWkj7l/+OGHmTx5Ml/60pf6LaMQQgixPZTe3sF0QgghhBCfE7fccgsPP/xwRlb7HeGVV17h0EMPZfXq1alEg/PmzeOcc85JDZMQQgghRpqMgRdCCCHEmPGjH/2IpqYm2trayM3NHbHlPvjgg+Tk5LDLLruwevVqzj77bA455JBU8F5bW8t3vvMdvv/974/YOoUQQoiepAVeCCGEEGIb/vSnP3HllVeyadMmiouL+epXv8qSJUsoKira2UUTQgjxBSIBvBBCCCGEEEIIMQpIEjshhBBCCCGEEGIUkABeCCGEEEIIIYQYBSSAF0IIIYQQQgghRgEJ4IUQQgghhBBCiFFAAnghhBBCCCGEEGIUkABeCCGEEEIIIYQYBSSAF0IIIYQQQgghRgEJ4IUQQgghhBBCiFFAAnghhBBCCCGEEGIU+P89oyL7iQUgTQAAAABJRU5ErkJggg==",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/EAAAF5CAYAAADXvaoJAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAA5qVJREFUeJzsnQd8XWX9xp87s5O2abpLSxej7L1BBAFB8Y9gBVGQ6UZRAQcCiqKiIoiKigiCgogyZInsvTcF2lLobpImaXZy1/l/nt+55/bcm5s0SZM0SZ/vh3Jzz3jPe973nHPP8/7GG3Acx4EQQgghhBBCCCGGPcHNXQEhhBBCCCGEEEL0Dol4IYQQQgghhBBihCARL4QQQgghhBBCjBAk4oUQQgghhBBCiBGCRLwQQgghhBBCCDFCkIgXQgghhBBCCCFGCBLxQgghhBBCCCHECEEiXgghhBBCCCGEGCFIxAshhBjW3HfffbjuuuuwpfLwww/jD3/4A4Ybw7Ve+Xj++efx61//GvF4vFf1f+yxx2wd92lpabFlbW1tuOuuu/Cb3/wGN91005DVXQghhMhFIl4IIcRmYdmyZbjlllvwu9/9zj6XL1+ed7sbbrgBP/zhDzGaeeCBB/CnP/0p77pbb70V3/ve97A5GK716s95fOMb30BnZ+dG679gwQJ8+tOfxiuvvIIPPvgAyWQSjY2N2HHHHXHJJZdg8eLFWLVq1RCfgRBCCLGBsO9vIYQQYtCpra3FWWedZRb2D3/4w5gxY4YJ+lNOOQUf//jHzQI6bty4Laon/v73v+P+++/HmWee2WUd22j8+PGq1wCTr13feustE/f/+te/cNxxx2WWX3nllXaNUtiXl5dvlr4QQgghPCTihRBCDBm0aB5wwAFmEX311Vex7bbbZgmoI444AgcddBCeffZZlJaWqmcAnHDCCfZvuDFc67Up9V+0aJF9zpw5s8tyDixJwAshhBgOSMQLIYQYMn7wgx+YIHrqqaeyBDyZP3++uc4fdthh+NGPfoSf/exnXfZ/77338Oijj6KgoMAEf1VVVZdt6AL93HPPoampCXPmzMH++++PaDSatyzWo7W1FXPnzsWHPvQhhEKhzHp6CqxZswannXaaufo/8sgjKCwsNDH3zjvv4Mtf/jKCweyotHfffdf2O/744zFt2jQbjOA/wm0pAvfYYw/ssMMOmX1uu+02LFy40GKuGYPt8cUvftHOk7HbdOE+++yzu5zDiy++aIMhjuNgt912w+677561PvccHnzwQYTDYWu7iRMndttP/a2X/3hLly61NhszZgw+9rGPZfrg/fffz/ThMccc060w3lj/dAfd33mePA77nxb3fOTW/29/+5t5Q5Cbb74Zjz/+eGbbF154AR0dHZl2YF123nnnTb6W6LpPUqkUnnzySbz99tuIRCJ2zW6zzTaZ/dm/9AbYe++9se+++9q2b775pl1jRx55pPVpLizzmWeesT4sKSnBfvvt12VwYmPH9eC58b5lH+6yyy52rwohhNh8KCZeCCHEkEBxdf3115vYpKDIBwXXdtttZ4nsKFz8/PWvfzXRQ0Hx05/+FLNnz8Y999yTtQ1jlrk/E4+99NJLuOyyy7Drrrua4PGIxWI444wzbLt//OMfJtD4nfVauXJll1h8iju6VlP0sf719fX42te+ZnHWufzkJz/BxRdfjMrKSvu+fv16G1TgPwrGf//73ya0TzrppMw+a9euteRpbB9vW/6jwOoudpseDR/5yEdwyCGHmPD873//ax4MRx11lA1e5J4D3cM5sMC2Y5tQ3DLZW0/0p17e8dj+n/nMZ+x4X//61018Njc3W78y3vyJJ57ABRdcgJ122snCK/z0tn/yUVdXZ9cWj8HkdExCxxANf0I7j9z6r169OlMX/u0/59x24LkMxLVEOCDEduC1zXa59957TSjzGvPgsRnT/5///Aef/exnbYCLbcvr6MADD+xyfhTuHGT4xCc+YdcpBxF4vbDvPXpzXF5L7DteOxx44eAIj/nJT36yx34QQggxyDhCCCHEEPDWW29RlTtnn312j9t97nOfs+2WLl1q3xcsWOCUl5c7Z555ppNMJm1ZPB53Pv7xj9vytWvX2rLq6mrb76qrrsoqj+W88847me/f+MY3nEgk4jzxxBOZZU1NTc4uu+ziHHTQQZll+Y67Zs0ap7Oz06msrHROOOGErOOwjOLiYucLX/hCj+f34osvOoFAwPnb3/6WWXbKKac4EydOzLs924vH83PSSSc5hYWFzquvvppZ9vLLLzsFBQXWfv5zqKiocL7yla9kzqGtrc2ZO3euc8ghh/RYz/7Uy2uzc845x0mlUrZsxYoVTjQatXqdddZZmeWrVq2y+l5wwQVZZfS2f/LhHX/RokWZZf/973+dyZMn27XR3NzcY/1vvPFG2+6VV17pVTts6rXEvpgxY4azxx57OA0NDZntn3zySScYDDp//OMfM9c76zVt2jQ7H49HHnnEll977bWZZS0tLc706dOdXXfd1ampqcksZxkPPfSQ/d3b4/7yl7+08+O95ee+++7rtg+EEEIMPrLECyGEGBIaGhrsc+zYsT1u5633tvcsgrSaeu7rdB/+8Y9/bMuZFM6/Pd2e/Wy99dYZF2G6OzMbPq3EjM33KCsrw7e//W1zoaZLvP+43/nOdzLHnTRpkrkUn3zyybjzzjvN8utBF2y6np9++ulZx6cVlx4D11xzjblj0+pJF3JaUvsDz5PZ/GmR9bt00+OAy2jtpQeA32r/3e9+N3MORUVFZlmlGzUtvAMN24xW9kAgYN/p8k3rOD0pGE7hLZ8yZYr1AV3LPfraP7nt8s9//tNc1unS7kEL9Pbbbz/g5zkQ1xKt90yYR88Shh140K2dIQ9//OMfs47J65jn40FPjOnTp5uV3IPXxooVK8xa7w834T1z6KGH2t+9Pa53T7W3t2fVgy78QgghNh+KiRdCCDEkeLHPnityd3jrKYY8KioqLIu9HwozxvF6rvLz5s2zGOvzzjvP3NY9d3MKLG5HuC2T6vEYV199dcZln590k/bcjD3Rz+R6HATIhS7TjFGm2/g555xjy+gqTvdkxrx73HHHHTj11FMxefJkc0vmeXgitqamph+t6NaPLu0U7blw2bXXXmvb7LPPPraMrv08vh8K6EQigerqavt7IOHxKFD9MP6e5z516tSs5dyObu8efe0fP4zrZrv4BzY8uOyhhx4asHMcqGuJIR9ebgPWn/t65XDwh/v78edS8GD/+ae8YwZ9stdee3Vb994elzNGcPCJ99pHP/pRu5+YsyJf+wshhBg6JOKFEEIMCRTZTObFRGw9wfUU/LNmzcosy5fQjGKYVk0vRpvf77rrLov/5T/+zQR5FP+MCWecshc7TKvokiVLupRJQb7VVltlvnux7blQTFEk/fnPf7Z9mFmfyfQo7D0o8D7/+c+b8KGY98N46NyY/97iWc/zJTPzlvkt7Pmy/HvbMaZ7oOnueN0t98dz97V//HjXQb5rJV9bbSoDcS15ZVCE5yZJ5PW65557Zi3rrg39/djT9dHX4zJ3AhPaMX8A4/jp/fKVr3zFYu1pzc+XMFIIIcTgIxEvhBBiSGA2ck7pRes1E2/lc3F++eWX7R/nkfeLMSaTY9Ixv3sws49TKPtdpynkaTHkP0J3Zmbzpjs5E8AxIz5FCy3W+bLf9wVa41lPJjOjKz3Pj272HszOTrd2Zmb3w+V0cfeTK6R6wjtfWlBzYbv6t9lU+lKvgWBT+oeCk+Rar7trq01lIK4l7x4488wzseOOOw5IvbwyX3vttW4TSPbluAxvYQZ//vOy5DPJHoW9/3oXQggxdCgmXgghxJDB7O3jx4+3OOJ169ZlraN7+ec+9zlz/WYmbz/FxcX41a9+lbWM8bx0k2cmci+juN+t2LP+05Xbi5Pnsbn9H/7wh7zWUwry3sJyOHUX3Y05MPF///d/Nv2cB2OVORDxxhtvZFmLL7roItvPz4QJE0zY9yZGnefDuGVa83nOHsyGzmUcwGB5A0Ff6jUQbEr/0DX/8MMPt7AGf66C119/vd/5Bwarrh68D3jNcJApN8M8v1OI9xVmj2ec+4UXXtglP4Q3yNPb4/LTv56DZIybJ7llCyGEGDpkiRdCCDFkMMkZE35R/NCSyU+6HHPubFqzGTPM9blzmNMCzxj5Y4891mLOn376aZs66/e//33G7Z7CjW6+tCzyH133GQdNYc/tPCi6OK0W46R5fFpwOYDAKdcYJ063+N7A+nzqU5/CX/7yF7NQ5ia0o+szE5lx4IIWedbzf//7n015xvm7/bDeP//5z3HiiSdaLDstvN587Pn405/+ZDH/bAtaQ3l8DiQw5jw3Gdqm0Nd6DQSb0j/cl+ELbBfWmYkGGSNOi/Omel4MdF09F/u7777bEg1y7nVeGxTX9Nag+/qXv/zlvDH+GyuTSRc5DRynjGOZvBeY/I5eA7Sk9/a4nFKOg1NMiMcpHTmgw8SJdLf3Bs+EEEIMPRLxQgghhhSKdworJjSjmKWbPMXn7bffbnNee4nfPGhZpvsvrYYUGPxHN+HLL788K9EXhTvd5xkPTwsiXe1p2We5TKrmF9fMFk+BRWFDV30OHlCUMPlc7nF7gm7FjN+nqOUc97kwJp8CiAMTFNqsM8UwY5j9Sd647Nlnn7X53mlRp8Xei/FmubT6+qGVn+fIWHvmEGCbXXXVVSa6vSR+PZ0DE/AxZttLNtgdfa1Xd8djNnPP3d0PByJyY9x72z/54Hb0fOCMBQy3YF0Yx81BH1qO/THc+erP+d7ZLv6wje7qOVDXEsM93nvvPZsDnl4DHHhgMsZLL700kyCQgyesVz73eA4k5XLQQQeZIOe1z1ACerLQc8W/f2+O+81vftMGiXiO9DbgfcQ8EPR4yL1PhRBCDB0BzjM3hMcTQgghhBBCCCFEP1FMvBBCCCGEEEIIMUKQiBdCCCGEEEIIIUYIEvFCCCGEEEIIIcQIQSJeCCGEEEIIIYQYIUjECyGEEEIIIYQQIwSJeCGEEEIIIYQQYoQgEZ8HzrrX1NRkn0IIIYQQQgghxHBBIj4Pzc3NqKiosE8xPFlXu3ZzV0EMMurj0Y/6ePSjPh79qI9HP+rj0Y/6eOQhES9GJI6T2txVEIOM+nj0oz4e/aiPRz/q49GP+nj0oz4eeUjECyGEEEIIIYQQI4QRKeITiQTq6up6jFmPxWJYt26d4tqFEEIIIYQQQowaRpSIX758OY488kiUlJRg3rx5KC8vxze/+U2kUhtcq/k3l40ZMwYzZ87EtGnTcPvtt2/WegshhBBCCCGEEFuciD/zzDPR2NiItWvXmiX+4Ycfxu9//3v84Q9/yGzzy1/+En/5y1/w9NNPW4b5888/HwsWLMDbb7+9WesuhBBCCCGEEEJsUSJ+8eLFOOKIIzB27Fj7vueee2Lu3LlYsmRJZpvf/va3OOOMM7DLLrsgGAzia1/7Grbaaiv88Y9/3Iw1F0IIIYQQQgghNp0wRhAU5FdddRUOPPBAzJgxAw888ABWrVqFU0891dbX1NRg2bJl2H///bP2O+CAA/D8889vploLIYQQQgghhBBboIg/66yz8Nxzz+EjH/mIzePe2tpqon7HHXe09bW1tfY5fvz4rP34ne713dHZ2Wn/POiGL4QQQgghhBBCDDdGlIj/xCc+gY6ODrO4V1ZW4sUXX8SHP/xhW3f22Web+7yXvd5PPB5HKBTqttzLLrsMl1xySZfl62rXoLOjZcDPQ2w6iUQctTWr1ZSjGPXx6Ed9PPpRH49+1MejH/Xx6Ed9PLyomjBlo9sEnJ7maRtGMJnd5MmTcdddd+FjH/tYZvnpp5+OhQsX4plnnjELOi30t9xyiyWz8/j0pz9t0809+OCDvbbET58+3ZLoMQO+GH5QwPfmAhcjF/Xx6Ed9PPpRH49+1MejH/Xx6Ed9PPIYMYntOK1cIBBAc3Nz1nIK7tLSUvubgpsJ7f73v/9l1tMq/9BDD+Gggw7qtuyCggLb1/9PCCGE2FJob05g9eJ2+xRCCCHE8GbEiPiysjJzp//+97+P+++/H4sWLcLVV19tc8B/7nOfy2x34YUX4oYbbrBp515//XWcdtpptvyLX/ziZqy9EEIIMTyhcH/877V44uZa+5SQF0KI7uG01ZwJa1N49dVX8ZWvfGXYNfMbb7yB73znOzatN+vI2b2oqzz+/ve/20xgo41///vf+PWvf42RxIgR8eSvf/0rPvvZz+Liiy/G0UcfjTvuuAN/+9vfbJnHcccdh5tuuskuuP/7v/8zS/1jjz2GqqqqzVp3IYQQYjjSsDaO9dVxlI4N2Se/9xdZ9IUQox3OjPXnP/858/2tt96y3Fx94YMPPsD111+P4UR1dTX23XdfxGIx7L333jal98MPP4wnnngisw0Thfs9nkcLzz//vBmJRxIjKrEd3eaZgC5fEjo/jIf3x8QLIYQQIj9jJ0UwZmLEBDw/+X1TLPpeOQedpMFzIcTAwBReDKsdDmy//fb405/+lPm+YsUKE/X0Ah7JPPvss4hGo/jlL3+ZWcbBiUikf78JYnAZUSJeCCGEEANLUVnYBDct8BTw/D5QFv1IhXpLCNE/6loSeH5pG55b0orG9iQqikLYe04J9ppVjMrSwZEwdCG/9tpr8d3vftdcx5ctW4Y99tjDvH69WbCY+JqCly71XE837FQqlXGxP/TQQ3HSSSchmUxa2O9TTz1l+bZOPPFEbLvttlnH44xb9CpmOZwy+9RTT+12Rq3e1M3bhuHH/OQAw0UXXYQpU6Zg6dKl5q1Mi/vcuXPx+c9/3hKCkzvuuBN/v/lWmwUsN1TgwAMPxAEHHNBtm9XV1Zm39HvvvWeJwZlQfMaMGb1u87/85S/WfhwcoTWc+c9OOOEE8wroy3H+ki5n/vz55h7PwYcf//jH3YYNsC3Y1h/60Ie6rL/nnnus7wjbaLfddrPjeX1Dyz29vn/zm99k2p7ce++95rnAmc+GpTs9L0peJHfffbf9e+2116zRhBBCCDHyoHCfMreo3wLeb9FvaUiidFwInW1JpFIjYgIcIcQwY9HaDvz07mrc9FQ9VjbEEEs69snvP7u72tYPBnRzp0V9n332QW1tLSZNmoTzzjvPYsTzudMz8fZ2221nXgLch/+23nprc0k/4ogj8I1vfMNEIAUlhf2bb76ZKYczYx188MGor6/H1KlTTWx/6Utf2qS6edtQdLe1tWHPPfdEUVERXnrpJey00052/FmzZuHWW2/FrrvuivXr19t+06ZNw+zZs62e3nnwH/OL+d3pc3n33Xdt8IHTfs+bN8+OzyTjFLm9hWHP3/ve92xQobi42AYSmJD8zjvv7NNxHnvsMRu8+MIXvoAJEybY+nxwRjO2y+rVqzFu3DhrwxtvvDFrG/aH1wYTJ07ET37yExx77LGZ9RwEue666/DAAw9k7Udvcf+MZ4OK0wfefPNN58wzz3QqKir4q5z1b8yYMc7ZZ5/tvPXWW85Ip7Gx0c6Jn2J4UlO9anNXQQwy6uPRj/p49NHWFHeWvtrs3P2blc4tlyxzlr7zgS0Toxfdx6Ofoe7jdc1x51s3r3ROvuZ958LbVjkX/Xt15h+/cznXc7uB5vbbbzcNcO2112aWPffcc04gEHBee+01+/6///3PtvG47777nFAolFXOFVdc4ZSXlztr167NLGtvb3fWrVuXdZyHH344s/5f//qXE4lEnEQi0e+6edvcddddWfsefPDBzoIFCzLfOzs7nVmzZjnnn39+po9vvPFGZ+LEiVn7cZ/TTz898/3LX/6yc+yxx2a+H3bYYc65556btc8FF1zgHHLIIU5vOeWUU5yCggJn1aoN19l3vvMdZ86cOU4qler1cU455RRn7Nixzvr163s83oEHHuiceuqpme9NTU1OZWWlc8QRR3S7T11dnVNUVGTt7XHSSSc5J5xwQuY7NTDb/o033nCGgl4PuTO7O909mCGemQo5gsERIMao0C2DIyG0ynPE4uSTT8bvfve7wR19EEIIIcSgwPj23rrX525bUBxCS33S3OqTCXfdplj4hRBbFnShX90Qx+wJUQSD2XHw/L71+Cjeq4nhhaVtOHKnwZkWmu7cHnvttZe5bT/++ONmze4NdKv++Mc/blZcj8LCQvvnQas3LfEe22yzDeLxuLnYT548ud91o3s3vQD8023Tpf+2227LLGPsO8uh9bq/0NL/yCOPWFm0flMT8t/7779vHtt9Yb/99jOXfw/mNqNLOr0eaC3v7XH222+/TIhAPti+TM53wQUXZM2AdtRRR5l3gx9OUf7oo49af9ALnf3FmQnY5oQeEGxnuvlXVlaadwb18Q477IChoNe/qozloOsCGzIXuo3wHxucLiE/+9nPBrqeQgghhBgC8iWo606E59vWnygvFAYKS4M2B/2mxNsLIbYcGANfFA10EfAeXM71zy5pHRQRT7FG3eNn/PjxJuZ6S0NDw0YFP0WpP57ai7emYNyUutF9nmV7UJtRyHO73P1oiO0vPEfWlaKV7uUeFLmM/+8LFMG5dSM8L4Yq9PY4Y8aM6fE4bAuWle94fhFPF3vG359yyinWjwUFBfjPf/5j8foehxxyiA2g0MhNYzdj7DeWfH0g6fWvaW+FOUW+RLwQQggxMsmXoK478Z1vW8bWe4nygiV1eOGu+l4NCAghBC2sTGJXEOk5bVdBOGjbDUbWelpr165dax7HhMdggjgmU8tHvuMzxpwJ2AaavtaNcJptegAwEd7++++fWc7vW221Vb/rQuHLwQIacnOT4fUVnoMf1o3wvDhoMVDHmTBhgglyHo/T6OUez2vT3//+9ybKvTh4Cv9zzjmnS3mnn366xcaznhT4fR28GPLEdkzWQLcGD2ZoZDbFH/3oR3ZxCSGEEGJk4k9Qt7Ep57rb1kuUx5y3AzUHvRBi9ENBzCz0nfGeE2Z3JlK23WBNO3fllVdm/mYmeCaAo8t1dwZMirympqbMMiaxY5ixP/Eas8PTBXwo60bYRscddxx++9vfZpKuMakb9/3kJz/Z73pQDNMl//LLL8+y6Le0tOC+++7LSkpH8Z0r1P2wnagnPRHNc2RyPg5A9PY4vYFtwdBwhn17mnXRokUW/pCL3+p+1VVXWfhALtS/b731ls0YwLbsyZV/oOnXcPill15qIzpMyc8GPOaYYywGgNkL+V2WeCGEEGLk4cW37/nxcehoSW3UBX5j09OFwoEBmYNeCLHlwGnkFj/VabNb5HOp5/L2mIN95pQMyvEpGmmspLs046WZgfynP/2pWdfzQXdrWokPP/xwy6DuTTFHYcqYd5ZDV3mKWLpkD2XdPH7+85/jwx/+sNV15513tlh4WqIZY74pXH311SZeOT0cz5WZ5Rk3TlHrsWTJElx//fW4+OKLuy2H+zMse/fdd8fy5cttsOPBBx/s03F6C2Ptmf2e2etZHgcP/HHsFPrnn38+zjrrLNx1113mZk9LPQcUcmHOA+rgO+64Y8jzwfVLxDMN/5NPPml/8+LhlAQcCVm4cCGOPPJIiXghhBBilMTCbyzJHZd1J/T5Aj4Qc9ALIbYcOA/8Iwub8f66mCWx8wt5Cngunzo2gj1nFQ/K8cPhsBkmKe4o3micpNjz4N9/+tOfsoQ1p2J7+OGHTfBR0BNajhkrzXIYg03hyHh1wundaBn3w2R2LDdf/rHe1i1fud6UaawjE7XRHf/cc8+1ZOR+OC/7r371q6xlZ599tsXhe3zmM59Ba2trVgw6E8C9/PLLpgPpYs/BgbFjx2a2oRhnOT0NNFBQ0/r+3HPPmQX8sMMOy4pb781xTjvttF5Nec7+4QDAf//7Xzs3WtlXrlxp8fIenKqO4pxT8rEeHDTh3PH+tva3Oadb5zZDSYAp6vu6E+dEpDtDaWkpvvrVr1pDcm5DuhlwlMLfuSMRusPQHaKxsbFL8ggxPKitWY2qCRuyWIrRh/p49KM+Hl4w+dwTN9ea6zvd4w88scqS0j12Uw3aW1KonBLtc0y7+nj0oz4e/WyOPuY88H96tM6y1DOJHWPg6UJPCzwF/BmHVGLepA2Z3gcKWlQ5yxY9i4cbg1m3wexjil8OEHQ3OEGXdCbeYwz6SCORSNisAhykYDK8oaRfQ+J0Objiiitw9NFH45ZbbrGYD8KRkfnz5w90HYUQQggxyPizyvPTFfC1WP1uh/1dl05kJ2u6EGKwoUC/4JiJNo0cs9AziV1VWdRc6GmBryyVV89IgXpxNHLZZZeZBqb1f1PDEvpDv+4AuocwQcIPfvADS73vZfejsP/6178+0HUUQgghxCCTG9/Oz47WJApKgxYfP25qUDHtQoghg0KdU8jx32Bkoc9Hd+7ow4HhXLdNobdu8MON+fPnY+bMmTZX/Obw3O6XOz1hY9Odw19pZvfj/H1DcZMNJnKnH/7IfW/0oz4e/aiPR0aMfP2aGApLQtj7/8YBTqBPse3q49GP+nj0oz4e/aiPRx69tsTTVd4fzB8MBruMOsybNy/vtkIIIYQYeczbp8w+KyZENN+7EEIIMUzo9TzxnDbhs5/9LJ566ilzaclnmWfGQ2YtZEZBIYQQQoxsK/zzd9Zj0bPNaKyJa753IYQQYqRZ4pmK/8c//jE++tGP2vQGu+22m82NR0HPqQpeeukl247Z+d55553BrLMQQgghBhHGwzPBHTPV85NovnchhBBihIl4us5zLsILL7wQ9957r1nkV6xYYfHvzFbPrHwU+Jx+TgghhBAjF8a9l44LoX5VDOOmRjFpVqH903zvQgghxOanz9npOTf8pz71KfsnhBBCiFFMYONu9xL2QgghxNCiSRaFEEIIkQWFeUt9EuMmR+1z7dIOi403F/txIWx/YIWS3Qkhtkhqamrw+OOP4/jjj+93GatXr8bzzz+PT3ziEwNat02ls7MTzz77LNatW4d9993XvK4ZRr377rvb+ldffRXt7e22biiPO5S8+eabWL9+PQ444AAMZyTihRBCCNHFnd4fA0/4d1FZECsXtpubfem4CNpbkqgYH7Z1FP69nXpOCCFGKq+//jpOOOGETKLv6upqCzM+7rjjel0GBfzJJ59s03UPFyik99xzT4RCIcyePRtbbbUVrrjiCvPCvvbaa20bfq5cuRJ33HHHkB63P7zyyitW9j777NOn/W666SYbrLj//vsxnNGvrRBCCCGyoBg/6KSqjKs8oZivWdYBvrZWVEXQ2pREUWkQLQ1JW+dtJ4QQAw0FM/NwDQeY2PuTn/xkllhkmHEikcBI5rHHHsN7771nVuhIxH2eUwAXFhaOyOP+4Q9/MMv+bbfdhtGIRLwQQggh8gp5/vPi3vf8+Dibam7hE40ZV3su62hJmYCXFV4IMZC0NSaw4u02rHirDR2tSRSWhDB9fjGmb1eM4orBkTCem/vHP/5xLFy4EMuWLcPOO++MadOmZYn4T3/60/Z3Q0MDnnzySRtk8MTinDlzsMsuu9jfdXV1ePHFFy1B+B577JERqbkzgPE42223HWbMmLFJdfO2OfbYY23mMLqlf/jDH7bjczpw1oWeA3PnzsW2226b2e/Nt97CPffcg2g0ijvvvDOznGVvvfXWG203ngOF+PTp07HjjjsiGOzdLOavvfZar47LerONt99+ezz33HOIx+M44ogjbB09A9566y1UVlZae7CN+X3p0qVobm7O9MtBBx2ECRMmdKlDLBYzTwp6AnD/XDjrGl3sSUVFhSV0nzx5cmY9j8PjfexjH8vaj+3BfspdPlBIxAshhBCix/niPbd6WufzZanndqsXt3dZFo+l7FMCXwjRF9at6MTzd9WhaV0ckWgQ4WjABhHXrWzAey+3YK+PVWL89IIBb1QKYAp0Cj6KXYrfF154Ab///e/x+c9/vos7PUU8Lcn8+5ZbbrH1Rx11lIl4zup1ySWXYKeddrL47o6ODtx1112YMmWKbUfL/dFHH20x9jwOBwN4nNNOO63fdfO2OeSQQ6zcWbNm2eAB3cpZrzVr1pgQ5nY89o033mji9c033sQzzzxj8e7eeRAKZorl7tzaGQ5w4okn2oABz3nx4sUmpinIOdixMejF0JvjXn311dbura2tNlCw3Xbb2fqf/vSnNgU64+hZF5bzr3/9C2+88YaJaJ63V+4222zTRcSzPQ499FC0tbXZwMa7775rAyl05fegQPfKqK+vt7r98Ic/xDe/+c1MP3JghcekwPf49re/bf0+rEQ8R3J+97vf4c9//rONPjQ2Ntry888/H1/96lezRoSEEEIIMTrmi+f3KXOLsoQ6k9551nlP6BOK/9kHJPHGPbW2TEJeCNFbCzwFfHN9ApVToggEN7jROykH9Wvjtv6QkycMikWewo+C74EHHsi4ZVPfUPTmikCK5O9973s45phjsty27777bnz3u9+1uOrDDz/clnki1H8cWsnPPfdc+8448PPOO69bEd/bunEbitqLLroos9/pp59u+o0ilQKVAnfXXXfFX/7yF5xxxhn49KcXYOy4KnzrW9/KOg/P46A7KFRpFX///fdRUFCAZDJpCf+4/K9//etG2/rUU081odub47L9KKC9ZHfxeBwXX3yxDRh4VnlazdnG3P/RRx/dqDs9+2js2LF4+eWXUVRUZLHwjM9nv3gwdMIfPkGvACa9Yw4EegvMmzfPBlauu+46/OpXv7JteFxeAxy0GSx65+uQw69//Wv84he/wJlnnommpqbMcrpl/OhHPxrI+gkhhBBiMye4yxf37lnpn/xHLVYsbLf4eE/oe+I/GHIT4vG7EEL0BrrQ0wI/blIkS8ATfudyrud2gwUNkx7UOxR4//nPf3q9//XXX2+Wb0/AE1rkae31oMv5l770pcx3WoTpfk8BuKl1+/rXv571nZZkLvMszEwgd9JJJ+Hmm29Gf6EFmpZ8uqDfd999uP32201Qz5w5Ew899BAGmgMPPDArW30wGDTXeQ5MeEkGqUXpzt8buM8//vEPfO1rX7M2JPQmYL/lQis/Xe55jh988IF5QVDM+/uBCfE4sEDYLvRE+MhHPoJhJeKvueYa3HrrrVkXHuGFypMTQgghxMiH1nPGvW93QLl9+q3pnlBnkju+ZjfWxjNC3xP/qSRsSrrOtqSJfiGE2BiMgacLfa6A9+Byrud2gwEtw36vYopFulgvX76812UwXp0W856gcPQnb6Ml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RAoFrvxFikmL4Ng8h9H0Mm7qz67AMkK+dYTbf/SbBbj7l51dtg0j0GXeRO6XfbVuOk66/h58lHq2I+9Y3vpgzveAbxv/efnrGfAt85an0p/BPOv8+L87eY6T+3e+7bLPrWu7etuk+EKRLiWU5/y4XTJd59xzyq2LRyq9/ce+WYD//LIz65yT6frwmnBfZzZsn4u/nfxt4p1bHA4imdpn1zvlOxZfBYPp4/nbxz039/r11vvJ7ddAnv29737bodfPiXT7su297XLPJbdO+drTOzd/2V692Abst4Cv/t6nfzuvjXOvNbcMd523Pref+c/fNklfPdnH96b72L+9v965fZx7j3jbsL34hEqmnyf++y63Xfznkkq3A9vZO05unf3fc/vQ257Xiree16d3PyR9ZfifV4n09cNrMPf+SOU8z7xjsiy3v7KvKw/3nnSX8bmO6UEkGh0+aJEKAZEYC6EQBWKF6esqCAQS6bIqgGAtRQKQCgBBh23pltkRBjqKAxjX5F7zXLY+AhQl+fsPxKJAIhpAYucCW/5edSdiSQe//mQBfv1Yyt4ZxpeGsXBVB+rbkigIA9FQyN4dSmPAzrVAJAF0BoClRSnwJ6U07j5XQymggHWKBJCIOyjtBMqTgcx908HfGq8NAu4+BY7bB16be+2S71no3e9h37PWf694z6DcPnL7dsPzyDuOt423n7dtKt3f3jXof876j+Vt792f3m+m/3r0Xt+9e89/DeReu/4yTQRiQ9t51xq3K/Idx38e3nECee79UPo+vid9HyPPM99ry9z7ON+zOfd4qZx7xf+s9N/Tub+33nr/c9h79oRy2j/3/QJ5rol8ZebWIffZ5z0T/L8z/v06078f+d5bvPN2f3/y/8b5f0P8vwHesnx9kO+ZGejm/cv/7PHeuTb2rpG7zjtubtas3O29PuZvaW6be+XkO27ud6+PU75+7u4dw6uH43uOFOY8c/3rvevTayfen8F03QPpfg7leTbn/p7kO6d896z/XYzn5b1b+59f3vnlXpf+4+bea7nle211jK+Pc99bvPp2pp93EV87o5trzrvGvOt3w7sXn2nudu5zccP7c3e/9/765+u/mPfeNCmA8FrHfre8d5OQ7172mHx0+agQ8n3yO3vggQfMjT5XwBMuu+SSS3DAAQdgc8bCMz5/5syZWctpiX/iiSe63a+zs9P+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",
"text/plain": [
"
"
]
@@ -1317,8 +1584,19 @@
"source": [
"fig, ax = plt.subplots(figsize=(12, 3.8))\n",
"for (label, merged), color in zip(matched4.items(), [BLUE, PURPLE, ORANGE]):\n",
- " ax.scatter(merged.latitude, merged[\"difference (s)\"], s=3, color=color, label=label, alpha=0.6)\n",
- "ax.set(xlabel=\"Point latitude (deg)\", ylabel=\"TAT-C minus OCI observation time (s)\", title=\"Observation time differences\")\n",
+ " ax.scatter(\n",
+ " merged.latitude,\n",
+ " merged[\"difference (s)\"],\n",
+ " s=3,\n",
+ " color=color,\n",
+ " label=label,\n",
+ " alpha=0.6,\n",
+ " )\n",
+ "ax.set(\n",
+ " xlabel=\"Point latitude (deg)\",\n",
+ " ylabel=\"TAT-C minus OCI observation time (s)\",\n",
+ " title=\"Observation time differences\",\n",
+ ")\n",
"ax.legend(frameon=False, markerscale=4)\n",
"plt.show()"
]
@@ -1330,6 +1608,608 @@
"source": [
"With each day's pitch angle profile, `collect_observations` reproduces OCI's observations: all 7,533 OCI observations of the points are matched, within 0.15 s (median) and 0.95 s (maximum), including the 618 within 2 minutes of a tilt change (within 0.63 s), and all 7,062 predicted observations within OCI's data collection and swath are found in its data. Without the tilt, the predicted observations are 38 s late (in the northern part of the orbit) or early (in the southern part), the time the satellite takes to travel the 260 km between the nadir and the tilted scan line, and 9% of OCI's observations are missed, as the untilted scan reaches less far across track (56.5 deg from nadir at its edges, instead of 58.8 deg for the tilted scan). With the first day's profile on both days, the observations between the two days' tilt changes, about 700 km of ground track per orbit on the second day, are predicted with the wrong tilt, up to 78 s from OCI's.\n",
"\n",
+ "## Test 5: Glint Avoidance\n",
+ "\n",
+ "The glint angle at a point is the angle between the direction toward the satellite and the direction of the Sun's specular reflection at the point (`compute_glint_angle`); it is zero at the center of the sun glint (the specular point, `compute_specular_point`), and ocean color observations are contaminated by glint at angles below about 20 to 30 deg. The glint angles at OCI's sampled pixels (every 100th scan and every 16th pixel, excluding tilt changes) are computed from the spacecraft's reported positions and compared with those at the pixels of the same scans cast by TAT-C (as in Test 2) with no tilt and with the opposite tilt. For each scan, the minimum glint angle across the scan measures how close it comes to the glint."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "86b3a263",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-10-25T18:37:34.602985Z",
+ "iopub.status.busy": "2026-10-25T18:37:34.602805Z",
+ "iopub.status.idle": "2026-10-25T18:38:17.818511Z",
+ "shell.execute_reply": "2026-10-25T18:38:17.817525Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_43032\\3749224625.py:30: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
+ " return timescale.from_datetimes([t.to_pydatetime() for t in pd.DatetimeIndex(values)])\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "4868 day-side scans\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
matched: TAT-C minus OCI glint angle, median (deg)
\n",
+ "
matched: TAT-C minus OCI glint angle, max (deg)
\n",
+ "
TAT-C observations in OCI's collection and swath
\n",
+ "
glint angle, lowest (deg)
\n",
+ "
glint angle below 20 deg (%)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
pitch profile, per day
\n",
+ "
20.79
\n",
+ "
0.05
\n",
+ "
0.26
\n",
+ "
7062.0
\n",
+ "
23.00
\n",
+ "
0.00
\n",
+ "
\n",
+ "
\n",
+ "
pitch profile, first day
\n",
+ "
20.79
\n",
+ "
0.05
\n",
+ "
19.59
\n",
+ "
7152.0
\n",
+ "
3.40
\n",
+ "
0.18
\n",
+ "
\n",
+ "
\n",
+ "
no tilt
\n",
+ "
20.79
\n",
+ "
13.98
\n",
+ "
21.68
\n",
+ "
6404.0
\n",
+ "
1.92
\n",
+ "
3.00
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " OCI observations: glint angle, lowest (deg) \\\n",
+ "pitch profile, per day 20.79 \n",
+ "pitch profile, first day 20.79 \n",
+ "no tilt 20.79 \n",
+ "\n",
+ " matched: TAT-C minus OCI glint angle, median (deg) \\\n",
+ "pitch profile, per day 0.05 \n",
+ "pitch profile, first day 0.05 \n",
+ "no tilt 13.98 \n",
+ "\n",
+ " matched: TAT-C minus OCI glint angle, max (deg) \\\n",
+ "pitch profile, per day 0.26 \n",
+ "pitch profile, first day 19.59 \n",
+ "no tilt 21.68 \n",
+ "\n",
+ " TAT-C observations in OCI's collection and swath \\\n",
+ "pitch profile, per day 7062.0 \n",
+ "pitch profile, first day 7152.0 \n",
+ "no tilt 6404.0 \n",
+ "\n",
+ " glint angle, lowest (deg) \\\n",
+ "pitch profile, per day 23.00 \n",
+ "pitch profile, first day 3.40 \n",
+ "no tilt 1.92 \n",
+ "\n",
+ " glint angle below 20 deg (%) \n",
+ "pitch profile, per day 0.00 \n",
+ "pitch profile, first day 0.18 \n",
+ "no tilt 3.00 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def oci_glint_angle(frame):\n",
+ " \"\"\"Glint angles (deg) at the points of OCI's observations, at OCI's observation times (TLE orbit).\"\"\"\n",
+ " point = {p.id: p for p in points}\n",
+ " targets = wgs84.latlon(\n",
+ " [point[i].latitude for i in frame.point_id],\n",
+ " [point[i].longitude for i in frame.point_id],\n",
+ " )\n",
+ " return compute_glint_angle(\n",
+ " orbit.get_orbit_track(list(frame.time.dt.to_pydatetime())), targets\n",
+ " )\n",
+ "\n",
+ "\n",
+ "oci_glint = oci_glint_angle(reference.sort_values(\"time\"))\n",
+ "rows5c = {}\n",
+ "for label in predicted:\n",
+ " merged, found = matched4[label], found4[label]\n",
+ " difference = merged.glint_angle - oci_glint\n",
+ " rows5c[label] = {\n",
+ " \"OCI observations: glint angle, lowest (deg)\": oci_glint.min(),\n",
+ " \"matched: TAT-C minus OCI glint angle, median (deg)\": difference.abs().median(),\n",
+ " \"matched: TAT-C minus OCI glint angle, max (deg)\": difference.abs().max(),\n",
+ " \"TAT-C observations in OCI's collection and swath\": len(found),\n",
+ " \"glint angle, lowest (deg)\": found.glint_angle.min(),\n",
+ " \"glint angle below 20 deg (%)\": 100 * (found.glint_angle < 20).mean(),\n",
+ " }\n",
+ "pd.DataFrame(rows5c).T.round(2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8b526ad5",
+ "metadata": {},
+ "source": [
+ "OCI's tilt keeps its scans out of the sun glint: no sampled pixel has a glint angle below 20 deg (the lowest is 20.3 deg), and 1.3% are below 30 deg. Without the tilt, the scans would cross the glint (down to 0.4 deg), with 5.2% of the day-side pixels below 20 deg; with the opposite tilt (forward in the south, aft in the north), 11.2% would be. On the ascending day side, the aft tilt keeps away from the glint south of the subsolar region, and the forward tilt north of it. The two tilts come equally close to the glint (23.6 deg) at an argument of latitude of -0.8 deg on 4 October and -1.2 deg on 5 October, about 3.5 deg north of the subsolar latitude (-4.5 and -4.9 deg). On 4 October, OCI's tilt change starts within 0.9 deg of this balance, and its scans come no closer than 22.6 deg to the glint. On 5 October, it starts 5.3 deg earlier (at -6.5 deg), so that the forward tilt comes within 20.3 deg of the glint just after the change. The glint angles thus explain where the tilt changes to within the steps by which the schedule moves between days, but not the steps themselves, so the schedule is still given as a pitch angle profile per day (Test 3). The scans during a tilt change (27.5 s per orbit, excluded here) sweep through the untilted geometry, and so through the glint.\n",
+ "\n",
+ "With each day's pitch angle profile, the glint angles that `collect_observations` reports for its observations (`glint_angle`, which requires `omit_solar=False`) match those of OCI's observations (at OCI's times) within 0.05 deg (median) and 0.26 deg (maximum), and none of its observations within OCI's collection and swath is within 20 deg of the glint (the lowest is 23.0 deg, as is 20.8 deg for OCI's). With the first day's profile, 0.18% are, observed during its tilt changes, which on the second day fall away from OCI's. Without the tilt, 3.0% are, down to 1.9 deg. A minimum glint angle at the target (`min_target_glint_angle=20`) would exclude these observations, but it removes them rather than moving them away from the glint, as OCI's tilt does: a glint angle requirement complements a pitch angle profile rather than replacing it."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "51dd0a51",
+ "metadata": {},
+ "source": [
"## Summary\n",
"\n",
"| Test | Result |\n",
@@ -1338,12 +2218,13 @@
"| 2. Scan geometry (`ViewGeometry.SCAN`, pitch tilting the scan plane) | pixels within 0.8 km near nadir and 9 km at the swath edges (median), with the Earth-fixed velocity frame; a constant along-track angle would misplace the edges by 210 km, and the inertial frame by 63 km |\n",
"| 3. Tilt schedule (`pitch_angle_profile`) | one change per orbit on the day side, over 27.5 s, at the same argument of latitude within 0.06 deg each day; the schedule moves between days with the subsolar latitude |\n",
"| 4. Observation times (`collect_observations`) | with a per-day pitch profile, all OCI observations matched, within 0.15 s (median) and 0.95 s (maximum); 38 s off without the tilt; up to 78 s off with the previous day's profile |\n",
+ "| 5. Glint avoidance (`compute_glint_angle`) | with the tilt, no pixel within 20 deg of the glint (5.2% without the tilt, 11.2% with the opposite tilt); the tilts are balanced 3.5 deg north of the subsolar latitude, within 0.9 deg of OCI's tilt change on one day and 5.3 deg on the next; observation glint angles within 0.26 deg |\n",
"\n",
"**Tilted scanners.** A `PointedInstrument` in scan geometry with a pitch angle represents a cross-track scanner whose scan plane tilts fore or aft, such as OCI (and SeaWiFS before it), and a pitch angle profile represents its tilt changes around the orbit.\n",
"\n",
"**Changes to TAT-C.** This validation added a pitch angle profile (`PointedInstrument.pitch_angle_profile`, as a function of argument of latitude, like `roll_angle_profile`) and changed scan geometry so that the pitch angle tilts the scan plane (as `tilt_angle` in `compute_projected_ray_position` and `compute_view_angles`); previously, scan geometry applied the pitch angle after the scan angle, sweeping a cone that misplaced the edges of a tilted scan by 210 km.\n",
"\n",
- "**Limitations.** The tilt schedule changes between days, so analyses longer than a day need a profile per day (or a profile fitted to the period, with errors where the schedule moved). OCI's collection window (from pole to pole on the ascending day side, as observed) is approximated here by a minimum solar elevation of the target."
+ "**Limitations.** The tilt schedule changes between days, in steps that the glint angles do not explain (Test 5), so analyses longer than a day need a profile per day (or a profile fitted to the period, with errors where the schedule moved). OCI's collection window (from pole to pole on the ascending day side, as observed) is approximated here by a minimum solar elevation of the target."
]
}
],
@@ -1363,7 +2244,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.12.8"
+ "version": "3.14.9"
}
},
"nbformat": 4,
diff --git a/docs/validation/ValidateYawFlipGPM.ipynb b/docs/validation/ValidateYawFlipGPM.ipynb
index 14e8f14a..d290730e 100644
--- a/docs/validation/ValidateYawFlipGPM.ipynb
+++ b/docs/validation/ValidateYawFlipGPM.ipynb
@@ -41,10 +41,10 @@
"id": "bf6575b6",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:20.496788Z",
- "iopub.status.busy": "2026-10-08T18:11:20.496788Z",
- "iopub.status.idle": "2026-10-08T18:11:30.499392Z",
- "shell.execute_reply": "2026-10-08T18:11:30.498382Z"
+ "iopub.execute_input": "2026-10-25T05:22:15.629320Z",
+ "iopub.status.busy": "2026-10-25T05:22:15.629320Z",
+ "iopub.status.idle": "2026-10-25T05:22:25.003626Z",
+ "shell.execute_reply": "2026-10-25T05:22:25.003626Z"
}
},
"outputs": [
@@ -104,13 +104,17 @@
" def __init__(self, url, block_size=2**20, prefetch=1):\n",
" self.block_size, self.blocks, self.position = block_size, {}, 0\n",
" response = self._get(url, 0, prefetch * block_size)\n",
- " self.url, self.size = response.url, int(response.headers[\"Content-Range\"].split(\"/\")[1])\n",
+ " self.url, self.size = response.url, int(\n",
+ " response.headers[\"Content-Range\"].split(\"/\")[1]\n",
+ " )\n",
" self._store(0, response.content)\n",
"\n",
" def _get(self, url, start, end):\n",
" for attempt in range(5):\n",
" try:\n",
- " response = https_session().get(url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300)\n",
+ " response = https_session().get(\n",
+ " url, headers={\"Range\": f\"bytes={start}-{end - 1}\"}, timeout=300\n",
+ " )\n",
" response.raise_for_status()\n",
" return response\n",
" except requests.RequestException:\n",
@@ -131,18 +135,30 @@
" return self.position\n",
"\n",
" def seek(self, offset, whence=io.SEEK_SET):\n",
- " self.position = {io.SEEK_SET: 0, io.SEEK_CUR: self.position, io.SEEK_END: self.size}[whence] + offset\n",
+ " self.position = {\n",
+ " io.SEEK_SET: 0,\n",
+ " io.SEEK_CUR: self.position,\n",
+ " io.SEEK_END: self.size,\n",
+ " }[whence] + offset\n",
" return self.position\n",
"\n",
" def readinto(self, buffer):\n",
" n = min(len(buffer), self.size - self.position)\n",
" if n <= 0:\n",
" return 0\n",
- " first, last = self.position // self.block_size, (self.position + n - 1) // self.block_size\n",
- " missing = [block for block in range(first, last + 1) if block not in self.blocks]\n",
+ " first, last = (\n",
+ " self.position // self.block_size,\n",
+ " (self.position + n - 1) // self.block_size,\n",
+ " )\n",
+ " missing = [\n",
+ " block for block in range(first, last + 1) if block not in self.blocks\n",
+ " ]\n",
" if missing:\n",
" end = min((missing[-1] + 1) * self.block_size, self.size)\n",
- " self._store(missing[0], self._get(self.url, missing[0] * self.block_size, end).content)\n",
+ " self._store(\n",
+ " missing[0],\n",
+ " self._get(self.url, missing[0] * self.block_size, end).content,\n",
+ " )\n",
" data = b\"\".join(self.blocks[block] for block in range(first, last + 1))\n",
" offset = self.position - first * self.block_size\n",
" buffer[:n] = data[offset : offset + n]\n",
@@ -152,7 +168,16 @@
"\n",
"def scan_seconds(group):\n",
" \"\"\"Scan times as seconds since 2000-01-01 (UTC calendar fields).\"\"\"\n",
- " t = pd.to_datetime({\"year\": group[\"Year\"][:], \"month\": group[\"Month\"][:], \"day\": group[\"DayOfMonth\"][:], \"hour\": group[\"Hour\"][:], \"minute\": group[\"Minute\"][:], \"second\": group[\"Second\"][:]}) + pd.to_timedelta(group[\"MilliSecond\"][:], unit=\"ms\")\n",
+ " t = pd.to_datetime(\n",
+ " {\n",
+ " \"year\": group[\"Year\"][:],\n",
+ " \"month\": group[\"Month\"][:],\n",
+ " \"day\": group[\"DayOfMonth\"][:],\n",
+ " \"hour\": group[\"Hour\"][:],\n",
+ " \"minute\": group[\"Minute\"][:],\n",
+ " \"second\": group[\"Second\"][:],\n",
+ " }\n",
+ " ) + pd.to_timedelta(group[\"MilliSecond\"][:], unit=\"ms\")\n",
" return ((t - pd.Timestamp(\"2000-01-01\")).dt.total_seconds()).to_numpy()\n",
"\n",
"\n",
@@ -164,10 +189,17 @@
" g, k = f[\"FS\"], slice(None, None, 5)\n",
" np.savez_compressed(\n",
" path,\n",
- " seconds=scan_seconds(g[\"ScanTime\"])[k], sc_pos=g[\"navigation/scPos\"][:][k], sc_vel=g[\"navigation/scVel\"][:][k],\n",
- " yaw=g[\"navigation/scAttYawGeod\"][:][k], roll=g[\"navigation/scAttRollGeod\"][:][k], pitch=g[\"navigation/scAttPitchGeod\"][:][k],\n",
- " orientation=g[\"scanStatus/SCorientation\"][:][k], latitude=g[\"Latitude\"][:][k], longitude=g[\"Longitude\"][:][k],\n",
- " zenith=g[\"PRE/localZenithAngle\"][:][k], elevation=g[\"PRE/elevation\"][:][k],\n",
+ " seconds=scan_seconds(g[\"ScanTime\"])[k],\n",
+ " sc_pos=g[\"navigation/scPos\"][:][k],\n",
+ " sc_vel=g[\"navigation/scVel\"][:][k],\n",
+ " yaw=g[\"navigation/scAttYawGeod\"][:][k],\n",
+ " roll=g[\"navigation/scAttRollGeod\"][:][k],\n",
+ " pitch=g[\"navigation/scAttPitchGeod\"][:][k],\n",
+ " orientation=g[\"scanStatus/SCorientation\"][:][k],\n",
+ " latitude=g[\"Latitude\"][:][k],\n",
+ " longitude=g[\"Longitude\"][:][k],\n",
+ " zenith=g[\"PRE/localZenithAngle\"][:][k],\n",
+ " elevation=g[\"PRE/elevation\"][:][k],\n",
" )\n",
" return path\n",
"\n",
@@ -180,9 +212,14 @@
" g, k = f[\"S1\"], slice(None, None, 3)\n",
" np.savez_compressed(\n",
" path,\n",
- " seconds=scan_seconds(g[\"ScanTime\"])[k], orientation=g[\"SCstatus/SCorientation\"][:][k],\n",
- " sc_latitude=g[\"SCstatus/SClatitude\"][:][k], sc_longitude=g[\"SCstatus/SClongitude\"][:][k], sc_altitude=g[\"SCstatus/SCaltitude\"][:][k],\n",
- " latitude=g[\"Latitude\"][:][k], longitude=g[\"Longitude\"][:][k], incidence=g[\"incidenceAngle\"][:][k][..., 0],\n",
+ " seconds=scan_seconds(g[\"ScanTime\"])[k],\n",
+ " orientation=g[\"SCstatus/SCorientation\"][:][k],\n",
+ " sc_latitude=g[\"SCstatus/SClatitude\"][:][k],\n",
+ " sc_longitude=g[\"SCstatus/SClongitude\"][:][k],\n",
+ " sc_altitude=g[\"SCstatus/SCaltitude\"][:][k],\n",
+ " latitude=g[\"Latitude\"][:][k],\n",
+ " longitude=g[\"Longitude\"][:][k],\n",
+ " incidence=g[\"incidenceAngle\"][:][k][..., 0],\n",
" )\n",
" return path\n",
"\n",
@@ -193,7 +230,17 @@
" jobs = []\n",
" for short_name, reducer in ((\"GPM_2AKu\", reduce_ku), (\"GPM_1CGPMGMI\", reduce_gmi)):\n",
" results = earthaccess.search_data(short_name=short_name, temporal=(START, END))\n",
- " jobs += [(reducer, next(link[\"URL\"] for link in r[\"umm\"][\"RelatedUrls\"] if link[\"URL\"].startswith(\"https\") and link[\"URL\"].endswith(\".nc\"))) for r in results]\n",
+ " jobs += [\n",
+ " (\n",
+ " reducer,\n",
+ " next(\n",
+ " link[\"URL\"]\n",
+ " for link in r[\"umm\"][\"RelatedUrls\"]\n",
+ " if link[\"URL\"].startswith(\"https\") and link[\"URL\"].endswith(\".nc\")\n",
+ " ),\n",
+ " )\n",
+ " for r in results\n",
+ " ]\n",
" with concurrent.futures.ThreadPoolExecutor(6) as pool:\n",
" list(pool.map(lambda job: job[0](job[1]), jobs))\n",
"\n",
@@ -210,16 +257,31 @@
"\n",
"\n",
"ku, gmi = load(\"2A.GPM.Ku.*.npz\"), load(\"1C.GPM.GMI.*.npz\")\n",
- "orientation = pd.concat([pd.DataFrame({\"time\": r[\"times\"], \"orientation\": r[\"orientation\"]}) for r in ku.values()]).sort_values(\"time\").reset_index(drop=True)\n",
+ "orientation = (\n",
+ " pd.concat(\n",
+ " [\n",
+ " pd.DataFrame({\"time\": r[\"times\"], \"orientation\": r[\"orientation\"]})\n",
+ " for r in ku.values()\n",
+ " ]\n",
+ " )\n",
+ " .sort_values(\"time\")\n",
+ " .reset_index(drop=True)\n",
+ ")\n",
"missing = int((~orientation.orientation.isin([0, 180])).sum())\n",
"orientation = orientation[orientation.orientation.isin([0, 180])].reset_index(drop=True)\n",
"changes = orientation[orientation.orientation.diff().fillna(0) != 0]\n",
"FLIP = changes.time.iloc[0] if len(changes) else None\n",
"pd.Series(\n",
" {\n",
- " \"radar orbits\": len(ku), \"GMI orbits\": len(gmi),\n",
- " \"first scan\": orientation.time.min(), \"last scan\": orientation.time.max(),\n",
- " \"orientations\": \", \".join(f\"{o} deg ({n} scans)\" for o, n in orientation.orientation.value_counts().sort_index().items()) + f\"; {missing} sampled scans without orientation\",\n",
+ " \"radar orbits\": len(ku),\n",
+ " \"GMI orbits\": len(gmi),\n",
+ " \"first scan\": orientation.time.min(),\n",
+ " \"last scan\": orientation.time.max(),\n",
+ " \"orientations\": \", \".join(\n",
+ " f\"{o} deg ({n} scans)\"\n",
+ " for o, n in orientation.orientation.value_counts().sort_index().items()\n",
+ " )\n",
+ " + f\"; {missing} sampled scans without orientation\",\n",
" \"orientation change\": FLIP,\n",
" }\n",
")"
@@ -239,10 +301,10 @@
"id": "c3bf8bef",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:30.502906Z",
- "iopub.status.busy": "2026-10-08T18:11:30.501898Z",
- "iopub.status.idle": "2026-10-08T18:11:40.774527Z",
- "shell.execute_reply": "2026-10-08T18:11:40.774018Z"
+ "iopub.execute_input": "2026-10-25T05:22:25.005662Z",
+ "iopub.status.busy": "2026-10-25T05:22:25.005662Z",
+ "iopub.status.idle": "2026-10-25T05:22:26.982616Z",
+ "shell.execute_reply": "2026-10-25T05:22:26.982616Z"
}
},
"outputs": [],
@@ -258,21 +320,57 @@
"from tatc.analysis import collect_observations\n",
"from tatc.constants import timescale\n",
"from tatc.generation import generate_points_fibonacci_lattice\n",
- "from tatc.schemas import ConicalInstrument, GeneralPerturbationsOrbit, Point, PointedInstrument, Satellite\n",
- "from tatc.utils import VelocityFrame, ViewGeometry, compute_cone_and_azimuth, compute_view_angles, geodesic_distance\n",
+ "from tatc.schemas import (\n",
+ " Attitude,\n",
+ " AttitudeSchedule,\n",
+ " ConicalInstrument,\n",
+ " GeneralPerturbationsOrbit,\n",
+ " Point,\n",
+ " PointedInstrument,\n",
+ " Satellite,\n",
+ ")\n",
+ "from tatc.utils import (\n",
+ " VelocityFrame,\n",
+ " ViewGeometry,\n",
+ " compute_cone_and_azimuth,\n",
+ " compute_view_angles,\n",
+ " geodesic_distance,\n",
+ ")\n",
"\n",
"orbit = GeneralPerturbationsOrbit.from_tle(TLE)\n",
- "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = \"#2a78d6\", \"#eb6834\", \"#1baf7a\", \"#8a8984\", \"#0b0b0b\", \"#8e5bd8\"\n",
- "plt.rcParams.update({\"axes.spines.top\": False, \"axes.spines.right\": False, \"axes.grid\": True, \"grid.color\": \"#e6e5e0\", \"grid.linewidth\": 0.6})\n",
+ "BLUE, ORANGE, AQUA, GRAY, INK, PURPLE = (\n",
+ " \"#2a78d6\",\n",
+ " \"#eb6834\",\n",
+ " \"#1baf7a\",\n",
+ " \"#8a8984\",\n",
+ " \"#0b0b0b\",\n",
+ " \"#8e5bd8\",\n",
+ ")\n",
+ "plt.rcParams.update(\n",
+ " {\n",
+ " \"axes.spines.top\": False,\n",
+ " \"axes.spines.right\": False,\n",
+ " \"axes.grid\": True,\n",
+ " \"grid.color\": \"#e6e5e0\",\n",
+ " \"grid.linewidth\": 0.6,\n",
+ " }\n",
+ ")\n",
"\n",
"\n",
"def times_of(values):\n",
- " return timescale.from_datetimes([t.to_pydatetime() for t in pd.DatetimeIndex(values)])\n",
+ " return timescale.from_datetimes(\n",
+ " [t.to_pydatetime() for t in pd.DatetimeIndex(values)]\n",
+ " )\n",
"\n",
"\n",
"def ephemeris_track(record, k):\n",
" \"\"\"GPM's reported (Earth-fixed) position and velocity at radar scans k, as an inertial orbit track.\"\"\"\n",
- " return Geocentric.from_time_and_frame_vectors(times_of(record[\"times\"][k]), itrs, Distance(m=record[\"sc_pos\"][k].T.astype(float)), Velocity(km_per_s=record[\"sc_vel\"][k].T.astype(float) / 1e3))"
+ " return Geocentric.from_time_and_frame_vectors(\n",
+ " times_of(record[\"times\"][k]),\n",
+ " itrs,\n",
+ " Distance(m=record[\"sc_pos\"][k].T.astype(float)),\n",
+ " Velocity(km_per_s=record[\"sc_vel\"][k].T.astype(float) / 1e3),\n",
+ " )"
]
},
{
@@ -291,10 +389,10 @@
"id": "c3c59a8d",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:40.778046Z",
- "iopub.status.busy": "2026-10-08T18:11:40.778046Z",
- "iopub.status.idle": "2026-10-08T18:11:45.942646Z",
- "shell.execute_reply": "2026-10-08T18:11:45.942646Z"
+ "iopub.execute_input": "2026-10-25T05:22:26.985623Z",
+ "iopub.status.busy": "2026-10-25T05:22:26.985623Z",
+ "iopub.status.idle": "2026-10-25T05:22:29.072953Z",
+ "shell.execute_reply": "2026-10-25T05:22:29.072953Z"
}
},
"outputs": [
@@ -302,7 +400,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_5676\\741476047.py:28: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
+ "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_12408\\741476047.py:28: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
" xyz = orbit.get_orbit_track([time.to_pydatetime() + timedelta(seconds=float(s)) for s in seconds]).frame_xyz(itrs).m\n"
]
},
@@ -440,44 +538,98 @@
"records = []\n",
"for record in ku.values():\n",
" k = np.arange(0, len(record[\"seconds\"]), 50)\n",
- " reported, velocity = record[\"sc_pos\"][k].T.astype(float), record[\"sc_vel\"][k].T.astype(float)\n",
- " tle_xyz = orbit.get_orbit_track(list(record[\"times\"][k].to_pydatetime())).frame_xyz(itrs).m\n",
+ " reported, velocity = record[\"sc_pos\"][k].T.astype(float), record[\"sc_vel\"][\n",
+ " k\n",
+ " ].T.astype(float)\n",
+ " tle_xyz = (\n",
+ " orbit.get_orbit_track(list(record[\"times\"][k].to_pydatetime()))\n",
+ " .frame_xyz(itrs)\n",
+ " .m\n",
+ " )\n",
" radial = reported / np.linalg.norm(reported, axis=0)\n",
" cross = np.cross(reported, velocity, axis=0)\n",
" cross /= np.linalg.norm(cross, axis=0)\n",
" along = np.cross(cross, radial, axis=0)\n",
" difference = (tle_xyz - reported) / 1e3\n",
- " records.append(pd.DataFrame({\"time\": record[\"times\"][k], \"along-track (km)\": np.sum(difference * along, axis=0), \"cross-track (km)\": np.sum(difference * cross, axis=0), \"radial (km)\": np.sum(difference * radial, axis=0)}))\n",
+ " records.append(\n",
+ " pd.DataFrame(\n",
+ " {\n",
+ " \"time\": record[\"times\"][k],\n",
+ " \"along-track (km)\": np.sum(difference * along, axis=0),\n",
+ " \"cross-track (km)\": np.sum(difference * cross, axis=0),\n",
+ " \"radial (km)\": np.sum(difference * radial, axis=0),\n",
+ " }\n",
+ " )\n",
+ " )\n",
"errors = pd.concat(records)\n",
"errors[\"day\"] = errors.time.dt.strftime(\"%m-%d\")\n",
- "errors[\"days before TLE epoch\"] = ((pd.Timestamp(orbit.get_epoch()) - errors.time).dt.total_seconds() / 86400).round(0)\n",
+ "errors[\"days before TLE epoch\"] = (\n",
+ " (pd.Timestamp(orbit.get_epoch()) - errors.time).dt.total_seconds() / 86400\n",
+ ").round(0)\n",
"nodes = []\n",
"for record in ku.values():\n",
" z = record[\"sc_pos\"][:, 2]\n",
" for i in np.nonzero((z[:-1] < 0) & (z[1:] >= 0))[0]:\n",
" f = -z[i] / (z[i + 1] - z[i])\n",
" time = record[\"times\"][i] + (record[\"times\"][i + 1] - record[\"times\"][i]) * f\n",
- " x, y = (record[\"sc_pos\"][i, j] + f * (record[\"sc_pos\"][i + 1, j] - record[\"sc_pos\"][i, j]) for j in (0, 1))\n",
- " nodes.append({\"time\": time, \"local time (h)\": ((time - time.normalize()).total_seconds() / 3600 + np.degrees(np.arctan2(y, x)) / 15) % 24})\n",
+ " x, y = (\n",
+ " record[\"sc_pos\"][i, j]\n",
+ " + f * (record[\"sc_pos\"][i + 1, j] - record[\"sc_pos\"][i, j])\n",
+ " for j in (0, 1)\n",
+ " )\n",
+ " nodes.append(\n",
+ " {\n",
+ " \"time\": time,\n",
+ " \"local time (h)\": (\n",
+ " (time - time.normalize()).total_seconds() / 3600\n",
+ " + np.degrees(np.arctan2(y, x)) / 15\n",
+ " )\n",
+ " % 24,\n",
+ " }\n",
+ " )\n",
"nodes = pd.DataFrame(nodes)\n",
"\n",
"\n",
"def tle_node_local_time(time):\n",
" seconds = np.arange(-3000, 3001, 10)\n",
- " xyz = orbit.get_orbit_track([time.to_pydatetime() + timedelta(seconds=float(s)) for s in seconds]).frame_xyz(itrs).m\n",
+ " xyz = (\n",
+ " orbit.get_orbit_track(\n",
+ " [time.to_pydatetime() + timedelta(seconds=float(s)) for s in seconds]\n",
+ " )\n",
+ " .frame_xyz(itrs)\n",
+ " .m\n",
+ " )\n",
" k = np.nonzero((xyz[2, :-1] < 0) & (xyz[2, 1:] >= 0))[0]\n",
" k = k[np.argmin(np.abs(seconds[k]))]\n",
" f = -xyz[2, k] / (xyz[2, k + 1] - xyz[2, k])\n",
" crossing = time + pd.Timedelta(seconds=float(seconds[k] + 10 * f))\n",
- " lon = np.degrees(np.arctan2(xyz[1, k] + f * (xyz[1, k + 1] - xyz[1, k]), xyz[0, k] + f * (xyz[0, k + 1] - xyz[0, k])))\n",
+ " lon = np.degrees(\n",
+ " np.arctan2(\n",
+ " xyz[1, k] + f * (xyz[1, k + 1] - xyz[1, k]),\n",
+ " xyz[0, k] + f * (xyz[0, k + 1] - xyz[0, k]),\n",
+ " )\n",
+ " )\n",
" return ((crossing - crossing.normalize()).total_seconds() / 3600 + lon / 15) % 24\n",
"\n",
"\n",
"nodes[\"TAT-C local time (h)\"] = [tle_node_local_time(t) for t in nodes.time]\n",
- "nodes[\"TAT-C minus reported (min)\"] = 60 * ((nodes[\"TAT-C local time (h)\"] - nodes[\"local time (h)\"] + 12) % 24 - 12)\n",
- "rate = 60 * np.polyfit((nodes.time - nodes.time.iloc[0]).dt.total_seconds() / 86400, np.unwrap(nodes[\"local time (h)\"] * np.pi / 12) * 12 / np.pi, 1)[0]\n",
- "print(f\"ascending node local time: {nodes['local time (h)'].iloc[0]:.2f} h on {nodes.time.iloc[0]:%d %b} to {nodes['local time (h)'].iloc[-1]:.2f} h on {nodes.time.iloc[-1]:%d %b} ({rate:.1f} min/day); TAT-C minus reported within {nodes['TAT-C minus reported (min)'].abs().max():.2f} min\")\n",
- "errors.groupby(\"days before TLE epoch\")[[\"along-track (km)\", \"cross-track (km)\", \"radial (km)\"]].median().round(2).T"
+ "nodes[\"TAT-C minus reported (min)\"] = 60 * (\n",
+ " (nodes[\"TAT-C local time (h)\"] - nodes[\"local time (h)\"] + 12) % 24 - 12\n",
+ ")\n",
+ "rate = (\n",
+ " 60\n",
+ " * np.polyfit(\n",
+ " (nodes.time - nodes.time.iloc[0]).dt.total_seconds() / 86400,\n",
+ " np.unwrap(nodes[\"local time (h)\"] * np.pi / 12) * 12 / np.pi,\n",
+ " 1,\n",
+ " )[0]\n",
+ ")\n",
+ "print(\n",
+ " f\"ascending node local time: {nodes['local time (h)'].iloc[0]:.2f} h on {nodes.time.iloc[0]:%d %b} to {nodes['local time (h)'].iloc[-1]:.2f} h on {nodes.time.iloc[-1]:%d %b} ({rate:.1f} min/day); TAT-C minus reported within {nodes['TAT-C minus reported (min)'].abs().max():.2f} min\"\n",
+ ")\n",
+ "errors.groupby(\"days before TLE epoch\")[\n",
+ " [\"along-track (km)\", \"cross-track (km)\", \"radial (km)\"]\n",
+ "].median().round(2).T"
]
},
{
@@ -500,10 +652,10 @@
"id": "a72efb9d",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:45.945322Z",
- "iopub.status.busy": "2026-10-08T18:11:45.945322Z",
- "iopub.status.idle": "2026-10-08T18:11:53.113263Z",
- "shell.execute_reply": "2026-10-08T18:11:53.113263Z"
+ "iopub.execute_input": "2026-10-25T05:22:29.074956Z",
+ "iopub.status.busy": "2026-10-25T05:22:29.074956Z",
+ "iopub.status.idle": "2026-10-25T05:22:37.749703Z",
+ "shell.execute_reply": "2026-10-25T05:22:37.749703Z"
}
},
"outputs": [
@@ -647,12 +799,45 @@
" for s in range(10, len(record[\"seconds\"]), step):\n",
" track = ephemeris_track(record, [s])[0]\n",
" for frame in VelocityFrame:\n",
- " angles = np.array([compute_view_angles(track, wgs84.latlon(float(record[\"latitude\"][s, j]), float(record[\"longitude\"][s, j])), velocity_frame=frame) for j in range(49)], dtype=float)\n",
- " rows.append({\"orientation\": int(record[\"orientation\"][s]), \"frame\": frame.value, \"beam 1 roll (deg)\": angles[0, 0], \"beam 25 roll (deg)\": angles[24, 0], \"beam 49 roll (deg)\": angles[48, 0], \"pitch, mean (deg)\": angles[:, 1].mean(), \"pitch trend (deg per deg)\": np.polyfit(angles[:, 0], angles[:, 1], 1)[0]})\n",
+ " angles = np.array(\n",
+ " [\n",
+ " compute_view_angles(\n",
+ " track,\n",
+ " wgs84.latlon(\n",
+ " float(record[\"latitude\"][s, j]),\n",
+ " float(record[\"longitude\"][s, j]),\n",
+ " ),\n",
+ " velocity_frame=frame,\n",
+ " )\n",
+ " for j in range(49)\n",
+ " ],\n",
+ " dtype=float,\n",
+ " )\n",
+ " rows.append(\n",
+ " {\n",
+ " \"orientation\": int(record[\"orientation\"][s]),\n",
+ " \"frame\": frame.value,\n",
+ " \"beam 1 roll (deg)\": angles[0, 0],\n",
+ " \"beam 25 roll (deg)\": angles[24, 0],\n",
+ " \"beam 49 roll (deg)\": angles[48, 0],\n",
+ " \"pitch, mean (deg)\": angles[:, 1].mean(),\n",
+ " \"pitch trend (deg per deg)\": np.polyfit(\n",
+ " angles[:, 0], angles[:, 1], 1\n",
+ " )[0],\n",
+ " }\n",
+ " )\n",
" return rows\n",
"\n",
"\n",
- "beams = pd.DataFrame([row for rows in Parallel(n_jobs=-1)(delayed(beam_angles)(r) for r in list(ku.values())[::6]) for row in rows])\n",
+ "beams = pd.DataFrame(\n",
+ " [\n",
+ " row\n",
+ " for rows in Parallel(n_jobs=-1)(\n",
+ " delayed(beam_angles)(r) for r in list(ku.values())[::6]\n",
+ " )\n",
+ " for row in rows\n",
+ " ]\n",
+ ")\n",
"beams = beams[beams.orientation.isin([0, 180])]\n",
"beams.groupby([\"orientation\", \"frame\"]).agg([\"median\", \"std\"]).round(4).T"
]
@@ -664,7 +849,9 @@
"source": [
"The radar's 49 beam positions span -17.05 to +16.95 deg of roll (0.708 deg apart), with the first beam on the right of the direction of motion when GPM flies backward and on the left when it flies forward: the yaw flip reverses the order of the beams. The beams also point 0.15 deg along track toward the spacecraft's aft axis, so behind the satellite when it flies forward and ahead of it when it flies backward. The scans are perpendicular to the inertial velocity (GPM is not yaw-steered): in the inertial frame, the along-track angle of the beams varies across the scan by the same amount at all times (0.017 deg per degree of roll, from the scan's duration), whereas in the Earth-fixed frame its variation changes around the orbit (standard deviation 0.04 deg per degree).\n",
"\n",
- "A radar `PointedInstrument` is defined for each orientation from these values: 49 pixels across track spanning 34.7 deg (49 beams of 0.708 deg), the orientation's pitch angle (0.15 deg forward or aft), the inertial velocity frame, and scan geometry. TAT-C's cross-track pixel index 0 is on the right of the direction of motion, so beam 1 is pixel 0 in one orientation and pixel 48 in the other. The positions of beams 1, 25, and 49 are compared with the reported ones (using the reported orbit), with each orientation's instrument and pixel order, and with the first orientation's throughout."
+ "A radar `PointedInstrument` is defined for each orientation from these values: 49 pixels across track spanning 34.7 deg (49 beams of 0.708 deg), the orientation's pitch angle (0.15 deg forward or aft), the inertial velocity frame, and scan geometry. TAT-C's cross-track pixel index 0 is on the right of the direction of motion, so beam 1 is pixel 0 in one orientation and pixel 48 in the other. The positions of beams 1, 25, and 49 are compared with the reported ones (using the reported orbit), with each orientation's instrument and pixel order, and with the first orientation's throughout.\n",
+ "\n",
+ "With an attitude schedule, GPM is instead a single `Satellite` whose body yaws with its orientation (`Attitude(yaw_angle=180)` while it flies backward, and 0 deg after the flip, in the inertial velocity frame), and the radar is defined once, relative to the body: with the forward orientation's pitch angle and pixel order. The yaw then reverses the pixel order and the sign of the along-track offset while GPM flies backward."
]
},
{
@@ -673,13 +860,21 @@
"id": "d8de734b",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:53.116777Z",
- "iopub.status.busy": "2026-10-08T18:11:53.116777Z",
- "iopub.status.idle": "2026-10-08T18:11:54.096614Z",
- "shell.execute_reply": "2026-10-08T18:11:54.096614Z"
+ "iopub.execute_input": "2026-10-25T05:22:37.751709Z",
+ "iopub.status.busy": "2026-10-25T05:22:37.751709Z",
+ "iopub.status.idle": "2026-10-25T05:22:39.310454Z",
+ "shell.execute_reply": "2026-10-25T05:22:39.309450Z"
}
},
"outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\pgrogan\\AppData\\Local\\Temp\\ipykernel_12408\\2622748566.py:13: UserWarning: Discarding nonzero nanoseconds in conversion.\n",
+ " [orientation.time.iloc[0].to_pydatetime(), FLIP.to_pydatetime()],\n"
+ ]
+ },
{
"name": "stdout",
"output_type": "stream",
@@ -723,6 +918,19 @@
" \n",
" \n",
"
\n",
+ "
attitude schedule
\n",
+ "
0
\n",
+ "
3.22
\n",
+ "
0.59
\n",
+ "
1.37
\n",
+ "
\n",
+ "
\n",
+ "
180
\n",
+ "
1.42
\n",
+ "
0.59
\n",
+ "
3.18
\n",
+ "
\n",
+ "
\n",
"
first orientation's instrument
\n",
"
0
\n",
"
270.67
\n",
@@ -755,6 +963,8 @@
"text/plain": [
"beam 1 25 49\n",
"model orientation \n",
+ "attitude schedule 0 3.22 0.59 1.37\n",
+ " 180 1.42 0.59 3.18\n",
"first orientation's instrument 0 270.67 1.94 269.74\n",
" 180 1.42 0.59 3.18\n",
"orientation's instrument 0 3.22 0.59 1.37\n",
@@ -767,13 +977,54 @@
}
],
"source": [
- "inertial = beams[beams.frame == \"inertial\"].groupby(\"orientation\").median(numeric_only=True)\n",
+ "inertial = (\n",
+ " beams[beams.frame == \"inertial\"].groupby(\"orientation\").median(numeric_only=True)\n",
+ ")\n",
"radar = {\n",
- " o: PointedInstrument(name=\"Ku\", field_of_regard=36, cross_track_field_of_view=49 * 0.708, along_track_field_of_view=0.7, pitch_angle=round(float(inertial.loc[o, \"pitch, mean (deg)\"]), 2), cross_track_pixels=49, is_rectangular=True, view_geometry=ViewGeometry.SCAN, velocity_frame=VelocityFrame.INERTIAL)\n",
+ " o: PointedInstrument(\n",
+ " name=\"Ku\",\n",
+ " field_of_regard=36,\n",
+ " cross_track_field_of_view=49 * 0.708,\n",
+ " along_track_field_of_view=0.7,\n",
+ " pitch_angle=round(float(inertial.loc[o, \"pitch, mean (deg)\"]), 2),\n",
+ " cross_track_pixels=49,\n",
+ " is_rectangular=True,\n",
+ " view_geometry=ViewGeometry.SCAN,\n",
+ " velocity_frame=VelocityFrame.INERTIAL,\n",
+ " )\n",
" for o in (0, 180)\n",
"}\n",
"first_orientation = int(orientation.orientation.iloc[0])\n",
- "beam1_pixel = {o: (0 if inertial.loc[o, \"beam 1 roll (deg)\"] < 0 else 48) for o in (0, 180)}\n",
+ "beam1_pixel = {\n",
+ " o: (0 if inertial.loc[o, \"beam 1 roll (deg)\"] < 0 else 48) for o in (0, 180)\n",
+ "}\n",
+ "\n",
+ "# with an attitude schedule, GPM is one satellite whose body yaws with its orientation (180 deg: flying backward),\n",
+ "# and the radar is defined once, relative to the body (as in the forward orientation, 0 deg)\n",
+ "orientations = [\n",
+ " int(orientation[orientation.time < FLIP].orientation.mode()[0]),\n",
+ " int(orientation[orientation.time >= FLIP].orientation.mode()[0]),\n",
+ "]\n",
+ "schedule = AttitudeSchedule.from_attitudes(\n",
+ " [orientation.time.iloc[0].to_pydatetime(), FLIP.to_pydatetime()],\n",
+ " [\n",
+ " Attitude(yaw_angle=o, velocity_frame=VelocityFrame.INERTIAL)\n",
+ " for o in orientations\n",
+ " ],\n",
+ ")\n",
+ "body_radar = PointedInstrument(\n",
+ " name=\"Ku\",\n",
+ " field_of_regard=36,\n",
+ " cross_track_field_of_view=49 * 0.708,\n",
+ " along_track_field_of_view=0.7,\n",
+ " pitch_angle=radar[0].pitch_angle,\n",
+ " cross_track_pixels=49,\n",
+ " is_rectangular=True,\n",
+ " view_geometry=ViewGeometry.SCAN,\n",
+ ")\n",
+ "scheduled_radar = Satellite(\n",
+ " name=\"GPM\", orbit=orbit, instruments=[body_radar], attitude=schedule\n",
+ ").get_instrument(0)\n",
"\n",
"\n",
"def beam_errors(record, step=40):\n",
@@ -784,17 +1035,55 @@
" if o not in (0, 180):\n",
" continue\n",
" for beam in (1, 25, 49):\n",
- " lat, lon = float(record[\"latitude\"][s, beam - 1]), float(record[\"longitude\"][s, beam - 1])\n",
- " for label, model in ((\"orientation's instrument\", o), (\"first orientation's instrument\", first_orientation)):\n",
- " pixel = (beam - 1) if beam1_pixel[model] == 0 else (49 - beam)\n",
- " position = radar[model].compute_projected_pixel_position(track, pixel, 0)\n",
- " rows.append({\"orientation\": o, \"beam\": beam, \"model\": label, \"distance (km)\": geodesic_distance(lon, lat, position.longitude.degrees, position.latitude.degrees) / 1e3})\n",
+ " lat, lon = float(record[\"latitude\"][s, beam - 1]), float(\n",
+ " record[\"longitude\"][s, beam - 1]\n",
+ " )\n",
+ " for label, instrument, order in (\n",
+ " (\"orientation's instrument\", radar[o], o),\n",
+ " (\n",
+ " \"first orientation's instrument\",\n",
+ " radar[first_orientation],\n",
+ " first_orientation,\n",
+ " ),\n",
+ " (\"attitude schedule\", scheduled_radar, 0),\n",
+ " ):\n",
+ " pixel = (beam - 1) if beam1_pixel[order] == 0 else (49 - beam)\n",
+ " position = instrument.compute_projected_pixel_position(track, pixel, 0)\n",
+ " rows.append(\n",
+ " {\n",
+ " \"orientation\": o,\n",
+ " \"beam\": beam,\n",
+ " \"model\": label,\n",
+ " \"distance (km)\": geodesic_distance(\n",
+ " lon,\n",
+ " lat,\n",
+ " position.longitude.degrees,\n",
+ " position.latitude.degrees,\n",
+ " )\n",
+ " / 1e3,\n",
+ " }\n",
+ " )\n",
" return rows\n",
"\n",
"\n",
- "beam_table = pd.DataFrame([row for rows in Parallel(n_jobs=-1)(delayed(beam_errors)(r) for r in list(ku.values())[::3]) for row in rows])\n",
- "print(\"beam 1 is TAT-C pixel\", beam1_pixel, \"; pitch angles (deg):\", {o: r.pitch_angle for o, r in radar.items()})\n",
- "beam_table.groupby([\"model\", \"orientation\", \"beam\"])[\"distance (km)\"].median().unstack(\"beam\").round(2)"
+ "beam_table = pd.DataFrame(\n",
+ " [\n",
+ " row\n",
+ " for rows in Parallel(n_jobs=-1)(\n",
+ " delayed(beam_errors)(r) for r in list(ku.values())[::3]\n",
+ " )\n",
+ " for row in rows\n",
+ " ]\n",
+ ")\n",
+ "print(\n",
+ " \"beam 1 is TAT-C pixel\",\n",
+ " beam1_pixel,\n",
+ " \"; pitch angles (deg):\",\n",
+ " {o: r.pitch_angle for o, r in radar.items()},\n",
+ ")\n",
+ "beam_table.groupby([\"model\", \"orientation\", \"beam\"])[\"distance (km)\"].median().unstack(\n",
+ " \"beam\"\n",
+ ").round(2)"
]
},
{
@@ -802,7 +1091,7 @@
"id": "e99a318c",
"metadata": {},
"source": [
- "With each orientation's instrument and pixel order, the beam positions are within 0.6 km (median) at nadir and 1.4 to 3.2 km at the swath edges (largest for the beam scanned first). With the first orientation's instrument after the flip, the beams at the edges are 270 km away, on the other side of the swath; nadir positions are unaffected. Since the swath is symmetric, the radar's coverage does not depend on the orientation, but its pixel order does.\n",
+ "With each orientation's instrument and pixel order, the beam positions are within 0.6 km (median) at nadir and 1.4 to 3.2 km at the swath edges (largest for the beam scanned first). With the first orientation's instrument after the flip, the beams at the edges are 270 km away, on the other side of the swath; nadir positions are unaffected. Since the swath is symmetric, the radar's coverage does not depend on the orientation, but its pixel order does. The radar defined once relative to the body, with the attitude schedule, gives the same beam positions as each orientation's instrument, in both orientations.\n",
"\n",
"## Test 3: GMI Scan Geometry\n",
"\n",
@@ -815,10 +1104,10 @@
"id": "abc89e41",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:11:54.099364Z",
- "iopub.status.busy": "2026-10-08T18:11:54.097622Z",
- "iopub.status.idle": "2026-10-08T18:15:17.227284Z",
- "shell.execute_reply": "2026-10-08T18:15:17.227284Z"
+ "iopub.execute_input": "2026-10-25T05:22:39.311740Z",
+ "iopub.status.busy": "2026-10-25T05:22:39.311740Z",
+ "iopub.status.idle": "2026-10-25T05:25:36.381245Z",
+ "shell.execute_reply": "2026-10-25T05:25:36.380739Z"
}
},
"outputs": [
@@ -901,17 +1190,52 @@
" i = np.searchsorted(k[\"seconds\"], g[\"seconds\"][s])\n",
" if i == 0 or i >= len(k[\"seconds\"]):\n",
" continue\n",
- " f = (g[\"seconds\"][s] - k[\"seconds\"][i - 1]) / (k[\"seconds\"][i] - k[\"seconds\"][i - 1])\n",
+ " f = (g[\"seconds\"][s] - k[\"seconds\"][i - 1]) / (\n",
+ " k[\"seconds\"][i] - k[\"seconds\"][i - 1]\n",
+ " )\n",
" pos = (1 - f) * k[\"sc_pos\"][i - 1] + f * k[\"sc_pos\"][i]\n",
" vel = (1 - f) * k[\"sc_vel\"][i - 1] + f * k[\"sc_vel\"][i]\n",
- " track = Geocentric.from_time_and_frame_vectors(times_of([g[\"times\"][s]])[0], itrs, Distance(m=pos.astype(float)), Velocity(km_per_s=vel.astype(float) / 1e3))\n",
- " angles = np.array([compute_cone_and_azimuth(track, wgs84.latlon(float(g[\"latitude\"][s, j]), float(g[\"longitude\"][s, j])), VelocityFrame.INERTIAL) for j in range(0, 221, 10)], dtype=float)\n",
+ " track = Geocentric.from_time_and_frame_vectors(\n",
+ " times_of([g[\"times\"][s]])[0],\n",
+ " itrs,\n",
+ " Distance(m=pos.astype(float)),\n",
+ " Velocity(km_per_s=vel.astype(float) / 1e3),\n",
+ " )\n",
+ " angles = np.array(\n",
+ " [\n",
+ " compute_cone_and_azimuth(\n",
+ " track,\n",
+ " wgs84.latlon(\n",
+ " float(g[\"latitude\"][s, j]), float(g[\"longitude\"][s, j])\n",
+ " ),\n",
+ " VelocityFrame.INERTIAL,\n",
+ " )\n",
+ " for j in range(0, 221, 10)\n",
+ " ],\n",
+ " dtype=float,\n",
+ " )\n",
" azimuth = np.degrees(np.unwrap(np.radians(angles[:, 1])))\n",
- " rows.append({\"orientation\": int(g[\"orientation\"][s]), \"cone angle (deg)\": np.median(angles[:, 0]), \"first pixel azimuth (deg)\": azimuth[0], \"last pixel azimuth (deg)\": azimuth[-1], \"sector center (deg)\": (((azimuth[0] + azimuth[-1]) / 2 + 180) % 360) - 180, \"sector half width (deg)\": abs(azimuth[-1] - azimuth[0]) / 2})\n",
+ " rows.append(\n",
+ " {\n",
+ " \"orientation\": int(g[\"orientation\"][s]),\n",
+ " \"cone angle (deg)\": np.median(angles[:, 0]),\n",
+ " \"first pixel azimuth (deg)\": azimuth[0],\n",
+ " \"last pixel azimuth (deg)\": azimuth[-1],\n",
+ " \"sector center (deg)\": (((azimuth[0] + azimuth[-1]) / 2 + 180) % 360)\n",
+ " - 180,\n",
+ " \"sector half width (deg)\": abs(azimuth[-1] - azimuth[0]) / 2,\n",
+ " }\n",
+ " )\n",
" return rows\n",
"\n",
"\n",
- "gmi_table = pd.DataFrame([row for rows in Parallel(n_jobs=-1)(delayed(gmi_angles)(n) for n in list(gmi)[::4]) for row in rows])\n",
+ "gmi_table = pd.DataFrame(\n",
+ " [\n",
+ " row\n",
+ " for rows in Parallel(n_jobs=-1)(delayed(gmi_angles)(n) for n in list(gmi)[::4])\n",
+ " for row in rows\n",
+ " ]\n",
+ ")\n",
"gmi_table = gmi_table[gmi_table.orientation.isin([0, 180])]\n",
"sector = gmi_table.groupby(\"orientation\").median()\n",
"sector.round(2).T"
@@ -922,13 +1246,13 @@
"id": "378a942a",
"metadata": {},
"source": [
- "GMI's cone angle is 48.3 to 48.6 deg in both orientations, and its scan sector spans about 76 deg on either side of the spacecraft's forward axis: centered at -0.3 deg (ahead of the satellite) when GPM flies forward and at -179.7 deg (behind it) when it flies backward. A `ConicalInstrument` represents each orientation with its scan center azimuth; the yaw flip changes the azimuth by 180 deg.\n",
+ "GMI's cone angle is 48.3 to 48.6 deg in both orientations, and its scan sector spans about 76 deg on either side of the spacecraft's forward axis: centered at -0.3 deg (ahead of the satellite) when GPM flies forward and at -179.7 deg (behind it) when it flies backward. A `ConicalInstrument` represents each orientation with its scan center azimuth; the yaw flip changes the azimuth by 180 deg. With the attitude schedule, GMI is instead defined once, relative to the body, with the forward orientation's scan sector, which the body's yaw turns behind the satellite while GPM flies backward.\n",
"\n",
"## Test 4: Observation Times\n",
"\n",
"The points of interest are those of a Fibonacci lattice with a typical spacing of 500 km, within 65 deg of the equator. For each point and pass, the radar's and GMI's observation times are the times of their scans through the point, interpolated between sampled scans from the nearest sampled pixel (within 15 km for the radar and 30 km for GMI, excluding the outermost pixels), over the three days before and after the yaw flip.\n",
"\n",
- "`collect_observations` predicts the observations of the radar `PointedInstrument` of each orientation (analyzed separately before and after the flip) and of a GMI `ConicalInstrument` (with the cone angle and scan sector of Test 3) with the TLE orbit. Two GMI models are compared: with the scan sector of each orientation (analyzed separately before and after the flip), and with the forward sector throughout. Since the TLE's along-track error shifts all predicted times of a pass equally (Test 1), GMI's observation time is also compared relative to the radar's on the same pass."
+ "`collect_observations` predicts the observations of the radar `PointedInstrument` of each orientation (analyzed separately before and after the flip) and of a GMI `ConicalInstrument` (with the cone angle and scan sector of Test 3) with the TLE orbit. Two GMI models are compared: with the scan sector of each orientation (analyzed separately before and after the flip), and with the forward sector throughout. With the attitude schedule, the radar and GMI of the single satellite (Tests 2 and 3) are each analyzed once, across the flip. Since the TLE's along-track error shifts all predicted times of a pass equally (Test 1), GMI's observation time is also compared relative to the radar's on the same pass."
]
},
{
@@ -937,10 +1261,10 @@
"id": "d3df78aa",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:15:17.229299Z",
- "iopub.status.busy": "2026-10-08T18:15:17.229299Z",
- "iopub.status.idle": "2026-10-08T18:16:25.884176Z",
- "shell.execute_reply": "2026-10-08T18:16:25.884176Z"
+ "iopub.execute_input": "2026-10-25T05:25:36.383255Z",
+ "iopub.status.busy": "2026-10-25T05:25:36.383255Z",
+ "iopub.status.idle": "2026-10-25T05:26:56.926586Z",
+ "shell.execute_reply": "2026-10-25T05:26:56.925580Z"
}
},
"outputs": [
@@ -977,15 +1301,30 @@
"
radar
\n",
"
before flip
\n",
"
2521
\n",
- "
96.231654
\n",
- "
13.595436
\n",
+ "
96.429988
\n",
+ "
13.585023
\n",
"
9.5 to 18.6
\n",
"
\n",
"
\n",
"
after flip
\n",
"
2539
\n",
- "
96.770382
\n",
- "
5.420916
\n",
+ "
96.809768
\n",
+ "
5.420904
\n",
+ "
2.4 to 8.7
\n",
+ "
\n",
+ "
\n",
+ "
radar, attitude schedule
\n",
+ "
before flip
\n",
+ "
2521
\n",
+ "
96.429988
\n",
+ "
13.585023
\n",
+ "
9.5 to 18.6
\n",
+ "
\n",
+ "
\n",
+ "
after flip
\n",
+ "
2539
\n",
+ "
96.809768
\n",
+ "
5.420904
\n",
"
2.4 to 8.7
\n",
"
\n",
"
\n",
@@ -999,23 +1338,38 @@
"
\n",
"
after flip
\n",
"
9163
\n",
- "
95.307214
\n",
- "
5.886651
\n",
+ "
95.427262
\n",
+ "
5.884612
\n",
"
2.5 to 9.6
\n",
"
\n",
"
\n",
"
GMI, forward sector
\n",
"
before flip
\n",
"
9158
\n",
- "
95.217296
\n",
- "
-117.309244
\n",
- "
-137.8 to -44.1
\n",
+ "
95.315571
\n",
+ "
-117.318934
\n",
+ "
-137.8 to -44.2
\n",
+ "
\n",
+ "
\n",
+ "
after flip
\n",
+ "
9163
\n",
+ "
95.427262
\n",
+ "
5.884612
\n",
+ "
2.5 to 9.6
\n",
+ "
\n",
+ "
\n",
+ "
GMI, attitude schedule
\n",
+ "
before flip
\n",
+ "
9158
\n",
+ "
95.413846
\n",
+ "
14.021261
\n",
+ "
9.5 to 19.5
\n",
"
\n",
"
\n",
"
after flip
\n",
"
9163
\n",
- "
95.307214
\n",
- "
5.886651
\n",
+ "
95.427262
\n",
+ "
5.884612
\n",
"
2.5 to 9.6
\n",
"
\n",
" \n",
@@ -1024,27 +1378,39 @@
],
"text/plain": [
" observations matched (%) \\\n",
- "radar before flip 2521 96.231654 \n",
- " after flip 2539 96.770382 \n",
+ "radar before flip 2521 96.429988 \n",
+ " after flip 2539 96.809768 \n",
+ "radar, attitude schedule before flip 2521 96.429988 \n",
+ " after flip 2539 96.809768 \n",
"GMI, sector by orientation before flip 9158 95.370168 \n",
- " after flip 9163 95.307214 \n",
- "GMI, forward sector before flip 9158 95.217296 \n",
- " after flip 9163 95.307214 \n",
+ " after flip 9163 95.427262 \n",
+ "GMI, forward sector before flip 9158 95.315571 \n",
+ " after flip 9163 95.427262 \n",
+ "GMI, attitude schedule before flip 9158 95.413846 \n",
+ " after flip 9163 95.427262 \n",
"\n",
" time difference, median (s) \\\n",
- "radar before flip 13.595436 \n",
- " after flip 5.420916 \n",
+ "radar before flip 13.585023 \n",
+ " after flip 5.420904 \n",
+ "radar, attitude schedule before flip 13.585023 \n",
+ " after flip 5.420904 \n",
"GMI, sector by orientation before flip 14.028344 \n",
- " after flip 5.886651 \n",
- "GMI, forward sector before flip -117.309244 \n",
- " after flip 5.886651 \n",
+ " after flip 5.884612 \n",
+ "GMI, forward sector before flip -117.318934 \n",
+ " after flip 5.884612 \n",
+ "GMI, attitude schedule before flip 14.021261 \n",
+ " after flip 5.884612 \n",
"\n",
" time difference, 5th to 95th percentile (s) \n",
"radar before flip 9.5 to 18.6 \n",
" after flip 2.4 to 8.7 \n",
+ "radar, attitude schedule before flip 9.5 to 18.6 \n",
+ " after flip 2.4 to 8.7 \n",
"GMI, sector by orientation before flip 9.5 to 19.5 \n",
" after flip 2.5 to 9.6 \n",
- "GMI, forward sector before flip -137.8 to -44.1 \n",
+ "GMI, forward sector before flip -137.8 to -44.2 \n",
+ " after flip 2.5 to 9.6 \n",
+ "GMI, attitude schedule before flip 9.5 to 19.5 \n",
" after flip 2.5 to 9.6 "
]
},
@@ -1056,7 +1422,11 @@
"source": [
"WINDOW = (FLIP - pd.Timedelta(days=3), FLIP + pd.Timedelta(days=3))\n",
"lattice = generate_points_fibonacci_lattice(500e3)\n",
- "points = [Point(id=i, latitude=r.geometry.y, longitude=r.geometry.x) for i, r in enumerate(lattice.itertuples()) if abs(r.geometry.y) < 65]\n",
+ "points = [\n",
+ " Point(id=i, latitude=r.geometry.y, longitude=r.geometry.x)\n",
+ " for i, r in enumerate(lattice.itertuples())\n",
+ " if abs(r.geometry.y) < 65\n",
+ "]\n",
"\n",
"\n",
"def reference_times(records, radius, sample):\n",
@@ -1064,10 +1434,18 @@
" for number, r in records.items():\n",
" if r[\"times\"][-1] < WINDOW[0] or r[\"times\"][0] > WINDOW[1]:\n",
" continue\n",
- " rows, cols = np.nonzero(np.isfinite(r[\"latitude\"]) & (np.abs(r[\"latitude\"]) <= 90))\n",
- " cols_ok = (cols > 0) & (cols < r[\"latitude\"].shape[1] - 1) & (cols % sample == 0)\n",
+ " rows, cols = np.nonzero(\n",
+ " np.isfinite(r[\"latitude\"]) & (np.abs(r[\"latitude\"]) <= 90)\n",
+ " )\n",
+ " cols_ok = (\n",
+ " (cols > 0) & (cols < r[\"latitude\"].shape[1] - 1) & (cols % sample == 0)\n",
+ " )\n",
" rows, cols = rows[cols_ok], cols[cols_ok]\n",
- " xyz.append(wgs84.latlon(r[\"latitude\"][rows, cols], r[\"longitude\"][rows, cols]).itrs_xyz.m.T)\n",
+ " xyz.append(\n",
+ " wgs84.latlon(\n",
+ " r[\"latitude\"][rows, cols], r[\"longitude\"][rows, cols]\n",
+ " ).itrs_xyz.m.T\n",
+ " )\n",
" index.append(np.column_stack([np.full(len(rows), number), rows, cols]))\n",
" xyz, index = np.concatenate(xyz), np.concatenate(index)\n",
" tree = cKDTree(xyz)\n",
@@ -1077,14 +1455,27 @@
" nearby = tree.query_ball_point(p, radius)\n",
" if not nearby:\n",
" continue\n",
- " candidates = pd.DataFrame(index[nearby], columns=[\"orbit\", \"row\", \"column\"]).assign(distance=np.linalg.norm(xyz[nearby] - p, axis=1))\n",
- " candidates[\"time\"] = [records[o][\"times\"][r] for o, r in zip(candidates.orbit, candidates.row)]\n",
+ " candidates = pd.DataFrame(\n",
+ " index[nearby], columns=[\"orbit\", \"row\", \"column\"]\n",
+ " ).assign(distance=np.linalg.norm(xyz[nearby] - p, axis=1))\n",
+ " candidates[\"time\"] = [\n",
+ " records[o][\"times\"][r] for o, r in zip(candidates.orbit, candidates.row)\n",
+ " ]\n",
" candidates = candidates.sort_values(\"time\")\n",
- " for _, group in candidates.groupby((candidates.time.diff().dt.total_seconds() > 600).cumsum()):\n",
+ " for _, group in candidates.groupby(\n",
+ " (candidates.time.diff().dt.total_seconds() > 600).cumsum()\n",
+ " ):\n",
" best = group.loc[group.distance.idxmin()]\n",
" r, row, col = records[int(best.orbit)], int(best.row), int(best.column)\n",
" r0, r1 = (row, row + 1) if row + 1 < len(r[\"seconds\"]) else (row - 1, row)\n",
- " x0, x1 = (np.array(wgs84.latlon(float(r[\"latitude\"][k, col]), float(r[\"longitude\"][k, col])).itrs_xyz.m) for k in (r0, r1))\n",
+ " x0, x1 = (\n",
+ " np.array(\n",
+ " wgs84.latlon(\n",
+ " float(r[\"latitude\"][k, col]), float(r[\"longitude\"][k, col])\n",
+ " ).itrs_xyz.m\n",
+ " )\n",
+ " for k in (r0, r1)\n",
+ " )\n",
" fraction = float(np.dot(p - x0, x1 - x0) / np.dot(x1 - x0, x1 - x0))\n",
" time = r[\"times\"][r0] + (r[\"times\"][r1] - r[\"times\"][r0]) * fraction\n",
" if WINDOW[0] <= time <= WINDOW[1]:\n",
@@ -1092,46 +1483,123 @@
" return pd.DataFrame(out)\n",
"\n",
"\n",
- "reference = {\"radar\": reference_times(ku, 15e3, 1), \"GMI\": reference_times(gmi, 30e3, 2)}\n",
+ "reference = {\n",
+ " \"radar\": reference_times(ku, 15e3, 1),\n",
+ " \"GMI\": reference_times(gmi, 30e3, 2),\n",
+ "}\n",
"cone = float(sector[\"cone angle (deg)\"].median())\n",
"forward = int(sector[\"sector center (deg)\"].abs().idxmin())\n",
"half_width = float(sector[\"sector half width (deg)\"].median())\n",
"\n",
"\n",
"def gmi_instrument(center):\n",
- " return ConicalInstrument(name=\"GMI\", cone_angle=cone, scan_center_azimuth=center, scan_half_width=half_width, along_track_field_of_view=1, velocity_frame=VelocityFrame.INERTIAL)\n",
- "\n",
- "\n",
- "periods = [(WINDOW[0], FLIP, int(orientation[orientation.time < FLIP].orientation.mode()[0])), (FLIP, WINDOW[1], int(orientation[orientation.time >= FLIP].orientation.mode()[0]))]\n",
+ " return ConicalInstrument(\n",
+ " name=\"GMI\",\n",
+ " cone_angle=cone,\n",
+ " scan_center_azimuth=center,\n",
+ " scan_half_width=half_width,\n",
+ " along_track_field_of_view=1,\n",
+ " velocity_frame=VelocityFrame.INERTIAL,\n",
+ " )\n",
+ "\n",
+ "\n",
+ "periods = [(WINDOW[0], FLIP, orientations[0]), (FLIP, WINDOW[1], orientations[1])]\n",
+ "\n",
+ "\n",
+ "def satellite_with(instrument):\n",
+ " return Satellite(name=\"GPM\", orbit=orbit, instruments=[instrument])\n",
+ "\n",
+ "\n",
+ "# GPM with its attitude schedule: the radar and GMI defined once, relative to the body (forward orientation)\n",
+ "body_gmi = ConicalInstrument(\n",
+ " name=\"GMI\",\n",
+ " cone_angle=cone,\n",
+ " scan_center_azimuth=float(sector.loc[0, \"sector center (deg)\"]),\n",
+ " scan_half_width=half_width,\n",
+ " along_track_field_of_view=1,\n",
+ ")\n",
+ "gpm = Satellite(\n",
+ " name=\"GPM\", orbit=orbit, instruments=[body_radar, body_gmi], attitude=schedule\n",
+ ")\n",
"models = {\n",
- " \"radar\": [(radar[o], start, end) for start, end, o in periods],\n",
- " \"GMI, sector by orientation\": [(gmi_instrument(float(sector.loc[o, \"sector center (deg)\"])), start, end) for start, end, o in periods],\n",
- " \"GMI, forward sector\": [(gmi_instrument(float(sector.loc[forward, \"sector center (deg)\"])), start, end) for start, end, _ in periods],\n",
+ " \"radar\": [(satellite_with(radar[o]), 0, start, end) for start, end, o in periods],\n",
+ " \"radar, attitude schedule\": [(gpm, 0, WINDOW[0], WINDOW[1])],\n",
+ " \"GMI, sector by orientation\": [\n",
+ " (\n",
+ " satellite_with(gmi_instrument(float(sector.loc[o, \"sector center (deg)\"]))),\n",
+ " 0,\n",
+ " start,\n",
+ " end,\n",
+ " )\n",
+ " for start, end, o in periods\n",
+ " ],\n",
+ " \"GMI, forward sector\": [\n",
+ " (\n",
+ " satellite_with(\n",
+ " gmi_instrument(float(sector.loc[forward, \"sector center (deg)\"]))\n",
+ " ),\n",
+ " 0,\n",
+ " start,\n",
+ " end,\n",
+ " )\n",
+ " for start, end, _ in periods\n",
+ " ],\n",
+ " \"GMI, attitude schedule\": [(gpm, 1, WINDOW[0], WINDOW[1])],\n",
"}\n",
"\n",
"\n",
- "def observe(point, instrument, start, end):\n",
- " return collect_observations(point, Satellite(name=\"GPM\", orbit=orbit, instruments=[instrument]), start.to_pydatetime(), end.to_pydatetime()).assign(point_id=point.id)\n",
+ "def observe(point, satellite, index, start, end):\n",
+ " return collect_observations(\n",
+ " point,\n",
+ " satellite,\n",
+ " start.to_pydatetime(),\n",
+ " end.to_pydatetime(),\n",
+ " instrument_index=index,\n",
+ " ).assign(point_id=point.id)\n",
"\n",
"\n",
"predicted = {}\n",
"for label, runs in models.items():\n",
- " frames = Parallel(n_jobs=-1)(delayed(observe)(point, instrument, start, end) for instrument, start, end in runs for point in points)\n",
- " predicted[label] = pd.concat([f for f in frames if not f.empty])[[\"point_id\", \"epoch\"]]\n",
+ " frames = Parallel(n_jobs=-1)(\n",
+ " delayed(observe)(point, satellite, index, start, end)\n",
+ " for satellite, index, start, end in runs\n",
+ " for point in points\n",
+ " )\n",
+ " predicted[label] = pd.concat([f for f in frames if not f.empty])[\n",
+ " [\"point_id\", \"epoch\"]\n",
+ " ]\n",
"\n",
"\n",
"def match(observed, model):\n",
- " merged = pd.merge_asof(observed.sort_values(\"time\"), predicted[model].rename(columns={\"epoch\": \"predicted\"}).sort_values(\"predicted\"), left_on=\"time\", right_on=\"predicted\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=5))\n",
+ " merged = pd.merge_asof(\n",
+ " observed.sort_values(\"time\"),\n",
+ " predicted[model]\n",
+ " .rename(columns={\"epoch\": \"predicted\"})\n",
+ " .sort_values(\"predicted\"),\n",
+ " left_on=\"time\",\n",
+ " right_on=\"predicted\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=5),\n",
+ " )\n",
" merged[\"difference (s)\"] = (merged.predicted - merged.time).dt.total_seconds()\n",
" merged[\"period\"] = np.where(merged.time < FLIP, \"before flip\", \"after flip\")\n",
" return merged\n",
"\n",
"\n",
- "matched = {label: match(reference[\"radar\" if label == \"radar\" else \"GMI\"], label) for label in models}\n",
+ "matched = {\n",
+ " label: match(reference[\"radar\" if label.startswith(\"radar\") else \"GMI\"], label)\n",
+ " for label in models\n",
+ "}\n",
"rows4 = {}\n",
"for label, merged in matched.items():\n",
" for period, group in merged.groupby(\"period\", sort=False):\n",
- " rows4[(label, period)] = {\"observations\": len(group), \"matched (%)\": 100 * group.predicted.notna().mean(), \"time difference, median (s)\": group[\"difference (s)\"].median(), \"time difference, 5th to 95th percentile (s)\": f\"{group['difference (s)'].quantile(0.05):.1f} to {group['difference (s)'].quantile(0.95):.1f}\"}\n",
+ " rows4[(label, period)] = {\n",
+ " \"observations\": len(group),\n",
+ " \"matched (%)\": 100 * group.predicted.notna().mean(),\n",
+ " \"time difference, median (s)\": group[\"difference (s)\"].median(),\n",
+ " \"time difference, 5th to 95th percentile (s)\": f\"{group['difference (s)'].quantile(0.05):.1f} to {group['difference (s)'].quantile(0.95):.1f}\",\n",
+ " }\n",
"pd.DataFrame(rows4).T"
]
},
@@ -1141,10 +1609,10 @@
"id": "735bfea7",
"metadata": {
"execution": {
- "iopub.execute_input": "2026-10-08T18:16:25.887182Z",
- "iopub.status.busy": "2026-10-08T18:16:25.887182Z",
- "iopub.status.idle": "2026-10-08T18:16:25.937814Z",
- "shell.execute_reply": "2026-10-08T18:16:25.937814Z"
+ "iopub.execute_input": "2026-10-25T05:26:56.928585Z",
+ "iopub.status.busy": "2026-10-25T05:26:56.928585Z",
+ "iopub.status.idle": "2026-10-25T05:26:57.006754Z",
+ "shell.execute_reply": "2026-10-25T05:26:57.005749Z"
}
},
"outputs": [
@@ -1181,34 +1649,51 @@
"
\n",
"
GMI, sector by orientation
\n",
"
before flip
\n",
- "
2423.0
\n",
+ "
2428.0
\n",
"
73.86
\n",
"
74.26
\n",
- "
0.31
\n",
+ "
0.32
\n",
"
1.22
\n",
"
\n",
"
\n",
"
after flip
\n",
- "
2453.0
\n",
+ "
2457.0
\n",
"
-74.76
\n",
- "
-74.24
\n",
+ "
-74.23
\n",
"
0.57
\n",
"
1.06
\n",
"
\n",
"
\n",
"
GMI, forward sector
\n",
"
before flip
\n",
- "
2420.0
\n",
+ "
2428.0
\n",
"
73.86
\n",
"
-73.93
\n",
- "
-147.68
\n",
+ "
-147.69
\n",
"
151.83
\n",
"
\n",
"
\n",
"
after flip
\n",
- "
2454.0
\n",
+ "
2458.0
\n",
"
-74.76
\n",
- "
-74.24
\n",
+ "
-74.23
\n",
+ "
0.57
\n",
+ "
1.06
\n",
+ "
\n",
+ "
\n",
+ "
GMI, attitude schedule
\n",
+ "
before flip
\n",
+ "
2428.0
\n",
+ "
73.86
\n",
+ "
74.26
\n",
+ "
0.32
\n",
+ "
1.22
\n",
+ "
\n",
+ "
\n",
+ "
after flip
\n",
+ "
2457.0
\n",
+ "
-74.76
\n",
+ "
-74.23
\n",
"
0.57
\n",
"
1.06
\n",
"
\n",
@@ -1218,33 +1703,43 @@
],
"text/plain": [
" passes \\\n",
- "GMI, sector by orientation before flip 2423.0 \n",
- " after flip 2453.0 \n",
- "GMI, forward sector before flip 2420.0 \n",
- " after flip 2454.0 \n",
+ "GMI, sector by orientation before flip 2428.0 \n",
+ " after flip 2457.0 \n",
+ "GMI, forward sector before flip 2428.0 \n",
+ " after flip 2458.0 \n",
+ "GMI, attitude schedule before flip 2428.0 \n",
+ " after flip 2457.0 \n",
"\n",
" GMI minus radar, reported, median (s) \\\n",
"GMI, sector by orientation before flip 73.86 \n",
" after flip -74.76 \n",
"GMI, forward sector before flip 73.86 \n",
" after flip -74.76 \n",
+ "GMI, attitude schedule before flip 73.86 \n",
+ " after flip -74.76 \n",
"\n",
" GMI minus radar, TAT-C, median (s) \\\n",
"GMI, sector by orientation before flip 74.26 \n",
- " after flip -74.24 \n",
+ " after flip -74.23 \n",
"GMI, forward sector before flip -73.93 \n",
- " after flip -74.24 \n",
+ " after flip -74.23 \n",
+ "GMI, attitude schedule before flip 74.26 \n",
+ " after flip -74.23 \n",
"\n",
" TAT-C minus reported, median (s) \\\n",
- "GMI, sector by orientation before flip 0.31 \n",
+ "GMI, sector by orientation before flip 0.32 \n",
" after flip 0.57 \n",
- "GMI, forward sector before flip -147.68 \n",
+ "GMI, forward sector before flip -147.69 \n",
+ " after flip 0.57 \n",
+ "GMI, attitude schedule before flip 0.32 \n",
" after flip 0.57 \n",
"\n",
" TAT-C minus reported, 95th percentile of magnitude (s) \n",
"GMI, sector by orientation before flip 1.22 \n",
" after flip 1.06 \n",
"GMI, forward sector before flip 151.83 \n",
+ " after flip 1.06 \n",
+ "GMI, attitude schedule before flip 1.22 \n",
" after flip 1.06 "
]
},
@@ -1255,15 +1750,49 @@
],
"source": [
"# GMI's observation time relative to the radar's on the same pass\n",
- "pairs = pd.merge_asof(matched[\"radar\"].dropna(subset=[\"predicted\"]).sort_values(\"time\"), reference[\"GMI\"].rename(columns={\"time\": \"gmi_time\"}).sort_values(\"gmi_time\"), left_on=\"time\", right_on=\"gmi_time\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=5)).dropna(subset=[\"gmi_time\"])\n",
"rows4b = {}\n",
- "for label in (\"GMI, sector by orientation\", \"GMI, forward sector\"):\n",
- " p = pd.merge_asof(pairs.sort_values(\"gmi_time\"), predicted[label].rename(columns={\"epoch\": \"gmi_predicted\"}).sort_values(\"gmi_predicted\"), left_on=\"gmi_time\", right_on=\"gmi_predicted\", by=\"point_id\", direction=\"nearest\", tolerance=pd.Timedelta(minutes=5)).dropna(subset=[\"gmi_predicted\"])\n",
+ "for label, radar_label in (\n",
+ " (\"GMI, sector by orientation\", \"radar\"),\n",
+ " (\"GMI, forward sector\", \"radar\"),\n",
+ " (\"GMI, attitude schedule\", \"radar, attitude schedule\"),\n",
+ "):\n",
+ " pairs = pd.merge_asof(\n",
+ " matched[radar_label].dropna(subset=[\"predicted\"]).sort_values(\"time\"),\n",
+ " reference[\"GMI\"].rename(columns={\"time\": \"gmi_time\"}).sort_values(\"gmi_time\"),\n",
+ " left_on=\"time\",\n",
+ " right_on=\"gmi_time\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=5),\n",
+ " ).dropna(subset=[\"gmi_time\"])\n",
+ " p = pd.merge_asof(\n",
+ " pairs.sort_values(\"gmi_time\"),\n",
+ " predicted[label]\n",
+ " .rename(columns={\"epoch\": \"gmi_predicted\"})\n",
+ " .sort_values(\"gmi_predicted\"),\n",
+ " left_on=\"gmi_time\",\n",
+ " right_on=\"gmi_predicted\",\n",
+ " by=\"point_id\",\n",
+ " direction=\"nearest\",\n",
+ " tolerance=pd.Timedelta(minutes=5),\n",
+ " ).dropna(subset=[\"gmi_predicted\"])\n",
" p[\"reported (s)\"] = (p.gmi_time - p.time).dt.total_seconds()\n",
" p[\"TAT-C (s)\"] = (p.gmi_predicted - p.predicted).dt.total_seconds()\n",
" p[\"TAT-C minus reported (s)\"] = p[\"TAT-C (s)\"] - p[\"reported (s)\"]\n",
" for period, group in p.groupby(\"period\", sort=False):\n",
- " rows4b[(label, period)] = {\"passes\": len(group), \"GMI minus radar, reported, median (s)\": group[\"reported (s)\"].median(), \"GMI minus radar, TAT-C, median (s)\": group[\"TAT-C (s)\"].median(), \"TAT-C minus reported, median (s)\": group[\"TAT-C minus reported (s)\"].median(), \"TAT-C minus reported, 95th percentile of magnitude (s)\": group[\"TAT-C minus reported (s)\"].abs().quantile(0.95)}\n",
+ " rows4b[(label, period)] = {\n",
+ " \"passes\": len(group),\n",
+ " \"GMI minus radar, reported, median (s)\": group[\"reported (s)\"].median(),\n",
+ " \"GMI minus radar, TAT-C, median (s)\": group[\"TAT-C (s)\"].median(),\n",
+ " \"TAT-C minus reported, median (s)\": group[\n",
+ " \"TAT-C minus reported (s)\"\n",
+ " ].median(),\n",
+ " \"TAT-C minus reported, 95th percentile of magnitude (s)\": group[\n",
+ " \"TAT-C minus reported (s)\"\n",
+ " ]\n",
+ " .abs()\n",
+ " .quantile(0.95),\n",
+ " }\n",
"pd.DataFrame(rows4b).T.round(2)"
]
},
@@ -1272,18 +1801,18 @@
"id": "c44c7d6c",
"metadata": {},
"source": [
- "The absolute observation times are shifted by the TLE's along-track error (Test 1): the radar's predicted observations are 13.6 s late (median) before the flip and 5.4 s late after it, and GMI's (with the sector of each orientation) 14.0 and 5.9 s late; 96% of the radar's and 95% of GMI's observations are matched by predicted ones. Relative to the radar on the same pass, which removes the orbit error, GMI observes points 73.9 s after the radar before the flip, when its sector is behind the satellite, and 74.8 s before the radar after the flip, when its sector is ahead. With the sector of each orientation, TAT-C reproduces these times within 0.6 s (median) and 1.2 s (95th percentile). With the forward sector throughout, GMI's predicted observations before the flip are 148 s too early.\n",
+ "The absolute observation times are shifted by the TLE's along-track error (Test 1): the radar's predicted observations are 13.6 s late (median) before the flip and 5.4 s late after it, and GMI's (with the sector of each orientation) 14.0 and 5.9 s late; 96% of the radar's and 95% of GMI's observations are matched by predicted ones. Relative to the radar on the same pass, which removes the orbit error, GMI observes points 73.9 s after the radar before the flip, when its sector is behind the satellite, and 74.8 s before the radar after the flip, when its sector is ahead. With the sector of each orientation, TAT-C reproduces these times within 0.6 s (median) and 1.2 s (95th percentile). With the forward sector throughout, GMI's predicted observations before the flip are 148 s too early. With the attitude schedule, a single analysis of each instrument across the flip gives the same results as the separate analyses of each orientation: the radar's predicted observations are identical, and GMI's times relative to the radar are again within 0.6 s (median) and 1.2 s (95th percentile).\n",
"\n",
"## Summary\n",
"\n",
"| Test | Result |\n",
"| --- | --- |\n",
"| 1. Orbit (TLE) | node local time precession (17.3 minutes per day) within 0.15 minutes; along-track error from drag of up to 31 km within 11 to 16 days of the TLE epoch, growing to 300 km at 26 days |\n",
- "| 2. Radar scan geometry (`ViewGeometry.SCAN`, `VelocityFrame.INERTIAL`) | 49 beams over -17 to +17 deg, perpendicular to the inertial velocity; the yaw flip reverses the beam order and the sign of a 0.15 deg along-track offset; beams within 0.6 to 3.2 km with each orientation's instrument, 270 km at the edges with the other orientation's |\n",
+ "| 2. Radar scan geometry (`ViewGeometry.SCAN`, `VelocityFrame.INERTIAL`) | 49 beams over -17 to +17 deg, perpendicular to the inertial velocity; the yaw flip reverses the beam order and the sign of a 0.15 deg along-track offset; beams within 0.6 to 3.2 km with each orientation's instrument or with one instrument and an `AttitudeSchedule`, 270 km at the edges with the other orientation's |\n",
"| 3. GMI scan geometry (`ConicalInstrument`) | 48.5 deg cone; scan sector centered ahead (-0.3 deg) or behind (-179.7 deg) the satellite, depending on the orientation |\n",
- "| 4. Observation times (`collect_observations`) | GMI relative to the radar within 0.6 s (median) with each orientation's sector; 148 s off with the forward sector before the flip; absolute times shifted by the TLE's along-track error |\n",
+ "| 4. Observation times (`collect_observations`) | GMI relative to the radar within 0.6 s (median) with each orientation's sector, or across the flip in one analysis with an `AttitudeSchedule`; 148 s off with the forward sector before the flip; absolute times shifted by the TLE's along-track error |\n",
"\n",
- "**Yaw flips.** TAT-C represents each of GPM's orientations: the radar as a `PointedInstrument` with the orientation's pitch angle and pixel order, and GMI as a `ConicalInstrument` with the orientation's scan center azimuth. It does not model the flips themselves, so an analysis across a flip must be split at the time of the flip, with the instruments of each orientation; an attitude schedule (a time-dependent yaw of 0 or 180 deg) would represent it in a single analysis.\n",
+ "**Yaw flips.** TAT-C represents GPM's yaw flips with an `AttitudeSchedule`: GPM is a single `Satellite` whose body yaws by 180 deg while it flies backward (in the inertial velocity frame), and the radar (a `PointedInstrument`) and GMI (a `ConicalInstrument`) are defined once, relative to the body, as in the forward orientation. An analysis across a flip then gives the same results as separate analyses of each orientation, with the radar's pitch angle and pixel order and GMI's scan center azimuth of each.\n",
"\n",
"**Low orbits.** GPM's along-track position departs from its TLE by tens to hundreds of kilometers over weeks, because drag and orbit maintenance change its orbit; analyses of observation times should use TLEs close to the analysis period."
]
diff --git a/docs/validation/index.rst b/docs/validation/index.rst
index 04bb73ab..33ea99fe 100644
--- a/docs/validation/index.rst
+++ b/docs/validation/index.rst
@@ -11,6 +11,9 @@ The following compare TAT-C analysis results with reference data from operationa
ValidateLimbSABER.ipynb
ValidateROCOSMIC2.ipynb
ValidateROPlanetiQ.ipynb
+ ValidateSpaceCOSMIC2.ipynb
+ ValidateSpaceGRACEFO.ipynb
+ ValidateSpaceSOCRATES.ipynb
ValidateRadarNEXRAD.ipynb
ValidateImagerATMS.ipynb
ValidateImagerCrIS.ipynb
@@ -20,8 +23,11 @@ The following compare TAT-C analysis results with reference data from operationa
ValidatePushbroomMSI.ipynb
ValidateRevisitSentinel2.ipynb
ValidateRegionSentinel2.ipynb
+ ValidateRegionPolarSentinel1.ipynb
ValidateConicalAMSR2.ipynb
ValidateConicalGMI.ipynb
+ ValidateCoincidenceGMIAMSR2.ipynb
+ ValidateGridSMAP.ipynb
ValidateOrbitGeneration.ipynb
ValidateDopGNSS.ipynb
ValidateLatencyNOAA20.ipynb
@@ -36,8 +42,10 @@ The following compare TAT-C analysis results with reference data from operationa
ValidateDriftMODIS.ipynb
ValidatePointingOCO2.ipynb
ValidateYawFlipGPM.ipynb
+ ValidateSampleSizes.ipynb
+ ValidateFeaturesTCPRIMED.ipynb
-These notebooks download reference data on first run (the MLS, NISAR, AMSR2, GMI, SWOT, ICESat-2, ECOSTRESS, PACE, MODIS, OCO-2, and GPM data require a free `NASA Earthdata Login `_ account, and the Landsat 9 orbit history a free `Space-Track.org `_ account) and require additional dependencies, which can be installed via::
+These notebooks download reference data on first run, except ``ValidateSampleSizes``, which reuses the data of the imager and conical scanner notebooks, and ``ValidateSpaceCOSMIC2``, which reuses the data of ``ValidateROCOSMIC2``. ``ValidateSpaceSOCRATES`` includes a sample of a SOCRATES run (data from CelesTrak). The MLS, NISAR, AMSR2, GMI, SWOT, ICESat-2, ECOSTRESS, PACE, MODIS, OCO-2, GPM, GRACE-FO, and SMAP data require a free `NASA Earthdata Login `_ account, and the orbit histories of the Landsat 9, TC PRIMED, and GRACE-FO notebooks a free `Space-Track.org `_ account. The notebooks require additional dependencies, which can be installed via::
pip install tatc[validation]
diff --git a/docs/validation/socrates_2026-10-25.csv b/docs/validation/socrates_2026-10-25.csv
new file mode 100644
index 00000000..26b9b707
--- /dev/null
+++ b/docs/validation/socrates_2026-10-25.csv
@@ -0,0 +1,501 @@
+NORAD_CAT_ID_1,OBJECT_NAME_1,DSE_1,NORAD_CAT_ID_2,OBJECT_NAME_2,DSE_2,TCA,TCA_RANGE,TCA_RELATIVE_SPEED,MAX_PROB,DILUTION
+63297,OBJECT G [+],0.94,64028,STARLINK-33953 [+],0.991,2026-10-25 06:16:50.944,4.181,15.033,2.826e-06,2.664
+62635,GARAI-A [+],1.038,62664,LYRA-1 [+],1.036,2026-10-25 06:42:32.251,2.025,0.647,1.075e-06,0.478
+56153,PIESAT-1 A [+],3.676,56156,PIESAT-1 D [+],3.61,2026-10-25 07:22:09.505,0.237,0.001,7.877e-05,0.056
+54750,YAOGAN-36 04C [+],1.511,68565,STARLINK-37161 [+],1.066,2026-10-25 07:42:23.668,2.669,5.732,1.753e-05,0.673
+62656,TRANSPORTER-12 OBJECT AZ [+],1.13,64668,STARLINK-34395 [+],1.057,2026-10-25 07:46:40.804,3.47,12.757,6.838e-06,1.326
+41601,SKYSAT-C1 [+],1.748,45212,STARLINK-1231 [P],1.028,2026-10-25 07:54:05.556,4.766,9.235,4.399e-06,1.368
+58921,NEXSAT-1 [+],1.039,65935,STARLINK-35155 [+],1.276,2026-10-25 08:16:50.617,4.857,14.635,2.422e-06,2.676
+58199,TIANHUI 5A [+],3.821,58201,TIANHUI 5B [+],3.754,2026-10-25 08:31:26.641,0.479,0.001,2.125e-05,0.118
+57401,TIANMU-1 09 [+],1.117,65802,STARLINK-34919 [+],1.592,2026-10-25 08:41:10.343,4.981,15.089,1.953e-06,3.234
+55844,HORUS 2 [+],1.134,66705,FLOCK 4H-2 [+],1.66,2026-10-25 09:22:19.362,4.833,0.125,1.889e-07,1.14
+69870,ICEYE-X79 [+],1.795,69912,MARMOTSAT [+],1.192,2026-10-25 09:27:09.318,4.257,0.015,2.436e-07,1.004
+64900,CO3D 3 [+],1.135,66733,FLOCK 4H-30 [+],1.2,2026-10-25 09:38:12.350,2.408,0.698,7.604e-07,0.568
+62640,NUSAT-45 (UZMASAT-1) [+],1.454,62675,FLOCK 4G-36 [+],1.257,2026-10-25 09:56:48.082,3.512,0.179,3.58e-07,0.828
+62658,TROLL [+],1.479,65476,STARLINK-35098 [+],1.747,2026-10-25 10:23:07.031,1.881,12.575,2.372e-05,0.706
+68377,SUPERVIEW NEO-2 05 [+],3.542,68378,SUPERVIEW NEO-2 06 [+],3.608,2026-10-25 10:36:07.475,1.938,0.003,1.413e-06,0.417
+62623,OTTER [+],1.221,65383,STARLINK-35054 [+],1.358,2026-10-25 10:46:38.457,1.148,14.356,4.649e-05,0.59
+66729,FLOCK 4H-26 [+],1.268,68451,IRIDE-MS1-EAGLET 2-10 [+],1.331,2026-10-25 10:49:06.162,2.023,12.683,6.674e-07,0.771
+37168,SBSS (USA 216) [+],1.587,67546,STARLINK-36580 [+],1.32,2026-10-25 11:29:34.267,1.611,0.416,5.137e-05,0.38
+64528,GOOD ANCESTOR KILAKILA [+],1.928,67307,STARLINK-36481 [+],1.33,2026-10-25 12:26:13.629,4.163,9.006,6.402e-06,1.181
+57180,MONITOR-3 (RS58S) [+],1.275,67032,STARLINK-36131 [+],1.505,2026-10-25 12:45:09.324,3.977,14.344,3.897e-06,2.031
+62079,SUPERVIEW NEO-2 03 [+],3.864,62080,SUPERVIEW NEO-2 04 [+],3.667,2026-10-25 12:48:07.376,0.169,0.0,0.0003707,0.026
+60211,TIANHUI 5C [+],3.919,60212,TIANHUI 5D [+],3.919,2026-10-25 13:01:45.140,0.399,0.001,3.104e-05,0.092
+66690,TRANSPORTER-15 OBJECT AA [+],1.399,66726,FLOCK 4H-23 [+],1.792,2026-10-25 13:12:30.702,3.971,0.072,2.799e-07,0.936
+61514,STARLINK-31837 [+],1.547,68370,RASSVET-3 11 [+],1.346,2026-10-25 13:16:17.513,1.084,9.356,9.26e-05,0.313
+66767,ACCENTURE-1 [+],1.365,67749,OBJECT D [+],1.76,2026-10-25 13:29:19.619,2.837,7.127,4.919e-07,0.746
+40118,GAOFEN-2 [+],1.278,63750,KUIPER-00038 [+],1.526,2026-10-25 13:40:53.163,3.811,14.353,1.339e-07,2.04
+66692,NUSAT-52 (MELINA FURMAN) [+],1.628,66721,FLOCK 4H-18 [+],1.43,2026-10-25 13:58:46.067,1.708,0.018,1.512e-06,0.403
+57101,STARLINK-6132 [+],1.488,57115,STARLINK-6085 [P],1.492,2026-10-25 14:02:46.809,2.992,0.082,4.919e-05,0.707
+48449,STARLINK-2655 [P],1.481,49748,STARLINK-3248 [+],1.482,2026-10-25 14:23:46.773,2.304,0.45,8.311e-05,0.543
+56458,STARLINK-6050 [+],1.347,61789,SITRO-AIS 17 [+],1.358,2026-10-25 14:50:57.992,1.815,14.706,1.631e-05,1.063
+68377,SUPERVIEW NEO-2 05 [+],3.74,68378,SUPERVIEW NEO-2 06 [+],3.806,2026-10-25 15:20:27.211,2.205,0.003,1.413e-06,0.417
+45747,STARLINK-1506 [P],1.478,67854,STARLINK-36608 [+],1.477,2026-10-25 15:53:29.079,3.014,0.029,4.829e-05,0.715
+49261,CS1 [+],1.522,60103,STARLINK-32013 [+],1.39,2026-10-25 16:35:58.047,3.288,7.631,1.09e-05,0.879
+60211,TIANHUI 5C [+],4.12,60212,TIANHUI 5D [+],4.12,2026-10-25 17:52:12.706,0.397,0.001,3.104e-05,0.092
+55294,STARLINK-5286 [+],1.512,57181,OBJECT R [+],1.46,2026-10-25 18:17:10.512,2.118,15.063,1.073e-05,1.385
+56934,GEISAT PRECURSOR [+],1.508,64607,STARLINK-34532 [+],1.579,2026-10-25 18:18:18.875,4.022,11.35,5.892e-06,1.329
+63990,SCS-01 J [+],1.492,66685,AE5RA [+],1.624,2026-10-25 18:28:05.884,2.057,0.187,1.044e-06,0.485
+60211,TIANHUI 5C [+],4.153,60212,TIANHUI 5D [+],4.153,2026-10-25 18:39:32.140,0.394,0.001,3.104e-05,0.092
+47126,STARLINK-1812 [P],1.67,57255,STARLINK-5481 [+],1.697,2026-10-25 18:45:17.826,2.979,11.212,3.586e-05,0.974
+58469,ION SCV-015 [+],1.476,65470,STARLINK-34829 [+],1.487,2026-10-25 18:55:24.019,4.088,13.269,4.562e-06,1.688
+47486,CELESTIS-17 & SHERPA-FX1 [+],1.647,65666,STARLINK-35181 [+],1.712,2026-10-25 19:03:12.648,4.51,0.244,6.562e-06,1.064
+69898,GRUS-3E [+],1.66,69931,GRITSS [+],1.86,2026-10-25 19:36:18.501,3.273,0.015,4.121e-07,0.772
+59847,STARLINK-31889 [+],2.215,67289,NASBSAT-1 [+],2.089,2026-10-25 20:28:13.714,4.157,8.293,6.634e-06,1.142
+53346,TECMS [+],1.512,55273,STARLINK-5291 [+],1.605,2026-10-25 20:31:11.755,1.368,15.127,2.492e-05,0.923
+57175,CUBEBEL 2 (EU11S) [+],1.551,61230,OBJECT D [+],1.55,2026-10-25 20:32:01.751,3.314,1.798,3.995e-07,0.786
+60505,FLOCK 4BE-24 [+],1.954,60525,ORESAT0.5 [+],1.953,2026-10-25 22:48:42.745,3.879,0.259,2.934e-07,0.914
+68377,SUPERVIEW NEO-2 05 [+],4.135,68378,SUPERVIEW NEO-2 06 [+],4.201,2026-10-26 00:49:04.469,2.776,0.004,1.413e-06,0.417
+66163,STARLINK-35607 [+],1.943,66703,PELICAN-6 [+],1.789,2026-10-26 00:56:52.026,4.187,8.42,6.503e-06,1.156
+58118,STARLINK-30795 [+],2.025,63297,OBJECT G [+],1.735,2026-10-26 01:21:48.982,1.49,14.344,2.778e-05,0.76
+46914,KSM1-B [+],1.815,56105,STARLINK-6066 [+],1.754,2026-10-26 01:34:17.404,2.057,3.563,3.078e-05,0.497
+56767,STARLINK-6197 [P],1.863,66562,STARLINK-35579 [+],2.249,2026-10-26 02:20:40.834,4.747,4.065,1.896e-05,1.156
+58700,TIANMU-1 15 [+],1.804,59739,STARLINK-31726 [+],1.957,2026-10-26 02:33:23.932,2.966,14.235,7.202e-06,1.473
+58199,TIANHUI 5A [+],4.588,58201,TIANHUI 5B [+],4.521,2026-10-26 02:55:49.308,0.414,0.001,2.125e-05,0.118
+53405,STARLINK-4510 [+],2.288,53692,STARLINK-4572 [P],1.963,2026-10-26 02:59:50.863,3.608,7.128,3.045e-05,0.947
+58400,MALLIGYONG-1 [+],1.855,69646,VICTUS HAZE PUMA [+],1.858,2026-10-26 03:11:10.154,4.509,2.416,2.147e-07,1.075
+46913,R2 [+],1.946,61862,STARLINK-32393 [+],1.809,2026-10-26 03:12:58.057,3.274,3.678,1.213e-05,0.793
+56153,PIESAT-1 A [+],4.535,56156,PIESAT-1 D [+],4.469,2026-10-26 03:58:26.884,1.47,0.003,2.042e-06,0.347
+62079,SUPERVIEW NEO-2 03 [+],4.519,62080,SUPERVIEW NEO-2 04 [+],4.321,2026-10-26 04:30:30.947,0.227,0.0,0.0003707,0.026
+52602,STARLINK-4012 [+],2.162,66668,SARI-1 [+],2.094,2026-10-26 05:40:29.740,3.219,9.288,1.056e-05,0.926
+62610,EDISON-1 [+],2.299,65599,STARLINK-35245 [+],2.365,2026-10-26 06:31:35.368,1.437,2.703,6.373e-05,0.344
+66702,IRIDE-MS1-EAGLET 2-8 [+],2.121,66732,FLOCK 4H-29 [+],2.121,2026-10-26 06:34:29.649,4.875,0.034,1.857e-07,1.149
+57175,CUBEBEL 2 (EU11S) [+],1.976,69478,STARLINK-37816 [+],1.973,2026-10-26 06:44:07.622,3.516,5.686,3.344e-07,0.886
+62381,HAWK-11C [+],1.994,69213,STARLINK-37716 [+],1.994,2026-10-26 06:47:05.609,0.85,7.273,0.000165,0.224
+63502,STARLINK-33818 [+],2.27,68098,GLOBAL-34 [+],2.198,2026-10-26 07:00:36.755,3.533,3.686,1.042e-05,0.855
+60485,TOMORROW-S2 [+],2.191,64597,STARLINK-34486 [+],2.19,2026-10-26 08:29:53.880,4.461,7.272,5.994e-06,1.177
+62676,FOSSASAT-2E19 (TAT-E) [+],2.154,66687,LEO EXPRESS 3 [+],2.414,2026-10-26 08:49:30.065,1.161,0.518,3.272e-06,0.274
+52746,GHGSAT-C4 [+],2.112,66204,STARLINK-35490 [+],2.091,2026-10-26 09:01:24.053,2.162,14.612,1.233e-05,1.18
+43017,RADFXSAT (FOX-1B) [+],2.333,44880,ETRSS-1 [+],2.086,2026-10-26 09:24:28.871,1.306,14.124,1.223e-06,0.651
+63990,SCS-01 J [+],2.115,66685,AE5RA [+],2.247,2026-10-26 09:25:16.408,3.081,0.186,4.651e-07,0.726
+55053,EOSSAT-1 [+],2.168,65615,STARLINK-35174 [+],2.692,2026-10-26 09:32:09.438,4.307,0.335,7.197e-06,1.015
+68472,FLYLAB1 [+],2.262,68483,LEMUR-2-CLARA [+],2.261,2026-10-26 09:53:36.735,2.107,0.065,9.944e-07,0.497
+58262,PLATERO [+],2.385,62879,STARLINK-11371 [+],2.16,2026-10-26 10:23:15.973,3.251,14.468,5.856e-06,1.653
+66743,NUSAT-47 (BEA. TINSLEY) [+],2.253,67274,OBJECT AC [+],2.118,2026-10-26 10:26:52.053,4.604,0.128,2.081e-07,1.086
+49962,SHIJIAN-6 05B (SJ-6 05B) [+],10.699,69100,OBJECT D [+],2.696,2026-10-26 10:34:12.165,3.573,11.814,2.346e-07,1.241
+55758,STARLINK-5072 [+],2.196,68631,STP-S29A OBJECT E [+],2.185,2026-10-26 10:41:37.957,2.719,2.17,1.789e-05,0.647
+63990,SCS-01 J [+],2.181,66685,AE5RA [+],2.312,2026-10-26 10:59:42.389,1.961,0.186,1.148e-06,0.462
+62650,FLOCK 4G-34 [P],2.258,64426,STARLINK-34432 [+],2.283,2026-10-26 11:04:05.778,3.35,15.142,4.183e-06,2.246
+53848,STARLINK-4780 [+],2.327,68203,OBJECT F [+],2.321,2026-10-26 11:12:19.010,3.689,7.064,8.82e-06,0.967
+57424,OBJECT A [+],2.243,57954,STARLINK-30703 [+],2.505,2026-10-26 11:37:28.416,3.534,5.882,9.96e-06,0.894
+56153,PIESAT-1 A [+],4.865,56156,PIESAT-1 D [+],4.799,2026-10-26 11:53:54.944,2.06,0.003,1.04e-06,0.486
+47916,STARLINK-2378 [P],2.196,49426,STARLINK-3114 [+],2.198,2026-10-26 12:08:13.696,0.642,0.772,0.001067,0.152
+49422,STARLINK-3161 [+],2.396,57203,UTMN 2 (RS27S) [+],2.324,2026-10-26 14:05:50.216,2.241,12.881,1.607e-05,0.874
+66682,ION SCV-022 [+],2.822,67483,ION SCV-021 [+],2.822,2026-10-26 14:11:12.574,4.05,0.041,2.692e-07,0.955
+58199,TIANHUI 5A [+],5.057,58201,TIANHUI 5B [+],4.99,2026-10-26 14:11:34.460,0.416,0.001,2.125e-05,0.118
+63231,M-SEL/CORTEZ [+],2.453,63837,STARLINK-34053 [+],2.382,2026-10-26 14:43:37.126,4.303,7.369,6.421e-06,1.139
+66055,OBJECT C [+],2.894,67111,STARLINK-35875 [+],2.496,2026-10-26 14:48:09.539,0.441,9.516,0.0005538,0.129
+59117,CONTECSAT-1 [+],2.214,64189,STARLINK-33872 [+],2.733,2026-10-26 14:55:11.129,4.586,5.848,5.922e-06,1.159
+68377,SUPERVIEW NEO-2 05 [+],4.727,68378,SUPERVIEW NEO-2 06 [+],4.793,2026-10-26 15:01:56.754,3.727,0.005,3.178e-07,0.878
+49962,SHIJIAN-6 05B (SJ-6 05B) [+],10.901,63352,LEMUR-2-ESPERANZA [+],2.76,2026-10-26 15:24:14.525,3.772,0.217,3.103e-07,0.889
+58199,TIANHUI 5A [+],5.124,58201,TIANHUI 5B [+],5.057,2026-10-26 15:48:05.045,0.417,0.001,2.125e-05,0.118
+53081,STARLINK-4326 [+],2.724,56748,OBJECT F [+],2.399,2026-10-26 16:08:01.617,4.448,3.331,6.604e-06,1.072
+61593,STARLINK-32397 [+],3.013,68632,RAWHIDE-2 [+],2.379,2026-10-26 16:39:11.916,4.173,3.62,7.474e-06,1.009
+43023,JILIN-1 05 [+],2.435,68069,STARLINK-36766 [+],2.618,2026-10-26 17:06:30.367,4.807,13.743,3.064e-06,2.137
+64052,TIANYI E [+],2.442,67297,SITRO-AIS-61 [+],2.571,2026-10-26 17:11:09.431,4.267,0.435,2.424e-07,1.006
+58502,OBJECT A [+],2.463,69484,STARLINK-37873 [+],3.117,2026-10-26 18:07:56.802,4.539,0.158,2.142e-07,1.07
+66771,GYEONGGISAT-1 [+],2.581,67272,OBJECT AA [+],2.836,2026-10-26 18:34:10.178,4.431,0.145,2.247e-07,1.045
+62648,LIME [+],2.558,68751,STARLINK-37277 [+],2.695,2026-10-26 18:39:02.181,3.767,14.214,4.51e-06,1.853
+60249,GAOFEN-11 05 [+],2.48,61898,OBJECT E [+],2.497,2026-10-26 18:50:16.453,4.666,1.288,6.115e-06,1.104
+60479,TOMORROW-S1 [+],2.59,69681,STARLINK-37992 [+],2.727,2026-10-26 18:59:00.594,3.249,13.459,6.996e-06,1.384
+60468,TRANSPORTER-11 OBJECT A [+],3.055,63448,STARLINK-33797 [+],2.587,2026-10-26 19:02:40.009,4.024,13.132,4.811e-06,1.626
+41785,ALSAT-1B [+],2.497,61936,HAIYANG-4 01 [+],2.495,2026-10-26 19:05:29.703,4.985,0.373,1.776e-07,1.175
+55061,SKYKRAFT-1C [+],2.56,56018,STARLINK-5945 [+],2.711,2026-10-26 19:16:36.996,3.354,14.309,5.541e-06,1.694
+62079,SUPERVIEW NEO-2 03 [+],5.149,62080,SUPERVIEW NEO-2 04 [+],4.951,2026-10-26 19:37:45.409,0.154,0.0,0.0003707,0.026
+61908,OBJECT Q [+],2.487,66764,NAHLA [+],2.684,2026-10-26 19:55:40.384,4.273,0.174,2.418e-07,1.007
+62673,LEO EXPRESS 2 [+],2.94,66749,PIAST-S1 [+],3.074,2026-10-26 20:22:40.624,1.662,0.048,1.598e-06,0.392
+53233,STARLINK-4372 [+],3.181,60470,PHISAT 2 [+],3.053,2026-10-26 20:26:31.469,3.703,3.186,9.549e-06,0.89
+45747,STARLINK-1506 [P],2.685,64740,STARLINK-34208 [+],2.688,2026-10-26 20:52:18.170,4.705,2.979,1.961e-05,1.128
+57196,HORS 2 [+],2.559,65602,STARLINK-35255 [+],2.756,2026-10-26 20:52:41.244,3.883,0.915,8.843e-06,0.917
+69884,YAM-17 [+],2.936,69928,LEMUR-2-ALYX [+],2.73,2026-10-26 21:10:34.303,4.932,0.311,1.814e-07,1.163
+43770,FOX-1CLIFF (AO-95) [+],2.732,67289,NASBSAT-1 [+],3.125,2026-10-26 21:20:43.476,4.787,1.848,1.914e-07,1.136
+68991,YAM-11 [+],2.736,69931,GRITSS [+],2.933,2026-10-26 21:20:48.026,3.602,0.458,3.401e-07,0.85
+55927,STARLINK-5919 [+],2.731,62377,KORSAT-2 [+],2.658,2026-10-26 21:29:54.965,4.266,4.101,7.094e-06,1.04
+53840,STARLINK-4766 [+],2.818,62637,FLOCK 4G-24 [P],2.752,2026-10-26 21:55:57.047,4.491,9.487,5.366e-06,1.306
+47804,STARLINK-2385 [P],2.651,60426,STARLINK-32226 [+],2.72,2026-10-26 22:50:31.324,3.715,1.485,3.185e-05,0.879
+56153,PIESAT-1 A [+],5.393,56156,PIESAT-1 D [+],5.327,2026-10-27 00:34:39.412,3.079,0.004,4.658e-07,0.726
+46914,KSM1-B [+],2.776,59333,STARLINK-31572 [+],2.905,2026-10-27 00:37:44.974,3.385,0.898,1.164e-05,0.799
+54811,STARLINK-5424 [+],2.987,67070,DEAR-5 [+],5.522,2026-10-27 00:45:30.844,3.822,3.342,8.945e-06,0.921
+56748,OBJECT F [+],2.778,64473,STARLINK-34492 [+],2.773,2026-10-27 01:13:58.440,4.813,6.273,5.315e-06,1.231
+60211,TIANHUI 5C [+],5.431,60212,TIANHUI 5D [+],5.431,2026-10-27 01:19:54.911,0.395,0.001,3.104e-05,0.092
+63833,HERMES-4 [+],3.411,67538,STARLINK-36397 [+],2.952,2026-10-27 02:01:19.763,0.503,1.107,0.0005265,0.119
+64811,STARLINK-34669 [+],2.862,69177,STRIX-7 [+],2.807,2026-10-27 02:08:35.953,3.739,6.276,8.8e-06,0.957
+46912,KSM1-A [+],2.791,56528,STARLINK-6337 [+],2.855,2026-10-27 02:31:48.983,2.046,2.054,3.164e-05,0.486
+66682,ION SCV-022 [+],3.356,67483,ION SCV-021 [+],3.356,2026-10-27 03:00:37.435,3.894,0.04,2.911e-07,0.918
+66723,FLOCK 4H-20 [P],2.941,66772,IHI-SAT2 [+],2.94,2026-10-27 03:14:09.624,4.537,0.03,2.143e-07,1.07
+60211,TIANHUI 5C [+],5.532,60212,TIANHUI 5D [+],5.532,2026-10-27 03:45:17.982,0.395,0.001,3.104e-05,0.092
+66732,FLOCK 4H-29 [+],3.01,66775,PHI 1 [+],3.204,2026-10-27 03:53:36.140,1.801,0.078,1.361e-06,0.424
+58199,TIANHUI 5A [+],5.643,58201,TIANHUI 5B [+],5.575,2026-10-27 04:14:14.113,0.509,0.001,2.125e-05,0.118
+32060,WORLDVIEW-1 (WV-1) [+],2.905,64550,BRO-18 [+],2.908,2026-10-27 04:22:34.153,1.899,0.485,1.223e-06,0.448
+46906,KSM1-C [+],2.894,63805,STARLINK-34029 [+],3.096,2026-10-27 04:48:45.324,2.694,1.677,1.83e-05,0.639
+53651,STARLINK-4388 [+],3.109,63835,HERMES-3 [+],2.976,2026-10-27 05:43:07.571,4.992,0.738,5.352e-06,1.178
+66748,UMBRA-11 [+],3.109,67534,STARLINK-36576 [+],3.322,2026-10-27 06:42:39.608,4.136,15.073,2.83e-06,2.689
+55053,EOSSAT-1 [+],3.061,65926,STARLINK-35492 [+],3.229,2026-10-27 06:57:29.695,4.393,14.668,2.932e-06,2.443
+59117,CONTECSAT-1 [+],2.885,59175,EXO-0 [+],3.336,2026-10-27 07:00:44.110,3.713,8.095,2.774e-07,1.01
+43024,JILIN-1 06 [+],3.008,52648,STARLINK-3854 [+],3.016,2026-10-27 07:02:21.863,4.131,13.386,4.409e-06,1.728
+58264,BRO-11 [+],3.028,60506,LUR-1 [+],3.348,2026-10-27 07:08:04.232,2.254,0.302,8.687e-07,0.531
+60493,NUSAT-50 (NANCY ROMAN) [+],3.132,67165,STARLINK-36186 [+],3.127,2026-10-27 07:23:17.151,1.599,9.471,4.232e-05,0.465
+63003,FOSSASAT-2E20 (TAT-O) [+],3.15,65673,STARLINK-35177 [+],3.475,2026-10-27 07:24:17.533,2.286,4.464,2.457e-05,0.56
+55353,STARLINK-5608 [+],3.848,62622,FLOCK 4G-9 [+],3.656,2026-10-27 07:51:51.099,3.873,8.817,7.459e-06,1.089
+58022,CSC-1 [+],3.094,61894,OBJECT A [+],3.024,2026-10-27 07:59:55.154,2.064,0.16,1.036e-06,0.487
+66696,IRIDE-MS1-EAGLET 2-2 [+],3.567,67277,OBJECT AF [+],4.613,2026-10-27 08:07:16.352,0.413,0.119,2.592e-05,0.097
+69889,ICEYE-X81 [+],3.064,69895,MIKROGLOB-1 (PIRX-1) [+],3.2,2026-10-27 08:23:06.741,3.19,0.007,4.265e-07,0.765
+57124,STARLINK-6146 [+],3.261,61872,PIESAT-2 D [+],3.07,2026-10-27 08:24:37.844,2.058,8.357,2.699e-05,0.567
+54165,STARLINK-5279 [+],3.278,68628,MISR-C-1 [+],3.036,2026-10-27 08:41:51.474,3.567,1.857,1.042e-05,0.846
+52744,GHGSAT-C5 [+],3.023,63445,STARLINK-33659 [+],3.345,2026-10-27 08:53:50.726,2.33,7.606,2.172e-05,0.622
+57176,SITRO-AIS 5 (KATYS) [+],3.086,60562,HYPERFIELD-1A [+],3.412,2026-10-27 09:22:45.477,3.532,1.878,3.514e-07,0.839
+61675,STARLINK-32294 [+],3.656,62392,TOMORROW-S3 [+],3.359,2026-10-27 10:14:12.106,4.201,11.424,5.36e-06,1.398
+64530,DUTHSAT-2 [+],3.267,67182,STARLINK-35782 [+],3.264,2026-10-27 10:36:56.825,2.167,7.478,2.521e-05,0.576
+61872,PIESAT-2 D [+],3.172,67986,STARLINK-36535 [+],3.337,2026-10-27 10:51:20.505,4.47,14.318,3.114e-06,2.261
+62383,LIZZIESAT-2 (LS-2) [+],3.386,68117,STARLINK-36844 [+],3.324,2026-10-27 11:01:21.143,2.448,7.35,1.986e-05,0.648
+52840,STARLINK-4049 [P],3.265,62462,STARLINK-11518 [+],3.519,2026-10-27 12:22:01.002,2.468,9.935,5.755e-05,0.733
+51873,STARLINK-3582 [P],3.208,57365,STARLINK-5007 [+],3.21,2026-10-27 12:29:31.309,1.601,1.595,0.0001713,0.379
+67286,MULE 4T [+],3.393,67300,TIANHUI 7 [+],3.328,2026-10-27 12:34:20.389,3.754,0.125,3.131e-07,0.885
+60506,LUR-1 [+],3.577,62641,FLOCK 4G-27 [+],3.315,2026-10-27 12:37:01.474,3.377,0.375,3.869e-07,0.797
+58199,TIANHUI 5A [+],5.995,58201,TIANHUI 5B [+],5.928,2026-10-27 12:41:50.466,0.449,0.001,2.125e-05,0.118
+44316,WT 1B [+],3.188,66641,STARLINK-35923 [+],3.234,2026-10-27 13:00:29.673,4.613,7.704,5.518e-06,1.237
+61241,OBJECT D [+],3.286,68841,STARLINK-37495 [+],3.281,2026-10-27 13:56:05.194,4.905,0.112,5.547e-06,1.157
+68424,SPACEVAN-002 [+],3.834,68507,CAMOES [+],3.505,2026-10-27 15:02:01.614,3.691,0.037,3.239e-07,0.871
+49390,YAOGAN-35 01A [+],3.516,63659,STARLINK-33771 [+],3.326,2026-10-27 15:22:21.512,3.529,1.865,3.521e-07,0.838
+68471,LEMUR-2-DELOITTE-3 [+],3.536,68502,ICEYE-X76 [+],3.806,2026-10-27 15:28:20.493,4.733,0.017,1.969e-07,1.116
+68424,SPACEVAN-002 [+],3.867,68507,CAMOES [+],3.538,2026-10-27 15:49:29.164,2.096,0.037,1.005e-06,0.494
+64090,OBJECT D [+],3.407,66711,FLOCK 4H-8 [+],3.403,2026-10-27 16:09:11.563,4.315,0.327,2.37e-07,1.017
+53199,STARLINK-4395 [+],3.964,68206,OBJECT J [+],3.584,2026-10-27 16:30:58.792,2.628,0.623,1.926e-05,0.622
+47126,STARLINK-1812 [P],3.587,67445,STARLINK-36542 [+],3.519,2026-10-27 16:46:24.686,0.863,2.502,0.0005849,0.206
+60485,TOMORROW-S2 [+],3.538,67561,STARLINK-36621 [+],3.605,2026-10-27 16:49:17.396,4.109,2.983,7.772e-06,0.985
+60506,LUR-1 [+],3.773,62641,FLOCK 4G-27 [+],3.511,2026-10-27 17:19:15.172,3.88,0.375,2.932e-07,0.915
+28737,SJ-7 [+],3.695,66745,AC1-002 [+],3.838,2026-10-27 17:55:00.527,4.797,4.79,1.832e-07,1.184
+63430,HULIANWANG JISHU SHIYAN 6C [+],3.47,69320,HULIANWANG JISHU SHIYAN 10A [+],5.839,2026-10-27 18:12:20.329,3.034,0.649,4.791e-07,0.716
+56801,STARLINK-6087 [+],4.014,64889,OBJECT P [+],3.477,2026-10-27 18:30:29.079,3.733,15.141,3.385e-06,2.491
+66691,TRANSPORTER-15 OBJECT AB [+],3.63,66728,FLOCK 4H-25 [+],3.632,2026-10-27 18:42:38.447,0.8,0.007,6.663e-06,0.195
+45625,GAOFEN-9 02 [+],3.536,66851,STARLINK-36094 [+],3.528,2026-10-27 18:56:57.853,2.62,7.122,1.746e-05,0.688
+66675,VEERY-0G [+],3.894,67288,OBJECT AS [+],4.087,2026-10-27 19:26:17.664,2.424,0.151,7.515e-07,0.571
+53346,TECMS [+],3.469,64538,IOD-2 [+],3.536,2026-10-27 19:29:12.939,2.86,6.284,4.969e-07,0.732
+57115,STARLINK-6085 [P],3.721,59361,STARLINK-31560 [+],3.516,2026-10-27 19:31:48.855,1.598,2.039,0.0001715,0.38
+56200,HAWK-7C [+],3.563,56306,STARLINK-30112 [+],3.669,2026-10-27 19:38:53.773,1.134,14.061,5.133e-05,0.541
+60496,TYCHE [+],3.623,67300,TIANHUI 7 [+],3.623,2026-10-27 19:39:35.657,2.406,0.233,7.626e-07,0.567
+60211,TIANHUI 5C [+],6.205,60212,TIANHUI 5D [+],6.205,2026-10-27 19:53:21.368,0.401,0.001,3.104e-05,0.092
+48606,TYVAK-0130 [+],3.649,56030,STARLINK-5781 [+],3.776,2026-10-27 20:17:22.575,3.527,4.49,1.031e-05,0.865
+62381,HAWK-11C [+],3.563,65369,STARLINK-34913 [+],3.77,2026-10-27 20:25:10.723,4.554,9.778,1.696e-07,1.347
+37166,ZHEDA PIXING 1B [+],3.606,68482,LEMUR-2-SEJONG-3 [+],4.069,2026-10-27 20:35:26.080,0.915,2.94,5.182e-06,0.219
+58199,TIANHUI 5A [+],6.329,58201,TIANHUI 5B [+],6.262,2026-10-27 20:43:22.610,0.472,0.001,2.125e-05,0.118
+60496,TYCHE [+],3.689,67300,TIANHUI 7 [+],3.689,2026-10-27 21:14:01.773,2.345,0.233,8.029e-07,0.553
+55047,NUSAT-33 (ALBANIA-2) [+],3.605,58125,STARLINK-30766 [+],3.875,2026-10-27 21:19:50.929,4.807,11.941,3.9e-06,1.679
+47486,CELESTIS-17 & SHERPA-FX1 [+],3.782,68748,STARLINK-37325 [+],3.885,2026-10-27 22:17:42.424,4.084,15.128,2.844e-06,2.71
+60995,STARLINK-11269 [+],3.73,62396,BANDWAGON-2 OBJECT V [+],3.733,2026-10-27 22:39:13.839,3.074,1.33,1.409e-05,0.727
+60496,TYCHE [+],3.755,67300,TIANHUI 7 [+],3.754,2026-10-27 22:48:27.888,2.758,0.233,5.803e-07,0.65
+39451,SWARM B [+],3.757,56508,STARLINK-5335 [+],3.751,2026-10-27 23:05:20.802,3.061,7.128,1.28e-05,0.804
+60211,TIANHUI 5C [+],6.339,60212,TIANHUI 5D [+],6.339,2026-10-27 23:06:57.647,0.403,0.001,3.104e-05,0.092
+55964,STARLINK-5895 [P],3.767,60536,LEMUR-2-MARHISYAM [+],3.769,2026-10-27 23:35:48.095,3.332,3.64,1.171e-05,0.806
+46232,GAOFEN-9 05 [+],3.724,62320,STARLINK-32481 [+],3.868,2026-10-27 23:35:54.534,1.773,14.535,1.88e-05,0.944
+58199,TIANHUI 5A [+],6.463,58201,TIANHUI 5B [+],6.396,2026-10-27 23:55:48.961,0.483,0.001,2.125e-05,0.118
+44520,KX-09 [+],3.677,61752,SITRO-AIS 14 [+],3.706,2026-10-28 00:26:46.919,3.247,15.007,1.49e-07,2.151
+68989,BUSANSAT [+],3.876,69884,YAM-17 [+],4.079,2026-10-28 00:36:52.797,2.094,0.212,1.007e-06,0.494
+64559,PADRE [+],3.77,64568,IRIDE-MS2-HEO-3 [+],3.772,2026-10-28 00:37:46.908,3.071,0.047,4.679e-07,0.724
+46232,GAOFEN-9 05 [+],3.768,67963,STARLINK-36357 [+],4.029,2026-10-28 00:38:46.653,4.496,3.795,6.421e-06,1.09
+60211,TIANHUI 5C [+],6.406,60212,TIANHUI 5D [+],6.406,2026-10-28 00:43:45.753,0.404,0.001,3.104e-05,0.092
+68441,HAWK-14C [+],3.875,68464,FGN-100-D3 [+],3.876,2026-10-28 00:49:52.823,2.174,0.004,9.132e-07,0.524
+53847,STARLINK-4777 [+],4.614,59810,OBJECT A [+],3.75,2026-10-28 01:03:17.991,2.776,7.916,1.508e-05,0.752
+68441,HAWK-14C [+],3.899,68464,FGN-100-D3 [+],3.9,2026-10-28 01:24:48.514,3.105,0.004,9.132e-07,0.524
+60211,TIANHUI 5C [+],6.44,60212,TIANHUI 5D [+],6.44,2026-10-28 01:32:58.697,0.393,0.001,3.104e-05,0.092
+62610,EDISON-1 [+],4.107,67845,STARLINK-36606 [+],4.043,2026-10-28 01:54:51.033,3.988,7.063,7.554e-06,1.045
+56957,ION SCV-011 [+],3.833,67516,STARLINK-36537 [+],4.359,2026-10-28 02:49:37.812,3.07,9.38,1.154e-05,0.889
+43160,JILIN-1 08 [+],3.863,67899,STARLINK-36878 [+],4.061,2026-10-28 03:29:28.854,4.03,10.164,6.402e-06,1.22
+66761,TRANSPORTER-15 OBJECT CZ [+],4.218,67286,MULE 4T [+],4.017,2026-10-28 03:31:58.405,0.874,0.111,5.777e-06,0.206
+59201,STARLINK-31603 [+],4.087,68370,RASSVET-3 11 [+],3.954,2026-10-28 03:51:14.062,2.0,8.959,2.778e-05,0.566
+62609,BUZZER-1 [+],3.993,62673,LEO EXPRESS 2 [+],4.255,2026-10-28 03:55:33.676,4.398,0.528,2.281e-07,1.037
+38257,YAOGAN-14 [+],3.876,59122,NUSAT-44 (MARIA MITCHELL) [+],3.94,2026-10-28 04:37:32.010,3.336,0.997,3.959e-07,0.788
+61781,ASRTU-1 (AO-123) [+],3.888,63219,TEVEL2-2 [+],4.018,2026-10-28 04:41:12.699,4.175,3.756,2.463e-07,1.012
+63223,DROID.002 [+],4.054,69021,HELIOS [+],4.521,2026-10-28 04:48:16.314,3.209,0.601,4.283e-07,0.757
+57402,TIANMU-1 10 [+],3.872,58264,BRO-11 [+],3.945,2026-10-28 05:08:18.353,3.056,3.628,4.607e-07,0.739
+67292,SITRO-AIS-64 [+],4.03,67917,STARLINK-36722 [+],3.891,2026-10-28 05:22:03.842,4.301,6.974,6.512e-06,1.124
+62665,JAY-D2 [+],3.991,66675,VEERY-0G [+],4.32,2026-10-28 05:41:02.253,2.98,0.609,4.969e-07,0.703
+46906,KSM1-C [+],3.936,57810,STARLINK-30394 [+],3.999,2026-10-28 05:49:23.305,3.783,3.784,9.073e-06,0.917
+62678,FLOCK 4G-15 [+],4.295,63003,FOSSASAT-2E20 (TAT-O) [+],4.096,2026-10-28 06:06:28.635,2.767,0.978,5.756e-07,0.653
+46912,KSM1-A [+],3.946,67179,STARLINK-35793 [+],4.518,2026-10-28 06:15:07.320,1.499,8.39,5.083e-05,0.413
+66774,GENA-OT [+],4.552,67295,ZORKIY-2M-5 [+],4.083,2026-10-28 06:44:06.523,3.877,0.16,2.936e-07,0.914
+56881,STARLINK-5853 [+],4.082,67289,NASBSAT-1 [+],4.519,2026-10-28 06:47:36.364,2.971,14.23,7.19e-06,1.473
+65127,GEESAT-4 09 [+],4.036,65948,KUIPER-00113 [+],3.96,2026-10-28 06:48:03.261,2.501,8.83,5.885e-07,0.707
+60463,YAOGAN-43 01F [+],4.048,69364,STARLINK-37309 [+],4.193,2026-10-28 08:30:57.906,4.453,5.1,6.391e-06,1.106
+53137,STARLINK-4145 [+],4.204,60513,FLOCK 4BE-27 [P],4.62,2026-10-28 09:26:30.440,1.812,14.659,1.726e-05,1.006
+66588,STARLINK-36076 [+],4.221,67297,SITRO-AIS-61 [+],4.256,2026-10-28 09:36:37.151,4.819,14.266,2.706e-06,2.414
+60211,TIANHUI 5C [+],6.777,60212,TIANHUI 5D [+],6.777,2026-10-28 09:37:21.513,0.392,0.001,3.104e-05,0.092
+47911,STARLINK-2371 [P],4.151,53823,STARLINK-4748 [+],4.153,2026-10-28 09:52:20.053,1.514,0.327,0.0001924,0.357
+66130,STARLINK-35637 [+],4.782,66669,SARI-2 [+],4.137,2026-10-28 10:03:05.073,4.019,6.252,7.627e-06,1.027
+66304,BANDWAGON-4 OBJECT M [+],4.507,69761,STARLINK-38069 [+],4.442,2026-10-28 10:03:52.011,4.056,7.482,7.2e-06,1.078
+66682,ION SCV-022 [+],4.659,67483,ION SCV-021 [+],4.658,2026-10-28 10:16:07.941,0.992,0.04,4.485e-06,0.234
+61676,STARLINK-32309 [+],4.256,66304,BANDWAGON-4 OBJECT M [+],4.519,2026-10-28 10:21:33.211,4.443,2.671,6.671e-06,1.062
+44311,BUFENG 1B [+],4.204,67412,STARLINK-36446 [+],4.144,2026-10-28 11:16:25.954,3.573,0.362,1.046e-05,0.842
+51757,STARLINK-3459 [+],4.312,63240,AL MUNTHER [+],4.323,2026-10-28 11:28:07.809,3.206,13.405,7.299e-06,1.345
+56191,HAWK-7A [+],4.226,57147,STARLINK-5765 [+],4.178,2026-10-28 11:34:19.493,4.099,14.104,3.885e-06,1.977
+56934,GEISAT PRECURSOR [+],4.259,66644,STARLINK-35938 [+],4.516,2026-10-28 12:19:35.289,3.838,8.069,7.862e-06,1.043
+43833,SAUDISAT 5B [+],4.196,49457,STARLINK-3132 [+],4.26,2026-10-28 12:21:27.890,4.894,13.553,3.053e-06,2.107
+49765,STARLINK-3227 [+],5.589,57182,MONITOR-4 (RS57S) [+],4.308,2026-10-28 12:52:44.308,4.256,14.208,3.521e-06,2.1
+43160,JILIN-1 08 [+],4.274,69960,STARLINK-37901 [+],4.488,2026-10-28 13:21:30.036,2.548,14.582,2.95e-07,1.385
+60211,TIANHUI 5C [+],6.944,60212,TIANHUI 5D [+],6.944,2026-10-28 13:38:09.273,0.416,0.001,3.104e-05,0.092
+63233,LIZZIESAT-3 (LS-3) [+],4.452,69010,DRISHTI [+],4.391,2026-10-28 13:56:08.899,4.363,0.776,2.317e-07,1.03
+66686,LEMUR-2-STAS-GORBUK [+],4.887,67278,OBJECT AG [+],4.416,2026-10-28 14:09:49.873,4.211,0.138,2.489e-07,0.993
+54838,STARLINK-5372 [+],4.36,58645,TIANMU-1 11 [+],4.296,2026-10-28 14:13:43.992,3.476,9.591,8.897e-06,1.018
+58199,TIANHUI 5A [+],7.064,58201,TIANHUI 5B [+],6.997,2026-10-28 14:21:45.800,0.555,0.001,2.125e-05,0.118
+45625,GAOFEN-9 02 [+],4.396,57870,STARLINK-30460 [+],4.979,2026-10-28 15:35:11.621,4.029,8.86,6.884e-06,1.135
+58321,PROTOMETHEE [+],4.4,60285,STARLINK-32122 [+],4.593,2026-10-28 15:53:28.797,1.462,6.707,5.687e-05,0.379
+43804,SUOMI-100 [+],4.533,52287,STARLINK-3822 [+],4.385,2026-10-28 15:56:32.019,4.263,13.22,4.247e-06,1.739
+60463,YAOGAN-43 01F [+],4.378,69455,STARLINK-37642 [+],4.455,2026-10-28 16:26:04.247,3.553,3.44,1.034e-05,0.857
+57388,STARLING 1 [+],4.47,67088,STARLINK-35882 [+],4.525,2026-10-28 17:34:21.704,1.505,14.786,2.334e-05,0.896
+60211,TIANHUI 5C [+],7.146,60212,TIANHUI 5D [+],7.146,2026-10-28 18:28:32.508,0.421,0.001,3.104e-05,0.092
+55110,ASTROCAST-0401 [+],5.01,56957,ION SCV-011 [+],4.498,2026-10-28 18:47:51.084,2.919,11.927,3.494e-07,1.021
+65126,GEESAT-4 08 [+],4.497,68926,KUIPER-00410 [+],4.646,2026-10-28 18:49:07.625,0.886,4.413,5.407e-06,0.217
+56200,HAWK-7C [+],4.542,63895,STARLINK-34119 [+],4.656,2026-10-28 19:08:27.170,0.75,12.675,0.0001475,0.285
+64449,STARLINK-34459 [+],4.497,64891,GEOSCAN 5 (RS92S5) [+],4.522,2026-10-28 19:31:40.449,2.62,14.71,8.16e-06,1.472
+41888,CYGFM08 [X],5.031,52112,STARLINK-3734 [P],4.569,2026-10-28 19:39:10.213,1.397,2.44,6.761e-05,0.333
+57175,CUBEBEL 2 (EU11S) [+],4.523,60562,HYPERFIELD-1A [+],4.849,2026-10-28 19:51:24.078,3.812,1.972,3.015e-07,0.905
+69872,TOM-1 [+],4.686,69911,TRANSPORTER-17 OBJECT AU [+],4.686,2026-10-28 19:54:43.473,3.946,0.006,2.803e-07,0.941
+60352,STRIX-4 [+],4.546,66125,STARLINK-35649 [+],5.247,2026-10-28 20:16:38.924,0.845,10.98,0.0001374,0.271
+56893,STARLINK-6216 [+],4.628,58646,TIANMU-1 12 [+],4.56,2026-10-28 20:24:20.639,0.812,12.546,0.0001277,0.304
+48657,STARLINK-2734 [+],4.613,69322,HULIANWANG JISHU SHIYAN 10C [+],4.789,2026-10-28 20:42:13.312,4.622,4.062,6.051e-06,1.126
+58199,TIANHUI 5A [+],7.333,58201,TIANHUI 5B [+],7.265,2026-10-28 20:48:03.303,0.606,0.001,2.125e-05,0.118
+46912,KSM1-A [+],4.555,66324,STARLINK-35506 [+],4.619,2026-10-28 20:51:33.628,1.222,1.833,8.886e-05,0.29
+47810,STARLINK-2391 [+],4.542,64554,TRANSPORTER-14 OBJECT AC [+],4.597,2026-10-28 21:00:26.982,4.719,14.725,2.496e-06,2.672
+52836,STARLINK-4043 [P],4.578,57935,STARLINK-30712 [+],4.577,2026-10-28 21:06:50.433,2.428,1.53,7.455e-05,0.575
+58043,STARLINK-30564 [+],4.708,68629,RAWHIDE-1 [+],5.134,2026-10-28 21:09:40.147,0.96,5.214,0.0001371,0.239
+46914,KSM1-B [+],4.641,56384,STARLINK-6153 [+],4.639,2026-10-28 21:23:34.040,4.614,0.878,6.262e-06,1.089
+47911,STARLINK-2371 [P],4.656,66019,STARLINK-35382 [+],5.145,2026-10-28 21:59:31.395,4.762,12.223,1.277e-05,1.711
+62430,RESURS-P 5 [+],4.652,68208,STARLINK-37009 [+],5.366,2026-10-28 22:02:17.260,4.46,6.394,6.167e-06,1.144
+69001,FOREST-19 (PATADASTRA) [+],4.775,69928,LEMUR-2-ALYX [+],4.776,2026-10-28 22:15:30.801,4.115,0.471,2.606e-07,0.97
+66651,OBJECT B [+],5.175,66661,SNUGLITE-III [+],4.704,2026-10-28 22:20:30.382,3.938,0.066,2.846e-07,0.928
+46914,KSM1-B [+],4.695,57375,STARLINK-6363 [+],4.621,2026-10-28 22:41:11.407,1.374,3.429,6.914e-05,0.331
+63986,SCS-01 E [+],4.75,64541,PULSAR-0 [+],4.754,2026-10-29 00:28:27.079,4.442,5.643,2.096e-07,1.117
+49390,YAOGAN-35 01A [+],4.903,63677,STARLINK-33816 [+],4.973,2026-10-29 00:40:07.996,2.701,1.141,6.035e-07,0.638
+48449,STARLINK-2655 [P],4.932,67854,STARLINK-36608 [+],4.867,2026-10-29 01:14:02.367,3.658,2.782,3.249e-05,0.875
+57335,STARLINK-6316 [+],4.78,68627,STP-S29A OBJECT A [+],4.787,2026-10-29 01:34:47.845,2.811,2.606,1.668e-05,0.671
+62430,RESURS-P 5 [+],4.815,68033,STARLINK-36947 [+],4.943,2026-10-29 01:56:02.022,4.838,3.103,5.6e-06,1.162
+49428,STARLINK-3121 [+],4.892,66689,AC1-003 [+],4.951,2026-10-29 02:26:24.717,3.965,12.96,5.063e-06,1.568
+62665,JAY-D2 [+],4.878,66697,IRIDE-MS1-EAGLET 2-3 [+],4.88,2026-10-29 02:58:12.613,1.096,0.585,3.673e-06,0.258
+47508,HAWK-2B [+],5.403,69957,STARLINK-37919 [+],5.051,2026-10-29 03:01:37.011,3.944,14.719,1.183e-07,2.23
+60211,TIANHUI 5C [+],7.517,60212,TIANHUI 5D [+],7.517,2026-10-29 03:23:02.437,0.388,0.001,3.104e-05,0.092
+52746,GHGSAT-C4 [+],4.91,58154,STARLINK-30797 [+],4.899,2026-10-29 04:09:28.996,4.635,13.174,3.618e-06,1.877
+58921,NEXSAT-1 [+],4.873,64151,STARLINK-34338 [+],5.073,2026-10-29 04:18:24.789,4.918,3.418,5.397e-06,1.186
+52364,STARLINK-3820 [+],4.88,61781,ASRTU-1 (AO-123) [+],4.875,2026-10-29 04:22:05.382,4.917,7.064,4.968e-06,1.288
+52845,STARLINK-4168 [+],5.084,62639,FLOCK 4G-3 [P],6.0,2026-10-29 04:34:42.309,2.071,6.443,2.855e-05,0.532
+64880,GEOSCAN 1 (RS92S1) [+],4.969,65207,STARLINK-34901 [+],5.165,2026-10-29 05:15:42.979,4.395,13.571,3.778e-06,1.895
+62669,JAY-D1 [+],4.977,66675,VEERY-0G [+],5.306,2026-10-29 05:20:16.324,2.386,0.757,7.743e-07,0.563
+64532,TRANSPORTER-14 OBJECT E [+],5.174,66448,STARLINK-35355 [+],5.17,2026-10-29 05:33:15.968,2.248,7.42,2.348e-05,0.596
+44941,STARLINK-1094 [P],4.947,59709,STARLINK-11088 [+],5.015,2026-10-29 05:59:34.042,3.296,1.914,4.035e-05,0.782
+27607,SAUDISAT 1C (SO-50) [+],5.487,65788,KUIPER-00176 [+],5.089,2026-10-29 07:01:52.317,1.484,2.437,1.98e-06,0.354
+55309,STARLINK-5315 [+],4.986,64530,DUTHSAT-2 [+],5.122,2026-10-29 07:08:27.679,3.932,9.465,7.006e-06,1.143
+47126,STARLINK-1812 [P],5.236,63914,STARLINK-34068 [+],5.238,2026-10-29 08:21:43.124,2.976,1.635,4.959e-05,0.705
+68981,IRIDE-MS2-HEO-7 [+],5.216,69874,CUBY-4 [+],5.352,2026-10-29 08:23:20.654,0.853,0.482,6.07e-06,0.201
+58629,STARLINK-31091 [+],5.179,64878,INNOSAT 16 (RS92S7) [+],5.054,2026-10-29 08:37:55.051,3.211,10.555,9.816e-06,0.999
+66392,STARLINK-35671 [+],5.151,68370,RASSVET-3 11 [+],5.155,2026-10-29 08:40:46.816,2.318,4.373,2.392e-05,0.567
+48096,STARLINK-2417 [P],5.128,65929,STARLINK-35175 [+],5.119,2026-10-29 08:51:34.649,3.142,0.018,4.469e-05,0.741
+60211,TIANHUI 5C [+],7.751,60212,TIANHUI 5D [+],7.751,2026-10-29 08:59:40.228,0.441,0.001,3.104e-05,0.092
+56874,LONGJIANG 3 [+],5.1,59019,STARLINK-31436 [+],5.233,2026-10-29 09:01:11.661,3.523,0.999,1.074e-05,0.832
+56022,STARLINK-5783 [+],5.271,66681,PHASMA-DIRAC [+],5.235,2026-10-29 09:07:36.582,2.119,13.968,1.497e-05,0.992
+61902,OBJECT J [+],5.073,68695,JILIN GAOFEN OBJECT E [+],5.091,2026-10-29 09:36:39.042,4.028,1.15,2.714e-07,0.952
+52273,STARLINK-3782 [+],5.127,66307,BANDWAGON-4 OBJECT Q [+],5.519,2026-10-29 09:41:32.065,3.435,1.2,1.129e-05,0.812
+53677,STARLINK-4579 [+],5.465,62430,RESURS-P 5 [+],5.142,2026-10-29 09:47:18.635,2.789,6.016,1.593e-05,0.708
+59167,STARLINK-31298 [+],5.158,67287,LUCA (RS90S) [+],5.282,2026-10-29 10:10:53.329,3.491,13.937,5.55e-06,1.625
+51464,STARLINK-3189 [+],5.445,58502,OBJECT A [+],5.19,2026-10-29 11:34:31.798,3.603,6.61,9.39e-06,0.93
+48406,STARLINK-2568 [P],5.317,64923,STARLINK-34643 [+],5.971,2026-10-29 11:38:54.613,4.168,0.95,2.536e-05,0.984
+61230,OBJECT D [+],5.203,62674,TRANSPORTER-12 OBJECT BT [+],5.337,2026-10-29 12:12:57.870,2.753,0.532,5.82e-07,0.649
+60486,FLOCK 4BE-36 [P],5.337,60519,FLOCK 4BE-28 [+],5.529,2026-10-29 12:25:20.809,4.809,0.245,1.908e-07,1.134
+58466,UHETSAT [+],5.202,65811,STARLINK-35224 [+],5.469,2026-10-29 12:38:49.859,3.816,14.619,3.913e-06,2.108
+61194,JILIN-01 KUANFU 02B 6 [+],5.223,67000,OBJECT H [+],5.554,2026-10-29 12:41:07.031,1.295,1.605,2.619e-06,0.307
+49071,TIANHUI 2-02A [+],5.624,63358,LEMUR-2-LANGER2SPACE [+],5.564,2026-10-29 12:46:49.831,4.238,3.449,2.401e-07,1.023
+61192,JILIN-01 KUANFU 02B 4 [+],5.256,69539,OBJECT B [+],5.255,2026-10-29 13:10:55.783,2.542,2.139,6.773e-07,0.604
+62633,FLOCK 4G-26 [+],5.406,67653,STARLINK-36694 [+],5.529,2026-10-29 13:43:36.526,4.694,6.458,5.556e-06,1.207
+59175,EXO-0 [+],5.642,60135,STARLINK-32043 [+],5.452,2026-10-29 14:20:23.688,3.165,9.981,1.049e-05,0.948
+60211,TIANHUI 5C [+],7.988,60212,TIANHUI 5D [+],7.988,2026-10-29 14:41:14.041,0.385,0.001,3.104e-05,0.092
+56898,STARLINK-6205 [+],5.427,68627,STP-S29A OBJECT A [+],5.339,2026-10-29 14:49:15.012,3.674,11.945,6.676e-06,1.284
+43831,SAUDISAT 5A [+],5.316,57180,MONITOR-3 (RS58S) [+],5.378,2026-10-29 15:14:38.276,1.687,0.736,1.55e-06,0.398
+58167,STARLINK-30811 [+],5.381,62688,BLUEBON [+],5.421,2026-10-29 15:15:07.489,2.546,14.75,8.494e-06,1.455
+62657,TRANSPORTER-12 OBJECT BA [+],5.442,62658,TROLL [+],5.698,2026-10-29 15:38:22.774,3.327,0.039,3.988e-07,0.785
+57188,HORS 1 [+],5.416,57192,SITRO-AIS 6 (CHIRKIN) [+],5.419,2026-10-29 16:37:01.871,3.746,0.093,3.145e-07,0.883
+48449,STARLINK-2655 [P],5.58,65218,STARLINK-34833 [+],5.651,2026-10-29 16:46:57.691,2.036,2.924,0.0001048,0.488
+53191,STARLINK-4369 [+],5.973,61901,OBJECT H [+],5.396,2026-10-29 16:56:57.310,1.373,1.808,7.041e-05,0.326
+60211,TIANHUI 5C [+],8.087,60212,TIANHUI 5D [+],8.087,2026-10-29 17:03:36.480,0.455,0.001,3.104e-05,0.092
+53925,STARLINK-5011 [+],5.465,56191,HAWK-7A [+],5.46,2026-10-29 17:10:16.245,4.07,14.423,3.648e-06,2.12
+57188,HORS 1 [+],5.449,57192,SITRO-AIS 6 (CHIRKIN) [+],5.451,2026-10-29 17:24:06.890,2.827,0.093,5.525e-07,0.666
+56846,OBJECT A [+],5.463,67297,SITRO-AIS-61 [+],5.585,2026-10-29 17:30:29.553,4.479,0.786,2.198e-07,1.057
+65124,GEESAT-4 06 [+],5.456,68582,KUIPER-00236 [+],5.473,2026-10-29 17:36:59.638,4.37,0.267,2.311e-07,1.03
+68995,ICEYE-X78 [+],5.616,69000,GEMINI-POLLUX [+],6.083,2026-10-29 17:42:10.160,4.307,0.008,2.295e-07,1.052
+56874,LONGJIANG 3 [+],5.489,65913,STARLINK-35472 [+],5.547,2026-10-29 18:21:58.735,4.884,7.494,4.964e-06,1.298
+36605,TANDEM-X [+],8.315,66778,FORESAIL-1 PRIME [+],5.614,2026-10-29 18:37:49.737,3.5,8.11,3.117e-07,0.954
+33053,FGRST (GLAST) [X],5.848,67447,STARLINK-36440 [+],5.585,2026-10-29 18:47:03.950,2.7,2.999,1.799e-05,0.648
+57258,STARLINK-5476 [+],5.777,59965,PREFIRE-1 [+],5.606,2026-10-29 19:22:44.965,4.697,8.153,5.229e-06,1.282
+56153,PIESAT-1 A [+],8.197,56155,PIESAT-1 C [+],8.197,2026-10-29 19:51:46.293,3.291,0.005,4.073e-07,0.777
+62668,JAY-C [+],5.585,69024,BALKAN-2 [+],5.689,2026-10-29 19:57:55.399,4.699,15.099,7.094e-08,3.121
+39410,YAOGAN-19 [+],5.539,48045,ONEWEB-0154 [+],5.549,2026-10-29 20:00:16.626,2.414,2.94,2.409e-06,0.58
+63235,OTP-2 [+],5.671,63985,SCS-01 D [+],5.574,2026-10-29 20:29:27.071,2.619,15.102,2.291e-07,1.734
+48356,STARLINK-2637 [P],5.618,51811,STARLINK-3569 [+],5.617,2026-10-29 20:35:45.456,4.239,0.25,2.457e-05,0.999
+57169,OBJECT D [+],5.578,58741,STARLINK-31148 [+],5.629,2026-10-29 21:20:42.389,1.976,7.61,3.019e-05,0.528
+43776,SPAWAR-CAL-R [+],5.828,59099,MUSAT-2 [+],5.75,2026-10-29 21:20:48.116,4.822,12.048,1.258e-07,1.715
+48097,STARLINK-2418 [P],6.072,58037,STARLINK-30533 [+],5.812,2026-10-29 21:28:26.562,2.618,1.437,6.415e-05,0.62
+53191,STARLINK-4369 [+],6.168,57196,HORS 2 [+],5.59,2026-10-29 21:38:03.174,4.965,0.598,5.414e-06,1.171
+67267,OBJECT V [+],5.719,67286,MULE 4T [+],5.786,2026-10-29 22:00:18.668,2.813,0.018,5.515e-07,0.671
+58020,NESS [+],5.724,67606,STARLINK-35843 [+],5.79,2026-10-29 22:07:08.304,4.786,3.423,5.697e-06,1.155
+48356,STARLINK-2637 [P],5.683,51811,STARLINK-3569 [+],5.682,2026-10-29 22:09:31.640,2.386,0.25,7.755e-05,0.562
+43159,JILIN-1 07 [+],5.638,69189,STARLINK-37440 [+],5.836,2026-10-29 22:42:14.057,4.22,6.71,6.824e-06,1.093
+55045,CONTINUUM-1 [+],5.723,67565,STARLINK-35725 [+],5.856,2026-10-30 00:05:26.848,4.845,0.489,5.685e-06,1.143
+62124,STARLINK-32608 [+],5.778,68635,CANVAS [+],5.699,2026-10-30 00:20:58.948,2.52,10.709,1.576e-05,0.792
+45602,XINGYUN-2 01 [+],5.76,50183,STARLINK-3281 [+],6.284,2026-10-30 00:21:05.413,3.255,6.117,1.166e-05,0.829
+41847,CAS-2T & KS-1Q [P],5.76,66760,TRANSPORTER-15 OBJECT CY [+],5.867,2026-10-30 00:29:18.748,1.621,0.395,1.601e-06,0.401
+68986,IRIDE-MS2-HEO-14 [+],6.423,69887,NAVIGATOR [+],6.02,2026-10-30 00:34:01.032,3.68,0.49,3.259e-07,0.868
+57115,STARLINK-6085 [P],5.949,57376,STARLINK-6367 [+],5.74,2026-10-30 01:00:38.211,3.652,3.94,3.209e-05,0.888
+62663,FLOCK 4G-5 [P],5.841,65338,STARLINK-34751 [+],5.81,2026-10-30 01:01:13.246,4.851,14.729,2.358e-06,2.751
+43159,JILIN-1 07 [+],5.736,52620,STARLINK-3975 [+],5.93,2026-10-30 01:02:37.988,3.02,6.64,1.336e-05,0.78
+59085,STARLINK-31290 [+],5.943,67269,OBJECT X [+],5.89,2026-10-30 01:47:03.386,4.613,7.974,5.458e-06,1.25
+54752,SHIYAN-21 (SY-21) [+],5.763,62137,STARLINK-32570 [+],5.841,2026-10-30 02:06:30.252,3.888,4.593,8.471e-06,0.956
+43099,SUPERVIEW-1 03 [+],5.786,57585,OBJECT F [+],5.76,2026-10-30 02:10:34.609,2.492,0.598,7.104e-07,0.588
+48686,STARLINK-2629 [+],6.396,62380,BANDWAGON-2 OBJECT D [+],6.024,2026-10-30 02:20:14.113,3.424,11.296,8.16e-06,1.126
+42907,COSMOS 2520 [+],5.888,43632,AZERSPACE 2 (IS-38) [+],5.888,2026-10-30 02:26:10.977,3.948,0.001,2.827e-07,0.932
+68989,BUSANSAT [+],5.955,69894,GRUS-3F [+],5.953,2026-10-30 02:30:24.586,2.996,0.5,4.914e-07,0.707
+47505,HAWK-2A [+],5.922,68723,STARLINK-37273 [+],6.505,2026-10-30 02:48:24.579,1.336,7.022,6.737e-05,0.35
+46906,KSM1-C [+],5.815,59041,STARLINK-31240 [+],6.047,2026-10-30 02:54:30.629,4.496,9.713,5.283e-06,1.325
+40039,PERSEUS-M1 [+],5.845,56451,STARLINK-5985 [+],6.168,2026-10-30 02:55:27.225,1.74,4.753,4.211e-05,0.429
+59123,LYNK TOWER 6 [+],6.481,68314,STARLINK-37155 [+],7.193,2026-10-30 02:57:00.205,1.134,1.981,0.000103,0.269
+65290,STARLINK-34984 [+],6.029,68629,RAWHIDE-1 [+],6.384,2026-10-30 03:09:42.292,2.628,6.069,1.793e-05,0.668
+66329,STARLINK-35505 [+],5.926,67286,MULE 4T [+],6.006,2026-10-30 03:16:17.147,4.911,8.62,4.684e-06,1.368
+69872,TOM-1 [+],5.994,69911,TRANSPORTER-17 OBJECT AU [+],5.994,2026-10-30 03:17:46.179,3.659,0.006,3.263e-07,0.872
+43784,SNUGLITE [+],6.025,57719,STARLINK-30334 [+],5.839,2026-10-30 03:27:59.449,4.06,13.007,4.819e-06,1.609
+44310,BUFENG 1A [+],5.904,57126,STARLINK-6167 [+],6.504,2026-10-30 04:06:30.283,3.69,0.266,9.806e-06,0.87
+62079,SUPERVIEW NEO-2 03 [+],8.513,62080,SUPERVIEW NEO-2 04 [+],8.315,2026-10-30 04:21:51.148,1.229,0.002,0.0003707,0.026
+45794,GAOFEN-9 03 [+],5.886,68399,STARLINK-37187 [+],6.411,2026-10-30 04:27:41.344,4.31,0.485,7.186e-06,1.016
+68989,BUSANSAT [+],6.055,69894,GRUS-3F [+],6.054,2026-10-30 04:55:18.929,1.557,0.501,1.821e-06,0.367
+64880,GEOSCAN 1 (RS92S1) [+],6.019,69650,STARLINK-37646 [+],6.216,2026-10-30 06:28:23.979,4.794,8.996,4.833e-06,1.359
+60211,TIANHUI 5C [+],8.661,60212,TIANHUI 5D [+],8.661,2026-10-30 06:50:07.463,0.38,0.001,3.104e-05,0.092
+43786,ITASAT [+],6.235,66680,LEMUR-2-DEANANDMAEVE [+],6.039,2026-10-30 07:23:00.162,4.059,2.9,2.636e-07,0.973
+53524,YAOGAN-35 04B [+],6.019,60446,STARLINK-32247 [+],6.091,2026-10-30 07:43:09.756,4.943,4.723,5.229e-06,1.218
+41888,CYGFM08 [X],6.552,60730,STARLINK-11255 [+],6.235,2026-10-30 08:08:32.183,2.204,2.9,2.705e-05,0.528
+44314,TIANQI-3 [+],6.068,60490,FLOCK 4BE-23 [+],6.141,2026-10-30 08:10:33.123,0.693,10.603,6.948e-06,0.216
+49402,KOSEN-1 [+],6.313,63865,STARLINK-33897 [+],6.759,2026-10-30 08:44:48.502,3.669,3.943,9.62e-06,0.892
+62079,SUPERVIEW NEO-2 03 [+],8.71,62080,SUPERVIEW NEO-2 04 [+],8.513,2026-10-30 09:06:10.260,1.341,0.002,0.0003707,0.026
+53795,STARLINK-4742 [+],6.389,59128,TRANSPORTER-10 OBJECT AG [+],6.758,2026-10-30 09:44:02.496,4.531,14.64,2.769e-06,2.509
+59121,LYNK TOWER 5 [+],6.288,68390,STARLINK-37193 [+],6.086,2026-10-30 09:45:03.021,2.902,0.382,1.585e-05,0.684
+50816,STARLINK-3342 [+],6.213,55978,COSMOS 2567 [+],6.14,2026-10-30 09:50:37.050,3.71,8.19,8.359e-06,1.015
+65057,STARLINK-34745 [+],6.475,66670,HUNITY [+],6.279,2026-10-30 10:22:15.856,4.761,0.403,5.888e-06,1.123
+44785,KL-ALPHA A [+],6.215,61564,QIANFAN-31 [+],6.135,2026-10-30 11:08:13.951,2.821,14.462,2.047e-07,1.802
+57747,STARLINK-30307 [+],6.13,64199,SHIJIAN-26 (SJ-26) [+],6.144,2026-10-30 11:17:20.730,2.261,11.546,1.827e-05,0.762
+42844,NANOACE [+],6.255,57746,STARLINK-30350 [+],6.15,2026-10-30 11:30:23.437,4.163,14.279,3.621e-06,2.088
+62628,ION SCV-016 [+],6.477,69565,STARLINK-37916 [+],6.477,2026-10-30 12:25:56.437,4.764,0.604,5.752e-06,1.149
+51873,STARLINK-3582 [P],6.22,67457,STARLINK-36529 [+],6.293,2026-10-30 12:46:45.867,2.721,4.772,5.695e-05,0.671
+53692,STARLINK-4572 [P],6.386,66219,STARLINK-35737 [+],6.248,2026-10-30 13:10:01.323,4.807,6.198,1.765e-05,1.226
+52787,GEESAT-1 03 [+],6.29,64837,KUIPER-00092 [+],6.362,2026-10-30 13:15:26.077,2.155,3.636,9.254e-07,0.522
+58758,YUNYAO-1 18 [+],6.216,63984,SCS-01 C [+],6.284,2026-10-30 13:19:46.965,4.332,14.554,1.023e-07,2.344
+53707,STARLINK-4667 [+],6.255,64554,TRANSPORTER-14 OBJECT AC [+],6.286,2026-10-30 13:32:31.967,2.391,14.747,9.673e-06,1.361
+49151,STARLINK-3102 [+],6.43,57191,POLYTECH-UNIVERSE 3 (RS46S) [+],6.411,2026-10-30 16:19:37.703,3.291,4.446,1.185e-05,0.807
+43804,SUOMI-100 [+],6.551,65531,STARLINK-35064 [+],6.933,2026-10-30 16:23:47.789,4.497,0.757,6.595e-06,1.061
+66700,IRIDE-MS1-EAGLET 2-6 [+],6.753,66712,FLOCK 4H-9 [P],6.756,2026-10-30 16:34:08.210,3.305,0.04,4.041e-07,0.78
+56153,PIESAT-1 A [+],9.07,56155,PIESAT-1 C [+],9.07,2026-10-30 16:48:44.198,1.841,0.002,1.288e-06,0.507
+41603,LAPAN-A3 [+],6.446,65452,STARLINK-35084 [+],6.701,2026-10-30 17:02:26.231,4.186,14.331,3.526e-06,2.132
+56153,PIESAT-1 A [+],9.102,56155,PIESAT-1 C [+],9.102,2026-10-30 17:35:11.991,1.907,0.002,1.288e-06,0.507
+61894,OBJECT A [+],6.463,66753,ICEYE-X60 [+],6.609,2026-10-30 18:32:20.069,1.495,0.298,1.974e-06,0.353
+63489,HERMES-6 [+],6.596,66722,FLOCK 4H-19 [+],6.837,2026-10-30 18:45:10.151,3.179,15.101,1.55e-07,2.112
+55983,GLOBAL-5 [+],6.698,69515,STARLINK-37232 [+],6.666,2026-10-30 18:47:36.189,4.893,7.979,4.854e-06,1.325
+44499,GLOBAL-4 [+],6.663,45419,STARLINK-1308 [P],6.557,2026-10-30 19:22:11.688,3.651,8.37,8.609e-06,1.001
+48096,STARLINK-2417 [P],6.594,59258,STARLINK-31637 [+],6.725,2026-10-30 20:02:31.170,2.924,1.504,5.139e-05,0.692
+44310,BUFENG 1A [+],6.579,69342,STARLINK-37782 [+],6.518,2026-10-30 20:18:32.920,3.719,9.385,7.863e-06,1.076
+52453,STARLINK-3872 [+],6.633,62659,FLOCK 4G-4 [P],6.892,2026-10-30 20:36:29.493,4.873,8.53,4.778e-06,1.352
+47916,STARLINK-2378 [P],6.554,66198,STARLINK-35518 [+],6.562,2026-10-30 20:44:50.269,4.77,0.978,1.937e-05,1.126
+53190,STARLINK-4332 [+],6.802,62610,EDISON-1 [+],6.929,2026-10-30 21:38:28.185,4.231,3.581,7.275e-06,1.023
+54750,YAOGAN-36 04C [+],7.098,64458,STARLINK-34439 [+],6.715,2026-10-30 21:47:57.737,4.229,4.106,7.222e-06,1.031
+58199,TIANHUI 5A [+],9.416,58201,TIANHUI 5B [+],9.349,2026-10-30 22:47:42.868,1.371,0.002,2.125e-05,0.118
+69912,MARMOTSAT [+],6.761,69917,BOHR [+],7.289,2026-10-30 23:06:37.068,4.316,0.044,2.37e-07,1.017
+53827,STARLINK-4764 [+],6.82,59175,EXO-0 [+],7.009,2026-10-30 23:09:20.639,3.315,9.947,9.581e-06,0.991
+60465,YAOGAN-43 01H [+],7.257,64884,OBJECT J [+],6.69,2026-10-30 23:25:56.903,0.43,11.955,1.612e-05,0.15
+42837,LEMUR-2-GREENBERG [+],6.732,67609,STARLINK-36312 [+],6.865,2026-10-30 23:31:37.161,4.747,12.949,3.558e-06,1.864
+57897,STARLINK-30474 [+],6.785,57924,STARLINK-30487 [P],6.783,2026-10-30 23:36:10.527,3.801,1.319,3.045e-05,0.899
+68477,UNICORN-2R [+],7.086,68505,GEMS2-AMETHYST [+],6.825,2026-10-30 23:50:06.751,3.631,0.007,3.32e-07,0.864
+33321,HUANJING 1B (HJ-1B) [+],6.695,68472,FLYLAB1 [+],6.853,2026-10-31 00:04:10.963,3.099,3.531,4.484e-07,0.749
+43711,SHIYAN-6 01 (SY-6 01) [+],6.699,57247,STARLINK-5039 [+],6.998,2026-10-31 00:20:09.509,1.817,14.327,1.876e-05,0.923
+68986,IRIDE-MS2-HEO-14 [+],7.429,69917,BOHR [+],7.356,2026-10-31 00:43:00.388,2.903,0.513,5.237e-07,0.685
+62627,RAY 1.0 [+],6.758,66690,TRANSPORTER-15 OBJECT AA [+],6.896,2026-10-31 01:08:12.885,0.749,0.654,7.857e-06,0.177
+39019,PLEIADES 1B [+],6.744,52257,DAQI-1 [+],6.809,2026-10-31 01:38:55.431,4.014,13.826,1.359e-07,1.907
+46034,STARLINK-1557 [+],6.759,56204,GHGSAT-C6 [+],6.791,2026-10-31 02:12:31.571,2.397,12.322,1.516e-05,0.866
+43023,JILIN-1 05 [+],6.816,66888,STARLINK-35919 [+],6.816,2026-10-31 02:15:42.078,3.453,7.841,9.799e-06,0.93
+66680,LEMUR-2-DEANANDMAEVE [+],6.828,66719,FLOCK 4H-16 [+],6.956,2026-10-31 02:19:45.044,2.137,0.058,9.67e-07,0.504
+52273,STARLINK-3782 [+],6.825,66307,BANDWAGON-4 OBJECT Q [+],7.217,2026-10-31 02:25:46.419,1.144,1.275,0.0001017,0.27
+46907,KSM1-D [+],6.837,64078,STARLINK-34190 [+],6.899,2026-10-31 03:09:02.288,3.24,0.823,1.27e-05,0.765
+57170,OBJECT E [+],6.824,67345,STARLINK-35676 [+],6.871,2026-10-31 03:15:07.225,4.285,7.653,6.409e-06,1.146
+53634,STARLINK-4592 [+],6.946,64881,239ALFEROV (RS61S) [+],6.878,2026-10-31 03:22:08.459,1.674,7.639,4.2e-05,0.448
+58199,TIANHUI 5A [+],9.617,58201,TIANHUI 5B [+],9.55,2026-10-31 03:38:05.582,1.468,0.002,2.125e-05,0.118
+53943,YAOGAN-36 01A [+],7.02,63199,STARLINK-32931 [+],6.941,2026-10-31 03:56:28.635,4.806,4.027,5.599e-06,1.17
+57217,KUZGTU 1 (RS47S) [+],6.97,65251,STARLINK-34989 [+],7.16,2026-10-31 04:55:12.408,0.92,3.561,0.0001539,0.222
+57924,STARLINK-30487 [P],7.014,66558,STARLINK-35695 [+],6.946,2026-10-31 05:08:55.065,0.693,1.687,0.0009128,0.164
+44316,WT 1B [+],6.877,62894,STARLINK-32909 [+],7.01,2026-10-31 05:31:57.900,2.36,3.497,2.34e-05,0.57
+39269,POPACS 2 [+],7.734,41786,ALSAT-2B [+],6.98,2026-10-31 05:37:04.069,4.397,3.024,2.241e-07,1.056
+62079,SUPERVIEW NEO-2 03 [+],9.566,62080,SUPERVIEW NEO-2 04 [+],9.368,2026-10-31 05:38:08.048,1.864,0.002,0.0003707,0.026
+28220,SHIYAN-1 (SY-1) [+],7.014,60469,WARATAH SEED-1 [+],7.07,2026-10-31 05:54:13.539,1.468,0.826,2.047e-06,0.346
+60485,TOMORROW-S2 [+],7.084,68345,STARLINK-37214 [+],7.078,2026-10-31 05:55:18.959,3.839,8.903,7.565e-06,1.084
+66716,FLOCK 4H-13 [P],6.99,66741,BLACK KITE-1 [+],7.12,2026-10-31 06:30:53.636,4.698,0.009,1.967e-07,1.126
+53692,STARLINK-4572 [P],7.115,58047,STARLINK-30529 [+],7.175,2026-10-31 06:38:34.643,2.927,7.78,4.519e-05,0.787
+64895,OBJECT V [+],7.072,68105,STARLINK-37021 [+],7.128,2026-10-31 07:02:16.024,4.852,1.447,5.649e-06,1.148
+61635,STARLINK-32370 [+],6.99,64558,QUICK3 [+],7.23,2026-10-31 07:04:14.902,0.763,14.141,0.000111,0.371
+59103,ICEYE-X36 [+],7.084,68794,KAKUSHIN RISING OBJECT C [+],7.15,2026-10-31 07:25:13.527,3.655,0.718,3.301e-07,0.863
+64335,STARLINK-33855 [+],7.031,64531,TRANSPORTER-14 OBJECT D [+],7.002,2026-10-31 07:41:34.099,3.57,14.309,4.883e-06,1.805
+48096,STARLINK-2417 [P],7.081,52694,STARLINK-4072 [+],7.144,2026-10-31 07:44:11.775,3.51,0.501,3.582e-05,0.828
+55047,NUSAT-33 (ALBANIA-2) [+],7.071,59739,STARLINK-31726 [+],7.205,2026-10-31 08:30:56.285,3.62,10.037,7.99e-06,1.088
+68981,IRIDE-MS2-HEO-7 [+],7.229,69940,LEMUR-2-ELEONORE [+],7.692,2026-10-31 08:41:30.279,4.45,0.53,2.228e-07,1.049
+45367,STARLINK-1273 [P],7.153,63193,STARLINK-11635 [+],7.104,2026-10-31 08:54:07.374,2.818,9.255,4.58e-05,0.806
+67961,STARLINK-36912 [+],7.396,68630,STPSAT-7 [+],7.097,2026-10-31 09:38:39.378,3.467,8.846,9.312e-06,0.975
+47502,HAWK-2C [+],7.214,69650,STARLINK-37646 [+],7.356,2026-10-31 09:49:53.293,4.01,0.129,8.303e-06,0.945
+48096,STARLINK-2417 [P],7.173,60344,STARLINK-32077 [+],7.252,2026-10-31 09:57:11.933,2.743,8.611,4.969e-05,0.763
+50993,ION SCV-004 [+],7.17,65593,STARLINK-35269 [+],7.291,2026-10-31 10:10:17.356,3.532,0.909,1.068e-05,0.834
+58006,STARLINK-30526 [P],7.307,67041,STARLINK-35765 [+],7.306,2026-10-31 10:10:40.713,4.107,0.302,2.617e-05,0.968
+62079,SUPERVIEW NEO-2 03 [+],9.763,62080,SUPERVIEW NEO-2 04 [+],9.566,2026-10-31 10:22:25.166,1.994,0.002,0.0003707,0.026
+56153,PIESAT-1 A [+],9.814,56155,PIESAT-1 C [+],9.814,2026-10-31 10:40:39.796,3.388,0.005,3.845e-07,0.799
+68428,OUT OF THE BOX (OOTB) [+],7.655,68450,IRIDE-MS1-EAGLET 2-13 [+],7.321,2026-10-31 10:49:52.221,4.705,0.01,1.981e-07,1.116
+60211,TIANHUI 5C [+],9.834,60212,TIANHUI 5D [+],9.834,2026-10-31 10:59:46.178,0.557,0.001,3.104e-05,0.092
+55034,LYNK TOWER 4 [+],7.732,65394,STARLINK-35058 [+],7.366,2026-10-31 11:10:14.238,4.391,15.035,2.549e-06,2.813
+48298,STARLINK-2559 [P],7.349,48574,STARLINK-2225 [+],7.143,2026-10-31 11:25:22.054,1.969,3.614,0.0001109,0.476
+56153,PIESAT-1 A [+],9.88,56155,PIESAT-1 C [+],9.88,2026-10-31 12:15:35.252,3.982,0.006,2.784e-07,0.939
+40024,NANOSATC-BR1 [+],7.452,66009,STARLINK-35276 [+],7.311,2026-10-31 13:02:02.668,4.052,11.682,5.637e-06,1.378
+56345,STARLINK-5979 [+],7.325,64895,OBJECT V [+],7.333,2026-10-31 13:18:21.620,1.488,3.132,5.917e-05,0.357
+48097,STARLINK-2418 [P],7.737,53629,STARLINK-4602 [+],7.271,2026-10-31 13:26:56.448,2.275,9.44,6.925e-05,0.66
+60211,TIANHUI 5C [+],9.939,60212,TIANHUI 5D [+],9.939,2026-10-31 13:31:08.837,0.37,0.001,3.104e-05,0.092
+58006,STARLINK-30526 [P],7.471,67041,STARLINK-35765 [+],7.47,2026-10-31 14:06:03.097,3.674,0.302,3.27e-05,0.866
+55045,CONTINUUM-1 [+],7.333,60269,STARLINK-32144 [+],7.53,2026-10-31 14:42:27.940,2.214,6.625,2.486e-05,0.572
+48441,STARLINK-2702 [+],7.287,48449,STARLINK-2655 [P],7.502,2026-10-31 14:53:35.074,2.855,0.047,5.414e-05,0.673
+58199,TIANHUI 5A [+],10.088,58201,TIANHUI 5B [+],10.021,2026-10-31 14:55:39.390,1.707,0.002,2.125e-05,0.118
+60211,TIANHUI 5C [+],10.006,60212,TIANHUI 5D [+],10.006,2026-10-31 15:08:02.861,0.369,0.001,3.104e-05,0.092
+53797,STARLINK-4723 [+],7.586,61895,OBJECT B [+],7.385,2026-10-31 15:48:27.000,4.213,12.399,4.837e-06,1.544
+54043,YAOGAN-36 02B [+],7.363,64102,STARLINK-34104 [+],8.084,2026-10-31 16:06:40.022,2.238,4.844,2.544e-05,0.553
+52106,STARLINK-3670 [+],7.429,58661,TIANMU-1 20 [+],7.364,2026-10-31 16:18:14.303,4.721,6.327,5.513e-06,1.209
+41556,ZIYUAN 3-02 (ZY 3-02) [+],7.416,64903,CO3D 1 [+],7.487,2026-10-31 17:16:45.970,4.611,0.471,2.076e-07,1.087
+66301,ICEYE-X66 [+],7.697,67751,OBJECT F [+],7.431,2026-10-31 17:34:34.063,2.893,9.478,4.266e-07,0.844
+52858,STARLINK-4198 [+],7.652,66668,SARI-1 [+],7.59,2026-10-31 17:34:44.781,4.674,5.801,5.708e-06,1.18
+43784,SNUGLITE [+],7.624,62843,STARLINK-32797 [+],7.515,2026-10-31 17:49:47.976,4.814,14.211,2.751e-06,2.377
+52746,GHGSAT-C4 [+],7.484,64742,STARLINK-34607 [+],7.607,2026-10-31 17:56:03.657,3.639,9.545,8.145e-06,1.062
+56934,GEISAT PRECURSOR [+],7.495,60597,STARLINK-32162 [+],7.647,2026-10-31 18:00:20.918,0.438,14.622,0.0003001,0.24
+62623,OTTER [+],7.527,65614,STARLINK-35206 [+],7.585,2026-10-31 18:08:04.708,4.66,2.619,6.07e-06,1.113
+67277,OBJECT AF [+],9.044,67293,SCORPION (RS89S) [+],7.996,2026-10-31 18:28:12.181,4.289,0.034,2.385e-07,1.017
+58555,HONGHU 2 [+],7.475,68769,STARLINK-36379 [+],8.108,2026-10-31 18:34:24.552,2.972,5.868,1.41e-05,0.751
+53479,STARLINK-4436 [+],8.011,57004,OBJECT A [+],7.488,2026-10-31 18:56:57.215,4.465,0.701,6.693e-06,1.054
+63990,SCS-01 J [+],7.571,66469,STARLINK-35451 [+],7.742,2026-10-31 20:20:57.269,2.644,7.41,5.614e-07,0.701
+62637,FLOCK 4G-24 [P],7.723,67562,STARLINK-36398 [+],7.78,2026-10-31 21:13:58.531,4.504,3.122,6.459e-06,1.082
+53943,YAOGAN-36 01A [+],7.745,58139,STARLINK-30775 [+],7.854,2026-10-31 21:20:48.240,3.665,7.136,8.924e-06,0.962
+58199,TIANHUI 5A [+],10.357,58201,TIANHUI 5B [+],10.29,2026-10-31 21:22:50.464,1.85,0.002,2.125e-05,0.118
+53807,BLUEWALKER-3 [P],7.619,54372,YAOGAN-36 03A [+],7.674,2026-10-31 21:38:59.012,4.795,5.281,1.815e-07,1.195
+47231,GAOFEN-14 01 [+],7.614,59239,STARLINK-31303 [+],7.672,2026-10-31 21:45:26.595,4.615,13.572,3.413e-06,1.999
+58885,STARLINK-31318 [+],8.102,62382,HAWK-11A [+],7.646,2026-10-31 22:25:56.535,3.675,4.58,9.482e-06,0.903
+45794,GAOFEN-9 03 [+],7.639,68699,STARLINK-37358 [+],8.35,2026-10-31 22:31:35.399,3.0,9.656,1.192e-05,0.881
+60349,STARLINK-32181 [+],7.838,66305,BANDWAGON-4 OBJECT N [+],8.102,2026-10-31 23:41:39.166,4.379,3.833,6.767e-06,1.062
+53969,STARLINK-4468 [+],7.682,58276,GENMAT-1 [+],7.787,2026-10-31 23:43:47.963,4.479,14.452,2.992e-06,2.349
+43768,AISTECHSAT 2 [+],7.934,61894,OBJECT A [+],7.686,2026-10-31 23:54:04.859,2.314,2.76,8.123e-07,0.554
+59098,HORACIO [+],7.661,66782,LEMUR-2-FINNIAN [+],7.847,2026-11-01 00:02:38.841,1.42,8.185,1.884e-06,0.389
+61781,ASRTU-1 (AO-123) [+],7.696,61787,OBJECT BE [+],7.691,2026-11-01 00:04:25.096,3.89,0.068,2.916e-07,0.917
+52836,STARLINK-4043 [P],7.706,66121,STARLINK-35631 [+],7.961,2026-11-01 00:11:00.075,2.929,0.393,5.143e-05,0.691
+67676,COSMOS 2602 [+],8.635,67679,COSMOS 2605 [+],7.91,2026-11-01 00:23:41.450,3.223,0.315,4.248e-07,0.76
+66704,FLOCK 4H-1 [P],7.899,66788,FOSSASA-2E23 [+],8.292,2026-11-01 01:23:44.949,2.485,0.051,7.145e-07,0.586
+58199,TIANHUI 5A [+],10.559,58201,TIANHUI 5B [+],10.491,2026-11-01 02:13:13.873,1.961,0.003,2.125e-05,0.118
+32791,SEEDS II (CO-66) [+],8.144,52673,STARLINK-3976 [+],8.096,2026-11-01 02:37:53.279,4.765,14.535,2.603e-06,2.538
+66651,OBJECT B [+],8.39,69911,TRANSPORTER-17 OBJECT AU [+],8.003,2026-11-01 03:30:58.835,1.393,3.736,2.212e-06,0.338
+62079,SUPERVIEW NEO-2 03 [+],10.487,62080,SUPERVIEW NEO-2 04 [+],10.29,2026-11-01 03:44:46.169,2.497,0.003,0.0003707,0.026
+53819,STARLINK-4738 [+],8.037,62383,LIZZIESAT-2 (LS-2) [+],8.104,2026-11-01 04:15:14.543,2.654,4.246,1.83e-05,0.648
+43160,JILIN-1 08 [+],7.903,69489,STARLINK-37831 [+],7.845,2026-11-01 04:26:39.706,4.672,0.623,2.021e-07,1.102
+55045,CONTINUUM-1 [+],7.909,65529,STARLINK-35077 [+],8.042,2026-11-01 04:31:52.602,4.861,0.528,5.649e-06,1.146
+62641,FLOCK 4G-27 [+],7.986,62688,BLUEBON [+],7.982,2026-11-01 04:43:05.628,3.154,0.27,4.438e-07,0.743
+59131,MESON-1 [+],8.505,67712,STARLINK-36705 [+],8.432,2026-11-01 05:04:38.568,4.516,4.159,6.328e-06,1.102
+66704,FLOCK 4H-1 [P],8.064,66788,FOSSASA-2E23 [+],8.456,2026-11-01 05:20:05.025,2.513,0.051,6.991e-07,0.592
+58199,TIANHUI 5A [+],10.693,58201,TIANHUI 5B [+],10.626,2026-11-01 05:26:49.561,2.036,0.003,2.125e-05,0.118
+60750,OBJECT F [+],7.917,66873,STARLINK-36128 [+],7.976,2026-11-01 05:44:13.930,1.43,7.003,5.889e-05,0.374
diff --git a/docs/validation/socrates_2026-10-25.tle b/docs/validation/socrates_2026-10-25.tle
new file mode 100644
index 00000000..7612caba
--- /dev/null
+++ b/docs/validation/socrates_2026-10-25.tle
@@ -0,0 +1,2196 @@
+SAUDISAT 1C (SO-50)
+1 27607U 02058C 26296.80597314 .00001114 00000+0 14853-3 0 9999
+2 27607 64.5513 90.9705 0069545 238.6763 120.7524 14.83280565283536
+SHIYAN-1 (SY-1)
+1 28220U 04012A 26297.23182373 .00013560 00000+0 37808-3 0 9999
+2 28220 97.8628 23.9235 0003997 282.8434 77.2362 15.36895478230894
+SJ-7
+1 28737U 05024A 26297.05161191 .00006868 00000+0 29328-3 0 9992
+2 28737 97.7177 330.7014 0013632 307.1228 52.8761 15.23142803167634
+WORLDVIEW-1 (WV-1)
+1 32060U 07041A 26297.27705908 .00005209 00000+0 21670-3 0 9991
+2 32060 97.3861 55.1673 0002368 287.9331 72.1648 15.24197582 62545
+SEEDS II (CO-66)
+1 32791U 08021J 26296.96600562 .00018344 00000+0 51039-3 0 9992
+2 32791 97.7561 301.4630 0002328 155.8079 204.3274 15.36890039 7032
+FGRST (GLAST)
+1 33053U 08029A 26296.93429965 .00002968 00000+0 10377-3 0 9990
+2 33053 25.5827 30.1225 0008363 49.6021 310.5247 15.24532985 15350
+HUANJING 1B (HJ-1B)
+1 33321U 08041B 26297.30832177 .00000948 00000+0 12010-3 0 9999
+2 33321 97.6664 281.0487 0037403 118.1856 242.3145 14.83514263977550
+TANDEM-X
+1 36605U 10030A 26294.46125564 -.00000013 00000+0 25661-5 0 9999
+2 36605 97.4461 300.3779 0001967 87.2644 272.8815 15.19145437905812
+ZHEDA PIXING 1B
+1 37166U 10047B 26297.25202447 .00002229 00000+0 22747-3 0 9996
+2 37166 97.9649 276.5540 0018109 211.1628 148.8518 14.91581881869653
+SBSS (USA 216)
+1 37168U 10048A 26296.89234124 .00003128 00000+0 14751-3 0 9990
+2 37168 97.7131 184.7835 0080882 118.5101 303.2083 15.17373473871987
+YAOGAN-14
+1 38257U 12021A 26297.31651314 .00006604 00000+0 23464-3 0 9998
+2 38257 97.3207 72.2658 0006270 85.7919 274.4038 15.29329652805543
+PLEIADES 1B
+1 39019U 12068A 26297.32479543 .00000165 00000+0 45213-4 0 9992
+2 39019 98.1846 10.5154 0001633 85.5042 274.6344 14.58544774739674
+POPACS 2
+1 39269U 13055E 26296.50039111 .00020325 -79321-6 32291-3 0 9999
+2 39269 80.9925 356.8622 0401404 140.4956 222.6274 14.95491367682367
+YAOGAN-19
+1 39410U 13065A 26297.29460672 .00000355 00000+0 10531-2 0 9998
+2 39410 100.1309 268.0271 0009573 146.3998 213.7724 13.15588783620624
+SWARM B
+1 39451U 13067A 26297.20503229 .00002865 00000+0 99848-4 0 9990
+2 39451 87.7380 303.1092 0002471 88.2503 271.9029 15.29226744702950
+NANOSATC-BR1
+1 40024U 14033Q 26297.09071262 .00016890 00000+0 49536-3 0 9997
+2 40024 98.0596 341.1980 0004885 95.9671 264.2127 15.35256467673731
+PERSEUS-M1
+1 40039U 14033AF 26297.27670046 .00001928 00000+0 17726-3 0 9990
+2 40039 97.9790 243.6385 0010215 222.8661 137.1764 14.95989838669932
+GAOFEN-2
+1 40118U 14049A 26297.29184928 .00001233 00000+0 16580-3 0 9992
+2 40118 97.9976 1.2810 0007469 164.0326 196.1123 14.81049597658340
+ZIYUAN 3-02 (ZY 3-02)
+1 41556U 16033A 26297.30361727 .00004538 00000+0 20632-3 0 9994
+2 41556 97.3733 10.5095 0012645 208.3970 151.6578 15.21174121577616
+SKYSAT-C1
+1 41601U 16040C 26296.58154490 .00007984 00000+0 21438-3 0 9992
+2 41601 96.9471 321.4374 0000252 316.9165 43.2061 15.38178470577597
+LAPAN-A3
+1 41603U 16040E 26297.26401678 .00002735 00000+0 85890-4 0 9995
+2 41603 97.1592 289.3112 0007990 272.8739 87.1590 15.33816213574591
+ALSAT-1B
+1 41785U 16059C 26297.29891652 .00000128 00000+0 27601-4 0 9994
+2 41785 97.7795 300.5227 0009457 162.2763 197.8777 14.72354247539576
+ALSAT-2B
+1 41786U 16059D 26297.25372545 .00000322 00000+0 60428-4 0 9996
+2 41786 97.9758 356.9482 0001765 112.2261 247.9133 14.71000904539747
+CAS-2T & KS-1Q
+1 41847U 16066G 26297.25998588 .00000925 00000+0 13675-3 0 9993
+2 41847 98.3713 11.4798 0342030 97.8128 266.2030 14.44929320523438
+CYGFM08
+1 41888U 16078E 26296.78755934 .00037866 00000+0 33554-3 0 9996
+2 41888 34.9400 100.7600 0007195 340.9914 19.0544 15.67469336549110
+LEMUR-2-GREENBERG
+1 42837U 17042N 26297.24845819 .00016405 00000+0 48273-3 0 9997
+2 42837 97.3847 117.7009 0006632 261.5439 98.5052 15.35131652508167
+NANOACE
+1 42844U 17042V 26297.22475933 .00011481 00000+0 43354-3 0 9993
+2 42844 97.3795 109.7799 0002689 284.6497 75.4443 15.27165321507755
+COSMOS 2520
+1 42907U 17046A 26297.21348387 .00000149 00000+0 00000+0 0 9994
+2 42907 0.0259 126.8027 0000547 179.1131 208.6010 1.00273603 33695
+RADFXSAT (FOX-1B)
+1 43017U 17073E 26297.05874960 .00007790 00000+0 32921-3 0 9990
+2 43017 97.4484 161.6401 0144138 242.6888 115.9607 15.14483947484888
+JILIN-1 05
+1 43023U 17074B 26297.27830221 .00008264 00000+0 23982-3 0 9998
+2 43023 97.4942 45.4002 0006054 123.1943 236.9882 15.35760378493809
+JILIN-1 06
+1 43024U 17074C 26297.28555653 .00005237 00000+0 15639-3 0 9990
+2 43024 97.4858 42.1975 0007863 131.3640 228.8280 15.35035674493630
+SUPERVIEW-1 03
+1 43099U 18002A 26297.30443755 .00017742 00000+0 38720-3 0 9996
+2 43099 97.3073 22.2466 0043645 74.6070 285.9994 15.43234728488256
+JILIN-1 07
+1 43159U 18008E 26297.30754326 .00006803 00000+0 19273-3 0 9996
+2 43159 97.1724 313.9325 0006579 324.5751 35.5056 15.36561169484816
+JILIN-1 08
+1 43160U 18008F 26297.28226028 .00006096 00000+0 18102-3 0 9992
+2 43160 97.1770 313.0552 0005224 349.6091 10.5044 15.35130943484746
+AZERSPACE 2 (IS-38)
+1 43632U 18074A 26297.21348387 .00000000 00000+0 00000+0 0 9998
+2 43632 0.0210 240.8910 0001505 335.2891 298.4069 1.00270891 29747
+SHIYAN-6 01 (SY-6 01)
+1 43711U 18094B 26297.31482293 .00004316 00000+0 14766-3 0 9996
+2 43711 97.3576 310.2860 0013949 55.3257 304.9297 15.30697200441239
+AISTECHSAT 2
+1 43768U 18099L 26297.06208191 .00004759 00000+0 24733-3 0 9994
+2 43768 97.4151 342.2654 0004093 191.4027 168.7115 15.16544272431805
+FOX-1CLIFF (AO-95)
+1 43770U 18099N 26297.15762219 .00010221 00000+0 36326-3 0 9995
+2 43770 97.4237 357.0398 0006627 245.9370 114.1177 15.29181918432917
+SPAWAR-CAL-R
+1 43776U 18099U 26297.06124497 .00001866 00000+0 13154-3 0 9990
+2 43776 97.4243 332.8377 0018272 280.9750 78.9422 15.06060271431392
+SNUGLITE
+1 43784U 18099AC 26297.11895550 .00010666 00000+0 37391-3 0 9997
+2 43784 97.3716 350.2384 0003059 158.9197 201.2170 15.29631135433013
+ITASAT
+1 43786U 18099AE 26297.07232545 .00005950 00000+0 27551-3 0 9990
+2 43786 97.3877 346.0226 0010427 259.9476 100.0583 15.20435027432487
+SUOMI-100
+1 43804U 18099AY 26297.13175302 .00012062 00000+0 40283-3 0 9994
+2 43804 97.4037 357.1790 0009572 173.3505 186.7865 15.31139558433136
+SAUDISAT 5A
+1 43831U 18102A 26297.31899547 .00004711 00000+0 16879-3 0 9999
+2 43831 97.2918 356.3931 0010379 43.9537 316.2527 15.29173800435406
+SAUDISAT 5B
+1 43833U 18102C 26297.31858194 .00004541 00000+0 16176-3 0 9995
+2 43833 97.3035 359.6974 0011128 45.3623 314.8523 15.29375960435521
+BUFENG 1A
+1 44310U 19032A 26297.26709528 .00012752 00000+0 42946-3 0 9996
+2 44310 44.9694 69.7109 0011882 283.9838 75.9724 15.30753025406952
+BUFENG 1B
+1 44311U 19032B 26297.26616311 .00009086 00000+0 31466-3 0 9995
+2 44311 44.9725 23.7021 0026625 353.9472 6.1087 15.29920940407504
+TIANQI-3
+1 44314U 19032E 26297.27268444 .00016851 00000+0 38474-3 0 9993
+2 44314 45.0004 340.9988 0010374 7.1348 352.9687 15.42669493407987
+WT 1B
+1 44316U 19032G 26297.35383407 .00014980 00000+0 52161-3 0 9991
+2 44316 44.9708 74.6412 0012106 275.9905 83.9599 15.29542914406840
+GLOBAL-4
+1 44499U 19054E 26297.14383326 .00145417 00000+0 64696-3 0 9990
+2 44499 45.0024 203.9024 0009551 186.2262 173.8525 15.83122161400650
+KX-09
+1 44520U 19058B 26297.34116152 .00001345 00000+0 12221-3 0 9990
+2 44520 97.7774 309.9308 0008331 276.0957 83.9315 14.96928169389353
+KL-ALPHA A
+1 44785U 19077A 26297.24878531 .00000106 00000+0 13341-3 0 9997
+2 44785 88.9361 208.4953 0012937 90.1558 270.1078 13.56054088343225
+ETRSS-1
+1 44880U 19093B 26297.30628434 .00001900 00000+0 17250-3 0 9999
+2 44880 97.7762 20.7874 0010564 349.4286 10.6712 14.96457507371369
+STARLINK-1094
+1 44941U 20001AD 26297.30306595 .00050957 00000+0 41260-3 0 9993
+2 44941 53.1437 297.5441 0003088 90.0316 270.1056 15.70300158375799
+STARLINK-1231
+1 45212U 20012AL 26297.30107673 .00035893 00000+0 99131-3 0 9995
+2 45212 53.0369 32.5511 0001629 72.3840 287.7340 15.36744538370200
+STARLINK-1273
+1 45367U 20019H 26297.21792923 .00058422 00000+0 42009-3 0 9996
+2 45367 53.0338 121.7859 0001806 145.5017 214.6118 15.73065855365563
+STARLINK-1308
+1 45419U 20019BM 26297.25002315 .00128616 00000+0 53957-3 0 9994
+2 45419 53.0368 106.1393 0001309 70.6883 228.6615 15.84693428 5991
+XINGYUN-2 01
+1 45602U 20028A 26297.25451767 .00003179 00000+0 18729-3 0 9991
+2 45602 97.4981 287.2208 0010403 113.8009 246.4313 15.12272630354347
+GAOFEN-9 02
+1 45625U 20034B 26297.25318944 .00004834 00000+0 18423-3 0 9992
+2 45625 97.5892 96.5318 0011721 340.9766 19.1033 15.27142969355852
+STARLINK-1506
+1 45747U 20038T 26297.18446429 .00229793 00000+0 67197-2 0 9997
+2 45747 53.0719 220.2321 0004020 240.3140 119.7462 15.33859431351658
+GAOFEN-9 03
+1 45794U 20039A 26297.29978022 .00005237 00000+0 15947-3 0 9993
+2 45794 97.5563 73.8833 0010439 349.2057 10.8959 15.34405414353548
+STARLINK-1557
+1 46034U 20055H 26297.33335648 .00938878 00000+0 19686-1 0 9993
+2 46034 53.1594 143.0832 0001405 84.8374 278.0941 15.42242611 5870
+GAOFEN-9 05
+1 46232U 20058A 26297.25911097 .00008452 00000+0 26039-3 0 9993
+2 46232 97.1954 334.1941 0008090 8.3297 351.8079 15.33830906343387
+KSM1-C
+1 46906U 20081B 26297.30637413 .00008529 00000+0 30196-3 0 9994
+2 46906 36.8955 340.6407 0003447 226.1678 133.8788 15.28662971328926
+KSM1-D
+1 46907U 20081C 26297.29387690 .00006704 00000+0 25531-3 0 9992
+2 46907 36.8989 352.3852 0003439 253.5809 106.4563 15.26374372328828
+KSM1-A
+1 46912U 20081H 26297.31420513 .00007378 00000+0 26881-3 0 9990
+2 46912 36.9008 344.0396 0002601 295.3150 64.7330 15.27789768328920
+R2
+1 46913U 20081J 26297.18805431 .00007149 00000+0 26534-3 0 9993
+2 46913 36.8992 345.5112 0007920 285.0345 74.9528 15.27172723331704
+KSM1-B
+1 46914U 20081K 26297.25070814 .00007357 00000+0 28177-3 0 9997
+2 46914 36.9028 353.5823 0004426 267.5037 92.5206 15.26138599331908
+STARLINK-1812
+1 47126U 20088E 26297.11191705 .00027885 00000+0 10034-2 0 9998
+2 47126 53.0953 330.2427 0001030 50.4357 309.6733 15.28417120326650
+GAOFEN-14 01
+1 47231U 20092A 26297.29220294 .00003309 00000+0 13277-3 0 9993
+2 47231 97.4603 7.2926 0006051 80.1413 280.0508 15.25681868327514
+CELESTIS-17 & SHERPA-FX1
+1 47486U 21006CB 26297.14661043 .00004756 00000+0 14982-3 0 9997
+2 47486 97.2117 335.1232 0008171 95.7188 264.4987 15.33352754319058
+HAWK-2C
+1 47502U 21006CT 26297.19591284 .00005541 00000+0 15995-3 0 9998
+2 47502 97.2139 338.9514 0008475 96.7589 263.4620 15.36048136319296
+HAWK-2A
+1 47505U 21006CW 26297.19524196 .00005590 00000+0 16114-3 0 9997
+2 47505 97.2180 339.7071 0008036 100.3225 259.8926 15.36087490319298
+HAWK-2B
+1 47508U 21006CZ 26296.72273471 .00006533 00000+0 18668-3 0 9999
+2 47508 97.2054 337.3806 0008529 99.9570 260.2637 15.36293295319224
+STARLINK-2385
+1 47804U 21018T 26297.30050534 .00040041 00000+0 11455-2 0 9997
+2 47804 53.1586 245.4513 0005165 86.0402 274.1192 15.35585737311936
+STARLINK-2391
+1 47810U 21018Z 26297.33335648 .00083036 00000+0 23460-2 0 9999
+2 47810 53.1602 271.4890 0001469 87.9267 322.8490 15.35655840 5868
+STARLINK-2371
+1 47911U 21021BD 26297.26054491 -.00002022 00000+0 -47810-4 0 9996
+2 47911 53.1490 296.6315 0002886 36.6979 323.4221 15.34923920310944
+STARLINK-2378
+1 47916U 21021BJ 26297.30998256 .00045943 00000+0 13019-2 0 9991
+2 47916 53.1541 270.5917 0004857 71.5723 288.5808 15.35822716311451
+ONEWEB-0154
+1 48045U 21025D 26297.28487942 .00000263 00000+0 68465-3 0 9993
+2 48045 87.8883 294.5168 0001832 89.7410 270.3929 13.13469043270457
+STARLINK-2417
+1 48096U 21027E 26297.24129495 .00035917 00000+0 10621-2 0 9997
+2 48096 53.1560 181.5510 0001650 107.5417 252.5766 15.34607194307538
+STARLINK-2418
+1 48097U 21027F 26296.82324939 .00035127 00000+0 10272-2 0 9996
+2 48097 53.1545 170.6027 0003695 132.0255 228.1063 15.34964777307642
+STARLINK-2559
+1 48298U 21036Y 26297.12667140 .00074200 00000+0 14541-2 0 9995
+2 48298 53.1521 83.0502 0000971 355.9293 4.1707 15.46734619303541
+STARLINK-2637
+1 48356U 21038D 26297.24063726 .00035509 00000+0 10613-2 0 9990
+2 48356 53.1571 14.4369 0003002 22.5331 337.5803 15.34273032302103
+STARLINK-2568
+1 48406U 21038BF 26297.16876538 .00040040 00000+0 11060-2 0 9993
+2 48406 53.1551 351.3362 0002141 55.3011 304.8194 15.36691803302422
+STARLINK-2702
+1 48441U 21040P 26297.33335648 -.00001839 00000+0 -39828-4 0 9995
+2 48441 53.1607 193.9459 0001269 80.0130 350.9013 15.36794694 5870
+STARLINK-2655
+1 48449U 21040X 26297.11900467 .00051579 00000+0 14942-2 0 9998
+2 48449 53.1578 194.4485 0004882 127.8401 232.3045 15.35080640301690
+STARLINK-2225
+1 48574U 21041X 26297.33335648 .00166856 00000+0 33329-2 0 9990
+2 48574 53.1594 116.3830 0001199 94.3125 325.6602 15.45734216 5774
+TYVAK-0130
+1 48606U 21041BF 26297.19601023 .00006610 00000+0 24265-3 0 9994
+2 48606 52.9926 146.2332 0009053 206.1460 153.9082 15.29136258300111
+STARLINK-2734
+1 48657U 21044V 26297.25002315 -.00016666 00000+0 -39629-3 0 9993
+2 48657 53.1598 130.0245 0000978 78.7032 166.2772 15.40463387 5769
+STARLINK-2629
+1 48686U 21044BA 26296.70112510 .00016590 00000+0 54184-3 0 9990
+2 48686 53.1593 94.1784 0000586 72.8488 287.2578 15.31897408299295
+TIANHUI 2-02A
+1 49071U 21074A 26296.90818871 .00001383 00000+0 73860-4 0 9994
+2 49071 97.4864 298.4797 0001380 98.6140 261.5250 15.16782246286781
+STARLINK-3102
+1 49151U 21082X 26297.25002315 .00063848 00000+0 30526-2 0 9993
+2 49151 70.0022 37.6101 0002904 276.8970 350.3877 15.18655343 5756
+CS1
+1 49261U 21088B 26297.16986055 .00013236 00000+0 35552-3 0 9994
+2 49261 97.3618 0.6447 0010230 344.5857 15.5075 15.37999559280220
+YAOGAN-35 01A
+1 49390U 21101A 26297.12465284 .00007595 00000+0 26932-3 0 9998
+2 49390 34.9999 179.4477 0004308 108.4768 251.6417 15.28349736276603
+KOSEN-1
+1 49402U 21102H 26297.05128156 .00006833 00000+0 24892-3 0 9996
+2 49402 97.3050 336.7452 0014858 109.0071 251.2780 15.28408496273698
+STARLINK-3161
+1 49422U 21104Q 26297.19187261 -.00003607 00000+0 -95595-4 0 9994
+2 49422 53.1606 263.8653 0001841 87.5094 272.6120 15.34413437273382
+STARLINK-3114
+1 49426U 21104U 26297.30729421 .00017983 00000+0 53928-3 0 9994
+2 49426 53.1617 263.3276 0000635 231.9438 128.1508 15.34564466273408
+STARLINK-3121
+1 49428U 21104W 26297.20923607 .00005861 00000+0 30484-3 0 9991
+2 49428 53.1574 277.0435 0001643 335.4389 24.6528 15.17416211273212
+STARLINK-3132
+1 49457U 21104BB 26297.25461384 .00028763 00000+0 93027-3 0 9995
+2 49457 53.1616 254.6920 0000360 259.2948 100.8013 15.31865588273521
+STARLINK-3248
+1 49748U 21115AA 26297.11778692 -.00000011 00000+0 10824-4 0 9990
+2 49748 53.1598 190.2158 0001250 84.6192 275.4954 15.34388661270201
+STARLINK-3227
+1 49765U 21115AT 26295.94790414 .00001605 00000+0 63475-4 0 9993
+2 49765 53.1600 178.1513 0001868 83.5595 276.5619 15.31713790270273
+SHIJIAN-6 05B (SJ-6 05B)
+1 49962U 21122B 26288.74131524 .00002899 00000+0 17019-3 0 9999
+2 49962 97.3949 265.4471 0002031 48.5099 311.6306 15.12490165267967
+STARLINK-3281
+1 50183U 21125AD 26296.73111725 .00012306 00000+0 72309-3 0 9995
+2 50183 53.1587 303.1742 0001271 84.2978 275.8160 15.12067877271099
+STARLINK-3342
+1 50816U 22001P 26297.19725497 .00023050 00000+0 98890-3 0 9991
+2 50816 53.2000 206.9865 0002704 155.5320 204.5807 15.22647503265130
+ION SCV-004
+1 50993U 22002K 26297.25342321 .00004475 00000+0 14944-3 0 9994
+2 50993 97.2680 352.4629 0005489 247.7680 112.2980 15.31531743265044
+STARLINK-3189
+1 51464U 22010J 26297.03686957 -.00002706 00000+0 -69022-4 0 9994
+2 51464 53.1527 319.3006 0001180 84.4942 275.6195 15.34383273261999
+STARLINK-3459
+1 51757U 22016AV 26297.16565490 -.00000528 00000+0 -44918-5 0 9995
+2 51757 53.1576 341.9986 0001053 88.4056 271.7067 15.34382311258493
+STARLINK-3569
+1 51811U 22017AV 26297.24102531 .00045858 00000+0 13605-2 0 9998
+2 51811 53.1600 12.0945 0001587 68.6140 291.5032 15.34389803258753
+STARLINK-3582
+1 51873U 22022X 26297.31214750 .00023215 00000+0 82678-3 0 9997
+2 51873 53.2002 35.8205 0002924 225.8879 134.1882 15.28857772258014
+STARLINK-3670
+1 52106U 22029U 26297.25002315 -.00004720 00000+0 -12864-3 0 9991
+2 52106 53.1572 119.9006 0001478 90.2067 219.4648 15.34396025 5905
+STARLINK-3734
+1 52112U 22029AA 26297.25002315 .01200016 00000+0 14813-1 0 9997
+2 52112 53.1601 90.4299 0000836 94.4595 106.7757 15.57120919 5867
+DAQI-1
+1 52257U 22039A 26297.25998778 .00000405 00000+0 98562-4 0 9990
+2 52257 98.1580 233.4953 0002828 194.5657 165.5461 14.57740641240744
+STARLINK-3782
+1 52273U 22041N 26297.27650712 .00000194 00000+0 18023-4 0 9995
+2 52273 53.1597 134.5395 0001074 95.0081 265.1043 15.31691844249262
+STARLINK-3822
+1 52287U 22041AC 26297.27880230 .00001372 00000+0 55964-4 0 9994
+2 52287 53.1595 144.1898 0001905 78.7463 281.3753 15.31704421249135
+STARLINK-3820
+1 52364U 22045AK 26297.30215948 -.00003390 00000+0 -91775-4 0 9990
+2 52364 53.1599 227.8964 0000702 95.2284 264.8798 15.33552741250637
+STARLINK-3872
+1 52453U 22049C 26297.22595656 -.00000437 00000+0 -18011-5 0 9993
+2 52453 53.1617 111.7233 0000974 114.7878 245.3226 15.34387674246765
+STARLINK-4012
+1 52602U 22052E 26297.07461161 .00005843 00000+0 18408-3 0 9991
+2 52602 53.1597 318.4387 0001242 80.4778 279.6365 15.34376538246346
+STARLINK-3975
+1 52620U 22052Y 26297.11328369 .00002711 00000+0 88647-4 0 9992
+2 52620 53.1573 318.6715 0001260 80.5679 279.5466 15.35383666245530
+STARLINK-3854
+1 52648U 22052BC 26297.27780368 -.00002435 00000+0 -60977-4 0 9991
+2 52648 53.1587 294.1612 0001185 98.7743 261.3394 15.34385276245894
+STARLINK-3976
+1 52673U 22053T 26297.01322278 .00000963 00000+0 38498-4 0 9999
+2 52673 53.1579 191.2403 0001153 103.7486 256.3646 15.35400398245757
+STARLINK-4072
+1 52694U 22053AQ 26297.17818803 .00000819 00000+0 34379-4 0 9997
+2 52694 53.1574 177.1707 0001197 95.0310 265.0830 15.35396437245932
+GHGSAT-C5
+1 52744U 22057N 26297.34806039 .00005395 00000+0 15756-3 0 9995
+2 52744 97.6846 89.8596 0007010 31.2159 328.9499 15.35754192245353
+GHGSAT-C4
+1 52746U 22057Q 26297.26349071 .00005565 00000+0 16237-3 0 9990
+2 52746 97.6691 86.7531 0006172 19.2721 340.8754 15.35767917245342
+GEESAT-1 03
+1 52787U 22058C 26297.26210527 .00001261 00000+0 18633-3 0 9990
+2 52787 49.9883 325.0590 0008418 240.2420 119.7680 14.81718541239074
+STARLINK-4043
+1 52836U 22062G 26297.30141125 .00119472 00000+0 36807-2 0 9998
+2 52836 53.1623 51.8222 0000661 73.5459 286.5615 15.32723666240800
+STARLINK-4049
+1 52840U 22062L 26297.25002315 .00524567 00000+0 40837-2 0 9997
+2 52840 53.1604 41.7490 0001125 81.8648 193.9586 15.69608730 5875
+STARLINK-4168
+1 52845U 22062R 26297.10721596 .00008829 00000+0 29639-3 0 9991
+2 52845 53.1618 72.3620 0001505 103.1926 256.9244 15.31650672240490
+STARLINK-4198
+1 52858U 22062AE 26297.08065601 -.00001531 00000+0 -34217-4 0 9994
+2 52858 53.1616 61.0959 0000930 54.6131 305.4959 15.34385024240640
+STARLINK-4326
+1 53081U 22077AQ 26296.94823903 .00000213 00000+0 89306-5 0 9994
+2 53081 97.2850 111.3147 0001822 92.4004 267.7447 15.33429654235425
+STARLINK-4145
+1 53137U 22083F 26297.18985736 -.00000216 00000+0 47229-5 0 9995
+2 53137 53.1596 208.4378 0001227 90.9243 269.1900 15.35391435235984
+STARLINK-4332
+1 53190U 22084B 26297.09925666 -.00000945 00000+0 -26957-4 0 9995
+2 53190 97.2850 352.3865 0001685 116.4787 243.6629 15.33447277234573
+STARLINK-4369
+1 53191U 22084C 26296.73302799 .00000611 00000+0 19135-4 0 9990
+2 53191 97.4036 1.2035 0001249 106.9094 253.2287 15.36974682234117
+STARLINK-4395
+1 53199U 22084L 26296.72403701 .00000648 00000+0 22407-4 0 9998
+2 53199 97.2849 351.8801 0001155 93.7121 266.4254 15.33432705233830
+STARLINK-4372
+1 53233U 22084AW 26296.67090186 -.00001570 00000+0 -46318-4 0 9994
+2 53233 97.2854 350.9152 0001490 91.9425 268.1989 15.33441112233772
+TECMS
+1 53346U 22090A 26297.34266227 .00002981 00000+0 13687-3 0 9999
+2 53346 97.3004 1.6641 0003828 112.0972 248.0671 15.21145018234440
+STARLINK-4510
+1 53405U 22097T 26296.83707233 -.00000041 00000+0 99383-5 0 9997
+2 53405 53.1570 165.5197 0001231 124.2146 235.8974 15.34384448233157
+STARLINK-4436
+1 53479U 22099Q 26296.77894707 -.00000598 00000+0 -16210-4 0 9991
+2 53479 97.2857 53.9099 0001042 88.6037 271.5325 15.33432571230646
+YAOGAN-35 04B
+1 53524U 22100C 26297.30216270 .00011328 00000+0 28894-3 0 9999
+2 53524 35.0011 277.2221 0002498 20.6385 339.4435 15.38687018125119
+STARLINK-4602
+1 53629U 22104AT 26297.28951898 .00021838 00000+0 65255-3 0 9997
+2 53629 53.1592 269.6423 0000703 265.5728 94.5194 15.34546046230510
+STARLINK-4592
+1 53634U 22104AY 26297.19399659 -.00001006 00000+0 -18661-4 0 9991
+2 53634 53.1584 263.9966 0000431 44.1721 315.9316 15.34382362230917
+STARLINK-4388
+1 53651U 22105D 26297.12945829 .00001027 00000+0 30703-4 0 9992
+2 53651 97.4466 187.2614 0001730 96.2426 263.9016 15.36967524228420
+STARLINK-4579
+1 53677U 22105AF 26296.94332222 -.00000372 00000+0 -91839-5 0 9998
+2 53677 97.2840 173.1742 0002041 88.9956 271.1521 15.33438787227860
+STARLINK-4572
+1 53692U 22105AW 26297.16226133 .00039433 00000+0 11831-2 0 9992
+2 53692 97.5908 188.5928 0003189 77.4082 282.7517 15.34351230228433
+STARLINK-4667
+1 53707U 22107H 26297.30940662 .00016046 00000+0 48276-3 0 9996
+2 53707 53.1621 263.3155 0000266 205.9736 154.1254 15.34548222229846
+STARLINK-4742
+1 53795U 22111Y 26297.01650973 -.00000927 00000+0 -18105-4 0 9991
+2 53795 53.1547 310.8824 0001862 85.0469 275.0745 15.31703912228409
+STARLINK-4723
+1 53797U 22111AA 26297.07234167 -.00001610 00000+0 -40159-4 0 9996
+2 53797 53.1542 309.8224 0000788 40.9029 319.2032 15.31688732228419
+BLUEWALKER-3
+1 53807U 22111AL 26297.28339374 .00005003 00000+0 13468-3 0 9997
+2 53807 53.2274 147.2404 0004919 199.3232 160.7588 15.39692662230089
+STARLINK-4738
+1 53819U 22114B 26297.14025864 .00000312 00000+0 21802-4 0 9994
+2 53819 53.1583 339.2053 0000691 51.4872 308.6191 15.31702255227584
+STARLINK-4748
+1 53823U 22114F 26297.25879598 .00000492 00000+0 25720-4 0 9994
+2 53823 53.1488 293.5498 0002173 100.5133 259.6114 15.34388276228230
+STARLINK-4764
+1 53827U 22114K 26297.14472056 -.00000415 00000+0 -11491-5 0 9992
+2 53827 53.1586 342.7223 0000873 67.8110 292.2985 15.34385311227539
+STARLINK-4766
+1 53840U 22114Y 26297.09537405 .00000714 00000+0 34792-4 0 9999
+2 53840 53.1607 327.5447 0001510 96.4739 263.6435 15.31687256227746
+STARLINK-4777
+1 53847U 22114AF 26296.43010282 -.00000726 00000+0 -27548-4 0 9998
+2 53847 53.1616 350.8283 0001191 100.2707 259.8419 15.08834591227350
+STARLINK-4780
+1 53848U 22114AG 26297.14032819 -.00004154 00000+0 -24307-3 0 9996
+2 53848 53.1607 347.4377 0000912 97.8119 262.2976 15.08842722227468
+STARLINK-5011
+1 53925U 22119AR 26297.25002315 .00042915 00000+0 16674-2 0 9999
+2 53925 53.1608 5.7661 0001507 110.7835 134.6233 15.25668227 5799
+YAOGAN-36 01A
+1 53943U 22120A 26297.14450466 .00007594 00000+0 29394-3 0 9991
+2 53943 34.9898 191.7541 0003922 65.6454 294.4670 15.25465674227009
+STARLINK-4468
+1 53969U 22125F 26297.30645152 -.00000137 00000+0 71565-5 0 9996
+2 53969 53.1586 263.7676 0001345 87.9930 272.1226 15.33543941224028
+YAOGAN-36 02B
+1 54043U 22133B 26297.30782998 .00010638 00000+0 30559-3 0 9991
+2 54043 34.9970 4.7953 0004531 197.2516 162.8049 15.35014520224680
+STARLINK-5279
+1 54165U 22141J 26297.08479090 .00002423 00000+0 82858-4 0 9999
+2 54165 53.1616 60.4902 0001591 94.2905 265.8280 15.34383460220306
+YAOGAN-36 03A
+1 54372U 22160A 26297.22768690 .00016387 00000+0 42276-3 0 9996
+2 54372 34.9997 214.5918 0001817 0.7490 359.3232 15.38283724218079
+YAOGAN-36 04C
+1 54750U 22171E 26296.80991308 .00010905 00000+0 30679-3 0 9999
+2 54750 34.9795 80.6027 0005092 233.4952 126.5297 15.35657907215252
+SHIYAN-21 (SY-21)
+1 54752U 22172A 26297.32468806 .00006244 00000+0 22179-3 0 9999
+2 54752 35.9932 343.9776 0025743 295.7605 64.0473 15.28227814215440
+STARLINK-5424
+1 54811U 22175BF 26297.04485409 .00000152 00000+0 15639-4 0 9991
+2 54811 53.1603 60.5531 0001162 50.3435 309.7670 15.34391850214928
+STARLINK-5372
+1 54838U 22177U 26297.23285019 .00000534 00000+0 28937-4 0 9997
+2 54838 43.0028 282.1714 0001555 278.1116 81.9559 15.27575559211916
+LYNK TOWER 4
+1 55034U 23001AB 26296.73351552 .00006746 00000+0 20095-3 0 9990
+2 55034 97.3044 354.4575 0008199 30.9064 329.2660 15.34983346211534
+CONTINUUM-1
+1 55045U 23001AN 26297.28028534 .00010281 00000+0 31387-3 0 9999
+2 55045 97.3220 359.0835 0007704 359.8698 0.2542 15.34071509212028
+NUSAT-33 (ALBANIA-2)
+1 55047U 23001AQ 26297.28341510 .00007903 00000+0 27634-3 0 9990
+2 55047 97.2923 355.7318 0004866 318.1976 41.8893 15.29794832212037
+EOSSAT-1
+1 55053U 23001AW 26297.22931081 .00004456 00000+0 13491-3 0 9995
+2 55053 97.3089 356.6905 0009384 25.9619 334.2094 15.34655873211709
+SKYKRAFT-1C
+1 55061U 23001BE 26297.24340582 .00002721 00000+0 10958-3 0 9994
+2 55061 97.3037 347.9767 0011715 56.7652 303.4708 15.25645251211158
+ASTROCAST-0401
+1 55110U 23001DF 26296.77332930 .00022640 00000+0 72738-3 0 9990
+2 55110 97.5553 31.9240 0008518 109.9804 250.2356 15.32257729210863
+STARLINK-5291
+1 55273U 23010E 26297.25002315 .00009803 00000+0 44675-3 0 9990
+2 55273 70.0015 186.4942 0003891 276.9348 121.5522 15.20905861 5685
+STARLINK-5286
+1 55294U 23010AB 26297.25002315 .00013475 00000+0 64355-3 0 9990
+2 55294 70.0001 186.3542 0003150 280.8199 229.6038 15.19162463 5654
+STARLINK-5315
+1 55309U 23010AS 26297.31138260 .00000224 00000+0 11970-4 0 9997
+2 55309 69.9969 144.5922 0002916 271.7735 88.3106 15.30409019208108
+STARLINK-5608
+1 55353U 23013Y 26296.47985949 -.00000123 00000+0 50582-5 0 9991
+2 55353 43.0015 93.3242 0001232 268.6188 91.4523 15.27575677206550
+STARLINK-5072
+1 55758U 23028T 26297.25002315 .00091258 00000+0 26898-2 0 9998
+2 55758 70.0017 25.6335 0002860 261.4452 341.9001 15.34552473 5733
+HORUS 2
+1 55844U 23032A 26297.25687676 .00004514 00000+0 19157-3 0 9998
+2 55844 97.3429 9.9770 0001777 98.5051 261.6388 15.23589046201138
+STARLINK-5919
+1 55927U 23037P 26297.16476587 .00000045 00000+0 11547-4 0 9993
+2 55927 69.9994 88.2657 0002601 277.4625 82.6238 14.98328126197701
+STARLINK-5895
+1 55964U 23037BC 26297.21666760 .00015870 00000+0 87753-3 0 9997
+2 55964 69.9959 33.0063 0005440 311.9710 48.0993 15.13938977199081
+COSMOS 2567
+1 55978U 23040A 26297.26972521 .00003286 00000+0 13211-3 0 9992
+2 55978 97.3461 223.6969 0002192 50.0116 310.1315 15.25612201199738
+GLOBAL-5
+1 55983U 23041C 26297.08512025 .00011721 00000+0 30831-3 0 9998
+2 55983 41.9994 169.5796 0008814 207.2554 152.7824 15.38438837201784
+STARLINK-5945
+1 56018U 23042AJ 26297.09242666 -.00000407 00000+0 -52910-5 0 9996
+2 56018 43.0024 195.5926 0000606 237.7843 122.2950 15.27571405197968
+STARLINK-5783
+1 56022U 23042AN 26297.10897943 .00000158 00000+0 15278-4 0 9993
+2 56022 43.0059 194.8555 0001633 256.5734 103.4935 15.27573527197972
+STARLINK-5781
+1 56030U 23042AW 26297.06928952 .00000443 00000+0 25621-4 0 9992
+2 56030 43.0001 195.4116 0001434 261.4757 98.5932 15.27576689197969
+STARLINK-6066
+1 56105U 23046N 26297.31123779 .00006541 00000+0 24698-3 0 9998
+2 56105 43.0017 310.6339 0001368 228.5724 131.5010 15.27585699196999
+PIESAT-1 A
+1 56153U 23047A 26294.63060542 .00003471 00000+0 19315-3 0 9991
+2 56153 97.5013 119.9593 0002057 109.1374 251.0080 15.14309720196939
+PIESAT-1 C
+1 56155U 23047C 26294.63060748 .00005465 00000+0 30215-3 0 9998
+2 56155 97.5055 119.9662 0001006 2.9826 357.1412 15.14292559196937
+PIESAT-1 D
+1 56156U 23047D 26294.69668469 .00003829 00000+0 21267-3 0 9998
+2 56156 97.5030 120.0227 0001441 64.7747 295.3634 15.14311008196943
+HAWK-7A
+1 56191U 23054P 26297.25569385 .00005085 00000+0 18574-3 0 9990
+2 56191 97.2496 181.2620 0001522 338.9242 21.1935 15.28542529196732
+HAWK-7C
+1 56200U 23054Y 26297.25549457 .00005019 00000+0 18336-3 0 9992
+2 56200 97.2498 180.2984 0001146 355.5130 4.6100 15.28542449196731
+GHGSAT-C6
+1 56204U 23054AC 26297.30113530 .00016491 00000+0 23276-3 0 9996
+2 56204 97.2966 209.7691 0002803 287.1722 72.9226 15.56652564198511
+STARLINK-30112
+1 56306U 23056W 26297.15013664 -.00001490 00000+0 -44670-4 0 9998
+2 56306 43.0042 358.3121 0001459 289.5829 70.4865 15.27559695195043
+STARLINK-5979
+1 56345U 23058AE 26297.22924136 .00001230 00000+0 40429-4 0 9994
+2 56345 97.2833 290.5015 0001626 85.1143 275.0285 15.33441736192600
+STARLINK-6153
+1 56384U 23061L 26297.25283069 -.00001405 00000+0 -41437-4 0 9993
+2 56384 43.0055 347.2486 0004495 295.7517 64.2871 15.27615519191705
+STARLINK-5985
+1 56451U 23064D 26296.95416028 -.00008950 00000+0 -74307-3 0 9993
+2 56451 69.9871 289.0808 0006359 277.2961 82.7475 14.98322209189433
+STARLINK-6050
+1 56458U 23064L 26297.27124071 .00000184 00000+0 23201-4 0 9997
+2 56458 69.9981 288.1847 0004393 272.9527 87.1129 14.98331587189480
+STARLINK-5335
+1 56508U 23065F 26297.21119959 .00000368 00000+0 22887-4 0 9990
+2 56508 43.0036 1.5298 0001185 275.4387 84.6329 15.27579790191553
+STARLINK-6337
+1 56528U 23065AB 26297.25053025 .00000458 00000+0 26152-4 0 9996
+2 56528 43.0046 5.2140 0000846 275.0675 85.0081 15.27588762191517
+2023-072F
+1 56748U 23072F 26297.27361479 .00007572 00000+0 23832-3 0 9990
+2 56748 97.4995 137.0403 0003921 280.3723 79.7076 15.33227544189542
+STARLINK-6197
+1 56767U 23078A 26297.23423796 .00032595 00000+0 12611-2 0 9999
+2 56767 69.9845 112.2189 0004021 172.5111 187.6123 15.26058516187310
+STARLINK-6087
+1 56801U 23078AL 26296.75674577 -.00005026 00000+0 -16620-3 0 9995
+2 56801 69.9990 106.3136 0003032 272.9425 87.1403 15.30403775187412
+2023-081A
+1 56846U 23081A 26297.26671989 .00006821 00000+0 27740-3 0 9996
+2 56846 97.3576 5.0722 0002278 99.5552 260.5943 15.24847798187671
+LONGJIANG 3
+1 56874U 23082A 26297.27621194 .00007974 00000+0 24283-3 0 9991
+2 56874 49.1026 104.3218 0007651 250.6283 109.3838 15.34789890189215
+STARLINK-5853
+1 56881U 23083F 26297.20146816 .00014192 00000+0 52267-3 0 9999
+2 56881 43.0020 235.0800 0001405 267.2171 92.8520 15.27680292186578
+STARLINK-6216
+1 56893U 23083T 26297.22197628 .00014292 00000+0 52900-3 0 9996
+2 56893 43.0070 234.3696 0002141 257.8686 102.1926 15.27508852186706
+STARLINK-6205
+1 56898U 23083Y 26297.19046571 .00003737 00000+0 14516-3 0 9990
+2 56898 42.9993 231.5823 0000746 261.9093 98.1673 15.27599669186722
+GEISAT PRECURSOR
+1 56934U 23084C 26297.25490411 .00006059 00000+0 17403-3 0 9993
+2 56934 97.6391 82.7644 0004289 233.9542 126.1304 15.36230105187331
+ION SCV-011
+1 56957U 23084AB 26297.28492727 .00004238 00000+0 14940-3 0 9993
+2 56957 98.1308 136.6325 0005972 316.8001 43.2768 15.29903783185541
+2023-085A
+1 57004U 23085A 26297.30105578 .00011299 00000+0 35306-3 0 9990
+2 57004 97.5057 48.8929 0005125 294.5813 65.4895 15.33327635186332
+STARLINK-6132
+1 57101U 23090A 26297.09755012 -.00000296 00000+0 -12113-5 0 9994
+2 57101 42.9996 71.6959 0002145 274.1325 85.9281 15.27578244185268
+STARLINK-6085
+1 57115U 23090Q 26297.09289493 .00030064 00000+0 12642-2 0 9992
+2 57115 42.9906 72.5675 0020334 250.7888 109.0761 15.22682461185255
+STARLINK-6146
+1 57124U 23090Z 26297.08981633 .00000711 00000+0 35373-4 0 9990
+2 57124 43.0100 71.6276 0001689 286.8087 73.2580 15.27579625185267
+STARLINK-6167
+1 57126U 23090AB 26296.66681294 -.00000392 00000+0 -47173-5 0 9994
+2 57126 42.9939 74.4607 0001513 262.1929 97.8751 15.27573942185194
+STARLINK-5765
+1 57147U 23090AY 26297.30368403 -.00000183 00000+0 28752-5 0 9992
+2 57147 43.0000 52.5195 0000701 271.0447 89.0324 15.27578143185501
+2023-091D
+1 57169U 23091D 26297.31174598 .00007267 00000+0 28553-3 0 9994
+2 57169 97.4969 359.1688 0009693 17.4479 342.7091 15.25954294183849
+2023-091E
+1 57170U 23091E 26297.31189267 .00007257 00000+0 28521-3 0 9999
+2 57170 97.4975 359.2561 0008461 10.0826 350.0580 15.25953181183845
+CUBEBEL 2 (EU11S)
+1 57175U 23091K 26297.30434045 .00010364 00000+0 33804-3 0 9993
+2 57175 97.4909 1.8239 0009456 26.6479 333.5247 15.31945988184054
+SITRO-AIS 5 (KATYS)
+1 57176U 23091L 26297.30495490 .00010184 00000+0 33078-3 0 9998
+2 57176 97.4922 2.5642 0010527 13.2554 346.8962 15.32075505184098
+MONITOR-3 (RS58S)
+1 57180U 23091Q 26297.25680803 .00009485 00000+0 32760-3 0 9990
+2 57180 97.4945 1.7480 0010893 11.9964 348.1534 15.30105797184012
+2023-091R
+1 57181U 23091R 26297.30157215 .00002907 00000+0 15834-3 0 9998
+2 57181 97.4912 349.4782 0016117 55.1409 305.1336 15.15107589183233
+MONITOR-4 (RS57S)
+1 57182U 23091S 26297.22828057 .00008599 00000+0 29641-3 0 9993
+2 57182 97.4939 1.6978 0010906 12.4226 347.7282 15.30199765184013
+HORS 1
+1 57188U 23091Y 26297.27593845 .00008278 00000+0 29916-3 0 9997
+2 57188 97.4927 1.6211 0008270 7.8979 352.2389 15.28690752184029
+POLYTECH-UNIVERSE 3 (R*)
+1 57191U 23091AB 26297.26900310 .00003990 00000+0 18718-3 0 9993
+2 57191 97.4898 354.1958 0016086 44.3977 315.8544 15.20128944183558
+SITRO-AIS 6 (CHIRKIN)
+1 57192U 23091AC 26297.27374529 .00008648 00000+0 31815-3 0 9990
+2 57192 97.4928 0.9207 0011119 19.5968 340.5696 15.28064038183983
+HORS 2
+1 57196U 23091AG 26297.31131603 .00012011 00000+0 35762-3 0 9997
+2 57196 97.4960 6.2685 0006762 356.6386 3.4811 15.34837520184312
+UTMN 2 (RS27S)
+1 57203U 23091AP 26297.26359087 .00012231 00000+0 36324-3 0 9997
+2 57203 97.4961 6.4334 0006478 351.1236 8.9891 15.34913319184323
+KUZGTU 1 (RS47S)
+1 57217U 23091AV 26297.23479081 .00010375 00000+0 33275-3 0 9995
+2 57217 97.4928 3.1617 0009975 7.5810 352.5581 15.32484465184129
+STARLINK-5039
+1 57247U 23094AF 26297.01600065 .00001894 00000+0 78290-4 0 9998
+2 57247 43.0003 170.0660 0000232 249.3602 110.7224 15.27591130182169
+STARLINK-5481
+1 57255U 23094AP 26297.08397238 -.00004331 00000+0 -14792-3 0 9996
+2 57255 43.0031 169.7176 0000720 268.7375 91.3394 15.27587483182179
+STARLINK-5476
+1 57258U 23094AS 26297.02999317 .00025121 00000+0 91430-3 0 9991
+2 57258 43.0058 170.1720 0002556 262.5769 97.4793 15.27757572182167
+STARLINK-6316
+1 57335U 23099H 26297.28632305 .00001709 00000+0 71663-4 0 9994
+2 57335 42.9993 38.3136 0001697 247.8388 112.2284 15.27559127181079
+STARLINK-5007
+1 57365U 23099AP 26297.31023150 .00000155 00000+0 15156-4 0 9992
+2 57365 43.0010 30.5573 0001227 271.3767 88.6944 15.27570471181169
+STARLINK-6363
+1 57375U 23099AZ 26297.32436573 .00000378 00000+0 23291-4 0 9997
+2 57375 43.0065 30.6673 0002153 285.3639 74.6975 15.27573367181160
+STARLINK-6367
+1 57376U 23099BA 26297.30173024 .00012436 00000+0 46061-3 0 9992
+2 57376 43.0024 27.0951 0001540 284.1965 75.8716 15.27583594181207
+STARLING 1
+1 57388U 23100C 26297.26264469 .00001427 00000+0 10095-3 0 9993
+2 57388 99.5029 345.7774 0004746 213.8653 146.2266 15.07154999179344
+TIANMU-1 09
+1 57401U 23101C 26297.24467256 .00005295 00000+0 17882-3 0 9995
+2 57401 97.2399 344.0522 0004539 59.3837 300.7852 15.31079936181384
+TIANMU-1 10
+1 57402U 23101D 26297.34220567 .00005414 00000+0 18284-3 0 9999
+2 57402 97.2477 345.3362 0005262 52.3579 307.8139 15.31064864181399
+2023-104A
+1 57424U 23104A 26297.24107907 .00009354 00000+0 25786-3 0 9999
+2 57424 97.2582 3.8145 0007000 26.0345 334.1251 15.37309705181857
+2023-117F
+1 57585U 23117F 26297.33052647 .00023160 00000+0 41026-3 0 9997
+2 57585 97.4144 26.6243 0006589 110.3393 249.8567 15.50259787178828
+STARLINK-30334
+1 57719U 23129X 26297.30513224 -.00009987 00000+0 -35341-3 0 9995
+2 57719 43.0030 267.0366 0001075 258.8252 101.2478 15.27623962175498
+STARLINK-30350
+1 57746U 23131Q 26297.32957266 .00000469 00000+0 26546-4 0 9990
+2 57746 42.9983 317.8187 0001125 234.9684 125.1062 15.27577010174921
+STARLINK-30307
+1 57747U 23131R 26297.34066090 -.00002532 00000+0 -82524-4 0 9992
+2 57747 42.9992 321.3232 0002584 277.1969 82.8588 15.27570094174880
+STARLINK-30394
+1 57810U 23138C 26297.24313160 .00013929 00000+0 51471-3 0 9998
+2 57810 43.0001 23.3424 0001965 195.5384 164.5408 15.27581406173597
+STARLINK-30460
+1 57870U 23144G 26296.67013997 .00000891 00000+0 41876-4 0 9995
+2 57870 42.9994 77.7225 0001272 263.9248 96.1458 15.27583841172515
+STARLINK-30474
+1 57897U 23146G 26297.19856523 -.00003322 00000+0 -11126-3 0 9992
+2 57897 42.9934 103.7025 0002503 159.4875 200.6078 15.27570481172009
+STARLINK-30487
+1 57924U 23147M 26297.20060226 -.00000285 00000+0 -83942-6 0 9996
+2 57924 43.0008 118.2681 0000764 291.3206 68.7564 15.27574663171530
+STARLINK-30712
+1 57935U 23148A 26297.30317957 -.00000397 00000+0 -61183-6 0 9993
+2 57935 53.1612 37.4805 0001276 78.5852 281.5294 15.34385753173496
+STARLINK-30703
+1 57954U 23148V 26296.97949835 .00000819 00000+0 35381-4 0 9998
+2 57954 53.1623 28.9257 0001461 90.8595 269.2575 15.34382123173585
+STARLINK-30526
+1 58006U 23153R 26297.11690004 .00001345 00000+0 58411-4 0 9995
+2 58006 42.9995 184.7621 0001361 278.2609 81.8089 15.27557585170207
+NESS
+1 58020U 23155E 26297.19793010 .00017124 00000+0 52164-3 0 9992
+2 58020 97.5866 26.1307 0006437 103.6020 256.5939 15.34032712168247
+CSC-1
+1 58022U 23155G 26297.23947891 .00002182 00000+0 13259-3 0 9997
+2 58022 97.5243 4.7374 0008655 148.9265 211.2479 15.11498638167223
+STARLINK-30533
+1 58037U 23156K 26297.08259767 .00021142 00000+0 63534-3 0 9993
+2 58037 53.1589 182.8472 0001532 81.9390 278.1787 15.34387996170068
+STARLINK-30564
+1 58043U 23156R 26297.17387480 -.00165694 00000+0 -50122-2 0 9995
+2 58043 53.1567 94.3807 0001865 105.0559 255.0650 15.34329571171333
+STARLINK-30529
+1 58047U 23156V 26297.10200782 -.00004071 00000+0 -10953-3 0 9991
+2 58047 53.1601 184.3959 0001392 91.2736 268.8426 15.34369324169994
+STARLINK-30795
+1 58118U 23162A 26297.03142730 -.00012859 00000+0 -45793-3 0 9990
+2 58118 42.9999 282.5450 0000730 287.4516 72.6256 15.27627313167230
+STARLINK-30766
+1 58125U 23162H 26297.01407221 .00001212 00000+0 53564-4 0 9990
+2 58125 42.9998 279.8623 0001302 247.5738 112.4976 15.27576034167265
+STARLINK-30775
+1 58139U 23162X 26297.03528201 .00002601 00000+0 10403-3 0 9996
+2 58139 42.9995 282.5616 0000892 222.2140 137.8643 15.27577828167231
+STARLINK-30797
+1 58154U 23166E 26297.27415217 -.00000352 00000+0 71503-6 0 9998
+2 58154 53.1625 235.7179 0001066 118.7934 241.3176 15.34381695168056
+STARLINK-30811
+1 58167U 23166T 26297.25451262 .00004490 00000+0 15621-3 0 9992
+2 58167 53.1576 235.8236 0000780 131.9523 228.1545 15.31731990168050
+TIANHUI 5A
+1 58199U 23168A 26294.53401194 .00000362 00000+0 45842-4 0 9999
+2 58199 97.8206 300.1121 0001472 88.9124 271.2261 14.87577525161381
+TIANHUI 5B
+1 58201U 23168C 26294.60127794 .00000428 00000+0 53062-4 0 9998
+2 58201 97.8207 300.1825 0002050 96.6774 263.4676 14.87577518161393
+PLATERO
+1 58262U 23174G 26297.04796728 .00055748 00000+0 39008-3 0 9990
+2 58262 97.3933 42.0507 0003051 327.9649 32.1429 15.74094443166382
+BRO-11
+1 58264U 23174J 26297.26916859 .00004260 00000+0 15681-3 0 9999
+2 58264 97.3812 12.9345 0011700 108.7456 251.5054 15.28332558164466
+GENMAT-1
+1 58276U 23174W 26297.20193695 .00009014 00000+0 25287-3 0 9996
+2 58276 97.3599 14.9885 0007637 84.7395 275.4720 15.36776234164772
+PROTOMETHEE
+1 58321U 23174BT 26297.26172005 .00006166 00000+0 19574-3 0 9992
+2 58321 97.3684 15.1099 0009002 70.8450 289.3766 15.32991985164732
+MALLIGYONG-1
+1 58400U 23179A 26297.27733757 .00002752 00000+0 11896-3 0 9999
+2 58400 97.2797 175.0750 0006686 301.3147 58.7435 15.23267639162409
+UHETSAT
+1 58466U 23185E 26297.32509513 .00006212 00000+0 19901-3 0 9995
+2 58466 97.3343 3.6470 0011783 203.3539 156.7170 15.32667779161069
+ION SCV-015
+1 58469U 23185H 26297.31201418 .00006077 00000+0 18419-3 0 9992
+2 58469 97.5746 29.2966 0008942 10.9627 349.1808 15.34496931160874
+2023-189A
+1 58502U 23189A 26297.29220722 .00003600 00000+0 11091-3 0 9998
+2 58502 97.4323 316.3963 0011398 149.0926 211.0990 15.34235569161007
+HONGHU 2
+1 58555U 23193C 26297.29898421 .00004095 00000+0 14328-3 0 9993
+2 58555 97.2882 286.6526 0040460 175.5357 184.6253 15.29298569121850
+STARLINK-31091
+1 58629U 23203M 26297.18024109 -.00001723 00000+0 -53105-4 0 9993
+2 58629 43.0064 220.3421 0002383 247.4429 112.6171 15.27569546158464
+TIANMU-1 11
+1 58645U 23205A 26297.29681774 .00004462 00000+0 16543-3 0 9997
+2 58645 97.3395 316.8973 0006731 265.5478 94.4992 15.28109961157234
+TIANMU-1 12
+1 58646U 23205B 26297.29065146 .00004550 00000+0 17032-3 0 9999
+2 58646 97.3386 316.5752 0005688 246.0029 114.0615 15.27788521157216
+TIANMU-1 20
+1 58661U 23208B 26297.31556164 .00007596 00000+0 22905-3 0 9995
+2 58661 97.4563 55.2999 0006225 211.2097 148.8777 15.34575772157212
+TIANMU-1 15
+1 58700U 24004A 26297.30236836 .00004555 00000+0 17049-3 0 9999
+2 58700 97.4640 123.5816 0005794 234.1141 125.9561 15.27803535155480
+STARLINK-31148
+1 58741U 24005P 26297.26031794 .00002007 00000+0 82441-4 0 9995
+2 58741 42.9997 8.6516 0000786 251.1465 108.9301 15.27578975155401
+YUNYAO-1 18
+1 58758U 24009A 26297.33955723 .00011109 00000+0 43588-3 0 9993
+2 58758 50.0161 236.5728 0006272 68.7981 291.3645 15.26145384154556
+STARLINK-31318
+1 58885U 24020K 26296.83237794 -.00002098 00000+0 -55855-4 0 9992
+2 58885 53.1532 341.0866 0001591 83.1109 277.0073 15.31704736153025
+NEXSAT-1
+1 58921U 24024E 26297.30642245 .00005713 00000+0 17037-3 0 9995
+2 58921 97.2942 9.9461 0008688 26.6371 333.5317 15.35012170151696
+STARLINK-31436
+1 59019U 24036X 26297.14236474 .00000719 00000+0 32409-4 0 9994
+2 59019 53.1594 94.6230 0001098 77.3682 282.7444 15.34395250150338
+STARLINK-31240
+1 59041U 24038U 26297.07465739 .00000579 00000+0 30573-4 0 9995
+2 59041 42.9987 174.0352 0000993 267.3165 92.7573 15.27571424149727
+STARLINK-31290
+1 59085U 24041M 26297.13166110 .00000454 00000+0 26025-4 0 9994
+2 59085 43.0000 86.3188 0001412 269.0928 90.9761 15.27580904149517
+HORACIO
+1 59098U 24043A 26297.34109147 .00001333 00000+0 11509-3 0 9997
+2 59098 97.8715 70.1327 0009653 318.6625 41.3866 14.98985092144017
+MUSAT-2
+1 59099U 24043B 26297.13906272 .00006232 00000+0 38772-3 0 9993
+2 59099 97.8777 79.0859 0005874 253.1333 106.9251 15.09982100144548
+ICEYE-X36
+1 59103U 24043F 26297.22477300 .00003484 00000+0 23160-3 0 9995
+2 59103 97.8537 77.8281 0004894 236.2883 123.7878 15.07863566144584
+CONTECSAT-1
+1 59117U 24043V 26297.40727514 .00000422 00000+0 14762-4 0 9993
+2 59117 97.5839 82.2491 0010555 112.0245 248.2120 15.35250635147098
+LYNK TOWER 5
+1 59121U 24043Z 26297.11875977 .00005999 00000+0 19644-3 0 9990
+2 59121 97.5815 77.3285 0011422 145.1130 215.0862 15.32004000146776
+NUSAT-44 (MARIA MITCHE*)
+1 59122U 24043AA 26297.25233686 .00009004 00000+0 31374-3 0 9996
+2 59122 97.5617 79.6197 0006090 129.1281 231.0502 15.29876318147009
+LYNK TOWER 6
+1 59123U 24043AB 26296.64178201 .00004762 00000+0 15505-3 0 9994
+2 59123 97.5777 76.3546 0010819 142.4370 217.7629 15.32308076146690
+TRANSPORTER-10 OBJECT AG
+1 59128U 24043AG 26296.64795905 .00006314 00000+0 19719-3 0 9991
+2 59128 97.5824 78.3521 0010393 138.4756 221.7278 15.33510403146799
+MESON-1
+1 59131U 24043AK 26296.70626162 .00005757 00000+0 18645-3 0 9997
+2 59131 97.5824 77.6605 0010685 139.4657 220.7383 15.32381883146752
+STARLINK-31298
+1 59167U 24044R 26297.26671354 -.00009354 00000+0 -33032-3 0 9998
+2 59167 43.0033 256.1293 0001715 276.6167 83.4489 15.27627147148528
+EXO-0
+1 59175U 23174DK 26296.95595710 .00009154 00000+0 25716-3 0 9992
+2 59175 97.3741 17.3232 0010119 73.0379 287.1974 15.36707307164805
+STARLINK-31603
+1 59201U 24046A 26297.07405934 .00003134 00000+0 10389-3 0 9995
+2 59201 53.1580 172.5763 0001103 99.4388 260.6739 15.34389134148049
+STARLINK-31303
+1 59239U 24049J 26297.23410558 .00000778 00000+0 37819-4 0 9994
+2 59239 42.9991 281.9903 0001147 223.6132 136.4629 15.27561950147484
+STARLINK-31637
+1 59258U 24050E 26297.11046849 -.00003979 00000+0 -10672-3 0 9997
+2 59258 53.1601 196.2611 0001185 111.5001 248.6128 15.34386549145578
+STARLINK-31572
+1 59333U 24057P 26297.12085898 -.00000755 00000+0 -17854-4 0 9995
+2 59333 42.9962 348.3426 0005744 298.5656 61.4618 15.27575390144647
+STARLINK-31560
+1 59361U 24060P 26297.29773384 .00001058 00000+0 47970-4 0 9999
+2 59361 43.0017 48.9485 0001467 271.6483 88.4200 15.27572197145028
+STARLINK-11088 [DTC]
+1 59709U 24088B 26297.23442487 -.00019387 00000+0 -15568-3 0 9999
+2 59709 53.1564 279.9341 0001997 94.1846 265.9400 15.69683758142167
+STARLINK-31726
+1 59739U 24090K 26297.14947526 -.00002483 00000+0 -80741-4 0 9994
+2 59739 43.0006 332.9681 0000672 265.6194 94.4581 15.27584592138380
+2024-095A
+1 59810U 24095A 26297.29356633 .00003758 00000+0 23186-3 0 9991
+2 59810 97.5257 14.1460 0002913 19.3337 340.8003 15.10521362133637
+STARLINK-31889
+1 59847U 24097N 26296.63827035 -.00003743 00000+0 -12659-3 0 9998
+2 59847 42.9996 67.4442 0002151 273.5674 86.4931 15.27564708136774
+PREFIRE-1
+1 59965U 24108A 26297.20165427 .00004347 00000+0 17833-3 0 9994
+2 59965 97.5451 92.7235 0011814 143.2559 216.9490 15.24725934132244
+STARLINK-32013
+1 60103U 24117N 26297.30123428 .00088555 00000+0 25562-2 0 9996
+2 60103 53.1616 52.0023 0003210 205.6744 154.4100 15.34947901131935
+STARLINK-32043
+1 60135U 24120A 26297.14516697 -.00009817 00000+0 -27957-3 0 9998
+2 60135 53.1583 334.5239 0000801 79.6216 280.4877 15.34426147131414
+TIANHUI 5C
+1 60211U 24126A 26294.62419657 .00000343 00000+0 43710-4 0 9996
+2 60211 97.8202 300.3835 0001559 89.7053 270.4342 14.87581547124687
+TIANHUI 5D
+1 60212U 24126B 26294.62419766 .00000356 00000+0 45144-4 0 9995
+2 60212 97.8202 300.3907 0002108 93.7011 266.4446 14.87581504124692
+GAOFEN-11 05
+1 60249U 24130A 26297.30535568 .00004691 00000+0 19969-3 0 9998
+2 60249 97.3907 13.7623 0001433 192.7815 167.3386 15.23473818105129
+STARLINK-32144
+1 60269U 24131Q 26297.08319769 .00006162 00000+0 21037-3 0 9993
+2 60269 53.1604 69.6482 0001108 73.4878 286.6245 15.31666951126764
+STARLINK-32122
+1 60285U 24132H 26297.06895987 .00000129 00000+0 15911-4 0 9993
+2 60285 53.1603 70.4009 0000952 67.8470 292.2632 15.31700621126549
+STARLINK-32077
+1 60344U 24136R 26297.16280310 -.00000971 00000+0 -17611-4 0 9998
+2 60344 53.1600 92.3835 0001557 94.9064 265.2117 15.34390376124679
+STARLINK-32181
+1 60349U 24136W 26297.14970153 -.00001901 00000+0 -45163-4 0 9999
+2 60349 53.1610 88.7537 0001017 100.5732 259.5385 15.34388833124724
+STRIX-4
+1 60352U 24137A 26297.29919480 .00019154 00000+0 52975-3 0 9991
+2 60352 43.0157 268.3347 0015510 77.7891 282.4700 15.36564344123855
+STARLINK-32226
+1 60426U 24144B 26297.23157427 -.00000132 00000+0 72366-5 0 9995
+2 60426 53.1595 231.7728 0001020 89.8414 270.2705 15.34381938124358
+STARLINK-32247
+1 60446U 24144X 26297.23018656 .00082207 00000+0 20350-2 0 9992
+2 60446 53.1584 220.9782 0005793 120.2297 239.9282 15.39726934124545
+YAOGAN-43 01F
+1 60463U 24148F 26297.30663091 .00013009 00000+0 36738-3 0 9994
+2 60463 34.9927 42.4501 0006775 322.8126 37.2123 15.35503734122122
+YAOGAN-43 01H
+1 60465U 24148H 26296.71915094 .00011937 00000+0 39977-3 0 9999
+2 60465 34.9886 61.5970 0006290 286.0426 73.9598 15.30112463121870
+TRANSPORTER-11 OBJECT A
+1 60468U 24149A 26296.73857535 .00008265 00000+0 24762-3 0 9996
+2 60468 97.3648 16.3631 0004363 111.9517 248.2190 15.34753647121762
+WARATAH SEED-1
+1 60469U 24149B 26297.17639624 .00013204 00000+0 34410-3 0 9993
+2 60469 97.3610 18.0765 0002980 114.3497 245.8060 15.38979638121938
+PHISAT 2
+1 60470U 24149C 26296.79922477 .00006349 00000+0 20417-3 0 9997
+2 60470 97.3676 15.3660 0002952 120.2618 239.8917 15.32599406121687
+TOMORROW-S1
+1 60479U 24149M 26297.20142758 .00006541 00000+0 19833-3 0 9993
+2 60479 97.3675 17.3495 0003675 126.1269 234.0315 15.34461017121860
+TOMORROW-S2
+1 60485U 24149T 26297.16298229 .00007128 00000+0 21603-3 0 9990
+2 60485 97.3745 17.9277 0003343 147.6874 212.4574 15.34447273121855
+FLOCK 4BE-36
+1 60486U 24149U 26297.18021488 .00048139 00000+0 82304-3 0 9996
+2 60486 97.3681 23.7187 0003792 148.0500 212.0982 15.51130030122285
+FLOCK 4BE-23
+1 60490U 24149Y 26297.19951909 .00014581 00000+0 34726-3 0 9991
+2 60490 97.3714 20.4872 0004098 151.0471 209.1004 15.41697029122044
+NUSAT-50 (NANCY ROMAN)
+1 60493U 24149AB 26297.17626191 .00008029 00000+0 27591-3 0 9996
+2 60493 97.3709 17.5467 0004640 95.8849 264.2921 15.30360423121856
+TYCHE
+1 60496U 24149AE 26297.19569939 .00003561 00000+0 14209-3 0 9995
+2 60496 97.3659 13.1842 0001782 158.6311 201.5003 15.25817464121578
+FLOCK 4BE-24
+1 60505U 24149AP 26296.99665969 .00024880 00000+0 45791-3 0 9990
+2 60505 97.3651 23.4124 0004333 162.1461 197.9943 15.49167133122264
+LUR-1
+1 60506U 24149AQ 26296.94884102 .00006618 00000+0 21956-3 0 9994
+2 60506 97.3651 14.8975 0003637 184.2267 175.8945 15.31573749121674
+FLOCK 4BE-27
+1 60513U 24149AX 26296.77361433 .00009096 00000+0 25777-3 0 9998
+2 60513 97.3757 18.8069 0003681 181.4856 178.6378 15.36478813121873
+FLOCK 4BE-28
+1 60519U 24149BD 26296.98849525 .00027765 00000+0 46632-3 0 9996
+2 60519 97.3695 25.3657 0003916 166.9569 193.1785 15.51744379122376
+ORESAT0.5
+1 60525U 24149BK 26296.99762745 .00023943 00000+0 42848-3 0 9991
+2 60525 97.3673 25.3626 0005521 155.7647 204.3865 15.49969804122397
+LEMUR-2-MARHISYAM
+1 60536U 24149BW 26297.21409768 .00008133 00000+0 45863-3 0 9996
+2 60536 97.6823 20.9636 0002641 71.7746 288.3772 15.13442686119983
+HYPERFIELD-1A
+1 60562U 24149CY 26296.97869139 .00006158 00000+0 19938-3 0 9998
+2 60562 97.3724 16.5415 0004517 192.7139 167.3990 15.32387007121751
+STARLINK-32162
+1 60597U 24150Q 26297.10302964 .00001764 00000+0 63365-4 0 9994
+2 60597 53.1575 324.5753 0000644 42.5257 317.5795 15.34382094123038
+STARLINK-11255 [DTC]
+1 60730U 24152L 26297.10455635 .00000297 00000+0 73124-5 0 9994
+2 60730 53.1586 69.9998 0001495 94.1130 266.0058 15.69705266124723
+2024-153F
+1 60750U 24153F 26297.32185743 .00013647 00000+0 48468-3 0 9995
+2 60750 97.6871 77.6879 0005860 146.9753 213.1853 15.29142707119514
+STARLINK-11269 [DTC]
+1 60995U 24158F 26297.21360022 .00000780 00000+0 11307-4 0 9991
+2 60995 53.1565 234.9625 0002171 64.0793 296.0449 15.69707517123476
+JILIN-01 KUANFU 02B 4
+1 61192U 24169D 26297.29307620 .00002707 00000+0 17615-3 0 9994
+2 61192 97.5495 24.1511 0010573 189.8379 170.2644 15.08768838115303
+JILIN-01 KUANFU 02B 6
+1 61194U 24169F 26297.30561283 .00002944 00000+0 19101-3 0 9990
+2 61194 97.5528 24.8873 0015628 249.9134 110.0413 15.08765457115314
+2024-173D
+1 61230U 24173D 26297.30563450 .00015826 00000+0 48994-3 0 9999
+2 61230 97.3472 15.5300 0009702 150.4144 209.7650 15.33503452116229
+2024-174D
+1 61241U 24174D 26297.29509880 .00006194 00000+0 20710-3 0 9991
+2 61241 97.4365 308.9855 0012943 126.2900 233.9539 15.31283437115667
+STARLINK-31837
+1 61514U 24183F 26297.00619979 -.00000467 00000+0 -26851-5 0 9997
+2 61514 53.1601 158.7483 0001436 95.6717 264.4450 15.34380112114650
+QIANFAN-31
+1 61564U 24185N 26297.32911672 .00000112 00000+0 13753-3 0 9994
+2 61564 88.9865 47.6601 0007536 174.7056 185.4180 13.58072634110999
+STARLINK-32397
+1 61593U 24187V 26296.68046736 .00000429 00000+0 23843-4 0 9999
+2 61593 53.1629 78.6829 0001313 82.6736 277.4416 15.34396076114092
+STARLINK-32370
+1 61635U 24191Q 26297.30438348 .00002426 00000+0 97620-4 0 9998
+2 61635 42.9957 303.0948 0001245 285.8061 74.2653 15.27594179112504
+STARLINK-32294
+1 61675U 24193Q 26296.77046397 .00000127 00000+0 15853-4 0 9997
+2 61675 53.1608 109.6942 0001281 104.6760 255.4384 15.31703060111478
+STARLINK-32309
+1 61676U 24193R 26297.17605855 .00000108 00000+0 14341-4 0 9993
+2 61676 53.1610 104.4079 0001266 95.6627 264.4521 15.34386860111583
+SITRO-AIS 14
+1 61752U 24199T 26297.31286158 .00001411 00000+0 12335-3 0 9999
+2 61752 97.3153 128.6989 0006491 1.8598 358.2648 14.98200897154458
+ASRTU-1 (AO-123)
+1 61781U 24199AY 26297.30680059 .00007723 00000+0 21237-3 0 9991
+2 61781 97.2775 164.8107 0012427 196.7793 163.3043 15.37395901153751
+2024-199BE
+1 61787U 24199BE 26297.31243817 .00008711 00000+0 23076-3 0 9996
+2 61787 97.2781 165.3153 0011975 193.2749 166.8184 15.38518298156935
+SITRO-AIS 17
+1 61789U 24199BG 26297.26102682 .00002039 00000+0 17502-3 0 9990
+2 61789 97.3138 128.9173 0006055 5.0724 355.0560 14.98483721151366
+STARLINK-32393
+1 61862U 24202T 26297.32477968 .00002385 00000+0 96166-4 0 9994
+2 61862 43.0018 26.8441 0002745 282.4080 77.6464 15.27583070110305
+PIESAT-2 D
+1 61872U 24203D 26297.28037600 .00010396 00000+0 37027-3 0 9997
+2 61872 97.4134 6.8703 0008677 235.7895 124.2523 15.29091630108638
+2024-205A
+1 61894U 24205A 26297.30942240 .00005656 00000+0 31971-3 0 9996
+2 61894 97.4013 3.6358 0017161 74.7633 285.5494 15.13350284107721
+2024-205B
+1 61895U 24205B 26297.27336640 .00010996 00000+0 34711-3 0 9992
+2 61895 97.4049 14.9023 0007875 297.4457 62.5984 15.32990271108448
+2024-205E
+1 61898U 24205E 26297.28756888 .00006047 00000+0 33921-3 0 9990
+2 61898 97.3996 3.9966 0052621 276.0504 83.4732 15.12538317107720
+2024-205H
+1 61901U 24205H 26297.31060721 .00012097 00000+0 36244-3 0 9996
+2 61901 97.4021 15.5396 0007738 298.4618 61.5845 15.34626031108508
+2024-205J
+1 61902U 24205J 26297.32698854 .00006172 00000+0 34682-3 0 9993
+2 61902 97.4022 4.0029 0014287 85.5707 274.7157 15.13569147107714
+2024-205Q
+1 61908U 24205Q 26297.34284243 .00005005 00000+0 24552-3 0 9993
+2 61908 97.4013 7.1030 0010728 334.8509 25.2202 15.18507796107922
+HAIYANG-4 01
+1 61936U 24208A 26297.30046332 .00000335 00000+0 59533-4 0 9997
+2 61936 98.0065 303.3112 0002026 96.8010 263.3428 14.73315481104451
+SUPERVIEW NEO-2 03
+1 62079U 24218B 26294.66898098 .00002853 00000+0 13673-3 0 9998
+2 62079 97.4381 300.1995 0001647 89.3171 270.8253 15.19730307105652
+SUPERVIEW NEO-2 04
+1 62080U 24218C 26294.86651029 .00002950 00000+0 14123-3 0 9992
+2 62080 97.4386 300.3958 0001454 95.2078 264.9323 15.19731152105682
+STARLINK-32608
+1 62124U 24222L 26297.23617346 .00008976 00000+0 33522-3 0 9992
+2 62124 42.9988 285.3492 0001770 223.8552 136.2159 15.27586808107692
+STARLINK-32570
+1 62137U 24222Z 26297.24644497 .00009290 00000+0 34675-3 0 9994
+2 62137 42.9972 285.4207 0001119 238.7697 121.3045 15.27573766107852
+STARLINK-32481
+1 62320U 24239V 26297.11522740 .00030412 00000+0 90805-3 0 9995
+2 62320 53.1587 198.2250 0001360 94.7234 265.3924 15.34382978104567
+KORSAT-2
+1 62377U 24247A 26297.23811480 .00002077 00000+0 18862-3 0 9990
+2 62377 45.4091 118.7890 0001446 235.5440 124.5301 14.98745506100929
+BANDWAGON-2 OBJECT D
+1 62380U 24247D 26297.07298301 .00008614 00000+0 27541-3 0 9994
+2 62380 44.9924 301.2084 0003550 306.1966 53.8590 15.32872540102768
+HAWK-11C
+1 62381U 24247E 26297.28831601 .00006588 00000+0 21981-3 0 9994
+2 62381 45.0037 300.5887 0004170 254.5236 105.5189 15.31853455102799
+HAWK-11A
+1 62382U 24247F 26297.28840118 .00006648 00000+0 22170-3 0 9996
+2 62382 44.9925 299.8144 0003558 258.0145 102.0340 15.31852822102795
+LIZZIESAT-2 (LS-2)
+1 62383U 24247G 26297.07354110 .00006996 00000+0 23478-3 0 9994
+2 62383 44.9921 304.4550 0002050 274.5413 85.5237 15.31576743102721
+TOMORROW-S3
+1 62392U 24247R 26297.06773244 .00005122 00000+0 18005-3 0 9996
+2 62392 45.0005 307.1328 0003127 343.1609 16.9171 15.30576490102694
+BANDWAGON-2 OBJECT V
+1 62396U 24247V 26297.21053860 .00097366 00000+0 86175-3 0 9996
+2 62396 44.9883 230.7607 0007373 137.8959 222.2507 15.67619446103611
+RESURS-P 5
+1 62430U 24250A 26297.26606335 .00002735 00000+0 89031-4 0 9996
+2 62430 97.2806 220.4363 0003060 98.3392 261.8198 15.32708941102314
+STARLINK-11518 [DTC]
+1 62462U 24254A 26296.99634861 .00231722 00000+0 17554-2 0 9998
+2 62462 42.9963 287.2104 0001441 276.9628 83.1075 15.70895774105316
+BUZZER-1
+1 62609U 25009A 26297.17053920 .00002638 00000+0 11718-3 0 9991
+2 62609 97.3832 13.1504 0006184 234.3824 125.6837 15.22401594 98312
+EDISON-1
+1 62610U 25009B 26296.97307724 .00013622 00000+0 41029-3 0 9997
+2 62610 97.3935 19.5001 0004585 194.1104 166.0012 15.34448036 98686
+FLOCK 4G-9
+1 62622U 25009P 26296.67152343 .00008455 00000+0 29351-3 0 9994
+2 62622 97.3889 16.7852 0003659 210.6959 149.4068 15.30019233 98497
+OTTER
+1 62623U 25009Q 26297.22832037 .00008712 00000+0 28394-3 0 9994
+2 62623 97.3961 19.0367 0004056 191.7166 168.3982 15.32052177 98667
+RAY 1.0
+1 62627U 25009U 26297.28938576 .00002890 00000+0 13185-3 0 9992
+2 62627 97.3894 13.2615 0008692 173.4071 186.7281 15.21389544 98306
+ION SCV-016
+1 62628U 25009V 26297.04142850 .00020291 00000+0 41028-3 0 9991
+2 62628 97.4173 321.3083 0570915 57.7668 307.7563 14.55627642 94267
+FLOCK 4G-26
+1 62633U 25009AA 26297.16616536 .00009060 00000+0 29687-3 0 9995
+2 62633 97.3949 18.7490 0003302 179.4084 180.7163 15.31871150 98648
+GARAI-A
+1 62635U 25009AC 26297.24187360 .00005042 00000+0 24523-3 0 9994
+2 62635 97.3859 14.1384 0001419 191.8566 168.2635 15.18844258 98360
+FLOCK 4G-24
+1 62637U 25009AE 26297.16192603 .00009628 00000+0 31265-3 0 9998
+2 62637 97.3957 19.0968 0003300 165.4732 194.6605 15.32141932 98664
+FLOCK 4G-3
+1 62639U 25009AG 26296.19123238 .00009105 00000+0 28635-3 0 9997
+2 62639 97.4009 17.7905 0004903 204.4259 155.6752 15.33180910 98489
+NUSAT-45 (UZMASAT-1)
+1 62640U 25009AH 26296.96010774 .00008248 00000+0 28229-3 0 9990
+2 62640 97.3520 16.8952 0001195 189.3582 170.7637 15.30491420 98613
+FLOCK 4G-27
+1 62641U 25009AJ 26297.21028238 .00009272 00000+0 30588-3 0 9993
+2 62641 97.3864 17.9945 0002131 167.1874 192.9422 15.31645103 98638
+LIME
+1 62648U 25009AR 26297.21907529 .00009430 00000+0 29576-3 0 9990
+2 62648 97.3886 19.2412 0000787 183.6837 176.4400 15.33264819 98726
+FLOCK 4G-34
+1 62650U 25009AT 26297.20298173 .00009233 00000+0 30686-3 0 9995
+2 62650 97.3895 18.2147 0002086 168.7107 191.4182 15.31408497 98646
+TRANSPORTER-12 OBJECT AZ
+1 62656U 25009AZ 26297.19361140 .00012527 00000+0 36002-3 0 9992
+2 62656 97.3873 20.4736 0001241 159.8082 200.3212 15.35956004 98800
+TRANSPORTER-12 OBJECT BA
+1 62657U 25009BA 26297.21007375 .00007500 00000+0 25404-3 0 9992
+2 62657 97.3866 18.2343 0002347 140.0560 220.0854 15.30861616 98656
+TROLL
+1 62658U 25009BB 26296.95370358 .00009337 00000+0 30261-3 0 9994
+2 62658 97.3822 18.2657 0000332 108.7428 251.3850 15.32218409153151
+FLOCK 4G-4
+1 62659U 25009BC 26296.96674363 .00010170 00000+0 28194-3 0 9998
+2 62659 97.3870 18.4347 0003176 168.8118 191.3198 15.37133337156258
+FLOCK 4G-5
+1 62663U 25009BG 26297.20127498 .00009103 00000+0 29285-3 0 9999
+2 62663 97.3965 19.3414 0003081 180.9490 179.1747 15.32460302 98682
+LYRA-1
+1 62664U 25009BH 26297.24336759 .00007497 00000+0 34231-3 0 9997
+2 62664 97.3871 9.2123 0009938 101.8237 258.4114 15.20835925 98023
+JAY-D2
+1 62665U 25009BJ 26297.24559014 .00003253 00000+0 14101-3 0 9999
+2 62665 97.3799 13.5351 0003159 220.3183 139.7820 15.23081148 98376
+JAY-C
+1 62668U 25009BM 26297.24656570 .00003179 00000+0 13786-3 0 9992
+2 62668 97.3873 14.0956 0002989 231.7203 128.3766 15.23081027156013
+JAY-D1
+1 62669U 25009BN 26297.24573929 .00003230 00000+0 14000-3 0 9997
+2 62669 97.3947 14.6573 0003695 238.2112 121.8765 15.23082189156010
+LEO EXPRESS 2
+1 62673U 25009BS 26296.90862340 .00005695 00000+0 24724-3 0 9993
+2 62673 97.4150 8.8613 0004300 76.0881 284.0834 15.22707743156183
+TRANSPORTER-12 OBJECT BT
+1 62674U 25009BT 26297.17196339 .00010686 00000+0 34126-3 0 9995
+2 62674 97.3988 19.4053 0003932 195.4167 164.6956 15.32647909156301
+FLOCK 4G-36
+1 62675U 25009BU 26297.15720042 .00009226 00000+0 30381-3 0 9995
+2 62675 97.3945 18.4324 0003822 201.9070 158.2009 15.31702261 98629
+FOSSASAT-2E19 (TAT-E)
+1 62676U 25009BV 26297.21413126 .00002368 00000+0 10746-3 0 9998
+2 62676 97.3870 13.1635 0003737 235.8426 124.2456 15.21766074 98316
+FLOCK 4G-15
+1 62678U 25009BX 26296.95977119 .00011191 00000+0 36605-3 0 9993
+2 62678 97.3946 18.4003 0004127 200.2450 159.8629 15.31864639156246
+BLUEBON
+1 62688U 25009CH 26297.21461157 .00007003 00000+0 22563-3 0 9999
+2 62688 97.3924 20.0233 0001186 157.9667 202.1626 15.32502734 98720
+STARLINK-32797
+1 62843U 25019Q 26297.22795923 -.00009571 00000+0 -33881-3 0 9994
+2 62843 43.0074 238.2473 0003325 251.4966 108.5524 15.27562999 97206
+STARLINK-11371 [DTC]
+1 62879U 25024A 26297.27329491 .00192086 00000+0 14662-2 0 9994
+2 62879 42.9988 243.9197 0000917 289.6609 70.4160 15.70839279 99418
+STARLINK-32909
+1 62894U 25024R 26297.22036380 .00019096 00000+0 70139-3 0 9999
+2 62894 42.9936 115.0081 0002533 251.9328 108.1247 15.27590470 97215
+FOSSASAT-2E20 (TAT-O)
+1 63003U 25009DN 26297.15820778 .00013537 00000+0 43050-3 0 9995
+2 63003 97.3063 11.2208 0002103 197.8216 162.2953 15.32721777156244
+STARLINK-11635 [DTC]
+1 63193U 25048L 26297.26668372 .00227954 00000+0 17276-2 0 9990
+2 63193 42.9992 21.8143 0001808 275.8595 84.2066 15.70897165 94475
+STARLINK-32931
+1 63199U 25048S 26297.22331032 .00011706 00000+0 43435-3 0 9995
+2 63199 43.0053 234.6622 0001118 300.4012 59.6729 15.27572856 92042
+TEVEL2-2
+1 63219U 25052K 26297.17772413 .00017865 00000+0 47891-3 0 9991
+2 63219 97.3710 193.3945 0004260 56.2905 303.8746 15.38036019 89894
+DROID.002
+1 63223U 25052P 26297.14569553 .00005027 00000+0 21089-3 0 9990
+2 63223 97.3755 187.9230 0005477 56.0209 304.1549 15.23919988 89502
+M-SEL/CORTEZ
+1 63231U 25052X 26297.16108174 .00007551 00000+0 27942-3 0 9997
+2 63231 97.3743 189.3063 0006490 64.0608 296.1299 15.27947129 89601
+LIZZIESAT-3 (LS-3)
+1 63233U 25052Z 26297.12891639 .00004585 00000+0 19907-3 0 9996
+2 63233 97.3732 186.6424 0007614 73.7058 286.5016 15.22790000 89426
+OTP-2
+1 63235U 25052AB 26297.18297965 .00006697 00000+0 26671-3 0 9998
+2 63235 97.3689 187.6884 0007986 72.5552 287.6558 15.25536170 89521
+AL MUNTHER
+1 63240U 25052AG 26297.15450534 .00017500 00000+0 50368-3 0 9999
+2 63240 97.3708 191.8271 0007925 61.0156 299.1881 15.35802458 89783
+2025-055G
+1 63297U 25055G 26297.32206990 .00017554 00000+0 61668-3 0 9992
+2 63297 97.6630 83.8153 0008263 64.3425 295.8667 15.29423401 88944
+LEMUR-2-ESPERANZA
+1 63352U 25061B 26296.88205046 .00003729 00000+0 20623-3 0 9997
+2 63352 97.5808 271.6166 0018094 174.7790 185.3633 15.14363934 87063
+LEMUR-2-LANGER2SPACE
+1 63358U 25061H 26296.96867462 .00003277 00000+0 17808-3 0 9997
+2 63358 97.5777 272.0506 0016678 166.9041 193.2628 15.15102176 87113
+HULIANWANG JISHU SHIYAN*
+1 63430U 25067C 26297.28842090 .00011435 00000+0 55027-3 0 9990
+2 63430 54.9965 183.5372 0003850 305.9938 54.0724 15.19255156 87555
+STARLINK-33659
+1 63445U 25069N 26297.02564487 .00021680 00000+0 65103-3 0 9990
+2 63445 53.1570 151.2340 0001050 73.2254 286.8864 15.34395676 88467
+STARLINK-33797
+1 63448U 25069R 26297.20688988 .00015643 00000+0 47327-3 0 9996
+2 63448 53.1586 152.3801 0001293 79.2020 280.9128 15.34390636 88455
+HERMES-6
+1 63489U 25052BK 26297.18499362 .00004937 00000+0 20491-3 0 9993
+2 63489 97.3822 187.7826 0008003 79.0665 281.1472 15.24278033 89474
+STARLINK-33818
+1 63502U 25071K 26297.02246829 .00028659 00000+0 85614-3 0 9996
+2 63502 53.1577 156.8602 0001257 83.4285 276.6860 15.34398456 87760
+STARLINK-33771
+1 63659U 25083AB 26297.31482449 .00021356 00000+0 78306-3 0 9991
+2 63659 43.0025 157.4530 0000858 272.1182 87.9571 15.27592429 85022
+STARLINK-33816
+1 63677U 25085P 26297.05452619 -.00017449 00000+0 -62733-3 0 9997
+2 63677 43.0054 181.3788 0000576 352.4251 7.6591 15.27514976 83896
+KUIPER-00038
+1 63750U 25088AC 26297.04362766 .00000356 00000+0 75735-4 0 9998
+2 63750 51.9017 168.3442 0000681 103.3188 256.7850 14.79923236 81337
+STARLINK-34029
+1 63805U 25092B 26297.10479026 .00021502 00000+0 78844-3 0 9998
+2 63805 42.9983 322.9368 0000352 261.7538 98.3274 15.27586785 83541
+HERMES-4
+1 63833U 25052BP 26296.67324233 .00009236 00000+0 29443-3 0 9996
+2 63833 97.3719 189.9320 0004736 98.8616 261.3162 15.32742243 89619
+HERMES-3
+1 63835U 25052BR 26297.26235398 .00022706 00000+0 60090-3 0 9997
+2 63835 97.3691 193.0202 0007278 47.6912 312.4949 15.38366384 89873
+STARLINK-34053
+1 63837U 25093B 26297.23190190 .00026285 00000+0 96131-3 0 9992
+2 63837 42.9990 227.3111 0001454 264.6649 95.4037 15.27580054 82869
+STARLINK-33897
+1 63865U 25094B 26296.60501369 .00023759 00000+0 80708-3 0 9994
+2 63865 70.0015 13.3873 0003697 261.3664 98.7093 15.30423723 81725
+STARLINK-34119
+1 63895U 25095F 26297.14150630 .00011922 00000+0 44202-3 0 9997
+2 63895 43.0013 326.2945 0001134 248.3959 111.6772 15.27583282 82721
+STARLINK-34068
+1 63914U 25095AA 26297.11065699 .00003199 00000+0 12568-3 0 9993
+2 63914 42.9904 326.0488 0000834 276.7480 83.3276 15.27581839 82719
+SCS-01 C
+1 63984U 25100C 26297.27126540 .00007280 00000+0 32477-3 0 9993
+2 63984 97.3555 7.1085 0025634 269.7990 90.0309 15.21393262 80248
+SCS-01 D
+1 63985U 25100D 26297.28017824 .00016153 00000+0 61689-3 0 9995
+2 63985 97.3566 11.7734 0006727 179.5242 180.6005 15.26693281 80555
+SCS-01 E
+1 63986U 25100E 26297.26930532 .00010941 00000+0 48637-3 0 9991
+2 63986 97.3517 7.0217 0008782 218.3746 141.6867 15.21647880 50076
+SCS-01 J
+1 63990U 25100J 26297.27712315 .00014998 00000+0 58886-3 0 9997
+2 63990 97.3523 11.3603 0006656 193.1251 166.9815 15.25786953 80529
+STARLINK-33953
+1 64028U 25102G 26297.27110960 .00011127 00000+0 39095-3 0 9992
+2 64028 70.0014 251.6478 0003205 269.2038 90.8770 15.29580689 80447
+TIANYI E
+1 64052U 25103E 26297.27417075 .00010450 00000+0 40511-3 0 9990
+2 64052 97.3627 7.7140 0004141 85.0489 275.1222 15.26314165 79782
+STARLINK-34190
+1 64078U 25107Q 26297.23185151 .00013132 00000+0 48580-3 0 9999
+2 64078 42.9957 350.8069 0002456 287.8801 72.1782 15.27585321 81077
+2025-108D
+1 64090U 25108D 26297.26628241 .00004345 00000+0 20521-3 0 9990
+2 64090 97.4588 11.4016 0010243 274.3564 85.6500 15.19911541 78967
+STARLINK-34104
+1 64102U 25110G 26296.58728231 .00021122 00000+0 63446-3 0 9996
+2 64102 53.1602 43.3092 0001193 72.4214 287.6919 15.34401452 80848
+STARLINK-34338
+1 64151U 25112F 26297.10654985 .00018949 00000+0 58770-3 0 9992
+2 64151 97.2861 343.6195 0001873 92.5378 267.6079 15.33449457 77899
+STARLINK-33872
+1 64189U 25113V 26296.88815879 .00021808 00000+0 65460-3 0 9991
+2 64189 53.1594 105.4725 0001489 88.1380 271.9793 15.34404300 80045
+SHIJIAN-26 (SJ-26)
+1 64199U 25115A 26297.32664814 .00004414 00000+0 18031-3 0 9991
+2 64199 97.4472 15.0995 0016882 257.0787 102.8565 15.24788863 78110
+STARLINK-33855
+1 64335U 25124U 26297.28926472 .00013384 00000+0 49475-3 0 9991
+2 64335 43.0014 270.5287 0001455 279.2135 80.8552 15.27597828 76746
+STARLINK-34432
+1 64426U 25129Q 26297.17784257 .00023714 00000+0 80599-3 0 9998
+2 64426 70.0038 211.9330 0003735 269.8569 90.2178 15.30406048 75611
+STARLINK-34459
+1 64449U 25130M 26297.31628673 .00067870 00000+0 19953-2 0 9996
+2 64449 53.1597 101.8462 0000649 140.3383 219.7668 15.34501411 75772
+STARLINK-34439
+1 64458U 25130W 26297.19281233 .00034990 00000+0 10414-2 0 9999
+2 64458 53.1575 103.9123 0001131 82.1900 277.9231 15.34414014 75730
+STARLINK-34492
+1 64473U 25133B 26297.27811211 .00024763 00000+0 74178-3 0 9998
+2 64473 53.1588 131.6759 0001549 101.3382 258.7794 15.34392780 76237
+GOOD ANCESTOR KILAKILA
+1 64528U 25135A 26296.59013243 .00008129 00000+0 32033-3 0 9996
+2 64528 97.4748 51.4777 0006076 94.0066 266.1867 15.25838565 74455
+DUTHSAT-2
+1 64530U 25135C 26297.17568227 .00012012 00000+0 41711-3 0 9990
+2 64530 97.4734 53.3896 0005691 97.1343 263.0545 15.29904492 74636
+TRANSPORTER-14 OBJECT D
+1 64531U 25135D 26297.31884110 .00009943 00000+0 35884-3 0 9992
+2 64531 97.4836 53.8041 0005268 77.2836 282.8992 15.28696285 74635
+TRANSPORTER-14 OBJECT E
+1 64532U 25135E 26297.05718768 .00011103 00000+0 40030-3 0 9999
+2 64532 97.4858 53.6134 0005291 78.0757 282.1076 15.28698096 74591
+IOD-2
+1 64538U 25135L 26297.27585128 .00003733 00000+0 17032-3 0 9997
+2 64538 97.4817 50.8400 0006015 88.1673 272.0252 15.21230327 74441
+PULSAR-0
+1 64541U 25135P 26297.26583082 .00002846 00000+0 13183-3 0 9994
+2 64541 97.4819 50.8346 0004575 93.7379 266.4380 15.20906963 74444
+BRO-18
+1 64550U 25135Y 26297.27455340 .00003720 00000+0 16204-3 0 9999
+2 64550 97.4746 51.4566 0002280 114.9455 245.2019 15.22834573 74517
+TRANSPORTER-14 OBJECT AC
+1 64554U 25135AC 26297.27857518 .00021494 00000+0 62404-3 0 9997
+2 64554 97.4753 55.6790 0001296 183.6506 176.4728 15.35518148 74782
+QUICK3
+1 64558U 25135AG 26297.06491951 .00013019 00000+0 44864-3 0 9997
+2 64558 97.4865 54.1474 0005884 73.7509 286.4378 15.30132442 74543
+PADRE
+1 64559U 25135AH 26297.25596408 .00001619 00000+0 16193-3 0 9999
+2 64559 97.7836 49.3607 0002059 155.1073 205.0246 14.92834405 73108
+IRIDE-MS2-HEO-3
+1 64568U 25135AS 26297.25396822 .00001597 00000+0 16294-3 0 9994
+2 64568 97.7848 49.7192 0001151 106.5320 253.6025 14.92047075 73126
+STARLINK-34486
+1 64597U 25137D 26297.16362491 .00024314 00000+0 72818-3 0 9999
+2 64597 53.1594 351.9861 0000903 344.6697 15.4278 15.34409530 75748
+STARLINK-34532
+1 64607U 25137P 26297.18417505 .00027018 00000+0 80770-3 0 9990
+2 64607 53.1587 359.9260 0000472 31.9082 328.1950 15.34407169 75633
+STARLINK-34395
+1 64668U 25139E 26297.26719109 .00016559 00000+0 50019-3 0 9994
+2 64668 53.1576 140.1221 0001227 75.2132 284.9007 15.34395447 75357
+STARLINK-34208
+1 64740U 25144S 26297.18138122 .00024181 00000+0 72431-3 0 9994
+2 64740 53.1595 192.0067 0001469 101.8671 258.2496 15.34408640 74800
+STARLINK-34607
+1 64742U 25144U 26297.14042360 .00030289 00000+0 90325-3 0 9998
+2 64742 53.1588 198.1406 0000770 267.9811 92.1103 15.34424932 74691
+STARLINK-34669
+1 64811U 25150X 26297.22749307 .00007052 00000+0 46980-3 0 9996
+2 64811 69.9978 277.6637 0002416 268.0485 92.0402 15.07505106 70761
+KUIPER-00092
+1 64837U 25151X 26297.19052175 -.00002413 00000+0 -28763-3 0 9998
+2 64837 51.9022 0.1762 0000455 92.9532 267.1482 14.79925451 70496
+INNOSAT 16 (RS92S7)
+1 64878U 25155C 26297.30534119 .00005232 00000+0 20170-3 0 9997
+2 64878 97.4745 264.2660 0012166 90.8556 269.4076 15.26698585100365
+GEOSCAN 1 (RS92S1)
+1 64880U 25155E 26297.25048998 .00010562 00000+0 33063-3 0 9996
+2 64880 97.4721 266.9190 0009551 81.9825 278.2501 15.33256636100538
+239ALFEROV (RS61S)
+1 64881U 25155F 26297.26221799 .00014745 00000+0 41800-3 0 9995
+2 64881 97.4712 268.0015 0009184 81.1524 279.0760 15.36309128100600
+2025-155J
+1 64884U 25155J 26297.28613041 .00008847 00000+0 29265-3 0 9992
+2 64884 97.4740 266.4879 0009515 74.4735 285.7556 15.31537820100504
+2025-155P
+1 64889U 25155P 26297.29440227 .00004467 00000+0 16831-3 0 9991
+2 64889 97.4773 265.2066 0009056 84.1407 276.0865 15.27574818100413
+GEOSCAN 5 (RS92S5)
+1 64891U 25155R 26297.29139322 .00013925 00000+0 39140-3 0 9992
+2 64891 97.4706 268.2150 0008212 84.9700 275.2481 15.36597936100620
+2025-155V
+1 64895U 25155V 26297.22095790 .00007353 00000+0 24376-3 0 9992
+2 64895 97.4750 266.4510 0009162 82.7324 277.4958 15.31535381100484
+CO3D 3
+1 64900U 25156B 26297.26610780 .00003273 00000+0 15419-3 0 9991
+2 64900 97.4350 14.1042 0001689 86.2387 273.9042 15.20214223 69148
+CO3D 1
+1 64903U 25156E 26297.23305641 .00003807 00000+0 17876-3 0 9990
+2 64903 97.4353 13.9705 0001283 87.9166 272.2216 15.20224653 69132
+STARLINK-34643
+1 64923U 25157V 26296.51390631 .00156784 00000+0 45345-2 0 9990
+2 64923 53.1629 3.2636 0000359 223.5034 136.5941 15.34544148 71060
+STARLINK-34745
+1 65057U 25165B 26296.95664761 .00029565 00000+0 91557-3 0 9997
+2 65057 97.2909 7.7066 0001213 168.4188 191.7083 15.33408782 69252
+GEESAT-4 06
+1 65124U 25170F 26297.27753254 .00001319 00000+0 18217-3 0 9999
+2 65124 49.9845 295.1714 0018291 178.3679 181.7323 14.84369968 65600
+GEESAT-4 08
+1 65126U 25170H 26297.28698342 .00001336 00000+0 19235-3 0 9998
+2 65126 49.9656 249.9387 0020187 117.2217 243.0780 14.82474214 66207
+GEESAT-4 09
+1 65127U 25170J 26297.24729063 .00001104 00000+0 16661-3 0 9993
+2 65127 49.9925 327.7371 0021729 166.1660 193.9877 14.81705761 65137
+STARLINK-34901
+1 65207U 25176K 26297.05412420 .00020254 00000+0 60904-3 0 9999
+2 65207 53.1592 167.0661 0000628 50.5520 309.5538 15.34395967 68152
+STARLINK-34833
+1 65218U 25176W 26297.04781020 .00025012 00000+0 74883-3 0 9993
+2 65218 53.1593 167.0292 0000803 42.7588 317.3477 15.34403493 68150
+STARLINK-34989
+1 65251U 25179S 26297.04462797 .00026956 00000+0 83416-3 0 9990
+2 65251 97.2841 335.8897 0001927 64.0433 296.1008 15.33450027 66620
+STARLINK-34984
+1 65290U 25184T 26297.10259283 .00018340 00000+0 56918-3 0 9995
+2 65290 97.2851 344.5844 0001848 92.2888 267.8567 15.33435293 65871
+STARLINK-34751
+1 65338U 25189R 26297.23287027 .00038586 00000+0 12490-2 0 9994
+2 65338 53.1614 223.3424 0001408 216.9058 143.1846 15.31693828 66129
+STARLINK-34913
+1 65369U 25190U 26297.08051324 .00027518 00000+0 82276-3 0 9995
+2 65369 53.1615 183.0113 0001130 126.1435 233.9672 15.34393110 64783
+STARLINK-35054
+1 65383U 25191E 26297.09119062 .00002152 00000+0 68934-4 0 9990
+2 65383 97.2839 162.5965 0003001 106.8170 253.3402 15.33461567 64781
+STARLINK-35058
+1 65394U 25191R 26297.09936597 .00016451 00000+0 51119-3 0 9995
+2 65394 97.2838 162.5851 0002049 88.9176 271.2301 15.33418020 64786
+STARLINK-35084
+1 65452U 25194U 26297.00936030 .00015693 00000+0 48706-3 0 9991
+2 65452 97.2766 146.1732 0002464 344.7509 15.3659 15.33465161 64209
+STARLINK-34829
+1 65470U 25195N 26297.30137304 .00026847 00000+0 87308-3 0 9996
+2 65470 53.1557 274.2827 0001237 83.7421 276.3721 15.31725207 65024
+STARLINK-35098
+1 65476U 25195U 26296.68611432 .00027299 00000+0 88823-3 0 9996
+2 65476 53.1613 276.8356 0001429 151.5511 208.5569 15.31700466 64919
+STARLINK-35077
+1 65529U 25200K 26297.14716242 .00027425 00000+0 84883-3 0 9992
+2 65529 97.2876 2.9889 0002105 113.5894 246.5570 15.33440566 63794
+STARLINK-35064
+1 65531U 25200M 26296.75018810 .00018452 00000+0 57245-3 0 9999
+2 65531 97.2866 2.6119 0001538 57.6184 302.5208 15.33446105 63738
+STARLINK-35269
+1 65593U 25207B 26297.13251808 .00027286 00000+0 84432-3 0 9996
+2 65593 97.2868 359.2039 0001405 92.5910 267.5493 15.33450199 62731
+STARLINK-35245
+1 65599U 25207H 26296.90684000 .00027989 00000+0 86655-3 0 9999
+2 65599 97.2876 358.9050 0001628 89.7698 270.3731 15.33427161 62700
+STARLINK-35255
+1 65602U 25207L 26297.11347769 .00028140 00000+0 87038-3 0 9992
+2 65602 97.2892 359.2274 0002570 83.3215 276.8320 15.33455454 62742
+STARLINK-35206
+1 65614U 25207Y 26297.17057691 .00014695 00000+0 45665-3 0 9993
+2 65614 97.2865 359.1523 0001506 93.4334 266.7081 15.33441576 62633
+STARLINK-35174
+1 65615U 25207Z 26296.70565891 .00045086 00000+0 13911-2 0 9994
+2 65615 97.2859 358.7149 0001771 58.6038 301.5377 15.33432139 62679
+STARLINK-35181
+1 65666U 25211Q 26297.08145153 .00025154 00000+0 77870-3 0 9991
+2 65666 97.2880 336.8886 0001517 97.0965 263.0450 15.33452111 61673
+STARLINK-35177
+1 65673U 25211X 26296.83401227 -.00017893 00000+0 -55317-3 0 9993
+2 65673 97.2835 336.6148 0000761 55.4409 304.6906 15.33447475 61632
+KUIPER-00176
+1 65788U 25217AC 26297.20424309 .00002013 00000+0 29305-3 0 9998
+2 65788 51.8975 112.6008 0000897 112.8487 247.2570 14.79929461 58714
+STARLINK-34919
+1 65802U 25218M 26296.76948537 .00022015 00000+0 68192-3 0 9991
+2 65802 97.2810 153.6929 0001468 23.9361 336.1950 15.33459868 59438
+STARLINK-35224
+1 65811U 25218W 26297.05769458 .00024585 00000+0 76121-3 0 9992
+2 65811 97.2836 153.9164 0001340 92.0463 268.0933 15.33452201 59471
+STARLINK-35472
+1 65913U 25225D 26297.21860337 .00032392 00000+0 96556-3 0 9998
+2 65913 53.1585 180.1627 0001250 85.1872 274.9274 15.34404160 59453
+STARLINK-35492
+1 65926U 25225S 26297.06098516 .00025562 00000+0 76543-3 0 9992
+2 65926 53.1586 180.5985 0001343 102.1924 257.9229 15.34386111 59434
+STARLINK-35175
+1 65929U 25225V 26297.25002315 .00009736 00000+0 29901-3 0 9999
+2 65929 53.1565 181.6672 0001231 88.6208 326.1245 15.34389638 5927
+STARLINK-35155
+1 65935U 25225AB 26297.06939852 .00031842 00000+0 94983-3 0 9995
+2 65935 53.1598 180.6496 0001078 114.2709 245.8406 15.34390655 58547
+KUIPER-00113
+1 65948U 25228B 26297.32299139 .00004697 00000+0 64490-3 0 9996
+2 65948 51.8977 64.5371 0000559 118.3655 241.7364 14.79919935 57157
+STARLINK-35276
+1 66009U 25232E 26297.23180379 .00019944 00000+0 59999-3 0 9994
+2 66009 53.1582 119.7099 0002004 95.8315 264.2916 15.34391146 58448
+STARLINK-35382
+1 66019U 25232Q 26296.77119004 .00021205 00000+0 63715-3 0 9994
+2 66019 53.1601 120.3936 0001496 98.2131 261.9042 15.34389663 58418
+2025-234C
+1 66055U 25234C 26296.72305440 .00004436 00000+0 17931-3 0 9998
+2 66055 97.4127 3.9008 0015816 68.8801 291.4126 15.25148567 56275
+STARLINK-35631
+1 66121U 25237H 26297.04645005 .00032983 00000+0 98286-3 0 9995
+2 66121 53.1594 56.7521 0001074 80.3727 279.7397 15.34405837 57602
+STARLINK-35649
+1 66125U 25237M 26296.59835892 .00025961 00000+0 77705-3 0 9994
+2 66125 53.1606 56.8064 0001397 77.3206 282.7952 15.34390729 57568
+STARLINK-35637
+1 66130U 25237S 26296.63670015 .00016472 00000+0 49773-3 0 9990
+2 66130 53.1573 58.4606 0001045 56.4727 303.6375 15.34389951 57548
+STARLINK-35607
+1 66163U 25240T 26297.09647971 .00030691 00000+0 91569-3 0 9995
+2 66163 53.1577 76.5472 0001205 75.1152 284.9984 15.34402894 57031
+STARLINK-35518
+1 66198U 25243X 26297.30269217 .00039931 00000+0 11869-2 0 9993
+2 66198 53.1573 261.3653 0001564 129.7863 230.3278 15.34393445 55684
+STARLINK-35490
+1 66204U 25243AD 26297.28537488 .00033280 00000+0 99173-3 0 9992
+2 66204 53.1584 259.8397 0001119 103.5166 256.5962 15.34400035 55700
+STARLINK-35737
+1 66219U 25244P 26297.30100019 .00027222 00000+0 81411-3 0 9993
+2 66219 53.1598 243.5886 0000979 106.6218 253.4892 15.34391777 56722
+ICEYE-X66
+1 66301U 25248J 26297.03540137 .00002448 00000+0 16505-3 0 9993
+2 66301 45.4001 174.4256 0004201 9.5588 350.5374 15.09666560 54979
+BANDWAGON-4 OBJECT M
+1 66304U 25248M 26296.91267983 .00016859 00000+0 55025-3 0 9998
+2 66304 45.4169 133.8212 0005221 83.7602 276.3883 15.31632532 53046
+BANDWAGON-4 OBJECT N
+1 66305U 25248N 26296.88497093 .00018260 00000+0 59075-3 0 9999
+2 66305 45.4193 133.6529 0005194 67.0698 293.0741 15.31864103 52186
+BANDWAGON-4 OBJECT Q
+1 66307U 25248Q 26296.88439285 .00017281 00000+0 57659-3 0 9998
+2 66307 45.3877 134.6817 0005876 81.3405 278.8151 15.30901803 54309
+STARLINK-35506
+1 66324U 25253F 26297.24967059 .00026752 00000+0 97649-3 0 9995
+2 66324 42.9989 1.3798 0003276 301.4278 58.6253 15.27632853 55208
+STARLINK-35505
+1 66329U 25253L 26297.20999515 .00023103 00000+0 84605-3 0 9993
+2 66329 43.0026 1.9536 0003870 288.5671 71.4760 15.27590147 55198
+STARLINK-35671
+1 66392U 25257N 26297.21055733 .00035924 00000+0 10693-2 0 9992
+2 66392 53.1615 231.8360 0000720 124.4577 235.6494 15.34398037 54770
+STARLINK-35355
+1 66448U 25259AC 26297.06131464 .00014658 00000+0 54079-3 0 9993
+2 66448 42.9876 64.9682 0002542 285.1639 74.8931 15.27597562 54413
+STARLINK-35451
+1 66469U 25262P 26297.10591117 .00027852 00000+0 10167-2 0 9999
+2 66469 42.9924 85.8487 0003312 279.1838 80.8638 15.27613695 53848
+STARLINK-35695
+1 66558U 25268B 26297.26893691 .00014008 00000+0 51764-3 0 9991
+2 66558 42.9999 136.5476 0000394 264.4186 95.6621 15.27576818 52919
+STARLINK-35579
+1 66562U 25268F 26296.84834243 .00021247 00000+0 78017-3 0 9990
+2 66562 42.9846 138.5363 0004757 276.4230 83.6080 15.27538508 52855
+STARLINK-36076
+1 66588U 25270A 26297.17944557 .00013714 00000+0 50721-3 0 9990
+2 66588 43.0007 205.5174 0001798 274.3015 85.7631 15.27563187 52653
+STARLINK-35923
+1 66641U 25271AA 26297.30823445 .00016237 00000+0 49074-3 0 9990
+2 66641 53.1571 155.5743 0001133 69.2862 290.8262 15.34394143 52607
+STARLINK-35938
+1 66644U 25271AD 26296.99728183 .00029364 00000+0 87697-3 0 9998
+2 66644 53.1588 157.1894 0000847 112.8004 247.3088 15.34393474 52550
+2025-274B
+1 66651U 25274B 26296.75636787 .00003051 00000+0 29286-3 0 9996
+2 66651 97.7515 224.0345 0010207 288.8187 71.1926 14.93786787 49405
+SNUGLITE-III
+1 66661U 25274M 26297.22706591 .00001923 00000+0 18380-3 0 9990
+2 66661 97.7534 224.9947 0013311 315.1876 44.8268 14.94364946 49509
+SARI-1
+1 66668U 25276C 26297.14208661 .00037727 00000+0 10998-2 0 9992
+2 66668 97.3914 11.0757 0004802 263.0301 97.0396 15.35263717 50220
+SARI-2
+1 66669U 25276D 26297.28136516 .00030573 00000+0 92543-3 0 9996
+2 66669 97.3955 11.1199 0004721 265.5778 94.4926 15.34118774 50234
+HUNITY
+1 66670U 25276E 26297.15285932 .00032632 00000+0 10059-2 0 9990
+2 66670 97.3953 10.8610 0004502 268.0089 92.0638 15.33528328 50208
+VEERY-0G
+1 66675U 25276K 26296.91636615 .00008167 00000+0 35260-3 0 9994
+2 66675 97.4061 8.5713 0003987 273.4602 86.6178 15.22762027 50009
+LEMUR-2-DEANANDMAEVE
+1 66680U 25276Q 26297.26889535 .00004931 00000+0 22970-3 0 9999
+2 66680 97.4092 8.3840 0004046 263.0219 97.0557 15.20356249 50015
+PHASMA-DIRAC
+1 66681U 25276R 26297.14565296 .00017272 00000+0 63981-3 0 9991
+2 66681 97.4003 9.8471 0003286 280.9288 79.1581 15.27705911 50124
+ION SCV-022
+1 66682U 25276S 26296.76928827 .00000172 00000+0 19216-4 0 9996
+2 66682 97.5159 2.7951 0006675 96.1545 264.0438 14.98095503 49323
+AE5RA
+1 66685U 25276V 26297.14591230 .00013110 00000+0 51642-3 0 9990
+2 66685 97.4113 9.8030 0002748 274.3411 85.7513 15.25727133 50090
+LEMUR-2-STAS-GORBUK
+1 66686U 25276W 26296.70364137 .00005172 00000+0 23953-3 0 9999
+2 66686 97.4136 8.1015 0003469 262.8219 97.2622 15.20534501 49930
+LEO EXPRESS 3
+1 66687U 25276X 26296.95386402 .00011127 00000+0 46992-3 0 9991
+2 66687 97.4153 8.9537 0004639 72.6152 287.5592 15.23416858 50018
+AC1-003
+1 66689U 25276Z 26297.15052264 .00002079 00000+0 10349-3 0 9995
+2 66689 97.4088 7.9425 0001177 300.4405 59.6713 15.18688661 49972
+TRANSPORTER-15 OBJECT AA
+1 66690U 25276AA 26297.15156553 .00004183 00000+0 19751-3 0 9997
+2 66690 97.4068 8.1508 0003105 267.0727 93.0153 15.19972061 49998
+TRANSPORTER-15 OBJECT AB
+1 66691U 25276AB 26297.14955729 .00008194 00000+0 35364-3 0 9993
+2 66691 97.4091 8.9967 0002959 261.2301 98.8601 15.22776070 50047
+NUSAT-52 (MELINA FURMAN)
+1 66692U 25276AC 26296.95438050 .00005095 00000+0 23398-3 0 9996
+2 66692 97.4099 8.3658 0001814 301.7437 58.3621 15.20837111 49982
+IRIDE-MS1-EAGLET 2-2
+1 66696U 25276AG 26296.77097956 .00005410 00000+0 24143-3 0 9996
+2 66696 97.4075 8.3460 0002203 281.8253 78.2736 15.21791198 49970
+IRIDE-MS1-EAGLET 2-3
+1 66697U 25276AH 26297.24341714 .00005650 00000+0 24790-3 0 9998
+2 66697 97.4073 9.0809 0001347 168.1453 191.9815 15.22354520 50069
+IRIDE-MS1-EAGLET 2-6
+1 66700U 25276AL 26296.93750316 .00005476 00000+0 23927-3 0 9997
+2 66700 97.4110 9.0297 0000955 183.3506 176.7724 15.22511506 50024
+IRIDE-MS1-EAGLET 2-8
+1 66702U 25276AN 26297.15325066 .00008789 00000+0 39273-3 0 9995
+2 66702 97.4085 8.6382 0002461 298.9552 61.1437 15.21567361 50022
+PELICAN-6
+1 66703U 25276AP 26297.25002315 .00052713 00000+0 14737-2 0 9999
+2 66703 97.3283 11.6970 0001677 100.0063 42.9874 15.36502494 4783
+FLOCK 4H-1
+1 66704U 25276AQ 26297.15868490 .00020264 00000+0 86199-3 0 9991
+2 66704 97.4070 8.8658 0001963 203.6561 156.4586 15.23043019 50041
+FLOCK 4H-2
+1 66705U 25276AR 26296.73008742 .00006648 00000+0 29155-3 0 9990
+2 66705 97.4069 8.5061 0000982 146.5058 213.6241 15.22301630 49981
+FLOCK 4H-8
+1 66711U 25276AX 26297.27023185 .00006127 00000+0 27421-3 0 9991
+2 66711 97.4119 8.9326 0001800 287.8059 72.2981 15.21642070 50046
+FLOCK 4H-9
+1 66712U 25276AY 26296.93486612 .00006046 00000+0 26851-3 0 9998
+2 66712 97.4109 8.7306 0002060 227.0828 133.0235 15.21912489 50009
+FLOCK 4H-13
+1 66716U 25276BC 26297.28156636 .00006187 00000+0 27402-3 0 9990
+2 66716 97.4116 9.2032 0001600 143.8738 216.2607 15.21996857 50061
+FLOCK 4H-16
+1 66719U 25276BF 26297.14151093 .00006572 00000+0 29702-3 0 9993
+2 66719 97.4126 8.6854 0002646 269.9724 90.1208 15.21274978 50010
+FLOCK 4H-18
+1 66721U 25276BH 26297.15209874 .00006361 00000+0 28829-3 0 9993
+2 66721 97.4072 8.4226 0002323 306.4346 53.6675 15.21191105 50015
+FLOCK 4H-19
+1 66722U 25276BJ 26296.94482986 .00012886 00000+0 56137-3 0 9999
+2 66722 97.4030 8.8582 0002244 130.5225 229.6207 15.22330570 49312
+FLOCK 4H-20
+1 66723U 25276BK 26297.19394465 .00006034 00000+0 26254-3 0 9997
+2 66723 97.4110 9.2924 0002404 174.7900 185.3362 15.22612250 49313
+FLOCK 4H-23
+1 66726U 25276BN 26296.75798912 .00006628 00000+0 30037-3 0 9999
+2 66726 97.4136 8.3042 0002805 258.8633 101.2287 15.21180349 49958
+FLOCK 4H-25
+1 66728U 25276BQ 26297.14768562 .00005917 00000+0 26219-3 0 9990
+2 66728 97.4088 8.9499 0001559 125.7807 234.3574 15.21994864 49321
+FLOCK 4H-26
+1 66729U 25276BR 26297.18228941 .00005271 00000+0 24074-3 0 9997
+2 66729 97.4086 8.4404 0003158 279.2908 80.7971 15.21004436 50014
+FLOCK 4H-29
+1 66732U 25276BU 26297.15264027 .00005896 00000+0 26797-3 0 9990
+2 66732 97.4066 8.3866 0001776 303.7725 56.3341 15.21125014 50017
+FLOCK 4H-30
+1 66733U 25276BV 26297.20125480 .00005984 00000+0 27064-3 0 9992
+2 66733 97.4127 8.7449 0002602 280.3714 79.7228 15.21287648 50020
+BLACK KITE-1
+1 66741U 25276CD 26297.15150036 .00007600 00000+0 33287-3 0 9991
+2 66741 97.4132 9.0195 0003974 251.8527 108.2277 15.22294614 47339
+NUSAT-47 (BEA. TINSLEY)
+1 66743U 25276CF 26297.18260012 .00004766 00000+0 21475-3 0 9998
+2 66743 97.4078 8.7414 0000171 246.2032 113.9186 15.21519322 50033
+AC1-002
+1 66745U 25276CH 26296.90856168 .00001908 00000+0 94665-4 0 9999
+2 66745 97.4081 7.7695 0000611 234.7745 125.3433 15.18898328 49943
+UMBRA-11
+1 66748U 25276CL 26297.17084255 .00023111 00000+0 75496-3 0 9992
+2 66748 97.4092 11.3684 0001764 193.0032 167.1165 15.31749712 50207
+PIAST-S1
+1 66749U 25276CM 26296.77461440 .00004959 00000+0 22396-3 0 9993
+2 66749 97.4082 8.3765 0001449 194.5223 165.5971 15.21426078 49976
+ICEYE-X60
+1 66753U 25276CR 26297.16303567 .00002577 00000+0 16177-3 0 9991
+2 66753 97.4077 5.7957 0001171 346.0116 14.1081 15.10143685 49830
+TRANSPORTER-15 OBJECT CY
+1 66760U 25276CY 26297.15361090 .00004454 00000+0 20245-3 0 9990
+2 66760 97.4075 8.7728 0001652 117.3881 242.7523 15.21259809 50039
+TRANSPORTER-15 OBJECT CZ
+1 66761U 25276CZ 26296.92905104 .00008688 00000+0 35917-3 0 9990
+2 66761 97.4075 9.3581 0001723 127.0842 233.0553 15.24218333 50056
+NAHLA
+1 66764U 25276DC 26297.14678811 .00002375 00000+0 11531-3 0 9993
+2 66764 97.4086 8.2240 0001619 210.1411 149.9731 15.19435457 49997
+ACCENTURE-1
+1 66767U 25276DF 26297.19747821 .00003089 00000+0 14346-3 0 9999
+2 66767 97.4051 8.6011 0002298 95.6097 264.5401 15.20743871 50031
+GYEONGGISAT-1
+1 66771U 25276DK 26297.19291425 .00004789 00000+0 21313-3 0 9998
+2 66771 97.4125 9.2208 0002826 121.2000 238.9514 15.21943599 50052
+IHI-SAT2
+1 66772U 25276DL 26297.19434508 .00005569 00000+0 24100-3 0 9994
+2 66772 97.4129 9.5115 0002698 110.5764 249.5762 15.22826831 50077
+GENA-OT
+1 66774U 25276DN 26296.72884641 .00005649 00000+0 24761-3 0 9993
+2 66774 97.4099 8.7996 0002769 110.1862 249.9673 15.22388537 49997
+PHI 1
+1 66775U 25276DP 26296.95851624 .00006214 00000+0 26991-3 0 9990
+2 66775 97.4021 8.7824 0003032 78.9792 281.1786 15.22657536 50038
+FORESAIL-1 PRIME
+1 66778U 25276DS 26297.16209347 .00004197 00000+0 20005-3 0 9994
+2 66778 97.4080 8.0601 0003067 48.5884 311.5614 15.19648301 49981
+LEMUR-2-FINNIAN
+1 66782U 25276DW 26297.15509344 .00004811 00000+0 37786-3 0 9995
+2 66782 97.5130 4.1027 0007379 27.8054 332.3564 15.01335304 39342
+FOSSASA-2E23
+1 66788U 25276EC 26296.76661680 .00008477 00000+0 35775-3 0 9997
+2 66788 97.4140 8.8509 0006144 46.7107 313.4642 15.23513482 49990
+STARLINK-36094
+1 66851U 25281D 26297.26162113 .00021495 00000+0 78821-3 0 9991
+2 66851 43.0039 132.5325 0000972 259.3119 100.7623 15.27586711 51149
+STARLINK-36128
+1 66873U 25281AB 26297.26290693 .00014149 00000+0 52263-3 0 9990
+2 66873 43.0016 132.5373 0001260 263.0111 97.0597 15.27584179 51083
+STARLINK-35919
+1 66888U 25283L 26297.27801698 .00009161 00000+0 28211-3 0 9996
+2 66888 53.1617 38.0292 0001185 98.1008 262.0129 15.34381049 50900
+2025-292H
+1 67000U 25292H 26296.97454763 .00005556 00000+0 35661-3 0 9997
+2 67000 97.6282 12.2541 0013047 285.1890 74.7895 15.08816196 47749
+STARLINK-36131
+1 67032U 25294C 26297.02658467 .00017199 00000+0 63306-3 0 9991
+2 67032 43.0047 188.2717 0002174 255.0272 105.0339 15.27580080 49728
+STARLINK-35765
+1 67041U 25294M 26297.11768153 .00008943 00000+0 33418-3 0 9993
+2 67041 42.9975 188.0885 0001318 271.6905 88.3796 15.27571283 49732
+DEAR-5
+1 67070U 25296B 26294.50961950 .00005903 00000+0 18444-3 0 9992
+2 67070 41.3599 109.7387 0013975 313.7131 46.2539 15.33602345 47543
+STARLINK-35882
+1 67088U 25298P 26297.20712713 -.00003092 00000+0 -19680-3 0 9996
+2 67088 69.9998 158.0214 0002626 272.7380 87.3483 15.07478283 47455
+STARLINK-35875
+1 67111U 25299K 26297.12055375 .00014316 00000+0 52867-3 0 9992
+2 67111 42.9980 318.7697 0000833 228.2463 131.8318 15.27584949 48058
+STARLINK-36186
+1 67165U 25303C 26297.18103306 .00023189 00000+0 84937-3 0 9992
+2 67165 42.9979 99.9930 0002410 252.6002 107.4586 15.27586046 47680
+STARLINK-35793
+1 67179U 25303S 26296.74260753 .00014781 00000+0 54566-3 0 9991
+2 67179 42.9928 102.7195 0002527 266.3552 93.7011 15.27573610 47612
+STARLINK-35782
+1 67182U 25303V 26297.17846823 .00019968 00000+0 73303-3 0 9993
+2 67182 42.9996 99.9700 0001542 259.9665 100.1012 15.27587103 47682
+2025-313V
+1 67267U 25313V 26297.19745215 .00008827 00000+0 34200-3 0 9998
+2 67267 97.3833 10.3279 0011492 273.8046 86.1878 15.26331302 45623
+2025-313X
+1 67269U 25313X 26297.18458821 .00011146 00000+0 41318-3 0 9999
+2 67269 97.3859 10.7583 0011491 264.0363 95.9567 15.27729077 45644
+2025-313AA
+1 67272U 25313AA 26296.93751097 .00010247 00000+0 39993-3 0 9993
+2 67272 97.3828 10.0597 0012058 270.3273 89.6584 15.26035750 45581
+2025-313AC
+1 67274U 25313AC 26297.31735272 .00004878 00000+0 20466-3 0 9993
+2 67274 97.3825 9.8443 0012516 269.5669 90.4134 15.23879648 45607
+2025-313AF
+1 67277U 25313AF 26295.72547695 .00006663 00000+0 27785-3 0 9994
+2 67277 97.3801 8.2237 0011674 279.8532 80.1387 15.23957292 45366
+2025-313AG
+1 67278U 25313AG 26297.17386594 .00005449 00000+0 22848-3 0 9991
+2 67278 97.3788 9.6114 0012386 274.6543 85.3280 15.23850472 45592
+MULE 4T
+1 67286U 25313AQ 26297.13064153 .00007702 00000+0 30203-3 0 9998
+2 67286 97.3828 10.3977 0007776 257.3065 102.7304 15.26006180 45623
+LUCA (RS90S)
+1 67287U 25313AR 26297.14214780 .00008293 00000+0 32066-3 0 9998
+2 67287 97.3831 10.5315 0007628 258.3529 101.6854 15.26453295 45630
+2025-313AS
+1 67288U 25313AS 26296.72305082 .00004582 00000+0 19068-3 0 9992
+2 67288 97.3818 9.5316 0009594 255.1547 104.8628 15.24217685 45536
+NASBSAT-1
+1 67289U 25313AT 26296.76400140 .00013206 00000+0 47317-3 0 9999
+2 67289 97.3829 10.7252 0007238 256.8207 103.2225 15.28843289 45610
+SITRO-AIS-64
+1 67292U 25313AW 26297.19343051 .00008113 00000+0 30786-3 0 9991
+2 67292 97.3831 10.7768 0007073 256.7592 103.2858 15.27088243 45658
+SCORPION (RS89S)
+1 67293U 25313AX 26296.77402808 .00003359 00000+0 14312-3 0 9995
+2 67293 97.3832 9.5121 0009160 253.8681 106.1549 15.23612109 45531
+ZORKIY-2M-5
+1 67295U 25313AZ 26297.19778106 .00006000 00000+0 23798-3 0 9995
+2 67295 97.3838 10.4697 0008603 248.6162 111.4159 15.25714979 45632
+SITRO-AIS-61
+1 67297U 25313BB 26297.14482507 .00009750 00000+0 36557-3 0 9991
+2 67297 97.3838 10.8748 0006433 259.9447 100.1067 15.27430866 45652
+TIANHUI 7
+1 67300U 25314A 26297.19582629 .00004637 00000+0 18402-3 0 9996
+2 67300 97.3923 11.4073 0002886 313.8459 46.2541 15.25848439 45453
+STARLINK-36481
+1 67307U 26002C 26297.18826280 .00017248 00000+0 63421-3 0 9994
+2 67307 42.9962 114.9264 0003412 278.6460 81.4005 15.27608609 46021
+STARLINK-35676
+1 67345U 26003M 26297.26456644 .00021261 00000+0 77971-3 0 9994
+2 67345 42.9969 16.0045 0000896 273.8551 86.2198 15.27587936 43785
+STARLINK-36446
+1 67412U 26005J 26297.32605006 .00019552 00000+0 71791-3 0 9990
+2 67412 42.9989 26.7484 0001393 273.2477 86.8216 15.27590974 43661
+STARLINK-36542
+1 67445U 26008A 26297.18019959 .00025214 00000+0 92219-3 0 9999
+2 67445 42.9987 355.1176 0000634 225.3762 134.7038 15.27596629 44517
+STARLINK-36440
+1 67447U 26008C 26297.19802026 .00016595 00000+0 61121-3 0 9997
+2 67447 42.9994 354.3741 0001215 274.8845 85.1868 15.27579301 44522
+STARLINK-36529
+1 67457U 26008N 26297.23914158 .00013155 00000+0 48671-3 0 9997
+2 67457 42.9973 354.6865 0001274 198.7407 161.3398 15.27579627 44529
+ION SCV-021
+1 67483U 25276ED 26296.76938418 .00000469 00000+0 44318-4 0 9993
+2 67483 97.5110 2.4942 0010899 47.5533 312.6609 14.98127751 41858
+STARLINK-36537
+1 67516U 26012Z 26296.75881473 .00023163 00000+0 84857-3 0 9993
+2 67516 42.9904 106.2371 0000775 224.3241 135.7549 15.27581154 42641
+STARLINK-36576
+1 67534U 26014C 26296.95778119 .00024962 00000+0 77245-3 0 9990
+2 67534 97.2842 181.8189 0002143 89.8460 270.3029 15.33465197 43767
+STARLINK-36397
+1 67538U 26014G 26297.13179797 .00016511 00000+0 51260-3 0 9992
+2 67538 97.2851 182.0360 0001240 106.3408 253.7971 15.33446876 43796
+STARLINK-36580
+1 67546U 26014Q 26297.15898728 .00011946 00000+0 37156-3 0 9990
+2 67546 97.2840 182.0010 0001504 70.8559 289.2847 15.33463068 43798
+STARLINK-36621
+1 67561U 26016A 26297.09611232 .00025521 00000+0 79014-3 0 9998
+2 67561 97.2877 355.1920 0001466 62.1912 297.9479 15.33445622 41861
+STARLINK-36398
+1 67562U 26016B 26297.10426955 .00023030 00000+0 71372-3 0 9999
+2 67562 97.2874 355.3355 0000658 96.3118 263.8200 15.33435309 41878
+STARLINK-35725
+1 67565U 26016E 26297.14777515 .00022144 00000+0 68644-3 0 9990
+2 67565 97.2879 355.2774 0001141 93.5438 266.5935 15.33435822 41877
+STARLINK-35843
+1 67606U 26018T 26297.13127609 .00027898 00000+0 86352-3 0 9997
+2 67606 97.2872 0.0993 0001653 78.9924 281.1505 15.33435646 42342
+STARLINK-36312
+1 67609U 26018W 26297.11496018 .00020975 00000+0 65061-3 0 9994
+2 67609 97.2868 0.1222 0001114 77.2829 282.8539 15.33425666 42340
+STARLINK-36694
+1 67653U 26022F 26297.04252168 .00011924 00000+0 37102-3 0 9995
+2 67653 97.2849 328.0665 0001624 80.2451 279.8975 15.33449119 40563
+COSMOS 2602
+1 67676U 26023C 26296.38095373 .00010805 00000+0 41279-3 0 9997
+2 67676 96.6137 343.3843 0019613 31.1026 329.1371 15.26583747 39553
+COSMOS 2605
+1 67679U 26023F 26297.10690546 .00009763 00000+0 36216-3 0 9990
+2 67679 96.6073 346.4158 0020322 31.8990 328.3477 15.27568932 39664
+STARLINK-36705
+1 67712U 26025V 26296.77955548 .00034230 00000+0 10572-2 0 9991
+2 67712 97.2908 46.1752 0000580 282.6089 77.5089 15.33464231 40960
+2026-027D
+1 67749U 26027D 26296.80219546 .00007234 00000+0 32360-3 0 9992
+2 67749 97.5220 64.6890 0010650 130.7254 229.4908 15.21554393 38460
+2026-027F
+1 67751U 26027F 26297.30155658 .00004569 00000+0 25965-3 0 9995
+2 67751 97.5230 62.8543 0010342 37.3103 322.8845 15.13356170 38431
+STARLINK-36606
+1 67845U 26033AA 26297.03660388 .00056821 00000+0 18774-2 0 9994
+2 67845 42.9965 56.8522 0004783 336.5920 23.4715 15.30568424 39603
+STARLINK-36608
+1 67854U 26034E 26297.18477522 .00046922 00000+0 13907-2 0 9991
+2 67854 53.1570 220.4655 0001340 133.6401 226.4713 15.34411526 39046
+STARLINK-36878
+1 67899U 26035W 26297.08461035 .00016484 00000+0 51244-3 0 9999
+2 67899 97.2868 228.5224 0001664 96.6848 263.4585 15.33404170 38994
+STARLINK-36722
+1 67917U 26036P 26297.33278892 .00022813 00000+0 83555-3 0 9999
+2 67917 42.9979 33.6790 0001438 228.4447 131.6281 15.27595598 38691
+STARLINK-36912
+1 67961U 26038A 26297.00629996 .00026083 00000+0 80741-3 0 9996
+2 67961 97.2822 304.7937 0002162 92.4378 267.7112 15.33446191 38226
+STARLINK-36357
+1 67963U 26038C 26296.99812186 .00024931 00000+0 77121-3 0 9998
+2 67963 97.2825 304.8033 0002120 91.4088 268.7397 15.33476720 38227
+STARLINK-36535
+1 67986U 26039A 26297.11508027 .00018229 00000+0 67029-3 0 9994
+2 67986 43.0036 199.2953 0000897 262.3286 97.7463 15.27580475 36633
+STARLINK-36947
+1 68033U 26040U 26297.13776200 .00025863 00000+0 80002-3 0 9990
+2 68033 97.2818 244.0123 0001651 67.4980 292.6438 15.33471071 36476
+STARLINK-36766
+1 68069U 26042A 26297.09530193 .00023415 00000+0 70223-3 0 9990
+2 68069 53.1593 192.9417 0001361 83.0101 277.1057 15.34388827 37349
+GLOBAL-34
+1 68098U 26043A 26297.09413093 .00009499 00000+0 28179-3 0 9991
+2 68098 42.0193 194.1861 0001330 189.0181 171.0633 15.34889210 35625
+STARLINK-37021
+1 68105U 26044E 26297.16539111 .00027377 00000+0 84722-3 0 9990
+2 68105 97.2847 255.5891 0001638 97.1397 263.0032 15.33445884 36592
+STARLINK-36844
+1 68117U 26044S 26297.13547832 .00020937 00000+0 64886-3 0 9993
+2 68117 97.2833 255.6295 0002018 86.8798 273.2675 15.33454248 36592
+2026-052F
+1 68203U 26052F 26297.14572885 .00005707 00000+0 32725-3 0 9990
+2 68203 97.5223 10.2193 0009487 214.1465 145.9157 15.12931553 33548
+2026-052J
+1 68206U 26052J 26297.10440384 .00075919 28594-5 83573-3 0 9990
+2 68206 97.3140 356.5240 0413492 355.2272 4.5060 15.00853941 32918
+STARLINK-37009
+1 68208U 26053B 26296.55221830 .00028078 00000+0 86869-3 0 9995
+2 68208 97.2835 169.7853 0002232 99.4507 260.6988 15.33448576 35139
+STARLINK-37155
+1 68314U 26057W 26295.93000874 .00028152 00000+0 87059-3 0 9996
+2 68314 97.2793 60.8725 0001563 96.9589 263.1832 15.33463297 33486
+STARLINK-37214
+1 68345U 26059AA 26297.16892213 .00032710 00000+0 97472-3 0 9990
+2 68345 53.1521 357.9772 0002424 109.2649 250.8616 15.34407935 33283
+RASSVET-3 11
+1 68370U 26061L 26297.20682272 .00007598 00000+0 22351-3 0 9998
+2 68370 82.2895 230.8179 0003799 352.9604 7.1585 15.34904929 33757
+SUPERVIEW NEO-2 05
+1 68377U 26062A 26294.89935789 .00001990 00000+0 96355-4 0 9998
+2 68377 97.4386 300.3987 0001584 87.2112 272.9304 15.19718477 31897
+SUPERVIEW NEO-2 06
+1 68378U 26062B 26294.83351353 .00001618 00000+0 78950-4 0 9990
+2 68378 97.4386 300.3382 0001304 110.5639 249.5736 15.19717819 31888
+STARLINK-37193
+1 68390U 26063L 26297.32047354 .00012819 00000+0 39878-3 0 9995
+2 68390 97.2841 80.6390 0001143 83.2627 276.8746 15.33440737 33128
+STARLINK-37187
+1 68399U 26063V 26296.77439561 .00019410 00000+0 60173-3 0 9993
+2 68399 97.2868 77.2492 0000482 121.1464 238.9826 15.33460544 32852
+SPACEVAN-002
+1 68424U 26067J 26296.79195778 .00005487 00000+0 25901-3 0 9996
+2 68424 97.4684 253.5929 0001153 31.5116 328.6188 15.19855125 31468
+OUT OF THE BOX (OOTB)
+1 68428U 26067N 26296.79606435 .00004242 00000+0 20447-3 0 9995
+2 68428 97.4747 253.7387 0000381 85.6154 274.5125 15.19261669 31460
+HAWK-14C
+1 68441U 26067AB 26297.15978874 .00004249 00000+0 20548-3 0 9999
+2 68441 97.4655 253.7454 0003025 26.1322 334.0065 15.19141832 31513
+IRIDE-MS1-EAGLET 2-13
+1 68450U 26067AL 26297.13049396 .00006156 00000+0 28637-3 0 9991
+2 68450 97.4708 254.1324 0001103 356.2581 3.8646 15.20313860 31523
+IRIDE-MS1-EAGLET 2-10
+1 68451U 26067AM 26297.12013821 .00006539 00000+0 30314-3 0 9995
+2 68451 97.4665 254.0312 0001032 36.8079 323.3227 15.20406572 31524
+FGN-100-D3
+1 68464U 26067BA 26297.15857230 .00004394 00000+0 21531-3 0 9990
+2 68464 97.4690 253.7191 0003594 29.8271 330.3167 15.18664583 31502
+LEMUR-2-DELOITTE-3
+1 68471U 26067BH 26297.10845843 .00004958 00000+0 48807-3 0 9991
+2 68471 97.7739 253.4017 0003874 12.1951 347.9362 14.92522004 30953
+FLYLAB1
+1 68472U 26067BJ 26297.15024960 .00002042 00000+0 20209-3 0 9994
+2 68472 97.7795 253.4830 0003131 359.3029 0.8185 14.92958786 30955
+UNICORN-2R
+1 68477U 26067BP 26296.90760072 .00009392 00000+0 89356-3 0 9995
+2 68477 97.7652 253.1834 0004660 28.8532 331.2945 14.93640945 30331
+LEMUR-2-SEJONG-3
+1 68482U 26067BU 26296.78847067 .00002076 00000+0 20221-3 0 9995
+2 68482 97.7738 253.5037 0003364 155.8800 204.2578 14.93586246 30929
+LEMUR-2-CLARA
+1 68483U 26067BV 26297.15100763 .00003110 00000+0 30112-3 0 9993
+2 68483 97.7806 253.9789 0002188 190.4229 169.6946 14.93456926 30976
+ICEYE-X76
+1 68502U 26067CQ 26296.83872645 .00001075 00000+0 11180-3 0 9996
+2 68502 97.7798 253.2636 0001329 354.3088 5.8116 14.91922928 30903
+GEMS2-AMETHYST
+1 68505U 26067CT 26297.16802615 .00004893 00000+0 48771-3 0 9993
+2 68505 97.7767 253.3946 0005033 359.1203 1.0006 14.92024912 30942
+CAMOES
+1 68507U 26067CV 26297.12176171 .00007952 00000+0 37096-3 0 9999
+2 68507 97.4806 254.1912 0003180 27.4505 332.6898 15.20119679 31498
+STARLINK-37161
+1 68565U 26070Z 26297.25468233 .00023295 00000+0 69890-3 0 9999
+2 68565 53.1574 15.6083 0001087 92.9023 267.2104 15.34379164 31628
+KUIPER-00236
+1 68582U 26072K 26297.26064984 .00002600 00000+0 36993-3 0 9991
+2 68582 51.9012 294.8974 0000679 87.3105 272.7936 14.79926626 30931
+STP-S29A OBJECT A
+1 68627U 26074A 26297.27858815 .00007369 00000+0 28921-3 0 9997
+2 68627 60.0181 42.4742 0035596 105.9591 254.5417 15.26125964 30471
+MISR-C-1
+1 68628U 26074B 26297.32669201 .00008396 00000+0 32738-3 0 9995
+2 68628 60.0234 42.2590 0033809 105.7294 254.7521 15.26232514 30471
+RAWHIDE-1
+1 68629U 26074C 26296.74806513 .00002441 00000+0 10634-3 0 9996
+2 68629 60.0218 44.5501 0037054 111.9960 248.5065 15.25192066 30397
+STPSAT-7
+1 68630U 26074D 26297.30496692 .00005552 00000+0 22314-3 0 9998
+2 68630 60.0226 42.1272 0034227 112.0087 248.4636 15.25814873 30477
+STP-S29A OBJECT E
+1 68631U 26074E 26297.26017707 .00003844 00000+0 15961-3 0 9992
+2 68631 60.0212 42.4687 0034598 113.2954 247.1775 15.25485749 30479
+RAWHIDE-2
+1 68632U 26074F 26297.31438942 .00003400 00000+0 14123-3 0 9994
+2 68632 60.0311 41.8042 0034521 114.7989 245.6690 15.25795682 30488
+CANVAS
+1 68635U 26074J 26297.31528796 .00012051 00000+0 44283-3 0 9996
+2 68635 60.0233 41.0329 0034635 112.0732 248.4034 15.27796214 30507
+JILIN GAOFEN OBJECT E
+1 68695U 26080E 26297.30986072 .00004255 00000+0 27608-3 0 9992
+2 68695 97.6540 12.6376 0013102 348.6334 11.4597 15.08552244 29093
+STARLINK-37358
+1 68699U 26081A 26296.58892535 .00013150 00000+0 39980-3 0 9996
+2 68699 53.1616 51.3828 0001412 110.1493 249.9662 15.34386404 29698
+STARLINK-37273
+1 68723U 26081AA 26296.61198238 .00021905 00000+0 65748-3 0 9995
+2 68723 53.1591 50.8136 0001246 82.0048 278.1096 15.34402507 29702
+STARLINK-37325
+1 68748U 26082W 26297.04391079 .00016615 00000+0 51565-3 0 9993
+2 68748 97.2819 158.6787 0001292 19.6973 340.4319 15.33456329 29446
+STARLINK-37277
+1 68751U 26082Z 26297.08198711 .00019654 00000+0 60963-3 0 9997
+2 68751 97.2835 158.7825 0001954 94.0299 266.1167 15.33438714 29459
+STARLINK-36379
+1 68769U 26086D 26296.66563334 .00005404 00000+0 16962-3 0 9998
+2 68769 97.2862 331.5548 0000902 153.2794 206.8496 15.33437988 28762
+KAKUSHIN RISING OBJECT C
+1 68794U 26088C 26297.15915150 .00003851 00000+0 25349-3 0 9993
+2 68794 97.5245 83.5316 0013139 21.1478 339.0291 15.08057938 27725
+STARLINK-37495
+1 68841U 26094C 26297.29976003 .00017091 00000+0 53050-3 0 9993
+2 68841 97.2834 309.8766 0001516 100.6212 259.5201 15.33446612 27835
+KUIPER-00410
+1 68926U 26098H 26297.13824677 .00002993 00000+0 42149-3 0 9995
+2 68926 51.8962 205.4133 0000919 82.8185 277.2882 14.79934243 26610
+IRIDE-MS2-HEO-7
+1 68981U 26100B 26297.13360642 .00001423 00000+0 14767-3 0 9999
+2 68981 97.7196 191.8918 0005976 87.3473 272.8430 14.91497084 25919
+IRIDE-MS2-HEO-14
+1 68986U 26100G 26296.60056501 .00001511 00000+0 15603-3 0 9999
+2 68986 97.7199 191.5158 0004379 48.8059 311.3537 14.91600130 25845
+BUSANSAT
+1 68989U 26100K 26297.14958731 .00001566 00000+0 16285-3 0 9995
+2 68989 97.7229 191.9348 0007541 71.7144 288.4894 14.91255416 25912
+YAM-11
+1 68991U 26100M 26297.15367182 .00001641 00000+0 17400-3 0 9997
+2 68991 97.7690 192.3330 0001424 64.9014 295.2351 14.90446894 25901
+ICEYE-X78
+1 68995U 26100R 26297.12165589 .00000976 00000+0 10190-3 0 9994
+2 68995 97.7206 192.0745 0003803 69.3713 290.7913 14.91953998 25928
+GEMINI-POLLUX
+1 69000U 26100W 26296.65509030 .00002523 00000+0 25023-3 0 9993
+2 69000 97.7161 191.6742 0001764 115.7498 244.3904 14.92658740 25864
+FOREST-19 (PATADASTRA)
+1 69001U 26100X 26297.15238417 .00000964 00000+0 98132-4 0 9997
+2 69001 97.7211 192.3485 0000986 29.9207 330.2069 14.93001351 25938
+DRISHTI
+1 69010U 26100AG 26297.18925064 .00002387 00000+0 11081-3 0 9999
+2 69010 97.3877 192.6131 0003752 310.9545 49.1366 15.20985516 26410
+HELIOS
+1 69021U 26100AT 26296.67877916 .00006576 00000+0 29535-3 0 9993
+2 69021 97.3865 192.0414 0002624 253.0079 107.0870 15.21489827 26333
+BALKAN-2
+1 69024U 26100AW 26297.14326894 .00005135 00000+0 23301-3 0 9998
+2 69024 97.3907 192.5942 0001245 265.8464 94.2630 15.21239817 26402
+2026-106D
+1 69100U 26106D 26296.74453809 .00001758 00000+0 10192-3 0 9992
+2 69100 97.5072 16.7327 0001739 89.1200 271.0230 15.13465774 24413
+STRIX-7
+1 69177U 26112A 26297.28228980 .00003566 00000+0 28235-3 0 9999
+2 69177 44.9070 234.0157 0023838 49.1332 311.1601 15.02217552 23282
+STARLINK-37440
+1 69189U 26114H 26297.10983076 .00019031 00000+0 57291-3 0 9997
+2 69189 53.1554 316.7813 0002158 86.8658 273.2591 15.34402485 24601
+STARLINK-37716
+1 69213U 26115C 26297.28846119 -.00043162 00000+0 -13452-2 0 9995
+2 69213 97.2833 312.8154 0000753 306.0187 54.0986 15.33376251 24463
+HULIANWANG JISHU SHIYAN*
+1 69320U 26120A 26294.91960300 .00006124 00000+0 30105-3 0 9996
+2 69320 55.0062 187.9162 0006413 255.4059 104.6249 15.19329209 22043
+HULIANWANG JISHU SHIYAN*
+1 69322U 26120C 26297.07409671 .00013402 00000+0 35721-3 0 9993
+2 69322 54.9948 168.1010 0007258 295.5748 64.4530 15.38504705 22523
+STARLINK-37782
+1 69342U 26122P 26297.32844231 .00019492 00000+0 60477-3 0 9991
+2 69342 97.2867 325.4625 0000842 110.7113 249.4221 15.33432206 21983
+STARLINK-37309
+1 69364U 26123M 26297.16207326 .00016423 00000+0 49600-3 0 9992
+2 69364 53.1511 344.6674 0000790 77.9947 282.1144 15.34408817 22039
+STARLINK-37642
+1 69455U 26127N 26297.22994807 .00018684 00000+0 56287-3 0 9991
+2 69455 53.1604 7.8096 0001427 59.0440 301.0702 15.34393274 21373
+STARLINK-37816
+1 69478U 26131A 26297.30729208 .00006050 00000+0 18965-3 0 9996
+2 69478 97.2847 317.7648 0001453 93.4053 266.7356 15.33431490 22086
+STARLINK-37873
+1 69484U 26131G 26296.63843031 .00020323 00000+0 63023-3 0 9993
+2 69484 97.2829 316.9917 0000633 97.4670 262.6645 15.33441352 21972
+STARLINK-37831
+1 69489U 26131M 26297.33992520 .00032290 00000+0 99743-3 0 9998
+2 69489 97.2862 317.7237 0001655 99.6977 260.4453 15.33470687 22086
+STARLINK-37232
+1 69515U 26133H 26297.11698863 .00047379 00000+0 14036-2 0 9994
+2 69515 53.1585 72.6716 0002038 108.7625 251.3599 15.34419904 20653
+2026-134B
+1 69539U 26134B 26297.29420406 .00004427 00000+0 28354-3 0 9992
+2 69539 97.6866 7.7187 0016269 185.9751 174.1286 15.08969454 19770
+STARLINK-37916
+1 69565U 26135V 26297.04146971 .00015428 00000+0 47907-3 0 9995
+2 69565 97.2844 324.2968 0001662 94.4389 265.7043 15.33454454 20145
+VICTUS HAZE PUMA
+1 69646U 26142A 26297.27496009 .00003999 00000+0 17942-3 0 9994
+2 69646 97.4493 193.4478 0018383 17.2934 342.8924 15.21626639 19298
+STARLINK-37646
+1 69650U 26143B 26297.05383847 .00026389 00000+0 81713-3 0 9996
+2 69650 97.2877 339.7428 0001526 45.2233 314.9134 15.33434443 20356
+STARLINK-37992
+1 69681U 26145E 26297.06417422 .00024929 00000+0 77187-3 0 9998
+2 69681 97.2838 143.2045 0001943 85.0290 275.1175 15.33447220 18681
+STARLINK-38069
+1 69761U 26150Y 26296.97778522 .00021862 00000+0 67735-3 0 9994
+2 69761 97.2819 135.3896 0001604 92.0169 268.1258 15.33453960 18864
+ICEYE-X79
+1 69870U 26156B 26296.59898652 .00003161 00000+0 31680-3 0 9998
+2 69870 97.7411 195.1911 0007584 138.6487 221.5308 14.92045412 16144
+TOM-1
+1 69872U 26156D 26297.14348871 .00001202 00000+0 12754-3 0 9990
+2 69872 97.7409 195.5552 0004921 103.4551 256.7217 14.90890078 16213
+CUBY-4
+1 69874U 26156F 26296.99781301 .00001454 00000+0 15241-3 0 9996
+2 69874 97.7415 195.4458 0004284 113.6007 246.5661 14.91071031 16195
+YAM-17
+1 69884U 26156R 26296.94623462 .00001387 00000+0 14741-3 0 9994
+2 69884 97.5561 193.4385 0001156 85.3497 274.7853 14.90522555 16182
+NAVIGATOR
+1 69887U 26156U 26297.00331274 .00000741 00000+0 79228-4 0 9997
+2 69887 97.7473 195.6419 0006878 166.8386 193.3013 14.91687080 16202
+ICEYE-X81
+1 69889U 26156W 26297.28543162 .00022829 00000+0 22321-2 0 9991
+2 69889 97.7456 195.8769 0006207 127.3910 232.7875 14.92330755 16249
+GRUS-3F
+1 69894U 26156AB 26297.15120972 .00000883 00000+0 93286-4 0 9999
+2 69894 97.7444 195.7480 0006573 135.5435 224.6312 14.91688287 16229
+MIKROGLOB-1 (PIRX-1)
+1 69895U 26156AC 26297.14984958 .00000723 00000+0 77410-4 0 9995
+2 69895 97.7410 195.6996 0007182 134.2042 225.9768 14.91701175 16222
+GRUS-3E
+1 69898U 26156AF 26297.15645825 .00000801 00000+0 85253-4 0 9997
+2 69898 97.7442 195.7364 0006416 133.7276 226.4476 14.91615903 16227
+TRANSPORTER-17 OBJECT AU
+1 69911U 26156AU 26297.14354552 .00001311 00000+0 13849-3 0 9994
+2 69911 97.7432 195.5860 0003280 113.8702 246.2860 14.90906572 16210
+MARMOTSAT
+1 69912U 26156AV 26297.20173551 .00001407 00000+0 14780-3 0 9991
+2 69912 97.7450 195.6866 0003555 118.9810 241.1765 14.91040380 16225
+BOHR
+1 69917U 26156BA 26296.67350402 .00001960 00000+0 19480-3 0 9994
+2 69917 97.7468 195.4807 0010089 154.4823 205.6896 14.92800620 16166
+LEMUR-2-ALYX
+1 69928U 26156BM 26297.15191438 .00004000 00000+0 39115-3 0 9997
+2 69928 97.7476 195.9338 0009057 148.9261 211.2496 14.92869259 16238
+GRITSS
+1 69931U 26156BQ 26296.95645266 .00002636 00000+0 26139-3 0 9996
+2 69931 97.7416 195.6528 0010046 143.6478 216.5425 14.92607109 16207
+LEMUR-2-ELEONORE
+1 69940U 26156BZ 26296.67051887 .00001136 00000+0 11528-3 0 9995
+2 69940 97.7452 195.4620 0010906 149.2117 210.9744 14.92782258 16161
+STARLINK-37919
+1 69957U 26157Q 26297.07523793 .00021294 00000+0 63966-3 0 9999
+2 69957 53.1581 177.0482 0000818 71.3661 288.7431 15.34395731 16529
+STARLINK-37901
+1 69960U 26157T 26297.06890504 .00030344 00000+0 90561-3 0 9996
+2 69960 53.1595 176.9864 0001155 126.2734 233.8376 15.34398572 16521
diff --git a/src/tatc/analysis/__init__.py b/src/tatc/analysis/__init__.py
index be350e5a..e3dae03c 100644
--- a/src/tatc/analysis/__init__.py
+++ b/src/tatc/analysis/__init__.py
@@ -12,6 +12,7 @@
reduce_observations,
)
from .dop_sampling import DopMethod, compute_dop
+from .feature_sampling import collect_feature_observations
from .ground_track import (
collect_ground_pixels,
collect_ground_track,
@@ -53,6 +54,7 @@
from .ro_sampling import (
collect_ro_observations,
)
+from .sample_sizes import compute_sample_sizes
from .space_sampling import (
collect_space_observations,
)
@@ -64,6 +66,7 @@
"ScanDirection",
"aggregate_observations",
"collect_downlinks",
+ "collect_feature_observations",
"collect_ground_pixels",
"collect_ground_track",
"collect_limb_observations",
@@ -81,6 +84,7 @@
"compute_ground_track",
"compute_latencies",
"compute_platform_track",
+ "compute_sample_sizes",
"compute_radar_track",
"compute_region_access_periods",
"find_coincident_ground_track",
diff --git a/src/tatc/analysis/coincidence.py b/src/tatc/analysis/coincidence.py
index 57c4c0d6..83015857 100644
--- a/src/tatc/analysis/coincidence.py
+++ b/src/tatc/analysis/coincidence.py
@@ -57,41 +57,64 @@ def _get_empty_coincidence_frame() -> gpd.GeoDataFrame:
def _find_coincident_periods(
- periods: pd.DataFrame, min_platforms: int
-) -> list[tuple[pd.Timestamp, pd.Timestamp]]:
+ target: np.ndarray,
+ platform: np.ndarray,
+ start: np.ndarray,
+ end: np.ndarray,
+ min_platforms: int,
+) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
"""
Finds the maximal periods when at least a minimum number of platforms
- observe at once, sweeping over the start and end of each platform's
- (closed) observation periods.
+ observe each target at once, sweeping over the start and end of each
+ platform's (closed) observation periods, for all targets together.
Args:
- periods (pandas.DataFrame): The observation periods, with columns
- `platform`, `start`, and `end`.
+ target (numpy.ndarray): The target code of each observation period.
+ platform (numpy.ndarray): The platform code of each observation period.
+ start (numpy.ndarray): The start of each observation period
+ (`numpy.datetime64`).
+ end (numpy.ndarray): The end of each observation period
+ (`numpy.datetime64`).
min_platforms (int): The minimum number of platforms.
Returns:
- list[tuple[pandas.Timestamp, pandas.Timestamp]]: the start and end
- of each coincident period, in time order
+ tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]: the target code,
+ start, and end of each coincident period, in order of target and
+ time
"""
- starts, ends = [], []
- for _, platform in periods.groupby("platform"):
- # merge the platform's overlapping periods so that it counts once
- platform = platform.sort_values("start")
- group = (platform["start"] > platform["end"].shift().cummax()).cumsum()
- merged = platform.groupby(group).agg(start=("start", "min"), end=("end", "max"))
- starts.append(merged["start"])
- ends.append(merged["end"])
- times = pd.concat(starts + ends, ignore_index=True)
- events = pd.DataFrame(
- {"time": times, "change": np.repeat([1, -1], len(times) // 2)}
+ # merge the overlapping periods of each platform at each target so that
+ # it counts once
+ order = np.lexsort((start, platform, target))
+ target, platform = target[order], platform[order]
+ start, end = start[order], end[order]
+ first = np.r_[True, (target[1:] != target[:-1]) | (platform[1:] != platform[:-1])]
+ reach = pd.Series(end).groupby(np.cumsum(first)).cummax().to_numpy()
+ merged = np.cumsum(first | (start > np.r_[reach[:1], reach[:-1]]))
+ merged_target = target[np.r_[True, merged[1:] != merged[:-1]]]
+ merged_start = pd.Series(start).groupby(merged).min().to_numpy()
+ merged_end = pd.Series(end).groupby(merged).max().to_numpy()
+ # sweep the events of each target in time order, with starts before ends
+ # at the same time so that periods which touch count as coincident at
+ # that instant
+ event_target = np.concatenate((merged_target, merged_target))
+ event_time = np.concatenate((merged_start, merged_end))
+ change = np.repeat([1, -1], len(merged_target))
+ order = np.lexsort((-change, event_time, event_target))
+ event_target, event_time, change = (
+ event_target[order],
+ event_time[order],
+ change[order],
)
- # sweep the events in time order, with starts before ends at the same
- # time so that periods which touch count as coincident at that instant
- events = events.sort_values(["time", "change"], ascending=[True, False])
- active = events["change"].cumsum().to_numpy() >= min_platforms
- was_active = np.concatenate(([False], active[:-1]))
- return list(
- zip(events["time"][active & ~was_active], events["time"][~active & was_active])
+ active = (
+ pd.Series(change).groupby(event_target).cumsum().to_numpy() >= min_platforms
+ )
+ was_active = (
+ np.r_[False, active[:-1]] & np.r_[False, event_target[1:] == event_target[:-1]]
+ )
+ return (
+ event_target[active & ~was_active],
+ event_time[active & ~was_active],
+ event_time[~active & was_active],
)
@@ -99,6 +122,7 @@ def find_coincident_observations(
observations: gpd.GeoDataFrame,
min_platforms: int = 2,
max_time_difference: timedelta = timedelta(0),
+ instantaneous: bool = False,
) -> gpd.GeoDataFrame:
"""
Find coincident observations of points: the periods when at least
@@ -118,6 +142,15 @@ def find_coincident_observations(
that period, comma-separated and paired, in order of their start time.
`epoch` is the midpoint of the coincident period.
+ With `instantaneous`, each observation is reduced to its `epoch` (for a
+ scanning instrument, such as a `ConicalInstrument` or a
+ `PointedInstrument`, the time it samples the point, while its period is
+ the time the point is within its field of regard), so that observations
+ coincide if their epochs differ by at most `max_time_difference`. Each
+ coincident observation then spans the epochs of the observations that
+ contribute to it, from the first to the last (for two observations,
+ `end` less `start` is their time difference).
+
The result has the columns of `aggregate_observations` inputs, so
`aggregate_observations` and `reduce_observations` compute the access
and revisit of coincident observations.
@@ -129,6 +162,8 @@ def find_coincident_observations(
observing at once.
max_time_difference (datetime.timedelta): The maximum time
difference between coincident observations.
+ instantaneous (bool): True, to compare the observations' epochs
+ rather than their periods.
Returns:
geopandas.GeoDataFrame: The data frame of coincident observations,
@@ -144,40 +179,75 @@ def find_coincident_observations(
"observations must be of points (see find_coincident_ground_track "
"for the footprints of ground tracks)"
)
- records = []
- for _, gdf in observations.groupby(_get_target_keys(observations)):
- periods = pd.DataFrame(
- {
- "platform": gdf["satellite"],
- "start": gdf["start"] - half_difference,
- "end": gdf["end"] + half_difference,
- }
- )
- for start, end in _find_coincident_periods(periods, min_platforms):
- # each observation overlapping the period contributes to it
- contributors = gdf[
- (periods["start"] <= end) & (periods["end"] >= start)
- ].sort_values("start", kind="stable")
- pairs = list(
- dict.fromkeys(
- zip(contributors["satellite"], contributors["instrument"])
- )
- )
- records.append(
- {
- "target_hash": gdf["target_hash"].iloc[0],
- "geometry": gdf.geometry.iloc[0],
- "satellite": ", ".join(satellite for satellite, _ in pairs),
- "instrument": ", ".join(instrument for _, instrument in pairs),
- "start": start,
- "epoch": start + (end - start) / 2,
- "end": end,
- }
- )
- if len(records) == 0:
+ gdf = observations.reset_index(drop=True)
+ # targets (in sorted order of their keys) and platforms of the observations
+ target, _ = pd.MultiIndex.from_arrays(_get_target_keys(gdf)).factorize(sort=True)
+ platform, _ = pd.factorize(gdf["satellite"])
+
+ def naive_utc(times: pd.Series) -> np.ndarray:
+ return times.dt.tz_convert("UTC").dt.tz_localize(None).to_numpy()
+
+ # observation times: each period, or each epoch if instantaneous
+ observed_start = gdf["epoch"] if instantaneous else gdf["start"]
+ observed_end = gdf["epoch"] if instantaneous else gdf["end"]
+ start = naive_utc(observed_start - half_difference)
+ end = naive_utc(observed_end + half_difference)
+ period_target, period_start, period_end = _find_coincident_periods(
+ target, platform, start, end, min_platforms
+ )
+ if len(period_target) == 0:
return _get_empty_coincidence_frame()
+ # each observation overlapping a period contributes to it, in order of
+ # its start time
+ candidates = pd.DataFrame(
+ {
+ "target": target,
+ "widened_start": start,
+ "widened_end": end,
+ "start": naive_utc(observed_start),
+ "satellite": gdf["satellite"].to_numpy(),
+ "instrument": gdf["instrument"].to_numpy(),
+ }
+ )
+ contributors = pd.DataFrame(
+ {
+ "period": np.arange(len(period_target)),
+ "target": period_target,
+ "period_start": period_start,
+ "period_end": period_end,
+ }
+ ).merge(candidates, on="target")
+ contributors = contributors[
+ (contributors["widened_start"] <= contributors["period_end"])
+ & (contributors["widened_end"] >= contributors["period_start"])
+ ]
+ if instantaneous:
+ # each coincident observation spans the epochs of its contributors
+ period_start = contributors.groupby("period")["start"].min().to_numpy()
+ period_end = contributors.groupby("period")["start"].max().to_numpy()
+ contributors = (
+ contributors.sort_values(["period", "start"], kind="stable")
+ .drop_duplicates(["period", "satellite", "instrument"])
+ .groupby("period")
+ .agg(satellite=("satellite", ", ".join), instrument=("instrument", ", ".join))
+ )
+ # each target's hash and geometry, from its first observation
+ first = gdf.groupby(target).head(1).set_index(pd.Index(target).unique())
+ start = pd.Series(period_start).dt.tz_localize("UTC")
+ end = pd.Series(period_end).dt.tz_localize("UTC")
return (
- gpd.GeoDataFrame(records, crs=observations.crs)
+ gpd.GeoDataFrame(
+ {
+ "target_hash": first["target_hash"].loc[period_target].to_numpy(),
+ "geometry": first.geometry.loc[period_target].to_numpy(),
+ "satellite": contributors["satellite"].to_numpy(),
+ "instrument": contributors["instrument"].to_numpy(),
+ "start": start,
+ "epoch": start + (end - start) / 2,
+ "end": end,
+ },
+ crs=observations.crs,
+ )
.sort_values("start", kind="stable")
.reset_index(drop=True)
)
diff --git a/src/tatc/analysis/coverage_metrics.py b/src/tatc/analysis/coverage_metrics.py
index 0f7ee9ce..712a5e12 100644
--- a/src/tatc/analysis/coverage_metrics.py
+++ b/src/tatc/analysis/coverage_metrics.py
@@ -8,7 +8,9 @@
from __future__ import annotations
import geopandas as gpd
+import numpy as np
import pandas as pd
+import shapely
def _get_target_keys(gdf: gpd.GeoDataFrame) -> list[pd.Series]:
@@ -60,7 +62,8 @@ def aggregate_observations(observations: gpd.GeoDataFrame) -> gpd.GeoDataFrame:
instant), not the mean of the constituent observations' own epochs.
Per-observation columns that lose their meaning once merged across
satellites and over a potentially much longer period -- e.g. `sat_alt`,
- `sat_az`, `sat_sunlit`, `solar_alt`, `solar_az`, `solar_time` -- are
+ `sat_az`, `sat_sunlit`, `solar_alt`, `solar_az`, `solar_time`,
+ `glint_angle` -- are
intentionally dropped, even if present on `observations`.
Args:
@@ -71,35 +74,63 @@ def aggregate_observations(observations: gpd.GeoDataFrame) -> gpd.GeoDataFrame:
"""
if observations.empty:
return _get_empty_aggregate_frame()
- gdfs = []
- # split into constituent data frames for each target
- for _, gdf in observations.groupby(_get_target_keys(observations)):
- # sort the values by start datetime
- gdf = gdf.sort_values("start")
- # assign the observation group number based on overlapping start/end times
- gdf["obs"] = (gdf["start"] > gdf["end"].shift().cummax()).cumsum()
- # perform the aggregation to group overlapping observations
- gdf = gdf.dissolve(
- "obs",
- aggfunc={
- "target_hash": "first",
- "satellite": ", ".join, # type: ignore
- "instrument": ", ".join, # type: ignore
- "start": "min",
- "end": "max",
- },
- )
- # reassign epoch to the midpoint of the merged period, as a single
- # representative instant, rather than the mean of the constituent
- # observations' own (pre-merge) epochs
- gdf["epoch"] = gdf["start"] + (gdf["end"] - gdf["start"]) / 2
- # compute access and revisit metrics
- gdf["access"] = gdf["end"] - gdf["start"]
- gdf["revisit"] = gdf["start"] - gdf["end"].shift()
- # append to the list of data frames
- gdfs.append(gdf)
- # return a concatenated data frame and re-index
- return pd.concat(gdfs).reset_index(drop=True)
+ # targets (in sorted order of their keys), with each target's observations
+ # sorted by start (stably), for all targets together
+ target, _ = pd.MultiIndex.from_arrays(_get_target_keys(observations)).factorize(
+ sort=True
+ )
+ start = observations["start"].dt.tz_convert("UTC").dt.tz_localize(None).to_numpy()
+ end = observations["end"].dt.tz_convert("UTC").dt.tz_localize(None).to_numpy()
+ order = np.lexsort((start, target))
+ gdf = observations.iloc[order].reset_index(drop=True)
+ target, start, end = target[order], start[order], end[order]
+ # assign the observation group number based on overlapping start/end times:
+ # a group starts with each target, and with each observation starting after
+ # every earlier observation of the target has ended
+ first = np.concatenate([[True], target[1:] != target[:-1]])
+ reach = pd.Series(end).groupby(target).cummax().to_numpy()
+ group = np.cumsum(first | (start > np.concatenate([reach[:1], reach[:-1]]))) - 1
+ grouped = gdf.groupby(group, sort=False)
+ # the geometry of each group: the union of its observations' (for a region,
+ # the part of it observed during the period)
+ geometry = grouped.geometry.first().to_numpy()
+ counts = np.bincount(group)
+ members = np.split(gdf.geometry.to_numpy(), np.cumsum(counts)[:-1])
+ for g in np.flatnonzero(counts > 1):
+ geometry[g] = shapely.union_all(members[g])
+ aggregated = gpd.GeoDataFrame(
+ {
+ "target_hash": grouped["target_hash"].first(),
+ "satellite": grouped["satellite"]
+ .agg(", ".join)
+ .astype(gdf["satellite"].dtype),
+ "instrument": grouped["instrument"]
+ .agg(", ".join)
+ .astype(gdf["instrument"].dtype),
+ "start": grouped["start"].min(),
+ "end": grouped["end"].max(),
+ },
+ geometry=gpd.GeoSeries(
+ geometry, index=grouped["start"].min().index, crs=observations.crs
+ ),
+ )
+ aggregated = aggregated[
+ ["geometry", "target_hash", "satellite", "instrument", "start", "end"]
+ ]
+ # reassign epoch to the midpoint of the merged period, as a single
+ # representative instant, rather than the mean of the constituent
+ # observations' own (pre-merge) epochs
+ aggregated["epoch"] = (
+ aggregated["start"] + (aggregated["end"] - aggregated["start"]) / 2
+ )
+ # compute access and revisit metrics (the revisit of each target's first
+ # period is undefined)
+ aggregated["access"] = aggregated["end"] - aggregated["start"]
+ group_target = target[np.concatenate([[True], group[1:] != group[:-1]])]
+ revisit = aggregated["start"] - aggregated["end"].shift()
+ revisit[np.concatenate([[True], group_target[1:] != group_target[:-1]])] = pd.NaT
+ aggregated["revisit"] = revisit
+ return aggregated.reset_index(drop=True)
def _get_empty_reduce_frame() -> gpd.GeoDataFrame:
@@ -172,7 +203,9 @@ def grid_observations(
Both access (a per-event duration) and revisit (a time-between-events
duration, i.e. the reciprocal of a sampling rate) use a sample-weighted
mean -- arithmetic for access, harmonic for revisit, since revisit
- needs to be averaged as a rate to stay a representative statistic.
+ needs to be averaged as a rate to stay a representative statistic. The
+ revisit is averaged over the points with a revisit (at least two
+ samples), and is undefined (NaT) for a cell with none.
Args:
reduced_observations (geopandas.GeoDataFrame): The reduced observations.
@@ -196,9 +229,11 @@ def grid_observations(
# with a dict of {column: function} only ever hands a custom callable
# its own column's Series, never a sibling column like "samples" needed
# to compute a weighted statistic within the callable. The weighted
- # harmonic mean of revisit is sum(samples) / sum(samples/revisit).
+ # harmonic mean of revisit is sum(samples) / sum(samples/revisit), over
+ # the points with a revisit.
gdf["access_x_samples"] = gdf["access"] * gdf["samples"]
- gdf["samples_over_revisit"] = gdf["samples"] / gdf["revisit"]
+ gdf["revisit_samples"] = gdf["samples"].where(gdf["revisit"].notna(), 0)
+ gdf["samples_over_revisit"] = (gdf["samples"] / gdf["revisit"]).fillna(0)
gdf = (
cells.sjoin(gdf, how="inner", predicate="contains")
.dissolve(
@@ -206,6 +241,7 @@ def grid_observations(
aggfunc={
"samples": "sum",
"access_x_samples": "sum",
+ "revisit_samples": "sum",
"samples_over_revisit": "sum",
},
)
@@ -214,8 +250,12 @@ def grid_observations(
# finish the aggregation: sample-weighted arithmetic mean for access,
# sample-weighted harmonic mean for revisit
gdf["access"] = gdf["access_x_samples"] / gdf["samples"]
- gdf["revisit"] = gdf["samples"] / gdf["samples_over_revisit"]
- gdf = gdf.drop(columns=["access_x_samples", "samples_over_revisit"])
+ gdf["revisit"] = (gdf["revisit_samples"] / gdf["samples_over_revisit"]).where(
+ gdf["samples_over_revisit"] > 0
+ )
+ gdf = gdf.drop(
+ columns=["access_x_samples", "revisit_samples", "samples_over_revisit"]
+ )
# convert access and revisit from numeric values after aggregation
gdf["access"] = pd.to_timedelta(gdf["access"], unit="s")
gdf["revisit"] = pd.to_timedelta(gdf["revisit"], unit="s")
diff --git a/src/tatc/analysis/feature_sampling.py b/src/tatc/analysis/feature_sampling.py
new file mode 100644
index 00000000..3adcbd30
--- /dev/null
+++ b/src/tatc/analysis/feature_sampling.py
@@ -0,0 +1,205 @@
+"""
+Methods to sample features: regions that exist for a period of time, such as
+the storms or cloud systems of a nature run in an observing system
+simulation experiment (OSSE), by the footprints of satellites' instruments.
+
+@author: Paul T. Grogan
+"""
+
+from __future__ import annotations
+
+from datetime import datetime
+
+import geopandas as gpd
+import numpy as np
+import pandas as pd
+import shapely
+from pyproj import Geod
+from skyfield.api import wgs84
+
+from ..schemas import Satellite
+from ..utils.time import _to_time
+from .check import _check_satellites
+from .ground_track import collect_ground_track
+
+_GEOD = Geod(ellps="WGS84")
+
+
+def _get_empty_feature_observations() -> gpd.GeoDataFrame:
+ """
+ Gets an empty data frame for feature observation results.
+
+ Returns:
+ geopandas.GeoDataFrame: Empty data frame.
+ """
+ columns = {
+ "feature": pd.Series([], dtype="int"),
+ "satellite": pd.Series([], dtype="str"),
+ "instrument": pd.Series([], dtype="str"),
+ "time": pd.Series([], dtype="datetime64[ns, utc]"),
+ "viewed_fraction": pd.Series([], dtype="float"),
+ "viewed_area": pd.Series([], dtype="float"),
+ "sat_alt": pd.Series([], dtype="float"),
+ "sat_az": pd.Series([], dtype="float"),
+ "sat_range": pd.Series([], dtype="float"),
+ "sat_height": pd.Series([], dtype="float"),
+ "geometry": pd.Series([], dtype="object"),
+ }
+ return gpd.GeoDataFrame(columns, crs="EPSG:4326")
+
+
+def _check_features(features: gpd.GeoDataFrame) -> gpd.GeoDataFrame:
+ """
+ Checks features: a data frame of geometries with the `start` and `end`
+ of the period in which each exists.
+
+ Args:
+ features (geopandas.GeoDataFrame): The features.
+
+ Returns:
+ geopandas.GeoDataFrame: the features, in longitude/latitude coordinates.
+ """
+ if not isinstance(features, gpd.GeoDataFrame):
+ raise TypeError(
+ f"features must be a GeoDataFrame, not a {type(features).__name__}"
+ )
+ for column in ("start", "end"):
+ if column not in features.columns:
+ raise ValueError(f"features must have a '{column}' column")
+ if not isinstance(features[column].dtype, pd.DatetimeTZDtype):
+ raise ValueError(f"features '{column}' must be timezone-aware times")
+ if features.crs is not None and not features.crs.equals("EPSG:4326"):
+ features = features.to_crs("EPSG:4326")
+ return features
+
+
+def collect_feature_observations(
+ features: gpd.GeoDataFrame,
+ satellites: Satellite | list[Satellite],
+ times: list[datetime],
+ instrument_index: int | None = None,
+) -> gpd.GeoDataFrame:
+ """
+ Collect the observations of features: regions that exist for a period
+ of time (between the `start` and `end` of each feature), such as the
+ storms or cloud systems of a nature run in an observing system
+ simulation experiment (OSSE). The footprint of each instrument at each
+ time (see `tatc.analysis.ground_track.collect_ground_track`) samples the
+ features that exist at that time (from their `start`, inclusive, to
+ their `end`, exclusive). The footprints should tile each swath, for
+ example with an along-track field of view tailored to the time step
+ (see `tatc.utils.compute_along_track_field_of_view`).
+
+ Each observation is one satellite's (and instrument's) view of a
+ feature: the part of the feature within the valid footprints of all
+ times at which the feature exists, which is only part of it if the
+ feature extends beyond the swath. Its time is that of the footprint
+ that covers most of the feature, and the viewing geometry (the
+ satellite's elevation angle `sat_alt` and azimuth `sat_az`, seen from
+ the centroid of the viewed part, its slant range `sat_range`, and its
+ height above the WGS 84 ellipsoid `sat_height`) is that at this time.
+ For example, the size of a footprint at the viewed part (from its size
+ at nadir) grows with `sat_range / sat_height` along the line of sight
+ and, across it, by the secant of the zenith angle, `90 - sat_alt`.
+
+ Args:
+ features (geopandas.GeoDataFrame): The features: their geometries,
+ and the `start` and `end` (timezone-aware) of the period in
+ which each exists.
+ satellites (Satellite | list[Satellite]): The observing satellite(s).
+ times (list[datetime.datetime]): The times at which to sample.
+ instrument_index (int | None): The index of the observing instrument
+ in each satellite, or `None` (default) for every instrument
+ of each satellite.
+
+ Returns:
+ geopandas.GeoDataFrame: The data frame of observations: the feature
+ (its index label in `features`), satellite, instrument, time, the
+ viewed part (geometry), its fraction of the feature's area
+ (`viewed_fraction`), its area on the WGS 84 ellipsoid (square
+ meters, `viewed_area`), and the viewing geometry (degrees and
+ meters), sorted by feature and time.
+ """
+ features = _check_features(features)
+ satellites = _check_satellites(satellites)
+ if len(features) == 0 or len(times) == 0:
+ return _get_empty_feature_observations()
+ # the footprints, clipped to the bounds of the features
+ mask = shapely.box(*features.total_bounds)
+ track = collect_ground_track(
+ satellites, times, instrument_index=instrument_index, mask=mask
+ )
+ track = track[track.valid_obs].reset_index(drop=True)
+ if len(track) == 0:
+ return _get_empty_feature_observations()
+ footprints = shapely.force_2d(track.geometry.to_numpy())
+ shapes = features.geometry.to_numpy()
+ # the pieces: each feature's overlap with each footprint while it exists
+ feature, footprint = shapely.STRtree(footprints).query(
+ shapes, predicate="intersects"
+ )
+ time = pd.DatetimeIndex(track["time"])
+ exists = np.asarray(
+ (pd.DatetimeIndex(features["start"])[feature] <= time[footprint])
+ & (time[footprint] < pd.DatetimeIndex(features["end"])[feature])
+ )
+ feature, footprint = feature[exists], footprint[exists]
+ pieces = pd.DataFrame(
+ {
+ "feature": feature,
+ "satellite": track["satellite"].to_numpy()[footprint],
+ "instrument": track["instrument"].to_numpy()[footprint],
+ "time": time[footprint],
+ "geometry": shapely.intersection(shapes[feature], footprints[footprint]),
+ }
+ )
+ pieces["area"] = shapely.area(pieces["geometry"].to_numpy())
+ pieces = pieces[pieces["area"] > 0]
+ if len(pieces) == 0:
+ return _get_empty_feature_observations()
+ # each observation: the union of the pieces of a feature viewed by a
+ # satellite's instrument, at the time of the piece with the largest area
+ observations = (
+ pieces.sort_values("area", ascending=False, kind="stable")
+ .groupby(["feature", "satellite", "instrument"], sort=False)
+ .agg(time=("time", "first"), geometry=("geometry", shapely.union_all))
+ .reset_index()
+ )
+ viewed = observations["geometry"].to_numpy()
+ shape = shapes[observations["feature"].to_numpy()]
+ observations["viewed_fraction"] = np.minimum(
+ 1, shapely.area(viewed) / shapely.area(shape)
+ )
+ observations["viewed_area"] = [
+ abs(_GEOD.geometry_area_perimeter(geometry)[0]) for geometry in viewed
+ ]
+ # the viewing geometry from the centroid of the viewed part
+ centroid = shapely.centroid(viewed)
+ longitude, latitude = shapely.get_x(centroid), shapely.get_y(centroid)
+ for column in ("sat_alt", "sat_az", "sat_range", "sat_height"):
+ observations[column] = np.nan
+ orbits = {satellite.name: satellite.orbit.to_gp_orbit() for satellite in satellites}
+ for name, group in observations.groupby("satellite"):
+ index = group.index.to_numpy()
+ orbit_track = orbits[name].get_orbit_track_at_time(
+ _to_time(list(group["time"]))
+ )
+ target = wgs84.latlon(latitude[index], longitude[index])
+ altitude, azimuth, distance = (orbit_track - target.at(orbit_track.t)).altaz()
+ observations.loc[index, "sat_alt"] = np.atleast_1d(altitude.degrees)
+ observations.loc[index, "sat_az"] = np.atleast_1d(azimuth.degrees)
+ observations.loc[index, "sat_range"] = np.atleast_1d(distance.m)
+ observations.loc[index, "sat_height"] = np.atleast_1d(
+ wgs84.height_of(orbit_track).m
+ )
+ # the feature's index label in the features
+ observations["feature"] = features.index.to_numpy()[observations["feature"]]
+ observations["time"] = pd.DatetimeIndex(observations["time"]).as_unit("ns")
+ observations = gpd.GeoDataFrame(
+ observations[list(_get_empty_feature_observations().columns)],
+ geometry="geometry",
+ crs="EPSG:4326",
+ )
+ return observations.sort_values(["feature", "time"], kind="stable").reset_index(
+ drop=True
+ )
diff --git a/src/tatc/analysis/ground_track.py b/src/tatc/analysis/ground_track.py
index 885a5ee1..1f6d6877 100644
--- a/src/tatc/analysis/ground_track.py
+++ b/src/tatc/analysis/ground_track.py
@@ -19,6 +19,7 @@
from ..constants import de421
from ..schemas import AllInstruments, PointedInstrument, Satellite
from ..utils.geometry import split_polygon
+from ..utils.glint import compute_glint_angle
from ..utils.time import _index_orbit_track, _to_time
from .check import (
_check_satellite,
@@ -163,6 +164,7 @@ def collect_ground_track(
sat_altaz (bool): `True` to include satellite altitude/azimuth angles
for the sub-satellite point.
solar_altaz (bool): `True` to include solar altitude/azimuth angles
+ and the glint angle (see `tatc.utils.compute_glint_angle`)
for the sub-satellite point.
Returns:
@@ -205,7 +207,7 @@ def _collect_ground_track(
and poles (see `_get_mask_geometry`).
"""
# select the observing instrument
- instrument = satellite.instruments[instrument_index]
+ instrument = satellite.get_instrument(instrument_index)
if mask is not None and len(times) > 1:
# propagate orbit only where the footprint intersects the mask,
# reusing the footprints computed to cull it
@@ -249,6 +251,8 @@ def _collect_ground_track(
)
track["solar_alt"] = solar_altaz_data[0].degrees # type: ignore
track["solar_az"] = solar_altaz_data[1].degrees # type: ignore
+ # append glint angle column (at the footprint center)
+ track["glint_angle"] = np.atleast_1d(compute_glint_angle(orbit_track, target))
if mask is not None:
track = gpd.clip(track, mask)
@@ -288,12 +292,12 @@ def compute_ground_track(
_check_satellite(satellite)
track = collect_ground_track(satellite, times, instrument_index, elevation, mask)
if not track.empty:
- # assign orbit identifier
+ # assign orbit identifier, from the period of the element that
+ # propagates the orbit at each time (see `get_element_index`)
+ orbit = satellite.orbit.to_gp_orbit()
track["orbit_id"] = [
(time - times[0])
- // satellite.orbit.to_gp_orbit()
- .get_closest_element(time)
- .get_orbit_period()
+ // orbit.elements[orbit.get_element_index(time)].get_orbit_period()
for time in track.time
]
# filter to valid observations and dissolve
@@ -333,7 +337,8 @@ def collect_ground_pixels(
the propagated orbit to the (buffered) region of interest,
improving performance for small areas.
sat_altaz (bool): `True` to include satellite altitude/azimuth angles.
- solar_altaz (bool): `True` to include solar altitude/azimuth angles.
+ solar_altaz (bool): `True` to include solar altitude/azimuth angles
+ and the glint angle (see `tatc.utils.compute_glint_angle`).
Returns:
geopandas.GeoDataFrame: The data frame of collected ground pixels results:
@@ -375,7 +380,7 @@ def _collect_ground_pixels(
and poles (see `_get_mask_geometry`).
"""
# select the observing instrument
- instrument = satellite.instruments[instrument_index]
+ instrument = satellite.get_instrument(instrument_index)
if not isinstance(instrument, PointedInstrument) or not instrument.is_rectangular:
raise ValueError(
"Ground pixels are only compatible with rectangular PointedInstrument instances"
@@ -448,6 +453,18 @@ def _collect_ground_pixels(
]
gdf["solar_alt"] = [altaz[0].degrees for altaz in solar_altaz_data] # type: ignore
gdf["solar_az"] = [altaz[1].degrees for altaz in solar_altaz_data] # type: ignore
+ # append glint angle column (at each pixel)
+ gdf["glint_angle"] = [
+ float(
+ compute_glint_angle(
+ orbit_track[i],
+ wgs84.latlon(
+ record["geometry"].y, record["geometry"].x, record["geometry"].z
+ ),
+ )
+ )
+ for i, record in indexed_records
+ ]
if mask is not None:
gdf = gpd.clip(gdf, mask)
diff --git a/src/tatc/analysis/latency_sampling.py b/src/tatc/analysis/latency_sampling.py
index 62b2995c..56b52e85 100644
--- a/src/tatc/analysis/latency_sampling.py
+++ b/src/tatc/analysis/latency_sampling.py
@@ -90,11 +90,11 @@ def collect_downlinks(
]
# build the dataframe
if len(records) > 0:
- gdf = (
- gpd.GeoDataFrame(records, crs="EPSG:4326")
- .sort_values("start")
- .reset_index(drop=True)
- )
+ gdf = gpd.GeoDataFrame(records, crs="EPSG:4326")
+ # times in nanoseconds (as in the empty frame and the observations)
+ for column in ["start", "end", "epoch"]:
+ gdf[column] = gdf[column].dt.as_unit("ns")
+ gdf = gdf.sort_values("start").reset_index(drop=True)
else:
gdf = _get_empty_downlinks_frame()
return gdf
@@ -177,6 +177,10 @@ def compute_latencies(
"end": "downlink_end",
}
)
+ # merge keys must share a unit (frames may come from other sources, such as files)
+ obs["end"] = obs["end"].dt.as_unit("ns")
+ for column in ["downlink_start", "downlinked", "downlink_end"]:
+ contacts[column] = contacts[column].dt.as_unit("ns")
# pair each observation with the first downlink that starts after it ends
obs = pd.merge_asof(
obs,
diff --git a/src/tatc/analysis/orbit_track.py b/src/tatc/analysis/orbit_track.py
index 06f96ad6..af091964 100644
--- a/src/tatc/analysis/orbit_track.py
+++ b/src/tatc/analysis/orbit_track.py
@@ -188,7 +188,7 @@ def _collect_orbit_track(
`collect_orbit_track`).
"""
# select the observing instrument
- instrument = satellite.instruments[instrument_index]
+ instrument = satellite.get_instrument(instrument_index)
# propagate orbit
orbit_track = satellite.orbit.to_gp_orbit().get_orbit_track_at_time(t)
# geodetic (WGS84) position of the satellite itself (not the zero-elevation
diff --git a/src/tatc/analysis/point_sampling.py b/src/tatc/analysis/point_sampling.py
index 6f006a77..9130fa28 100644
--- a/src/tatc/analysis/point_sampling.py
+++ b/src/tatc/analysis/point_sampling.py
@@ -7,6 +7,7 @@
from __future__ import annotations
+from collections.abc import Callable
from datetime import datetime, timedelta, timezone
import geopandas as gpd
@@ -14,11 +15,18 @@
import pandas as pd
from shapely import geometry as geo
from skyfield.api import wgs84
-from skyfield.toposlib import GeographicPosition
+from skyfield.framelib import itrs
from ..constants import EARTH_POLAR_RADIUS, timescale
-from ..schemas import ConicalInstrument, Point, PointedInstrument, Satellite
-from ..utils.geometry import _get_point_coordinates, hash_geometry
+from ..schemas import (
+ ConicalInstrument,
+ GeneralPerturbationsOrbit,
+ Instrument,
+ Point,
+ PointedInstrument,
+ Satellite,
+)
+from ..utils.geometry import _get_point_coordinates, _hash_geometries
from ..utils.observation import (
compute_max_access_time,
compute_min_elevation_angle,
@@ -26,10 +34,11 @@
from ..utils.orbital import compute_apoapsis_radius
from ..utils.projection import (
ViewGeometry,
+ _compute_line_of_sight,
+ _compute_nadir_axes,
_compute_view_frame,
- compute_cone_and_azimuth,
)
-from ..utils.computation import TimeRequest, _run, _run_together
+from ..utils.computation import TimeRequest, _run
from ..utils.time import _index_orbit_track, _to_time, _to_time_from_offsets
from .check import (
_check_satellite,
@@ -41,10 +50,10 @@
_warn_low_perigees,
)
from .sampling import (
+ _assemble_periods,
_build_observation_frame,
_find_crossings,
_get_empty_coverage_frame,
- _refine_access_periods,
)
@@ -270,38 +279,606 @@ def _compute_access_periods(
)
-def _get_view_crossing_times(
- target: GeographicPosition,
+_SCREEN_STEP = 60.0
+"""
+The maximum time step (seconds) of the coarse orbit track from which the
+passes of many points are screened together (see `_collect_batch_observations`).
+"""
+_SCREEN_MARGIN = 1.0
+"""
+The angle (degrees) added to the radius about the sub-satellite point within
+which points are screened, for the curvature of the sub-satellite path between
+samples and the difference between the geodetic and geocentric verticals.
+"""
+_PART_DURATION = 600.0
+"""
+The maximum duration (seconds) of the parts into which a screened window is
+divided, so that the residual has few extrema within each part.
+"""
+_PART_SAMPLES = 11
+"""The number of samples of the residual in each part of a screened window."""
+_SCREEN_BLOCK = 64
+"""The number of time steps screened against all points at once."""
+_BLOCK_POINT_DAYS = 10000
+"""
+The number of point-days (points times days of the analysis period) whose
+observations are refined together, which bounds the memory of the vectorized
+stages.
+"""
+
+
+def _get_screening_angle(
+ max_radius: float, min_radius: float, half_angle: float
+) -> float:
+ """
+ Get the Earth central angle (degrees) from the sub-satellite point within
+ which a point can lie within a field of regard: on a sphere of the
+ minimum radius (the smallest distance of a point from the Earth's
+ center), seen from the maximum radius (of the satellite), at a nadir
+ angle of at most the half angle, and above the horizon. The angle grows
+ with the satellite's radius and decreases with the point's, so it bounds
+ the angle of every point and satellite position.
+
+ Args:
+ max_radius (float): The maximum radius (meters) of the satellite.
+ min_radius (float): The minimum radius (meters) of the points.
+ half_angle (float): The half angle (degrees) of the field of regard.
+
+ Returns:
+ float: the Earth central angle (degrees).
+ """
+ horizon = np.arccos(min_radius / max_radius)
+ if half_angle >= 90:
+ return float(np.degrees(horizon))
+ ratio = max_radius / min_radius * np.sin(np.radians(half_angle))
+ if ratio >= 1:
+ return float(np.degrees(horizon))
+ return float(np.degrees(min(np.arcsin(ratio) - np.radians(half_angle), horizon)))
+
+
+def _screen_windows(
+ directions: np.ndarray, units: np.ndarray, radius: np.ndarray
+) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
+ """
+ Screen the windows in which points may be observed: the runs of
+ consecutive time steps in which a point lies within an Earth central
+ angle of the sub-satellite path. The path between two samples is bounded
+ by the circle about their mean direction whose radius is half of the
+ angle between them, so a point is screened in a step if its angle from
+ the mean direction is at most the radius plus that half angle.
+
+ Args:
+ directions (numpy.ndarray): The unit directions of the satellite from
+ the Earth's center at each sample, shape (3, M).
+ units (numpy.ndarray): The unit directions of the points from the
+ Earth's center, shape (3, N).
+ radius (numpy.ndarray): The Earth central angle (radians) of each
+ point, shape (N,).
+
+ Returns:
+ tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]: the point, first
+ step, and last step of each window (step `i` spans samples `i`
+ and `i + 1`), sorted by point and first step.
+ """
+ middle = directions[:, :-1] + directions[:, 1:]
+ middle = middle / np.linalg.norm(middle, axis=0)
+ half_step = (
+ np.arccos(
+ np.clip(np.sum(directions[:, :-1] * directions[:, 1:], axis=0), -1, 1)
+ )
+ / 2
+ )
+ points, steps = [], []
+ for block in range(0, middle.shape[1], _SCREEN_BLOCK):
+ m = middle[:, block : block + _SCREEN_BLOCK]
+ # element-wise, so that each point's result does not depend on the others
+ cosine = (
+ units[0][:, None] * m[0]
+ + units[1][:, None] * m[1]
+ + units[2][:, None] * m[2]
+ )
+ hits = cosine >= np.cos(
+ np.minimum(
+ np.pi, radius[:, None] + half_step[block : block + _SCREEN_BLOCK]
+ )
+ )
+ point, step = np.nonzero(hits)
+ points.append(point)
+ steps.append(step + block)
+ point, step = np.concatenate(points), np.concatenate(steps)
+ order = np.lexsort((step, point))
+ point, step = point[order], step[order]
+ if len(point) == 0:
+ return point, step, step
+ first = np.ones(len(point), dtype=bool)
+ first[1:] = (point[1:] != point[:-1]) | (step[1:] != step[:-1] + 1)
+ last = np.ones(len(point), dtype=bool)
+ last[:-1] = first[1:]
+ return point[first], step[first], step[last]
+
+
+def _find_hidden_minima(
+ evaluate: Callable[[np.ndarray, np.ndarray], TimeRequest],
+ samples: np.ndarray,
+ values: np.ndarray,
+ index: np.ndarray,
+) -> TimeRequest:
+ """
+ Find the minima of a residual between its samples that may be negative
+ although every sample near them is positive (as when a point grazes a
+ narrow field of regard between samples), as a computation (see
+ `tatc.utils.computation.TimeRequest`). Each local minimum of the samples
+ of a part that is positive but no greater than the larger change of the
+ residual to its neighboring samples (which bounds how far the residual
+ can dip between them) is refined by golden-section search between its
+ neighbors, stopping when a negative residual is found.
+
+ Args:
+ evaluate (Callable[[numpy.ndarray, numpy.ndarray], TimeRequest]): The
+ computation of the residual at times (seconds) for the indices.
+ samples (numpy.ndarray): The sample times (seconds) of each part,
+ shape (P, K).
+ values (numpy.ndarray): The residual at the samples, shape (P, K).
+ index (numpy.ndarray): The index of the point of each part, shape (P,).
+
+ Returns:
+ TimeRequest: the computation of the part, time (seconds), and
+ residual of each negative minimum found (tuple[numpy.ndarray,
+ numpy.ndarray, numpy.ndarray]).
+ """
+ padded = np.pad(values, ((0, 0), (1, 1)), constant_values=np.inf)
+ left, right = padded[:, :-2], padded[:, 2:]
+ change = np.maximum(
+ np.where(np.isfinite(left), left - values, 0),
+ np.where(np.isfinite(right), right - values, 0),
+ )
+ part, k = np.nonzero(
+ (values > 0) & (values <= left) & (values <= right) & (values <= change)
+ )
+ if len(part) == 0:
+ empty = np.array([], dtype=float)
+ return np.array([], dtype=int), empty, empty
+ count = samples.shape[1]
+ lower = samples[part, np.maximum(k - 1, 0)]
+ upper = samples[part, np.minimum(k + 1, count - 1)]
+ point = index[part]
+ ratio = (np.sqrt(5) - 1) / 2
+ c, d = upper - ratio * (upper - lower), lower + ratio * (upper - lower)
+ f_c = yield from evaluate(c, point)
+ f_d = yield from evaluate(d, point)
+ found_time = np.where(f_c <= f_d, c, d)
+ found_value = np.minimum(f_c, f_d)
+ for _ in range(40):
+ active = (found_value > 0) & (upper - lower > 1e-3)
+ if not np.any(active):
+ break
+ keep_left = f_c <= f_d
+ # shrink each bracket toward its smaller interior value
+ upper = np.where(active & keep_left, d, upper)
+ lower = np.where(active & ~keep_left, c, lower)
+ x = np.where(
+ keep_left, upper - ratio * (upper - lower), lower + ratio * (upper - lower)
+ )
+ f_x = np.full(len(x), np.inf)
+ f_x[active] = yield from evaluate(x[active], point[active])
+ c, f_c, d, f_d = (
+ np.where(active & keep_left, x, np.where(active, d, c)),
+ np.where(active & keep_left, f_x, np.where(active, f_d, f_c)),
+ np.where(active & keep_left, c, np.where(active, x, d)),
+ np.where(active & keep_left, f_c, np.where(active, f_x, f_d)),
+ )
+ better = f_x < found_value
+ found_time = np.where(better, x, found_time)
+ found_value = np.where(better, f_x, found_value)
+ negative = found_value <= 0
+ return part[negative], found_time[negative], found_value[negative]
+
+
+def _merge_window_periods(
+ parts: list[list[tuple[float, float]]], window: np.ndarray
+) -> list[list[tuple[float, float]]]:
+ """
+ Merge the periods of the consecutive parts of each window that meet at a
+ boundary between parts.
+
+ Args:
+ parts (list[list[tuple[float, float]]]): The periods (seconds) of each
+ part, in order of window and time.
+ window (numpy.ndarray): The window of each part.
+
+ Returns:
+ list[list[tuple[float, float]]]: the periods of each window.
+ """
+ windows: list[list[tuple[float, float]]] = [
+ [] for _ in range(int(window.max()) + 1 if len(window) else 0)
+ ]
+ for periods, w in zip(parts, window):
+ merged = windows[w]
+ for left, right in periods:
+ if merged and merged[-1][1] == left:
+ merged[-1] = (merged[-1][0], right)
+ else:
+ merged.append((left, right))
+ return windows
+
+
+def _refine_window_periods(
+ residual: Callable[[np.ndarray, np.ndarray], TimeRequest],
+ window_point: np.ndarray,
+ window_lower: np.ndarray,
+ window_upper: np.ndarray,
+) -> TimeRequest:
+ """
+ Refine the periods in which a residual (of a time and a point) is not
+ positive within screened windows, as a computation (see
+ `tatc.utils.computation.TimeRequest`). Each window is divided into parts
+ of at most `_PART_DURATION`, each part is sampled at `_PART_SAMPLES`
+ times, minima of the residual between samples are found (see
+ `_find_hidden_minima`), each change of sign is refined to a millisecond
+ (see `tatc.analysis.sampling._find_crossings`), and the periods of
+ consecutive parts that meet are merged.
+
+ Args:
+ residual (Callable[[numpy.ndarray, numpy.ndarray], TimeRequest]): The
+ computation of the residual at times (seconds) for the points.
+ window_point (numpy.ndarray): The point of each window.
+ window_lower (numpy.ndarray): The start of each window (seconds).
+ window_upper (numpy.ndarray): The end of each window (seconds).
+
+ Returns:
+ TimeRequest: the computation of the point, start, and end (seconds)
+ of each period (tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]).
+ """
+ counts = np.maximum(
+ 1, np.ceil((window_upper - window_lower) / _PART_DURATION).astype(int)
+ )
+ window = np.repeat(np.arange(len(counts)), counts)
+ offset = np.arange(len(window)) - np.repeat(np.cumsum(counts) - counts, counts)
+ width = (window_upper - window_lower)[window] / counts[window]
+ # each part ends exactly where the next begins, so that their periods merge
+ part_lower = window_lower[window] + offset * width
+ part_upper = np.where(
+ offset == counts[window] - 1,
+ window_upper[window],
+ window_lower[window] + (offset + 1) * width,
+ )
+ part_point = window_point[window]
+ samples = part_lower[:, None] + (part_upper - part_lower)[:, None] * np.linspace(
+ 0, 1, _PART_SAMPLES
+ )
+ samples[:, -1] = part_upper
+ values = np.reshape(
+ (yield from residual(samples.ravel(), np.repeat(part_point, _PART_SAMPLES))),
+ samples.shape,
+ )
+ part, dip_time, dip_value = yield from _find_hidden_minima(
+ residual, samples, values, part_point
+ )
+ sample_list, value_list = list(samples), list(values)
+ for p in np.unique(part):
+ times = np.concatenate([sample_list[p], dip_time[part == p]])
+ order = np.argsort(times, kind="stable")
+ sample_list[p] = times[order]
+ value_list[p] = np.concatenate([value_list[p], dip_value[part == p]])[order]
+ brackets = [
+ (i, j)
+ for i, value in enumerate(value_list)
+ for j in np.flatnonzero((value[:-1] <= 0) != (value[1:] <= 0))
+ ]
+ crossings = {}
+ if len(brackets) > 0:
+ bracket_point = part_point[[i for i, _ in brackets]]
+ crossing, _ = yield from _find_crossings(
+ lambda seconds, index: residual(seconds, bracket_point[index]),
+ np.array([sample_list[i][j] for i, j in brackets]),
+ np.array([sample_list[i][j + 1] for i, j in brackets]),
+ )
+ crossings = dict(zip(brackets, crossing))
+ window_periods = _merge_window_periods(
+ _assemble_periods(sample_list, value_list, crossings), window
+ )
+ period_point = np.array(
+ [window_point[w] for w, periods in enumerate(window_periods) for _ in periods],
+ dtype=int,
+ )
+ lower = np.array([left for periods in window_periods for left, _ in periods])
+ upper = np.array([right for periods in window_periods for _, right in periods])
+ return period_point, lower, upper
+
+
+def _get_batch_epochs(
+ orbit: GeneralPerturbationsOrbit,
+ instrument: Instrument,
+ xyz: np.ndarray,
+ period_point: np.ndarray,
+ lower: np.ndarray,
+ upper: np.ndarray,
+ reference: pd.Timestamp,
+) -> TimeRequest:
+ """
+ Get the observation epochs of periods, as a computation (see
+ `tatc.utils.computation.TimeRequest`): the time a pointed instrument's
+ view sweeps over the point (see `_get_batch_view_crossing_times`), the
+ times the point crosses a conical instrument's cone (see
+ `_get_batch_cone_crossing_times`), or otherwise the period's midpoint.
+
+ Args:
+ orbit (GeneralPerturbationsOrbit): The orbit.
+ instrument (Instrument): The observing instrument.
+ xyz (numpy.ndarray): The Earth-fixed coordinates (meters) of the
+ points, shape (3, N).
+ period_point (numpy.ndarray): The point of each period.
+ lower (numpy.ndarray): The start of each period (seconds).
+ upper (numpy.ndarray): The end of each period (seconds).
+ reference (pandas.Timestamp): The reference time of the seconds.
+
+ Returns:
+ TimeRequest: the computation of the point, period, and time
+ (seconds) of each epoch (tuple[numpy.ndarray, numpy.ndarray,
+ numpy.ndarray]).
+ """
+ if isinstance(instrument, PointedInstrument):
+ epochs = yield from _get_batch_view_crossing_times(
+ orbit, instrument, xyz, period_point, lower, upper, reference
+ )
+ return period_point, np.arange(len(lower)), epochs
+ if isinstance(instrument, ConicalInstrument):
+ epoch_period, epochs = yield from _get_batch_cone_crossing_times(
+ orbit, instrument, xyz, period_point, lower, upper, reference
+ )
+ return period_point[epoch_period], epoch_period, epochs
+ return period_point, np.arange(len(lower)), (lower + upper) / 2
+
+
+def _collect_batch_observations(
+ points: list[Point | geo.Point],
satellite: Satellite,
+ start: datetime,
+ end: datetime,
+ instrument_index: int = 0,
+ omit_solar: bool = True,
+) -> TimeRequest:
+ """
+ Collect single satellite observations of many points together, as a
+ computation (see `collect_observations` and
+ `tatc.utils.computation.TimeRequest`). Each point's observations do not
+ depend on the other points (to within a microsecond), but each stage is
+ vectorized across the points:
+
+ 1. the satellite's orbit is propagated once, at steps of at most
+ `_SCREEN_STEP`, and the windows in which each point may lie within the
+ field of regard are screened from the angle between the point and
+ the sub-satellite path (see `_screen_windows`);
+ 2. each window is divided into parts, each part is sampled, and the
+ periods in which the point lies within the field of regard (and the
+ satellite is above the minimum elevation angle) are refined from the
+ changes of sign between samples and from minima between them (see
+ `_find_hidden_minima`); and
+ 3. the epochs (view or cone crossings) and validity of the observations
+ are computed with one target for each time.
+ """
+ instrument = satellite.get_instrument(instrument_index)
+ orbit = satellite.orbit.to_gp_orbit()
+ coordinates = np.array([_get_point_coordinates(point) for point in points])
+ longitude, latitude, elevation = coordinates.T
+ xyz = np.array(wgs84.latlon(latitude, longitude, elevation).itrs_xyz.m)
+ up = np.array(
+ [
+ np.cos(np.radians(latitude)) * np.cos(np.radians(longitude)),
+ np.cos(np.radians(latitude)) * np.sin(np.radians(longitude)),
+ np.sin(np.radians(latitude)),
+ ]
+ )
+ geometries = [geo.Point(x, y, z) for x, y, z in coordinates]
+ # use the apogee radius and the polar radius (below a point below the
+ # ellipsoid) as conservative bounds of the satellite's and points' radii
+ max_radius = compute_apoapsis_radius(
+ satellite.orbit.get_semimajor_axis(), satellite.orbit.get_eccentricity()
+ )
+ # each point's own bounds, so that its result does not depend on the others
+ min_radius = EARTH_POLAR_RADIUS + np.minimum(elevation, 0)
+ min_elevation_angle = np.array(
+ [
+ max(
+ 0.0,
+ compute_min_elevation_angle(
+ max_radius - radius, instrument.field_of_regard
+ )
+ - 1.0,
+ )
+ for radius in min_radius
+ ]
+ )
+ half_angle = instrument.field_of_regard / 2
+ reference = pd.Timestamp(start.astimezone(tz=timezone.utc))
+ duration = (end - start).total_seconds()
+ _warn_if_propagating_with_drag(orbit, start, end)
+
+ def residual(seconds: np.ndarray, index: np.ndarray) -> TimeRequest:
+ # positive outside the field of regard or below the minimum elevation angle
+ t = _to_time_from_offsets(reference, seconds)
+ yield t
+ p_m, nadir, _, _ = _compute_nadir_axes(
+ orbit.get_orbit_track_at_time(t),
+ nadir_reference=instrument.nadir_reference,
+ )
+ los = _compute_line_of_sight(xyz[:, index], p_m)
+ distance = np.linalg.norm(los, axis=0)
+ elevation_angle = np.degrees(
+ np.arcsin(np.clip(-np.sum(los * up[:, index], axis=0) / distance, -1, 1))
+ )
+ excess = min_elevation_angle[index] - elevation_angle
+ if half_angle >= 90:
+ return excess
+ cone = np.degrees(
+ np.arccos(np.clip(np.sum(los * nadir, axis=0) / distance, -1, 1))
+ )
+ return np.maximum(cone - half_angle, excess)
+
+ # 1. the coarse orbit track, from which the windows of each point are screened
+ steps = max(1, int(np.ceil(duration / _SCREEN_STEP)))
+ screen_times = np.linspace(0, duration, steps + 1)
+ t = _to_time_from_offsets(reference, screen_times)
+ yield t
+ position = np.array(orbit.get_orbit_track_at_time(t).frame_xyz(itrs).m)
+ directions = position / np.linalg.norm(position, axis=0)
+ units = xyz / np.linalg.norm(xyz, axis=0)
+ screening_radius = np.radians(
+ np.array(
+ [
+ _get_screening_angle(max_radius, radius, half_angle)
+ for radius in min_radius
+ ]
+ )
+ + _SCREEN_MARGIN
+ )
+
+ def collect_block(block: np.ndarray) -> TimeRequest:
+ """Collect the observations of a block of points (global indices)."""
+ local_point, first_step, last_step = _screen_windows(
+ directions, units[:, block], screening_radius[block]
+ )
+ if len(local_point) == 0:
+ return _get_empty_coverage_frame(omit_solar)
+ window_point = block[local_point]
+ window_lower = screen_times[first_step]
+ window_upper = screen_times[last_step + 1]
+
+ # 2. refine the periods in the parts of each window
+ period_point, lower, upper = yield from _refine_window_periods(
+ residual, window_point, window_lower, window_upper
+ )
+ # 3. the epochs and validity of the observations
+ epoch_point, epoch_period, epochs = yield from _get_batch_epochs(
+ orbit, instrument, xyz, period_point, lower, upper, reference
+ )
+ keep = (
+ upper[epoch_period] - lower[epoch_period]
+ >= instrument.min_access_time.total_seconds()
+ )
+ epoch_point, epoch_period, epochs = (
+ epoch_point[keep],
+ epoch_period[keep],
+ epochs[keep],
+ )
+ observations, orbit_track, valid_point = [], None, np.array([], dtype=int)
+ if len(epochs) > 0:
+ t = _to_time_from_offsets(reference, epochs)
+ yield t
+ orbit_track = orbit.get_orbit_track_at_time(t)
+ target = wgs84.latlon(
+ latitude[epoch_point], longitude[epoch_point], elevation[epoch_point]
+ )
+ valid = np.atleast_1d(instrument.is_valid_observation(orbit_track, target))
+ if isinstance(instrument, (PointedInstrument, ConicalInstrument)):
+ valid = valid & np.atleast_1d(
+ instrument.is_in_field_of_view(orbit_track, target)
+ )
+ valid_index = np.flatnonzero(valid)
+ valid_point = epoch_point[valid_index]
+ observations = [
+ (
+ pd.Interval(
+ left=reference
+ + pd.Timedelta(seconds=float(lower[epoch_period[i]])),
+ right=reference
+ + pd.Timedelta(seconds=float(upper[epoch_period[i]])),
+ ),
+ reference + pd.Timedelta(seconds=float(epochs[i])),
+ tuple(coordinates[epoch_point[i]]),
+ )
+ for i in valid_index
+ ]
+ if len(valid_index) < len(epochs):
+ orbit_track = _index_orbit_track(orbit_track, valid_index)
+ observed = np.unique(valid_point)
+ hashes = dict(
+ zip(observed, _hash_geometries([geometries[p] for p in observed]))
+ )
+ return _build_observation_frame(
+ observations,
+ [hashes[p] for p in valid_point],
+ [geometries[p] for p in valid_point],
+ satellite,
+ instrument,
+ omit_solar,
+ orbit_track,
+ )
+
+ # points in blocks of at most _BLOCK_POINT_DAYS point-days, which bound the
+ # size of the vectorized stages
+ size = max(1, int(_BLOCK_POINT_DAYS * 86400 / max(duration, 1.0)))
+ frames = []
+ for first in range(0, len(points), size):
+ frame = yield from collect_block(
+ np.arange(first, min(len(points), first + size))
+ )
+ if len(frame) > 0:
+ frames.append(frame)
+ if len(frames) == 0:
+ return _get_empty_coverage_frame(omit_solar)
+ return frames[0] if len(frames) == 1 else pd.concat(frames, ignore_index=True)
+
+
+def _warn_if_propagating_with_drag(
+ orbit: GeneralPerturbationsOrbit, start: datetime, end: datetime
+) -> None:
+ """
+ Warn if an orbit is propagated with drag between its repeat tracks (as in
+ `GeneralPerturbationsOrbit.get_observation_events`).
+
+ Args:
+ orbit (GeneralPerturbationsOrbit): The orbit.
+ start (datetime.datetime): Start of analysis period.
+ end (datetime.datetime): End of analysis period.
+ """
+ first, last = orbit._get_repeat_tracks() # pylint: disable=protected-access
+ direct_start = start if first is None else max(start, first.epoch)
+ direct_end = end if last is None else min(end, last.epoch)
+ if direct_start < direct_end:
+ orbit._warn_if_propagating_with_drag( # pylint: disable=protected-access
+ _to_time([direct_start, direct_end]),
+ np.array(orbit.get_element_index([direct_start, direct_end])),
+ )
+
+
+def _get_batch_view_crossing_times(
+ orbit: GeneralPerturbationsOrbit,
instrument: PointedInstrument,
- periods: list[pd.Interval],
+ xyz: np.ndarray,
+ point: np.ndarray,
+ lower: np.ndarray,
+ upper: np.ndarray,
+ reference: pd.Timestamp,
) -> TimeRequest:
"""
- Get the time in each visible period when a pointed instrument's view
- sweeps over a target: when the target crosses the plane of the view's
- boresight and cross-track axis (where its along-track view angle is
- zero). The along-track component of the unit line of sight to the
- target, which is defined even when the target is behind the view,
- decreases through zero as the satellite passes the target. If a period
- does not contain a crossing (for example, a period truncated by the
- analysis window), uses the period's end closest to the crossing.
+ Get the time in each period when a pointed instrument's view sweeps over
+ its point: when the point crosses the plane of the view's boresight and
+ cross-track axis (where its along-track view angle is zero), or, for a
+ `ViewGeometry.SCAN` view, the scan plane. The along-track component of
+ the unit line of sight, which is defined even when the point is behind
+ the view, decreases through zero as the satellite passes the point. If a
+ period does not contain a crossing (for example, a period truncated by
+ the analysis window), uses the period's end closest to the crossing.
Args:
- target (skyfield.toposlib.GeographicPosition): The target position.
- satellite (Satellite): The observing satellite.
+ orbit (GeneralPerturbationsOrbit): The orbit.
instrument (PointedInstrument): The observing instrument.
- periods (list[pandas.Interval]): The visible periods.
+ xyz (numpy.ndarray): The Earth-fixed coordinates (meters) of the
+ points, shape (3, N).
+ point (numpy.ndarray): The point of each period.
+ lower (numpy.ndarray): The start of each period (seconds).
+ upper (numpy.ndarray): The end of each period (seconds).
+ reference (pandas.Timestamp): The reference time of the seconds.
Returns:
- TimeRequest: the computation of the view crossing time in each
- period (list[pandas.Timestamp]).
+ TimeRequest: the computation of the crossing time (seconds) in each
+ period (numpy.ndarray).
"""
- if len(periods) == 0:
- return []
- orbit = satellite.orbit.to_gp_orbit()
- reference = periods[0].left
+ if len(lower) == 0:
+ return np.array([], dtype=float)
- def residual(seconds: np.ndarray, _index: np.ndarray) -> TimeRequest:
+ def residual(seconds: np.ndarray, index: np.ndarray) -> TimeRequest:
# along-track component of the unit line of sight in the view frame
t = _to_time_from_offsets(reference, seconds)
yield t
@@ -315,72 +892,80 @@ def residual(seconds: np.ndarray, _index: np.ndarray) -> TimeRequest:
instrument.velocity_frame,
instrument.nadir_reference,
instrument.get_pitch_angle(orbit_track),
+ instrument.platform_attitude,
)
- los = np.reshape(np.array(target.itrs_xyz.m), (3, 1)) - position
- return np.sum(los * along, axis=0) / np.linalg.norm(los, axis=0)
- position, _, along, _ = _compute_view_frame(
- orbit_track,
- instrument.get_roll_angle(orbit_track),
- instrument.get_pitch_angle(orbit_track),
- instrument.velocity_frame,
- instrument.nadir_reference,
- )
- los = np.reshape(np.array(target.itrs_xyz.m), (3, 1)) - position
+ else:
+ position, _, along, _ = _compute_view_frame(
+ orbit_track,
+ instrument.get_roll_angle(orbit_track),
+ instrument.get_pitch_angle(orbit_track),
+ instrument.velocity_frame,
+ instrument.nadir_reference,
+ attitude=instrument.platform_attitude,
+ )
+ los = _compute_line_of_sight(xyz[:, point[index]], position)
return np.sum(los * along, axis=0) / np.linalg.norm(los, axis=0)
- crossing, _ = yield from _find_crossings(
- residual,
- np.array([(period.left - reference).total_seconds() for period in periods]),
- np.array([(period.right - reference).total_seconds() for period in periods]),
- )
- return [reference + pd.Timedelta(seconds=float(x)) for x in crossing]
+ crossing, _ = yield from _find_crossings(residual, lower, upper)
+ return crossing
-def _get_cone_crossing_times(
- target: GeographicPosition,
- satellite: Satellite,
+def _get_batch_cone_crossing_times(
+ orbit: GeneralPerturbationsOrbit,
instrument: ConicalInstrument,
- periods: list[pd.Interval],
+ xyz: np.ndarray,
+ point: np.ndarray,
+ lower: np.ndarray,
+ upper: np.ndarray,
+ reference: pd.Timestamp,
) -> TimeRequest:
"""
- Get the times in each visible period when a target crosses a conical
- instrument's cone: when the target's angle from nadir equals the cone
- angle. During a pass, this angle decreases to a minimum near the closest
- approach and then increases, so there are up to two crossings: entering
+ Get the times in each period when its point crosses a conical
+ instrument's cone: when its angle from nadir equals the cone angle.
+ During a pass, this angle decreases to a minimum near the closest
+ approach and then increases, so there are up to two crossings, entering
the cone (ahead of the satellite) and leaving it (behind).
Args:
- target (skyfield.toposlib.GeographicPosition): The target position.
- satellite (Satellite): The observing satellite.
+ orbit (GeneralPerturbationsOrbit): The orbit.
instrument (ConicalInstrument): The observing instrument.
- periods (list[pandas.Interval]): The visible periods.
+ xyz (numpy.ndarray): The Earth-fixed coordinates (meters) of the
+ points, shape (3, N).
+ point (numpy.ndarray): The point of each period.
+ lower (numpy.ndarray): The start of each period (seconds).
+ upper (numpy.ndarray): The end of each period (seconds).
+ reference (pandas.Timestamp): The reference time of the seconds.
Returns:
- TimeRequest: the computation of the cone crossing times in each
- period (list[list[pandas.Timestamp]]).
+ TimeRequest: the computation of the period and time (seconds) of
+ each crossing, in order of period (tuple[numpy.ndarray,
+ numpy.ndarray]).
"""
- if len(periods) == 0:
- return []
- orbit = satellite.orbit.to_gp_orbit()
- reference = periods[0].left
- n = len(periods)
+ n = len(lower)
+ if n == 0:
+ return np.array([], dtype=int), np.array([], dtype=float)
- def cone_angle(seconds: np.ndarray, _index: np.ndarray) -> TimeRequest:
+ def cone_angle(seconds: np.ndarray, index: np.ndarray) -> TimeRequest:
t = _to_time_from_offsets(reference, seconds)
yield t
- cone, _ = compute_cone_and_azimuth(
+ p_m, nadir, _, _ = _compute_nadir_axes(
orbit.get_orbit_track_at_time(t),
- target,
instrument.velocity_frame,
instrument.nadir_reference,
+ instrument.platform_attitude,
+ )
+ los = _compute_line_of_sight(xyz[:, point[index % n]], p_m)
+ return np.degrees(
+ np.arccos(
+ np.clip(
+ np.sum(los * nadir, axis=0) / np.linalg.norm(los, axis=0), -1, 1
+ )
+ )
)
- return np.reshape(cone, -1)
def residual(seconds: np.ndarray, index: np.ndarray) -> TimeRequest:
return (yield from cone_angle(seconds, index)) - instrument.cone_angle
- lower = np.array([(period.left - reference).total_seconds() for period in periods])
- upper = np.array([(period.right - reference).total_seconds() for period in periods])
# time of the minimum angle from nadir in each period, from sampled times
samples = lower[:, None] + (upper - lower)[:, None] * np.linspace(0, 1, 21)
closest = samples[
@@ -393,128 +978,13 @@ def residual(seconds: np.ndarray, index: np.ndarray) -> TimeRequest:
),
]
crossing, bracketed = yield from _find_crossings(
- residual,
- np.concatenate([lower, closest]),
- np.concatenate([closest, upper]),
- )
- return [
- [
- reference + pd.Timedelta(seconds=float(crossing[i + k * n]))
- for k in range(2)
- if bracketed[i + k * n]
- ]
- for i in range(n)
- ]
-
-
-def _collect_observations(
- point: Point | geo.Point,
- satellite: Satellite,
- start: datetime,
- end: datetime,
- instrument_index: int = 0,
- omit_solar: bool = True,
-) -> TimeRequest:
- """
- Collect single satellite observations of a point, as a computation (see
- `collect_observations` and `tatc.utils.computation.TimeRequest`).
- """
- longitude, latitude, elevation = _get_point_coordinates(point)
- geometry = geo.Point(longitude, latitude, elevation)
- instrument = satellite.instruments[instrument_index]
- orbit = satellite.orbit.to_gp_orbit()
- # use the apogee altitude above the polar radius (and above the point,
- # if below the ellipsoid) as a conservative upper bound for computing
- # access times, which are then refined to the field of regard
- max_altitude = (
- compute_apoapsis_radius(
- satellite.orbit.get_semimajor_axis(), satellite.orbit.get_eccentricity()
- )
- - EARTH_POLAR_RADIUS
- - min(elevation, 0)
- )
- # compute the minimum altitude angle required for observation, less a
- # margin for the spherical approximation (but not below the horizon)
- min_elevation_angle = max(
- 0.0,
- compute_min_elevation_angle(max_altitude, instrument.field_of_regard) - 1.0,
- )
- target = wgs84.latlon(latitude, longitude, elevation)
- periods = list(
- (
- yield from _compute_access_periods(
- point, satellite, start, end, min_elevation_angle
- )
- )
- )
- # refine the periods to the field of regard: when the point's angle
- # from nadir is at most half the field of regard
- half_angle = instrument.field_of_regard / 2
- if half_angle < 90:
- periods = yield from _refine_access_periods(
- lambda orbit_track: compute_cone_and_azimuth(
- orbit_track, target, nadir_reference=instrument.nadir_reference
- )[0]
- - half_angle,
- orbit,
- periods,
- )
- # observation epochs: the time a pointed instrument's view sweeps over
- # the point, the times the point crosses a conical instrument's cone, or
- # otherwise the midpoint of each visible period
- if isinstance(instrument, PointedInstrument):
- epochs = [
- [epoch]
- for epoch in (
- yield from _get_view_crossing_times(
- target, satellite, instrument, periods
- )
- )
- ]
- elif isinstance(instrument, ConicalInstrument):
- epochs = yield from _get_cone_crossing_times(
- target, satellite, instrument, periods
- )
- else:
- epochs = [[pd.Timestamp(period.mid)] for period in periods]
- candidates = [
- (period, epoch)
- for period, period_epochs in zip(periods, epochs)
- for epoch in period_epochs
- if instrument.min_access_time <= period.right - period.left
- ]
- observations, orbit_track = [], None
- if len(candidates) > 0:
- # instrument validity (illumination, field of view) is only checked
- # at each period's epoch, as an approximation of the whole interval;
- # a more general approach would refine the exact observation period
- # boundaries with Skyfield's find_discrete using the instrument's own
- # validity condition, but that is out of scope for now. All epochs
- # are checked in one vectorized call.
- t = _to_time([epoch for _, epoch in candidates])
- yield t
- orbit_track = orbit.get_orbit_track_at_time(t)
- valid = instrument.is_valid_observation(orbit_track, target)
- if isinstance(instrument, (PointedInstrument, ConicalInstrument)):
- valid = valid & instrument.is_in_field_of_view(orbit_track, target)
- valid = np.atleast_1d(valid)
- observations = [
- (period, epoch, (longitude, latitude, elevation))
- for (period, epoch), is_valid in zip(candidates, valid)
- if is_valid
- ]
- if not np.all(valid):
- # reuse the orbit track of the valid epochs for the data frame
- orbit_track = _index_orbit_track(orbit_track, np.flatnonzero(valid))
- return _build_observation_frame(
- observations,
- hash_geometry(geometry),
- geometry,
- satellite,
- instrument,
- omit_solar,
- orbit_track,
+ residual, np.concatenate([lower, closest]), np.concatenate([closest, upper])
)
+ # the crossings of each period, entering (k = 0) and leaving (k = 1) the cone
+ period = np.concatenate([np.arange(n), np.arange(n)])
+ order = np.lexsort((np.repeat([0, 1], n), period))
+ keep = order[bracketed[order]]
+ return period[keep], crossing[keep]
def collect_observations(
@@ -550,10 +1020,14 @@ def collect_observations(
its repeat ground track before its first and after its last element's
epoch (see `GeneralPerturbationsOrbit.get_orbit_track_at_time`).
- The observations of every point, satellite, and instrument are computed
- together, sharing the costly Earth orientation quantities of the times
- at each step (see `tatc.utils.computation._run_together`), which is
- much faster than computing them separately.
+ The observations of all points by each satellite and instrument are
+ computed together, with each stage vectorized across the points: the
+ orbit is propagated once to screen the windows in which each point may
+ be observed, and the periods, epochs, and validity of the observations
+ are then refined to a millisecond in all windows at once. The
+ observations of a point do not depend on the other points (to within a
+ microsecond), so many points are much faster to collect together than
+ separately.
Args:
points (Point | shapely.geometry.Point | list[Point | shapely.geometry.Point]):
@@ -583,14 +1057,17 @@ def collect_observations(
"point must be a Point or shapely Point, not a "
f"{type(point).__name__} (see collect_region_observations for a region)"
)
- gdfs = _run_together(
- [
- _collect_observations(point, satellite, start, end, index, omit_solar)
- for point in points
- for satellite in satellites
- for index in _get_instrument_indices(satellite, instrument_index)
- ]
- )
+ # each computation is vectorized across the points, so they are run in
+ # turn (running them together would only enlarge each step)
+ gdfs = [
+ _run(
+ _collect_batch_observations(
+ points, satellite, start, end, index, omit_solar
+ )
+ )
+ for satellite in satellites
+ for index in _get_instrument_indices(satellite, instrument_index)
+ ]
return _combine_results(
gdfs,
single,
diff --git a/src/tatc/analysis/region_sampling.py b/src/tatc/analysis/region_sampling.py
index c70fbf79..fc8c574f 100644
--- a/src/tatc/analysis/region_sampling.py
+++ b/src/tatc/analysis/region_sampling.py
@@ -729,7 +729,7 @@ def _collect_region_observations(
geometry = split_polygon(region)
if region.has_z:
geometry = project_polygon_to_elevation(geometry, elevation)
- instrument = satellite.instruments[instrument_index]
+ instrument = satellite.get_instrument(instrument_index)
orbit = satellite.orbit.to_gp_orbit()
shapely.prepare(geometry)
windows = list(
diff --git a/src/tatc/analysis/ro_sampling.py b/src/tatc/analysis/ro_sampling.py
index 0739b174..fa6a24ff 100644
--- a/src/tatc/analysis/ro_sampling.py
+++ b/src/tatc/analysis/ro_sampling.py
@@ -343,8 +343,12 @@ def _sample_ro_arcs(
`_find_ro_arcs`: each with its receiver and transmitter indices, start,
and end),
splitting each into one or more observations if the tangent point
- elevation leaves the specified range. The samples of all arcs are
- computed together.
+ elevation leaves the specified range or turns (at a minimum or maximum
+ elevation), so that each observation is setting (descending) or rising
+ (ascending): a grazing occultation, whose tangent point descends and
+ rises again, is split into a setting and a rising observation, which
+ share the sample at which it turns. The samples of all arcs are computed
+ together.
"""
if len(arcs) == 0:
return []
@@ -418,46 +422,54 @@ def samples(selected: set[tuple[int, int]]) -> np.ndarray:
elevation > range_elevation[0], elevation < range_elevation[1]
)
+ def point(j: int, time: datetime) -> dict:
+ # the observation point of sample j
+ return {
+ "time": time,
+ "longitude": longitude[j],
+ "latitude": latitude[j],
+ "elevation": elevation[j],
+ "rx_tx_pitch": rx_tx_pitch[j],
+ "rx_tx_yaw": rx_tx_yaw[j],
+ "tp_tx_azimuth": tp_tx_azimuth[j],
+ }
+
# occultation observations
occ_obs = []
for (r, k, _, _), times, offset in zip(arcs, arc_times, bounds):
- # occultation arc
+ # occultation arc, and the direction of its tangent point elevation
+ # (1 ascending, -1 descending, 0 not yet known)
occ_arc = None
+ direction = 0
for j, time in enumerate(times, start=offset):
if in_range[j]:
if occ_arc is None:
- # start of new RO observation. rx_tx_pitch is the
- # transmitter's pitch angle relative to the receiver,
- # where -90 deg points at the geocenter (never actually
- # reached by a real RO profile, since the signal must
- # pass through the atmosphere); pitch above -90 deg means
- # the transmitter is "ahead" of the receiver (a
- # rising/emersion occultation), below -90 deg means
- # "behind" (a setting/immersion one). This is an
- # approximation of the more direct (but more expensive)
- # definition -- the sign of the tangent point's own
- # elevation rate -- using this arc's first sample only.
+ # start of new RO observation
occ_arc = {
"rx": receivers[r].name,
"tx": transmitters[k].name,
- "is_rising": rx_tx_pitch[j] > -90,
"points": [],
}
- occ_arc["points"].append(
- {
- "time": time,
- "longitude": longitude[j],
- "latitude": latitude[j],
- "elevation": elevation[j],
- "rx_tx_pitch": rx_tx_pitch[j],
- "rx_tx_yaw": rx_tx_yaw[j],
- "tp_tx_azimuth": tp_tx_azimuth[j],
- }
- )
+ direction = 0
+ elif elevation[j] != elevation[j - 1]:
+ direction = 1 if elevation[j] > elevation[j - 1] else -1
+ occ_arc["points"].append(point(j, time))
if j + 1 >= offset + len(times):
# end of RO observation due to arc boundary
occ_obs.append(occ_arc)
occ_arc = None
+ elif in_range[j + 1] and direction != 0:
+ step = np.sign(elevation[j + 1] - elevation[j])
+ if step == -direction:
+ # end of RO observation where the tangent point turns,
+ # and start of the next from the same sample
+ occ_obs.append(occ_arc)
+ occ_arc = {
+ "rx": receivers[r].name,
+ "tx": transmitters[k].name,
+ "points": [point(j, time)],
+ }
+ direction = int(step)
elif occ_arc is not None:
# end of RO observation due to elevation constraints
occ_obs.append(occ_arc)
@@ -484,6 +496,39 @@ def _interpolate_ro_point(points: list[dict], sample_elevation: float) -> dict:
)
+def _is_rising(points: list[dict], sample_elevation: float) -> bool:
+ """
+ Determines whether an RO observation is rising (emersion), with its
+ tangent point ascending, or setting (immersion), with it descending:
+ between the points that bracket the first crossing of the specified
+ elevation (at which `_interpolate_ro_point` interpolates), or, if it is
+ not crossed, from the first to the last point.
+
+ A single point (or a profile that ends at the elevation it starts) is
+ rising if the transmitter is ahead of the receiver: if its pitch angle
+ relative to the receiver is above -90 deg (which points at the
+ geocenter). This approximation fails for transmitters nearly abeam of
+ the receiver (yaw angles near 90 deg).
+
+ Args:
+ points (list[dict]): the RO observation points (ordered by time).
+ sample_elevation (float): the tangent point elevation (m) at which
+ the observation is interpolated.
+
+ Returns:
+ bool: True, if the observation is rising.
+ """
+ elevations = np.array([point["elevation"] for point in points])
+ # bracketing indices where the tangent point elevation crosses the sample elevation
+ crossings = np.nonzero(np.diff(np.sign(elevations - sample_elevation)))[0]
+ if len(crossings) > 0:
+ i = crossings[0]
+ return bool(elevations[i + 1] > elevations[i])
+ if elevations[-1] != elevations[0]:
+ return bool(elevations[-1] > elevations[0])
+ return bool(points[0]["rx_tx_pitch"] > -90)
+
+
def _get_empty_ro_frame() -> gpd.GeoDataFrame:
"""
Gets an empty data frame for ro results.
@@ -530,6 +575,16 @@ def collect_ro_observations(
the negative default `sample_elevation`). See `_tangent_point_geometry`
for details.
+ Each observation is setting (`is_rising` false), with its tangent point
+ descending, or rising, with it ascending: a grazing occultation, whose
+ tangent point descends and rises again within `range_elevation`, is
+ reported as a setting and a rising observation, which share the sample
+ at its lowest point. Each observation's `time` and `position` are
+ interpolated where its tangent point crosses `sample_elevation`, or, for
+ a profile that does not reach it (one cut off by the analysis period, or
+ a grazing occultation that turns back above it), at the end of the
+ profile nearest to it, such as its lowest point.
+
Args:
receivers (Satellite | list[Satellite]): the satellite(s) with a RO receiver.
transmitters (Satellite | list[Satellite]]): the satellite(s) with a RO transmitter.
@@ -587,7 +642,7 @@ def collect_ro_observations(
{
"receiver": o["rx"],
"transmitter": o["tx"],
- "is_rising": o["is_rising"],
+ "is_rising": _is_rising(o["points"], sample_elevation),
"geometry": profile,
"position": Point(
sample["longitude"], sample["latitude"], sample["elevation"]
diff --git a/src/tatc/analysis/sample_sizes.py b/src/tatc/analysis/sample_sizes.py
new file mode 100644
index 00000000..b9422839
--- /dev/null
+++ b/src/tatc/analysis/sample_sizes.py
@@ -0,0 +1,141 @@
+"""
+Methods to compute the sizes of the samples of observations: the extent on
+the ground of an instrument's pixel at each observed target, and the
+spacing between pixels, which bound the detail an observation can resolve.
+
+@author: Paul T. Grogan
+"""
+
+from __future__ import annotations
+
+import geopandas as gpd
+import numpy as np
+import shapely
+from skyfield.api import wgs84
+
+from ..schemas import ConicalInstrument, PointedInstrument, Satellite
+from ..utils.projection import VelocityFrame, compute_view_angles
+from ..utils.time import _to_time
+from .check import _check_satellites
+
+_COLUMNS = [
+ "sat_range",
+ "scan_angle",
+ "sample_along",
+ "sample_cross",
+ "spacing_along",
+ "spacing_cross",
+]
+
+
+def compute_sample_sizes(
+ observations: gpd.GeoDataFrame,
+ satellites: Satellite | list[Satellite],
+) -> gpd.GeoDataFrame:
+ """
+ Compute the sizes of the samples of observations: for each observation,
+ the extent on the ground of the observing instrument's pixel at the
+ target, along track and across track (`sample_along` and
+ `sample_cross`, meters), and the spacing between the centers of
+ neighboring pixels (`spacing_along` and `spacing_cross`, meters), which
+ is larger than the pixel if there are gaps between pixels (a negative
+ oversampling). An observation cannot resolve detail finer than the
+ larger of the two. The sizes are those of a `PointedInstrument`'s
+ pixels (see `PointedInstrument.compute_sample_size` and
+ `PointedInstrument.compute_sample_spacing`) or of a
+ `ConicalInstrument`'s beam and samples along its scanned arc (see
+ `ConicalInstrument.compute_sample_size` and
+ `ConicalInstrument.compute_sample_spacing`, `NaN` unless its
+ `beam_width` and `scan_sample_spacing` are given), and `NaN` for other
+ instruments, whose samples are not defined.
+
+ Also computes the satellite's slant range from the target (`sat_range`,
+ meters) and the target's scan angle (`scan_angle`, degrees): its angle
+ across track from nadir, positive to the left of the direction of motion
+ (see `tatc.utils.compute_view_angles`), measured from the body's axes
+ if the satellite has an attitude, which gives its position in the swath.
+
+ The observations are those of points (see `collect_observations`), at
+ their `epoch`, or of features (see `collect_feature_observations`), at
+ their `time`, whose target is the centroid of the viewed part.
+
+ Args:
+ observations (geopandas.GeoDataFrame): The observations, with the
+ `satellite` and `instrument` that observe each.
+ satellites (Satellite | list[Satellite]): The observing satellites,
+ including those named by the observations.
+
+ Returns:
+ geopandas.GeoDataFrame: the observations, with the sample sizes,
+ spacings, slant ranges, and scan angles.
+ """
+ satellites = _check_satellites(satellites)
+ by_name = {satellite.name: satellite for satellite in satellites}
+ result = observations.copy()
+ for column in _COLUMNS:
+ result[column] = np.nan
+ if len(observations) == 0:
+ return result
+ time_column = "epoch" if "epoch" in observations.columns else "time"
+ # the targets: observed points, or the centroids of observed regions
+ geometry = observations.geometry.to_numpy()
+ is_point = shapely.get_type_id(geometry) == shapely.GeometryType.POINT
+ centroid = shapely.centroid(geometry)
+ longitude, latitude = shapely.get_x(centroid), shapely.get_y(centroid)
+ elevation = np.where(is_point, np.nan_to_num(shapely.get_z(geometry)), 0)
+ position = np.arange(len(observations))
+ for (satellite_name, instrument_name), group in observations.groupby(
+ ["satellite", "instrument"], sort=False
+ ):
+ satellite = by_name.get(satellite_name)
+ if satellite is None:
+ raise ValueError(f"no satellite named {satellite_name!r}")
+ instrument_index = next(
+ (
+ i
+ for i, instrument in enumerate(satellite.instruments)
+ if instrument.name == instrument_name
+ ),
+ None,
+ )
+ if instrument_index is None:
+ raise ValueError(
+ f"satellite {satellite_name!r} has no instrument named {instrument_name!r}"
+ )
+ # the instrument, with its views rotated from the body's axes
+ instrument = satellite.get_instrument(instrument_index)
+ index = position[observations.index.get_indexer(group.index)]
+ orbit_track = satellite.orbit.to_gp_orbit().get_orbit_track_at_time(
+ _to_time(list(group[time_column]))
+ )
+ target = wgs84.latlon(latitude[index], longitude[index], elevation[index])
+ distance = (orbit_track - target.at(orbit_track.t)).altaz()[2]
+ result.iloc[index, result.columns.get_loc("sat_range")] = np.atleast_1d(
+ distance.m
+ )
+ velocity_frame = (
+ instrument.velocity_frame
+ if isinstance(instrument, (PointedInstrument, ConicalInstrument))
+ else VelocityFrame.EARTH_FIXED
+ )
+ roll, _ = compute_view_angles(
+ orbit_track,
+ target,
+ velocity_frame,
+ instrument.nadir_reference,
+ attitude=instrument.platform_attitude,
+ )
+ result.iloc[index, result.columns.get_loc("scan_angle")] = np.atleast_1d(roll)
+ if isinstance(instrument, (PointedInstrument, ConicalInstrument)):
+ for prefix, method in (
+ ("sample", instrument.compute_sample_size),
+ ("spacing", instrument.compute_sample_spacing),
+ ):
+ along, cross = method(orbit_track, target)
+ result.iloc[index, result.columns.get_loc(f"{prefix}_along")] = (
+ np.atleast_1d(along)
+ )
+ result.iloc[index, result.columns.get_loc(f"{prefix}_cross")] = (
+ np.atleast_1d(cross)
+ )
+ return result
diff --git a/src/tatc/analysis/sampling.py b/src/tatc/analysis/sampling.py
index 6ce36950..ec0acd05 100644
--- a/src/tatc/analysis/sampling.py
+++ b/src/tatc/analysis/sampling.py
@@ -22,6 +22,7 @@
from ..constants import de421
from ..schemas import GeneralPerturbationsOrbit, Instrument, Satellite
from ..utils.computation import TimeRequest
+from ..utils.glint import compute_glint_angle
from ..utils.time import _to_time_from_offsets
@@ -53,14 +54,15 @@ def _get_empty_coverage_frame(omit_solar: bool) -> gpd.GeoDataFrame:
"solar_alt": pd.Series(dtype="float"),
"solar_az": pd.Series(dtype="float"),
"solar_time": pd.Series(dtype="float"),
+ "glint_angle": pd.Series(dtype="float"),
}
return gpd.GeoDataFrame(columns, crs="EPSG:4326")
def _build_observation_frame(
observations: list[tuple[pd.Interval, pd.Timestamp, tuple[float, float, float]]],
- target_hash: str,
- geometry: geo.base.BaseGeometry,
+ target_hash: str | list[str],
+ geometry: geo.base.BaseGeometry | list[geo.base.BaseGeometry],
satellite: Satellite,
instrument: Instrument,
omit_solar: bool,
@@ -74,10 +76,12 @@ def _build_observation_frame(
observations (list[tuple[pandas.Interval, pandas.Timestamp, tuple[float, float, float]]]):
Each observation's period, epoch, and observed point's longitude
(degrees), latitude (degrees), and elevation (meters).
- target_hash (str): The hash of the target recorded with each
- observation (see `tatc.utils.geometry.hash_geometry`).
- geometry (shapely.geometry.base.BaseGeometry): The geometry recorded with
- each observation.
+ target_hash (str | list[str]): The hash of the target recorded with
+ each observation (see `tatc.utils.geometry.hash_geometry`), or
+ one hash for each observation.
+ geometry (shapely.geometry.base.BaseGeometry | list[shapely.geometry.base.BaseGeometry]):
+ The geometry recorded with each observation, or one geometry
+ for each observation.
satellite (Satellite): The observing satellite.
instrument (Instrument): The observing instrument.
omit_solar (bool): `True`, to omit solar angles to improve performance.
@@ -89,27 +93,35 @@ def _build_observation_frame(
"""
if len(observations) == 0:
return _get_empty_coverage_frame(omit_solar)
+ count = len(observations)
+ # times in nanoseconds (as in the empty frame), whatever their source
+ epoch = pd.DatetimeIndex([epoch for _, epoch, _ in observations]).as_unit("ns")
+ if instrument.access_time_fixed:
+ start = epoch - instrument.min_access_time / 2
+ end = epoch + instrument.min_access_time / 2
+ else:
+ start = pd.DatetimeIndex(
+ [period.left for period, _, _ in observations]
+ ).as_unit("ns")
+ end = pd.DatetimeIndex([period.right for period, _, _ in observations]).as_unit(
+ "ns"
+ )
gdf = gpd.GeoDataFrame(
- [
- {
- "target_hash": target_hash,
- "geometry": geometry,
- "satellite": satellite.name,
- "instrument": instrument.name,
- "start": (
- period.left
- if not instrument.access_time_fixed
- else epoch - instrument.min_access_time / 2
- ),
- "end": (
- period.right
- if not instrument.access_time_fixed
- else epoch + instrument.min_access_time / 2
- ),
- "epoch": epoch,
- }
- for period, epoch, _ in observations
- ],
+ {
+ "target_hash": (
+ [target_hash] * count if isinstance(target_hash, str) else target_hash
+ ),
+ "geometry": (
+ [geometry] * count
+ if isinstance(geometry, geo.base.BaseGeometry)
+ else geometry
+ ),
+ "satellite": [satellite.name] * count,
+ "instrument": [instrument.name] * count,
+ "start": start,
+ "end": end,
+ "epoch": epoch,
+ },
crs="EPSG:4326",
)
# observed point of each observation
@@ -137,6 +149,8 @@ def _build_observation_frame(
gdf["solar_time"] = (de421["earth"] + topos).at(ts).observe(
de421["sun"]
).apparent().hadec()[0].hours + 12
+ # append glint angle column
+ gdf["glint_angle"] = np.atleast_1d(compute_glint_angle(orbit_track, topos))
return gdf
diff --git a/src/tatc/analysis/space_sampling.py b/src/tatc/analysis/space_sampling.py
index 4ab40a2a..f89f7864 100644
--- a/src/tatc/analysis/space_sampling.py
+++ b/src/tatc/analysis/space_sampling.py
@@ -162,6 +162,77 @@ def _get_pair_positions(
return from_p, to_p
+def _find_closest_approaches(
+ satellites: list[Satellite],
+ from_index: np.ndarray,
+ to_index: np.ndarray,
+ left: np.ndarray,
+ right: np.ndarray,
+ samples: np.ndarray,
+ positions: list[np.ndarray],
+ start: datetime,
+ tolerance: float = 1e-4,
+) -> tuple[np.ndarray, np.ndarray]:
+ """
+ Finds the closest approach of the observing and observed satellites
+ (indices `from_index` and `to_index` of `satellites`) during each of a
+ set of periods (from `left` to `right`, seconds from `start`): the sample
+ (seconds `samples`, at which the satellites' Earth-fixed positions are
+ `positions`) of least range within the period, refined by a
+ golden-section search between its neighboring samples (within the
+ period) to `tolerance` (seconds), for all periods together.
+
+ Returns:
+ tuple[numpy.ndarray, numpy.ndarray]: the time (seconds from `start`)
+ and range (meters) of each closest approach
+ """
+ first = np.searchsorted(samples, left, side="left")
+ last = np.searchsorted(samples, right, side="right")
+ lower, upper = left.copy(), right.copy()
+ for k in np.flatnonzero(last > first):
+ # bracket the sample of least range within the period by its neighbors
+ span = slice(first[k], last[k])
+ j = first[k] + np.argmin(
+ np.linalg.norm(
+ positions[to_index[k]][:, span] - positions[from_index[k]][:, span],
+ axis=0,
+ )
+ )
+ lower[k] = max(left[k], samples[j - 1]) if j > 0 else left[k]
+ upper[k] = min(right[k], samples[j + 1]) if j + 1 < len(samples) else right[k]
+
+ def slant_range(seconds: np.ndarray, index: np.ndarray) -> np.ndarray:
+ from_p, to_p = _get_pair_positions(
+ satellites,
+ from_index[index],
+ to_index[index],
+ _to_time_from_offsets(start, seconds),
+ )
+ return np.linalg.norm(to_p - from_p, axis=0)
+
+ # golden-section search for the minimum range within each bracket
+ ratio = (np.sqrt(5) - 1) / 2
+ index = np.arange(len(left))
+ c = upper - ratio * (upper - lower)
+ d = lower + ratio * (upper - lower)
+ f_c, f_d = slant_range(c, index), slant_range(d, index)
+ while np.any(upper - lower > tolerance):
+ # keep the part of each bracket that contains the smaller value
+ smaller = f_c < f_d
+ upper = np.where(smaller, d, upper)
+ lower = np.where(smaller, lower, c)
+ c, d = np.where(smaller, upper - ratio * (upper - lower), d), np.where(
+ smaller, c, lower + ratio * (upper - lower)
+ )
+ f_c, f_d = np.where(smaller, 0.0, f_d), np.where(smaller, f_c, 0.0)
+ new = np.where(smaller, c, d)
+ f_new = slant_range(new, index)
+ f_c = np.where(smaller, f_new, f_c)
+ f_d = np.where(smaller, f_d, f_new)
+ seconds = (lower + upper) / 2
+ return seconds, slant_range(seconds, index)
+
+
def _get_empty_space_frame() -> gpd.GeoDataFrame:
"""
Gets an empty data frame for space-based coverage analysis results.
@@ -176,6 +247,8 @@ def _get_empty_space_frame() -> gpd.GeoDataFrame:
"to_satellite": pd.Series([], dtype="str"),
"start": pd.Series([], dtype="datetime64[ns, utc]"),
"end": pd.Series([], dtype="datetime64[ns, utc]"),
+ "closest_time": pd.Series([], dtype="datetime64[ns, utc]"),
+ "closest_range": pd.Series([], dtype="float"),
}
return gpd.GeoDataFrame(columns, crs="EPSG:4326")
@@ -210,6 +283,14 @@ def collect_space_observations(
so they do not follow the line of sight across the Earth's surface and
are not divided at the antimeridian.
+ Each observation also records the closest approach of the satellites
+ during the period: its time (`closest_time`) and slant range
+ (`closest_range`, meters), the least range among the samples of the
+ search within the period (see `min_duration`) and its start and end,
+ refined to 0.1 milliseconds between the neighboring samples. A period
+ whose range has several minima closer together than the samples may
+ report one that is not the least.
+
Args:
from_satellites (Satellite | list[Satellite]): The observing satellite(s).
start (datetime.datetime): The start of the analysis period.
@@ -338,6 +419,23 @@ def evaluate(seconds: np.ndarray, index: np.ndarray) -> TimeRequest:
)
from_geo = np.array(rectangular_to_geodetic(from_p)).T
to_geo = np.array(rectangular_to_geodetic(to_p)).T
+ # closest approach within each period: between its samples, or at its
+ # start or end if closer
+ left, right = seconds[0::2], seconds[1::2]
+ closest, closest_range = _find_closest_approaches(
+ satellites,
+ pair_from[period_pair],
+ pair_to[period_pair],
+ left,
+ right,
+ samples,
+ positions,
+ start,
+ )
+ end_range = np.linalg.norm(to_p - from_p, axis=0).reshape(-1, 2)
+ nearer = np.argmin(np.column_stack([closest_range, end_range]), axis=1)
+ closest = np.choose(nearer, [closest, left, right])
+ closest_range = np.choose(nearer, [closest_range, end_range[:, 0], end_range[:, 1]])
# lines of sight at the start and end of each period
geometry = shapely.multilinestrings(
shapely.linestrings(np.stack((from_geo, to_geo), axis=1)),
@@ -353,6 +451,8 @@ def evaluate(seconds: np.ndarray, index: np.ndarray) -> TimeRequest:
"to_satellite": [satellites[pair_to[p]].name for p in period_pair],
"start": reference + pd.to_timedelta(seconds[0::2], unit="s"),
"end": reference + pd.to_timedelta(seconds[1::2], unit="s"),
+ "closest_time": reference + pd.to_timedelta(closest, unit="s"),
+ "closest_range": closest_range,
},
crs="EPSG:4326",
)
diff --git a/src/tatc/schemas/__init__.py b/src/tatc/schemas/__init__.py
index 255b4b5c..58307e7b 100644
--- a/src/tatc/schemas/__init__.py
+++ b/src/tatc/schemas/__init__.py
@@ -3,6 +3,13 @@
"""
from .architecture import Architecture
+from .attitude import (
+ Attitude,
+ AttitudeSchedule,
+ AttitudeSegment,
+ GlintAttitude,
+ TargetAttitude,
+)
from .instrument import AllInstruments, ConicalInstrument, Instrument, PointedInstrument
from .orbit import (
AllOrbits,
@@ -40,6 +47,9 @@
"AllSpaceObjects",
"AllSurfaceObjects",
"Architecture",
+ "Attitude",
+ "AttitudeSchedule",
+ "AttitudeSegment",
"CircularOrbit",
"ConicalInstrument",
"GeneralPerturbationsOrbit",
@@ -57,6 +67,8 @@
"Satellite",
"SunSynchronousOrbit",
"SurfacePlatform",
+ "TargetAttitude",
+ "GlintAttitude",
"TerrainMask",
"TrainConstellation",
"TundraOrbit",
diff --git a/src/tatc/schemas/attitude.py b/src/tatc/schemas/attitude.py
new file mode 100644
index 00000000..dbfdb44b
--- /dev/null
+++ b/src/tatc/schemas/attitude.py
@@ -0,0 +1,655 @@
+"""
+Object schemas for the attitude of space systems: the orientation of a
+spacecraft's body relative to its orbit, which orients the views of its
+instruments, and schedules of attitudes over time.
+
+@author: Paul T. Grogan
+"""
+
+from __future__ import annotations
+
+from datetime import datetime
+from typing import Annotated, Literal
+
+import numpy as np
+import numpy.typing as npt
+from pydantic import AwareDatetime, BaseModel, Field, field_validator
+from skyfield.api import wgs84
+from skyfield.positionlib import Geocentric
+from skyfield.toposlib import GeographicPosition
+
+from ..utils.ellipsoid import compute_ellipsoid_intersection, rectangular_to_geodetic
+from ..utils.glint import compute_specular_point
+from ..utils.orbital import _check_angle_profile, _interpolate_angle_profile
+from ..utils.projection import (
+ VelocityFrame,
+ _compute_line_of_sight,
+ _compute_nadir_axes,
+ compute_view_angles,
+)
+from ..utils.time import _index_orbit_track
+from .surface.point import Point
+
+
+class Attitude(BaseModel):
+ """
+ Attitude of a spacecraft's body relative to its orbit. The body is
+ rotated from the orbit's nadir frame (its nadir axis and its along-track
+ axis, aligned with the velocity in `velocity_frame`) first by the yaw
+ angle about the nadir axis, then by the roll angle about the yawed
+ along-track axis, then by the pitch angle about the rolled cross-track
+ axis. Each angle is constant or, if its profile is given, varies with the
+ satellite's argument of latitude.
+
+ The instruments of a space system point relative to its body: their
+ roll and pitch angles, scan azimuths, and pixels are measured from the
+ body's axes. For example, a yaw angle of 180 degrees (flying backward)
+ swaps the left and right of a cross-track scanner and the fore and aft
+ of a conical scan. An instrument's field of regard remains measured from
+ nadir.
+ """
+
+ type: Literal["attitude"] = Field(
+ default="attitude", description="Attitude type discriminator."
+ )
+ velocity_frame: VelocityFrame = Field(
+ default=VelocityFrame.EARTH_FIXED,
+ description="Reference frame of the velocity vector that defines the "
+ + "along-track axis (`earth_fixed`: aligned with the ground track, as "
+ + "for a yaw-steered spacecraft; `inertial`: aligned with the orbit "
+ + "plane, as for a spacecraft without yaw steering).",
+ )
+ yaw_angle: float = Field(
+ default=0,
+ description="Rotation (degrees) of the body about the nadir axis, "
+ + "positive turning the front of the body to the left of the direction "
+ + "of motion (180: flying backward).",
+ ge=-180,
+ le=180,
+ )
+ roll_angle: float = Field(
+ default=0,
+ description="Rotation (degrees) of the body about its along-track axis, "
+ + "positive tilting its nadir axis to the left of the direction of motion.",
+ ge=-180,
+ le=180,
+ )
+ pitch_angle: float = Field(
+ default=0,
+ description="Rotation (degrees) of the body about its rolled "
+ + "cross-track axis, positive tilting its nadir axis forward.",
+ ge=-180,
+ le=180,
+ )
+ yaw_angle_profile: list[tuple[float, float]] | None = Field(
+ default=None,
+ description="Yaw angle (degrees) as a function of the satellite's "
+ + "argument of latitude (degrees from the ascending node, 0 to 360), as "
+ + "(argument of latitude, yaw angle) pairs interpolated linearly and "
+ + "periodically. If given, it overrides `yaw_angle`.",
+ min_length=1,
+ )
+ roll_angle_profile: list[tuple[float, float]] | None = Field(
+ default=None,
+ description="Roll angle (degrees) as a function of the satellite's "
+ + "argument of latitude (see `yaw_angle_profile`), for example the roll "
+ + "steering of a synthetic aperture radar. If given, it overrides "
+ + "`roll_angle`.",
+ min_length=1,
+ )
+ pitch_angle_profile: list[tuple[float, float]] | None = Field(
+ default=None,
+ description="Pitch angle (degrees) as a function of the satellite's "
+ + "argument of latitude (see `yaw_angle_profile`). If given, it "
+ + "overrides `pitch_angle`.",
+ min_length=1,
+ )
+
+ @field_validator("yaw_angle_profile", "roll_angle_profile", "pitch_angle_profile")
+ @classmethod
+ def _validate_angle_profile(
+ cls, profile: list[tuple[float, float]] | None, info
+ ) -> list[tuple[float, float]] | None:
+ """
+ Validates an angle profile (see `_check_angle_profile`).
+ """
+ return _check_angle_profile(profile, info.field_name.split("_")[0].title())
+
+ def get_angles(
+ self, orbit_track: Geocentric
+ ) -> tuple[npt.ArrayLike, npt.ArrayLike, npt.ArrayLike]:
+ """
+ Gets the yaw, roll, and pitch angles (degrees) of the body at the
+ satellite position(s) of an orbit track.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite
+ position/velocity (in an inertial frame).
+
+ Returns:
+ tuple[numpy.typing.ArrayLike, numpy.typing.ArrayLike, numpy.typing.ArrayLike]:
+ the yaw, roll, and pitch angles (degrees)
+ """
+ return tuple(
+ (
+ angle
+ if profile is None
+ else _interpolate_angle_profile(profile, orbit_track)
+ )
+ for angle, profile in (
+ (self.yaw_angle, self.yaw_angle_profile),
+ (self.roll_angle, self.roll_angle_profile),
+ (self.pitch_angle, self.pitch_angle_profile),
+ )
+ )
+
+ def get_body_angles(
+ self, orbit_track: Geocentric
+ ) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray]:
+ """
+ Gets the yaw, roll, and pitch angles (degrees) of the body and whether
+ its along-track axis is aligned with the inertial velocity, at each
+ time of an orbit track, as arrays with the shape of its times (as
+ used by the projection utilities, see
+ `tatc.utils.projection._compute_nadir_axes`).
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite
+ position/velocity (in an inertial frame).
+
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray]:
+ the yaw, roll, and pitch angles (degrees), and whether the
+ velocity frame is inertial
+ """
+ shape = np.shape(orbit_track.t.tt)
+ yaw, roll, pitch = (
+ np.broadcast_to(np.asarray(angle, dtype=float), shape)
+ for angle in self.get_angles(orbit_track)
+ )
+ inertial = np.full(shape, self.velocity_frame == VelocityFrame.INERTIAL)
+ return yaw, roll, pitch, inertial
+
+
+class TargetAttitude(BaseModel):
+ """
+ Attitude of a spacecraft's body that points its nadir axis at ground
+ targets, as for an agile satellite imaging sites or a target mode: at
+ each time, at the target closest to nadir (with the smallest off-nadir
+ angle) among those within `max_off_nadir_angle` of nadir and above the
+ horizon, and otherwise along nadir. The body is rotated by the yaw angle
+ about the nadir axis and then by the roll and pitch angles that point
+ its nadir axis at the target (see `tatc.utils.compute_view_angles`), so
+ that its along-track axis stays close to the direction of motion. The
+ body turns instantly between targets and nadir (slews are not modeled).
+
+ The fields of regard of its instruments (measured from nadir) should
+ include the off-nadir angles at which the body points. As an
+ instrument's view stays on a target while the body points at it, the
+ epoch of an observation of the target is a time while the body points
+ at it (rather than the time a view sweeps over it).
+ """
+
+ type: Literal["target"] = Field(
+ default="target", description="Attitude type discriminator."
+ )
+ targets: list[Point] = Field(
+ ..., min_length=1, description="The ground targets at which to point."
+ )
+ max_off_nadir_angle: float = Field(
+ default=30,
+ description="Maximum angle (degrees) from nadir at which the body "
+ + "points at a target.",
+ gt=0,
+ lt=90,
+ )
+ velocity_frame: VelocityFrame = Field(
+ default=VelocityFrame.EARTH_FIXED,
+ description="Reference frame of the velocity vector that defines the "
+ + "along-track axis (see `Attitude.velocity_frame`).",
+ )
+ yaw_angle: float = Field(
+ default=0,
+ description="Rotation (degrees) of the body about the nadir axis "
+ + "before pointing (see `Attitude.yaw_angle`).",
+ ge=-180,
+ le=180,
+ )
+
+ def _get_targets(self) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray]:
+ """
+ Gets the targets' longitudes, latitudes (degrees), and elevations (meters).
+ """
+ return tuple(
+ np.array([getattr(target, name) for target in self.targets], dtype=float)
+ for name in ("longitude", "latitude", "elevation")
+ )
+
+ def get_target_index(self, orbit_track: Geocentric) -> npt.NDArray:
+ """
+ Gets the index of the target at which the body points at each time of
+ an orbit track, or -1 if it points along nadir.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite
+ position/velocity (in an inertial frame).
+
+ Returns:
+ numpy.typing.NDArray: the target indices, with the shape of the
+ orbit track's times
+ """
+ shape = np.shape(orbit_track.t.tt)
+ p_m, nadir, _, _ = _compute_nadir_axes(orbit_track, self.velocity_frame)
+ p_m, nadir = np.reshape(p_m, (3, -1)), np.reshape(nadir, (3, -1))
+ longitude, latitude, elevation = self._get_targets()
+ xyz = np.array(wgs84.latlon(latitude, longitude, elevation).itrs_xyz.m)
+ up = np.array(
+ [
+ np.cos(np.radians(latitude)) * np.cos(np.radians(longitude)),
+ np.cos(np.radians(latitude)) * np.sin(np.radians(longitude)),
+ np.sin(np.radians(latitude)),
+ ]
+ )
+ off_nadir = np.full((len(self.targets), p_m.shape[1]), np.inf)
+ for k in range(len(self.targets)):
+ los = _compute_line_of_sight(xyz[:, k], p_m)
+ distance = np.linalg.norm(los, axis=0)
+ angle = np.degrees(
+ np.arccos(np.clip(np.sum(los * nadir, axis=0) / distance, -1, 1))
+ )
+ # above the target's horizon and within the maximum off-nadir angle
+ visible = (np.sum(-los * up[:, k : k + 1], axis=0) > 0) & (
+ angle <= self.max_off_nadir_angle
+ )
+ off_nadir[k] = np.where(visible, angle, np.inf)
+ index = np.where(
+ np.isfinite(off_nadir.min(axis=0)), np.argmin(off_nadir, axis=0), -1
+ )
+ return np.reshape(index, shape)
+
+ def get_body_angles(
+ self, orbit_track: Geocentric
+ ) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray]:
+ """
+ Gets the yaw, roll, and pitch angles (degrees) of the body and whether
+ its velocity frame is inertial, at each time of an orbit track (see
+ `Attitude.get_body_angles`): the roll and pitch angles that point its
+ nadir axis at the target of each time (see `get_target_index`), or
+ zero.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite
+ position/velocity (in an inertial frame).
+
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray]:
+ the yaw, roll, and pitch angles (degrees), and whether the
+ velocity frame is inertial
+ """
+ shape = np.shape(orbit_track.t.tt)
+ index = np.reshape(self.get_target_index(orbit_track), -1)
+ roll, pitch = np.zeros(index.shape), np.zeros(index.shape)
+ pointing = np.flatnonzero(index >= 0)
+ if len(pointing) > 0:
+ longitude, latitude, elevation = (
+ values[index[pointing]] for values in self._get_targets()
+ )
+ if len(shape) == 0:
+ track = orbit_track
+ target = wgs84.latlon(latitude[0], longitude[0], elevation[0])
+ else:
+ track = _index_orbit_track(orbit_track, pointing)
+ target = wgs84.latlon(latitude, longitude, elevation)
+ # the roll and pitch angles of the target in the yawed body frame
+ roll_angle, pitch_angle = compute_view_angles(
+ track,
+ target,
+ self.velocity_frame,
+ attitude=Attitude(
+ yaw_angle=self.yaw_angle, velocity_frame=self.velocity_frame
+ ),
+ )
+ roll[pointing] = np.reshape(roll_angle, -1)
+ pitch[pointing] = np.reshape(pitch_angle, -1)
+ return (
+ np.full(shape, float(self.yaw_angle)),
+ np.reshape(roll, shape),
+ np.reshape(pitch, shape),
+ np.full(shape, self.velocity_frame == VelocityFrame.INERTIAL),
+ )
+
+
+class GlintAttitude(BaseModel):
+ """
+ Attitude of a spacecraft's body that points its nadir axis at the sun
+ glint (the specular point, see `tatc.utils.compute_specular_point`), as
+ for the glint mode of a greenhouse gas sounder observing the ocean: at
+ each time, toward the specular point, or short of it toward nadir by an
+ offset angle (in the plane of the nadir axis and the line of sight to
+ the specular point), while the Sun is at least `min_solar_elevation`
+ above the horizon at the specular point (equal to the satellite's
+ elevation angle seen from it) and the body points within
+ `max_off_nadir_angle` of nadir, and otherwise along nadir. The body is
+ rotated by the yaw angle about the nadir axis and then by the roll and
+ pitch angles that point its nadir axis (see
+ `tatc.utils.compute_view_angles`), which follows the glint as it moves
+ with the satellite and the Sun.
+
+ The fields of regard of its instruments (measured from nadir) should
+ include the off-nadir angles at which the body points.
+ """
+
+ type: Literal["glint"] = Field(
+ default="glint", description="Attitude type discriminator."
+ )
+ max_off_nadir_angle: float = Field(
+ default=60,
+ description="Maximum angle (degrees) from nadir at which the body "
+ + "points toward the glint.",
+ gt=0,
+ lt=90,
+ )
+ offset_angle: float = Field(
+ default=0,
+ description="Angle (degrees) by which the body points short of the "
+ + "specular point, toward nadir, as for an instrument that observes "
+ + "near the glint rather than at its center.",
+ ge=0,
+ lt=90,
+ )
+ offset_angle_profile: list[tuple[float, float]] | None = Field(
+ default=None,
+ description="Offset angle (degrees, see `offset_angle`) as a function "
+ + "of the specular point's angle from nadir (degrees), as (off-nadir "
+ + "angle, offset angle) pairs interpolated linearly (and held at the "
+ + "first and last offsets beyond them). If given, it overrides "
+ + "`offset_angle`.",
+ min_length=1,
+ )
+ min_solar_elevation: float = Field(
+ default=0,
+ description="Minimum solar elevation angle (degrees) at the specular "
+ + "point at which the body points at it.",
+ ge=0,
+ lt=90,
+ )
+ velocity_frame: VelocityFrame = Field(
+ default=VelocityFrame.EARTH_FIXED,
+ description="Reference frame of the velocity vector that defines the "
+ + "along-track axis (see `Attitude.velocity_frame`).",
+ )
+ yaw_angle: float = Field(
+ default=0,
+ description="Rotation (degrees) of the body about the nadir axis "
+ + "before pointing (see `Attitude.yaw_angle`).",
+ ge=-180,
+ le=180,
+ )
+
+ @field_validator("offset_angle_profile")
+ @classmethod
+ def _validate_offset_angle_profile(
+ cls, profile: list[tuple[float, float]] | None
+ ) -> list[tuple[float, float]] | None:
+ """
+ Sorts an offset angle profile by off-nadir angle and checks its angles.
+ """
+ if profile is None:
+ return None
+ for off_nadir, offset in profile:
+ if not 0 <= off_nadir < 90:
+ raise ValueError("Off-nadir angles must be in [0, 90).")
+ if not 0 <= offset < 90:
+ raise ValueError("Offset angles must be in [0, 90).")
+ return sorted(profile)
+
+ def get_offset_angle(self, off_nadir_angle: npt.ArrayLike) -> npt.NDArray:
+ """
+ Gets the offset angle (degrees) toward nadir for specular points at
+ angles (degrees) from nadir (see `offset_angle_profile`).
+
+ Args:
+ off_nadir_angle (numpy.typing.ArrayLike): The specular points'
+ angles from nadir (degrees).
+
+ Returns:
+ numpy.typing.NDArray: the offset angles (degrees).
+ """
+ if self.offset_angle_profile is None:
+ return np.full(np.shape(off_nadir_angle), float(self.offset_angle))
+ angles, offsets = np.array(self.offset_angle_profile, dtype=float).T
+ return np.interp(off_nadir_angle, angles, offsets)
+
+ def get_aim_point(self, orbit_track: Geocentric) -> GeographicPosition:
+ """
+ Gets the point on the WGS 84 ellipsoid at which the body points at
+ each time of an orbit track: the specular point, or the point short
+ of it toward nadir by the offset angle, where the criteria are met,
+ or `NaN` where the body points along nadir.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite
+ position/velocity (in an inertial frame).
+
+ Returns:
+ skyfield.toposlib.GeographicPosition: the aim points.
+ """
+ point = compute_specular_point(orbit_track)
+ latitude = np.reshape(point.latitude.degrees, -1)
+ longitude = np.reshape(point.longitude.degrees, -1)
+ p_m, nadir, _, _ = _compute_nadir_axes(orbit_track, self.velocity_frame)
+ p_m, nadir = np.reshape(p_m, (3, -1)), np.reshape(nadir, (3, -1))
+ los = np.reshape(np.array(point.itrs_xyz.m), (3, -1)) - p_m
+ distance = np.linalg.norm(los, axis=0)
+ with np.errstate(invalid="ignore"):
+ los = los / distance
+ off_nadir = np.degrees(
+ np.arccos(np.clip(np.sum(los * nadir, axis=0), -1, 1))
+ )
+ # the elevation of the satellite (and of the Sun) seen from the point
+ up = np.array(
+ [
+ np.cos(np.radians(latitude)) * np.cos(np.radians(longitude)),
+ np.cos(np.radians(latitude)) * np.sin(np.radians(longitude)),
+ np.sin(np.radians(latitude)),
+ ]
+ )
+ elevation = np.degrees(np.arcsin(np.sum(-los * up, axis=0)))
+ # the direction offset toward nadir in the plane of nadir and the line of sight
+ angle = np.maximum(off_nadir - self.get_offset_angle(off_nadir), 0)
+ across = los - np.sum(los * nadir, axis=0) * nadir
+ across = across / np.linalg.norm(across, axis=0)
+ direction = np.cos(np.radians(angle)) * nadir + np.sin(
+ np.radians(angle)
+ ) * np.nan_to_num(across)
+ pointing = (
+ np.isfinite(latitude)
+ & (angle <= self.max_off_nadir_angle)
+ & (elevation >= self.min_solar_elevation)
+ )
+ aim = np.full(p_m.shape, np.nan)
+ if np.any(pointing):
+ position, found = compute_ellipsoid_intersection(
+ p_m[:, pointing], direction[:, pointing]
+ )
+ aim[:, pointing] = np.where(found, position, np.nan)
+ longitude, latitude, _ = rectangular_to_geodetic(aim)
+ if np.ndim(orbit_track.t.tt) == 0:
+ return wgs84.latlon(latitude[0], longitude[0])
+ return wgs84.latlon(latitude, longitude)
+
+ def get_body_angles(
+ self, orbit_track: Geocentric
+ ) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray]:
+ """
+ Gets the yaw, roll, and pitch angles (degrees) of the body and whether
+ its velocity frame is inertial, at each time of an orbit track (see
+ `Attitude.get_body_angles`): the roll and pitch angles that point its
+ nadir axis at the aim point (see `get_aim_point`), or zero.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite
+ position/velocity (in an inertial frame).
+
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray]:
+ the yaw, roll, and pitch angles (degrees), and whether the
+ velocity frame is inertial
+ """
+ shape = np.shape(orbit_track.t.tt)
+ point = self.get_aim_point(orbit_track)
+ latitude = np.reshape(point.latitude.degrees, -1)
+ longitude = np.reshape(point.longitude.degrees, -1)
+ roll, pitch = np.zeros(latitude.shape), np.zeros(latitude.shape)
+ pointing = np.flatnonzero(np.isfinite(latitude))
+ if len(pointing) > 0:
+ if len(shape) == 0:
+ track = orbit_track
+ target = wgs84.latlon(latitude[0], longitude[0])
+ else:
+ track = _index_orbit_track(orbit_track, pointing)
+ target = wgs84.latlon(latitude[pointing], longitude[pointing])
+ # the roll and pitch angles of the aim point in the yawed body frame
+ roll_angle, pitch_angle = compute_view_angles(
+ track,
+ target,
+ self.velocity_frame,
+ attitude=Attitude(
+ yaw_angle=self.yaw_angle, velocity_frame=self.velocity_frame
+ ),
+ )
+ roll[pointing] = np.reshape(roll_angle, -1)
+ pitch[pointing] = np.reshape(pitch_angle, -1)
+ return (
+ np.full(shape, float(self.yaw_angle)),
+ np.reshape(roll, shape),
+ np.reshape(pitch, shape),
+ np.full(shape, self.velocity_frame == VelocityFrame.INERTIAL),
+ )
+
+
+ScheduledAttitudes = Annotated[
+ Attitude | TargetAttitude | GlintAttitude, Field(discriminator="type")
+]
+"""Attitudes that a schedule may switch between."""
+
+
+class AttitudeSegment(BaseModel):
+ """
+ An attitude that applies from a start time (until the start of the next
+ segment of a schedule).
+ """
+
+ start: AwareDatetime = Field(
+ ..., description="Time (timezone-aware) from which the attitude applies."
+ )
+ attitude: ScheduledAttitudes = Field(..., description="The attitude.")
+
+
+class AttitudeSchedule(BaseModel):
+ """
+ Schedule of attitudes over time: each segment's attitude applies from its
+ start until the start of the next segment, and the first segment's
+ attitude also applies before its start. For example, a satellite that
+ periodically flips to fly backward (yaw 180 degrees) and forward, or
+ that alternates between observing modes.
+ """
+
+ type: Literal["schedule"] = Field(
+ default="schedule", description="Attitude type discriminator."
+ )
+ segments: list[AttitudeSegment] = Field(
+ ...,
+ min_length=1,
+ description="The segments, each with a start time and an attitude.",
+ )
+
+ @field_validator("segments")
+ @classmethod
+ def _sort_segments(cls, segments: list[AttitudeSegment]) -> list[AttitudeSegment]:
+ """
+ Sorts the segments by start time.
+ """
+ return sorted(segments, key=lambda segment: segment.start)
+
+ @classmethod
+ def from_attitudes(
+ cls,
+ starts: list[datetime],
+ attitudes: list[Attitude | TargetAttitude | GlintAttitude],
+ ) -> AttitudeSchedule:
+ """
+ Creates a schedule from the start times and attitudes of its segments.
+
+ Args:
+ starts (list[datetime.datetime]): The start times (timezone-aware).
+ attitudes (list[Attitude | TargetAttitude | GlintAttitude]): The
+ attitude of each segment.
+
+ Returns:
+ AttitudeSchedule: the schedule
+ """
+ if len(starts) != len(attitudes):
+ raise ValueError("Each segment needs a start time and an attitude.")
+ return cls(
+ segments=[
+ AttitudeSegment(start=start, attitude=attitude)
+ for start, attitude in zip(starts, attitudes)
+ ]
+ )
+
+ def get_attitude(self, time: datetime) -> Attitude | TargetAttitude | GlintAttitude:
+ """
+ Gets the attitude that applies at a time.
+
+ Args:
+ time (datetime.datetime): The time (timezone-aware).
+
+ Returns:
+ Attitude | TargetAttitude | GlintAttitude: the attitude
+ """
+ index = 0
+ for i, segment in enumerate(self.segments):
+ if segment.start <= time:
+ index = i
+ return self.segments[index].attitude
+
+ def get_body_angles(
+ self, orbit_track: Geocentric
+ ) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray]:
+ """
+ Gets the yaw, roll, and pitch angles (degrees) of the body and whether
+ its velocity frame is inertial, at each time of an orbit track, from
+ the attitude of the segment in which each time lies (see
+ `Attitude.get_body_angles`).
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite
+ position/velocity (in an inertial frame).
+
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray]:
+ the yaw, roll, and pitch angles (degrees), and whether the
+ velocity frame is inertial
+ """
+ tt = np.asarray(orbit_track.t.tt, dtype=float)
+ shape = np.shape(tt)
+ starts = np.atleast_1d(
+ orbit_track.t.ts.from_datetimes([s.start for s in self.segments]).tt
+ )
+ segment = np.maximum(
+ np.searchsorted(starts, np.reshape(tt, -1), "right") - 1, 0
+ )
+ yaw, roll, pitch = (np.zeros(segment.shape) for _ in range(3))
+ inertial = np.zeros(segment.shape, dtype=bool)
+ for i in np.unique(segment):
+ index = np.flatnonzero(segment == i)
+ track = (
+ orbit_track
+ if len(shape) == 0
+ else _index_orbit_track(orbit_track, index)
+ )
+ values = self.segments[i].attitude.get_body_angles(track)
+ for array, value in zip((yaw, roll, pitch, inertial), values):
+ array[index] = np.reshape(value, -1)
+ return tuple(np.reshape(array, shape) for array in (yaw, roll, pitch, inertial))
diff --git a/src/tatc/schemas/instrument/conical.py b/src/tatc/schemas/instrument/conical.py
index cb2fc350..a24d1eff 100644
--- a/src/tatc/schemas/instrument/conical.py
+++ b/src/tatc/schemas/instrument/conical.py
@@ -12,7 +12,6 @@
import numpy.typing as npt
from pydantic import Field, model_validator
from shapely import MultiPolygon, Polygon, unary_union
-from skyfield.constants import AU_M
from skyfield.framelib import itrs
from skyfield.positionlib import Geocentric
from skyfield.toposlib import GeographicPosition
@@ -22,7 +21,9 @@
from ...utils.projection import (
VelocityFrame,
_compute_projected_rays,
+ _shift_along_track,
compute_cone_and_azimuth,
+ compute_ground_sample_size,
compute_projected_ray_position,
)
from .simple import Instrument
@@ -48,27 +49,6 @@ def _cone_ray(cone_angle: float, azimuth: float) -> tuple[float, float]:
)
-def _shift_along_track(orbit_track: Geocentric, seconds: npt.ArrayLike) -> Geocentric:
- """
- Shifts satellite positions along their Earth-fixed velocity (a linear
- approximation of the motion relative to the ground over a short time).
-
- Args:
- orbit_track (skyfield.positionlib.Geocentric): The satellite position/velocity.
- seconds (numpy.typing.ArrayLike): The shift (seconds) at each time.
-
- Returns:
- skyfield.positionlib.Geocentric: The shifted satellite position/velocity.
- """
- position, velocity = orbit_track.frame_xyz_and_velocity(itrs)
- shifted = np.array(position.m) + np.array(velocity.m_per_s) * seconds
- # rotate from Earth-fixed to inertial (GCRS) coordinates at the same times
- gcrs = np.einsum("ji...,j...->i...", itrs.rotation_at(orbit_track.t), shifted)
- return Geocentric(
- gcrs / AU_M, orbit_track.velocity.au_per_d, orbit_track.t, center=399
- )
-
-
class ConicalInstrument(Instrument):
"""
Remote sensing instrument that scans a cone about the nadir: its view
@@ -110,6 +90,22 @@ class ConicalInstrument(Instrument):
gt=0,
le=180,
)
+ beam_width: float | None = Field(
+ default=None,
+ description="Angular width (degrees) of the beam (for example, its "
+ + "half-power width), which sets the size of a sample on the ground "
+ + "(see `compute_sample_size`), or `None` if not modeled.",
+ gt=0,
+ lt=90,
+ )
+ scan_sample_spacing: float | None = Field(
+ default=None,
+ description="Scan azimuth (degrees) between the centers of neighboring "
+ + "samples along the scanned arc (see `compute_sample_spacing`), or "
+ + "`None` if not modeled.",
+ gt=0,
+ le=180,
+ )
velocity_frame: VelocityFrame = Field(
default=VelocityFrame.EARTH_FIXED,
description="Reference frame of the velocity vector that defines the "
@@ -263,6 +259,7 @@ def project(rays):
self.velocity_frame,
self.nadir_reference,
ground_elevation=ground_elevation,
+ attitude=self._attitude,
)[:2]
return np.stack([geos[0], geos[1]], axis=-1)
@@ -299,6 +296,100 @@ def project(rays):
footprints.append(project_polygon_to_elevation(footprint, elevation))
return footprints
+ def compute_sample_size(
+ self, orbit_track: Geocentric, target: GeographicPosition
+ ) -> tuple[npt.NDArray, npt.NDArray]:
+ """
+ Computes the size on the ground (meters) of the beam viewing a
+ target, along track and across track (see
+ `tatc.utils.compute_ground_sample_size`): the beam is circular, but
+ its footprint is longer in the direction of the view (along track,
+ for a view ahead of the satellite), as the view is oblique. The sizes
+ are `NaN` if the beam width is not modeled.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite position/velocity.
+ target (skyfield.toposlib.GeographicPosition): The target position
+ (a single target, or one target for each time of the orbit track).
+
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray]: the along-track
+ and cross-track sizes (meters).
+ """
+ if self.beam_width is None:
+ nan = np.full(
+ np.broadcast(
+ np.asarray(orbit_track.t.tt), np.asarray(target.latitude.degrees)
+ ).shape,
+ np.nan,
+ )
+ return nan, nan.copy()
+ return compute_ground_sample_size(
+ orbit_track,
+ target,
+ self.beam_width,
+ self.beam_width,
+ self.velocity_frame,
+ nadir_reference=self.nadir_reference,
+ attitude=self._attitude,
+ )
+
+ def compute_sample_spacing(
+ self, orbit_track: Geocentric, target: GeographicPosition
+ ) -> tuple[npt.NDArray, npt.NDArray]:
+ """
+ Computes the spacing on the ground (meters) between the centers of
+ neighboring samples viewing a target: along track, the distance the
+ scanned arc advances between scans (subtended at nadir by the
+ along-track field of view), and across track, the distance between
+ samples along the scanned arc (the scan sample spacing times the
+ arc's radius on the ground, from the sub-satellite point to the
+ target). The cross-track spacing is `NaN` if the scan sample spacing
+ is not modeled.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite position/velocity.
+ target (skyfield.toposlib.GeographicPosition): The target position
+ (a single target, or one target for each time of the orbit track).
+
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray]: the along-track
+ and cross-track spacings (meters).
+ """
+ position = np.reshape(np.array(orbit_track.frame_xyz(itrs).m), (3, -1))
+ radius = np.linalg.norm(position, axis=0)
+ # the along-track distance swept per scan (see _sweep_time)
+ along = (
+ 2
+ * (radius - constants.EARTH_MEAN_RADIUS)
+ * np.tan(np.radians(self.along_track_field_of_view / 2))
+ )
+ target_xyz = np.reshape(np.array(target.itrs_xyz.m), (3, -1))
+ # the Earth central angle from the sub-satellite point to the target
+ central = np.arccos(
+ np.clip(
+ np.sum(position * target_xyz, axis=0)
+ / radius
+ / np.linalg.norm(target_xyz, axis=0),
+ -1,
+ 1,
+ )
+ )
+ along, central = np.broadcast_arrays(along, central)
+ cross = np.full(central.shape, np.nan)
+ if self.scan_sample_spacing is not None:
+ cross = (
+ central
+ * np.linalg.norm(target_xyz, axis=0)
+ * np.radians(self.scan_sample_spacing)
+ )
+ if (
+ np.ndim(np.asarray(orbit_track.t.tt)) == 0
+ and np.ndim(target.latitude.degrees) == 0
+ ):
+ return along[0], cross[0]
+ return along, cross
+
def compute_footprint_center(
self,
orbit_track: Geocentric,
@@ -329,6 +420,7 @@ def compute_footprint_center(
velocity_frame=self.velocity_frame,
nadir_reference=self.nadir_reference,
ground_elevation=ground_elevation,
+ attitude=self._attitude,
)
def is_in_field_of_view(
@@ -358,6 +450,7 @@ def is_in_field_of_view(
target,
self.velocity_frame,
self.nadir_reference,
+ attitude=self._attitude,
)
for f in (-1, 0, 1)
]
diff --git a/src/tatc/schemas/instrument/pointed.py b/src/tatc/schemas/instrument/pointed.py
index 0e360b0a..36b9ee9d 100644
--- a/src/tatc/schemas/instrument/pointed.py
+++ b/src/tatc/schemas/instrument/pointed.py
@@ -14,11 +14,13 @@
from skyfield.positionlib import Geocentric
from skyfield.toposlib import GeographicPosition
-from ...utils.orbital import compute_argument_of_latitude
+from ...utils.orbital import _check_angle_profile, _interpolate_angle_profile
from ...utils.projection import (
VelocityFrame,
ViewGeometry,
compute_footprint,
+ compute_ground_advance,
+ compute_ground_sample_size,
compute_projected_ray_position,
compute_view_angles,
compute_view_tangents,
@@ -100,16 +102,28 @@ class PointedInstrument(Instrument):
)
cross_track_oversampling: float = Field(
default=0,
- description="Fraction of pixel overlap in cross-track direction.",
- ge=0,
+ description="Fraction of pixel overlap in cross-track direction: the "
+ + "fraction of a pixel's instantaneous field of view shared with its "
+ + "neighbor (negative for a gap between pixels, as a fraction of the "
+ + "instantaneous field of view).",
lt=1,
)
along_track_oversampling: float = Field(
default=0,
- description="Fraction of pixel overlap in along-track direction.",
- ge=0,
+ description="Fraction of pixel overlap in along-track direction: the "
+ + "fraction of a pixel's instantaneous field of view shared with its "
+ + "neighbor (negative for a gap between pixels, as a fraction of the "
+ + "instantaneous field of view).",
lt=1,
)
+ scan_period: float | None = Field(
+ default=None,
+ description="Period (seconds) between consecutive scans of a scanning "
+ + "instrument (for example, 8/3 s for ATMS), whose scans are spaced along "
+ + "track by the distance they advance on the ground in one period (see "
+ + "`compute_sample_spacing`), or `None` if not modeled.",
+ gt=0,
+ )
velocity_frame: VelocityFrame = Field(
default=VelocityFrame.EARTH_FIXED,
description="Reference frame of the velocity vector that defines the "
@@ -118,6 +132,140 @@ class PointedInstrument(Instrument):
+ "plane, as for a spacecraft without yaw steering).",
)
+ def get_cross_track_sample_spacing(self) -> float:
+ """
+ Gets the angular spacing (degrees) between the centers of neighboring
+ cross-track pixels: the field of view divided among the pixels.
+
+ Returns:
+ float: the cross-track sample spacing (degrees)
+ """
+ return self.cross_track_field_of_view / self.cross_track_pixels
+
+ def get_along_track_sample_spacing(self) -> float:
+ """
+ Gets the angular spacing (degrees) between the centers of neighboring
+ along-track pixels: the field of view divided among the pixels.
+
+ Returns:
+ float: the along-track sample spacing (degrees)
+ """
+ return self.along_track_field_of_view / self.along_track_pixels
+
+ def compute_sample_size(
+ self, orbit_track: Geocentric, target: GeographicPosition
+ ) -> tuple[npt.NDArray, npt.NDArray]:
+ """
+ Computes the size on the ground (meters) of a pixel viewing a target:
+ the extent of its instantaneous field of view along track and across
+ track, centered on the line of sight to the target (see
+ `tatc.utils.compute_ground_sample_size`). The sizes grow with the
+ slant range and, in the direction of a view off nadir, with the
+ obliquity of the view.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite position/velocity.
+ target (skyfield.toposlib.GeographicPosition): The target position
+ (a single target, or one target for each time of the orbit track).
+
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray]: the along-track
+ and cross-track sizes (meters).
+ """
+ return self._compute_ground_extent(
+ orbit_track,
+ target,
+ self.get_along_track_instantaneous_field_of_view(),
+ self.get_cross_track_instantaneous_field_of_view(),
+ )
+
+ def compute_sample_spacing(
+ self, orbit_track: Geocentric, target: GeographicPosition
+ ) -> tuple[npt.NDArray, npt.NDArray]:
+ """
+ Computes the spacing on the ground (meters) between the centers of
+ neighboring pixels viewing a target, along track and across track
+ (see `compute_sample_size`). A pixel smaller than the spacing (a
+ negative oversampling) leaves gaps between pixels, and a sensor
+ cannot resolve detail finer than the larger of the two.
+
+ The spacing is that of the angles between pixels, projected around
+ the line of sight to the target. For a scanning instrument with a
+ `scan_period`, the spacing along track is instead the larger of the
+ angular spacing between its pixels within a scan (if it has more than
+ one along track) and the distance the scan advances on the ground at
+ the target in one period, divided among its pixels along track (see
+ `tatc.utils.compute_ground_advance`). The advance, nearly constant
+ across the scan, spaces the scans of an instrument with one pixel
+ along track (such as a microwave sounder); toward the edges of the
+ swath, where the pixels of an array of detectors grow larger than the
+ advance, consecutive scans overlap and the spacing within a scan
+ dominates.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite position/velocity.
+ target (skyfield.toposlib.GeographicPosition): The target position
+ (a single target, or one target for each time of the orbit track).
+
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray]: the along-track
+ and cross-track spacings (meters).
+ """
+ along, cross = self._compute_ground_extent(
+ orbit_track,
+ target,
+ self.get_along_track_sample_spacing(),
+ self.get_cross_track_sample_spacing(),
+ )
+ if self.scan_period is None:
+ return along, cross
+ advance = compute_ground_advance(
+ orbit_track,
+ target,
+ self.scan_period,
+ self.velocity_frame,
+ self.nadir_reference,
+ self._attitude,
+ )
+ within_scan = along if self.along_track_pixels > 1 else 0
+ return np.maximum(within_scan, advance / self.along_track_pixels), cross
+
+ def _compute_ground_extent(
+ self,
+ orbit_track: Geocentric,
+ target: GeographicPosition,
+ along_track_angle: float,
+ cross_track_angle: float,
+ ) -> tuple[npt.NDArray, npt.NDArray]:
+ """
+ Computes the size on the ground (meters) of angular extents centered
+ on the line of sight to a target, along this instrument's view axes:
+ those of the rolled and pitched view, or, for a `ViewGeometry.SCAN`
+ view, of the scan plane tilted by the pitch angle.
+ """
+ if self.view_geometry == ViewGeometry.SCAN:
+ return compute_ground_sample_size(
+ orbit_track,
+ target,
+ along_track_angle,
+ cross_track_angle,
+ self.velocity_frame,
+ nadir_reference=self.nadir_reference,
+ tilt_angle=self.get_pitch_angle(orbit_track),
+ attitude=self._attitude,
+ )
+ return compute_ground_sample_size(
+ orbit_track,
+ target,
+ along_track_angle,
+ cross_track_angle,
+ self.velocity_frame,
+ self.get_roll_angle(orbit_track),
+ self.get_pitch_angle(orbit_track),
+ self.nadir_reference,
+ attitude=self._attitude,
+ )
+
def get_cross_track_instantaneous_field_of_view(self) -> float:
"""
Gets the instananeous field of view (degrees) for cross-track pixels.
@@ -177,6 +325,7 @@ def compute_footprint(
nadir_reference=self.nadir_reference,
view_geometry=self.view_geometry,
ground_elevation=ground_elevation,
+ attitude=self._attitude,
)
@field_validator("roll_angle_profile", "pitch_angle_profile")
@@ -189,15 +338,8 @@ def _validate_angle_profile(
lie in [0, 360) and its angles in [-180, 180], and sorts it by
argument of latitude.
"""
- if profile is None:
- return None
kind = "Roll" if info.field_name == "roll_angle_profile" else "Pitch"
- for argument, angle in profile:
- if not 0 <= argument < 360:
- raise ValueError("Arguments of latitude must be in [0, 360).")
- if not -180 <= angle <= 180:
- raise ValueError(f"{kind} angles must be in [-180, 180].")
- return sorted(profile)
+ return _check_angle_profile(profile, kind)
@staticmethod
def _interpolate_angle_profile(
@@ -215,12 +357,7 @@ def _interpolate_angle_profile(
Returns:
float | numpy.typing.NDArray[numpy.float64]: the angle(s) (degrees)
"""
- argument = compute_argument_of_latitude(
- orbit_track.position.m, orbit_track.velocity.m_per_s
- )
- arguments, angles = zip(*profile)
- angle = np.interp(argument, arguments, angles, period=360)
- return float(angle) if np.ndim(angle) == 0 else angle
+ return _interpolate_angle_profile(profile, orbit_track)
def get_roll_angle(
self, orbit_track: Geocentric | None = None
@@ -284,6 +421,7 @@ def is_in_field_of_view(
self.velocity_frame,
self.nadir_reference,
self.get_pitch_angle(orbit_track),
+ attitude=self._attitude,
)
# angular offsets from the view center, normalized by the half widths
cross_offset = (
@@ -298,6 +436,7 @@ def is_in_field_of_view(
self.get_roll_angle(orbit_track),
self.get_pitch_angle(orbit_track),
self.nadir_reference,
+ attitude=self._attitude,
)
# offsets from the view center, normalized by the view half widths
along_offset = along / np.tan(
@@ -343,6 +482,7 @@ def compute_footprint_center(
velocity_frame=self.velocity_frame,
nadir_reference=self.nadir_reference,
ground_elevation=ground_elevation,
+ attitude=self._attitude,
)
def compute_projected_pixel_position(
@@ -383,6 +523,7 @@ def compute_projected_pixel_position(
nadir_reference=self.nadir_reference,
tilt_angle=self.get_pitch_angle(orbit_track),
ground_elevation=ground_elevation,
+ attitude=self._attitude,
)
cone, clock = self.get_pixel_cone_and_clock_angle(
cross_track_index, along_track_index
@@ -405,6 +546,7 @@ def compute_projected_pixel_position(
velocity_frame=self.velocity_frame,
nadir_reference=self.nadir_reference,
ground_elevation=ground_elevation,
+ attitude=self._attitude,
)
def _get_pixel_offsets(
@@ -422,18 +564,13 @@ def _get_pixel_offsets(
Returns:
tuple[float, float]: the cross-track and along-track offsets (degrees).
"""
+ # pixel centers are spaced evenly across the field of view
cross_track_offset = (
- (0.5 + cross_track_index - self.cross_track_pixels / 2)
- * (1 - self.cross_track_oversampling)
- * self.cross_track_field_of_view
- / self.cross_track_pixels
- )
+ 0.5 + cross_track_index - self.cross_track_pixels / 2
+ ) * self.get_cross_track_sample_spacing()
along_track_offset = (
- (self.along_track_pixels / 2 - 0.5 - along_track_index)
- * (1 - self.along_track_oversampling)
- * self.along_track_field_of_view
- / self.along_track_pixels
- )
+ self.along_track_pixels / 2 - 0.5 - along_track_index
+ ) * self.get_along_track_sample_spacing()
return cross_track_offset, along_track_offset
def get_pixel_cone_and_clock_angle(
diff --git a/src/tatc/schemas/instrument/simple.py b/src/tatc/schemas/instrument/simple.py
index 4e476cfa..70492365 100644
--- a/src/tatc/schemas/instrument/simple.py
+++ b/src/tatc/schemas/instrument/simple.py
@@ -7,16 +7,19 @@
from __future__ import annotations
from datetime import timedelta
+from typing import Any
import numpy as np
import numpy.typing as npt
-from pydantic import BaseModel, Field, model_validator
+
+from pydantic import BaseModel, Field, PrivateAttr, model_validator
from shapely import MultiPolygon, Polygon
from skyfield.api import wgs84
from skyfield.positionlib import Geocentric
from skyfield.toposlib import GeographicPosition
from ...constants import de421
+from ...utils.glint import compute_glint_angle
from ...utils.observation import (
compute_min_elevation_angle,
field_of_regard_to_swath_width,
@@ -76,6 +79,26 @@ class Instrument(BaseModel):
le=90,
examples=[-12],
)
+ min_target_glint_angle: float | None = Field(
+ default=None,
+ description="Minimum glint angle (degrees) at the target for valid "
+ + "observation (`None`: no requirement): the angle between the "
+ + "directions toward the satellite and of the Sun's specular "
+ + "reflection (see `tatc.utils.compute_glint_angle`), for example to "
+ + "avoid sun glint over water.",
+ ge=0,
+ le=180,
+ examples=[25],
+ )
+ max_target_glint_angle: float | None = Field(
+ default=None,
+ description="Maximum glint angle (degrees) at the target for valid "
+ + "observation (`None`: no requirement), for example to observe in "
+ + "sun glint over water.",
+ ge=0,
+ le=180,
+ examples=[10],
+ )
access_time_fixed: bool = Field(
default=False, description="`True`, if access time is fixed to minimum value."
)
@@ -86,6 +109,35 @@ class Instrument(BaseModel):
+ "toward the Earth's center). The two differ by up to about 0.19 "
+ "degrees at middle latitudes.",
)
+ # the attitude of the space system that carries this instrument (see
+ # `bind_attitude`), from which its views are rotated
+ _attitude: Any = PrivateAttr(default=None)
+
+ @property
+ def platform_attitude(self) -> Any:
+ """
+ The attitude of the space system that carries this instrument, from
+ which its views are rotated (see `SpaceSystem.get_instrument`), or
+ `None` for a body aligned with the nadir frame.
+ """
+ return self._attitude
+
+ def bind_attitude(self, attitude: Any) -> "Instrument":
+ """
+ Gets a copy of this instrument carried by a space system with an
+ attitude (see `tatc.schemas.Attitude` and
+ `tatc.schemas.AttitudeSchedule`): its views (but not its field of
+ regard, measured from nadir) are rotated from the body's axes.
+
+ Args:
+ attitude (Any): The attitude, or `None`.
+
+ Returns:
+ Instrument: the bound copy
+ """
+ bound = self.model_copy()
+ bound._attitude = attitude # pylint: disable=protected-access
+ return bound
@model_validator(mode="after")
def check_target_solar_elevation_range(self) -> "Instrument":
@@ -101,6 +153,14 @@ def check_target_solar_elevation_range(self) -> "Instrument":
raise ValueError(
"min_target_solar_elevation must not exceed max_target_solar_elevation"
)
+ if (
+ self.min_target_glint_angle is not None
+ and self.max_target_glint_angle is not None
+ and self.min_target_glint_angle > self.max_target_glint_angle
+ ):
+ raise ValueError(
+ "min_target_glint_angle must not exceed max_target_glint_angle"
+ )
return self
def get_swath_width(self, height: float) -> float:
@@ -195,9 +255,9 @@ def is_valid_observation(
self, orbit_track: Geocentric, target: GeographicPosition | None = None
) -> npt.NDArray[np.bool_]:
"""Determines if an instrument can provide a valid observations: the
- instrument's sunlit state and the target's sunlit state and solar
- elevation angle (without atmospheric refraction) must satisfy any
- requirements.
+ instrument's sunlit state and the target's sunlit state, solar
+ elevation angle (without atmospheric refraction), and glint angle
+ must satisfy any requirements.
Args:
orbit_track (skyfield.positionlib.Geocentric): orbit track position/velocity from Skyfield
@@ -240,4 +300,17 @@ def is_valid_observation(
is_valid = np.logical_and(
is_valid, solar_alt <= self.max_target_solar_elevation
)
+ if (
+ self.min_target_glint_angle is not None
+ or self.max_target_glint_angle is not None
+ ):
+ glint_angle = compute_glint_angle(orbit_track, target)
+ if self.min_target_glint_angle is not None:
+ is_valid = np.logical_and(
+ is_valid, glint_angle >= self.min_target_glint_angle
+ )
+ if self.max_target_glint_angle is not None:
+ is_valid = np.logical_and(
+ is_valid, glint_angle <= self.max_target_glint_angle
+ )
return is_valid
diff --git a/src/tatc/schemas/orbit/gp.py b/src/tatc/schemas/orbit/gp.py
index cbc9956b..cd73bafa 100644
--- a/src/tatc/schemas/orbit/gp.py
+++ b/src/tatc/schemas/orbit/gp.py
@@ -14,7 +14,7 @@
import numpy as np
import numpy.typing as npt
-from pydantic import BaseModel, Field, model_validator
+from pydantic import AwareDatetime, BaseModel, Field, model_validator
from shapely.geometry import Point as ShapelyPoint
from skyfield.api import Time, wgs84
from skyfield.positionlib import Geocentric
@@ -44,7 +44,9 @@ class GeneralPerturbationsOrbit(BaseModel):
Orbit defined with general perturbations (GP) elements.
The orbit is propagated with SGP4, using whichever element's epoch is
- closest to each time. Optionally (with `repeat_cycle` and `remove_drag`),
+ closest to each time, or, if `element_switch_times` are given, the
+ element between the switches before and after each time (see
+ `get_element_index`). Optionally (with `repeat_cycle` and `remove_drag`),
it is propagated as an orbit maintained against drag on a repeat ground
track, which SGP4 does not model: if the orbit declares a repeat cycle or
one is found (see `GeneralPerturbationsElements.get_repeat_cycle`), times
@@ -80,6 +82,18 @@ class GeneralPerturbationsOrbit(BaseModel):
+ "A repeat cycle requires `remove_drag`, as the orbit is maintained "
+ "against drag.",
)
+ element_switch_times: list[AwareDatetime] | None = Field(
+ default=None,
+ description="Times at which propagation switches from each element "
+ + "(sorted by epoch) to the next, one fewer than the elements, each "
+ + "between the epochs of the elements before and after it: element "
+ + "k is used from switch k - 1 until switch k. None (the default) "
+ + "switches midway between consecutive epochs, using the element whose "
+ + "epoch is closest to each time. Common switch times keep satellites "
+ + "whose elements are published at slightly different times (as in a "
+ + "formation) on elements of the same epochs; see "
+ + "`tatc.utils.align_element_switches`.",
+ )
@model_validator(mode="after")
def _sort_elements_by_epoch(self) -> GeneralPerturbationsOrbit:
@@ -103,6 +117,30 @@ def _validate_repeat_cycle(self) -> GeneralPerturbationsOrbit:
raise ValueError("repeat_cycle requires remove_drag=True.")
return self
+ @model_validator(mode="after")
+ def _validate_element_switch_times(self) -> GeneralPerturbationsOrbit:
+ """
+ Validates that element switch times, if any, number one fewer than
+ the elements and that each lies between the epochs of the elements
+ (sorted by epoch) before and after it, which also orders them.
+ """
+ if self.element_switch_times is None:
+ return self
+ if len(self.element_switch_times) != len(self.elements) - 1:
+ raise ValueError(
+ f"element_switch_times must have one fewer entry than elements "
+ f"({len(self.elements) - 1}), not {len(self.element_switch_times)}."
+ )
+ epochs = self.get_element_epochs()
+ for k, switch in enumerate(self.element_switch_times):
+ if not epochs[k] <= switch <= epochs[k + 1]:
+ raise ValueError(
+ f"element_switch_times[{k}] ({switch}) is not between the "
+ f"epochs of elements {k} ({epochs[k]}) and {k + 1} "
+ f"({epochs[k + 1]})."
+ )
+ return self
+
def get_semimajor_axis(self, index: int = 0) -> float:
"""
Gets the semimajor axis of the specified element.
@@ -442,6 +480,7 @@ def get_derived_orbit(
elements=derived_elements,
remove_drag=self.remove_drag,
repeat_cycle=self.repeat_cycle,
+ element_switch_times=self.element_switch_times,
)
@overload
@@ -498,6 +537,66 @@ def get_closest_element_index(
closest = np.where(use_preceding, indices - 1, indices)
return int(closest[0]) if is_scalar else closest.tolist()
+ def _get_element_switch_times_ns(self) -> npt.NDArray[np.datetime64]:
+ """
+ Gets the element switch times as a cached array (see
+ `element_switch_times`), which must not be None.
+
+ Returns:
+ numpy.typing.NDArray[numpy.datetime64]: the switch times
+ """
+ return get_cached(
+ self,
+ "element_switch_times_ns",
+ tuple(self.element_switch_times),
+ lambda: utils.to_datetime64_ns(self.element_switch_times),
+ )
+
+ @overload
+ def get_element_index(self, at_times: None) -> int: ...
+
+ @overload
+ def get_element_index(self, at_times: datetime) -> int: ...
+
+ @overload
+ def get_element_index(self, at_times: list[datetime]) -> list[int]: ...
+
+ @overload
+ def get_element_index(self, at_times: npt.NDArray[np.datetime64]) -> list[int]: ...
+
+ @overload
+ def get_element_index(self, at_times: Time) -> int | list[int]: ...
+
+ def get_element_index(
+ self,
+ at_times: datetime | list[datetime] | npt.NDArray[np.datetime64] | Time | None,
+ ) -> int | list[int]:
+ """
+ Gets the index of the element that propagates the orbit at specified
+ time(s): the element whose epoch is closest (see
+ `get_closest_element_index`), or, if `element_switch_times` are given,
+ the element between the switches before and after each time. A time
+ exactly at a switch selects the later element.
+
+ Args:
+ at_times (datetime | list[datetime] | npt.NDArray[np.datetime64] | Time | None):
+ specified times (a Skyfield `Time` may be a scalar or an array),
+ or None to always select the first element (index 0)
+
+ Returns:
+ int | list[int]: element index (for a scalar time) or indices
+ """
+ if self.element_switch_times is None or at_times is None:
+ return self.get_closest_element_index(at_times)
+ at_time_array = utils.to_datetime64_ns(at_times)
+ is_scalar = np.ndim(at_time_array) == 0
+ indices = np.searchsorted(
+ self._get_element_switch_times_ns(),
+ np.atleast_1d(at_time_array),
+ side="right",
+ )
+ return int(indices[0]) if is_scalar else indices.tolist()
+
@overload
def get_closest_element(self, at_times: None) -> GeneralPerturbationsElements: ...
@@ -539,10 +638,11 @@ def partition_by_element_index(
) -> tuple[list[datetime], list[int]]:
"""
Partitions the time range [start, end] into consecutive segments,
- each assigned the index of whichever element is closest throughout
- that segment. The closest element switches at the midpoint between
- consecutive elements' epochs, so only midpoints strictly inside
- (start, end) become segment boundaries.
+ each assigned the index of the element that propagates the orbit
+ throughout that segment (see `get_element_index`). The element
+ switches at `element_switch_times` or, by default, at the midpoint
+ between consecutive elements' epochs, so only switches strictly
+ inside (start, end) become segment boundaries.
Args:
start (datetime): Start time.
@@ -554,18 +654,23 @@ def partition_by_element_index(
index for each of the N segments between consecutive
boundaries (length N).
"""
- epochs = self.get_element_epochs()
- epoch_midpoints = [
- epochs[i] + (epochs[i + 1] - epochs[i]) / 2 for i in range(len(epochs) - 1)
- ]
+ if self.element_switch_times is None:
+ epochs = self.get_element_epochs()
+ switches = [
+ epochs[i] + (epochs[i + 1] - epochs[i]) / 2
+ for i in range(len(epochs) - 1)
+ ]
+ else:
+ switches = self.element_switch_times
+ # distinct switches only (consecutive switches may coincide)
boundary_times = (
- [start] + [t for t in epoch_midpoints if start < t < end] + [end]
+ [start] + sorted({t for t in switches if start < t < end}) + [end]
)
segment_midpoints = [
boundary_times[i] + (boundary_times[i + 1] - boundary_times[i]) / 2
for i in range(len(boundary_times) - 1)
]
- return boundary_times, self.get_closest_element_index(segment_midpoints)
+ return boundary_times, self.get_element_index(segment_midpoints)
def get_repeat_cycle(
self,
@@ -737,7 +842,8 @@ def get_orbit_track_at_time(self, t: Time) -> Geocentric:
inertial (GCRS) frame.
Each time is propagated with whichever element's epoch is closest to
- it (see `get_closest_element_index`), so a vectorized `t` may draw
+ it, or the element between the `element_switch_times` around it (see
+ `get_element_index`), so a vectorized `t` may draw
from different elements for different entries. Unless `repeat_cycle`
is None, times before the first element's epoch and after the last
element's epoch are instead propagated with that element's repeat
@@ -763,8 +869,8 @@ def get_orbit_track_at_time(self, t: Time) -> Geocentric:
# interpolate the costly nutation angles (see _interpolate_nutation)
_interpolate_nutation(t)
first, last = self._get_repeat_tracks()
- # the source of each time: the closest element's index, or a repeat track
- sources = np.asarray(self.get_closest_element_index(t))
+ # the source of each time: the element's index, or a repeat track
+ sources = np.asarray(self.get_element_index(t))
if last is not None:
sources = np.where(t.tt >= last.epoch_time.tt, _LAST_REPEAT, sources)
if first is not None:
@@ -976,7 +1082,7 @@ def _get_observation_events(
if direct_start < direct_end:
self._warn_if_propagating_with_drag(
_to_time([direct_start, direct_end]),
- np.array(self.get_closest_element_index([direct_start, direct_end])),
+ np.array(self.get_element_index([direct_start, direct_end])),
)
parts, indices = self.partition_by_element_index(direct_start, direct_end)
boundaries.extend(parts[1:-1])
diff --git a/src/tatc/schemas/space/base.py b/src/tatc/schemas/space/base.py
index 9f1c08d9..f3e48a0a 100644
--- a/src/tatc/schemas/space/base.py
+++ b/src/tatc/schemas/space/base.py
@@ -6,10 +6,19 @@
from __future__ import annotations
-from pydantic import BaseModel, Field
+from typing import Annotated
+from pydantic import BaseModel, Field, model_validator
+
+from ..attitude import Attitude, AttitudeSchedule, GlintAttitude, TargetAttitude
from ..instrument import AllInstruments, Instrument
+AllAttitudes = Annotated[
+ Attitude | TargetAttitude | GlintAttitude | AttitudeSchedule,
+ Field(discriminator="type"),
+]
+"""Attitudes of a space system: about nadir, pointed at targets or the sun glint, or scheduled."""
+
class SpaceSystem(BaseModel):
"""
@@ -26,3 +35,42 @@ class SpaceSystem(BaseModel):
min_length=1,
description="List of assigned instruments.",
)
+ attitude: AllAttitudes | None = Field(
+ default=None,
+ description="Attitude of the spacecraft's body (or a schedule of "
+ + "attitudes), from which the views of its instruments are rotated, or "
+ + "`None` for a body aligned with the nadir frame (each instrument's "
+ + "`velocity_frame` then orients it).",
+ )
+
+ @model_validator(mode="after")
+ def _check_velocity_frames(self) -> "SpaceSystem":
+ """
+ Checks that instruments do not set a velocity frame if the attitude
+ sets the body's.
+ """
+ if self.attitude is not None:
+ for instrument in self.instruments:
+ if "velocity_frame" in instrument.model_fields_set:
+ raise ValueError(
+ f"Instrument {instrument.name!r} sets a velocity frame, "
+ + "but the attitude sets the body's (see Attitude.velocity_frame)."
+ )
+ return self
+
+ def get_instrument(self, index: int = 0) -> Instrument:
+ """
+ Gets an instrument carried by this space system, with its views
+ rotated from the axes of the body in its attitude (see
+ `Instrument.bind_attitude`).
+
+ Args:
+ index (int): The index of the instrument.
+
+ Returns:
+ Instrument: the instrument
+ """
+ instrument = self.instruments[index]
+ if self.attitude is None:
+ return instrument
+ return instrument.bind_attitude(self.attitude)
diff --git a/src/tatc/schemas/space/mog.py b/src/tatc/schemas/space/mog.py
index 8ebdf15e..31a97a19 100644
--- a/src/tatc/schemas/space/mog.py
+++ b/src/tatc/schemas/space/mog.py
@@ -158,6 +158,7 @@ def generate_members(self) -> list[Satellite]:
name=zero_pad(self.name, self.number_satellites, i + 1),
orbit=orbit,
instruments=copy.deepcopy(self.instruments),
+ attitude=copy.deepcopy(self.attitude),
)
for i, orbit in enumerate(orbits)
]
diff --git a/src/tatc/schemas/space/soc.py b/src/tatc/schemas/space/soc.py
index fb9faabf..c394bd4e 100644
--- a/src/tatc/schemas/space/soc.py
+++ b/src/tatc/schemas/space/soc.py
@@ -225,6 +225,7 @@ def generate_walker(self) -> WalkerConstellation:
name=self.name,
orbit=self.orbit,
instruments=self.instruments,
+ attitude=self.attitude,
number_satellites=number_satellites,
number_planes=number_planes,
# offset adjacent planes by half a within-plane satellite
@@ -257,6 +258,7 @@ def generate_members(self) -> list[Satellite]:
(i // satellites_per_plane) * spacing,
),
instruments=copy.deepcopy(self.instruments),
+ attitude=copy.deepcopy(self.attitude),
)
for i in range(number_satellites)
]
diff --git a/src/tatc/schemas/space/train.py b/src/tatc/schemas/space/train.py
index 24b48421..9778a466 100644
--- a/src/tatc/schemas/space/train.py
+++ b/src/tatc/schemas/space/train.py
@@ -110,6 +110,7 @@ def generate_members(self) -> list[Satellite]:
i * self.get_delta_mean_anomaly(), i * self.get_delta_raan()
),
instruments=copy.deepcopy(self.instruments),
+ attitude=copy.deepcopy(self.attitude),
)
for i in range(self.number_satellites)
]
diff --git a/src/tatc/schemas/space/walker.py b/src/tatc/schemas/space/walker.py
index 847ee815..860a1d82 100644
--- a/src/tatc/schemas/space/walker.py
+++ b/src/tatc/schemas/space/walker.py
@@ -192,6 +192,7 @@ def generate_members(self) -> list[Satellite]:
* self.get_delta_raan_between_planes(),
),
instruments=copy.deepcopy(self.instruments),
+ attitude=copy.deepcopy(self.attitude),
)
for i in range(self.number_satellites)
]
diff --git a/src/tatc/utils/__init__.py b/src/tatc/utils/__init__.py
index 1533bb7c..63d17f86 100644
--- a/src/tatc/utils/__init__.py
+++ b/src/tatc/utils/__init__.py
@@ -21,6 +21,7 @@
project_polygon_to_elevation,
split_polygon,
)
+from .glint import compute_glint_angle, compute_specular_point
from .observation import (
compute_along_track_field_of_view,
compute_field_of_regard,
@@ -60,9 +61,12 @@
compute_limb,
compute_projected_ray_position,
compute_static_track,
+ compute_ground_advance,
+ compute_ground_sample_size,
compute_view_angles,
compute_view_tangents,
)
+from .propagation import align_element_switches
from .radar import (
compute_radar_beam_height,
compute_radar_footprint,
@@ -80,6 +84,7 @@
"NadirReference",
"VelocityFrame",
"ViewGeometry",
+ "align_element_switches",
"altitude_to_pressure",
"buffer_footprint",
"buffer_target",
@@ -88,6 +93,7 @@
"compute_cone_and_azimuth",
"compute_field_of_regard",
"compute_footprint",
+ "compute_glint_angle",
"compute_ground_inertial_velocity",
"compute_ground_surface_velocity",
"compute_j2_aop_rate",
@@ -107,8 +113,11 @@
"compute_radar_ground_range",
"compute_radar_ground_range_bounds",
"compute_radar_slant_range",
+ "compute_specular_point",
"compute_static_track",
"compute_terrain_elevation_angle",
+ "compute_ground_advance",
+ "compute_ground_sample_size",
"compute_view_angles",
"compute_view_tangents",
"field_of_regard_to_swath_width",
diff --git a/src/tatc/utils/geometry.py b/src/tatc/utils/geometry.py
index 3634021f..026f5ee1 100644
--- a/src/tatc/utils/geometry.py
+++ b/src/tatc/utils/geometry.py
@@ -312,12 +312,12 @@ def _split_polygon_antimeridian(
- If the exterior encircles a pole (its longitude winds a full 360
degrees around the globe, e.g. a polar cap that does not itself
- exceed +/-90 degrees latitude), it is reconstructed with a flattened
- edge at the pole and split along the prime meridian instead of the
- antimeridian. Note: the raw result of this case may be reported as
- invalid (the two pieces touch along the shared prime-meridian cut
- edge); the public `split_polygon` function repairs this via
- `shapely.make_valid`.
+ exceed +/-90 degrees latitude, or a polygon such as Antarctica that
+ already includes edges along the pole and the anti-meridian), it is
+ reconstructed in its vertex order (which need not be monotonic in
+ longitude, as a coastline is not), unrolled across the anti-meridian,
+ closed with a flattened edge along the pole, and split along the
+ anti-meridian into the standard longitude range.
- Otherwise, coordinates are "unrolled" past +/-180 degrees according to
the cumulative jump direction, split along the antimeridian that the
unrolled coordinates cross, and wrapped back with
@@ -346,26 +346,58 @@ def _split_polygon_antimeridian(
winding = np.sum(diff - 360 * np.where(jump, np.round(diff / 360), 0))
# check if this polygon contains a pole
if np.abs(winding) > 180:
- # extract (lon, lat) only, discarding any z-dimension, and sort by longitude
- coords = exterior[:-1][np.argsort(exterior[:-1, 0], kind="stable")]
+ # (lon, lat) only, discarding any z-dimension, without the closing vertex
+ ring = exterior[:-1, :2]
# determine if contains north or south pole based on sign of mean latitude
- n_s = 1 if coords[:, 1].mean() > 0 else -1
- # interpolate latitude at antimeridian
- lat = np.interp(
- 180, [coords[-1, 0], coords[0, 0] + 180], [coords[-1, 1], coords[0, 1]]
- )
- # reconstruct polygon (ccw) with added coords on antimeridian and a
- # flattened edge along the pole, spanning -180 to 180 degrees
- return Polygon(
- np.concatenate(
- [
- [[-180, 90 * n_s], [-180, lat]],
- coords,
- [[180, lat], [180, 90 * n_s], [-180, 90 * n_s]],
- ]
- ),
- [shapely.get_coordinates(interior) for interior in polygon.interiors],
+ n_s = 1 if ring[:, 1].mean() > 0 else -1
+ # start the ring after a crossing of the anti-meridian and unroll
+ # its longitudes across any others, keeping the vertex order (the
+ # ring need not be monotonic in longitude, as a coastline is not)
+ step = np.diff(np.append(ring[:, 0], ring[0, 0]))
+ crossings = np.flatnonzero(np.abs(step) > 180)
+ if len(crossings) > 0:
+ ring = np.roll(ring, -(crossings[0] + 1), axis=0)
+ # unroll around the whole ring, back to its first vertex (shifted
+ # by the full winding of 360 degrees)
+ ring = np.concatenate([ring, ring[:1]])
+ step = np.diff(ring[:, 0])
+ step -= 360 * np.where(np.abs(step) > 180, np.round(step / 360), 0)
+ lon = ring[0, 0] + np.concatenate([[0], np.cumsum(step)])
+ # close the unrolled ring along the pole, and split it along the
+ # anti-meridian into the standard (-180, 180) longitude range
+ cap = make_valid(
+ Polygon(
+ np.concatenate(
+ [
+ np.column_stack([lon, ring[:, 1]]),
+ [[lon[-1], 90 * n_s], [lon[0], 90 * n_s]],
+ ]
+ )
+ )
)
+ pieces = [
+ shapely.transform(
+ shapely.intersection(cap, shapely.box(west, -90, west + 360, 90)),
+ lambda coords, offset=west: coords - [offset + 180, 0],
+ )
+ for west in (-540, -180, 180)
+ ]
+ parts = shapely.union_all(pieces)
+ if isinstance(parts, GeometryCollection):
+ parts = _convert_collection_to_polygon(parts)
+ if len(polygon.interiors) > 0:
+ # subtract the holes, each split like an exterior
+ parts = parts.difference(
+ shapely.union_all(
+ [
+ _split_polygon_antimeridian(Polygon(interior))
+ for interior in polygon.interiors
+ ]
+ )
+ )
+ if isinstance(parts, GeometryCollection):
+ parts = _convert_collection_to_polygon(parts)
+ return parts
# find anti-meridian crossings and calculate shift direction
# coords from W -> E (shift < 0) will add 360 degrees to E component
# coords from E -> W (shift > 0) will subtract 360 degrees from W component
diff --git a/src/tatc/utils/glint.py b/src/tatc/utils/glint.py
new file mode 100644
index 00000000..e3e292cc
--- /dev/null
+++ b/src/tatc/utils/glint.py
@@ -0,0 +1,184 @@
+"""
+Methods to compute the geometry of sun glint: the specular reflection of the
+Sun on the WGS 84 ellipsoid (as on a calm water surface) toward a satellite.
+
+@author: Paul T. Grogan
+"""
+
+from __future__ import annotations
+
+import numpy as np
+import numpy.typing as npt
+from skyfield.api import wgs84
+from skyfield.framelib import itrs
+from skyfield.positionlib import Geocentric
+from skyfield.timelib import Time
+from skyfield.toposlib import GeographicPosition
+
+from ..constants import de421
+from .ellipsoid import geodetic_to_rectangular, rectangular_to_geodetic
+
+
+def _unit(vector: npt.NDArray) -> npt.NDArray:
+ """
+ Normalizes vectors (stacked on the first axis).
+ """
+ return vector / np.linalg.norm(vector, axis=0)
+
+
+def _get_sun_position(t: Time) -> npt.NDArray:
+ """
+ Gets the Earth-fixed (ITRS) position (meters, shape (3, N)) of the Sun
+ relative to the Earth's center at times.
+ """
+ sun = de421["earth"].at(t).observe(de421["sun"]).frame_xyz(itrs).m
+ return np.reshape(np.array(sun), (3, -1))
+
+
+def _get_surface_axes(
+ longitude: npt.ArrayLike, latitude: npt.ArrayLike
+) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray]:
+ """
+ Gets the geodetic up (normal), east, and north unit vectors (Earth-fixed,
+ shape (3, ...)) at geodetic coordinates (degrees).
+ """
+ lon, lat = np.radians(longitude), np.radians(latitude)
+ up = np.array([np.cos(lat) * np.cos(lon), np.cos(lat) * np.sin(lon), np.sin(lat)])
+ east = np.array([-np.sin(lon), np.cos(lon), np.zeros(np.shape(lon))])
+ north = np.array(
+ [-np.sin(lat) * np.cos(lon), -np.sin(lat) * np.sin(lon), np.cos(lat)]
+ )
+ return up, east, north
+
+
+def _get_specular_residual(
+ longitude: npt.NDArray,
+ latitude: npt.NDArray,
+ satellite: npt.NDArray,
+ sun: npt.NDArray,
+) -> npt.NDArray:
+ """
+ Gets the components (east and north) of the sum of the unit vectors
+ toward the satellite and the Sun in the surface's tangent plane, which
+ vanish at the specular point (where the surface normal bisects them).
+ """
+ position = geodetic_to_rectangular(longitude, latitude)
+ bisector = _unit(satellite - position) + _unit(sun - position)
+ _, east, north = _get_surface_axes(longitude, latitude)
+ return np.array([np.sum(bisector * east, axis=0), np.sum(bisector * north, axis=0)])
+
+
+def compute_specular_point(
+ orbit_track: Geocentric, max_iterations: int = 30
+) -> GeographicPosition:
+ """
+ Compute the specular point (the center of the sun glint) seen from a
+ satellite: the point on the WGS 84 ellipsoid where the surface normal
+ bisects the directions toward the satellite and toward the Sun, so that
+ sunlight reflected by a level surface there (for example, calm water)
+ reaches the satellite. At the specular point, the Sun and the satellite
+ are at the same elevation angle, in opposite azimuths. The point is found
+ by Newton's method on the geodetic coordinates, from the point beneath
+ the bisector of the directions toward the satellite and the Sun from the
+ Earth's center. It is undefined (`NaN`) where the Sun is below the
+ horizon at the point, as when the satellite is over the night side of
+ the Earth.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): the satellite orbit track.
+ max_iterations (int): The maximum number of iterations.
+
+ Returns:
+ skyfield.toposlib.GeographicPosition: the specular point (one for each
+ time of the orbit track).
+ """
+ satellite = np.reshape(np.array(orbit_track.frame_xyz(itrs).m), (3, -1))
+ sun = _get_sun_position(orbit_track.t)
+ longitude, latitude, _ = rectangular_to_geodetic(
+ _unit(_unit(satellite) + _unit(sun)) * 6371e3
+ )
+ step_size = 1e-6 # degrees, for the finite-difference derivatives
+ for _ in range(max_iterations):
+ residual = _get_specular_residual(longitude, latitude, satellite, sun)
+ d_lon = (
+ _get_specular_residual(longitude + step_size, latitude, satellite, sun)
+ - residual
+ ) / step_size
+ d_lat = (
+ _get_specular_residual(longitude, latitude + step_size, satellite, sun)
+ - residual
+ ) / step_size
+ # solve the 2 x 2 system [d_lon d_lat] step = -residual at each time
+ determinant = d_lon[0] * d_lat[1] - d_lat[0] * d_lon[1]
+ with np.errstate(divide="ignore", invalid="ignore"):
+ step_lon = (-residual[0] * d_lat[1] + residual[1] * d_lat[0]) / determinant
+ step_lat = (-residual[1] * d_lon[0] + residual[0] * d_lon[1]) / determinant
+ # limit each step (degrees) for stability far from the solution
+ scale = np.minimum(1, 5 / np.maximum(np.hypot(step_lon, step_lat), 1e-12))
+ step_lon = np.nan_to_num(step_lon * scale)
+ step_lat = np.nan_to_num(step_lat * scale)
+ longitude, latitude = longitude + step_lon, np.clip(
+ latitude + step_lat, -90, 90
+ )
+ if np.all(np.hypot(step_lon, step_lat) < 1e-9):
+ break
+ position = geodetic_to_rectangular(longitude, latitude)
+ up, _, _ = _get_surface_axes(longitude, latitude)
+ # the Sun and the satellite above the horizon (the residual also vanishes
+ # where both are below it)
+ sunlit = np.sum(up * _unit(sun - position), axis=0) > 0
+ visible = np.sum(up * _unit(satellite - position), axis=0) > 0
+ converged = (
+ np.max(
+ np.abs(_get_specular_residual(longitude, latitude, satellite, sun)), axis=0
+ )
+ < 1e-6
+ )
+ valid = sunlit & visible & converged
+ longitude = np.where(valid, (longitude + 180) % 360 - 180, np.nan)
+ latitude = np.where(valid, latitude, np.nan)
+ if np.ndim(orbit_track.t.tt) == 0:
+ return wgs84.latlon(latitude[0], longitude[0])
+ return wgs84.latlon(latitude, longitude)
+
+
+def compute_glint_angle(
+ orbit_track: Geocentric, target: GeographicPosition
+) -> npt.NDArray:
+ """
+ Compute the glint angle (degrees) at a target: the angle between the
+ direction from the target toward the satellite and the direction of the
+ Sun's specular reflection at the target (the direction toward the Sun
+ mirrored about the WGS 84 surface normal). It is zero at the specular
+ point (see `compute_specular_point`), where a level surface reflects
+ sunlight toward the satellite, and grows away from it. Sun glint
+ contaminates observations of water (for example, of ocean color) at
+ small glint angles, typically below about 20 to 30 degrees, whereas
+ glint observations (for example, of greenhouse gases over the ocean)
+ seek them.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): the satellite orbit track.
+ target (skyfield.toposlib.GeographicPosition): the target position
+ (a single target, or one target for each time of the orbit track).
+
+ Returns:
+ numpy.typing.NDArray: the glint angle (degrees).
+ """
+ satellite = np.reshape(np.array(orbit_track.frame_xyz(itrs).m), (3, -1))
+ sun = _get_sun_position(orbit_track.t)
+ position = np.reshape(np.array(target.itrs_xyz.m), (3, -1))
+ up, _, _ = _get_surface_axes(
+ np.reshape(target.longitude.degrees, -1),
+ np.reshape(target.latitude.degrees, -1),
+ )
+ to_sun = _unit(sun - position)
+ reflected = 2 * np.sum(up * to_sun, axis=0) * up - to_sun
+ angle = np.degrees(
+ np.arccos(
+ np.clip(np.sum(_unit(satellite - position) * reflected, axis=0), -1, 1)
+ )
+ )
+ if np.ndim(orbit_track.t.tt) == 0 and np.ndim(target.latitude.degrees) == 0:
+ return angle[0]
+ return angle
diff --git a/src/tatc/utils/orbital.py b/src/tatc/utils/orbital.py
index 4445edf9..64c7bac5 100644
--- a/src/tatc/utils/orbital.py
+++ b/src/tatc/utils/orbital.py
@@ -432,3 +432,51 @@ def compute_vnb_frame(
# circular orbit.
rx_b_u = np.cross(rx_v_u, rx_n_u, 0, 0, -1).T
return rx_v_u, rx_n_u, rx_b_u
+
+
+def _check_angle_profile(
+ profile: list[tuple[float, float]] | None, kind: str
+) -> list[tuple[float, float]] | None:
+ """
+ Checks that an angle profile's arguments of latitude lie in [0, 360) and
+ its angles in [-180, 180], and sorts it by argument of latitude.
+
+ Args:
+ profile (list[tuple[float, float]] | None): (argument of latitude,
+ angle) pairs (degrees).
+ kind (str): The kind of angle (for example, "Roll"), for messages.
+
+ Returns:
+ list[tuple[float, float]] | None: the sorted profile
+ """
+ if profile is None:
+ return None
+ for argument, angle in profile:
+ if not 0 <= argument < 360:
+ raise ValueError("Arguments of latitude must be in [0, 360).")
+ if not -180 <= angle <= 180:
+ raise ValueError(f"{kind} angles must be in [-180, 180].")
+ return sorted(profile)
+
+
+def _interpolate_angle_profile(
+ profile: list[tuple[float, float]], orbit_track: Geocentric
+) -> float | npt.NDArray[np.float64]:
+ """
+ Interpolates an angle profile linearly and periodically at the
+ satellite's argument(s) of latitude.
+
+ Args:
+ profile (list[tuple[float, float]]): (argument of latitude, angle) pairs.
+ orbit_track (skyfield.positionlib.Geocentric): The satellite
+ position/velocity (in an inertial frame).
+
+ Returns:
+ float | numpy.typing.NDArray[numpy.float64]: the angle(s) (degrees)
+ """
+ argument = compute_argument_of_latitude(
+ orbit_track.position.m, orbit_track.velocity.m_per_s
+ )
+ arguments, angles = zip(*profile)
+ angle = np.interp(argument, arguments, angles, period=360)
+ return float(angle) if np.ndim(angle) == 0 else angle
diff --git a/src/tatc/utils/projection.py b/src/tatc/utils/projection.py
index 7ff5bca4..08d53b9c 100644
--- a/src/tatc/utils/projection.py
+++ b/src/tatc/utils/projection.py
@@ -9,6 +9,7 @@
import warnings
from collections.abc import Iterable
from enum import Enum
+from typing import Any
import numpy as np
import numpy.typing as npt
@@ -170,6 +171,32 @@ def _compute_instrument_frame(
return p_m, v, n, c
+def _compute_line_of_sight(
+ target: GeographicPosition | npt.NDArray, p_m: npt.NDArray
+) -> npt.NDArray:
+ """
+ Compute the Earth-fixed line of sight from a satellite to a target: a
+ single target, seen from each position, or one target for each position
+ (with the same number of positions as targets).
+
+ Args:
+ target (skyfield.toposlib.GeographicPosition | numpy.typing.NDArray):
+ the target position(s), or their Earth-fixed coordinates (meters),
+ with shape (3,) or (3, N).
+ p_m (numpy.typing.NDArray): the satellite position(s) (meters), with
+ shape (3,) or (3, N).
+
+ Returns:
+ numpy.typing.NDArray: the line(s) of sight (meters).
+ """
+ xyz = np.asarray(
+ target.itrs_xyz.m if isinstance(target, GeographicPosition) else target
+ )
+ if xyz.ndim == 1:
+ xyz = np.reshape(xyz, (3,) + (1,) * (p_m.ndim - 1))
+ return xyz - p_m
+
+
def _compute_view_frame(
orbit_track: Geocentric,
roll_angle: float = 0,
@@ -177,6 +204,7 @@ def _compute_view_frame(
velocity_frame: VelocityFrame = VelocityFrame.EARTH_FIXED,
nadir_reference: NadirReference = NadirReference.GEODETIC,
tilt_angle: float = 0,
+ attitude: Any = None,
) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray]:
"""
Compute the Earth-fixed position and the orthonormal unit vectors that
@@ -198,6 +226,10 @@ def _compute_view_frame(
tilt_angle (float): the tilt angle (degrees) of the plane in which
the roll angle is measured, as for the scan plane of a scanner
that tilts fore or aft.
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
Returns:
tuple[numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray]:
@@ -205,7 +237,9 @@ def _compute_view_frame(
cross-track unit vectors, each with shape (3,) or (3, N) in
Earth-fixed coordinates.
"""
- p_m, n, a, c = _compute_nadir_axes(orbit_track, velocity_frame, nadir_reference)
+ p_m, n, a, c = _compute_nadir_axes(
+ orbit_track, velocity_frame, nadir_reference, attitude
+ )
return (p_m, *_rotate_view_axes(n, a, c, roll_angle, pitch_angle, tilt_angle))
@@ -213,18 +247,27 @@ def _compute_nadir_axes(
orbit_track: Geocentric,
velocity_frame: VelocityFrame = VelocityFrame.EARTH_FIXED,
nadir_reference: NadirReference = NadirReference.GEODETIC,
+ attitude: Any = None,
) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray]:
"""
Compute the Earth-fixed position and the orthonormal unit vectors of an
unrotated view (see `_compute_view_frame`): nadir, along-track
- (forward), and cross-track (left).
+ (forward), and cross-track (left). With an attitude, these are the axes
+ of the spacecraft's body: the nadir frame (in the attitude's velocity
+ frame at each time) rotated by the body's yaw angle about the nadir
+ axis, then by its roll and pitch angles (see `_rotate_view_axes`).
Args:
orbit_track (skyfield.positionlib.Geocentric): the satellite orbit track.
velocity_frame (VelocityFrame): The reference frame of the velocity
- vector that defines the along-track direction.
+ vector that defines the along-track direction (without an
+ attitude).
nadir_reference (NadirReference): The definition of the nadir
direction.
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
Returns:
tuple[numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray, numpy.typing.NDArray]:
@@ -232,13 +275,27 @@ def _compute_nadir_axes(
cross-track unit vectors, each with shape (3,) or (3, N) in
Earth-fixed coordinates.
"""
- p_m, _, n, c = _compute_instrument_frame(
- orbit_track, velocity_frame, nadir_reference
+ if attitude is None:
+ p_m, _, n, c = _compute_instrument_frame(
+ orbit_track, velocity_frame, nadir_reference
+ )
+ # orthonormal cross-track (left) and along-track (forward) axes at nadir
+ c = c / np.linalg.norm(c, axis=0)
+ return p_m, n, np.cross(n, c, axis=0), c
+ yaw, roll, pitch, inertial = attitude.get_body_angles(orbit_track)
+ p_m, n, a, c = _compute_nadir_axes(
+ orbit_track, VelocityFrame.EARTH_FIXED, nadir_reference
)
- # orthonormal cross-track (left) and along-track (forward) axes at nadir
- c = c / np.linalg.norm(c, axis=0)
- a = np.cross(n, c, axis=0)
- return p_m, n, a, c
+ if np.any(inertial):
+ _, _, a_inertial, c_inertial = _compute_nadir_axes(
+ orbit_track, VelocityFrame.INERTIAL, nadir_reference
+ )
+ a = np.where(inertial, a_inertial, a)
+ c = np.where(inertial, c_inertial, c)
+ # yaw about the nadir axis, turning the along-track axis to the left
+ yaw = np.radians(yaw)
+ a, c = np.cos(yaw) * a + np.sin(yaw) * c, np.cos(yaw) * c - np.sin(yaw) * a
+ return (p_m, *_rotate_view_axes(n, a, c, roll, pitch))
def _rotate_view_axes(
@@ -288,6 +345,7 @@ def compute_view_tangents(
roll_angle: float = 0,
pitch_angle: float = 0,
nadir_reference: NadirReference = NadirReference.GEODETIC,
+ attitude: Any = None,
) -> tuple[npt.NDArray, npt.NDArray]:
"""
Compute the tangents of the along-track and cross-track view angles of a
@@ -302,7 +360,8 @@ def compute_view_tangents(
Args:
orbit_track (skyfield.positionlib.Geocentric): the satellite orbit track.
- target (skyfield.toposlib.GeographicPosition): the target position.
+ target (skyfield.toposlib.GeographicPosition): the target position
+ (a single target, or one target for each time of the orbit track).
velocity_frame (VelocityFrame): The reference frame of the velocity
vector that defines the along-track direction.
roll_angle (float): the instrument roll angle (degrees).
@@ -310,28 +369,225 @@ def compute_view_tangents(
nadir_reference (NadirReference): The definition of the nadir
direction from which the view is rotated.
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
Returns:
tuple[numpy.typing.NDArray, numpy.typing.NDArray]: the along-track and
cross-track (positive left) view angle tangents (`NaN` if the
target is not in front of the view).
"""
p_m, boresight, along, cross = _compute_view_frame(
- orbit_track, roll_angle, pitch_angle, velocity_frame, nadir_reference
+ orbit_track,
+ roll_angle,
+ pitch_angle,
+ velocity_frame,
+ nadir_reference,
+ attitude=attitude,
)
# line of sight from the satellite to the target
- los = np.reshape(np.array(target.itrs_xyz.m), (3,) + (1,) * (p_m.ndim - 1)) - p_m
+ los = _compute_line_of_sight(target, p_m)
with np.errstate(divide="ignore", invalid="ignore"):
scale = np.sum(los * boresight, axis=0)
scale = np.where(scale > 0, scale, np.nan)
return np.sum(los * along, axis=0) / scale, np.sum(los * cross, axis=0) / scale
+def compute_ground_sample_size(
+ orbit_track: Geocentric,
+ target: GeographicPosition,
+ along_track_angle: float,
+ cross_track_angle: float,
+ velocity_frame: VelocityFrame = VelocityFrame.EARTH_FIXED,
+ roll_angle: npt.ArrayLike = 0,
+ pitch_angle: npt.ArrayLike = 0,
+ nadir_reference: NadirReference = NadirReference.GEODETIC,
+ tilt_angle: npt.ArrayLike = 0,
+ attitude: Any = None,
+) -> tuple[npt.NDArray, npt.NDArray]:
+ """
+ Compute the size on the ground of an angular extent centered on the line
+ of sight to a target, such as the instantaneous field of view of an
+ instrument's sample (or the angle between neighboring samples): the
+ distances between the points where rays at half the extent on either
+ side of the line of sight meet the WGS 84 ellipsoid (raised to the
+ target's elevation), along track and across track. The extents lie
+ along the view's along-track and cross-track axes (rotated from nadir by
+ the tilt, roll, and pitch angles, see `_compute_view_frame`), each made
+ perpendicular to the line of sight, so the sizes include the
+ lengthening of a view off nadir and the curvature of the Earth. Rays
+ that miss the Earth (beyond its limb) give `NaN`.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): the satellite orbit track.
+ target (skyfield.toposlib.GeographicPosition): the target position
+ (a single target, or one target for each time of the orbit track).
+ along_track_angle (float): the along-track angular extent (degrees).
+ cross_track_angle (float): the cross-track angular extent (degrees).
+ velocity_frame (VelocityFrame): The reference frame of the velocity
+ vector that defines the along-track direction.
+ roll_angle (numpy.typing.ArrayLike): the view's roll angle (degrees).
+ pitch_angle (numpy.typing.ArrayLike): the view's pitch angle (degrees).
+ nadir_reference (NadirReference): The definition of the nadir
+ direction from which the view is rotated.
+ tilt_angle (numpy.typing.ArrayLike): the tilt angle (degrees) of a
+ scan plane about the cross-track axis (positive forward).
+
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
+ Returns:
+ tuple[numpy.typing.NDArray, numpy.typing.NDArray]: the along-track
+ and cross-track sizes (meters).
+ """
+ p_m, _, along, cross = _compute_view_frame(
+ orbit_track,
+ roll_angle,
+ pitch_angle,
+ velocity_frame,
+ nadir_reference,
+ tilt_angle,
+ attitude,
+ )
+ p_m, along, cross = (np.reshape(v, (3, -1)) for v in (p_m, along, cross))
+ los = np.reshape(_compute_line_of_sight(target, p_m), (3, -1))
+ los = los / np.linalg.norm(los, axis=0)
+ elevation = np.broadcast_to(
+ np.atleast_1d(target.elevation.m).astype(float), los.shape[1:]
+ )
+ sizes = []
+ for axis, angle in ((along, along_track_angle), (cross, cross_track_angle)):
+ # the axis made perpendicular to the line of sight
+ normal = axis - np.sum(axis * los, axis=0) * los
+ normal = normal / np.linalg.norm(normal, axis=0)
+ half = np.radians(angle) / 2
+ ends = []
+ for sign in (-1, 1):
+ direction = np.cos(half) * los + sign * np.sin(half) * normal
+ end = np.full(direction.shape, np.nan)
+ for value in np.unique(elevation):
+ selected = elevation == value
+ point, found = compute_ellipsoid_intersection(
+ p_m[:, selected], direction[:, selected], value
+ )
+ end[:, selected] = np.where(found, point, np.nan)
+ ends.append(end)
+ sizes.append(np.linalg.norm(ends[1] - ends[0], axis=0))
+ if (
+ np.ndim(np.asarray(orbit_track.t.tt)) == 0
+ and np.ndim(target.latitude.degrees) == 0
+ ):
+ return sizes[0][0], sizes[1][0]
+ return sizes[0], sizes[1]
+
+
+def _shift_along_track(orbit_track: Geocentric, seconds: npt.ArrayLike) -> Geocentric:
+ """
+ Shifts satellite positions along their Earth-fixed velocity (a linear
+ approximation of the motion relative to the ground over a short time).
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): The satellite position/velocity.
+ seconds (numpy.typing.ArrayLike): The shift (seconds) at each time.
+
+ Returns:
+ skyfield.positionlib.Geocentric: The shifted satellite position/velocity.
+ """
+ position, velocity = orbit_track.frame_xyz_and_velocity(itrs)
+ shifted = np.array(position.m) + np.array(velocity.m_per_s) * seconds
+ # rotate from Earth-fixed to inertial (GCRS) coordinates at the same times
+ gcrs = np.einsum("ji...,j...->i...", itrs.rotation_at(orbit_track.t), shifted)
+ return Geocentric(
+ gcrs / AU_M, orbit_track.velocity.au_per_d, orbit_track.t, center=399
+ )
+
+
+def compute_ground_advance(
+ orbit_track: Geocentric,
+ target: GeographicPosition,
+ seconds: float,
+ velocity_frame: VelocityFrame = VelocityFrame.EARTH_FIXED,
+ nadir_reference: NadirReference = NadirReference.GEODETIC,
+ attitude: Any = None,
+) -> npt.NDArray:
+ """
+ Compute the distance on the ground (meters) that a view fixed to the
+ spacecraft advances at a target in a period of time: from the target to
+ the point where the line of sight to it, held fixed relative to the
+ view's axes (the nadir frame, or the body's axes with an attitude),
+ meets the WGS 84 ellipsoid (raised to the target's elevation) after the
+ satellite moves along its Earth-fixed velocity for that period (a linear
+ approximation over a short period, such as that of a scan). For a
+ cross-track scanner, it is the spacing along track between the samples
+ of consecutive scans, which is nearly constant across the scan. Rays
+ that miss the Earth give `NaN`.
+
+ Args:
+ orbit_track (skyfield.positionlib.Geocentric): the satellite orbit track.
+ target (skyfield.toposlib.GeographicPosition): the target position
+ (a single target, or one target for each time of the orbit track).
+ seconds (float): the period (seconds).
+ velocity_frame (VelocityFrame): The reference frame of the velocity
+ vector that defines the along-track direction.
+ nadir_reference (NadirReference): The definition of the nadir
+ direction.
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), or
+ `None` for a body aligned with the nadir frame (in `velocity_frame`).
+
+ Returns:
+ numpy.typing.NDArray: the distance (meters).
+ """
+ p_m, nadir, along, cross = (
+ np.reshape(v, (3, -1))
+ for v in _compute_nadir_axes(
+ orbit_track, velocity_frame, nadir_reference, attitude
+ )
+ )
+ target_m = np.reshape(np.array(target.itrs_xyz.m), (3, -1))
+ los = target_m - p_m
+ los = los / np.linalg.norm(los, axis=0)
+ # the line of sight on the axes, which move with the satellite
+ components = [np.sum(los * axis, axis=0) for axis in (nadir, along, cross)]
+ q_m, nadir, along, cross = (
+ np.reshape(v, (3, -1))
+ for v in _compute_nadir_axes(
+ _shift_along_track(orbit_track, seconds),
+ velocity_frame,
+ nadir_reference,
+ attitude,
+ )
+ )
+ direction = components[0] * nadir + components[1] * along + components[2] * cross
+ q_m = np.broadcast_to(q_m, direction.shape)
+ elevation = np.broadcast_to(
+ np.atleast_1d(target.elevation.m).astype(float), direction.shape[1:]
+ )
+ end = np.full(direction.shape, np.nan)
+ for value in np.unique(elevation):
+ selected = elevation == value
+ point, found = compute_ellipsoid_intersection(
+ q_m[:, selected], direction[:, selected], value
+ )
+ end[:, selected] = np.where(found, point, np.nan)
+ distance = np.linalg.norm(end - target_m, axis=0)
+ if (
+ np.ndim(np.asarray(orbit_track.t.tt)) == 0
+ and np.ndim(target.latitude.degrees) == 0
+ ):
+ return distance[0]
+ return distance
+
+
def compute_view_angles(
orbit_track: Geocentric,
target: GeographicPosition,
velocity_frame: VelocityFrame = VelocityFrame.EARTH_FIXED,
nadir_reference: NadirReference = NadirReference.GEODETIC,
tilt_angle: float = 0,
+ attitude: Any = None,
) -> tuple[npt.NDArray, npt.NDArray]:
"""
Compute the roll and pitch angles (degrees) that point a view's center at
@@ -345,7 +601,8 @@ def compute_view_angles(
Args:
orbit_track (skyfield.positionlib.Geocentric): the satellite orbit track.
- target (skyfield.toposlib.GeographicPosition): the target position.
+ target (skyfield.toposlib.GeographicPosition): the target position
+ (a single target, or one target for each time of the orbit track).
velocity_frame (VelocityFrame): The reference frame of the velocity
vector that defines the along-track direction.
nadir_reference (NadirReference): The definition of the nadir
@@ -353,14 +610,18 @@ def compute_view_angles(
tilt_angle (float): the tilt angle (degrees) of the scan plane about
the cross-track axis (positive forward).
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
Returns:
tuple[numpy.typing.NDArray, numpy.typing.NDArray]: the roll (positive
left) and pitch (positive forward) angles (degrees).
"""
p_m, nadir, along, cross = _compute_view_frame(
- orbit_track, 0, 0, velocity_frame, nadir_reference, tilt_angle
+ orbit_track, 0, 0, velocity_frame, nadir_reference, tilt_angle, attitude
)
- los = np.reshape(np.array(target.itrs_xyz.m), (3,) + (1,) * (p_m.ndim - 1)) - p_m
+ los = _compute_line_of_sight(target, p_m)
los = los / np.linalg.norm(los, axis=0)
roll = np.degrees(
np.arctan2(np.sum(los * cross, axis=0), np.sum(los * nadir, axis=0))
@@ -374,6 +635,7 @@ def compute_cone_and_azimuth(
target: GeographicPosition,
velocity_frame: VelocityFrame = VelocityFrame.EARTH_FIXED,
nadir_reference: NadirReference = NadirReference.GEODETIC,
+ attitude: Any = None,
) -> tuple[npt.NDArray, npt.NDArray]:
"""
Compute the cone angle (from nadir) and the scan azimuth
@@ -384,22 +646,27 @@ def compute_cone_and_azimuth(
Args:
orbit_track (skyfield.positionlib.Geocentric): the satellite orbit track.
- target (skyfield.toposlib.GeographicPosition): the target position.
+ target (skyfield.toposlib.GeographicPosition): the target position
+ (a single target, or one target for each time of the orbit track).
velocity_frame (VelocityFrame): The reference frame of the velocity
vector that defines the along-track direction.
nadir_reference (NadirReference): The definition of the nadir
direction.
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
Returns:
tuple[numpy.typing.NDArray, numpy.typing.NDArray]: the cone angle
(degrees, from 0 to 180) and scan azimuth (degrees, from -180 to
180).
"""
p_m, nadir, along, cross = _compute_view_frame(
- orbit_track, 0, 0, velocity_frame, nadir_reference
+ orbit_track, 0, 0, velocity_frame, nadir_reference, attitude=attitude
)
# line of sight from the satellite to the target
- los = np.reshape(np.array(target.itrs_xyz.m), (3,) + (1,) * (p_m.ndim - 1)) - p_m
+ los = _compute_line_of_sight(target, p_m)
down = np.sum(los * nadir, axis=0)
forward = np.sum(los * along, axis=0)
left = np.sum(los * cross, axis=0)
@@ -422,6 +689,7 @@ def compute_projected_ray_position( # pylint: disable=too-many-branches,too-man
nadir_reference: NadirReference = NadirReference.GEODETIC,
tilt_angle: float = 0,
ground_elevation: float = 0,
+ attitude: Any = None,
) -> GeographicPosition:
"""
Get the location of a projected ray from an instrument. The ray is cast
@@ -472,6 +740,10 @@ def compute_projected_ray_position( # pylint: disable=too-many-branches,too-man
ground_elevation (float): The elevation (meters) of the ground, which
blocks rays toward an elevation above the instrument.
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
Returns:
(skyfield.toposlib.GeographicPosition): the geographic position of the projected ray
"""
@@ -488,6 +760,7 @@ def compute_projected_ray_position( # pylint: disable=too-many-branches,too-man
nadir_reference,
tilt_angle,
ground_elevation,
+ attitude,
)[:, 0]
# return resulting geographic position
return wgs84.latlon(geos[1], geos[0], geos[2])
@@ -603,6 +876,7 @@ def _compute_rays(
velocity_frame: VelocityFrame = VelocityFrame.EARTH_FIXED,
nadir_reference: NadirReference = NadirReference.GEODETIC,
tilt_angle: float = 0,
+ attitude: Any = None,
) -> tuple[npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray, npt.NDArray, bool]:
"""
Get several rays from an instrument (see `_compute_projected_rays` for
@@ -618,7 +892,9 @@ def _compute_rays(
# against times)
angle = np.radians(np.reshape(np.asarray(angles, dtype=float), (-1, 1)))
# the unrotated view axes, with shape (3, 1, N) to broadcast against rays
- p_m, n, a, c = _compute_nadir_axes(orbit_track, velocity_frame, nadir_reference)
+ p_m, n, a, c = _compute_nadir_axes(
+ orbit_track, velocity_frame, nadir_reference, attitude
+ )
# whether orbit_track represents a single time or a vector of times
is_vectorized = len(np.shape(p_m)) > 1
p_m, n, a, c = (np.reshape(x, (3, 1, -1)) for x in (p_m, n, a, c))
@@ -895,6 +1171,7 @@ def _compute_projected_rays(
nadir_reference: NadirReference = NadirReference.GEODETIC,
tilt_angle: float = 0,
ground_elevation: float = 0,
+ attitude: Any = None,
) -> npt.NDArray:
"""
Get the locations of several projected rays from an instrument (see
@@ -926,6 +1203,10 @@ def _compute_projected_rays(
ground_elevation (float): The elevation (meters) of the ground, which
blocks rays toward an elevation above the instrument.
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
Returns:
numpy.typing.NDArray: the geodetic longitudes (degrees), latitudes
(degrees), and altitudes (meters) of the projected rays, with
@@ -942,6 +1223,7 @@ def _compute_projected_rays(
velocity_frame,
nadir_reference,
tilt_angle,
+ attitude,
)
geos, _ = _project_rays(
*(np.reshape(x, (3, -1)) for x in rays[:4]), elevation, ground_elevation
@@ -963,6 +1245,7 @@ def compute_footprint(
nadir_reference: NadirReference = NadirReference.GEODETIC,
view_geometry: ViewGeometry = ViewGeometry.FRAME,
ground_elevation: float = 0,
+ attitude: Any = None,
) -> list[Polygon | MultiPolygon]:
"""
Compute the instantaneous instrument footprint. Supports both a scalar
@@ -999,6 +1282,10 @@ def compute_footprint(
ground_elevation (float): The elevation (meters) of the ground, which
blocks rays toward an elevation above the instrument.
+ attitude (Any): The attitude of the spacecraft's body (see
+ `tatc.schemas.Attitude` and `tatc.schemas.AttitudeSchedule`), from
+ which the view is rotated, or `None` for a body aligned with the
+ nadir frame (in `velocity_frame`).
Returns:
list[shapely.geometry.Polygon | shapely.geometry.MultiPolygon]: The instrument footprint(s).
"""
@@ -1062,6 +1349,7 @@ def compute_footprint(
velocity_frame,
nadir_reference,
pitch_angle,
+ attitude,
)
else:
*rays, _ = _compute_rays(
@@ -1074,6 +1362,7 @@ def compute_footprint(
angles,
velocity_frame,
nadir_reference,
+ attitude=attitude,
)
position, direction, _, nadir, along = rays
geos, _ = _project_rays(
diff --git a/src/tatc/utils/propagation.py b/src/tatc/utils/propagation.py
index 780561fd..4d71d754 100644
--- a/src/tatc/utils/propagation.py
+++ b/src/tatc/utils/propagation.py
@@ -1,7 +1,7 @@
"""
Orbit propagation utilities for general perturbations (SGP4) orbits:
-observation event search, propagation on a repeat ground track, and repeat
-cycle search (see `time` for conversions of times, `earth_orientation` for
+observation event search, propagation on a repeat ground track, repeat
+cycle search, and alignment of element switches among satellites (see `time` for conversions of times, `earth_orientation` for
interpolated nutation angles, and `computation` for computations run
together).
@@ -30,6 +30,7 @@
if TYPE_CHECKING:
from ..schemas.orbit.gp_elements import GeneralPerturbationsElements
+ from ..schemas.space.satellite import Satellite
class RepeatCycleSearch(NamedTuple):
@@ -687,3 +688,130 @@ def find_events(
selected = (times_py >= lower) & (times_py <= upper)
events.extend(zip(times_py[selected] + shift, codes[selected]))
return events
+
+
+def align_element_switches(
+ satellites: list[Satellite],
+ tolerance: timedelta = timedelta(minutes=10),
+ shared_only: bool = True,
+) -> list[Satellite]:
+ """
+ Aligns the times at which the satellites' general perturbations (GP)
+ orbits switch from one element to the next (see
+ `GeneralPerturbationsOrbit.element_switch_times`), so that satellites
+ whose elements are published together, as for a formation or a
+ constellation, switch at common times.
+
+ By default, each satellite switches elements midway between its own
+ consecutive epochs. When the satellites' elements are published at
+ slightly different times (for example, 20 s apart), for that long after
+ each switch their positions come from elements of different epochs,
+ whose errors no longer cancel, so their relative positions jump by up to
+ the difference between successive elements.
+
+ The satellites' epochs are grouped into publication events, each of
+ epochs within `tolerance` of the next, and switches are placed midway
+ between the mean epochs of consecutive events. Each satellite uses its
+ latest element in each event and switches at the common time between
+ the events of its consecutive elements (if it has no element in the
+ events between, at the latest common time). With `shared_only`, only the
+ events in which every satellite has an element are used, so the
+ satellites always use elements of the same event, at the cost of using
+ older elements when one satellite lacks an element in an event;
+ otherwise, every event is used. Elements that are not used are removed.
+
+ Only satellites whose orbits have more than one GP element take part;
+ the others are returned unchanged.
+
+ Args:
+ satellites (list[Satellite]): The satellites.
+ tolerance (datetime.timedelta): The maximum difference between the
+ epochs of a publication event.
+ shared_only (bool): True, to use only the publication events in
+ which every satellite has an element.
+
+ Returns:
+ list[Satellite]: copies of the satellites, with aligned element switch
+ times (or unchanged, if they do not take part)
+
+ Raises:
+ ValueError: if a publication event spans more than `tolerance` (as
+ when epochs are spread through time rather than published
+ together), if the mean epochs of consecutive events used are not
+ more than twice `tolerance` apart, or if, with `shared_only`, no
+ event is shared by every satellite.
+ """
+ orbits = [satellite.orbit.to_gp_orbit() for satellite in satellites]
+ members = [i for i, orbit in enumerate(orbits) if len(orbit.elements) > 1]
+ if len(members) == 0:
+ return list(satellites)
+ # publication events: epochs within tolerance of the next, as (epoch, satellite, element)
+ epochs = sorted(
+ (element.epoch, i, k)
+ for i in members
+ for k, element in enumerate(orbits[i].elements)
+ )
+ events = [[epochs[0]]]
+ for previous, current in zip(epochs[:-1], epochs[1:]):
+ if current[0] - previous[0] > tolerance:
+ events.append([])
+ events[-1].append(current)
+ for event in events:
+ if event[-1][0] - event[0][0] > tolerance:
+ raise ValueError(
+ f"Element epochs from {event[0][0]} to {event[-1][0]} form one "
+ f"publication event longer than the tolerance ({tolerance})."
+ )
+ if shared_only:
+ used = [
+ j
+ for j, event in enumerate(events)
+ if {i for _, i, _ in event} == set(members)
+ ]
+ if len(used) == 0:
+ raise ValueError("No publication event is shared by every satellite.")
+ else:
+ used = list(range(len(events)))
+ means = [
+ events[j][0][0]
+ + sum((epoch - events[j][0][0] for epoch, _, _ in events[j]), timedelta(0))
+ / len(events[j])
+ for j in used
+ ]
+ for earlier, later in zip(means[:-1], means[1:]):
+ if later - earlier <= 2 * tolerance:
+ raise ValueError(
+ f"Publication events at {earlier} and {later} are not more than "
+ f"twice the tolerance ({tolerance}) apart."
+ )
+ # the common switch time before each event used (but the first)
+ switch_before = {
+ j: means[n - 1] + (means[n] - means[n - 1]) / 2
+ for n, j in enumerate(used)
+ if n > 0
+ }
+ aligned = list(satellites)
+ for i in members:
+ # each satellite's latest element in each event used, in time order
+ latest = {}
+ for j in used:
+ for _, satellite, k in events[j]:
+ if satellite == i:
+ latest[j] = k
+ events_used = sorted(latest)
+ orbit = orbits[i]
+ aligned[i] = satellites[i].model_copy(
+ update={
+ "orbit": type(orbit)(
+ **{
+ **dict(orbit),
+ "elements": [orbit.elements[latest[j]] for j in events_used],
+ "element_switch_times": [
+ switch_before[j] for j in events_used[1:]
+ ]
+ or None,
+ }
+ )
+ }
+ )
+ return aligned
diff --git a/tests/analysis/test_coincidence.py b/tests/analysis/test_coincidence.py
index a2c82a19..9c1e40cb 100644
--- a/tests/analysis/test_coincidence.py
+++ b/tests/analysis/test_coincidence.py
@@ -125,6 +125,34 @@ def test_max_time_difference(self):
self.assertEqual(results.iloc[0].start, _minutes(10))
self.assertEqual(results.iloc[0].end, _minutes(12))
+ def test_instantaneous(self):
+ """
+ Test that instantaneous observations coincide if their epochs differ
+ by at most the maximum time difference, regardless of their periods,
+ and that each coincident observation spans the contributing epochs.
+ """
+ # periods overlap (minutes 8 to 10), epochs (minutes 5 and 19) do not
+ observations = gpd.GeoDataFrame(
+ [_make_observation("A", 0, 10), _make_observation("B", 8, 30)],
+ crs="EPSG:4326",
+ )
+ self.assertEqual(len(find_coincident_observations(observations).index), 1)
+ self.assertTrue(
+ find_coincident_observations(
+ observations,
+ max_time_difference=timedelta(minutes=10),
+ instantaneous=True,
+ ).empty
+ )
+ results = find_coincident_observations(
+ observations, max_time_difference=timedelta(minutes=15), instantaneous=True
+ )
+ self.assertEqual(len(results.index), 1)
+ self.assertEqual(results.iloc[0].satellite, "A, B")
+ self.assertEqual(results.iloc[0].start, _minutes(5))
+ self.assertEqual(results.iloc[0].end, _minutes(19))
+ self.assertEqual(results.iloc[0].epoch, _minutes(12))
+
def test_same_satellite(self):
"""
Test that observations by different instruments on the same
diff --git a/tests/analysis/test_feature_sampling.py b/tests/analysis/test_feature_sampling.py
new file mode 100644
index 00000000..94163936
--- /dev/null
+++ b/tests/analysis/test_feature_sampling.py
@@ -0,0 +1,184 @@
+"""
+Unit tests for the feature observation functions in tatc.analysis.
+
+@author Paul T. Grogan
+"""
+
+import unittest
+from datetime import datetime, timedelta, timezone
+
+import geopandas as gpd
+import numpy as np
+import pandas as pd
+from shapely.geometry import Point as ShapelyPoint
+from shapely.geometry import box
+from skyfield.api import wgs84
+
+from tatc.analysis import collect_feature_observations
+from tatc.schemas import PointedInstrument, Satellite, SunSynchronousOrbit
+from tatc.utils import compute_along_track_field_of_view
+from tatc.utils.time import _to_time
+
+
+class TestFeatureObservations(unittest.TestCase):
+ """
+ Unit tests for `collect_feature_observations`.
+ """
+
+ def setUp(self):
+ self.start = datetime(2026, 3, 1, tzinfo=timezone.utc)
+ orbit = SunSynchronousOrbit(
+ altitude=700e3, equator_crossing_time="10:30", epoch=self.start
+ )
+ self.time_step = 30
+ self.satellite = Satellite(
+ name="sat",
+ orbit=orbit,
+ instruments=[
+ PointedInstrument(
+ name="imager",
+ field_of_regard=40,
+ cross_track_field_of_view=40,
+ along_track_field_of_view=compute_along_track_field_of_view(
+ 700e3, self.time_step, orbit.get_inclination()
+ ),
+ is_rectangular=True,
+ )
+ ],
+ )
+ self.times = [
+ self.start + timedelta(seconds=self.time_step * (i + 0.5))
+ for i in range(int(3 * 3600 / self.time_step))
+ ]
+ # the sub-satellite point at a sampled time about an hour after the start
+ self.nadir_time = self.times[120]
+ subpoint = wgs84.subpoint_of(
+ orbit.to_gp_orbit().get_orbit_track_at_time(_to_time(self.nadir_time))
+ )
+ self.nadir = (subpoint.longitude.degrees, subpoint.latitude.degrees)
+
+ def _features(self, geometries, start, end, index=None):
+ return gpd.GeoDataFrame(
+ {
+ "start": pd.DatetimeIndex(
+ [start] * len(geometries), dtype="datetime64[ns, UTC]"
+ ),
+ "end": pd.DatetimeIndex(
+ [end] * len(geometries), dtype="datetime64[ns, UTC]"
+ ),
+ },
+ geometry=geometries,
+ crs="EPSG:4326",
+ index=index,
+ )
+
+ def test_feature_at_nadir(self):
+ """
+ Test that a small feature beneath the satellite while it exists is
+ viewed entirely, near nadir, at a time while it exists.
+ """
+ features = self._features(
+ [ShapelyPoint(*self.nadir).buffer(0.2)],
+ self.nadir_time - timedelta(minutes=5),
+ self.nadir_time + timedelta(minutes=5),
+ )
+ observations = collect_feature_observations(
+ features, self.satellite, self.times
+ )
+ self.assertEqual(len(observations), 1)
+ observation = observations.iloc[0]
+ self.assertEqual(observation.feature, 0)
+ self.assertAlmostEqual(observation.viewed_fraction, 1)
+ self.assertLess(
+ abs(observation.time - pd.Timestamp(self.nadir_time)),
+ pd.Timedelta(seconds=self.time_step),
+ )
+ self.assertGreater(observation.sat_alt, 85)
+ # near nadir, the slant range is about the satellite's height
+ self.assertLess(abs(observation.sat_range - observation.sat_height), 5e3)
+ self.assertGreater(observation.viewed_area, 0)
+
+ def test_feature_between_passes(self):
+ """
+ Test that a feature that exists only when no satellite passes over it
+ is not observed.
+ """
+ features = self._features(
+ [ShapelyPoint(*self.nadir).buffer(0.2)],
+ self.nadir_time + timedelta(minutes=20),
+ self.nadir_time + timedelta(minutes=30),
+ )
+ observations = collect_feature_observations(
+ features, self.satellite, self.times
+ )
+ self.assertEqual(len(observations), 0)
+ self.assertIn("viewed_fraction", observations.columns)
+
+ def test_feature_wider_than_swath(self):
+ """
+ Test that a feature wider than the swath is viewed only in part, and
+ that the viewed part is the feature's overlap with the swath.
+ """
+ longitude, latitude = self.nadir
+ feature = box(longitude - 20, latitude - 1, longitude + 20, latitude + 1)
+ features = self._features(
+ [feature],
+ self.nadir_time - timedelta(minutes=2),
+ self.nadir_time + timedelta(minutes=2),
+ )
+ observations = collect_feature_observations(
+ features, self.satellite, self.times
+ )
+ self.assertEqual(len(observations), 1)
+ observation = observations.iloc[0]
+ self.assertGreater(observation.viewed_fraction, 0)
+ self.assertLess(observation.viewed_fraction, 0.5)
+ self.assertTrue(feature.buffer(1e-9).contains(observation.geometry))
+
+ def test_feature_index_labels(self):
+ """
+ Test that observations record each feature's index label.
+ """
+ features = self._features(
+ [ShapelyPoint(*self.nadir).buffer(0.2), ShapelyPoint(0, -80).buffer(0.2)],
+ self.nadir_time - timedelta(minutes=5),
+ self.nadir_time + timedelta(minutes=5),
+ index=[17, 42],
+ )
+ observations = collect_feature_observations(
+ features, self.satellite, self.times
+ )
+ self.assertEqual(list(observations.feature), [17])
+
+ def test_invalid_features(self):
+ """
+ Test that features without timezone-aware start and end times are
+ rejected.
+ """
+ geometry = [ShapelyPoint(*self.nadir).buffer(0.2)]
+ with self.assertRaises(ValueError):
+ collect_feature_observations(
+ gpd.GeoDataFrame(geometry=geometry, crs="EPSG:4326"),
+ self.satellite,
+ self.times,
+ )
+ naive = gpd.GeoDataFrame(
+ {"start": [datetime(2026, 3, 1)], "end": [datetime(2026, 3, 2)]},
+ geometry=geometry,
+ crs="EPSG:4326",
+ )
+ with self.assertRaises(ValueError):
+ collect_feature_observations(naive, self.satellite, self.times)
+ with self.assertRaises(TypeError):
+ collect_feature_observations(geometry, self.satellite, self.times)
+
+ def test_empty_features(self):
+ """
+ Test that no features give an empty data frame of observations.
+ """
+ features = self._features([], self.start, self.start)
+ observations = collect_feature_observations(
+ features, self.satellite, self.times
+ )
+ self.assertEqual(len(observations), 0)
+ self.assertTrue(np.isin(["sat_alt", "sat_range"], observations.columns).all())
diff --git a/tests/analysis/test_ground_track.py b/tests/analysis/test_ground_track.py
index 6775b319..cd6d36f4 100644
--- a/tests/analysis/test_ground_track.py
+++ b/tests/analysis/test_ground_track.py
@@ -320,6 +320,33 @@ def test_compute_ground_track_no_instr_index(self):
self.assertEqual(len(results.index), 1)
self.assertEqual(type(results.iloc[0].geometry), Polygon)
+ def test_compute_ground_track_orbits_follow_element_switch_times(self):
+ """
+ Test that orbits are identified with the period of the element that
+ propagates the orbit (as selected by element switch times), not the
+ element whose epoch is closest.
+ """
+ element = self.orbit.elements[0]
+ start = element.epoch + timedelta(days=0.5)
+ # a later element with a period three times as long (about 4.6 hours)
+ slow = element.model_copy(
+ update={
+ "epoch": element.epoch + timedelta(days=2),
+ "mean_motion": element.mean_motion / 3,
+ }
+ )
+ times = [start + timedelta(minutes=i) for i in range(0, 180, 5)]
+ for switch, orbits in [(None, 2), ([element.epoch + timedelta(days=0.25)], 1)]:
+ satellite = self.satellite.model_copy(
+ update={
+ "orbit": GeneralPerturbationsOrbit(
+ elements=[element, slow], element_switch_times=switch
+ )
+ }
+ )
+ results = compute_ground_track(satellite, times, dissolve_orbits=False)
+ self.assertEqual(len(results.index), orbits)
+
def test_compute_ground_track_multipolygon(self):
"""
Test that ground track computation works for a single satellite and a list
diff --git a/tests/analysis/test_point_sampling.py b/tests/analysis/test_point_sampling.py
index 48c2fdea..b637596a 100644
--- a/tests/analysis/test_point_sampling.py
+++ b/tests/analysis/test_point_sampling.py
@@ -23,6 +23,8 @@
grid_observations,
reduce_observations,
)
+from tatc.analysis.point_sampling import _get_screening_angle
+from tatc.utils.projection import _compute_nadir_axes
from tatc.analysis.sampling import _refine_access_periods
from tatc.utils.computation import _run
from tatc.constants import timescale
@@ -30,9 +32,11 @@
ConicalInstrument,
GeneralPerturbationsOrbit,
Instrument,
+ MolniyaOrbit,
Point,
PointedInstrument,
Satellite,
+ SunSynchronousOrbit,
)
from tatc.utils import (
compute_cone_and_azimuth,
@@ -808,7 +812,21 @@ def test_collect_observations_of_points_and_satellites(self):
.reset_index(drop=True)
)
self.assertGreater(len(results.index), 0)
- pd.testing.assert_frame_equal(results, expected)
+ # observations that start together (such as those in progress at the
+ # start) may be in any order, and times computed with other points
+ # may differ in their last bits (below a microsecond)
+ keys = ["start", "target_hash", "satellite", "instrument", "epoch"]
+ results = results.sort_values(keys).reset_index(drop=True)
+ expected = expected.sort_values(keys).reset_index(drop=True)
+ times = ["start", "epoch", "end"]
+ pd.testing.assert_frame_equal(
+ results.drop(columns=times), expected.drop(columns=times)
+ )
+ for column in times:
+ self.assertLess(
+ (results[column] - expected[column]).abs().max(),
+ pd.Timedelta(microseconds=1),
+ )
def test_collect_observations_of_every_instrument(self):
"""
@@ -1218,6 +1236,37 @@ def test_grid_observations_uses_weighted_harmonic_mean_for_revisit(self):
result.iloc[0].revisit.total_seconds(), naive_arithmetic_revisit, places=1
)
+ def test_grid_observations_revisit_undefined_without_revisits(self):
+ """
+ Test that a cell whose points each have a single sample (and so no
+ revisit) has an undefined revisit, rather than raising an error.
+ """
+ cells = gpd.GeoDataFrame([self._make_cell(0, 0, 0, 1, 1)], crs="EPSG:4326")
+ records = [
+ self._make_reduced_observation(k, 0.5, 0.5, 5, 0, 1) for k in range(2)
+ ]
+ reduced = gpd.GeoDataFrame(records, crs="EPSG:4326")
+ reduced["revisit"] = pd.to_timedelta([pd.NaT] * len(records))
+ result = grid_observations(reduced, cells)
+ self.assertEqual(result.iloc[0].samples, 2)
+ self.assertTrue(pd.isna(result.iloc[0].revisit))
+
+ def test_grid_observations_revisit_ignores_points_without_revisits(self):
+ """
+ Test that the revisit of a cell averages only the points with a
+ revisit: a point with a single sample does not weight it.
+ """
+ cells = gpd.GeoDataFrame([self._make_cell(0, 0, 0, 1, 1)], crs="EPSG:4326")
+ single = self._make_reduced_observation(1, 0.6, 0.6, 50, 0, 1)
+ single["revisit"] = pd.NaT
+ reduced = gpd.GeoDataFrame(
+ [self._make_reduced_observation(0, 0.4, 0.4, 5, 10, 100), single],
+ crs="EPSG:4326",
+ )
+ result = grid_observations(reduced, cells)
+ self.assertEqual(result.iloc[0].samples, 101)
+ self.assertAlmostEqual(result.iloc[0].revisit.total_seconds(), 10, places=6)
+
def test_grid_observations_revisit_is_invariant_to_point_density(self):
"""
Regression test: a cell's gridded revisit must not depend on how
@@ -1524,3 +1573,180 @@ def test_no_observations_below_horizon(self):
)
self.assertEqual(len(observations), 1)
self.assertTrue((observations.sat_alt > 0).all())
+
+
+class TestBatchObservations(unittest.TestCase):
+ """
+ Unit tests for the observations of many points collected together (see
+ `tatc.analysis.point_sampling._collect_batch_observations`).
+ """
+
+ def setUp(self):
+ self.start = datetime(2026, 3, 1, tzinfo=timezone.utc)
+ self.orbit = SunSynchronousOrbit(
+ altitude=700e3, equator_crossing_time="10:30", epoch=self.start
+ )
+ rng = np.random.default_rng(1)
+ latitude = np.degrees(np.arcsin(rng.uniform(-1, 1, 200)))
+ longitude = rng.uniform(-180, 180, 200)
+ self.points = [ShapelyPoint(x, y) for x, y in zip(longitude, latitude)]
+
+ def _brute_force_periods(self, satellite, points, end, step=1.0):
+ """
+ The runs of samples at 1 s steps at which each point lies within the
+ field of regard and above the horizon (as start, end), by its hash,
+ from one orbit track evaluated against all points.
+ """
+ instrument = satellite.instruments[0]
+ seconds = np.arange(0, (end - self.start).total_seconds() + step, step)
+ t = timescale.from_datetimes(
+ [self.start + timedelta(seconds=x) for x in seconds]
+ )
+ track = satellite.orbit.to_gp_orbit().get_orbit_track_at_time(t)
+ position, nadir = _compute_nadir_axes(track)[:2]
+ latitude = np.array([point.y for point in points])
+ longitude = np.array([point.x for point in points])
+ xyz = np.array(wgs84.latlon(latitude, longitude).itrs_xyz.m)
+ up = np.array(
+ [
+ np.cos(np.radians(latitude)) * np.cos(np.radians(longitude)),
+ np.cos(np.radians(latitude)) * np.sin(np.radians(longitude)),
+ np.sin(np.radians(latitude)),
+ ]
+ )
+ periods = {}
+ for i, point in enumerate(points):
+ los = xyz[:, i : i + 1] - position
+ distance = np.linalg.norm(los, axis=0)
+ cone = np.degrees(np.arccos(np.sum(los * nadir, axis=0) / distance))
+ elevation = -np.sum(los * up[:, i : i + 1], axis=0) / distance
+ inside = (cone <= instrument.field_of_regard / 2) & (elevation >= 0)
+ edges = np.flatnonzero(np.diff(inside.astype(int)))
+ starts = list(edges[inside[edges + 1]] + 1)
+ ends = list(edges[~inside[edges + 1]])
+ if inside[0]:
+ starts = [0] + starts
+ if inside[-1]:
+ ends = ends + [len(inside) - 1]
+ periods[hash_geometry(point)] = [
+ (
+ self.start + timedelta(seconds=seconds[a]),
+ self.start + timedelta(seconds=seconds[b]),
+ )
+ for a, b in zip(starts, ends)
+ ]
+ return periods
+
+ def test_narrow_field_of_regard_brute_force(self):
+ """
+ Test that the passes of a narrow field of regard (about 12 km wide,
+ crossed in a second or two), which fall between the samples of the
+ screened windows, are found and agree with a brute-force search at
+ 1 s steps.
+ """
+ satellite = Satellite(
+ name="narrow",
+ orbit=self.orbit,
+ instruments=[Instrument(name="narrow", field_of_regard=1)],
+ )
+ end = self.start + timedelta(days=1)
+ points = [
+ ShapelyPoint(x, y)
+ for x, y in zip(np.linspace(-180, 180, 1500), np.linspace(-80, 80, 1500))
+ ]
+ observations = collect_observations(points, satellite, self.start, end)
+ expected = self._brute_force_periods(satellite, points, end)
+ found = 0
+ for target_hash, periods in expected.items():
+ observed = observations[observations.target_hash == target_hash]
+ for left, right in periods:
+ # each brute-force run lies within an observed period
+ matches = observed[
+ (observed.start <= pd.Timestamp(left) + pd.Timedelta(seconds=1))
+ & (observed.end >= pd.Timestamp(right) - pd.Timedelta(seconds=1))
+ ]
+ self.assertEqual(len(matches), 1)
+ found += 1
+ self.assertGreater(found, 0)
+ # every observed period of at least a second contains a sample
+ self.assertLessEqual(
+ int(
+ (
+ (observations.end - observations.start) >= pd.Timedelta(seconds=1)
+ ).sum()
+ ),
+ found,
+ )
+
+ def test_molniya_perigee_passes(self):
+ """
+ Test that short passes near the perigee of a Molniya orbit are
+ found, and that the long passes near apogee end where a brute-force
+ search at 1 s steps ends them.
+ """
+ satellite = Satellite(
+ name="molniya",
+ orbit=MolniyaOrbit(epoch=self.start, perigee_altitude=1000e3),
+ instruments=[Instrument(name="wide", field_of_regard=30)],
+ )
+ end = self.start + timedelta(days=2)
+ for point in [
+ ShapelyPoint(156.699291, -49.799425),
+ ShapelyPoint(76.092856, 38.356215),
+ ]:
+ observations = collect_observations(point, satellite, self.start, end)
+ expected = self._brute_force_periods(satellite, [point], end)[
+ hash_geometry(point)
+ ]
+ self.assertEqual(len(observations), len(expected))
+ for (left, right), (_, row) in zip(expected, observations.iterrows()):
+ self.assertLess(
+ abs((row.start - pd.Timestamp(left)).total_seconds()), 1
+ )
+ self.assertLess(abs((row.end - pd.Timestamp(right)).total_seconds()), 1)
+
+ def test_independent_of_other_points(self):
+ """
+ Test that the observations of a point do not depend on the other
+ points collected with it, including points below the ellipsoid (which
+ loosen the bounds used to screen them), to within a microsecond.
+ """
+ satellite = Satellite(
+ name="sat",
+ orbit=self.orbit,
+ instruments=[Instrument(name="wide", field_of_regard=100)],
+ )
+ end = self.start + timedelta(days=1)
+ others = self.points[1:50] + [
+ ShapelyPoint(35.5, 31.5, -430),
+ ShapelyPoint(-90, 0, -5000),
+ ]
+ alone = collect_observations(self.points[0], satellite, self.start, end)
+ together = collect_observations(
+ [self.points[0]] + others, satellite, self.start, end
+ )
+ together = together[together.target_hash == hash_geometry(self.points[0])]
+ self.assertGreater(len(alone), 0)
+ self.assertEqual(len(alone), len(together))
+ for column in ["start", "epoch", "end"]:
+ difference = (alone[column].values - together[column].values).astype(
+ "int64"
+ )
+ self.assertLess(np.abs(difference).max(), 1000)
+
+ def test_screening_angle(self):
+ """
+ Test that the screening angle is the Earth central angle of the edge
+ of the field of regard, or of the horizon for a field of regard that
+ extends beyond it.
+ """
+ radius, sat_radius = 6356752.0, 7071000.0
+ horizon = np.degrees(np.arccos(radius / sat_radius))
+ self.assertAlmostEqual(_get_screening_angle(sat_radius, radius, 90), horizon)
+ self.assertAlmostEqual(_get_screening_angle(sat_radius, radius, 80), horizon)
+ # at a nadir angle of 45 deg, the central angle follows the law of sines
+ expected = (
+ np.degrees(np.arcsin(sat_radius / radius * np.sin(np.radians(45)))) - 45
+ )
+ self.assertAlmostEqual(_get_screening_angle(sat_radius, radius, 45), expected)
+ self.assertAlmostEqual(_get_screening_angle(sat_radius, radius, 0), 0)
diff --git a/tests/analysis/test_ro_sampling.py b/tests/analysis/test_ro_sampling.py
index 06f80285..59f7df53 100644
--- a/tests/analysis/test_ro_sampling.py
+++ b/tests/analysis/test_ro_sampling.py
@@ -17,6 +17,7 @@
from tatc.analysis import collect_ro_observations
from tatc.analysis.ro_sampling import (
_interpolate_ro_point,
+ _is_rising,
_sample_ro_arcs,
_tangent_point_geometry,
)
@@ -275,6 +276,65 @@ def test_longitude_interpolates_along_shortest_path_across_antimeridian(self):
self.assertAlmostEqual(abs(result["longitude"]), 180.0)
+class TestIsRising(unittest.TestCase):
+ """
+ Unit tests for `_is_rising`.
+ """
+
+ @staticmethod
+ def _points(elevations, pitch=0.0):
+ """
+ Builds profile points at the given tangent point elevations (m),
+ 10 s apart, with a constant transmitter pitch angle (deg).
+ """
+ return [
+ {
+ "time": datetime(2024, 1, 1, tzinfo=timezone.utc)
+ + timedelta(seconds=10 * i),
+ "longitude": 0.0,
+ "latitude": 0.0,
+ "elevation": elevation,
+ "rx_tx_pitch": pitch,
+ "rx_tx_yaw": 90.0,
+ "tp_tx_azimuth": 0.0,
+ }
+ for i, elevation in enumerate(elevations)
+ ]
+
+ def test_direction_through_sample_elevation(self):
+ """
+ Test that the direction is that of the tangent point through the
+ sample elevation, regardless of the transmitter's pitch angle.
+ """
+ self.assertFalse(_is_rising(self._points([60e3, -100e3], pitch=0.0), -80e3))
+ self.assertTrue(_is_rising(self._points([-100e3, 60e3], pitch=-180.0), -80e3))
+
+ def test_direction_at_first_crossing_of_grazing_profile(self):
+ """
+ Test that a profile crossing the sample elevation twice (dipping
+ below it and rising again) takes the direction of its first crossing,
+ at which its time is interpolated.
+ """
+ self.assertFalse(_is_rising(self._points([60e3, -90e3, 60e3]), -80e3))
+ self.assertTrue(_is_rising(self._points([-90e3, 60e3, -90e3]), -80e3))
+
+ def test_direction_from_endpoints_when_never_crossed(self):
+ """
+ Test that a profile that never crosses the sample elevation takes
+ the direction from its first to its last point.
+ """
+ self.assertTrue(_is_rising(self._points([20e3, 10e3, 50e3]), -80e3))
+ self.assertFalse(_is_rising(self._points([50e3, 10e3, 20e3]), -80e3))
+
+ def test_pitch_fallback_for_single_point(self):
+ """
+ Test that a single point is rising if the transmitter's pitch angle
+ is above -90 deg.
+ """
+ self.assertTrue(_is_rising(self._points([0.0], pitch=-80.0), -80e3))
+ self.assertFalse(_is_rising(self._points([0.0], pitch=-100.0), -80e3))
+
+
class TestCollectRoObservations(unittest.TestCase):
"""
Integration tests for `collect_ro_observations`.
@@ -409,6 +469,42 @@ def test_collect_ro_observations_is_rising_is_boolean(self):
self.assertGreater(len(results), 0)
self.assertTrue(results.is_rising.isin([True, False]).all())
+ def test_collect_ro_observations_profiles_are_monotonic(self):
+ """
+ Test that each observation's profile only descends (setting) or only
+ ascends (rising), so that it crosses the sample elevation at most once
+ (grazing occultations are split where the tangent point turns).
+ """
+ results = collect_ro_observations(
+ self.receiver, self.transmitter, self.start, self.end, max_yaw=90
+ )
+ self.assertGreater(len(results), 0)
+ for _, row in results.iterrows():
+ steps = np.diff([point.z for point in row.geometry.geoms])
+ if row.is_rising:
+ self.assertTrue((steps >= 0).all())
+ else:
+ self.assertTrue((steps <= 0).all())
+
+ def test_collect_ro_observations_is_rising_follows_profile(self):
+ """
+ Test that `is_rising` agrees with the direction of each observation's
+ sampled profile through the sample elevation (-80 km by default),
+ including for transmitters nearly abeam of the receiver.
+ """
+ results = collect_ro_observations(
+ self.receiver, self.transmitter, self.start, self.end, max_yaw=90
+ )
+ checked = 0
+ for _, row in results.iterrows():
+ elevations = np.array([point.z for point in row.geometry.geoms])
+ crossings = np.nonzero(np.diff(np.sign(elevations + 80e3)))[0]
+ if len(crossings) > 0:
+ i = crossings[0]
+ self.assertEqual(row.is_rising, elevations[i + 1] > elevations[i])
+ checked += 1
+ self.assertGreater(checked, 0)
+
def test_sample_ro_arcs_closes_at_arc_boundary_when_still_in_range(self):
"""
Test that an observation correctly closes at the sampled arc's own
diff --git a/tests/analysis/test_sample_sizes.py b/tests/analysis/test_sample_sizes.py
new file mode 100644
index 00000000..61591530
--- /dev/null
+++ b/tests/analysis/test_sample_sizes.py
@@ -0,0 +1,176 @@
+"""
+Unit tests for the sample size functions in tatc.analysis.
+
+@author Paul T. Grogan
+"""
+
+import unittest
+from datetime import datetime, timedelta, timezone
+
+import geopandas as gpd
+import numpy as np
+import pandas as pd
+from shapely.geometry import Point as ShapelyPoint
+
+from tatc.analysis import (
+ collect_feature_observations,
+ collect_observations,
+ compute_sample_sizes,
+)
+from tatc.schemas import (
+ ConicalInstrument,
+ Instrument,
+ PointedInstrument,
+ Satellite,
+ SunSynchronousOrbit,
+)
+from tatc.utils import VelocityFrame, compute_along_track_field_of_view
+
+
+class TestSampleSizes(unittest.TestCase):
+ """
+ Unit tests for `compute_sample_sizes`.
+ """
+
+ def setUp(self):
+ self.start = datetime(2026, 3, 1, tzinfo=timezone.utc)
+ self.end = self.start + timedelta(days=1)
+ # a cross-track scanner like ATMS: 2.2 deg beams at 1.1 deg spacing
+ self.scanner = PointedInstrument(
+ name="scanner",
+ field_of_regard=105.6,
+ cross_track_field_of_view=105.6,
+ along_track_field_of_view=2.2,
+ cross_track_pixels=96,
+ cross_track_oversampling=0.5,
+ is_rectangular=True,
+ velocity_frame=VelocityFrame.INERTIAL,
+ )
+ self.simple = Instrument(name="simple", field_of_regard=100)
+ self.satellite = Satellite(
+ name="sat",
+ orbit=SunSynchronousOrbit(
+ altitude=830e3, equator_crossing_time="13:30", epoch=self.start
+ ),
+ instruments=[self.scanner, self.simple],
+ )
+ self.points = [ShapelyPoint(-100, 35), ShapelyPoint(-60, -10)]
+
+ def test_point_observations(self):
+ """
+ Test that the pixels of a pointed instrument are larger across track
+ than along track off nadir, that the spacing of overlapping pixels is
+ half their size across track, and that the scan angle lies within
+ the field of regard.
+ """
+ observations = collect_observations(
+ self.points, self.satellite, self.start, self.end, instrument_index=0
+ )
+ sizes = compute_sample_sizes(observations, self.satellite)
+ self.assertGreater(len(sizes), 0)
+ self.assertEqual(list(sizes.index), list(observations.index))
+ self.assertTrue((sizes.sample_along > 0).all())
+ self.assertTrue((sizes.sample_cross >= sizes.sample_along).all())
+ np.testing.assert_allclose(
+ sizes.spacing_cross / sizes.sample_cross, 0.5, rtol=0.02
+ )
+ np.testing.assert_allclose(sizes.spacing_along, sizes.sample_along)
+ self.assertTrue((sizes.scan_angle.abs() <= 105.6 / 2 + 0.1).all())
+ # the slant range is at least the satellite's altitude
+ self.assertTrue((sizes.sat_range > 800e3).all())
+
+ def test_instrument_without_pixels(self):
+ """
+ Test that an instrument without pixels has undefined sample sizes, but
+ a slant range and scan angle.
+ """
+ observations = collect_observations(
+ self.points, self.satellite, self.start, self.end, instrument_index=1
+ )
+ sizes = compute_sample_sizes(observations, self.satellite)
+ self.assertGreater(len(sizes), 0)
+ self.assertTrue(sizes.sample_along.isna().all())
+ self.assertTrue(sizes.spacing_cross.isna().all())
+ self.assertTrue(sizes.sat_range.notna().all())
+ self.assertTrue(sizes.scan_angle.notna().all())
+
+ def test_feature_observations(self):
+ """
+ Test that the samples of feature observations are computed at the
+ centroids of the viewed parts, at their times.
+ """
+ satellite = self.satellite.model_copy(
+ update={
+ "instruments": [
+ self.scanner.model_copy(
+ update={
+ "along_track_field_of_view": compute_along_track_field_of_view(
+ 830e3, 30, 98.7
+ )
+ }
+ )
+ ]
+ }
+ )
+ times = [self.start + timedelta(seconds=30 * (i + 0.5)) for i in range(2880)]
+ features = gpd.GeoDataFrame(
+ {
+ "start": pd.DatetimeIndex([self.start], dtype="datetime64[ns, UTC]"),
+ "end": pd.DatetimeIndex([self.end], dtype="datetime64[ns, UTC]"),
+ },
+ geometry=[ShapelyPoint(-100, 35).buffer(0.5)],
+ crs="EPSG:4326",
+ )
+ observations = collect_feature_observations(features, satellite, times)
+ sizes = compute_sample_sizes(observations, satellite)
+ self.assertGreater(len(sizes), 0)
+ np.testing.assert_allclose(sizes.sat_range, observations.sat_range, rtol=1e-9)
+ self.assertTrue((sizes.sample_cross > 0).all())
+
+ def test_unknown_satellite(self):
+ """
+ Test that observations by a satellite not given raise an error.
+ """
+ observations = collect_observations(
+ self.points, self.satellite, self.start, self.end
+ )
+ other = self.satellite.model_copy(update={"name": "other"})
+ with self.assertRaises(ValueError):
+ compute_sample_sizes(observations, other)
+
+ def test_empty_observations(self):
+ """
+ Test that no observations give no sample sizes, with their columns.
+ """
+ observations = collect_observations(
+ self.points[0],
+ self.satellite,
+ self.start,
+ self.start + timedelta(minutes=1),
+ )
+ sizes = compute_sample_sizes(observations, self.satellite)
+ self.assertEqual(len(sizes), 0)
+ self.assertIn("sample_cross", sizes.columns)
+
+ def test_conical_observations(self):
+ """
+ Test that the samples of a conical scanner with a beam width are
+ computed, and longer along track (the oblique direction of a forward
+ view) than across track.
+ """
+ conical = ConicalInstrument(
+ name="conical",
+ cone_angle=47.5,
+ along_track_field_of_view=0.82,
+ scan_half_width=75,
+ beam_width=1.8,
+ scan_sample_spacing=0.8,
+ )
+ satellite = self.satellite.model_copy(update={"instruments": [conical]})
+ observations = collect_observations(
+ self.points, satellite, self.start, self.end
+ )
+ sizes = compute_sample_sizes(observations, satellite)
+ self.assertGreater(len(sizes), 0)
+ self.assertTrue(sizes[["sample_along", "sample_cross"]].notna().all().all())
+ self.assertTrue((sizes.spacing_along > 0).all())
diff --git a/tests/analysis/test_space_sampling.py b/tests/analysis/test_space_sampling.py
index 05bcc4b9..3971a3ad 100644
--- a/tests/analysis/test_space_sampling.py
+++ b/tests/analysis/test_space_sampling.py
@@ -310,6 +310,8 @@ def test_output_format(self):
"to_satellite",
"start",
"end",
+ "closest_time",
+ "closest_range",
],
)
self.assertEqual(observations.crs, "EPSG:4326")
@@ -342,6 +344,31 @@ def test_output_format(self):
atol=1e-3,
)
+ def test_closest_approach(self):
+ """
+ Test that each observation's closest approach is the least range during
+ its period (within the samples' refinement), at a time within it.
+ """
+ observations = collect_space_observations(
+ self.leader, self.start, self.end, self.polar
+ )
+ self.assertGreater(len(observations), 0)
+ for _, row in observations.iterrows():
+ self.assertTrue(row.start <= row.closest_time <= row.end)
+ duration = (row.end - row.start).total_seconds()
+ times = [
+ row.start.to_pydatetime() + timedelta(seconds=float(s))
+ for s in np.linspace(0, duration, int(duration * 10) + 1)
+ ]
+ t = timescale.from_datetimes(times)
+ distance = np.linalg.norm(
+ self.leader.orbit.to_gp_orbit().get_orbit_track_at_time(t).position.m
+ - self.polar.orbit.to_gp_orbit().get_orbit_track_at_time(t).position.m,
+ axis=0,
+ )
+ self.assertLessEqual(row.closest_range, distance.min() + 1e-3)
+ self.assertGreater(row.closest_range, distance.min() - 100)
+
def test_empty(self):
for observations in [
collect_space_observations(self.leader, self.start, self.end, self.far),
@@ -358,6 +385,8 @@ def test_empty(self):
"to_satellite",
"start",
"end",
+ "closest_time",
+ "closest_range",
],
)
diff --git a/tests/schemas/instrument/test_conical.py b/tests/schemas/instrument/test_conical.py
index 9ca5e3ad..9fb3f74b 100644
--- a/tests/schemas/instrument/test_conical.py
+++ b/tests/schemas/instrument/test_conical.py
@@ -238,3 +238,85 @@ def test_compute_cone_and_azimuth(self):
self.assertAlmostEqual(
((float(a) - azimuth + 180) % 360) - 180, 0, delta=1e-6
)
+
+ def test_sample_size_of_forward_view(self):
+ """
+ Test that the beam of a forward conical view (as of AMSR2's 6.9 GHz
+ channel, 1.8 deg from 700 km at a cone angle of 47.5 deg, about 35 by
+ 62 km) is longer along track, in the oblique direction of the view, by
+ about the secant of its zenith angle, and spans the beam width times
+ the slant range across track.
+ """
+ instrument = ConicalInstrument(
+ name="amsr2",
+ cone_angle=47.5,
+ along_track_field_of_view=0.82,
+ scan_half_width=75,
+ beam_width=1.8,
+ scan_sample_spacing=0.8,
+ )
+ target = instrument.compute_footprint_center(self.orbit_track)
+ altitude, _, distance = (
+ self.orbit_track - target.at(self.orbit_track.t)
+ ).altaz()
+ along, cross = instrument.compute_sample_size(self.orbit_track, target)
+ self.assertAlmostEqual(cross / (distance.m * np.radians(1.8)), 1, places=2)
+ self.assertAlmostEqual(
+ along * np.cos(np.radians(90 - altitude.degrees)) / cross, 1, delta=0.03
+ )
+ self.assertAlmostEqual(cross / 35e3, 1, delta=0.05)
+ self.assertAlmostEqual(along / 62e3, 1, delta=0.05)
+
+ def test_sample_spacing(self):
+ """
+ Test that samples are spaced along track by the distance the arc
+ advances per scan, and across track by the scan sample spacing times
+ the arc's radius on the ground.
+ """
+ instrument = ConicalInstrument(
+ name="amsr2",
+ cone_angle=47.5,
+ along_track_field_of_view=0.82,
+ beam_width=1.8,
+ scan_sample_spacing=0.8,
+ )
+ target = instrument.compute_footprint_center(self.orbit_track)
+ along, cross = instrument.compute_sample_spacing(self.orbit_track, target)
+ self.assertAlmostEqual(
+ along / (2 * 700e3 * np.tan(np.radians(0.41))), 1, delta=0.01
+ )
+ subpoint = wgs84.subpoint_of(self.orbit_track)
+ radius = (
+ np.radians(
+ np.degrees(
+ np.arccos(
+ np.sin(np.radians(subpoint.latitude.degrees))
+ * np.sin(np.radians(target.latitude.degrees))
+ + np.cos(np.radians(subpoint.latitude.degrees))
+ * np.cos(np.radians(target.latitude.degrees))
+ * np.cos(
+ np.radians(
+ target.longitude.degrees - subpoint.longitude.degrees
+ )
+ )
+ )
+ )
+ )
+ * 6371e3
+ )
+ self.assertAlmostEqual(cross / (radius * np.radians(0.8)), 1, delta=0.01)
+
+ def test_sample_size_not_modeled(self):
+ """
+ Test that the sample sizes are undefined without a beam width, and the
+ cross-track spacing without a scan sample spacing.
+ """
+ instrument = ConicalInstrument(
+ name="c", cone_angle=47.5, along_track_field_of_view=0.82
+ )
+ target = instrument.compute_footprint_center(self.orbit_track)
+ along, cross = instrument.compute_sample_size(self.orbit_track, target)
+ self.assertTrue(np.isnan(along) and np.isnan(cross))
+ along, cross = instrument.compute_sample_spacing(self.orbit_track, target)
+ self.assertGreater(along, 0)
+ self.assertTrue(np.isnan(cross))
diff --git a/tests/schemas/instrument/test_pointed.py b/tests/schemas/instrument/test_pointed.py
index dfcd791d..a30b2840 100644
--- a/tests/schemas/instrument/test_pointed.py
+++ b/tests/schemas/instrument/test_pointed.py
@@ -17,6 +17,7 @@
from tatc.utils.projection import (
VelocityFrame,
ViewGeometry,
+ compute_ground_advance,
compute_projected_ray_position,
compute_view_angles,
)
@@ -164,15 +165,16 @@ def test_pixel_count_bounds(self):
def test_oversampling_bounds(self):
"""
- Test that cross/along track oversampling must be in [0, 1).
+ Test that cross/along track oversampling must be less than 1, and
+ may be negative (a gap between pixels).
"""
- with self.assertRaises(ValidationError):
- PointedInstrument(
- name="t",
- cross_track_field_of_view=10.0,
- along_track_field_of_view=10.0,
- cross_track_oversampling=-0.1,
- )
+ gaps = PointedInstrument(
+ name="t",
+ cross_track_field_of_view=10.0,
+ along_track_field_of_view=10.0,
+ cross_track_oversampling=-1.5,
+ )
+ self.assertEqual(gaps.cross_track_oversampling, -1.5)
with self.assertRaises(ValidationError):
PointedInstrument(
name="t",
@@ -223,6 +225,162 @@ def test_get_along_track_instantaneous_field_of_view_with_oversampling(self):
# pitch = 10 / 2 = 5 degrees; ifov = pitch / (1 - 0.5) = 10 degrees
self.assertAlmostEqual(o.get_along_track_instantaneous_field_of_view(), 10.0)
+ def test_pixel_offsets_span_field_of_view_with_oversampling(self):
+ """
+ Test that the pixel centers are spaced evenly across the field of
+ view (by its share per pixel), whatever the oversampling, so that the
+ outermost centers lie half a spacing inside its edges.
+ """
+ for oversampling in (-0.5, 0, 0.5):
+ o = PointedInstrument(
+ name="t",
+ cross_track_field_of_view=96.0,
+ along_track_field_of_view=1.0,
+ cross_track_pixels=96,
+ cross_track_oversampling=oversampling,
+ )
+ first, _ = o._get_pixel_offsets(0, 0)
+ last, _ = o._get_pixel_offsets(95, 0)
+ self.assertAlmostEqual(first, -47.5)
+ self.assertAlmostEqual(last, 47.5)
+ self.assertAlmostEqual(o.get_cross_track_sample_spacing(), 1.0)
+ self.assertAlmostEqual(
+ o.get_cross_track_instantaneous_field_of_view(),
+ 1.0 / (1 - oversampling),
+ )
+
+ def test_compute_sample_size_at_nadir(self):
+ """
+ Test that a pixel viewing the sub-satellite point spans about its
+ instantaneous field of view times the altitude, along and across
+ track, and that a gap between pixels makes the spacing larger than
+ the pixel.
+ """
+ start = datetime(2026, 1, 1, tzinfo=timezone.utc)
+ orbit = CircularOrbit(altitude=800e3, inclination=98, epoch=start)
+ track = orbit.to_gp_orbit().get_orbit_track(start)
+ target = wgs84.subpoint_of(track)
+ height = wgs84.height_of(track).m
+ o = PointedInstrument(
+ name="t",
+ cross_track_field_of_view=100.0,
+ along_track_field_of_view=1.0,
+ cross_track_pixels=100,
+ cross_track_oversampling=-1.0,
+ )
+ along, cross = o.compute_sample_size(track, target)
+ self.assertAlmostEqual(along / (height * np.radians(1.0)), 1, places=3)
+ self.assertAlmostEqual(cross / (height * np.radians(0.5)), 1, places=3)
+ along_spacing, cross_spacing = o.compute_sample_spacing(track, target)
+ self.assertAlmostEqual(along_spacing, along, delta=1)
+ self.assertAlmostEqual(cross_spacing / cross, 2, places=3)
+
+ def test_compute_sample_size_off_nadir(self):
+ """
+ Test that a pixel viewing a target off nadir, across track, is longer
+ across track than along track by about the secant of the target's
+ zenith angle, and that both grow with the slant range.
+ """
+ start = datetime(2026, 1, 1, tzinfo=timezone.utc)
+ orbit = CircularOrbit(altitude=800e3, inclination=98, epoch=start)
+ track = orbit.to_gp_orbit().get_orbit_track(start)
+ o = PointedInstrument(
+ name="t",
+ cross_track_field_of_view=100.0,
+ along_track_field_of_view=1.0,
+ cross_track_pixels=100,
+ roll_angle=40,
+ )
+ target = o.compute_footprint_center(track)
+ along, cross = o.compute_sample_size(track, target)
+ altitude, _, distance = (track - target.at(track.t)).altaz()
+ zenith = np.radians(90 - altitude.degrees)
+ self.assertAlmostEqual(along / (distance.m * np.radians(1.0)), 1, places=2)
+ self.assertAlmostEqual(cross * np.cos(zenith) / along, 1, places=2)
+
+ def test_scan_period_bounds(self):
+ """
+ Test that the scan period defaults to None and must be positive.
+ """
+ o = PointedInstrument(
+ name="t", cross_track_field_of_view=100.0, along_track_field_of_view=1.0
+ )
+ self.assertIsNone(o.scan_period)
+ for value in (0, -1):
+ with self.assertRaises(ValidationError):
+ PointedInstrument(
+ name="t",
+ cross_track_field_of_view=100.0,
+ along_track_field_of_view=1.0,
+ scan_period=value,
+ )
+
+ def test_compute_ground_advance_matches_subpoints(self):
+ """
+ Test that the ground advance at the sub-satellite point over a short
+ period matches the distance between the sub-satellite points at the
+ start and end of the period.
+ """
+ start = datetime(2026, 1, 1, tzinfo=timezone.utc)
+ orbit = CircularOrbit(altitude=800e3, inclination=98, epoch=start).to_gp_orbit()
+ track = orbit.get_orbit_track(start)
+ later = wgs84.subpoint_of(orbit.get_orbit_track(start + timedelta(seconds=2)))
+ target = wgs84.subpoint_of(track)
+ advance = compute_ground_advance(track, target, 2)
+ expected = geodesic_distance(
+ target.longitude.degrees,
+ target.latitude.degrees,
+ later.longitude.degrees,
+ later.latitude.degrees,
+ )
+ self.assertIsInstance(float(advance), float)
+ self.assertAlmostEqual(advance / expected, 1, places=3)
+
+ def test_compute_sample_spacing_with_scan_period(self):
+ """
+ Test that the along-track spacing of a scanner with one pixel along
+ track is the advance of its scans, nearly constant across the scan,
+ while its angular spacing grows toward the edges; and that the
+ spacing of an array of detectors is the larger of its pitch and the
+ advance per detector.
+ """
+ start = datetime(2026, 1, 1, tzinfo=timezone.utc)
+ orbit = CircularOrbit(altitude=800e3, inclination=98, epoch=start)
+ track = orbit.to_gp_orbit().get_orbit_track(start)
+ scanner = PointedInstrument(
+ name="t",
+ cross_track_field_of_view=100.0,
+ along_track_field_of_view=1.0,
+ cross_track_pixels=100,
+ view_geometry=ViewGeometry.SCAN,
+ scan_period=2.0,
+ )
+ angular = scanner.model_copy(update={"scan_period": None})
+ nadir = wgs84.subpoint_of(track)
+ edge = compute_projected_ray_position(track, 0, 0, 50)
+ advance = compute_ground_advance(track, nadir, 2.0)
+ along_nadir, _ = scanner.compute_sample_spacing(track, nadir)
+ along_edge, _ = scanner.compute_sample_spacing(track, edge)
+ self.assertAlmostEqual(along_nadir, advance)
+ self.assertGreater(along_edge / along_nadir, 0.95)
+ self.assertLess(along_edge / along_nadir, 1.0)
+ angular_nadir, _ = angular.compute_sample_spacing(track, nadir)
+ angular_edge, _ = angular.compute_sample_spacing(track, edge)
+ self.assertGreater(angular_edge / angular_nadir, 1.5)
+ # an array of 10 detectors whose pitch matches the advance per detector at nadir
+ pitch = np.degrees(advance / 10 / wgs84.height_of(track).m)
+ array = scanner.model_copy(
+ update={"along_track_field_of_view": 10 * pitch, "along_track_pixels": 10}
+ )
+ array_nadir, _ = array.compute_sample_spacing(track, nadir)
+ array_edge, _ = array.compute_sample_spacing(track, edge)
+ self.assertAlmostEqual(array_nadir / (advance / 10), 1, places=2)
+ pitch_edge, _ = array.model_copy(
+ update={"scan_period": None}
+ ).compute_sample_spacing(track, edge)
+ self.assertAlmostEqual(array_edge, pitch_edge)
+ self.assertGreater(array_edge, along_edge / 10)
+
def test_get_pixel_cone_and_clock_angle_single_pixel(self):
"""
Test that a single pixel (spanning the full field of view) is
diff --git a/tests/schemas/instrument/test_simple.py b/tests/schemas/instrument/test_simple.py
index a68e7b7a..6dc433e6 100644
--- a/tests/schemas/instrument/test_simple.py
+++ b/tests/schemas/instrument/test_simple.py
@@ -14,7 +14,7 @@
from tatc.constants import de421, timescale
from tatc.schemas import CircularOrbit, Instrument
-from tatc.utils import geodesic_distance
+from tatc.utils import compute_glint_angle, geodesic_distance
class TestInstrument(unittest.TestCase):
@@ -361,6 +361,50 @@ def test_valid_observation_target_solar_elevation(self):
o.is_valid_observation(orbit_track, subpoint), expected, str(kwargs)
)
+ def test_target_glint_angle_bounds(self):
+ """
+ Test that target glint angles are bounded and that the minimum cannot
+ exceed the maximum.
+ """
+ for kwargs in [
+ {"min_target_glint_angle": -1},
+ {"max_target_glint_angle": 181},
+ {"min_target_glint_angle": 30, "max_target_glint_angle": 10},
+ ]:
+ with self.assertRaises(ValidationError):
+ Instrument(name="Test Instrument", **kwargs)
+ o = Instrument(name="Test Instrument", min_target_glint_angle=25)
+ self.assertEqual(o.min_target_glint_angle, 25)
+ self.assertIsNone(o.max_target_glint_angle)
+
+ def test_valid_observation_target_glint_angle(self):
+ """
+ Test that an observation is valid when the target's glint angle lies
+ within the required range, for a vector of times over half a day.
+ """
+ times = timescale.utc(2020, 3, 20, 6, range(0, 720, 5)) # type: ignore
+ orbit_track = self.test_sat_5.at(times) # type: ignore
+ subpoint = wgs84.subpoint_of(orbit_track)
+ glint_angle = compute_glint_angle(orbit_track, subpoint)
+ # the sample spans small and large glint angles
+ self.assertTrue(np.any(glint_angle < 25))
+ self.assertTrue(np.any(glint_angle > 60))
+ for kwargs, expected in [
+ ({"min_target_glint_angle": 25}, glint_angle >= 25),
+ ({"max_target_glint_angle": 25}, glint_angle <= 25),
+ (
+ {"min_target_glint_angle": 25, "req_target_sunlit": True},
+ glint_angle >= 25,
+ ),
+ ]:
+ o = Instrument(name="Test Instrument", **kwargs)
+ valid = o.is_valid_observation(orbit_track, subpoint)
+ if "req_target_sunlit" in kwargs:
+ expected = expected & o.model_copy(
+ update={"min_target_glint_angle": None}
+ ).is_valid_observation(orbit_track, subpoint)
+ np.testing.assert_array_equal(valid, expected, str(kwargs))
+
def test_compute_footprint_center_geocentric_nadir(self):
"""
Test that the footprint center of an instrument with a geocentric
diff --git a/tests/schemas/orbit/test_gp.py b/tests/schemas/orbit/test_gp.py
index 65ea8ec7..6f12968d 100644
--- a/tests/schemas/orbit/test_gp.py
+++ b/tests/schemas/orbit/test_gp.py
@@ -21,9 +21,13 @@
from skyfield.framelib import itrs
from tatc import config, constants
-from tatc.schemas import GeneralPerturbationsOrbit, Point
+from tatc.schemas import CircularOrbit, GeneralPerturbationsOrbit, Point, Satellite
from tatc.utils.computation import _run
-from tatc.utils.propagation import _complete_passes, _find_events
+from tatc.utils.propagation import (
+ _complete_passes,
+ _find_events,
+ align_element_switches,
+)
REPEATING = {"remove_drag": True, "repeat_cycle": "auto"}
"""Options to propagate an orbit maintained on its (found) repeat ground track."""
@@ -2473,3 +2477,295 @@ def test_culmination_below_minimum(self):
jd, events = self.complete([10.5, 11], [1, 2], t_1=15.0)
self.assertEqual(len(jd), 0)
self.assertEqual(len(events), 0)
+
+
+def _orbit_with_epochs(epochs, **options):
+ """
+ Builds a GP orbit with an element at each epoch, each with a distinct
+ mean anomaly (10 deg times its index) so that the elements propagate to
+ distinct positions.
+ """
+ tle = [
+ "1 25544U 98067A 21156.30527927 .00003432 00000-0 70541-4 0 9993",
+ "2 25544 51.6455 41.4969 0003508 68.0432 78.3395 15.48957534286754",
+ ]
+ base = GeneralPerturbationsOrbit.from_tle(tle).elements[0]
+ return GeneralPerturbationsOrbit(
+ elements=[
+ base.model_copy(update={"epoch": epoch, "mean_anomaly": 10.0 * k})
+ for k, epoch in enumerate(epochs)
+ ],
+ **options,
+ )
+
+
+class TestElementSwitchTimes(unittest.TestCase):
+ """
+ Unit tests for GeneralPerturbationsOrbit.element_switch_times and
+ get_element_index.
+ """
+
+ def setUp(self):
+ self.epochs = [datetime(2022, 1, d, tzinfo=timezone.utc) for d in (1, 3, 5)]
+ self.switches = [
+ datetime(2022, 1, 1, 6, tzinfo=timezone.utc),
+ datetime(2022, 1, 4, 18, tzinfo=timezone.utc),
+ ]
+ self.orbit = _orbit_with_epochs(self.epochs, element_switch_times=self.switches)
+
+ def test_default_selects_closest_element(self):
+ """
+ Test that without switch times, the element used is the closest one.
+ """
+ orbit = _orbit_with_epochs(self.epochs)
+ times = [self.epochs[0] + timedelta(hours=h) for h in range(0, 120, 7)]
+ self.assertEqual(
+ orbit.get_element_index(times), orbit.get_closest_element_index(times)
+ )
+
+ def test_switch_times_select_elements(self):
+ """
+ Test that each time uses the element between the switches before and
+ after it (the later element exactly at a switch), rather than the
+ closest element.
+ """
+ cases = {
+ datetime(2022, 1, 1, 5, 59, tzinfo=timezone.utc): 0,
+ self.switches[0]: 1,
+ datetime(2022, 1, 2, tzinfo=timezone.utc): 1, # closest is element 0
+ datetime(2022, 1, 4, 12, tzinfo=timezone.utc): 1, # closest is element 2
+ self.switches[1]: 2,
+ }
+ for time, index in cases.items():
+ self.assertEqual(self.orbit.get_element_index(time), index)
+ self.assertEqual(
+ self.orbit.get_element_index(list(cases)), list(cases.values())
+ )
+ self.assertEqual(
+ self.orbit.get_element_index(
+ constants.timescale.from_datetimes(list(cases))
+ ),
+ list(cases.values()),
+ )
+ self.assertEqual(self.orbit.get_element_index(None), 0)
+
+ def test_switch_times_must_number_one_fewer_than_elements(self):
+ """
+ Test that switch times must number one fewer than the elements.
+ """
+ with self.assertRaises(ValidationError):
+ _orbit_with_epochs(self.epochs, element_switch_times=self.switches[:1])
+
+ def test_switch_times_must_lie_between_epochs(self):
+ """
+ Test that each switch time must lie between the epochs of the
+ elements before and after it.
+ """
+ with self.assertRaises(ValidationError):
+ _orbit_with_epochs(
+ self.epochs,
+ element_switch_times=[
+ datetime(2022, 1, 3, 6, tzinfo=timezone.utc),
+ self.switches[1],
+ ],
+ )
+
+ def test_coinciding_switches_skip_an_element(self):
+ """
+ Test that an element between two coinciding switch times is never
+ used, and that the partition into segments skips it.
+ """
+ orbit = _orbit_with_epochs(
+ self.epochs, element_switch_times=[self.epochs[1], self.epochs[1]]
+ )
+ self.assertEqual(orbit.get_element_index(self.epochs[1]), 2)
+ boundaries, indices = orbit.partition_by_element_index(
+ datetime(2022, 1, 1, tzinfo=timezone.utc),
+ datetime(2022, 1, 6, tzinfo=timezone.utc),
+ )
+ self.assertEqual(boundaries[1:-1], [self.epochs[1]])
+ self.assertEqual(indices, [0, 2])
+
+ def test_partition_uses_switch_times(self):
+ """
+ Test that the partition into segments switches elements at the
+ switch times.
+ """
+ start = datetime(2022, 1, 1, tzinfo=timezone.utc)
+ end = datetime(2022, 1, 6, tzinfo=timezone.utc)
+ boundaries, indices = self.orbit.partition_by_element_index(start, end)
+ self.assertEqual(boundaries, [start, *self.switches, end])
+ self.assertEqual(indices, [0, 1, 2])
+
+ def test_propagation_uses_switched_element(self):
+ """
+ Test that the orbit is propagated with the element selected by the
+ switch times, not the closest element.
+ """
+ t = constants.timescale.from_datetime(datetime(2022, 1, 2, tzinfo=timezone.utc))
+ expected = self.orbit.elements[1].to_skyfield().at(t).position.m
+ closest = self.orbit.elements[0].to_skyfield().at(t).position.m
+ actual = self.orbit.get_orbit_track_at_time(t).position.m
+ np.testing.assert_allclose(actual, expected, atol=1e-6)
+ self.assertGreater(np.linalg.norm(actual - closest), 1e3)
+
+ def test_switch_times_carried_by_derived_and_serialized_orbits(self):
+ """
+ Test that derived orbits and serialized orbits keep the switch times.
+ """
+ self.assertEqual(
+ self.orbit.get_derived_orbit(10, 20).element_switch_times, self.switches
+ )
+ restored = GeneralPerturbationsOrbit.model_validate_json(
+ self.orbit.model_dump_json()
+ )
+ self.assertEqual(restored.element_switch_times, self.switches)
+
+
+class TestAlignElementSwitches(unittest.TestCase):
+ """
+ Unit tests for align_element_switches.
+ """
+
+ def setUp(self):
+ self.t0 = datetime(2022, 1, 1, tzinfo=timezone.utc)
+
+ def hours(self, *values, offset=0.0):
+ """
+ Epochs at the given hours after t0, shifted by offset seconds.
+ """
+ return [self.t0 + timedelta(hours=h, seconds=offset) for h in values]
+
+ @staticmethod
+ def satellite(name, epochs):
+ return Satellite(name=name, orbit=_orbit_with_epochs(epochs))
+
+ @staticmethod
+ def midpoint(a, b):
+ return a + (b - a) / 2
+
+ def test_satellites_switch_at_common_times(self):
+ """
+ Test that three satellites whose elements are published seconds
+ apart switch at common times, midway between the events' mean epochs,
+ keeping all their elements, and that the inputs are unchanged.
+ """
+ satellites = [
+ self.satellite("A", self.hours(0, 8, 16)),
+ self.satellite("B", self.hours(0, 8, 16, offset=20)),
+ self.satellite("C", self.hours(0, 8, 16, offset=-35)),
+ ]
+ aligned = align_element_switches(satellites)
+ means = self.hours(0, 8, 16, offset=-5)
+ expected = [
+ self.midpoint(means[0], means[1]),
+ self.midpoint(means[1], means[2]),
+ ]
+ for satellite in aligned:
+ self.assertEqual(len(satellite.orbit.elements), 3)
+ self.assertEqual(satellite.orbit.element_switch_times, expected)
+ for satellite in satellites:
+ self.assertIsNone(satellite.orbit.element_switch_times)
+ times = [self.t0 + timedelta(minutes=m) for m in range(0, 24 * 60, 7)]
+ indices = [satellite.orbit.get_element_index(times) for satellite in aligned]
+ self.assertEqual(indices[0], indices[1])
+ self.assertEqual(indices[0], indices[2])
+
+ def test_missing_event_is_dropped_when_shared_only(self):
+ """
+ Test that, with shared_only, an element published by only some
+ satellites is removed, so that all use elements of the same events.
+ """
+ a, b = align_element_switches(
+ [
+ self.satellite("A", self.hours(0, 8, 16)),
+ self.satellite("B", self.hours(0, 16, offset=20)),
+ ]
+ )
+ self.assertEqual(a.orbit.get_element_epochs(), self.hours(0, 16))
+ self.assertEqual(a.orbit.element_switch_times, b.orbit.element_switch_times)
+ self.assertEqual(
+ a.orbit.element_switch_times,
+ [self.midpoint(*self.hours(0, 16, offset=10))],
+ )
+
+ def test_missing_event_switches_at_latest_common_time(self):
+ """
+ Test that, without shared_only, every event is used, and a satellite
+ without an element in an event switches at the latest common time
+ between the events of its elements.
+ """
+ a, b = align_element_switches(
+ [
+ self.satellite("A", self.hours(0, 8, 16)),
+ self.satellite("B", self.hours(0, 16, offset=20)),
+ ],
+ shared_only=False,
+ )
+ self.assertEqual(len(a.orbit.elements), 3)
+ self.assertEqual(len(a.orbit.element_switch_times), 2)
+ self.assertEqual(b.orbit.element_switch_times, a.orbit.element_switch_times[1:])
+
+ def test_latest_element_of_an_event_is_used(self):
+ """
+ Test that a satellite with several elements in one event (such as a
+ duplicate) uses its latest and the others are removed.
+ """
+ a, _ = align_element_switches(
+ [
+ self.satellite("A", self.hours(0) + self.hours(0, 8, offset=1)),
+ self.satellite("B", self.hours(0, 8, offset=20)),
+ ]
+ )
+ self.assertEqual(a.orbit.get_element_epochs(), self.hours(0, 8, offset=1))
+ self.assertEqual(a.orbit.elements[0].mean_anomaly, 10.0)
+
+ def test_single_element_satellites_are_unchanged(self):
+ """
+ Test that satellites without more than one GP element are returned
+ unchanged and do not affect the others.
+ """
+ circular = Satellite(
+ name="circular", orbit=CircularOrbit(altitude=500e3, inclination=45)
+ )
+ single = self.satellite("single", self.hours(4))
+ aligned = align_element_switches(
+ [circular, single, self.satellite("A", self.hours(0, 8))]
+ )
+ self.assertIs(aligned[0], circular)
+ self.assertIs(aligned[1], single)
+ self.assertEqual(len(aligned[2].orbit.element_switch_times), 1)
+
+ def test_chained_epochs_raise(self):
+ """
+ Test that epochs spread through time, chaining into an event longer
+ than the tolerance, raise an error.
+ """
+ minutes = [self.t0 + timedelta(minutes=m) for m in (0, 8, 16, 24)]
+ satellites = [
+ self.satellite("A", [minutes[0], minutes[2]]),
+ self.satellite("B", [minutes[1], minutes[3]]),
+ ]
+ with self.assertRaises(ValueError):
+ align_element_switches(satellites)
+
+ def test_close_events_raise(self):
+ """
+ Test that events whose mean epochs are not more than twice the
+ tolerance apart raise an error.
+ """
+ satellites = [self.satellite("A", [self.t0, self.t0 + timedelta(minutes=15)])]
+ with self.assertRaises(ValueError):
+ align_element_switches(satellites)
+
+ def test_no_shared_event_raises(self):
+ """
+ Test that, with shared_only, satellites without any event in common
+ raise an error.
+ """
+ satellites = [
+ self.satellite("A", self.hours(0, 8)),
+ self.satellite("B", self.hours(4, 12)),
+ ]
+ with self.assertRaises(ValueError):
+ align_element_switches(satellites)
diff --git a/tests/schemas/test_attitude.py b/tests/schemas/test_attitude.py
new file mode 100644
index 00000000..a3c8fcde
--- /dev/null
+++ b/tests/schemas/test_attitude.py
@@ -0,0 +1,636 @@
+"""
+Unit tests for the attitude schemas in tatc.schemas.
+
+@author Paul T. Grogan
+"""
+
+import unittest
+from datetime import datetime, timedelta, timezone
+
+import numpy as np
+from pydantic import ValidationError
+from shapely.geometry import Point as ShapelyPoint
+from skyfield.api import wgs84
+from skyfield.framelib import itrs
+
+from tatc.analysis import collect_ground_track, collect_observations
+from tatc.schemas import (
+ Attitude,
+ AttitudeSchedule,
+ AttitudeSegment,
+ CircularOrbit,
+ ConicalInstrument,
+ GlintAttitude,
+ Point,
+ PointedInstrument,
+ Satellite,
+ SunSynchronousOrbit,
+ TargetAttitude,
+ WalkerConstellation,
+)
+from tatc.utils import VelocityFrame, compute_glint_angle, geodesic_distance
+from tatc.utils.time import _to_time
+
+
+class TestAttitude(unittest.TestCase):
+ """
+ Unit tests for the Attitude and AttitudeSchedule schemas.
+ """
+
+ def setUp(self):
+ self.start = datetime(2026, 1, 1, tzinfo=timezone.utc)
+ self.orbit = SunSynchronousOrbit(
+ altitude=700e3, equator_crossing_time="10:30", epoch=self.start
+ )
+ self.times = [self.start + timedelta(minutes=13 * i) for i in range(7)]
+ self.track = self.orbit.to_gp_orbit().get_orbit_track_at_time(
+ _to_time(self.times)
+ )
+
+ def test_angle_bounds_and_profiles(self):
+ """
+ Test that angles must lie in [-180, 180] and that profiles are
+ checked and sorted by argument of latitude.
+ """
+ with self.assertRaises(ValidationError):
+ Attitude(yaw_angle=190)
+ with self.assertRaises(ValidationError):
+ Attitude(roll_angle_profile=[(360, 0)])
+ with self.assertRaises(ValidationError):
+ Attitude(pitch_angle_profile=[(0, 200)])
+ attitude = Attitude(yaw_angle_profile=[(180, 5), (0, -5)])
+ self.assertEqual(attitude.yaw_angle_profile, [(0, -5), (180, 5)])
+
+ def test_schedule_segments(self):
+ """
+ Test that a schedule sorts its segments, requires timezone-aware
+ start times, and applies the first segment before its start.
+ """
+ flip = self.start + timedelta(hours=1)
+ schedule = AttitudeSchedule.from_attitudes(
+ [flip, self.start], [Attitude(yaw_angle=0), Attitude(yaw_angle=180)]
+ )
+ self.assertEqual([s.start for s in schedule.segments], [self.start, flip])
+ self.assertEqual(
+ schedule.get_attitude(self.start - timedelta(days=1)).yaw_angle, 180
+ )
+ self.assertEqual(schedule.get_attitude(flip).yaw_angle, 0)
+ with self.assertRaises(ValidationError):
+ AttitudeSegment(start=datetime(2026, 1, 1), attitude=Attitude())
+ with self.assertRaises(ValueError):
+ AttitudeSchedule.from_attitudes([self.start], [])
+
+ def test_body_angles_of_schedule(self):
+ """
+ Test that a schedule gives each time the angles and velocity frame of
+ its segment, for a vector or a single time.
+ """
+ flip = self.start + timedelta(minutes=40)
+ schedule = AttitudeSchedule.from_attitudes(
+ [self.start, flip],
+ [
+ Attitude(yaw_angle=180, velocity_frame=VelocityFrame.INERTIAL),
+ Attitude(roll_angle=10),
+ ],
+ )
+ yaw, roll, pitch, inertial = schedule.get_body_angles(self.track)
+ after = np.array([t >= flip for t in self.times])
+ np.testing.assert_array_equal(yaw, np.where(after, 0, 180))
+ np.testing.assert_array_equal(roll, np.where(after, 10, 0))
+ np.testing.assert_array_equal(pitch, 0)
+ np.testing.assert_array_equal(inertial, ~after)
+ single = self.orbit.to_gp_orbit().get_orbit_track_at_time(_to_time(self.start))
+ yaw, _, _, inertial = schedule.get_body_angles(single)
+ self.assertEqual(np.shape(yaw), ())
+ self.assertTrue(inertial)
+
+ def _center(self, satellite, index=0):
+ center = satellite.get_instrument(index).compute_footprint_center(self.track)
+ return np.array([center.latitude.degrees, center.longitude.degrees])
+
+ def _assert_same_centers(self, a, b):
+ np.testing.assert_allclose(self._center(a), self._center(b), atol=1e-9)
+
+ def test_composition_with_instrument_pointing(self):
+ """
+ Test that instruments point relative to the body: an identity
+ attitude changes nothing, an inertial attitude equals an instrument's
+ inertial velocity frame, a yaw of 180 deg mirrors roll and pitch, and
+ a body roll adds to an instrument's roll.
+ """
+
+ def instrument(**kwargs):
+ return PointedInstrument(
+ name="p",
+ cross_track_field_of_view=2,
+ along_track_field_of_view=2,
+ **kwargs,
+ )
+
+ def satellite(attitude=None, **kwargs):
+ return Satellite(
+ name="s",
+ orbit=self.orbit,
+ instruments=[instrument(**kwargs)],
+ attitude=attitude,
+ )
+
+ self._assert_same_centers(
+ satellite(Attitude(), roll_angle=20, pitch_angle=5),
+ satellite(roll_angle=20, pitch_angle=5),
+ )
+ self._assert_same_centers(
+ satellite(Attitude(velocity_frame=VelocityFrame.INERTIAL), roll_angle=20),
+ satellite(roll_angle=20, velocity_frame=VelocityFrame.INERTIAL),
+ )
+ self._assert_same_centers(
+ satellite(Attitude(yaw_angle=180), roll_angle=20, pitch_angle=5),
+ satellite(roll_angle=-20, pitch_angle=-5),
+ )
+ self._assert_same_centers(
+ satellite(Attitude(roll_angle=15), roll_angle=10),
+ satellite(roll_angle=25),
+ )
+ profile = [(0, 10), (90, 30), (180, 10), (270, -10)]
+ self._assert_same_centers(
+ satellite(Attitude(roll_angle_profile=profile)),
+ satellite(roll_angle_profile=profile),
+ )
+
+ def test_conical_yaw(self):
+ """
+ Test that a yaw of 180 deg turns a forward conical scan aft.
+ """
+
+ def satellite(center, attitude=None):
+ return Satellite(
+ name="s",
+ orbit=self.orbit,
+ instruments=[
+ ConicalInstrument(
+ name="c",
+ cone_angle=45,
+ along_track_field_of_view=1,
+ scan_half_width=60,
+ scan_center_azimuth=center,
+ )
+ ],
+ attitude=attitude,
+ )
+
+ self._assert_same_centers(satellite(0, Attitude(yaw_angle=180)), satellite(180))
+
+ def test_velocity_frame_conflict(self):
+ """
+ Test that an instrument may not set a velocity frame if the attitude
+ sets the body's.
+ """
+ with self.assertRaises(ValidationError):
+ Satellite(
+ name="s",
+ orbit=self.orbit,
+ instruments=[
+ PointedInstrument(
+ name="p",
+ cross_track_field_of_view=2,
+ along_track_field_of_view=2,
+ velocity_frame=VelocityFrame.INERTIAL,
+ )
+ ],
+ attitude=Attitude(),
+ )
+
+ def test_serialization_and_constellations(self):
+ """
+ Test that a satellite with a schedule round-trips through JSON, and
+ that the members of a constellation carry its attitude.
+ """
+ schedule = AttitudeSchedule.from_attitudes(
+ [self.start, self.start + timedelta(days=40)],
+ [Attitude(yaw_angle=180), Attitude(yaw_angle=0)],
+ )
+ satellite = Satellite(name="s", orbit=self.orbit, attitude=schedule)
+ copy = Satellite.model_validate_json(satellite.model_dump_json())
+ self.assertEqual(copy.attitude, schedule)
+ self.assertIsNone(
+ Satellite(name="s", orbit=self.orbit).get_instrument().platform_attitude
+ )
+ self.assertEqual(satellite.get_instrument().platform_attitude, schedule)
+ constellation = WalkerConstellation(
+ name="w",
+ orbit=CircularOrbit(altitude=700e3, inclination=60, epoch=self.start),
+ number_satellites=4,
+ number_planes=2,
+ attitude=Attitude(yaw_angle=90),
+ )
+ for member in constellation.generate_members():
+ self.assertEqual(member.attitude.yaw_angle, 90)
+
+ def test_observations_across_a_schedule(self):
+ """
+ Test that the observations of an analysis across a scheduled flip
+ equal those of each attitude before and after it.
+ """
+ conical = ConicalInstrument(
+ name="c", cone_angle=45, along_track_field_of_view=1, scan_half_width=60
+ )
+ flip = self.start + timedelta(hours=12)
+ end = self.start + timedelta(days=1)
+ points = [ShapelyPoint(-100, 35), ShapelyPoint(20, -10), ShapelyPoint(140, 50)]
+ schedule = AttitudeSchedule.from_attitudes(
+ [self.start, flip], [Attitude(yaw_angle=180), Attitude()]
+ )
+
+ def observe(attitude, start, stop):
+ satellite = Satellite(
+ name="s", orbit=self.orbit, instruments=[conical], attitude=attitude
+ )
+ return collect_observations(points, satellite, start, stop)
+
+ scheduled = observe(schedule, self.start, end)
+ before = observe(Attitude(yaw_angle=180), self.start, flip)
+ after = observe(Attitude(), flip, end)
+ self.assertGreater(len(before), 0)
+ self.assertGreater(len(after), 0)
+ expected = sorted(list(before.epoch) + list(after.epoch))
+ self.assertEqual(len(scheduled), len(expected))
+ for observed, wanted in zip(sorted(scheduled.epoch), expected):
+ self.assertLess(abs((observed - wanted).total_seconds()), 1e-3)
+
+ def test_ground_track_follows_yaw(self):
+ """
+ Test that the footprint of an instrument rolled to the left of the
+ body moves to the right of the ground track while the body flies
+ backward.
+ """
+ instrument = PointedInstrument(
+ name="p",
+ cross_track_field_of_view=5,
+ along_track_field_of_view=1,
+ roll_angle=30,
+ )
+ times = [self.start + timedelta(minutes=10)]
+ tracks = {
+ yaw: collect_ground_track(
+ Satellite(
+ name="s",
+ orbit=self.orbit,
+ instruments=[instrument],
+ attitude=Attitude(yaw_angle=yaw),
+ ),
+ times,
+ )
+ .geometry.iloc[0]
+ .centroid
+ for yaw in (0, 180)
+ }
+ mirrored = (
+ collect_ground_track(
+ Satellite(
+ name="s",
+ orbit=self.orbit,
+ instruments=[instrument.model_copy(update={"roll_angle": -30})],
+ ),
+ times,
+ )
+ .geometry.iloc[0]
+ .centroid
+ )
+ self.assertGreater(tracks[0].distance(tracks[180]), 5)
+ self.assertLess(tracks[180].distance(mirrored), 1e-6)
+
+
+class TestTargetAttitude(unittest.TestCase):
+ """
+ Unit tests for the TargetAttitude schema.
+ """
+
+ def setUp(self):
+ self.start = datetime(2026, 1, 1, tzinfo=timezone.utc)
+ self.orbit = SunSynchronousOrbit(
+ altitude=700e3, equator_crossing_time="10:30", epoch=self.start
+ )
+ self.times = [self.start + timedelta(minutes=30 + 0.5 * i) for i in range(12)]
+ self.track = self.orbit.to_gp_orbit().get_orbit_track_at_time(
+ _to_time(self.times)
+ )
+ subpoint = wgs84.subpoint_of(self.track)
+ self.subpoint = subpoint
+ # a target about 250 km east of the ground track near the middle time
+ self.target = Point(
+ latitude=float(subpoint.latitude.degrees[6]),
+ longitude=float(subpoint.longitude.degrees[6]) + 2.5,
+ )
+ self.instrument = PointedInstrument(
+ name="p",
+ field_of_regard=80,
+ cross_track_field_of_view=1,
+ along_track_field_of_view=1,
+ )
+
+ def _satellite(self, attitude):
+ return Satellite(
+ name="s", orbit=self.orbit, instruments=[self.instrument], attitude=attitude
+ )
+
+ def test_validation(self):
+ """
+ Test that a target attitude needs targets and a maximum off-nadir
+ angle in (0, 90).
+ """
+ with self.assertRaises(ValidationError):
+ TargetAttitude(targets=[])
+ with self.assertRaises(ValidationError):
+ TargetAttitude(targets=[self.target], max_off_nadir_angle=90)
+
+ def test_points_at_target_within_reach(self):
+ """
+ Test that the body points at the target while it is within the
+ maximum off-nadir angle (the view center on the target), and along
+ nadir otherwise, choosing the target closest to nadir.
+ """
+ far = Point(
+ latitude=-self.target.latitude, longitude=self.target.longitude + 120
+ )
+ attitude = TargetAttitude(targets=[far, self.target], max_off_nadir_angle=40)
+ index = attitude.get_target_index(self.track)
+ self.assertTrue(np.all(np.isin(index, [-1, 1])))
+ self.assertGreater(np.sum(index == 1), 0)
+ self.assertGreater(np.sum(index == -1), 0)
+ center = (
+ self._satellite(attitude)
+ .get_instrument()
+ .compute_footprint_center(self.track)
+ )
+ n = len(self.times)
+ to_target = geodesic_distance(
+ np.full(n, self.target.longitude),
+ np.full(n, self.target.latitude),
+ center.longitude.degrees,
+ center.latitude.degrees,
+ )
+ to_nadir = geodesic_distance(
+ self.subpoint.longitude.degrees,
+ self.subpoint.latitude.degrees,
+ center.longitude.degrees,
+ center.latitude.degrees,
+ )
+ np.testing.assert_array_less(to_target[index == 1], 1)
+ np.testing.assert_array_less(to_nadir[index == -1], 1)
+
+ def test_yaw_keeps_pointing(self):
+ """
+ Test that a yaw of the body does not move a boresight view off the
+ target, but mirrors the views of instruments rolled from it.
+ """
+ attitude = TargetAttitude(
+ targets=[self.target], max_off_nadir_angle=40, yaw_angle=180
+ )
+ index = attitude.get_target_index(self.track)
+ center = (
+ self._satellite(attitude)
+ .get_instrument()
+ .compute_footprint_center(self.track)
+ )
+ pointing = index == 0
+ n = int(np.sum(pointing))
+ distance = geodesic_distance(
+ np.full(n, self.target.longitude),
+ np.full(n, self.target.latitude),
+ center.longitude.degrees[pointing],
+ center.latitude.degrees[pointing],
+ )
+ np.testing.assert_array_less(distance, 1)
+
+ def test_observes_off_track_target(self):
+ """
+ Test that a narrow instrument observes a target off its ground track
+ only while the body points at it.
+ """
+ end = self.start + timedelta(hours=2)
+ point = ShapelyPoint(self.target.longitude, self.target.latitude)
+ self.assertEqual(
+ len(collect_observations(point, self._satellite(None), self.start, end)), 0
+ )
+ observations = collect_observations(
+ point,
+ self._satellite(
+ TargetAttitude(targets=[self.target], max_off_nadir_angle=40)
+ ),
+ self.start,
+ end,
+ )
+ self.assertEqual(len(observations), 1)
+
+ def test_scheduled_and_serialized(self):
+ """
+ Test that a schedule may switch to target pointing, and that a
+ satellite with it round-trips through JSON.
+ """
+ target = TargetAttitude(targets=[self.target], max_off_nadir_angle=40)
+ schedule = AttitudeSchedule.from_attitudes(
+ [self.start, self.times[5]], [Attitude(), target]
+ )
+ _, roll, _, _ = schedule.get_body_angles(self.track)
+ index = target.get_target_index(self.track)
+ self.assertTrue(np.all(roll[:5] == 0))
+ self.assertTrue(np.any(roll[5:][index[5:] == 0] != 0))
+ satellite = self._satellite(schedule)
+ copy = Satellite.model_validate_json(satellite.model_dump_json())
+ self.assertEqual(copy.attitude, schedule)
+ self.assertIsInstance(copy.attitude.segments[1].attitude, TargetAttitude)
+
+
+class TestGlintAttitude(unittest.TestCase):
+ """
+ Unit tests for the GlintAttitude schema.
+ """
+
+ def setUp(self):
+ self.start = datetime(2026, 3, 20, 12, tzinfo=timezone.utc)
+ self.orbit = CircularOrbit(altitude=705e3, inclination=98.2, epoch=self.start)
+ self.times = [self.start + timedelta(minutes=m) for m in range(0, 100, 4)]
+ self.track = self.orbit.to_gp_orbit().get_orbit_track_at_time(
+ _to_time(self.times)
+ )
+ self.instrument = PointedInstrument(
+ name="p",
+ field_of_regard=120,
+ cross_track_field_of_view=1,
+ along_track_field_of_view=1,
+ max_target_glint_angle=1,
+ )
+
+ def _satellite(self, attitude):
+ return Satellite(
+ name="s", orbit=self.orbit, instruments=[self.instrument], attitude=attitude
+ )
+
+ def test_validation(self):
+ """
+ Test the bounds of the maximum off-nadir and minimum solar elevation
+ angles.
+ """
+ with self.assertRaises(ValidationError):
+ GlintAttitude(max_off_nadir_angle=90)
+ with self.assertRaises(ValidationError):
+ GlintAttitude(min_solar_elevation=-1)
+
+ def test_points_at_glint(self):
+ """
+ Test that the view center lies on the specular point (a zero glint
+ angle) while the body points at it, and at nadir otherwise.
+ """
+ attitude = GlintAttitude(max_off_nadir_angle=50)
+ point = attitude.get_aim_point(self.track)
+ pointing = np.isfinite(point.latitude.degrees)
+ self.assertGreater(np.sum(pointing), 0)
+ self.assertGreater(np.sum(~pointing), 0)
+ center = (
+ self._satellite(attitude)
+ .get_instrument()
+ .compute_footprint_center(self.track)
+ )
+ np.testing.assert_array_less(
+ compute_glint_angle(self.track, center)[pointing], 1e-3
+ )
+ subpoint = wgs84.subpoint_of(self.track)
+ to_nadir = geodesic_distance(
+ subpoint.longitude.degrees,
+ subpoint.latitude.degrees,
+ center.longitude.degrees,
+ center.latitude.degrees,
+ )
+ np.testing.assert_array_less(to_nadir[~pointing], 1)
+ # a smaller maximum off-nadir angle or a larger minimum solar elevation points less
+ fewer = GlintAttitude(max_off_nadir_angle=20).get_aim_point(self.track)
+ self.assertLess(np.sum(np.isfinite(fewer.latitude.degrees)), np.sum(pointing))
+ higher = GlintAttitude(max_off_nadir_angle=50, min_solar_elevation=60)
+ higher_point = higher.get_aim_point(self.track)
+ self.assertLess(
+ np.sum(np.isfinite(higher_point.latitude.degrees)), np.sum(pointing)
+ )
+
+ def test_offset_toward_nadir(self):
+ """
+ Test that an offset angle points the body short of the specular point
+ toward nadir, on the line from nadir to it, by the offset (constant
+ or from a profile of the specular point's off-nadir angle).
+ """
+ glint = GlintAttitude(max_off_nadir_angle=80)
+ specular = glint.get_aim_point(self.track)
+ pointing = np.flatnonzero(np.isfinite(specular.latitude.degrees))
+ track = self.track[pointing]
+ specular = wgs84.latlon(
+ specular.latitude.degrees[pointing], specular.longitude.degrees[pointing]
+ )
+ subpoint = wgs84.subpoint_of(track)
+
+ def off_nadir(point):
+ # the angle from nadir: 90 deg less the angle of the line of sight below the horizon
+ return np.degrees(
+ np.arccos(
+ np.sum(
+ np.array((point.at(track.t) - track).frame_xyz(itrs).m)
+ * -np.array(subpoint.itrs_xyz.m)
+ / np.linalg.norm(np.array(subpoint.itrs_xyz.m), axis=0),
+ axis=0,
+ )
+ / np.linalg.norm(
+ np.array((point.at(track.t) - track).frame_xyz(itrs).m), axis=0
+ )
+ )
+ )
+
+ glint_angle = off_nadir(specular)
+ for attitude, expected in [
+ (GlintAttitude(max_off_nadir_angle=80, offset_angle=5), glint_angle - 5),
+ (
+ GlintAttitude(
+ max_off_nadir_angle=80, offset_angle_profile=[(60, 10), (20, 2)]
+ ),
+ glint_angle - np.interp(glint_angle, [20, 60], [2, 10]),
+ ),
+ ]:
+ aim = attitude.get_aim_point(track)
+ # (at nadir where the offset exceeds the specular point's angle from nadir)
+ np.testing.assert_allclose(
+ off_nadir(aim), np.maximum(expected, 0), atol=0.3
+ )
+ # on the line from nadir to the specular point
+ detour = (
+ geodesic_distance(
+ subpoint.longitude.degrees,
+ subpoint.latitude.degrees,
+ aim.longitude.degrees,
+ aim.latitude.degrees,
+ )
+ + geodesic_distance(
+ aim.longitude.degrees,
+ aim.latitude.degrees,
+ specular.longitude.degrees,
+ specular.latitude.degrees,
+ )
+ - geodesic_distance(
+ subpoint.longitude.degrees,
+ subpoint.latitude.degrees,
+ specular.longitude.degrees,
+ specular.latitude.degrees,
+ )
+ )
+ np.testing.assert_array_less(detour, 100)
+ self.assertEqual(
+ GlintAttitude(
+ offset_angle_profile=[(60, 10), (20, 2)]
+ ).offset_angle_profile,
+ [(20, 2), (60, 10)],
+ )
+ with self.assertRaises(ValidationError):
+ GlintAttitude(offset_angle_profile=[(95, 1)])
+
+ def test_glint_observations(self):
+ """
+ Test that an instrument requiring a small glint angle observes the
+ specular point only with a glint attitude, and that its observations
+ report the glint angle.
+ """
+ attitude = GlintAttitude(max_off_nadir_angle=50)
+ k = int(
+ np.flatnonzero(
+ np.isfinite(attitude.get_aim_point(self.track).latitude.degrees)
+ )[2]
+ )
+ point = attitude.get_aim_point(self.track[k])
+ target = ShapelyPoint(
+ float(point.longitude.degrees), float(point.latitude.degrees)
+ )
+ start, end = self.times[k] - timedelta(minutes=10), self.times[k] + timedelta(
+ minutes=10
+ )
+ self.assertEqual(
+ len(collect_observations(target, self._satellite(None), start, end)), 0
+ )
+ observations = collect_observations(
+ target, self._satellite(attitude), start, end, omit_solar=False
+ )
+ self.assertGreater(len(observations), 0)
+ np.testing.assert_array_less(observations.glint_angle, 1)
+
+ def test_scheduled_and_serialized(self):
+ """
+ Test that a schedule may switch to glint pointing, and that a
+ satellite with it round-trips through JSON.
+ """
+ schedule = AttitudeSchedule.from_attitudes(
+ [self.start, self.times[10]], [Attitude(), GlintAttitude()]
+ )
+ satellite = self._satellite(schedule)
+ copy = Satellite.model_validate_json(satellite.model_dump_json())
+ self.assertEqual(copy.attitude, schedule)
+ self.assertIsInstance(copy.attitude.segments[1].attitude, GlintAttitude)
+ self.assertIsInstance(
+ Satellite.model_validate_json(
+ self._satellite(GlintAttitude()).model_dump_json()
+ ).attitude,
+ GlintAttitude,
+ )
diff --git a/tests/utils/test_geometry.py b/tests/utils/test_geometry.py
index ef89ce5e..615bc32d 100644
--- a/tests/utils/test_geometry.py
+++ b/tests/utils/test_geometry.py
@@ -901,6 +901,31 @@ def test_split_polygon_hole_across_antimeridian(self):
for point in [(165, 0), (-165, 0)]:
self.assertTrue(result.contains(Point(*point)))
+ def test_split_polygon_polar_coastline_not_monotonic_in_longitude(self):
+ """
+ Test that a polygon around a pole whose boundary is not monotonic in
+ longitude (as a coastline with a peninsula, such as Antarctica's) keeps
+ its shape, whether or not it already includes edges along the pole and
+ the anti-meridian.
+ """
+ coast = [(-60, -80), (-60, -63), (-66, -63), (-66, -60), (60, -60)]
+ with_pole_edges = Polygon(
+ [(180, -80), (180, -90), (-180, -90), (-180, -80), *coast, (180, -80)]
+ )
+ result = split_polygon(with_pole_edges)
+ self.assertTrue(result.is_valid)
+ self.assertAlmostEqual(result.symmetric_difference(with_pole_edges).area, 0)
+ # the same region, as a ring of latitudes around the pole
+ ring = Polygon([(-180, -80), *coast, (180, -80), (-180, -80)])
+ result = split_polygon(ring)
+ self.assertTrue(result.is_valid)
+ self.assertAlmostEqual(result.symmetric_difference(with_pole_edges).area, 0)
+ # the strip above the doubled-back coast is included, and the bay below
+ # it is not
+ self.assertTrue(result.contains(Point(-63, -61.5)))
+ self.assertFalse(result.contains(Point(-63, -70)))
+ self.assertTrue(result.contains(Point(0, -70)))
+
def test_split_polygon_hole_around_pole(self):
"""
Test that a hole around a pole (in a ring of latitudes around it) is
diff --git a/tests/utils/test_glint.py b/tests/utils/test_glint.py
new file mode 100644
index 00000000..dc55b563
--- /dev/null
+++ b/tests/utils/test_glint.py
@@ -0,0 +1,109 @@
+"""
+Unit tests for the sun glint utilities in tatc.utils.glint.
+
+@author Paul T. Grogan
+"""
+
+import unittest
+from datetime import datetime, timedelta, timezone
+
+import numpy as np
+from skyfield.api import wgs84
+
+from tatc.constants import de421
+from tatc.schemas import CircularOrbit
+from tatc.utils import compute_glint_angle, compute_specular_point
+
+
+class TestGlint(unittest.TestCase):
+ """
+ Unit tests for compute_specular_point and compute_glint_angle.
+ """
+
+ def setUp(self):
+ self.start = datetime(2026, 3, 20, tzinfo=timezone.utc)
+ self.orbit = CircularOrbit(
+ altitude=705e3, inclination=98.2, epoch=self.start
+ ).to_gp_orbit()
+ self.times = [self.start + timedelta(minutes=m) for m in range(0, 100, 2)]
+ self.track = self.orbit.get_orbit_track(self.times)
+
+ def test_specular_point_has_zero_glint_angle(self):
+ """
+ Test that the glint angle vanishes at the specular point, which exists
+ while the satellite is over the day side, and not otherwise.
+ """
+ point = compute_specular_point(self.track)
+ found = np.isfinite(point.latitude.degrees)
+ self.assertGreater(np.sum(found), 0)
+ self.assertGreater(np.sum(~found), 0)
+ angle = compute_glint_angle(self.track, point)
+ np.testing.assert_array_less(angle[found], 1e-4)
+ subpoint = wgs84.subpoint_of(self.track)
+ solar_elevation = (
+ (de421["earth"] + subpoint)
+ .at(self.track.t)
+ .observe(de421["sun"])
+ .apparent()
+ .altaz()[0]
+ .degrees
+ )
+ self.assertTrue(np.all(found[solar_elevation > 5]))
+ self.assertFalse(np.any(found[solar_elevation < -30]))
+
+ def test_specular_point_minimizes_glint_angle(self):
+ """
+ Test that no nearby point has a smaller glint angle than the
+ specular point.
+ """
+ point = compute_specular_point(self.track)
+ k = int(np.flatnonzero(np.isfinite(point.latitude.degrees))[3])
+ lat, lon = point.latitude.degrees[k], point.longitude.degrees[k]
+ offsets = np.linspace(-1, 1, 21)
+ grid_lat, grid_lon = np.meshgrid(lat + offsets, lon + offsets)
+ track = self.orbit.get_orbit_track([self.times[k]] * grid_lat.size)
+ angles = compute_glint_angle(
+ track, wgs84.latlon(grid_lat.ravel(), grid_lon.ravel())
+ )
+ # the smallest glint angle of the grid is at its center (the specular point)
+ self.assertEqual(np.argmin(angles), grid_lat.size // 2)
+
+ def test_equal_elevations(self):
+ """
+ Test that the Sun and the satellite are at the same elevation angle
+ seen from the specular point, in opposite azimuths.
+ """
+ point = compute_specular_point(self.track)
+ found = np.flatnonzero(np.isfinite(point.latitude.degrees))
+ track = self.track[found]
+ target = wgs84.latlon(
+ point.latitude.degrees[found], point.longitude.degrees[found]
+ )
+ sat_alt, sat_az, _ = (track - target.at(track.t)).altaz()
+ sun_alt, sun_az, _ = (
+ (de421["earth"] + target)
+ .at(track.t)
+ .observe(de421["sun"])
+ .apparent()
+ .altaz()
+ )
+ np.testing.assert_allclose(sat_alt.degrees, sun_alt.degrees, atol=0.01)
+ # azimuths (ill-conditioned near the zenith) below 80 degrees elevation
+ low = sun_alt.degrees < 80
+ azimuth_difference = (sat_az.degrees[low] - sun_az.degrees[low]) % 360
+ np.testing.assert_allclose(azimuth_difference, 180, atol=0.05)
+
+ def test_scalar_inputs(self):
+ """
+ Test that a single time and target give scalar results.
+ """
+ track = self.track[0]
+ point = compute_specular_point(track)
+ self.assertEqual(np.ndim(point.latitude.degrees), 0)
+ angle = compute_glint_angle(track, wgs84.subpoint_of(track))
+ self.assertEqual(np.ndim(angle), 0)
+ self.assertTrue(0 <= angle <= 180)
+
+
+if __name__ == "__main__":
+ unittest.main()