先说个背景。我当初第一次用 QSTEM 做 Fe3O4 的 HAADF 模拟图时,光是把输入文件跑通就花了一个下午,后来发现坑全在单位换算和格式细节上。现在回头看,这类工具其实不难上手,难的是没人把“从模型准备到 DrProbe 出图”的全流程一次讲清楚。这篇文章就把完整流程捋一遍,正好拿 Fe3O4 当第一个实例,帮你在最短时间内见到自己的第一张 STEM 模拟图。
QSTEM 和 DrProbe 这一对组合,在透射电镜模拟圈子里算老牌工具了。QSTEM 负责做多片层(multislice)计算,把电子束穿过晶体的过程模拟出来;DrProbe 把 QSTEM 的原始输出的散射数据变成你习惯看的 HAADF、ABF 那种图像。适合谁看?做过电镜实验、想用模拟辅助理解实验图像的人,或者刚接触计算成像、想验证结构模型的研究生,都可以照这篇文章走一遍。
1. 先搞明白:QSTEM 和 DrProbe 到底在干什么
1.1 QSTEM 的 multislice 原理,其实就是“切片面包”
很多教材把 multislice 讲得很吓人,但用生活类比就一句话:把晶体沿电子束入射方向切成极薄的一层又一层,电子波函数一层一层穿过去。每一层对电子的作用,可以分解成两步——先是在这一层内部被原子势场“改相位”,然后在层与层之间的真空中继续自由传播。如此往复,直到穿出样品底部,得到出口电子波函数。
QSTEM 干的正是这事。它在每个扫描位置都重复一遍这个“逐层穿越”的过程,然后把不同角度的散射电子记录下来。所以从本质上看,QSTEM 不是直接画图,而是计算出电子束与晶体相互作用后的物理结果。
所谓 STEM 模拟,就是把一个聚焦得非常细的电子探针,在样品表面逐点扫描。探针每落到一个位置,就相当于做了一次完整的 multislice 计算,最后把每个探测器的强度按扫描位置拼起来,就是一张 STEM 图。
1.2 DrProbe 的角色:把散射强度变成你认识的样子
QSTEM 输出的原始数据,往往是一堆代表“某个扫描位置、某个散射角度上电子强度”的数字,直接看无法得到直观的图像。这里就需要 DrProbe 出场。
DrProbe 可以理解成一个“虚拟探测器加工厂”。你在里面画一个环形探测器,设定内角和外角,它就把落在该角度范围内的散射电子全部积分起来,作为这个扫描像素的灰度值。HAADF(高角环形暗场)就是内角很大、只收高角度散射的探测器;ABF(环形明场)则用较小的内角,可以同时看到轻元素和重元素。
所以,QSTEM 和 DrProbe 的分工非常明确:前者解决“电子在晶体里怎么走”的物理问题,后者解决“探测器怎么收信号”的成像问题。
1.3 为什么第一个实例选 Fe3O4
Fe3O4(磁铁矿)是我反复推荐的入门样品,原因有三个。第一,它的晶格常数很大,约 8.4 Å,投影到[001]方向后的原子柱间距相对宽松,扫描步长不需要设得极细,计算量友好。第二,它同时含有重元素 Fe 和轻元素 O,HAADF 图里 Fe 原子柱明显、O 几乎隐身,ABF 图里 Fe 和 O 都能看到,对比效果非常典型,适合用来理解不同探测器的成像差异。第三,Fe3O4 的晶体结构数据很容易从公开数据库拿到,省去了自己搭模型的麻烦。
2. 开工前的准备:软件、模型和文件格式
2.1 软件环境怎么搭
QSTEM 的完整名称是 OpenQSTEM,源代码在 GitHub 上可以找到。如果你用 Windows,最简单的方式是找社区编译好的可执行版本,省去自己编译的折腾。如果你是 Linux 用户,通常需要装 gfortran 和 make,然后按源码里的 README 编译。DrProbe 则相对友好一些,官方直接提供带图形界面的安装包,装完就能跑。
安装过程中最大的坑是路径。两个软件都别装在带中文和空格的目录里,否则读文件时容易出诡异问题。我一般放在类似D:\tools\qstem这样的纯英文路径下,省心很多。
2.2 Fe3O4 晶体模型从哪里来
Fe3O4 的晶体结构属于反尖晶石型,空间群 Fd-3m,晶格常数 a = b = c ≈ 8.396 Å,α = β = γ = 90°。一个晶胞里,Fe 有两种晶体学位点:四面体位的 Fe 在 8a 位置,八面体位的 Fe 在 16d 位置,O 在 32e 位置。
获取模型最可靠的方法是直接去公开数据库下载 CIF 文件,比如 Materials Project、Crystallography Open Database(COD)或者 ICSD。下载后用 VESTA 打开,检查原子坐标和晶格常数是否合理,然后就能提取出建模需要的信息。
这里要提醒一句:CIF 里的原子坐标多数是分数坐标,也就是以晶格常数为单位归一化后的位置。而 QSTEM 的输入文件里,原子位置既可以给分数坐标,也可以给笛卡尔坐标,两者混用时最容易出错。建议一开始就统一用分数坐标,也就是晶格常数用实际值,位置写成 [0,1) 之间的小数,这样后续扩展超胞时也方便核对。
2.3 QSTEM 输入文件的逻辑结构
QSTEM 的输入文件是纯文本格式,各版本语法略有差异,但核心逻辑一致。一个 STEM 模拟输入文件,至少包含这么几块:
title // 任务标题,随便起个名字 crystal // 晶胞定义 lattice 8.396 8.396 8.396 90.0 90.0 90.0 // 晶格常数和角度 atom Fe 0.125 0.125 0.125 0.25 // 元素、分数坐标、占据率 atom Fe 0.500 0.500 0.500 0.50 atom O 0.255 0.255 0.255 1.00 multislice // 切片和超胞设置 supercell 1 1 1 // 扩展倍数 slicing 1.0 // 切片厚度,单位埃 stem // STEM 扫描参数 voltage 200.0 // 加速电压,单位 kV convergence 20.0 // 会聚半角,单位 mrad detector_in 50.0 // 探测器内角 detector_out 180.0 // 探测器外角 scan_step 0.1 // 扫描步长,单位埃上面的写法只是一个逻辑示意,具体关键字要以你安装版本的帮助文档为准。我建议新手先把这个简化模板跑通,再一点点加高级参数,这样排错范围小得多。
3. 实操:从 Fe3O4 模型到第一张 STEM 模拟图
3.1 建立晶胞和原子坐标
打开一个文本编辑器,新建模拟输入文件。第一步是定义晶胞。Fe3O4 的立方晶胞参数直接填进去后,再把原子坐标按分数坐标写进去。这里需要特别注意 Fe 两个位点的占据率:四面体 8a 位点每个等效位置都被 Fe 占满,占据率写作 0.25(因为 8a 有 8 个等效位置,一个位置对一个晶胞的贡献是 1/8,但 QSTEM 中通常直接写该位置的占据概率,建议用occ=1.0表示全占,具体按软件帮助来);八面体 16d 位点则是 Fe2+ 和 Fe3+ 混合占据,结构解析上经常等效处理为 0.5 占据。
再多说一句,不同数据库下载的 CIF 中,O 的 x 参数可能在 0.254 到 0.256 之间波动,这是正常现象。第一轮模拟直接用数据库原值即可,别为了“看起来更准”去手动微调,等跑通流程后再考虑结构精修的问题。
3.2 生成超胞并设置切片
晶体模拟默认用周期性边界条件,相当于无穷大晶体。但实际计算时,横向尺寸太小会有明显的人工周期性效应,图像里可能会出现不该有的莫尔条纹。我会习惯性把晶胞至少扩展到 2×2×1。Fe3O4 晶胞本身约 8.4 Å,扩成 2×2 后横向尺寸约 16.8 Å,足以容纳好几个原子柱,第一轮验证完全够用。
切片厚度是精度和速度的折中。切片越薄,层间多次散射近似越准确,但计算量越大。对 Fe3O4 这种晶胞,沿[001]方向每隔约 1 Å 切一片,8.4 Å 的晶胞切成 8 到 10 片,已经能满足大部分模拟需求。切忌把切片厚度设成 5 Å 以上,那样相位屏近似会明显失真,得到的图像对比度会有假。
3.3 设好电子束和探测器参数
模拟的第一步,先用 200 kV 加速电压。200 kV 的电子波长经过相对论修正后约 0.0251 Å,是模拟里常见的入口参数。如果你平时用球差校正电镜,Cs 可以设得很小,比如 0.001 mm 级别;如果用的是常规电镜,Cs 按镜筒说明书里的标称值填。
会聚半角我用 20 mrad,这是一个比较通用的起点值。HAADF 探测器内角 50 mrad、外角 180 mrad,是模拟和实验都常见的配置。如果你更在意轻元素信号,后面再用 ABF 探测器,内角改成 10~20 mrad、外角 40~50 mrad,重新用 DrProbe 生成一张图就行,不用重跑 QSTEM 计算。
这里有个非常容易踩的坑:单位。QSTEM 有些老的输入模板里,角度按弧度写,长度按埃写;DrProbe 的界面里又是毫弧度、纳米混用。我的习惯是先把所有参数统一换算好再填进去,绝不直接在软件里改单位。尤其是“内角到底是半角还是全角”,不同版本可能不同,跑之前务必确认这一点,否则图像会莫名其妙地全黑或全白。
3.4 确定扫描步长和区域
扫描步长决定图像的空间采样密度,直接影响到你能否分清相邻原子柱。Fe3O4[001]投影下,最密的方向上 Fe 和 O 的原子柱间距大概在 1 到 2 Å 左右。按奈奎斯特采样原则,步长至少要比最小柱间距的一半更小,所以我建议从 0.1 Å 起步。如果计算量允许,甚至可以压到 0.05 Å,画面会细腻很多。
但要注意:扫描范围越大、步长越细,计算量指数上升。第一次跑通流程,强烈建议先只模拟一个晶胞范围,比如 16.8 Å × 16.8 Å,步长 0.1 Å,这样扫描点约 168×168 个,再配合一个不算厚的样品,几分钟内就能出结果。等流程完全跑通,再把范围扩大、厚度增加。
样品厚度上,第一轮我建议选 10 nm 左右。太薄,图像对比度不够明显;太厚,通道效应和非弹性散射近似问题都会冒出来,不利于新手理解结果。10 nm 对 Fe3O4 来说,大约十几个晶胞厚度,已经能看出清晰的原子柱衬度了。
3.5 运行 QSTEM 并检查输出
输入文件准备好后,在命令行里运行 QSTEM 主程序,把输入文件路径作为参数传进去。正常运行时,屏幕上会滚动显示出每一层 slice 的计算进度,像不是特别快的进度条。如果程序秒退,大概率是输入文件路径错误、格式不对,或者某个关键字拼写错了。
跑完后,检查输出目录。QSTEM 会输出一个或多个数据文件,里面存着每个扫描位置和散射角度的强度分布。别急着打开看,先确认文件大小合理。如果文件只有几个字节,说明计算基本没做成功,回头检查参数。
3.6 在 DrProbe 里生成 HAADF 图像
打开 DrProbe,加载 QSTEM 输出的原始数据文件。界面左边会显示文件里的数据结构,一般能看到每个扫描点的散射强度分布。此时你看到的是“衍射空间”的信息,还不是一张实空间的图。
接下来在 DrProbe 里新建一个环形探测器,把内角和外观填成你希望模拟的探测器几何。比如 HAADF 就填内角 50、外角 180。点击计算之后,DrProbe 会把所有落在该角度范围内的电子强度积分起来,并按扫描坐标拼成一张灰度图。
第一次出图,十有八九是纯黑或纯白,别急着删数据。这是显示范围的问题——模拟图像素值的动态范围可能非常大,默认显示层级看不到原子柱。把灰度显示范围改成按百分位拉伸,比如显示 1% 到 99% 的分位数,原子柱的衬度就出来了。这一步做对了,你的第一张 STEM 模拟图基本就算到手了。
4. 影响图像质量的参数细节和避坑清单
4.1 收敛角与探测器角度的搭配
会聚半角决定了入射电子束在样品上的焦斑大小和角分布。收敛角越大,探针越细,但衍射盘重叠越多,相干性也更复杂。模拟时,收敛角要和实验条件匹配,否则图像衬度会差很多。
- HAADF:内角通常取 50~80 mrad,外角 150~200 mrad。内角越小,对样品厚度的敏感性越高;内角越大,图像越接近纯 Z 衬度。
- ABF:内角 10~20 mrad,外角 40~50 mrad。这种配置下轻重元素都能成像,适合看 Fe3O4 里的氧原子柱。
- BF(明场):内角 0,外角 10~20 mrad。对缺陷、应变场敏感,但不适合直接做原子柱识别。
我不止一次看到新手把 HAADF 内角设成 10 mrad,结果得到的图像衬度混乱,既不像 HAADF 也不像 ABF。原因很简单:低角度区域包含了大量相干散射和衍射衬度,已经不是高角非相干散射主导了。
4.2 源尺寸不设置,模拟图会和实验“不像”
初学者最容易忽略的参数是源尺寸(source size)。真实电镜的电子源不是理想的点光源,而是有一定展宽,所以实验图像中原子柱会有一点模糊。QSTEM 和 DrProbe 如果不做源尺寸卷积,默认按理想点源处理,模拟出的图像会锐利得“假”,和实验图对不上。
我的做法是,跑完理想点源的模拟图后,在 DrProbe 里设置一个 0.5~1 Å 的高斯源尺寸再做一次卷积。这个范围对应现代球差校正电镜的典型源尺寸,出来的图和实验观感非常接近。如果你拿不准,可以先从 0 试到 2 Å,对比一下衬度变化,很快就能理解源尺寸对分辨率的影响。
4.3 defocus 和球差系数:模拟里别过分追求“完美”
模拟中很容易产生一个冲动——把所有像差都设成零,觉得这样最“理想”。但实际电镜不可能完全没有像差,模拟完全无像差的结果反而会和实验脱节。比如 Cs 设成 0,图像的离焦行为会和实验明显不同。
实践中,我建议先按常规电镜参数设:200 kV 时 Cs 约 1.0 mm,defocus 约 -50 nm(轻微欠焦),模拟一张“常规像差”的基线图;再设一组球差校正参数,Cs 约 0.001 mm、defocus 接近 0 甚至微调,模拟一张“校正像差”的图。两者对比,你能直观感受到像差对原子柱衬度的影响,这对理解实验非常有帮助。
Fe3O4 这种氧化物,我测试下来 HAADF 对 defocus 的敏感性不算高,但 ABF 对 defocus 相当敏感,微小的欠焦就会让氧原子柱的衬度从暗变亮。所以模拟 ABF 前,最好先做一个小范围 defocus 序列扫描,选衬度最合理的一张作为结果。
4.4 关于厚度和通道效应
很多人第一次拿到模拟图,觉得亮度应该和原子序数 Z 成正比。实际上,HAADF 图像强度在薄样品区近似正比于 Z 的 1.7~2 次方,但样品一旦变厚,通道效应会让电子束沿原子柱方向不断“聚焦-散焦”,强度随厚度出现振荡,不再单调。
所以在模拟 Fe3O4 时,如果厚度超过 20~30 nm,就必须正视通道效应。我做过一个对比:同样的 Fe3O4 模型,10 nm 厚度下 Fe 原子柱亮度和厚度近似线性增长;到 40 nm 以上时,部分原子柱亮度反而开始下降,规律变得复杂。如果你是要拿模拟图去定标实验厚度,建议至少算 3 个厚度点,比如 5 nm、10 nm、20 nm,再做插值,不要指望一个厚度算到底。
5. 常见报错和结果异常排查
5.1 程序秒退或输出文件为空
最常见原因有三类:路径含有中文或空格、输入文件关键字拼错、原子坐标格式不对。排查方法是先跑一遍软件自带的 example 文件,如果自带的能跑通,说明环境没问题,问题一定出在你的输入文件上。然后再把你写的输入文件和 example 逐字段对照,重点看单位、坐标写法是否一致。
5.2 图像全黑或全白
这几乎不是物理问题,而是显示或探测器的问题。先用百分位拉伸显示范围,看看有没有结构。如果还是全黑,检查探测器内角是不是比外角还大,或者内外角设置是否覆盖了有效散射范围。还有一种可能:你加载的原始数据不是 STEM 扫描数据,而是单点衍射数据,DrProbe 里看数据结构时要仔细确认。
5.3 模拟图的周期和晶胞对不上
如果图像里有明显的周期结构,但周期长度和你预想的不一致,大概率是超胞扩展倍数或扫描范围写错了。Fe3O4 晶胞 8.396 Å,扩成 2×2 后周期应该是 16.792 Å。扫描范围如果不是该值的整数倍,图像边缘就会出现截断伪影,让人误以为周期异常。
5.4 HAADF 里看不到氧原子柱
这个不是 bug,是物理。HAADF 用高角散射信号,强度对原子序数高度敏感,O 的 Z 只有 8,散射太弱,淹没在背景里很正常。想看氧原子柱,改用 ABF 探测器重新生成一张图即可。ABF 图像中氧柱通常呈现暗点,Fe 柱呈现亮点,两者衬度方向相反,这是非常经典的判据。
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 程序秒退 | 路径或格式问题 | 先跑自带 example,再逐字段对照 |
| 输出文件很小 | 计算失败 | 检查 atom 坐标和 multislice 参数 |
| 图像全黑 | 显示范围或探测器角度问题 | 百分位拉伸;检查内外角 |
| 图像全白 | 探测器设置过宽 | 缩小外角或增大内角 |
| 周期不对 | 超胞或扫描范围错误 | 核对晶格常数和扫描尺寸 |
| HAADF 看不到 O | 轻元素散射弱 | 改用 ABF 探测器 |
6. 个人经验和小结
跑了这么多轮 Fe3O4 模拟,我最大的体会是:模拟不是“参数一次到位”的过程,而是一个不断和实验对照、修正的循环。第一次出图只要能看到周期排列的原子柱,就算成功了一大半;剩下的事情,无非是微调源尺寸、探测器角度和厚度,让模拟图慢慢逼近实验结果。
还有一个小技巧:每一次参数修改都记录在输入文件的注释里,尤其是 accelerator voltage、Cs、detector 角度这些关键量。模拟跑到后面,经常会出现“这张图是在哪组参数下跑的”这种问题,没有记录就只能重跑。QSTEM 的文本输入文件其实非常适合写注释,利用好这一点,会帮你在项目后续省下大量时间。
如果你已经成功拿到第一张 Fe3O4 的 HAADF 模拟图,下一步可以试试:换 [110] 晶带轴看原子排布变化,或者做一个 5~40 nm 的厚度系列,观察通道效应的演化,再进一步用 ABF 同时观察氧原子柱。每多做一步,对成像物理和结构分析的理解都会深一层。