在 GitHub 上编辑此页面

解析 GFF 文件

注意: GFF 解析尚未集成到 Biopython 中。这份文档是为了使其准备纳入而进行的工作。您可以从以下位置获取 GFF 解析器的当前版本: http://github.com/chapmanb/bcbb/tree/master/gff,它反过来导致了 https://github.com/daler/gffutils。非常欢迎评论。

通用特征格式 (GFF) 是一种生物序列文件格式,用于表示序列上的特征和注释。它是一种制表符分隔的格式,使其易于生物学家使用,并可在文本编辑器和电子表格程序中进行编辑。它定义明确,并且可以通过自动化程序进行解析。GFF 文件可从许多大型测序和注释中心获得。规范 提供了关于格式及其用途的完整详细信息。

Biopython 提供了一个功能齐全的 GFF 解析器,它将处理多个版本的 GFF:GFF3、GFF2 和 GTF。它支持写入最新的 GFF3 版本。

GFF 解析与解析其他文件格式(如 GenBank 或 PDB)不同,因为它不是面向记录的。在 GenBank 文件中,序列被分解为离散的部分,可以作为一个整体进行解析。相反,GFF 是一种面向行的格式,支持嵌套特征。GFF 通常也用于存储仅生物特征,而不是主序列。

这些差异对处理 GFF 方式有一些影响

以下文档提供了一个使用 Python 检查、解析和编写 GFF 文件的实用指南。

检查您的 GFF 文件

由于 GFF 是一种非常通用的格式,因此从了解文件中数据的类型及其结构开始非常有用。GFFExaminer 提供了一个用于检查和查询文件的接口。要检查特征之间的关系,请检查将父特征映射到子特征的字典

import pprint
from BCBio.GFF import GFFExaminer

in_file = "your_file.gff"
examiner = GFFExaminer()
in_handle = open(in_file)
pprint.pprint(examiner.parent_child_map(in_handle))
in_handle.close()

此文件包含对编码序列的灵活三级描述:基因具有 mRNA 转录本;这些 mRNA 转录本各自包含编码序列的共同特征,即 CDS 本身、外显子、内含子和 5' 和 3' 非翻译区。这是一种常见的 GFF 结构,允许表示多个转录本

{('Coding_transcript', 'gene'): [('Coding_transcript', 'mRNA')],
 ('Coding_transcript', 'mRNA'): [('Coding_transcript', 'CDS'),
                                 ('Coding_transcript', 'exon'),
                                 ('Coding_transcript', 'five_prime_UTR'),
                                 ('Coding_transcript', 'intron'),
                                 ('Coding_transcript', 'three_prime_UTR')]}

在设计解析策略时,另一个感兴趣的项目是了解用于标记特征的各种标签。这些标签包括

检查器中的 available_limits 函数提供了这些特征属性的高级摘要,以及它们在文件中出现的次数

import pprint
from BCBio.GFF import GFFExaminer

in_file = "your_file.gff"
examiner = GFFExaminer()
in_handle = open(in_file)
pprint.pprint(examiner.available_limits(in_handle))
in_handle.close()
{'gff_id': {('I',): 159,
            ('II',): 3,
            ('III',): 2,
            ('IV',): 5,
            ('V',): 2,
            ('X',): 6},
 'gff_source': {('Allele',): 1,
                ('Coding_transcript',): 102,
                ('Expr_profile',): 1,
                ('GenePair_STS',): 8,
                ('Oligo_set',): 1,
                ('Orfeome',): 8,
                ('Promoterome',): 5,
                ('SAGE_tag',): 1,
                ('SAGE_tag_most_three_prime',): 1,
                ('SAGE_tag_unambiguously_mapped',): 12,
                ('history',): 30,
                ('mass_spec_genome',): 7},
 'gff_source_type': {('Allele', 'SNP'): 1,
                     ('Coding_transcript', 'CDS'): 27,
                     ('Coding_transcript', 'exon'): 33,
                     ('Coding_transcript', 'five_prime_UTR'): 4,
                     ('Coding_transcript', 'gene'): 2,
                     ('Coding_transcript', 'intron'): 29,
                     ('Coding_transcript', 'mRNA'): 4,
                     ('Coding_transcript', 'three_prime_UTR'): 3,
                     ('Expr_profile', 'experimental_result_region'): 1,
                     ('GenePair_STS', 'PCR_product'): 8,
                     ('Oligo_set', 'reagent'): 1,
                     ('Orfeome', 'PCR_product'): 8,
                     ('Promoterome', 'PCR_product'): 5,
                     ('SAGE_tag', 'SAGE_tag'): 1,
                     ('SAGE_tag_most_three_prime', 'SAGE_tag'): 1,
                     ('SAGE_tag_unambiguously_mapped', 'SAGE_tag'): 12,
                     ('history', 'CDS'): 30,
                     ('mass_spec_genome', 'translated_nucleotide_match'): 7},
 'gff_type': {('CDS',): 57,
              ('PCR_product',): 21,
              ('SAGE_tag',): 14,
              ('SNP',): 1,
              ('exon',): 33,
              ('experimental_result_region',): 1,
              ('five_prime_UTR',): 4,
              ('gene',): 2,
              ('intron',): 29,
              ('mRNA',): 4,
              ('reagent',): 1,
              ('three_prime_UTR',): 3,
              ('translated_nucleotide_match',): 7}}

GFF 解析

基本 GFF 解析

通常,GFF 解析器的工作方式类似于 Biopython 中的其他解析器。使用 GFF 文件句柄调用 parse 将返回一组与文件中引用的各种 ID 相对应的 SeqRecord 对象

