liuyujie0136's Website

Logo

A website for self learning, collecting and sharing.

Contact Me

生物信息学常见文件格式

BED文件

BED文件(Browser Extensible Data)格式是UCSC Genome Browser的一个格式,提供了一种灵活的方式来定义的数据行,以用来描述注释信息。BED行有3个必须的列和9个额外可选的列,每行的数据格式要求一致。

必须有以下3列

可选的9列

GTF/GFF文件

GFF全称为General Feature Format;GTF全称为Gene Transfer Format。

GTF文件以及GFF文件都由9列数据组成,这两种文件的前8列都是相同的(一些小的差别),第9列信息展现方式有所不同:

FASTQ文件

二代测序平台获得的原始数据为fastq(或为压缩文件fq.gz)格式,包含双末端测序所得的正向和反向两个文件(通常用“1”和“2”来区分),其内容如下:

附:Phred体系

如果直接把Q值直接对应ASCII码,应该挺方便的,但是Q值有时会有负值,再者,看ASCII码的0-31位都是控制字符,没法打印和保存,能打印的从要从32位的空格开始,所以就可以给实际的Q值加上一个固定值,这样就可以打印出来而保存在fastq文件中了。

所以下面就是固定值加多少的问题。Phred33,就是加了33,也就是10变成43,查表是+。而当时的Solexa加的是64,这就是Phred64。数据处理时,有些软件会根据碱基质量得分的不同做不同处理,所以需要指定正确的编码方式。一般来说,软件会自动进行判断和处理。

不同版本质量得分和质量字符ASCII的关系

由上图可以看出,Phred+33的字符使用33-73,而+64使用59-104之间的ASCII码。所以,只要ASCII小于59的仅仅在Phred+33中使用,而+64的都大于等于59。对于Illumina 1.8+版本,其使用33-74字符,即大于74的只在Phred+64中使用。

如何判断是Phred33还是Phred64

默认读取1000条序列,在这1000条序列中:

VCF文件

VCF是用于描述SNP,INDEL和SV结果的文本文件。VCF文件分为两部分内容:以”#”开头的注释部分;没有”#”开头的主体部分。注释部分有很多对VCF的介绍信息,仔细查看注释部分就可以完全明白VCF各行各列的意义。主体部分中每一行代表一个Variant的信息。

SAM文件

SAM文件由两部分组成:头部信息和比对信息,都是以tab键分隔。

头部信息介绍

每个标题行以字符@开头,后面是两个字母的记录类型代码。在标题中,每一行都是由制表符分隔的。除了@CO行,每个数据字段都遵循格式TAG:VALUE,其中TAG是两个字母组成的字符串,定义了内容和值的格式。每个标题行应该匹配:/^ @(HD|SQ|RG|PG)(\\t\[A-Za-z\]\[A-Za-z0-9\]:\[-~\]+)+$ //^@CO\\t.\*/。小写字母是保留给用户自定义内容使用的,不会在任何版本定义中出现。以下给出了定义的记录类型和标记。

比对信息介绍

比对信息部分(alignment section),每一行表示一个片段(segment)的比对信息,包括11个必须的字段(mandatory fields)和一个可选的字段,字段之间用tab分割。必须的字段有11个,顺序固定,不可用时,根据字段定义,可以为0或者*,这是11个字段包括:

  1. QNAME 比对片段的(template)的编号;read name,read的名字通常包括测序平台等信息
  2. FLAG 位标识,template mapping情况的数字表示,每一个数字代表一种比对情况,这里的值是符合情况的数字相加总和
  3. RNAME 参考序列的编号,如果头部注释中对SQ-SN进行了定义,这里必须和其保持一致,另外对于没有mapping上的序列,这里是*
  4. POS 比对上的位置,注意是从1开始计数,没有比对上,此处为0
  5. MAPQ mapping的质量,比对的质量分数,越高说明该read比对到参考基因组上的位置越唯一
  6. CIGAR 简要比对信息表达式(Compact Idiosyncratic Gapped Alignment Report),其以参考序列为基础,使用数字加字母表示比对结果,match/mismatch、insertion、deletion 对应字母MID。比如3S6M1P1I4M,前三个碱基被剪切去除了,然后6个比对上了,然后打开了一个缺口,有一个碱基插入,最后是4个比对上了,是按照顺序的
  7. RNEXT 配对片段(即mate)比对上的参考序列的编号,没有另外的片段,这里是*,同一个片段,用=
  8. PNEXT 配对片段(即mate)比对到参考序列上的第一个碱基位置,若无mate,则为0
  9. TLEN Template(文库插入序列)的长度,最左边的为正,最右边的为负,中间的不用定义正负,不分区段(single-segment)的比对上,或者不可用时,此处为0(ISIZE,Inferred fragment size.详见Illumina中paired end sequencing 和 mate pair sequencing,是负数,推测应该是两条read之间的间隔(待查证),若无mate则为0)
  10. SEQ 序列片段的序列信息,如果不存储此类信息,此处为*,注意CIGAR中M/I/S/=/X对应数字的和要等于序列长度。比对到正链上,此处即为read的序列;比对到互补链上,则是read序列的反向互补(即此处序列与参考基因组正链方向一致)
  11. QUAL 序列的质量信息, read质量的ASCII编码。格式同FASTQ一样。
  12. 第十二列及之后:Optional fields,以tab建分割。

