snakemake使用筆記

snakemake是一個用來編寫任務流程的工具,用python編寫的,所以其執行的流程腳本也比較通俗易懂,易於理解。html

1、從一個簡單的例子開始

一、安裝snakemake

安裝snakemake的方法有多種,snakemake官方推薦的是conda,安裝方法以下:
conda install -c bioconda snakemakepython

二、一個簡單的snakemake腳本

雖然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腳本中,ruleinputoutputshellexpand均爲snakemake中的關鍵字或者命令。同時Snakefile中的每個rule其實均可以看做是一個簡單的shell腳本,經過Snakefile將多個rule組織在一塊兒並按照咱們定義的順序來執行。另外,在output中的結果文件能夠是未存在目錄中的文件,這時會自動建立不存在的目錄。json

2、snakemake中的一些命令與規則

一、rule

rule是Snakefile中最主要的部分。如上面的例子所說,每個rule定義了一系列pipe中的一步,每個rule均可以看成一個shell腳原本處理,通常主要包括inputoutputshell3個部分。同時還有許多上面沒有列出來的用法:ruby

  1. 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}" 
  1. wildcards。用來獲取通配符匹配到的部分,例如對於通配符"{dataset}/file.{group}.txt"匹配到文件101/file.A.txt,則{wildcards.dataset}就是101,{wildcards.group}就是A。
  2. threads。經過在rule裏面指定threads參數來指定分配給程序的線程數,egthreads: 8
  3. resources。可用來指定程序運行的內存,eg. resources: mem_mb=800
  4. message。使用message參數能夠指定每運行到一個rule時,在終端中給出提示信息,eg.message: "starting mapping ..."
  5. priority。可用來指定程序運行的優先級,默認爲0,eg.priority: 20
  6. log。用來指定生成的日誌文件,eg.log: "logs/concat.log"
  7. params。指定程序運行的參數,eg.params: cat="-n",調用方法爲{params.cat}
  8. run。在run的縮進區域裏面能夠輸入並執行python代碼。
  9. scripts。用來執行指定腳本,eg.scripts: "rm_dup.py"
  10. temp。經過temp方法能夠在全部rule運行完後刪除指定的中間文件,eg.output: temp("f1.bam")
  11. protected。用來指定某些中間文件是須要保留的,eg.output: protected("f1.bam")
  12. ancient。重複運行執行某個Snakefile時,snakemake會經過比較輸入文件的時間戳是否更改(比原來的新)來決定是否從新執行程序生成文件,使用ancient方法能夠強制使得結果文件一旦生成就不會再次從新生成覆蓋,即使輸入文件時間戳已經更新,eg.input: ancient("f1.fastq")
  13. Rule Dependencies。可經過快捷方式指定前一個rule的輸出文件爲此rule的輸入文件:
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: ... 
  1. report。使用snakemake定義的report函數能夠方便的將結果嵌入到一個HTML文件中進行查看。

2. configuration

每計算一次數據都要重寫一次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

3、snakemake的執行

通常講全部的參數配置寫入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官方文檔工具

做者:To_2019_1_4 連接:https://www.jianshu.com/p/14b9eccc0c0e 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索