четверг, 13 июля 2017 г.

Как геномные данные выглядят и откуда их берут

Ребенок смотрит на кошку и говорит "Как же повезло, что дырки на коже у кошки на том же месте, где глазки".

Нам в этом плане тоже очень повезло, что все живые организмы (и вирусы, которые ими формально не являются) имеют один и тот же вид генетического кода. Что говорит лишь о том, что когда-то у всех был общий предок, который потихоньку-помаленькой развился в вирус Эболы, плесень, птицу в небе, ну и лично в вас. У вас у всех одинаковый код. ACTG. Если сейчас немного забыть про вирусы, некоторые из которых немного по другому работают, то все остальные имеют молекулу ДНК, где друг за другом идет какая-то последовательность аденина, гуанина, цитозина и тимина, еще называемых нуклеотидами.

Это кусок вируса Эболы

CGGACACACAAAAAGAAAGAAGAATTTTTAGGATCTTTTGTGTGCGAATAACTATGAGGA

А это - человека

CATGTTTCCACTTACAGATCCTTCAAAAAGAGTGTTTCAAAACTGCTCTATGAAAAGGAAT

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

Длина приведенной выше последовательности ДНК 61 bp. Сокращение bp - базовые пары. Парами их называют из-за того, что ДНК это двойная спираль. Параллельно этой последовательности идет такая же, но обратно комплементарная ей. 

CGGACACACAAAAAGAAAGAAGAATTTTTAGGATCTTTTGTGTGCGAATAACTATGAGGA
GCCTGTGTGTTTTTCTTTCTTCTTAAAAATCCTAGAAAACACACGCTTATTGATACTCCT

Под C идет G, под G - C, под A - T и наоборот. Но так как комплементарная последовательность однозначно восстанавливается из прямой, то ее обычно не пишут. Но у реальной ДНК нет ни верха, ни низа, и когда у вас есть некая необработанная сырая последовательность нуклеотид, вы обычно не знаете, прямая она или обратно комплементарная, и это нужно всегда держать в голове при написании кода. Оборудование, читающее ДНК, может прочитать или верхнюю строку справа налево или нижнюю задом наперед, но вы не можете это определить. По крайней мере оно не читает верхнюю задом наперед и нужно рассматривать 2 варианта расположения фрагмента, а не 4.

Но ДНК это "формат хранения" кода. Он идет такой двойной спиралью, потому что она куда более стабильна, чем одиночная последовательность. Но одиночные последовательности, без парной, тоже существуют. Некоторые вирусы даже существуют только в таком виде. Правда, они часто сворачиваются хотя бы кусками сами на себя. Когда последовательность вроде одинарная, но ее можно согнуть пополам, и ее одна половина будет комплементарна другой. Вирусы не смущаются постоянных поломок в коде, все равно они размножаются достаточно быстро. Такие одиночные последовательности называются РНК. Вот только РНК кодируется нуклеотидами ACUG вместо ACTG. Урацилом вместо тимина. Однако, чтобы не вносить путаницы, РНК тоже записывается как ACTG, чтобы не поддерживать два формата. 

Иногда встречаются какие-то странные символы в геномном коде типа R, которая означает A или G, но чаще всего код записывают именно верхним регистром и разных символов в нем, нет, к сожалению не 4, а 5. ACTG и N. Неизвестный символ. Однако N обычно обрабатывается особым образом и чаще всего хранить в памяти нужно именно 4 символа. Можно обойтись двумя битами на нуклеотид, что обычно и делают. А если вы посмотрите на битовое представление символов ACTG, то увидите интересную вещь:

A 65 1000001
C 67 1000011
T 84 1010100
G 71 1000111

Первый и второй биты образуют все различные комбинации. Можно быстро переводить нуклеотиды в двухбитный int подобными образом: (ch >> 1) & 3

