A RINEX observation header, with every record the product holds.
Sidereon.GNSS.RINEX.Observations.header/1 returns the file header;
Sidereon.GNSS.RINEX.Observations.header_at/2 returns the header in effect at
an epoch, which is the file header with the header records of every event at
or before that epoch laid over it.
A field is nil where the product holds no such record, and an empty list or
map where the record holds no entries. Nothing absent is read as zero.
Code lists
obs_codes- per constellation letter, the union of every list the file declares, in its header and after its events: the file header's codes first, then each code a later list declares, in the order first declared. Every observation and cycle slip value is index-aligned to this union.declared_obs_codes- the lists this header itself declares. In the file header they are itsSYS / # / OBS TYPESrecords, or at version 2 whatrinex2_typesreads as; in a header fromheader_at/2they are the lists in effect at that epoch.rinex2_types- the version 2# / TYPES OF OBSERVnames as read, and[]at version 3.rinex2_system- the constellation letter a version 2 version record names,nilfor a mixed file or at version 3.
Other records
time_of_first_obs,time_of_last_obs-{epoch, time_scale},epochbeing{{year, month, day}, {hour, minute, second}}andtime_scalethe scale's abbreviation, such as"GPST".prn_obs_counts- per satellite id, thePRN / # OF OBScounts,nilfor a blank count.glonass_cod_phs_bis-nilwhere the header has noGLONASS COD/PHS/BISrecord;[]for a blank record, which RINEX 3.05 section 5.2.16 gives where "the GLONASS code phase alignment is unknown"; otherwise[{code, bias_m}]withnilfor a blank bias.unretained_header_labels- labels the reader read and does not keep, which a rewrite drops.
Summary
Types
A civil epoch {{year, month, day}, {hour, minute, second}} in the file's time scale.
@type t() :: %Sidereon.GNSS.RINEX.Observations.Header{ agency: String.t() | nil, antenna: %{number: String.t(), antenna_type: String.t()} | nil, antenna_delta_hen_m: {float(), float(), float()} | nil, approx_position_m: {float(), float(), float()} | nil, comments: [String.t()], declared_obs_codes: %{required(String.t()) => [String.t()]}, glonass_cod_phs_bis: [{String.t(), float() | nil}] | nil, glonass_slots: %{required(String.t()) => integer()}, interval_s: float() | nil, leap_seconds: Sidereon.GNSS.RINEX.Observations.LeapSeconds.t() | nil, marker_name: String.t() | nil, marker_number: String.t() | nil, marker_type: String.t() | nil, n_satellites: non_neg_integer() | nil, obs_codes: %{required(String.t()) => [String.t()]}, observer: String.t() | nil, phase_shifts: [Sidereon.GNSS.RINEX.Observations.PhaseShift.t()], prn_obs_counts: %{required(String.t()) => [non_neg_integer() | nil]}, program_run_by_date: %{program: String.t(), run_by: String.t(), date: String.t()} | nil, receiver: %{number: String.t(), receiver_type: String.t(), version: String.t()} | nil, rinex2_system: String.t() | nil, rinex2_types: [String.t()], scale_factors: [Sidereon.GNSS.RINEX.Observations.ScaleFactor.t()], signal_strength_unit: String.t() | nil, time_of_first_obs: {epoch(), String.t()} | nil, time_of_last_obs: {epoch(), String.t()} | nil, unretained_header_labels: [String.t()], version: float() }