# `Sidereon.FrameCatalog`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/frame_catalog.ex#L1)

Epoch-aware terrestrial reference-frame transforms.

The built-in catalog contains published 14-parameter Helmert transforms for
ITRF and ETRF realizations. Positions are geocentric Cartesian metres,
velocities are metres per year, and epochs are decimal years.

# `error_reason`

```elixir
@type error_reason() :: :invalid_frame | map()
```

Frame catalog error detail.

# `catalog`

```elixir
@spec catalog() :: [Sidereon.FrameCatalog.HelmertTransform.t()]
```

Return all built-in Helmert catalog entries.

# `catalog_entry`

```elixir
@spec catalog_entry(
  Sidereon.FrameCatalog.TerrestrialFrame.t(),
  Sidereon.FrameCatalog.TerrestrialFrame.t()
) ::
  {:ok, Sidereon.FrameCatalog.HelmertTransform.t()} | {:error, error_reason()}
```

Return the direct published catalog entry for `from` to `to`.

# `propagate_position`

```elixir
@spec propagate_position(Sidereon.vec3(), Sidereon.vec3(), number(), number()) ::
  {:ok, Sidereon.vec3()} | {:error, error_reason()}
```

Propagate a station position from one decimal-year epoch to another.

# `transform`

```elixir
@spec transform(
  Sidereon.vec3(),
  Sidereon.vec3() | nil,
  Sidereon.FrameCatalog.TerrestrialFrame.t(),
  Sidereon.FrameCatalog.TerrestrialFrame.t(),
  number()
) ::
  {:ok, Sidereon.FrameCatalog.TerrestrialState.t()} | {:error, error_reason()}
```

Transform a Cartesian station position and optional velocity between frames.

# `transform_from_epoch`

```elixir
@spec transform_from_epoch(
  Sidereon.vec3(),
  Sidereon.vec3(),
  number(),
  Sidereon.FrameCatalog.TerrestrialFrame.t(),
  Sidereon.FrameCatalog.TerrestrialFrame.t(),
  number()
) ::
  {:ok, Sidereon.FrameCatalog.TerrestrialState.t()} | {:error, error_reason()}
```

Propagate a station to `transform_epoch_year`, then transform it between frames.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
