pymatgen:XAS拼接与位点加权
实际运行XANES/EXAFS、L₂/L₃拼接和4:2位点简并加权,输入为固定版本官方参考谱。
阅读本篇目录
已有X射线吸收计算或测量数据后,可用pymatgen整理吸收边、拼接能区或按位点简并度求平均。本例在鸢算科技集群实际运行这些后处理,输入使用pymatgen官方固定版本的参考谱,不是本次新算的FEFF谱或集群材料预测。
来源为pymatgen v2026.9.24、提交8461938451eedd7591b96998de4b48e4b1901ea0的六个test-files/analysis/spectrum_test文件。包内UPSTREAM-XAS-SOURCES.json保留各文件原始链接和哈希,附上游许可。
unzip pymatgen-spectra-tools-wave719-*.zip
cd pymatgen-spectra-tools
module load pymatgen/2026.9.24
bash results.sh
bash plot.sh
环境为pymatgen2026.9.24、Python3.11、NumPy/SciPy和Matplotlib。run.sh重新后处理到新建的analysis,不会运行DFT或FEFF;参考数据在reference-data,绘图输出到figures。已有分析目录时,保留它并在另一份解压目录操作。

1. 读取带结构信息的谱#
python - <<'PY'
import json
from pymatgen.analysis.xas.spectrum import XAS
with open('inputs/xas/LiCoO2_k_xanes.json') as f:
spectrum = XAS.from_dict(json.load(f))
print(spectrum.structure.composition)
print(spectrum.absorbing_element, spectrum.edge, spectrum.spectrum_type)
print('阈值E0/eV:', spectrum.e0)
PY
LiCoO₂的Co K边参考谱得到E₀=7728.565eV,按本接口采用μ(E)梯度最大位置定义。它是谱数据的边阈值处理,不是重新计算芯能级结合能。
输入结构、吸收元素、吸收边、谱类型和位点编号必须与数据相符;不能只把两列数字套进不同材料的元数据。
2. 拼接同一吸收边的XANES和EXAFS#
python - <<'PY'
import json
from pymatgen.analysis.xas.spectrum import XAS
def read(name):
with open('inputs/xas/' + name + '.json') as f:
return XAS.from_dict(json.load(f))
xanes = read('LiCoO2_k_xanes')
exafs = read('LiCoO2_k_exafs')
result = xanes.stitch(exafs, num_samples=500, mode='XAFS')
print(result.spectrum_type, len(result.x))
PY
两份输入需有匹配结构、吸收元素、吸收边和位点标记,并有能量重叠。原生XAFS模式在其定义的k坐标上处理过渡区;不是任意找一个能量将两段直接拼起来。
本例输出500点。num_samples改变插值输出点数,不会增加原始计算的物理信息。
3. 合并ZnO的L₂和L₃边#
python - <<'PY'
import json
from pymatgen.analysis.xas.spectrum import XAS
def read(name):
with open('inputs/xas/' + name + '.json') as f:
return XAS.from_dict(json.load(f))
l2 = read('ZnO_l2_xanes')
l3 = read('ZnO_l3_xanes')
result = l2.stitch(l3, num_samples=500, mode='L23')
print(result.edge, len(result.x))
PY
此模式的本地实现适用于其支持的Z≤30元素和L₂/L₃ XANES组合,结果范围取L₃能区;并非对任意重元素都适用。拼接内含插值、L₂外推和相应强度处理,要检查输入覆盖和边附近连续性。
本例用独立三次插值加和核对了500点结果,没有把不匹配边或不相容材料强行拼接。
4. 按位点简并度加权#
python - <<'PY'
import json
from pymatgen.analysis.xas.spectrum import XAS, site_weighted_spectrum
spectra = []
for name in ['site1_k_xanes', 'site2_k_xanes']:
with open('inputs/xas/' + name + '.json') as f:
spectra.append(XAS.from_dict(json.load(f)))
weighted = site_weighted_spectrum(spectra, num_samples=500)
print(len(weighted.x), weighted.absorbing_index)
PY
参考结构中两个不等价吸收位点的简并度分别为4和2,因此平均谱为**(4μ₁+2μ₂)/6**,不是简单的(μ₁+μ₂)/2。本例按结构对称性实际求得这个4:2比例,并独立核对了加权结果。
不同位点谱先在共同能量交集上插值;这里输出500点,最终对象代表位点平均谱。位点编号或结构改变后,应重新核对简并度。
5. 查看CSV并使用自己的数据#
head -n 5 reference-data/LiCoO2-K-XAFS-stitched.csv
head -n 5 reference-data/ZnO-L23-XANES-stitched.csv
head -n 5 reference-data/Site-weighted-K-XANES.csv
bash plot.sh
换实际材料时,先完成适用的XAS前置计算或实验数据整理,保留结构与吸收位点信息、能量参考及归一化。不同谱的能量零点和强度口径没有对齐时,拼接与加权可能得到看似平滑却没有可比物理意义的曲线。
接口及输入示例见pymatgen官方XAS模块和本例固定版本参考数据。