宏轉錄組學習筆記(三)

通過腳本和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的一些基礎知識,但是,如果您需要其他教程,可以在這裏添加一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章