# Reproduce the measured EHT triangle

Download the public AC05 materials archive and extract every file into one
folder. Python3.9 or later is sufficient;there are no third-party packages.

```sh
python3 fit-eht-triangle.py --data-dir . --output eht-triangle-results.rerun.json
```

The script checks both publisher-input hashes and the exact extracted rows,
computes closure by two independent methods,checks its Gaussian transform
against a finite real-space integral,and fits the three measured amplitudes
plus the directed closure phase. Compare the new JSON with the included
`eht-triangle-results.json`. The script's final line starts with `PASS`.

The result includes measured closure57.7651degrees and an approximate
independent high-SNR thermal uncertainty5.68544909883degrees. Multiple
empirical two-Gaussian shapes fit the four data constraints. The fitted
component separation is not a unique physical interpretation of M87.
The saved phase columns retain nuisance station phases and are never
inverse-transformed into an asserted calibrated sky image.

Inputs are actual M87 EHT-HOPS SR1 network-calibrated StokesI observations
from2017-Apr10,low band227.0707GHz. `provenance.json` identifies the exact
release,commit,units,source rows,byte counts and SHA256 values. The original
EHT release README and LICENSE preserve its attribution and data permission:
PDDL1.0 for data;GPLv3 for its publisher code. This independently written
standard-library fitter copies no publisher Python/shell code. No interactive
Lab Engine or compiled browser code is included.

Primary source:
https://github.com/eventhorizontelescope/2019-D01-01/tree/27ae76aacb9067a83388395c3826012b97aac371
Data DOI:10.25739/g85n-f134.
