脚本库

线站列映射

把上海光源 / BSRF 常见多列文件转成 Athena 可直接打开的 energy, mu。

pythonbeamlineimport

python xas_columns_to_mu.py raw.dat --i0 1 --it 2 --out mu.dat

xas_columns_to_mu.py
#!/usr/bin/env python3
"""Convert beamline columns to energy, mu for Athena."""
import argparse
import numpy as np

def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("src")
    ap.add_argument("--energy", type=int, default=0)
    ap.add_argument("--i0", type=int, default=1)
    ap.add_argument("--it", type=int, default=2)
    ap.add_argument("--ifluo", type=int, default=None)
    ap.add_argument("--kev", action="store_true", help="energy column is keV")
    ap.add_argument("--out", default="mu.dat")
    args = ap.parse_args()

    raw = np.loadtxt(args.src, comments=("#", "%", ";"))
    e = raw[:, args.energy]
    if args.kev:
        e = e * 1000.0
    i0 = np.clip(raw[:, args.i0], 1e-12, None)
    if args.ifluo is not None:
        mu = raw[:, args.ifluo] / i0
        kind = "fluorescence"
    else:
        it = np.clip(raw[:, args.it], 1e-12, None)
        mu = np.log(i0 / it)
        kind = "transmission"
    np.savetxt(
        args.out,
        np.column_stack([e, mu]),
        header=f"energy_eV  mu_{kind}",
        comments="# ",
    )
    print(f"wrote {args.out}: {len(e)} points, {kind}")

if __name__ == "__main__":
    main()