# AC21 standalone phase-curve science

Use Python 3.9–3.12 (tested with Python 3.9.6), NumPy 2.0.2, SciPy 1.13.1 and h5py 3.11.0. The pinned releases have wheels for those Python versions. Extract all files from the ZIP into one directory. No repository, private Lab Engine or browser session is required.

```sh
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements.txt
python -W error replay-miri.py
python -W error replay-thermal.py
```

The MIRI script checks every source input's bytes and SHA-256 before fitting. It typically runs in seconds; the independent thermal prior refinement takes longer because it solves thousands of small steady fields. Outputs are overwritten deterministically with their documented seeds. Floating-point last digits can differ across numerical library platforms; scientific comparisons should use the documented precision rather than treating all JSON digits as physical precision.

## Downloading without a signed-in browser

The site publishes this folder as a science ZIP. A named client also works with the public site’s request policy:

```sh
curl --fail --location --user-agent 'SandboxPhysics-Public-Tutorial/1.0' \
  'https://sandboxphysics.com/stories/planet-phase-curves/materials/phase-curve-science.zip' \
  --output phase-curve-science.zip
unzip phase-curve-science.zip -d phase-curve-science
```

The replay scripts themselves make no network requests. Public file MIME types, attachment names, byte counts and SHA-256 values are declared by the site’s fixed materials manifest. Check the ZIP hash published with the tutorial release before extracting it.

## Real observation

Attribution: Bell, Taylor James, and the other 17 named creators (2024), *Products and Models for “Nightside clouds and disequilibrium chemistry on the hot Jupiter WASP-43b”*, version v1, Zenodo DOI https://doi.org/10.5281/zenodo.10525170. The original API snapshot lists all creators and explicitly identifies CC BY 4.0: https://creativecommons.org/licenses/by/4.0/ .

Selected original archive-member bytes are unchanged. Renamed flat filenames, row-preserving CSV extraction and analysis are modifications by SandboxPhysics. Original configuration files are provenance text; their author-local paths are never executed. Original paper text and figures, GCM output and the private Lab Engine are not distributed. The science-code license covers only the newly authored Python replay files.

The complete author ZIP has 11,533,870 bytes, MD5 d14c633b7cdc15a9c990a92cc4fc9b86 and SHA-256 bcef029f5b610d7d2175611717e352998120f929e6a54202ae4f6cd1633ffa00. See miri-provenance.json for every selected source file and package-manifest.json for the public package files.

The observation is JWST DD-ERS 1366, observation 11, MIRI LRS slitless, from 2022-12-01 00:54:30 to 2022-12-02 03:23:36 UTC. The source has 9216 integrations with nominal 10.34-second exposure, measured median cadence about 10.338828 seconds and gaps. Retain the actual timestamps.

The figure time values are full BJD_TDB despite the inherited BMJD_TDB attribute. They match extracted BMJD_TDB[779:] + 2400000.5. The script verifies this mapping; it does not apply the offset twice. Source trimming removed 779 integrations, about 134.2 minutes. All corresponding source rows, NaNs and masks remain in the CSV derivatives.

Extracted curves are already calibrated and median-normalized; they are not detector pixels. Detrended system excess includes negative primary-transit values. The main white band is 5–10.5 micrometres; 10.5–12 micrometre spectral channels are retained but excluded from the main inference. Processed errors already contain source scatter treatment. Four reductions and the derived spectra share photons. No full detrending/time/channel covariance is supplied.

replay-miri.py fits five dimensionless harmonics to 6589 selected points outside primary and secondary intervals. It uses a proper independent Gaussian coefficient prior, stores full covariance and 4096 joint draws, and reports intervals conditional on the provided reduction/diagonal errors. Timing is relative to geometric conjunction with the supplied EPF Value-column reference; prior-centre and nominal light-travel sensitivities remain separate. It does not infer Bond albedo, gas temperature or independent wind and capacity.

mapping-rank.json uses exact retained sample times and original integration indices, a latitude-independent thirteen-column intensity basis and two surface resolutions. The phase-only odd-mode null remains in that basis at the observed inclination. Eclipse adds finite-basis response, not unique recovery of an arbitrary two-dimensional temperature map. Instantaneous-midpoint geometry is used in this diagnostic operator; it does not claim exact per-readout exposure calibration.

## Synthetic thermal calculation

replay-thermal.py solves a prescribed zonal radiating layer using independent SciPy sparse Newton linear algebra. It checks steady and near-zero-flow fields and nonuniform eclipses. The library has no imports from the browser model.

Twenty-four separately labeled synthetic bolometric observations use known twelve-ppm Gaussian noise and a documented seed. The prior is a finite midpoint approximation weighted by cell area across a full albedo/transport rectangle. Refinement preserves prior mass outside the refined region. All final nodes, weights, quantile comparisons and forward-model resolution differences are saved. This is not an exact continuous posterior. failed-coarse-synthetic-inference.json retains the earlier endpoint-grid example whose albedo interval collapsed onto one node.

The temperature layer has constant configured areal capacity, periodic longitude, no exchange between latitude bands, a circular aligned orbit, prescribed angular flow, explicit internal heat and unit thermal emissivity. Reflection is a separately defined bolometric Lambert reference. Momentum, clouds, chemistry and vertical radiative transfer are absent. The steady equation depends on the capacity-flow product; it does not identify those two quantities separately.

thermal-benchmarks.json records independent discrete reference values. Small energy residuals do not eliminate numerical diffusion. The browser's default 128-longitude grid differs from 512 by about 0.83 percent in the net nightside fraction. Compare grids and errors using the units in the outputs.
