# `Sidereon.GNSS.PreciseEphemerisSample`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/gnss/precise_ephemeris_sample.ex#L1)

One precise-ephemeris sample: a satellite's ECEF position (and optional clock)
at one epoch, in SI units.

This is the canonical, serialization-independent intermediate representation of
a precise orbit/clock product. SP3 text is one serialization of it;
`Sidereon.GNSS.SP3.precise_ephemeris_samples/1` extracts the same samples from a
parsed product, and `Sidereon.GNSS.PreciseEphemeris.from_samples/1` rebuilds an
interpolatable source from them, with no text in the loop.

## Fields

  * `:sat` - the canonical SP3/RINEX satellite token, e.g. `"G01"`.
  * `:epoch` - the sample epoch as a split Julian date tagged with its time
    scale: `%{time_scale: "GPST", jd_whole: float, jd_fraction: float}`. Every
    sample in one source must carry the same time scale.
  * `:position_ecef_m` - satellite position in the ITRF/IGS ECEF frame, in
    meters, as `{x_m, y_m, z_m}`.
  * `:clock_s` - satellite clock offset in seconds, or `nil` when no clock
    estimate exists.
  * `:clock_event` - mirrors the SP3 `E` clock-event flag. When `true` this
    epoch marks a clock discontinuity and the interpolator splits the clock arc
    here (it never interpolates a clock across a reset). Defaults to `false`.

# `epoch`

```elixir
@type epoch() :: %{time_scale: String.t(), jd_whole: float(), jd_fraction: float()}
```

# `t`

```elixir
@type t() :: %Sidereon.GNSS.PreciseEphemerisSample{
  clock_event: boolean(),
  clock_s: float() | nil,
  epoch: epoch(),
  position_ecef_m: vec3(),
  sat: String.t()
}
```

# `vec3`

```elixir
@type vec3() :: {float(), float(), float()}
```

---

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