生信之旅

扫码分享下吧!
分享

生物信息常用文件格式(3)- SAM/BAM

bam格式是目前最常见的比对数据存储格式,其是一种高度压缩的格式,sam是其文本格式,下面将与sam格式进行说明。

sam格式是一个tab键分隔的文本格式,包含两个部分:

  1. header section (可选的)
  2. alignment section。

其中header 行以‘@’开头,若存在header,则必须在alignment 行之前。alignment 行包含11个必选字段,用于表示比对信息。

一、header 行

1.1、标题字段

每个标题行以@开头,后紧跟着下表中记录的两个代表字符(标签)之一。标题行的分隔符为制表符(tab),除了@CO行外,其余的每行的格式为‘TAG:VALUE’,可以用以下正则进行匹配

/^@(HD|SQ|RG|PG)(\t[A-Za-z][A-Za-z0-9]:[ -~]+)+$/
或者
/^@CO\t.*/.

同时,在每个标题行中,任何标签(除了@CO)都不能多次出现,并且它们出现的顺序不重要。

下诉表格记录了可能使用的标签类型预定义的标签,其中带有*的为必填项,每个@SQ标签后必须有SN和LN字段。除了下诉说明的的标签外,你还可以自由定义新的标签,包含小写字母的标签仅在本地使用,不会在未来的标本中正式定义。

表一:SAM/BAM文件header

Tag   Description
@HD   文件级元数据。可选的。如果存在,则必须只有一行@HD行, 并且它必须是文件的第一行
  VN* 文件格式版本。接受的格式:/^[0-9]+\.[0-9]+$/
SO 比对的排序顺序。有效值:unknown(default),unsorted,queryname和coordinate。对于coordinate,主要对比对中的RNAME字段进行排序,顺序是根据@SQ行决定。次要对比对中的POS字段排序,对于RNAME和POS有相同排序效果的比对行,其顺序是任意的。RNAME为*的比对行将跟在RNAME为其它值的后面,除此之外的其它情况下顺序是任意的;对于queryname,除了在整个文件中应用外,没有其它要求。
GO 比对的分组,主要是将相似的比对分为同一组(文件并不一定是排序的)有效值:none(default),query(alignments are grouped by QNAME), reference(alignments are grouped by RNAME/POS)
SS 比对的子排序顺序。sort-order的有效值形式:sub-sort的值与存储在SO标签的值一样,它是一个依赖于实际情况,以冒号分隔的字符串,进一步描述了排序顺序。同时对预先定义的术语进行了界定,例如:一个算法使用coordinate进行排序,对于每一个coordinate,使用query name 再次进行排序,则header应该为@HD SO:coordinate SS:coordinate:queryname;如果主要的排序不是任何一个预定义的术语,则应为unsorted,而这时sub-sort就是主排序了。例如:如果排序使用辅助标签MI进行,则header应为@HD SO:unsortedSS:unsorted:MI:coordinate
正则表达式:Regular expression:(coordinate|queryname|unsorted)(:[A-Za-z0-9_-]+)+
@SQ   参考序列的字典。@SQ行的顺序决定了比对的排序顺序
  SN* 参考序列名字。在@SQ行的SN标签和所有个体的AN名必须是明确的。该标签的值用于比对记录中的RNAME和RNEXT字段中。
正则表达式:[:rname:∧*=][:rname:]*
LN* 参考序列长度。范围:[1,231−1]
AH 表明该序列是备用的基因座。该值指的是该序列作为替代序列在初级组装中的位置,其格式为:‘chr:start-end’,当染色体位置,则用*替代chr,其中chr是初级组装中的序列。必须不会出现在初级组装的序列中。
AN 备选的参考序列名。使用逗号分隔的备选名,在工具使用到该参考序列的时候将会使用到。在SAM文件中,该候选名不会在其它地方用到。尤其是,它们不能出现在比对记录的RNAME和RNEXT字段中。
正则表达式:name(,name)*wherenameis[:rname:∧*=][:rname:]*
AS 基因组组装标记符
DS 描述。可以使用UTF8编码
M5 序列的MD5校验和
SP 物种
TP 分子拓扑学。有效值:linear(默认)和circular
UR 序列的URI。该值以某一个标准协议开始,例如:http或者ftp。如果不是以某一个标准协议开始,则会被判断为文件路径。
@RG   read的组别。运行无序的多个@RG行。
  ID* read组别的标记符。每一行@RG必须有唯一的ID。该ID的值用于对应RG的比对记录中。在header中,每个read group必须唯一。在sam文件合并的时候,为了防止该ID冲突,可能需要修改该ID。
