LoginSignup
2
2

More than 1 year has passed since last update.

rdMolDraw2Dモジュールを使って構造式描画をカスタマイズ

Posted at

ブログ本編(実践ケモインフォマティクス)もよろしくお願いします。

類似度マップ(SmililarityMaps)を用いずに、描画方法をカスタマイズ(構造式にハイライトをつけたり、原子をインデックス表示にしたり etc...)についてまとめた。
(本記事は「化学の新しいカタチ」の内容を簡潔にまとめたものです。より詳しい内容は、そちらに載っています)

描画の流れ


描画を色々カスタマイズする場合には、rdMolDraw2Dモジュールを使用する。
このモジュールを使用する場合には、以下の手順をふむ必要がある。

参考HPより



  1. コンテナとなるオブジェクトの作成

  2. コンテナの細かい描画設定

  3. コンテナに描画したい分子を追加

  4. コンテナファイナライズして書き込んだデータを取り出す

  5. データを描画,またはファイルとして保存



コード


モジュールのインストール

conda install -c conda-forge rdkit

分子の準備

from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw
from rdkit.Chem.Draw import rdMolDraw2D
from IPython.display import SVG
from matplotlib.colors import ColorConverter

mol = Chem.MolFromSmiles('Cn1c(=O)c2c(ncn2C)n(C)c1=O')
smiles = Chem.MolToSmiles(mol)

# とりあえずDraw.MolToImage(mol)で描画
img = Draw.MolToImage(mol)
img.save('caffeine_molecule.png',bbox_inches='tight')
img


基本操作

# 1. コンテナを準備(コンテナサイズは300x300とする)
view = rdMolDraw2D.MolDraw2DSVG(300, 300)

# 2.描画設定
option = view.drawOptions()
option.circleAtoms=False
option.continuousHighlight=False

# 3.コンテナに分子を追加
#単一分子の追加
tm = rdMolDraw2D.PrepareMolForDrawing(mol)
#tm = rdMolDraw2D.DrawMolecules(mols)

#複数分子の追加
#tm = rdMolDraw2D.DrawMolecules(mols)
view.DrawMolecule(tm)

# 4.コンテナファイナライズして書き込んだデータを取り出す
view.FinishDrawing()

# 5.6コンテナの描画と保存
svg = view.GetDrawingText()

#保存
with open('caffein_test.svg', 'w') as f:
    f.write(svg)

#描画
SVG(svg)

 


何も設定を変えていないのでDraw.MolToImage(mol)使用時と同じ絵になる。

それぞれのメソッドのオプションなど


新しい化学のカタチより転記)

MolDraw2DSVG.DrawMolecule(mol)などのDrawメソッド

 


































オプション 説明
highlightAtoms ハイライトする原子のリスト
highlightAtomColors ハイライトする原子の色
highlightAtomRadii ハイライトする原子の半径を設定
highlightBonds ハイライトする結合のリスト
highlightBondColors ハイライトする結合の色
legend(s) 凡例

 


MolDraw2DSVG.drawOptions()

オプション






























































オプション 説明
atomLabelDeuteriumTritium 重水素をD, トリチウムをTで表記
atomLabels 原子Idで指定した原子のラベルを設定
additionalAtomLabelPadding 元素記号と結合との間にどの程度マージンを取るか
circleAtoms ハイライトするアトムを円で表示するかどうか
デフォルト:True
continuousHighlight ハイライト領域を塗りつぶすかどうか
デフォルト:True
fillHighlights ハイライトするアトムの円を塗りつぶすかどうか
デフォルト:True
padding 描画領域のうちのマージンの割合(0〜1)
legendFontSize 凡例のフォントサイズ(px単位)
multipleBondOffset 多重結合の2つ目以降の線をどの程度離して描画するか
(オングストローム単位)
addAtomIndices 原子Idを構造式中に表示
デフォルト:False
addBondIndices 結合Idを構造式中に表示
デフォルト:False
annotationFontScale 原子や結合に付記する注釈のフォントサイズ(割合指定)
デフォルト:0.75
addStereoAnnotation 絶対配置R/Sや幾何異性E/Zの表示有無
デフォルト:False

メソッド





























メソッド 説明
useBWAtomPalette 構造式を白黒で描画する
useDefaultAtomPalette 構造式描画に用いる色をデフォルトに戻す
updateAtomPalette 構造式描画に用いる色を,原子番号とRGBのタプルを組とする辞書形式で指定する
setBackgroundColour キャンバス色の変更する
setHighlightColour ハイライト領域のデフォルト色を変更する



描画をカスタマイズする


原子のラベルとハイライトする色を変更してみる。その他にも細々設定する(コード内に説明付記)
(ハイライトする色はmatplotlibをつかって生成したRGBカラーコードを使う)
#RGBカラーコードを生成
color1 = ColorConverter().to_rgb('cyan')
color2 = ColorConverter().to_rgb('skyblue')
color3 = ColorConverter().to_rgb('yellow')
print('cyan:',color1)
print('skyblue:',color2)
print('yellow:',color3)
"""output
cyan: (0.0, 1.0, 1.0)
skyblue: (0.5294117647058824, 0.807843137254902, 0.9215686274509803)
yellow: (1.0, 0.0, 0.0)
"""

# ハイライトする原子と色,円の半径を設定
atoms = [6,8]
atom_colors = {6: color1, 8: color2}
radii = {6: 0.5, 8: 0.5}

# ハイライトする結合と色を指定
bonds = [1,2,3,4,5]
bonds_colors = {1:color1,2:color2,3:color3,4:color3,5:color3}

# コンテナの準備
view = rdMolDraw2D.MolDraw2DSVG(300,350)
tm = rdMolDraw2D.PrepareMolForDrawing(mol)

# 描画オプションの設定
#フォントサイズをやや小さくする
view.SetFontSize(0.9 * view.FontSize())
option = view.drawOptions()

#原子ラベルを設定する
option.atomLabels[6] = 'N1'
option.atomLabels[8] = 'N2'

#二重結合の幅
option.multipleBondOffset=0.07

#描画領域のマージン
option.padding=0.11

#レジェンドのフォントサイズ
option.legendFontSize=20

# コンテナに分子を登録
view.DrawMolecule(tm,
highlightAtoms=atoms,
highlightAtomColors=atom_colors,
highlightAtomRadii=radii,
highlightBonds=bonds,
highlightBondColors=bonds_colors,
legend='caffeine')

#ファイナライズ、保存、描画
view.FinishDrawing()
svg = view.GetDrawingText()
with open('caffein_test.svg', 'w') as f:
    f.write(svg)
SVG(svg)


参考


2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2