BAM/SAM文件格式的一些小知识

BAM/SAM文件的一些小知识

前言

如果不是在陈老师这读博,然后开始折腾BAM/SAM文件,我估计这辈子都不会了解到这么多东西吧

SAM/BAM简介

See Wiki

Sequence Alignment Map (SAM) is a text-based format for storing biological sequences aligned to a reference sequence developed by Heng Li and Bob Handsaker et al.

  • SAM是李恒大佬在冷泉港鼓捣出来的一种文件格式,存储了测序获得的信息,map到基因组后的各种信息。SAM格式为纯文本格式,字里行间压缩了极大的信息。
  • BAM则是SAM的二进制版,在SAM的基础上运用二进制编码,又极大的压缩了SAM文件的体积。

在这个文件基础上,大家常用的各种alignment软件基本都支持SAM/BAM格式,围绕着这个文件格式,李恒等还开发了多个软件和不同语言版本的依赖库,以供大家使用该文本格式储存信息,并且在该文件基础上进行开发。

  • samtools: 对SAM/BAM等格式进行各种相关操作的软件,功能最丰富。
  • htslib: samtools的C接口,可以通过该库,在C语言中完成samtools的同等功能。
  • htsjdk: Java接口
  • pysam: Python接口

具体用法,推荐看各自的文档,比如javadoc或者python doc

格式

格式说明

以下为SAM格式示例(BAM格式参照SAM即可)

@HD VN:1.6 SO:coordinate
@SQ SN:ref LN:45
r001 99 ref 7 30 8M2I4M1D3M = 37 39 TTAGATAAAGGATACTG *
r002 0 ref 9 30 3S6M1P1I4M * 0 0 AAAAGATAAGGATA *
r003 0 ref 9 30 5S6M * 0 0 GCCTAAGCTAA * SA:Z:ref,29,-,6H5M,17,0;
r004 0 ref 16 30 6M14N5M * 0 0 ATAGCTTCAGC *
r003 2064 ref 29 17 6H5M * 0 0 TAGGC * SA:Z:ref,9,+,5S6M,30,1;
r001 147 ref 37 30 9M = 7 -39 CAGCGGCAT * NM:i:1

SAM文件主要由两个部分构成

  • header:标记了该SAM文件的一些基本信息,比如版本、按照什么方式排序的、Reference信息等等。
  • 本体:每行为一个reads,不同列记录了不同的信息,列与列之间通过tab分隔。

每列的含义:

column
  1. QNAME:测序的reads的名字。
  2. FLAG:二进制数字之和,不同数字代表了不同的意义;比如正负链,R1/R2(双端测序的哪一端)等。
  3. RNAME:map到参考基因组后的染色体名称。
  4. POS:1-based 基因组起始位点。
  5. MAPQ:map的质量。
  6. CIGAR:一个数字与字母交替构成的字符串,标记了这段reads不同位置的match情况。不同字母的含义后边介绍。
  7. RNEXT:如果是pair-end测序,这个为mate(另一端中对应的)的read的染色体名称;否则为下一条read的染色体名称。
  8. PNEXT:同上,read对应的起始位点。
  9. TLEN:模板的长度。
  10. SEQ:序列。
  11. QUAL:序列的质量打分(fasta文件中的那个)。

flag的含义:

flag tests 查询flag中具体数字含义,以及测试flag内容的网页

flag

flag比较特殊的是一点在于flag最后的数字中包含了这个数即为true(包含该特性),不包含这个数字即为false(不包含该特性)。

检测方法也比较巧妙,通过二进制与进行计算。比如:16 and 16 -> 16。结果与测试的数字一致,则表明flag中包含该数字。否则,不包含。

当然,不同语言版本的接口也直接提供了api来直接获取这些特性,不必在进行人工的计算。

cigar的含义

cigar中会包含数字,代表了特定match持续了多少nt;以及不同的字符,代表了不同的match情况。

cigar string examples:

30S512M216N12S (30nt soft clip -> 512nt exact match -> 216nt skipped region -> 12nt soft clip)
30S (30nt soft clip)
40M (40nt exact match)

其中不同的字符及其含义如下:


cigar from official

另一个版本的说明来源

cigar from blog

注意

双端测序,正负链的问题

双端测序很麻烦,mate和read两条序列的flag信息基本都是完全相反的,包括strand等信息。那么如何判断这一对reads测到的到底是哪条链就成了问题。

  • 最稳妥的方法是,通过GT/AG规则来确定。缺点就是你很难提取到GT/AG这个序列,最起码在我的测试中如此。
    • 在我的理解中,cigar中的I、D、N三个字符代表的区域不计入位点序列中。那么N区域的第一个位点周边的序列即为内含子周边的序列,然而在这个位点周边,很难获取到标准的GT/AG序列及其互补序列。可能由junctions的突变造成的,即N区域并不一定是标注的内含子区域
    • STAR应该是通过这个途径识别链方向的
      alignSJstitchMismatchNmax   0 -1 0 0
          4*int>=0: maximum number of mismatches for stitching of the splice junctions (-1: no limit).
                                  (1) non-canonical motifs, (2) GT/AG and CT/AC motif, (3) GC/AG and CT/GC motif, (4) AT/AC and GT/AT motif.
      
  • 另外就是根据readNegativeStrand和mateNegativeStrand,配合以First in pair以及second in pair进行判断。
    • 这个办法,依赖于是否确定R1和R2的建库方式和建库方向,如果我们确定R1是某个特定方向,那么我们就能够通过这四个参数的组合获取到正确的方向。
    • 目前我已知的regtools就是通过这种途径进行链的识别的。
      //Get the strand from the bitwise flag
      void JunctionsExtractor::set_junction_strand_flag(bam1_t *aln, Junction& j1) {
          uint32_t flag = (aln->core).flag;
          
          // 从flag中提取出readNegativeReversed,mateNegativeReversed, first in pair和second in pair的信息
          int reversed = (flag >> 4) % 2;
          int mate_reversed = (flag >> 5) % 2;
          int first_in_pair = (flag >> 6) % 2;
          int second_in_pair = (flag >> 7) % 2;
          
          // 下面就是判断正负链的过程
          // strandness_ is 0 for unstranded, 1 for RF, and 2 for FR
          int bool_strandness = strandness_ - 1;
          int first_strand = !bool_strandness ^ first_in_pair ^ reversed;
          int second_strand = !bool_strandness ^ second_in_pair ^ mate_reversed;
          
          char strand;
          if (first_strand){
              strand = '+';
          } else {
              strand = '-';
          }
          
          //cerr << "flag is " << flag << endl;
          // if strand inferences from first and second in pair don't agree, we've got a problem
          if (first_strand == second_strand){
              j1.strand = string(1, strand);
          } else {
              j1.strand = string(1, '?');
          }
          //cerr <<"flag strand is " << j1.strand << endl;
          return;
      }
      
    • 根据参数推测,hisat2可能也是这个方式。
      --fr/--rf/--ff     -1, -2 mates align fw/rev, rev/fw, fw/fw (--fr)
      
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • wes定义: 全外显子组测序,是利用目标序列捕获技术, 将全基因组编码基因外显子区域的DNA捕获并富集后,进行高通...
    凤凰_0949阅读 4,147评论 0 7
  • Introduction What is Bowtie 2? Bowtie 2 is an ultrafast a...
    wzz阅读 5,560评论 0 5
  • fastafasta格式是最基本的表示序列信息(核苷酸或者蛋白质)的格式。这里简单介绍下,fasta格式的文件通常...
    tianzhanlan阅读 4,737评论 0 10
  • 夜半你的倩影总是入梦 都不可再假装糊涂 简直是甜蜜的捉弄 叫人难以轻言放弃 明知道隔着阻碍万千 注定了是坎坷折磨 ...
    花少颜阅读 298评论 1 0
  • 今天道路依旧难行,我慢吞吞行驶车辆来到孩子托付班,接她回家路上,说有一个好消息一个坏消息,问我想听哪一...
    清菡恩榜妈妈阅读 188评论 0 0