使用snakemake搭建工作流程


snakemake

snakemake是一个基于Python的流程框架,可以用来构建生物信息学分析流程

结构

rule all:
    input:

rule operate_1:
    input:
    output:
    log:
    shell:

rule operate_2:
    input:
    output:
    log:
    shell:

rule operate_3:
    input:
    output:
    log:
    shell:

常用命令

# 参数
-n 不真正执行
-p 输出每一步需要执行的shell
-r 输出每一步执行的原因


# run snakemake
snakemake -s snakefile.py

# dry-run
snakemake -s snakefile.py -n -p
snakemake -s snakefile.py -n -r

# --rerun-incomplete断点运行
snakemake -s snakefile.py --rerun-incomplete

# 集群上运行
snakemake -s snakefile.py --cluster "qsub -V -cwd -q all.q" --jobs 5
# -j 参数控制调用的核心数

绘制流程

snakemake -s snakefile.py --dag | dot -Tpdf > test_dag.pdf

从一个简单的流程开始

1. 安装

mamba install -c bioconda snakemake

2. 创建一个snakefile

touch snakefile.py

3. 一个简单的流程框架

思路:

1, 生成一个1.txt文件 2, 生成一个2.txt文件 3, 使用cat命令, 将两者合并为hebing.txt

echo "hello number1" >1.txt
 echo "hello number2" >2.txt
 cat 1.txt 2.txt 
 cat 1.txt 2.txt >hebing.txt

编写snakemake脚本

# 假设我们在同目录下有两个txt文件
 echo "hello number1" >1.txt
 echo "hello number2" >2.txt
# 我们想使用snakemake通过流程控制来将两个文件合并
# snakefile可以这样编写
# $ cat snakefile.py

rule test_cat:
    input:
        "1.txt",
        "2.txt"
    output:
        "hebing.txt"
    shell:
        """cat {input} >> {output}"""

-np测试流程能否正常运行

snakemake --snakefile snakefile.py -np

执行流程

snakemake --snakefile snakefile.py

一些解释:

  • snakemake的分级方式遵循python的缩进形式,也就是四个空格。

  • rule 后接rule的名字,例子里面只有一种input和output文件类型,但实际情况可能有更多的种类,不同的文件类型之间用逗号+换行隔开。例子中输入的只有也只有一个单独的文件,如果我们要同时处理多个.sra文件用{sample}代替,snakemake会自动识别文件类型并逐个进行处理

  • snakemake默认执行的文件名是: Snakefile, 如果想要指定自己编写的文件名, 可以加上参数: —snakefile 比如: 文件名为a.snake

snakemake --snakefile a.snake
  • 如果文件名是默认的Snakemake, 不用加参数, 直接运行snakemake即可直接执行.
snakemake
  • 运行成功, 重新运行时

    显示Nothing to be done, 即不会执行.

$ snakemake
Nothing to be done.

如果heibng.txt文件被删掉了, 会重新执行。原因是snakemake使用检测生成文件的方法来判断断点从而可以实现断点继续执行,检测到最终生成文件已经存在,就不会再做任何执行。

4. 一点进阶

  • 第一: 生成1.txt , 2.txt, 3.txt
  • 第二: 向每个文件中加入”add a”字符, 命名为:1_add_a.txt, 2_add_a.txt, 3_add_a.txt
  • 第三: 向文件中增加”add b”, 命名为:1_add_a_add_b.txt, 2_add_a_add_b.txt, 3_add_a_add_b.txt
  • 第四: 向文件中增加”add c”, 命名为: 1_add_a_add_b_add_c.txt, 2_add_a_add_b_add_c.txt, 3_add_a_add_b_add_c.txt
  • 第五: 将1_add_a_add_b.txt, 2_add_a_add_b.txt, 1_add_a_add_b_add_c.txt, 2_add_a_add_b_add_c.txt, 3_add_a_add_b_add_c.txt 合并为hebing.txt文件

准备这三个文件:

cat *txt
this is 1.txt
this is 2.txt
this is 3.txt

编辑snakefile

扩展-在slurm集群使用snakemake

https://github.com/Snakemake-Profiles/slurm

# 成功使用snakemake提交的例子
snakemake --profile slurm --jobs 1 --cores 12 --snakefile batch1.snake &

继续学习

https://www.jianshu.com/p/8e57fd2b81b2?tdsourcetag=s_pctim_aiomsg

https://snakepipes.readthedocs.io/en/latest/

https://github.com/maxplanck-ie/snakepipes/blob/master/README.rst

https://github.com/Snakemake-Profiles/slurm