草庐IT

Nextflow概述:

苏打水_cd25 2023-03-28 原文

流程化!个人感觉是生信最头疼的问题之一,当你东平西凑整出一台符合自己分析目的的流程时,会发现在处理过程中,仍需要人工对接每一步的输入输出,特别是对于流程复杂,而又经常使用的情况,这是一笔不小的人工消耗;既然如此,那就将这些流程统统写进代码里,下次使用时,直接调用!流程化的软件很多,我调研过的就三种:

  • Shell脚本:最简单的流程化方式,在脚本内你可以指定待输入的参数,但最大的问题就是无法缓存中间文件,这意味着如果那一天你的脚本报错,你只能自己去排错,然后又重新跑。
  • snakemake:这应该是网上教程最多的流程化软件,基于Python框架,对于初学者和python爱好者会比较易懂,相比于单纯shell脚本,它能做到的是缓存中间的文件,在修改代码之后,就不必从头开始执行。但在使用的过程中,个人感觉使用有点“生硬”,即从后向前结构很别扭,
  • nextflow:基于Groovy语言编写(类似于python),与snakemake不同的是,其向前向后的结构是通过channel来相互连接,此外拥有很好的社区支持(google group,gitter),原生对云环境(AWS,google cloud)支持,最重要的是,其被越来多的人采用,从而衍生大量优秀成熟流程nf-core。作为后起之秀,nextflow可能会是生信流程软件的大头。

关于nextflow的教程也是比较多的,不过大部分都是英文:
官网Doc:AGet started — Nextflow 21.10.6 documentation
nf-core:nextflow-io/awesome-nextflow: A curated list of nextflow based pipelines (github.com)
教程1:Creating a NextFlow workflow - Bioinformatics Workbook
教程2:基于Nextflow的宏基因组有参分析-I 安装Nextflow | Chenhao's Personal Page
教程3:Nextflow training (seqera.io) Youtobe:Nextflow Training Workshop - July 2020 - Day 3 - YouTube
综合性:Nextflow tutorials » nf-core

通过几天的摸索,对nextflow的总结如下:你需要设置参数,并将文件以参数或Channel的形式输入到Process中,在不同的Process中以Channel相互连接,进行文件的输入输出。对于我来说,刚开始学习的难点就是,文件的输入以及结果的输出。

基本架构:

以下仅以main.nf作为例子说明:完整代码见RNA-Seq pipeline | Nextflow

定义参数:

  • 指定使用的nextflow的版本,这里是用户bin/env下
  • .nf脚本的注释是以 /* 开头和以 */ 结尾
  • 参数的定义:params.XXX= "默认值”,实际使用过程中可以使用--XXX 进行重新定义
#!/usr/bin/env nextflow 
 /*  
* Defines some parameters in order to specify the refence genomes 
* and read pairs by using the command line options 
*/ 
params.reads = "$baseDir/data/ggal/*_{1,2}.fq" #这里是指输入该目录下所有*_1.fq和*_2.fq 
params.annot = "$baseDir/data/ggal/ggal_1_48850000_49020000.bed.gff" 
params.genome= "$baseDir/data/ggal/ggal_1_48850000_49020000.Ggal71.500bpflank.fa"
params.outdir = 'results'

定义通道:

定义通道的命令(factory)有很多,常见的有from、fromPath、fromFilePairs;后两个常被用于文件的输出通道使用(默认识别的Type:file,可修改至dir),返回的是List,list内含不同的文件,不同的是fromFilePairs返回的还有配对文件的common identified ID,因此常与 _{1,2}.fq”的params搭配。

Channel.fromFilePairs( params.reads, checkIfExists:true ) ##checkIfExists检查文件是否配对     
       .ifEmpty { error "Cannot find any reads matching: {params.reads}" }      
       .set { read_pairs_ch } 
##以上命令等价于:
Channel.fromFilePairs( params.reads ).set { read_pairs_ch } #略去ifEmpty

#若使用read_pairs_ch.view()则 :
[liver, [/user/nf-training/data/ggal/liver_1.fq, /user/nf-training/data/ggal/liver_2.fq]] 
[gut, [/user/nf-training/data/ggal/gut_1.fq, /user/nf-training/data/ggal/gut_2.fq]]
[lung, [/user/nf-training/data/ggal/lung_1.fq, /user/nf-training/data/ggal/lung_2.fq]]

#作为对比这里使用fromPair; 
Channel. fromFile(params.reads) .set(read_ch) reac_ch.view() 
[/user/nf-training/data/ggal/liver_1.fq, /user/nf-training/data/ggal/liver_2.fq]
[/user/nf-training/data/ggal/gut_1.fq, /user/nf-training/data/ggal/gut_2.fq] 
[/user/nf-training/data/ggal/lung_1.fq, /user/nf-training/data/ggal/lung_2.fq]
##与fromFilePairs相比缺少了Sample_ID 

##由于同一个queue channel下的内容并不是可以无限使用,实际上其内容是在process即用即少;
#因此,可以一次性定义多个相同的内容的channel,例如:
Channel.fromFilePairs( params.reads ).into { read1_pairs_ch,read2_pairs_ch }

需要说明的是,nextflow的通道只有两种类型:queue channels and value channels.

  • A value channel (a.k.a. singleton channel) by definition is bound to a single value and it can be read unlimited times without consuming its contents.
  • A queue channel is a non-blocking unidirectional FIFO queue which connects two processes or operators. The definition implies that the same queue channel cannot be used more than one time as process output and more than one time as process input.

除此之外:fromFilePairs似乎无法在Process中重新Create Channel。

Process执行:

/* 
* Step 2\. Maps each read-pair by using Tophat2 mapper tool  
*/ 
process mapping {     
              tag "$pair_id" #这里实时反馈进程,即处理到那个文件 
           
              input:     
              path genome from params.genome 
              path annot from params.annot    
              path index from index_ch 
              tuple val(pair_id), path(reads) from read_pairs_ch 

              output:     
              set pair_id, "accepted_hits.bam" into bam_ch 

              """    
              tophat2 -p ${task.cpus} --GTF $annot genome.index $reads 
              mv tophat_out/accepted_hits.bam .  
              """
  }    

 /*
 * Step 3\. Assembles the transcript by using the "cufflinks" tool  
*/ 
process makeTranscript {   
              tag "$pair_id"     
              publishDir params.outdir, mode: 'copy'            
          
              input:   
              path annot from params.annot    
              tuple val(pair_id), path(bam_file) from bam_ch          
      
              output:    
              tuple val(pair_id), path('transcript_*.gtf')       

              """     
              cufflinks --no-update-check -q -p $task.cpus -G $annot $bam_file     
              mv transcripts.gtf transcript_${pair_id}.gtf   
              """ 
}
几点说明:
  • 为了防止书写的混乱,输出的格式统一为类似:file("$XXX") into XX_ch,并使用双引号(单引号无法识别通配符)
  • Process内的结果无法用fromFilePairs导入到通道内(至少现在我还未发现)
  • publishDir params.outdir, mode: 'copy' 这里意思是将该process的output内的所有文件都输出到指定目录下(params.outdir),模式是copy,默认是link。
#补充1: tuple和set的语义相同,例如以上的几个output:
set pair_id, "accepted_hits.bam" into bam_ch
tuple val(pair_id), path('transcript_*.gtf') into final_ch
其结果都是产生List表,但写法上有所不同,tuple需要指明类型:val、path等 

#补充2: collectFile(),是处理Channel的operators,旨在将同一通道内的item整合为一个
#新的item (需要命名),并产生新的Channel。例如在b porcess中整合并引用a_ch内的所有item
porcess a{ 
            ... 
           output: 
           set "file1","file2","file3" into a_ch
           ....
 } 
process b{ 
          input: 
         file FNA from a_ch.collectFile(name:'a_fna')
         ... } #仅作说明,大部分省略 

#补充3: process内的script需要注意上下的channel的对接,

执行nf并输出结果:

nextflow -bg run main.nf -with-report -with-trace -with-timeline -with-dag dag.png 
#这里默认输入文件在当前目录下,如重新指定,则--reads xxx 等
#运行之后在当前目录下出现result文件夹(params.outdir)和work文件夹, 
其中work文件起到的作用: 
1:相当于运行缓存,在你再次执行时(-resume)时,就不需要从头执行 
2:报错debug的作用,根据报错信息,查看隐藏的运行脚本(.command.sh)

