SAM格式规范(V 1.6)
SAM为Sequence Alignment/Map格式,一种由制表符(Tab)分隔的文本格式,由header部分(可选)和alignment部分组成。当header部分存在时,必须在alignment部分前,且以“@”开头。alignment部分有11列必填字段(下文介绍)。
header部分
每个header行以字符“@”开头,后跟本节中定义的两个字母header记录类型代码之一。在header中,每一行都以制表符分隔,除了@CO行,每个数据字段都遵循一种格式“Tag:Value”,其中Tag是一个两个字符的字符串,用于定义值的格式和内容。
下表描述了@HD可能使用预定义Tag。
@HD为文件级元数据。可选择的。如果存在,则必须只有一个@HD行,它必须是文件的第一行。
Tag | 描述 |
---|---|
VN | 文件格式版本,@HD存在时必须 |
SO | alignments的排列顺序。有效值:未知(默认)、未排序、QueryName和坐标。对于坐标排序,主要排序键是RNAME字段,使用标头中的@SQ行顺序定义的顺序。次要排序键是POS字段。对于具有相同RNAME和POS的对齐,顺序是任意的。在NameField中带有“*”的所有对齐方式都遵循带有其他值的对齐方式,但在其他情况下,它们的顺序是任意的。对于queryname的顺序,除了在整个文件中一致应用排序之外,没有对排序提出明确要求 |
GO | alignments分组,表示相似的alignments记录被分组在一起,但文件不必整体排序。有效值:无(默认)、查询(alignments按QName分组)和引用(alignments按Name/POS分组)。 |
SS | alignments的子排序顺序。有效值的格式为sort order:sub sort,其中sort order是存储在SO Tag中的相同值,sub sort是一个依赖于实现的冒号分隔字符串,进一步描述排序顺序,如果一个算法依赖于一个坐标排序,在每个坐标处,该排序按查询名称进一步排序,则标头可以包含@HD SO:coordinate SS:coordinate:queryname。如果主排序不是预定义的主排序顺序之一,则应使用未排序,并且子排序实际上是主排序。例如,如果按辅助标记按坐标排序,则标题可以包含@HD SO:unsorted SS:unsorted:MI:coordinate |
下表描述了@SQ可能使用预定义Tag。
@SQ描述参考基因组信息,此行定义alignment行的顺序
Tag | 描述 |
---|---|
SN | 参考序列名。所有@SQ行中的SN标签和所有独立的AN名称必须是不同的,为必填字段 |
LN | 参考序列长度,为必填字段 |
AH | 表明该序列是一个备用轨迹。该值是该序列作为替代序列的主程序集中的轨迹,格式为“chr:start-end”、“chr”(如果已知)或“*”(如果未知),其中“chr”是主要组装结果中的序列 |
AN | 可选参考序列名称 |
AS | 基因组组装标识符 |
DS | 描述,可以使用UTF-8编码 |
M5 | 序列的MD5校验 |
SP | 物种 |
TP | 分子拓扑。有效值:linear(默认)和circular |
UR | 参考序列的URI,这个值从一个标准的协议开始,例如,“http:”或“ftp:”,如果不是这些协议作为开始,那么就应该是文件系统路径 |
下表描述了@RG可能使用预定义Tag。
@RG为Read Group,1个样本的测序结果为1个Read Group,允许有多个无序的@RG行
Tag | 描述 |
---|---|
ID | Read Group标识符。每一个@RG行必须有唯一的ID。ID的值用于alignments记录的RG标记。在header部分的所有Read Group中必须是唯一的。在合并SAM文件以处理冲突时,可以修改Read Group的ID,为必填项 |
BC | 识别样本或库的条形码序列。该值是在没有错误的情况下,测序机读取的预期条形码基数。如果样本/库有多个条形码(例如,模板两端各有一个),建议使用连字符('-')将所有条形码连接起来 |
CN | 测序中心提供的read名称 |
DS | 描述,可以使用UTF-8编码 |
DT | 生产运行的日期(ISO8601日期或日期/时间)。 |
FO | 流动顺序。与每次读取的每个流所用核苷酸相对应的核苷酸碱基阵列。多碱基流以IUPAC格式编码,非核苷酸流以各种其他字符编码。 |
KS | 与每次读取的键序列相对应的核苷酸碱基数组。 |
LB | 文库 |
PG | 用于处理Read Group的程序。 |
PI | 预测的中间插入大小 |
PL | 用于产生读数的平台/技术。有效值:CAPILLARY、DNBSEQ(MGI/BGI)、HELICOS、ILLUMINA、IONTORRENT、LS454、ONT(Oxford Nanopore)、PACBIO(Pacific Biosciences)和固体。当技术不在此列表中(尽管在这种情况下PM字段可能仍然存在)或未知时,应省略此字段。 |
PM | 平台模型。提供所用平台/技术的更多详细信息的自由格式文本。 |
PU | 平台单元(例如,flowcell条形码。用于照明的滑道或用于固体的滑道)。唯一标识符 |
SM | 样品,在对池进行排序的位置使用池名称 |
下表描述了@PG可能使用预定义Tag。
@PG为program
Tag | 描述 |
---|---|
ID | 程序记录标识符 |
PN | 程序名称 |
CL | 命令行,可以使用UTF-8编码 |
PP | 前面的@PG-ID,必须匹配另一个@PG header的ID标签。可以使用PP标记链接@PG记录,链中的最后一条记录没有PP标记。该链定义应用于对齐的程序的顺序。在合并SAM文件以处理PG id冲突时,可以修改PP值。链中的第一个PG记录(即SAM记录中的PG标记所引用的记录)描述了在SAM记录上操作的最新程序。链中的下一个PG记录描述了在SAM记录上操作的下一个最新程序。SAM记录上的PG ID不需要引用链中最新的PG记录。它可以引用链中的任何PG记录,这意味着SAM记录已经被PG记录中的程序操作过,并且程序通过PP标记引用 |
DS | 描述,可以使用UTF-8编码 |
VN | 程序版本 |
@CO为单行文本的评论。允许多个@CO行无序排列,可以使用UTF-8编码
alignment部分
必填字段
列 | 字段 | 类型 | 简单描述 |
---|---|---|---|
1 | QNAME | String | 查询template名 |
2 | FLAG | Int | 位标记,template mapping情况的数字表示,每一个数字代表一种比对情况,这里的值是符合情况的数字相加总和 |
3 | RNAME | String | 参考序列名称 |
4 | POS | Int | 基于1的最左比对位置 |
5 | MAPQ | Int | 比对质量 |
6 | CIGAR | String | CIGAR字符串 |
7 | RNEXT | String | 比对到的参考(染色体)名字 |
8 | PNEXT | Int | 配对到的第一个碱基的位置 |
9 | TLEN | Int | 可以理解为文库插入片段长度 |
10 | SEQ | String | 序列片段 |
11 | QUAL | String | Phred-scale的ASCII码,基于QUALity+33 |
下面详细解释每个字段的意义
1、QNAME:查询模板名称。具有相同QNAME的Reads/segments被认为来自相同的template。QNAME为“*”表示信息不可用。
2、FLAG 位标记,下表是每一个代号代表的意义
Bit | 描述 |
---|---|
1 | 标示对应的二进制为01,标示read有多个测序数据,一般理解为有双端测序数据,另一条没有过滤掉 |
2 | Pair对完美比对上 |
4 | 代表这个序列没有mapping到参考序列上 |
8 | 代表这个序列的另一端序列没有比对到参考序列上,比如这条序列是R1,它对应的R2端序列没有比对到参考序列上 |
16 | 代表这个序列比对到参考序列的负链上 |
32 | 代表这个序列对应的另一端序列比对到参考序列的负链上 |
64 | 代表这个序列是R1端序列,read1 |
128 | 代表这个序列是R2端序列,read2 |
256 | 代表这个序列不是主要的比对,一条序列可能比对到参考序列的多个位置,只有一个是首要的比对位置,其他都是次要的 |
512 | 该read没有通过质量控制 |
1024 | 代表这个序列是PCR重复序列 |
2048 | 这条read可能存在嵌合,这个比对的部分只是来自其中的一部分序列(Supplementary alignment) |
3、RNAME:比对的参考序列名称,如果@SQ头部行存在,RNAME(如果不是“*”)必须出现在一个SQ-SN标记中。没比对上此处就是“*”。然而,一个未必对的片段也有一个坐标以便排序。如果RNAME 是“*”,也就没有 POS 和 CIGAR
4、POS:于1的第一个匹配基的最左映射位置。参考序列中的第一个基的坐标是1。对于没有坐标的未映射读取,POS设置为0。如果POS为0,RNAME和CIGAR也就没有意义
5、MAPQ:mapping质量,等于−10log10Pr(映射位置是错的),四舍五入到最近的整数,值255表示映射质量特别差
6、CIGAR:CIGAR字符串。下表为CIGAR字符串的解释(‘*’表示无值)
Op | BAM | 描述 | 消耗待比对序列 | 消耗参考序列 |
---|---|---|---|---|
M | 0 | 位置能比对上 | yes | yes |
I | 1 | 相对参考序列有插入 | yes | no |
D | 2 | 相对参考序列有缺失 | no | yes |
N | 3 | 从参考序列上跳过一段 | no | yes |
S | 4 | 软切割(被切割的序列保留在SEQ中) | yes | no |
H | 5 | 硬切割(被切割的序列不出现在SEQ中) | no | no |
P | 6 | 补丁(打了补丁的参考序列中的沉默缺失) | no | no |
= | 7 | read碱基与参考序列相同 | yes | yes |
X | 8 | read碱基与参考序列不同 | yes | yes |
解释:
- "消耗查询序列"与"消耗参考序列"分别指CIGAR是否引起比对沿着查询序列和参考序列的方向向前前进一个或几个碱基
- H 只能出现在CIGAR的开始或最后
- S的两边必为H,否则必须位于CIGAR的两端
- 对于mRNA到基因组的比对,N表示内含子。对于其他类型的比对,N的解释未被定义
- MIS=X的长度和应该等于SEQ长度
7、RNEXT:表示下一个片段比对上的参考序列的编号,比对不上用’*‘,该片段和下一个片段比对上同一个参考片段,用“=”
8、PNEXT:表示下一个片段比对上的位置,如果不可用,此处为0
9、TLEN:表示Template的长度。如果第八列大于第四列,则为正数,否则负数
10、SEQ:表示序列片段的序列信息,(注意CIGAR中M/I/S/=/X对应数字的和要等于序列长度),表示read的碱基序列,如果是比对到互补链上则是反转互补序列
11、QUAL:序列的质量信息, read质量的ASCII编码。格式同FASTQ一样
12、第十二列及之后:Optional fields,以tab建分割,可参考http://samtools.github.io/hts-specs/SAMv1.pdf
BAM文件
bam文件和sam文件内容其实是一样的,只是bam是二进制的压缩文件,需要通过特定的软件来进行查看,如samtools
一些术语和概念
Template:一种DNA/RNA序列,其一部分在测序机上测序或由原始序列组装而成。
Segment:一个连续的序列或子序列。
Read:从测序机中产生的原始序列。一次读取可能由多个段组成。对于排序数据,读取按顺序进行索引。
Linear alignment:一种将读取序列与单个参考序列对齐的方法,该方法可以包括插入、删除、跳过和剪切,但不包括方向变化(即,正向链上的一部分对齐和反向链上的另一部分对齐)。线性对齐可以在单个SAM记录中表示。
Chimeric alignment:不能表示为线性对齐的读取的对齐方式。嵌合排列被表示为一组没有大重叠的线性排列。通常,嵌合体对齐中的一个线性对齐被视为“代表性”对齐,其他对齐被称为“补充”对齐,并通过补充对齐标志进行区分。
Read alignment:一种线性对齐或嵌合体对齐,它是读卡器对齐的完整表示。
Multiple mapping:读取的正确位置可能不明确,例如。G由于重复。在这种情况下,同一读取可能有多个读取对齐。其中一条路线被视为主要路线。所有其他路线都在代表它们的SAM记录中设置了次级路线标志。所有SAM记录的0x40和0x80标志具有相同的eqname和相同的值。通常,指定的主路线是最佳路线,但决策可能是任意的。
1-based coordinate system:一种坐标系,其中序列的第一个基是一。在此坐标系中,区域由闭合间隔指定。例如,第3和第7碱基之间的区域为[3,7]。SAM、VCF、GFF和Wiggle格式使用基于1的坐标系。
0-based coordinate system:序列的第一个基为零的坐标系。在此坐标系中,区域由半闭半开区间指定。例如,第3和第7个基点之间的区域为[2,7)。BAM、BCFv2、BED和PSL格式使用基于0的坐标系。
Phred scale:给定概率0< p ≤1, p的Phred scale等于−10log10p后的值四舍五入到最接近的整数。