第二列FLAG取值

FLAG(十进制) Bitwise(二进制) 十六进制 内容描述
1 0000 0000 0001 0x1 代表PE测序,如果是0,代表SE测序
2 0000 0000 0010 0x2 代表正常比对,如果是PE测序,还代表PE的两条read之间的比对距离没有明显的偏离插入片段长度
4 0000 0000 0100 0x4 代表这个序列没有mapping到参考序列上
8 0000 0000 1000 0x8 代表这个序列的另一端序列没有比对到参考序列上,比如这条序列是R1,它对应的R2端序列没有比对到参考序列上
16 0000 0001 0000 0x10 代表这个序列比对到参考序列的负链上
32 0000 0010 0000 0x20 代表这个序列对应的另一端序列比对到参考序列的负链上
64 0000 0100 0000 0x40 代表这个序列是R1端序列,read1
128 0000 1000 0000 0x80 代表这个序列是R2端序列,read2
256 0001 0000 0000 0x100 代表这个序列不是主要的比对,一条序列可能比对到参考序列的多个位置,只有一个是首要的比对位置,其他都是次要的
512 0010 0000 0000 0x200 该read没有通过质量控制
1024 0100 0000 0000 0x400 代表这个序列是PCR重复序列
2048 1000 0000 0000 0x800 这条read可能存在嵌合,这个比对的部分只是来自其中的一部分序列(Supplementary alignment)
  1. 关于Supplementary的定义,可以看文档对chimeric alignment(嵌合比对)的描述 chimeric alignment:“嵌合比对” 的形成是由于一条测序read比对到基因组上时分别比对到两个不同的区域,而这两个区域基本没有overlap。因此它在sam文件中需要占用多行记录显示。只有第一个记录被称作”representative”,其他的都是”supplementary”【Chimeric reads are also called split reads】
  2. FLAG包含16时,bam文件中记录的序列是原始序列的反向互补序列,而且质量值也是反向的.

第五列CIGAR字符串

CIGAR 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
  1. “消耗查询序列”与”消耗参考序列”分别指CIGAR是否引起比对沿着查询序列和参考序列的方向向前前进一个或几个碱基
  2. H只能出现在CIGAR的开始或最后
  3. S的两边必为H,否则必须位于CIGAR的两端
  4. 对于mRNA到基因组的比对,N表示内含子。对于其他类型的比对,N的解释未被定义
  5. MIS=X的长度和应该等于SEQ长度

比对信息第12列及之后:可选字段

所有的可选字段服从TAG:TYPE:VALUE格式,其中TAG是两个字符组成的字符串,符合正则表达式/\[A-Za-z\]\[A-Za-z0-9\]/。每个TAG在一个比对行中只能出现一次。小写字母组成的TAG保留给终端用户自定义。在可选字段中,TYPE是大小写敏感的单个字母,用来定义VALUE的格式

