前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >workflow03-用snakemake制作比对及变异查找流程

workflow03-用snakemake制作比对及变异查找流程

作者头像
北野茶缸子
发布于 2022-07-07 06:49:45
发布于 2022-07-07 06:49:45
1.4K00
代码可运行
举报
运行总次数:0
代码可运行
  • Date : [[2022-05-27_Fri]]
  • Tags : #工作流/snakemake
  • 参考:
    • Basics: An example workflow — Snakemake 7.8.0 documentation[1]

前言

参考snakemake 官方的教程。

这个snakemake workflow 主要包括:mapping, sort >> index >> call variants

我们依然先使用空文件来模拟过程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p data/samples
touch data/genome.fa data/samples/{A..D}.fastq

1-流程构建

我们同样需要将规则写入Snakefile文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rule bwa_map:
    input:
        "data/genome.fa",
        "data/samples/A.fastq"
    output:
        "mapped_reads/A.bam"
    shell:
        "bwa mem {input} | samtools view -Sb - > {output}"

通过bwa,将输入的fq 文件,和提供的参考基因组作为输入, 并直接通过管道符号通过samtools 转为bam。ps:这里如果直接使用samtools 的-o 参数呢?

直接使用snakemake即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake -np mapped_reads/A.bam

同样,我们也可以在我们的规则中,使用通配符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rule bwa_map:
    input:
        "data/genome.fa",
        "data/samples/{sample}.fastq"
    output:
        "mapped_reads/{sample}.bam"
    shell:
        "bwa mem {input} | samtools view -Sb - > {output}"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake -np mapped_reads/{A..C}.bam

增加新的功能,也就是增加新的规则:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rule bwa_map:
    input:
        "data/genome.fa",
        "data/samples/{sample}.fastq"
    output:
        "mapped_reads/{sample}.bam"
    shell:
        "bwa mem {input} | samtools view -Sb - > {output}"

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}"

需要注意的是,shell 中的语法规则有所不同。我们在snakemake 中使用的{sample},实际上是创建的wildcards 对象的一个属性。因此在shell 中需要写为{wildcards.sample}

ps:这里-T 参数实际也是指定的临时文件的前缀。

尝试运行上述内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake -np mapped_reads/B.bam
snakemake -np sorted_reads/B.bam

上面两行代码,只有第二行才会触发完整的规则,这也同样说明snakemake 是以输出为导向的。

接下来加入构建索引内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rule bwa_map:
    input:
        "data/genome.fa",
        "data/samples/{sample}.fastq"
    output:
        "mapped_reads/{sample}.bam"
    shell:
        "bwa mem {input} | samtools view -Sb - > {output}"

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}"
  
rule samtools_index:
    input:
        "sorted_reads/{sample}.bam"
    output:
        "sorted_reads/{sample}.bam.bai"
    shell:
        "samtools index {input}"

最后使用bcftools 来查找变异。

这里有个关于expand 的使用技巧,可以参考:[[01-初探snakemake]] 中6-整合多个结果 的介绍。

将其整合入先前的流程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rule bwa_map:
    input:
        "data/genome.fa",
        "data/samples/{sample}.fastq"
    output:
        "mapped_reads/{sample}.bam"
    shell:
        "bwa mem {input} | samtools view -Sb - > {output}"

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}"
  
rule samtools_index:
    input:
        "sorted_reads/{sample}.bam"
    output:
        "sorted_reads/{sample}.bam.bai"
    shell:
        "samtools index {input}"

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}"

尝试运行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake -np calls/all.vcf

可以看到,bcftools 字段是将几个bam 命令整合到了一起:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bcftools mpileup -f data/genome.fa sorted_reads/A.bam sorted_reads/B.bam | bcftools call -mv - > calls/all.vcf

使用[[02-可视化展示流程]] 的方法,我们可以将最终的流程可视化出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake --dag calls/all.vcf | dot -Tpng > output/variant.png

