このリポジトリには、論文「End-to-End Full-Atom Antibody Design」のコードが含まれています。
conda 環境のセットアップ (必須)、スコアラーの取得 (必須)、抗体 pdb データの準備 (必須)、ベースラインのダウンロード (オプション) という 3 つの必須前提条件と 1 つのオプションの前提条件があります。
1. 環境
以下を実行するだけでランタイム conda 環境を作成できるenv.yml
が提供されています。
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のダウンロードページからダウンロードしてください。 Web ページの左側にある[ダウンロード]タブに入り、構造のアーカイブされた 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 | マルチ_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 時間かかります。一部の抗体構造には誤って注釈が付けられているか、誤った形式があり、データ クリーニング フェーズで除外されるため、このプロセスでエラーが報告されるのは通常のことです。
(オプション) 保存されたテンプレート
SAbDab の保存されたテンプレートを./data/template.json
に提供しました。抽出プロセスに興味がある場合は、次のコマンドを実行して、指定したデータセット (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 のトレーニングを実施してください (約 5 時間)。
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) の開放状態に結合する抗体を設計したいと考えています。 TRPV1 上のエピトープを手作りする代わりに、ダブルノット毒素 (DkTx) である既存のバインダーを模倣しようとします。したがって、最初に毒素の結合パターンを分析してエピトープの定義を抽出し、次にフレームワーク領域の所定の配列を備えた抗体を設計する必要があります。
1. エピトープ定義の抽出
一過性受容体電位カチオンチャネルサブファミリー V メンバー 1 (TRPV1、鎖 ABCD) とダブルノット毒素 (DkTx、鎖 EF) の複合体の PDB ファイルを./demos/data/7l2m.pdb
で提供します。元の PDB には 4 つの対称ユニットがあるため、中央の 2 つの毒素 (チェーン EF) を手動で分割して、4 つの対称チェーン e、f、E、F を形成します。各抗体は 1 つのユニットのみに焦点を当てる必要があります。ここでは例としてチェーン E を選択します。
TRPV1 への鎖 E の結合界面を分析することにより、エピトープ定義を生成します。
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. フレームワーク領域のシーケンスを取得する
抗体設計の最終目的に応じて、異なる物理化学的特性を持つフレームワーク領域が必要になる場合があります。ここでは概念実証のケースのみを提供しているため、既存のデータセットからランダムに 1 つを選択します。
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
渡すことによる) をサポートしています。
Openmm Relax を有効にすると、生成プロセスが大幅に遅くなりますが、結合の長さと角度は物理的な制約に合わせて修正されます。
最適化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 番号付けシステムに従って可変ドメインの外にある場合、結果では破棄される可能性があることに注意してください。
In vitroディスプレイは、抗体ライブラリーから結合変異体を選択するために一般的に使用されます。ここでは、エピトープ定義を含む抗原に対して既存のデータセットから候補を生成およびフィルタリングすることにより、設計API を使用したインシリコバージョンを実装します。さらに、生成された抗体がターゲットにどの程度結合するかを評価するための指標が必要です。ここでは、親和性予測子として FoldX を使用しているため、このデモを実行するには、まず公式 Web サイトから FoldX をダウンロードし、それに応じて./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
これにより、FoldX によって予測された親和性を持つ 30 個の候補が得られます。
私たちの仕事にご興味をお持ちいただきありがとうございます。
アルゴリズム、コード、およびそれらを実行する際に発生する問題についての質問があれば、よりわかりやすく改善するためにお気軽にお問い合わせください。 github リポジトリで問題を作成するか、[email protected] までご連絡ください。
以下のファイルは既存のリポジトリから借用したものです。
evaluation/TMscore.cpp
: https://zhanggroup.org/TM-score/evaluation/ddg
: https://github.com/HeliXonProtein/binding-ddg-predictor