py3Dmolを使って化学構造をJupyter上で美しく表示する

02_ケモインフォマティクス

RDKitによる3次元構造の生成」という記事でJupyterノートブック上で化合物の3次元構造を表示するにはpy3Dmolというライブラリを利用するのが広く使われるようになってきていると述べました.実際にpythonのケモインフォマティクス用ライブラリであるrdkitのIPythonConsoleモジュールでも立体構造の表示の際には内部でpy3Dmolをimportして使っていることも説明しました.

今回はpy3Dmolに関して,そもそもどういったライブラリなのかの説明から始めて,詳しい使い方を解説していきたいと思います.是非とも使い方をマスターして美しい立体構造を堪能してください.

なお化学構造の表現方法やケモインフォマティクスでよく用いられるファイル形式については「ケモインフォマティクスで使われるファイル形式と化合物の描画方法」という記事にまとめています.
ケモインフォマティクスで使われるファイル形式と化合物の描画方法
ケモインフォマティクスにおいてコンピュータで化合物を扱うためには,コンピュータが理解しやすい形式で化合物情報を伝える必要があります. 通常我々が使っている構造式は,人間の眼には視覚的にわかりやすい表現方法ですが,コンピュータにとってはわかりにくいため,別の表現方法が必要になります...

3Dmol.jsはバイオインフォマティクス用のjavascriptライブラリ

3Dmol.jsとはピッツバーグ大学のDavid Koesのグループが作成しているjavascriptのライブラリです.Bioinformaticsの研究グループですので,特にタンパク質の立体構造の描画を意識して設計されたライブラリになりますが,低分子の描画にも十分使えます.ライセンスはBSDです.

例としてグルタチオンを3Dmol.jsを使って表示すると下のボックスのようになります.(表示されていない場合はページをリロードしてみてください.)

3Dmol.jsについては次の論文も参照してみてください.「3Dmol.js: molecular visualization with WebGL」Bioinformatics, 2015, 31, 1322.

py3DmolはJupyter上で3Dmol.jsを使うためのpythonライブラリ

今回取り上げるpy3Dmolは,Jupyter上で3Dmol.jsを動かすウィジェットになります.全ての機能が使えるわけではありませんが,APIの多くは共通していますので,3Dmol.jsの公式サイトを読み込むのが勉強には一番よいと思います.

py3Dmolの特長として,一度分子を読み込んでしまえば,IPythonカーネルが動いていなくても描画が可能なことがあげられます.そのためノートブックをipynbファイルとして人と共有しても,相手側で構造を動かすことが可能になります.

py3Dmolのインストール

インストールはcondaまたはpipを使って可能です.

conda install -c conda-forge py3dmol

または

pip install py3Dmol

もしもノートブックではなく,JupyterLabで使いたい場合にはextensionのインストールが必要になります.

jupyter labextension install jupyterlab_3dmol

py3Dmolの基本的な使い方

py3Dmolは以下の4段階で構造を描画します.

  1. py3Dmol.viewオブジェクトの作成
  2. viewオブジェクトに描画したい分子を追加
  3. 描画書式の設定
  4. 表示

RDKitでの構造式描画を詳しく解説」という記事で扱った2次元構造式を描画するrdChemDraw2Dモジュールに似ています.

描画領域の作成

py3Dmol.view()

まずは描画領域を作成する必要があります.ここで作成されるviewオブジェクトは3Dmol.jsの$3Dmol.GLViewerオブジェクトになりますので,公式のAPIを読むことでどんな機能が実装されているかを知ることができます.

デフォルトでは横640 x 縦480の描画領域が作成されます.またviewergridオプションを与えることでグリッドを作成することが可能です.その他のオプションについては下にまとめます.

オプション 説明
width 描画領域の横幅.デフォルトは640
height 描画領域の縦幅.デフォルトは480
viewergrid (m,n)で縦m,横nのグリッドを作成
linked グリッド間で分子の動きをシンクロさせるか否か.デフォルトはTrue
query データベースから化合物をダウンロードして描画領域に設定

