[Из песочницы] Биоинформатический пайплайн с использованием Docker

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

Часть 1. Биоинформатический пайплайн, или что мы делали и зачем


Технологии прочтения последовательности ДНК живых организмов постепенно развиваются. Ученые все больше и больше узнают, какие участки ДНК за что отвечают и как они вообще влияют на организм. Во всех этих работах есть большой медицинский потенциал. Старение, рак, генетические заболевания — анализ последовательности ДНК может стать мощным инструментом в борьбе с ними. Мы построили пайплайн, который анализирует последовательность некоторых участков ДНК человека и пытается предсказать, может ли у него быть кардиомиопатия — генетически обусловленное заболевание сердца.

Почему берутся только некоторые участки ДНК? Прочтение всей ДНК (а это 3,2 млд нуклеотидов или «букв») будет стоить намного дороже. А чтобы понять, есть ли у конкретного человека «ошибки», приводящие к тем или иным «генетически обусловленным» болезням, достаточно прочитать только те участки, которые, так сказать, влияют, на развитие этих болезней. А это куда дешевле.

Откуда ученые знают, какие именно участки ДНК нужно читать? Ответ тут такой: сравнивая геномы здоровых и больных людей. Данные эти довольно достоверны, ведь на сегодняшний день человечеству известны полные геномы более тысячи людей по всему миру.

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

Подобными исследованиями занимаются довольно много, поэтому существуют best practices, как это лучше делать. В них подробно описано, как очищенные данные выровнять на референсный геном (то есть геном некого абстрактного здорового человека), как найти «однобуквенные» отличия между ними, а потом проанализировать эти отличия: отсеять заведомо незначимые, а прочие поискать в биомедицинских базах данных. Для всех этих действий биоинформатическим сообществом разработано множество программ: bwa, gatk, annovar и т.п. Пайплайн устроен так, что выходные данные нужной программы поступают на вход следующей, и так далее, пока не получится требуемый результат. Способов реализовать пайплайн существует множество, в своей работе, воодушевленные отличным курсом «Управление вычислениями», мы использовали snakemake.

biopipeline

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

image

Какие выводы можно из всего этого сделать? Как и ожидалось, сам по себе пайплайн диагноз поставить не может. Он может только дать информацию, по которой врач решает, велики ли риски заболеть у данного человека, или нет. Такая неоднозначность связана с тем, что кардиомиопатия — заболевание комплексное, зависящие как от генетических, так и от внешних факторов. Биохимические механизмы ее возникновения не известны (сложно все это), поэтому точно сказать, какие именно наборы вариаций приведут к болезни — нельзя. Все что есть — это статистика по больным и здоровым, которая позволяет врачу оценить вероятность болезни и, при необходимости, вовремя начать лечение.

Нами также была предпринята попытка оценить качество работы пайплайна. Как было сказано выше, пайплайн находит вариации — «однобуквенные» отклонения последовательности ДНК исследуемого человека от референсного генома. Потом он их анализирует и ищет информацию по ним в биомедицинских базах данных. Самый неоднозначный этап, требующий тонкой настройки — это нахождение этих вариаций. Тут нужно найти баланс между избыточностью — когда находится слишком много вариаций, большинство из которых мусорные, и недостаточностью — когда так строго отбираем вариации, что теряем нужную информацию. Поэтому, проверка качества свелась к тому, чтобы проверить, как пайплайн находит вариации в данных, про которые мы знаем «правильный ответ». В качестве этих данных был взят Genome in a Bottle — некий максимально точно прочитанный человеческий геном, по которому есть надежные данные по вариациям. Результат проверки качества дал совпадение 85%, что довольно неплохо.

Часть 2. Использование Docker


