当前位置: 首页 > article >正文

WDL脚本实战(一)-工作流、程序体、语法检查、输入输出及运行

WDL是由Broad Institute开发的一种生物信息流程开发语言,与传统的shell流程相比,具有复用性好、支持多种集群架构、便于多任务并行等优势,初次接触,写了个简易流程试水。

1.WDL参考资料

WDL语言的一些基本概念可参考以下教程:

  • Cromwell +WDL学习:https://blog.csdn.net/qq_41551450/article/details/93486438
  • GATK Cromwell +WDL学习:https://blog.csdn.net/theomarker/article/details/79627804
  • WDL学习笔记:https://www.jianshu.com/p/979fd06661cb
  • 官方文档:https://github.com/openwdl/wdl/blob/main/versions/development/SPEC.md
2.流程代码及简介
#工作流:先创建新目录,再创建一个空文件,最后在空文件中写入内容。
#声明task create_workdir所需的参数workdir_path
#call task create_workdir:传入task create_workdir所需参数workdir
#call task create_file:传入task create_file所需参数filedir,内容为task create_workdir的输出work_path
#call task write_file:传入task write_file所需参数workdir和filepath,其中filepath内容为task create_file的输出file_pathworkflow myWorkflow {String workdir_pathcall create_workdir {input:workdir = workdir_path}call create_file {input:filedir = create_workdir.work_path}call write_file {input:workdir = workdir_path,filepath = create_file.file_path}
}#创建目录,并在目录创建代表操作完成的workdir.SUCCESS文件,若目录已存在,只创建workdir.EXIST文件。
#输入:待创建目录路径
#输出:创建的目录路径(输入、输出内容其实完全相同)#声明:变量workdir类型为字符串
#command:可执行的shell代码,可用{}或<<<>>>括起,建议用<<<>>>,区分于代码其他部分,提高可读性
#output:声明并赋值后,可作为其他task的输入
task create_workdir {String workdircommand <<<if [ ! -d ${workdir} ]; thenmkdir ${workdir}touch ${workdir}/workdir.SUCCESSelsetouch ${workdir}/workdir.EXISTfi>>>output {String work_path = "${workdir}"}
}#创建空文件,并在文件所在目录创建代表操作完成的file.SUCCESS文件,若文件已存在,输出语句“File exist!”,并创建file.EXIST文件
#输入:文件所在目录(即task create_workdir的输出目录),文件路径(文件所在目录+文件名)
#输出:文件路径
task create_file {String filedirString filename = filedir + "/test1.txt"command <<<if [ ! -f ${filename} ]; thentouch ${filename}touch ${filedir}/file.SUCCESSelseecho "File exist!"touch ${filedir}/file.EXISTfi>>>output {String file_path = "${filename}"}
}#向文件中写入内容,并在文件所在目录创建代表操作完成的write.SUCCESS文件,若文件不存在,输出语句“File not exist!”,并创建write.FAIL文件
#输入:文件路径
#输出:文件内容
task write_file {String workdirString filepathString file_content = "Tomorrow is another day."command <<<if [ -f ${filepath} ]; thenecho "${file_content}" >${filepath}touch ${workdir}/write.SUCCESSelseecho "File not exist!"touch ${workdir}/write.FAILfi  >>>output {String file_txt = "${file_content}"}
}
3.语法检查与流程图

安装womtool:https://anaconda.org/bioconda/womtool

完成WDL流程后,可通过womtool进行语法检查,有语法错误会输出错误信息,无则输出“Success!”

