文/王俐晴(中央研究院資訊科學研究所實習生)
Snakemake 是一個處理工作流程的工具,透過與其他軟體套件 (例如:samtools、BWA 等) 的整合,或單純使用 shell 和 Python 指令,建立規則 (rule) 以實現對資料的系統化分析,並產製結果報告。在功能上與 Makefile 類似,但支援的設定更多,書寫簡單,邏輯易懂,更具使用者友善性。
利用 Snakemake 來讓研究人員將其含有研究方法 (分析順序) 的 Snakefile 和相關資料上傳至資料儲存庫(如 depositar)。使其他使用者在重現研究成果或利用自身資料集進行驗證時,可透過將資料上傳至 Binder 等運算環境,並在終端機輸入簡單指令,自動執行 Snakefile 中定義的工作流程。為了達成不同的需求,Snakemake 支援引用外部資源 (例如 GitHub),或在分析複雜的資料時,將資料的處理分為不同的階段,達到多層次的工作流程。最後,Snakemake 還能產製工作流程圖 (DAG 有向無環圖) 或成果報告 (如 .zip 或 HTML 格式)。
如下方示意,可把 rule 想像為一件捆綁在一起的工作,有時希望多個不相關的工作可以同步執行時,可以將它們設為不同的 rule,以分攤工作,平衡流程。
Tip
rule all
是在 $ snakemake
的時候預設的執行目標,通常代表所有工作都要執行。
定義工作內容,如要拿取或輸出的資料、欲執行的處理過程、分配給這項工作的資源等。
" "
(例如 "resource.zip"
),
分開 (例如 "report.zip", directory("data")
){input}
取代{input[0]}
,{input[1]}
…類推使用。用法類似 output 屬性,可見下方 output 最後一點的說明workflow/Snakefile
)rules.<欲拿取的 rule 名稱>.output
" "
(例如 "report.zip"
),
分開{output}
取代 ; 若是有多個 output 時,則需按照在 output: 的順序以 {output[0]}
, {output[1]}
…類推使用 (見範例一 shell: 下方的 output[0]
與 output[1]
,分別依順序對應了 output: 中的 report.zip
與 second_file_in_output_example.txt
)" "
(例如 "snakemake -s workflow/Snakefile --report {output}"
)''' '''
來包住指令 (例如''' <..shell command..> '''
)""" """
包住全部python -c " <..Python code..> "
包圍 (如下方範例二)" "
shell("<..shell command..>")
" "
… 2> {log}
使用 (見範例五){params}
使用 (如範例五: {params.extra_params}
就等同於指定取用 params: 裡面的 extra_params
,也就是 --option1 value1 --option2 value2
)可將需多次使用的路徑或資源放置於設定文件,減少 Snakefile 中不必要的重複書寫。
config["samples"][wildcards.sample]
取得 config 檔案裡 samples: 下的路徑。在 shell 中使用 {input}
時會將三個路徑都當輸入跑一遍{sample}
是萬用字元 (wildcards),會得到樣本名稱 (不是路徑,所以 logs/bwa_mem/
裡面是 A, B, C 的 log 檔)bam=expand("sorted_reads/{sample}.sorted.bam, sample=config["samples"])
會讓 bam = sorted_reads/{A,B,C}.sorted.bam
三個檔案,所以在 shell 用 {input.bam}
時會執行到三個檔案您可使用以下指令執行撰寫的 Snakefile 流程:
-n (--dry-run)
:模擬試跑 workflow (除錯用)。如:$ snakemake -n
-p
:列出所有紀錄 (除錯用)。如:$ snakemake -p
-f
:強制重新跑完整 workflow。如: $ snakemake -f
-s
:指定欲執行的 Snakefile。如: $ snakemake -s new_snakefile
Snakemake 於製作 Snakemake report 時,會加入流程圖 (Workflow)、執行時間 (Statistics)、使用套件等其他相關資訊 (About)。
您並可在 input: 或 output: 中使用 report(...)
,將各流程的結果加入報告。參數如下:
將輸出如下圖之報告:
產製 report 的指令如下:
$ snakemake --dag <目標 Snakefile 名稱> | dot -Tsvg > <輸出 DAG 圖名>.svg
$ snakemake -s 目標 Snakefile 名稱> -–report <欲產生的 report 路徑與名稱 (.zip or .html …)>
Tip
目前若要在 Binder 中使用 Snakemake 需要另行安裝,可將如下內容的 Binder 環境設定檔 (environment.yml) 上傳為 depositar 的資源,以在開啟 Binder 時一併安裝 Snakemake 於 Binder 所提供的 JupyterLab 環境中 (也可以在開啟 Binder 後手動在 terminal 安裝)。
Tip
受 xsrf 限制,Binder 環境下無法正常瀏覽 Snakemake HTML 報告,請下載至本機瀏覽。
Important
副檔名必須為 .yml (而非 .yaml),否則不會安裝該檔案所定義的相依套件。
台北市金價與結婚人數分析資料集,包含以下內容:
於 Binder 服務執行此資料集,在開啟的 JupyterLab 環境所提供的終端機 (Terminal) 中,輸入 snakemake
,即可執行流程。完成的長條圖位於 result
資料夾內,報告輸出於 report.html
。
以上為簡單的 Snakemake 使用教學,因為研究過程中主要是為了協助使用者順利在 depositar 的 Binder 功能上順利使用 Snakemake,所以皆搭配了一些在 Binder 使用時的注意事項。若欲知更多深入的 Snakemake 功能,可以上 Snakemake 官方網站閱讀更詳細的說明。