本期内容主要以整理Snakemake的简单介绍[1]视频为主。
Snakemake 是一个基于Python3的用于构建和管理数据分析工作流程的免费工具。
通过 Snakemake,我们可以定义一系列任务以及这些任务之间的依赖关系,从而构建一个可重复、可维护和可扩展的工作流程。
结合conda/mamba,它们很容易被扩展到服务器、集群、网格和云环境。当你整理好流程以后,只需简单替换几个参数,就能快速开始分析一个新的数据。
Snakemake 的另一个强大特性是它的并行处理能力。它可以根据任务之间的依赖关系,智能地并行执行可以并行执行的任务,从而加快整个工作流程的运行速度。
简单来说,它有以下优点:
能生成流程图,看到每个过程
可拓展的平台
在 Snakemake 中,可以使用类似于 Python 的语法来描述任务和规则。每个规则定义了一个任务,规定了输入、输出以及执行任务所需的命令。Snakemake 可以根据这些规则自动解析依赖关系,确保任务按照正确的顺序执行,以及仅在需要时执行,从而最大程度地提高效率。
因此,想要正确使用Snakemake你需要一个写好了rule的Snakefile,其中rule包含input、output和action(有时也会包含一些参数eg. threads)。
下图是一个示例。
Snakefile示例
现在工作路径有以下4个文件,其中.csv为数据,myplotter为绘图脚本,Snakefile为定义好规则的文件。
通过运行以下命令可以生成对应PDF。
./myplotter -o test.pdf ds1.csv
如果通过Snakemake则需要输入以下命令
snakemake ds1_plot.pdf
Snakefile内容如下
rule plot:
output: "{dataset}_plot.pdf"
input: "{dataset}.csv"
shell: "./myplotter -o {output} {input}"
rule filter:
output: "{csvdata}_filtered.csv"
input: "{csvdata}.csv"
shell: "egrep -v ^boring {input} > {output}"
它一共8行,定义了2个规则,在rule的后面是规则的名称,输入输出和要运行的命令。大括号为通配符,可以为任意字符串。
当我们运行snakemake ds1_plot.pdf时,它会从规则的output中找到能与ds1_plot.pdf匹配的。当{dataset}为ds1时,二者成功匹配。
接下来,把ds1作为匹配项插入input中,即想要生成ds1_plot.pdf,需要ds1.csv,而ds1.csv已经存在于工作目录下了。接下来程序直接读取input和output,执行shell中的命令并获得输出ds1_plot.pdf。
接下来加点难度,运行下列代码会发生什么?
snakemake ds1_filtered_plot.pdf
按照入门演示的内容,它首先会从Snakefile中定义的规则中自上而下的进行匹配,这个时候将{dataset}匹配为ds1_filtered;进一步,程序就需要名为ds1_filtered.csv的input。
而工作目录下并没有这个文件,它就会继续往下匹配新的规则。接下来,程序发现只要将{csvdata}匹配为ds1就可以实现rule plot中所需的输入文件ds1_filtered.csv。
再把{csvdata}=ds1带入rule filter的input和shell中就会生成所需内容,完成绘图,输出ds1_filtered_plot.pdf。
另外,在此基础上,如果我们重新运行snakemake ds1_filtered_plot.pdf会显示命令已经完成,这即是前面提到的“仅在需要时执行,从而最大程度地提高效率”。
如果我们修改了数据,程序会识别文件的修改时间判定其为一个新文件,进而重新运行命令。
Snakemake的参数非常多,常用的有以下几个:
视频源自Edinburgh Genomics Training[2],官方也提供很多其他的线上线下课程,感兴趣的可以自行了解。
其他Snakemake教程推荐:
[1]
Snakemake的简单介绍: https://www.bilibili.com/video/BV1nR4y1t7bz
[2]
Edinburgh Genomics Training: https://genomics.ed.ac.uk/services/training
[3]
使用SnakeMake搭建生信流程: https://www.bilibili.com/video/BV1jb411i76T
[4]
Snakemake Workflow Management! : https://www.youtube.com/watch?v=_wUGzqEjg6A&t=1060s