本次笔记是根据大佬孟浩巍老师的讲课内容总结,详细视频见https://www.bilibili.com/video/BV1jb411i76T?spm_id_from=333.337.search-card.all.click&vd_source=72e74f599269028a197f0bb23262c2e6
周冉老师讲解Snakemake的视频地址https://www.bilibili.com/video/av15908415?vd_source=72e74f599269028a197f0bb23262c2e6
孟浩巍老师,Name:Howard MENG Email:menghaowei1992@162.com
什么是snakemake?
- snakemake是一款基于Python3的软件
- snakemake的主要功能是帮助我们快速搭建需要重复实现的分析流程
- snakemake的官网https://snakemake.readthedocs.io/en/stable/
- snakemake的好处:支持并行运算;支持断点运行;支持流程控制;支持内存/CPU核心/运行时间控制
#这里采用一种新的安装软件mamba,说是可以更快的加载和下载conda安装软件的速度,你也可以直接用conda安装 conda activate base conda install -c conda-forge mamba conda deactivate mamba create -n snakemake -c conda-forge -c bioconda snakemake conda activate snakemake snakemake --help conda deactivate #删除环境 conda remove --all -n snakemake3 snakemake的执行
先说明一下为什么用.py文件后缀,因为前面也提到snakemake是一款基于python3的软件,因此里面可能会写python的语句和使用python函数,这样用.py后缀会方便理解和高亮显示。
cd /home/zhaohuiyao/Genome_survey/snakemake/ touch ./snakemake.py && vim ./snakemake.py #编辑完成 conda activate snakemake #先检查snakemake书写,跑一个dry-run snakemake -s snakemake.py -n -p #参数-s:指向snakemake文件 #参数-n:指不真的执行snakemake,仅检查 #参数-p:指将每一个rule的执行操作展示出来(即你的shell内容) #第一个块job counts:告诉你每一个rule需要执行的任务数,以及每一个rule的具体情况(认真看看) snakemake -s snakemake.py --dag | dot -Tpdf > snakemake_dag.pdf #dot是Linux的命令,若没有安装conda install graphviz #生成pipeline的拓扑图 #检查通过后,再运行,减少损失 snakemake -s snakemake.py -p #断点运行 snakemake -s snakemake.py --rerun-incomplete #支持在集群上运行(目前常用的生信集群有qsub和sbatch两种提交,这里展示qsub,一般实验室服务器都没有,公司常用) snakemake -s snakemake.py --cluster "qsub -V -cwd -q all.q" --jobs 54. snakemake的书写要素 4.1 snakemake主要就是两部分:很多个rule和一个rule all
每一个rule,又称一个规则,是一个需要执行的操作。一个经典的rule,包括三个要素:输入input,输出output,需要执行的Linux操作/命令或者一个小的python命令shell/run。
rule all,告诉snakemake,你需要输出的结果文件(包括中间文件和最终文件)。snakemake会为了拿到最终文件执行所有rule,而非部分。若你只给出中间文件,也只会执行到该中间文件生成,不执行其它的rule。
依据不同rule的输入和输出将其连接起来,形成一个完整的pipeline。当检测到input,就执行相应的rule;检测到output,就跳过相应的rule。因此这个pipeline的逻辑是这样的,不是你要写一个rule的逻辑关系,而是用输入和输出控制。
snakemake在执行时默认执行第一个rule,然后依据第一个rule的输出决定接下来执行哪一个rule。因此,后面的rule的顺序不一定标准(但是这样书写不方便,还是依次书写)。
若一个rule的输入是多个其他rule的结果,因此,这个rule一定会在所有输入都有条件下才会执行。
4.3 下面是两个经典的rule的格式,可以先看看rule bw1:
input:
"path/to/{sample}.R1.fq"
"path/to/{sample}.R2.fq"
output:
"{sample}.bam"
params:
"4" #假设你这个线程的参数你在这里指定
shell:
"bwt men -t {params[0]} {input[0]}{input[1]}> {output[0]}"
rule sort:
input:
a="path/to/{dataset}.txt"
output:
b="{dataset}.sorted.txt"
log:
"{dataset}.sort.log"
run:
with open(output.b, "w") as out:
for l in sorted(open(input.a)):
print(l,file=out)
4.4 对比上面两个rule发现,rule的格式
- 起始行rule+名称
- 每次缩进4个空格,或者使用TAB键
- 注意双引号“”的使用(很严格)
- 输入和输出的定义:①直接写;②赋给一个变量名
- 输入和输出的引用:①起始下标是0。如input[0]、input[1]、output[0];②使用花括号{}



