检查nextflow通道是否为空

时间:2020-09-24 08:52:20

标签: channel nextflow

我正在尝试弄清楚如何检查频道是否为空。

例如,我有两个过程。只有在设置了参数/标志的组合的情况下,第一个进程才会运行,如果已设置,还检查其来自另一个进程的输入文件(通过通道输入)是否为空,然后为第二个进程创建一个新的输入文件(以最终替换默认的一个)。作为简化示例:

.....
.....

// create the channel here to force nextflow to wait for the first process
_chNewInputForProcessTwo = Channel.create()

process processOne {
  when:
    params.conditionOne && parameters.conditionTwo
  input:
      file inputFile from _channelUpstreamProcess
 output:
      file("my.output.file") into _chNewInputForProcessTwo
  script:
    """
    # check if we need to produce new input for second process (i.e., input file not empty)
    if [ -s ${inputFIle} ]
      then
          <super_command_to_generate_new_fancy_input_for_second_process> > "my.output.file" 
      else
          echo "No need to create new input"
    fi
   """
}

// and here I would like to check if new input was generated or leave the "default" one
_chInputProcessTwo = Channel.from(_chNewInputForProcessTwo).ifEmpty(Channel.value(params.defaultInputProcessTwo))

process secondProcess {
  input:
      file inputFile from _chInputProcessTwo
......
......
etc.

当我尝试使用这种方法运行时,它失败了,因为通道_chNewInputForProcessTwo包含DataflowQueue(queue=[]),实际上并不为空。

我已经尝试了几种方法来查看文档以及Google网上论坛和Gitter上的主题。试图将其设置为空,但随后它抱怨我试图两次使用该通道。放置create().close()

是否有一种干净/合理的方法来做到这一点?我可以使用值通道来执行此操作,并让第一个进程在stdout上输出一些字符串,以供第二个进程拾取和检查,但这对我来说似乎很肮脏。

任何建议/反馈都值得赞赏。预先谢谢你!

Marius

1 个答案:

答案 0 :(得分:1)

最好避免尝试检查通道是否为空。如果您的频道可以为空,并且您的频道中需要一个默认值,则可以使用ifEmpty运算符来提供一个默认值。请注意,单个值隐式为value channel。我认为您所需要的只是:

myDefaultInputFile = file(params.defaultInputProcessTwo)

chInputProcessTwo = chNewInputForProcessTwo.ifEmpty(myDefaultInputFile)

此外,通常不需要调用Channel.create()