1先决条件

本教程假设您有关于码头工人的基本知识概念。

请注意:目前我们支持CWL草案2个扩展,但我们很快就会支持CWL v1.0。

2应用程序,工作流程和工具

在我们的术语,一个工作流由一个或多个工具,他们两人只是应用程序给用户。你可以想象一些原始输入数据通过管道与许多节点,每一步执行一个函数中的数据流,最后,你要你想要的:一个完全处理过的数据或结果(情节、报告、行动)。

这里有一些关键的想法:

  • 工具是单位或单个节点的工作流程,所以不同的工具可以被连接到一个工作流。这就是我们实现组件的可重用性。
  • 工具是描述与关键组件:输入、输出、参数和需求和更多的细节。你了解这个工具更像是一个黑盒(容器),消化一些输入(s)与指定的设置和另一种格式的输出。
  • 当输入文件匹配输出两个工具之间,他们可以连接。
  • 输入由文件和参数,我们称之为类型:文件、枚举、整数、字符串等等。
  • 应用程序可以被描述在JSON / YAML格式,遵循通用工作流语言(CWL)开源标准。
  • CWL只是逻辑和模式的集合。执行这纯文本文件,我们需要在云中遗嘱执行人或当地。七桥平台,您可以简单地执行它的规模。

看起来充满了术语和难以理解。这是一个例子。csv表,你有一个完整的缺失值和你想处理的3个步骤:

  1. 代替缺失值
  2. 过滤掉行“年龄”列小于10
  3. 输出3项:一个csv文件处理表,情节和PDF格式的汇总报告。

可以描述每一步到单个模块或工具然后他们一个接一个连接到形成一个流。你可以把一切都成一个单一的“工具”,然后缺点在于,其他用户不能使用你的step1缺失值问题。这是艺术和sciense灵活性和效率之间的杠杆。

为什么我们使用CWL ?想象一封单独的文件信或工作流的工具,可以在任何地方执行复制的方式,你不需要安装任何因为集装箱码头工人成像,这将改变世界的计算机科学研究和我们如何做研究和发布结果。在这个包中我们试图隐藏CWL尽可能多的细节,所以用户可以使用它像一个典型的R的函数。

3在R中描述的工具

工具是基本单位,通常你也“乐高砖”开始。开发者还需要提供那些“乐高”piecies用户直接运行它或使自己的流。

提供的主界面sevenbridges包是工具函数,它比写更直接描述你的原始CWL从头JSON文件。R中的“工具”的对象可以被导出到JSON或进口CWL JSON文件。

我强烈建议复习文档工具编辑器章的癌症基因组学云要了解它是如何工作的,甚至是试穿的平台GUI。这将有助于更好地理解我们的R界面。

3.1从JSON文件导入

有时人们分享工具在纯JSON文本格式。您可以简单地加载到R通过使用convert_app函数,这将识别您的JSON文件自动类(工具或工作流)。

库(sevenbridges) t1 < -系统。文件(“extdata /应用程序”、“tool_star。json”,包= " sevenbridges ") # # json文件转换成一个工具对象t1 < - convert_app (t1) # #试着打印出来# t1

通过这种方式,您可以加载它,修改它,使用它与API或编辑和出口它返回JSON文件。然而,在本教程中,最重要的是你学习如何描述它直接在R。

3.2Utilitites工具对象

我们提供几个utitlities帮助建设自己的CWL工具迅速在r .所有availale util请查看帮助(“工具”)

一些有用的你会发现它有用的在执行任务时,您需要知道什么是输入类型,什么是输入id和它是否需要,所以你可以用参数需要执行的任务。试着玩input_matrix要发送如下所示。

