目录
简介
WDL 定义了一个可执行的流程,它由call调用的一系列task组成,task 是一个模块化的一系列命令,可以复用,由call 语句调用在workflow block里面。task本身定义在外围,它可以import,建议这么书写,增加可保护性。task调用顺序及书写顺序不决定流程执行task的顺序,但是建议顺序书写。task层的变量可以引用workflow层的变量,也可以直接传参。
WDL结构中,变量分为两层,task层和workflow层,最基本的变量有两个,一种是File,对应文件,一种是String对应字符。
官网:https://support.terra.bio/hc/en-us/articles/360037128512-Conditionals-if-else-
Task aliasing
https://support.terra.bio/hc/en-us/articles/360037128592-Task-aliasing
1、WDL 的标准结构
基本包含如下几个部分:workflow、call、task、command、output
示例如下:
workflow myworkflow{
call myTask
}
task myTask{
command {
echo "hello world"
}
output {
String out=read_string(stdout())
}
}
2、进阶版:线性输入
如果要做上一个task的结果用于下一个task的input,则下一个input需要写成上一个task的output的名字,例如输入1)中的ouput:myTask.out (.out取决于output定义的名字)
示例如下:
workflow blastaln {
File Ref
String Refid
String Sample
File InputF
File script
call blast{
input:
refid=Refid,
sampleName=Sample,
Input=InputF
}
call filter{
input:
Input=blast.rawout,
Script=script,
sample=Sample
}
}
task blast {
String refid
String sampleName
File Input
command {
/usr/local/bin/blastn -db /pwd/02.Test/01.WDL/03.gatk/${refid} -query ${Input} -out /pwd/02.Test/01.WDL/03.gatk/${sampleName}.out.test.xls -evalue 0.05 -outfmt 7
}
}
output {
File rawout="${sampleName}.out.xls"
}
task filter {
File Input
String sample
File Script
commad {
python ${script} -i ${Onput} -o ${sample}.out.xls
}
output {
File result="${sample}.out.xls"
}
}
3、进阶版:默认参数输入如何设置
如果一个流程里面有一些脚本和文件都算默认的,平时不需要在json文件中指明,但是需要更改的时候也能改,应该怎么做呢:
在task部分中,写这种类型的文件的全路径,在workflow部分和call部分的时候则不写这些文件,那么在json文件中就会出现dafault参数了。
示例:
workflow test_rmdup {
File bam
File bai
String sample
call RMDUP as rmduping {
input:
bam=bam,bai=bai,sample=sample,
}
}
task RMDUP {
File bam
File bai
String sample
String cluster="bcs.es.g.2xlarge"
String disk_size="350"
File sentieon="/pwd/bin/sentieon"
command {
${sentieon} driver -t 8 -i ${bam} --algo LocusCollector --fun score_info score.txt
${sentieon} driver -t 8 -i ${bam} --algo Dedup --rmdup --score_info score.txt --metrics dedup_metrics.txt ${sample}.deduped.bam
}
output {
File rmdup_bam="${sample}.deduped.bam"
File rmdup_bai="${sample}.deduped.bam.bai"
}
4、进阶版:判断功能
如果一个流程中,需要进行判断,符合条件执行A,不符合条件执行B,则应该怎么做呢?
定义一个布尔值,然后在call 前面加入布尔值的判断语句,可实现if判读执行
示例如下:
workflow STARScript {
File GeneFusion_RNA_filter_Tumor_DB_Script
File GeneFusion_RNA_filter_TN_DB_Script
File Resultbed_Tumor
File Resultbed_Normal
String Sample
Boolean IFnormal
if (!IFnormal) {
call geneFusion_RNA_filter_DB {
input:
Script1=GeneFusion_RNA_filter_Tumor_DB_Script,
Input1=Resultbed_Tumor,
sample=Sample
}
}
if (IFnormal) {
call geneFusion_RNA_filter_Normal_DB {
input:
Script2=GeneFusion_RNA_filter_TN_DB_Script,
Input1=Resultbed_Tumor,
Input2=Resultbed_Normal,
sample=Sample,
}
}
}
task geneFusion_RNA_filter_DB {
File Script1
File Input1
String sample
command {
python ${Script1} -t ${Input1} -o ${sample}_candidate_STAR_Fusion_filter_result.xls
}
output {
File out="${sample}_candidate_STAR_Fusion_filter_result.xls"
}
}
task geneFusion_RNA_filter_Normal_DB {
File Script2
File Input1
File Input2
String sample
command {
python ${Script2} -t ${Input1} -n ${Input2} -o ${sample}_candidate_STAR_Fusion_filter_result.xls
}
output {
File out="${sample}_candidate_STAR_Fusion_filter_result.xls"
}
}