【问题标题】:Provide NextFlow workflow inputs (not parameters) via the CLI通过 CLI 提供 NextFlow 工作流输入(不是参数)
【发布时间】:2021-07-08 04:25:07
【问题描述】:

我有以下(简化的)nextflow 模块。它有一个进程,在 fasta 文件上运行多序列比对,以及运行该进程的工作流(最终它也会运行其他进程):

process clustal_omega_msa {
    input:
      path fastas
    output:
      path 'clustal.sto'
    script:
      """
      cat ${fastas} > merged.fa
      clustalo -infile merged.fa --outfmt=stockholm
      """
    container "https://depot.galaxyproject.org/singularity/clustalo:1.2.4--h1b792b2_4"
}

workflow msa {
  take:
    path fastas
  main:
    clustal_omega_msa(fastas)
}

我希望这个工作流程既可以作为子工作流程导入,也可以直接执行。出于这个原因,我没有指定任何参数,而只使用了输入(因为我认为在调用子工作流时无法指定参数)。

但是,我看不到直接在命令行上运行此子工作流的方法。

如果我运行nextflow run msa.nf -entry msa,我会收到以下错误:

No such variable: fastas

 -- Check script 'msa.nf' at line: 1 or see '.nextflow.log' file for more details

这是有道理的——我没有指定这些文件的来源。但我怎么能?如果我遵循文档的config 部分并创建一个具有以下内容的nextflow.config

fastas = "/some/path/to/*.fasta"

我仍然收到此错误。我也知道有一个-params-file 选项,但我相信它只适用于参数,而不是输入。

【问题讨论】:

    标签: nextflow


    【解决方案1】:

    Implicit workflow definitions 将脚本作为模块导入时被忽略。这意味着您的工作流脚本可以用作库模块或应用程序脚本:

    nextflow.enable.dsl=2
    params.input_fasta_files = './data/*.fasta'
    
    
    process clustal_omega_msa {
    
        input:
        path fastas
        
        output:
        path 'clustal.sto'
    
        """
        cat ${fastas} > merged.fa
        clustalo -infile merged.fa --outfmt=stockholm
        """
    }
    
    workflow msa {
      
        take:
        fasta_files
      
        main:
        clustal_omega_msa(fasta_files)
    }
    
    workflow {
    
        input_fasta_files = Channel.fromPath( params.input_fasta_files ).collect()
    
        msa( input_fasta_files )
    }
    

    请注意,如果您要将“msa”子工作流程移动到一个单独的文件中,例如名为“msa.nf”的文件中,您可以将其导入并使用addParams option 为其指定任何所需的参数。例如:

    nextflow.enable.dsl=2
    
    include { msa } from './path/to/msa.nf' addParams(foo: 'bar')
    
    params.input_fasta_files = './data/*.fasta'
    
    
    workflow {
    
        input_fasta_files = Channel.fromPath( params.input_fasta_files ).collect()
    
        msa(input_fasta_files)
    }
    

    【讨论】:

    • 两个很好的建议,谢谢。似乎这两种方法都是向子工作流添加参数而不是在 CLI 上实际指定输入的方法?我想我原来的问题是不可能的?
    • 完全不用担心@Migwell。所以我不确定我是否理解正确。如果您要在命令行上指定 --input_fasta_files '/path/to/*.fasta',那么这将覆盖脚本中指定的 params.input_fasta_files 的现有值,这将覆盖在 nextflow.confg 或其他配置文件中指定的任何值。请看:nextflow.io/docs/latest/getstarted.html#pipeline-parameters
    • 另外,请查看params scope,了解如何在 nextflow.config 中指定参数。例如,在您的示例中,您需要params.fastas = "/some/path/to/*.fasta"。 HTH。
    • 所以您已经向我展示了如何使用 参数,我只是想知道是否可以在不使用参数的情况下从 CLI 指定工作流输入。可能你不能,我只是想确认一下
    • 我认为参数仍然是创建输入通道的正确方法。工作流输入必须是通道(或简单的数据类型,这将创建一个价值通道)。这就是本节底部的注释所说的内容:nextflow.io/docs/latest/dsl2.html#workflow-inputsHTH
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多