??上一篇記錄了mapping這一步的軟件選擇,也講到了對于sam文件如何考慮MAPQ的過濾,這篇我主要想記錄一下bam文件在進行call variation之前的處理。
??包括MAPQ的篩選等都是這個處理的一部分。
??既然要處理bam文件,不得不提bam文件的格式。
??處理生物信息的數據時會發現,文件有各種各樣的格式,眼花繚亂,這也是我一開始接觸課題接觸分析流程時的感受。但是多和這些文件打交道以后,會發現,大多數的不同格式的文件其本質都是文本文件,為了某種特殊的處理或記錄需要,按一定的規則記錄信息。包括之前接觸的fasta、fastq文件,也包括sam文件,以后后面步驟會接觸到的vcf文件等。
??bam文件是sam文件的二進制格式,這里貼一張圖,來說明一下為什么要轉換成bam文件來處理。
??可以看到,不經過處理的sam文件是非常大的,非常不利于存儲和處理,而轉換格式后的bam文件小很多,所以很多處理軟件也是針對bam文件進行開發的。
??包括bwa,bowtie2的輸出文件,都是sam文件,但是sam文件具體是什么樣子的,我這里不會展開來講,一是因為官網說明書已經說的很清楚了,二是因為你隨手一個百度、谷歌(如果你翻得動墻)就有很多很多的人發帖介紹,而內容大體都是類似的,我自認為也沒有什么能比他們講得更好的。但是了解這個文件的內容確實是非常重要的。
??以
@
開頭的行記錄了header信息,之后的行記錄了每個reads的mapping信息,一般對于這樣的sam文件我們要做的處理大體就是先轉換為bam文件,進行sort,再進行merge,最后mark duplicates,并建立索引。接下來我將一步步介紹怎么去處理,以及為什么我是這么處理的。??在開始之間先使用samtools對參考序列進行索引建立,作用是用于samtools軟件快速識別,這一步也是一勞永逸的,只要不把索引文件刪除。
$ samtools faidx re.fa
#得到索引文件:re.fa.fai
??首先是把sam文件轉換成bam文件,我們通過samtools view來實現,代碼如下:
$ samtools view -S in.sam -b > out.bam
$ samtools view -b in.bam -S > out.sam
??但實際上,在真正的操作中,我們是不會保留sam文件的,甚至是不會產生sam文件的,因此,我們通常這么來寫命令。
$ bwa mem -t 12 -M -R "@RG\tID:W2018001\tPL:ILLUMINA\tLB:W2018001\tSM:W2018001" /your/path/of/reference/ucsc.hg19.fasta 1.fq.gz 2.fq.gz | samtools view -q 1 -Shb - > W2018001.bam
# 關于“|”之前的我就不解釋了,看我上一篇簡書
#-q 1 :篩選MAPQ用的,意為保留MAPQ >= 1的記錄,上一篇簡書中討論過關于MAPQ的由來和分布,這里用“1”也是保險起見
#-h :表示保留header信息
#-S,-b:表示格式,S指的是sam格式,b指的是bam格式
??這樣操作的好處是直接可以得到bam文件,不必占用大量的空間存儲sam文件。如果你實在是需要sam文件也可以轉換回去,但如果你只是想查看一下,也可以通過以下方式實現。還是很方便的。
$ samtools view -h xxx.bam | less
??在測序的時候序列是隨機打斷的,所以reads也是隨機測序記錄的,進行比對的時候,產生的結果自然也是亂序的,為了后續分析的便利,將bam文件進行排序。事實上,后續很多分析都建立在已經排完序的前提下。關于排序可以通過以下命令完成。
$ samtools sort -@ 6 -m 4G -O bam -o sorted.bam W2018001.bam
# @:線程數
# m:每個線程分配的最大內存
# O:輸出文件格式
# o:輸出文件的名字
# 輸入文件放在最后
??接下來要做的是merge,這個不是所有的樣本都需要做的!!!
??之前有提到,WGS的數據比較大,對于一個樣本可能有多對文件,一般有兩個思路,一個是先對原始的fastq文件進行merge,一個是對后面的bam文件進行merge。那么我選用的是后者。實現腳本如下:
$ samtools merge -@ 6 -c sorted.merged.bam *.sorted.bam
#@:線程數
#c:當輸入bam文件的header一樣時,最終輸出一個header
#當然也可以用-h file,定義你想要的header,file里的內容就是sam文件header的格式
#第一個bam是輸出的文件名,后面排列輸入的文件名,我這里用了通配符‘*’,要保證該目錄下‘.sorted.bam’結尾的都是你要輸入的文件
#當然也可以用-b file,file文件里羅列要merge的文件名,一行一個文件名
??下一步就是remove duplicates,為什么要進行這一步呢?先來說一下測序,我們都知道人的基因組是很龐大的(約30億個堿基對),在測序的時候,先會把基因組的DNA序列通過超聲震蕩隨機打斷成150bp的片段,那么從概率上來講,出現同樣的片段(開始和結束位置都一樣)的幾率是極小的。但是由于PCR對某些位置有偏好的擴增,會導致一些一模一樣的reads存在。這些reads其實是一個片段的擴增導致的,多出來的reads,對該區段突變的判斷是沒什么貢獻的,如果不加處理,反而會大大增加那個位置的深度,導致某些結果的不準確。
??如下圖所示,箭頭所指的reads,就是duplicates,我們一般采取的策略是標記或者去除,這樣的話,下一步call variation的時候會不考慮這些reads。
??關于這一步,有很多軟件可以實現,比較多用的是picard和samtools rmdup。我這里用的是GATK包里集成的picard的MarkDuplicates。關于picard和samtools rmdup的效果其實大家可以自己試一下,我很早之前做過的試驗是,samtools rmdup速度很快,但是去除的效果稍差。大家用的最多的也是picard。
$ java -jar /you/path/of/gatk/gatk-package-4.0.10.1-local.jar \
MarkDuplicates \
-INPUT sorted.merged.bam \
-OUTPUT sorted.merged.markdup.bam \
-METRICS_FILE markdup_metrics.txt
#也可以加上“REMOVE_DUPLICATES=true”來去除掉這些duplicates,不然就只是標記
??到了這一步基本上就處理的差不多了,可以進行call variation了,但是這里還有一步建立索引,這十分的重要!!!!
??必須對bam文件進行排序后,才能進行index,否則會報錯。建立索引后將產生后綴為.bai的文件,用于快速的隨機處理。很多情況下需要有bai文件的存在,特別是顯示序列比對情況下。建立索引很簡單。
$ samtools index sorted.merged.markdup.bam
??到了這一步就基本上完事了,可以通過IGV或tview來查看情況,這都需要建立索引,且索引文件和bam文件在同一個目錄下。
$ samtools tview sorted.merged.markdup.bam re.fa
#可以用-p chr:pos(加在tview和sorted.merged.markdup.bam之間)指定要查看的位置
#也可以進去后用敲‘g’輸入`chr10:10,000,000' 或 `=10,000,000'查看指定的位置,敲'?'了解更多說明,q退出
??下圖就是效果了,用“?”,打開左邊的幫助界面,其中圓點表示正鏈比對,逗號表示負鏈比對,星號表示插入。不同的顏色代表不同的含義,具體怎么調看幫助框。要是覺得不好看的話可以用IGV查看。IGV的效果就是上圖duplicates的效果。
??同時對于得到的bam文件也可以進行一下查看,對于bam的統計軟件就更多了,我這里網羅了一些帖子上的推薦以及我自己日常使用的軟件,感興趣的可以自己去下載來使用一下。
samtools
??這是個強大的軟件,也自帶一些統計工具,上篇簡書其實我們就用到了,主要是四個:idxstats,depth,stats,flagstat
$ samtools depth sorted.merged.markdup.bam
示例結果
#chr pos depth
chr1 1 5
結果可以得到染色體名稱、位點位置、覆蓋深度
-a:輸出所有位點,包括零深度的位點
-a -a --aa:完全輸出所有位點,包括未使用到的參考序列
-b FILE:計算BED文件中指定位置或區域的深度
-f FILE:指定bam文件
-l INT:忽略小于此INT值的reads
-q INT:只計算堿基質量大于此值的reads
-Q INT:只計算比對質量大于此值的reads
-r CHR:FROM-END:只計算指定區域的reads
$ samtools idxstats sorted.merged.markdup.bam #需要預先進行sort和index
示例結果
#ref sequence_length mapped_reads unmapped_reads
chr1 195471971 6112404 0
結果可看出,分別統計染色體名稱、序列長度、mapped數目,以及unmapped數目
$ samtools flagstat sorted.merged.markdup.bam
示例結果:
20607872 + 0 in total (QC-passed reads + QC-failed reads) #總共的reads數
0 + 0 duplicates #重復reads的數目
19372694 + 0 mapped (94.01%:-nan%) #總體上reads的數目以及匹配率;可能有有小偏差
20607872 + 0 paired in sequencing #paired reads的數目
10301155 + 0 read1 #reads1的數目
10306717 + 0 read2 #reads2的數目
11228982 + 0 properly paired (54.49%:-nan%) #完美匹配的reads數:比對到同一條參考序列,并且兩條reads之間的距離符合設置的閾值
18965125 + 0 with itself and mate mapped#兩條都比對到參考序列上的reads數,但是并不一定比對到同一條染色體上
407569 + 0 singletons (1.98%:-nan%)#只有一條比對到參考序列上的reads數,和上一個相加,則是總的匹配上的reads數。
3059705 + 0 with mate mapped to a different chr#兩條分別比對到兩條不同的染色體的reads數
1712129 + 0 with mate mapped to a different chr (mapQ>=5)#兩條分別比對到不同染色體的且比對質量值大于5的數量
#說明:
1.bwa的mem比對方法生成的bam文件保留sencondly比對的結果。所以使用flagstat給出的結果會有偏差。
2.每一項統計數據都由兩部分組成,分別是QC pass和QC failed,表示通過QC的reads數據量和未通過QC的reads數量。以“PASS + FAILED”格式顯示
$ samtools stats sorted.merged.markdup.bam
#對bam文件進行詳細的統計,也可只統計某一染色體的某一區域chr:from-to
結果包括:
Summary Numbers,raw total sequences,filtered sequences, reads mapped, reads mapped and paired,reads properly paired等信息
Fragment Qualitites #根據cycle統計每個位點上的堿基質量分布
Coverage distribution #深度為1,2,3,,,的堿基數目
ACGT content per cycle #ACGT在每個cycle中的比例
Insert sizes #插入長度的統計
Read lengths #read的長度分布
stats出來的結果可以使用plot-bamstats來畫圖(samtools目錄下misc目錄中)
$ plot-bamstats -p outdir/ sorted.merged.markdup.bam.stats
??下圖就是plot-bamstats操作的輸出結果了,可以看到有很多的圖。效果還是很好的。
??更多關于samtools的工具以及上文提到的工具的其余參數請參考官網:http://www.htslib.org/doc/samtools.html
RSeQC
??這也是上篇簡書中提到過的,所以安裝方式和使用就不贅述了,其實里面還有一些其余實用的工具,當然這款軟件的最初使用對象是RNA-seq,但并不影響使用,有些工具是通用的,有一點要注意的是,bam_stat.py里的unique mapping的默認閾值是MAPQ>=30,當然可以通過參數來修改,這個在結果的理解上大家要注意。
bedtools
??這是一個經常使用也很實用的軟件,我經常會用來截取bam然后在igv上看突變的情況,師姐推薦其中的mutlicov進行覆蓋度的統計。我粗略的看了一下bedtools的說明書,用于coverage統計的應該還有coverage,genomecov。感興趣的可以嘗試一下。
bedtools:
$ wget https://github.com/arq5x/bedtools2/releases/download/v2.27.1/bedtools-2.27.1.tar.gz
$ tar -zxvf bedtools-2.27.1.tar.gz
$ cd bedtools2
$ make
#腳本在bin/下的bedtools
#Ubuntu用戶也可以使用下述命令來下載:
$ sudo apt-get install bedtools
??截取bam文件,查看igv可以用以下命令:
$ bedtools intersect -a sorted.merged.markdup.bam -b region.sorted.bed > target_reads.bam && samtools index target_reads.bam
#其中bed文件的格式可以參考:
#染色體號 起始位置 終止位置
chr1 226173187 226173247
#用"\t"分隔
GATK
??GATK不僅可以call variation,里面還包含了很多其他用途的工具包,其中有一個工具叫DepthOfCoverage,可以統計depth和coverage,但是在panel中比較適用,因為有bed范圍,且比較小。這個工具的速度是比較慢的,要在全基因組上做不太現實。所以我本人也沒去使用。
BAMStats
??一款比較早的bam統計軟件,沒用過,但是看說明使用是極其簡單了,說一下怎么安裝。感興趣的可以自己試一下,很簡單。
$ wget https://jaist.dl.sourceforge.net/project/bamstats/BAMStats-1.25.zip
$ unzip BAMStats-1.25.zip
bamdst
??一款簡單好用的深度統計軟件。
$ git clone https://github.com/shiquan/bamdst.git
$ cd bamdst/
$ make
??安裝好后,需要準備.bed文件及.bam文件,以軟件提供的MT-RNR1.bed和test.bam為例,使用命令如下:
$ bamdst -p MT-RNR1.bed -o ./ test.bam
??輸出的結果包含7個文件,為:
????-coverage.report
????-cumu.plot
????-insert.plot
????-chromosome.report
????-region.tsv.gz
????-depth.tsv.gz
????-uncover.bed
??主要看一下coverage.report文件,里面包含了大量信息。
qualimap
??這算是壓軸了吧,這個軟件是我師姐推薦的,安裝使用都比較容易,給出的是PDF或HTML的報告,報告中的信息特別豐富,還有一堆的圖,所以在我自己的腳本中也會對每個樣本使用該軟件統計,簡述一下安裝和使用。
#第一步:下載
$ mkdir qualimap
$ cd qualimap
$ wget https://bitbucket.org/kokonech/qualimap/downloads/qualimap_v2.2.1.zip
$ unzip qualimap_v2.2.1.zip
$ cd qualimap_v2.2.1
#第二步安裝相關的軟件
#java
#這個應該都有,這里就是貼一下官網的步驟
$ sudo apt-get install openjdk-6-jre
#R
#官網上也有,我貼的是自己以前安裝的記錄
$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
$ apt-get update
$ apt-get install r-base
$ apt install r-base-core
#R包安裝,兩個方法,第一個聽說容易報錯,我用的是第二個
$ Rscript scripts/installDependencies.r
#或
$ R
> install.packages("optparse")
> source("http://bioconductor.org/biocLite.R")
> biocLite(c("NOISeq", "Repitools", "Rsamtools", "GenomicFeatures", "rtracklayer"))
> q()
??使用也簡單,主要分為帶gtf文件和不帶gtf文件,全基因組的話一般不帶gtf文件,然后bamqc其實也只是這個軟件中的一個工具,其他的工具感興趣的也可以看看。
$ qualimap bamqc -bam sorted.merged.markdup.bam --java-mem-size=20G -c -nt 16 -outdir bamqc -outfile bamqc.pdf -outformat PDF:HTML
#參數也沒有什么特別要注意的,基本上默認的就可以
??找了一個示例結果,發現有23頁,我這里就不貼了,大家可以自己嘗試一下。
??最后貼兩張圖,是我自己寫的腳本得到的深度分布,累積曲線以及覆蓋率,因為是自己寫的,所以比較糙,橫縱坐標標題什么的一律沒寫。
??上圖可以看到,深度分布還是比較正態的,最多的30X左右,至于左邊0X為什么這么高,是因為參考基因組有些位置就是N,還有一些位置就是我的樣本沒有覆蓋到。
??上圖可以看到,小于10X的數據的不到2%,超過50%的數據都是高于30X的,還是不錯的。
??上圖我按不同的染色體進行統計覆蓋率,去掉了其余的一些未知染色體位置的序列上的信息(這個信息具體要了解參考基因組的特性,比如有些序列目前能明確在人身上,卻不知道具體在哪個染色體等,這些信息也是包含在參考基因組中的,仔細看參考基因組會發現,除了22條常染色體,2條性染色體,還有很多其他的序列),這個覆蓋率并不是我想想的那般全體高于99%,也沒公司給的報告描述的那么好,我不知道是不是因為MAPQ的過濾導致了這樣的結果,但是總體的覆蓋率還可以。
??水平有限,要是存在什么錯誤請評論指出!請大家多多批評指正,相互交流,共同成長,謝謝!!!