Разработка базы данных биоинформатики для исследования дисульфидных связей

Опубликовано: 2022-03-11

База данных биоинформатики Protein Data Bank (PDB) является крупнейшим в мире хранилищем экспериментально определенных структур белков, нуклеиновых кислот и сложных сборок. Все данные собираются с использованием экспериментальных методов, таких как рентген, спектроскопия, кристаллография, ЯМР и т. д.

В этой статье объясняется, как извлекать, фильтровать и очищать данные из PDB. Это, в свою очередь, делает возможным тип анализа, описанный в статье Возникновение дисульфидных связей белков в различных сферах жизни: сравнение белков из банка данных о белках, опубликованного в Protein Engineering, Design and Selection , Volume 27, Issue 3, 1 марта 2014 г., стр. 65–72.

PDB имеет множество повторяющихся структур с разным разрешением, методами, мутациями и т. д. Проведение эксперимента с одинаковыми или похожими белками может привести к систематической ошибке в любом групповом анализе, поэтому нам нужно будет выбрать правильную структуру из любого набора дубликатов. . Для этого нам нужно использовать неизбыточный (NR) набор белков.

В целях нормализации я рекомендую загрузить словарь химических соединений для импорта названий атомов в базу данных, которая использует 3NF или использует схему звезды и многомерное моделирование. (Я также использовал DSSP для устранения проблемных структур. Я не буду рассказывать об этом в этой статье, но учтите, что я не использовал никаких других функций DSSP.)

Данные, использованные в этом исследовании, содержат однокомпонентные белки, которые содержат по крайней мере одну дисульфидную связь, взятую из разных видов. Для проведения анализа все дисульфидные связи сначала классифицируют как последовательные или непоследовательные по домену (архея, прокариот, вирус, эукариот или др.), а также по длине.

Первичная и третичная структуры белков

Первичная и третичная структуры белков до и после укладки белков.
Источник: Protein Engineering, Design and Selection , как упоминалось в начале этой статьи.

Выход

Чтобы быть готовым к вводу в R, SPSS или какой-либо другой инструмент, аналитику необходимо, чтобы данные находились в таблице базы данных со следующей структурой:

Столбец Тип Описание
code character(4) Идентификатор эксперимента (буквенно-цифровой, без учета регистра и не может начинаться с нуля)
title character varying(1000) Название эксперимента, для справки (поле может быть и в текстовом формате)
ss_bonds integer Количество дисульфидных связей в выбранной цепи
ssbonds_overlap integer Количество перекрывающихся дисульфидных связей
intra_count integer Количество связей в одной цепочке
sci_name_src character varying(5000) Научное название организма, из которого взята последовательность
tax_path character varying Путь в дереве классификации Линнея
src_class character varying(20) Класс организмов высшего уровня (эукариоты, прокариоты, вирусы, археи, другие)
has_reactives7 boolean Истина тогда и только тогда, когда последовательность содержит реактивные центры
len_class7 integer Длина последовательности в наборе 7 (набор с p-значением 10e-7, рассчитанным по взрыву)

Материалы и методы

Для достижения этой цели первым шагом является сбор данных с rcsb.org. Этот сайт содержит загружаемые PDB-структуры экспериментов в различных форматах.

Хотя данные хранятся в нескольких форматах, в этом примере будет использоваться только форматированный текстовый формат с разделителями с фиксированным пробелом (PDB). Альтернативой текстовому формату PDB является его XML-версия, PDBML, но иногда он содержит искаженные записи с именами позиций атомов, что может вызвать проблемы при анализе данных. Более старые mmCIF и другие форматы также могут быть доступны, но они не будут объясняться в этой статье.

Формат PDB

Формат PDB представляет собой фрагментированный текстовый формат с фиксированной шириной, который может быть легко проанализирован, например, запросами SQL, подключаемыми модулями Java или модулями Perl. Каждый тип данных в файловом контейнере представлен в виде строки, начинающейся с соответствующего тега — мы рассмотрим каждый тип тега в следующих подразделах. Длина строки меньше или равна 80 символам, где тег занимает шесть или меньше символов плюс один или несколько пробелов, которые вместе занимают восемь байтов. Также бывают случаи без пробелов между тегами и данными, обычно для тегов CONECT .

TITLE

Тег TITLE помечает строку как часть названия эксперимента, содержащую название молекулы и другие важные данные, такие как вставка, мутация или удаление конкретной аминокислоты.

 12345678901234567890123456789012345678901234567890123456789012345678901234567890 TITLE A TWO DISULFIDE DERIVATIVE OF CHARYBDOTOXIN WITH DISULFIDE TITLE 2 13-33 REPLACED BY TWO ALPHA-AMINOBUTYRIC ACIDS, NMR, 30 TITLE 3 STRUCTURES

В случае, когда в записи TITLE имеется несколько строк, заголовок должен быть объединен, упорядочен по номеру продолжения, который размещается, выровненный по правому краю, в байтах 9 и 10 (в зависимости от количества этих строк).

ATOM

