通過腳本和snakemake實現自動化
到目前爲止,我們已經完成了所有工作,並複製並粘貼了許多命令來完成所需的操作。這可行!但是也可能很耗時,並且更容易出錯。接下來,我們將向你展示如何將所有這些命令放入Shell腳本中。
一個shell腳本是一個文本文件的完整的shell命令,運行時就如同你在命令行交互方式運行它們。
在這裏,我們將創建一個從中獲取並一次運行它們全部的命令。
編寫shell腳本
讓我們將質量控制過程中的所有命令放入一個腳本中。
我們稱之爲run_qc.sh
。該sh
在的結尾告訴你,這是一個bash腳本。
使用nano(編輯器)編輯文件run-qc.sh
,並將以下內容放在其中:
cd ${PROJECT}
mkdir -p quality
cd quality
ln -s ../data/*.fq.gz ./
printf "I see $(ls -1 *.fq.gz | wc -l) files here.\n"
fastqc *.fq.gz -t 4
multiqc .
現在,這是一個shell腳本,您可以使用一個命令來執行所有這些命令的去-試試跑下吧!:
cd ~/
bash run-qc.sh
重新運行shell腳本
假設您想重新運行腳本。你要怎麼做?
好吧,請注意,quality
目錄是在腳本開始創建的,所有內容都在該目錄中執行。因此,要像這樣刪除quality
目錄,
rm -fr quality
然後你可以運行
bash run-qc.sh
編寫Shell腳本的一些技巧
1.使它可執行
您可以bash
通過一些magic來擺脫上面的命令部分:
把
#! /bin/bash
放在文件頂部,然後運行
chmod +x ~/run-qc.sh
您現在可以運行
./run-qc.sh
代替bash run-rnaseq.sh
。
您可能會想,好吧,爲什麼這很重要?好的,您可以對R腳本和Python腳本執行相同的操作(但是放在/usr/bin/env Rscript
或/usr/bin/env python
放在頂部,而不是/bin/bash
)。這基本上用腳本的編寫語言來註釋腳本,因此您不必自己瞭解或記住。
所以:這不是必須的,但這是一個很好的技巧。
您也可以始終通過指定或來強制腳本以特定語言運行。bash ``Rscript
2.另一個很好的補充:使它很好地報錯
Shell腳本的一個怪異的方面是(默認情況下)即使有錯誤,它們也可以繼續運行。這是不好的行爲,我們應該將其關閉。
您可以通過重新運行上面的腳本而不刪除目錄來觀察此行爲rnaseq/
-該mkdir
命令將打印錯誤,因爲目錄仍然存在,但是每個shell腳本的一個很好的補充就是使它在第一個錯誤時失敗。通過放
set -e
在頂部-告訴bash在第一個錯誤時退出,而不是勇敢地繼續前進。
3.最後一個不錯的補充:使shell腳本打印出它們正在運行的命令!
你可能會注意到,shell腳本爲您提供了它的運行命令的輸出,但不告訴你它的運行命令。
如果添加
set -x
在Shell腳本的頂部,然後重新運行它,
cd ~/
rm -fr quality
./run-qc.sh
然後您將看到正在運行的全部命令!
關於shell腳本的最後說明:
set -e
並且set -x
僅在shell腳本中起作用-它們是bash命令。您需要在Python和R中使用其他方法。
Snakemake自動化!
通過shell腳本實現自動化非常棒,但是這裏存在一些問題。
首先,您必須每次都運行整個工作流程,並且每次都要重新計算所有內容。如果您運行的工作流需要4天,並且在最後更改了命令,則必須手動進入,然後運行依賴於已更改命令的內容。
其次,它是非常明確的,並且不是很通用。如果要在其他RNAseq數據集上運行,則必須更改許多命令。
snakemake是幫助解決這些問題的幾種工作流程系統之一。(您可以在此處閱讀文檔。)讓我們看一下!
首先,讓我們激活我們的snakemake環境
source deactivate
source activate snake
我們將自動化相同的腳本進行修剪,但是使用snakemake。
rule all:
input:
"trim/TARA_135_SRF_5-20_rep1_1m_1.qc.fq.gz",
"trim/TARA_135_SRF_5-20_rep1_1m_2.qc.fq.gz"
rule trim_reads:
input:
r1="data/TARA_135_SRF_5-20_rep1_1m_1.fq.gz",
r2="data/TARA_135_SRF_5-20_rep1_1m_2.fq.gz",
adapters="trim/combined.fa"
ouput:
p1="trim/TARA_135_SRF_5-20_rep1_1m_1.qc.fq.gz",
p2="trim/TARA_135_SRF_5-20_rep1_1m_2.qc.fq.gz",
s1="trim/TARA_135_SRF_5-20_rep1_1m_1_s1.qc.fq.gz",
s2="trim/TARA_135_SRF_5-20_rep1_1m_2_s2.qc.fq.gz"
shell:'''
trimmomatic PE {input.r1} \
{input.r2} \
{output.p1} {output.s1} \
{output.p2} {output.s2} \
ILLUMINACLIP:{input.adapters}:2:40:15 \
LEADING:2 TRAILING:2 \
SLIDINGWINDOW:4:2 \
MINLEN:25
'''
現在我們可以運行
cd $PROJECT
snakemake
您應該看到“什麼都沒做”。
那是因爲修剪的文件已經存在!
讓我們修復一下:
rm trim/TARA_135_SRF_5-20_rep1*
現在,當您運行時snakemake
,您應該看到正在運行Trimmomatic。是的!然後,如果snakemake
再次運行,您將發現它不需要執行任何操作-所有文件都是“最新的”。
添加環境
在整個研討會中,我們一直在使用conda環境。我們展示了您必須使用來在Bioconda課程中導出塔拉環境 conda env export -n tara -f $PROJECT/tara_conda_environment.yaml
。我們也可以在snakemake規則中使用此環境!
rule all:
input:
"trim/TARA_135_SRF_5-20_rep1_1m_1.qc.fq.gz",
"trim/TARA_135_SRF_5-20_rep1_1m_2.qc.fq.gz"
rule trim_reads:
input:
r1="data/TARA_135_SRF_5-20_rep1_1m_1.fq.gz",
r2="data/TARA_135_SRF_5-20_rep1_1m_2.fq.gz",
adapters="trim/combined.fa"
ouput:
p1="trim/TARA_135_SRF_5-20_rep1_1m_1.qc.fq.gz",
p2="trim/TARA_135_SRF_5-20_rep1_1m_2.qc.fq.gz",
s1="trim/TARA_135_SRF_5-20_rep1_1m_1_s1.qc.fq.gz",
s2="trim/TARA_135_SRF_5-20_rep1_1m_2_s2.qc.fq.gz"
conda: "tara_conda_environment.yaml"
shell:'''
trimmomatic PE {input.r1} \
{input.r2} \
{output.p1} {output.s1} \
{output.p2} {output.s2} \
ILLUMINACLIP:{input.adapters}:2:40:15 \
LEADING:2 TRAILING:2 \
SLIDINGWINDOW:4:2 \
MINLEN:25
'''
我們現在不打算在集羣上運行它,因爲它要求您能夠下載內容,而我們不能執行此操作。但是,這是將來執行此操作的語法。
其他資源
今天,我們已經介紹了snakemake
的一些基礎知識,但是,如果您需要其他教程,可以在這裏添加一個。