snakemake使用筆記

2022-09-16 15:09:13 字數 4676 閱讀 9692

snakemake是乙個用來編寫任務流程的工具,用python編寫的,因此其執行的流程指令碼也比較通俗易懂,易於理解。

1、安裝snakemake

安裝snakemake的方法有多種,snakemake官方推薦的是conda,安裝方法如下:

conda install -c bioconda snakemake

2、乙個簡單的snakemake指令碼

雖然snakemake廣泛的應用於生物資訊方面的流程編寫,但是snakemake的應用並不侷限於編寫生物資訊學的流程,這裡以乙個簡單的合併檔案的例子開始介紹snakemake的簡單使用。

#首先我們建立兩個檔案

$ echo "here is hello." > hello.txt

$ echo "here is world." > world.txt

#接下來開始編寫我們的snakefile

rule concat: # 這裡的rule可視為snakemake定義的關鍵字,concat使我們自定義的這一步任務的名稱

input: # input同樣是snakemake的關鍵字,定義了在這個任務中的輸入檔案

expand(".txt", file=["hello", "world"]) #expand是乙個snakemake定義的替換命令

output: # output也是snakemake的關鍵字,定義輸出結果的儲存檔案

"merged.txt"

shell: # 這裡表示我們下面的命令將在命令列中執行

"cat > "

#最後就可以在snakefile的路徑執行snakemake命令即可

$ snakemake

$ cat merge.txt

here is hello.

here is world.

在上面的snakefile指令碼中,ruleinputoutputshellexpand均為snakemake中的關鍵字或者命令。同時snakefile中的每乙個rule其實都可以看作是乙個簡單的shell指令碼,通過snakefile將多個rule組織在一起並按照我們定義的順序來執行。另外,在output中的結果檔案可以是未存在目錄中的檔案,這時會自動建立不存在的目錄。

1、rule

rule是snakefile中最主要的部分。如上面的例子所說,每乙個rule定義了一系列pipe中的一步,每乙個rule都可以當作乙個shell指令碼來處理,一般主要包括inputoutputshell3個部分。同時還有許多上面沒有列出來的用法:

rule all。不同於其他的rule,在rule all裡面一般不會去定義要執行的命令,他一般用來定義最後的輸出結果檔案。除了rule all中定義的檔案外最後輸出結果不會儲存任何中間檔案。例如將上面的指令碼改成如下檔案則沒有輸出結果:

rule all:

input:

#"merged.txt" 取消注釋後,則能正常輸出檔案

rule concat:

input:

expand(".txt", file=["hello", "world"])

output:

"merge.txt"

shell:

"cat > "

wildcards。用來獲取萬用字元匹配到的部分,例如對於萬用字元"/file..txt"匹配到檔案101/file.a.txt,則就是101,就是a。

threads。通過在rule裡面指定threads引數來指定分配給程式的執行緒數,egthreads: 8

resources。可用來指定程式執行的記憶體,eg.resources: mem_mb=800

priority。可用來指定程式執行的優先順序,預設為0,eg.priority: 20

log。用來指定生成的日誌檔案,eg.log: "logs/concat.log"

params。指定程式執行的引數,eg.params: cat="-n",呼叫方法為

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 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: ...

report。使用snakemake定義的report函式可以方便的將結果嵌入到乙個html檔案中進行檢視。

2. configuration

每計算一次資料都要重寫一次snakefile有時可能會顯得有些繁瑣,我們可以將那些改動寫入配置檔案,使用相同流程計算時,將輸入檔案的檔名寫入配置檔案然後通過snakefile讀入即可。

配置檔案有兩種書寫格式——json和yaml。在snakefile中讀入配置檔案使用如下方式:

configfile: "path/to/config.json" 

configfile: "path/to/config.yaml"

# 也可直接在執行snakemake命令時指定配置

$ snakemake --config yourparam=1.5

在shell命令中直接呼叫config檔案中的內容的話,不需要引號,如config[a]而不是config["a"]

集群計算配置

一般講所有的引數配置寫入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官方文件

Vim 使用筆記

set hlsearch set nohlsearch 搜尋後清除上次的加亮 nohl nohlsearch 拷貝 很有用的一句話,規定了格式選項,讓它換行不自動空格 set formatoptions tcrqn set fo r set noautoindent 再 shift insert 正...

xemacs使用筆記

xemacs使用筆記 xemacs emacs的下一代,由lucid原創 from debian參考手冊.由於不知道什麼時候刪掉了emacs的乙個重要檔案.每次都沒法安裝好.突然發現了xemacs,於是決定使用看看.本人還是菜鳥,僅供交流 我使用的ubuntu系統,所以就直接apt get inst...

TreeView使用筆記

treeview由節點構成,建樹通過對treeview.items屬性進行操作。items是乙個ttreenodes物件,這是乙個ttreenode集。一 針對ttreenodes,也就是 treeview.items,有這些屬性 1 count,節點個數。2 item index 通過index得...