ご注文はリード化合物ですか?〜医薬化学録にわ〜

自分の勉強や備忘録などを兼ねて好き勝手なことを書いていくブログです。

Jupiyter Notebook 上での構造式描写

ケモインフォマティクスと他の情報分野との最大の差異は、構造式を扱うことであると思います。
有機化学にとって構造式は切っても切れない関係にあり、それはプログラミング上においても例外ではありません。
構造式の情報を確認するのにも、RDKit は有用なライブラリとなります。
以下、構造式の描写方法を具体例を挙げて示しますが、先行のブログに詳細は書かれているので、詳しくはそちらをご覧頂ければと思います。

rdkit.blogspot.com

Draw molecules as SVG in horizontal layout #Drawing #RDKit #memoiwatobipen.wordpress.com

import numpy as np
import pandas as pd
from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole
mol = Chem.MolFromSmiles("CC(C)CCc1ccc([C@@H](C)C(=O)O)cc1")
mol

上記のコードのキモは、IPythonConsole を読み込むことです。一度読み込んでしまえば、mol クラスを構造式として表示してくれるようになるので、データがどのような構造なのか、確認がしやすくなります。RDKit を読み込むときは、一緒に書いておくことをお勧めします。

構造式を表示させるだけでなく、画像データとして出力させたい場合、rdMolDraw2D というクラスを用いると便利です。

import numpy as np
import pandas as pd
from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole, rdMolDraw2D
from IPython.display import SVG

# 化合物の mol データを用意
mol = Chem.MolFromSmiles("CC(C)CCc1ccc([C@@H](C)C(=O)O)cc1")

# rdMolDraw2D クラスを用意して構造式を表示させる用意をする
drawer = rdMolDraw2D.MolDraw2DSVG(300, 300)
drawer.DrawMolecule(mol)
drawer.FinishDrawing()
svg = drawer.GetDrawingText()

# 構造式を svg 形式で出力
with open("structure.svg", 'w') as writer:
    writer.write(svg)
    
# 構造式を表示
SVG(svg)
f:id:imedchem:20200830195253p:plain
出力結果

RDKit のクラスの挙動は結構分かりにくいので、上記の書き方を覚えるなり、自分で色々試したりして慣れていくのが結果的に早く身に付くと思います。
ここで重要なのは、MolDraw2DSVG で Jupyter Notebook 上で表示させる枠を用意し、mol データを入力するということです。svg 形式のデータはテキストと形式が近いらしいので、GetDrawingText で出力用のデータ形式を用意することで、一般的なテキスト形式のデータ出力と同じ要領で構造式のデータを出力することができます。ちなみに、経験上、jpeg 形式や png 形式よりも、svg 形式の方が word や powerpoint 上で構造式をよりきれいに扱うことができます。SVG(svg) はセルの最後に書かないと、構造式を描写してくれないので、少し注意が必要です。

ここから少し応用編です。
構造式中の特定の原子をハイライトしたい、ということも RDKit ならできてしまいます。

import numpy as np
import pandas as pd
from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole, rdMolDraw2D
from IPython.display import SVG

# 化合物の mol データを用意
mol = Chem.MolFromSmiles("CC(C)CCc1ccc([C@@H](C)C(=O)O)cc1")

# rdMolDraw2D クラスを用意して構造式を表示させる用意をする
drawer = rdMolDraw2D.MolDraw2DSVG(1000, 1000)
drawer.drawOptions().addAtomIndices = True
drawer.drawOptions().addStereoAnnotation = True
drawer.DrawMolecule(mol, highlightAtoms = [0, 2, 9])
drawer.FinishDrawing()
svg = drawer.GetDrawingText()

# 構造式を svg 形式で出力
with open("structure_mark.svg", 'w') as writer:
    writer.write(svg)
    
# 構造式を表示
SVG(svg)
f:id:imedchem:20200830195912p:plain
出力結果

drawOption で色々な設定ができます。addAtomIndice を True にすることで、mol クラスの原子のインデックスを図に表示することができます。このインデックスは、mol ファイル固有のものなので、化学的に等価な原子でも異なる整数値をとります。Python なので、インデックスは 0 始まりであることに注意して下さい。addStereoAnnotation で、不斉炭素原子に R, S のタグをつけることができます。DrawMolecule の highlightAtoms で、インデックスのリストを指定することで、対応するインデックスの原子に色をつけることができます。色付けしたい原子が一か所でも、リストとして指定して下さい。
Atom を Bond に書き換えれば、結合のインデックス表示や色付けを行うこともできます。