from BCBio import GFF

in_file = "your_file.gff"

in_handle = open(in_file)
for rec in GFF.parse(in_handle):
    print(rec)
in_handle.close()

rec 对象是一个 Biopython SeqRecord,包含 GFF 文件中描述的特征。这些特征根据原始 GFF 文件中逐行信息按父子关系排序。有关访问这些对象中信息的详细信息,请参阅 SeqRecordSeqFeature 对象的详细文档。

由于 GFF 文件没有分解为明确的记录结构,因此需要读取整个文件,解析所有特征,然后将它们作为记录返回。这对于小文件来说是可以的,但对于大多数实际情况来说,您可能需要将解析限制为一组感兴趣的特征或一次读取一部分行以节省内存。

限制为感兴趣的特征

GFF 文件通常包含许多类型的特征,您可能只对检索其中的一个子集感兴趣。limit_info 参数用于 GFF.parse 允许精确指定要解析、转换为对象和检索的特征。一个例子是检索染色体 1 上的所有编码序列

from BCBio import GFF

in_file = "your_file.gff"

limit_info = dict(gff_id=["chr1"], gff_source=["Coding_transcript"])

in_handle = open(in_file)
for rec in GFF.parse(in_handle, limit_info=limit_info):
    print(rec.features[0])
in_handle.close()

您将获得染色体 1 的单个记录,其中包含内存中所有编码特征,以便进一步操作。根据您的内存需求和工作流程,可能需要对每个染色体或您感兴趣的特征集进行分析。

遍历文件的部分内容

将大型 GFF 文件解析分解为部分内容的另一种方法是限制一次读取的行数。这对于您不需要一次获得所有特征并且可以对每次获得的少量特征执行一些有用的操作的 GFF 文件来说是一个有用的工作流程。为此,请将 target_lines 参数传递给 GFF.parse

from BCBio import GFF

in_file = "your_file.gff"

in_handle = open(in_file)
for rec in GFF.parse(in_handle, target_lines=1000):
    print(rec)
in_handle.close()

解析器将尝试以您请求的行数智能地分解文件。例如,如果 1000 行恰好位于嵌套编码特征(基因 -> 转录本 -> CDS/外显子/内含子)的中间,解析器将继续,直到读取整个特征区域。这有助于确保您拥有完整的特征供分析。

如果您的文件没有特征嵌套,或者您只需要一次读取一行,您可以设置 target_lines=1,解析器将很乐意为您返回一个 SeqRecord 对象,其中每行对应一个 SeqFeature

提供初始序列记录

GFF 记录通常包含注释数据,而序列信息则在单独的 FASTA 格式文件中提供。GFF 解析器可以将注释添加到现有记录中。首先使用 SeqIO 解析序列文件,然后将生成的序列字典提供给 GFF 解析器

from BCBio import GFF
from Bio import SeqIO

in_seq_file = "seqs.fa"
in_seq_handle = open(in_seq_file)
seq_dict = SeqIO.to_dict(SeqIO.parse(in_seq_handle, "fasta"))
in_seq_handle.close()

in_file = "your_file.gff"
in_handle = open(in_file)
for rec in GFF.parse(in_handle, base_dict=seq_dict):
    print(rec)
in_handle.close()

请注意,这只会直接添加到现有的字典中。如果您对 GFF 解析器应用过滤器,则这些过滤器只应用于注释;记录不会从初始序列字典中删除。

编写 GFF3

GFF3Writer 接受一个 SeqRecord 对象 的迭代器,并将每个 SeqFeature 作为 GFF3 行写入

其余限定符是属性的最终键/值对。

特征层次结构表示为父特征的 sub_features。这处理了父特征和子特征的任何任意深度嵌套。

将其他格式转换为 GFF3

from BCBio import GFF
from Bio import SeqIO

in_file = "your_file.gb"
out_file = "your_file.gff"
in_handle = open(in_file)
out_handle = open(out_file, "w")

GFF.write(SeqIO.parse(in_handle, "genbank"), out_handle)

in_handle.close()
out_handle.close()

从头开始编写 GFF3

您可以从头开始创建 Biopython SeqRecordSeqFeature 对象,并使用它们生成 GFF 输出。教程的第 4 章 详细介绍了这些对象,以下示例演示了主要功能

from BCBio import GFF
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.SeqFeature import SeqFeature, FeatureLocation

out_file = "your_file.gff"
seq = Seq("GATCGATCGATCGATCGATC")
rec = SeqRecord(seq, "ID1")
qualifiers = {
    "source": "prediction",
    "score": 10.0,
    "other": ["Some", "annotations"],
    "ID": "gene1",
}
sub_qualifiers = {"source": "prediction"}
top_feature = SeqFeature(
    FeatureLocation(0, 20), type="gene", strand=1, qualifiers=qualifiers
)
top_feature.sub_features = [
    SeqFeature(FeatureLocation(0, 5), type="exon", strand=1, qualifiers=sub_qualifiers),
    SeqFeature(
        FeatureLocation(15, 20), type="exon", strand=1, qualifiers=sub_qualifiers
    ),
]
rec.features = [top_feature]

with open(out_file, "w") as out_handle:
    GFF.write([rec], out_handle)

这将生成以下 GFF

##gff-version 3
##sequence-region ID1 1 20
ID1     prediction      gene    1       20      10.0    +       .       other=Some,annotations;ID=gene1
ID1     prediction      exon    1       5       .       +       .       Parent=gene1
ID1     prediction      exon    16      20      .       +       .       Parent=gene1