データベースからの化合物取得

query=’pdb:pdb-id
query=’cid:pubchem-id

queryオプションを用いるとPDBPubChemから化合物情報を取得できます.CCDCも試してみましたが対応していないようです.通常ダウンロードでもメールアドレスの入力が必要ですし,難しそうですね.

描画する分子の追加

view.addModel(data, format, options)

作成したviewオブジェクトに分子を追加するにはaddModelを用います.入力形式としては

  • pdb
  • sdf (mol)
  • xyz
  • mol2

と代表的な形式はサポートされています.RDKitを用いる場合にはMolオブジェクトをChem.MolToMolBlockメソッドを用いてモルブロック形式へと変更してあげる必要があります.

その他のオプションもいくつか取ることができますが,もっとも使うのはkeepHだと思います.文字通り,水素原子を保持するか否かです.デフォルトはTrueになっています.なおpy3Dmolでのオプション設定はほぼ全て辞書型で指定する必要があります.今回の例であれば,

view.addModel(Chem.MolToMolBlock(mol), 'sdf', {'keepH': False})

のように設定します.

背景色の設定

view.setBackgroundColor(color, alpha)

描画領域の色をHex(16進数)コード,または色の名前で指定します.デフォルトでは白に設定されています.また2つ目引数に透過度を取ることができます.

指定原子へのズームイン

view.zoomTo()

分子の中心へカメラがズームインします.本来はどの原子へと近づくかなど,細かく設定が可能ですがプレゼンテーションで使うわけではない限り必要ないと思います.

描画スタイルの設定

view.setStyle(selection, style)

指定した部位の描画形式のスタイルを設定します.

  • 針金(line)モデル
  • 棒(stick)モデル
  • 空間充填(CPK)モデル

といった一般的なものから,タンパク質の描画に便利なマンガ(cartoon)モデルなどが選択可能です.珍しいものとしてはクロス(cross)モデルという星条のオブジェクトで原子を表現するモデルが選択可能です.CPKと同様に分子の大きさを把握するのに適しています.

style 説明
line 針金モデル
cross クロスモデル
stick 棒モデル
sphere 空間充填モデル
cartoon 2次構造をマンガで表示

スタイルの詳しい設定方法は後ほど具体例で見ていきましょう.

分子モデルの種類:CPKから針金モデルまで」という記事で各描画スタイルについて解説しています.参照してみてください.

モデルの表示

view.show()
view.render()

どちらもviewオブジェクトの中身をJupyter上に表示します.showの方がよく使われているように見受けられます.

py3Dmolを用いた描画例

これから具体例を通していくつかのオプション設定を説明していきます.

例1:構造データのダウンロードと作成したグリッドへの描画

この例では

  1. PubChemからアラニンのデータを取得
  2. 横3 x 縦1のグリッドにアラニンを表示
  3. グリッド毎に描画スタイルを別々に設定
  4. グリッド毎に背景の色を設定
  5. 分子の表示
  6. 描画したviewオブジェクトをpng形式で固定

という一連の作業を行っていきます.

PubChemから構造をダウンロードし,グリッドを作成

アラニンの化合物ID(cid)は5950ですので,query=’cid:5950′を設定します.するとPubChemから立体構造が取得され,自動的に作成したviewオブジェクトに読み込まれます.

さらにグリッドをviewergrid=(1,3)で設定しています.queryで取り込んだ構造が全てのグリッドに反映されます.

これからviewオブジェクトに対して行う分子の追加・描画スタイル・背景の設定などは全てviewer=(m,n)によってどのグリッドに対して設定を行うかを明示することになります.指定しない場合は全てのグリッドに反映されます.

今回は最初からPubChemのcidがわかっている状態でデータを取得しました.名前などの情報のみがわかっている状態からpythonを用いてcidを取得したい場合もあると思います.「pythonで化合物データベースPubChemを使いこなす」という記事に方法をまとめていますので,参照してみてください.

針金モデルのスタイル設定

針金モデルでは以下の設定が可能です.今回はlinewidthを用いて線の太さを太めに設定しています.

