Nextflow 通过正则表达式匹配组合

Nextflow combine by regex match

我有一个包含如下条目的元组通道:

SH7794_SA119138_S1_L001, [R1.fq.gz, R2.fq.gz]

一个 csv 分成 36 个条目,每个条目如下:

[samplename:SH7794_SA119138_S1, mouseID:1-4, treat:vehicle, dose:NA, time:day18, tgroup:vehicle__day18, fastqsuffix:_L001_R1_001.fastq.gz, bamsuffix:_Filtered.bam, trim:fulgentTrim, species:human, host:mouse, outlier:NA, RIN:6.9]

我能够使用 each 关键字将元组通道与 csv 条目结合起来。这导致每个元组的所有 36 个 csv 行的叉积。然后我添加了一个 when 条件来进行过滤:

  input:
    tuple sampleid, reads from fq
    each samplemeta from samplelist

  ...

  when:
    sampleid.contains(samplemeta.samplename)

这可行,但我很好奇这是否是合适的解决方案。通过将来自一个通道的值与来自第二个通道的多个值进行匹配,使用正则表达式动态加入通道的正确方法是什么?

我倾向于避免像这样使用 each 限定符,因为文档中有以下建议:

If you need to repeat the execution of a process over n-tuple of elements instead a simple values or files, create a channel combining the input values as needed to trigger the process execution multiple times. In this regard, see the combine, cross and phase operators.

我实际上认为没有办法使用正则表达式加入频道,但您可以使用 combine 运算符生成两个频道发出的项目的笛卡尔积。如果您提供 by 参数,则可以组合共享公共匹配键的项目。例如,未测试:

params.reads = '/path/to/fastq/*_{,L00?}_R{1,2}.fq.gz'


Channel
    .fromPath('sample_list.csv')
    .splitCsv(header: true)
    .map { row -> tuple( row.samplename, row ) } 
    .set { sample_metadata }

Channel
    .fromFilePairs( params.reads )
    .combine( sample_metadata, by: 0 )
    .set { test_inputs }


process test {

    input:
    tuple val(sample_id), path(reads), val(metadata) from test_inputs

    script:
    def (fq1, fq2) = reads

    """
    echo "sample_id: ${sample_id}"
    echo "reads: ${fq1}, ${fq2}"
    echo "metadata: ${metadata}"
    """
}