---
title: "Recompute a fixed Sculptor abundance sample"
description: "Run an independent one-zone calculation, validate birth-mixture integration, and locally extract a fixed 99-star source with 96 usable abundance pairs."
canonical_url: "https://sandboxphysics.com/stories/galactic-chemical-evolution/recompute-a-fixed-sculptor-sample/"
language: "en"
page_type: "story"
alternate_languages:
  zh-CN: "https://sandboxphysics.com/zh/stories/galactic-chemical-evolution/recompute-a-fixed-sculptor-sample/"
last_modified: "2026-11-05"
---

[Galactic chemical evolution](https://sandboxphysics.com/stories/galactic-chemical-evolution/)

Galactic chemical evolution · L3

# Recompute a fixed Sculptor abundance sample

Sandbox Physics · 2026-11-05

This tutorial asks a reproducible, limited question: what abundance populations follow from four prescribed formation histories under the same effective yields? We first calculate everything with an original synthetic sample. Then an optional local step extracts the fixed Hill catalogue and compares its measured abundance pairs. Neither ranking is a reconstruction of a unique Sculptor history: red-giant selection and complete stellar error covariances have not been supplied.

## Before you begin

The preceding three textbook chapters and basic terminal use. The independent package requires Python 3.12, NumPy and SciPy. Only the optional source-extraction step needs an existing system pdftotext executable.

## Begin outside the repository

Download the independent Python package and unpack it into a new directory. It contains original scientific programs, fixed scalar inputs, synthetic measurements and documentation. It contains no interactive Engine, original PDF or observed-star table. Verify its inventory before running a producer. Each output command requires a new filename, preserving earlier results for comparison.

```
python science/verify_package.py
python science/make_records.py --save-every .005 --output results/records
```

Reading: Independent one-zone chemical-evolution Python materials

## Separate physical snapshots from birth integration

The first producer actually solves four specified histories. Its fourteen state fields follow gas, locked stellar mass, wind, and magnesium and iron inventories. Time is in gigayears and the mass scale corresponds to an initial billion solar masses. Full physical snapshots are stored every 0.05 gigayears; every 0.005-gigayear stellar birth interval is retained separately.

The reference producer solves again with tighter differential-equation tolerances and 0.0025-gigayear birth intervals. It computes the full fine trajectory in memory, then archives all fine birth groups, actual per-field maxima and a hash of that full fine record. It does not label an archive of maxima as an archive of the complete fine bulk arrays.

Positive four-point and eight-point Gaussian time integrals provide a separate check of the observation operator. They interpolate fine gas and element masses before taking logarithms, and use the analytic formation-rate weights. This checks the observation integration over that chemical solution; it is not a third independently solved galaxy model.

```
python science/make_reference.py --records results/records --output results/reference
python science/validate.py --records results/records --reference results/reference --output results/validation.json
```

Reading: Independent one-zone chemical-evolution Python materials

## Read a failure before reading a pass

Earlier 0.02 and 0.01-gigayear birth intervals changed the per-star log densities by a mean absolute value up to 0.08499, exceeding the preregistered 0.01 gate. Inventory conservation passed, but the observation integral did not. That failure is retained.

With the same histories and declared error scenarios, the 0.005 versus 0.0025 comparison gives a maximum about 0.00549 in the finite synthetic and real-sample checks. Four-point to eight-point positive integration changes are of order a few parts in ten million. These are tests of those histories and scenarios, not a uniform certificate for every continuous formation history.

The validator also checks the normalized delay kernel, independent source integrals, an analytic gas solution, gas and element inventories, and mathematical wind and mixing controls. The output names each check and the calculation it tests; the finite-history scope is recorded with the result.

Reading: Independent one-zone chemical-evolution Python materials

## Compare saved measurements with saved populations

The supplied file contains 96 original synthetic measurements. The comparison program receives neither their generating ages nor a truth label identifying a candidate. It calculates normalized two-dimensional mixture densities from the four saved birth distributions.

Each candidate is evaluated for three assumed correlations and for zero shift or a separate 0.1-dex shift in one model axis at a time. The measurements themselves are preserved. A fixed identifier rule reserves suffixes divisible by five: the synthetic sample has 77 training and 19 withheld measurements. This reproducible partition is not a coverage calibration. There is no parameter optimizer or posterior model probability in this four-candidate comparison.

```
python science/compare.py --records results/records --output results/synthetic-comparison.json
```

Reading: Independent one-zone chemical-evolution Python materials

## Fetch and extract the exact source locally

The optional source is Hill and collaborators, arXiv:1812.01486v2. The named downloader checks the actual body size and SHA-256 and has no automatic retry, mirror or upload. An explicitly supplied matching cache can test the offline extraction path; that is not evidence of a new network fetch.

The extractor reads Table C5 in both layout and raw text modes. It requires the same 99 unique stellar identifiers and the same values in every extracted field. Ninety-six rows have finite iron abundance, magnesium-to-iron ratio and positive errors in both coordinates. The missing-value markers remain in the other three rows, leaving a complete local table of 99 stars.

```
python science/fetch_hill.py --output reader-private/hill-v2.pdf
python science/extract_hill.py --pdf reader-private/hill-v2.pdf --output reader-private/hill-observations.json
```

Reading: Hill et al., VLT/FLAMES high-resolution chemical abundances in Sculptor, arXiv:1812.01486v2 · Independent one-zone chemical-evolution Python materials

## Keep the real-sample assumptions visible

The observing methods describe a central FLAMES field 25 arcminutes in diameter and upper red-giant targets brighter than $I$-band magnitude 17.5, followed by membership and spectral-quality selection. A radius description in the conclusions differs from that wording. The observing-method definition supplies the selection description used here.

Birth-mass weighting is not a recovered present-day red-giant selection function. The paper also does not supply the full per-star covariance required for this two-coordinate comparison. The three correlations remain assumptions. The preceding chapter explains why shared iron errors can cause negative correlation, but does not manufacture a measured covariance for these stars.

The model solar fractions use the fixed VICE/Asplund convention. A numerical Hill-to-model solar-zero-point transformation has not been established here. We keep the original coordinates and display zero shift alongside separate model-axis sensitivity shifts. The same identifier rule splits the real 96 rows into 80 training and 16 withheld measurements. Scores under these assumptions are conditional descriptive densities, not calibrated likelihoods or uniquely recovered ages.

```
python science/compare.py --records results/records --data reader-private/hill-observations.json --output reader-private/hill-comparison.json
python science/make_reference.py --records results/records --real-data reader-private/hill-observations.json --output reader-private/reference-with-hill
```

Reading: Hill et al., VLT/FLAMES high-resolution chemical abundances in Sculptor, arXiv:1812.01486v2 · VICE v1.3.1 fixed effective yields and solar reference · Independent one-zone chemical-evolution Python materials

## What to preserve for the next investigation

Keep the inputs, verified code inventory, four saved records and the validation and comparison outputs. They contain the inputs needed to recompute every reported score. Any observed-star plot should be produced locally from the extracted measurements; this public reader only displays original synthetic figures.

The useful next step is a testable red-giant selection model, shared abundance errors and an explicit solar-reference conversion. Those ingredients are needed to calibrate a comparison across a broader family of histories.

Reading: Independent one-zone chemical-evolution Python materials

## Exercises and explained answers

1. Why keep all 99 extracted rows but use only 96 in the comparison?

   Read the explanation

   The present Gaussian density requires both measured coordinates and positive marginal errors. Filling missing values with zero creates measurements that were never made. Keeping the complete table records the selection into the valid subset.

2. Inventory errors pass while the birth-mixture change exceeds 0.01. Which result applies?

   Read the explanation

   The inventory gate passes and the observation-integration gate fails. They assess different calculations. Preserve the failure and refine the birth integration under the same gate before interpreting the density.

## Try the prediction

### [Compare histories in one gas reservoir](https://sandboxphysics.com/labs/galactic-chemical-evolution/)

1. Export a full history and distinguish physical snapshot spacing from stellar birth-bin spacing.
2. Compare renewed and uninterrupted gas supply. Relate each segment’s extent in abundance space to the mass of stars born there.

## Standalone scientific materials

[Download the scientific ZIP](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/chemical-evolution-science-v1.zip) · [Read setup and calculation scope](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/README.md)

The offline calculation needs Python, NumPy and SciPy. It solves four histories and compares saved synthetic measurements. Optional fixed Hill extraction runs locally with pdftotext; the ZIP has no original observations, paper or browser Engine.

Individual scripts, sizes and SHA-256

- [README.md](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/README.md) (5754 B)
  `5a638f0c540b5d489ab149d2af7b8713a376a85a66f6a1a241a57052fee5ea1a`
- [LICENSE.txt](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/LICENSE.txt) (1271 B)
  `c8d56106a2c4041b440e94509790c6403bbad8908db7efdbf09bbfe4c893ce82`
- [requirements.txt](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/requirements.txt) (27 B)
  `39b93fa1b8397265839a510ca7601608248a7f3524067b61667e977bf4351475`
- [source-identities.json](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/source-identities.json) (1618 B)
  `f7d7dc4c91ee350ab7f809a2c4c54c7f2e6c650a87e3b4b7476cdaa1c59ed127`
- [fixed-inputs.json](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/fixed-inputs.json) (533 B)
  `98aaf54949a88e6ee5e4697b5ff25050bfff5790faa17d6d6ee5b7b02f9f1ac2`
- [model-family.json](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/model-family.json) (537 B)
  `58dac14f9a01ed44a43c4d45dc88e12aa76c9a26c5fd977940099811242751a4`
- [own-observations.json](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/own-observations.json) (10029 B)
  `3c2f318702cf26a370d4d298b8e4ed37da26e19c5052d51ef9a0daee06dba2f0`
- [compare.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/compare.py) (3237 B)
  `785b41dd356c57e90165197b70ec11adf6271daafe85e096e793f237bcc2c860`
- [evolution.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/evolution.py) (4572 B)
  `4deabefc6e7087e882bf44fe43b582762ba461d08c634d7e5237615760fcf108`
- [extract\_hill.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/extract_hill.py) (2549 B)
  `59aa4cd821574c65110549c41e513fe7161210789c319eeb9342b26d659598d3`
- [fetch\_hill.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/fetch_hill.py) (1705 B)
  `d31ccb38d10b8cd8a90194ba6a6d5b3e97af81b41c3dbef903c48ecc9b413696`
- [io\_helpers.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/io_helpers.py) (1894 B)
  `2a07f3ab2f0792f19d5575e5fbb38a6d1370df6e01c20c1cde0a3e2fa072a959`
- [make\_observations.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/make_observations.py) (1327 B)
  `5498e13a03606dc0adf97488f0f1d1bef92f04ed275aa16f7fe111a0d5683e79`
- [make\_records.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/make_records.py) (1461 B)
  `3f25e9ee127836c6e2ade3f922de38941ca941bf26ebd9c85bf21538655b611a`
- [make\_reference.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/make_reference.py) (4034 B)
  `cb0b779f168fe6e8ec93614da0eae1de7f82c37d61a632f05b5e987fe4e14f69`
- [observation\_quadrature.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/observation_quadrature.py) (1662 B)
  `5b1ad8917ef50bff8a63248c883e5b56f72875eaa49470b41d98db44ca21186a`
- [plot.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/plot.py) (3976 B)
  `55f9242160e7bd86321117136b5fc12a735c39cb1d5ae2ccd57481f76fb2ec6d`
- [validate.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/validate.py) (7153 B)
  `1e089465eae28b0bcbf8bf9e696c3ccd7e07a645bcf7173cb536c72e878e5c00`
- [verify\_package.py](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/verify_package.py) (926 B)
  `16d0c1b6185e7107b33fd33639456aa4806f3984269ca671f9b1b70bf487cd3d`
- [SHA256SUMS.json](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/SHA256SUMS.json) (3112 B)
  `28a1797407ef24a767fde830473a49ca5d8ddb675f13ce03135ba1a2fe4b567a`
- [chemical-evolution-science-v1.zip](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/chemical-evolution-science-v1.zip) (26888 B)
  `63dc82bb31bcd276c9abc76191e3201804d13d068811c5ff27bd244b17dcc06d`

[Previous: From a gas track to a stellar abundance population](https://sandboxphysics.com/stories/galactic-chemical-evolution/from-gas-tracks-to-stellar-abundances/) [Next: Delayed sources and imperfect mixing](https://sandboxphysics.com/stories/galactic-chemical-evolution/delayed-sources-and-imperfect-mixing/)

## Sources and calculation scope

1. [Hill et al., VLT/FLAMES high-resolution chemical abundances in Sculptor, arXiv:1812.01486v2](https://arxiv.org/abs/1812.01486v2)

   Main sections 1–7 and appendices A/B read again; Table C5 extracted in two text modes with exact agreement on 99 rows and 96 finite Mg/Fe pairs. Methods specify the 25-arcminute-diameter field and upper-RGB selection; conclusions use inconsistent radius wording. Full per-star covariance and a numerical model-solar harmonization are not established here. Original observations, PDF and measured-derived figures remain local.

2. [VICE v1.3.1 fixed effective yields and solar reference](https://github.com/giganano/VICE/tree/v1.3.1)

   Previously frozen native defaults: Kroupa convention, effective net core-collapse and Type Ia magnesium/iron yields, Asplund 2009 reference and the declared hydrogen conversion. Public materials contain scalar values and identities, not a new yield grid or VICE executable. The independent Python does not execute VICE.

3. [Independent one-zone chemical-evolution Python materials](https://sandboxphysics.com/stories/galactic-chemical-evolution/materials/chemical-evolution-science-v1.zip)

   Original continuous convolution/DOP853 producers, saved fourteen-field inventories and birth populations, finite refinement, normalized conditional mixtures and mathematical limits. Public inputs and figures are original synthetic data. Default is offline; optional fixed Hill source is fetched and analyzed on the reader’s computer. No App/Engine, original paper, observed rows or measured-derived plot is included.
