搭建生信分析流水线,如工厂一样24小时昼夜运转——snakemake

还在用Shell脚本跑生信流程吗?在为中断的Shell脚本搞得崩溃吗?修改日积月累的代码太头大?

那有没有什么办法,解决了上面的缺点,能让人少掉头发呢?

小果今天给大家推荐Snakemake,让你的生信分析流程, 像工厂的流水线一样开动起来!

Snakemake两个简单案例让你一看就懂。

Snakemake是什么?

Snakemake是一款基于Python3的软件,主要能够帮助用户快速搭建需要重复实现的分析流程。

以下是它的官方文档。

Snakemake — Snakemake 7.30.1 documentation

Snakemake的优势

  1. 通过treads可以设置任务的线程数目,实现并行处理
  2. 中断的程序,snake可以记录下来,从断掉的地方继续运行(拯救了多少生信人)
  3. 因为其是通过python3开发的,可以使用python库
  4. 支持shell命令操作
  5. 自动生成流程的拓扑图,使你的流程一目了然

例如像下面这张流程图一样

IMG_256

第一个案例:合并文件入门Snakemake

环境准备

推荐使用版本管理conda安装snakemake。(mamba是conda的C++版本其运行速度更快,下载更快,如果你还不知道,请快下载试试吧,一定让你爱上它。)

首先创建虚拟环境,为了流程可复现,指定python版本为3.5。

$ mamba create -n snake

$ conda activate snake

$ mamba install -y snakemake #使用mamba 安装snakemake

简单的snakemake实例

这里举一个简单易懂的合并文件内容的例子,帮助你快速入门snakemake

先创建一个文本文件,里面的内容为hello,再创建一个文本文件,内容为world。

$echo “hello” > hello.txt

$echo “world” > world.txt

接下来我们开始编写snakemake流程文件snakefile

rule concat:

input:

expand(“{file}.txt”, file=[“hello”, “world”])

output:

“merged.txt”

shell:

“cat {input} > {output}”

concat是为这个rule起的名字。

input为输入的文件。

output为输出的文件。

shell为执行的脚本命令。

{}类似于通配符,通过expand会通配file=[“hello”, “world”]文件。

在同一目录下运行snakemake

当执行工作流时,Snakemake会尝试生成给定的目标文件。

$ snakemake

这样运行就完成了,我们打开输出文件看一下

$ less merge.txt

这样文件两个文件就合并成一个文件了。

通过上面一个实例,我们能够看到。snakemake流程的基本单元为rule, 在这个rule里分为三部分内容,第一个是input输入文件,第二个是output输出文件,第三个是sell,运行的shell命令(将shell改为run,它还可以运行python或R语言代码)。

snakemake的每一个rule就像工厂里的一台机器,我们通过不断的将这些机器串联在一起,就可以组装成一条生产的流水线了。

空运行

接下来介绍几个snakemake 常用参数:

–cores 为可供给所有任务的总cpu核心数。

-n/–dry-run 则为空运行,只检查所有的输入输出并报告需要执行的任务数。但并不真正地执行计算脚本。

-p/–printshellcmds 输出每一步的shell命令。

保存到Snakefile文件后,我们可以进行空运行(dry run)来测试流程,在每次跑流程前,都建议先执行dry-run来排查流程可能存在的问题。确认无误后在最后执行任务。

$ snakemake –cores 1 -np merge.txt

最后输入目标文件,snakemake会自动根据这些文件串起整个流程。

我们了解到有关snakemake最基础的概念,下面我们将做一个完整的工作流案例,来自snakemake的官方实例。

第二个案例:测序文件和参考基因比对,与差异分析

1.环境准备

$ mkdir snakemake-tutorial #创建一个实例目录

$ cd snakemake-tutorial

$ curl -L https://api.github.com/repos/snakemake/snakemake-tutorial-data/tarball -o snakemake-tutorial-data.tar.gz #下载来自官网的实例数据

$ tar –wildcards -xf snakemake-tutorial-data.tar.gz –strip 1 “*/data” “*/environment.yaml” #解压缩

下载的数据包括这些文件

$ mamba env create –name snakemake-tutorial –file environment.yaml #创建虚拟环境命名为snakemake-tutorial, 并安装依赖environment.yaml

$ conda activate snakemake-tutorial #激活环境

打开snakemake帮助文档看一下,如果能返回结果,说明安装成功了

$ snakemake –help

创建一个Snakefile文件

$ vim Snakefile

2.创建比对规则

rule bwa_map:

input:

“data/genome.fa”,

“data/samples/{sample}.fastq”

output:

“mapped_reads/{sample}.bam”

shell:

“bwa mem {input} | samtools view -Sb – > {output}

我们使用{sample}通配符,来匹配所有我们需要处理的文件。A,B,C.fastq

snakemake -np mapped_reads/{A,B}.bam

运行空命令

结果没问题 ,我们再继续编写我们的工作流程。

3.应用samtools对bam文件排序

rule samtools_sort:

input:

“mapped_reads/{sample}.bam”

output:

“sorted_reads/{sample}.bam”

shell:

“samtools sort -T sorted_reads/{wildcards.sample}

“-O bam {input} > {output}

此规则将从mapped_reads目录中获取输入文件,并将排序后的版本存储在sorted_reads目录中。使用{wildcards.sample}来通配读取文件名

4.建立索引

rule samtools_index:

input:

“sorted_reads/{sample}.bam”

output:

“sorted_reads/{sample}.bam.bai”

shell:

“samtools index {input}

我们已经定义了三个rule,可以导出拓扑流程图看一下。

snakemake –dag sorted_reads/{A,B}.bam.bai | dot -Tsvg > dag.svg

dag

5.生成基因组变体

这里应用了上个案例的expand函数

SAMPLES = [“A”, “B”]

rule bcftools_call:

input:

fa=”data/genome.fa”,

bam=expand(“sorted_reads/{sample}.bam”, sample=SAMPLES),

bai=expand(“sorted_reads/{sample}.bam.bai”, sample=SAMPLES)

output:

“calls/all.vcf”

shell:

“bcftools mpileup -f {input.fa} {input.bam} | ”

“bcftools call -mv – > {output}

这时我们再画一个图

snakemake –dag calls/all.vcf | dot -Tsvg > dag1.svg

dag1

6.使用自己编写的python脚本

mkdir scripts

cd scripts

vim plot-quals.py

使用以下python脚本

import matplotlib

matplotlib.use(“Agg”)

import matplotlib.pyplot as pltfrom pysam import VariantFile

quals = [record.qual for record in VariantFile(snakemake.input[0])]plt.hist(quals)

plt.savefig(snakemake.output[0])

snakemake同样也支持R语言脚本

7.添加snakemake流程目标文件

rule all:

input:

“plots/quals.svg”

我们在命令行运行流程空文件

snakemake -n

这样我们的流程就搭建好了,空命令运行没有问题,我们正式运行

snakemake -c1

我们产生了所有的输出结果。

quals

最终输出了结果图片,产生了突变的大部分在50bp以内。

好了今天小果的分享就到这里了。亲们是否明白了呢?欢迎大家和小果一起讨论学习哦!我们下期再见~