🐙

Nextflowのチュートリアル

に公開

はじめに

[Nextflowのチュートリアル>https://www.nextflow.io/docs/latest/index.html]に則ってスクリプトを動かしてみたので、その記録を残す。

Nextflowとは

https://qiita.com/Ken-Kuroki/items/2d67cdc368c9ebaa7198

Nextflow関連の記事

Nextflowのセットアップ

  1. Javaバージョン管理ツール(SDKMAN)のインストール
    SDKMANはJavaのバージョンの管理を行うツールである。詳しくは次の記事を参考にすること。
curl -s "https://get.sdkman.io" | bash
  1. Javaのインストール
sdk install java 
  1. Nextflowのインストール
bash
curl -s https://get.nextflow.io | bash
chmod +x nextflow
sudo mv nextflow /usr/local/bin
nextflow info

手元の環境

WSL2 Ubuntu
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"

  • Nextflowのhttps://www.nextflow.io/docs/latest/install.html

Nextflowのインストール

  1. Install Nextflow:
$ curl -s https://get.nextflow.io | bash
# This will create the nextflow executable in the current directory.
  1. Make Nextflow executable:
$ chmod +x nextflow
# Move Nextflow into an executable path:
$ sudo mv nextflow /usr/local/bin
# Confirm that Nextflow is installed correctly:
$ nextflow info

Nextflow環境のTips

スクリプトの作成

  1. スクリプトを作成する。
    ここでのスクリプト(tutorial.nf)は2つのプロセスを定義する。
  • 最初のプロセスは、文字列を6文字ごとに分割し、それぞれをchunk_というプレフィックスの付いたファイルに書き込む。
  • 次のプロセスは、これらのファイルを受け取り、その内容を大文字に変換する。
  • 結果の文字列はresultチャンネルに出力され、最終的な出力はviewオペレーターによって表示されます。
tutorial.nf
params.str = 'Hello world!'
process splitLetters {
    output:
    path 'chunk_*'

    """
    printf '${params.str}' | split -b 6 - chunk_
    """
}
# paramsはNextflowでパイプラインの設定や入力パラメータを定義するための特別なオブジェクトである。params.strのstrがパラメーター名である。
# processはNextflowで実行する個々のタスクを定義するためのキーワードである。
# output: このプロセスの出力を定義する。ここでは、chunk_*という名前のファイルが出力されることを示す。
# """ で囲まれた部分は、実行されるシェルコマンドを定義する。
# split -b 6 "ファイル名" でファイルを6バイトごとに分割する。ただし、ここでは標準入力がパイプで渡されていることに注意すること。


process convertToUpper {
    input:
    path x

    output:
    stdout

    """
    cat $x | tr '[a-z]' '[A-Z]'
    """
}
# input: セクションでは、入力するデータを定義する。ファイルパス("path")をxという変数名で受け取る。
# プロセスの出力を定義する。ここでは標準出力に結果を出力する。


workflow {
    splitLetters | flatten | convertToUpper | view { it.trim() }
}
**workflow**は、複数のプロセスを組み合わせてパイプラインを定義するためのセクションである。
splitLettersプロセスの出力をflattenで平坦化(リストやネストされた構造をフラットに)し、それをconvertToUpperプロセスに渡す。
convertToUpperプロセスの出力をviewで表示する。ここでは、出力結果をtrim()メソッドで前後の空白を取り除いた形で表示する。

flattenの役割

flattenは、Nextflowの特殊な演算子であり、リストやネストされた構造をフラットにするために使われる。この場合、splitLettersプロセスが複数のファイルを出力するため、それらをフラットな構造にして次のプロセスに渡す。

例として、splitLettersの出力が [chunk_aa, chunk_ab] というリストであった場合、flattenを使うことで、これらのファイルがフラットなリストとしてconvertToUpperプロセスに渡される。

viewによる出力の表示

viewは、データを標準出力に表示するためのNextflowの演算子である。convertToUpperプロセスの出力を受け取り、それを表示する。ここでは、it.trim()メソッドを使って前後の空白を取り除いた形で表示する。

スクリプトの実行

  1. ターミナルで以下のコマンドを入力してスクリプトを実行する:
$ nextflow run tutorial.nf
`Launching tutorial.nf [modest_mestorf] DSL2 - revision: f778e0d112
executor >  local (3)
[7a/9ea28c] splitLetters       | 1 of 1[83/27fddd] convertToUpper (1) | 2 of 2 ✔
WORLD!
HELLO

スクリプトの修正と再実行

Nextflowはパイプラインで実行されたすべてのプロセスを追跡する。スクリプトの一部を変更した場合、実際に変更されたプロセスだけが再実行される。変更されなかったプロセスの実行はスキップされ、キャッシュされた結果が使用される。これにより、パイプラインの一部を再実行することなく、テストや修正を行うことが非常に便利になる。

先のconvertToUpperプロセスを修正し、プロセススクリプトをrev $xという文字列に置き換えて、スクリプトを再実行する。

tutorial.nf
process convertToUpper {
    input:
    path x
    output:
    stdout

    """
    rev $x
    """
}
同じ名前でファイルを保存し、コマンドラインに-resumeオプションを追加して実行する:
```bash
$ nextflow run tutorial.nf -resume
N E X T F L O W  ~  version 23.10.0
executor >  local (2)
[69/c8ea4a] process > splitLetters   [100%] 1 of 1, cached: 1 ✔
[d0/e94f07] process > convertToUpper [100%] 2 of 2 ✔
olleH
!dlrow

splitLettersプロセスの実行がスキップされ(プロセスIDは同じ)、その結果がキャッシュから取得されることが分かる。2番目のプロセスは予想通り実行され、文字列が逆に表示される。

パイプラインパラメータ

パイプラインのパラメータは、スクリプト内で変数名の前に params という接頭辞を付けて宣言する(前述の通り)。ただし、これらの値はコマンドラインでパラメータ名(str)の前に二重ダッシュ文字を付けて指定することで、スクリプト内のデフォルト値を上書きすることができる。
例:

$ nextflow run tutorial.nf --str 'Bonjour le monde'
 N E X T F L O W   ~  version 24.04.2
Launching `tutorial.nf` [jolly_shockley] DSL2 - revision: cbb6c8e124
executor >  local (4)
[26/e5e27a] spl…tters | 1 of 1[ee/dd4f08] con…r (1) | 3 of 3 ✔
edno
m el r
uojnoB

その他チュートリアル

以下のリンクから別のNextflowのチュートリアルを体験できる。おすすめ

Discussion