はじめに
__RDKitで表示した化合物の各原子に番号を表示する方法をご紹介__していきます。
フィンガープリントの生成ルールを勉強したくて、各原子に番号を表示させたいと思っていました。
(この記事の知見を参考にフィンガープリントの生成ルールについてこちらに記事を書きました)
※マテリアルズインフォマティクス関係の内容を他にも投稿していますので、よろしければこちらの一覧から他の投稿も見て頂けますと幸いです。
環境
- windows10
- conda 4.9.2
- python 3.7.1
- rdkit 2020.03.2.0
問題
以下のコードで生成した化合物(今回は例としてibuprofenを扱います)の各原子に番号を表示させようとしていました。
from rdkit import Chem
# ibuprofenの定義(smiles表記をmolに変換)
ibuprofen = Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
ibuprofen
この分子の各原子に番号を表示させることにします。公式ページの該当しそうな記述やろいろ検索してみると"includeAtomNumbers"のオプションが効いていそうと分かったので、以下コードを実行してみましたが各原子に番号は表示されずでした。
from rdkit.Chem import Draw
# includeAtomNumbersをTrueにして番号の表示を試みる
Draw.MolToImage(ibuprofen, includeAtomNumbers = True)
また、「実践マテリアルズインフォマティクス」に掲載されていたコードを参考に以下を実行してみましたが、結果は同じく各原子に番号は表示されずでした…
import rdkit
from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem.Draw.MolDrawing import DrawingOptions
#例としてイブプロフェンへの原子インデックスの表示を試みます
ibuprofen = Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
#文献を参考に原子インデックスを表示する関数を定義
def molview(mole):
DrawingOptions.includeAtomNumbers = True
view = Chem.Draw.MolToImage(mole)
return view
# 実行します
molview(ibuprofen)
解決法
こちらを参考に以下コードで実行すると各原子に番号が表示されました。
from rdkit.Chem import MolFromSmiles
for atom in ibuprofen.GetAtoms():
atom.SetProp("atomLabel", str(atom.GetIdx()))
ibuprofen
また、こちらのコードを参考に以下のコードを実行すると原子も番号とセットで表示されます。(例としてアセトアミノフェンを描きます)
Acetaminophen = Chem.MolFromSmiles('CC(=O)Nc1ccc(O)cc1')
def mol_with_atom_index(mol):
atoms = mol.GetNumAtoms()
for idx in range(atoms):
mol.GetAtomWithIdx(idx).SetProp('molAtomMapNumber', str(mol.GetAtomWithIdx(idx).GetIdx()))
return mol
mol_with_atom_index(Acetaminophen)
原因
問題に示した方法("includeAtomNumbers = True"に設定)では新バージョンにおいて原子に番号を表示することはできません。
どうやら__RDKitのバージョン2020.03.1
以降で仕様が変更__になったようです。
まとめ
RDKitで表示した化合物の各原子に番号を振る方法をご紹介しました。旧バージョンに対する対処方法で上手くいかずに悩んでいる方はぜひ参考にしていただければ幸いです。
上記の方法で各原子に番号を振ることができたので、この知見を使ってフィンガープリントの解釈などをしていきたいと思います。
(フィンガープリントの生成ルールの解釈についてこちらに記事を書きました)