Configuration#

EOMatch reads all runtime parameters from YAML configuration files. The system uses three layers, each merged on top of the previous:

package defaults          (eomatch/etc/default_config.yaml — do not edit)
     ↓
user config               (~/.config/eomatch/user_config.yaml)
     ↓
per-run override          (passed via --config on any CLI command)

You only need to supply the keys you want to override — everything else falls back to the package defaults.

Initialising the user config#

Run eomatch-init once after installation to create your user config:

eomatch-init

This writes a fully-commented template to ~/.config/eomatch/user_config.yaml. Running it again is safe — it will not overwrite an existing file unless you delete it first.

EOMatch also initialises the config automatically on first import, so the file will exist even if you never call eomatch-init explicitly.

Config file sections#

STAC catalogue (matchup_catalogue)#

Controls where eomatch stores and reads its catalogue. Used by every CLI command and by MatchupCatalogue directly.

matchup_catalogue:
  path: /data/my_catalogue   # root directory for the catalogue on disk
  id: matchup-catalogue      # STAC catalogue ID
  description: Matchup catalogue

path can be omitted from the user config and passed at run time instead (--path on the CLI, or as a constructor argument in Python).

Satellite finder settings#

These flat keys are used by Sat2SatMUFinder and the eomatch-find command. They are most naturally placed in a per-run --config file alongside matchup_catalogue.path, though you can set defaults for platforms and collections in your user config if you always work with the same sensor pair.

# Which satellites and collections to match — order must correspond.
platforms: Sentinel-2A, Landsat-9
collections: S2_MSI_L1C, LANDSAT_C2L1

# Search time window (format: "YYYY-MM-DD HH:MM:SS").
start_time: "2023-01-01 00:00:00"
end_time:   "2023-12-31 23:59:59"

# Spatial filter — omit or leave blank to search globally.
min_lat: 45.0
max_lat: 55.0
min_lon: -5.0
max_lon: 10.0

Orbit crossover detection is handled by orbitx. The NetCDF path is resolved in the following priority order:

Option A — per-combo NetCDF files (recommended when working with multiple satellite pairs). Keys use the platform-aware combo ID format produced by _matchup_collection_id():

orbitx_netcdf_files:
  LANDSAT_C2L1-Landsat-9-vs-S2_MSI_L1C-S2A: /path/to/LS9_S2A.nc
  LANDSAT_C2L1-Landsat-8-vs-S2_MSI_L1C-S2B: /path/to/LS8_S2B.nc

Option B — single pre-computed NetCDF (flat fallback; used when no per-combo entry is found in orbitx_netcdf_files):

orbitx_netcdf_path: /path/to/crossovers.nc

Option C — run orbitx from scratch (used when neither A nor B is set):

propagation_sampling_interval: 30     # satellite position step (seconds)
interpolation_sampling_interval: 1    # crossover refinement step (seconds)
space_diff_threshold: 100.0           # max cross-track distance (km)
time_diff_threshold: 1800             # max time difference (seconds)
check_before: false
check_after: false
has_land_ocean_mask: false
custom_satellites:                    # blank for standard TLEs
dump_orbit: false

Scientific dataset reading (read)#

Controls how BuildMUDT reads products via eoio. The package defaults request no bands (meas: []) so you must configure this section to get any data out of return_matchup_dataset().

read:
  defaults:
    vars_sel:
      meas: []       # band selection — list of band IDs, or "rgb" sentinel
      aux: []        # auxiliary variables
    read_params:
      use_chunks: false
      metadata_level: true
      save_extracted: false
    processors: {}

  # Per-collection overrides — merged on top of defaults above.
  collections:
    LANDSAT_C2L1:
      vars_sel:
        meas: [B2, B3, B4, B5]
    S2_MSI_L1C:
      vars_sel:
        meas: [B02, B03, B04, B8A]

vars_sel and processors are replaced wholesale at each level; read_params keys are merged individually so you can override a single parameter without losing the rest.

Preview reading (preview.read)#

Controls how BuildMUPreview reads products when generating preview images. Kept separate from read so that lightweight preview reads do not affect scientific dataset builds.

The package default requests only the RGB bands with metadata disabled. The "rgb" sentinel is resolved by eoio to the natural-colour bands for each collection (B02/B03/B04 for S2, B2/B3/B4 for Landsat).

preview:
  read:
    defaults:
      vars_sel:
        meas: rgb     # must be a string, not a list
        aux: []
      read_params:
        use_chunks: false
        metadata_level: false
        save_extracted: false
      processors: {}
    collections: {}

Per-run config files#

All CLI commands accept --config PATH to load an additional YAML file on top of your user config. This is the recommended way to supply run-specific settings (time range, platforms, catalogue path) without modifying your persistent user config:

eomatch-find --config my_run.yaml
eomatch-download --config my_run.yaml
eomatch-preview /data/my_catalogue/catalog.json --config my_run.yaml

A minimal per-run file typically looks like:

platforms: Sentinel-2A, Landsat-9
collections: S2_MSI_L1C, LANDSAT_C2L1
start_time: "2023-06-01 00:00:00"
end_time:   "2023-06-30 23:59:59"
orbitx_netcdf_path: /data/orbitx/2023_S2A_LS9.nc

matchup_catalogue:
  path: /data/my_catalogue

See example/find_and_catalogue.yaml in the repository for a fully annotated example.

Configuring from Python#

Pass a path or a dict directly to EOMatchContext:

from eomatch import EOMatchContext

# Load from a YAML file (merged on top of user config)
ctx = EOMatchContext("my_run.yaml")

# Or pass overrides as a dict
ctx = EOMatchContext({
    "platforms": "Sentinel-2A, Landsat-9",
    "collections": "S2_MSI_L1C, LANDSAT_C2L1",
    "matchup_catalogue": {"path": "/data/my_catalogue"},
})