利用WDL語(yǔ)言書(shū)寫(xiě)數(shù)據(jù)處理流程


The Workflow Description Language (WDL) is a way to specify data processing workflows with a human-readable and -writeable syntax. WDL makes it straightforward to define analysis tasks, chain them together in workflows, and parallelize their execution. The language makes common patterns simple to express, while also admitting uncommon or complicated behavior; and strives to achieve portability not only across execution platforms, but also different types of users. Whether one is an analyst, a programmer, an operator of a production system, or any other sort of user, WDL should be accessible and understandable.
WDL的官方說(shuō)明文檔: Getting Started With WDL


目前在GATK4的流程中,基本都是以WDL的形式編寫(xiě)的鸵钝。WDL沒(méi)有太多復(fù)雜的邏輯和語(yǔ)法糙臼,入門(mén)簡(jiǎn)單。首先看一個(gè)hello world的例子

workflow myWorkflow {
   call myTask
}
task myTask {
   command {
       echo "hello world"
   }
   output {
       String out = read_string(stdout())
   }
}

對(duì)于一個(gè)WDL腳本而言恩商,有以下5個(gè)核心結(jié)構(gòu)
1.workflow: 工作流定義

  1. task : 工作流包含的任務(wù)定義
  2. call: 調(diào)用或觸發(fā)工作流里面的 task 執(zhí)行
  3. command: task在計(jì)算節(jié)點(diǎn)上要執(zhí)行的命令行
  4. output: task 或 workflow 的輸出定義
  5. runtime: task在計(jì)算節(jié)點(diǎn)上的運(yùn)行時(shí)參數(shù)变逃,包括 CPU、內(nèi)存怠堪、docker 鏡像等
    image.png

每個(gè)腳本包含1個(gè)workflow揽乱, workflow由多個(gè)task構(gòu)成名眉。 在workflow中,通過(guò)call調(diào)用對(duì)應(yīng)的task凰棉。每個(gè)taskworkflow代碼塊之外單獨(dú)定義损拢。

task代表任務(wù),讀取輸入文件撒犀,執(zhí)行相應(yīng)命令探橱,然后輸出。command中對(duì)應(yīng)的就是執(zhí)行的命令绘证,比如一條具體的gatk的命令隧膏,output指定task的輸出值∪履牵可以將task理解為編程語(yǔ)言中的函數(shù)胞枕,每個(gè)函數(shù)讀取輸入的參數(shù),執(zhí)行代碼魏宽,然后返回腐泻,command對(duì)應(yīng)執(zhí)行的具體代碼,output對(duì)應(yīng)返回值队询。

在WDL中派桩,也是可以傳遞參數(shù)的。taskworkflow中的寫(xiě)法不同

變量利用

我們要把一個(gè)處理步驟構(gòu)造成一個(gè)task, 就要封裝計(jì)算軟件的命令行蚌斩,那么命令行的參數(shù)如何傳入呢铆惑?輸出文件的名字如何指定呢?這些問(wèn)題在 WDL 中可以通過(guò)變量來(lái)解決送膳。比如 Hello world 例子中的 String out 就是一個(gè)字符串類(lèi)型的輸入员魏,用于指定輸出文件的名字。WDL 中的變量可以定義在 workflow 中叠聋,也可以定義在 task中撕阎。在commandoutput 中可以通過(guò)${}的方式來(lái)引用變量。

變量的類(lèi)型主要有以下幾種:

  1. String
  2. Int
  3. Float
  4. File
  5. Boolean
  6. Array[T]
  7. Map[K, V]
  8. Pair[X, Y]
  9. Object
workflow 中的參數(shù)

下面的示意圖中碌补, workflow 有3個(gè)參數(shù)虏束,文件類(lèi)型的my_ref,my_input 和字符串類(lèi)型的name厦章。傳遞這3個(gè)參數(shù)給task時(shí)镇匀,直接傳變量名就可以了。


image.png
task 中的參數(shù)

下面的示意圖中闷袒,task 有3個(gè)輸入的參數(shù)坑律,文件類(lèi)型的ref,in 和字符串類(lèi)型的id。 在command中晃择,通過(guò)${ref}這種格式訪問(wèn)變量的值冀值。


