samtools flags 的含義


對於雙端比對的數據,生成的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:26:HGJ2VBGXX:3:13403:17250:17986       419     chr1    12013   1       131M    =       12016   131     TCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAG
CACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCATTGTTCATCTTCTGGCCCCTGTTGTCTGCAT  AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEAEEEEEEEEEEEAEEEEAEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEE/EE/EE<EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE  AS:i:0  XN:i:0  XM:i:0  XO:i:0  XG:i:0  NM:i:0  MD:Z:131        YT:Z:UU XS:A:+  NH:i:4  CC:Z:
chr15   CP:i:102519027  HI:i:0
NB500986:26:HGJ2VBGXX:3:13403:17250:17986       339     chr1    12016   1       128M    =       12013   -131    GACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCAC
TGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCATTGTTCATCTTCTGGCCCCTGTTGTCTGCAT     EEEEEEEEEEEEEEEEEEEEEEEEEEAEEEEEEE<AEEEEEEEEEEEAEEEAEEEEEEEEEEEAEEEEE
EEEEEEEEEEEEEEEEEEEEEAAEEAEEEEEAEEEEEEEEEE/EEEEEEEEEEEAAAAA     AS:i:0  XN:i:0  XM:i:0  XO:i:0  XG:i:0  NM:i:0  MD:Z:128        YT:Z:UU XS:A:+  NH:i:4  CC:Z:
chr15   CP:i:102519027  HI:i:0

一共有兩個序列,他們的標識符是一樣的,那怎么區分那個是R1端,那個是R2端呢?

直接根據flag 查看

samtools flags 419
0x1a3   419     PAIRED,PROPER_PAIR,MREVERSE,READ2,SECONDARY
samtools flags 339
0x153   339     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文件的理解又更清晰了一些。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM