输出(Outputs)

我们已经了解了如何将数据输入到进程中; 现在我们将了解如何从进程中输出文件和值。
output 声明块允许我们定义进程用于发送生成的文件和值的通道。

输出值

与输入类似,输出数据的类型也是使用类型限定符定义的。

val 限定符允许我们输出脚本中定义的值。

因为 Nextflow 进程只能通过通道进行通信,所以如果我们希望将一个值输入共享到一个进程中,作为另一个进程的输入,我们需要在输出声明块中定义该值,如下例所示:

//process_output_value.nf
nextflow.enable.dsl=2process METHOD {input:val xoutput:val xscript:"""echo $x > method.txt"""
}
// Both 'Channel' and 'channel' keywords work to generate channels.
// However, it is a good practice to be consistent through the whole pipeline development
methods_ch = channel.of('salmon', 'kallisto')workflow {METHOD(methods_ch)// use the view operator to display contents of the channelMETHOD.out.view({ "Received: $it" })
}

输出文件

如果我们想要捕获一个文件而不是一个值作为输出,我们可以使用path限定符,它可以通过指定的通道捕获进程生成的一个或多个文件。

//process_output_file.nf
nextflow.enable.dsl=2methods_ch = channel.of('salmon', 'kallisto')process METHOD {input:val xoutput:path 'method.txt'"""echo $x > method.txt"""
}workflow {METHOD(methods_ch)// use the view operator to display contents of the channelMETHOD.out.view({ "Received: $it" })
}

输出如下:

executor >  local (2)
[88/f82057] process > METHOD (2) [100%] 2 of 2 ✔
Received: /mnt/dev/likai/nextflow/work/ce/9716cf14d9d1e975619f9c2abe13c0/method.txt
Received: /mnt/dev/likai/nextflow/work/88/f82057da2faf4ed364b65ad3eee9ba/method.txt

在上面的例子中,在包含方法名的工作目录中创建了一个名为 method.txt 的文件。
当任务完成时,该文件将通过输出通道发送。下游的operator,例如声明与输入相同通道的.viewprocess 将会接收它。

多个输出文件

当输出文件名包含 * 或?,它被解释为模式匹配。这允许我们将多个文件捕获到一个列表中,并将它们作为一个项目通道输出。

//process_output_multiple.nf
nextflow.enable.dsl=2process FASTQC {input:path readoutput:path "fqc_res/*"script:"""mkdir fqc_resfastqc $read -o fqc_res"""
}read_ch = channel.fromPath("data/yeast/reads/ref1*.fq.gz")workflow {FASTQC(read_ch)FASTQC.out.view()
}

对于匹配模式有一些注意事项:

  • 输入文件不包括在可能匹配的列表中。
  • Glob模式匹配文件和目录路径。
  • 当使用双星模式 * * 递归遍历子目录时,只匹配文件路径,即结果列表中不包含目录。

到目前为止,我们已经了解了如何声明多个输入和输出通道,但是每个通道一次只处理一个值。 Nextflow 可以使用tuple限定符处理组。
在元组中,第一项是分组键,第二项是列表。[group_key,[file1,file2,...]].
当使用包含元组的通道时,例如.filesFromPairs工厂方法,必须使用tuple限定符声明相应的输入声明,然后定义元组中的每个项。

//process_tuple_input.nf
nextflow.enable.dsl=2process TUPLEINPUT{input:tuple val(sample_id), path(reads)script:"""echo $sample_idecho $reads"""
}reads_ch = Channel.fromFilePairs('data/yeast/reads/ref1_{1,2}.fq.gz')workflow {TUPLEINPUT(reads_ch)
}

以同样的方式,可以使用tuple限定符声明包含元组值的输出通道,然后使用元组中每个元组元素的定义。

//process_tuple_io_fastp.nf
nextflow.enable.dsl=2process FASTP {input:tuple val(sample_id), path(reads)output:tuple val(sample_id), path("*FP*.fq.gz")script:"""fastp \-i ${reads[0]} \-I ${reads[1]} \-o ${sample_id}_FP_R1.fq.gz \-O ${sample_id}_FP_R2.fq.gz"""
}reads_ch = Channel.fromFilePairs('data/yeast/reads/ref1_{1,2}.fq.gz')workflow {FASTP(reads_ch)FASTP.out.view()
}

输出如下:

[ref1, [work/9b/fcca75db83718a15f7a95caabfbc15/ref1_FP_R1.fq.gz, work/9b/fcca75db83718a15f7a95caabfbc15/ref1_FP_R2.fq.gz]]

条件语句

when声明根据各种输入和参数的状态启用/禁用流程执行。例如:

//process_when.nf
nextflow.enable.dsl=2process CONDITIONAL {input:val chrwhen:chr <= 5script:"""echo $chr"""
}chr_ch = channel.of(1..22)workflow {CONDITIONAL(chr_ch)
}

指令(Directives)

指令声明允许定义可选设置,如 CPU 数量和内存量,这些设置影响当前进程的执行,而不影响任务本身。

指令必须在进程体的最上方,在任何其他的声明块之前(如:input,output等)。

注意: 为指令赋值时不使用 = 。

指令通常用于定义要使用的计算资源量或用于配置日志记录。例如:

//process_directive.nf
nextflow.enable.dsl=2process PRINTCHR {tag "tagging with chr$chr"cpus 1echo trueinput:val chrscript:"""echo processing chromosome: $chrecho number of cpus $task.cpus"""
}chr_ch = channel.of(1..22, 'X', 'Y')workflow {PRINTCHR(chr_ch)
}

上面的进程使用了3个指令:tag, cpus, echo

tag指令允许为每个进程执行提供自定义标记。此标记使得在日志文件或执行报告中标识特定任务(进程的执行实例)变得更加容易。
第二个指令 cpus 允许您定义每个任务所需的 CPU 数量。
第三个指令 echo true 将标准输出打印到终端。

我们可以使用 task.cpus 变量来捕获分配给任务的 CPU 数量。

还有一个常用的指令是memory

完整的指令集在这。

组织输出

PublishDir 指令

Nextflow 独立地管理中间结果。
进程创建的文件存储在特定任务的临时工作目录中。通常这是在work目录下,可以在完成后删除。

如果我们想要在 result/quant输出目录中捕获 QUANT 进程的结果,我们需要在output中定义文件,并在 PublishDir 指令中指定结果目录的位置:

//process_publishDir.nf
nextflow.enable.dsl=2process QUANT {publishDir "results/quant"input:tuple val(sample_id), path(reads)each indexoutput:tuple val(sample_id), path("${sample_id}_salmon_output")script:"""salmon quant -i $index \-l A \-1 ${reads[0]} \-2 ${reads[1]} \-o ${sample_id}_salmon_output"""
}reads_ch = Channel.fromFilePairs('data/yeast/reads/ref1_{1,2}.fq.gz')
index_ch = Channel.fromPath('data/yeast/salmon_index')workflow {QUANT(reads_ch, index_ch)QUANT.out.view()
}

publishDir指令可以使用可选参数,例如 mode 参数可以使用值“copy”来指定希望将文件复制到输出目录,而不仅仅是一个指向工作目录中文件的符号链接。由于工作目录通常在管道完成时删除,因此最安全的方式是使用结果文件的“copy”模式。

可以使用多个 publishDir 在不同的目录中保存不同的输出。若要指定在哪个输出目录中放哪些文件,使用参数pattern和通配符模式,后者从整个输出文件集中选择要发布的文件。

例如:

//process_publishDir_semantic.nf
nextflow.enable.dsl=2process QUANT {publishDir "results/bams", pattern: "*.bam", mode: "copy"publishDir "results/quant", pattern: "${sample_id}_salmon_output", mode: "copy"input:tuple val(sample_id), path(reads)path indexoutput:tuple val(sample_id), path("${sample_id}.bam")path "${sample_id}_salmon_output"script:"""salmon quant -i $index \-l A \-1 ${reads[0]} \-2 ${reads[1]} \-o ${sample_id}_salmon_output \--writeMappings | samtools sort | samtools view -bS -o ${sample_id}.bam"""
}reads_ch = Channel.fromFilePairs('data/yeast/reads/ref1_{1,2}.fq.gz')
index_ch = Channel.fromPath('data/yeast/salmon_index')workflow {QUANT(reads_ch, index_ch)
}

6 Processes 下相关推荐

  1. Activiti与SpringBoot的整合

    1.pom依赖 <!--activiti7与SpringBoot整合的相关依赖--><parent><groupId>org.springframework.boo ...

  2. activiti前端画图转化_记Activiti入门使用-2 流程绘制、导入及开始一个流程

    一.流程绘制与导入 百度啥的找了好多bpmn绘制工具,都不尽如人意,大多数都不能编辑网关出口的跳转条件,最后还是选择了activiti官方的那个绘图的app... 啥都好,就是线不能弯,很难受.(后来 ...

  3. Copy: 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密

    From  http://blog.csdn.net/Atwind/archive/2007/10/19/1832844.aspx 关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的 ...

  4. SpringBoot - 工作流Activiti开发

    1.工作流 1.1 开发前奏 介绍 当前系统activit开发以springboot+mybatis开发为准, 1.1.1 IDEA安装actiBPM 通过File -> Settings -& ...

  5. springboot+flowable第三节(动态设置审批人)

    目录 1. 创建流程 2. 启动流程 1. 创建流程 创建一个3个节点的流程: 开始->审核->结束. xml文件: <?xml version="1.0" en ...

  6. springboot+flowable第二节(流程基本操作)

    mysql数据库 目录 1.部署流程 2.引入流程引擎 3.启动流程 4.查询待办列表 5.审批通过 6.查询已办列表 7.查询发起列表 1.部署流程 举例:部署一个如下图的流程 在src/main/ ...

  7. Hack The Box——Omni

    目录 简介 信息收集 漏洞发现 漏洞利用 总结 简介 这是一台Windows IoT靶机,对于第一次接触这个系统的我来说还是有点困难的.通过Google搜索nmap的结果确定该主机的操作系统类型,进而 ...

  8. SpringBoot + Activiti6简单教程包含任意跳转节点

    SpringBoot + Activiti6 一.Activiti6简述 1.简述 2.接口 3.库表 二.创建BPMN业务流程模型 二.整合 1.POM依赖 2. bpmn20.xml部署 3.ap ...

  9. Activiti的使用 idea的bpmn插件

    由于工作需要,需要实现自定义审核流程,就查找资料实现,这是我实现的步骤. Activiti官方网站:http://activiti.org/download.html 一.idea安装activiti ...

最新文章

  1. shell awk实战
  2. 大有乾坤,售前机器人背后的 AI 技术
  3. android脚步---不同界面之间切换
  4. QPainter中坐标系变换问题
  5. 这几个GraphPad Prism使用的小技巧让你绘图效率直接翻倍
  6. 掌握ADO.NET的十个热门技巧
  7. 内存版u-boot制作
  8. java中数值023是什么类型_【Java 教程(原创)】023.参数传值——引用类型参数的传值...
  9. KindEditor使用过程中,用JQ提交表单时,获取不到编辑器的内容
  10. html符号实体----介绍
  11. keep-alive pipeline区别
  12. 第二工业大学计算机应用大专录取分,上海第二工业大学2017年分省分专业录取分数线...
  13. python输入某年某月某日是一年的第几天_Python小例子——输入某年某月某日,判断这一天是这一年的第几天...
  14. xxl-job集群原理
  15. 我们到底能从《别逗了,费曼先生》中学到什么?
  16. springboot配置mysql
  17. 网站api自己怎么写_短视频文案怎么写?看这4个素材网站就够了
  18. SSM+在线纳新系统 毕业设计-附源码241540
  19. 嵌入式软硬件结合(二)——SysTick系统定时器
  20. PHP之MySQL笔记4

热门文章

  1. fourier feature networks
  2. 零时科技创始人邓永凯先生受邀对话《公链隐私保护及生态安全》
  3. ARM态度暧昧,愤怒的华为或投入Risc-V怀抱
  4. TensorFlow 1.9终于对树莓派张开了怀抱:加入官方支持
  5. 面对批评与争议,苹果让步,延迟推出CSAM儿童保护功能
  6. 利用python和tushare,统计股市每天上涨的概率
  7. 慕课matlab学习 第三章-017 函数文件的定义和调用
  8. C3P0反序列化链学习
  9. 上海迪士尼将新增黄色小狗可琦安系列主题商品
  10. React使用axios的坑:每次都要请求两次,而且前后端相同配置,有的url可以,有的确不可以