BioPython で PDB 形式のファイルを取り扱うとき、Bio.PDB、Bio.PDB.PDBParser などのモジュールを利用する。PDBParser
で読み込んだファイルは、次のような構成を持つオブジェクトが作成される。最初に structure
があり、次に model
があり、 chain
、 residue
、 atom
と続きます。
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() | 原子名(スペース(空白文字)が含まれる) |