От лаборатории к данным: секвенирование
Прежде чем анализировать геном, его нужно «прочитать» — превратить молекулу в строки. Этим занимается секвенирование.
Секвенирование — определение точного порядка нуклеотидов (букв 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·log10(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) показывает уверенность прибора в каждой букве.
- Сборка целого генома из ридов — отдельная алгоритмическая задача-пазл.