我正在设置一个 Nextflow 管道,它可以处理单组和多组输入文件。处理一组文件时,我想使用命令行参数,例如:
nextflow run main.nf --fasta sample.fasta --hmmdb database.hmm
对于多组文件,我更喜欢通过 CSV 文件提供它们:
nextflow run main.nf --input samples.csv
samples.csv 文件如下所示:
fasta,hmmdb
sample1.fasta,database1.hmm
sample2.fasta,database2.hmm
当前工作流程:
这是我的 main.nf 脚本的相关部分:
workflow {
main:
if (params.input != null) {
// Read input CSV file
input_ch = Channel
.fromPath(params.input)
.splitCsv(header: true)
.map { row -> tuple(
file(row.fasta),
file(row.hmmdb)
)
}
input_ch.view()
} else {
// Use conventional arguments
input_ch = Channel.of(
tuple(
file(params.fasta),
file(params.hmmdb)
)
)
}
ch_versions = Channel.empty()
// Launch the main pipeline workflow
ACTUAL_PIPELINE(
input_ch,
ch_versions
)
ch_versions = ch_versions.mix(ACTUAL_PIPELINE.out.versions)
//...
}
以及
ACTUAL_PIPELINE
工作流程:
workflow ACTUAL_PIPELINE {
take:
ch_params // Channel containing tuples of [fasta_file, hmmdb_file]
ch_versions // Channel for version information
main:
// Attempting to access the files from the channel
collected = ch_params.collect()
fasta = collected[0]
hmmdb = collected[1]
// Rest of the pipeline
//...
}
当我尝试使用collect()收集ch_params的内容,然后使用collected[0]和collected[1]访问文件时,遇到以下错误:
ERROR ~ Unexpected error [StackOverflowError]
ch_params
工作流程中正确访问或迭代来自 ACTUAL_PIPELINE
的文件?感谢您的协助!
如何正确访问或迭代 ch_params 中的文件 在 ACTUAL_PIPELINE 工作流程内?
注意 ch_params 是一个通道,因此调用 collect 运算符也将返回一个通道。它不能像列表一样被切片,我认为这是这里的问题。一种解决方案可能是传入一个闭包以在收集每个项目之前对其进行转换(假设这是所需要的),例如:
workflow ACTUAL_PIPELINE {
take:
ch_params
ch_versions
main:
fasta_ch = ch_params.collect { fasta, hmmdb -> fasta }
hmmdb_ch = ch_params.collect { fasta, hmmdb -> hmmdb }
...
}
是否有特定于 Nextflow 的方法来处理单个和多个 高效输入而不会出错?
考虑使用 nf-schema 插件。它支持示例表格式,包括 CSV、TSV、JSON 和 YAML。您仍然需要以某种方式处理单个和多个输入(像您已经拥有的 if/else 语句就可以了),但它至少可以让您验证您的输入,从而减少错误。具体来说,它允许您根据管道架构验证输入参数,并根据示例表架构验证示例表的内容。来自文档:
include { validateParameters; paramsSummaryLog; samplesheetToList } from 'plugin/nf-schema'
// Validate input parameters
validateParameters()
// Print summary of supplied parameters
log.info paramsSummaryLog(workflow)
// Create a new channel of metadata from a sample sheet passed to the pipeline through the --input parameter
ch_input = Channel.fromList(samplesheetToList(params.input, "assets/schema_input.json"))
确实没有办法避免错误,但 VS Code 的 Nextflow 扩展应该有助于语法突出显示等: