Usage: samtools view [options] <in.bam>|<in.sam>[region1 [...]]
默认情况下不加 region,则是输出所有的 region.
2 sort
sort对bam文件进行排序。
Usage: samtools sort [-n] [-m <maxMem>] <in.bam><out.prefix>
-m 参数默认下是 500,000,000 即500M(不支持K,M,G等缩写)。对于处理大数据时,如果内存够用,则设置大点的值,以节约时间。
-n 设定排序方式按short reads的ID排序。默认下是按序列在fasta文件中的顺序(即header)和序列从左往右的位点排序。
例子:
$ samtools sort abc.bam abc.sort ###注意 abc.sort 是输出文件的前缀,实际输出是 abc.sort.bam
$ samtools view abc.sort.bam | less -S
3 index
必须对bam文件进行默认情况下的排序后,才能进行index。否则会报错。
建立索引后将肢唯产生后缀为.bai的文件,用于快速的随机处理。很多情况下需要有bai文件的存在,特别是显示序列比对情况下。比如samtool的tview命令就需要;gbrowse2显示reads的比对图形的时候也需要。
Usage: samtools index <in.bam>[out.index]
例子:
以下两种命令结果一样
$ samtools index abc.sort.bam
$ samtools index abc.sort.bam abc.sort.bam.bai
4 tview
tview能直观的显示出reads比对基因组的情况,和基因组浏览器有点类似。
Usage: samtools tview <aln.bam>山衡 [ref.fasta]
当给出参考基因组的时候,会在第一排显示参考基因组的序列,否则,第一排全用N表示。
按下 g ,则提示输入要到达基因组的某一个位点。例子“scaffold_10:1000"表示到达第
10号scaffold的第1000个碱基位点处。
使用H(左)J(上)K(下)L(右)移动显示界面。大写字母移动快,小写字母移动慢。
使用空格建向左快速移动(和 L 类似),使用Backspace键向左快速移动(和 H 类似)。
Ctrl+H 向左移动1kb碱基距离; Ctrl+L 向右移动1kb碱基距离
可以用颜色标注比对质量,碱基质量,核苷酸等。30~40的碱基质量或比对质量使用白色表示;
20~30黄色;10~20绿色;0~10蓝色。
使用点号'.'切换显示碱基和点号;使用r切换显示read name等
还有很多其它的使用说明,具体按 ? 键来查看。
5 depth
得到每个碱基位点的逗饥做测序深度,并输出到标准输出。
Usage: bam2depth [-r reg] [-q baseQthres] [-Q mapQthres] [-b in.bed] [...]
-r 后面跟染色体号(region)
注意 :做depth之前必须做samtools index;
示例:
samtools depth in.bam > out.depth.txt
注意: in.bam 必须经过了排序。
6 mpileup
samtools还有个非常重要的命令mpileup,以前为pileup。该命令用于生成bcf文件,再使用bcftools进行SNP和Indel的分析。bcftools是samtool中附带的软件,在samtools的安装文件夹中可以找到。
最常用的参数有2: -f 来输入有索引文件的fasta参考序列; -g 输出到bcf格式。用法和最简单的例子如下
Usage: samtools mpileup [-EBug] [-C capQcoef ] [-r reg ] [-f in.fa ] [-l list ] [-M capMapQ ] [-Q minBaseQ ] [-q minMapQ ] in.bam [ in2.bam [ ... ]]$ samtools mpileup -f genome.fasta abc.bam >abc.txt$ samtools mpileup -gSDf genome.fasta abc.bam >abc.bcf$ samtools mpileup -guSDf genome.fasta abc.bam | \ bcftools view -cvNg - >abc.vcf
目录
samtools 和 picard 都有对SAM/BAM文件进行排序的功能,一般都是基于坐标排序(还提供了 -n 选项来设定用reads名进行排序),先是对chromosome/contig进行排序,再在chromosome/contig内部基于start site从小到大排序,对start site排序很好理解,可是对chromosome/contig排序的时候是基于什么标准呢?
基于你提供的 ref.fa 文件中的chromosome/contig的顺序 。当你使用比对工具将fastq文件中的reads比对上参考基因组后会生成SAM文件,SAM文件包含头信息,其中有以 @SQ 开头的头信息记录,reference中有多少条chromosome/contig就会有多少条这样的记录,而且它们的顺序与 ref.fa 是一致的。
当使用samtools或picard对SAM/BAM文件进行排序时,这些工具就会读取头信息,按照头信息指定的顺序来排chromosome/contig。所以进行排序时需要提供包含头信息的SAM/BAM文件。
那么 普通情况下我们的chromosome/contig排序情况是什么样的?
一般情况下在进行SAM文件的排序时,染色体的排序到底是按照哪种规则进行排序的,不是一个很重要的问题,也不会对后续的分析产生影响,但是在执行GATK流程时,GATK对染色体的排序是有要樱陆求的,必须按照从chr1开始到chr22,最后是chrX和chrY这样的顺序,否则会报错
面对这样变态的要求,我们怎么解决?
在构造ref.fa文件时,让它按照从chr1开始到chr22,最后是chrX和chrY这样的顺序进行组织就可以了:
FLAG列在SAM文件的第二列,这是一个很重要的列,包含了很多mapping过程中的有用信息,但很多初学者在学习SAM文件格式的介绍时,遇到FLAG列的说明,常常会一头雾水
what?还二进制,这也太反人类的设计了吧!
不过如果你站在开发者的角度去思考这个问题,就会豁然开朗
在mapping过程中,我们想记录一条read的mapping的信息包括:
这些信息总结起来总共包括以下12项:
而每一项又只有两种情况,是或否,那么我可以用一个12位的二进制数来记录所有的信息,每一位表示某一项的情况,这就是原始FLAG信息的由来,但是二进制数适合给计算机看,不适合人看,需要转换成对应的十进制数,也就有了我们在SAM文件中看到的FLAG值
但是FLAG值所包含信息的解读还是要转换为12位的二进制数
SAM格式文件的第3和第7列,可以用来判断某条reads是否比对成功到了基因组的染色体,左右两条reads是否比对到同一条染色体
有两个方法可以提取未比对成功的测序数据:
对于PE数据,在未比对成功的测序数据可以分成3类:
看完这一部分,是不是有一个感觉: FLAG玩得溜局颂睁,SAM文件可以处理得出神入化
首先,思考一个问题: 对于PE数据,一条测序片段(fragment)有read1和read2两条测序片段,它们俩的名字相同,那么对于这一条测序片段,对它进行mapping之后得到的SAM文件中会出现几条记录呢?
对于我的这个假设可以用以下的方法进行验桐岁证:
上面的测试结果与我们的假设吻合
但是在一次处理三代测序数据(三代测序数据是Single-End)中发现了不同:
在输出中出现了一些不太和谐的结果:有极少部分的QNAME对应2条以上的记录,这意味着存在一条read会有多条比对记录的情况,why?
对这个与预期不完全相符的结果,尝试去寻找里面的原因,其间进行了各种各样的推理、假设、验证,最终在 李恒的github 中找到了答案
这种情况容易在三代测序数据中出现
如果你用的是Single-End的数据,那么差异应该比较小,不会太明显,而在Pair-End上差异可能会比较大,之所以会产生这些差异,原因有两点:
从上面列出的两点差异可以看出,mpileup默认输出的是高质量的覆盖深度,这是有历史原因的:当场mpileup功能被开发出来就是为了与bcftools组合,将samtools mpileup的输出作为bcftools的输入用于下游的snp-calling,当然需要保证数据的质量
当然可以通过设置对应的参数使得它的属于结果与depth的一致,但是不推荐这么做
下面是对同一个样本的paired-end Fastaq文件比对结果(比对使用hisat2),hisat2和samtools分别给出的mapping rate的统计
hisat2:
samtools flagstat:
从上面可以看出,hisat2给出的mapping rate为85.40%,而samtools给出的为86.32%,两个的统计结果不一样,而且samtools的统计会大一些,what?
介四什么鬼?
我们来简单地分析一下:
hisat2中,
samtools中,
计算没问题,那问题出在哪呢?
有没有注意到上面的两个式子中的分子和分母,计算它们的差值:
分子:
分母:
发现了没有,它们的差值正好都等于samtools flagstat的输出结果的第二行:
所以,hisat2和samtools计算mapping rate的公式实际上分别为:
一般来说,我们想得到的是hisat2计算公式所得到的统计结果,hisat2统计结果在比对结束后会以标准错误形式给出,我们可以将标准错误重定向到一个log文件中,但是如果我们忘了保持这个统计结果,怎么办?
最简单的办法就是重新跑一遍hisat2,但是这样太耗费时间和计算资源了,这时我们可以利用samtools flagstat对SAM文件的统计结果,以及它的部分统计值与hisat2计算公式的关系,快速地算出准确的mapping rate:
参考资料:
(1) 【】从零开始完整学习全基因组测序数据分析:第5节 理解并 *** 作BAM文件
(2) 【生信技能树】【直播】我的基因组(十五):提取未比对的测序数据
(3) BWA's README in github
(4) 【】黄树嘉《样本量重要,还是测序深度重要? 生物信息工程师可以分为多少种类型? |《解螺旋技术交流圈》精华第3期》
(5) 生信媛《HISAT2的比对率计算结果和SAMTools flagstat不同,你想过原因吗? 》
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)