BC 识别文库或者样本的barcode序列。该值是在没有错误的情况下,测序仪读取到的barcode碱基。当样本或者文库包含多条barcode序列时(例如模板前后各一条),建议将所有barcode序列使用‘-’连接起来。
CN 产生该read的测序中心的名字
DS 描述。可以使用UTF8编码
DT 运行产生的日期(ISO8601日期或日期/时间)
FO 泳道顺序。每条read的每条泳道所使用的核苷酸对应的核苷酸碱基阵列。多碱基流以IUPAC格式编码,非核苷酸流以各种其他字符编码。
格式:/\*|[ACMGRSVTWYHKDBN]+/
KS 每条read的关键序列相对于的核苷酸碱基阵列
LB 文库
PG 程序用来处理read 组别信息
PI 预测插入片段的中位数
PL 产生reads的平台/技术。有效值:CAPILLARY,DNBSEQ(MGI/BGI),HELICOS,ILLUMINA,IONTORRENT,LS454,ONT(Oxford Nanopore),PACBIO(Pacific Biosciences),和SOLID。当值不在以上列出的平台时(尽管PM字段仍有可能存在),应该忽略此字段,或者使用unknown
PM 平台模式。提供所使用的平台/技术的进一步细节的自由格式文本
PU 平台单位(flowcell-barcode.lane for Illumina 或者slide for SOLiD),唯一识别码。
SM 样本。使用pool name
@PG   程序
  ID* 程序标记符。每一行@PG必须有唯一ID。该ID的值将会用于比对记录中的PG标签和其它@PG行的PP标签。当合并sam文件时,该值可能会被修改
PN 程序名
CL 命令行。可以使用UTF8编码
PP 先前的@PG-ID。必须和另一个@PG的ID相匹配。@PG记录可以链式使用PP标签,同时在最后一个记录没有PP标签。该链记录了对该比对进行处理的程序的顺序。当合并sam文件时,PP的值可以被修改。链中的第一个PG记录了最近的处理程序。PG的ID不要求参考链中最新的PG记录。
DS 描述。可以使用UTF8编码
VN 程序版本
@CO   单行文本注释。 允许无序的多行@CO。 可以使用UTF-8编码。

1.2、定义sub-sort术语

虽然 SS sub-sort 字段允许执行定义的关键字,但某些预定义的术语是具有特定含义,例如:

  • lexicographical 基于字符的字典排序,字符顺序由POSIX C定义
  • natural 排序顺序类似于字典排序,不同之处在于将嵌入在字符串中的相邻的数字认为是数字,它们之间相互比较时,按照数字顺序排序,在与周围的不包含数字的字符串相比时,按照单个数字的顺序排序。前置0的数量的排序也是不同的,0更多的将会排在前面。字符‘-’和‘.’被认为是一般字符,所以显然,负数和小数不会被视为数字的一部分。
  • umi 是按UMI标签进行的lexicographical排序。MI标签应该用于比较UMIs。RX标签可以在其不存在的情况下使用,但是不能保证其在多个库中的唯一性。

1.3、参考序列MD5计算

@SQ行的M5标签可以通过MD5信息唯一确定参考序列,其可以帮助解决命名含糊不清的问题。例如:其可以快速确定不同文件中的命名为‘1’,‘chr1’,'Chr1'的参考序列是否为同一条。

参考序列必须在7位的US-ASCII字符集中,填充字符必须使用‘*’表示。MD5的计算过程如下:

  • 所有ASCII码在33('!')到126 ('~')范围外的字符将会被去除,去除所有空白和不可打印字符,其余的字符将被保留,即使不是核苷酸代码字符。
  • 所有小写字符将被转换成大写
  • 计算MD5

