
Snakemake是一款基于Python语言开发的可复现可扩展的数据分析工具snakemake的特点包括但不限于:
- 简单易用
- 可直接使用python代码
- 内置分布式运算集群支持(SGE, LSF, etc.)
- 内置Conda环境部署支持
- 内置容器支持(注意这个容器不是docker)
- 自动处理依赖并进行断点重启
- 内置测试功能(benchmark)
-
安装
Full installation
conda install -n base -c conda-forge mambaconda activate basemamba create -c conda-forge -c bioconda -n snakemake snakemakeconda activate snakemakesnakemake --help
Minimal installation
conda activate basemamba create -c bioconda -c conda-forge -n snakemake snakemake-minimal
执行命令
普通参数
一般讲所有的参数配置写入Snakefile后直接在Snakefile所在路径执行
snakemake命令即可开始执行流程任务。一些常用的参数:--snakefile, -s 指定Snakefile,否则是当前目录下的Snakefile--dryrun, -n 不真正执行,一般用来查看Snakefile是否有错--printshellcmds, -p 输出要执行的shell命令--reason, -r 输出每条rule执行的原因,默认FALSE--cores, --jobs, -j 指定运行的核数,若不指定,则使用最大的核数--force, -f 重新运行第一条rule或指定的rule--forceall, -F 重新运行所有的rule,不管是否已经有输出结果--forcerun, -R 重新执行Snakefile,当更新了rule时候使用此命令
可视化命令
snakemake --dag | dot -Tpdf > dag.pdf # 输出流程图为pdf图片snakemake --dag | dit -Tpdf > dag.pdf# --dag: 生成依赖的有向图snakemake --gui 0.0.0.0:2468# --gui: 通过网页查看运行状态
集群投递
snakemake --cluster "qsub -V -cwd -q 节点队列" -j 10# --cluster /-c CMD: 集群运行指令# qusb -V -cwd -q, 表示输出当前环境变量(-V),在当前目录下运行(-cwd), 投递到指定的队列(-q), 如果不指定则使用任何可用队列# --local-cores N: 在每个集群中最多并行N核# --cluster-config/-u FILE: 集群配置文件
项目构架
├── .gitignore├── README.md├── LICENSE.md├── workflow│ ├── rules| │ ├── module1.smk| │ └── module2.smk│ ├── envs| │ ├── tool1.yaml| │ └── tool2.yaml│ ├── scripts| │ ├── script1.py| │ └── script2.R│ ├── notebooks| │ ├── notebook1.py.ipynb| │ └── notebook2.r.ipynb│ ├── report| │ ├── plot1.rst| │ └── plot2.rst| └── Snakefile├── config│ ├── config.yaml│ └── some-sheet.tsv├── results└── resources
部分使用注意事项
在运行的命令行中,snakemake会将
{}认为是变量,因此需要使用{{}}来区分- snakemake中的
wildcards在输入和输出中必须能够相互对应才能输出,缺一不可
常用规则组成
rule all: 不同于其他的rule,在rule all里面一般不会去定义要执行的命令,他一般用来定义最后的输出结果文件.wildcards: 来获取通配符匹配到的部分,例如对于通配符"{dataset}/file.{group}.txt"匹配到文件101/file.A.txt,则{wildcards.dataset}就是101,{wildcards.group}就是A。threads: 通过在rule里面指定threads参数来指定分配给程序的线程数,eg:threads: 8。resources: 可用来指定程序运行的内存,eg.resources: mem_mb=800。