Данные, хранящиеся в строках ATOM , представляют собой координатные данные для каждого атома в эксперименте. Иногда в эксперименте есть вставки, мутации, альтернативные места или несколько моделей. Это приводит к многократному повторению одного и того же атома. Выбор правильных атомов будет объяснен позже.

 12345678901234567890123456789012345678901234567890123456789012345678901234567890 ATOM 390 N GLY A 26 -1.120 -2.842 4.624 1.00 0.00 N ATOM 391 CA GLY A 26 -0.334 -2.509 3.469 1.00 0.00 C ATOM 392 C GLY A 26 0.682 -1.548 3.972 1.00 0.00 C ATOM 393 O GLY A 26 0.420 -0.786 4.898 1.00 0.00 O ATOM 394 H GLY A 26 -0.832 -2.438 5.489 1.00 0.00 H ATOM 395 HA2 GLY A 26 0.163 -3.399 3.111 1.00 0.00 H ATOM 396 HA3 GLY A 26 -0.955 -2.006 2.739 1.00 0.00 H

Приведенный выше пример взят из эксперимента 1BAH . Первый столбец отмечает тип записи, а второй столбец — порядковый номер атома. Каждый атом в структуре имеет свой порядковый номер.

Рядом с серийным номером находится метка положения атома, которая занимает четыре байта. Из этого положения атома можно извлечь химический символ элемента, который не всегда присутствует в данных записи в отдельном столбце.

После названия атома идет трехбуквенный код остатка. В случае белков этот остаток соответствует аминокислоте. Далее цепочка кодируется одной буквой. Под цепью мы подразумеваем одиночную цепь аминокислот с разрывами или без них, хотя иногда к цепи можно отнести лиганды; этот случай обнаруживается через очень большие пробелы в аминокислотной последовательности, которая находится в следующем столбце. Иногда ту же структуру можно сканировать с включенными мутациями, и в этом случае код вставки доступен в дополнительном столбце после столбца последовательности. Код вставки содержит букву, помогающую определить, какой остаток затронут.

Следующие три столбца представляют собой пространственные координаты каждого атома, измеренные в ангстремах (Å). Рядом с этими координатами находится столбец занятости, в котором указано, какова вероятность того, что атом находится в этом месте, по обычной шкале от нуля до единицы.

Предпоследний столбец — температурный фактор, несущий информацию о беспорядке в кристалле, измеряемый в Ų. Значение больше 60 Å означает беспорядок, а значение ниже 30 Å означает уверенность. Он не всегда присутствует в файлах PDB, поскольку зависит от экспериментального метода.

Следующие столбцы — символ и заряд — обычно отсутствуют. Химический символ можно получить из столбца положения атома, как мы упоминали выше. Когда заряд присутствует, он добавляется к символу в виде целого числа, за которым следует + или - , например, N1+ .

TER

Это означает конец цепочки. Даже без этой линии легко определить, где заканчивается цепочка. Таким образом, часто линия TER отсутствует.

MODEL и ENDMDL

Строка MODEL отмечает, где начинается модель конструкции, и содержит серийный номер модели.

После всех атомарных строк в этой модели она заканчивается ENDMDL .

SSBOND

Эти линии содержат дисульфидные связи между аминокислотами цистеина. Дисульфидные связи могут присутствовать и в других типах остатков, но в этой статье будут проанализированы только аминокислоты, поэтому включен только цистеин. Следующий пример взят из эксперимента с кодом 132L :

 12345678901234567890123456789012345678901234567890123456789012345678901234567890 SSBOND 1 CYS A 6 CYS A 127 1555 1555 2.01 SSBOND 2 CYS A 30 CYS A 115 1555 1555 2.05 SSBOND 3 CYS A 64 CYS A 80 1555 1555 2.02 SSBOND 4 CYS A 76 CYS A 94 1555 1555 2.02

В этом примере в файле есть четыре дисульфидные связи, помеченные их порядковым номером во втором столбце. Все эти связи используют цистеин (столбцы 3 и 6), и все они присутствуют в цепи A (столбцы 4 и 7). После каждой цепи идет порядковый номер остатка, указывающий положение связи в пептидной цепи. Коды вставки указаны рядом с каждой последовательностью остатков, но в этом примере они отсутствуют, поскольку в этой области не было вставленной аминокислоты. Два столбца перед последним зарезервированы для операций симметрии, а последний столбец представляет собой расстояние между атомами серы, измеренное в Å.

Давайте воспользуемся моментом, чтобы дать некоторый контекст этим данным.

На рисунках ниже, сделанных с помощью программы просмотра NGL rcsb.org, показана структура эксперимента 132L . В частности, они показывают белок без лигандов. На первом изображении используется изображение в виде палочки, а CPK-окраска показывает серу и ее связи желтым цветом. V-образные соединения серы представляют собой метиониновые соединения, тогда как Z-образные соединения представляют собой дисульфидные связи между цистеинами.

Изображение палочки с окраской CPK, показывающей связи дисульфида серы желтым цветом.

На следующем рисунке упрощенный метод визуализации белка, называемый визуализацией остова , показан окрашенным аминокислотами, где цистеины выделены желтым цветом. Он представляет собой тот же белок, но с исключенной боковой цепью и включенной только частью его пептидной группы — в данном случае белкового остова. Он состоит из трех атомов: N-концевого, С-альфа и С-концевого. На этом рисунке не показаны дисульфидные связи, но он упрощен, чтобы показать пространственное расположение белка:

Упрощенный белковый остов, окрашенный аминокислотами, где цистеины окрашены в желтый цвет.

