groovy 下一个流程:将fromFilePairs的输入转换为(map,list_pair_1,list_pair_2)的元组

yvgpqqbh  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(113)

在我的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()
2w3rbyxf

2w3rbyxf1#

为了得到你想要的,你需要collect操作符,它给你一个值通道:

Channel
    .fromFilePairs( '/path/to/files/*.vcf.gz{,.tbi}' )
    .collect { sample, indexed_vcf -> [ indexed_vcf ] }
    .map { 
        def fmeta = [ "id": "test" ]

        [ fmeta, it*.first(), it*.last() ] 
    } 
    .view()

如果没有详细的说明,很难说清楚,但是通常不需要将索引文件与实际的VCF文件分开。如果这个通道直接用作进程输入,我倾向于修改输入声明,这样我就可以使用类似下面的语句:

Channel
    .fromPath( '/path/to/files/*.vcf.gz{,.tbi}' )
    .collect()
    .map { 
        def fmeta = ["id": "test"]

        [ fmeta, it ]
    } 
    .view()

相关问题