snakemake是一个用来编写任务流程的工具,用python编写的,所以其执行的流程脚本也比较通俗易懂,易于理解。html
安装snakemake的方法有多种,snakemake官方推荐的是conda,安装方法以下:
conda install -c bioconda snakemake
python
虽然snakemake普遍的应用于生物信息方面的流程编写,可是snakemake的应用并不局限于编写生物信息学的流程,这里以一个简单的合并文件的例子开始介绍snakemake的简单使用。shell
#首先咱们创建两个文件 $ echo "Here is hello." > hello.txt $ echo "Here is world." > world.txt #接下来开始编写咱们的Snakefile rule concat: # 这里的rule可视为snakemake定义的关键字,concat使咱们自定义的这一步任务的名称 input: # input一样是snakemake的关键字,定义了在这个任务中的输入文件 expand("{file}.txt", file=["hello", "world"]) #expand是一个snakemake定义的替换命令 output: # output也是snakemake的关键字,定义输出结果的保存文件 "merged.txt" shell: # 这里表示咱们下面的命令将在命令行中执行 "cat {input} > {output}" #最后就能够在Snakefile的路径执行snakemake命令便可 $ snakemake $ cat merge.txt Here is hello. Here is world.
在上面的Snakefile脚本中,rule
、input
、output
、shell
、expand
均为snakemake中的关键字或者命令。同时Snakefile中的每个rule
其实均可以看做是一个简单的shell脚本,经过Snakefile将多个rule
组织在一块儿并按照咱们定义的顺序来执行。另外,在output
中的结果文件能够是未存在目录中的文件,这时会自动建立不存在的目录。json
rule
是Snakefile中最主要的部分。如上面的例子所说,每个rule定义了一系列pipe中的一步,每个rule均可以看成一个shell脚原本处理,通常主要包括input
、output
、shell
3个部分。同时还有许多上面没有列出来的用法:ruby
rule all
。不一样于其余的rule,在rule all
里面通常不会去定义要执行的命令,他通常用来定义最后的输出结果文件。除了rule all
中定义的文件外最后输出结果不会保存任何中间文件。例如将上面的脚本改为以下文件则没有输出结果:rule all:
input:
#"merged.txt" 取消注释后,则能正常输出文件 rule concat: input: expand("{file}.txt", file=["hello", "world"]) output: "merge.txt" shell: "cat {input} > {output}"
wildcards
。用来获取通配符匹配到的部分,例如对于通配符"{dataset}/file.{group}.txt"
匹配到文件101/file.A.txt
,则{wildcards.dataset}
就是101,{wildcards.group}
就是A。threads
。经过在rule里面指定threads
参数来指定分配给程序的线程数,egthreads: 8
。resources
。可用来指定程序运行的内存,eg. resources: mem_mb=800
。message
。使用message
参数能够指定每运行到一个rule时,在终端中给出提示信息,eg.message: "starting mapping ..."
。priority
。可用来指定程序运行的优先级,默认为0,eg.priority: 20
。log
。用来指定生成的日志文件,eg.log: "logs/concat.log"
。params
。指定程序运行的参数,eg.params: cat="-n"
,调用方法为{params.cat}
。run
。在run
的缩进区域里面能够输入并执行python代码。scripts
。用来执行指定脚本,eg.scripts: "rm_dup.py"
temp
。经过temp
方法能够在全部rule
运行完后删除指定的中间文件,eg.output: temp("f1.bam")
。protected
。用来指定某些中间文件是须要保留的,eg.output: protected("f1.bam")
。ancient
。重复运行执行某个Snakefile时,snakemake会经过比较输入文件的时间戳是否更改(比原来的新)来决定是否从新执行程序生成文件,使用ancient方法能够强制使得结果文件一旦生成就不会再次从新生成覆盖,即使输入文件时间戳已经更新,eg.input: ancient("f1.fastq")
。rule a:
input: "path/to/input" output: "path/to/output" shell: ... rule b: input: rules.a.output #直接经过rules.a.output 指定rule a的输出 output: "path/to/output/of/b" shell: ...
report
。使用snakemake定义的report
函数能够方便的将结果嵌入到一个HTML文件中进行查看。每计算一次数据都要重写一次Snakefile有时可能会显得有些繁琐,咱们能够将那些改动写入配置文件,使用相同流程计算时,将输入文件的文件名写入配置文件而后经过Snakefile读入便可。
配置文件有两种书写格式——json和yaml。在Snakefile中读入配置文件使用以下方式:bash
configfile: "path/to/config.json" configfile: "path/to/config.yaml" # 也可直接在执行snakemake命令时指定配置 $ snakemake --config yourparam=1.5
在shell命令中直接调用config文件中的内容的话,不须要引号,如config[a]
而不是config["a"]
。
集群计算配置app
通常讲全部的参数配置写入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 #集群投递 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: 集群配置文件
参考:snakemake官方文档工具