Skip to content

option to always include data_vars for all constellations passed to use (regardless of presence of each constellation in the file) #121

@breathe

Description

@breathe

Given a snippet like this:

from georinex import load as load_rinex
CONSTELLATIONS = ["G", "E", "C"]
ds_igs_nav = load_rinex(p, use=CONSTELLATIONS)

Problem 1

ds will have different sets of data_vars based on the set of constellations observed in the rinex file

Problem 2

if reading a file which contains no observations for G, E, or C constellations -- then the dtype of the dim's on the returned ds_igs_nav will also be incorrect.

This example rinex file containing only QZSS sats is enough to demonstrate both issues. If we include some galileo observations in the mix -- then only problem 1 is observable.

     3.05           N: GNSS NAV DATA    M: Mixed            RINEX VERSION / TYPE
BNC 2.13.1          gremlin             20250622 005502 UTC PGM / RUN BY / DATE
Source: RTCM_3.3 caster.cddis.eosdis.nasa.gov/BCEP00BKG0    COMMENT
Source: RTCM_3.1 caster.cddis.eosdis.nasa.gov/SSRA03IGS1    COMMENT
Source: RTCM_3.1 products.igs-ip.net/IONO00UPC1             COMMENT
                                                            END OF HEADER
S29 2025 06 22 00 55 28 1.238659024239e-07 1.091393642128e-11 9.999000000000e+08
    -2.537621472000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     3.367537432000e+04 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.500000000000e+01
S37 2025 06 22 00 55 12-7.636845111847e-08 0.000000000000e+00 9.999000000000e+08
    -2.539903304000e+04-5.250000000000e-04 0.000000000000e+00 0.000000000000e+00
     3.364869376000e+04-8.243750000000e-04 0.000000000000e+00 8.192000000000e+03
    -9.180000000000e-01-2.432000000000e-03 0.000000000000e+00 1.500000000000e+01
S23 2025 06 22 00 55 44 0.000000000000e+00 0.000000000000e+00 9.999000000000e+08
     3.866796400000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     1.681330800000e+04 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 4.600000000000e+01
S36 2025 06 22 00 55 44 0.000000000000e+00 0.000000000000e+00 9.999000000000e+08
     4.200368800000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     3.674846960000e+03 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.700000000000e+01
S31 2025 06 22 00 56 32 2.188608050346e-08 1.000444171950e-11 9.999000000000e+08
    -1.913726576000e+04-1.250000000000e-05 2.500000000000e-08 0.000000000000e+00
    -3.757228064000e+04 1.393750000000e-04-1.250000000000e-08 2.000000000000e+00
    -2.694800000000e+00-4.400000000000e-05 0.000000000000e+00 1.420000000000e+02
S32 2025 06 22 00 56 32 0.000000000000e+00 0.000000000000e+00 9.999000000000e+08
    -2.552879520000e+03-1.370625000000e-03-1.500000000000e-07 0.000000000000e+00
     4.207820216000e+04-1.043750000000e-03 6.250000000000e-08 8.192000000000e+03
     5.005080000000e+01-6.240000000000e-04-2.500000000000e-07 1.500000000000e+01
S33 2025 06 22 00 56 32-1.676380634308e-08 3.637978807092e-12 9.999000000000e+08
    -2.662825448000e+04-2.012500000000e-04 1.250000000000e-08 0.000000000000e+00
    -3.269443416000e+04 1.643750000000e-04 1.250000000000e-08 2.000000000000e+00
     1.447880000000e+01-1.900000000000e-03-6.250000000000e-08 2.250000000000e+02
S35 2025 06 22 00 56 32-2.887099981308e-08-3.637978807092e-12 9.999000000000e+08
    -2.417475784000e+04-9.375000000000e-05 0.000000000000e+00 0.000000000000e+00
    -3.454393352000e+04-4.881250000000e-04 1.250000000000e-08 2.000000000000e+00
     4.530800000000e+00-1.196000000000e-03 0.000000000000e+00 3.500000000000e+01
S27 2025 06 22 00 56 32 7.273629307747e-07 3.365130396560e-11 9.999000000000e+08
     2.412546288000e+04-8.181250000000e-04 1.000000000000e-07 0.000000000000e+00
     3.456707688000e+04 7.462500000000e-04 5.000000000000e-08 8.192000000000e+03
    -8.471196000000e+02-1.744800000000e-02 4.500000000000e-06 1.500000000000e+01