設定 説明
hidden モデルを非表示にするかどうか.デフォルトはFalse
linewidth 線の太さ
colorscheme ColorschemeSpec型による要素毎のカラー設定
color ColorSpec型による単一カラー設定.colorschemeと重なった場合は上書き

棒モデルのスタイル設定

棒モデルでは以下の設定が可能です.今回のように何も設定しない場合にも空の辞書型を渡す必要があります.

設定 説明
hidden モデルを非表示にするかどうか.デフォルトはFalse
radius 原子の半径
singleBonds 全ての結合を単結合として表記するか否か.デフォルトはFalse
colorscheme ColorschemeSpec型による要素毎のカラー設定
color ColorSpec型による単一カラー設定.colorschemeと重なった場合は上書き

空間充填モデルのスタイル設定

空間充填モデルでは以下の設定が可能です.今回のように何も設定しない場合にも空の辞書型を渡す必要があります.

設定 説明
hidden モデルを非表示にするかどうか.デフォルトはFalse
radius ファンデルワールス半径の設定を書き換える
scale ファンデルワールス半径を設定比率で拡大・縮小
colorscheme ColorschemeSpec型による要素毎のカラー設定
color ColorSpec型による単一カラー設定.colorschemeと重なった場合は上書き

png画像として出力

view.png()

残念ながらpy3Dmolにはmatplotlibのsavefigメソッドのように,描画した内容をpythonで扱えるメソッドは存在しません.しかし全ての設定を終えてノートブック上に表示したviewオブジェクトのスナップショットを撮るメソッドが実装されています.

まずは分子を好みの大きさ,角度で表示し,view.png()メソッドを呼び出すと,ノートブック上に静止画としてpngファイルが表示されます.それを右クリックで保存することで形式的にpy3Dmolの描画内容を画像として書き出すことができます.

英語になりますが,py3Dmolのpng()メソッドについてのスレッドがgithubにありましたので,参考にしてみてください.

コード例

以上の内容を反映したコードは下記の通りです.

view = py3Dmol.view(width=680, height=250, query='cid:5950', viewergrid=(1,3), linked=False)
view.setStyle({'line': {'linewidth': 5}}, viewer=(0,0))
view.setStyle({'stick': {}}, viewer=(0,1))
view.setStyle({'sphere': {}}, viewer=(0,2))
view.setBackgroundColor('#ebf4fb', viewer=(0,0))
view.setBackgroundColor('#f9f4fb', viewer=(0,1))
view.setBackgroundColor('#e1e1e1', viewer=(0,2))
view.show()
view.png()

例2:分子の部分選択と色の設定

この例では分子の一部を選択し,部分ごとに色を設定していきます.具体的には

  1. PDBからインスリンのデータを取得し,横2 x 縦2のグリッドに配置
  2. 分子の部分毎に描画スタイルや色を変更
  3. 各グリッドにsurfaceオブジェクトを追加
  4. 分子の表示

という作業を行います.

分子の一部の選択

py3Dmolでは色々な方法によって部分構造を選択可能です.ここでは一部だけを取り上げますので,詳細な情報公式APIの「AtomSelectionSpec」を参照してください.

今回の例では,chainを用いてA鎖やB鎖などのチェーン番号を,またelemを用いて亜鉛を元素記号で選択しています.選択した部分構造に対して,それぞれ別の描画設定を施しています.

設定 説明
resn 残基の名前Parent residue name
elem 元素記号(例:’H’,’Ca’)
chain PDBに設定されているチェーン番号(例:’A’)
resi 残基番号

マンガ(cartoon)モデルのスタイル設定

マンガ(cartoon)モデルでは以下の設定が可能です.

設定 説明
color ColorSpec型によるストランドのカラー設定.’spectrum’は残基番号を基準としたグラディエント
style スタイル設定.trace, oval, rectangle(デフォルト), parabola, edgedの5種類
ribbon リボンを幅一定に描画するか否か
arrows βシートの方向を示す矢印を表示するか否か
tubes αヘリックスを円柱で描画するか否か
thickness ストランドの太さ.デフォルトは0.4
opacity 透過度

