生物信息常用文件格式(3)- SAM/BAM
bam格式是目前最常见的比对数据存储格式,其是一种高度压缩的格式,sam是其文本格式,下面将与sam格式进行说明。
sam格式是一个tab键分隔的文本格式,包含两个部分:
- header section (可选的)
- 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字段。除了下诉说明的的标签外,你还可以自由定义新的标签,包含小写字母的标签仅在本地使用,不会在未来的标本中正式定义。
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。每个位数的意思见下表。
十进制 | 十六进制 | 描述 |
---|---|---|
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: 雪茄字符串,下表表示各个字符的含义(如果为‘*’,则表示不可用)
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
最新评论:
发表评论
电子邮件地址不会被公开。 必填项已用*标注