#无语法错误
java -jar ../docker/womtool-46.jar validate workflow_test_pipe1.wdlSuccess!#语法错误:workflow缺少一个花括号
java -jar ../docker/womtool-46.jar validate workflow_test_pipe1.wdlERROR: Unexpected symbol (line 21, col 1) when parsing '_gen10'.Expected rbrace, got task.task create_workdir {
^$e = :identifier <=> :dot :identifier -> MemberAccess( lhs=$0, rhs=$2 )

womtool还可根据task间的输入输出关系绘制流程图,清晰地展示各task之间的依赖关系:

java -jar ../docker/womtool-46.jar graph workflow_test_pipe1.wdl >workflow_test_pipe1.wdl.dot
#转换为svg格式
dot -Tsvg -o workflow_test_pipe1.wdl.svg workflow_test_pipe1.wdl.dot

workflow_test_pipe1.wdl.svg
参考:
Linux命令之dot - 绘制DOT语言脚本描述的图形:https://www.cnblogs.com/zengkefu/p/5569649.html

4.参数输入

womtool可解析WDL脚本,创建json格式的参数输入文件,格式为:

{"<workflow name>.<task name>.<variable name>": "<variable type>"
}

示例:

java -jar ../docker/womtool-46.jar inputs workflow_test_pipe1.wdl >workflow_test_pipe1.wdl.jsoncat workflow_test_pipe1.wdl.json
{"myWorkflow.write_file.file_content": "String (optional, default = \"Tomorrow is another day.\")","myWorkflow.workdir_path": "String"
}

整个工作流中,需要输入的参数仅为:workdir_path(需要创建的新目录路径)和task write_file中的file_content(写入文件test1.txt的内容)。
且file_content已指定默认值,可在json文件中直接删除该行,不传入任何参数。

修改json文件,只输入workdir_path:

vi workflow_test_pipe1.wdl.json
{"myWorkflow.workdir_path": "/home/test/wdl_test/test/test2/"
}
5.运行

运行需安装cromwell:
https://github.com/broadinstitute/cromwell/releases

运行示例:

java -jar ../docker/cromwell-45.1.jar run workflow_test_pipe1.wdl --inputs workflow_test_pipe1.wdl.json

打开workdir_path,可见被写入内容的test1.txt文件和3个表示运行正常的SUCCESS空文件:

cd /home/test/wdl_test/test/test2ls
file.SUCCESS  test1.txt  workdir.SUCCESS  write.SUCCESScat test1.txt 
Tomorrow is another day.

再次运行脚本,由于目录和文件已存在,会创建workdir.EXIST文件和file.EXIST文件,并再次写入文件内容。

6.标准输出

运行WDL脚本后,WDL文件所在目录会新增cromwell-executions和cromwell-workflow-logs两个目录,标准输出及错误均可在cromwell-executions中查看

#进入cromwell-executions目录,可见以myWorkflow(工作流名称)命名的目录
cd cromwell-executions/
ls
helloworld  myWorkflow  test#进入工作流目录及其最新的运行目录
cd myWorkflow/
ll -t |head
total 0
drwxrwxr-x 5 test test 96 Apr 27 11:13 26fe9d20-bb48-4beb-b992-1264002ed5fbcd 26fe9d20-bb48-4beb-b992-1264002ed5fb/#可见以"call-task名"命名的目录
ls
call-create_file  call-create_workdir  call-write_file#进入call-create_file/execution,可见运行脚本,标准输出,标准错误等文件
ls
rc  script  script.background  script.submit  stderr  stderr.background  stdout  stdout.background#task create_file的标准输出“File exist!”即在stdout文件中
cat stdout
File exist!
http://www.lryc.cn/news/2417260.html

相关文章:

  • 视频压缩和分析方面数据集 Tencent Video Dataset (TVD)
  • jQuery 效果 ——fadeIn() 方法、fadeOut() 方法
  • request.setAttribute()和request.getSession().setAttribute()解释
  • 三大工厂模式(简单工厂、工厂方法、抽象工厂)
  • 电力线载波通信PRIME PLC协议最新重要解读
  • Qt 图形视图框架<二>——<QGraphicsView、QGraphicsScene>
  • HTML中的表单
  • input设置为只读模式
  • 二值化神经网络(BNN)基础学习(一)
  • 网络安全中数据加密技术的发展趋势及相关应用
  • mywife.cc 神一样的存在!
  • Vulkan简介
  • Ubuntu之开篇
  • 第7章、单选按钮RadioGroup与复选框CheckBox(从零开始学Android)
  • class类文件结构
  • [创业-18]:财务报表之资产负债表
  • Python pdf2word -- pdf文件转word文件
  • JS+CSS仿admin5站长网首页导航菜单代码
  • 腾讯工蜂的使用
  • ​​Jmeter性能测试(性能测试,Jmeter使用与结果分析)
  • IPsec 9个包分析(主模式+快速模式)
  • androidP: apk安装流程
  • Parallel的使用 之Parallel.forrech
  • 详解 Android 中 BroadcastReceiver
  • 用spss进行主成分分析
  • php fakepath,chrome上传图片 路径为c:/fakepath的解决办法
  • 常见编码方式之间的区别
  • 经典算法研究系列:八、再谈启发式搜索算法
  • IEEE会议排名(转载)
  • Libsvm使用笔记【matlab】