TYPE 相应VALUE的正则表达式 描述
A [!-~] 可打印字符
i [-+]?[0-9]+ 有符号的整数(SAM格式对这里整数的范围没有要求,但BAM要求范围是[-2^31, 2^32 ],所以SAM也得在这个范围内)
f [-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)? 单精度浮点数
Z [ !-~]* 可打印字符串,包括空格
H ([0-9A-F][0-9A-F])* 十六进制格式的二进制数列表(例如,二进制列表[0x1a, 0xe3, 0x1]对应十六进制串 ‘1AE301’)
B [cCsSiIf](,[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?)* 整数或数字数组
  1. 对于一个整数或数字列表(类型B),第一位字母指明后面逗号分隔的列表的数字类型,可以是cCsSiIf中的一个,分别对应int8 t (有符号的8位整数), uint8 t (无符号的8位整数), int16 t, uint16 t, int32 t, uint32 t and float(Explicit typing eases format parsing and helps to reduce the file size when SAM is converted to BAM)。输入输出过程中,如果其他类型也能与列表兼容,列表元素的类型可能会改变。
  2. 可选字段-预定义的标签:在SAM可选字段说明中有描述,其中描述了已有的标准TAG字段和自定义字段的细节。以X、Y、Z开头的TAG和包含小写字母的TAG保留为终端用户自定义使用,例如:
    1. AS:i 匹配的得分
    2. XS:i 第二好的匹配的得分
    3. YS:i mate 序列匹配的得分
    4. XN:i 在参考序列上模糊碱基的个数
    5. XM:i 比对到参考基因组上的次数 (bowtie定义)
    6. XO:i gap open的个数,针对于比对中的插入和缺失
    7. XG:i gap 延伸的个数,针对于比对中的插入和缺失
    8. NM:i 编辑距离。但是不包含头尾被剪切的序列。一般来说等于序列中error base的个数
    9. YF:i 该reads被过滤掉的原因。可能为LN(错配数太多,待查证)、NS(read中包含N或者.)、SC(match bonus低于设定的阈值)、QC(failing quality control,待证)
    10. YT:Z 值为UU表示不是pair中一部分(单末端?)、CP(是pair且可以完美匹配)、DP(是pair但不能很好的匹配)、UP(是pair但是无法比对到参考序列上)
    11. MD:Z 比对上的错配碱基的字符串表示
    12. bwa定义
      1. XT:A 比对Type: Unique/Repeat/N/Mate-sw 如 XT:A:U 表示唯一比对
      2. XM:i 比对中mismatch的数目

THE DEVIL 0 AND 1 COORDINATE SYSTEMS IN GENOMICS

https://tidyomics.com/blog/2018/12/09/2018-12-09-the-devil-0-and-1-coordinate-system-in-genomics/

We need to be aware that there are two genomics coordinate systems: 1 based and 0 based. There is really no mystery between these two. You EITHER count start at 0 OR at 1. However, this can make confusions when analyzing genomic data and one may make mistakes if not keep it in mind.

The TWO systems

See the figure below to understand the two systems. credit due to Vince Buffalo from his book Bioinformatics data skills.

There is a nice digital cheat sheet from this post by Obi Griffith, a professor of Medicine (Oncology) and Genetics at Washington University five years ago. We frequently go back to reference it.

Mistakes can happen if not consider the coordinate system carefully

The problem is that different file format uses different coordinate systems. Well, you know it is bioinFORMATics :)

some files such as bed file is 0 based. Two genomic regions:

chr1    0    1000
chr1    1000    2000

when you import that bed file into R using rtracklayer::import(), it will become

chr1     1    1000
chr1    1001    2000

The function converts it to 1 based internally (R is 1 based unlike python).

When you read the bed file with read.table and use GenomicRanges::makeGRangesFromDataFrame() to convert it to a GRanges object, do not forget to add 1 to the start before doing it.

Similarly, when you write a GRanges object to disk using rtracklayer::export, you do not need to worry, R will convert it back to 0 based in file.However, if you make a dataframe out of the GRanges object, and write that dataframe to file, remember to do start -1 before doing it.

A full list of coordinate systems for different files can be found below from Bioinformatics data skills.

Format/library Type
BED 0-based
GTF 1-based
GFF 1-based
SAM 1-based
BAM 0-based ?
VCF 1-based
BCF 0-based ?
Wiggle 1-based
GenomicRanges 1-based
BLAST 1-based
GenBank/EMBL Feature Table 1-based