【问题标题】:Saving the contents of a file generated inside process script into Nextflow variable将在流程脚本中生成的文件的内容保存到 Nextflow 变量中
【发布时间】:2021-10-23 21:43:24
【问题描述】:

我有一个 Nextflow 进程,它使用 bash 脚本 (check_bam.sh) 生成文本文件。该文本文件内容的唯一选项是 0 或任何其他数字。我想提取该 0 或其他值并将其保存到 Nextflow 变量中,以便能够使用条件,如果文件的内容为 0,则 Nextflow 脚本应该跳过一些进程,并且如果是其他任何不为零的数字,则应完全执行。我在使用 Nextflow 条件和将通道设置为空方面没有问题,但是在将脚本部分内部生成的值保存到 Nextflow 变量以使用外部进程的部分中。

生成0或其他数字的文件(result_bam.txt)的过程如下(我已经简化了,尽量清楚):

process CHECK_BAM {

input:
path bam from channel_bam

output:
path "result_bam.txt"
path "result_bam.txt" into channel_check_bam

script:
"""
bash bin/check_bam.sh $bam > result_bam.txt
"""

我检查的是 BAM 文件中映射读取的数量,我想将该数字保存到 Nextflow 变量中,因为如果该数字为零,则执行应跳过以下大部分过程,但如果number 不为零,这意味着文件中存在映射读取,并且应按预期继续执行。

我认为也许使用cat result_bam.txt > $FOOFOO=``cat result_bam.txt` 可能是一个解决方案,但我不知道如何正确保存它,以便该变量在进程之间可用。

【问题讨论】:

    标签: bash groovy bioinformatics nextflow


    【解决方案1】:

    使用env channelFOO=``cat result_bam.txt 获取数据并将其转换为通道。

    【讨论】:

    • 不知道这种频道,我一定会试试的,谢谢!
    • 更新:我尝试了您的解决方案并且效果很好!感谢您的分析器:)
    【解决方案2】:

    我的脑海中浮现的东西很少,希望我能很好地理解您的问题。 check_bam.sh 是否只计算 BAM 文件的行数?


    我的第一个选择是检查您是否有可能,检查 BAM 文件是否包含来自您的管道的内容。这可能有用:countLines_documentation。在这里你应该小心,因为巨大的 BAM 文件会导致内存异常(countLines “加载”文件)。


    第二种选择,也许更好,是将文件result_bam.txt 传递到通道channel_check_bam,然后,应该运行以下过程来判断文件内容(文件result_bam.txt 中的数字)是否大于0。所以,当您正在将此通道连接到其他进程,您应该将内容阅读为:

    input:
      val bam_lines from channel_check_bam.map{ it.readLines() } // Gives a list of lines, so 1st line will be your number of mapped reads.
    
    when:
      bam_lines[0].toInteger() > 0 
    

    这种方式只有在result_bam.txt 中的数字大于 0 时才会运行。
    我正在使用 DSL2 进行测试,因此代码可能需要一些小改动 - 但它可以工作。


    Cris Tuñí - 编辑:2021 年 8 月 24 日

    感谢 DawidGaceck 的帮助,我可以编辑我的进程以仅在文件中的数字不为零时运行。我的代码如下所示:

    process CHECK_BAM {
    
    input:
    path bam from channel_bam
    
    output:
    path "result_bam.txt"
    path "result_bam.txt" into channel_check_bam_process1,
                               channel_check_bam_process2
    
    script:
    """
    bash bin/check_bam.sh $bam > result_bam.txt
    """
    
    process PROCESS1 {
    
    input:
      val bam_lines from channel_check_bam_process1.map{ it.readLines() } 
    
    when:
      bam_lines[0].toInteger() > 0 
    
    script:
    """
    foo bar baz
    """
    

    希望这可以帮助任何有相同问题或类似问题的人!

    【讨论】:

    • 嗨!谢谢你的回答!确切地说,check_bam.sh 脚本正在计算行数,因此当行数为零时,这意味着 BAM 文件为空。无论如何,我都会研究countLines 方法,但是您使用when 语句和其他进程的解决方案似乎会更好,因为我不必使用巨大的if else 语句。测试后我会编辑我的答案并通知您,再次感谢!
    • 无法编辑消息,但已经尝试了第二种解决方案并且效果很好!非常感谢:)
    • 没问题,很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2016-12-31
    • 2020-07-12
    • 2012-02-02
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多