在我的Nextflow工作流中,我需要处理类似于以下示例的文件。
a.vcf.gz
a.vcf.gz.tbi
b.vcf.gz
b.vcf.gz.tbi
c.vcf.gz
c.vcf.gz.tbi
特别是,我需要创建一个通道,它将使用以下结构输出它们:
[
["id": "test"],
["a.vcf.gz", "b.vcf.gz", "c.vcf.gz"],
["a.vcf.gz.tbi", "b.vcf.gz.tbi", "c.vcf.gz.tbi"]
]
这意味着单个Map的元组、*.vcf.gz
文件的一个元组和*.vcf.gz.tbi
文件的一个元组。
我的问题是,从我阅读的文档来看,如何从一个以三个为一组顺序发出项目的通道创建它并不明显。
为了简单起见,我使用Channel.fromFilePairs
:
ch_input = Channel
.fromFilePairs("*{.vcf.gz,.vcf.gz.tbi}")
这就是我陷入困境的地方。我得到的最接近的方法是废弃fromFilePairs
并使用groupTuple
:
ch_input = Channel
.fromPath("*.vcf.gz*")
.map {
file ->
def fmeta = ["id": "test"]
value = file.extension == "gz" ? "vcf": "tbi"
[value, file]
}.groupTuple()
println ch_input.view()
其给出:
[tbi, [/Users/einar/Coding/a.vcf.gz.tbi, /Users/einar/Coding/c.vcf.gz.tbi, /Users/einar/Coding/einar/b.vcf.gz.tbi]]
[vcf, [/Users/einar/Coding/b.vcf.gz, /Users/einar/Coding/a.vcf.gz, /Users/einar/Coding/c.vcf.gz]]
这仍然是远离我想要的和更脆弱的,因为它依赖于文件扩展名。Channel.multiMap
接近我想要的,但是它生成多个通道,而我需要的是一个通道。
如何才能做到这一点呢?
编辑:
这是另一个尝试,它得到了我想要的,但它看起来有点陈腐和脆弱的我:
ch_input = Channel
.fromPath("*.vcf*")
.map{
file ->
[file.extension, file]
}.groupTuple()
.map {
it ->
def fmeta = ["id": "test"]
[fmeta, it[1].flatten()]
}.groupTuple()
.map{
it ->
[it[0], it[1][0], it[1][1]]
}
println ch_input.view()
1条答案
按热度按时间2w3rbyxf1#
为了得到你想要的,你需要collect操作符,它给你一个值通道:
如果没有详细的说明,很难说清楚,但是通常不需要将索引文件与实际的VCF文件分开。如果这个通道直接用作进程输入,我倾向于修改输入声明,这样我就可以使用类似下面的语句: