Trajectory Components
- class tabascal.components.trajectory.FixedOrbit[source]
- class tabascal.components.trajectory.FixedOrbitCoarse[source]
FixedOrbitwritten on the data grid, with what rebuilds the fine phase.The same propagated positions and the same geometric delay – the range from the source to each antenna plus the antenna’s
w, overc– but instead of the phase at every fine sample, two smaller constants:rfi_phase(n_rfi, n_ant, n_freq, n_time): the phase at the channel and cell centres, reduced to a turn.rfi_delay_poly_us(n_rfi, n_ant, n_time, rfi.path_order + 1): the geometric delay in microseconds relative to the array mean and its firstrfi.path_ordertime derivatives at each cell centre, from a least-squares polynomial through a few nodes spanning the cell (tabascal.poly_interp.fit_path()). Relative, because a term common to every antenna cancels in a baseline’s phase difference, and what remains is small enough for float32 to carry across a cell – the convention of the fine-grid route’srfi_delay_us(PR #144), with the sign that makes the phase2 pi f tau.
PolyInterpVisrebuilds the fine phase from the two inside each cell: linear in frequency, a Taylor series in time. Everything is computed once here in float64, asFixedOrbitdoes; a fixed orbit has no parameters, so none of it carries a gradient.The fine grid is never resolved. A degree-
path_orderseries about a cell’s centre is settled by a handful of samples spanning that cell, so the path is propagated atrfi.path_nodesnodes per cell rather than at every one of then_int_timefine samples. The count the estimate asks for climbs steeply with the array’s extent – 37, 59, 174, 1065 and 6570 fine samples per cell at 64, 128, 256, 384 and 512 SKA-Low stations – and the range calculation it feeds is(n_rfi, n_ant, n_time * n_int_time, 3), which is 361 GiB at 512 stations for the same four coefficients per cell.rfi_xyzis therefore the source position at each cell centre rather than at each fine sample; nothing on the data grid reads it at fine resolution.
- class tabascal.components.trajectory.NoDragOrbit[source]
- class tabascal.components.trajectory.Orbit[source]
- class tabascal.components.trajectory.PhaseCalculationRFI[source]
- tabascal.components.trajectory.fetch_orbital_elements(times_jd=None, norad_ids=None, extra_orbit_dir=None, extra_orbit_max_age_days=None, resolution=None)[source]
Orbital elements for the RFI model.
resolution is the
TLEResolutionthe preflight check already produced; passing it is the normal path and guarantees the model is built from exactly the records whose coverage and ages were checked. Without it the satellites are resolved here instead, for callers that have no preflight (the components’ own re-fetch, and tests).
- tabascal.components.trajectory.fetch_standard_orbital_elements(times_jd=None, norad_ids=None, extra_orbit_dir=None, extra_orbit_max_age_days=None, resolution=None)[source]
Orbital elements for the SGP4 propagators.
Unlike
fetch_orbital_elements()this deliberately has no empty-request escape: only the SGP4/Kepler trajectory components call it, and those are exactly the componentsmodel_requires_tlesrefuses to configure without satellites. Reaching here with nothing requested is a real failure.
- tabascal.components.trajectory.get_satellite_elevations(orbit_records: list, times_jd, ants_itrf) NDArray[source]
Topocentric elevation of each satellite, as seen from the array centre.
- Parameters:
orbit_records (list of dict (n_sat,)) – Resolved orbit records, as returned by
fetch_orbital_elements(). Built into propagators by_earth_satellite(), so OMM records work here exactly as TLE ones do – an OMM has no lines to hand a line parser.times_jd (Array (n_time,)) – Times to calculate elevations at in Julian date.
ants_itrf (Array (n_ant, 3)) – Antenna positions in ITRF, in metres. The mean is taken as the site.
- Returns:
Satellite elevation above the horizon, in degrees.
- Return type:
Array (n_sat, n_time)