Итак, откуда же их, эти последовательности ACTG берут? К сожалению нельзя просто так взять и прочитать последовательность ДНК какого-то организма. Вы, возможно, где-то уже слышали, что геном человека прочитан, причем достаточно давно. Ничего подобного. Существует уже 38ой "релиз" генома и целые комиссии сидят и постоянно его уточняют, выпускают "патчи" и полноценные "релизы". И даже в последнем релизе в нём все еще слишком много букв N, которые идут огромными регионами, не говоря уже про множество каких-то странных кусков генома кишечной палочки, которые вообще непонятно что там делают и скорее всего попали туда по ошибке.

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

К счастью, большая часть данных идет от машин компании Illumina. Счастье в том, что у них очень низкий уровень ошибок чтения. 1 ошибка примерно на 10 фрагментов. И каждый фрагмент длиной 100-200 нуклеотид. Очень часто они бывают парными. Когда аппаратура читает один фрагмент и на некотором расстоянии от него еще один. Это на самом деле очень помогает в некоторых исследованиях.

Так примерно выглядят парные фрагменты каждый длиной 100:

>SRR1919642.1
ATCTTCGTATAAAAACTAGACAGAATCATTCACAGAAACTAGTTTGTGATGTGTGTGTTCAACTCAAGGAGTTTAAACTTTCTTTTGATGGAGCAGTTTG
>SRR1919642.1
AAAGCGCTTGAAATCTCCAGCTGCAAATTCCACAAAAAGGGTGTTTAACATCTGCTCTTCTAAAGGAAAGTTCAACTCTATGAGTTGAATACACAAAGCA
>SRR1919642.2
NAAAATAAAAACACAAAGGTTCAATCTCTTCTGACCTTTGAAAGACACAGCACAGACAGTGGTCCTTAGGACGAAGAGCAGGAGACCCCTAATTCCGTCA
>SRR1919642.2
GGATTCAGTTCTTGAAACAAAACTCTGAGCCTTCAATGACCTTTCGGTCTATGTAAAAGCACTCCTGTCTTCCTGGCAGCAGTTGGACCTCACAATGTGG

Существует некоторая путаница в названии эти фрагментов. Исторически чтение происходило с некоторых точек на пластинах, поэтому саму пару называли спотами (spot - точка), а их половинки - ридами (read). Но в современных статьях спот называют ридом, а каждую из его половинок - фрагментом. Всегда есть небольшая путаница, что конкретный человек имеет под ридом - обе половинки или только одну. Мне лично привычней называть каждую половинку ридом, а в сумме они образуют спот. В приведенном выше примере 2 спота по 2 рида в каждом. Часто бывает, что есть всего 1 рид на спот, так что по сути это одно и то же.

Откуда я взял приведенный пример? Вот отсюда
https://www.ncbi.nlm.nih.gov/sra/?term=SRR1919642

Наряду с нуклеотидами в таких данных есть также данные об их "качестве" - уровне уверенности, что нуклеотид правильный. Интересно, что эти самые уровни занимают порядка 80% данных по обьему. Когда-то давно данных было очень мало и это никого не волновало. А сейчас правильность нуклеотид проверяют проводя многократное, десятки или сотни раз (бывает, что и тысячи. рекорд, который я видел - 1.2 млн) прочитывание всего генома кусочками, накладывая кусочков друг на друга и строя таким образом протяженные регионы - contiguous regions или contigs (контиги) на сленге. По историческим причинам данные уровня сигнала хранят для совместимости со старыми программами, но реально никого не волнует уровень сигнала при стократном перекрытии данных.

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

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

Существуют митохондрии - бактерии, захваченные клетками предков человека много миллионов лет назад. Их геном прочитать легко. А вот получить непрерывный кусок человеческого ДНК хотя бы тысяч в 50 баз из 3 млрд имеющихся - мне пока что такой технологии неизвестно, и уже тем более, хотя у человека действительно есть хромосомы, представляющие непрерывную последовательность ДНК длинной в сотни миллионов, на самом деле людям известны только множество мелких непонятно как расположенных обрывков этих хромосом, которые могут для удобства храниться в одной последовательности и разделяться последовательностями NNNNNNNNNN.

Know your data!

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

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