Трубки создаются путем соединения атомов, связанных пептидной связью, с атомом C-альфа. Цвет цистеина такой же, как цвет серы в методе окраски CPK. Когда цистены подходят достаточно близко, их серы создают дисульфидные связи, что укрепляет структуру. В противном случае этот белок слишком сильно связывался бы, и его структура была бы менее стабильной при более высоких температурах.

CONECT

Эти записи используются для обозначения связей между атомами. Иногда этих тегов нет вообще, а иногда все данные заполняются. В случае анализа дисульфидных связей эта часть может быть полезна, но не обязательна. Это связано с тем, что в этом проекте непомеченные связи добавляются путем измерения расстояний, поэтому это будет накладным, и его также необходимо проверять.

SOURCE

Эти записи содержат информацию об исходном организме, из которого была извлечена молекула. Они содержат подзаписи для более удобного поиска в таксономии и имеют ту же многострочную структуру, которую мы видели с записями заголовков.

 SOURCE MOL_ID: 1; SOURCE 2 ORGANISM_SCIENTIFIC: ANOPHELES GAMBIAE; SOURCE 3 ORGANISM_COMMON: AFRICAN MALARIA MOSQUITO; SOURCE 4 ORGANISM_TAXID: 7165; SOURCE 5 GENE: GST1-6; SOURCE 6 EXPRESSION_SYSTEM: ESCHERICHIA COLI; SOURCE 7 EXPRESSION_SYSTEM_TAXID: 562; SOURCE 8 EXPRESSION_SYSTEM_STRAIN: BL21(DE3)PLYSS; SOURCE 9 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID; SOURCE 10 EXPRESSION_SYSTEM_PLASMID: PXAGGST1-6

NR Формат

Это список неизбыточных (NR) цепных наборов PDB. Его снимки можно найти по адресу ftp.ncbi.nih.gov/mmdb/nrtable/. Его цель состоит в том, чтобы избежать ненужных смещений, вызванных сходством белков. NR имеет три набора с разными уровнями p-значения идентичности, созданными путем сравнения всех структур PDB. Результат добавляется в текстовые файлы, которые будут объяснены позже. Не все столбцы нужны для этого проекта, поэтому будут объяснены только важные.

Первые два столбца содержат уникальный код эксперимента PDB и идентификатор цепочки, как описано выше для записей ATOM . Столбцы 6, 9 и C содержат информацию о репрезентативности p-значения, которая представляет собой уровень сходства последовательностей, рассчитанный с помощью BLAST. Если это значение равно нулю, то оно не считается частью набора; если значение равно 1, то да. Упомянутые столбцы представляют принятие наборов с пороговыми значениями p 10e-7, 10e-40 и 10e-80 соответственно. Для анализа будут использоваться только наборы с отсечкой p-значения 10e-7.

Последний столбец содержит информацию о приемлемости структуры, где a приемлемо, а n — нет.

 #--------------------------------------------------------------------------------------------------------------------------- # 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQ #--------------------------------------------------------------------------------------------------------------------------- 3F8V A 69715 1 1 1 1 1 1 1 1 1 9427 1 1 0.00 0.00 0.00 0.00 1.08 1 6 5 164 X a 3DKE X 68132 1 2 0 1 2 0 1 2 0 39139 1 1 0.00 0.00 0.00 0.00 1.25 1 11 7 164 X a 3HH3 A 77317 1 3 0 1 3 0 1 3 0 90 1 0 0.00 0.00 0.00 0.00 1.25 1 5 4 164 X a 3HH5 A 77319 1 4 0 1 4 0 1 4 0 90 2 0 0.00 0.00 0.00 0.00 1.25 1 4 4 164 X a

Создание базы данных и анализ данных

Теперь, когда у нас есть представление о том, с чем мы имеем дело и что нам нужно сделать, давайте начнем.

Загрузка данных

Все данные для этого анализа можно найти по этим трем адресам:

  • ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/
  • ftp.ncbi.nih.gov/mmdb/nrtable/
  • ftp.ncbi.nih.gov/pub/taxonomy/taxdmp.zip

Первые две ссылки содержат список архивов. Следует использовать последний архив каждого из них, чтобы избежать проблем, связанных с недостаточным разрешением или качеством. Третья ссылка содержит непосредственно новейший архив таксономии.

Разбор данных

Обычно разбор файлов PDB выполняется плагинами или модулями на Java, Perl или Python. В случае с этим исследованием я написал пользовательское приложение Perl без использования предварительно написанного модуля разбора PDB. Причина этого в том, что при анализе большого количества данных, по моему опыту, наиболее распространенной проблемой при использовании экспериментальных данных являются ошибки в данных. Иногда встречаются ошибки с координатами, расстояниями, длинами линий, комментариями в местах, где их быть не должно и т.д.

Самый эффективный способ справиться с этим — изначально хранить все в базе данных в виде необработанного текста. Общие синтаксические анализаторы написаны для работы с идеальными данными, которые полностью соответствуют спецификациям. Но на практике данные не идеальны, и это будет объяснено в разделе фильтрации, где вы найдете сценарий импорта Perl.

Создание базы данных

При построении базы данных обратите внимание, что эта база данных предназначена для обработки данных. Позже анализ будет выполнен в SPSS или R. Для наших целей здесь рекомендуется использовать PostgreSQL не ниже версии 8.4.

Структура таблицы напрямую скопирована из загруженных файлов с небольшими изменениями. В этом случае количество записей слишком мало, чтобы тратить время на нормализацию. Как уже упоминалось, эта база данных предназначена только для одноразового использования: эти таблицы не предназначены для обслуживания на веб-сайте — они предназначены только для обработки данных. Как только это будет сделано, их можно удалить или сохранить в качестве дополнительных данных, возможно, для повторения процесса каким-либо другим исследователем.

В этом случае конечным результатом будет одна таблица, которую затем можно экспортировать в файл для использования с каким-либо статистическим инструментом, таким как SPSS или R.

Столы

Извлечение данных из записей ATOM должно быть связано с записями HEADER или TITLE . Иерархия данных поясняется на рисунке ниже.

Естественная иерархия данных о дисульфидных связях, которая привела бы к созданию базы данных в третьей нормальной форме.

Поскольку эта картинка представляет собой упрощенное представление базы данных в третьей нормальной форме (3НФ), для наших целей она содержит слишком много накладных расходов. Причина: чтобы рассчитать расстояние между атомами для обнаружения дисульфидной связи, нам нужно было бы выполнить соединения. В этом случае у нас была бы таблица, дважды соединенная сама с собой, а также дважды соединенная со вторичной и первичной структурой, что является очень медленным процессом. Поскольку не для каждого анализа требуется информация о вторичной структуре, предлагается другая схема на случай, если вам нужно повторно использовать данные или проанализировать большее количество дисульфидных связей:

Более подробная модель схемы базы данных, не использующая вторичные структуры (3NF).

Дисульфидные связи встречаются не так часто, как другие ковалентные связи, поэтому складская модель не нужна, хотя ее можно использовать. Приведенная ниже схема «звезда» и многомерное моделирование потребуют слишком много времени для разработки и сделают запросы более сложными:

Компоновка базы данных с использованием схемы «звезда» и многомерного моделирования

В тех случаях, когда необходимо обработать все облигации, я рекомендую схему «звезда».

(В противном случае это не нужно, потому что дисульфидные связи не так распространены, как другие связи. В случае этой работы количество дисульфидных связей составляет около 30 000, что может быть достаточно быстро в 3NF, но я решил обработать его через ненормализованная таблица, поэтому она здесь не изображена.)

Ожидаемое общее количество всех ковалентных связей как минимум вдвое превышает количество атомов в третичной структуре, и в этом случае 3NF будет очень медленным, поэтому необходима денормализация с использованием формы схемы звезды. В этой схеме некоторые таблицы имеют две проверки внешнего ключа, и это потому, что связь создается между двумя атомами, поэтому каждый атом должен иметь свой собственный primary_structure_id , atom_name_id и residue_id .

Есть два способа заполнить таблицу измерения d_atom_name : из данных и из другого источника, словаря химических компонентов, о котором я упоминал ранее. Его формат аналогичен формату PDB: полезны только строки RESIDUE и CONECT . Это связано с тем, что первый столбец RESIDUE содержит трехбуквенный код остатка, а CONECT содержит имя атома и его соединений, которые также являются именами атомов. Таким образом, из этого файла мы можем проанализировать все имена атомов и включить их в нашу базу данных, хотя я рекомендую вам допустить, что база данных может содержать имена атомов, не включенные в список.

 RESIDUE PRO 17 CONECT N 3 CA CD H CONECT CA 4 NC CB HA CONECT C 3 CA O OXT CONECT O 1 C CONECT CB 4 CA CG HB2 HB3 CONECT CG 4 CB CD HG2 HG3 CONECT CD 4 N CG HD2 HD3 CONECT OXT 2 C HXT CONECT H 1 N CONECT HA 1 CA CONECT HB2 1 CB CONECT HB3 1 CB CONECT HG2 1 CG CONECT HG3 1 CG CONECT HD2 1 CD CONECT HD3 1 CD CONECT HXT 1 OXT END HET PRO 17 HETNAM PRO PROLINE FORMUL PRO C5 H9 N1 O2

В этом проекте скорость кодирования важнее, чем скорость выполнения и потребление памяти. Я решил не нормализовать — ведь наша цель — сгенерировать таблицу со столбцами, упомянутыми во вступлении.

В этой части будут объяснены только самые важные таблицы.

Основные таблицы:

  • proteins : Таблица с названиями экспериментов и кодами.
  • ps : Таблица первичной структуры, которая будет содержать sequence , chain_id и code .
  • ts : Таблица, содержащая третичную/четвертичную структуру, извлеченную из необработанных данных и преобразованную в формат записи ATOM . Он будет использоваться в качестве промежуточной таблицы и может быть удален после извлечения. Лиганды исключены.
  • sources : список организмов, из которых были получены экспериментальные данные.
  • tax_names , taxonomy_path , taxonomy_paths : линнеевские имена таксономии из базы данных таксономии NCBI, используемые для получения путей таксономии из организмов, перечисленных в sources .
  • nr : Список неизбыточных белков NCBI, извлеченных из набора NR.
  • pdb_ssbond : Список дисульфидных связей в данном файле PDB.

Фильтрация и обработка данных

Данные извлекаются из моментальных снимков из репозитория RCSB PDB.

Каждый файл импортируется в одну таблицу raw_pdb в нашей базе данных PostgreSQL с помощью скрипта Perl. Скрипт использует транзакции по 10 000 вставок на блок.

Структура raw_pdb такова:

Столбец Тип Модификаторы
код переменный характер(20) не ноль
номер_строки целое число не ноль
line_cont переменный характер(80) не ноль

Скрипт импорта выглядит так:

 #!/usr/bin/perl -w use FindBin '$Bin'; use DBI; $dbName = 'bioinf'; $dbLogin = 'ezop'; $dbPass = 'XYZ'; $conn = DBI->connect("DBI:Pg:database=$dbName;host=localhost", "$dbLogin", "$dbPass", {'RaiseError' => 1, 'AutoCommit' => 0}); die "./pdb_lines_unos.pl <table> <file>" if not defined($ARGV[0]); $recordCount = 0; $table = $ARGV[0]; $fName = $ARGV[1]; open F, "zcat $fName|"; while (<F>) { chomp; $linija = $_; $recordCount += 1; $sql = "insert into $table (code, line_num, line_cont) values (?, ?, ?)"; $conn->do($sql, undef, $fName, $recordCount, $linija); $conn->commit() if ($recordCount%10000 == 0); } close F; $conn->commit(); 1;

После того, как строки импортированы, они анализируются с использованием функций, которые мы определим ниже.

Из данных raw_pdb мы генерируем таблицы ts , ps , proteins , sources , sources_organela и ss_bond , анализируя соответствующие записи.

В таблице ps есть три важных столбца: chain , length и sequence . Белковая последовательность создается с использованием атомов C-альфа для каждой цепи и для каждого остатка, упорядоченного по последовательности остатков, принимая только первую вставку и первое альтернативное положение. chain берется из столбца TS.chain , а length — это просто предварительно рассчитанная длина строки sequence . Поскольку эта статья предназначена для анализа только одиночных цепей и внутрицепочечных соединений, в нашем анализе здесь не учитываются многоцепочечные белки.

В записях SSBOND все дисульфидные связи хранятся в таблице pdb_ssbond , которая наследуется от таблицы pdb_ssbond_extended . pdb_ssbond выглядит так:

Столбец Тип Обнуляемый По умолчанию Описание
я бы целое число не ноль nextval('pdb_ssbond_id_seq'::regclass)
код персонаж(4) четырехбуквенный код
ser_num целое число серийный номер ссбонд
остаток1 персонаж(3) первый остаток в залоге
chain_id1 персонаж(1) первая цепочка в связке
res_seq1 целое число порядковый номер первого остатка
i_code1 персонаж(1) код вставки первого остатка
остаток2 персонаж(3) второй остаток в залоге
chain_id2 персонаж(1) вторая цепочка в связке
res_seq2 целое число порядковый номер второго остатка
i_code2 персонаж(1) код вставки второго остатка
символ1 персонаж(6) первый оператор симметрии
sym2 персонаж(6) второй оператор симметрии
расстояние числовой(5,2) расстояние между атомами
is_reactive логический не ноль ложный отметка реактивности (устанавливается)
is_consecutive логический не ноль истинный отметка для последовательных облигаций (будет установлена)
реп7 логический не ноль ложный отметка для структур set-7 (будет установлена)
повтор40 логический не ноль ложный отметка для структур set-40 (будет установлена)
повтор80 логический не ноль ложный отметка для конструкций set-80 (будет установлена)
is_from_pdb логический истинный берется из PDB в качестве источника (устанавливается)

Я также добавил эти индексы:

 "pdb_ssbond_pkey" PRIMARY KEY, btree (id) "ndxcode1" btree (code, chain_id1, res_seq1) "ndxcode2" btree (code, chain_id2, res_seq2)

Предполагается, что распределение дисульфидных связей до отсечки является гауссовским (без проверки, например, с помощью KS-теста), поэтому для каждого расстояния между цистеинами в одном и том же белке были рассчитаны стандартные отклонения, чтобы определить диапазон допустимых длин связей и сравнить их. к отсечке. Пороговое значение было таким же, как рассчитанное среднее плюс-минус три стандартных отклонения. Мы расширили диапазон, чтобы ввести больше возможных дисульфидных связей, которые не были зачислены в файл PDB в строках SSBOND но которые мы вставили сами, вычислив расстояния между записями ATOM . Выбранный диапазон для ssbonds составляет от 1,6175344456264 до 2,48801947642267 Å, ​​что является средним значением (2,05) плюс-минус четыре стандартных отклонения:

 select count(1) as cnt , stddev(dist) as std_dev , avg(dist) as avg_val , -stddev(dist) + avg(dist) as left1 , stddev(dist) + avg(dist) as right1 , -2 * stddev(dist) + avg(dist) as left2 , 2 * stddev(dist) + avg(dist) as right2 , -3 * stddev(dist) + avg(dist) as left3 , 3 * stddev(dist) + avg(dist) as right3 , -4 * stddev(dist) + avg(dist) as left4 , 4 * stddev(dist) + avg(dist) as right4 , min(dist) , max(dist) from pdb_ssbond_tmp where dist > 0 and dist < 20;

Таблица TS содержит координаты всех атомов, но будут использоваться только цистеины, а их сера названа " SG " . Таким образом, создается еще одна промежуточная таблица только с атомами серы " SG " для ускорения процесса за счет уменьшения количества записей для поиска. При выборе только серы число комбинаций намного меньше, чем в случае всех атомов — 194 574 первых против 122 761 100 вторых. Внутри этой таблицы, соединенной с самой собой, расстояния рассчитываются с использованием евклидова расстояния, а результаты импортируются в таблицу pdb_ssbond , но только там, где расстояние находится между определенными длинами, рассчитанными ранее. Причина такого ускорения состоит в том, чтобы сократить время повторного запуска всего процесса — в целях проверки — и уложиться в один день.

