WDL使用目录作为参数

写WDL时,调用目录作为参数传入

需求

WDL里用到了kraken2,其中有个参数--db需要数据库目录作为参数。

  • 无法直接传目录。
    WDL的数据类型只有File,没有Directory。WDL Version 1.1有Directory类型,但目前的Cromwell版本目前不支持WDL Version 1.1。
  • 目录路径每次分析都会改变。
    数据库没有放在镜像内,所以每次Cromwell投递都会将WDL中列出的一堆数据库文件硬链接到call-task中inputs的随机命名的目录,如86***2571-f*7b-476c-b3be-0bf***fe6cfe/call-Kraken2/inputs/-159***78150。

错误方案

Task中声明kraken2_db变量,然后通过command<<<`dirname 原数据库路径`>>>,再赋值kraken2_db变量。
不行,kraken2_db没有被修改,还是一开始声明的值。

正确方案

--db传参时,直接用dirname传入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# WDL

task Kraken2{

input {
String Sample
File Read1
File Read2
Int Threads = 1
}

File kraken2_db_hash = "/***/Database/Kraken2/hash.k2d"
File kraken2_db_inspect = "/***/Database/Kraken2/inspect.txt"
File kraken2_db_opts = "/***/Database/Kraken2/opts.k2d"
File kraken2_db_seqid2taxid = "/***/Database/Kraken2/seqid2taxid.map"
File kraken2_db_taxo = "/***/Database/Kraken2/taxo.k2d"
File kraken2_db_kmer_distrib = "/***/Database/Kraken2/database150mers.kmer_distrib"

command <<<
kraken2 \
--threads ~{Threads} \
--confidence 0.8 \
--minimum-base-quality 20 \
--db `dirname ~{kraken2_db_hash}` \
--output ~{Sample}.output \
--report ~{Sample}.report \
--paired \
~{Read1} \
~{Read2}

bracken \
-r 150 \
-l S \
-t ~{Threads} \
-d `dirname ~{kraken2_db_hash}` \
-i ~{Sample}.report \
-o ~{Sample}.bracken
>>>

output {
File k2_output = "~{Sample}.output"
File k2_report = "~{Sample}.report"
File bracken = "~{Sample}.report"
}

runtime {
docker: "***/kraken2:v2.1.2"
cpus: threads
}
}