pymatgen专题

pymatgen:XAS拼接与位点加权

实际运行XANES/EXAFS、L₂/L₃拼接和4:2位点简并加权,输入为固定版本官方参考谱。

更新于 2026-11-12约 5 分钟阅读按任务与环境选择适用配置
阅读本篇目录

已有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。已有分析目录时,保留它并在另一份解压目录操作。

官方参考谱在集群实际完成XAFS拼接、L₂/L₃相加和4:2位点加权

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模块和本例固定版本参考数据。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