Skip to content

Skip process execution

Problem

You have two sequential tasks in your workflow. When an optional flag is specified, the first task should be skipped and its input(s) should be processed by the second task.

Solution

Use an empty channel, created in a conditional expression, to skip the first process execution when an optional parameter is specified. Then, define the second process input as a mix of the first process output (when executed) and the input channel.

Code

params.skip = false
params.input = "$baseDir/data/reads/sample.fq.gz" 

process foo {
  input:
  path x

  output:
  file('*.fastq')

  script:
  """
  < $x zcat > ${x.simpleName}.fastq
  """
}

process bar {
  debug true

  input: 
  path x

  script:
  """
  echo your_command --input $x
  """
}

workflow {
  input_ch = Channel.fromPath(params.input)

  (foo_ch, bar_ch) = params.skip
    ? [Channel.empty(), input_ch] 
    : [input_ch, Channel.empty()]

  foo_ch | foo | mix(bar_ch) | bar
}

Run it

Use the the following command to execute the example:

nextflow run nextflow-io/patterns/skip-process-execution.nf

The processes foo and bar are executed. Run the same command with the --skip command line option:

nextflow run nextflow-io/patterns/skip-process-execution.nf --skip

This time only the bar process is executed.