Для очистки дисульфидных связей используем следующий алгоритм:

  • Удалите, если обе стороны соединения указывают на одну и ту же аминокислоту.
  • Удалить облигации, длина которых не находится между 1,6175344456264 и 2,48801947642267.
  • Удалить вставки
  • Удалите связи, вызванные альтернативным расположением атомов, но оставив первое местоположение

Код для этого (взяв таблицу pdb_ssbond в качестве первого аргумента):

 CREATE OR REPLACE FUNCTION pdb_ssbond_clean2( clean_icodes boolean, clean_altloc boolean, mark_reactive boolean, mark_consecutive boolean) RETURNS void AS $$ declare _res integer; BEGIN delete from pdb_ssbond b where exists ( select a.id from pdb_ssbond a where a.code = b.code and a.id > b.id and ( ( a.chain_id1 = b.chain_id1 and a.res_seq1 = b.res_seq1 and a.chain_id2 = b.chain_id2 and a.res_seq2 = b.res_seq2) or ( a.chain_id1 = b.chain_id2 and a.res_seq1 = b.res_seq2 and a.chain_id2 = b.chain_id1 and a.res_seq2 = b.res_seq1) ) ) ; delete from pdb_ssbond where chain_id1 = chain_id2 and res_seq1 = res_seq2 and i_code1 = i_code2; update pdb_ssbond set is_consecutive = true , is_reactive = false; delete from pdb_ssbond where not dist between 1.6175344456264 and 2.48801947642267; if clean_icodes then delete from pdb_ssbond where i_code1 not in ('', ' ', 'A') or i_code2 not in ('', ' ', 'A') ; end if; if clean_altloc then delete from pdb_ssbond a where exists ( select 1 from pdb_ssbond b where b.code = a.code and b.chain_id1 = a.chain_id1 and b.res_seq1 = a.res_seq1 and b.i_code1 = a.i_code1 and b.ser_num < a.ser_num ) ; delete from pdb_ssbond a where exists ( select 1 from pdb_ssbond b where b.code = a.code and b.chain_id2 = a.chain_id2 and b.res_seq2 = a.res_seq2 and b.i_code2 = a.i_code2 and b.ser_num < a.ser_num ) ; end if; if mark_reactive then update pdb_ssbond set is_reactive = false ; update pdb_ssbond set is_reactive = true where exists ( select 1 from pdb_ssbond b where b.code = pdb_ssbond.code and b.chain_id1 = pdb_ssbond.chain_id1 and b.res_seq1 = pdb_ssbond.res_seq1 and b.i_code1 = pdb_ssbond.i_code1 and b.ser_num < pdb_ssbond.ser_num ) ; update pdb_ssbond set is_reactive = true where exists ( select 1 from pdb_ssbond b where b.code = pdb_ssbond.code and b.chain_id2 = pdb_ssbond.chain_id2 and b.res_seq2 = pdb_ssbond.res_seq2 and b.i_code2 = pdb_ssbond.i_code2 and b.ser_num < pdb_ssbond.ser_num ) ; update pdb_ssbond set is_reactive = true where (code, chain_id1, res_seq1, i_code1) in ( select code, chain_id1 as c, res_seq1 as r, i_code1 as i from pdb_ssbond intersect select code, chain_id2 as c, res_seq2 as r, i_code2 as i from pdb_ssbond ) ; update pdb_ssbond set is_reactive = true where (code, chain_id2, res_seq2, i_code2) in ( select code, chain_id1 as c, res_seq1 as r, i_code1 as i from pdb_ssbond intersect select code, chain_id2 as c, res_seq2 as r, i_code2 as i from pdb_ssbond ); end if; if mark_consecutive then update pdb_ssbond set is_consecutive = false; update pdb_ssbond set is_consecutive = true where not exists ( select 1 from pdb_ssbond a where a.code = pdb_ssbond.code and ( (a.chain_id1 = pdb_ssbond.chain_id1 and a.chain_id2 = pdb_ssbond.chain_id2) or (a.chain_id1 = pdb_ssbond.chain_id2 and a.chain_id2 = pdb_ssbond.chain_id1) ) and ( (a.res_seq1 between pdb_ssbond.res_seq1 and pdb_ssbond.res_seq2) or (a.res_seq2 between pdb_ssbond.res_seq1 and pdb_ssbond.res_seq2) or (pdb_ssbond.res_seq1 between a.res_seq1 and a.res_seq2) or (pdb_ssbond.res_seq2 between a.res_seq1 and a.res_seq2) ) and not ( a.code = pdb_ssbond.code and a.chain_id1 = pdb_ssbond.chain_id1 and a.chain_id2 = pdb_ssbond.chain_id2 and a.res_seq1 = pdb_ssbond.res_seq1 and a.res_seq2 = pdb_ssbond.res_seq2 ) ); end if; END; $$ LANGUAGE plpgsql;

При этом неизбыточный набор белков импортируется в таблицу nr , которая соединяется с таблицами ps и proteins , а наборы помечаются ( set7 , set40 и set80 ). В конце по количеству белка будет проанализирована только одна партия. Несовпадающие цепочки между PDB и NR удаляются из анализа.