image.png
Task 如何組成Workflow呢

作為流程管理語(yǔ)言,需要對(duì)多個(gè)task統(tǒng)一管理宫屠。task之間具有多種關(guān)系

1. 線性輸出關(guān)系:
image.png

第一種是最常見(jiàn)的場(chǎng)景列疗,簡(jiǎn)單的線性串聯(lián),多個(gè) task 依次執(zhí)行浪蹂,前面步驟的輸出作為后面步驟的輸入抵栈,最后一個(gè) task 的輸出作為整個(gè) workflow 的輸出。
示例如下:

workflow LinearChain {
 File firstInput
 call stepA { input: in=firstInput }
 call stepB { input: in=stepA.out }
 call stepC { input: in=stepB.out }
}
task stepA {
 File in
 command { programA I=${in} O=outputA.ext }
 output { File out = "outputA.ext" }
}
task stepB {
 File in
 command { programB I=${in} O=outputB.ext }
 output { File out = "outputB.ext" }
}
task stepC {
 File in
 command { programC I=${in} O=outputC.ext }
 output { File out = "outputC.ext" }
}
2. 多對(duì)多的依賴(lài)關(guān)系

一個(gè)task的輸出作為多個(gè)task的輸入坤次,或者多個(gè)task的輸出作為1個(gè)task的輸入
case1:


image.png
workflow MultiOutMultiIn {
 File firstInput
 call stepA { input: in=firstInput }
 call stepB { input: in=stepA.out }
 call stepC { input: in1=stepB.out1, in2=stepB.out2 }
}
task stepA {
 File in
 command { programA I=${in} O=outputA.ext }
 output { File out = "outputA.ext" }
}
task stepB {
 File in
 command { programB I=${in} O1=outputB1.ext O2=outputB2.ext }
 output {
   File out1 = "outputB1.ext"
   File out2 = "outputB2.ext" }
}
task stepC {
 File in1
 File in2
 command { programB I1=${in1} I2=${in2} O=outputC.ext }
 output { File out = "outputC.ext" }
}

case2:


image.png

示例如下:

workflow BranchAndMerge {
 File firstInput
 call stepA { input: in=firstInput }
 call stepB { input: in=stepA.out }
 call stepC { input: in=stepA.out }
 call stepD { input: in1=stepC.out, in2=stepB.out }
}
task stepA {
 File in
 command { programA I=${in} O=outputA.ext }
 output { File out = "outputA.ext" }
}
task stepB {
 File in
 command { programB I=${in} O=outputB.ext }
 output { File out = "outputB.ext" }
}
task stepC {
 File in
 command { programC I=${in} O=outputC.ext }
 output { File out = "outputC.ext" }
}
task stepD {
 File in1
 File in2
 command { programD I1=${in1} I2=${in2} O=outputD.ext }
 output { File out = "outputD.ext" }
}
3. 平行執(zhí)行關(guān)系(并行計(jì)算)
image.png
workflow ScatterGather {
 Array[File] inputFiles
 scatter (oneFile in inputFiles) {
   call stepA { input: in=oneFile }
 }
 call stepB { input: files=stepA.out }
}
task stepA {
 File in
 command { programA I=${in} O=outputA.ext }
 output { File out = "outputA.ext" }
}
task stepB {
 Array[File] files
 command { programB I=${files} O=outputB.ext }
 output { File out = "outputB.ext" }
}

task和函數(shù)還是有一定的區(qū)別古劲,函數(shù)可以在代碼中多次調(diào)用,但是task多次調(diào)用會(huì)有風(fēng)險(xiǎn)缰猴。下面的示意圖中产艾,stepA 運(yùn)行兩次,一次作為stepB的輸入滑绒,一次作為stepC的輸入闷堡。如果stepA的兩次調(diào)用并行執(zhí)行,當(dāng)執(zhí)行完之后疑故,在傳遞給下一個(gè)task時(shí)杠览,由于存在兩個(gè)同名的stepA, stepB和stepC 就會(huì)無(wú)法正確接受參數(shù)。

image.png

WDL中提供了解決方案纵势,叫做task alias, 為task起一個(gè)別名踱阿,示例如下

