Snakemake是一款基于Python语言开发的可复现可扩展的数据分析工具snakemake
的特点包括但不限于:
- 简单易用
- 可直接使用python代码
- 内置分布式运算集群支持(SGE, LSF, etc.)
- 内置Conda环境部署支持
- 内置容器支持(注意这个容器不是docker)
- 自动处理依赖并进行断点重启
- 内置测试功能(benchmark)
-
安装
Full installation
conda install -n base -c conda-forge mamba
conda activate base
mamba create -c conda-forge -c bioconda -n snakemake snakemake
conda activate snakemake
snakemake --help
Minimal installation
conda activate base
mamba 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
。