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官方文檔工具