FreeSASA: 开源 SASA 计算库,pip 一条命令替代 NACCESS

你算溶剂可及表面积(SASA)还在用要注册的闭源 NACCESS 吗?这篇给你 FreeSASA------MIT 协议开源 C 库,pip 一条命令装好,CLI + Python API 双接口,L&R 与 S&R 两种算法互差仅 0.1%,毫秒级出数。附三条安装路线、逐残基暴露排名 Python 示例(真实输出)、4 条实测踩坑、与 NACCESS/DSSP/PyMOL 等选型对比表,照抄代码 5 分钟接进你的脚本。

关键字:FreeSASA;SASA;溶剂可及表面积;NACCESS;Python API;结构生物学;pip 安装;残基暴露

相关教程与核心文献

资源 链接 与本文关系
官方文档站 FreeSASA 安装 + CLI 用法的权威来源
GitHub 仓库 GitHub - mittinatten/freesasa: C-library for calculating Solvent Accessible Surface Areas · GitHub 源码、issue、release(205★,实测 2026-09)
C API 文档 (Doxygen) FreeSASA: FreeSASA 需要 C 集成时看
论文 Mitternacht S. F1000Research 2016, 5:189, DOI 10.12688/f1000research.7931.1 算法与精度验证的原始出处(Crossref 已核)

一、痛点:算个表面积,为什么没有一个顺手的小工具

做结构分析的人对 SASA(solvent accessible surface area,溶剂可及表面积)的需求非常日常:

  • 判断某个残基到底埋在蛋白核心还是暴露在表面(突变设计前必看);
  • 算配体结合前后被"埋起来"的界面面积(评估结合合理性);
  • 比较 MD 轨迹里不同帧的紧凑程度(折叠/解折叠监控);
  • 估算疏水效应------非极性表面暴露于水在能量上非常不利,疏水面积最小化是蛋白折叠的核心驱动力。

但看看现有选项:NACCESS 是最常用的命令行实现(L&R 算法的 Fortran 版),学术免费但闭源且要邮件申请 ;DSSP 主要算二级结构,SASA 只是顺带输出;PyMOL 的 get_area 藏在 GUI 里不好批量;MDAnalysis 倒是能算,但为一个表面积分析拉起整个框架太重。FreeSASA 填的就是这个空:一个只做一件事、开源、能轻松嵌进任何工具链的独立库

二、SASA 是什么:滚球探针与两种经典算法

想象一个半径 1.4 Å 的小球(代表一个水分子),让它贴着蛋白表面滚一圈------球心划过的轨迹围成的面积,就是这个分子的 SASA

精确计算这个曲面很贵,所以有两个经典近似,FreeSASA 都实现了:

算法 提出 思路 FreeSASA 里的调法
Lee & Richards (L&R) 1971 沿 z 轴把分子切成一组薄片,用每片轮廓线近似表面 默认算法,slices 控制每原子切片数(默认 20)
Shrake & Rupley (S&R) 1973 在每个原子球面上撒一组测试点,统计未被邻居遮挡的点 algorithm='ShrakeRupley'n-points 控制点数(默认 100)

论文(F1000Research 2016)用双原子体系解析解 + 两种算法互相对照 + 与 NACCESS 同参数对比三条路线验证了实现正确性:同分辨率同半径下 L&R 结果与 NACCESS 完全一致。半径默认用 Tsai 等的 ProtOr 参数集(覆盖 20 种标准氨基酸 + Sec/Pyl + 标准核苷酸),不在表内的元素回退到 Mantina 等的范德华半径,也允许用户给自定义配置文件。

性能上,论文报告单核速度与 NACCESS 相当甚至更快,且核心循环已并行化------我下面的实测也印证了"快"这一点。

三、安装:三条路线,pip 一条最快

路线 1:pip(推荐,Python 用户)

复制代码
pip install freesasa

PyPI 当前版本 2.2.1 (MIT 协议,27 个 release,实测 2026-09)。我实测在无编译器障碍的机器上 12 秒装完(自动拉源码编 C 扩展,纯标准 C 库无第三方依赖)。

路线 2:conda(推荐,管环境的人)

复制代码
conda install -c conda-forge freesasa

conda-forge 提供 Linux(amd64/arm64/ppc64le)预编译包,适合放进项目 environment.yml。

路线 3:源码(需要 CLI 或 C 集成)

复制代码
# 下载 release 压缩包解压后
./configure
make
sudo make install

装好得到 freesasa 命令行二进制、freesasa.h 头文件和 libfreesasa 库。从 git 仓库直接拉的话先跑 autoreconf -i 生成 configure。macOS/Linux 还可以 brew install brewsci/bio/freesasa

四、Python API 实战:30 行代码跑出残基暴露排名

拿一个 289 残基的蛋白(某 GPCR 跨膜结构域,2387 原子)做端到端演示------以下输出全部真实跑通(freesasa 2.2.1):

复制代码
import freesasa

struct = freesasa.Structure("protein.pdb")
result = freesasa.calc(struct)                # 默认 L&R
print("Total SASA: %.2f A^2" % result.totalArea())
# Total SASA: 16627.92 A^2

# 极性/非极性分类面积
cls = freesasa.classifyResults(result, struct)
print(cls)   # {'Polar': 5101.1, 'Apolar': 11526.8}

# 换 S&R 算法对比一下
res2 = freesasa.calc(struct,
        freesasa.Parameters({'algorithm': 'ShrakeRupley', 'n-points': 100}))
print(res2.totalArea())   # 16645.44 ------ 与 L&R 只差 0.1%

