RDKitからPyMOLを利用する

化学

本ブログではJupyter Notebook上で分子構造を描画するためのライブラリーとして「py3Dmolを使って化学構造をJupyter上で美しく表示する」という記事でpy3Dmolについて説明しました.一方で生命科学の分野で,分子構造を可視化する際に使われるポピュラーなソフトのうちの1つは「PyMOL」だと思います.PyMOLは現在はシュレディンガー社によって管理・配布されていますが,ソースコード自体はオープンソースです.

今回はRDKitのMOLオブジェクトをPyMOLを利用して可視化する方法として,RDKit.Chem.PyMOLモジュールを紹介します.この方法により,Jupyter Notebook上からPyMOLを操作し,分子構造を表示することができるようになります.

類似のライブラリーとして,「IPyMOL」というIPython/Jupyter NotebookからPyMOLを操作するものが存在します.興味のある方は参照してみてください.

準備:PyMOLの起動

RDKitからPyMOLを操作するためには「XML-RPC server」を利用します.使い方は下記のようにコマンドラインからPyMOL起動時に「-R」オプションをつけるだけです.

$ pymol -R

起動したPyMOLの画面上に下のように「xml-rpc server running」と表示が出ていれば大丈夫です.

Launch

分子の準備

今回も3次元構造を有する分子を扱いますので,「RDKitによる3次元構造の生成」という記事で用いた「Platinum dataset」を用いることとします.

from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw, PyMol
from rdkit.Chem.Draw import IPythonConsole
print(rdBase.rdkitVersion) # 2018.09.1
suppl = Chem.SDMolSupplier('./platinum_dataset_2017_01.sdf')
mols = [x for x in suppl if x is not None]
len(mols) # 4548

RDKitからのPyMOLの利用

MolViewer.ShowMol(mol, name, showOnly, confId)
MolViewer.SetDisplayStyle(obj, style)
MolViewer.GetPNG(h, w, preDelay)
MolViewer.SaveFile(filename)

PyMOL関連のコードはRDKit.Chem.Pymolにあります.具体的な手順としてはPyMol.MolViewerオブジェクトをまず作成し,それを通して様々な操作を行っていくことになります.

様々なスタイルで分子を描画

下記のコードでは

  1. PyMolViewerオブジェクトを作成
  2. Viewerに分子を表示
  3. PyMOL上の画面をPNG画像として取得
  4. PyMOL上の画面を画像として保存

という順番で処理しています.分子の描画には多少の時間がかかりますので,GetPNGメソッドではpreDelayオプションをつけています.

v = PyMol.MolViewer()
v.ShowMol(mols[0], name='mol')
v.GetPNG(h=350, preDelay=5)
v.SaveFile('./mol0_default.png')

デフォルト設定であるStickモデルで描画されました.

Mol0 default

分子の描画形式はSetDisplayStyleメソッドで指定することが可能です.下のコードでは’lines‘を指定しています.

v.ShowMol(mols[0], name='mol')
v.SetDisplayStyle('mol', 'lines')

Mol0 lines

同様に ‘sticks‘(デフォルト), ‘mesh‘, ‘surface‘を指定すると以下のように見た目を変えることが可能です.

Mol0 sticks

Mol0 mesh

Mol0 surface

複数構造(コンフォマー)の描画

続いて分子の複数のコンフォマーを1つの画面に描画してみます.その際,ShowMolメソッドのShowOnlyオプションをFalseに設定することで構造の重ね描きが可能になります.

Mol40

下記のコードでは上の構造の分子に対して,

  1. コンフォマーを10個生成
  2. 各構造をMMFFによって最適化
  3. 部分構造を生成し各コンフォマーを並べる
  4. PyMOL上にて描画

という手順を行っています.なお並べる鋳型構造としては下記のような2-アミノピリジン部位を用いました.

Mol40 matched

RDKitにおけるコンフォマーの扱いについては「RDKitによるコンフォマーの生成」という記事で解説しています.参照してみてください.
import copy
m = copy.deepcopy(mols[40])
m = Chem.AddHs(m)
# 1. コンフォマー発生
confs = AllChem.EmbedMultipleConfs(m, 10, pruneRmsThresh=1.0)
len(confs) # 10
# 2. MMFFによる最適化
for conf in confs:
    AllChem.MMFFOptimizeMolecule(m, confId=conf)
# 3. 部分構造の生成とアライン
pat = Chem.MolFromSmiles('Nc1ncccc1')
match = m.GetSubstructMatch(pat)
match # (15, 18, 23, 22, 21, 20, 19)
AllChem.AlignMolConformers(m, atomIds=match)
# 4. PyMOL上にて描画
v.DeleteAll()
v.ShowMol(m, name='conf-0', confId=confs[0])
v.SetDisplayStyle('conf-0', 'sticks')
for i in range(1, len(confs)):
    v.ShowMol(m, name='conf-'+str(i), confId=confs[i], showOnly=False)
    v.SetDisplayStyle('conf-'+str(i), 'lines')

Conformer aligned

PyMOLスクリプトの利用

MolViewer.server.do(command)

これまで,RDKitのPyMOLモジュールが与える機能を用いてJupyter Notebook上に分子を描画してきました.PyMOLの利点の1つとして,独自のスクリプトを利用することによる機能の拡張が挙げられます.例えば有志による様々なスクリプトが公開されており,煩雑なマウス操作をすることなく分子の操作が行えたりします.

RDKitのPyMOLモジュールでもserverコマンドを利用することで独自スクリプトなどを利用することが可能になります.以下の例では「.pymolrc」ファイルに「run ~/bin/pymolSample.py」などと書き込んでおき,「modStick」という分子を描画する関数を定義したスクリプトファイル(pymolSample.py)を事前にPyMOLに読み込んでおきます.

from pymol import cmd

def modStick(mol):
    cmd.show("sticks", mol)
    cmd.show("spheres", mol)
    cmd.color("gray","elem C and "+mol)
    cmd.set("stick_radius",0.07, mol)
    cmd.set("sphere_scale",0.15, mol)
    cmd.alter(mol+" and elem H", "vdw=0.75")
    cmd.set("stick_color","black", mol)
    cmd.set("dash_gap",0.01, mol)
    cmd.hide("nonbonded", mol)
    cmd.hide("lines", mol)

cmd.extend( "modStick", modStick );

上記のようにサンプルスクリプトを読み込んである状態でserver.doメソッドを用いると,自分で定義した「modStick」関数を呼び出すことが可能になります.

v.ShowMol(mols[40], name='mol')
v.server.do('modStick mol')
v.GetPNG(h=350)

分子の描画様式がデフォルトの’sticks’とは異なることがおわかり頂けると思います.

ModStick

今回のサンプルスクリプトはRobert Patonグループの描画テンプレートを参考にさせて頂きました.

終わりに

今回は「RDKitからPyMOLを利用する」という話題について,RDKit.ChemのPyMOLモジュールの使い方を紹介してきました.

今回はPyMOLの利用の基本として,特にJupyter Notebook上で低分子を描画する方法について扱いました.この用途についてはPyMOLよりも「py3Dmolを使って化学構造をJupyter上で美しく表示する」という記事で紹介したpy3Dmolの方が使いやすいというのが個人的な印象です.

一方でPyMOLが最も利用される場面はタンパク質などの生体分子の描画です.次回はタンパク質やそのリガンド構造などを題材に,PyMOLらしい可視化について取り扱っていこうと思います.

コメント

タイトルとURLをコピーしました