workflow taskAlias {
 File firstInput
 File secondInput
 call stepA as firstSample { input: in=firstInput }
 call stepA as secondSample { input: in=secondInput }
 call stepB { input: in=firstSample.out }
 call stepC { input: in=secondSample.out }
}
task stepA {
 File in
 command { programA I=${in} O=outputA.ext }
 output { File out = "outputA.ext" }
}
task stepB {
 File in
 command { programB I=${in} O=outputB.ext }
 output { File out = "outputB.ext" }
}
task stepC {
 File in
 command { programC I=${in} O=outputC.ext }
 output { File out = "outputC.ext" }
}

在WDL腳本中, 理論上每個(gè)task 只可以調(diào)用1次,如果希望多次調(diào)用吨悍,必須借助task alias扫茅。

輸入?yún)?shù)如何傳入

workflow 的輸入,比如基因樣本的存儲(chǔ)位置育瓜、計(jì)算軟件的命令行參數(shù)、計(jì)算節(jié)點(diǎn)的資源配置等栽烂,可以通過(guò) json 文件的形式來(lái)指定躏仇。使用 wdltools 工具可以根據(jù) WDL 文件來(lái)生成輸入模板:


image.png

模板格式如下:


image.png

當(dāng)然,如果工作流不是很復(fù)雜腺办,也可以按照上面的格式手寫(xiě) input 文件焰手。下面是一個(gè) GATK 工作流的 input 文件的片段.


image.png
實(shí)際例子

使用 GATK 構(gòu)建的Jointcalling
workflow定義


image.png

image.png

image.png

image.png

掌握以上幾點(diǎn),就可以理解一個(gè)wdl腳本的整體框架了怀喉。在實(shí)際使用中书妻,我們只要能理解整個(gè)workflow的流向,會(huì)使用wdl腳本就可以了躬拢。 運(yùn)行wdl腳本躲履,需要兩個(gè)文件

  1. cromwell.jar
  2. womtools.jar

最新版的下載鏈接如下:

https://github.com/broadinstitute/cromwell/releases/tag/31

第一步是得到輸入?yún)?shù)的列表见间,用法如下

java -jar womtools.jar inputs myWorkflow.wdl > myWorkflow_inputs.json

json格式存存儲(chǔ),這一步得到的只是一個(gè)模板工猜,需要編輯這個(gè)文件米诉,將對(duì)應(yīng)的參數(shù)替換成實(shí)際的參數(shù) 第二步運(yùn)行腳本,用法如下

java -jar Cromwell.jar run myWorkflow.wdl —inputs myWorkflow_inputs.json

reference:

https://developer.aliyun.com/article/716546
https://cloud.tencent.com/developer/article/1626274

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篷帅,一起剝皮案震驚了整個(gè)濱河市史侣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魏身,老刑警劉巖惊橱,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異箭昵,居然都是意外死亡李皇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)宙枷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掉房,“玉大人,你說(shuō)我怎么就攤上這事慰丛∽壳簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵诅病,是天一觀的道長(zhǎng)哪亿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)贤笆,這世上最難降的妖魔是什么蝇棉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮芥永,結(jié)果婚禮上篡殷,老公的妹妹穿的比我還像新娘。我一直安慰自己埋涧,他們只是感情好板辽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著棘催,像睡著了一般劲弦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上醇坝,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天邑跪,我揣著相機(jī)與錄音,去河邊找鬼。 笑死画畅,一個(gè)胖子當(dāng)著我的面吹牛砸琅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夜赵,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼明棍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寇僧?” 一聲冷哼從身側(cè)響起摊腋,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘁傀,沒(méi)想到半個(gè)月后兴蒸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡细办,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年橙凳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笑撞。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岛啸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茴肥,到底是詐尸還是另有隱情坚踩,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布瓤狐,位于F島的核電站瞬铸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏础锐。R本人自食惡果不足惜嗓节,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望皆警。 院中可真熱鬧拦宣,春花似錦、人聲如沸耀怜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)财破。三九已至,卻和暖如春从诲,著一層夾襖步出監(jiān)牢的瞬間左痢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俊性,地道東北人略步。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像定页,于是被迫代替她去往敵國(guó)和親趟薄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容