# 逐残基面积:找最暴露 / 最埋的残基
ra = result.residueAreas()
for chain_id, residues in ra.items():
    items = sorted(((k, v.total) for k, v in residues.items()),
                   key=lambda x: -x[1])
    print(chain_id, "top exposed:", items[:3])
    print(chain_id, "top buried: ", items[-3:])
# R top exposed: [('170', 205.7), ('257', 184.5), ...]
# R top buried:  [('399', 0.0), ('403', 0.0), ...]

两个算法在真实蛋白上只差 0.1%,而 S&R(100 测试点)单次计算 0.009 秒------2387 原子的蛋白基本就是"秒出"。非极性面积占 69%(11,527/16,628 Ų),符合一个跨膜结构域大量疏水表面接触脂质的预期。

这个逐残基排名就是突变设计的第一步:area ≈ 0 的残基在核心,动它大概率影响折叠;area > 150 Ų 的在表面,是改造溶解度/免疫原性的候选位点。

五、CLI 实战:不想写代码也能用

官方示例用 RNA/蛋白复合物 3WBM(4 条蛋白链 + 2 条 RNA 链):

复制代码
freesasa 3wbm.pdb

输出自带参数回显 + 总量 + 分链明细:

复制代码
## FreeSASA 2.1.0 ##
PARAMETERS
algorithm    : Lee & Richards
probe-radius : 1.400
threads      : 2
slices       : 20
INPUT
source  : 3wbm.pdb
chains  : ABCDXY
atoms   : 3714
RESULTS (A^2)
Total   :   25190.77
Apolar  :   11552.38
Polar   :   13638.39
CHAIN A :    3785.49
...

mmCIF 输入加 --cif 即可,输出完全一致。CLI 适合接 shell 流水线批量过 PDB 库;要逐残基/逐原子粒度或自定义分类,还是回 Python API。

六、踩坑记录(全部实测)

  1. freesasa.__version__ 不存在 ------想确认版本别摸这个属性,用标准做法:from importlib.metadata import version; version('freesasa')'2.2.1'
  2. Python API 没有 totalAreaByClass() ------文档里极性/非极性分类在 Python 侧叫 freesasa.classifyResults(result, struct),返回 dict。我第一次按 C API 的习惯找方法名直接 AttributeError。
  3. residueAreas() 的键是 PDB 里的真实 chain ID ------我拿的蛋白链 ID 是 R,写死 ra['A'] 直接 KeyError。先 list(ra.keys()) 看一眼再取值。
  4. 默认忽略 HETATM 和氢原子 ------要算配体/辅基/结晶水的 SASA,建 Structure 时显式打开(如 freesasa.Structure(pdb, options={'hetatm': True}));否则你算半天发现配体根本没进去。水分子、乙酰基/NH₂ 封端这三类 HETATM 有内置 ProtOr 半径,其余回退范德华半径。
  5. 许可证已变更 ------2016 年论文写的是 GPL-3,但当前 GitHub 仓库(2.x)已是 MIT(实测 2026-09)。商用集成不再有 copyleft 顾虑,以仓库 LICENSE 为准。

七、同类工具怎么选

工具 协议 接口 适合场景
FreeSASA MIT CLI + C + Python 批量/流水线、脚本集成、自定义半径------首选
NACCESS 闭源(学术免费需申请) 仅 CLI 审稿人点名要"经典口径"时
DSSP 开源 仅 CLI 反正要算二级结构,顺带取 SASA
PyMOL get_area 开源 GUI/Python 交互式看单个结构
MDAnalysis GPL Python 已经在做 MD 轨迹分析,顺带算
cpptraj surf GPL CLI AMBER 轨迹流程内

一句话:单结构或 PDB 库批量 → FreeSASA;MD 轨迹内 → 用你已在用的分析框架

结语

FreeSASA 是那种"装完就忘了它存在"的好工具:依赖只有标准 C 库、12 秒装好、两种经典算法结果互差 0.1%、单核毫秒级出数。它解决的不是什么高精尖问题,而是把"算个表面积"这件高频小事从"申请闭源软件 + 手工解析输出"变成"pip install + 三行 Python"。下次再做突变位点筛选或界面埋藏面积评估,先试它。

参考来源

  1. Mitternacht S. FreeSASA: An open source C library for solvent accessible surface area calculations. F1000Research 2016, 5:189. DOI: 10.12688/f1000research.7931.1
  2. FreeSASA 官方文档:FreeSASA
  3. GitHub 仓库(MIT, 205★):GitHub - mittinatten/freesasa: C-library for calculating Solvent Accessible Surface Areas · GitHub
  4. PyPI 页面(2.2.1):freesasa · PyPI
  5. Tsai J 等. J Mol Biol 1999(ProtOr 半径集);Mantina M 等. J Phys Chem A 2009(范德华半径)
相关推荐
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
冬奇Lab2 小时前
一天一个开源项目(第217篇):free-for-dev —— 137k Star 的开发者免费服务终极宝库
开源·资讯
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Logic1015 小时前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和
SL_staff5 小时前
制造业私有化文档平台的技术实践:从知识孤岛到可追溯知识资产
java·spring·开源
T型码农要学习5 小时前
开源项目12|Miniflux:自建RSS订阅阅读器,摆脱算法信息流,实现纯净阅读自由
开源
SL_staff6 小时前
3天上线OKR系统:一名HR与1名工程师如何用JVS完成全栈交付
java·低代码·开源
dong_junshuai6 小时前
每天一个开源项目#99 OpenResearch:2.2K星的本地研究Agent工作台
开源·github·agent
Logic1016 小时前
C语言/数据结构字符串题解:找出DNA序列中未配对的独特序列——排序+遍历(O(nlogn))
c语言·数据结构·字符串·数组·排序·时间复杂度·算法题