分子表面(サーフェス)の追加

addSurface(type, style)

溶媒接触表面(SAS)などの分子表面(サーフェス)を追加します.サーフェスの種類は$3Dmol.SurfaceTypeで指定し,

  • VDW(ファンデルワールス表面)
  • MS
  • SAS
  • SES(溶媒排除表面・Connolly表面)

の4種類が選択可能です.今回はVDW,SES,SASを描画しています.

サーフェスのスタイルは透過度や色が指定できます.

設定 説明
opacity 透過度
colorscheme ColorschemeSpec型による要素毎のカラー設定
color ColorSpec型による単一カラー設定.colorschemeと重なった場合は上書き

コード例

以上の内容を反映したコードは下記の通りです.

view = py3Dmol.view(width=680, height=480, query='pdb:1zni', viewergrid=(2,2), linked=False)
view.setStyle({'cartoon': {'color': 'spectrum'}}, viewer=(0,0))
view.setStyle({'chain': 'A'}, {'cartoon': {'color': '#4aa6ff', 'style': 'oval'}}, viewer=(0,1))
view.setStyle({'chain': 'B'}, {'cartoon': {'color': '#f65fab', 'style': 'edged'}}, viewer=(0,1))
view.setStyle({'chain': 'C'}, {'stick': {}}, viewer=(0,1))
view.setStyle({'chain': 'D'}, {'stick': {'color': 'black'}}, viewer=(0,1))
view.setStyle({'cartoon': {'color': 'spectrum'}}, viewer=(1,0))
view.setStyle({'elem': 'Zn'}, {'sphere': {'scale': 2.0}}, viewer=(1,0))
view.setStyle({'sphere': {'color': '#CCD1D1'}}, viewer=(1,1))
view.addSurface(py3Dmol.VDW, {'opacity': 0.5}, viewer=(0,0))
view.addSurface(py3Dmol.SES, {'opacity': 0.6, 'color': '#FADBD8'}, viewer=(0,1))
view.addSurface(py3Dmol.SAS, {'opacity': 0.6, 'color': '#FDEBD0'}, viewer=(1,0))
view.setBackgroundColor('#e1e1e1')
view.show()

例3:グリッド毎に異なるカラースキームの設定

この例では低分子をグリッドに表示していき,それぞれのグリッドで描画に用いるカラーパレットを変更していきます.具体的には

  1. 表示する分子の立体構造を準備
  2. グリッドを作成し,そこに分子を追加
  3. グリッドに異なるカラーパレットを適用
  4. 分子の表示

という作業を行います.描画する分子の2次元構造はこちらです.

これを以下のように立体表記していきます.

py3Dmolのカラーパレット

py3DmolではColorschemeSpec型というクラスにカラーパレットが定義されています.今回は以下のパレットから設定しています.

カラーパレット 説明
‘color’Carbon 炭素の色をcolorで設定.炭素以外の色はdefaultパレットから使用
ssPyMOL PyMolの第2カラーパレット
ssJmol Jmolの第2カラーパレット
Jmol Jmolの第1カラーパレット
default デフォルトのカラーパレット

コード例

以上の内容を反映したコードは下記の通りです.

add_mols = []
for m in mols[:6]:
    m_h = Chem.AddHs(m)
    AllChem.EmbedMolecule(m_h, AllChem.ETKDG())
    add_mols.append(m_h)
color_scheme = ['cyanCarbon', 'blackCarbon', 'ssPyMOL', 'ssJmol', 'Jmol', 'default']
view = py3Dmol.view(width=680, height=400, viewergrid=(2,3), linked=False)
for (n, (i,j)), c in zip(enumerate([(a,b) for a in range(2) for b in range(3)]), color_scheme):
    mb = Chem.MolToMolBlock(add_mols[n])
    view.addModel(mb, 'sdf', {'keepH': False}, viewer=(i,j))
    view.setStyle({'stick': {'colorscheme': c}}, viewer=(i,j))
