BLAST 検索

EBI では NCBI BLAST が行えるウェブサービスを提供している(EMBL-EBI Web Services)。これを利用することで、Python スクリプト内から直接 NCBI BLAST が利用できる。

BLAST 検索を行う際は、以下のようなオプションを設定することができる。各オプション名をクリックすると、指定できる引数を見ることができる。すべてのオプションを見るには EMBL-EBI Web Services を参照して下さい。

オプション名 意味
email メールアドレス。メールアドレスを省略すると、クエリーが拒否される(HTTP 400)。
title ジョブ名。
program 検索プログラム。blastp、blastx、blastn、tblastx、tblastn が指定できる。
matrix スコアマトリックス。BLOSUM45、BLOSUM50、BLOSUM62、BLOSUM80、BLOSUM90、PAM30、PAM79、PAM250 が指定できる。
alignments 出力アラインメントの最大数。
scores スコアの最大値。
exp E-value の閾値。
match_scores 塩基に対するホモロジー検索を行う際に利用するマッチ・ミスマッチのスコア値。
gapopen ギャップ開始ペナルティ
gapext ギャップ伸長ペナルティ
align 出力フォーマット。0: pairwise; 1: Query-anchored identities; 2: Query-anchored non-identities; 3: Flat query-anchored identities; 4: Flat query-anchored non-identities; 5: BLASTXML; 番号で指定する。
stype 分子タイプ。protein、dna を指定できる。
sequence クエリー配列。
database 検索対象データベース。

次の Python スクリプトは、NCBI BLASTP を利用して、PDB データベースに対してホモロジー検索を行う例である。メールアドレスを省略すると、エラーが発生するので、必ず検索クエリーにメールアドレスを記述すること。

import time
import urllib
import urllib.parse
import urllib.request


base_url = 'http://www.ebi.ac.uk/Tools/services/rest/ncbiblast'

seq = '''
MNGTEGPNFYVPFSNKTGVVRSPFEAPQYYLAEPWQFSMLAAYMFLLIMLGFPINFLTLYVTVQHKKLRTPLNYILLNLA
VADLFMVFGGFTTTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFT
WVMALACAAPPLVGWSRYIPEGMQCSCGIDYYTPHEETNNESFVIYMFVVHFIIPLIVIFFCYGQLVFTVKEAAAQQQES
ATTQKAEKEVTRMVIIMVIAFLICWLPYAGVAFYIFTHQGSDFGPIFMTIPAFFAKTSAVYNPVIYIMMNKQFRNCMVTT
LCCGKNPLGDDEASTTVSKTETSQVAPA
'''
params = {
    'program' : 'blastp',
    'exp' : '1e-10',
    'align' : 5,
    'sequence' : seq,
    'stype' : 'protein',
    'database' : 'pdb',
    'email' : 'sample@biopapyrus.jp'
}
query_data = urllib.parse.urlencode(params).encode('ascii')



exec_url = base_url + '/run'
req = urllib.request.Request(exec_url, query_data)
fh = urllib.request.urlopen(req)
job_id = fh.read().decode('utf-8')
fh.close()



req_status = 'RUNNING'
status_url = base_url + '/status/' + job_id
while req_status == 'RUNNING':
    req = urllib.request.Request(status_url)
    fh = urllib.request.urlopen(req)
    req_status = fh.read().decode('utf-8')
    fh.close()
    if req_status == 'RUNNING':
        time.sleep(10)


result_url = base_url + '/result/' + job_id + '/out'
req = urllib.request.Request(result_url)
fh = urllib.request.urlopen(req)
result_xml = fh.read().decode('utf-8')
fh.close()


with open('./result.xml', mode = 'w', encoding = 'utf-8') as fh:
    fh.write(result_xml)