生物信息学的一大核心问题在于解决丰富(但模糊)的数据格式。随着时间的推移,一些简单的方便人类阅读的临时格式已经成为事实上的标准。
—Peter Cock et al. (2010)
Fasta格式
Fasta格式由William R. Pearson和David J. Lipman创造,用于存储无需每个碱基质量得分的序列,包括参考基因组,蛋白序列,编码DNA序列以及转录本序列等。
作为序列条目的集合,此文件格式由两部分组成:序列描述与序列。序列描述以">"号开头,包括序列的标志名与其它(可选)信息;序列存放于描述的下一行,直到下一个以“>”号开头的描述或者文件结尾。例如egfr_flank.fasta文件:
$ head egfr_flank.fasta
>ENSMUSG00000020122|ENSMUST00000138518
CCCTCCTATCATGCTGTCAGTGTATCTCTAAATAGCACTCTCAACCCCCGTGAACTTGGT
TATTAAAAACATGCCCAAAGTCTGGGAGCCAGGGCTGCAGGGAAATACCACAGCCTCAGT
TCATCAAAACAGTTCATTGCCCAAAATGTTCTCAGCTGCAGCTTTCATGAGGTAACTCCA
GGGCCCACCTGTTCTCTGGT
>ENSMUSG00000020122|ENSMUST00000125984
GAGTCAGGTTGAAGCTGCCCTGAACACTACAGAGAAGAGAGGCCTTGGTGTCCTGTTGTC
TCCAGAACCCCAATATGTCTTGTGAAGGGCACACAACCCCTCAAAGGGGTGTCACTTCTT
CTGATCACTTTTGTTACTGTTTACTAACTGATCCTATGAATCACTGTGTCTTCTCAGAGG
CCGTGAACCACGTCTGCAAT
潜在问题
Fasta简单与灵活带来了一个很大的负作用:没有一个严格统一的标准格式。平时一些细节上的小问题就有可能会使程序报错,所以平时在转换fasta格式的时候尽量使用更鲁棒的开源库。
Fasta格式最大的问题在于描述行的序列标志名没有一个统一的规范,例如以下不同说法是否代表同一序列?
>ENSMUSG00000020122|ENSMUST00000138518
> ENSMUSG00000020122|ENSMUST00000125984
>ENSMUSG00000020122|ENSMUST00000125984|epidermal growth factor receptor
>ENSMUSG00000020122|ENSMUST00000125984|Egfr
>ENSMUSG00000020122|ENSMUST00000125984|11|ENSFM00410000138465
没有规范的话就无法通过简单地通过匹配确定给定的标志名是否在头部出现,只好使用模糊匹配。问题是应该以多大的宽容度去匹配标志名呢?过于宽容的匹配是否会带来错误?可想而知,这个问题很快就会变得非常复杂,采用模糊匹配的方式是非常脆弱的。
所幸,有一个更好的方式(也很简单):与其在事后费劲地使用模糊匹配,不如事先定义一个严格且统一的标准。在运行外来的数据之前,进行简单的语义检查确定其是否符合我们的标准。这样的检查也很简单,例如检查:
-
标志名是否重复?
-
手动查看几个条目
-
">"号与标志名之间是否有空格?
-
其它
如果外部数据不符合标准的话,可以通过脚本来清理。注意保留源文件与脚本,如果源文件版本更新,可以重新运行(依然需要先检查文件规范)。
通用格式
一个通用的格式为使用第一个空格将描述行分成两个部分:标志名与注释信息。效果如下:
>gene_00284728 length=231;type=dna
GAGAACTGATTCTGTTACCGCAGGGCATTCGGATGTGCTAAGGTAGTAATCCATTATAAGTAACATGCGCGGAATATCCG
GAGGTCATAGTCGTAATGCATAATTATTCCCTCCCTCAGAAGGACTCCCTTGCGAGACGCCAATACCAAAGACTTTCGTA
GCTGGAACGATTGGACGGCCCAACCGGGGGGAGTCGGCTATACGTCTGATTGCTACGCCTGGACTTCTCTT
gene_00284728为标志名,length=231;type=dna为注释。此外,标志名应该唯一。
当然,这不是唯一标准,不过这样的格式已经被广泛的生物信息学软件采用(例如BEDtools, Samtools, BWA)。通过这样的惯例,使用标志名去寻找特定的序列会变的很容易。
网友评论