Белки без дисульфидных связей исключаются из исследования, как и белки, не принадлежащие ни к одному набору. Данные обрабатываются с помощью DSSP, и эти файлы, которые имеют проблемы с разрешением или слишком много атомов для обработки, также исключаются. В результате для анализа используются только белки с одиночными цепями, так как межцепочечные связи не сохранялись, хотя их легко вычислить по таблице ssbond , подсчитав число связей, имеющих разные цепи.

Для остальных белков выполняется обновление общего количества связей и количества перекрывающихся связей, и это делается для каждого из наборов.

Исходный организм извлекается из записей SOURCE . В тех случаях, когда он неизвестен, является синтетическим, спроектированным, искусственным или гибридным, он исключается из исследований. Белки с низким разрешением также исключаются, только если их боковая цепь не видна.

Записи SOURCE хранятся в таблице sources , которая содержит строки таксономии. В некоторых случаях таксономия отсутствует или неверна. В этих случаях необходима ручная коррекция экспертов.

Из исходного кода и таксономии, загруженной из NCBI, класс присваивается каждой первичной структуре. В случае невозможности присвоения класса белок удаляется из списка анализа. Зная, что используются биологические базы данных, рекомендуется, чтобы биолог провел дополнительную проверку всех исходных записей и классов таксономии NCBI, иначе могут возникнуть проблемы с классификациями между разными областями. Для сопоставления исходных сотовых местоположений с идентификаторами таксономии данные из исходной таблицы извлекаются в таблицу sources_organela где все данные записываются в виде кода, тега и значения. Его формат показан ниже:

 select * from sources_organela where code = '1rav';
код mol_id ярлык вал
1рав 0 MOL_ID 1
1рав 7 CELLULAR_LOCATION ЦИТОПЛАЗМА (БЕЛАЯ)

Архив таксономии, который мы хотим использовать, представляет собой ZIP-файл, содержащий семь файлов дампа. Среди этих файлов два наиболее важных — names.dmp и merged.dmp . Оба файла представляют собой файлы CSV с разделителями табуляции, как подробно описано в документации:

  • Файл merged.dmp содержит список предыдущих идентификаторов таксономии и текущих идентификаторов таксономии, в которые каждый из них был объединен.
  • names.dmp содержит эти важные столбцы в следующем порядке:
    • tax_id : идентификатор таксономии
    • name_txt : название вида и, если применимо, уникальное имя (если виды могут быть найдены с несколькими именами, это помогает устранить неоднозначность)
  • division.dmp содержит имена доменов верхнего уровня, которые мы будем использовать в качестве наших классов.
  • nodes.dmp — это таблица, содержащая иерархическую структуру организмов с использованием идентификаторов таксономии.
    • Он содержит идентификатор родительской таксономии, внешний ключ, который можно найти в names.dmp .
    • Он также содержит идентификатор подразделения, который важен для нас, чтобы правильно хранить соответствующие данные верхнего домена.

Со всеми этими данными и ручными исправлениями (установив правильные домены жизни) мы смогли создать структуру таблицы taxonomy_path . Выборка данных выглядит следующим образом:

 select * from taxonomy_path order by length(path) limit 20 offset 2000;
tax_id дорожка is_viral is_eukaryote is_archaea is_other is_prokaryote
142182 клеточные организмы; Бактерии; Gemmatimonadetes ф ф ф ф т
136087 клеточные организмы;Eukaryota;Malawimonadidae ф т ф ф ф
649454 Вирусы; неклассифицированные фаги; цианофаг G1168. т ф ф ф ф
321302 Вирусы; неклассифицированные вирусы; вирус Теллина 1 т ф ф ф ф
649453 Вирусы; неклассифицированные фаги; цианофаг G1158. т ф ф ф ф
536461 Вирусы; неклассифицированные фаги; цианофаг S-SM1 т ф ф ф ф
536462 Вирусы; неклассифицированные фаги; цианофаг S-SM2 т ф ф ф ф
77041 Вирусы; неклассифицированные вирусы; стелс-вирус 4 т ф ф ф ф
77042 Вирусы; неклассифицированные вирусы; стелс-вирус 5 т ф ф ф ф
641835 Вирусы; неклассифицированные фаги; Vibrio phage 512 т ф ф ф ф
1074427 Вирусы; неклассифицированные вирусы; Розавирус мыши т ф ф ф ф
1074428 Вирусы; неклассифицированные вирусы; мышиный мозавирус т ф ф ф ф
480920 другие последовательности;плазмиды;IncP-1 плазмида 6-S1 ф ф ф т ф
2441 другие последовательности; плазмиды; плазмида ColBM-Cl139 ф ф ф т ф
168317 другие последовательности; плазмиды; плазмида IncQ pIE723 ф ф ф т ф
536472 Вирусы; неклассифицированные фаги; Cyanophage Syn10 т ф ф ф ф
536474 Viruses;unclassified phages;Cyanophage Syn30 т ф ф ф ф
2407 other sequences;transposons;Transposon Tn501 ф ф ф т ф
227307 Viruses;ssDNA viruses;Circoviridae;Gyrovirus т ф ф ф ф
687247 Viruses;unclassified phages;Cyanophage ZQS-7 т ф ф ф ф

Before any analysis, to avoid biases, sequences have to be checked for their level of identity. Although the NR set contains sequences which are already compared between each other, an extra check is always recommended.

