Workflow 定义
在一个Workflow里面可以包含一个或多个process
和operator
。例如:
nextflow.enable.dsl=2
include {QUANT;INDEX} from './modules/module.nf'
workflow RNASEQ_QUANT_PIPE {
read_pairs_ch = channel.fromFilePairs('data/yeast/reads/*_{1,2}.fq.gz')
transcriptome_ch = channel.fromPath('/data/yeast/transcriptome/*.fa.gz')
QUANT(INDEX(transcriptome_ch),read_pairs_ch)
}
// Implicit workflow
workflow {
/*
* Call sub-workflow using <WORKFLOWNAME>() syntax
*/
RNASEQ_QUANT_PIPE()
}
不声明任何名称的workflow是main workflow(类似于C中的main函数),并且它是隐式执行的。因此,它是应用程序的入口点。
workflow 参数
workflow 可以访问外部作用域中定义的任何变量和参数。例如:
nextflow.enable.dsl=2
include {QUANT;INDEX} from './modules/module.nf'
params.transcriptome = '/some/data/file'
read_pairs_ch = channel.fromFilePairs('data/yeast/reads/*_{1,2}.fq.gz')
workflow RNASEQ_QUANT_PIPE {
transcriptome_ch = channel.fromPath(params.transcriptome)
QUANT(INDEX(transcriptome_ch),read_pairs_ch)
}
workflow 输入
workflow 可以使用take
关键字来生明一个或多个输入channel。例如:
nextflow.enable.dsl=2
include {QUANT;INDEX} from './modules/module.nf'
params.transcriptome = '/some/data/file'
read_pairs_ch = channel.fromFilePairs('data/yeast/reads/*_{1,2}.fq.gz')
workflow RNASEQ_QUANT_PIPE {
take:
transcriptome_ch
read_pairs_ch
main:
transcriptome_ch = channel.fromPath(params.transcriptome)
INDEX(transcriptome_ch)
QUANT(INDEX.out,read_pairs_ch)
}
当使用
take
关键字时,需要用main
关键字标识 workflow 主体的开头。
调用 workflow 时,就像调用函数一样,传入对应的参数即可:
nextflow.enable.dsl=2
include {QUANT;INDEX} from './modules/module.nf'
params.transcriptome = '/some/data/file'
read_pairs_ch = channel.fromFilePairs('data/yeast/reads/*_{1,2}.fq.gz')
workflow RNASEQ_QUANT_PIPE {
take:
transcriptome_ch
read_pairs_ch
main:
transcriptome_ch = channel.fromPath(params.transcriptome)
INDEX(transcriptome_ch)
QUANT(INDEX.out,read_pairs_ch)
}
workflow {
RNASEQ_QUANT_PIPE(transcriptome_ch,read_pairs_ch )
}
workflow 的输入应该是 channel 类型的数据结构。如果传入一个基本数据类型,如数字,字符串,列表等等。它会被隐式的转换为一个value channel(非可消耗的)。
workflow 输出
workflow 可以使用emit
关键字来声明一个或多个输出。例如:
nextflow.enable.dsl=2
include {QUANT;INDEX} from './modules/module.nf'
params.transcriptome = '/some/data/file'
read_pairs_ch = channel.fromFilePairs('data/yeast/reads/*_{1,2}.fq.gz')
workflow RNASEQ_QUANT_PIPE {
take:
transcriptome_ch
read_pairs_ch
emit:
QUANT.out
main:
transcriptome_ch = channel.fromPath(params.transcriptome)
INDEX(transcriptome_ch)
QUANT(INDEX.out,read_pairs_ch)
}
可以使用out
属性来获取RNASEQ_QUANT_PIPE
执行得到的结果,如:RNASEQ_QUANT_PIPE.out
。
当有多个输出时,可以像访问数组一样来访问输出结果。例如:
RNASEQ_QUANT_PIPE.out[0]
RNASEQ_QUANT_PIPE.out[1]
或者也可以使用指定的名称来访问输出通道:
nextflow.enable.dsl=2
workflow RNASEQ_QUANT_PIPE {
main:
INDEX(transcriptome_ch)
QUANT(INDEX.out,read_pairs_ch)
emit:
read_quant = QUANT.out
}
则可以根据名称来访问:RNASEQ_QUANT_PIPE.out.read_quant
。
将脚本作为模块包含时,将忽略隐式workflow。这允许编写一个既可以用作库模块又可以用作应用程序脚本的 workflow 脚本。
指定 workflow 入口点
默认情况下,未命名的workflow是入口点。也可以显式指明入口点,例如:
$ nextflow run main.nf -entry RNASEQ_QUANT_PIPE