Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ supports a requested handoff, not an automatic stop for authorized implementatio
| A hot giant nobody has measured | `new-object --expected-glow <id>...` paints the same color at the equilibrium temperature a paper prints, as the "Expected glow" dataset | HAT-P-14 b `thermal` (1,624 K, Southworth 2012) | `packages/telescope-cli/src/new-object/planet-glow.test.mts` | An estimate, said as one everywhere; only giants of 0.77 Jupiter radii or more, the population its test covers ([estimates](scientific-faithfulness.md#estimates)) |
| A measured day side that cannot be a glow (under 1,000 K, or an eccentric orbit) | `new-object --thermal` and `--thermal-entries` write the `measured-dayside` dataset (`packages/telescope-cli/src/new-object/thermal/dayside-dataset.mts`): the day hemisphere in false color at the printed temperature on the scale all such planets share, the night hemisphere blank | WASP-80 b `dayside` (888 K at 4.5 µm) | `packages/telescope-cli/src/new-object/planet-glow.test.mts` | No glow, no pattern; "at secondary eclipse" for an eccentric orbit, nothing past e 0.6 |
| A small hot planet of a red dwarf nobody has measured | `new-object --expected-glow` paints the bare-rock maximum from the star's temperature and a/R*, for planets like the nine rocks of Coy et al. 2025 | GJ 806 b `thermal` (1,204 K) | `packages/telescope-cli/src/new-object/planet-glow.test.mts` | An estimate; the archive's insolation is the check; rocks of hotter stars and sub-Neptunes are not covered |
| A published simulation of a named body | `telescope simulations OBJECT` lists the Zenodo records that name it (`packages/telescope-cli/src/simulations/simulations.mts`). `new-object --simulation entries.json` (`packages/telescope-cli/src/new-object/simulation/simulation-dataset.mts`) adds one from an entry written after reading the paper, as the default dataset where the body had only one color or the neutral shape: it checks the record's license, name and file, fetches by range the two parts of the file it reads (the header with the coordinates, and the selected grid) and writes a `terrestrial-scientific` dataset with `format: netcdf-lonlat-field` (`packages/bake/src/objects/raster/netcdf/`), labelled as a model with its scenario. Conditions: [published simulations](scientific-faithfulness.md#published-simulations) | `trappist-1e` (ExoCAM surface temperature), `trappist-1d` (Generic PCM outgoing thermal radiation, from a 3.5 GB file); WASP-103b's hand-made table is the earlier example | `packages/bake/src/objects/raster/netcdf/*.test.mts`, `packages/telescope-cli/src/simulations/simulations.test.mts`, `packages/telescope-cli/src/new-object/simulation/simulation-dataset.test.mts` | Classic NetCDF only: a NetCDF-4 release is refused by name. A file inside a zip is not read. The variable's longitude and latitude must be its last two dimensions and its coordinates must not be record variables |
| A published simulation of a named body | `telescope simulations OBJECT` lists the Zenodo records that name it (`packages/telescope-cli/src/simulations/simulations.mts`). `new-object --simulation entries.json` (`packages/telescope-cli/src/new-object/simulation/simulation-dataset.mts`) adds one from an entry written after reading the paper, as the default dataset where the body had only one color or the neutral shape: it checks the record's license, name and file, fetches by range the two parts of the file it reads (the header with the coordinates, and the selected grid) and writes a `terrestrial-scientific` dataset with `format: netcdf-lonlat-field` (`packages/bake/src/objects/raster/netcdf/`), labelled as a model with its scenario. An entry with `member` names a NetCDF-4 model file inside a ZIP release, kept whole and restored by a `zip-member` step, and may add `isobar` to read the field at one pressure. Conditions: [published simulations](scientific-faithfulness.md#published-simulations) | `trappist-1e` (ExoCAM surface temperature), `trappist-1d` (Generic PCM outgoing thermal radiation, from a 3.5 GB file), `wasp-94-a-b` (Met Office UM temperature at 1 millibar, from a NetCDF-4 file in a ZIP); WASP-103b's hand-made table is the earlier example | `packages/bake/src/objects/raster/netcdf/*.test.mts`, `packages/telescope-cli/src/simulations/simulations.test.mts`, `packages/telescope-cli/src/new-object/simulation/simulation-dataset.test.mts` | NetCDF-4 is read only in its plain kind: a chunked or compressed variable, or one inside a group, is refused by name, and the file is kept whole. In a classic release the variable's longitude and latitude must be its last two dimensions and its coordinates must not be record variables |
| A planet of another star with a published longitude-latitude map | Astronomy record `classification: exoplanet` with a `hostedOrbit` block around a placed star (`packages/astronomy/src/hostedOrbits.ts`), rotation `cssearth-synchronous-rotation@1` (`packages/bake/src/objects/scene/authored-rotation.ts`), and a `terrestrial-scientific` dataset with `format: npy-dictionary-map` on the lit route, as every planet with a map is drawn (`packages/bake/src/objects/raster/numpy/npy-pickle.ts`, `tar-member.mts`; `new-object --star-lit <id>...` moves a planet built self-luminous to the lit route, `packages/telescope-cli/src/new-object/map/star-lit.mts`); paint the atlas from `outputLongitudeOrigin: -90` | WASP-43b `temperature`: Challener et al. (2024) JWST NIRSpec eclipse map, Zenodo tar read in place | `packages/bake/src/objects/raster/eclipse-map/phase-curve.ts` turns the map with the package's orbit and rotation; `default-view.test.mts` pins the substellar view | Photometry cannot tell north from south; the orbit's node on the sky is a display convention |
| A wide companion star whose orbit is not measured | Its own Gaia placement with `boundTo` and a `sources.binary` citation of the measurement that binds it (`packages/astronomy/cli/lib/generator-records.mts`); no orbit is drawn, and preparation carries the pair's centre of mass into the world context. A LOFTI fit (`packages/bake/authoring/hd-189733-companion/lofti-fit.py`) may be kept as evidence only: the candidate-orbit renderer was removed because the accepted orbits span a factor of ten in size | HD 189733 B | No dedicated test | The companion lies on no orbit |
| A directly imaged planet whose paper publishes its orbit's inputs but not one orbit | `packages/telescope-cli/src/new-object/hosted-orbits/orbitize-fit.py` reruns orbitize! (the papers' own tool) on the paper's measurements, priors and sampler (a `fit.json` beside the measurements, corrections such as astrometric jitter or the shift to a pair's centre of mass declared there); the maximum of orbitize!'s posterior, refined with Nelder-Mead from many starts (`--refine`), becomes the `hostedOrbit`, kept at its fitted angular size and placed at the Gaia distance. A planet around a pair is fitted about the pair's centre of mass (`centreOfMass` in `fit.json`) and drawn around the primary. The drawn orbit uses the gravitational parameter the recorded period and size imply (`prepare-solar-geometry.mts`), so a pair-mass fit draws correctly around one star. Short-arc orbits are drawn as one of the orbits the measurements allow; the README gives the published range | GQ Lup b (Venkatesan et al. 2025); VHS 1256-1257 b, DH Tau b, ROXs 42B b | `packages/astronomy/src/hostedOrbits.test.ts` puts each planet on the paper's measured positions | The medians printed by the run are compared with the paper's table before the sample is used |
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,7 @@ src/objects/hd-181327/source/photometry/tess/
src/objects/hd-189733/source/photometry/tess/
src/objects/hd-189733b/source/science/lally-2025/output_E.npy
src/objects/wasp-17b/source/science/valentine-2024/tmap.pkl
src/objects/wasp-94-a-b/source/science/mukherjee-2025/WASP-94Ab_GCM.nc
src/objects/hd-189733b/source/illustration/HD_189733_b.jpg
src/objects/hd-29615/source/science/willamo-2022/*.dat
src/objects/hd-35296/source/science/willamo-2022/*.dat
Expand Down
2 changes: 1 addition & 1 deletion docs/surface-preparation.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ prepared background size and position; the runtime needs no special path.
| Prepare solid-body imagery, scientific layers and meshes | [prepareTerrestrialLayers](../packages/bake/src/objects/layers/terrestrial/terrestrial-layers.ts) |
| Compare retrieved atmospheric profiles with credible intervals | [Retrieved profile chart recipe](retrieved-profile-charts.md) |
| Sample a pressure level from a numeric longitude/latitude table | [CSV slice reader](../packages/bake/src/objects/raster/lonlat-slice-table.ts): `lonlat-slice-table`, one-based `columns`, an exact `slice`, and a coordinate rounding tolerance. It validates periodic longitude and complete cells; latitude coverage ends at the released samples. [WASP-103 b](../src/objects/wasp-103b/README.md) is the climate-model example. |
| Read one field of a released model run from NetCDF | [NetCDF field reader](../packages/bake/src/objects/raster/netcdf/netcdf-lonlat-field.ts): `netcdf-lonlat-field`, a `variable`, its two `coordinates`, a `select` index for every other dimension, the `sourceUnits` the file must state and `longitudeZeroAt`, the grid longitude of the body's zero meridian. It reads classic NetCDF (CDF-1, CDF-2, CDF-5) from the file's own byte ranges and refuses NetCDF-4 by name. A release of gigabytes is kept as two exact byte ranges the manifest declares: `path` is its first bytes (the header and coordinates) and `field` the bytes of the selected grid, which the header must place at the declared range. It validates periodic longitude, reading once a first meridian the grid stores at both ends; latitude coverage ends at the released rows and cells at the fill value stay without a value. `new-object --simulation` writes the recipe from an entry ([simulation-dataset.mts](../packages/telescope-cli/src/new-object/simulation/simulation-dataset.mts)). |
| Read one field of a released model run from NetCDF | [NetCDF field reader](../packages/bake/src/objects/raster/netcdf/netcdf-lonlat-field.ts): `netcdf-lonlat-field`, a `variable`, its two `coordinates`, a `select` index for every other dimension, the `sourceUnits` the file must state and `longitudeZeroAt`, the grid longitude of the body's zero meridian. It reads classic NetCDF (CDF-1, CDF-2, CDF-5) and the plain kind of NetCDF-4 (every variable in the root group, stored whole and unfiltered; a chunked or compressed variable is refused by name), each from the file's own byte ranges. A classic release of gigabytes is kept as two exact byte ranges the manifest declares: `path` is its first bytes (the header and coordinates) and `field` the bytes of the selected grid, which the header must place at the declared range. A NetCDF-4 file spreads its structure through itself and is kept whole. `isobar` reads the field at one pressure instead of on one level, between the two levels either side of it in each column ([netcdf-isobar.ts](../packages/bake/src/objects/raster/netcdf/netcdf-isobar.ts)), for a model whose levels are heights. It validates periodic longitude, reading once a first meridian the grid stores at both ends; latitude coverage ends at the released rows and cells at the fill value stay without a value. `new-object --simulation` writes the recipe from an entry ([simulation-dataset.mts](../packages/telescope-cli/src/new-object/simulation/simulation-dataset.mts)). |
| Add or restyle scientific charts | [Chart recipes catalog](chart-recipes.md) |
| Record which inputs each dataset reads | [Lineage bindings](../packages/bake/src/objects/lineage/lineage-recipes.ts) and [the body reader](../packages/bake/src/objects/lineage/body-lineage.ts) |

Expand Down
32 changes: 32 additions & 0 deletions packages/astronomy/data/bodies/cd-34-14724-b.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"id": "cd-34-14724-b",
"classification": "star",
"order": 5780,
"physical": {
"name": "CD-34 14724B",
"horizonsCode": null,
"meanRadiusKm": 995546.7,
"gravitationalParameterKm3PerS2": 149965057247.39148,
"parent": null,
"effectiveTemperatureK": 6049.7
},
"physicalNotes": "Radius 1.431 +/- 0.068 solar radii from Stassun et al. (2019), AJ 158, 138 (TIC v8.2), the radius of TIC 92352621 (VizieR IV/39/tic82) (https://doi.org/10.3847/1538-3881/ab3467): 995,547 km at 695,700 km per solar radius. Mass 1.13 +/- 0.149 solar masses from Stassun et al. (2019), AJ 158, 138 (TIC v8.2), the mass of TIC 92352621 (VizieR IV/39/tic82) (https://doi.org/10.3847/1538-3881/ab3467); GM is that mass times the JPL solar GM. Temperature 6049.7 +/- 126.5 K from Stassun et al. (2019), AJ 158, 138 (TIC v8.2), the effective temperature of TIC 92352621 (VizieR IV/39/tic82) (https://doi.org/10.3847/1538-3881/ab3467). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.",
"star": {
"rightAscensionDegrees": 313.7882976030805,
"declinationDegrees": -34.135730289765554,
"positionEpochJulianYear": 2016,
"distanceParsecs": 211.82964258100284,
"properMotionRaMasPerYear": 26.19129770882488,
"properMotionDecMasPerYear": -44.70168046944481,
"radialVelocityKmPerS": -8.3041315,
"presentationUp": "display-axis",
"boundTo": "wasp-94-a",
"sources": {
"position": "Gaia DR3 source 6780546169633474944 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/cd-34-14724-b/source/photometry/gaia-dr3-source.csv",
"distance": "Gaia DR3 parallax 4.7208 +/- 0.0165 mas (same row, RUWE 0.81): 211.83 pc, no zero-point correction",
"properMotion": "Gaia DR3 (same row): 26.191, -44.702 mas/yr",
"radialVelocity": "Gaia DR3 (same row): -8.30 +/- 0.20 km/s",
"binary": "El-Badry, Rix & Heintz (2021, MNRAS 506, 2269) list WASP-94 A and CD-34 14724B in their Gaia EDR3 wide-binary catalogue (VizieR J/MNRAS/506/2269, source_id 6780546169634170496 and 6780546169633474944), 3,171 AU apart on the sky, with a chance-alignment probability of 8.4e-6: the pair is bound. No orbit of the pair is published, and the Gaia astrometry alone does not constrain one, so the star is placed by its own astrometry and carries no orbit."
}
}
}
28 changes: 28 additions & 0 deletions packages/astronomy/data/bodies/wasp-94-a-b.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"id": "wasp-94-a-b",
"classification": "exoplanet",
"order": 5779,
"physical": {
"name": "WASP-94 A b",
"horizonsCode": null,
"meanRadiusKm": 112957.4,
"gravitationalParameterKm3PerS2": 63343265.95,
"parent": "wasp-94-a"
},
"physicalNotes": "Radius 1.58 Jupiter radii from Stassun et al. 2017 (2017AJ....153..136S), via the NASA Exoplanet Archive (https://ui.adsabs.harvard.edu/abs/2017AJ....153..136S/abstract): 112,957.4 km at 71,492 km per Jupiter radius. GM from the mass 0.5 Jupiter masses (Stassun et al. 2017, the mass the NASA Exoplanet Archive's composite table adopts (2017AJ....153..136S), via the NASA Exoplanet Archive, https://ui.adsabs.harvard.edu/abs/2017AJ....153..136S/abstract) times JPL's Jupiter GM. A sphere: no oblateness is measured.",
"hostedOrbit": {
"periodDays": 3.9502001,
"semiMajorAxisStellarRadii": 8.44,
"inclinationDegrees": 88.7,
"eccentricity": 0,
"transitTimeBmjdTdb": 58300.14763,
"ascendingNodePositionAngleDegrees": 0,
"sources": {
"period": "Kokori et al. 2023 (2023ApJS..265....4K), via the NASA Exoplanet Archive ps table (pl_refname KOKORI_ET_AL__2023): P 3.9502001 d",
"shape": "Stassun et al. 2017 (2017AJ....153..136S), via the NASA Exoplanet Archive ps table (pl_refname STASSUN_ET_AL__2017): a/R* 8.44; Stassun et al. 2017 (2017AJ....153..136S), via the NASA Exoplanet Archive ps table (pl_refname STASSUN_ET_AL__2017): inclination 88.7 degrees",
"eccentricity": "Stassun et al. 2017 (2017AJ....153..136S), via the NASA Exoplanet Archive ps table (pl_refname STASSUN_ET_AL__2017): e 0",
"phase": "Kokori et al. 2023 (2023ApJS..265....4K), via the NASA Exoplanet Archive ps table (pl_refname KOKORI_ET_AL__2023): transit mid-time 2458300.64763 BJD, taken as BJD_TDB; with its period, the row that predicts 2026-01-01 best (1 sigma 1 min)",
"orientation": "Display convention: transit photometry does not measure the orbit's position angle on the sky, so the ascending node is set at position angle 0 (celestial north)."
}
}
}
30 changes: 30 additions & 0 deletions packages/astronomy/data/bodies/wasp-94-a.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"id": "wasp-94-a",
"classification": "star",
"order": 5778,
"physical": {
"name": "WASP-94 A",
"horizonsCode": null,
"meanRadiusKm": 1029636,
"gravitationalParameterKm3PerS2": 221629774870.03876,
"parent": null,
"effectiveTemperatureK": 6170
},
"physicalNotes": "Radius 1.48 +/- 0.12 solar radii from Stassun et al. 2017, the stellar radius of the default parameter set of WASP-94 A b in the NASA Exoplanet Archive (https://ui.adsabs.harvard.edu/abs/2017AJ....153..136S/abstract): 1,029,636 km at 695,700 km per solar radius. Mass 1.67 +/- 0.64 solar masses from Stassun et al. 2017, the stellar mass of the default parameter set of WASP-94 A b in the NASA Exoplanet Archive (https://ui.adsabs.harvard.edu/abs/2017AJ....153..136S/abstract); GM is that mass times the JPL solar GM. Temperature 6170 +/- 80 K from Stassun et al. 2017, the stellar temperature of the default parameter set of WASP-94 A b in the NASA Exoplanet Archive (https://ui.adsabs.harvard.edu/abs/2017AJ....153..136S/abstract). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.",
"star": {
"rightAscensionDegrees": 313.7832437626676,
"declinationDegrees": -34.135757506210496,
"positionEpochJulianYear": 2016,
"distanceParsecs": 210.53462213743273,
"properMotionRaMasPerYear": 26.500228153109326,
"properMotionDecMasPerYear": -44.970822510565206,
"radialVelocityKmPerS": -8.361371,
"presentationUp": "display-axis",
"sources": {
"position": "Gaia DR3 source 6780546169634170496 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/wasp-94-a/source/photometry/gaia-dr3-source.csv",
"distance": "Gaia DR3 parallax 4.7498 +/- 0.0242 mas (same row, RUWE 0.98): 210.53 pc, no zero-point correction",
"properMotion": "Gaia DR3 (same row): 26.500, -44.971 mas/yr",
"radialVelocity": "Gaia DR3 (same row): -8.36 +/- 0.19 km/s"
}
}
}
2 changes: 1 addition & 1 deletion packages/bake/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ cycle. Share anything else through `@cssearth/core` or another package. Prepared
sphere is written with. The solar geometry is generated into the checkout (`src/platform/solar-geometry.mts`) after the packages build,
so callers pass `SolarGeometry` or use `loadSolarGeometry` from `@cssearth/bake/objects/scene` to load and validate the generated file. The prepared sky and Sun contracts belong to `@cssearth/objects`; their authored standards and preparers
belong to `presentation`, which the scene imports as a lower topic.
- `objects/raster`: scientific surfaces from PDS, ISIS, FITS, GeoTIFF, VTK, NumPy, HEALPix, Tecplot and classic NetCDF products,
- `objects/raster`: scientific surfaces from PDS, ISIS, FITS, GeoTIFF, VTK, NumPy, HEALPix, Tecplot, classic NetCDF and NetCDF-4 products,
categorical geology and symbols, exoplanet eclipse and published phase-curve maps, observed color rasters and their
photometric composition, a planet's whole-disc color record and the band-ratio tie to it, the source records they read, the WISE atlas mosaic grid, FITS binary tables (OIFITS and archive
tables) and a star's limb darkening fitted to TESS transits. It imports `objects/scene`,
Expand Down
Loading
Loading