В этом репозитории содержатся коды для нашей статьи «Сквозной дизайн полноатомных антител».
Существует 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 и скомпилируйте необходимые компоненты в соответствии с его инструкциями. После этого измените переменную DOCKQ_DIR
в configs.py
чтобы она указывала на каталог, содержащий проект 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_structures со следующей иерархией:
├── all_structures
│ ├── chothia
│ ├── imgt
│ ├── raw
Каждая подпапка содержит файлы PDB, перенумерованные по соответствующей схеме. В статье мы используем IMGT, поэтому нас интересует подпапка imgt.
Поскольку файлы pdb сложны в обработке, обычно люди создают сводный файл для структурной базы данных, в котором записывается основная информация о каждой структуре для быстрого доступа. Мы предоставили сводку набора данных, полученного 12 ноября 2022 г. ( 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 | полный_дизайн.json | Спроектируйте всю переменную область, включая область фреймворка. |
Данные
Чтобы предварительно обработать необработанные данные, нам нужно сначала сгенерировать сводные данные для каждого теста в формате json, затем разделить наборы данных на наборы обучения/проверки/тестирования и, наконец, преобразовать данные pdb в объекты Python. Мы предоставили сценарий для всех этих процедур в scripts/data_preprocess.sh
. Предположим, что данные PDB с перенумерацией IMGT расположены в 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
Обычно процедура обучения занимает около 7 часов на двух графических процессорах GeForce RTX 2080 Ti. Мы также предоставили обученную контрольную точку в 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
Обычно процедура обучения занимает около 8 часов на двух графических процессорах GeForce RTX 2080 Ti. Мы также предоставили обученную контрольную точку в 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 вывода и демонстрационные версии in silico для распространенных приложений в реальных задачах, которые расположены в файлах ./api
и ./demos
.
Мы предоставляем API проектирования и API оптимизации в ./api
, которые можно легко интегрировать в коды Python.
API дизайна ( ./api/design.py
) можно использовать для создания CDR с учетом последовательностей каркасной области, файла PDB антигена, а также определений эпитопа. Мы воспользуемся интересным сценарием, чтобы проиллюстрировать использование API дизайна .
Мы хотим создать антитело, сочетающееся с открытым состоянием члена 1 подсемейства катионных каналов временного рецепторного потенциала V (TRPV1), который играет решающую роль в острой и постоянной боли. Вместо того, чтобы вручную создавать эпитоп TRPV1, мы пытаемся имитировать существующее связующее вещество, которое представляет собой токсин с двойным узлом (DkTx). Поэтому нам необходимо сначала извлечь определение эпитопа путем анализа характера связывания токсина, а затем разработать антитело с заданными последовательностями каркасных областей.
1. Извлеките определение эпитопа
Мы предоставляем PDB-файл комплекса члена 1 подсемейства катионных каналов переходного рецепторного потенциала подсемейства V (TRPV1, цепь ABCD) и токсина с двойным узлом (DkTx, цепь EF) в ./demos/data/7l2m.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
Последний шаг — проектирование CDR с помощью API проектирования :
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 обычно используется для отбора связывающихся мутантов из библиотек антител. Здесь мы реализуем версию in silico с API проектирования , генерируя и фильтруя кандидатов из существующего набора данных по антигену с определением эпитопа. Кроме того, нам нужен показатель, позволяющий оценить, насколько хорошо созданное антитело связывается с мишенью. Здесь мы используем 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
в результате будет получено 30 кандидатов, близость которых предсказана FoldX.
Благодарим Вас за интерес к нашей работе!
Пожалуйста, не стесняйтесь задавать любые вопросы об алгоритмах, кодах, а также проблемах, возникающих при их запуске, чтобы мы могли сделать это понятнее и лучше. Вы можете либо создать проблему в репозитории GitHub, либо связаться с нами по адресу [email protected].
Файлы ниже заимствованы из существующих репозиториев:
evaluation/TMscore.cpp
: https://zhanggroup.org/TM-score/evaluation/ddg
: https://github.com/HeliXonProtein/binding-ddg-predictor