圖形化開放式生信分析系統開發 - 3 生信分析流程的進化

接上兩篇內容,本文主要講述工作中NGS從科研進入醫學臨牀領域,工作中接觸到生信流程,以及最終在自動圖形化開放式生信分析系統開發中生信workflow設計實現的過程。

接觸二代測序,生信分析,那真是打開了一個新世界的大門,各種名次術語滿天飛,搞的頭暈腦脹。什麼“什麼是高通量測序/NGS”、Sanger法測序(一代測序)、外顯子測序(whole exon sequencing)、mRNA測序 (RNA-seq)、SNP/SNV(單核苷酸位點變異)、
INDEL (基因組小片段插入)、copy number variation (CNV)基因組拷貝數變異、structure variation (SV)基因組結構變異等等。

百度了各種相關的分析軟件和文件格式,什麼fastq,fastq,bam,vcf等等。下面分階段描述生信分析流程升級/進化的過程:

1.手動命令行運行

經過幾個月接觸,自學、爬坑,慢慢搞清楚了部分內容,在似懂非懂之間開始了生信流程分析,終於有一天明白過來,這所謂的pipeline其實就是基於文件的工作流啊。
比如其中一個步驟:
fastqc

QC 完成後,然後運行下一個步驟:
mapping to reference

運行模式,一個輸入或者多個輸入文件,通過軟件分析/計算得到一個或者多個輸出文件。
然後輸出文件部分或者全部作爲下一個步驟的輸入文件。這時候手動分析的話,只能手動的一個一個輸入命令,完成每一個步驟,直到得到最後結果。

如下面代碼:
bwa mem -t 8 -M -R \ 
  "@RG\tID:0bdd6f55\tLB:5fba\tPL:Illumina\tPU:3102\tSM: B1701" \
  B1701_R1.fq.gz B1701_R2.fq.gz | samtools view -bS - > B1701.bam

gatk ReorderSam \ 
  -R /opt/ref/hg19.fa \ 
  -I B1701.bam \ 
  -O B1701_reordered.bam

gatk SortSam \ 
  -I B1701_reordered.bam \ 
  -O B1701_sorted.bam \ 
  -SO coordinate


2. 腳本連續運行

隨着熟練程度提高,生信分析上用到的軟件/工具也熟悉起來了,但是問題也暴露出來了,
簡單的一套 GATK Best Practice 腫瘤突變分析流程,加上CNVSV 分析從 fastq 文件開始到最後得到過濾的 vcf 結果,一共有 30 多個步驟。自己一條一條輸入次數多了就開始煩躁了。

這時候自然會考慮,如何減少手動輸入,將這些腳本自動化。

腳本自動運行:當然這需要一點編程基礎了。其實總的來看,每一個步驟的輸入和輸出可
以根據最開始的輸入文件來判斷。
例如 B1701_R1.fastq.gz,bwa map 之後得到B1701_R1.bam,所以只需要獲得最初的文件前綴,作爲 SampleNumber 字段,後續的中間輸出,最終的輸出文件都以這個 SampleNumber 爲前綴,以擴展名作爲區分。這時候腳本就可以連續運行了。
以 shell 爲例:總的腳本運行:

workrun.sh B1701_R1.fastq.gz B1701_R2.fastq.gz

腳本的第一步,就是獲取輸入文件:B1701_R1.fastq.gz B1701_R2.fastq.gz經過匹配計算,可以得到 B1701 作爲 SampleNumber,並保存在變量$SN中。後續的輸出都以$SN.bam $SN_sortted.bam $SN_marked.bam等等,這樣後續的步驟可以作爲一個列表來表示:

export SN=1701

bwa mem -t 8 -M -R \ 
  "@RG\tID:0bdd6f55\tLB:5fba\tPL:Illumina\tPU:3102\tSM:$SN" \
  $SN_R1.fq.gz $SN_R2.fq.gz | samtools view -bS - >$SN.bam

gatk ReorderSam \ 
  -R /opt/ref/hg19.fa \ 
  -I /opt/result/$SN.bam \ 
  -O $SN_reordered.bam

gatk SortSam \ 
  -I $SN_reordered.bam \ 
  -O $SN_sorted.bam \ 
  -SO coordinate

運行腳本之前使用 B1701 替換變量$SN 得到要運行的真實的 shell 命令

bwa mem -t 8 -M -R \ 
  "@RG\tID:0bdd6f55\tLB:5fba\tPL:Illumina\tPU:3102\tSM: B1701" \
  B1701_R1.fq.gz B1701_R2.fq.gz | samtools view -bS - > B1701.bam

gatk ReorderSam \ 
  -R /opt/ref/hg19.fa \ 
  -I B1701.bam \ 
  -O B1701_reordered.bam

gatk SortSam \ 
  -I B1701_reordered.bam \ 
  -O B1701_sorted.bam \ 
  -SO coordinate
繼續完善:
  • 如何判斷這一步是否真正完成了,運行過程有沒有錯誤。如果有錯誤,停止後續步驟運行:這裏首先想到的是,運行結束後,判斷預期的輸出文件是否存在,文件大小是否大於 0,有些軟件即使運行錯誤也會創建一個大小爲 0 的文件。
  • 比如計算這一步驟運行需要多少時間。在命令行 shell 前面加上 time
time gatk SortSam \ 
  -I B1701_reordered.bam \ 
  -O B1701_sorted.bam \ 
  -SO coordinate

3.一個腳本 shell 文件運行整個分析流程

上面的內容解決了 shell 腳本連續運行的問題,但是還有一些遺留問題可以改進:

  • 輸入文件如果指定一個目錄是否更好一些? 如: $data
  • 輸出文件如果指定一個目錄是否更好一些? 如: $result
  • 運行的軟件/工具/腳本路徑使用變量替代,這樣便於升級維護,升級時候只需要修改
    該變量的值就可以了。如:$bwa $samtools $gatk
  • 運行過程中引用的 reference 文件,數據庫文件的路徑也用變量替代,升級版本的時
    候只需要修改變量的路徑就可以了,這樣便於升級維護 如 $hg19 (hg19.fa)
  • 運行中的重要參數,一些 cutoff 值,配置的運行資源 如: $threads

這樣經過以上替換,前面的 shell 腳本就替換爲:

export SN=B1701
export data=/opt/data
export result=/opt/result
export bwa=/opt/tools/bwa
export samtools=/opt/tools/samtools
export bwa=/opt/tools/gatk
export hg19=/opt/ref/hg19.fa
export threads=8

time $bwa mem -t $threads -M -R \ 
  "@RG\tID:0bdd6f55\tLB:5fba\tPL:Illumina\tPU:3102\tSM:$SN" \
  $data/$SN_R1.fq.gz $data/$SN_R2.fq.gz \
  | $samtools view -bS - >$result/$SN.bam

time $gatk ReorderSam \ 
  -R $hg19 \ 
  -I $result/$SN.bam \ 
  -O $result/$SN_reordered.bam

time $gatk SortSam \ 
  -I $result/$SN_reordered.bam \ 
  -O $result/$SN_sorted.bam \ 
  -SO coordinate

這時候已經將整套流程簡單精簡爲一個 shell 腳本,如命名爲 workrun.sh,每次運行整套
流程之前,將變量$SN 的值修改爲需要的值就可以了。如果要升級軟件、升級 reference 文件
版本,修改 shell 腳本相應變量值即可。

到這裏就結束了麼?還能繼續改進麼?請繼續往下看。

4. 自動掃描文件並運行腳本

前面我們通過變量定義兩個目錄$data$result分別來表示,分析流程的輸入文件目錄$data和分析輸出文件目錄$result,這時候如果我們寫一個腳本,按照一定週期判斷$data目錄下是否有符合要求的文件,如果有文件符合要求,就運行前面的 workrun.sh啓動分析流程。
待整個分析流程結束後,將$SN對應的 SampleNumber 值寫入一個文件,下次掃描判斷文件對應的 SampleNumber是否已經分析過。

##5. 帶報告的自動掃描並觸發運行腳本
前面已經實現了自動掃描並分析文件,這時候我們需要將保存$SN的文件完善一下,在分析之前錄入樣本信息,具體樣本信息的記錄和操作。

參照文章:自動化圖形生物信息分析系統開發-2 樣本信息處理

運行分析之前,用 SampleReport字段表示分析狀態,掃描腳本根據 SampleReport字段是否爲空判斷,該樣本編號 SampleNumber對應的文件是否已經分析過。分析開始後,更新SampleReport字段爲當前日期,分析完成後,再更新爲分析完成時的日期。

分析報告,首先我們準備一個分析報告模板,將需要填充的字段,用變量的形式表示,如
${sn}${sampleReport}等等,包括

  • 樣本信息
  • 患者信息
  • 分析結果
  • 用藥信息
  • 引用文章鏈接
  • 審覈簽名 等等

等分析結束後,從樣本保存文件,和分析流程最終輸出文件中獲取數據並填充,得到整個分析報告。像這些數據處理過程,使用 shell就有些吃力了,我這裏使用 python改寫了上面的腳本,並實現了對數據處理,報告填充功能。

到這裏,基本上就達到絕大多數公司的生信自動化分析水平了

6. 然而到這裏就足夠了麼?

這裏講的生信的應用領域是醫學臨牀領域,然而上述水平到這裏最多也就是“工具”、“腳本”的水平,真要應用於臨牀,作爲一個 “醫療產品”來要求,還有相當遠的的距離。畢竟醫學是嚴肅的事情,直接影響到人的健康和生命,希望各位生信大佬理解。

從“軟件工程”的角度,上述內容也遠遠達不到一個軟件產品的標準:

  • 首先這些腳本都是生信開發人員編寫的,絕大多數沒有測試,從單元測試、集成測
    試、功能測試、壓力測試、穩定性測試都沒有,一旦,項目複雜度上升,這些腳本/
    工具的代碼質量堪憂,很多公司都是一邊運行一邊調試。
  • 其次基於命令行腳本的運行環境,沒有友好的交互界面,對於使用者要求過高,難以普及大範圍推廣。對於使用者的要求基本上就是一個生信開發人員的要求:熟悉Linux 操作系統,熟悉各種常用分析軟件和工具,能夠從腳本錯誤輸出中判斷出原因並調試解決。

以上缺陷也是筆者開發“自動圖形化生物信息分析系統”的初衷,後續內容生信流程的圖形化實現請繼續關注本系列文章。

您可以下載PPT或加QQ羣:853718264討論

發佈了10 篇原創文章 · 獲贊 2 · 訪問量 2327
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章