home about terms twitter

Biopythonを用いたEntrezによるtaxidからのmatk配列の取得

date: 2020-02-11 | mod: 2020-02-11

BiopythonのEntrezモジュールを用いて、taxidからmatk配列を取得します。

  • Biopython …バイオインフォマティクスに特化したPythonのライブラリ
  • Entrez …ncbiが提供している統合検索エンジン
  • taxid …NCBI Taxonomy databaseで指定している各生物種のid
  • matk配列 …植物のDNAバーコードに用いられる配列

index


コード全体

動作環境:

  • python 3.6.8
  • biopython 1.76
  • windows10 64bit
input output
txid_list, jpname_list output.fasta
import os, time, textwrap
from Bio import Entrez, SeqIO

txid_list = [63479, 114476, 13443, 60087, 499966]
jpname_list = ["キョウチクトウ", "クチナシ", "コーヒーノキ", "ヘクソカズラ", "ソナレムグラ"]

f = open('output.fasta','w')

Entrez.email = '【ここにメールアドレスを入力する】'

for id in range(len(txid_list)):
    txid = txid_list[id]
    term = "txid" + str(txid) + "[Orgn] AND matk[Gene]"
    handle = Entrez.esearch(db="nucleotide", term=term)
    record = Entrez.read(handle)
    id_list = record["IdList"]
    handle.close()

    try:
        handle2 = Entrez.efetch(db="nucleotide", id=id_list[0], rettype="gb", retmode="text")
        record = SeqIO.read(handle2, "genbank")
        handle2.close()
        jpname = jpname_list[id]
        desc = record.description
        matk_seq = '\n'.join(textwrap.wrap(str(record.seq), 80))
    
        f.write('>' + jpname + '||' + desc + '\n' + matk_seq + '\n\n')

    except IndexError:
        print(jpname_list[id] + 'は見つかりませんでした')
    time.sleep(3)

f.close

入力

今回のコードの入力では、コード中に直接入力しています。
txid_listにtaxidのリスト、jpname_listに和名のリストを記述しています。
今回は、一例としてキョウチクトウ科の植物の和名とtaxidを用意しました。


配列idの検索

BiopythonのEntrezモジュールを用いて、Entrezで検索を行います。ここではまず、ほしい配列のidを検索します。
はじめにEntrez.emailにメールアドレスを指定しています。メールアドレスを記入することが推奨されているため、記入するようにします。
実行時には利用者のメールアドレスを記入してください。

つづいて、txid_listの数だけループ処理を行います。

term = "txid" + str(txid) + "[Orgn] AND matk[Gene]"

検索ワードとして、“txidxxxxxx[Orgn]“と指定することでtaxidと配列レコード中の生物種を結びつけることができます。
また、今回はmatk遺伝子を用いるため、ANDに続いて"matk[Gene]“を指定します。

handle = Entrez.esearch(db="nucleotide", term=term)
record = Entrez.read(handle)
id_list = record["IdList"]
handle.close()

上記で指定したtermを用いてEntrezで検索を行います。今回は塩基配列のデータベースを参照したいため、db=“nucleotide"を指定します。
その後、recordの取得、id_listの取得を行います。

出力として、配列のidが得られたと仮定します。

配列ファイルの検索

続いて配列ファイルそのものの検索を行います。
ここでtryとして、配列ファイルが得られなかった時のエラーハンドリングを行います。
配列が得られなかった時には次のように表示させます。

except IndexError:
        print(jpname_list[id] + 'は見つかりませんでした')

配列が見つからなかった場合には、和名が表示され、配列は取得できていないことになります。

実際に配列を取得するコードは下の通りです。

handle2 = Entrez.efetch(db="nucleotide", id=id_list[0], rettype="gb", retmode="text")
record = SeqIO.read(handle2, "genbank")
handle2.close()
jpname = jpname_list[id]
desc = record.description
matk_seq = '\n'.join(textwrap.wrap(str(record.seq), 80))

f.write('>' + jpname + '||' + desc + '\n' + matk_seq + '\n\n')

配列が得られた和名をjpnameに格納し、descとして配列の説明(学名・遺伝子名など)を取得します。
それらを任意の文に結合して、">“の後ろにつけることでヘッダーとして記録します。

なお、以下のように、

matk_seq = '\n'.join(textwrap.wrap(str(record.seq), 80))

としたのは、FASTAファイルがおよそ80文字で配列を改行させているため、その処理を行わせています。


出力

このコードを実行することで、以下の出力が得られます。

まず、ターミナル(コマンドプロンプト)上では以下の出力が得られます。

ソナレムグラは見つかりませんでした

ソナレムグラに関しては、今回の条件では配列は見つかりませんでした。

続いて、出力されたファイルの内容は以下の通りです。最初の2例のみ示します。

output.fasta

>キョウチクトウ||Nerium oleander maturase K (matK) gene, partial cds; chloroplast
TTTCTCCATAACCAATCTTCTCATTTACGACCAACATCCTTTGGGGTCCTTCTTGAACGAATCTATTTCTATGGAAAAAT
AGAACGTCTTGCCCAAGTCATCGCTAAGGATTTTCAGGCCAACTTATGCTTGTTCAAATATCCTTTCATGCATTATGTTA
GGTATCAAGGAAAATCCATTCTGCTTTCAAGGGGGACGGCTCTTTTGATGAATAAATGGAAATCTTACCTTGTCAATTTT
TGGCAATGGAATTTTGACCTCTGGTTTCACTCGGAAAGGGTCTATATAAAGCAATTGTACAATCATTCCCTTGACTTTAT
GGGTTATCTTTCAATTGTGCGACTAAACCCTTCAATGGTACGGAGTCAAATGCTCGAAAATGCATTTCTAATTAATAATG
CTATTAAGAAATTAGACACCCTTGTTCCAATTATTCCTCTGATTGGATCATTGGCTAAAGCGAAATTTTGTAACCTATTA
GGACATCCCATTAGTAAACCGGTTCG

>クチナシ||Gardenia jasminoides voucher VCEWBT2 DBS maturase K (matK) gene, partial cds; chloroplast
TTATTGATAGAAAGAAACCCAGTTTTTATTTTTCACCAAAAAGAAATCAAAAATTATTCTTCTTGTTATATAATTCTCAT
GTATGTGAATACGAATCCATTTTCTTCTTTCTCCGTAAGGAATCTTCTCATTTGCGATCAACATCTTTTGGAGTCTTTCT
TGAACGGATATATTTCTATGAAAAAAAAGAACGTCTTGTAGAAGTCTTTGCTAAGGATTTTCAAGCCAGTCTATGGTTGT
TCAAAGATCCTTTCATACATTATGTTAGGTATCAAGGAAAATCCATTCTGGTTTCAAATGGGACGCCTCTTTTGATGAAT
AAATGGAAATCTTACCTTGTCAATTTTTGGCAATGTCATTTTGGTATTTGGTTTCACCCGGGAAGGGTCTATATAAACCA
ATTACCCAACTATTCCCTTAACTTTATGGGCTATCTGTCAAGTGTGCGACTAAACCATTCAATGGTACGGAGTCAAATGC
TAGAAAATTCATTTCTAATCAATAATGCTATTAAGAAATTTGATACCCTTGTTCCACTTATTCCCCTCATTG
.
.
.

目的のmatk遺伝子が得られたことが確認されました。