对于双端比对的数据,生成的BAM文件中,R1端序列和R2端序列的标识符是一样的,之前一直不知道如何根据bam文件区分哪条序列是R1端,哪条序列是R2端,昨天仔细研究了一下,原来代表R1端和R2端的信息都存储在flag中,即bam文件的第二列;

在bam文件格式中定义了各种flag代表的意思

/*! @abstract the read is paired in sequencing, no matter whether it is mapped in a pair */
#define BAM_FPAIRED 1
/*! @abstract the read is mapped in a proper pair */
#define BAM_FPROPER_PAIR 2
/*! @abstract the read itself is unmapped; conflictive with BAM_FPROPER_PAIR */
#define BAM_FUNMAP 4
/*! @abstract the mate is unmapped */
#define BAM_FMUNMAP 8
/*! @abstract the read is mapped to the reverse strand */
#define BAM_FREVERSE 16
/*! @abstract the mate is mapped to the reverse strand */
#define BAM_FMREVERSE 32
/*! @abstract this is read1 */
#define BAM_FREAD1 64
/*! @abstract this is read2 */
#define BAM_FREAD2 128
/*! @abstract not primary alignment */
#define BAM_FSECONDARY 256
/*! @abstract QC failure */
#define BAM_FQCFAIL 512
/*! @abstract optical or PCR duplicate */
#define BAM_FDUP 1024
/*! @abstract supplementary alignment */
#define BAM_FSUPPLEMENTARY 2048

1 : 代表这个序列采用的是PE双端测序

2: 代表这个序列和参考序列完全匹配,没有插入缺失

4: 代表这个序列没有mapping到参考序列上

8: 代表这个序列的另一端序列没有比对到参考序列上,比如这条序列是R1,它对应的R2端序列没有比对到参考序列上

16:代表这个序列比对到参考序列的负链上

32 :代表这个序列对应的另一端序列比对到参考序列的负链上

64 : 代表这个序列是R1端序列, read1;

128 : 代表这个序列是R2端序列,read2;

256: 代表这个序列不是主要的比对,一条序列可能比对到参考序列的多个位置,只有一个是首要的比对位置,其他都是次要的