2-结合python脚本

这里我们还可以增加一个规则,用于对质量结果绘制直方图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rule plot_quals:
    input:
        "calls/all.vcf"
    output:
        "plots/quals.svg"
    script:
        "scripts/plot-quals.py"

py 脚本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from pysam import VariantFile

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

plt.savefig(snakemake.output[0])

其实这里无论是python,还是R,只要是能够接受对应的input 文件即可。

如果使用的是R,可以参考:Snakefiles and Rules — Snakemake 7.8.0 documentation[2]

也提供了R 及Rmarkdown的支持。

ps:以后直接从测序数据得到输出的Rmd 文档。想想都很爽啊!

3-编写target规则

默认情况下,snakemake 会将工作流中的第一个rule 作为target,也就是将该条rule 下的output 作为snakemake 的默认输出。

因此,我们最好专门的指定一个“总规则”,以确定最终默认的输出,即不指定output下,一般设置all 规则为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rule all:
    input:
        "plots/quals.svg"

rule bwa_map:
    input:
        "data/genome.fa",
        "data/samples/{sample}.fastq"
    output:
        "mapped_reads/{sample}.bam"
    shell:
        "bwa mem {input} | samtools view -Sb - > {output}"

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}"
  
rule samtools_index:
    input:
        "sorted_reads/{sample}.bam"
    output:
        "sorted_reads/{sample}.bam.bai"
    shell:
        "samtools index {input}"

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}"
 
rule plot_quals:
    input:
        "calls/all.vcf"
    output:
        "plots/quals.svg"
    script:
        "scripts/plot-quals.py"

有意思的是,这里指定的实际上是input,而非output,如果我们在all 规则中书写的是output,则all 规则将孤立,错误的输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ snakemake -np
Building DAG of jobs...
Job stats:
job      count    min threads    max threads
-----  -------  -------------  -------------
all          1              1              1
total        1              1              1


[Fri May 27 22:08:04 2022]
localrule all:
    output: plots/quals.svg
    jobid: 0
    reason: Missing output files: plots/quals.svg
    resources: tmpdir=/tmp

Job stats:
job      count    min threads    max threads
-----  -------  -------------  -------------
all          1              1              1
total        1              1              1


This was a dry-run (flag -n). The order of jobs does not reflect the order of execution.

4-实战演练

4.1-准备工作

参见:Short tutorial — Snakemake 7.8.0 documentation[3]

提供了参考数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://archive.fastgit.org/snakemake/snakemake-tutorial-data/archive/refs/tags/v7.4.2.tar.gz
tar --wildcards -xf v5.4.5.tar.gz --strip 1 "*/data"

创建项目目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p results scripts

上述文件中包含如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ tree
.
├── data
│   ├── genome.fa
│   ├── genome.fa.amb
│   ├── genome.fa.ann
│   ├── genome.fa.bwt
│   ├── genome.fa.fai
│   ├── genome.fa.pac
│   ├── genome.fa.sa
│   └── samples
│       ├── A.fastq
│       ├── B.fastq
│       └── C.fastq

下载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mamba create -n snakemake_wes_simple -y pysam matplotlib bwa samtools bcftools snakemake graphviz

发现snakemake 也是可以直接在规则中整合使用的conda 环境的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rule map_reads:
    input:
        "data/genome.fa",
        "data/samples/{sample}.fastq"
    output:
        "results/mapped/{sample}.bam"
    conda:
        "envs/mapping.yaml"
    shell:
        "bwa mem {input} | samtools view -b - > {output}"

只要在yaml 文件中写明即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
channels:
  - bioconda
  - conda-forge
dependencies:
  - bwa =0.7.17
  - samtools =1.9

其实conda 也可以生成相关的文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
conda env export > py36.yaml

不过这里我还是在对应的环境里进行操作。这里额外补充一点,除了工作流外,环境配置,也是可重复任务重要的一环。这里我也将我的conda 环境进行打包,可以直接通过我的配置文件下载相关的软件,使用conda “复刻”我的环境。当然,我还是觉得如docker 之类的容器软件更加方便一些。

py 脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from pysam import VariantFile

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

plt.savefig(snakemake.output[0])

需要注意的是,一般来说,使用bwa,我们还需要提前为参考基因组构建索引。

4.2-规则文件制备

创建Snakefile文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SAMPLES = ["A", "B", "C"]

rule all:
    input:
        "results/calls/all.vcf",
        "results/plots/quals.svg"

rule map_reads:
    input:
        "data/genome.fa",
        "data/samples/{sample}.fastq"
    output:
        "results/mapped/{sample}.bam"
    shell:
        "bwa mem {input} | samtools view -b - > {output}"

rule sort_alignments:
    input:
        "results/mapped/{sample}.bam"
    output:
        "results/mapped/{sample}.sorted.bam"
    shell:
        "samtools sort -o {output} {input}"

rule call_variants:
    input:
        fa="data/genome.fa",
        bam=expand("results/mapped/{sample}.sorted.bam", sample=SAMPLES)
    output:
        "results/calls/all.vcf"
    shell:
        "bcftools mpileup -f {input.fa} {input.bam} | bcftools call -mv - > {output}"

rule plot_quals:
    input:
        "results/calls/all.vcf"
    output:
        "results/plots/quals.svg"
    script:
        "scripts/plot-quals.py"

可视化看看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake --dag  | dot -Tpng > dag.png

发现依然得显式的设置输出文件,并且要设定启动的最大核心数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake --cores 4 -p results/plots/quals.svg

执行snakemake后看看目录下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ tree
.
├── data
│   ├── genome.fa
│   ├── genome.fa.amb
│   ├── genome.fa.ann
│   ├── genome.fa.bwt
│   ├── genome.fa.fai
│   ├── genome.fa.pac
│   ├── genome.fa.sa
│   └── samples
│       ├── A.fastq
│       ├── B.fastq
│       └── C.fastq
├── results
│   ├── calls
│   │   └── all.vcf
│   ├── mapped
│   │   ├── A.bam
│   │   ├── A.sorted.bam
│   │   ├── B.bam
│   │   ├── B.sorted.bam
│   │   ├── C.bam
│   │   └── C.sorted.bam
│   └── plots
│       └── quals.svg
├── scripts
│   └── plot-quals.py
└── Snakefile

不过我这里尝试生成report却发生报错了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake --report report.html

很长的报错,其中内容包括:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
snakemake report Failed to establish a new connection: [Errno 111] Connection refused'))

显示和github 需要建立某个联系。但从文档来看,report 作用仅仅是生成说明我的workflow 的流程记录,这里并不是很明白。

既然小的测试文件成功执行了。能不能推广到DIY 如转录组在内的流程呢?

参考资料

[1]

Basics: An example workflow — Snakemake 7.8.0 documentation: https://snakemake.readthedocs.io/en/stable/tutorial/basics.html

[2]

Snakefiles and Rules — Snakemake 7.8.0 documentation: https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#snakefiles-external-scripts

[3]

Short tutorial — Snakemake 7.8.0 documentation: https://snakemake.readthedocs.io/en/stable/tutorial/short.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用snakemake编写生信分析流程
The Snakemake workflow management system is a tool to create reproducible and scalable data analyses. Workflows are described via a human readable, Python based language. They can be seamlessly scaled to server, cluster, grid and cloud environments, without the need to modify the workflow definition. Finally, Snakemake workflows can entail a description of required software, which will be automatically deployed to any execution environment.
生信探索
2023/05/23
9020
Sentieon | 应用教程:Sentieon分布模式
本文档描述了如何利用Sentieon®基因组学工具的分片能力将DNAseq®流程分布到多台服务器上;将其他流程(如TNseq®)进行分布遵循相同原则,因为所有Sentieon®基因组学工具都具有相同的内置分布式处理能力。这种分布的目标是为了减少流程的总运行时间,以更快地生成结果;然而,这种分布也会带来一些额外的开销,使计算成本增加。 利用分布能力,流程的每个阶段被分成小任务;每个任务处理基因组的一部分,并可以在不同的服务器上并行运行。每个任务生成一个部分结果,需要按顺序合并为最终的单一输出;这种合并需要仔细进行,以确保考虑到边界并生成与没有分片运行的流程相同的结果。 分布的执行框架不在本文档的范围内,用户需要在保持正确的数据依赖关系的同时,分发数据/文件并启动正确的进程。
INSVAST
2024/07/15
810
Sentieon | 应用教程:Sentieon分布模式
workflow05-snakemake的进阶操作一
如bwa 等软件,我们可以分配多线程以提高任务的执行速度的。同样,我们可以把线程的信息配置在规则中:
北野茶缸子
2022/07/07
9990
Snakemake — 可重复数据分析框架
Snakemake是一款流行的生物信息学工作流管理系统,由Johannes Köster及其团队开发。它旨在降低复杂数据分析的复杂性,使生物信息学工作流的创建和执行变得更加容易和可重复。Snakemake的设计灵感来自于Makefile,但它是专门为生物信息学和数据密集型科学工作流设计的,使用Python语言进行工作流的定义,这使得它在生物信息学社区中特别受欢迎。
生信菜鸟团
2024/03/25
8290
Snakemake — 可重复数据分析框架
workflow02-可视化展示snakemake流程
对于工作流来说,Directed acyclic graph,有向非循环图是一个非常不错的展示的策略。
北野茶缸子
2022/07/07
8980
workflow02-可视化展示snakemake流程
生信分析流程构建的几大流派
构建生信分析流程是生物信息学从业人员必备的技能之一,对该项能力的评估常常是各大公司招录人员的参考项目之一。
生信技能树
2018/12/18
4.9K0
生信分析流程构建的几大流派
GATK变异检测
准备的已知变异集作为训练集,可以是 Hapmap、OMNI,1000G,dbsnp,瓶中基因组计划等这些国际性项目的数据,然后利用训练集对每一个位点进行过滤。利用 VariantRecalibrator工具进行机器学习,ApplyVQSR 工具进行处理。VQSR 过滤 SNP 和 InDel 分别进行,首先处理 SNP,得到结果后,再进行 InDel 处理。
生信喵实验柴
2023/09/04
5740
GATK变异检测
snakemake杂记:多个转录组比对到多个基因组得到多个bam文件然后合并
我有10个基因组,然后又12个转录组数据,然后将这个12个基因组数据分别比对到这个10个基因组,每个基因组得到12个bam文件,然后将每个基因组的12个bam文件合并 ,最终得到10个合并的bam文件
用户7010445
2023/08/23
3110
snakemake杂记:多个转录组比对到多个基因组得到多个bam文件然后合并
workflow04-用snakemake处理复杂命名
但通常来说,测序文件也会对应一些metadata。比如通过ENA 下载测序数据,就可以选择需要的信息:
北野茶缸子
2022/07/07
1.2K0
workflow04-用snakemake处理复杂命名
大肠杆菌全基因组重测序变异检测小实例(侧重变异过滤)
未找到原文所用数据,本文使用GATK4.0和全基因组数据分析实践(上)文章中的大肠杆菌基因组作为参考序列,使用wgsim软件模拟生成双端150bp测序数据
用户7010445
2020/03/03
1.8K0
一步一步用Snakemake搭建gatk4生成正常样本的germline突变数据库的流程
这是使用gatk4生成正常样本的germline突变数据库的流程图,整个流程是用Snakemake写的,这个图片也是Snakemake生成的。然后就被jimmy大佬点名了,受宠若惊,所以就有了本文。我是2016年从转录组学习小分队开始正式接触生信技能树,并走上了生信工程师的道路,我被jimmy大佬无私奉献的精神所折服,借此机会表示对jimmy大佬和生信技能树由衷的感谢!如果你也想从转录组开启你的生物信息学学习之旅,不妨考虑一下生信技能树的爆款入门:生信爆款入门-全球听(买一得五)(第4期),你的生物信息学入门课!
生信技能树
2020/04/27
3.2K0
全基因组 - 人类基因组变异分析(PacBio) -- minimap2 + Sniffles2
首先从github官网上下载minimap2的二进制文件压缩包,minimap2-2.26_x64-linux.tar.bz2,然后上传到服务器上。
三代测序说
2023/11/26
1.6K0
全基因组 -  人类基因组变异分析(PacBio) -- minimap2 + Sniffles2
【直播】我的基因组 43:简单粗糙的WGS数据分析流程
前面我们扯到bam文件的各种操作,vcf文件的各种操作,基础知识不牢固的同学可能已经云里雾里了。这次我们来讲一个简单的。就是拿到了fastq的测序数据,如何把全基因组分析给跑一遍。(不谈细节!) 首先就是fastq文件比对到参考基因组变成sam文件: head -40 read1.fq >tmp/read1.fq head -40 read2.fq >tmp/read2.fq ~/biosoft/bwa/bwa-0.7.15/bwa mem -t 20 -M ~/reference/index/bwa/
生信技能树
2018/03/08
1.9K0
【直播】我的基因组 43:简单粗糙的WGS数据分析流程
workflow01-初探snakemake
我自己一直在寻求可以将不同的工作流串接的方式。之前尝试了nextflow,但发现语法让我头疼。无奈发现了基于python 框架的snakemake,如释重负,立马学一下。
北野茶缸子
2022/07/07
1.6K0
workflow01-初探snakemake
GATK最佳实践之数据预处理SnakeMake流程
写的数据预处理snakemake流程其实包括在每个单独的分析中比如种系遗传变异和肿瘤变异流程中,这里单独拿出来做演示用,因为数据预处理是通用的,在call变异之前需要处理好数据。
生信探索
2023/05/27
4500
01.GATK肿瘤基因变异最佳实践SnakeMake流程:WorkFlow简介
GATK best practices workflow Pipeline summary
生信探索
2023/05/29
3510
流程管理工具snakemake学习笔记杂记
这里rule all的作用还是没有搞明白,看有的文档说是最终保留的文件 ,我这里rule all 只写了了最终的html和json,但是最终的结果里是有过滤后的fastq文件的
用户7010445
2022/05/23
9520
流程管理工具snakemake学习笔记杂记
Snakemake+RMarkdown定制你的分析流程和报告
数字游民第三波有你吗 https://mp.weixin.qq.com/s/q864LQvsOOmd9nUyxk939w
生信技能树
2022/06/27
3.4K1
Snakemake+RMarkdown定制你的分析流程和报告
snakemake 学习笔记2
这里, 我们新建两个配对的RNA-seq数据, 格式是FASTQ的文件, 然后经过下面两步处理:
邓飞
2019/07/07
1.3K0
snakemake 学习笔记2
参考基因组没有,经费也没那么多,怎么办?
尽管目前已经有大量物种基因组释放出来,但还是存在许多物种是没有参考基因组。使用基于酶切的二代测序技术,如RAD-seq,GBS,构建遗传图谱是研究无参考物种比较常用的方法。Stacks就是目前比较通用的分析流程,能用来构建遗传图谱,处理群体遗传学,构建进化发育树。 这篇教程主要介绍如何使用Stacks分析基于酶切的二代测序结果,比如说等RAD-seq,分析步骤为环境准备,原始数据质量评估, 多标记数据分离,序列比对(无参则需要进行contig de novo 组装),RAD位点组装和基因分型,以及后续的标记
生信技能树
2018/03/05
2.3K0
参考基因组没有,经费也没那么多,怎么办?
推荐阅读
相关推荐
使用snakemake编写生信分析流程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档