S28 2025 06 22 00 56 32 5.122274160385e-08 4.547473508865e-11 9.999000000000e+08
     5.093251200000e+03-5.237500000000e-04 5.000000000000e-08 0.000000000000e+00
     4.185416112000e+04 2.975000000000e-04 5.000000000000e-08 4.096000000000e+03
     4.929160000000e+01 5.880000000000e-04-2.500000000000e-07 1.400000000000e+01
S48 2025 06 22 00 55 12 0.000000000000e+00 0.000000000000e+00 9.999000000000e+08
    -3.168728032000e+04-1.089375000000e-03 0.000000000000e+00 0.000000000000e+00
     2.780853152000e+04-7.062500000000e-05 0.000000000000e+00 2.000000000000e+00
    -1.115480000000e+01 6.160000000000e-04 0.000000000000e+00 0.000000000000e+00
S37 2025 06 22 00 56 16-7.636845111847e-08 0.000000000000e+00 9.999000000000e+08
    -2.539906680000e+04-5.293750000000e-04 0.000000000000e+00 0.000000000000e+00
     3.364864096000e+04-8.237500000000e-04 0.000000000000e+00 8.192000000000e+03
    -1.074000000000e+00-2.432000000000e-03 0.000000000000e+00 1.500000000000e+01
S29 2025 06 22 00 56 32 1.238659024239e-07 1.091393642128e-11 9.999000000000e+08
    -2.537621472000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     3.367537432000e+04 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.500000000000e+01
S37 2025 06 22 00 57 04-7.636845111847e-08 0.000000000000e+00 9.999000000000e+08
    -2.539909224000e+04-5.325000000000e-04 0.000000000000e+00 0.000000000000e+00
     3.364860144000e+04-8.237500000000e-04 0.000000000000e+00 8.192000000000e+03
    -1.190800000000e+00-2.432000000000e-03 0.000000000000e+00 1.500000000000e+01
S29 2025 06 22 00 57 20 1.238659024239e-07 1.091393642128e-11 9.999000000000e+08
    -2.537621472000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     3.367537432000e+04 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.500000000000e+01
S21 2025 06 22 00 57 52 0.000000000000e+00 0.000000000000e+00 9.999000000000e+08
     4.200468400000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
    -3.674932960000e+03 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 9.600000000000e+01
S48 2025 06 22 00 57 20 0.000000000000e+00 0.000000000000e+00 9.999000000000e+08
    -3.168741936000e+04-1.083125000000e-03 0.000000000000e+00 0.000000000000e+00
     2.780852336000e+04-5.750000000000e-05 0.000000000000e+00 2.000000000000e+00
    -1.107560000000e+01 6.240000000000e-04 0.000000000000e+00 0.000000000000e+00
S37 2025 06 22 00 58 08-7.636845111847e-08 0.000000000000e+00 9.999000000000e+08
    -2.539912648000e+04-5.368750000000e-04 0.000000000000e+00 0.000000000000e+00
     3.364854880000e+04-8.231250000000e-04 0.000000000000e+00 8.192000000000e+03
    -1.346400000000e+00-2.432000000000e-03 0.000000000000e+00 1.500000000000e+01
S29 2025 06 22 00 58 24 1.238659024239e-07 1.091393642128e-11 9.999000000000e+08
    -2.537621472000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     3.367537432000e+04 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.500000000000e+01
S23 2025 06 22 00 58 24 0.000000000000e+00 0.000000000000e+00 9.999000000000e+08
     3.866796400000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     1.681330800000e+04 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 4.700000000000e+01
S36 2025 06 22 00 58 24 0.000000000000e+00 0.000000000000e+00 9.999000000000e+08
     4.200368800000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     3.674846960000e+03 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.800000000000e+01
S37 2025 06 22 00 59 12-7.636845111847e-08 0.000000000000e+00 9.999000000000e+08
    -2.539916096000e+04-5.412500000000e-04 0.000000000000e+00 0.000000000000e+00
     3.364849608000e+04-8.225000000000e-04 0.000000000000e+00 8.192000000000e+03
    -1.502000000000e+00-2.432000000000e-03 0.000000000000e+00 1.500000000000e+01
