От лаборатории к данным: секвенирование

Прежде чем анализировать геном, его нужно «прочитать» — превратить молекулу в строки. Этим занимается секвенирование.

Секвенирование — определение точного порядка нуклеотидов (букв A/T/G/C) в молекуле ДНК или РНК.

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

Зачем понимать происхождение данных

Секвенатор не выдаёт геном целиком одной строкой. Он читает миллионы коротких кусочков — ридов (reads), каждый длиной обычно 100–300 букв (для коротких чтений) или тысячи букв (для длинных). Геном при этом — миллионы или миллиарды букв. Значит, прибор рвёт ДНК на обрывки, читает каждый по отдельности, а собрать целое — уже задача алгоритма.

Покрытие: почему читают много раз

Каждое место генома читают не один раз, а много — это называется покрытие (coverage, глубина). Покрытие 30× значит, что в среднем каждую букву прочитали 30 раз разными ридами. Зачем? Прибор ошибается, и одиночное чтение ненадёжно. Если 29 ридов в позиции говорят «A», а один — «G», то это, скорее всего, ошибка прибора, а не мутация.

# Простейший "консенсус" по покрытию в одной позиции
from collections import Counter
reads_at_position = ["A", "A", "G", "A", "A", "A", "A", "G", "A", "A"]
votes = Counter(reads_at_position)
consensus = votes.most_common(1)[0][0]
depth = len(reads_at_position)
print("Голоса:", dict(votes))
print("Глубина покрытия:", depth)
print("Консенсусная буква:", consensus)

Вывод:

Голоса: {'A': 8, 'G': 2}
Глубина покрытия: 10
Консенсусная буква: A

Так из множества зашумлённых ридов получается одна надёжная буква. Это уже настоящий биоинформатический шаг — голосование большинством.

Технологии: короткие и длинные чтения

ТипДлина ридаПлюс / минус
Короткие (Illumina)~100–300 буквдёшево и точно / трудно собирать повторы
Длинные (Nanopore, PacBio)тысячи–миллионы буквлегко собирать / больше ошибок (компенсируют покрытием)

Как работает под капотом: от сигнала к буквам

Физика у каждого прибора своя (флуоресценция, изменение тока в наннопоре), но итог одинаков: непрерывный сигнал превращается в строку букв, и для каждой буквы прибор оценивает, насколько он в ней уверен. Эту уверенность кодируют как качество (Phred-оценка) и хранят рядом с буквами в формате FASTQ, который мы разберём отдельно.

Идея Phred проста: качество Q связано с вероятностью ошибки p формулой $Q = -10 \cdot \log_{10}(p)$. Посчитаем вероятность ошибки для пары значений качества.

import math
def phred_to_prob(q):
    return 10 ** (-q / 10)
for q in [10, 20, 30, 40]:
    p = phred_to_prob(q)
    print(f"Q{q}: вероятность ошибки {p:.4f} (1 из {round(1/p)})")

Вывод:

Q10: вероятность ошибки 0.1000 (1 из 10)
Q20: вероятность ошибки 0.0100 (1 из 100)
Q30: вероятность ошибки 0.0010 (1 из 1000)
Q40: вероятность ошибки 0.0001 (1 из 10000)

Q30 — типичный порог «хорошего» качества: одна ошибка на тысячу букв.

Сборка как пазл

Имея миллионы перекрывающихся обрывков, восстановить исходный геном — всё равно что собрать пазл из миллиона кусочков, многие из которых одинаковые (повторы). Это отдельная большая задача — сборка генома, ей посвящён отдельный урок. Пока запомните схему:

Геном:   ...ATGCGATTACAGGCTA...   (не виден целиком)
Риды:    ATGCGA
            GATTAC
                TACAGGC
                    GGCTA
Сборка соединяет риды по перекрытиям -> восстанавливает геном

Частые ошибки

  • Доверять одиночному риду. Без достаточного покрытия отличить ошибку прибора от мутации нельзя.
  • Игнорировать качество. Буквы с низким Q надо отфильтровать, иначе анализ полон артефактов.
  • Думать, что прибор выдаёт готовый геном. Он выдаёт груду коротких ридов; геном собирает алгоритм.

Итог

  • Секвенатор читает геном не целиком, а как миллионы коротких ридов.
  • Покрытие (глубина) позволяет голосованием отделить ошибки от настоящих вариантов.
  • Качество (Phred) показывает уверенность прибора в каждой букве.
  • Сборка целого генома из ридов — отдельная алгоритмическая задача-пазл.
Проверьте себя
1. Что такое рид (read) в секвенировании?
AВесь геном в одной строке
BКороткий прочитанный фрагмент последовательности
CОшибка прибора
DИмя гена
2. Покрытие 30× означает, что...
AГеном на 30% прочитан
BВ среднем каждая позиция прочитана 30 раз разными ридами
CПрибор сделал 30 ошибок
DГеном в 30 раз длиннее обычного
3. Качество Q30 по шкале Phred соответствует вероятности ошибки...
A1 из 30
B1 из 100
C1 из 1000
D1 из 10
py
Курс по теме
Пройдите курс «Python с нуля» — по шагам, с проверкой
8 уроков · ~14 ч · теория, упражнения и экзамен с бейджем
Открыть курс →