GFF3格式 (skbio.io.format.gff3

GFF3(Generic Feature Format version 3)是描述生物序列特征的标准文件格式。它包含文本行,每行由9个制表符分隔的列组成 [1].

格式支持

有嗅探员:是的

读者

writer

对象类

是的

是的

skbio.sequence.Sequence

是的

是的

skbio.sequence.DNA

是的

是的

skbio.metadata.IntervalMetadata

是的

是的

元组的生成器(str类型的序列号, skbio.metadata.IntervalMetadata

格式规范

状态:从0.5.1开始试验。

文件的第一行是标识格式和版本的注释。接下来是一系列的数据线。每个数据行对应于一个注释,由9列组成:SEQID、SOURCE、TYPE、START、END、SCORE、STRAND、PHASE和ATTR。

第9列(ATTR)是“tag=value”格式的特性属性列表。多个“tag=value”对用分号分隔。同一标记的多个值用逗号“,”分隔。以下标记具有预定义的含义:ID、Name、Alias、Parent、Target、Gap、Derives_from、Note、Dbxref、Ontology_term和Is_circular。

格式规范中详细解释了这些列和属性的含义和格式 [1]. 它们被读入GenBank解析器中定义的词汇表 (skbio.io.format.genbank

格式参数

读卡器特定参数

IntervalMetadata GFF3读卡器需要1个参数: seq_id . 它将具有指定序列ID的注释从GFF3文件读入 IntervalMetadata 对象。

DNASequence GFF3读卡器要求 seq_num 作为参数。它指定从包含多个序列注释的GFF3文件中读取哪个GFF3记录。

写入程序特定参数

skip_subregion 是所有GFF3编写器都使用的布尔参数。它指定是否要为要素注释写入每个不连续的子区域。例如,如果一个基因中有两个外显子,则 IntervalMetadata 对象时,它将在GFF3文件中写入一行 skip_subregionTrue 并将写下3行(分别为基因和外显子各一行)当 skip_subregionFalse . 默认是 True .

此外, IntervalMetadata GFF3 writer需要参数 seq_id . 它指定注释所属的序列ID(GFF3文件中的第1列)。

示例

让我们创建一个文件流,其中包含GFF3格式的以下数据:

>>> from skbio import Sequence, DNA
>>> gff_str = """
... ##gff-version 3
... seq_1\t.\tgene\t10\t90\t.\t+\t0\tID=gen1
... seq_1\t.\texon\t10\t30\t.\t+\t.\tParent=gen1
... seq_1\t.\texon\t50\t90\t.\t+\t.\tParent=gen1
... seq_2\t.\tgene\t80\t96\t.\t-\t.\tID=gen2
... ##FASTA
... >seq_1
... ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
... ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
... >seq_2
... ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
... ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
... """
>>> import io
>>> from skbio.metadata import IntervalMetadata
>>> from skbio.io import read
>>> gff = io.StringIO(gff_str)

我们可以读懂它 IntervalMetadata . 每一行都将被读入 IntervalMetadata 对象:

>>> im = read(gff, format='gff3', into=IntervalMetadata,
...           seq_id='seq_1')
>>> im  
3 interval features
-------------------
Interval(interval_metadata=<4604421736>, bounds=[(9, 90)], fuzzy=[(False, False)], metadata={'type': 'gene', 'phase': 0, 'strand': '+', 'source': '.', 'score': '.', 'ID': 'gen1'})
Interval(interval_metadata=<4604421736>, bounds=[(9, 30)], fuzzy=[(False, False)], metadata={'strand': '+', 'source': '.', 'type': 'exon', 'Parent': 'gen1', 'score': '.'})
Interval(interval_metadata=<4604421736>, bounds=[(49, 90)], fuzzy=[(False, False)], metadata={'strand': '+', 'source': '.', 'type': 'exon', 'Parent': 'gen1', 'score': '.'})

我们可以写 IntervalMetadata 对象返回到GFF3文件:

>>> with io.StringIO() as fh:    
...     print(im.write(fh, format='gff3', seq_id='seq_1').getvalue())
##gff-version 3
seq_1   .       gene    10      90      .       +       0       ID=gen1
seq_1   .       exon    10      30      .       +       .       Parent=gen1
seq_1   .       exon    50      90      .       +       .       Parent=gen1

如果GFF3文件没有序列ID,它将返回一个空对象:

>>> gff = io.StringIO(gff_str)
>>> im = read(gff, format='gff3', into=IntervalMetadata,
...           seq_id='foo')
>>> im
0 interval features
-------------------

我们还可以将GFF3文件读入生成器:

>>> gff = io.StringIO(gff_str)
>>> gen = read(gff, format='gff3')
>>> for im in gen:   
...     print(im[0])   # the seq id
...     print(im[1])   # the interval metadata on this seq
seq_1
3 interval features
-------------------
Interval(interval_metadata=<4603377592>, bounds=[(9, 90)], fuzzy=[(False, False)], metadata={'type': 'gene', 'ID': 'gen1', 'source': '.', 'score': '.', 'strand': '+', 'phase': 0})
Interval(interval_metadata=<4603377592>, bounds=[(9, 30)], fuzzy=[(False, False)], metadata={'strand': '+', 'type': 'exon', 'Parent': 'gen1', 'source': '.', 'score': '.'})
Interval(interval_metadata=<4603377592>, bounds=[(49, 90)], fuzzy=[(False, False)], metadata={'strand': '+', 'type': 'exon', 'Parent': 'gen1', 'source': '.', 'score': '.'})
seq_2
1 interval feature
------------------
Interval(interval_metadata=<4603378712>, bounds=[(79, 96)], fuzzy=[(False, False)], metadata={'strand': '-', 'type': 'gene', 'ID': 'gen2', 'source': '.', 'score': '.'})

对于具有序列的GFF3文件,我们可以将其读入 SequenceDNA

>>> gff = io.StringIO(gff_str)
>>> seq = read(gff, format='gff3', into=Sequence, seq_num=1)
>>> seq
Sequence
--------------------------------------------------------------------
Metadata:
    'description': ''
    'id': 'seq_1'
Interval metadata:
    3 interval features
Stats:
    length: 100
--------------------------------------------------------------------
0  ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC
60 ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC
>>> gff = io.StringIO(gff_str)
>>> seq = read(gff, format='gff3', into=DNA, seq_num=2)
>>> seq
DNA
--------------------------------------------------------------------
Metadata:
    'description': ''
    'id': 'seq_2'
Interval metadata:
    1 interval feature
Stats:
    length: 120
    has gaps: False
    has degenerates: False
    has definites: True
    GC-content: 50.00%
--------------------------------------------------------------------
0  ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC
60 ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC

引用