S29 2025 06 22 00 59 28 1.238659024239e-07 1.091393642128e-11 9.999000000000e+08
    -2.537621472000e+04 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00
     3.367537432000e+04 0.000000000000e+00 0.000000000000e+00 8.192000000000e+03
     0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.500000000000e+01

Here we can observe that the dtype of the time and sv coords are both float64 (rather than the expected <M8[ns], and <U5 -- aditionall the set of data_vars is empty (outside of the one

    ds_igs_nav.time.dtype: dtype('float64') (Float64DType) len=0
    ds_igs_nav.sv.dtype: dtype('float64') (Float64DType) len=0

If we look at another file containing just QZSS and galileo -- we see that data_vars for constellations like gps and beidou will be missing

    ds_igs_nav.data_vars.keys(): (
        KeysView(Data variables:
            SVclockBias       (time, sv) float64 640B nan nan ... -0.0004123 -0.0004123
            SVclockDrift      (time, sv) float64 640B nan nan ... -5.357e-12 -5.357e-12
            SVclockDriftRate  (time, sv) float64 640B nan nan nan nan ... 0.0 0.0 0.0
            IODnav            (time, sv) float64 640B nan nan nan ... 115.0 115.0 115.0
            Crs               (time, sv) float64 640B nan nan nan ... -132.9 -132.9
            DeltaN            (time, sv) float64 640B nan nan ... 2.613e-09 2.613e-09
            M0                (time, sv) float64 640B nan nan nan ... 1.804 1.804
            Cuc               (time, sv) float64 640B nan nan ... -6.134e-06 -6.134e-06
            Eccentricity      (time, sv) float64 640B nan nan ... 0.0001619 0.0001619
            Cus               (time, sv) float64 640B nan nan ... 2.496e-06 2.496e-06
            sqrtA             (time, sv) float64 640B nan nan ... 5.441e+03 5.441e+03
            Toe               (time, sv) float64 640B nan nan ... 6.024e+05 6.024e+05
            Cic               (time, sv) float64 640B nan nan ... -2.235e-08 -2.235e-08
            Omega0            (time, sv) float64 640B nan nan nan ... 1.535 1.537 1.537
            Cis               (time, sv) float64 640B nan nan ... 1.676e-08 1.676e-08
            Io                (time, sv) float64 640B nan nan nan ... 0.9992 0.9992
            Crc               (time, sv) float64 640B nan nan nan ... 307.9 301.6 301.6
            omega             (time, sv) float64 640B nan nan nan ... 0.5118 0.5118
            OmegaDot          (time, sv) float64 640B nan nan ... -5.659e-09 -5.659e-09
            IDOT              (time, sv) float64 640B nan nan ... -1.632e-10 -1.632e-10
            DataSrc           (time, sv) float64 640B nan nan nan ... 258.0 517.0 258.0
            GALWeek           (time, sv) float64 640B nan nan ... 2.371e+03 2.371e+03
            spare0            (time, sv) float64 640B nan nan nan nan ... 0.0 0.0 0.0
            SISA              (time, sv) float64 640B nan nan nan nan ... 3.12 3.12 3.12
            health            (time, sv) float64 640B nan nan nan nan ... 0.0 0.0 0.0
            BGDe5a            (time, sv) float64 640B nan nan ... 4.424e-09 4.424e-09
            BGDe5b            (time, sv) float64 640B nan nan nan ... 0.0 5.355e-09 0.0
            TransTime         (time, sv) float64 640B nan nan ... 9.999e+08 9.999e+08
            spare1            (time, sv) float64 640B nan nan nan nan ... nan nan nan
            spare2            (time, sv) float64 640B nan nan nan nan ... nan nan nan
            spare3            (time, sv) float64 640B nan nan nan nan ... nan nan nan
            filepath          <U38 152B 'nav/BRDC00WRD_S_20251722330_05M_MN.rnx')

This kind of variation actually leads to some subtle bugs and necessitates some annoying workarounds when handling data loaded that varies in these ways based on the contents of the files -- particularly if you write logic in development scenarios where either all constellations or at least one of the expected constellations is observed in each file.

It would be nice if the data types were always the same and the set of data_vars was always complete with respect to the set of constellation arguments passed to use= -- regardless of the presence or absence of any specific constellations in the actual file read.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions