PDBに対してBLAST検索

PDB には様々な便利なウェブインターフェイスが用意されている(PDB RESTful Web Service interface)。これらのインターフェイスを利用することで、Python からクエリーを作成して PDB に対してホモロジー検索を行うことができる

手順としては、次のようになる。

  1. XML フォーマットのクエリーを作成する
  2. urllib モジュールを利用して、クエリーを送信し、結果を取得する

クエリーの作成

簡単なクエリーのサンプルは、PDB RESTful Web Service interface のページで確認できる。例えば、Accession ID が P50225 であるタンパク質を検索したい場合は次のようにする。

<orgPdbQuery>
    <queryType>org.pdb.query.simple.UpAccessionIdQuery</queryType>
    <accessionIdList>P50225</accessionIdList>
</orgPdbQuery>

また、複雑なクエリーを作成する場合は、まず、PDB の advanced search ページで一度検索する。すると、検索結果のページでは Query details のリンクが表示されるので、このリンク先でクエリー文を確認できる。

PDB XML フォーマットのクエリー

クエリーの送信と結果の取得

クエリーを作成したら、次に PDB に送信し検索を行う。このとき、Python の urllib モジュールを利用する(Python 2.x の場合は urllib2 を利用する)。クエリーは次の URL に送信する必要がある。

http://www.rcsb.org/pdb/rest/search

次は、Accession ID が P50225 とアノテーションされているタンパク質を検索する例である。

import urllib
import urllib.request

# 送信先 URL
url = 'http://www.rcsb.org/pdb/rest/search'

# クエリー作成
query = '''
<orgPdbQuery>
    <queryType>org.pdb.query.simple.UpAccessionIdQuery</queryType>
    <accessionIdList>P50225</accessionIdList>
</orgPdbQuery>
'''

req = urllib.request.Request(url, data = query.encode('ascii'))
fet = urllib.request.urlopen(req)
fet.read().decode('utf-8')
## '1LS6\n1Z28\n2D06\n3QVU\n3QVV\n3U3J\n3U3K\n3U3M\n3U3O\n3U3R\n4GRA\n'

BLAST 検索

BLAST 検索や複数条件による検索も行える。クエリーの作成が難しいため、まず一度 advanced search で検索して、雛形となるクエリーを取得する。次に Python でこのクエリーを編集するなりして、自分のほしいクエリーを作成する。

下のサンプルは、少し複雑な検索を行う例である。次の 2 つの条件を満たすようにしている。

  1. PDB に対して PSI-BLAST 検索を行い、e-value が 1.0 でカットオフ
  2. 3 Å 以下の解像度の X 線結晶解析によって構造決定されたもの

このサンプルコードを pdb_blast.py という名前で保存すれば、次のように実行できる。

python3 pdb_blast.py
## ['1F88', '1GZM', '1HZX', '1L9H', '1U19', '2G87', '2HPY', '2PED', '2X72', '3C9L', '3CAP', '3OAX', '3PQR', '3PXO', '4BEY', '4J4Q', '']

サンプルコード。

import urllib
import urllib.request

    
    
# パラメーターセットアップ
# pdb_fetch_url : BLAST 検索を行うための URL
# params, seq   : BLAST のオプション設定やクエリー配列など
pdb_req_url = 'http://www.rcsb.org/pdb/rest/search'
seq = """
MNGTEGPNFYVPFSNKTGVVRSPFEAPQYYLAEPWQFSMLAAYMFLLIMLGFPINFLTLYVTVQHKKLRTPLNYILLNLA
VADLFMVFGGFTTTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVCKPMSNFRFGENHAIMGVAFT
WVMALACAAPPLVGWSRYIPEGMQCSCGIDYYTPHEETNNESFVIYMFVVHFIIPLIVIFFCYGQLVFTVKEAAAQQQES
ATTQKAEKEVTRMVIIMVIAFLICWLPYAGVAFYIFTHQGSDFGPIFMTIPAFFAKTSAVYNPVIYIMMNKQFRNCMVTT
LCCGKNPLGDDEASTTVSKTETSQVAPA
"""
params = {
    'q_seq'             : seq,
    'q_tool'            : 'psiblast',
    'q_e_cutoff'        : 1.0,
    'q_identity_cutoff' : 30,
    'q_max_resolution'  : 3.0
}
    
    
# クエリー文の作成
# クエリー文のひな形は以下の PDB サイトで一度 advanced search を行うと取得できる 
# http://www.rcsb.org/pdb/search/advSearch.do
xml_query = """
<orgPdbCompositeQuery version="1.0">
  <queryRefinement>
    <queryRefinementLevel>0</queryRefinementLevel>
    <orgPdbQuery>
       <version>head</version>
       <queryType>org.pdb.query.simple.SequenceQuery</queryType>
       <sequence>%(q_seq)s</sequence>
       <searchTool>%(q_tool)s</searchTool>
       <eValueCutoff>%(q_e_cutoff)s</eValueCutoff>
       <sequenceIdentityCutoff>%(q_identity_cutoff)s</sequenceIdentityCutoff>
    </orgPdbQuery>
  </queryRefinement>
  <queryRefinement>
    <queryRefinementLevel>1</queryRefinementLevel>
    <conjunctionType>and</conjunctionType>
    <orgPdbQuery>
      <version>head</version>
      <queryType>org.pdb.query.simple.ResolutionQuery</queryType>
      <refine.ls_d_res_high.comparator>between</refine.ls_d_res_high.comparator>
      <refine.ls_d_res_high.max>%(q_max_resolution)s</refine.ls_d_res_high.max>
    </orgPdbQuery>
  </queryRefinement>
</orgPdbCompositeQuery>
""" % params
    
    
# クエリー文を PDB に送信し、結果を主として、PDB ID を返す
req = urllib.request.Request(pdb_req_url, data = xml_query.encode('ascii'))
fet = urllib.request.urlopen(req)
pdb_list = fet.read().decode('utf-8').split("\n")
fet.close()
pdb_list.pop()


print(pdb_list)