groovy 有没有办法在nextflow中从CSV中查找值?或者,重用CSV?

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

我创建了一个简单的csv作为工作流的一部分,如下所示:

sample,value
A,1
B,0.5

另外,我有另一个通道,其文件名与样品名匹配。我希望能够在新过程中使用与每个样品名关联的值。
我尝试过使用.splitCsv拆分CSV,但是(意料之中的)有时候样本使用了不正确的值,尽管它确实运行了正确的次数。我也尝试过在脚本中使用awk提取相应的值并将其保存到变量中,这会导致使用正确的值,但是它会消耗CSV文件,因此只处理了一个样本。
超级简化的下一个流(DSL 2)脚本:


# !/usr/bin/env nextflow

nextflow.enable.dsl=2

process foo {
   input:
   path input_file

   output:
   path 'file.csv', emit csv

   """
   script that creates csv
   """
}

process bar {
   input:
   path input_file2

   output:
   path 'file.bam', emit bam

   """
   script that creates bam files
   """
}

process help_me {
   input:
   path csv
   path bam

   output:
   path 'result'

   """
   script that uses value from csv on associated bam file
   """
}

workflow {

   foo(params.input)
   bar(params.input2)
   help_me(foo.out.csv, bar.out.bam)
}

谢谢你!
编辑:本质上,有没有一种方法可以同步两个通道,这样我就可以使用一个csv的单独行与关联的文件?

wsewodh2

wsewodh21#

如果您有价值通道,则可以无限次重复使用文件(如CSV),而不会占用通道。例如:

workflow {

   input1 = file( params.input1 )
   input2 = file( params.input2 )

   foo( input1 )
   bar( input2 )

   help_me(foo.out.csv, bar.out.bam)
}

这里,input1input2都是价值通道。
当输入在from子句中指定简单值时,值通道由进程隐式创建。此外,值通道还隐式创建为输入仅为值通道的进程的输出
意味着foo.out.csvbar.out.bam也是值通道。此外,help_me.out也是值通道。如果input2是队列通道,则可以看到input1可以无限次重用:
第一个
结果:

$ nextflow run script.nf
N E X T F L O W  ~  version 22.04.0
Launching `script.nf` [trusting_allen] DSL2 - revision: 75209e4c85
executor >  local (7)
[24/d459f7] process > foo         [100%] 1 of 1 ✔
[04/a903e4] process > bar (2)     [100%] 3 of 3 ✔
[24/7a9a1d] process > help_me (3) [100%] 3 of 3 ✔

请注意,bar.out.bamhelp_me.out现在是队列通道。
相反,如果每个样本(或类似的配置)有一个CSV,那么您将需要一些方法来连接这些通道,并相应地调整新流程的输入声明。您希望避免的是在输入块中声明两个(或更多)队列通道。docs的这一部分是非常值得投入时间的:了解多个输入通道是如何工作的,并解释为什么在使用splitCsv输出时会看到与特定样本相关联的错误值。要连接这些通道,可以使用连接运算符。例如,给定您的简单CSV(如'foo.csv')和先前创建的测试bams:

nextflow.enable.dsl=2

params.input1 = './foo.csv'
params.input2 = './path/to/bams/*.bam'

process help_me {

   debug true

   input:
   tuple val(sample), val(myval), path(bam)

   output:
   path 'result'

   """
   echo -n "sample: ${sample}, myval: ${myval}, bam: ${bam}"
   touch result
   """
}

workflow {

    Channel.fromPath( params.input1 ) \
       | splitCsv( header:true ) \
       | map { row -> tuple( row.sample, row.value ) } \
       | set { rows_ch }

    Channel.fromPath( params.input2 ) \
       | map { bam -> tuple( bam.baseName, bam ) } \
       | join( rows_ch ) \
       | map { sample, bam, myval -> tuple( sample, myval, bam ) } \
       | help_me
}

结果:

$ nextflow run script.nf
N E X T F L O W  ~  version 22.04.0
Launching `script.nf` [lethal_mayer] DSL2 - revision: 395732babc
executor >  local (2)
[c5/e96085] process > help_me (1) [100%] 2 of 2 ✔
sample: B, myval: 0.5, bam: B.bam
sample: A, myval: 1, bam: A.bam

如果您的CSV中有多个粒子样本值,并且这些值是在单独的行中指定的,则您可能需要使用合并运算符。例如,如果您的“foo.csv”包含:

sample,value
A,1
B,0.5
B,2

在上面的示例中,用combine( rows_ch, by:0 )替换,join( rows_ch )。结果:

nextflow run script.nf
N E X T F L O W  ~  version 22.04.0
Launching `script.nf` [festering_miescher] DSL2 - revision: f8de1e0d20
executor >  local (3)
[ee/8af543] process > help_me (3) [100%] 3 of 3 ✔
sample: A, myval: 1, bam: A.bam
sample: B, myval: 0.5, bam: B.bam
sample: B, myval: 2, bam: B.bam

相关问题