該存儲庫包含我們的論文“端到端全原子抗體設計”的程式碼。
有 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