二、比对行

2.1、必须字段

在sam格式中,每一个比对行表示这一条比对记录,每一行包含这11个以上tab键分隔的字段,其中第1-11个字段是必须的,其顺序见表二所示。若这些字段的任一个值不可用,则会用‘0’或‘*’表示(由字段类型确定)。

表二:比对必需字段

字段 类型 正则/范围 简介
QNAME String [!-?A-~]{1,254} 查询模板名
FLAG Int [0,216-1] 按位flag,常用于提取bam文件序列
RNAME String \*|[:rname:*=][:rname:]* 参考序列名
POS Int [0,231-1] 从1开始的最左侧映射位置
MAPQ Int [0,28-1] 比对质量
CIGAR String \*|([0-9]+[MIDNSHPX=])+ CIGAR字符串
RNEXT String \*|=|[:rname:*=][:rname:]* mate/下一条序列的参考名
PNEXT Int [0,231-1] mate/下一条序列的位置
TLEN Int [-231+1,231-1] 模板序列长度
SEQ String \*|[A-Za-z=.]+ segment序列
QUAL String [!-~]+ 基于Phred33的ASCII码

在比对行的所有比对片段都是基于基因组的正向方向;比对到反向链的序列片段,其记录中的SEQ、CIGAR、QUAL和可选的链敏感性的字段都将会被反转(碱基反向互补),与碱基序列保持一致。

下面对上诉表的必需字段进行说明。

1. QNAME: 查询模板名。Reads/segments 的QNAME相同,将会被视为来自于相同的模板。QNAME为‘*’表示信息不可用。在sam文件中,一条read可在多个比对行中出现,例如chimeric比对或者read比对到多个地方。

2. FLAG:组合按位FLAGs。每个位数的意思见下表。

表三:FLAGs说明

十进制 十六进制 描述
1 0x1 序列中有多个片段的模板
2 0x2 根据比对算法正确对齐每个片段
4 0x4 未比对上的片段
8 0x8 模板上下一个未比对上的片段
16 0x10 被反向互补的SEQ
32 0x20 被反向互补的模板中,下一段SEQ片段
64 0x40 模板中的第一个片段
128 0x80 模板中的最后一个片段
256 0x100 次要比对
512 0x200 未通过过滤,例如平台或者供应商的质控
1024 0x400 PCR或光学重复
2048 0x800 补充比对
  • 对于sam文件中的每一条read/contig,要求有且仅有一行与read相关联的行满足‘FLAG& 0x900 == 0’,该行称为该条read的 primary line;
  • 当工具识别0x100位时,该比对不会用于某些分析。在sam文件出现多个映射时,其常用于表示备选映射;
  • 0x800位表示比对行是嵌和比对的一部分(chimeric),该行称为supplementary行;
  • 0x4位是唯一可靠的判断read是否未比对的位数,如果设置为0x4,则无法对RNAME,POS,SACK,MAPQ和位0x2,0x100和0x800进行推断;
  • 0x10位表明序列是否反向互补和质量反转,当0x4位未设置时,该片段相对应的链将会被比对上:0x10未设置表明正向链,设置的时候表明是反向链;当0x4位设置时表明其方向可能是在测序机器上脱落时的原始方向;
  • 0x40 和 0x80 暗示这测序技术所用模板中read的顺序,如果两者同时设置,read是线性模板的一部分,但它既不是第一个也不是最后一个read的。如果两者同时不设置,则模板中read的索引是未知的。这也可能发生在非线性模板中,或当数据处理过程中的信息丢失中;
  • 0x1如果未设置,0x2, 0x8, 0x20, 0x40 和 0x80将不能被推断;
  • 表中没有列出的位是保留给将来使用的。写入时不应设置它们,当前软件在读取时应忽略它们。

3. RNAME:比对的参考序列名称

若@SQ行存在,RNAME(如果不为‘*’)必存在于一个SQ-SN标记中,一个没有坐标的未比对上片段,在该位置为‘*’。然而,一个未必对的片段也有可能有一个普通的坐标,这样在排序的时候,它将在一个合适的位置。如果RNAME是‘*’,则POS和CIGAR将不能被推断出来。