有关Nextflow概述:的更多相关文章

  1. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  2. Ruby 语言备忘单/海报/引用/概述? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我是一个喜欢视觉的人,想知道是否有关于Ruby的不错的大概览。你知道,就像一张引用海报,带有对象层次结构,最常用的方法等等,都是彩色的,布局清晰明了...对于像我这样的初学者来说,这会很棒......有没有你使用或偶然发现的类似东西?

  3. javascript - Visual Studio 2015 Javascript 概述方式太多 - 2

    VisualStudio2015接缝勾勒出所有多行javascript代码。我有一个像这样的简单代码:$(document).ready(function(){varx={test1:1,test2:2};if(1==1){//thisisatest}});当我按下Ctrl+k,Ctrl+O时,VisualStudio2015会这样概括它:是否可以关闭函数内的大纲?我只想要功能级别的大纲。 最佳答案 不,你做不到,但有优秀的WebEssentials可以在javascript中勾勒出区域!你在像这样的评论之后创建一个区域//#reg

  4. javascript - 在 AngularJS 中选择下拉项时显示概述文本 - 2

    我希望显示每个小部件类别的概览,以便在选择该小部件类别时显示在过滤结果上方。我假设这将需要一个ng-show指令,因此可能也需要一些Controller代码。但是任何关于将选择下拉菜单与我的ng-repeat链接起来以及与ng-show链接起来的任何指示都会很棒。这是我的目标:之前之后SelectWidgetRange1WidgetRange2WidgetRange3ProductName:{{product.name}}Quantity:{{product.quantity}}Price:£{{product.price}}https://plnkr.co/edit/0WrinKY2

  5. 基于AIGC的3D场景创作引擎概述 - 2

    通过改变3D场景制作流程复杂、成本高、门槛高、流动性差的现状,让商家像玩转2D一样去玩转3D,让普通消费者也能参与到3D内容创作和消费中,真正实现内容生产模式从PGC/UGC过渡到AIGC,是我们3D场景智能创作引擎一直追求的目标。前言随着元宇宙的大火,国内外各大厂纷纷下场开始为下一代互联网技术布局,旨在为用户提供更好的体验。体验包括方方面面,比如更好的游戏体验、更好的社交体验、更高效的办公体验当然也包括更好的消费体验。作为国内最大的电商平台,我们团队也在持续思考如何基于元宇宙的技术,给消费者带来更好的购物体验以及给商家带来更好的营商体验。回归到电商“人、货、场”三要素上,通过虚拟人技术以及商

  6. 【pandas基础】--概述 - 2

    Pandas是一个开源的Python数据分析库。它提供了快速,灵活和富有表现力的数据结构,旨在使数据清洗和分析变得简单而快速。Pandas是基于NumPy数组构建的,因此它在许多NumPy函数上提供了直接的支持。它还提供了用于对表格数据进行操作的数据结构,例如Series和DataFrame。Pandas提供了许多用于数据操作和处理的函数和方法,例如数据过滤,数据清洗,数据合并和重塑等。Pandas还提供了用于将数据导入和导出不同文件格式的函数,例如CSV,Excel和SQL等。它是Python数据科学生态系统中最受欢迎和广泛使用的库之一。主要功能Pandas主要功能包括:数据读取和导入:读取

  7. 4.1、网络层概述 - 2

    1、主要任务网络层的主要任务是实现网络互连\color{red}实现网络互连实现网络互连,进而实现数据包在各网路之间的传输\color{red}实现数据包在各网路之间的传输实现数据包在各网路之间的传输例如:这些异构型网络若只是需要各自内部通信,那它们只要实现各自的物理层和数据链路层即可但是若需要将这些异构型网络互连起来,形成一个更大的互联网,就需要使用网络层互联设备路由器说明:为了简单起见,有时没有必要画出这些网络,将它们看成一条链路即可对于互联网而言,仅实现物理层和数据链路层是不能实现数据包在互联网中各网络之间传输的。要实现该功能,就必须实现网络层2、网络层解决的问题2.1、网络层向运输层提

  8. KVM概述 - 2

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、KVM是什么?1.KVM概念2.KVM体系结构二、实例1.启用KVM的Linux的服务器2.认证总结前言了解LinuxKVM的架构并了解它与内核的紧密集成为何会改变您使用Linux的方式,本文介绍KVM学习的基础内容。一、KVM是什么?1.KVM概念    在官网我们可以了解到KVM是内核的虚拟机的缩写,KVM是构成主流Linux内核(V2.6.20)一部分的第一个虚拟化解决方案。KVM支持Linux客户 操作系统的虚拟化——甚至支持其硬件对虚拟化敏感的 Windows 系统的虚拟化。则KVM可定义为硬件辅助的全虚

  9. CRC32概述以及实现和使用 - 2

    一、CRC16实现思路:取一个字符(8bit),逐位检查该字符,如果为1,crc^crc_mul;同时,如果原本crc最高位是1,那么crc^crc_mul后左移1位,否则只是左移一位。计算完一个字符后,装入下一个字符。#include#definecrc_mul0x1021//生成多项式unsignedintcal_crc16(unsignedchar*ptr,unsignedcharlen){unsignedchari;unsignedintcrc=0;while(len--!=0){for(i=0x80;i!=0;i>>=1){if((crc&0x8000)!=0){crc二、CRC32

  10. 小程序开发第一天 项目基本结构和组件概述 大龄java程序员转行之路 - 2

    pages文件夹page翻译为页面,就是说微信小程序里包含的页面都放在这个文件夹里。类比我们常见的index主页面,login登录页面,这些web页面文件夹转化在微信小程序中就是pages页面。用户创建的文件夹就是index,login等页面文件官方建议把小程序的页面都放在pages我文件夹中,每个文件夹里都有四个文件,分别是。.js文件控制页面的脚本文件,包括存放数据,业务逻辑,事件处理函数等调用Pages()函数实现对页面的调用.json文件这个页面自己的配置文件,管理窗口外观,表现等.wxml相当于html文件,就是存放页面的模板结构wxml是一种类似于html的标签语言,是由微信自己创

随机推荐