view.zoomTo()
view.show()

例4:分子を重ね合わせてモデル毎に異なる色で描画

この例では同一のグリッドに複数の分子を重ね合わせて表示し,それぞれを異なる色で描画してみます.今回は異なる色(color)を設定していますが,当然カラースキーム(colorscheme)の適用も可能です.

  1. 表示する分子の立体構造を準備し,鋳型を基準に重ね合わせを行う
  2. 分子をviewerに追加
  3. それぞれの分子に異なる色を適用
  4. 分子の表示

という作業を行います.描画する分子の2次元構造はこちらです.

Example4 mols

これら分子のフェニルボロン酸部位を鋳型として重ね合わせた上で,灰色,シアン,ピンクと異なる色で描画します.

Example4 drawn rev

同じ化合物のコンフォマーの重ね合わせについてはRDKitによるコンフォマーの生成という記事で,今回のように異なる分子の立体構造の重ね合わせについては「RDKitでOpen3DALIGNを用いた立体構造の重ね合わせ」という記事で説明しています.参照してみてください.

モデルの選択

setStyle({‘model’: i}, {描画設定})

前述の分子の部分選択では「chain」などを指定することで,分子の部分構造毎に描画設定を変えてました.viewerに複数のモデルを追加した場合,「model」で追加した順番を指定することで,モデル毎に設定を変えることが可能となります.

コード例

以上の内容を反映したコードは下記の通りです.

## 分子の準備
m1 = Chem.MolFromSmiles('c1ccccc1B(O)O')
m2 = Chem.MolFromSmiles('c1ccc(C(=O)C)cc1B(O)O')
m3 = Chem.MolFromSmiles('c1ccc(C)c(N)c1B(O)O')

## 分子の立体構造を準備
m1 = Chem.AddHs(m1)
AllChem.EmbedMolecule(m1, AllChem.ETKDGv3())

m2 = Chem.AddHs(m2)
AllChem.EmbedMolecule(m2, AllChem.ETKDGv3())

m3 = Chem.AddHs(m3)
AllChem.EmbedMolecule(m3, AllChem.ETKDGv3())

## 分子をフェニルボロン酸を鋳型として重ね合わせる
template = Chem.MolFromSmiles('c1ccccc1B')

refMatch = m1.GetSubstructMatch(template)

for mol in [m2, m3]:
    prbMatch = mol.GetSubstructMatch(template)
    AllChem.AlignMol(prbMol=mol, 
                     refMol=m1, 
                     atomMap=list(zip(prbMatch, refMatch)))

## py3Dmolで表示
view = py3Dmol.view(width=600, height=600)

colors = ['gray', 'cyan', 'pink']

for i, (mol, color) in enumerate(zip([m1, m2, m3], colors)):
    mb = Chem.MolToMolBlock(mol)
    view.addModel(mb, 'sdf')
    ### modelの選択と色の指定
    view.setStyle({'model': i}, {'stick': {'color': color}})

view.setBackgroundColor('#e1e1e1')
view.show()

終わりに

今回はJupyter上での化学構造描画ライブラリとして人気の高いpy3Dmolの使い方を学んできました.今回紹介しなかった内容として,描画領域のアニメーションが挙げられます.これらの魅せるための機能はプレゼンテーションなどで使うのでなければあまり必要がないと思いますので,興味がある方は公式ドキュメントを読んでみてください.

3次元構造を自在に表現できるようになったので,コンフォマーが扱いやすくなりました.次はコンフォマーの生成とその分析を分子力学法を扱いながら見ていきましょう.

>>次の記事:「RDKitによるコンフォマーの生成

コメント

  1. black suit より:

    細かいことだし、読む人はみんな理解できると思うんですが
    描画する分子…のところで、addModelがaddMoldelになってます。
    細かい指摘で申し訳ないです。

  2. alpha より:

    少し気になったのですが、重ねたときに片方は色を変えることはできるのですか?

    • 管理人 より:

      コメントありがとうございます.具体例4として追記させて頂きました.

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