FAILURE MAP
← Case archive

FA-54981 / Astronomical coordinate conventions / Open access

Detector mosaic sections: Chip gap width is omitted or counted once per amplifier · case 01

The adapter reports an incorrect mosaic extent while other fields remain valid.

Verified by executionVariant 1 · 6 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Chip gap width is omitted or counted once per amplifier. Faulty expression: d['a']+d['b']

VERIFIED REPAIR

Preserve the declared model convention at this site: d['a']+d['gap']+d['b']

Unsuccessful approach: A partial convention repair still uses d['a']+2*d['gap']+d['b']

Case contract

Two readout amplifiers cover a focal plane with overscan removed. Amplifier B is physically reversed. Detector labels are one-based; chip gap has no samples. Serial overscan is measured in columns and parallel overscan in rows. Output fields are defined by: a_science_column = d['x']-d['serial']; b_detector_column = d['a']+d['gap']+d['b']+1-d['x']; science_row = d['y']-d['parallel']; b_first_pixel = d['a']+d['gap']+1; mosaic_extent = d['a']+d['gap']+d['b']; science_rows = d['rows']-d['parallel']

Why this case matters

Catalog, detector, sky-coordinate, and spectroscopy adapters must preserve the association between numeric coordinates and their declared reference conventions.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+d['b'], 'science_rows': d['rows']-d['parallel']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
astronomical fixture 0{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16}Failed
astronomical fixture 1{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 22, 'science_row': 7, 'science_rows': 20}{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}Failed
astronomical fixture 2{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}Passed
astronomical fixture 3{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 22, 'science_row': -3, 'science_rows': 16}{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16}Failed
astronomical fixture 4{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 10, 'science_row': 3, 'science_rows': 5}{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5}Failed
astronomical fixture 5{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 22, 'science_row': 16, 'science_rows': 16}{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16}Failed

SHA-256 / 9a9bffd997a7636c6101049db1bd4fb6d2567b7847fee354e29ba0ed5782fadf

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+2*d['gap']+d['b'], 'science_rows': d['rows']-d['parallel']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
astronomical fixture 0{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 28, 'science_row': 3, 'science_rows': 16}{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16}Failed
astronomical fixture 1{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 28, 'science_row': 7, 'science_rows': 20}{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}Failed
astronomical fixture 2{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}Passed
astronomical fixture 3{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 28, 'science_row': -3, 'science_rows': 16}{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16}Failed
astronomical fixture 4{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 16, 'science_row': 3, 'science_rows': 5}{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5}Failed
astronomical fixture 5{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 28, 'science_row': 16, 'science_rows': 16}{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16}Failed

SHA-256 / d0266f339d1c138cfbd6bd40e144fe4240407e1237359a15503ecb9fca52a37b

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+d['gap']+d['b'], 'science_rows': d['rows']-d['parallel']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
astronomical fixture 0{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16}{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16}Passed
astronomical fixture 1{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}Passed
astronomical fixture 2{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}Passed
astronomical fixture 3{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16}{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16}Passed
astronomical fixture 4{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5}{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5}Passed
astronomical fixture 5{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16}{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16}Passed

SHA-256 / 06cee28a92eb32f257fe691649a654ceed580e79b0217e4d34974b4c9bef9297

Verification & scope

Explicitly stipulated finite algebraic adapter; no standards conformance, physical accuracy, or production-library claim. Inputs are the documented finite valid model domain. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:45:53.403710+00:00.

Case digest / 6dc05649f0886d97fd9aeb255c2c000e3071031f17782972c01fbb7840438b2b