Trajectory Components

class tabascal.components.trajectory.FixedOrbit[source]
build_constants()[source]

Return arrays that do not change during the forward pass.

Returns a dict of array_name -> array_value. These will be stored in constants as “_c/<ClassName>/array_name” by Model.__init__.

build_forward()[source]

Return pure, JIT-compatible function

build_set_params()[source]

Build parameter sampling function (optional)

setup(config)[source]

All validation and error-prone operations here

validate_and_test()[source]

Call this before using in JIT context

class tabascal.components.trajectory.FixedOrbitCoarse[source]

FixedOrbit written 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, over c – 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 first rfi.path_order time 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’s rfi_delay_us (PR #144), with the sign that makes the phase 2 pi f tau.

PolyInterpVis rebuilds the fine phase from the two inside each cell: linear in frequency, a Taylor series in time. Everything is computed once here in float64, as FixedOrbit does; a fixed orbit has no parameters, so none of it carries a gradient.

The fine grid is never resolved. A degree-path_order series about a cell’s centre is settled by a handful of samples spanning that cell, so the path is propagated at rfi.path_nodes nodes per cell rather than at every one of the n_int_time fine 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_xyz is therefore the source position at each cell centre rather than at each fine sample; nothing on the data grid reads it at fine resolution.

build_constants()[source]

Return arrays that do not change during the forward pass.

Returns a dict of array_name -> array_value. These will be stored in constants as “_c/<ClassName>/array_name” by Model.__init__.

build_forward()[source]

Return pure, JIT-compatible function

build_set_params()[source]

Build parameter sampling function (optional)

setup(config)[source]

All validation and error-prone operations here

validate_and_test()[source]

Call this before using in JIT context

class tabascal.components.trajectory.NoDragOrbit[source]
build_constants()[source]

Return arrays that do not change during the forward pass.

Returns a dict of array_name -> array_value. These will be stored in constants as “_c/<ClassName>/array_name” by Model.__init__.

build_forward()[source]

Return pure, JIT-compatible function

build_set_params()[source]

Build parameter sampling function (optional)

setup(config)[source]

All validation and error-prone operations here

validate_and_test()[source]

Call this before using in JIT context

class tabascal.components.trajectory.Orbit[source]
build_constants()[source]

Return arrays that do not change during the forward pass.

Returns a dict of array_name -> array_value. These will be stored in constants as “_c/<ClassName>/array_name” by Model.__init__.

build_forward()[source]

Return pure, JIT-compatible function

build_set_params()[source]

Build parameter sampling function (optional)

setup(config)[source]

All validation and error-prone operations here

validate_and_test()[source]

Call this before using in JIT context

class tabascal.components.trajectory.PhaseCalculationRFI[source]
build_constants()[source]

Return arrays that do not change during the forward pass.

Returns a dict of array_name -> array_value. These will be stored in constants as “_c/<ClassName>/array_name” by Model.__init__.

build_forward()[source]

Return pure, JIT-compatible function

build_set_params()[source]

Build parameter sampling function (optional)

setup(config)[source]

All validation and error-prone operations here

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 TLEResolution the 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 components model_requires_tles refuses 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)

tabascal.components.trajectory.get_satellite_positions(records: list, times_jd: list)[source]

ICRS positions of satellites, by propagating their orbit records over times_jd.

Parameters:
  • records (sequence of dict, length n_sat) – Orbit records — TLE or OMM — as resolved by tabascal.orbit.

  • times_jd (Array (n_time,)) – Times to calculate positions at, in Julian date.

Returns:

Satellite positions over time, in metres.

Return type:

Array (n_sat, n_time, 3)