【9.3.5.2】CWL and Shell Tools
问题:
- CWL工具描述和CWL工作流之间有什么区别?
- 我们如何创建工具描述符?
- 我们如何在单步工作流程中使用它?
目标:
- 描述工具与其对应的CWL文档之间的关系
- 命名输入和输出时采用良好做法
- 了解如何引用文件进行输入和输出
- 说明只有描述中明确提到的文件才会包含在步骤/工作流的输出中
- 为调试目的,对步骤/工作流生成的所有文件进行批量捕获
- 使用STDIN和STDOUT作为输入和输出
- 捕获写入特定目录、工作目录或输入所在的同一目录的输出
CWL工作流是用YAML语法编写的。这个简短的教程解释了在CWL中使用的YAML的各个部分。CWL文档包含工作流和运行该工作流的要求。所有CWL文件应以两行代码开头:
cwlVersion: v1.2
class:
cwlVersion字符串定义了工具或工作流所需的语言标准。最新版本是v1.2。
class字段定义了这个特定文档是什么。大多数CWL文档将分为两个类之一:CommandLineTool或Workflow。
- CommandLineTool类用于描述命令行工具的接口,
- 而Workflow类用于将这些工具描述连接到工作流中。
在本课中,将解释这两个类之间的差异,如何将数据传递到命令行工具和从命令行工具传递数据,并为这些工具指定工作环境,最后是如何在工作流中使用工具描述。
您应该按照本课中新手教程练习目录中的示例进行操作。
首先进入到文件夹:
cd novice-tutorial-exercises
一、我们的第一个CWL脚本
为了演示工具描述符的基本要求,将检查流行的“Hello world!”演示的CWL描述。
echo.cwl
cwlVersion: v1.2
class: CommandLineTool
baseCommand: echo
inputs:
message_text:
type: string
inputBinding:
position: 1
outputs: []
输入文件:hello_world.yml
message_text: Hello world!
We will use the reference CWL runner, cwltool to run this CWL document (the .cwl workflow file) along with the .yml input file.
cwltool echo.cwl hello_world.yml
输出:
INFO Resolved 'echo.cwl' to 'file:///.../echo.cwl'
INFO [job echo.cwl] /private/tmp/docker_tmprm65mucw$ echo \
'Hello world!'
Hello world!
INFO [job echo.cwl] completed success
{}
INFO Final process status is success
上面显示的输出表明程序已经成功运行,并且它的输出是Hello world!。
让我们更详细地了解echo.cwl脚本。
如上所述,前两行总是相同的,定义了CWL版本和脚本的类。在本例中,类是CommandLineTool,尤其是echo命令。下一行baseCommand包含将要运行的命令(echo)。
inputs:
message_text:
type: string
inputBinding:
position: 1
此代码块包含工具描述的输入部分。本节提供了运行此特定工具所需的所有输入。要运行此示例,我们需要提供一个字符串,该字符串将包含在命令行中。每个输入都有一个名称,以帮助我们区分它们;第一个输入的名称是:messagetext。字段inputBinding是指定输入应如何显示在命令行上的一种方法。这里,位置字段指示输入将在命令行上的哪个位置;在这种情况下,messagetext值将是添加到命令行的第一个值(在baseCommand、echo之后)。
outputs: []
最后是工具描述的输出。这个例子没有正式的输出。文本直接打印在终端中。因此,使用一个空的YAML列表([])作为输出。
为了使脚本更具可读性,将输入字段放在输出字段的前面。然而,CWL语法只要求正确定义每个字段,而不要求它们按特定顺序排列。
二、CWL single step workflow
来自引入事件的RNA-seq数据将用于第一个CWL工作流程。RNA测序分析的第一步是使用fastqc工具对RNA读数进行质量控制。该工具已经可以使用,因此无需编写新的CWL工具描述。
rna_seq_workflow_1.cwl
cwlVersion: v1.2
class: Workflow
inputs:
rna_reads_fruitfly: File
steps:
quality_control:
run: bio-cwl-tools/fastqc/fastqc_2.cwl
in:
reads_file: rna_reads_fruitfly
out: [html_file]
outputs:
quality_report:
type: File
outputSource: quality_control/html_file
在workflow中,steps字段必须始终存在。此字段中列出了要运行的工作流任务或步骤。目前,工作流只包含一个步骤:quality_control。在接下来的几集中,将向工作流中添加更多步骤。
让我们仔细看看工作流程。首先将解释inputs字段。
inputs:
rna_reads_fruitfly: File
查看fastqc工具的CWL脚本,它需要一个fastq文件作为输入。在这个例子中,fastq文件由果蝇的RNA读数组成。所以我们调用变量rna_reads_fruitfly,它的类型是File。为了使其他研究人员能够理解这一工作流程,使用了不言自明和合理的变量名称。
给输入和输出一个合理的名称是非常重要的。尽量不要使用inputA或inputB这样的变量名,因为其他人可能不理解它的意思。
脚本的下一部分是step字段。
steps:
quality_control:
run: bio-cwl-tools/fastqc/fastqc_2.cwl
in:
reads_file: rna_reads_fruitfly
out: [html_file]
工作流的每一步都需要一个名称,工作流的第一步称为quality_control。每一步都需要一个run、一个in和一个out。run字段包含要运行的工具的CWL文件的位置。in字段将输入字段连接到fastqc工具。fastqc工具有一个名为reads_file的输入参数,因此它需要将reads_file连接到rna_reads_fruitfly。最后,out字段是要使用的工具的输出参数列表。在本例中,fastqc工具生成一个名为html_file的输出文件。
脚本的最后一部分是输出字段。
outputs:
quality_report:
type: File
outputSource: quality_control/html_file
输出字段中的每个输出都需要自己的名称。在这个例子中,输出被称为qc.html。在qc.html中定义了输出的类型。quality_control步骤的输出是一个文件,因此qc.html类型为file。outputSource字段指的是输出所在的位置,在本例中,它来自步骤quality_control,称为html_file。
当您想要运行此工作流时,您需要提供一个包含工作流所需输入的文件。这个文件类似于上一节中的hello_world.yml文件。输入文件名为workflow_input_1.yml
workflow_input_1.yml
rna_reads_fruitfly:
class: File
location: rnaseq/GSM461177_2_subsampled.fastqsanger
format: http://edamontology.org/format_1930 # FASTA
在输入文件中,提供了在工作流的输入部分中声明的输入的值。工作流将rna_reads_fruitfly作为输入参数,因此我们在输入文件中使用相同的变量名。设置输入时,需要定义对象的类,例如类:File或类:Directory。location字段包含输入文件的位置,在这种情况下,它是一个本地路径,但我们可以直接使用原始url位置:https://zenodo.org/record/4541751/files/GSM461177_2_subsampled.fastqsanger 在本例中,需要最后一行来提供fastq文件的格式。
运行脚本:
cwltool --cachedir cache rna_seq_workflow_1.cwl workflow_input_1.yml
输出:
...
Analysis complete for GSM461177_2_subsampled.fastqsanger
INFO [job quality_control] Max memory used: 179MiB
INFO [job quality_control] completed success
INFO [step quality_control] completed success
INFO [workflow ] completed success
{
"quality_report": {
"location": "file:///.../GSM461177_2_subsampled.fastqsanger_fastqc.html",
"basename": "GSM461177_2_subsampled.fastqsanger_fastqc.html",
"class": "File",
"checksum": "sha1$e820c530b91a3087ae4c53a6f9fbd35ab069095c",
"size": 378324,
"path": "/.../GSM461177_2_subsampled.fastqsanger_fastqc.html"
}
}
INFO Final process status is success
为了保存中间结果以便以后重复使用,我们使用–cachedir缓存;其中,cache是用于存储缓存的目录(它可以被赋予任何名称,这里我们只是为了简单起见而使用cache)。如果需要回收磁盘空间,您可以随时安全地删除缓存目录。
总结:
- A tool description describes the interface to a command line tool.
- A workflow describes which command line tools to use in one or more steps.
- A tool descriptor is defined using the ComandLineTool class.
- FIXME: How can we use a tool descriptor in a single step workflow?
参考资料
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn