WGS分析笔记(3)—— bam文件的处理

  上一篇记录了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。


duplicates(from bing)

  关于这一步,有很多软件可以实现,比较多用的是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的效果。


tview

  同时对于得到的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操作的输出结果了,可以看到有很多的图。效果还是很好的。

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页,我这里就不贴了,大家可以自己尝试一下。
  最后贴两张图,是我自己写的脚本得到的深度分布,累积曲线以及覆盖率,因为是自己写的,所以比较糙,横纵坐标标题什么的一律没写。


depth

  上图可以看到,深度分布还是比较正态的,最多的30X左右,至于左边0X为什么这么高,是因为参考基因组有些位置就是N,还有一些位置就是我的样本没有覆盖到。


depth.cdf

  上图可以看到,小于10X的数据的不到2%,超过50%的数据都是高于30X的,还是不错的。
coverage

  上图我按不同的染色体进行统计覆盖率,去掉了其余的一些未知染色体位置的序列上的信息(这个信息具体要了解参考基因组的特性,比如有些序列目前能明确在人身上,却不知道具体在哪个染色体等,这些信息也是包含在参考基因组中的,仔细看参考基因组会发现,除了22条常染色体,2条性染色体,还有很多其他的序列),这个覆盖率并不是我想想的那般全体高于99%,也没公司给的报告描述的那么好,我不知道是不是因为MAPQ的过滤导致了这样的结果,但是总体的覆盖率还可以。

  水平有限,要是存在什么错误请评论指出!请大家多多批评指正,相互交流,共同成长,谢谢!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容