使用ESM模型进行蛋白质接触预测教程
2025-07-09 05:09:55作者:秋泉律Samson
概述
本教程将详细介绍如何使用ESM(Evolutionary Scale Modeling)模型进行蛋白质接触预测。ESM是由Facebook Research开发的蛋白质语言模型,能够从蛋白质序列中提取丰富的结构信息。接触预测是蛋白质结构预测中的关键步骤,能够帮助理解蛋白质的三维结构。
环境准备
依赖安装
首先需要安装必要的Python依赖包:
pip install biopython biotite
pip install fair-esm
对于Colab用户,建议安装aria2以加速模型权重下载:
apt-get install aria2
数据下载
需要下载示例MSA(多序列比对)文件,这些文件包含蛋白质序列的进化信息:
# 示例MSA文件
1a3a_1_A.a3m
5ahw_1_A.a3m
1xcr_1_A.a3m
模型权重下载
ESM会自动下载模型权重,但手动下载速度更快:
mkdir -p /root/.cache/torch/hub/checkpoints
aria2c --dir=/root/.cache/torch/hub/checkpoints --continue --split 8 \
https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t33_650M_UR50S.pt
aria2c --dir=/root/.cache/torch/hub/checkpoints --continue --split 8 \
https://dl.fbaipublicfiles.com/fair-esm/regression/esm2_t33_650M_UR50S-contact-regression.pt
核心功能实现
MSA文件处理
def read_sequence(filename: str) -> Tuple[str, str]:
"""读取fasta或MSA文件中的第一个(参考)序列"""
record = next(SeqIO.parse(filename, "fasta"))
return record.description, str(record.seq)
def remove_insertions(sequence: str) -> str:
"""移除序列中的插入字符"""
translation = str.maketrans(dict.fromkeys(string.ascii_lowercase + ".*"))
return sequence.translate(translation)
def read_msa(filename: str) -> List[Tuple[str, str]]:
"""读取MSA文件中的所有序列,自动移除插入字符"""
return [(record.description, remove_insertions(str(record.seq)))
for record in SeqIO.parse(filename, "fasta")]
结构到接触矩阵转换
def contacts_from_pdb(structure: bs.AtomArray,
distance_threshold: float = 8.0,
chain: Optional[str] = None) -> np.ndarray:
"""从PDB结构中计算接触矩阵"""
# 计算Cβ原子坐标
N = structure.coord[mask & (structure.atom_name == "N")]
CA = structure.coord[mask & (structure.atom_name == "CA")]
C = structure.coord[mask & (structure.atom_name == "C")]
Cbeta = extend(C, N, CA, 1.522, 1.927, -2.143)
# 计算距离矩阵并转换为接触矩阵
dist = squareform(pdist(Cbeta))
contacts = (dist < distance_threshold).astype(np.int64)
contacts[np.isnan(dist)] = -1
return contacts
MSA子采样
def greedy_select(msa: List[Tuple[str, str]],
num_seqs: int,
mode: str = "max") -> List[Tuple[str, str]]:
"""贪心算法选择MSA中的代表性序列"""
array = np.array([list(seq) for _, seq in msa], dtype=np.bytes_).view(np.uint8)
indices = [0]
for _ in range(num_seqs - 1):
dist = cdist(array[indices[-1:]], array, "hamming")
new_index = optfunc(np.mean(pairwise_distances, axis=0) + dist)
indices.append(new_index)
return [msa[idx] for idx in indices]
实际应用
- 加载MSA数据:使用
read_msa
函数读取多序列比对文件 - 子采样处理:使用
greedy_select
选择代表性序列 - 模型预测:将处理后的序列输入ESM模型获取接触预测
- 结果可视化:将预测结果与真实结构接触矩阵比较
技术要点
- 接触定义:本教程使用Cβ原子间距离小于8Å作为接触标准
- MSA处理:需要移除插入字符和小写字母(代表非保守区域)
- 高效计算:使用向量化操作加速距离矩阵计算
- 模型选择:ESM提供多种预训练模型,可根据需求选择
通过本教程,读者可以掌握使用ESM模型进行蛋白质接触预测的完整流程,从数据准备到结果分析。这种方法在蛋白质结构预测和功能研究中具有重要应用价值。