调用 AlphaFold Python API 做蛋白质结构预测:从序列到三维结构的完整实操
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
AlphaFold 把蛋白质氨基酸序列转成三维结构,是蛋白质结构预测里最常被调用的开源实现。本文用它的 Python API 走一遍完整流程:备料、推理、验货。你会碰到三个真正干活的对象——DataPipeline负责把序列喂成模型能吃的特征,RunModel负责吐出原子坐标,AmberRelaxation负责把坐标捋顺并写成 PDB。下面按真实工作流走一遍,代码量很小,能直接跑。
一条序列是怎么变成三维结构的
在动手之前,先有张地图,避免一会儿写代码写晕。整个链路其实就四段:你手里一条氨基酸序列,先去数据库里搜出一大堆"远房亲戚"(同家族的已知序列)做参考,这一步叫 MSA(多序列比对),再顺便找几个长得像的已知结构当模板;然后把这些信息打包成一个特征字典交给神经网络做推理;推理出来的是原子坐标,但还带一点"模型毛刺",最后用分子力场松弛一下,落成标准 PDB。
理解了这条链,下面四段代码各自对应哪个环节就一目了然了。
环境怎么搭、数据库怎么准备
跑通预测前,先得有代码和模型参数。代码从仓库克隆下来,装上 Python 依赖并把它作为包安装;模型参数单独放一个目录,之后用路径指过去即可。
git clone https://gitcode.com/GitHub_Trending/al/alphafold alphafold pip install -r alphafold/requirements.txt pip install -e alphafold数据库是另一个大头。它决定 MSA 搜得有多全,scripts/download_all_data.sh能一键拉全,但完整体积约 2.2TB,日常开发没必要。更现实的做法是只下 UniRef90、MGnify、BFD、PDB70、PDB mmCIF 这几块,路径约定好、能对上DataPipeline的参数就行。参数文件用scripts/download_alphafold_params.sh单独拉,缺了它后面会直接报"文件找不到"。
先用数据管道给模型备料
DataPipeline是备料的主力,你只需把每个工具的二进制路径、每套数据库的路径告诉它,它就会自己跑 jackhmmer、hhblits、hhsearch 这些比对程序。这里的"为什么"是:模型自己不读原始序列,它读的是 MSA 和模板拼出来的特征,所以这一步的质量直接决定预测上限。
from alphafold.data import pipeline, templates from alphafold.data.tools import hhsearch data_pipeline = pipeline.DataPipeline( jackhmmer_binary_path="/usr/bin/jackhmmer", hhblits_binary_path="/usr/bin/hhblits", uniref90_database_path=f"{data_dir}/uniref90/uniref90.fasta", mgnify_database_path=f"{data_dir}/mgnify/mgy_clusters_2022_05.fasta", bfd_database_path=f"{data_dir}/bfd/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt", uniref30_database_path=f"{data_dir}/uniref30/UniRef30_2021_03", template_searcher=hhsearch.HHSearch( binary_path="/usr/bin/hhsearch", databases=[f"{data_dir}/pdb70/pdb70"]), template_featurizer=templates.HhsearchHitFeaturizer( mmcif_dir=f"{data_dir}/pdb_mmcif/mmcif_files", max_template_date="2021-12-01", max_hits=20, kalign_binary_path="/usr/bin/kalign"), use_small_bfd=False, ) feature_dict = data_pipeline.process("input.fasta", "msa_output")跑完process,feature_dict里就有 MSA、模板、序列三类特征了。msa_output目录会被它用来缓存比对结果,后面复跑同一序列能省时间。
让 RunModel 出坐标
备料完成后,把特征喂给RunModel。它内部先process_features把 NumPy 特征字典规整成模型形状,再predict出结果字典。之所以先做process_features再predict,是因为这两步用的随机种子可以分开控制,方便你复现同一次预测。
from alphafold.model import model, config, data model_name = "model_1" model_config = config.model_config(model_name) model_params = data.get_model_haiku_params(model_name=model_name, data_dir=data_dir) model_runner = model.RunModel(model_config, model_params) processed = model_runner.process_features(feature_dict, random_seed=42) result = model_runner.predict(processed, random_seed=42)result是个字典,拿到手后先看这几个键:structure_module里是原子坐标(final_atom_positions),predicted_lddt是逐残基的置信度 logits,predicted_aligned_error是对齐误差的 logits,另外代码会自动帮你算好现成的plddt和predicted_aligned_error数组,读结果时直接用现成的更省事。
松弛并落成 PDB
模型吐出的坐标还带着"毛刺",AmberRelaxation用分子力场把它捋顺并补上氢原子,再交给protein.to_pdb落盘。注意 B 因子用 pLDDT 填进去,这样在可视化工具里颜色就能反映置信度。
from alphafold.common import protein, residue_constants from alphafold.relax import relax import numpy as np plddt = result["plddt"] b_factors = np.repeat(plddt[:, None], residue_constants.atom_type_num, axis=-1) unrelaxed = protein.from_prediction( features=processed, result=result, b_factors=b_factors, remove_leading_feature_dimension=False, ) amber_relaxer = relax.AmberRelaxation( max_iterations=0, tolerance=2.39, stiffness=10.0, exclude_residues=[], max_outer_iterations=3, use_gpu=True, ) relaxed_pdb, _, _ = amber_relaxer.process(prot=unrelaxed) open("predicted.pdb", "w").write(relaxed_pdb)use_gpu=True时松弛会明显更快;如果结构里有比较刁钻的残基,把max_outer_iterations调大一点,能覆盖到更多需要反复修的情况。
怎么读懂 pLDDT 和 PAE
这两个数别混着看,它们回答的是两个不同的问题。
pLDDT 是"每个残基靠不靠谱"。打个比方,它像老师给每个单词打的置信分:90 以上的区域,模型很确定它摆在这儿,坐标基本能信;50 到 70 之间,骨架大方向对但细节晃;低于 50 的多是无序区,模型干脆没把握。读结构时,先看这条曲线,低分的尾巴通常不用纠结。
PAE 是"任意两个残基之间的相对位置有多稳"。它是一张二维矩阵,你可以把它想成"谁和谁挨着是确定的":如果两块在序列上离得很远,但它们在矩阵里对应的格子误差很小,说明这两块在空间里确实是稳定挨在一起的——对找结合界面、看结构域相对取向特别有用。
想看 PAE 矩阵,把现成的误差数组画出来就行:
from alphafold.common import confidence import matplotlib.pyplot as plt pae = confidence.compute_predicted_aligned_error( logits=result["predicted_aligned_error"]["logits"], breaks=result["predicted_aligned_error"]["breaks"]) plt.figure(figsize=(8, 8)) plt.imshow(pae["predicted_aligned_error"], cmap="viridis") plt.colorbar(label="PAE (Å)") plt.title("Predicted Aligned Error") plt.show()逐残基的 pLDDT 也可以直接用confidence.compute_plddt(result["predicted_lddt"]["logits"])从 logits 算出来,再存成 JSON 随结构一起走。
踩坑速查
- 显存 / 内存不够:
use_small_bfd=True换小数据库,或把 MSA 上限调小;超长序列考虑切片预测。 - 数据库体积吓人:完整下载约 2.2TB(见
scripts/download_all_data.sh),开发测试只下用到的几块即可。 - 不想每次重搜 MSA:给
DataPipeline传use_precomputed_msas=True,命中msa_output里已有文件就直接读,不再跑比对。 get_model_haiku_params报文件找不到:参数没下,先跑scripts/download_alphafold_params.sh,再确认data_dir指向对。RunModel慢得离谱:多半是 JAX 没识别到 GPU,确认 CUDA 配置正确。- 极端结构松弛不干净:把
max_outer_iterations调大,让力场多修几轮。
接下来可以看什么
上面这条单体链路通了之后,很多事就是换参数的活:跑多链复合物把数据管道换成pipeline_multimer.DataPipeline、模型名改成model_1_multimer,其余结构基本一样,细节可看 alphafold/data/pipeline_multimer.py。想要更完整的可运行示例,notebooks/AlphaFold.ipynb 里有带可视化的全流程;想抠模型内部机制,去读 docs/technical_note_v2.3.0.md 和 run_alphafold.py 的组装方式。数据库怎么下、下到哪儿,对照 scripts/download_all_data.sh 一路点过去就行。
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考