4. POS:在第一个CIGAR中,基于1的最左边的比对的位置。参考序列中的第一个碱基的坐标为1,没有坐标的未比对上的序列的POS为0,当POS为0时,RNAME 和CIGAR将不能被推断。

5. MAPQ:比对质量,其等于-10log10P{比对错误},再四舍五入到最接近的整数。值为255时,表明不可用;

6. CIGAR: 雪茄字符串,下表表示各个字符的含义(如果为‘*’,则表示不可用)

表四:CIGAR字符串说明

Op BAM Description Consumes query Consumes reference
M 0 比对匹配(可以是序列匹配或错配) Y Y
I 1 相对于参考基因组,有碱基序列插入 Y N
D 2 相对于参考基因组,有碱基序列删除 N Y
N 3 相对于参考基因组,序列跳过了某个区域 N Y
S 4 read仅一部分比对到参考基因组上,未比对部分也保留在序列中 Y N
H 5 read仅一部分比对到参考基因组上,未比对部分不保留在序列中 N N
P 6

原文意思为填充(padding),我参考其他人的见解总结如下:

假设有多条read比对到同一个位置,其中3条reads各不相同,若read 1 和read 2相对于参考序列在某个位置有插入,

read 3完全和参考序列一致,但是比对到参考基因组上时,对应的位置也当作插入比对,这种情况就叫做padding

N N
= 7 序列匹配 Y Y
X 8 序列错配 Y Y

 

Consumes query” 和“consumes reference”分别表示CIGAR操作是否导致比对分别沿着query 序列或者参考序列进行;

H仅能在出现在第一个或最后一个;

对于 mRNA 到基因组的比对,N 操作代表一个内含子。 对于其他类型的比对,N 的解释没有定义。

M/I/S/=/X的总长度应该等于序列的总长度

7. RNEXT 模板中NEXT read的主要比对的参考序列名称。对于last read, next read是模板中的第一条read。如果存在 @SQ 标题行,则 RNEXT(如果不是“*”或“=”)必须存在于 SQ-SN 标记之一中。该字段在信息不可用时设置为“*”;如果RNEXT和RNAME一样时,则设置为“=”;如果不是“=”,并且模板中的next read有一个主映射(0x100),则该字段与next read的主行的RNAME一样;如果该字段为“*”,则无法对PNEXT 和位 0x20做任何推断。

8. PNEXT 模板中next read 基于位置1的主要比对。当设置为0时,则不可用;该字段等于next read的主行的位置;如果该字段为0,则无法对RNEXT 和位0x20进行推断;

9. TLEN 模板长度

10. SEQ 序列片段 当序列未存储时,该字段可以是"*",如果不是“*”,则序列的长度必须等于CIGAR中的M/I/S/=/X的总长度,“=”表示碱基与参考碱基相同,忽略碱基大小写。

11. QUAL 碱基ASCII码加上33(与 Sanger FASTQ 格式中的质量字符串相同) 当质量信息没有存储时,该字段可以为“*”,当不是“*”时,质量字符串的长度必须和SEQ序列长度相等;

2.1、可选字段

所有可选字段遵循如下格式:TAG:TYPE:VALUE ,其中TAG是一个遵循/[A-Za-z][A-Za-z0-9]/的两字符字符串。在每个比对行中,任何TAG不能出现多次,并且出现顺序不重要。包含小写字符的TAG是为最终用户保留的。TYPE是区分大小写的字母,定义了VALUE的格式

表五: 可选字段说明

