magattacaのブログ

日付以外誤報

RDKitで3次元構造に挑戦!part 1  〜HALAVEN (Eribulin mesylate)を題材に〜

以前の記事で少し取り上げたHalaven (Eliburin)・・・

f:id:magattaca:20181021210601p:plain エリブリン - Wikipedia


私は構造式をみても全く3次元的な構造がイメージできません。

ところで、ケモインフォマティクス について調べていると度々目にする"RDKit"。

どうやらタダで3Dの描画もできる様です。
さらには日本語で使い方を解説してくださっている素晴らしいブログ(↓)もあります。
future-chem.com

これは入門するしかない! 
ということでRDKit に入門(コピペ)することにしました。。
備忘録を兼ねてコードを貼りますが主に上記ページの引用です。

Pythonも初心者なので怪しい記述がたくさん出てきます。ご容赦ください。

 

最終的には

 1. Eribulin と 元になった天然物 Halichondrin B の比較

 2. RDKitで出した構造と結晶構造の比較

をしてみたいのですが、とりあえずはHalichondrin B の描画に挑戦しました。
とりあえず、分かったことは

 1. SMILES にもCanonical やら Isomeric やら色々ある

 2. 立体構造の描画にプロトンを無視してはいけない

です。
 

(1) PubChemからの情報取得 (参考記事①)

まず、PubChemから化合物の構造に関する情報を取得します。

Halichondrin B と Eribulin の情報をそれぞれpandasのdataframeとして取得しました。

#PubChemPyをpcpとしてimport
import pubchempy as pcp

