
简介SASfit是一款面向小角度散射研究领域的开源软件能够对散射数据进行深入分析与建模适用于物理、材料、化学等学科的科研人员。它可计算回转半径、散射不变量、Porod常数等整体结构参数并支持多种形状因子和结构因子下的尺寸分布拟合内置的全局拟合算法还能用一组通用参数同时处理多条散射曲线在对比变化实验或极化中子测量中尤为实用。该资源包共包含208个文件压缩后约54.19MB以tbl数据表、so动态库、h头文件、gpf/def配置文件及rgb/csv色图文件为主同时提供pdf/txt文档和BibTeX引用条目兼顾运行库与使用参考。已有1609人下载学习。借助其中附带的示例数据、分组定义文件及用户指南入口读者可以较快掌握SASfit的操作逻辑建立从数据导入、模型配置到结果导出的完整工作流并为科研论文规范引用提供便利。 我做过一阵子小角中子散射和X射线散射的数据分析最常被问到的问题就是仪器测出来的是一条 I(q) 曲线我怎么能从里面拿到颗粒半径、形状、分散度这些实空间信息我的回答通常是先把曲线看一遍然后打开 SASfit。SASfit 是一套用于小角度散射数据分析的开源程序只要你手里的数据是强度随散射矢量 q 变化的一维曲线它就能通过结构模型拟合帮你把散射数据翻译成结构参数。它常年被用在小角X射线散射SAXS、小角中子散射SANS以及部分超小角散射数据处理里适合分析胶体、纳米颗粒、高分子溶液、生物大分子、多孔材料、合金析出相等体系。无论你是同步辐射和反应堆机时的用户还是实验室小角散射仪的使用者只要涉及结构模型的拟合SASfit 都值得放进工具箱。这篇文章不是软件手册的复读而是把我自己从第一次接触 SASfit 到现在积累的经验拆开来讲包括模型库到底该怎么选、参数为什么老跑偏、安装和脚本化怎么省时间以及那些文档里不会明说、但实测中一定会遇到的坑。1. 我从散射实验回来后的第一选择SASfit 在结构拟合里的定位1.1 小角度散射到底在测什么小角度散射的原理概括起来就是用一束波长为埃量级的射线照射样品探测器记录下接近透射束方向上的散射强度。散射矢量 q 的大小决定我们观察的空间尺度关系大致是 d 2π / q。q 的范围到零点几或几个 1/nm 时对应的实空间尺度大概是几纳米到几百纳米正好覆盖纳米颗粒、胶束、聚合物链段这些结构。但探测器上收集到的只是一个二维或积分为一维的强度曲线不是直接的结构图像。要从这条 I(q) 曲线反推颗粒尺寸、形状、相互作用就得靠模型拟合先假设一种结构模型计算出理论散射强度再反复调整模型参数让理论曲线尽可能接近实验曲线。SASfit 做的就是这件事。我第一次用 SASfit 是为了处理一批嵌段共聚物胶束的 SANS 数据。当时机时很紧张数据量又大我需要一个能快速切换不同形状模型、同时能处理多分散性的工具。SASfit 让我从繁杂的模型推导里解放出来把精力集中在判断拟合结果是否合理上。1.2 什么时候需要 SSA 结构模型拟合而不是直接看数据散射数据的初级处理通常是 Guinier 分析也就是在很小 q 范围内对 ln I(q) 对 q² 做线性拟合得到回转半径 Rg。这个思路适合单分散体系也是快速判断样品尺度的方法。但真正要得到形状信息、核壳结构、尺寸分布Guinier 就不够了。SASfit 的定位就是结构模型拟合。你给它 q 和 I(q)它根据你选择的形状因子、结构因子、尺寸分布函数算出模型散射曲线然后通过非线性最小二乘等算法迭代优化参数。和 Sheer 分析不一样的是模型拟合能同时利用整条曲线的信息低 q 部分约束尺寸高 q 部分约束界面和精细结构。当然SASfit 也不是万能的。如果样品复杂到需要从头算形状或者需要做刚体建模我通常会转到 ATSAS 或 SasView 去处理。SASfit 的强项是基于解析模型的参数化拟合它尤其擅长那些模型相对明确、参数有明确物理意义的体系。2. 模型库里的门道形状因子、结构因子、多分散性怎么搭配2.1 形状因子不是随便选一个就完事SASfit 内置的模型非常多从几何体到高分子链、从分形聚集到表面分形基本覆盖了常见散射体系。实际使用时大部分人会从几类最常用的模型开始均匀球体最简单的起点常用于乳胶微球、二氧化硅颗粒。核壳球胶束、核壳纳米粒子、脂质体。椭球、圆柱体、圆盘各向异性颗粒。柔性聚合物链高分子溶液常用 Debye 函数或蠕虫链模型。分形聚集体纳米颗粒团聚体、有序介孔材料。层状、双分子层结构磷脂膜、层状凝胶。我的建议是先画 log-log 图看曲线形状。如果高 q 区有明显振荡说明体系接近单分散的规则几何体如果曲线高 q 区平滑下降多分散度大概率不小这时候你再用单分散球体去拟合结果一定不理想。2.2 结构因子是浓缩体系里躲不开的角色很多初学者只拟合形状因子忽略结构因子结果在低 q 区拟合很差。原因很简单当颗粒浓度较高时颗粒与颗粒之间会产生空间相关导致在某个 q 位置出现相互作用峰或者低 q 强度被压制。SASfit 里常见的结构因子包括硬球排斥、Sticky hard sphere、Screened Coulomb 等。判断是否需要在拟合中引入结构因子不要只看体积分数。体积分数超过 5% 的体系很多情况下就必须考虑结构因子了。一种快速判断方法是看低 q 区强度如果低 q 区出现了明显的“平台”或峰而不是随 q 降低单调升高这通常意味着体系里有相互作用。形状因子和结构因子在拟合时存在耦合尤其是体积分数和形状参数可能产生相关性。我处理这类问题时会先把高 q 区数据单独拟合尽量把形状参数确定下来再固定形状参数量只拟合结构因子最后放开所有参数一起精修。这个顺序比一上来就全参数放开要稳定得多。2.3 多分散性和分辨率效应让模型更真实的关键真实样品不是完全单分散的SASfit 允许用尺寸分布函数描述颗粒大小的分散情况常见的有 Schulz-Zimm 分布、对数正态分布、Gaussian 分布。多分散性对散射曲线影响非常大哪怕尺寸分布只有 10%高 q 区的振荡也会明显被抹平。实验仪器本身也有分辨率效应包括波长展宽、入射光发散、探测器像素合并等。对于实验室光源的 SAXS 仪器或者飞行时间 SANS 谱仪这类效应不能忽略。SASfit 里提供了分辨率函数的选项算理论模型时会把仪器分辨率卷积进去实际拟合结果往往比纯模型曲线好很多。我在给一个课题组做数据审核时见过他们用单分散核壳球拟合二氧化硅纳米粒子拟合曲线在振荡区域和实验数据始终对不上。后来把多分散性打开用对数正态分布同时加上分辨率卷积残差一下降了一个数量级。这个案例后来也成了我讲座里的常用例子。3. 从导入数据到收敛我常用的 SASfit 拟合流程与参数设置3.1 数据准备和背景扣除最容易被低估的一步SASfit 支持 ASCII 文本格式的数据文件一般至少包括三列q、I(q)、误差。很多用户直接导入两列数据就开跑误差列缺失会让拟合统计变得不可靠建议在数据准备阶段就把误差列补齐。实验数据的背景扣除要做在前面而不是在软件里随便加一个常数背景就去拟合。虽然 SASfit 也允许在模型里包含背景参数但这个背景应该是散射背景不是样品吸收或空样品散射造成的系统偏差。我会在导入数据后先检查整条曲线是否是干净的散射曲线低 q 区是不是有异常上扬高 q 区是否被探测器噪声淹没。最好在拟合前就确定 q 范围。低 q 端要避开束流遮挡造成的尖锐伪影高 q 端要避开溶剂散射占主导的区域。具体截断值没有唯一标准我会用残差来反馈选择是否合适。3.2 初始值和参数边界拟合能否收敛的胜负手模型拟合本质上是非线性优化初始值给不好程序很容易陷入局部极小。SASfit 的 GUI 里可以手动调节参数这比盲写初始值好得多。我的习惯是先用 Guinier 拟合得到 Rg 的粗略值作为球体模型半径的初始猜测。对核壳结构先从简单球体拟合再用简单球体拟合得到的半径作为核半径壳层厚度先给一个比核半径小一个量级的初始值。对比度参数散射长度密度差在 SAXS 中通常和化学组成相关可以先根据成分粗略估算不需要特别精确。SASfit 允许为每个参数设置上下限。我强烈建议给主要结构参数设置物理合理的边界尤其是直径、厚度这类不可能为负的量。这样不仅避免优化器跑到奇怪区域还能在结果明显落在边界上时提醒你模型设置有问题。3.3 收敛后怎么看结果残差和不确定度都要看拟合完成后我先看残差曲线而不是只盯着 Reduced Chi-square 值。残差如果在某个 q 区间有系统的波动说明模型在物理上没完全描述这个尺度的结构即使卡方值也能接受也不能急着下结论。SASfit 对拟合参数会给出估计的不确定度。这个不确定度来自协方差矩阵前提是模型残差满足近似的正态分布。如果你的数据误差列估算得过小参数不确定度会被严重低估。我在报告中会明确标注参数的不确定度是“统计不确定度”不包含系统误差。拟合多组分体系时我会尽量用两组分的模型分步拟合先拟合高 q 区得到小颗粒或颗粒内部结构参数然后固定这一部分的参数再拟合低 q 区的聚集体或大尺度结构。SASfit 的全局拟合支持多组数据同时拟合这个功能对同一系列浓度的样品特别有用例如一组不同浓度的胶体样品你可以共享形状参数只让结构因子相关参数自由变化。4. 拟合跑偏的几个经典原因我在 SASfit 里踩过和看过的坑4.1 高 q 区强行用球体拟合振荡消失不是好事常见情况是一个样品看起来像球但拟合曲线和实验数据在高 q 区对不上。这时候有的人会把 q 范围缩小到只拟合低 q 区结果得到一个“漂亮”的拟合但参数毫无意义。高 q 区的散射强度下降规律反映的是界面和形状的精细结构如果实验数据在高 q 区没有振荡通常是多分散性、分辨率效应、或者是颗粒并非完美球体共同导致的结果。正确的处理方式是先把多分散性和分辨率参数打开如果依然对不上就要考虑核壳结构、椭球或者表面粗糙度模型。4.2 背景参数吃掉结构信号SASfit 允许在模型里加一个常数背景作为拟合参数这个是给那些无法完全扣除的平坦背景用的。但如果把低 q 区域的上升误认为背景背景参数会优化到一个很大的数把真实散射信号掩盖掉。我处理过一组数据用户加了背景参数之后拟合近乎完美后来分析发现背景参数贡献了约一半的低 q 强度。把背景参数固定为实验实测的背景值后拟合结果完全变了。如果你对背景值有独立估计比如直接用溶剂样品测得的散射水平就要先把背景固定住。4.3 参数高度相关同时拟合相关的参数结果不可靠在核壳球模型里壳层厚度和壳层的散射长度密度之间往往存在强相关。因为中子散射和 X 射线散射对壳层部分的贡献主要由壳层体积乘散射长度密度差决定如果你同时优化壳层厚度和壳层 SLD优化器很容易让这两个参数一起增大或一起减小。遇到这种情况我会在第一次拟合时固定一个参数比如固定壳层 SLD只拟合厚度和核半径然后在合理范围内调整固定的 SLD再看结果是否稳定。SASfit 的模型里有些参数会以“比例”或者“增量”出现这需要看清帮助文档中每个参数的定义不要只看名字想当然。4.4 忽略分辨率函数和滑移校正对于 SANS 和部分实验室 SAXS仪器的波长分辨率和几何准直对曲线的平滑作用不可忽略。特别是在高 q 区如果不做分辨率卷积拟合出的粒径分布可能会偏宽甚至出现假的双峰分布。SASfit 其实提供了分辨率卷积和滑移校正的选项只是不少用户因为嫌麻烦没有启用。我在对比实验数据和模型曲线时高 q 区总是对不上后来打开分辨率卷积同样的模型和参数拟合优度立马提升。建议无论你用什么软件做拟合都先了解一下仪器分辨率参数如何导入这是省时间最重要的一步。5. 安装、命令行与脚本化把 SASfit 从交互式工具变成流水线5.1 安装方式与开源许可比我预想中简单SASfit 支持主流系统包括 Windows、macOS 和 Linux。官方发布的二进制安装包基本是解压即用不需要复杂的依赖管理。Linux 上如果遇到缺少共享库的问题通常需要补装一些科学计算相关的依赖包例如 libgfortran 等。源代码也在开源仓库里有编译经验的可以自己构建。它是开源软件这意味着你可以查看模型的实现细节确认某个模型到底是怎么定义的。对于发表论文而言这一点尤其重要因为你不希望从黑箱中获取一个无法解释的参数。开源也意味着社区会持续维护新模型、新功能会逐步被加入。5.2 命令行模式批量处理多个样品的关键如果你一次实验采集了几十甚至上百条曲线一个一个在 GUI 里打开、设置参数、点拟合效率很低。SASfit 提供了命令行接口你可以通过配置文件或者参数文件直接调用拟合过程。这样我就可以写一个循环脚本对一组数据文件逐一执行拟合最后把结果汇总到 CSV 文件里。在 Linux 下这类批处理非常顺手。配合 Shell 脚本或者 Python 的 subprocess 模块你能实现一整套自动化流程读取数据、调用 SASfit 拟合、解析结果、生成报告。这个能力对经常处理大量样品的用户来说是真正的效率提升点。5.3 脚本化的备选方案SASfit 的 R 包和 Python 接口如果你主要用 R 做数据分析SASfit 也有相应的 R 包支持在 R 环境中调用 SASfit 模型进行拟合。我自己之前习惯用 R 处理统计绘图所以用过一阵子 R 包版 SASfit它让数据可视化、批量拟合和参数统计可以在同一个环境里完成。如果你的主力语言是 Python也可以自行调用 SASfit 的命令行程序来拟合或者用拟合库解析结果。虽然没有官方 Python 接口但命令行模式配合 subprocess 调用已经足够满足大部分需求。需要注意命令行输入的参数文件格式要和安装版本匹配版本升级后最好重新确认一下格式说明。5.4 获取帮助和贡献代码别一个人硬扛遇到模型细节不清楚时SASfit 的官方文档是首选里面对于每个模型都有详细的公式说明和适用范围。在线讨论区和开源仓库的 issue 区也是很好的资源。大部分维护者都很欢迎用户在使用中发现的问题反馈。如果你在使用过程中发现某个模型不适合某种数据甚至自己改造了一个更好的参数化方式可以考虑把改进贡献回社区。开源的生态就是这样每个人贡献一点经验对后来者都会有很大帮助。我会在论文和数据分析报告里注明使用的是哪个版本的 SASfit以及关键的拟合参数这既是学术诚信的要求也方便其他人复现结果。最后再分享一个我做拟合时的习惯不管用什么模型我都会把初始参数、边界、拟合结果和残差图都记录在一个分析笔记里。这样当拟合结果不对劲时我能回溯是哪一步设置出了问题。SASfit 因为开源很多细节都透明可查只要你愿意花一点时间做实验记录和版本管理用它做数据拟合是可以非常放心的。本文还有配套的精品资源点击获取