解析に使うプログラムの中には、FASTA形式の配列ファイルではなくPhylip形式のものを要求するものがあります。今回はそのような事情でFASTA形式のデータをPhylip形式に変換する、ちょっとしたスクリプトを書いたので備忘録を兼ねてまとめます。
Phylip形式についてのメモ
参考サイト
Phylip形式については上の参考サイト様にまとめられていたのですが、変換の際に重要そうなのは
- 配列名は本来の定義では10文字しか使えないが、配列名と配列との間にスペースを入れることで配列名長の制限を廃止または緩めた形式も使われている。
- interleaved形式とsequential形式がある。
この2点です。
変換方法
BiopythonのモジュールのAlignIOを使用します。公式のチュートリアルの抜粋・翻訳ですが下にまとめていきます。 AlignIOはSeqIOと概ね似たモジュールで対応しているフォーマットも同じです。 Phylip形式のファイルに対しては次の3通りに対応しているようです。
- phylip
- phylip-sequential
- phylip-relaxed
phylipがinterleavedのPhylip形式ファイル、phylip-sequentialがsequentialなPhylip形式ファイルに対応しています。この2つに関しては配列名の長さが10文字以内という制約があります。3つめのPhylip-relaxedは配列名の長さに制限が無い、interleavedなPhylip形式です。
変換の具体的な方法ですが、BiopythonでFASTA形式として読み込んだ配列データをPhylip形式で書き出すだけです。公式のチュートリアルに"File Format Conversion"としてコードの例が紹介されていました。ただ、配列長が揃っていないとエラーが出ますのでアライメントは事前に行っておく必要があります。チュートリアルのコードを少し変えただけですが今回作成したスクリプトは以下の通りです。
とりあえず配列名の長さに制限の無いphylip-relaxedで出力されますので、適宜コードを変更する必要があります。
#!/usr/bin/python3 import sys import os from Bio import AlignIO def convert(fasta): fasta = sys.argv[1] name = os.path.basename(fasta) name = os.path.splitext(name)[0] outfile = "{0}.phy".format(name) with open(fasta, "r", encoding="UTF-8") as f, open(outfile, "w", encoding="UTF-8") as out: alignments = AlignIO.parse(f, "fasta") AlignIO.write(alignments, out, "phylip-relaxed") if __name__ == '__main__': infile = sys.argv[1] convert(infile)
適当なFASTAファイルを与えると
>Taxon1 AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF >Taxon2 AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF >Taxon3 AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF >Taxon4 AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF
Phylip形式になります。
4 60 Taxon1 AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE Taxon2 AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE Taxon3 AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE Taxon4 AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE FFFFFFFFFF FFFFFFFFFF FFFFFFFFFF FFFFFFFFFF