M82 Chandra → SQUDE Mock Spectrum
Physical Chandra fit → a SQUDE mock from the same source model → a Chandra-RMF resolution control at fixed SQUDE ARF.
The three figures are deliberately separated. Figure 1 contains only Chandra data, the Chandra-RMF-folded total model, and its response-folded model components; Figure 2 contains only SQUDE mock data and its SQUDE-RMF model; Figure 3 is the only common-axis comparison of SQUDE mock data, SQUDE model, and Chandra-RMF model. No empirical polynomial or image-level scaling is used.
fake_pha from the same Chandra best-fit source model through the SQUDE ARF/RMF.1. Chandra ACIS data + total model + model components
This is the original combined 4′×4′ Chandra ACIS spectrum: it contains no SQUDE mock data or SQUDE response. Black points are Chandra data; orange is the total model forward-folded through the Chandra RMF and rate-conservingly rebinned onto the same 458 data bins. Dashed/dotted curves are the five model components; each is independently folded through the same Chandra response and rebinned to the data bins, rather than plotted as an unconvolved source spectrum.

Download 1-column PNGDownload 2-column PNG
χ²_Gehrels/dof = 1125.65/444 = 2.535. It is a reproducible response-propagation input, not a final publication-grade M82 physical fit; the component curves only expose model decomposition and do not improve or hide this limitation.2. SQUDE mock data + SQUDE model
The fitted source from Figure 1 is passed through SQUDE ARF v1.1.1 and RMF v1.1.2 using a 50 ks fake_pha. The Sherpa UI-session Poisson RNG is fixed by set_rng(numpy.random.default_rng(20260719)); this reproducible realization has 58,298 raw counts. The original uses group_counts(50); the new min30 version reuses the identical raw PHA and changes only the display layer to group_counts(30). Both are linear–linear.
set_rng(numpy.random.default_rng(20260719))
set_source(2, chandra_bestfit_model)
fake_pha(2, arf="SQUDE_rsp_v1.1.1.arf", rmf="SQUDE_rsp_v1.1.2.rmf",
exposure=50000.0, grouped=False, method=poisson_noise)
3. SQUDE mock + SQUDE model + Chandra-RMF model
This is the full-aperture three-object comparison; each regional section below now has a separate analogue. Black points remain the Figure-2 SQUDE mock data; orange remains the SQUDE-RMF model; black dash-dot is the same best-fit source redistributed through the Chandra RMF. Both models retain the same SQUDE ARF, so the difference is RMF redistribution only.

min30 · 30 counts/binmin50 · 50 counts/bin

min50 1-columnmin50 2-columnmin30 1-columnmin30 2-columnmin50 CSVmin30 CSV
Three-region extension: North / Center / South
Each region uses its own Chandra PHA/ARF/RMF and has three scientifically separate figures. Figure A is real Chandra data plus response-folded total/components. Figure B is an independently seeded 50 ks SQUDE fake_pha plus its SQUDE-folded model. Figure C mirrors the full-aperture Figure 3: the same SQUDE mock, the SQUDE-RMF model, and a Chandra-RMF redistribution control at fixed SQUDE ARF. Figure C is not a Chandra-data spectrum. North/South retain the five original model components; Center uses the eight-epoch joint diffuse/CX-line-proxy/Fe-K plus epoch-variable XRB/ULX model. Every SQUDE panel retains the original min50 asset and adds a min30 version that changes display grouping only.
| Region | Chandra bins | baseline rstat | 0.3–4 keV thermal fraction | SQUDE raw counts / seed |
|---|---|---|---|---|
| North wind 80″×80″ | 176 | 1.096 | 95.8% | 3,636 / 2026071901 |
| Center starburst 40″×80″ | 459 | 1.200 joint | 58.5% | 27,040 / 2026071902 |
| South wind 80″×80″ | 154 | 1.199 | 87.8% | 4,916 / 2026071903 |
rstat=8.61). The replacement jointly fits all eight PHAs: diffuse VAPEC/CX-line-proxy/Fe-K parameters are shared, while each ObsID has an independent absorbed XRB/ULX normalization and effective absorption; the XRB slope is tied. The result is χ²_Gehrels/dof=2576.83/2147=1.200, Q=3.27×10⁻¹⁰, kT=0.709 keV, Γ_XRB=1.18, and an exposure-weighted 0.3–4 keV thermal fraction of 58.5%. The low Q means the formal null is still rejected: this is a substantially improved tutorial forward model, not a final physical fit. Broad-aperture point-source pile-up is not modeled separately and the legacy PHAs have no BACKFILE; a point-source-excised re-extraction remains preferred for diffuse-only inference.North wind · 80″×80″

Chandra 1-columnChandra 2-column

min50 1-columnmin50 2-columnmin30 1-columnmin30 2-column

min30 · 30 counts/binmin50 · 50 counts/bin

min50 1-columnmin50 2-columnmin30 1-columnmin30 2-column
Center starburst · 40″×80″

Chandra 1-columnChandra 2-column

min50 1-columnmin50 2-columnmin30 1-columnmin30 2-column

min30 · 30 counts/binmin50 · 50 counts/bin

min50 1-columnmin50 2-columnmin30 1-columnmin30 2-column
South wind · 80″×80″

Chandra 1-columnChandra 2-column

min50 1-columnmin50 2-columnmin30 1-columnmin30 2-column

min30 · 30 counts/binmin50 · 50 counts/bin

min50 1-columnmin50 2-columnmin30 1-columnmin30 2-column
Download the complete joint-center script · Download its required region helper · Download the joint-center provenance manifest
Numerical validation and reproduction
| Check | Result |
|---|---|
| Explicit Chandra RMF operator vs Sherpa native fold | p95 relative error = 2.45×10−15 |
| Chandra total vs sum of Chandra-response-folded model components | p95 relative error = 2.83×10−15 |
| SQUDE total vs sum of model components | p95 relative error = 5.92×10−16 |
| Three-region Chandra component closure | p95 ≤ 3.42×10−15 in every region |
| Regional/eight-epoch explicit RMF operator vs Sherpa | p95 ≤ 2.79×10−15 |
| Three-region SQUDE component closure | p95 ≤ 6.28×10−16 in every region |
| min50 → min30 displayed bins (0.5–1.7 keV) | Full 662→971; North 61→101; Center 297→464; South 83→139; unchanged raw PHA |
| Three-region Chandra-RMF control rate-conserving rebin | relative rate error ≤ 1.90×10−16 |
cd ~/program/M82 export ASCDS_OVERRIDE=1 source ~/software/ciao-4.18/bin/ciao.sh -q export PFILES="$PWD/pfiles;$ASCDS_INSTALL/param:" python scripts/make_m82_mock_tutorial_figure_set.py python scripts/make_m82_three_region_joint_center_tutorial_figures.py