脚本库

自动去毛刺

用中值滤波检测单点尖峰并线性插值,适合晶体衍射毛刺。

pythonclean

python xanes_deglitch.py scan.dat --sigma 6 --out clean.dat

xanes_deglitch.py
#!/usr/bin/env python3
import argparse
import numpy as np
from numpy.lib.stride_tricks import sliding_window_view

def median_filter(y, k=7):
    pad = k // 2
    yp = np.pad(y, pad, mode="edge")
    w = sliding_window_view(yp, k)
    return np.median(w, axis=1)

def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("src")
    ap.add_argument("--sigma", type=float, default=6)
    ap.add_argument("--out", default="clean.dat")
    args = ap.parse_args()

    e, mu = np.loadtxt(args.src, unpack=True, usecols=(0, 1))
    med = median_filter(mu)
    resid = mu - med
    thr = args.sigma * np.median(np.abs(resid)) / 0.6745
    bad = np.abs(resid) > thr
    clean = mu.copy()
    if bad.any():
        good = ~bad
        clean[bad] = np.interp(e[bad], e[good], mu[good])
    np.savetxt(args.out, np.column_stack([e, clean]),
               header="energy_eV  mu_deglitched")
    print(f"replaced {bad.sum()} glitch points -> {args.out}")

if __name__ == "__main__":
    main()