11. Введение в анализ данных NGS

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

Итак, мне выпала сборка 15 хромосомы.

Описание файла с референсом

Файл с референсом очень похож на обычную Fastsa-последовательность ДНК. В самом начале идет огромный массив неопределенных нуклеотидов, что, похоже, соответствует последовательности теломераз или просто проблемами с секвенированием концевых участков. Примечательно, что в конце файла также есть большой N-повтор, который, однако, в десятки, если не сотни или тысячи раз короче массива в начале. Смысловая часть начинается только после 17000000 позиции!

Начало
Рисунок 1. Начало референсного файла.
Перые нуклеотиды
Рисунок 2. Первые смысловые нуклеотиды референса.

Индексация референса

Для сборки по референсу ему нужно бы быть проиндексированным. Для индексации была использована утилита BWA командой:

bwa index -a bwtsw chr15.fna &> log_bwa

"index" тут было использовано с целью индексации референса, "-a bwtsw" позволяет работать по алгоритму, оптимизированному для генома человека. Вывод программы можно посмотреть тут.

В результате работы BWA при поданной на вход последовательности хромосомы были получены несколько файлов chr15.fna, где:

Описание образца

Мне достались парноконцевые чтения полноэкзомного секвенирования SRR10720419 Homo sapiens, выполненные на "Illumina Genome Analyzer IIx" с 41.3M чтений.

Проверка качества исходных чтений

Качество исходных чтений оценивалось при помощи программы fastqc по командам:

fastqc SRR10720419_1.fastq.gz &> log_fastqc1
, вывод тут

fastqc SRR10720419_2.fastq.gz &> log_fastqc2
, вывод тут

Среди полученных файлов легче всего осмыслить html-файлы - посмотреть их можно тут: SRR10720419_1 и SRR10720419_2.

Легко заметить, что прямых и обратных чтений плучилось поровну - по 41277367.

Per base sequence quality

Прямое чтение
Рисунок 3. Рисунок из раздела Per base sequence quality, прямое чтение.
Обратное чтение
Рисунок 4. Рисунок из раздела Per base sequence quality, обратное чтение.

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

Per sequence quality scores

Прямое чтение
Рисунок 5. Рисунок из раздела Per sequence quality scores, прямое чтение.
Обратное чтение
Рисунок 6. Рисунок из раздела Per sequence quality scores, обратное чтение.

По рис. 5, 6 видно, что подавляющее большинство как прямых, так и обратных чтений имеют качество 39, а значения качества ниже 28 показывает крайне малая доля чтений, что также говорит о крайне высоком качестве секвенирования. И опять для обратных чтений доля лучших чуть выше, чем у прямых.

Sequence Length Distribution

Прямое чтение
Рисунок 7. Рисунок из раздела Sequence Length Distribution, прямое чтение.
Обратное чтение
Рисунок 8. Рисунок из раздела Sequence Length Distribution, обратное чтение.

В первую очередь для рис. 7, 8 хочется отметить их идентичность - прямые и обратные чтения имеют одинаковое распределение длин, что говорит об очень хорошей стабильности выбранного метода секвенирования. В итоге ВСЕ чтения имеют длину ровно 75 bp.

Фильтрация чтений

Несмотря на очень хорошее качество чтений, я все же предпочел отсечь некачественные крохи при помощи программы trimmomatic командой

java -jar /usr/share/java/trimmomatic.jar PE -threads 15 -phred33 SRR10720419_1.fastq.gz SRR10720419_2.fastq.gz output_SRR10720419_1_paired.fastq.gz output_SRR10720419_1_unpaired.fastq.gz output_SRR10720419_2_paired.fastq.gz output_SRR10720419_2_unpaired.fastq.gz TRAILING:20 MINLEN:50 &> log_trimmomatic
, вывод тут

Тут "РЕ" сигнализирует о парных концах, "-threads 15" ускоряет выполнение за счет использования 15 ядер, "-phred33" задает формат scorе, "TRAILING:20" удаляет нуклеотиды с конца чтений с качеством ниже 20 и "MINLEN:50" отфильтровывает чтения короче 50 bp. "SRR10720419_1.fastq.gz" и "SRR10720419_2.fastq.gz" - входные файлы, остальные файлы выходные.

Проверка качества триммированных чтений

Для контроля качества триммирования полученные 4 файла были опять прогнаны через fastqc:

fastqc output_SRR10720419_1_paired.fastq.gz &> log_fastqc1p
, вывод тут, html тут.

fastqc output_SRR10720419_1_unpaired.fastq.gz &> log_fastqc1u
, вывод тут, html тут.

fastqc output_SRR10720419_2_paired.fastq.gz &> log_fastqc2p
, вывод тут, html тут.

fastqc output_SRR10720419_2_unpaired.fastq.gz &> log_fastqc2u
, вывод тут, html тут.

Судя по записям, полученным от fastqc, в обоих наборх осталось по 39759554 bp (96,32% от начального числа bp), что еще раз подтвержает в целом высокое качество начальных данных.