Если высказывать главную мысль этой статьи одним предложением, оно было бы таким: «Используйте в своих пайплайнах Docker, с ним намного удобнее». Действительно, с какими проблемами обычно сталкиваются люди, считающие что-то с помощью пайплайнов? Если пайплайн находится на вашем рабочем компьютере, вы ненароком можете изменить окружение или зависимости используемых программ, возможны автоматические обновления — все это может привести к тому, что пайплайн станет считать немножко не так как раньше или начнет выдавать ошибки. Также, проблематичным может быть и деплоймент пайплайна на новом компьютере: надо устанавливать все программы, опять же, следить за версиями и зависимостями, учитывать операционную систему. С использованием Docker всех этих проблем не будет, а чтобы запустить пайплайн на новом компьютере, вообще не придется ничего устанавливать (кроме Docker).

Идея Docker заключается в том, что каждая программа, используемая пайплайном, будет запускаться в изолированном контейнере, в котором разработчик налаживает нужные зависимости и окружения. Все что нужно он описывает в соответствующем Dockerfile, потом, командой docker build строит образ контейнера, который можно загрузить на dockerhub. Когда же кто-то (пайплайн или другой пользователь) захочет воспользоваться данной программой с данными зависимостями, он просто качает нужный образ с dockerhub-а и командой docker create создает у себя на компьютере нужный контейнер.

docker

Наш пайплайн, использующий Docker, доступен на github. Каждый раз, вызывая какую-либо программу, пайплайн запускает соответствующий контейнер, передает ему нужные параметры и идет рассчет. По сути, вся работа программиста сводилась к тому, чтобы написать Dockerfile для каждого контейнера. В нем указывается базовый образ (FROM), какие команды выполнить в указанном образе (RUN), или какие файлы добавить (ADD), можно указать рабочую директорию (WORKDIR), в которую, при запуске контейнера, монтируется папка с нужными для расчетов данными. На основе Dockerfile создается образ:

$ docker build -t imagename .


И загружается в какой-либо репозиторий, например, dockerhub.com.

Опишем некоторые типичные для нашего пайплайна случаи. Подробнее о Dockerfile можно почитать на официальном сайте:

Нужно запустить стандартную программу, установленную из репозиториев, например, picard-tools. Dockerfile будет таким:

FROM ubuntu:14.04
RUN apt-get update && apt-get install -y picard-tools \
    && mkdir /home/source
WORKDIR /root/source


$ docker run -it --rm -v $(pwd):/root/source picard-tools picard-tools MarkDuplicates INPUT={input} OUTPUT={output[0]} METRICS_FILE={output[1]} 


Нужно запустить свой shell-скрипт, annotation_parser.sh, который парсит файл. Для этого можно воспользоваться стандартным docker-образом ubuntu:

$ docker run -it --rm -v $(pwd):/root/source -w="/root/source" ubuntu:16.04 /bin/sh scripts/annotation_parser.sh {input} {output}


Нужно запустить скрипт, не находящийся в стандартных репозиториях. Dockerfile:

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y perl && apt-get install -y wget \
    && mkdir /root/source
ADD annovar /root/annovar
ENV PATH="/root/annovar:${PATH}"
WORKDIR "/root/source"


$ docker run -it --rm -v $(pwd):/root/source annovar table_annovar.pl {input} reference/humandb/ -buildver hg38 -out {params.name} -remove -protocol refGene,cytoBand,exac03,avsnp147,dbnsfp30a -operation gx,r,f,f,f -nastring . -vcfinput


Нужно запустить java-приложение. Здесь мы используем ENTRYPOINT (https://docs.docker.com/engine/reference/builder/#entrypoint), что позволяет запускать контейнер как исполняемый файл.

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y default-jre \
    && mkdir /home/source
ADD GenomeAnalysisTK.jar /root/GenomeAnalysisTK.jar
WORKDIR "/root/source"
ENTRYPOINT ["/usr/bin/java", "-jar", "/root/GenomeAnalysisTK.jar"]


$ docker run -it --rm -v $(pwd):/root/source gatk -R {input[0]} -T HaplotypeCaller -I {input[1]} -o {output}

© Habrahabr.ru