#获取输入类型信息头(t1要美元())
读取readMatesLengthsIn readMapNumber limitOutSJoneRead”文件……”"enum" "int" "int" limitOutSJcollapsed outReadsUnmapped "int" "enum"
#获取输出类型信息头(t1 output_type美元())
aligned_reads transcriptome_aligned_reads“文件”“文件”reads_per_gene log_files“文件”“文件…”splice_junctions chimeric_junctions“文件”的“文件”
#返回输入矩阵头的更多信息(t1 input_matrix美元())
id标签类型需要1 #读取序列文件读取…真正的95 # sjdbGTFfile拼接结文件文件…假102 #基因组基因文件文件真2 # readMatesLengthsIn读取长度enum假3 # readMapNumber读取地图int假4 # limitOutSJoneRead连接最大数量int假前缀1 < NA > 95 < NA > 102 < NA > 2——readMatesLengthsIn 3——readMapNumber 4——limitOutSJoneRead文件1 FASTA FASTQ, FA, FQ FASTQ。广州,FQ。广州,FASTQ。BZ2,获取FQ。BZ2 95 GTF获取,人造石铺地面,TXT 102焦油2空3零4 null
#只有几个字段返回头(t1 input_matrix美元(c (“id”、“类型”、“要求”)))
id类型所需的1 #读取文件…真正的95 # sjdbGTFfile文件…假102 #基因组文件真2 # readMatesLengthsIn enum假3 # readMapNumber int假4 # limitOutSJoneRead int假
#只返回所需的t1 input_matrix美元(要求= TRUE)
id标签类型需要前缀1 #读取序列文件读取…真正的< NA > 102 #基因组基因文件文件真实< NA >文件1 FASTA FASTQ, FA, FQ FASTQ。广州,FQ。广州,FASTQ。BZ2,获取FQ。BZ2 102获取焦油
#返回输出矩阵与t1 output_matrix美元的更多信息()
id标签类型文件1 # aligned_reads对齐的SAM / BAM文件山姆,BAM 2 # transcriptome_aligned_reads每个基因转录组比对文件BAM 3 # reads_per_gene读取文件选项卡4 # log_files日志文件文件…5 # splice_junctions接头连接文件选项卡6 # chimeric_junctions嵌合连接文件结7 # unmapped_reads未映射读取文件…FASTQ 8 # intermediate_genome中间基因组文件文件焦油9 # chimeric_alignments嵌合比对文件山姆
#返回只有几个字段t1 output_matrix美元(c (“id”、“类型”))
id类型1 # 2 # transcriptome_aligned_reads aligned_reads文件文件3 # 4 # log_files reads_per_gene文件文件…5 # 6 # chimeric_junctions splice_junctions文件文件7 # unmapped_reads文件…8 # 9 # chimeric_alignments文件intermediate_genome文件
#得到所需的输入id t1 get_required美元()
读取基因组“文件…”"File"
#设置新要求输入ID, #或# t1 set_required美元(c(“#读”、“winFlankNbins”))
没有实现!
t1 get_required美元()
读取基因组“文件…”"File"
输入节点# #关掉要求读取t1 set_required美元(“读取”,假)
没有实现!
t1 get_required美元()
读取基因组“文件…”"File"
#获取输入id头(t1 input_id美元())
# * #星#星“#读”“# readMatesLengthsIn”“# readMapNumber”# * #星#星“# limitOutSJoneRead”“# limitOutSJcollapsed”“# outReadsUnmapped”
#得到全部输入id和工具名称头(t1 input_id美元(真正的))
文件…enum“#明星。读”“#明星。readMatesLengthsIn“int int”#明星。readMapNumber”“#明星。limitOutSJoneRead“int enum”#明星。limitOutSJcollapsed # STAR.outReadsUnmapped”
#获取输出id头(t1 output_id美元())
# * #明星”# aligned_reads”“# transcriptome_aligned_reads”#星#星“# reads_per_gene”“# log_files”#星#星“# splice_junctions”“# chimeric_junctions”
#得到全部输出id头(t1 output_id美元(真正的))
文件文件“#明星。aligned_reads”“#明星。transcriptome_aligned_reads”文件文件…“#明星。reads_per_gene”“#明星。log_files“文件文件”#明星。splice_junctions # STAR.chimeric_junctions”
#获取输入和输出对象t1 get_input美元(id = " # winFlankNbins ")
类型:——“零”——int标签:侧翼区域大小描述:= log2 (winFlank),赢得侧面左右侧翼区域的大小为每个窗口(int > 0)。streamable:没有id:“# winFlankNbins”inputBinding:位置:0前缀:——winFlankNbins独立:是的shellQuote:没有小企业:cmdInclude:是的streamable:没有分隔符:“小企业:类别:Windows、锚,装箱小企业:toolDefaultValue:“4”要求:不
t1 get_input美元(name =“ins”)
[[1]]类型:——“零”——int标签:马克斯箱之间的锚描述:马克斯的容器数量之间的两个锚锚允许聚合成一个窗口(int > 0)。streamable:没有id:“# winAnchorDistNbins”inputBinding:位置:0前缀:——winAnchorDistNbins独立:是的shellQuote:没有小企业:cmdInclude:是的streamable:没有分隔符:“小企业:类别:Windows、锚,装箱小企业:toolDefaultValue:“9”要求:没有[[2]]类型:——“零”——int标签:马克斯插入连接描述:最大连接数动态地插入到基因组在映射阶段,包括注释和那些发现在2-pass运行的第一步。streamable:没有id:“# limitSjdbInsertNsj”inputBinding:位置:0前缀:——limitSjdbInsertNsj独立:是的shellQuote:没有小企业:cmdInclude:是的streamable:没有分隔符:“小企业:类别:限制小企业:toolDefaultValue:“1000000”要求:不
t1 get_output美元(id = " # aligned_reads”)
类型:——“零”文件标签:对齐的SAM / BAM描述:对齐序列在山姆/ BAM格式。streamable:没有id:“# aligned_reads”outputBinding:一团:引擎:“# cwl-js-engine”脚本:| - {(job.inputs美元。outSortingType = = SortedByCoordinate) {sort_name = '。sortedByCoord其他}{sort_name = "}如果($ job.inputs。outSAMtype = =‘砰’){sam_name =“* . align”。concat (sort_name .out.bam)} {sam_name = " * .Aligned.out。山姆”}返回sam_name}类:表达个:文件:山姆,砰
t1 get_output美元(name = "基因")
类型:——“零”文件标签:读取每个基因描述:文件,读取每个基因的数量。读是计算重叠(1元或更多)有且只有一个基因。streamable:没有id:“# reads_per_gene”outputBinding:一团:“* ReadsPerGene *”小企业:文件:选项卡

3.3创建自己的工具

3.3.1介绍

在我们继续之前,这就是看起来完全描述工具,你并不总是需要描述所有这些细节,下面的部分将指导您完成简单的例子完全像这样的例子。

fl < -系统。文件(“码头工人/ rnaseqGene / rabix”、“发电机。R”、包= " sevenbridges”)猫(readline (fl), 9 =“\ n”)
库(sevenbridges) rbx < -工具(标签id =“rnaseqGene”=“rnaseqGene”,描述=“RNA-seq Differiencial表达流和报告”,暗示=需求(码头工人(拉=“腾飞/ rnaseqGene”), cpu (1), mem (2000)), baseCommand = " performDE。R”,输入=列表(输入(id =“bamfiles”,标签=“bam文件”,描述=“bam文件的列表”,type = "文件…”,# #或type = ItemArray(“文件”)前缀= "——bamfiles”,要求= TRUE, itemSeparator = ", "),输入(id =“设计”,标签=“设计矩阵”,type = "文件",要求= TRUE,前缀=”——设计”),输入(id =“gtffile”标签=“基因特性文件”,type = "文件",stageInput =“复制”,要求= TRUE,前缀=”——gtffile”),输入(id =“格式”标签=“报告foramt html或pdf”, type = enum(“格式”,c (pdf, html)),前缀=”——格式”)),输出=(输出列表(id =“报告”,标签=“报告”,描述=“可再生的报告由Rmarkdown”,水珠=表达式(脚本引擎= " # cwl-js-engine " = " x = $工作[[“输入”]][[‘格式’]];if (x = =‘定义’| | x = = null) {x =“html”;};“rnaseqGene。+ x”)),输出(id =“热图”标签=“热图”,描述=“热图阴谋显示样本之间的欧氏距离”,水珠= "热图。pdf”),输出(id =“计数”,标签=“计数”,描述=“读取计算矩阵”,水珠= "计数。csv”),输出(id =“德”,标签=“微分表达式表”,描述=“微分表达式表”,水珠= " de.csv "))) fl < -“本月/码头工人/ rnaseqGene / rabix / rnaseqGene。json“写(rbx toJSON美元(漂亮= TRUE), fl)

现在,让我们将其分解:

中使用的一些关键参数工具函数。

  • baseCommand:指定要执行的程序。
  • stdout:获取命令的标准输出流到一个文件写入指定输出目录。你不需要这个,如果你指定输出文件收集。
  • 输入:为您的命令行输入
  • 输出:输出你想收集
  • 需求提示:简而言之,不暗示要求来执行。我们现在接受以下要求的物品cpu,mem,码头工人,fileDef;你可以很容易地构造通过要求()构造函数。这是你如何描述你所需要的资源执行工具,所以系统知道什么类型的实例最适合你的情况。

指定输入和outpus,通常你的命令行接口接受额外的参数作为输入,例如,文件(s)、字符串、枚举、整数、浮点数、布尔。指定你的工具,你可以使用输入函数,然后将其传递给输入参数列表或单项。你甚至可以构建他们data.frame用更少的灵活性。输入()需要的参数id类型输出()需要的参数id因为类型默认情况下是文件。

有一些特殊类型:ItemArray和枚举。ItemArray类型可以是数组的单一类型,最常见的情况是,如果你的输入文件的列表,你可以做些什么类型= ItemArray(“文件”)或者是简单的type = "文件……”从一个文件diffenciate输入。当你加入“…”后缀,R会知道这是一个ItemArray

我们也提供一个枚举类型,指定枚举时,请将所需的名称和符号= enum类型(“格式”,c (pdf, html))那你在平台上的UI将教皇下拉当你执行任务。

现在的工作虽然从简单的最灵活的案件。

3.3.2使用现有的码头工人图像和命令

如果你已经有一个码头工人形象记住,提供你所需要的功能,你可以使用它。的baseCommand你想要执行的命令行,容器。stdout指定输出文件你想捕捉到标准输出,收集它的平台。

在这个简单示例中,我们知道码头工人的形象摇臂/ r-base有一个函数runif我们可以直接在命令行调用Rscript - e。然后我们要收集的输出stdout让文件系统捕获输出文件相匹配的模式* . txt。请注意,你的工具可能产生许多中间文件在当前文件夹,如果你不告诉你需要的输出,他们都将被忽略,所以确保你通过收集那些文件输出参数。

库(sevenbridges) rbx < -工具(标签id =“runif”=“runif”,暗示=需求(码头工人(拉=“摇滚/ r-base”)), baseCommand =“Rscript - e ' runif (100)“”, stdout = "输出。txt”,输出=输出(id =“随机”,水珠= " * . txt ")) rbx
沙特:id: runif id:“# runif”输入:[]输出:-类型:——“零”文件标签:“描述:”streamable:没有默认:“id:“#随机”outputBinding:一团:“*。txt”要求:[]提示:-类:DockerRequirement dockerPull:摇臂/ r-base标签:runif类:CommandLineTool baseCommand:——Rscript - e ' runif(100)的参数:[]stdout: output.txt
rbx toJSON美元()
{“小企业:id”:“runif”,“id”:“# runif”、“输入”:[],“输出”:[{“类型”:“空”,“文件”,“标签”:“”,“描述”:“”,“streamable”:假的,“默认”:“”,“id”:“#随机”、“outputBinding”:{“水珠”:“*。txt”}}],“需求”:[],“提示”:[{“类”:“DockerRequirement”,“dockerPull”:“摇滚/ r-base”}],“标签”:“runif”、“类”:“CommandLineTool”、“baseCommand”: [" Rscript - e ' runif(100)“”),“参数”:[],“标准输出”:“output.txt”}

默认情况下,对象显示YAML的工具,但你可以简单地把它转换成JSON并将其复制到您的七桥平台图形编辑器通过导入JSON。

rbx toJSON美元()
{“小企业:id”:“runif”,“id”:“# runif”、“输入”:[],“输出”:[{“类型”:“空”,“文件”,“标签”:“”,“描述”:“”,“streamable”:假的,“默认”:“”,“id”:“#随机”、“outputBinding”:{“水珠”:“*。txt”}}],“需求”:[],“提示”:[{“类”:“DockerRequirement”,“dockerPull”:“摇滚/ r-base”}],“标签”:“runif”、“类”:“CommandLineTool”、“baseCommand”: [" Rscript - e ' runif(100)“”),“参数”:[],“标准输出”:“output.txt”}
rbx toJSON美元(相当= TRUE)
{“小企业:id”:“runif”,“id”:“# runif”、“输入”:[],“输出”:[{“类型”:“空”,“文件”,“标签”:“”,“描述”:“”,“streamable”:假的,“默认”:“”,“id”:“#随机”、“outputBinding”:{“水珠”:“*。txt”}} ], "requirements": [], "hints": [ { "class": "DockerRequirement", "dockerPull": "rocker/r-base" } ], "label": "runif", "class": "CommandLineTool", "baseCommand": [ "Rscript -e 'runif(100)'" ], "arguments": [], "stdout": "output.txt" }
rbx toYAML美元()
[1]“小企业:id: runif: \国家免疫日' # runif \ ninputs: [] \ noutputs: \ n -类型:\ n -‘零’\ n \ n -文件标签:“\ n描述:“\ n \ n streamable:没有默认:“\ n id: ' #随机' \ n outputBinding: \ n一团:“*。txt \ nrequirements: [] \ nhints: \ n -类:DockerRequirement \ n dockerPull:摇臂/ r-base \ nlabel: runif类:CommandLineTool \ nbaseCommand: \ n - Rscript - e ' runif (100)“\ narguments: [] \ nstdout: output.txt \ n”

3.3.3添加自定义脚本现有码头工人的形象

现在你可能想运行自己的R脚本,但你仍然不想创建新的命令行和码头工人的形象。你只是想用新的输入运行脚本文件在现有容器,介绍的时候了fileDef。你可以直接写脚本作为字符串或导入一个文件内容。和提供需求

#创建一个新文件fd < - fileDef (name = " runif。R”、内容= " set.seed (1);runif (100)“) # read via reader .srcfile <- system.file("docker/sevenbridges/src/runif.R", package = "sevenbridges") fd <- fileDef( name = "runif.R", content = readr::read_file(.srcfile) ) # add script to your tool rbx <- Tool( id = "runif", label = "runif", hints = requirements(docker(pull = "rocker/r-base")), requirements = requirements(fd), baseCommand = "Rscript runif.R", stdout = "output.txt", outputs = output(id = "random", glob = "*.txt") )

多个脚本呢?

#或者只是readline .srcfile < -执行(“码头工人/ sevenbridges / src / runif。R”、包= " sevenbridges”) fd1 < - fileDef (name = " runif。R”,内容= readr: read_file (.srcfile)) fd2 < - fileDef (name = " runif2。R”、内容= " set.seed (1);runif (100)“) rbx <- Tool( id = "runif_twoscript", label = "runif_twoscript", hints = requirements(docker(pull = "rocker/r-base")), requirements = requirements(fd1, fd2), baseCommand = "Rscript runif.R", stdout = "output.txt", outputs = output(id = "random", glob = "*.txt") )

3.3.4创建正式的命令行界面

以上这些例子,很多参数都是硬编码的脚本,你没有灵活性来控制生成多少数量。多数情况下,你的工具或命令行工具暴露一些输入参数用户。你需要一个更好的方法来描述一个命令行输入/输出。

现在我们把例子。例如,我们准备一个码头工人的形象RFranklin / runif在码头工人中心。这个容器有一个exeutable命令runif.R,你不需要知道里面是什么,你只需要知道,当您运行命令行容器看起来像这样

runif.R--n=100 --max=100 --min=1 --seed=123

这个命令直接outpus两个文件,所以你不需要标准输出捕获随机数。

  • output.txt
  • report.html

这里的目标是描述这个命令,让所有输入参数和收集所有两个文件。

定义输入,您可以指定

  • id这个输入节点:唯一标识符。
  • 描述:描述,也显示在UI。
  • 类型:要求指定输入类型,文件、整数或字符。
  • 标签:人类可读标签输入节点。
  • 前缀:前缀在命令行输入参数。
  • 默认的:默认值输入。
  • 要求这是所需的输入参数。如果需要,当你execte工具为参数提供一个值。
  • cmdInclude:包含在命令行或不是。

输出是相似的,espeicaly当你想收集文件,您可以使用一团模式匹配。

#通过输入列表中。lst < -列表(输入(id =“数量”,描述=“观察”的数量,类型=“整数”标签= number,前缀=”——n”,默认= 1 = TRUE, cmdInclude = TRUE),输入(id =“分钟”,描述=“分配”的下限,类型=“浮动”,标签=“分钟”,前缀=“- min”,默认= 0),输入(id =“max”,描述=“分布上限”,类型=“浮动”,标签=“max”前缀=”——马克思“默认= 1),输入(id =“种子”,描述= set.seed“种子”,类型=“浮动”,标签=“种子”,前缀=”——种子”,默认= 1))#输出相同的方法。lst < -列表(输出(id =“随机”,类型=“文件”=“输出”标签,描述=“随机数文件”,水珠= " *。txt”),输出(id =“报告”,类型=“文件”标签=“报告”,水珠= " *。html”)) rbx < -工具(id =“runif”标签=“随机数字生成器”,暗示=需求(码头工人(拉=“RFranklin / runif”)), baseCommand = " runif。R”,输入=。lst #或ins。df =输出。lst)

或者你可以使用data.frame作为输入和输出的例子,但它不太灵活。

在。df < - data.frame (id = c(“数量”,“分”,“马克斯”、“种子”),描述= c(“观察”,“低分布的极限”,“分配”的上限,与set.seed“种子”),type = c(“整数”、“浮动”,“浮动”,“浮动”),标签= c(“数量”,“分”,“马克斯”、“种子”),前缀= c (“n”,“——敏”,“——马克斯”,“——种子”),默认= c(1 0 123),要求= c(真的,假的,假的,假的)。df < - data.frame (id = c(“随机”,“报告”),type = c(“文件”,“文件”),水珠= c (“*。txt”、“* . html”)) rbx < -工具(id =“runif”标签=“随机数字生成器”,暗示=需求(码头工人(拉=“RFranklin / runif”), cpu (1), mem (2000)), baseCommand = " runif。R”,输入=。df, #或ins。df =输出。df)

3.3.5快速的命令行接口commandArgs(位置和命名参数)

现在你一定想知道,我有一个码头工人与R容器,但我没有任何现有的命令行,我可以直接使用。我可以为一个脚本提供一个正式的和快速的命令行接口为现有的应用程序容器。答案是肯定的。当你将脚本添加到您的工具,你可以使用一些技巧,一个受欢迎的一个你可能已经是主管commandArgs。更正式的一个叫做“docopt”,我以后再告诉你。

假设您有一个“runif2spin R脚本。R”使用位置与三个参数映射

  1. 数字
  2. 最小值
  3. 马克斯

我的基本命令将somethine

Rscript runif2spin。R 10 30 50

这就是你在R脚本

fl < -系统。文件(“码头工人/ sevenbridges / src”、“runif2spin。R”、包= " sevenbridges”)猫(readline (fl), 9 =“\ n”)
# - - - #的标题:“随机数发生器榜样”#“输出:#”html_document: #“toc:真#”number_sections:真正的#”- - - - - - # #总结报告#“#”这是一个随机数生成器# + args = commandArgs(真正的)r = runif (n = as.integer (args[1]),最小值= as.numeric (args [2]), max = as.numeric (args [3])) (r)嘘头(r)总结(右)

忽略评论部分,我将介绍旋转/诗行。

然后就以这种方式来描述我的工具,添加脚本前面学到的。

fd < - fileDef (name = " runif。R”,内容= readr: read_file (fl)) rbx < -工具(id =“runif”,标签=“runif”,暗示=需求(码头工人(拉=“摇滚/ r-base”), cpu (1), mem(2000)),需求=需求(fd) baseCommand = " Rscript runif。R”, stdout = "输出。txt”,输入=列表(输入(id =“数量”,类型=“整数”,位置= 1),输入(id =“分钟”,类型=“浮动”,位置= 2),输入(id =“max”类型=“浮动”,位置= 3)),输出=输出(id =“随机”,水珠=“output.txt”))

名叫argumentments怎么样?我还是会推荐使用“docopt”包,但是简单的方法。你想要命令行是这样的

Rscript runif_args。R - n = 10——30 min = max = 50

这是你在R脚本。

fl < -系统。文件(“码头工人/ sevenbridges / src”、“runif_args。R”、包= " sevenbridges”)猫(readline (fl), 9 =“\ n”)
# - - - #的标题:“随机数发生器榜样”#“输出:#”html_document: #“toc:真#”number_sections:真正的#”- - - - - - # #总结报告#“#”这是一个随机数生成器# + args < - commandArgs(真正的)# #快速攻击将命名参数splitArgs < -函数(x) {res < -。函数调用(rbind,拉普(x, (i) {res < - strsplit(我,“=”)[[1]]纳米< - gsub (”+”、“res [1]) c (nm, res [2])})) r < - res[2]的名字(r) < - res [1] r} args < - splitArgs (args) # + r < - runif (n = as.integer (args (“n”)),最小值= as.numeric (args(“最小值”)),max = as.numeric (args (“max”)))总结(r)嘘(r)写。csv文件(r = " out.csv”)

就用这种方式,来描述我的工具,我使用单独的= FALSE并添加=我作为黑客的前缀。

fd < - fileDef (name = " runif。R”,内容= readr: read_file (fl)) rbx < -工具(id =“runif”,标签=“runif”,暗示=需求(码头工人(拉=“摇滚/ r-base”), cpu (1), mem(2000)),需求=需求(fd) baseCommand = " Rscript runif。R”, stdout = "输出。txt”,输入=列表(输入(id =“数量”,类型=“整数”,单独的= FALSE,前缀=”——n = "),输入(id =“分钟”,类型=“浮动”,单独的= FALSE,前缀= " - min = "),输入(id =“max”类型=“浮动”,单独的= FALSE,前缀=”——max = ")),输出=输出(id =“随机”,水珠=“output.txt”))

3.3.6docopt:一个更好的和正式的方法,使命令行界面

3.3.7生成报告

快速报告:旋转和诗行

您可以使用旋转/诗行knitr生成报告直接从Rscript有特殊格式。例如,我们使用上面的例子

fl < -系统。文件(“码头工人/ sevenbridges / src”、“runif_args。R”、包= " sevenbridges”)猫(readline (fl), 9 =“\ n”)
# - - - #的标题:“随机数发生器榜样”#“输出:#”html_document: #“toc:真#”number_sections:真正的#”- - - - - - # #总结报告#“#”这是一个随机数生成器# + args < - commandArgs(真正的)# #快速攻击将命名参数splitArgs < -函数(x) {res < -。函数调用(rbind,拉普(x, (i) {res < - strsplit(我,“=”)[[1]]纳米< - gsub (”+”、“res [1]) c (nm, res [2])})) r < - res[2]的名字(r) < - res [1] r} args < - splitArgs (args) # + r < - runif (n = as.integer (args (“n”)),最小值= as.numeric (args(“最小值”)),max = as.numeric (args (“max”)))总结(r)嘘(r)写。csv文件(r = " out.csv”)

你的命令是这样的

Rscript - e”rmarkdown::渲染(knitr:: (' runif_args旋转。R, FALSE))”--args --n=100 --min=30 --max=50

所以我这样描述我的工具与码头工人的形象摇臂/ tidyverse中突出knitr和rmarkdown包。

fd < - fileDef (name = " runif。R”,内容= readr: read_file (fl)) rbx < -工具(id =“runif”,标签=“runif”,暗示=需求(码头工人(拉=“摇滚/ tidyverse”), cpu (1), mem(2000)),需求=需求(fd) baseCommand =“Rscript - e \”rmarkdown::渲染(knitr:: (' runif旋转。R ', FALSE)) \”- - - args”, stdout = "输出。txt”,输入=列表(输入(id =“数量”,类型=“整数”,单独的= FALSE,前缀=”——n = "),输入(id =“分钟”,类型=“浮动”,单独的= FALSE,前缀= " - min = "),输入(id =“max”类型=“浮动”,单独的= FALSE,前缀=”——max = ")),输出=列表(输出(id =“标准输出”,type = "文件",水珠=“output.txt”),输出(id =“随机”,类型=“文件”,水珠=“* . csv”),输出(id =“报告”,type = "文件",水珠= " * . html ")))

你会得到一个最终报告。

3.3.8Misc

继承元数据和额外的元数据

有时如果你想让你的输出文件继承自特定的输入文件,只使用inheritMetadataFrom在你的输出()调用,通过输入文件id。如果你想添加额外的元数据,您可以通过元数据在你的列表输出()函数调用。例如,我希望我的输出报告继承所有元数据从我“bam_file”输入节点(在这个例子中我没有)和两个额外的元数据字段。

出去了。lst < -列表(输出(id =“随机”,类型=“文件”=“输出”标签,描述=“随机数文件”,水珠= " *。txt”),输出(id =“报告”,类型=“文件”标签=“报告”,水珠= " *。html”, inheritMetadataFrom = " bam_file”,元数据=列表(=“RFranklin”,作者示例=“随机”)))out.lst
[[1]]类型:——“零”文件标签:输出描述:随机数文件streamable:没有默认:“id:“#随机”outputBinding:一团:“*。txt的[[2]]类型:——“零”——文件标签:报告中描述:“streamable:没有默认:“id:“‘outputBinding:一团:#报告*。html的小企业:inheritMetadataFrom: # bam_file小企业:元数据:作者:RFranklin示例:随机的

示例文件/文件作为输入节点

fl < -系统。文件(“码头工人/ rnaseqGene / rabix”、“发电机。R”、包= " sevenbridges”)猫(readline (fl), 9 =“\ n”)
库(sevenbridges) rbx < -工具(标签id =“rnaseqGene”=“rnaseqGene”,描述=“RNA-seq Differiencial表达流和报告”,暗示=需求(码头工人(拉=“腾飞/ rnaseqGene”), cpu (1), mem (2000)), baseCommand = " performDE。R”,输入=列表(输入(id =“bamfiles”,标签=“bam文件”,描述=“bam文件的列表”,type = "文件…”,# #或type = ItemArray(“文件”)前缀= "——bamfiles”,要求= TRUE, itemSeparator = ", "),输入(id =“设计”,标签=“设计矩阵”,type = "文件",要求= TRUE,前缀=”——设计”),输入(id =“gtffile”标签=“基因特性文件”,type = "文件",stageInput =“复制”,要求= TRUE,前缀=”——gtffile”),输入(id =“格式”标签=“报告foramt html或pdf”, type = enum(“格式”,c (pdf, html)),前缀=”——格式”)),输出=(输出列表(id =“报告”,标签=“报告”,描述=“可再生的报告由Rmarkdown”,水珠=表达式(脚本引擎= " # cwl-js-engine " = " x = $工作[[“输入”]][[‘格式’]];if (x = =‘定义’| | x = = null) {x =“html”;};“rnaseqGene。+ x”)),输出(id =“热图”标签=“热图”,描述=“热图阴谋显示样本之间的欧氏距离”,水珠= "热图。pdf”),输出(id =“计数”,标签=“计数”,描述=“读取计算矩阵”,水珠= "计数。csv”),输出(id =“德”,标签=“微分表达式表”,描述=“微分表达式表”,水珠= " de.csv "))) fl < -“本月/码头工人/ rnaseqGene / rabix / rnaseqGene。json“写(rbx toJSON美元(漂亮= TRUE), fl)

注意stageInput例子在上面的脚本中,您可以将它设置为“复制”或“联系”。

输入节点批处理模式

批处理文件(长输出已省略):

f1 < -系统。文件(“extdata /应用程序”、“flow_star。json”,包= " sevenbridges”) f1 < - convert_app (f1) f1 set_batch美元(“sjdbGTFfile类型=“项目”)

批metadta等满足其他条件,下面的例子,使用sample_idlibrary_id(长输出已省略):

f1 < -系统。文件(“extdata /应用程序”、“flow_star。json”,包= " sevenbridges”) f1 < - convert_app (f1) f1 set_batch美元(“sjdbGTFfile”, c(“元数据。sample_id”、“metadata.library_id”))
提供标准,从项目类型转换为标准

当你把你的应用平台,您将看到批处理可以在任务页或工作流编辑器。

4描述Wokrflow R

请注意:GUI工具编辑器七桥平台上更为此conventient。

4.1从JSON文件导入

是的,你可以使用相同的功能convert_app进口的JSON文件。

f1 < -系统。文件(“extdata /应用程序”、“flow_star。json”,包= " sevenbridges”) f1 < - convert_app (f1) # # f1

4.2公用事业的对象

就像工具对象,您也方便跑龙套,尤其有用,当你执行任务。

f1 < -系统。文件(“extdata /应用程序”、“flow_star。json”,包= " sevenbridges”) f1 < - convert_app (f1) #输入矩阵头(f1 input_matrix美元())
id标签类型需要1 # sjdbGTFfile sjdbGTFfile文件…假2 # fastq fastq文件…真正的3 # genomeFastaFiles genomeFastaFiles文件真正的4 # sjdbGTFtagExonParentTranscript外显子的父母名称字符串错误5 # sjdbGTFtagExonParentGene基因名称字符串假6 # winAnchorMultimapNmax Max位点锚int假文件1零2空3零4零5零6空
#的名字头(f1 input_matrix美元(c (“id”、“类型”、“要求”)))
id类型所需的1 # sjdbGTFfile文件…假2 # fastq文件…真3 # genomeFastaFiles文件真4 # sjdbGTFtagExonParentTranscript字符串错误5 #假6 # winAnchorMultimapNmax int假sjdbGTFtagExonParentGene字符串
#只返回所需的头(f1 input_matrix美元(要求= TRUE))
id标签类型所需的文件2 # fastq fastq文件…真正的零3 # genomeFastaFiles genomeFastaFiles文件真正的零
#返回所有头(f1 input_matrix美元(NULL))
id类型所需的文件1 # sjdbGTFfile文件…假空2 # fastq文件…真正零3 # genomeFastaFiles文件真空4 # sjdbGTFtagExonParentTranscript字符串假空5 # sjdbGTFtagExonParentGene字符串假零6 # winAnchorMultimapNmax int假空标签类别stageInput streamable 1 sjdbGTFfile空零错误2 fastq零空假3 genomeFastaFiles零空假4个外显子的父母名字接头连接数据库参数null假5基因名称拼接连接数据库参数null假6马克斯位点锚窗户,锚,装箱零错误的小企业。x小企业。y小企业。includeInPorts 1 160.50 195.0833 NA 2 164.25 - 323.7500真3 167.75 - 469.9999 NA 4 200.00 - 350.0000 NA 5 200.00 - 400.0000 NA 6 200.00 - 450.0000 NA描述1 < NA > 2 < NA > 3 < NA > 4标记名称用作transcript-parents外显子”。5标签名称用作gene-parents外显子”。6最大数量的基因座锚可以映射到(int > 0)。小企业。toolDefaultValue link_to 1 < NA > # STAR_Genome_Generate。sjdbGTFfile | #明星。sjdbGTFfile 2 < NA > # SBG_FASTQ_Quality_Detector。fastq 3 < NA > # STAR_Genome_Generate。genomeFastaFiles 4 transcript_id # STAR_Genome_Generate。sjdbGTFtagExonParentTranscript 5 gene_id #STAR_Genome_Generate.sjdbGTFtagExonParentGene 6 50 #STAR.winAnchorMultimapNmax
#返回输出矩阵头的更多信息(f1 output_matrix美元())
id标签类型文件1 # unmapped_reads unmapped_reads文件…空2 # transcriptome_aligned_reads transcriptome_aligned_reads文件空3 # splice_junctions splice_junctions文件零4 # reads_per_gene reads_per_gene文件零5 # log_files log_files文件…零6 # chimeric_junctions chimeric_junctions文件为空
#只有几个字段返回头(f1 output_matrix美元(c (“id”、“类型”)))
id类型1 # unmapped_reads文件…2 # 3 # splice_junctions transcriptome_aligned_reads文件文件4 # 5 # log_files reads_per_gene文件文件…6 # chimeric_junctions文件
#返回所有头(f1 output_matrix美元(NULL))
id标签类型文件1 # unmapped_reads unmapped_reads文件…空2 # transcriptome_aligned_reads transcriptome_aligned_reads文件空3 # splice_junctions splice_junctions文件零4 # reads_per_gene reads_per_gene文件零5 # log_files log_files文件…零6 # chimeric_junctions chimeric_junctions文件所需零源streamable小企业。includeInPorts 1假#明星。unmapped_reads假真2假#明星。transcriptome_aligned_reads假真3假#明星。splice_junctions假真4假#明星。reads_per_gene假真5假#明星。log_files假真6假#明星。chimeric_junctions假真正的小企业。x小企业。y link_to 1 766.2498 - 159.58331 #明星。unmapped_reads 2 1118.9998 - 86.58332 #明星。transcriptome_aligned_reads 3 1282.3330 - 167.49998 #明星。splice_junctions 4 1394.4164 - 245.74996 #明星。reads_per_gene 5 1505.0830 - 322.99995 #明星。1278.7498 - 446.74996 # STAR.chimeric_junctions log_files 6
#流输入f1美元要()
sjdbGTFfile fastq”文件……”"File..." genomeFastaFiles sjdbGTFtagExonParentTranscript "File" "string" sjdbGTFtagExonParentGene winAnchorMultimapNmax "string" "int" winAnchorDistNbins "int"
#流文稿f1 output_type美元()
unmapped_reads transcriptome_aligned_reads”文件……”"File" splice_junctions reads_per_gene "File" "File" log_files chimeric_junctions "File..." "File" intermediate_genome chimeric_alignments "File" "File" sorted_bam result "File" "File"
#列表工具f1 list_tool美元()
标签1星基因组产生2个FASTQ质量检测器3 Picard SortSam 4星sbgid 1 sevenbridges / public-apps / star-genome-generate / 1 2 sevenbridges / public-apps sbg-fastq-quality-detector / 3 3 sevenbridges / public-apps / picard-sortsam-1-140/2 4 sevenbridges public-apps /明星/ 4 id 1 # 2 # 3 # Picard_SortSam SBG_FASTQ_Quality_Detector STAR_Genome_Generate 4 #明星
# f1 get_tool美元(“明星”)

有更多的工具请检查示例帮助(流)

4.3创建自己的流在R

4.3.1介绍

创建一个工作流,我们提供了简单的接口管你的工具到一个单独的工作流,情况下它的工作原理

  • 简单的线性工具连接和链接
  • 连接流与一个或多个工具

请注意:复杂的工作流程建设,我强烈推荐使用我们的图形界面,没有更好的办法。

4.3.2连接简单线性工具

让我们从头开始创建工具来执行一个简单的任务

  1. 1000随机数字输出的工具
  2. 2把登录它的工具
  3. 工具3做平均计算的一切
库(sevenbridges) # 100的工具,生成随机数t1 < -工具(id =“runif新的测试3”,标签=“随机数”,暗示=需求(码头工人(拉=“摇滚/ r-base”)), baseCommand = " Rscript - e ' x = runif (100);写。csv文件(x) = '随机的。txt row.names = FALSE)”,输出=输出(id =“随机”,类型=“文件”,水珠= "随机的。txt”)) #一个工具日志fd < - fileDef (name = "日志。R”、内容= " args = commandArgs(真正的)x =阅读。表(args[1],头= TRUE) (, ' x '] x = (x)写日志。= ' random_log csv (x,文件。txt”, row.names = FALSE)”)t2 < -工具(id =“日志新的测试3”,标签=“日志”,暗示=需求(码头工人(拉=“摇滚/ r-base”)),需求=需求(fd) baseCommand = " Rscript日志。R”,输入=输入(id =“数量”,type = "文件"),输出=输出(id =“日志”,type = "文件",水珠= " *。txt”)) #一个工具做一个意味着fd < fileDef (name = "的意思。R”、内容= " args = commandArgs(真正的)x =阅读。表(args[1],头= TRUE) (, ' x '] x =意味着(x)写。= ' random_mean csv (x,文件。txt row.names = FALSE)”) t3 <- Tool( id = "mean new test 3", label = "get mean", hints = requirements(docker(pull = "rocker/r-base")), requirements = requirements(fd), baseCommand = "Rscript mean.R", inputs = input( id = "number", type = "file" ), outputs = output( id = "mean", type = "file", glob = "*.txt" ) ) f <- t1 %>>% t2
flow_output: # get_log.log
f < -链接(t1, t2,“#随机”、“#”)
flow_output: # get_log.log
# #你不能直接复制粘贴# #请把它使用API,我们将为您登记每个工具# clipr:: write_clip (jsonlite: toJSON (f,漂亮= TRUE)) t2 < -工具(id =“日志新的测试3”,标签=“日志”,暗示=需求(码头工人(拉=“摇滚/ r-base”)),需求=需求(fd) baseCommand = " Rscript日志。R”,输入=输入(id =“数量”,type = "文件",secondaryFiles = sevenbridges::: set_box (“.bai”)),输出=输出(id =“日志”,type = "文件",水珠= " *。txt”) # clipr:: write_clip (jsonlite: toJSON (t2,漂亮= TRUE))

请注意:这个工作流包含工具,平台不存在,所以如果你直接复制粘贴JSON GUI,它不会正常工作。然而,一个简单的方法是将你的应用平台通过API。这将添加新工具一个接一个项目之前添加您的工作流应用程序的平台。或者,如果您连接两个工具你知道存在在这个平台上,你不需要这样做。

#自动检查工具的信息,推动新工具p app_add美元(“new_flow_log”, f)

4.3.3通过输入和输出id连接工具

现在让我们来连接两个工具

  1. Unpakcing fastq压缩文件
  2. 星对准器

检查潜在的映射与函数是很容易的link_what,它将打印匹配的输入和输出。然后通用函数链接将允许您连接两个吗工具对象

如果你不指定输入/输出为新的暴露在流水平对象,它将公开所有availabl并打印的信息,否则,请提供参数flow_inputflow_output与完整的id。

t1 < -系统。文件(“extdata /应用程序”、“tool_unpack_fastq。json”,包= " sevenbridges”) t2 < -系统。文件(“extdata /应用程序”、“tool_star。json”,包= " sevenbridges”) t1 < - convert_app (t1) t2 < - convert_app (t2) #检查可能联系link_what (t1, t2)
美元的文件……美元的文件……美元从id标签类型文件full.name 1 # output_fastq_files输出FASTQ文件文件…美元FASTQ # SBG_Unpack_FASTQs文件…美元需要id标签类型前缀1 #读取序列文件读取…真正的< NA > 95 # sjdbGTFfile拼接结文件文件…假< NA >文件full.name 1 FASTA FASTQ, FA, FQ FASTQ。广州,FQ。广州,FASTQ。BZ2,获取FQ。BZ2 #星95 GTF获取,人造石铺地面,TXT #明星
#链接f1 < -链接(t1, t2,“output_fastq_files”,“读”)
flow_input: # SBG_Unpack_FASTQs.input_archive_file/ #STAR.sjdbGTFfile / #STAR.genome
flow_output: #明星。aligned_reads / #明星。transcriptome_aligned_reads / #明星。reads_per_gene / #明星。log_files / #明星。splice_junctions / #明星。chimeric_junctions / #明星。unmapped_reads / # STAR.intermediate_genome / # STAR.chimeric_alignments
#连接t1 output_id美元(真正的)
文件…“# SBG_Unpack_FASTQs.output_fastq_files”
t2 input_id美元(真正的)
文件…“#明星。读“枚举”#明星。readMatesLengthsIn“int”#明星。readMapNumber“int”#明星。limitOutSJoneRead“int”#明星。limitOutSJcollapsed“枚举”#明星。outReadsUnmapped“int”#明星。outQSconversionAdd“枚举”#明星。outSAMtype“枚举”#明星。outSortingType“枚举”#明星。outSAMmode“枚举”#明星。outSAMstrandField“枚举”#明星。outSAMattributes“枚举”#明星。outSAMunmapped“枚举”#明星。outSAMorder“枚举”#明星。outSAMprimaryFlag“枚举”#明星。outSAMreadID“int”#明星。outSAMmapqUnique" int "#STAR.outSAMflagOR" int "#STAR.outSAMflagAND" string "#STAR.outSAMheaderHD" string "#STAR.outSAMheaderPG" string "#STAR.rg_seq_center" string "#STAR.rg_library_id" string "#STAR.rg_mfl" enum "#STAR.rg_platform" string "#STAR.rg_platform_unit_id" string "#STAR.rg_sample_id" enum "#STAR.outFilterType" int "#STAR.outFilterMultimapScoreRange" int "#STAR.outFilterMultimapNmax" int "#STAR.outFilterMismatchNmax" float "#STAR.outFilterMismatchNoverLmax" float "#STAR.outFilterMismatchNoverReadLmax" int "#STAR.outFilterScoreMin" float "#STAR.outFilterScoreMinOverLread" int "#STAR.outFilterMatchNmin" float "#STAR.outFilterMatchNminOverLread" enum "#STAR.outFilterIntronMotifs" enum "#STAR.outSJfilterReads" int... "#STAR.outSJfilterOverhangMin" int... "#STAR.outSJfilterCountUniqueMin" int... "#STAR.outSJfilterCountTotalMin" int... "#STAR.outSJfilterDistToOtherSJmin" int... "#STAR.outSJfilterIntronMaxVsReadN" int "#STAR.scoreGap" int "#STAR.scoreGapNoncan" int "#STAR.scoreGapGCAG" int "#STAR.scoreGapATAC" float "#STAR.scoreGenomicLengthLog2scale" int "#STAR.scoreDelOpen" int "#STAR.scoreDelBase" int "#STAR.scoreInsOpen" int "#STAR.scoreInsBase" int "#STAR.scoreStitchSJshift" int "#STAR.seedSearchStartLmax" float "#STAR.seedSearchStartLmaxOverLread" int "#STAR.seedSearchLmax" int "#STAR.seedMultimapNmax" int "#STAR.seedPerReadNmax" int "#STAR.seedPerWindowNmax" int "#STAR.seedNoneLociPerWindow" int "#STAR.alignIntronMin" int "#STAR.alignIntronMax" int "#STAR.alignMatesGapMax" int "#STAR.alignSJoverhangMin" int "#STAR.alignSJDBoverhangMin" int "#STAR.alignSplicedMateMapLmin" float "#STAR.alignSplicedMateMapLminOverLmate" float "#STAR.alignWindowsPerReadNmax" int "#STAR.alignTranscriptsPerWindowNmax" int "#STAR.alignTranscriptsPerReadNmax" enum "#STAR.alignEndsType" enum "#STAR.alignSoftClipAtReferenceEnds" int "#STAR.winAnchorMultimapNmax" int "#STAR.winBinNbits" int "#STAR.winAnchorDistNbins" int "#STAR.winFlankNbins" int "#STAR.chimSegmentMin" int "#STAR.chimScoreMin" int "#STAR.chimScoreDropMax" int "#STAR.chimScoreSeparation" int "#STAR.chimScoreJunctionNonGTAG" int "#STAR.chimJunctionOverhangMin" enum "#STAR.quantMode" int "#STAR.twopass1readsN" enum "#STAR.twopassMode" string "#STAR.genomeDirName" enum "#STAR.sjdbInsertSave" string "#STAR.sjdbGTFchrPrefix" string "#STAR.sjdbGTFfeatureExon" string "#STAR.sjdbGTFtagExonParentTranscript" string "#STAR.sjdbGTFtagExonParentGene" int "#STAR.sjdbOverhang" int "#STAR.sjdbScore" File... "#STAR.sjdbGTFfile" int... "#STAR.clip3pNbases" int... "#STAR.clip5pNbases" string... "#STAR.clip3pAdapterSeq" float... "#STAR.clip3pAdapterMMp" int... "#STAR.clip3pAfterAdapterNbases" enum "#STAR.chimOutType" File "#STAR.genome" int "#STAR.limitSjdbInsertNsj" enum "#STAR.quantTranscriptomeBan" int "#STAR.limitBAMsortRAM"
f2 < -链接(t1, t2,“output_fastq_files”,“读”,flow_input = " # SBG_Unpack_FASTQs。input_archive_file”, flow_output = " #明星。log_files”)
flow_input: # SBG_Unpack_FASTQs.input_archive_file/ #STAR.genome
flow_output: # STAR.log_files
# clipr:: write_clip (jsonlite: toJSON (f2))

4.3.4通过输入和输出连接工具和工作流id

工具。< -系统。文件(“extdata /应用程序”、“tool_unpack_fastq。json”,包= " sevenbridges”)流。< -系统。文件(“extdata /应用程序”、“flow_star。json”,包= " sevenbridges”) t1 < - convert_app(诚如)< - f2 convert_app (flow.in) #咨询link_what第一f2 link_map美元()
1 # STAR_Genome_Generate id。sjdbGTFtagExonParentTranscript 2 # STAR_Genome_Generate。sjdbGTFtagExonParentGene 3 # STAR_Genome_Generate。sjdbGTFfile 4 # STAR_Genome_Generate。genomeFastaFiles 5 # SBG_FASTQ_Quality_Detector。fastq 6 # Picard_SortSam。input_bam 7 #明星。winAnchorMultimapNmax 8 #明星。winAnchorDistNbins 9 #明星。sjdbGTFfile 10 #明星。读11 #明星。基因组12 # unmapped_reads 13 # 14 # splice_junctions transcriptome_aligned_reads 15 # reads_per_gene 16 # log_files 17 # chimeric_junctions 18 # intermediate_genome 19 # chimeric_alignments 20 # 21 #结果源类型1 # sjdbGTFtagExonParentTranscript sorted_bam输入2 # 3 # sjdbGTFfile sjdbGTFtagExonParentGene输入输入4 # 5 # fastq genomeFastaFiles输入输入6 #明星。aligned_reads输入7 # winAnchorMultimapNmax 8 # 9 # sjdbGTFfile winAnchorDistNbins输入输入10 # SBG_FASTQ_Quality_Detector。结果11 # STAR_Genome_Generate输入。基因组输入12 #明星。13 #明星unmapped_reads输出。14 #明星transcriptome_aligned_reads输出。splice_junctions输出15 #明星。reads_per_gene输出16 #明星。log_files输出17 #明星。chimeric_junctions输出18 # STAR.intermediate_genome输出19 #明星。20 # Picard_SortSam chimeric_alignments输出。21 # SBG_FASTQ_Quality_Detector sorted_bam输出。结果输出
#然后链接f3 < -链接(t1, f2, c (“output_fastq_files”), c (" # SBG_FASTQ_Quality_Detector.fastq ")) link_what (f2, t1)
文件文件美元$ id标签类型需要2 # transcriptome_aligned_reads transcriptome_aligned_reads文件错误3 # splice_junctions splice_junctions文件错误4 # reads_per_gene reads_per_gene文件错误6 # chimeric_junctions chimeric_junctions文件错误7 # intermediate_genome intermediate_genome文件虚假8 # chimeric_alignments chimeric_alignments文件错误9 # sorted_bam sorted_bam假10 #结果结果文件虚假文件link_to零# 2星。transcriptome_aligned_reads零# 3星。splice_junctions零# 4星。reads_per_gene 6空#明星。chimeric_junctions零# 7 # STAR.intermediate_genome零8明星。零# Picard_SortSam chimeric_alignments 9。零# SBG_FASTQ_Quality_Detector sorted_bam 10。结果文件需要id标签类型前缀美元1 # input_archive_file输入存档文件文件实现了——input_archive_file文件1焦油,焦油。广州、TGZ,焦油。广州,BZ2,获取TBZ2 BZ2,获取ZIP
f4 < -链接(f2, t1, c (“# Picard_SortSam。sorted_bam”、“# SBG_FASTQ_Quality_Detector.result”), c (“# input_archive_file”、“# input_archive_file”))
flow_input: # SBG_Unpack_FASTQs.input_archive_file
flow_output: # SBG_Unpack_FASTQs.output_fastq_files
# # TODO # # # #流+流# #所有输出打印消息当名称错了# clipr:: write_clip (jsonlite: toJSON (f4))

4.3.5使用管道来构建复杂的工作流

5执行

5.1在云中执行工具和流程

使用API函数,您可以直接你的工具加载到该帐户。运行一个任务,“入门”,请检查客户机API的完整指南。

这是一个快速演示:

< -身份验证(平台=“platform_name”,令牌=“your_token”) p <——美元的项目(“演示”)app.runif < - p app_add美元(“runif555”, rbx)援助< - app.runif id啧啧< - p task_add美元(name = "草案runif简单”,描述=“runif描述”,应用=援助,输入=列表(min = 1, max = 10))啧啧运行()美元

5.2在本地执行工具Rabix -测试

1。从CLI

在开发工具是有用的在本地测试它们。我们可以使用rabix——可再生的生物信息学分析,https://github.com/rabix。测试工具与最新实施rabix Java(称为兔子)您可以使用码头工人的形象RFranklin / testenv:

码头工人拉RFranklin / testenv

转储rabix工具为JSON的dir还包含输入数据。写(rbx toJSON美元,文件= " < data_dir > / <工具> . json”)。使inputs.json文件声明输入参数在相同的目录中(您可以从输入使用相对路径。json数据)。创建容器:

码头工人运行——特权——名称兔子- v < /路径/ / data_dir >: / bunny_data说RFranklin / testenv

执行工具

码头工人exec兔子bash - c的cd / opt /兔子/ rabix & &。sh - e / bunny_data / bunny_data / <工具>。json / bunny_data inputs.json”

你会看到从容器内运行日志,也输出dir 在家庭系统。

  • 注1:RFranklin / testenvR, Python, Java…所以很多工具可以工作没有码头工人要求。然而如果你设置码头工人要求你需要先把图像容器内运行码头工人容器内运行兔子码头工人。
  • 注2:输入。json也可以输入。yaml如果你发现在yaml中声明的输入变得更加容易。

2。从R

图书馆(“sevenbridges”)。df < - data.frame (id = c(“数量”,“分”,“马克斯”、“种子”),描述= c(“观察”,“低分布的极限”,“分配”的上限,与set.seed“种子”),type = c(“整数”、“浮动”,“浮动”,“浮动”),标签= c(“数量”,“分”,“马克斯”、“种子”),前缀= c (“n”,“——敏”,“——马克斯”,“——种子”),默认= c(1 0 123),要求= c(真的,假的,假的,假的)。df < - data.frame (id = c(“随机”,“报告”),type = c(“文件”,“文件”),水珠= c (“*。txt”、“* . html”)) rbx < -工具(id =“runif”标签=“随机数字生成器”,暗示=需求(码头工人(拉=“RFranklin / runif”), cpu (1), mem (2000)), baseCommand = " runif。R”,输入=。df, #或ins。df =输出。df)params <- list(number = 3, max = 5) set_test_env("RFranklin/testenv", "mount_dir") test_tool(rbx, params)