Per base sequence quality

Прямое чтение
Рисунок 9. Рисунок из раздела Per base sequence quality, прямое чтение, paired.
Обратное чтение
Рисунок 10. Рисунок из раздела Per base sequence quality, обратное чтение, paired.
Прямое чтение
Рисунок 11. Рисунок из раздела Per base sequence quality, прямое чтение, unpaired.
Обратное чтение
Рисунок 12. Рисунок из раздела Per base sequence quality, обратное чтение, unpaired.

По рис. 9, 10, 11, 12 Становится очевидно, что триммирование чтений прошло успешно: все низкокачественные риды оказались в файлах unpaired, в то время как нужные нам целевые высококачественные со счетом не ниже 30 (уже виден выигрыш над изначальным состоянием) сохранились в отдельных файлах.

Per sequence quality scores

Прямое чтение
Рисунок 13. Рисунок из раздела Per sequence quality scores, прямое чтение, paired.
Обратное чтение
Рисунок 14. Рисунок из раздела Per sequence quality scores, обратное чтение, paired.

По рис. 13, 14 и в сравнении с рис. 5, 6 видна лишь одна разница - отсчет таблицы начинается с 14 для обратного и с 18 для прямого прочтения, что связано с удалением коротких прочтений.

Sequence Length Distribution

Прямое чтение
Рисунок 15. Рисунок из раздела Sequence Length Distribution, прямое чтение, paired.
Обратное чтение
Рисунок 16. Рисунок из раздела Sequence Length Distribution, обратное чтение, paired.

И опять рис. 15, 16, как и рис. 7, 8, почти идентичны и отличаются лишь небольшим сдвигом по масштабу. И снова подавляющее большинство составляют чтения длины 75, но появились и более короткие - обрезанные при триммировании.

12. Ресеквенирование. Поиск полиморфизмов у человека.

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

Картирование чтений на референсный геном

Картирование проведено программой bwa mem с получением файла с расширением .sam командой

bwa mem -t 15 chr15.fna output_SRR10720419_1_paired.fastq.gz output_SRR10720419_2_paired.fastq.gz > mapped.sam 2> log_bwa

В данной команде "bwa mem" - собственно, сама программа, "-t 15" - распараллеливание для нетерпеливых на 15 ядер, "chr15.fna" - референс, "output_SRR10720419_1_paired.fastq.gz" и "output_SRR10720419_2_paired.fastq.gz" - сами картируемые файлы, полученные в предыдущей части задания, "mapped.sam" - файл с картированием и "log_bwa" - запись со стандартного потока ошибок.

Анализ sam файла с выравниванием

Этот файл состоит из шапки и собственно основной таблицы (рис. 17). Шапка выделена значком "@" и содержит информацию о программе и ее настройках.

sam-файл
Рисунок 17. Первые строки sam-файла.

В таблице же содержатся данные о картировании ридов. Подробно значение каждого столбца представлено в таблице 1.

Таблица 1. Столбцы sam-файла
Название Описание Тип переменной
QNAME Имя чтения String
FLAG Комбинация подразрядных FLAGов Int
RNAME Имя референса String
POS Позиция в референсе, на которую картировался первый нуклеотид Int
MAPQ Качество картирования* Int
CIGAR Краткий отчет о выравнивании String
RNEXT RNAME следующего чтения** String
PNEXT POS следующего чтения Int
TLEN Длина картирования Int
SEQ Последовательность чтения String
QUAL Phred-score каждого нуклеотида в риде Int
AS Cчет выравнивания по aligner String

*равно -10 log10 Pr{позиция картирования неверная} и округляется до целых

**если значение "=", то соответствует RNAME

Получение и индексирование bam файла

Но весит такой sam-файл аж 15,73ГБ! Чтобы облегчить жизнь используемому нами узлу, этот файл был переконвертирован в сортированный bam-файл и удален.

samtools sort -@ 15 -o mapped.bam mapped.sam

Где "samtools sort" - сама программа, "-@ 15" обеспечивает скорость за счет распараллеливания на 15 ядер, "-o" задает выходной файл а "mapped.bam" и "mapped.sam" - сами выходной и входной файлы. Такой бинарный файл намного компактнее - он занял всего 4,58ГБ!

Далее bam-файл нужно проиндексировать, для этого я воспользовался командой

samtools index -@ 15 mapped.bam

Анализ bam файла

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

samtools flagstat -@ 15 mapped.bam > flag.txt

Из выданного файла можно получить следующую информацию: картировано 8386874 чтений (10,54%), в корректно картированных парах 6373786 чтений (8,02%). Отличие этих чисел можно объяснить например тем, что одно из чтений может картироваться в несколько мест генома.

Получение картированных чтений

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

samtools faidx ../bwa_for/chr15.fna

Эта команда выдала следующе:

NC_000015.10    101991189       70      80      81

Используя эти данные был получен новый файл с отсечением лишних чтений командой:

