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

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

在我的Nextflow工作流中,我需要处理类似于以下示例的文件。

  1. a.vcf.gz
  2. a.vcf.gz.tbi
  3. b.vcf.gz
  4. b.vcf.gz.tbi
  5. c.vcf.gz
  6. c.vcf.gz.tbi

特别是,我需要创建一个通道,它将使用以下结构输出它们:

  1. [
  2. ["id": "test"],
  3. ["a.vcf.gz", "b.vcf.gz", "c.vcf.gz"],
  4. ["a.vcf.gz.tbi", "b.vcf.gz.tbi", "c.vcf.gz.tbi"]
  5. ]

这意味着单个Map的元组、*.vcf.gz文件的一个元组和*.vcf.gz.tbi文件的一个元组。
我的问题是,从我阅读的文档来看,如何从一个以三个为一组顺序发出项目的通道创建它并不明显。
为了简单起见,我使用Channel.fromFilePairs

  1. ch_input = Channel
  2. .fromFilePairs("*{.vcf.gz,.vcf.gz.tbi}")

这就是我陷入困境的地方。我得到的最接近的方法是废弃fromFilePairs并使用groupTuple

  1. ch_input = Channel
  2. .fromPath("*.vcf.gz*")
  3. .map {
  4. file ->
  5. def fmeta = ["id": "test"]
  6. value = file.extension == "gz" ? "vcf": "tbi"
  7. [value, file]
  8. }.groupTuple()
  9. println ch_input.view()

其给出:

  1. [tbi, [/Users/einar/Coding/a.vcf.gz.tbi, /Users/einar/Coding/c.vcf.gz.tbi, /Users/einar/Coding/einar/b.vcf.gz.tbi]]
  2. [vcf, [/Users/einar/Coding/b.vcf.gz, /Users/einar/Coding/a.vcf.gz, /Users/einar/Coding/c.vcf.gz]]

这仍然是远离我想要的和更脆弱的,因为它依赖于文件扩展名。
Channel.multiMap接近我想要的,但是它生成多个通道,而我需要的是一个通道。
如何才能做到这一点呢?

编辑

这是另一个尝试,它得到了我想要的,但它看起来有点陈腐和脆弱的我:

  1. ch_input = Channel
  2. .fromPath("*.vcf*")
  3. .map{
  4. file ->
  5. [file.extension, file]
  6. }.groupTuple()
  7. .map {
  8. it ->
  9. def fmeta = ["id": "test"]
  10. [fmeta, it[1].flatten()]
  11. }.groupTuple()
  12. .map{
  13. it ->
  14. [it[0], it[1][0], it[1][1]]
  15. }
  16. println ch_input.view()
2w3rbyxf

2w3rbyxf1#

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

  1. Channel
  2. .fromFilePairs( '/path/to/files/*.vcf.gz{,.tbi}' )
  3. .collect { sample, indexed_vcf -> [ indexed_vcf ] }
  4. .map {
  5. def fmeta = [ "id": "test" ]
  6. [ fmeta, it*.first(), it*.last() ]
  7. }
  8. .view()

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

  1. Channel
  2. .fromPath( '/path/to/files/*.vcf.gz{,.tbi}' )
  3. .collect()
  4. .map {
  5. def fmeta = ["id": "test"]
  6. [ fmeta, it ]
  7. }
  8. .view()
展开查看全部

相关问题