We've moved!
For WDL questions, see the WDL specification and WDL docs.
For Cromwell questions, see the Cromwell docs and please post any issues on Github.

Dynamically Change Workflow Output Based on Conditional

Hi,
I am needing to dynamically add/remove certain workflow outputs based on a conditional statement.

Below is an example of what I want to do (I am currently getting a syntax error using this method). If there is no way to it this way, could someone suggest an alternative way? I do not want to have to declare in if statement before multiple output sections, as there are quite a number of other tasks in the pipeline, which are to be kept in all cases---and doing it that way would require me to have an output section for each possible combination of possible outputs.

I thought about just querying the output metadata, and taking all those outputs which are not null. However, I do not want to keep all task outputs, as some of them are just intermediate outputs (e.g., a SAM file before it is converted to BAM). I would like to just have one set of output files, which include only the ones I want to keep, so that I can automate some things in our archiving of output files.

workflow example {
  String run_type = "this"

  # other task calls ...

  if (run_type == "this") {
    call this
  }
  if (run_type == "that") {
    call that
  }

  output {
    # other task outputs to keep ...

    if (run_type == "this") {
      File this_file = this.this_file
    }
    if (run_type == "that") {
      File that_file = that.that_file
    }
  }
}
Tagged:

Best Answer

  • mcovarrmcovarr Cambridge, MA ✭✭
    Accepted Answer

    I don't think you can do conditional outputs in current versions of WDL. I'm not sure if this helps you, but if you're interested in keeping only the non-null value in a single output:

    task this {
      command {}
      output {
        String out = "this"
      }
    }
    
    task that {
      command {}
      output {
        String out = "that"
      }
    }
    
    workflow example {
      String run_type = "this"
    
      # other task calls ...
    
      if (run_type == "this") {
        call this
      }
      if (run_type == "that") {
        call that
      }
    
      output {
        # other task outputs to keep ...
        Array[String?] outs = [this.out, that.out]
        String out = select_first(outs)
      }
    }
    

    The workflow out output will have the value this.

Answers

  • mcovarrmcovarr Cambridge, MAMember, Broadie, Dev ✭✭
    Accepted Answer

    I don't think you can do conditional outputs in current versions of WDL. I'm not sure if this helps you, but if you're interested in keeping only the non-null value in a single output:

    task this {
      command {}
      output {
        String out = "this"
      }
    }
    
    task that {
      command {}
      output {
        String out = "that"
      }
    }
    
    workflow example {
      String run_type = "this"
    
      # other task calls ...
    
      if (run_type == "this") {
        call this
      }
      if (run_type == "that") {
        call that
      }
    
      output {
        # other task outputs to keep ...
        Array[String?] outs = [this.out, that.out]
        String out = select_first(outs)
      }
    }
    

    The workflow out output will have the value this.

Sign In or Register to comment.