samtools view -@ 15 -h mapped.bam NC_000015.10 > chr15.sam

Полученный файл уже не имеет строк с нулевым картированием. Опять же, для компактности он был переведен в бинарный формат и удален.

samtools sort -@ 15 -o chr15.bam chr15.sam

И опять полученный файл был проанализирован при помощи команды:

samtools flagstat -@ 15 chr15.bam > flagch.txt

В выданном файле уже картировано 87,20% чтений (против 10,54% в прошлый раз), а в корректно картированных парах 66,54% чтений (против 8,02% до этого) с сохранением абсолютных значений - 8386874 и 6373786 соответственно. Что ж, пора извлечь только корректно картированные чтения! Для этого я воспользовался командой:

samtools view -@ 15 -f 0x2 -bS chr15.bam > correct_chr15.bam

И уже который раз файл проанализирован программой flagstat:

samtools flagstat -@ 15 correct_chr15.bam > flagcor.txt

В выданном файле, как и ожидалось, все корректно картированные пары чтений (6373786) были взяты из корректно картированных пар чтений предыдущей версии файла, а просто картированных чтений оказалось чуть больше - 6375175 и составили вполне ожидаемые 100%, такое преобладание просто картированных чтений над корректно картированными снова соответствует предыдущим файлам.

Под конец этот уже почти идеальный файл был проиндексирован:

samtools index -@ 15 correct_chr15.bam

Подготовка выравнивания к поиску вариантов

При подготовке к поиску вариантов требуется промаркировать дублированные чтения с помощью команды picard MarkDuplicates:

picard MarkDuplicates -M metrix.file.txt -I correct_chr15.bam -O marked.bam

К сожалению, занять больше ядер не удалось, и процесс шел долго...

К полученному файлу опять применена команда flagstat:

samtools flagstat -@ 15 marked.bam > flagmark.txt

В выданном файле содержится информация о числе дублированных чтениий - их 459564.

13. Продолжение

Наконец пришла пора искать варианты!

Получение вариантов

Для получения вариантов использовалась программа bcftools:

bcftools mpileup --threads 15 -f ../bwa_for/chr15.fna marked.bam | bcftools call -mv -o chr15.vcf

Тут "bcftools mpileup" - собстенно алгоритм, "--threads 15" - команда на использование множества ядер ради скорости работы, "-f" намекает на индексированность референса, "../bwa_for/chr15.fna" - путь к референсу, "marked.bam" - сам файл с обработанными ранее чтениями, "bcftools call" - командда для вызова вариантов, "-mv" задает вызов редких и многоаллельных вариантов с записью в файл только вариантов, а "-o chr15.vcf" - опция выходного файла и его название.

Полученный vcf-файл, как и sam-файл, состоит из шапки и таблицы (рис. 18). Только у свежеполученного файла шапка гораздо больше - там содержатся не только настройки его создания, но и, насколько я понял, информация об общем количестве различных типов отличий от референса, а также названия колонок таблицы.

Шапка
Рисунок 18. Шапка vcf-файла.

В самой же таблице деcять колонок с информацией о вариантах (рис. 19):

Таблица
Рисунок 19. Начало таблицы vcf-файла.

Далее этот файл можно проанализировать командой:

bcftools stats chr15.vcf > chr15stat.txt

Судя по данным в этом файле (рис. 20), всего в данной мне для сборки хромосоме 265670 вариантов, почти все из них - 261086 - являются однонуклеотидными заменами (SNP), а оставшиеся 4584 вариантов - индели.

Статистика
Рисунок 20. Статистика по vcf-файлу.

Фильтрация вариантов

Для большего доверия полученным вариантам отфильтруем варианты с качеством выше 30 и покрытием больше 50 командой:

bcftools filter -i'%QUAL>30 && DP>50' --threads 15 chr15.vcf -o chr15filtr.vcf

И полуенный файл опять же приводится к читаемому виду командой:

bcftools stats chr15filtr.vcf > chr15filtrstat.txt

И в отфильтрованном файле (рис. 21) оказалось уже намного меньше вариантов - 16618, из которых снова почти все - SNP (16397 случаев), а инделей уже 221. Интересно, что фильтрацией отброшена гораздо большая доля инделей, чем SNP.

Статистика
Рисунок 21. Статистика по отфильтрованному vcf-файлу.

Изучение покрытия

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

bedtools genomecov -bg -ibam marked.bam > cov.bed

Полученный файл (рис. 22) выглядит достаточно просто: в четырех столбцах описаны название референса, начало варианта, конец варианта и его покрытие соответственно.

cov-файл
Рисунок 22. Первые строки полученного cov-файла.

После этого отберем только покрытые более 50 раз участки командой:

awk '$4 > 50' cov.bed > cov50.bed

В этом файле оказалось 1215992 (25,24% от нефильтрованного файла) строк, что было подсчитано командой wc:

wc -l cov50.bed

Похоже, это и есть наши таргеты.