#列が多すぎるので全列表示するようにpandasを設定する
import pandas as pd
pd.set_option('display.max_columns', None#Halichondrin B とEribulinを名前検索で情報取得
df_hali = pcp.get_compounds('Halichondrin B', 'name', as_dataframe=True)
df_eri = pcp.get_compounds('Eribulin', 'name', as_dataframe=True)


取得される情報は右に記載されていました。API documentation — PubChemPy 1.0.4 documentation

cid PubChem Compound Identifier elements 含まれる元素記号のリスト
atoms 原子のリスト bonds 結合のリスト
synonyms 別名 sids PubChem Substance Identifier
aids PubChem Assay Identifier charge 形式電荷
molecular_formula 分子式 molecular_weight 分子量
canoical_smiles Canoniacal SMILES isomeric_smiles Isomeric SMILES
inchi InChI string inchikey InChIKey
iupac_name IUPAC name xlogp XLogP
exact_mass Exact mass monoisotopic_mass Monoisotopic mass
tpsa Topological Polar Surface Area complexity Complexity
h_bond_donor_count 水素結合ドナー数 h_bond_acceptor_count 水素結合アクセプター数
rotatable_bond_count Rotatable bond count fingerprint hex-encoded fingerprint
cactvs_fingerprint PubChem CACTVS fingerprint heavy_atom_count Heavy atom count
isotope_atom_count isotope atom count atom_stereo_count Atom stereocenter count
defined_atom_stereo_count Defined atom stereocenter count undefined_atom_stereo_count Undefined atom stereocenter count
bond_stereo_count Bond stereocenter count defined_bond_stereo_count Defined bond stereocenter count
undefined_bond_stereo_count Undefined bond stereocenter count covalent_unit_count Covalently-bonded unit count

"英語のまま = 意味がわからないからコピペした"

Halichondrin B はエントリーが7つでてきますが、どれも同じようなのでWikipediaにものっている”CID(Compound ID) : 5488895" を使用することにします。

#どうせWikipediaのCIDつかうならこうすりゃよかった。 
pcp.get_compounds(5488895, 'cid', as_dataframe=True)

Eribulin は" CID: 11354606" のみでした。
Wikipedia にはメシル酸塩 "CID: 17755248" が記載されていますが、こちらは出てきませんでした。
名前検索は部分一致ではなく、全体一致なのでしょうか?

(2) Canonical SMILES からの2次元描画 ( 参考記事② )

次にHalichondrin B の Canonical SMILESから2次元構造を描画してみます。

#必要なものをimport
from rdkit import Chem
from rdkit.Chem import AllChem, Draw

#取得したDataFrameからCanonical SMILESの情報を取り出す。
hali_smi_cano = df_hali.loc[5488895, "canonical_smiles"]

#smilesからMolオブジェクトを作成
hali_mol_cano = Chem.MolFromSmiles(hali_smi_cano)

#2次元座標の計算
AllChem.Compute2DCoords(hali_mol_cano)

#2次元描画
Chem.Draw.MolToImage(hali_mol_cano)

できました!!
f:id:magattaca:20181021225647p:plain


なるほど・・・そうきましたか。
流石にこういう感じ(↓)を自動生成は無理ですよね。
f:id:magattaca:20181021225935p:plain ハリコンドリンB - Wikipedia


上記は水素原子が省かれているのでつけてみます。

#プロトンをつけて描画
hali_mol_canoH = AllChem.AddHs(hali_mol_cano)
AllChem.Compute2DCoords(hali_mol_canoH)
Chem.Draw.MolToImage(hali_mol_canoH)

f:id:magattaca:20181021230610p:plain

ぞわぞわする・・・サクサク行こう。


(3) 3次元構造を生成・描画 (参考記事③)

では、本題の3次元構造を作ってみましょう。
まずは見やすそうなので、そのまま"水素原子なし"でやって見ます。

#必要なものをimport
from rdkit.Chem.Draw import IPythonConsole
import py3Dmol

#3次元構造を生成
AllChem.EmbedMolecule(hali_mol_cano, AllChem.ETKDG())

#Jupyter notebook上で描画
IPythonConsole.drawMol3D(hali_mol_cano)

f:id:magattaca:20181021231850p:plain

おおおお!格好良い!これだ、これが見たかった!
Jupyter notebookでは回転とズームもできます!(上は画像なので無理です)

"水素原子あり"も作って、二つ並べて見ましょう。

#プロトン付きでも3次元構造を生成
AllChem.EmbedMolecule(hali_mol_canoH, AllChem.ETKDG())

#並べて表示するためにpy3Dmolを使用
#まずはviewオブジェクトを生成
v = py3Dmol.view(width=1000, height=400, linked=False, viewergrid=(1,2))

# "プロトンあり"と"なし"をそれぞれMolBlock形式としてグリッドに渡す。
hali_mol_cano_mb = Chem.MolToMolBlock(hali_mol_cano)
v.addModel(hali_mol_cano_mb, viewer=(0, 0))
hali_mol_canoH_mb = Chem.MolToMolBlock(hali_mol_canoH)
v.addModel(hali_mol_canoH_mb, viewer=(0, 1))

#格好良くする設定
v.setBackgroundColor('0xeeeeee')
v.setStyle({'stick':{}})
v.zoomTo()
v.show()

f:id:magattaca:20181021233609p:plain

" linked=False " と設定しているので左と右それぞれの別々に動かせます。
うひょーっ・・・ん? なんか変。

f:id:magattaca:20181021235537p:plain


なんと、水素あり、水素なしで立体が変わってしまっています。
水素付加の仕方に問題があるのでしょうか??


いろいろ調べてみると気になる記述が・・・SMILESにも色々種類があるそうです。

・generic SMILES: 原子と結合のみを記述
・isomeric SMILES: 同位体や不斉中心についての記述を含む
canonical SMILES:generic SMILESをある定義に従って一義的に作成したもの言う
ESI友の会 - 2. SMILESとメタボロミクス

Dr Tomさんも別の記事でSMILES記法について解説してくださっていました。 (参考記事④)

今回、立体構造を生成するにあたって使用したのはcanonical SMILESですが、こちらには不斉中心の情報が含まれていないとのこと。
立体の情報をもたない線形表記法から図を作成したことに問題がありそうです。

ならば、isomeric SMILESでやって見ましょう。

(4) isomeric SMILES からの描画

PubChemから取得した情報にisomeric SMILESもあったので、Halichondrin B の構造をisomeric SMILESからおこしたいと思います。

まずは2次元。

#取得したDataFrameからisomeric SMILESの情報を取り出す。
hali_smi_iso = df_hali.loc[5488895, "isomeric_smiles"]

#smilesからMolオブジェクトを作成し、座標の計算と描画
hali_mol_iso = Chem.MolFromSmiles(hali_smi_iso)
AllChem.Compute2DCoords(hali_mol_iso)
Chem.Draw.MolToImage(hali_mol_iso)


f:id:magattaca:20181022000852p:plain

おお!立体を認識してそうです。

ちなみにそれぞれ線形表記は以下のようになります。@で不斉点を表している模様・・・

canonical SMILES CC1CC2CCC3C(=C)CC(O3)CCC45CC6C(O4)C7C(O6)C(O5)C8C(O7)CCC(O8)CC(=O)OC9C(C3C(CC4C(O3)CC3(O4)CC4C(O3)C(CC3(O4)CC(C4C(O3)CC(O4)C(CC(CO)O)O)C)C)OC9CC(C1=C)O2)C
isomeric SMILES C[C@@H]1C[C@@H]2CC[C@H]3C(=C)C[C@@H](O3)CC[C@]45C[C@@H]6[C@H](O4)[C@H]7[C@@H](O6)[C@@H](O5)[C@@H]8[C@@H](O7)CC[C@@H](O8)CC(=O)O[C@@H]9[C@H]([C@H]3[C@H](C[C@@H]4[C@H](O3)C[C@@]3(O4)C[C@H]4[C@@H](O3)[C@H](C[C@]3(O4)C[C@@H]([C@H]4[C@@H](O3)C[C@H](O4)[C@H](C[C@H](CO)O)O)C)C)O[C@H]9C[C@H](C1=C)O2)C


それでは、3次元構造をつくりましょう。
今回も"水素なし"と"水素あり"でやってみます。

#水素原子なしの3次元構造生成
AllChem.EmbedMolecule(hali_mol_iso, AllChem.ETKDG())

#水素原子を付加し3次元構造を生成
hali_mol_isoH = AllChem.AddHs(hali_mol_iso)
AllChem.EmbedMolecule(hali_mol_isoH, AllChem.ETKDG())

#並べて表示
v = py3Dmol.view(width=1000, height=400, linked=False, viewergrid=(1,2))
hali_mol_iso_mb = Chem.MolToMolBlock(hali_mol_iso)
v.addModel(hali_mol_iso_mb, viewer=(0, 0))
hali_mol_isoH_mb = Chem.MolToMolBlock(hali_mol_isoH)
v.addModel(hali_mol_isoH_mb, viewer=(0, 1))
v.setBackgroundColor('0xeeeeee')
v.setStyle({'stick':{}})
v.zoomTo()
v.show()

f:id:magattaca:20181022003008p:plain


水素を付加していない構造(左)は平面になってしまいました。
無駄に回転可能です・・・これはこれで嫌いじゃない!

水素付加したもの(右)は望み通り3次元構造となりました。

以上をまとめると、不斉中心が重要な医薬品に関しては
・立体情報を含むisomeric SMILESを使用
・3次元構造は水素を付加してから生成
と、するのが良さそうです。

次回からは関数っぽくして使おう・・・

import pubchempy as pcp
import pandas as pd
from rdkit import Chem
from rdkit.Chem import AllChem, Draw
from rdkit.Chem.Draw import IPythonConsole
import py3Dmol

def rittai(PubChemCID): #PubChemのCIDを別途用意して代入 
    #CIDからDataFrameとして化合物の情報を得る
    CID_df = pcp.get_compounds(PubChemCID, 'cid', as_dataframe=True)
    
    #DataFrameからisomeric smilesを抜き出す
    iso_smi = CID_df.loc[PubChemCID, 'isomeric_smiles']
    
    #Molオブジェクトに変換
    iso_mol = Chem.MolFromSmiles(iso_smi)
    
    #水素原子を付加
    iso_molH = AllChem.AddHs(iso_mol)
    
    #3次元構造を生成
    AllChem.EmbedMolecule(iso_molH, AllChem.ETKDG())
    
    #Jupyter notebookで描画
    IPythonConsole.drawMol3D(iso_molH)


それにしても初心者でもコピペで使えるとはDr Tom先生の記事クオリティ高すぎです。

f:id:magattaca:20181121221544p:plain
創薬の基本は鍵と鍵穴の関係

*********************************************************************

上記記事の作成にあたって「化学の新しいカタチ」の以下の記事を参考にさせていただきました。
また、本記事の中に誤りがある場合、当ブログ作成者の責任です。
参考記事① : 化合物データベースPubChemをpythonで使いこなす
参考記事② : RDKitの分子Molオブジェクトを扱う
参考記事③: RDKitによる3次元構造の生成
参考記事④: SMILES記法は化学構造の線形表記法

********************************************************************