注意: GFF 解析尚未整合到 Biopython 中。此文件致力於使其準備好被納入。您可以從以下網址取得 GFF 解析器的當前版本:http://github.com/chapmanb/bcbb/tree/master/gff,這反過來又導致了 https://github.com/daler/gffutils。非常歡迎您的意見。
通用特徵格式 (Generic Feature Format,GFF) 是一種生物序列檔案格式,用於表示序列上的特徵和註釋。它是一種以 Tab 分隔的格式,使得生物學家可以存取,並在文字編輯器和試算表程式中編輯。它也經過良好定義,可以透過自動化程式解析。許多大型定序和註釋中心都提供 GFF 檔案。規範提供了有關格式及其用途的完整詳細資訊。
Biopython 提供功能完整的 GFF 解析器,可以處理多個版本的 GFF:GFF3、GFF2 和 GTF。它支援寫入最新版本的 GFF3。
GFF 解析與解析其他檔案格式(如 GenBank 或 PDB)的不同之處在於,它不是以紀錄為導向的。在 GenBank 檔案中,序列被分解為可以整體解析的離散部分。相反,GFF 是一種以行導向的格式,支援巢狀特徵。GFF 也通常用於僅儲存生物特徵,而不儲存主要序列。
這些差異會對您如何處理 GFF 產生一些影響。
以下文件提供了有關在 Python 中檢查、解析和寫入 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')]}
設計您的解析策略的另一個感興趣項目是了解用於標記特徵的各種標籤。這些包括
gff_id
– 所描述的記錄識別碼。這通常會指染色體或其他支架序列。gff_source
– 來自 GFF 檔案第二欄的來源描述,指定特徵是如何產生的。gff_type
– 特徵的類型,從 GFF 檔案的第 3 欄中提取。gff_source_type
– 檔案中來源和類型的所有組合。檢查器中的 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 解析器的工作方式與 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 檔案中的逐行資訊排序為父子關係。有關存取這些物件中資訊的詳細資訊,請參閱有關 SeqRecord
和 SeqFeature
物件的詳細文件。
由於 GFF 檔案沒有分解為明確的記錄結構,因此需要讀取整個檔案、解析所有特徵,然後將它們作為記錄傳回。這對於小型檔案來說還可以,但對於大多數實際情況,您會想要將解析限制為一組感興趣的特徵或一次處理一部分行,以節省記憶體。
GFF 檔案通常包含許多類型的特徵,而您會對擷取這些特徵的子集感興趣。GFF.parse
的 limit_info
引數允許精確指定要解析、轉換為物件和擷取的特徵。一個例子是擷取染色體 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 解析器,這些篩選器只會套用至註釋;不會從初始序列字典中移除記錄。
GFF3Writer
接受 SeqRecord 物件
的迭代器,並將每個 SeqFeature
寫入為 GFF3 行。
seqid
– SeqRecord IDsource
– 具有鍵「source」的特徵限定符type
– 特徵類型屬性start
、end
– 特徵位置score
– 具有鍵「score」的特徵限定符strand
– 特徵鏈屬性phase
– 具有鍵「phase」的特徵限定符其餘的限定符是屬性的最後鍵/值對。
特徵階層表示為父特徵的 sub_features
。這會處理父特徵和子特徵的任何任意深度巢狀結構。
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()
您可以從頭開始建立 Biopython SeqRecord
和 SeqFeature
物件,並使用這些物件來產生 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