Type Regexp matching VALUE Description
A [!-~] 可打印字符
i [-+]?[0-9]+ 有符号整数
f [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)? 单精度浮点数
Z [ !-~]* 可打印字符串,包括空格
H ([0-9A-F][0-9A-F])* 十六进制格式的字节数组
B [cCsSiIf](,[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)*

整数或数值数组

 

对于整数或数值数组(类型“B”),第一个字母表示后面逗号分隔数组中的数字类型;字母可以是‘cCsSiIf’之一,分别对应于int8_t(有符号8位整数)、uint8_t(无符号8位整数)、int16_t、uint16_t、int32_t、uint32_t和float;在导入/导出期间,如果新类型也与数组兼容,则元素类型可能会更改。预定义的标签在Sequence Alignment/Map Optional Fields Specification中进行了描述,也参照下表。以“X”、“Y”或“Z”开头的标签以及在任一位置包含小写字母的标签均保留供本地使用,不会在这些规范的任何未来版本中正式定义。

表六:可选字段预设值

Tag Type Description
AM i The smallest template-independent mapping quality in the template
AS i Alignment score generated by aligner
BC Z Barcode sequence identifying the sample
BQ Z Offset to base alignment quality (BAQ)
BZ Z Phred quality of the unique molecular barcode bases in the OX tag
CB Z Cell identifier
CC Z Reference name of the next hit
CG B,I BAM only: CIGAR in BAM’s binary encoding if (and only if) it consists of >65535 operators
CM i Edit distance between the color sequence and the color reference (see also NM)
CO Z Free-text comments
CP i Leftmost coordinate of the next hit
CQ Z Color read base qualities
CR Z Cellular barcode sequence bases (uncorrected)
CS Z Color read sequence
CT Z Complete read annotation tag, used for consensus annotation dummy features
CY Z Phred quality of the cellular barcode sequence in the CR tag
E2 Z The 2nd most likely base calls
FI i The index of segment in the template
FS Z Segment suffix
FZ B,S Flow signal intensities
GC ? Reserved for backwards compatibility reasons
GQ ? Reserved for backwards compatibility reasons
GS ? Reserved for backwards compatibility reasons
H0 i Number of perfect hits
H1 i Number of 1-difference hits (see also NM)
H2 i Number of 2-difference hits
HI i Query hit index
IH i Query hit total count
LB Z Library
MC Z CIGAR string for mate/next segment
MD Z String encoding mismatched and deleted reference bases
MF ? Reserved for backwards compatibility reasons
MI Z Molecular identifier; a string that uniquely identifies the molecule from which the record was derived
ML B,C Base modification probabilities
MM Z Base modifications / methylation
MQ i Mapping quality of the mate/next segment
NH i Number of reported alignments that contain the query in the current record
NM i Edit distance to the reference
OA Z Original alignment
OC Z Original CIGAR (deprecated; use OA instead)
OP i Original mapping position (deprecated; use OA instead)
OQ Z Original base quality
OX Z Original unique molecular barcode bases
PG Z Program
PQ i Phred likelihood of the template
PT Z Read annotations for parts of the padded read sequence
PU Z Platform unit
Q2 Z Phred quality of the mate/next segment sequence in the R2 tag
QT Z Phred quality of the sample barcode sequence in the BC tag
QX Z Quality score of the unique molecular identifier in the RX tag
R2 Z Sequence of the mate/next segment in the template
RG Z Read group
RT ? Reserved for backwards compatibility reasons
RX Z Sequence bases of the (possibly corrected) unique molecular identifier
S2 ? Reserved for backwards compatibility reasons
SA Z Other canonical alignments in a chimeric alignment
SM i Template-independent mapping quality
SQ ? Reserved for backwards compatibility reasons
TC i The number of segments in the template
TS A Transcript strand
U2 Z Phred probability of the 2nd call being wrong conditional on the best being wrong
UQ i Phred likelihood of the segment, conditional on the mapping being correct
X? ? Reserved for end users
Y? ? Reserved for end users
Z? ? Reserved for end users

 

一个解析flag的小工具:https://broadinstitute.github.io/picard/explain-flags.html

参考:https://samtools.github.io/hts-specs/SAMv1.pdf

 

版权声明:本文转载请注明出处!

最新评论:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

captcha

公告栏

有任何问题均可以在文章页面留言!或者邮件 burning@burning.net.cn 欢迎关注微信公众号 “生信之旅”,每天均可在菜单栏领取外卖红包、支付宝红包!最高20元!

服务器推荐

欢迎关注公众号

欢迎关注生信之旅