import os
import numpy as np
from larch.xafs.pre_edge import find_e0, find_energy_step
from larch.math.utils import smooth, polyfit
here = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
data = os.path.join(here, "tests", "data")
def load_xmu(path):
e, m = [], []
with open(path) as f:
for line in f:
s = line.strip()
if not s or s.startswith("#"):
continue
parts = s.split()
e.append(float(parts[0]))
m.append(float(parts[1]))
return np.array(e), np.array(m)
energy, mu = load_xmu(os.path.join(data, "cu.xmu"))
estep = find_energy_step(energy)
e0 = find_e0(energy, mu)
dmu = np.gradient(mu) / np.gradient(energy)
sm = smooth(energy, dmu, xstep=0.5, sigma=0.5, form='lorentzian')
xpf = energy[100:140]
ypf = mu[100:140]
pcoef = polyfit(xpf, ypf, 2)
out = os.path.join(data, "ref_e0.txt")
with open(out, "w") as f:
f.write("# E0 / primitives reference (larch)\n")
f.write(f"npts {len(energy)!r}\n")
f.write(f"find_energy_step {estep!r}\n")
f.write(f"find_e0 {e0!r}\n")
f.write(f"polyfit2 {pcoef[0]!r} {pcoef[1]!r} {pcoef[2]!r}\n")
f.write("# smooth samples: index value\n")
for i in range(0, len(sm), 60):
f.write(f"smooth {i} {sm[i]!r}\n")
print(f"wrote {out}: estep={estep}, e0={e0}")