WDL是Broad Institute开发的一个方便搭建工作流的一种描述性语言,采用了类似yaml、json的语法格式。基本的WDL包括了五大块基本概念:workflow,task,call,command和output。其中workflow,task,call属于顶层组件,也是基础组件,一般一个完整的Workflow需要包含这三部分。

官方链接如下:https://github.com/openwdl/wdl

在流程上我们需要定义workflow、task形式如下:


task my_task {
    [ input definitions ]
    command { ... }
    output { ... }
}

在task中我们定义了command、output,形式如下:

command {
    java -jar myExecutable.jar \
        INPUT=${input_file} \
        OUTPUT=${output_basename}.txt
}
output {
    File out = "${output_basename}.txt"
}

workflow形式:


workflow myWorkflowName {
    call my_task
}

一个简单的示例:

# 一个简单的workflow
workflow helloworld{
    call hello{}
}
task hello{
    String name="world!"
    command{
        echo "hello" ${name}
    }
}

在task中变量类型:

  • String: 字符串类型,例如String name=“test”
  • Float : 浮点型数字,例如:3.1459
  • Int: 整型的数字, 例如:16
  • Boolean : 布尔类型,如 true、 false.
  • File: 文件类型的对象一个文件名命名的对象
  • Array : 数组,如 [A,B,C,D]
  • Map: 字典,如 {“color”: “blue”, “size”: “large”}
  • Object : 对象

WDL主要组件:

  • basename
    basename用来得到一个路径的文件名
  • call
    call 用于workflow中调用task模块
  • command
    command 需要运行的命令,包含在task中
  • meta
    meta 可以写一些描述信息
  • output
    output 定义task的输出部分
  • parmeter_meta
    parameter_meta 用于存放参数的一些描述信息
  • runtime
    runtime 用来定义在不同的平台运行时的一些变量,如:本地、docker等
  • task
    task 任务模块
  • variables
    variables 用来定义一些变量
  • workflow
    workflow 生成相应的工作流模块

例如我们写一个GATK的HaplotypeCaller流程如下:


workflow worflow_HaplotypeCaller {
  call haplotypeCaller
}

task haplotypeCaller {
  File GATK
  File RefFasta
  File RefIndex
  File RefDict
  String sampleName
  File inputBAM
  File bamIndex
  command {
    java -jar ${GATK} \
        -T HaplotypeCaller \
        -R ${RefFasta} \
        -I ${inputBAM} \
        -o ${sampleName}.raw.indels.snps.vcf
  }
  output {
    File rawVCF = "${sampleName}.raw.indels.snps.vcf"
  }
}

然后我们利用WDL执行的引擎软件如:CromwellMiniWDL等都可以作为后端引擎。

我们用womtool(Cromwell套件)生成input文件(json)

java -jar womtool-52.jar inputs xxx.wdl > xxx.wdl.json

{
“worflow_HaplotypeCaller.haplotypeCaller.RefDict”: “File”,
“worflow_HaplotypeCaller.haplotypeCaller.inputBAM”: “File”,
“worflow_HaplotypeCaller.haplotypeCaller.RefIndex”: “File”,
“worflow_HaplotypeCaller.haplotypeCaller.GATK”: “File”,
“worflow_HaplotypeCaller.haplotypeCaller.sampleName”: “String”,
“worflow_HaplotypeCaller.haplotypeCaller.RefFasta”: “File”,
“worflow_HaplotypeCaller.haplotypeCaller.bamIndex”: “File”
}

然后我们定义好json中的变量文件后用Cromwell执行:

java -jar cromwell-52.jar run xxx.wdl -i xxx.wdl.json

整个WDL流程已经介绍完了,在我们常用的工作流程中用它搭建workflow是比我们直接用脚本写流程要便捷和标准化很多。

参考资料:

1.https://support.terra.bio/hc/en-us/articles/360037118252