How to continue M31HotISM by hand如何手工继续 M31HotISM
This page is written so a first-year physics undergraduate can keep the project going without AI. Every command below was checked against its `--help` and its inputs exist on the machine it is meant to run on. Data paths are absolute.
本页面的编写目标是让一年级物理本科生无需 AI 即可继续推进项目。下面每个命令都已针对其 `--help` 进行核对,且其输入在目标机器上均已存在。数据路径为绝对路径。
1. Machines and their roles1. 机器与角色
| Machine机器 | Role角色 | Notes备注 |
|---|---|---|
| langlang | records and light work (handbook, reports, no fits)记录与轻量工作(手册、报告,不做拟合) | No fits run here (global rule)此处不运行拟合(全局规则) |
| VirgoVirgo | SAS/ESAS extractionSAS/ESAS 提取 | NVMe at floor: write nothing there; use data4t / data8tNVMe 在底线:那里不写入;使用 data4t / data8t |
| LTDLTD | spectral fits (fits live on lang, copied per subset)光谱拟合(谱位于 lang,按子集拷贝) | under security restrictions (compromised host); no `ls`, no compiling, no ELF off-box受安全限制(受损主机);不执行 `ls`、不编译、不将 ELF 文件带出机外 |
| lang2lang2 | fits only仅拟合 | small fits; free RAM floor 10 GB小型拟合;可用内存底线 10 GB |
Roles only — no addresses, ports, ssh routes, or account names are written on this public site.
仅角色——本公开网站不写入地址、端口、ssh 路由或账户名。
2. Where data, code and results live2. 数据、代码与结果的位置
- Project root:项目根目录:
/u/Lang3/program/M31HotISM/ - Data (symlinked as `data/`):数据(作为 `data/` 符号链接):
/u/Lang3/Data/M31HotISM/ - Run6 campaign spectra (6.9 GB):run6 运动谱(6.9 GB):
/u/Lang3/Data/M31HotISM/m31_run6_band_flux_inputs_20260901/campaign/ - Cognition OS (records; only the dispatcher edits):认知操作系统(记录;仅调度员编辑):
/u/Lang3/program/M31HotISM/cognition-os/ - Job directories:作业目录:
/u/Lang3/program/M31HotISM/.agent/jobs/ - Analysis products / output:分析产品 / 输出:
/u/Lang3/program/M31HotISM/output/ - Analysis scripts (read-only for the handbook):分析脚本(手册只读):
/u/Lang3/program/M31HotISM/scripts/ - Region files:区域文件:
/u/Lang3/program/M31HotISM/analysis/virgo_time_ranked_ten_region_execution_20260828/regions/ - WISE maps (read only, downsampled every 8th pixel or coarser):WISE 图(只读,每 8 个像素或更粗下采样):
/home/huangrui/Data/M31/data/WISE/
3. Copy-paste commands3. 可复制粘贴的命令
Each block starts with its `cd`; paths exist from there; read-only commands are run for real, others are shown with `--help` plus an `ls` of every input.
每个块以其 `cd` 开头;从那里开始路径存在;只读命令实际上运行,其他命令以 `--help` 加上每个输入的 `ls` 展示。
3.1 Project status snapshot3.1 项目状态快照
cd /u/Lang3/program/opskit && python3 -m opskit status --brief /u/Lang3/program/M31HotISM
Read-only; do NOT pass `--record-metrics`.
只读;不要传递 `--record-metrics`。
`--help` line: python3 -m opskit status --help shows `--brief` as a flag.
`--help` 行:python3 -m opskit status --help 显示 `--brief` 为标志。
3.2 Record check3.2 记录检查
python3 ~/.claude/skills/research-cognition-os/cogos_check.py /u/Lang3/program/M31HotISM/cognition-os
`--help` line: python3 ~/.claude/skills/research-cognition-os/cogos_check.py --help.
`--help` 行:python3 ~/.claude/skills/research-cognition-os/cogos_check.py --help。
3.3 Read one run6 spectrum header with astropy3.3 用 astropy 读取一个 run6 谱头
cd /u/Lang3/Data/M31HotISM/m31_run6_band_flux_inputs_20260901/campaign && \
/home/huangrui/software/miniconda3/bin/python - <<'PYEOF'
from astropy.io import fits
import glob
files = sorted(glob.glob("cases/*/rpc/3B.background/*/*-obj.pi"))
print("spectra found:", len(files))
print("example:", files[0])
with fits.open(files[0]) as hd:
h = hd["SPECTRUM"].header
for k in ("TELESCOP","INSTRUME","OBS_ID","EXPOSURE","BACKSCAL","CHANTYPE","DETCHANT"):
print(k, "=", h.get(k))
PYEOF
The `cd` runs from the campaign directory; the 490 `*-obj.pi` inputs exist under cases/cases/. `EXPOSURE` and `BACKSCAL` live in the SPECTRUM extension, not the primary header. `BACKSCAL` is the spectrum's extraction-area scaling (see glossary).
`cd` 从 campaign 目录运行;490 个 `*-obj.pi` 输入位于 cases/ 之下。`EXPOSURE` 和 `BACKSCAL` 位于 SPECTRUM 扩展中,而非主头。`BACKSCAL` 是谱的提取面积缩放(见术语表)。
3.4 Re-plot the 0.7 keV profile from the profile CSV3.4 从剖面 CSV 重绘 0.7 keV 剖面
cd /u/Lang3/program/M31HotISM/output/m31hotism_complete_9arcmin_profiles_20260911_run1 && \
/home/huangrui/software/miniconda3/bin/python - <<'PYEOF'
import csv
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
RETAINED = ["a016_024","a024_032","a032_040","a040_048","a048_056",
"a056_064","a064_072","a072_080","a080_088"] # 9 retained; a088_096 excluded
rows = list(csv.DictReader(open("complete_8arcmin_no_background_profile.csv")))
sel = [r for r in rows if r["component"] == "SrcApec" and r["parameter"] == "kT"
and r["region"] in RETAINED]
sel.sort(key=lambda r: float(r["radial_mid_arcmin"]))
a = [float(r["radial_mid_arcmin"]) for r in sel]
v = [float(r["value"]) for r in sel]
lo = [float(r["error_minus_1sigma_conditional_deltachi"]) for r in sel]
hi = [float(r["error_plus_1sigma_conditional_deltachi"]) for r in sel]
print("points:", len(sel))
print("a:", a)
print("SrcApec kT:", [round(x,3) for x in v])
plt.errorbar(a, v, yerr=[lo, hi], fmt="o", color="#1f77b4", capsize=3)
plt.xlabel("annulus midpoint (arcmin)"); plt.ylabel("SrcApec kT (keV)")
plt.title("SrcApec kT profile, 9 retained annuli (conditional 1 sigma)")
plt.savefig("/u/Lang2/ai_tmp/hermes/handbook_2026-11-01-handbook-build-01/srcapec_kt_profile.png")
print("wrote", "/u/Lang2/ai_tmp/hermes/handbook_2026-11-01-handbook-build-01/srcapec_kt_profile.png")
PYEOF
Output goes to `$TMPDIR` (never `/tmp`, `/var/tmp`, or `$HOME`). The 9 retained annuli are a016_024 … a080_088; a088_096 is excluded as unreliable (PI direction 2026-09-10) and a056_064 is included with an elevated-rstat caveat.
输出到 `$TMPDIR`(绝不写入 `/tmp`、`/var/tmp` 或 `$HOME`)。保留的 9 个环带为 a016_024 … a080_088;a088_096 作为不可靠被排除(PI 指示 2026-09-10),a056_064 带着升高的 rstat 说明被纳入。
4. Rules a newcomer must keep4. 新手必须遵守的规则
- abundances: always angr (Grevesse & Sauval 1998) to match Zhang+2019; never wilm for science fits.丰度表:始终使用 angr (Grevesse & Sauval 1998) 以与 Zhang+2019 一致;科学拟合绝不使用 wilm。
- MOS band: MOS 1.4–2.0 keV is included in the current campaign (user decision 2026-07-19).MOS 波段:MOS 1.4–2.0 keV 包含在当前运动中(用户决定 2026-07-19)。
- XSherpa contract (AGENTS.md §8): sky area is a Python float multiplier via
scale_skyarea; neverConst1D(it adds an energy-bin-width factor and corrupts absolute normalisations).XSherpa 契约(AGENTS.md §8):sky area 是通过scale_skyarea的 Python 浮点乘数;绝不使用Const1D(它会加上一个能量 bin 宽度因子并破坏绝对归一化)。 - no fits on lang;不在 lang 上做拟合;
- never write to /tmp;绝不写入 /tmp;
- only the dispatcher edits cognition-os; if you find an error there, list it in the checkpoint.仅调度员编辑 cognition-os;如果发现错误,请列在 checkpoint 中。
- keep old versions with suffixes (e.g.
_v2_backup).用后缀保留旧版本(例如_v2_backup)。
5. Numbered next-step plan5. 编号的下一步计划
| ## | Goal目标 | Inputs输入 | Method方法 | Success vs failure成功与失败的判断 | Time时间 | Read first首先阅读 |
|---|---|---|---|---|---|---|
| 1 | Foreground-nH refit pilot (a016_024)前景-nH 重拟合试点(a016_024) | run6 spectrum a016_024; halo-field nH bracket 0.048 / 0.0585 / 0.076run6 谱 a016_024;晕场 nH 括号 0.048 / 0.0585 / 0.076 | XSherpa on LTD; foreground floats at halo-field nHLTD 上的 XSherpa;前景在晕场 nH 下浮动 | CORRECTION_04: restore the accepted session on LTD, diff, then paired-within-LTD nH branches; |stat − 944.492| \(\leq\) 0.05 reproduces the accepted fitCORRECTION_04:在 LTD 上恢复被接受的会话,做差异比较,然后在 LTD 内配对做 nH 分支;|stat − 944.492| \(\leq\) 0.05 复现被接受的拟合 | BLOCKED at the profile cost gate, resumed under CORRECTION_03 (\(\leq\) 4 LTD workers, 7-point grids, every nuisance refitted)在剖面成本门控处阻塞,已在 CORRECTION_03 下恢复(\(\leq\) 4 个 LTD 工作者,7 点网格,每个 nuisance 重新拟合) | 08 §3 (V1b); E035; R016, R11608 §3(V1b);E035;R016、R116 |
| 2 | Halo 0.7 keV kT profile (V2)晕 0.7 keV kT 剖面(V2) | E033 halo joint fit productsE033 晕联合拟合产物 | two starts per point; full-freedom norm=0 null每点两个起始值;全自由度 norm=0 零假设 | valid interval; decides E033 branch B/C有效区间;决定 E033 分支 B/C | done — DETECTED (q = 22.4 under rule v2; 34.84 after warm restarts); the branches it would have decided stay withdrawn已完成——检出(规则 v2 下 q = 22.4;热重启后 34.84);它本要决定的分支仍然撤回 | 08 §3 (V2); E036; R003/R004, R071, R11208 §3(V2);E036;R003/R004、R071、R112 |
| 3 | Net old+FUV+constant template pilot (V6)净 old+FUV+constant 模板试点(V6) | sky-subtracted W1/FUV templates (CORRECTION_01)减天空 W1/FUV 模板(CORRECTION_01) | template build + a032_040 cost pilot; marginal errors模板构建 + a032_040 成本试点;边缘误差 | embedding check reproduces raw old_only stat within 0.05嵌入检验在 0.05 以内复现原始 old_only 统计量 | 1 LTD-day pilot1 个 LTD 天试点 | E038; R012/R013E038;R012/R013 |
| 4 | Outer annuli foreground variants (V7)外环带前景变体(V7) | a064_072, a072_080, a080_088a064_072, a072_080, a080_088 | anchored + released-MWhotHalo refits锚定 + 释放 MWhotHalo 重拟合 | done — undecided (E040 rule v2): the intercept from SrcApec alone is \(-1.32\sigma\) for HF1 and 0 for HF2/HF3, and the test is power-limited (halo-field scatter 2–4\(\times\) the whole detected halo range)已完成——未决(E040 规则 v2):仅用 SrcApec 的截距在 HF1 为 \(-1.32\sigma\)、在 HF2/HF3 为 0,且该检验受功效限制(晕场散度是整个已检出晕范围的 2–4\(\times\) 倍) | done (undecided)已完成(未决) | 08 §3 (V7); E040; R007, R115, R12208 §3(V7);E040;R007、R115、R122 |
| 5 | Clipped sector extraction pilot (V8)剪切扇区提取试点(V8) | 5 annuli \(\times\) 4 quadrants; region files in analysis/.../regions/5 个环带 \(\times\) 4 个象限;区域文件在 analysis/.../regions/ | region QA, plan-only gate, one-ObsID pilot区域 QA,计划-only 门控,单 ObsID 试点 | quadrants sum to annulus within 0.5%; area table ok象限之和与环带相差在 0.5% 以内;面积表正常 | 6 h Virgo budget6 h Virgo 预算 | D21; E041; R011D21;E041;R011 |
| 6 | Point-source mask depth (V11)点源掩护深度(V11) | run6 disk; Ponti 3.5e-14 cutrun6 圆盘;Ponti 3.5e-14 切口 | replay one field limit from source list从源列表重放一字段限值 | reported STATUS: BLOCKED — no identifiable 90% stellar completeness or qualified thermal ECF/footprint closure; H1 stays a source-selection-dependent band报告 STATUS: BLOCKED——无可辨识的 90% 恒星完备度,也没有合格的热的 ECF/足迹闭合;H1 仍是依赖源选择的带 | done (BLOCKED)已完成(BLOCKED) | E043; R014E043;R014 |