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}"
"""
}
我有一个包含如下条目的元组通道:
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}"
"""
}