---
title: "Recompute a DustPedia infrared colour comparison"
description: "Fetch two fixed native rows and official SPIRE responses, preserve quality flags, and compare one- and two-temperature fits to the same saved data."
canonical_url: "https://sandboxphysics.com/stories/interstellar-dust/replay-dustpedia-photometry/"
language: "en"
page_type: "story"
alternate_languages:
  zh-CN: "https://sandboxphysics.com/zh/stories/interstellar-dust/replay-dustpedia-photometry/"
last_modified: "2026-11-04"
---

[Interstellar dust, infrared light and polarization](https://sandboxphysics.com/stories/interstellar-dust/)

Interstellar dust · L3

# Recompute a DustPedia infrared colour comparison

Sandbox Physics · 2026-11-04

This tutorial produces a conditional colour comparison from actual galaxy photometry. You will fetch two named catalog rows and two small instrument files, check their identities, then fit one unchanged NGC4254 record. NGC0628 supplies a useful refusal: a positive flux with a major quality flag is not automatically suitable data.

## Before you begin

Read “How many temperatures do three infrared colours reveal?” You need a terminal and Python with NumPy, SciPy and Matplotlib. No Herschel reduction software or image archive is required.

## Get the scientific package into an empty directory

Download dust-transfer-science-v1.zip from the materials below and extract it into an empty directory. Enter its dust-transfer-science folder. The archive contains newly written scientific code and complete licensed native model inputs; it contains no website Engine or real photometry table.

The first command below creates an isolated environment. Installing ordinary dependencies is a separate network step. The final command then actually computes ten scientific steps offline, including transfer, cooling, independent references and refinement checks. It does not load completed numerical results. Use a new extraction for another fresh replay because the script deliberately refuses a directory with existing results.

The frozen archive is 1,824,340 bytes, with SHA-256 4f77beb30dc9c53b74039ca64d6738e6c7047788710854b39efba0a94fb7a843. Its original README predates the later live-reader test; the setup supplement here records that later test without changing the archive’s scientific inputs.

```
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python replay.py
```

Reading: Dust absorption, heat and polarization: standalone science

## Make the first real-source request explicitly

The following is an additional online step, not part of the offline replay. It requests exactly NGC0628 and NGC4254 from the fixed DustPedia aperture-photometry table through the CfA VizieR mirror, plus the complete ESA context 14.3 SPIRE RSRF and aperture-efficiency files. The acquisition has a total response-body cap of 91,360 bytes and no fallback to a whole catalog, image or alternate product.

In the later live-reader test, these four requests received 85,612 bytes and passed the saved-source analysis. Two earlier attempts timed out before receiving any body bytes; those failures remain in the research record. If the archive is unavailable, the acquisition fails visibly and the analysis waits for the fixed source.

The catalog service inserts a query date. The reader records the actual raw SHA of your received response and validates a separate frozen identity that omits only its two declared query-timestamp lines. A changed flux, flag, column or any other metadata is not accepted as a harmless timestamp change. The ESA files are checked against complete fixed-byte hashes.

```
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python scripts/astronomy/ac35/acquire_real_exercise.py --accept-first-network-acquisition
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python scripts/astronomy/ac35/verify_reader_identity.py
```

Reading: Clark et al., DustPedia photometry, arXiv:1708.05335v1 · DustPedia aperture-photometry catalog J/A+A/609/A37 · ESA SPIRE context 14.3 RSRF and aperture-efficiency products · Dust absorption, heat and polarization: standalone science

## Inspect the observation before choosing a model

Read the locally saved acquisition receipt and native row. Check the galaxy name, instrument, nominal wavelength, flux in Jy, quoted error and quality flag together. A negative error in this catalog can indicate that only calibration uncertainty was available; it is not a usable negative Gaussian standard deviation.

NGC0628 has major PACS coverage flags. The attempted general-use five-band fit is refused and saved as a negative case. NGC4254 has three unflagged SPIRE entries and minor PACS coverage flags. Its clean three-band comparison is the main example; its five-band extension must retain the minor flags and monochromatic PACS approximation.

Clark’s photometry uses matched galaxy apertures with band-dependent point-spread broadening, background subtraction and aperture corrections. The published corrections are already in the fluxes. Sample-average correction percentages are not new multipliers to apply to these rows. Without source-image inspection, minor flags remain conditions on every use of these fluxes.

Reading: Clark et al., DustPedia photometry, arXiv:1708.05335v1

## Audit the band convention

Run the two response checks below. SPIRE’s reference spectrum is $S_\nu\propto\nu^{-1}$. The model integrates $R(\nu)\epsilon(\nu)S_\nu\,d\nu$ and divides by the corresponding reference-spectrum integral. For the declared extended-map approximation, the same frequency-dependent beam factor must appear consistently in numerator and reference denominator.

The exercise compares beam powers $0$, $-1.7$ and $-2$. Zero is a point-response comparison; the others are extended-map approximations, not the exact original HIPE 13 beam. Context 14.3, internal RSRF product 3 and efficiency product 1 are distinct versions. Their availability does not prove exact equivalence to every catalog calibration detail.

Small negative estimated RSRF baseline samples are preserved. A positive-truncation sensitivity changes sampled band predictions by at most $1.97\times10^{-5}$. The original strict redundant-frequency-coordinate diagnostic fails at its stated target; using the alternative coordinate changes band predictions by only about $3.62\times10^{-12}$. Both facts are retained. Neither number measures real calibration uncertainty.

No PACS response was acquired. An exact five-band response calculation would need those missing curves. Here, the separately labeled PACS approximation is tested by band removal and model-gain scenarios.

```
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python scripts/astronomy/ac35/audit_spire_response.py
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python scripts/astronomy/ac35/verify_band_numerics.py
```

Reading: Griffin et al., SPIRE photometer calibration, arXiv:1306.1778v1 · ESA SPIRE context 14.3 RSRF and aperture-efficiency products · Clark et al., DustPedia photometry, arXiv:1708.05335v1

## Fit the same saved row and draw your own comparison

Run the fit command below. Its actual-saved-record.json preserves the input selected from the native row. conditional-comparison.json records response, fixed slope, covariance scenario, single-temperature result, positive two-temperature grid and explicit zero-amplitude boundary. Each scenario uses the same observations; simulated cloud data never replace them.

Download plot-dust-photometry.py from the materials below into this extracted directory, then run the second command. It reads only your locally generated JSON and grid arrays. It creates a band-flux comparison and a temperature-pair distance map under reader-plots. The plotted source values stay in your working directory; neither source rows nor their derived real-data figures are shipped in this site’s package.

For a worked reading, choose clean-SPIRE-extended-approximation-beta2-diagonal. Confirm the single colour parameter near $23.54\,\mathrm K$, then compare the low- and intermediate-cold-temperature representative mixtures. Locate the output’s gridPairsWithinDistanceOneOfGridMinimum field. The broad set is a model-degeneracy display, not a confidence contour.

Now inspect twoComponentBestIncludingBoundary in a minor-PACS case. If the single-component boundary wins, the unused temperature is null and its amplitude zero. Compare that with the retained strictly positive grid: you should be able to explain why a discrete search was once slightly worse without claiming that a nested model is physically worse.

```
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python scripts/astronomy/ac35/fit_real_photometry.py --output real-exercise-results
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python plot-dust-photometry.py --results real-exercise-results --output reader-plots
```

Reading: Dust absorption, heat and polarization: standalone science

## Write a result that another person can evaluate

A useful result names the saved source identity, selected flags, fixed slope, beam approximation and covariance scenario. Report an observer-frame colour temperature and Jy normalization. No redshift or distance is fixed here, so do not convert them into a physical rest-frame temperature or dust mass.

Compare the slope, common-calibration and band-removal cases. Keep numerical quadrature errors separate from response-model choices and source-quality limitations. The adopted covariance scenarios are not a measured covariance matrix; a weighted distance is not a validated real-data probability.

The original tables and ESA response files are fetched locally because redistribution rights were not established. A successful query or an openly readable paper is not permission to republish those arrays. You can still reproduce the calculation from fixed named sources, with every acquisition and derived plot explicitly recorded.

Reading: Dust absorption, heat and polarization: standalone science · Clark et al., DustPedia photometry, arXiv:1708.05335v1 · Griffin et al., SPIRE photometer calibration, arXiv:1306.1778v1

## Exercises and explanations

1. Your query SHA differs from an earlier reader’s, but only the two declared timestamp lines changed. What should the receipt report?

   Read the explanation

   It should report your actual raw SHA and the matching timestamp-normalized identity separately. Reusing the earlier raw SHA would be false. Any non-timestamp difference must fail the frozen identity check rather than being normalized away.

2. A positive PACS flux has a major N flag. Can it be used as an ordinary clean point because the optimizer accepts it?

   Read the explanation

   No. The source marks it unsuitable for general use, independently of its sign or the optimizer. The tutorial retains the refusal. Minor flags require a separately justified conditional use; they are not equivalent to no flag.

## Try the prediction

### [Follow the same dust from absorbed light to thermal emission](https://sandboxphysics.com/labs/interstellar-dust-polarization/)

1. Export a model cloud, then compare the meaning of its cell temperatures with the observer-frame colour parameters in your real-data output.
2. Use a transparent and a shielded cloud to see why a mixture of temperatures can arise even before grain-size variations are added.
3. Write three sentences naming the real tutorial’s input, model choice and strongest remaining degeneracy. Include one source-quality or response limitation.

## Standalone scientific materials

[Download the scientific ZIP](https://sandboxphysics.com/stories/interstellar-dust/materials/dust-transfer-science-v1.zip) · [Read the setup and calculation scope](https://sandboxphysics.com/stories/interstellar-dust/materials/setup-and-reader-status.md)

[Download the local real-data plot script](https://sandboxphysics.com/stories/interstellar-dust/materials/plot-dust-photometry.py)

The ZIP recomputes ten offline scientific steps. The optional real exercise fetches four fixed source files locally; its reader plot script generates figures from that saved record.

[Previous: How many temperatures do three infrared colours reveal?](https://sandboxphysics.com/stories/interstellar-dust/three-bands-and-many-temperatures/) [Next: Read an Astrodust model from cross sections to polarized emission](https://sandboxphysics.com/stories/interstellar-dust/reading-the-astrodust-model/)

## Sources and calculation scope

1. [Clark et al., DustPedia photometry, arXiv:1708.05335v1](https://arxiv.org/abs/1708.05335v1)

   Sections 2.1.1, 3.5–3.7, 4, 6.3.1 and 7.1: HIPE 13, reference spectrum, matched apertures, source flags, already-included calibration errors and aperture correction. No source-image re-reduction or flag clearance is claimed.

2. [DustPedia aperture-photometry catalog J/A+A/609/A37](https://doi.org/10.26093/cds/vizier.36090037)

   Reader-local fixed NGC0628/NGC4254 queries through the official CfA VizieR mirror. Only declared query timestamps are excluded from the frozen identity. Raw and derived real tables are not redistributed while rights remain unresolved.

3. [Griffin et al., SPIRE photometer calibration, arXiv:1306.1778v1](https://arxiv.org/abs/1306.1778v1)

   Sections 2–3 and 6, equations 1/8–12/18–25: energy response, reference spectrum and point/extended beam distinctions. Power-law beam scenarios are conditional approximations, not an exact native catalog beam.

4. [ESA SPIRE context 14.3 RSRF and aperture-efficiency products](https://archives.esac.esa.int/hsa/legacy/ADP/SPIRE/SPIRE-P_filter_curves/)

   Exactly SPIRE\_phot\_RSRF\_14\_3.fits and SPIRE\_phot\_apertureEfficiency\_14\_3.fits, with fixed complete-file hashes. Context 14.3 differs from internal product versions 3 and 1. Reader fetch only; no uncleared response arrays are redistributed.

5. [Dust absorption, heat and polarization: standalone science](https://sandboxphysics.com/stories/interstellar-dust/materials/dust-transfer-science-v1.zip)

   MIT scientific code plus separately licensed CC0 native inputs. Ten genuinely recomputed offline steps, retained coarse-grid failures, independent volume/Planck references and optional first-network real exercise. The site supplement records a later successful real first acquisition; the frozen archive remains unchanged.
