PDB

BioPython で PDB 形式のファイルを取り扱うとき、Bio.PDB、Bio.PDB.PDBParser などのモジュールを利用する。PDBParser で読み込んだファイルは、次のような構成を持つオブジェクトが作成される。最初に structure があり、次に model があり、 chainresidueatom と続きます。

PDB.Parser
  |
  |---structure
  |    |
  |    |--Model
  |         |
  |         |--Chain
  |              |
  |              |--Residue
  |                   |
  |                   |--Atom
  |---structure
  :     :
  :     :

PDB ファイルのダウンロード

PDBList モジュールの retrieve_pdb_file を利用することで、PDB ID を指定して、そのデータをローカルにダウンロードすることができる。pdir オプションを利用して、保存先ディレクトリを指定できる。また、連続して複数のデータをダウンロードするとき、PDB データベースに負荷がかからないように適時に休み時間を設けるとよい。

import time
from Bio.PDB import PDBList

pdb_ids = ['2oit', '3fhc', '3fmo', '3fmp', '5dis']

pdbl = PDBList()

for pdb_id in pdb_ids:
    pdbl.retrieve_pdb_file(pdb_id, pdir='pdb_files/')
    time.sleep(10)

PDB ファイルの読み込み

PDB ファイルを読み込んで、ファイル中に保存されている原子の座標やアミノ酸配列などを取り出すとき、MMCIFParser モジュールを利用する。昔の PDB フォーマット(.pdb)のファイルからデータを取り出すとき、PDBParser モジュールを利用する。

Cα 原子の座標情報を取り出す方法

from Bio.PDB import *

pdb_parser = MMCIFParser()
## pdb_parser = PDBParser()
structure = pdb_parser.get_structure('X', 'pdb_files/2oit.cif')

for model in structure.get_list():
    for chain in model.get_list():
        for residue in chain.get_list():
            for atom in residue.get_list():
                if atom.get_name() == 'CA':
                    print(atom.get_coord())
## [ 30.40500069  26.13999939   1.53799999]
## [ 30.47800064  29.57799911   3.17499995]
## [ 27.0510006   29.72299957   2.9749999 ]
## [ 24.16300011  32.00699997   4.63999987]

アミノ酸配列を取り出す方法

from Bio.PDB import *

pdb_parser = MMCIFParser()
structure = pdb_parser.get_structure('X', 'pdb_files/2oit.cif')
for model in structure.get_list():
    for chain in model.get_list():
        print(chain.get_id())
        for residue in chain.get_list():
            print(residue.get_resname(), end = ' ')
## A
## MET GLY ASP GLU MET ASP ALA MET ILE PRO GLU ARG 
## GLU MET LYS ASP PHE GLN PHE ARG ALA LEU LYS LYS 
## VAL ARG ILE PHE ASP SER...

PDB 形式から FASTA 形式に変換

from Bio.PDB import *

amino_code = {
    'ALA':'A', 'ARG':'R', 'ASN':'N', 'ASP':'D',
    'CYS':'C', 'GLN':'Q', 'GLU':'E', 'GLY':'G',
    'ILE':'I', 'LEU':'L', 'LYS':'K', 'MET':'M',
    'PHE':'F', 'PRO':'P', 'SER':'S', 'THR':'T',
    'TRP':'W', 'TYR':'Y', 'VAL':'V', 'HIS':'H',
    'ASX':'B', 'GLX':'Z', 'UNK':'K'
}

pdb_parser = MMCIFParser()
structure = pdb_parser.get_structure('X', 'pdb_files/2oit.cif')

for model in structure:
    for chain in model:
        chain_id = chain.get_id()
        chain_seq = ''
        for residue in chain:
            aaa = residue.get_resname()
            a = ''
            if (aaa in amino_code):
                a = amino_code[aaa]
            chain_seq += a
        print('>' + chain_id)
        print(chain_seq)
## >A
## MGDEMDAMIPEREMKDFQFRALKKVRIFDSPEELPKERSSLLAVSNKYGLVFAGGASGLQIF
## PTKNLLIQNKPGDDPNKIVDKVQGLLVPMKFPIHHLALSCDNLTLSACMMSSEYGSIIAFFD
## VRTFSNEAKQQKRPFAYHKLLKDAGGMVIDMKWNP...

Atom クラス

Atom クラスのオブジェクトに対して、次のようなメソッドが利用できる。

atom.get_name()原子名(CA、N、O など)
atom.get_id()原子名
atom.get_coord()原子の座標
atom.get_bfactor()Bファクター
atom.get_occupancy()占有率
atom.get_altloc()
atom.get_sigatm()
atom.get_siguij()
atom.get_anisou()
atom.get_fullname()原子名(スペース(空白文字)が含まれる)