EBI では NCBI BLAST が行えるウェブサービスを提供している(EMBL-EBI Web Services)。これを利用することで、Python スクリプト内から直接 NCBI BLAST が利用できる。
BLAST 検索を行う際は、以下のようなオプションを設定することができる。各オプション名をクリックすると、指定できる引数を見ることができる。すべてのオプションを見るには EMBL-EBI Web Services を参照して下さい。
オプション名 | 意味 |
メールアドレス。メールアドレスを省略すると、クエリーが拒否される(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)