Skip to content

Background: processing modes (historical / forward)

The consistent-mode database says which acquisitions belong to a frame's stack. It does not say which of them the processor can run now, as a complete batch, versus which are still accumulating. That is what the processing-mode labels add.

This mirrors burst_db's opera-disp-s1-consistent-burst-ids-with-processing-mode-*.json and its reconcile_and_label_db.py step.

The three labels

DISP processing runs in batches of a fixed size (15 acquisitions, matching DISP-S1). Walking a frame's sorted sensing times from the beginning:

Label Meaning
historical_NN Part of a full batch. Processable now, and the result is final.
forward_NN The trailing partial batch. Reprocessed as new acquisitions arrive.
no_run The frame has never accumulated a full batch. Nothing to run yet.

NN is a group number. It increments after any gap longer than --gap-threshold-years (default 2.0), because a stack cannot span such a gap -- the acquisitions on either side belong to separate time series, and batch counting restarts.

For a young mission this distribution is lopsided by construction: most NISAR frames carry one partial batch, so forward_01 and no_run dominate and the historical fraction grows with every release.

The NISAR reconciliation question

burst_db also diffs each release against the previous one, looking for frames whose burst_id_list changed -- a changed burst set invalidates the existing stack.

NISAR frames have no burst list: the footprint is fixed by the mission. The equivalent invalidation is the winning (common_mode, common_coverage) flipping between releases, since that changes which acquisitions were selected as consistent. Passing --previous-json records those frames under metadata.frames_with_changed_mode.

Where this lives in the code

Piece Location
Labeling + reconciliation processing_mode.py
Sentinel-1 reference (for parity) burst_db's reconcile_and_label_db.py

Producing it

nisar-db label-processing-mode \
  --consistent-json opera-nisar-disp-consistent-gslc-2026-07-25.json \
  --previous-json opera-nisar-disp-consistent-gslc-2026-04-25.json \
  --output opera-nisar-disp-consistent-gslc-with-processing-mode-2026-07-25.json
flowchart LR
    A["Consistent-GSLC JSON"] --> B["split on gaps ><br/>gap_threshold_years"]
    B --> C["batch in groups of<br/>batch_size"]
    C --> D["historical / forward / no_run"]
    E["Previous release"] -.-> F["frames_with_changed_mode"]
    D --> G["…-with-processing-mode-*.json"]
    F -.-> G

The JSON shape

Identical to the consistent-GSLC document, except that sensing_time_list becomes a mapping from sensing time to label. Every other per-frame field is carried through unchanged:

{
  "metadata": {
    "processing_mode_params": {
      "batch_size": 15,
      "gap_threshold_years": 2.0,
      "labeling_time": "2026-07-25T12:00:00"
    },
    "frames_with_changed_mode": ["5830"]
  },
  "data": {
    "5827": {
      "common_mode": "4005",
      "common_coverage": "F",
      "sensing_time_list": {
        "2025-01-05T01:23:45": "historical_01",
        "2026-01-12T01:23:45": "forward_01"
      }
    }
  }
}