ゲノム解析に限らず、データ解析は1つのソフトウェアを実行して終わりということはまずありません。前処理からクオリティチェック、フィルタリング、1次解析、2次解析とワークフローを実行していき最後に目的の結果を可視化するという流れがほとんどでしょう。しかし、公刊論文と同じ解析方法を使いたい、共同研究者と解析内容を共有したいと思いワークフローを作ってみても、データの種類、使用ツールとバージョン、入力パラメータと要素が増えていくと、同じ結果にならなかったり実行環境を移植するのが大変だったりと苦労がつきものです。このような再現性やポータビリティについてさまざまな議論がなされるなか、ワークフロー記述フォーマットを統一しようと始まったプロジェクトがCWL(Common Workflow Language)です。
https://www.commonwl.org
CWLとは
CWL自体はワークフローの記述フォーマットを指しており、それを読んで実行するためのエンジンがいくつか開発されています。CWLのワークフローを実行するには、2つのファイルが必要です。
- コマンドラインツールもしくはワークフローを記述したcwlファイル
- 入力パラメータを記述したyamlもしくはJSONファイル
この2つをCWLのエンジンに渡して実行します。ワークフローのCWLファイルでは、コマンドラインツールのCWLファイルを組み合わせて実行することができます。具体的なワークフロー記述方法は開発元のUser Guideをご覧ください。
https://www.commonwl.org/user_guide/
CWLはDocker,Singularityに対応しており、アプリケーションをコンテナで実行することができます。コンテナ使用時のコマンドオプションを自動で付加してくれるので、DockerやSingularityに慣れていなくても簡単に使えると思います。User Guide 7にDockerを使用する場合の記述方法があります。
https://www.commonwl.org/user_guide/07-containers/index.html
singularityでもCWLファイル側の記述は共通で、CWLエンジンに渡す時のオプションで指定します。
Toil x Univa Grid Engine
CWLのUser Guideで使われているエンジンcwltoolは最もシンプルなレファレンス実装であり、ローカル実行のみとなります。ほかにも開発元webサイトにエンジンのリストがあり、自分の環境に適したものを探すことができます。そのうちの1つToilはもともとpythonのワークフロー実行ツールですが、CWLで書かれたものも読むことができます。
http://toil.ucsc-cgl.org
Toilはジョブスケジューラに対応しており、CWLのワークフローをクラスター構成の計算ノードで実行可能です。今回はTakeru標準のジョブスケジューラUniva Grid Engine(以下UGE)と組み合わせた実行例をご紹介します。
Toilの基本的な実行方法
前項に書いたようにcwlファイルと入力パラメータのファイルをToilの実行コマンドcwltoilに渡して実行します。以下はペアエンドのfastqファイルに対しfastqc,trimmomatic,bwa,samtoolsを実行しBAM形式で出力するワークフローの記述例です。
$ cat smallworkflow.cwl
#!/usr/bin/env cwl-runner
cwlVersion: v1.0
class: Workflow
inputs: //ワークフロー全体のinput パラメータファイルから渡される
fastq1:
type: File
format: edam:format_1930
fastq2:
type: File
format: edam:format_1930
ref:
type: File
secondaryFiles:
- .amb
- .ann
- .bwt
- .pac
- .sa
- .fai
outputs: //ワークフローの最終的なoutput
qc_fastq1:
type: File
outputSource: fastqc1/fastqc //step名とoutputを指定
qc_fastq2:
type: File
outputSource: fastqc2/fastqc
trimed_paired1:
type: File
outputSource: trimmomaticPE/paired1
trimed_paired2:
type: File
outputSource: trimmomaticPE/paired2
mapped_bam:
type: File
outputSource: sam-bam/mapped_bam
steps: //各stepの記述
fastqc1:
run: ../tools/fastqc.cwl //別に作成したコマンドラインツールのCWLファイルのパス
in:
fastq: fastq1 //inputで定義したオブジェクトを指定
out: [fastqc]
fastqc2:
run: ../tools/fastqc.cwl
in:
fastq: fastq2
out: [fastqc]
trimmomaticPE:
run: ../tools/trimmomatic.cwl
in:
fastq1: fastq1
fastq2: fastq2
out: [paired1, paired2]
bwa:
run: ../tools/bwa.cwl
in:
fastq1: trimmomaticPE/paired1 //前のステップのoutputを指定、
fastq2: trimmomaticPE/paired2 //trimmomaticPEのstepが終了するまで
ref: ref //bwaのstepは実行されない
out: [mapped_sam]
sam-bam:
run: ../tools/sam-bam.cwl
in:
mapped_sam: bwa/mapped_sam
out: [mapped_bam]
パラメータファイルには入力ファイルを記述します。またbwaで使用するレファレンスデータもここで記述しておきます。
$ cat smallworkflow.yaml
fastq1:
class: File
path: ../data/DRR006760-4k_1.fastq
format: http://edamontology.org/format_1930
fastq2:
class: File
path: ../data/DRR006760-4k_2.fastq
format: http://edamontology.org/format_1930
ref:
class: File
path: ../data/human_g1k_v37_decoy.fasta
以下のように実行します。singularityを使う場合はオプション--singularityを付加します。
$ cwltoil --singularity tools/smallworkflow.cwl jobs/smallworkflow.cwl
Univa Grid Engine経由で実行する
UGEを使用する場合はオプション--batchSystem gridengineを付加します。Toilはワークフローのstep(CWLファイル内のstepsに記述されているクラス)ごとにqsubでジョブを投入します。デフォルトでqsubコマンドに渡すオプションをあらかじめ環境変数で設定することができます。
$ export TOIL_GRIDENGINE_PE=‘threads’
$ export TOIL_GRIDENGINE_ARGS='-q node.q’
$ cwltoil --singularity --batchSystem gridentine tools/workflow.cwl jobs/workflow.yaml
依存関係のあるstepは、前のstepが終了してinputとなるファイルが生成された後にqsubされます。依存関係がないstepはUGEのリソースが空いていれば同時に実行されます。
まとめ
一見するとシェルスクリプトなどより複雑そうに見えますが、以下のようなケースはCWLのメリットがありそうです。時間を取って習得する価値があると言えるでしょう。
・コンテナ対応したい
Dockerコンテナを使うとアプリケーション環境のセッティングが不要となり便利ですし、Singularityならrootで実行される問題もないのでさらに扱いやすいです。しかし自分でワークフローをコンテナ対応させようとすると、コンテナ内での一時ファイル・ディレクトリの扱いなどで意外につまずいてしまうものです。冒頭にも書きましたが、CWLのエンジンはDockerやSingularityのオプションを自動で付加するので、コンテナを扱うコマンドに慣れていなくてもワークフロー実行に適した方法で使うことができます。
・複数の環境で同じ解析をしたい
Docker/Singularityの選択やジョブスケジューラの使用はコマンドオプションで指定するようになっているので、これらの実行環境を変えてもCWLファイル側は変わりません。すなわち、ジョブスケジューラを使用する大規模システムであっても手元のパソコンであっても原則として同じワークフローが実行できるということになります。エンジンが別で複数開発されているので、クラウド対応のもの、MacやWindowsのPCに対応したものと自分の環境に合わせて選択できます。
・正確にワークフローを記述したい
CWLはedamontologyに対応していて、使用するファイルのフォーマットを指定することができます。
http://edamontology.org/page
fastqファイルひとつを取ってもいくつかのフォーマットがあり、曖昧さが残りがちなゲノミクスパイプラインにおいて、より正確さを期することができます。