For each disulfide bond's prior statistical analysis, data is marked if it is reactive or overlapping. After marking overlaps, that information automatically reveals how many consecutive and non-consecutive bonds are inside each protein, and that data is stored in the proteins table from which all protein complexes are excluded in final result.

Each disulfide bond is marked also for its association to sets, by checking both bond sides to see if they belong to the same NR set. Where that is not the case, the disulfide bond is skipped for that set analysis.

To analyze the quantity of bonds by their variance, each length has to be put in a specific class. In this case, only five classes are chosen as written in the function below.

 CREATE OR REPLACE FUNCTION len2class(len integer) RETURNS integer AS $BODY$ BEGIN return case when len <= 100 then 1 when len > 100 and len <= 200 then 2 when len > 200 and len <= 300 then 3 when len > 300 and len <= 400 then 4 else 5 end; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;

Most of the protein sizes are less than 400 amino acids, so length classification is done by splitting lengths into five ranges, each taking 100 amino acids, except the last one which takes the rest. Below you can see how to use this function to extract data for analysis:

 SELECT p.code, p.title, p.ss_bonds, p.ssbonds_overlap, p.intra_count, p.sci_name_src, p.len, p.tax_path, p.pfam_families, p.src_class, ( SELECT s.id FROM src_classes s WHERE s.src_class::text = p.src_class::text) AS src_class_id, p.len_class7, ( SELECT s.val FROM sources_organela s WHERE s.code = p.code::bpchar AND s.tag::text = 'EXPRESSION_SYSTEM_CELLULAR_LOCATION'::text) AS expression_system_cellular_location, ( SELECT s.val FROM sources_organela s WHERE s.code = p.code::bpchar AND s.tag::text = 'CELLULAR_LOCATION'::text) AS cellular_location, ps.sequence, ps.uniprot_code, ps.accession_code, ps.cc, ps.seq_uniprot, ps.chain_id FROM proteins p JOIN nr n ON n.code::text = p.code::text AND n.rep7 = true JOIN ps ps ON ps.code::text = n.code::text AND ps.chain_id = n.chain_id AND ps.het = false WHERE p.is_excluded = false AND p.chain_cnt = 1 AND p.is_set7 = true AND p.reactive_cnt7 = 0 ORDER BY p.code;

An example result with corrected titles and some manually added columns is shown below.

PDB-код Общее количество ГЦБ-облигаций Количество непоследовательных SS-облигаций Длина PDB/аминокислоты Домен ЦельP 1.1 ТатП 1.0 Сигнал P 4.1 ХлорОП 1.1 TMHMM 2.0 количество трансмембранных доменов Биг-пи nucPred NetNES 1.1 PSORTB v3.0 Секретом 2.0 Локтри2 Консенсусное прогнозирование локализации
1акп 2 0 114 Бактерии нет данных Тат-сигнал нет сигнального пептида нет данных 0 нет данных нет данных нет данных неизвестный нет данных бахромка неизвестный
1бху 2 0 102 Бактерии нет данных Тат-сигнал сигнальный пептид нет данных 1 нет данных нет данных нет данных неизвестный нет данных секретный неизвестный
1с75 0 0 71 Бактерии нет данных Тат-сигнал нет сигнального пептида нет данных 0 нет данных нет данных нет данных цитоплазматическая мембрана неклассическая секреция периплазма неизвестный
1c8x 0 0 265 Бактерии нет данных Тат-сигнал сигнальный пептид нет данных 1 нет данных нет данных нет данных неизвестный нет данных секретный неизвестный
1сх1 1 0 153 Бактерии нет данных Тат-сигнал сигнальный пептид нет данных 1 нет данных нет данных нет данных внеклеточный нет данных секретный неизвестный
1 мазок 0 0 539 Бактерии нет данных Тат-сигнал сигнальный пептид нет данных 0 нет данных нет данных нет данных внешняя мембрана нет данных внешняя мембрана неизвестный
1дфу 0 0 94 Бактерии нет данных Тат-сигнал нет сигнального пептида нет данных 0 нет данных нет данных нет данных цитоплазматический нет данных цитозоль неизвестный
1e8r 2 2 50 Бактерии нет данных Тат-сигнал сигнальный пептид нет данных 0 нет данных нет данных нет данных неизвестный нет данных секретный секретный
1esc 3 0 302 Бактерии нет данных Тат-сигнал сигнальный пептид нет данных 1 нет данных нет данных нет данных внеклеточный нет данных периплазма неизвестный
1g6e 1 0 87 Бактерии нет данных Тат-сигнал сигнальный пептид нет данных 1 нет данных нет данных нет данных неизвестный нет данных секретный неизвестный

PostgreSQL как посредник обработки

В этой работе мы показали, как обрабатывать данные, от выборки до анализа. При работе с научными данными иногда нужна нормализация, а иногда нет. При работе с небольшими объемами данных, которые не будут использоваться повторно для другого анализа, достаточно оставить их денормализованными там, где обработка происходит достаточно быстро.

Причина, по которой все это было сделано в одной базе данных биоинформатики, заключается в том, что PostgreSQL может интегрировать множество языков. Это включает в себя R, который может выполнять статистический анализ непосредственно в базе данных — предмет будущей статьи об инструментах биоинформатики.


Особая благодарность коллегам из Toptal Штефану Фуксу и Альдо Зелену за бесценные консультации.