序列比对/映射格式规范
2023 年 11 月 16 日
摘要
该文档的主版本可以在 https://github.com/samtools/hts-specs 找到。此打印版本为该仓库的 346a94a,最后修改日期如上所示。
SAM 代表序列比对/映射格式。它是一种以制表符分隔的文本格式,包含一个可选的头部部分和一个比对部分。如果存在,头部必须位于比对之前。头部行以'
'开头,而比对行则不以此开头。每个比对行有 11 个强制字段,用于基本的比对信息,如映射位置,以及可变数量的可选字段,用于灵活或特定于比对工具的信息。
此规范适用于 SAM 和 BAM 格式的 1.6 版本。每个 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 术语和概念
模板 A DNA/RNA 序列的一部分是在测序仪上测序的或从原始序列组装而成。
段 A 连续序列或子序列。 读取来自测序机器的原始序列。一个读取可能由多个片段组成。对于测序数据,读取按其测序的顺序进行索引。
线性比对 将读取比对到单个参考序列的比对,可能包括插入、缺失、跳过和剪切,但可能不包括方向变化(即,比对的一部分在正链上,另一部分在反链上)。线性比对可以在单个 SAM 记录中表示。
嵌合比对 无法表示为线性比对的读取的比对。嵌合比对表示为一组没有大重叠的线性比对。通常,嵌合比对中的一个线性比对被视为“代表性”比对,其他的被称为“补充”比对,并通过补充比对标志进行区分。嵌合比对中的所有 SAM 记录具有相同的 QNAME 和相同的
和
标志值(见第 1.4 节)。关于哪个线性比对是代表性的决定是任意的。
读取比对 线性比对或嵌合比对,是对读取的比对的完整表示。
多重比对 读取的正确放置可能会模糊不清,例如,由于重复。在这种情况下,可能会有多个相同读取的比对。其中一个比对被视为主要比对。所有其他比对在表示它们的 SAM 记录中都有次要比对标志。所有 SAM 记录具有相同的 QNAME 和相同的
及 0x80 标志值。通常,指定为主要的比对是最佳比对,但该决定可能是任意的。
1 基坐标系统 一种序列的第一个基数为 1 的坐标系统。在该坐标系统中,区域由闭区间指定。例如,第 3 个和第 7 个基数之间的区域(包括)是
。SAM、VCF、GFF 和 Wiggle 格式使用 1 基坐标系统。 0 基础坐标系统 一种序列的第一个基数为零的坐标系统。在该坐标系统中,区域由半闭半开区间指定。例如,第 3 个和第 7 个基数之间的区域(包括)是
。BAM、BCFv2、BED 和 PSL 格式使用 0 基础坐标系统。
Phred 评分 给定一个概率
,则
的 phred 评分等于
,四舍五入到最接近的整数。
1.2.1 字符集限制
参考序列名称、CIGAR 字符串以及其他几种字段类型在 SAM 及相关格式(如 VCF)中用作其他字段的值或部分值。为了确保这些其他字段的表示是明确的,这些字段类型不允许使用特定的分隔符字符。
查询或读取的名称可以包含范围为 [!- ] 的任何可打印 ASCII 字符,除了 '
',以便 SAM 对齐行可以与头部行轻松区分。(它们的长度也有限制。)
参考序列名称可以包含范围内的任何可打印 ASCII 字符 [!- ],但不包括反斜杠、逗号、引号和括号,即不包括 ',"' () [] {} <> '—并且不能以 '
' 或 '
' 开头。
因此它们匹配以下正则表达式:
为了清晰起见,在本规范的其他地方,我们将这组允许的字符写为字符类 [:rname:],并扩展 POSIX 正则表达式符号以使用
来表示从字符类中省略 '
' 和 '
'。因此,这个正则表达式可以更清晰地写为 [:rname
] [:rname:]*。
每个标题行以字符 '
' 开头,后面跟着本节定义的两字母标题记录类型代码之一。在标题中,每行以制表符分隔,除了 @CO 行外,每个数据字段遵循格式 'TAG:VALUE',其中 TAG 是一个定义 VALUE 格式和内容的两字符字符串。因此,标题行匹配 /^ @(HD|SQ|RG|PG) (
或 /^ @CO t .*/。在每个(非 @CO)标题行中,字段标签不得出现超过一次,字段出现的顺序并不重要。
下表描述了可能使用的头记录类型及其预定义标签。带有
的标签是必需的;例如,每个 @SQ 头行必须具有 SN 和 LN 字段。与比对可选字段(见第 1.5 节)一样,您可以自由添加新标签以用于进一步的数据字段。包含小写字母的标签保留供本地使用,未来版本的此规范中将不会正式定义。
标签
描述
@HD
文件级元数据。可选。如果存在,必须只有一行 @HD,并且它必须是文件的第一行。
VN*
格式版本。接受的格式:/^
.
SO
比对的排序顺序。有效值:unknown(默认)、unsorted、queryname 和 coordinate。对于坐标排序,主要排序键是 RNAME 字段,顺序由头部 @SQ 行的顺序定义。次要排序键是 POS 字段。对于 RNAME 和 POS 相等的比对,顺序是任意的。所有在 RNAME 字段中包含 '
' 的比对在某些其他值之后,但其他情况下是任意顺序。对于 queryname 排序,除了要求在整个文件中一致应用外,没有明确的排序要求。
GO
对齐的分组,表示相似的对齐记录被分组在一起,但文件不一定是整体排序的。有效值:none(默认),query(对齐按 QNAME 分组)和 reference(对齐按 RNAME/POS 分组)。
SS
对齐的子排序顺序。有效值的形式为 sort-order: sub-sort,其中 sort-order 是存储在 SO 标签中的相同值,sub-sort 是一个依赖于实现的以冒号分隔的字符串,进一步描述排序顺序,但有一些在第 1.3.1 节中定义的预定义术语。例如,如果一个算法依赖于坐标排序,在每个坐标上进一步按查询名称排序,则头部可以包含 @HD SO:coordinate SS: coordinate:queryname。
如果主要排序不是预定义的主要排序顺序之一,则应使用 unsorted,子排序实际上是主要排序。例如,如果按辅助标签 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*
LN*
参考序列长度。范围:
AH
指示该序列是一个替代位点。
该值是主组装中该序列的替代位点,格式为 'chr: start-end','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 标签进行的词典排序。MI 标签应用于比较 UMIs。在缺少 MI 标签的情况下,可以使用 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 分隔的字段组成。前十一个字段总是存在,并按下面所示的顺序排列;如果任何字段所表示的信息不可用,则该字段的值将是一个占位符,可能是' 0 '或'
',具体取决于字段的类型。下表概述了 SAM 格式中的这些必填字段:
列
字段
类型
正则表达式/范围
简要描述
1
QNAME
字符串
查询模板名称
2
FLAG
整数
位运算标志
3
RNAME
字符串
名称:
参考序列名称
4
POS
整数
1 基于左侧最左映射位置
5
MAPQ
整数
映射质量
6
CIGAR
字符串
MIDNSHP
CIGAR 字符串
7
RNEXT
字符串
rname:
rname:
参考名称的配偶/下一个阅读
8
PNEXT
整数
配对/下一个读取的位置
9
TLEN
整数
观察到的模板长度
10
SEQ
字符串
.
段 SEQuence
11
QUAL
字符串
Phred 缩放的基本质量的 ASCII +33
所有在比对行中映射的片段都表示在正向基因组链上。对于已映射到反向链的片段,记录的 SEQ 是从原始未映射序列反向互补而来,CIGAR、QUAL 和链敏感的可选字段被反转,因此与表示的序列碱基一致地记录。
QNAME:查询模板名称。具有相同 QNAME 的读取/片段被视为来自同一模板。QNAME '*' 表示信息不可用。在 SAM 文件中,一个读取可能占据多个比对行,当其比对是嵌合的或给出了多个映射时。
标志:按位标志的组合。
每个位在下表中解释:
比特
描述
1
模板具有多个序列段
2
每个片段根据对齐器正确对齐
4
段未映射
8
模板中的下一个段落未映射
16
SEQ 被反向互补
32
模板中下一个片段的 SEQ 被反向互补
64
模板中的第一部分
128
模板中的最后一个部分
256
次级对齐
512
未通过过滤器,例如平台/供应商质量控制
1024
PCR 或光学重复
2048
补充对齐
对于 SAM 文件中的每个读取/拼接,要求与该读取关联的行中只有一行满足 'FLAG &
'。这一行称为读取的主行。
位 0x100 标记在某些分析中不应使用的对齐,当使用的工具意识到此位时。它通常用于在 SAM 中呈现多个映射时标记替代映射。
Bit
表示相应的比对行是嵌合比对的一部分。标记为 0x800 的行称为补充行。
Bit
是唯一可靠的地方来判断读取是否未映射。如果设置了
,则无法对 RNAME、POS、CIGAR、MAPQ 和位
以及
做出任何假设。
位 0x10 表示 SEQ 是否已被反向互补,QUAL 是否被反转。当位 0x4 未设置时,这对应于段被映射到的链:位 0x10 未设置表示正链,而设置则表示反链。当 0x4 被设置时,这表示未映射的读取是否以其原始方向存储,即从测序仪上读取时的方向。
位
和
反映了所使用的测序技术中每个模板内的读取顺序。
如果
和
都被设置,则该读取是线性模板的一部分,但既不是第一个也不是最后一个读取。如果
和
都未设置,则模板中读取的索引是未知的。这可能发生在非线性模板中,或者在数据处理过程中丢失了该信息。
如果
未设置,则无法对
和
做出任何假设。
未在表中列出的位保留供将来使用。在写入时不应设置,在当前软件读取时应忽略。
RNAME:比对的参考序列名称。如果存在 @SQ 头行,RNAME(如果不是
)必须出现在其中一个 SQ-SN 标签中。没有坐标的未映射片段具有
,在
此字段。然而,未映射的片段也可能具有普通坐标,以便在排序后可以放置在所需位置。如果 RNAME 是
,则无法对 POS 和 CIGAR 做出任何假设。 4. POS:第一个“消耗”参考碱基的 CIGAR 操作的 1 基于左侧的映射位置(见下表)。参考序列中的第一个碱基坐标为 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 之间只能有 H 操作和 CIGAR 字符串的两端。
对于 mRNA 与基因组的比对,N 操作表示一个内含子。对于其他类型的比对,N 的解释未定义。
操作的长度总和应等于 SEQ 的长度。
RNEXT:模板中 NEXT 读取的主要比对的参考序列名称。对于最后一个读取,下一读取是模板中的第一个读取。如果存在@SQ 头行,则 RNEXT(如果不是
,或'
')必须出现在一个 SQ-SN 标签中。当信息不可用时,此字段设置为'*',如果 RNEXT 与 RNAME 相同,则设置为'
'。如果不是'
',并且模板中的下一读取有一个主要比对(另见 FLAG 中的位
),则此字段与下一读取的主要行中的 RNAME 相同。如果 RNEXT 是
,则无法对 PNEXT 和位
做出假设。
PNEXT:模板中 NEXT 读取的主比对的基于 1 的位置。当信息不可用时设置为 0。此字段在下一个读取的主行中等于 POS。如果 PNEXT 为 0,则无法对 RNEXT 和位
做出任何假设。
TLEN:签名观察到的模板长度。对于主读取,其中模板中所有读取的主比对都映射到同一参考序列,TLEN 的绝对值等于模板的映射结束与映射开始之间的距离,包括在内(即,结束 - 开始 + 1)。
请注意,映射的碱基被定义为与参考序列对齐的碱基,如 CIGAR 所描述,因此排除了软剪切的碱基。模板的最左侧段的 TLEN 字段为正值,最右侧段为负值,任何中间段的符号是未定义的。如果段覆盖相同的坐标,则选择哪个是最左侧和最右侧是任意的,但两个端点仍必须具有不同的符号。对于单段模板或当
信息不可用(例如,当多段模板的第一个或最后一个片段未映射,或当这两个片段映射到不同的参考序列时)。 该字段的意图是指示模板的另一端已对齐的位置,而无需读取 SAM 文件的其余部分。不幸的是,对于模板映射的开始和结束的定义尚无明确共识。因此,确切的定义是实现定义的。
10. SEQ:片段序列。该字段可以是一个
当序列未存储时。如果不是
,则序列的长度必须等于 CIGAR 中
操作长度的总和。'
' 表示该碱基与参考碱基相同。对字母大小写不能做出假设。 11. QUAL: 基础质量的 ASCII 值加 33(与 Sanger FASTQ 格式中的质量字符串相同)。基础质量是 phred 标度的基础错误概率,等于
基础是错误的
。当质量未存储时,此字段可以是
。如果不是
,SEQ 不能是
,并且质量字符串的长度应等于 SEQ 的长度。
1.5 对齐部分:可选字段
所有可选字段遵循 TAG:TYPE:VALUE 格式,其中 TAG 是一个匹配 /[A-Za-z] [A-Za-z0-9]/ 的两个字符字符串。在每个对齐行中,TAG 不能出现超过一次,可选字段出现的顺序不重要。包含小写字母的 TAG 保留给最终用户。在可选字段中,TYPE 是一个区分大小写的单个字母,定义 VALUE 的格式:
类型
正则表达式匹配值
描述
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 行。 当 RG 标签出现在比对部分的任何位置时,头部中应有一个对应的 @RG 行,且 ID 标签匹配。 当 PG 标签出现在比对部分的任何位置时,头部应有一个对应的 @PG 行,且 ID 标签应匹配。
相邻的 CIGAR 操作应该是不同的。
不应将任何比对分配映射质量 255。
未映射的读取 对于未映射的成对末端或配对读取,其配对已映射,未映射读取的 RNAME 和 POS 应与其配对相同。 如果模板中的所有片段都未映射,则它们的 RNAME 应设置为 '*',POS 应设置为 0。 如果 POS 加上 CIGAR 中
操作的长度总和超过 @SQ 头行中 LN 字段指定的长度(如果存在),且 SN 等于 RNAME,则该比对应标记为未比对,除非参考序列是循环的(见下文)。 未映射的读取应以它们从测序仪上获得的方向存储,并且其反向标志位 (
) 应相应地未设置。
多重映射 当一个段在多行中出现以表示该段的多重映射时,这些记录中只有一个应未设置次级对齐标志位 (
)。RNEXT 和 PNEXT 指向模板中下一个读取的主行。 2 SEQ 和 QUAL 的二次比对应设置为
' 以减少文件大小。
可选标签: 如果模板有超过 2 个部分,则应存在 TC 标签。 2 NM 标签应存在。
循环引用序列
在循环引用序列中跨越坐标“连接”的映射(即那些其 @SQ 头部指定 TP : circular 的映射)可以表示如下: 1(首选)如常,POS 应在 1 和 @SQ 头的 LN 值之间,但 POS 加上
操作的长度总和可能超过 LN。大于 LN 的坐标通过减去 LN 进行解释,因此在
的碱基被视为映射在
位置;因此每个(1 基于)位置
被解释为
。 2 或者,这种对齐可能会分散在多个记录中:一个记录表示在 LN 处结束的段的初始部分,一个记录表示从 1 开始的最终部分,以及任何其他记录表示在整个参考序列中跨越的额外部分。一个记录(任意选择)被视为主记录,其余记录的补充标志位
被设置。
8. 注释虚拟读取:这些的 SEQ 设置为 *,FLAG 位
和
设置(次要和过滤),并且有一个 CT 标签。 如果您希望在 CT 标签中存储自由文本,请使用键值 Note(大写 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
如果将 GFF3 转换为 SAM,请将第 9 列中的任何键值存储在 CT 标签中,唯一 ID 除外,该 ID 用于 QNAME。GFF3 的第 1 列(seqid)、第 4 列(start)和第 5 列(end)使用 SAM 的 RNAME、POS 和 CIGAR 编码以保持长度。GFF3 的第 3 列(type)和第 7 列(strand)明确存储在 CT 标签中。剩余的 GFF3 列第 2 列(source)、第 6 列(score)和第 8 列(phase)使用键值 FSource、FScore 和 FPhase 存储在 CT 标签中(大写键在 GFF3 中受到限制,因此这些名称避免了冲突)。分裂位置特征在 GFF3 中用多行描述,类似地在 SAM 中变成多段虚拟读取,RNEXT 和 PNEXT 列适当地填写。在 SAM/BAM 中没有关于读取环绕圆形基因组原点的约定的情况下,任何环绕原点的 GFF3 特征行必须在 SAM 中拆分为两个段。
3 SAM 中描述组装序列的指南
3.1 无填充与填充表示
为了描述比对,我们可以将参考序列视为与其他比对无关。这样的参考序列称为未填充参考。未填充参考上的位置,称为未填充位置,不受任何比对的影响。当我们使用未填充参考和位置来描述比对时,我们说我们正在使用未填充表示。
或者,为了描述相同的比对,我们可以修改参考序列,使其包含填充,以便为相对于参考插入的序列留出空间。填充实际上是一个间隙,通常用星号
表示。包含填充的参考序列称为填充参考。计算
的位置称为填充位置。填充参考序列可能会受到查询比对的影响,并且由于间隙插入,通常比未填充的参考序列更长。一个查询比对的填充位置可能会受到其他查询比对的影响。
未填充和填充是相同对齐的不同表示。它们可以相互转换而不丢失任何信息。未填充表示由于固定坐标系的便利性而更为常见,而填充表示的优点在于对齐可以简单地通过起始和结束坐标描述,而无需使用复杂的 CIGAR 字符串。SAM 传统上使用填充表示进行 de novo 组装。ACE 组装格式专门使用填充表示。
3.2 填充的 SAM
SAM 格式通常用于描述与未填充参考序列的比对,但它也能够描述与填充参考的比对。在后者的情况下,我们说我们正在使用填充的
。填充的 SAM 是有效的 SAM,但不同之处在于所使用的参考和位置是填充的。描述填充表示可能有多种方式。我们推荐以下方法;另请参见 Cock 等人的讨论
。
在填充的 SAM 中,比对和坐标是相对于填充的参考序列进行描述的。与传统的填充表示法(如 ACE 文件格式)不同,在这些格式中,填充/间隙使用
的方式记录在读取中,我们在 SAM 格式的 SEQ 字段中不写*。
相反,我们将查询序列中的填充描述为从填充参考中删除,使用 CIGAR 的'D'操作。在填充的 SAM 中,插入和填充的 CIGAR 操作('
'和'
')不被使用,因为填充参考已经考虑了所有的插入。
以下显示了第 1.1 节中示例比对的填充 SAM。值得注意的是,ref 的长度为 47 而不是 45。最后三个比对的 POS 都向右移动了 2。连接 2 bp 插入的比对的 CIGAR 也发生了变化。
@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 位无符号整数,采用小端格式。该整数表示包含的 BGZF 块的大小减去一。
在磁盘上,一个完整的 BGZF 文件是一系列块,如下表所示。(所有整数都是小端格式,符合 RFC1952 的要求。)
字段
描述
类型
值
压缩块列表(直到文件末尾)
ID1
gzip 标识符 1
uint8_t
31
ID2
gzip 标识符 2
uint8_t
139
CM
gzip 压缩方法
uint8_t
8
FLG
gzip FLaGs
uint8_t
4
MTIME
gzip 修改时间
uint32_t
XFL
gzip 额外标志
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() 压缩的数据
uint