该存储库包含我们的论文“端到端全原子抗体设计”的代码。
有 3 个必需和 1 个可选的先决条件:设置 conda 环境(必需)、获取评分器(必需)、准备抗体 pdb 数据(必需)和下载基线(可选)。
1. 环境
我们提供了env.yml
,只需运行以下命令即可创建运行时 conda 环境:
conda env create -f env.yml
2. 得分手
请先准备TMscore和DockQ的评分器,如下:
评估TMscore的源代码位于evaluation/TMscore.cpp
。请通过以下方式编译:
g++ -static -O3 -ffast-math -lm -o evaluation/TMscore evaluation/TMscore.cpp
要准备 DockQ 评分器,请克隆其官方 github 并根据其说明编译先决条件。之后,请修改configs.py
中的DOCKQ_DIR
变量以指向包含DockQ项目的目录(例如./DockQ)。
lDDT 评分器位于 conda 环境中,并且
3.PDB数据
请从SAbDab下载页面下载所有抗体结构数据。请进入网页左侧的“下载”选项卡,下载结构体的压缩zip文件,然后解压:
wget https://opig.stats.ox.ac.uk/webapps/newsabdab/sabdab/archive/all/ -O all_structures.zip
unzip all_structures.zip
您应该获得一个名为all_structs的文件夹,其层次结构如下:
├── all_structures
│ ├── chothia
│ ├── imgt
│ ├── raw
每个子文件夹包含使用相应方案重新编号的 pdb 文件。我们在论文中使用IMGT,因此imgt子文件夹是我们关心的。
由于pdb文件处理起来很繁重,通常人们会为结构数据库生成一个摘要文件,其中记录了每个结构的基本信息,以便快速访问。我们提供了 2022 年 11 月 12 日检索到的数据集的摘要 ( summaries/sabdab_summary.tsv
)。由于数据集每周更新一次,如果您想使用最新版本,请从官方网站下载。
(可选)4. 基线
如果您对管道基线感兴趣,包括以下项目并根据您的需求集成它们的依赖项:
添加完这些项目后,还请记得修改./configs.py
中相应的路径。我们还在./scripts/pipeline_inference.sh
中提供了用于级联模块的脚本。
github 发布页面上提供了每个任务的经过训练的检查点。要使用它们,请下载您感兴趣的并将它们保存到文件夹./checkpoints
中。我们提供检查点的名称、训练配置(在./scripts/train/configs
下)和描述,如下所示:
检查站 | 配置 | 描述 |
---|---|---|
cdrh3_design.ckpt | single_cdr_design.json | 表位结合 CDR-H3 设计 |
struct_prediction.ckpt | struct_prediction.json | 复杂结构预测 |
affinity_opt.ckpt 和 ddg_predictor.ckp | single_cdr_opt.json | CDR-H3 的亲和力优化 |
multi_cdr_design.ckpt | multi_cdr_design.json | 同时设计所有 6 个 CDR |
multi_cdr_opt.ckpt 和 multi_cdr_ddg_predictor | multi_cdr_opt.json | 同时优化所有 6 个 CDR 的亲和力 |
full_design.ckpt | full_design.json | 设计整个可变域,包括框架区域 |
数据
为了预处理原始数据,我们需要首先为每个基准生成 json 格式的摘要,然后将数据集拆分为训练/验证/测试集,最后将 pdb 数据转换为 python 对象。我们在scripts/data_preprocess.sh
中提供了所有这些过程的脚本。假设 IMGT 重新编号的 pdb 数据位于all_structures/imgt/
,并且您希望将处理后的数据(~5G)存储在all_data
,您可以简单地运行:
bash scripts/data_preprocess.sh all_structures/imgt all_data
处理 SAbDab、RAbD、Igfold 测试集和 SKEMPI V2.0 大约需要 1 小时。在此过程中看到报告错误是正常的,因为某些抗体结构注释错误或格式错误,这些结构将在数据清理阶段被丢弃。
(可选)保守模板
我们在./data/template.json
中提供了来自 SAbDab 的保守模板。如果您对提取过程感兴趣,还可以通过运行以下命令从指定数据集(例如 CDR-H3 设计任务的训练集)中提取保守模板:
python -m data.framework_templates
--dataset ./all_data/RAbD/train.json
--out ./data/new_template.json
我们使用 SAbDab 进行训练,使用 RAbD 进行测试。请首先修改scripts/train/configs/cdr_design.json
中的设置(数据集和其他超参数的路径),然后运行以下命令进行训练:
GPU=0,1 bash scripts/train/train.sh scripts/train/configs/single_cdr_design.json
通常,在 2 个 GeForce RTX 2080 Ti GPU 上,训练过程大约需要 7 小时。我们还在checkpoints/cdrh3_design.ckpt
提供了经过训练的检查点。然后请修改scripts/test/test.sh
中测试集的路径,并运行以下命令进行测试:
GPU=0 bash scripts/test/test.sh ./checkpoints/cdrh3_design.ckpt ./all_data/RAbD/test.json ./results
这会将生成的结果保存到./results
。
我们使用 SAbDab 进行训练,使用 IgFold 进行测试。训练和测试过程与CDR-H3设计类似。修改前面提到的scripts/train/configs/cdr_design.json
和scripts/test/test.sh
中的设置后,请运行以下命令进行训练:
GPU=0,1 bash scripts/train/train.sh scripts/train/configs/struct_prediction.json
通常,在 2 个 GeForce RTX 2080 Ti GPU 上,训练过程大约需要 8 小时。我们还在checkpoints/struct_prediction.ckpt
提供了经过训练的检查点。然后请运行以下命令进行测试:
GPU=0 bash scripts/test/test.sh ./checkpoints/struct_prediction.ckpt ./all_data/IgFold/test.json ./results
我们使用 SAbDab 进行训练,使用 SKEMPI V2.0 中的抗体进行测试。同样,请首先修改scripts/train/configs/affinity_opt.json
、 scripts/test/optimize_test.sh
以及scripts/train/train_predictor.sh
中的设置。然后请进行 dyMEANOpt 的训练(~ 5h):
GPU=0,1 bash scripts/train/train.sh scripts/train/configs/single_cdr_opt.json
然后我们需要在生成的复合体的表示上训练 ddg 的预测器(约 40 分钟):
GPU=0 bash scripts/train/train_predictor.sh checkpoints/cdrh3_opt.ckpt
我们在checkpoints/cdrh3_opt.ckpt
和checkpoints/cdrh3_ddg_predictor.ckpt
提供了经过训练的检查点。优化测试可以通过以下方式进行:
GPU=0 bash scripts/test/optimize_test.sh checkpoints/cdrh3_opt.ckpt checkpoints/cdrh3_ddg_predictor.ckpt ./all_data/SKEMPI/test.json 0 50
这将进行 50 步梯度搜索,且不限制改变残基的最大数量(将 0 更改为任意数字以限制残基的上限)
我们还为现实世界问题中的常见应用程序提供推理 API 和计算机演示,这些演示位于./api
和./demos
中。
我们在./api
中提供了设计API 和优化API,可以轻松集成到 python 代码中。
设计API ( ./api/design.py
) 可用于根据框架区序列、抗原的 PDB 文件以及表位定义生成 CDR。我们将使用一个有趣的场景来说明设计API的用法。
我们想要设计一种与瞬时受体电位阳离子通道亚家族 V 成员 1 (TRPV1) 开放状态相结合的抗体,该抗体在急性和持续性疼痛中发挥着关键作用。我们尝试模仿现有的双结毒素 (DkTx) 结合剂,而不是手工制作 TRPV1 上的表位。因此,我们需要首先通过分析毒素的结合模式提取表位定义,然后设计具有给定框架区序列的抗体。
1. 提取表位定义
我们在./demos/data/7l2m.pdb
中提供了瞬时受体电位阳离子通道亚家族 V 成员 1(TRPV1,链 ABCD)和双结毒素(DkTx,链 EF)复合物的 PDB 文件。原始PDB有4个对称单元,因此我们手动将中间的两个毒素(链EF)分开,形成4个对称链e,f,E,F。每种抗体只需要关注一个单位。这里我们选择链E作为例子。
我们通过分析 E 链与 TRPV1 的结合界面来生成表位定义:
python -m api.binding_interface
--pdb ./demos/data/7l2m.pdb
--receptor A B C D
--ligand E
--out ./demos/data/E_epitope.json
现在表位定义(即结合界面上TRPV1的残基)被保存到./demos/data/E_epitope.json
。通过将参数“配体”的值更改为 e、f 和 F,我们可以获得其他单元的表位定义(不要忘记也修改输出路径)。
2. 获取框架区域的序列
根据设计抗体的最终目的,可能需要具有不同理化特性的框架区。由于这里我们只提供一个概念验证案例,因此我们从现有数据集中随机选取一个:
heavy chain (H): ' QVQLKESGPGLLQPSQTLSLTCTVSGISLSDYGVHWVRQAPGKGLEWMGIIGHAGGTDYNSNLKSRVSISRDTSKSQVFLKLNSLQQEDTAMYFC----------WGQGIQVTVSSA '
light chain (L): ' YTLTQPPLVSVALGQKATITCSGDKLSDVYVHWYQQKAGQAPVLVIYEDNRRPSGIPDHFSGSNSGNMATLTISKAQAGDEADYYCQSWDGTNSAWVFGSGTKVTVLGQ '
原来的CDR-H3被“-”屏蔽。还支持设计多个CDR,稍后将进行说明。
3. 设计CDR
最后一步是使用设计API 设计 CDR:
from api . design import design
ckpt = './checkpoints/cdrh3_design.ckpt'
root_dir = './demos/data'
pdbs = [ os . path . join ( root_dir , '7l2m.pdb' ) for _ in range ( 4 )]
toxin_chains = [ 'E' , 'e' , 'F' , 'f' ]
remove_chains = [ toxin_chains for _ in range ( 4 )]
epitope_defs = [ os . path . join ( root_dir , c + '_epitope.json' ) for c in toxin_chains ]
identifiers = [ f' { c } _antibody' for c in toxin_chains ]
# use '-' for masking amino acids
frameworks = [
(
( 'H' , 'QVQLKESGPGLLQPSQTLSLTCTVSGISLSDYGVHWVRQAPGKGLEWMGIIGHAGGTDYNSNLKSRVSISRDTSKSQVFLKLNSLQQEDTAMYFC----------WGQGIQVTVSSA' ),
( 'L' , 'YTLTQPPLVSVALGQKATITCSGDKLSDVYVHWYQQKAGQAPVLVIYEDNRRPSGIPDHFSGSNSGNMATLTISKAQAGDEADYYCQSWDGTNSAWVFGSGTKVTVLGQ' )
)
for _ in pdbs
] # the first item of each tuple is heavy chain, the second is light chain
design ( ckpt = ckpt , # path to the checkpoint of the trained model
gpu = 0 , # the ID of the GPU to use
pdbs = pdbs , # paths to the PDB file of each antigen (here antigen is all TRPV1)
epitope_defs = epitope_defs , # paths to the epitope definitions
frameworks = frameworks , # the given sequences of the framework regions
out_dir = root_dir , # output directory
identifiers = identifiers , # name of each output antibody
remove_chains = remove_chains , # remove the original ligand
enable_openmm_relax = True , # use openmm to relax the generated structure
auto_detect_cdrs = False ) # manually use '-' to represent CDR residues
这些代码也作为示例添加到./api/design.py
中,因此您可以通过以下方式直接运行它:
python -m api.design
这里我们使用“-”手动标记CDR-H3,但您也可以设置auto_detect_cdrs=True
,让IMGT编号系统自动决定CDR。要设计的 CDR 类型将从给定的检查点自动导出。目前API支持重新设计单个或多个CDR,以及设计完整的抗体(通过传递"-" * length
作为输入)。
启用 Openmmrelax 会大大减慢生成过程,但会纠正键长和角度以符合物理约束。
优化API ( ./api/optimize.py
) 非常简单。我们以优化./demos/data/1nca.pdb
为例:
from api . optimize import optimize , ComplexSummary
ckpt = './checkpoints/cdrh3_opt.ckpt'
predictor_ckpt = './checkpoints/cdrh3_ddg_predictor.ckpt'
root_dir = './demos/data/1nca_opt'
summary = ComplexSummary (
pdb = './demos/data/1nca.pdb' ,
heavy_chain = 'H' ,
light_chain = 'L' ,
antigen_chains = [ 'N' ]
)
optimize (
ckpt = ckpt , # path to the checkpoint of the trained model
predictor_ckpt = predictor_ckpt , # path to the checkpoint of the trained ddG predictor
gpu = 0 , # the ID of the GPU to use
cplx_summary = summary , # summary of the complex as well as its PDB file
num_residue_changes = [ 1 , 2 , 3 , 4 , 5 ], # generate 5 samples, changing at most 1, 2, 3, 4, and 5 residues, respectively
out_dir = root_dir , # output directory
batch_size = 16 , # batch size
num_workers = 4 , # number of workers to use
optimize_steps = 50 # number of steps for gradient desend
)
此示例的代码也添加到./api/optimize.py
中,因此您可以通过以下方式直接运行它们:
python -m api.optimize
然后你会得到以下结果:
├── demos/data/1nca_opt
│ ├── 1nca_0_1.pdb
│ ├── 1nca_1_2.pdb
│ ├── 1nca_2_3.pdb
│ ├── 1nca_3_4.pdb
│ ├── 1nca_4_5.pdb
│ ├── 1nca_original.pdb
其中1nca_original.pdb
是原始复合体, 1nca_a_b.pdb
表示
复杂结构预测API ( ./api/structure_prediction.py
) 可预测给定抗原、重链和轻链序列以及表位定义的复杂结构。全球对接仍然非常具有挑战性,因此我们将范围缩小到感兴趣的表位。我们以预测./demos/data/1nca.pdb
为例:
from api . structure_prediction import structure_prediction
ckpt = './checkpoints/struct_prediction.ckpt'
root_dir = './demos/data'
n_sample = 10 # sample 10 conformations
pdbs = [ os . path . join ( root_dir , '1nca_antigen.pdb' ) for _ in range ( n_sample )]
epitope_defs = [ os . path . join ( root_dir , '1nca_epitope.json' ) for _ in range ( n_sample )]
identifiers = [ f'1nca_model_ { i } ' for i in range ( n_sample )]
seqs = [
(
( 'H' , 'QIQLVQSGPELKKPGETVKISCKASGYTFTNYGMNWVKQAPGKGLKWMGWINTNTGEPTYGEEFKGRFAFSLETSASTANLQINNLKNEDTATFFCARGEDNFGSLSDYWGQGTTVTVSS' ),
( 'L' , 'DIVMTQSPKFMSTSVGDRVTITCKASQDVSTAVVWYQQKPGQSPKLLIYWASTRHIGVPDRFAGSGSGTDYTLTISSVQAEDLALYYCQQHYSPPWTFGGGTKLEIK' )
)
for _ in pdbs
] # the first item of each tuple is heavy chain, the second is light chain
structure_prediction (
ckpt = ckpt , # path to the checkpoint of the trained model
gpu = 0 , # the ID of the GPU to use
pdbs = pdbs , # paths to the PDB file of each antigen (here antigen is all TRPV1)
epitope_defs = epitope_defs , # paths to the epitope definitions
seqs = seqs , # the given sequences of the framework regions
out_dir = root_dir , # output directory
identifiers = identifiers , # name of each output antibody
enable_openmm_relax = True ) # use openmm to relax the generated structure
此示例的代码也添加到./api/structure_prediction.py
中,因此您可以通过以下方式直接运行它们:
python -m api.structure_prediction
然后你会得到以下结果:
├── demos/data
│ ├── 1nca_model_0.pdb
│ ├── 1nca_model_1.pdb
│ ├── 1nca_model_2.pdb
│ ├── ...
其中总共应该有 10 个采样构象。请注意,如果根据 IMGT 编号系统,前几个或最后几个残基超出可变域,则可能会在结果中丢弃它们。
体外展示通常用于从抗体库中选择结合突变体。在这里,我们通过设计API 生成并过滤现有数据集中针对具有表位定义的抗原的候选者,从而实现了计算机版本。此外,我们需要一个指标来评估生成的抗体与靶标的结合程度。这里我们使用FoldX作为亲和力预测器,所以要运行这个demo,您可能需要首先从官方网站下载它并相应修改./configs.py
中的路径。我们仍然使用上一节中的TRPV1示例,并使用RAbD基准作为提供框架区域的抗体库:
python -m demos.display
--ckpt checkpoints/multi_cdr_design.ckpt
--pdb demos/data/7l2m.pdb
--epitope_def demos/data/E_epitope.json
--library ./all_data/rabd_all.json
--n_sample 30
--save_dir demos/display
--gpu 0
这将产生 30 个候选者,其亲和力由 FoldX 预测。
感谢您对我们工作的兴趣!
关于算法、代码以及运行过程中遇到的问题,请随时提出,以便我们能够更清晰、更好地解答。您可以在 github 存储库中创建问题,也可以通过 [email protected] 联系我们。
以下文件是从现有存储库借用的:
evaluation/TMscore.cpp
evaluation/ddg