序列对齐/映射格式规范
2023 年 11 月 16 日
SAM 是 Sequence Alignment/Map 格式的缩写。它是一种 TAB 分隔的文本格式,由标题部分(可选)和排列部分组成。如果存在,标题必须在排列之前。标题行以"
"开头,而对齐行则不以"
"开头。每个对齐行有 11 个必填字段,包含基本的对齐信息(如映射位置),以及数量可变的可选字段,包含灵活的或对齐器特定的信息。
本规范适用于 1.6 版本的 SAM 和 BAM 格式。每个 SAM 和 BAM 文件可选择通过 @HD VN 标签指定所使用的版本。有关完整的版本历史,请参见附录 B。
SAM 文件内容为 7 位 US-ASCII,但个别指定的某些字段值除外,这些字段值可能包含以 UTF-8 编码的其他 Unicode 字符。或者,SAM 文件以 UTF-8 编码,但只允许在某些字段值中使用非 ASCII 字符,这些字段值在说明中明确指定。
在有区别的地方,SAM 文件内容应使用 POSIX / C 本地语言读写。例如,SAM 中的浮点数值始终使用". "作为小数点字符。
本规范中的正则表达式使用 POSIX / IEEE Std 1003.1 扩展语法编写。
1.1 示例
假设我们有以下配准结果,配准结果中的小写碱基被剪除。读数 r001/1 和 r001/2 构成一个读数对;r003 是嵌合读数;r004 代表分裂排列。
@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
1.2 术语和概念
模板 DNA/RNA 序列,其中一部分在测序机上测序,或由原始序列组装而成。
一个连续的序列或子序列。 从测序机上获取的原始序列。一个读数可能由多个片段组成。对于测序数据,读数按测序顺序排列索引。
线性比对 是指读数与单个参考序列的比对,可能包括插入、删除、跳转和剪切,但不包括方向变化(即一部分比对在正向链上,另一部分比对在反向链上)。线性比对可以用一条 SAM 记录来表示。
嵌合配准 不能表示为线性配准的读数配准。嵌合对齐表示为一组没有大量重叠的线性对齐。通常情况下,嵌合对齐中的一条线性对齐被视为 "代表 "对齐,其他对齐被称为 "补充 "对齐,并用补充对齐标志加以区分。嵌合排列中的所有 SAM 记录都具有相同的 QNAME 以及
和
标志的相同值(见第 1.4 节)。关于哪个线性排列具有代表性的决定是任意的。
读数配准 是一种线性配准或嵌合配准,是读数配准的完整表示。
多重映射 读数的正确位置可能不明确,例如由于重复。在这种情况下,同一读数可能会有多个读数配准。其中一个排列被认为是主要排列。所有其他对齐方式都在代表它们的 SAM 记录中设置了辅助对齐标志。所有 SAM 记录的 QNAME 相同,
和 0x80 标志值相同。通常情况下,指定的主要排列是最佳排列,但也可以任意决定。
1 基坐标系 序列的第一个基数为 1 的坐标系。在该坐标系中,一个区域由一个封闭区间指定。例如,第 3 个碱基和第 7 个碱基之间的区域为
。SAM、VCF、GFF 和 Wiggle 格式都使用 1 基坐标系。 0 基坐标系 序列的第一个基数为 0 的坐标系。在该坐标系中,一个区域由一个半闭半开的区间指定。例如,第 3 个碱基和第 7 个碱基之间的区域为
。BAM、BCFv2、BED 和 PSL 格式使用基于 0 的坐标系。
Phred 标度 给定概率
,
的 phred 标度等于
,四舍五入为最接近的整数。
1.2.1 字符集限制
在 SAM 和 VCF 等相关格式中,参考序列名称、CIGAR 字符串和其他一些字段类型被用作其他字段的值或部分值。为确保这些其他字段的表示法明确无误,这些字段类型不允许使用特定的分隔符。
查询或读取名称可以包含除"
"之外的[!-]范围内的任何可打印 ASCII 字符,以便 SAM 对齐行与标题行容易区分。(它们的长度也有限制)。
除反斜线、逗号、引号和括号外,参考序列名称可以包含范围为 [!- ] 的任何可打印 ASCII 字符,即除',"' () [] {} <>'外,不得以'
'或'
'开头。
因此,它们与以下正则表达式相匹配:
为了清楚起见,我们在本规范的其他地方将这组允许使用的字符写成字符类 [:rname:] 并扩展 POSIX 正则表达式符号,使用
来表示从字符类中省略"
"和"
"。因此,这个正则表达式可以更清楚地写成 [:rname
] [:rname:]* 。
每个标头行都以字符"
"开头,后面跟一个本节定义的双字母标头记录类型代码。在标头中,每行都用 TAB 分隔,除 @CO 行外,每个数据字段都遵循 "TAG:VALUE "格式,其中 TAG 是一个双字符串,定义了 VALUE 的格式和内容。因此,标题行匹配 /^ @(HD|SQ|RG|PG) (
或 /^ @CO t .*/。在每个(非 @CO)标题行中,字段标记都不能出现超过一次,字段出现的顺序也不重要。
下表描述了可使用的标题记录类型及其预定义标记。用
列出的标记为必填标记;例如,每个 @SQ 标头行都必须有 SN 和 LN 字段。与对齐可选字段(见第 1.5 节)一样,您可以为其他数据字段自由添加新标记。包含小写字母的标记保留给本地使用,不会在本规范的任何未来版本中正式定义。
标签
说明
@HD
文件级元数据。可选。如果存在,则必须只有一行 @HD 且必须是文件的第一行。
VN*
格式版本。接受格式:/^
.
SO
排列的排序顺序。有效值:未知(默认)、未排序、查询名和坐标。对于坐标排序,主要排序键是 RNAME 字段,顺序由标头中 @SQ 行的顺序决定。次要排序键是 POS 字段。对于排列
具有相同 RNAME 和 POS 的排列,顺序是任意的。所有带有'
RNAME 字段中的 "undefined data-dl-uid=7>"遵循与其他值的对齐方式,除此之外,其顺序是任意的。对于 queryname 排序,除了要求在整个文件中应用一致外,对排序没有明确要求。
GO
排列的分组,表示相似的排列记录被分组在一起,但文件不一定整体排序。有效值:无(默认值)、查询(按 QNAME 对排列进行分组)和参考(按 RNAME/POS 对排列进行分组)。
SS
排列的子排序顺序。有效值的形式为 sort-order:sub-sort,其中 sort- order 是存储在 SO 标签中的相同值,sub-sort 是一个以冒号分隔的字符串,用于进一步描述排序顺序,但也包含第 1.3.1 节中的一些预定义术语。例如,如果一种算法依赖于坐标排序,在每个坐标上按查询名称进一步排序,那么标头可以包含 @HD SO:coordinate
SS: coordinate:queryname.
如果主要排序不是预定义的主要排序顺序之一、则应使用无排序,而子排序实际上就是主排序。例如,如果按辅助标记 MI 排序,然后按坐标排序,那么标头可以包含 @HD SO:unsorted SS:unsorted:MI: coordinate。 正则表达式:(coordinate। queryname|unsorted) (: [A-Za-z0-9_-]+) +
@SQ
参考序列字典。@SQ 行的顺序定义了排列的排序顺序。
SN*
参考序列名称。所有 @SQ 行中的 SN 标记和所有单个 AN 名称必须不同。该字段的值将在 RNAME 和 RNEXT 字段的比对记录中使用。
正则表达式:[:rname:
[:rname:]*
LN*
参考序列长度。范围:
AH
表示该序列是一个备用位点。
该值是该序列作为替代序列的主集合中的位点、格式为'chr:开始-结束"、"chr"(如果已知)或 "*"(如果
未知),其中 '
'是主装配中的序列。必须不存在于主程序集中的序列上。
AN
备选参考序列名称。以逗号分隔的备选序列名称列表,可用于
可在引用该参考序列时使用。
这些替代名称不能在 SAM 文件的其他地方使用;特别是,它们不得出现在对齐记录的 RNAME 中。
或 RNEXT 字段。正则表达式:name (, name)* 其中 name 为 [:rname:
]。[:rname:]*
AS
基因组装配标识符。
DS
说明可使用 UTF-8 编码。
M5
序列的 MD5 校验和。参见第 1.3.2 节
SP
物种
TP
分子拓扑结构。有效值:线性(默认)和圆形。
UR
序列的 URI。该值可以以标准协议之一开头,例如 "http: "或 "ftp:"。如果不以这些协议之一开头,则假定为文件系统路径。
@RG
读取组。允许无序排列多个 @RG 行。
ID*
读取组标识符。每个 @RG 行必须有一个唯一的 ID。ID 值用于对齐记录的 RG 标记。在标头部分的所有读取组中必须是唯一的。在合并 SAM 文件时,读取组 ID 可能会被修改,以便处理碰撞。
BC
识别样本或文库的条形码序列。该值是测序机器在没有错误的情况下读取的预期条形码碱基。如果样本/文库有多个条形码(如模板两端各一个),建议的实现方法是将所有条形码连接起来,用连字符(' - ')分隔。
CN
产生该读数的测序中心名称。
DS
说明可使用 UTF-8 编码。
DT
运行生成日期(ISO8601 日期或日期/时间)。
FO
流序。与每个读数的每个流所用核苷酸相对应的核苷酸碱基阵列。多碱基流以 IUPAC 格式编码,非核苷酸流以
其他各种角色。格式:
ACMGRSVTWYHKDBN]+/
KS
与每个读数的关键序列相对应的核苷酸碱基阵列。
LB
图书馆
PG
用于处理读取组的程序。
PI
预测的插入大小中位数,四舍五入为最接近的整数。
PL
用于生成读数的平台/技术。有效值:CAPILLARY、DNBSEQ(MGI/BGI)、ELEMENT、HELICOS、ILLUMINA、IONTORRENT、LS454、ONT(Oxford Nanopore)、PACBIO(Pacific Bio-sciences)、SINGULAR、SOLID 和 ULTIMA。如果技术不在此列表中(尽管 PM 字段可能仍然存在)或未知,则应省略此字段。
PM
平台模型。提供所用平台/技术进一步详情的自由格式文本。
PU
平台单位(如 Illumina 的 flowcell-barcode.lane,或 SOLiD 的 slide)。唯一标识符。
SM
样本。如果正在测序,则使用池名称。
@PG
计划
ID*
程序记录标识符。每个 @PG 行必须有一个唯一的 ID。ID 值将用于其他 @PG 行的对齐 PG 标记和 PP 标记。在合并 SAM 文件时,PG ID 可能会被修改,以便处理碰撞。
PN
计划名称
CL
命令行。可使用 UTF-8 编码。
PP
上一个 @PG-ID.必须与另一个 @PG 标头的 ID 标记相匹配。@PG 记录可以使用 PP 标记进行链式排列,链中的最后一条记录没有 PP 标记。该链定义了应用于排列的程序顺序。在合并 SAM 文件时,可以修改 PP 值,以处理 PG ID 的碰撞。链中的第一条 PG 记录(即 SAM 记录中 PG 标记所指的记录)描述了对 SAM 记录进行操作的最新程序。链中的下一条 PG 记录描述了在 SAM 记录上操作的下一个最新程序。SAM 记录上的 PG ID 并不要求指向链中最新的 PG 记录。它可以指向链中的任何 PG 记录,这意味着 SAM 记录已被该 PG 记录中的程序和通过 PP 标签指向的程序操作过。
DS
说明可使用 UTF-8 编码。
VN
程序版本
@CO
单行文本注释。允许使用无序的多行 @CO。可使用 UTF-8 编码。
1.3.1 已定义的子排序术语
虽然 SS 子排序字段允许执行定义关键字,但有些术语是预定义的,具有特定含义。 词典排序顺序被定义为基于字符的词典排序,其字符顺序由 POSIX C 本地语言定义。例如,"abc"、"abc17"、"abc5"、"abc59 "和 "abcd "按词典顺序排列。 自然排序与词典排序类似,但相邻数字的流被视为嵌入文本字符串中的数字,相互比较时按数字排序,而与周围的非数字字符比较时则按个位数排序。仅在前导零的个数上存在差异(因此在数字上是并列的)的字符串,则按多零在前,少零在后的顺序排列。字符"-"和". "被视为普通字符,因此明显的负值或小数不被视为内嵌数字的一部分。例如,"abc"、"abc+5"、"abc
"、"abc.d"、"abc03"、"abc5"、"abc008"、"abc08"、"abc8"、"abc17"、"abc17.+"、"abc17.2"、"abc17.d"、"abc59 "和 "abcd "按自然顺序排列。 umi 是按 UMI 标记进行的词典排序。在比较 UMI 时应使用 MI 标记。如果没有 RX 标记,也可以使用 RX 标记,但不能保证在多个库中都是唯一的。
1.3.2 MD5 计算参考
@SQ 行上的 M5 标签允许通过序列本身的 MD5 摘要对参考序列进行唯一标识。由于摘要是基于序列而非其他,因此有助于解决引用命名的歧义。例如,它可以快速检查不同文件中命名为 "1"、"Chr 1 "和 "chr1 "的参考序列实际上是否相同。
参考序列必须使用 7 位 US-ASCII 字符集。所有有效的引用基都可以用这一字符集表示,而且可以避免确定使用的是哪一个 8 位表示法的问题。填充字符(见第 3.2 节)只能使用 "*"字符表示。
摘要的计算方法如下
除 33 ('!') 至
范围之外的所有字符都会被删除。这将删除所有不可打印字符和空白字符,包括空格和新行。其他所有字符都会保留,即使不是合法的核苷酸代码。
所有小写字母都会转换为大写字母。这一操作等同于对 POSIX 本地语言中的字符调用 toupper()。
MD5 摘要的计算方法如 RFC 1321 所述,并以 32 个字符的小写十六进制数表示。
例如,如果引用包含以下字符(包括空格):
ACGT ACGT ACGT
acgt acgt acgt
... 12345 !!!那么摘要就是字符串 ACGTACGTACGTACGTACGTACGT...12345!!! 结果标签就是 M5: dfabdbb36e239a6da88957841f32b8e4。
在填充的 SAM 文件中,填充基应以
' 字符的形式插入到参考文献中。以第 3.2 节中的例子为例,参考文献的填充版本为
AGCATGTTAGATAA**GATAGCTGTGCTAGTAGGCAGTCAGCGCCAT相应的标签为 M5:caad65b937c4bc0b33c08f62a9fb5411。
1.4 对齐部分:必填字段
在 SAM 格式中,每个对齐行通常代表一个数据段的线性对齐。每一行由 11 个或更多用 TAB 分隔的字段组成。前 11 个字段总是存在的,其顺序如下表所示;如果其中任何一个字段所代表的信息不可用,则该字段的值将是一个占位符,即 "0 "或"
",由字段类型决定。下表概述了 SAM 格式中的这些必填字段:
Col
现场
类型
Regexp/Range
简要说明
1
QNAME
字符串
查询模板 NAME
2
FLAG
内部
位操作 FLAG
3
RNAME
字符串
Rname:
参考序列 NAME
4
POS
内部
以 1 为基础的最左侧映射 POSition
5
MAPQ
内部
MAPping 质量
6
CIGAR
字符串
MIDNSHP
雪茄烟串
7
RNEXT
字符串
rname:
rname:
配偶/下一个读者的参考名称
8
PNEXT
内部
队友的位置/下一个读数
9
TLEN
内部
观察到的模板长度
10
SEQ
字符串
.
段 SEQuence
11
QUAL
字符串
ASCII 的 Phred 标度基 QUALity +33
对齐行中的所有映射片段都表示在正向基因组链上。对于已映射到反向链的片段,记录的 SEQ 与未映射的原始序列进行反向互补,CIGAR、QUAL 和对链敏感的可选字段被反转,因此记录的序列碱基与所表示的序列碱基一致。
QNAME:查询模板名称。具有相同 QNAME 的读数/段被视为来自同一模板。QNAME '*' 表示信息不可用。在 SAM 文件中,当一个读数的排列是嵌合的或给出了多个映射时,它可能会占用多个排列行。
FLAG:按位排列的 FLAG 组合。
下表解释了每个位:
位
说明
1
具有多个测序段的模板
2
根据校准器正确校准每一段
4
未映射区段
8
模板中未映射的下一段
16
SEQ 正在反向互补
32
反向互补模板中下一个片段的 SEQ
64
模板中的第一段
128
模板中的最后一段
256
次级排列
512
未通过过滤,如平台/供应商质量控制
1024
PCR 或光学复本
2048
补充校准
对于 SAM 文件中的每个读取/连续文件,都要求与读取相关的一行且仅有一行满足 "FLAG &
'。这一行被称为读取的主要行。
比特 0x100 标志着在某些分析中,当使用的工具意识到该比特时,将不使用对齐方式。当 SAM 中出现多个映射时,它通常用于标记替代映射。
位
表示相应的对齐行是嵌合对齐的一部分。标记为 0x800 的行称为补充行。
位
是判断读取是否未映射的唯一可靠依据。如果设置了
,就不能对 RNAME、POS、CIGAR、MAPQ 以及位
和
做出任何假设。
位 0x10 表示 SEQ 是否已反向补码和 QUAL 反转。当第 0 x 4 位未设置时,这对应于测序段所映射的链路:第 0 x 10 位未设置表示正向链路,设置表示反向链路。当 0 x 4 位被设置时,表示未映射读数是否以从测序机上下来时的原始方向存储。
位
和
反映了所用测序技术中每个模板内固有的读数排序。
如果
和
都被设置,则读数是线性模板的一部分,但既不是第一个读数,也不是最后一个读数。如果
和
都未设置,则读数在模板中的索引未知。这种情况可能发生在非线性模板中,或者在数据处理过程中丢失了这一信息。
如果未设置
,则无法对
和
进行假设。
表中未列出的位保留供将来使用。当前软件在写入时不应设置这些位,在读取时也应忽略它们。
RNAME:比对的参考序列名称。如果存在 @SQ 标题行,RNAME(如果不是
)必须出现在其中一个 SQ-SN 标记中。无坐标的未映射段有一个
,在
这个字段。但是,未映射的线段也可能有一个普通坐标,这样就可以在排序后将其放置在所需的位置上。如果 RNAME 为
,则无法假设 POS 和 CIGAR。 4.POS:第一个 "消耗 "参照基的 CIGAR 运算的以 1 为基准的最左侧映射 POS 位置(见下表)。参考序列中的第一个碱基坐标为 1。对于无坐标的未映射读数,POS 设置为 0。如果 POS 为 0,则不能对 RNAME 和 CIGAR 作任何假设。 5.MAPQ:映射质量。等于
映射位置错误},四舍五入为整数。数值 255 表示没有映射质量。 6.CIGAR:CIGAR 字符串。下表给出了 CIGAR 操作(如果没有,则设置为"
"):
作品
BAM
说明
M
0
配准匹配(可以是序列匹配或不匹配)
是
是
I
1
插入参考资料
是
没有
D
2
从参考资料中删除
没有
是
N
3
从参考文献中跳过的区域
没有
是
S
4
软剪切(SEQ 中存在剪切序列)
是
没有
H
5
硬剪切(剪切序列不存在于 SEQ 中)
没有
没有
P
6
填充(从填充的引用中静默删除)
哟
没有
=
7
序列匹配
是
是
X
8
序列错配
是
是
"消耗查询 "和 "消耗参考 "分别表示 CIGAR 操作是否会导致比对沿着查询序列和参考序列进行。
H 只能作为第一个和/或最后一个操作出现。
S 与 CIGAR 字符串两端之间只能进行 H 运算。
对于 mRNA 到基因组的比对,N 运算代表内含子。对于其他类型的比对,N 的解释没有定义。
操作的长度总和应等于 SEQ 的长度。
RNEXT:模板中下一个读数的主排列参考序列名称。对于最后一个读数,下一个读数是模板中的第一个读数。如果存在 @SQ 标头行,RNEXT(如果不是
或 '
')必须出现在其中一个 SQ-SN 标记中。当信息不可用时,该字段将被设置为 "*";如果 RNEXT 与 RNAME 相同,该字段将被设置为"
"。如果不是'
',且模板中的下一次读取有一个主映射(另见 FLAG 中的位
),则该字段与下一次读取的主行 RNAME 相同。如果 RNEXT 为
,则不能对 PNEXT 和位
进行假设。
PNEXT:1-based 下一读数在模板中的主排列位置。当信息不可用时设置为 0。该字段等于下一个读数主排列行的 POS。如果 PNEXT 为 0,则不能假设 RNEXT 和位
。
TLEN:带符号的观察模板长度(Template LENgth)。对于模板中所有读数的主排列都映射到同一参考序列的主读数,TLEN 的绝对值等于模板的映射末端与模板的映射起点之间的距离(即末端-起点+1)。
注意,映射碱基的定义是与 CIGAR 所描述的参考文献对齐的碱基,因此不包括软缺口碱基。TLEN 字段对于模板最左边的片段是正值,对于最右边的片段是负值,中间片段的符号未定义。如果片段覆盖相同的坐标,则可以任意选择最左和最右的片段,但两端必须有不同的符号。如果是单段模板或当
信息不可用(例如,多片段模板的第一个或最后一个片段未映射,或两个片段映射到了不同的参考序列)。 该字段的目的是标明模板另一端已对齐的位置,而无需读取 SAM 文件的其余部分。遗憾的是,对于模板映射的起点和终点的定义还没有达成明确的共识。因此,确切的定义是由执行定义的。
10.SEQ:段 SEQuence。当不存储序列时,该字段可以是
。如果不是
,序列的长度必须等于 CIGAR 中
操作的长度之和。
表示碱基与参考碱基相同。不能对字母的大小写做任何假设。 11.QUAL(质量):碱基质量加 33 的 ASCII 码(与 Sanger FASTQ 格式中的质量字符串相同)。碱基质量是碱基错误概率的phred-scaled,等于
碱基错误
。如果不存储质量,该字段可以是
。如果不是
,SEQ 必须不是
,质量字符串的长度应等于 SEQ 的长度。
1.5 对齐部分:可选字段
所有可选字段都遵循 TAG:TYPE:VALUE 格式,其中 TAG 是两个字符的字符串,与 /[A-Za-z] [A-Za-z0-9]/ 匹配。在每个对齐行内,任何 TAG 都不得出现超过一次,可选字段的出现顺序也不重要。包含小写字母的 TAG 保留给最终用户。在可选字段中,TYPE 是一个区分大小写的字母,它定义了 VALUE 的格式:
类型
与 VALUE 匹配的 Regexp
说明
A
可打印字符
i
有符号整数
f
单精度浮点数
Z
可打印字符串,包括空格
H
十六进制格式的字节数组
B
cCsSiIf
整数或数字数组
对于整数或数字数组(类型为"
"),第一个字母表示下面逗号分隔数组中的数字类型。该字母可以是'cCsSiIf'中的一个,分别对应 int8_t(有符号 8 位整数)、uint8_t(无符号 8 位整数)、int16_t、uint16_t、int32_t、uint32_t 和 float。
在导入/导出过程中,如果新类型也与数组兼容,则元素类型可以改变。
预定义标记在单独的《序列对齐/映射可选字段规范》中进行了描述。
有关现有标准标记字段的详细信息和创建新标记的约定,请参阅该文档。以"
"、"
"或"
"开头的标记以及在任一位置包含小写字母的标记保留给本地使用,不会在这些规范的任何未来版本中正式定义。
本节介绍以 SAM 格式表示数据的最佳做法。一般情况下,它们不是必需的,但特定软件包可能需要它们才能正常运行。
页眉部分 1 应该有 @HD 行,并指定 SO 标记或 GO 标记(但不能同时指定)。 2 如果已对读数进行了映射,则应出现 @SQ 行。 3 当 RG 标记出现在对齐部分的任何位置时,页眉中应出现一个与 ID 标记匹配的 @RG 行。 4 当 PG 标记出现在对齐部分的任何位置时,页眉中应出现一个与 ID 标记匹配的 @PG 行。
相邻的 CIGAR 行动应有所不同。
不应将任何排列分配给制图质量为 255 的排列。
未映射读数 1 对于伴侣已被映射的未映射成对末端或伴侣对读数,未映射读数的 RNAME 和 POS 应与其伴侣相同。 2 如果模板中的所有线段都未映射,则其 RNAME 应设置为'*',POS 应设置为 0。 3 如果 POS 加上 CIGAR 中
操作的长度总和超过 @SQ 头行(如果存在)LN 字段中指定的长度(SN 等于 RNAME),除非参考序列是环状的(见下文),否则应取消对齐。 4 未映射读数应以它们从测序机上下来时的方向存储,并相应地取消反向标志位(
)的设置。
多重映射 1 当一个数据段出现在多行中以表示该数据段的多重映射时,只有其中一条记录的辅助对齐标志位 (
) 未被设置。RNEXT 和 PNEXT 指向模板中下一次读取的主行。 2 SEQ 和次级排列的 QUAL 应设置为
' 以减小文件大小。
可选标签: 1 如果模板有 2 个以上分段,则应出现 TC 标记。 2 应该有 NM 标签。
循环参考序列
在循环参照序列中跨越坐标 "连接 "的映射(即 @SQ 标头指定 TP : 循环的映射)可表示如下: 1(首选)通常情况下,POS 应介于 1 和 @SQ 标头的 LN 值之间,但 POS 加上
操作的长度总和可能会超过 LN。大于 LN 的坐标将通过减去 LN 来解释,因此
位置上的碱基将被视为映射到
位置上;因此每个(基于 1 的)位置
将被解释为
。 2 或者,这种排列也可以分成几条记录:一条记录代表以 LN 为终点的片段的初始部分,一条记录代表以 1 为终点的片段的最终部分,其他任何记录则代表横跨整个参考序列之间的其他部分。其中一条记录(可任意选择)被视为主要记录,其余记录的补充标志位
被设置。
8.注释哑读数:这些假读数的 SEQ 设置为 *,FLAG 位
和
设置为(二级和过滤),并带有 CT 标记。 1 如果希望在 CT 标签中存储自由文本,请使用键值 "注释"(大写 N)来匹配 GFF3。 2 多区段注释(如带有内含子的基因)应在 SAM 中用多行描述(就像多区段读取一样)。如果有明确的生物学方向(如基因),则第一段(FLAG 位 0x40)用于第一节(如基因的
端)。因此,像 complement(join(85052..85354, 85441..85621, 86097..86284)) 这样的 GenBank 条目位置在 SAM 中会有三行,具有共同的 QNAME:
FLAG
POS
CIGAR
可选字段
5' 片段
86097
188 M
FI:i:1
TC:i:3
中间片段
85441
181 M
FI:i:2
TC:i:3
3' 片段
85052
303M
FI:i:3
TC:i:3
3 如果将 GFF3 转换为 SAM,除了用于 QNAME 的唯一 ID 外,将第 9 列的任何键值存储在 CT 标签中。GFF3 第 1 列(seqid)、第 4 列(start)和第 5 列(end)使用 SAM 列 RNAME、POS 和 CIGAR 编码,以保存长度。GFF3 第 3 列(类型)和第 7 列(链)明确存储在 CT 标记中。其余的 GFF3 第 2 列(源)、第 6 列(分数)和第 8 列(阶段)使用键值 FSource、FScore 和 FPhase 存储在 CT 标签中(大写键值在 GFF3 中受到限制,因此这些名称可避免冲突)。分割位置特征在 GFF3 中用多行描述,在 SAM 中同样成为多区段虚读,并适当填写 RNEXT 和 PNEXT 列。由于 SAM/BAM 中没有对环状基因组原点包裹读数的约定,因此任何包裹原点的 GFF3 特征行都必须在 SAM 中分割成两段。
3 SAM 中的装配序列描述指南
3.1 无衬垫表示法与有衬垫表示法
在描述排列时,我们可以将参考序列视为与其他排列无关的序列。这样的参照序列称为无填充参照。无填充参考序列上的位置称为无填充位置,不受任何排列的影响。当我们使用无加载参照和位置来描述排列时,我们说我们正在使用无加载表示法。
或者,为了描述相同的排列,我们可以修改参考序列,使其包含垫区,为相对于参考序列插入的序列留出空间。填充实际上是一个间隙,通常用星号
表示。包含填充的参照序列称为填充参照。计算
's 的位置称为填充位置。填充的参考序列可能会受到查询排列的影响,而且由于间隙插入,通常比未填充的参考序列要长。一个查询排列的填充位置可能会受到其他查询排列的影响。
无衬垫和有衬垫是相同排列的不同表示。它们可以相互转换,不会丢失任何信息。无填充表示法由于使用固定坐标系比较方便而比较常见,而填充表示法的优点是可以简单地用开始和结束坐标来描述排列,而不需要使用复杂的 CIGAR 字符串。SAM 传统上使用填充表示法进行从头组装。ACE 汇编格式只使用填充表示法。
3.2 填充式 SAM
SAM 格式通常用于描述与无填充参考序列的比对,但也可以描述与填充参考序列的比对。在后一种情况下,我们说使用的是填充的
。填充的 SAM 也是有效的 SAM,不同之处在于使用的参考序列和位置都是填充的。描述填充表示法的方法可能不止一种。我们建议采用以下方法;另请参阅 Cock 等人在
中的讨论。
在填充的 SAM 中,排列和坐标是相对于填充的参考序列来描述的。在传统的填充表示法(如 ACE 文件格式)中,用
's 记录读数中的填充/间隙,与此不同,我们不会在 SAM 格式的 SEQ 字段中写入 *。
相反,我们使用 CIGAR "D "操作将查询序列中的填充描述为从填充参考中删除。在填充的 SAM 中,不使用插入和填充 CIGAR 操作('
'和'
'),因为填充的引用已经考虑了所有的插入。
下面是第 1.1 节中对齐示例的填充 SAM。值得注意的是,ref 的长度是 47 而不是 45。最后三条排列的 POS 都移动了 2。
@HD VN:1.6 SO:coordinate
@SQ SN:ref LN:47
ref 516 ref 1 0 14M2D31M * 0 0 AGCATGTTAGATAAGATAGCTGTGCTAGTAGGCAGTCAGCGCCAT *
r001 99 ref 7 30 14M1D3M = 39 41 TTAGATAAAGGATACTG *
* 768 ref 8 30 1M * 0 0 * * CT:Z:.;Warning;Note=Ref wrong?
r002 0 ref 9 30 3S6M1D5M * 0 0 AAAAGATAAGGATA * PT:Z:1;4;+; homopolymer
r003 0 ref 9 30 5H6M * 0 0 AGCTAA * NM:i:1
r004 0 ref 18 30 6M14N5M * * 0 0 0 ATAGCTTCAGC \
r001 147 ref 39 30 9M = 7 -41 CAGCGGCAT * NM:i:1
这里我们还举例说明了必要时在 SAM 中存储参考序列和参考注释的推荐做法。对于 SAM 中的参考序列,QNAME 应与 RNAME 相同,POS 设为 1,FLAG 设为 516(已过滤且未映射);对于注释,FLAG 应设为 768(已过滤且二级),QNAME 不受限制。用于注释的虚假读数通常会有一个 CT 标签来保存注释信息;参见第 2 节中关于虚假读数的讨论。有关 CT 和 PT 注释标记的全部详情,请参阅单独的《可选字段规范》。
BGZF 是在标准 gzip 文件格式基础上实现的块压缩。
BGZF 的目标是提供良好的压缩效果,同时允许对 BAM 文件进行高效的随机访问,以便进行索引查询。BGZF 格式是 "与 gunzip 兼容 "的,也就是说,兼容 gunzip 的实用程序可以解压 BGZF 压缩文件。
BGZF 文件是一系列连接的 BGZF 块,压缩前后每个块的大小均不超过 64 Kb。每个 BGZF 块本身都是一个符合规范的 gzip 压缩包,其中包含一个 RFC1952 所述格式的 "额外字段"。gzip 文件格式允许包含特定于应用程序的额外字段,这些字段会被符合规范的解压缩执行程序忽略。gzip 规范还允许连接 gzip 文件。解压缩串联 gzip 文件的结果是解压缩数据的串联。
每个 BGZF 块都包含一个标准的 gzip 文件头,并带有以下符合标准的扩展名:
标头中的 F.EXTRA 位被设置,表示存在额外字段。
BGZF 使用的额外字段使用两个子字段 ID 值 66 和 67(ASCII "BC")。
BGZF 额外字段有效载荷(gzip 规范中的字段 LEN)的长度为 2(两个字节的有效载荷)。
BGZF 额外字段的有效载荷是一个 16 位无符号整数,采用 little endian 格式。该整数表示包含的 BGZF 块的大小减一。
在磁盘上,一个完整的 BGZF 文件是一系列块,如下表所示。(根据 RFC1952 的要求,所有整数都是小字尾)。
现场
说明
类型
价值
压缩块列表(直至文件末尾)
ID1
gzip IDentifier 1
uint8_t
31
ID2
gzip IDentifier2
uint8_t
139
CM
gzip 压缩方法
uint8_t
8
FLG
gzip FLaGs
uint8_t
4
MTIME
gzip 修改时间
uint32_t
XFL
gzip eXtra FLags
uint8_t
OS
gzip 操作系统
uint8_t
XLEN
gzip 额外长度
uint16_t
额外子字段(总大小
XLEN
附加 RFC1952 额外子字段(如果存在
SI1
子字段标识符1
uint8_t
66
S12
子字段标识符2
uint8_t
67
SLEN
子字段长度
uint16_t
2
BSIZE
总块大小减 1
uint16_t
附加 RFC1952 额外子字段(如果存在
CDATA
通过 zlib::deflate() 压缩的数据
uint8_t [BSIZE-XLEN-19]
CRC32
CRC-32
uint32_t
ISIZE
输入 SIZE(未压缩数据的长度)
uint32_t
接下来介绍的随机访问方法将每个 BGZF 块的未压缩内容限制为最多
字节的数据。因此,虽然 ISIZE 按照 gzip 格式存储为 uint32_t,但在 BGZF 中,它被限制在