第3章 输入数据准备:序列文件格式、多序列比对(MSA)生成、模板检索
数据准备这一步,说白了就是给 AlphaFold 喂 "原材料" 。很多人在调参上花了大量精力,结果出问题才发现是输入数据本身就有坑。我做过好几个项目,最终性能瓶颈都卡在 MSA 质量上,而不是模型参数。所以这一章我们把这部分搞清楚。
3.1 序列文件格式——AlphaFold 的入场券
AlphaFold 支持的序列格式就那么几种,但用不对照样跑不起来。
FASTA 格式
最常用的格式,简单到没朋友。一行 >header,接着是序列正文。我个人习惯把 header 写得简短一些,不要夹带特殊符号。AlphaFold 在解析 header 时偶尔会卡住,特别是里面混了中文或空格的时候。
>sp|P00533|EGFR_HUMAN
MRPSGTAGAALLALLAALCPASRALEEKKVCQGTSNKLTQLGTFEDHFLSLQRMFNNCEVVLGNLEITYVQRNYDLSFLKTIQEVAGYVLIALNTVERIPLENLQIIRGNMYYENSYALAVLSNYDANKTGLKELPMRNLQEILHGAVRFSNNPALCNVESIQWRDIVSSDFLSNMSMDFQNHLGSCQKCDPSCPNGSCWGAGEENCQKLTKIICAQQCSGRCRGKSPSDCCHNCAAGCTGPRESDCLVCRKFRDEATCKDTCPPLMLYNPTTYQMDVNPEGKYSFGATCVKKCPRNYVVTDHGSCVRACGADSYEMEEDGVRKCKKCEGPCRKVCNGIGIGEFKDSLSINATNIKHFKNCTSISGDLHILPVAFRGDSFTHTPPLDPQELDILKTVKEITGFLLIQAWPENRTDLHAFENLEIIRGRTKQHGQFSLAVVGLNITSLGLRSLKEISDGDVIISGNKNLCYANTINWKKLFGTSGQKTKIISNRGENSCKATGQVCHALCSPEGCWGPEPRDCVSCRNVSRGRECVDKCNLLEGEPREFVENSECIQCHPECLPQAMNITCTGRGPDNCIQCAHYIDGPHCVKTCPAGVMGENNTLVWKYADAGHVCHLCHPNCTYGCTGPGLEGCPTNGPKIPSIATGMVGALLLLLVVALGIGLFM
set() 扫一下字符集,避免意外。
A3M 与 STO 格式
这两种格式主要用于存储多序列比对结果。A3M 是 HHblits 的默认输出,带插入状态信息;STO(Stockholm)格式则更通用,Jackhmmer 和 HMMER 家族都用它。
我遇到过不少人直接把 FASTA 塞进模型,结果报错。记住:AlphaFold 的 MSA 模块只吃 A3M 和 STO,不做自动转换。
| 格式 | 扩展名 | 适用场景 | 备注 |
|---|---|---|---|
| FASTA | .fa / .fasta | 输入查询序列 | 最通用,header 要干净 |
| A3M | .a3m | HHblits 产出 | 带插入状态,文件较小 |
| STO | .sto | Jackhmmer 产出 | 完整保留比对信息 |
| mmCIF | .cif | 模板结构文件 | PDB 的现代替代格式 |
3.2 MSA 生成——从单序列到进化信息
AlphaFold 之所以准,很大程度上靠 MSA 里隐含的共进化信息。MSA 质量直接决定预测精度,这个环节值得花功夫。
核心原则: 宁可多跑几分钟,也要拿到足够深、足够多样化的 MSA。浅 MSA 是造成预测置信度虚高的头号元凶。
HHblits vs Jackhmmer
AlphaFold 官方 pipeline 里用了两种工具:HHblits 跑快速 HMM-HMM 比对,Jackhmmer 做迭代式 profile 搜索。它们各有侧重。
| 工具 | 搜索算法 | 数据库 | 速度 | 灵敏度 |
|---|---|---|---|---|
| HHblits | HMM-HMM | UniClust30 / BFD | 快(分钟级) | 中等 |
| Jackhmmer | Profile HMM | UniRef90 / MGnify | 慢(小时级) | 高(尤其远端同源) |
我一般先用 HHblits 快速跑一轮,拿到基础 MSA。如果目标蛋白是孤儿序列(family 里没几个同源物),再补一轮 Jackhmmer 深搜。为什么?因为 HHblits 对远端同源物的召回率有限,而 Jackhmmer 的迭代机制能挖得更深——代价是时间翻好几倍。
关键参数调优
以下是 HHblits 和 Jackhmmer 里我最常调的几个参数:
- -E / --eval:E-value 阈值,控制结果筛选的严格程度。我习惯设
1e-10,如果 MSA 太浅会放宽到1e-5。 - -N / --num-iterations:Jackhmmer 的迭代次数。默认 3 次,我至少开到 5 次,有时甚至 8 次。
- --maxseq:最大序列数。AlphaFold 官方默认 5120,但我遇到过内存爆炸的情况,建议根据你的 GPU 显存适当降低。
- -diff / --diff:HHblits 的过滤阈值,控制 MSA 的多样性。默认 0.0 不过滤,我常设
0.5去掉高冗余序列。
# HHblits 快速搜索示例
hhblits -i query.fasta -d uniclust30/uniclust30_2018_08 -oa3m query.a3m -E 1e-10 -n 3 -maxseq 5120
# Jackhmmer 深搜示例
jackhmmer --noali --notextw --tblout query.tbl -N 5 -E 1e-10 query.fasta uniref90.fasta
--tblout 后加 --noali 避免输出对齐部分,或者跑完后用 sed 清洗一下。
3.3 模板检索——给结构找"参考书"
模板检索的目标是从 PDB 里找出与目标序列相似的结构,作为 AlphaFold 的初始坐标参考。模型会从模板里"借鉴"合理的折叠方式。
检索流程
官方 pipeline 用 HHSearch 在 pdb70 或 pdb_seqres 数据库里搜。核心是两步:
- 序列搜索: 用 HMM 或 profile 在 PDB 库里找同源结构。
- 结构映射: 把匹配的 PDB 结构转换成 mmCIF 格式,提取坐标信息。
我遇到过模板检索完全没结果的情况——比如目标蛋白是一个全新折叠,PDB 里没有相似结构。这时 AlphaFold 会退化成"无模板"模式,纯靠 MSA 推断。预测精度会下降,但不一定崩,特别是对于小蛋白。
参数设置建议
| 参数 | 作用 | 我的常用值 |
|---|---|---|
--max_template_date | 限定模板的最新日期,防止数据泄露 | 比目标蛋白的发布日晚 1 年 |
--template_cutoff | 模板相似度阈值 | 0.5(宽松)/ 0.9(严格) |
--pdb70_database | PDB70 数据库路径 | 指向本地下载好的 pdb70 文件夹 |
# HHSearch 模板检索命令示例
hhsearch -i query.a3m -d pdb70/pdb70 -o query.hhr -p 80 -Z 1000 -loc -realign -maxmem 8
--max_template_date 限制只搜最近几年的 PDB 结构,减少搜索空间。我在做早期探索时经常用这个办法,一天能多跑好几个蛋白。
3.4 数据准备全流程——把它们串起来
下面这张图展示了从一条 FASTA 序列到模型输入特征的完整数据流。我自己画项目流程图时也用这个框架,帮团队快速定位数据准备的瓶颈。
从图里可以看得很清楚:所有数据最终汇集成模型输入特征。任何一个上游环节出问题,都会影响最终预测。我总结了一个简单的检查清单,每次跑新蛋白前过一遍:
- ☐ 序列格式 — header 无特殊符号,序列全大写。
- ☐ MSA 深度 — 至少 200 条有效序列,太少要检查数据库或放宽 E-value。
- ☐ 模板数量 — 至少 1 个模板,0 模板时标注预警。
- ☐ 文件路径 — A3M、STO、mmCIF 路径不含中文和空格。
一句总结: 数据准备的功夫花到位,AlphaFold 的调参空间才能真正发挥出来。否则你调来调去,都是在垃圾数据上浪费算力。
rsync 做增量同步,离线搜索又快又稳。
好了,数据准备这部分就讲到这里。你的输入数据已经准备好了,下一步就是实际跑预测和调参了。