import os
import numpy as np
from larch import Group
from larch.xafs.autobk import autobk
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
p = s.split()
e.append(float(p[0]))
m.append(float(p[1]))
return np.array(e), np.array(m)
energy, mu = load_xmu(os.path.join(data, "cu.xmu"))
k_std = np.arange(0.0, 20.0 + 1e-9, 0.1)
R = 2.55
chi_std = 0.15 * np.sin(2 * R * k_std + 0.4) * np.exp(-2 * 0.005 * k_std**2)
g = Group(energy=energy, mu=mu)
autobk(g, k_std=k_std, chi_std=chi_std)
d = g.autobk_details
out = os.path.join(data, "ref_autobk_chistd.txt")
with open(out, "w") as f:
f.write("# autobk chi_std reference (larch, default params + analytic standard)\n")
f.write(f"ek0 {g.ek0!r}\n")
f.write(f"edge_step {g.edge_step!r}\n")
f.write(f"rbkg {g.rbkg!r}\n")
f.write(f"nspl {d.nspl!r}\n")
f.write(f"irbkg {d.irbkg!r}\n")
f.write(f"iek0 {d.iek0!r}\n")
f.write(f"iemax {d.iemax!r}\n")
f.write(f"kmax {d.kmax!r}\n")
f.write(f"nk {len(g.k)!r}\n")
f.write(f"nbkg {len(g.bkg)!r}\n")
for i in range(len(k_std)):
f.write(f"kstd {i} {k_std[i]!r}\n")
for i in range(len(chi_std)):
f.write(f"chistd {i} {chi_std[i]!r}\n")
for name, arr in (("k", g.k), ("chi", g.chi), ("bkg", g.bkg),
("chie", g.chie), ("initbkg", d.init_bkg),
("initchi", d.init_chi)):
for i in range(0, len(arr), 20):
f.write(f"{name} {i} {arr[i]!r}\n")
print(f"wrote {out}: ek0={g.ek0}, edge_step={g.edge_step}, "
f"nspl={d.nspl}, irbkg={d.irbkg}, nk={len(g.k)}, "
f"nkstd={len(k_std)}")