512: 代表这个序列在QC时失败了,被过滤不掉了(# 这个标签不常用)

1024: 代表这个序列是PCR重复序列(#这个标签不常用)

2048: 代表这个序列是补充的比对(#这个标签具体什么意思,没搞清楚,但是不常用)

上面的这几个标签都是2的n次方,这样的数列有一个特点,就是随机挑选其中的几个,它们的和是唯一的,比如

65 只能是1 和 64 组成,代表这个序列是双端测序,而且是read1

所以在bam文件中的第二列,即flag列的值代表这条序列符合上述所有条件的值的和,所以根据这个flag我们可以确定这条序列究竟是read1 还是read2

在新版的samtools中提供了一个flags 功能,可以查看flag 代表的含义,比如下面的sam文件

NB500986::HGJ2VBGXX::::            chr1              131M    =               TCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAG
CACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCATTGTTCATCTTCTGGCCCCTGTTGTCTGCAT AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEAEEEEEEEEEEEAEEEEAEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEE/EE/EE<EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE AS:i: XN:i: XM:i: XO:i: XG:i: NM:i: MD:Z: YT:Z:UU XS:A:+ NH:i: CC:Z:
chr15 CP:i: HI:i:
NB500986::HGJ2VBGXX:::: chr1 128M = - GACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCAC
TGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCATTGTTCATCTTCTGGCCCCTGTTGTCTGCAT EEEEEEEEEEEEEEEEEEEEEEEEEEAEEEEEEE<AEEEEEEEEEEEAEEEAEEEEEEEEEEEAEEEEE
EEEEEEEEEEEEEEEEEEEEEAAEEAEEEEEAEEEEEEEEEE/EEEEEEEEEEEAAAAA AS:i: XN:i: XM:i: XO:i: XG:i: NM:i: MD:Z: YT:Z:UU XS:A:+ NH:i: CC:Z:
chr15 CP:i: HI:i:

一共有两个序列,他们的标识符是一样的,那怎么区分那个是R1端,那个是R2端呢?

直接根据flag 查看

samtools flags
0x1a3 PAIRED,PROPER_PAIR,MREVERSE,READ2,SECONDARY
samtools flags
0x153 PAIRED,PROPER_PAIR,REVERSE,READ1,SECONDARY

根据上面给结果可以看出,flag为419代表PAIREED(1), PROPER_PAIR(2),MREVRSE(32),READ2(128),SECONDARY(256),其中

PAIRED 代表这条序列采用双端测序, 其值为1;

PROPER_PAIR 代表这条序列完全匹配, 其值为2;

MREVRSE 代表这条序列对应的另一端序列比对到参考序列的负链上,其值为32;

READ2 代表这条序列是R2端序列,其值为128

SECONDARY 代表这条序列不是primary alignment, 其值为256

1 + 2 +32 +128 + 256 = 419

所以419对应的序列是R2端序列, 同理,339代表的序列是R1段序列

搞清楚了序列究竟是R1端还是R2端之后,还有一点值得注意的地方,samtools 还提供了一个bam2fq 的功能,根据bam文件抽取比对时采用的fastq序列

在bam文件中,第10列代表的是序列,第11列代表的是序列的质量,根据第二列的flag还可以确定序列是R1还是R2,

但是当序列本身比对到参考序列的负链时,即flag 包含16时,bam文件中记录的序列是原始序列的反向互补序列,而且质量值也是反向的,所以根据这样的序列还原时要小心一点,以上面flag为339的序列为例

因为339包含了REVERSE,所以对应的序列应该是第10列序列的反向互补序列,碱基质量值为第11列的反向序列,

搞清楚了这些,对于bam文件的理解又更清晰了一些。

samtools flags 的含义的更多相关文章

  1. 动手学习TCP:总结和索引

    TCP是一个十分复杂的协议,通过前面几篇文章只涉及了TCP协议中一些基本的概念. 虽然说都是一些TCP最基本的概念,但是试验过程中一直在踩坑,例如:TCP flag设置错误,seq.ack号没有计算正 ...

  2. linux cpuInfo

    转自:http://blog.csdn.net/lgstudyvc/article/details/7889364   /proc/cpuinfo文件分析 在Linux系统中,提供了proc文件系统显 ...

  3. [转]linux /proc/cpuinfo 文件分析

    在Linux系统中,提供了proc文件系统显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以通过/proc/cpuinfo文件得到.本文章针对该文件进行简单的总结. 基于不同指 ...

  4. 转:SDL2源代码分析

    1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...

  5. /proc/cpuinfo zz

    /proc/cpuinfo文件分析 在Linux系统中,提供了proc文件系统显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以通过/proc/cpuinfo文件得到.本文章针 ...

  6. 最简单的视音频播放示例7:SDL2播放RGB/YUV

    本文记录SDL播放视频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...

  7. Oracle alter index rebuild 与 ORA-08104 说明

    在ITPUB 论坛上看到的一个帖子,很不错.根据论坛的帖子重做整理了一下. 原文链接如下: alter index rebuild online引发的血案 http://www.itpub.net/t ...

  8. HTTP POST请求的Apache Rewrite规则设置

    最近自测后端模块时有个业务需求需要利用WebServer(我用的是Apache)将HTTP POST请求转发至后端C模块,后端处理后返回2进制加密数据.http post请求的url格式为:     ...

  9. SDL2源代码分析3:渲染器(SDL_Renderer)

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

随机推荐

  1. MySql按字段分组取最大值记录

    数据库原始数据如下:数据库名:tbl_clothers 需求是:按照type分组,并获取个分组中price中的最大值,解决sql如下: 方法一: select * from (select type, ...

  2. 《Effective Java》读书笔记三(类和接口)

    No13 使类和成员的可访问性最小化 要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.模块之间只通过它们的API进行通信,一个 ...

  3. 深入讲解Android Property机制

    深入讲解Android Property机制 侯亮 1      概述 Android系统(本文以Android 4.4为准)的属性(Property)机制有点儿类似Windows系统的注册表,其中的 ...

  4. no link present

    今天装linux 系统.然后:service network restart的时候提演示样例如以下的错误: .............................................. ...

  5. INTEL

    http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html http ...

  6. Memory Analyzer tool(MAT)分析内存泄漏---理解Retained Heap、Shallow Heap、GC Root

    Shallow Heap Size 指对象自身所占用的内存大小,不包含其引用的对象所占的内存大小. 1.数组类型 数组元素对象所占内存的大小总和. 2.非数组类型 对象与它所有的成员变量大小的总和.当 ...

  7. go--Ubuntu下安装GO LANG,测试输入hello world

    1.下载go语言源码,https://storage.googleapis.com/golang/go1.6.1.linux-amd64.tar.gz 2.解压缩源码包tar zxvf go1.6.1 ...

  8. 解决老是提示找不到Mapper文件无法执行定义的方法问题!

    尼玛,被mybatis的*Mapper.xml文件害惨了!整整两天都在围绕这个问题转圈! 先看问题长啥样吧!下面是通过逆向工程生成的Mapper.xml文件,包路径什么的都没有错! 但是每次调用Map ...

  9. Maven工程pom.xml文件秒变gradle工程的命令

    下面是一个maven工程,我想把它转成gradle项目,怎么办? 打开cmd命令行窗口,切换到你的maven工程的pom.xml文件所在目录,然后执行如下命令: gradle init --type ...

  10. div设置contentEditable="true"作为文本编辑器,定位光标解决办法

    function set_focus(el) {    el = el[0]; // jquery 对象转dom对象    el.focus();    if ($.browser.msie) {   ...