RDKitでPythonから化学構造式を扱う

コラム/ラボノート公開更新広告

Pythonで化学構造式を扱うためには、主にRDKitというライブラリが使用されます。

ここではRDKitを用いて化学構造式を扱う基本的なステップについて解説します。

この記事の内容
  1. 利用準備
  2. 分子の構造式を画像で取得する
  3. 分子の情報を得る
  4. 参考資料
  5. 関連記事

利用準備

まずは利用開始までに行うことと知っておくべき知識を解説します。

インストール

まずはRDKitをインストールします。

pip install rdkit

3Dモデルも作りたい場合はpy3Dmolもインストールしておきます。

pip install py3Dmol

分子の記述方法(SMILES)

RDKitを使うと、SMILES(Simplified Molecular Input Line Entry System)表記や他の形式を用いて分子を生成できます。

SMILESは分子構造を簡潔な文字列形式で表現する方法です。

いくつか例を示します。

  • メタン:C
  • プロパン:CCC
  • エタノール:CCO
  • アセチレン:C#C
  • クロロプレンモノマー:C=CC(Cl)=C
  • ベンゼン:C1=CC=CC=C1
  • アセチルサリチル酸:CC(=O)OC1=CC=CC=C1C(=O)O

現在ではデータ解析の分野で分子を数値化するために活用されています。

分子の構造式を画像で取得する

まずは分子を生成して画像として取得します。

SMILES の文字列から MolFromSmiles で分子オブジェクトを作る。そこから Draw.MolToImage で2Dの画像、または AddHs、EmbedMolecule、UFFOptimizeMolecule、MolToMolBlock を経て py3Dmol で3Dモデルを表示する。
分子オブジェクトから、2D の画像と 3D の表示に分かれる

分子の生成

まずはエタノール分子を生成してみます。

RDKitのChemモジュールからMolFromSmiles関数を使用して、SMILES表記から分子オブジェクトを生成します。

from rdkit import Chem

# SMILES表記で分子を定義
smiles = 'CCO'  # エタノールの例

# 分子オブジェクトの生成
molecule = Chem.MolFromSmiles(smiles)

以下のように分かりやすいエタノール分子を作ってくれました。

RDKitで生成したエタノール分子
RDKitで生成したエタノール分子

分子の構造式の描画

生成した分子オブジェクトは、Drawモジュールを使用して視覚化することができます。

from rdkit.Chem import Draw

# 分子の構造式を描画
image = Draw.MolToImage(molecule)

# 画像を表示
image.show()

image.show() メソッドを使用した場合、画像は自動的にはどこにも保存されません。

このメソッドは画像を直接画面に表示するためのものです。

画像を保存するには、save() メソッドを使用してファイルに書き込む必要があります。

image_path = 'path/to/your/ethanol.png'  # 保存先のファイルパスを設定
image.save(image_path)  # 画像をファイルに保存

Pythonプログラムと同じフォルダに保存する場合は保存したい画像のファイル名だけでも大丈夫です。

image.save("ethanol.png")  # 画像をファイルに保存

3D構造の分子を描画する

AllChem.EmbedMoleculeメソッドを使って分子の3D構造を生成します。

まず描画するためにpy3Dmolをインストールします。

pip install py3Dmol

ライブラリをインポートします。

from rdkit import Chem
from rdkit.Chem import AllChem
import py3Dmol

エタノール分子をSMILESで記述します。

# 分子の生成と3D構造の準備
mol = Chem.MolFromSmiles('CCO')

次に分子に水素原子を追加しています。

多くのSMILES表記では水素が省略されているため、これにより完全な3D構造を生成するための準備をしています。

mol = Chem.AddHs(mol)

次に分子の3D座標を生成します。

AllChem.EmbedMoleculeはランダムな3D構造を生成します。

AllChem.ETKDGは3D構造生成のためのアルゴリズムを指定しています。

更にAllChem.UFFOptimizeMoleculeで分子の3D構造をエネルギー最小化アルゴリズムを用いて最適化しています。

これにより、より現実的な3D構造が得られます。

AllChem.EmbedMolecule(mol, AllChem.ETKDG())
AllChem.UFFOptimizeMolecule(mol)

次に分子の3D構造情報をMolBlock形式(テキストベースの形式)に変換します。

これはpy3Dmolで使用するための準備です。

# 分子の3D構造データの取得
mb = Chem.MolToMolBlock(mol)

最後に3Dモデルを表示します。

# py3Dmolを使用して3D表示
view = py3Dmol.view(width=400, height=400) # ビューアーサイズ
view.addModel(mb, 'mol') # ビューアーにデータ追加、molはデータ形式
view.setStyle({'stick': {}}) # 分子の表示スタイルを設定
view.zoomTo() # 分子がビューア内で適切に表示されるようにズーム調整
view.show()

エタノールの3Dモデルが生成されました。

エタノールの3Dモデル
エタノールの3Dモデル

Jupyter Notebookの実行環境では、その場で回転させることも出来ます。

エタノールの3Dモデル(回転)
エタノールの3Dモデル(回転)

分子の情報を得る

生成した分子から原子の数や結合の種類、分子量など様々な情報を取得してみます。

同様にエタノールを題材にします。

from rdkit import Chem

# SMILES表記で分子を定義
smiles = 'CCO'  # エタノールの例

# 分子オブジェクトの生成
molecule = Chem.MolFromSmiles(smiles)

原子と結合の情報

GetNumAtoms()メソッドは、その分子内にある原子の総数を返します。

水素原子はカウントされません。

# 原子の数を取得
num_atoms = molecule.GetNumAtoms()

エタノールの場合3が返されます。

どのような原子が含まれているか確認するには以下のコードを実行します。

# 各原子についての情報を取得
for atom in molecule.GetAtoms():
    print(atom.GetSymbol())  # 原子記号

C、C、Oが1行ずつ、3行で出力されます。

エタノール分子の結合数を確認するにはGetNumBonds()メソッドを使います。

注意点として、GetNumBonds() メソッドは単純な結合の数を返します。つまり、二重結合や三重結合も単一結合としてカウントされます。

また水素原子と他の原子との結合はカウントされません。

# 結合に関する情報
num_bonds = molecule.GetNumBonds()

エタノールの場合2が出力され、CH3-CH2結合、CH2-OH結合が計数の対象です。

分子量の計算

rdMolDescriptorsモジュールを使用して精密質量(最も存在比の大きい同位体で数えた分子量)を計算できます。

from rdkit.Chem import rdMolDescriptors

# 分子量の計算
molecular_weight = rdMolDescriptors.CalcExactMolWt(molecule)

エタノールの場合、「46.041864812」と出力され、一致しました。

参考資料

RDKit公式ドキュメント(別サイト)www.rdkit.org

関連記事

YOLOv8を使って簡単に画像認識する

Excelを使ったダミー変数の作り方

Pythonプログラムをダブルクリックで使う