はじめに
※本記事はバイオインフォマティクス Advent Calendar 2019の20日目の記事です。
Snakemakeのインストールと概要
→ Snakemakeを試す - ① インストールと概要 - ばいばいバイオ
チュートリアルの実行
→ Snakemakeを試す - ② チュートリアルを実行 - ばいばいバイオ
Snakemakeでの並列化
→ Snakemakeを試す - ③ 並列化 - ばいばいバイオ
①~③と、Advent Calendar に備え着々と準備を続けてきたのですが、
当日に全然時間がとれず今回は少し薄い内容となっております、どうかお許しを。
Snakemake vs Nextflow
バイオインフォ界隈のワークフローツールはSnakemakeだけでなく、CWL、Galaxy、Nextflowなんかが含まれてきます。 多種多様であれがいい、これがいい、そもそもワークフローはいらないだの色々と騒がれています。
少し古い引用ですが、NCBIのハッカソンでこんな議論が繰り広げられていたらしいです。
- CWLは労働集約的すぎるため、ほとんどすべてのメンバーに却下された。 CWLの経験を持つ少数の人々は、扱いの困難さ、学習コストの高さを問題点として挙げていた。
- SnakemakeはNextflowよりも柔軟性が低いという理由で却下された。多くのユーザーはPythonを使用していると考えていたが、そうではない人もいた。
- Nextflowは、入力と出力を管理するだけの定義言語があらゆる言語のAPIで簡単にラップできるようになっていたため、採択された。
- Jupyterは、まだすべての言語で扱えるものではない。将来的には魅力的な選択肢となるかもしれない。
当時はなんとも言えない理由でNextflowが採択されたようです。
参考:NCBI Hackathons discussions on Bioinformatics workflow engines
Snakemakeのいいところ
自分はCWL、Galaxyを少しかじった程度しかワークフローを触ったことはなく、pythonでごりごり書くことが多かったのですが、 巷ではやり始めたワークフローツールを使えばこれもっと楽にかけるんじゃね。。と思い、最近ではSnakemakeを信仰しています。
個人的に思うSnakemakeを使うべき人は下記の通りです。
- Pythonが好き、Pythonでワークフローを記述したい
- 小難しい文法を勉強したくない(学習コストをかけたくない)
- プログラミング初学者が多いチームで使いたい
- 数TBレベルの大規模処理は扱わない
ほかのワークフローツールと比べて、いろんな意味で軽量なツールかと思います。
GATK best practiceをSnakemakeで
dna-seq-gatk-variant-calling という便利なモノを見つけてしまいました。
これは、Snakemakeの作者であるJohannes Köster氏が作成したGATK best practiceのワークフローです。
彼はBiocondaプロジェクトのfounderや、Rust Bioの著者でもあるみたいです。
ワークフロー概略
Snakemakeのレポーティング機能は、下記のようなワークフロー図を出力してくれます。
少し画質が荒くて恐縮ですが、この図を張り付けておきます。
見てわかる通り、このワークフローはGATK best practiceに忠実なフローとなっています。
ワークフローの具体的な内容は本家を参考にしてください。
入力ファイル
units.tsv
として下記のように定義しています。
PLATFORMとか指定できるようになっていますが、レポーティング用途として使われているのみです。
sample | unit | platform | fq1 | fq2 |
---|---|---|---|---|
A | 1 | ILLUMINA | data/reads/a.chr21.1.fq | data/reads/a.chr21.2.fq |
B | 1 | ILLUMINA | data/reads/b.chr21.1.fq | data/reads/b.chr21.2.fq |
B | 2 | ILLUMINA | data/reads/b.chr21.1.fq |
https://github.com/snakemake-workflows/dna-seq-gatk-variant-calling/blob/master/units.tsv
設定ファイル
config.yaml
にて解析のオプションを設定します。
base recalibration を行うか否か、snv, indelごとのフィルタリング条件、trimmomaticやpicard, GATKのオプションが直感的に指定できるようになっています。
https://github.com/snakemake-workflows/dna-seq-gatk-variant-calling/blob/master/config.yaml
準備
このワークフローではBWAで使用するindex及びGATKが使用する.dict
ファイルが作成されていることが前提となっています。
それぞれリファレンスゲノムを指定して下記の通り実行することで作成できます。
bwa index
の実行
$ bwa index data/ref/genome.chr21.fa (snakemake)
picard CreateSequenceDictionary
の実行
$ picard CreateSequenceDictionary R=data/ref/genome.chr21.fa O=data/ref/genome.chr21.dict
実行
Snakemakeには便利なdry-run機能があります。
重い処理のワークフローを実行する前にはまずdry-runして概要が正しいか確認するようにしましょう。
$ snakemake --use-conda -n
実際にワークフローを実行する際は、--cores
を指定して並列に処理を走らせることができます。
$ snakemake --use-conda --cores 12
中で使われている便利な機能たち
ログ出力
ログの出力はlog
ディレクティブに出力ファイル名を指定するだけ。
標準出力が吐き出されます。
明示的なパラメータを含む場合はshell
ディレクティブ内で指定してあげます。
rule abc: input: "input.txt" output: "output.txt" log: "logs/abc.log" shell: "somecommand --log {log} {input} {output}"
とっても簡単です。
参考:log-files
モジュール化
Snakemakeでは、include
ディレクティブを使って処理のモジュール化を行うことができます。
ワークフローが大規模になってきた際には積極的に使っていきましょう。
使い方はいたって簡単。
下記のように含めたいSnakefileのパスをinclude
ディレクティブに指定するだけ。
モジュール内では通常のSnakefileと同じシンタックスが使用できます。
include: "path/to/other.snakefile"
wrapper
wrapper
ディレクティブを使うと、一般的な解析ツールであれば自分でコーディングせずにSnakemakeのワークフローの一部として使用できます。
例えばbwaだとこんな感じ。
rule bwa_mem: input: ref="data/genome.fa", sample=lambda wildcards: config["samples"][wildcards.sample] output: temp("mapped_reads/{sample}.bam") log: "logs/bwa_mem/{sample}.log" params: "-R '@RG\tID:{sample}\tSM:{sample}'" threads: 8 wrapper: "0.15.3/bio/bwa/mem"
このディレクティブが指定されると、呼び出し時に要求されたバージョンのラッパーを自動的にダウンロードしてくれます。
--use-conda
と組み合わせて使うと、wrapper内で必要なツールの仮想環境へのインストールも自動的に行ってくれます。
割と頻繁に更新されてるし簡単にオプションのカスタムできるし、とっても便利。
まだ数十ツールしかラインナップがないので優秀な皆さん、committerチャンスです。
参考: tool-wrappers
最後に
このワークフローはあくまでテンプレートとして使用して、カスタムして使うのが良いでしょう。
多言語対応という面ではNextflowなどにかなわないSnakemakeですが、Python愛好者には使いやすいことこの上なしです。
良いバイオインフォライフを。