【BCBio-GFFの使い方】GFF3をpythonで操作する

GFF3 (General Feature Format version 3) ファイルは、ゲノムアノテーション情報を記録するための標準的な形式です。

本記事では、GFF3ファイルの基本的なフォーマット構造と、PythonからGFF3ファイルを操作することができるBCBio-GFFの使い方を解説します。

GFF3ファイルとは

GFF3 (General Feature Format version 3) ファイルは、ゲノムアノテーション情報を記録するための標準的な形式です。このフォーマットはタブ区切りで9つの必須フィールドを持ち、各フィールドには特定の情報が含まれています。以下に、GFF3ファイルのフォーマットを表形式でまとめて解説します。

列番号 フィールド名 説明 具体例
1 seqid 配列名(染色体やスキャフォールド名)。ゲノム中のどの配列を指しているかを示します。 chr1, ctg123
2 source 特徴を生成したアルゴリズムやデータソースの名前。 GenScan, Ensembl
3 type 特徴の種類。Sequence Ontologyに基づく用語を使用する必要があります(例: gene, exon, mRNAなど)。 gene, exon
4 start 特徴の開始位置(1ベースオフセット)。ゲノム配列上での開始位置を表します。 1300, 5000
5 end 特徴の終了位置(1ベースオフセット)。ゲノム配列上での終了位置を表します。 9000, 5500
6 score 特徴の信頼度を示す数値(浮動小数点値)。値がない場合は.で表記されます。 0.95, .
7 strand 特徴が存在するストランド(正方向または逆方向)。値は以下のいずれか: +(正方向)、-(逆方向)、.(不明)、または?(関連はあるが不明)。 +, -, .
8 phase CDS特徴のコドンフレームを示す値。CDS以外の場合は.で表記されます。値は以下のいずれか: 0, 1, 2。 0, ., 2
9 attributes 特徴に関する追加情報を含むタグと値のペア(セミコロン区切り)。例: ID、Name、Parentなどが含まれます。 ID=gene1;Name=abc

補足情報

  • コメント行: GFF3ファイルの最初の行はバージョン情報を示すコメント行 (##gff-version 3) である必要があります。

  • 空欄フィールド: 値がない場合は.で表記されます。

  • エスケープ文字: セミコロン (;) やイコール (=) など特定の文字はエスケープ処理が必要です。

以下は、上記フィールドと具体例を反映したGFF3ファイルの例です。

##gff-version 3 
chr1 GenScan gene 1300 9000 . + . ID=gene00001;Name=example_gene 
chr1 GenScan mRNA 1300 9000 . + . ID=mrna00001;Parent=gene00001 
chr1 GenScan exon 1300 1500 . + . ID=exon00001;Parent=mrna00001 
chr1 GenScan CDS 1501 9000 . + 0 ID=cds00001;Parent=mrna00001

BCBio-GFFの使い方

BCBio-GFFは、ゲノムアノテーション情報を含むGFF3形式ファイルを解析・操作するために設計されたPythonライブラリです。

  • GFF3ファイルを読み込む際、データはBiopythonのSeqRecordオブジェクトとして扱われます。これにより、染色体や配列情報とそのアノテーションを効率的に操作できます。

  • 将来的にはBiopythonライブラリに統合される予定です。

BCBio-GFFのインストール

pipでインストールできます。

pip install bcbio-gff

これでインストールできました。

GFF3ファイルのサンプルとして、Ensemblの下記のリンクから、Sars_cov_2.ASM985889v3.101.gff3.gzをダウンロードします。新型コロナウイルスの遺伝子アノテーションです。

http://ftp.ensemblgenomes.org/pub/viruses/gff3/sars_cov_2/

圧縮されたgzipファイルを解凍することでテキストファイルとして中身を確認することができます。

gunzip Sars_cov_2.ASM985889v3.101.gff3.gz

中身を確認すると、このようになっています。

##gff-version 3
##sequence-region MN908947.3 1 29903
#!genome-build ENA ASM985889v3
#!genome-version ASM985889v3
#!genome-date 2020-01
#!genome-build-accession NCBI:GCA_009858895.3
MN908947.3 ASM985889v3 region 1 29903 . . . ID=region:MN908947.3;Alias=NC_045512.2,NC_045512v2
###
MN908947.3 ensembl gene 266 13483 . + . ID=gene:ENSSASG00005000003;Name=ORF1ab;biotype=protein_coding;description=ORF1a polyprotein%3BORF1ab polyprotein [Source:NCBI gene (formerly Entrezgene)%3BAcc:43740578];gene_id=ENSSASG00005000003;logic_name=ensembl_covid;version=1
MN908947.3 ensembl mRNA 266 13483 . + . ID=transcript:ENSSAST00005000003;Parent=gene:ENSSASG00005000003;Name=ORF1a;biotype=protein_coding;transcript_id=ENSSAST00005000003;version=1
(以下省略)

また、後で使うため、新型コロナウイルスのゲノムアセンブリされたFASTAファイル(Sars_cov_2.ASM985889v3.dna.toplevel.fa.gz)もダウンロードしておきます。

http://ftp.ensemblgenomes.org/pub/viruses/fasta/sars_cov_2/dna/

ファイルの読み込み

下記のコマンドで、GFF3ファイルを読み込み、レコードの中身を表示できます。

from BCBio import GFF

# ファイルを読み込む
gff_file = 'Sars_cov_2.ASM985889v3.101.gff3'
fh = open(gff_file, "r")
records = GFF.parse(fh)
# 最初の1件を取得
record = next(records)
print('染色体番号:', record.id)
for feature in record.features:
    print('type:', feature.type)
    print('start_pos:', feature.location.start)
    print('end_pos:', feature.location.end)

fh.close()

コードを実行すると、下記のように内容が出力されます。

染色体番号: MN908947.3
type: region
start_pos: 0
end_pos: 29903
type: gene
start_pos: 265
end_pos: 13483
type: gene
start_pos: 265
end_pos: 21555(以下省略)

FASTAファイルとGFFファイルを組み合わせて解析することで、配列情報とアノテーション情報を統合的に扱えます。

from BCBio import GFF
from Bio import SeqIO

fasta_file = "Sars_cov_2.ASM985889v3.dna.toplevel.fa"
gff_file = "Sars_cov_2.ASM985889v3.101.gff3"

# FASTAファイルから配列情報を取得
seq_dict = SeqIO.to_dict(SeqIO.parse(fasta_file, "fasta"))

# GFFファイルをパースし、FASTA配列と関連付け
with open(gff_file) as handle:
    for rec in GFF.parse(handle, base_dict=seq_dict):
        print("染色体番号:", rec.id)
        print("配列長:", len(rec.seq))
        print("配列情報:", rec.seq[:50])

FASTAファイルと組み合わせることで、配列の情報もあわせて取得することができました。

まとめ

本記事では、GFF3ファイルの基本的なフォーマット構造と、PythonからGFF3ファイルを操作することができるBCBio-GFFの使い方を解説します。
BCBio-GFFライブラリを活用することで、PythonからGFF3ファイルの読み込みや書き出し、アノテーションのフィルタリングや親子関係の自動ネストなどが容易になります。
今回は、簡単なGFF3ファイルを扱いましたが、ぜひ、興味のあるデータを対象にBCBio-GFFを活用してみてください。