🧪

【化学でPython】RDKit:分子の構造を描画・変換・解析する

に公開

はじめに

この「化学でPython」シリーズでは、化学の分野で有用な Python ライブラリを紹介しています。

今回紹介するのは、RDKit です。

RDKit とは?

化学構造の取り扱い・描画・特性計算・検索など、化学情報学(ケモインフォマティクス) に必要なほぼ全ての機能を提供する、オープンソースのライブラリです。

SMILES文字列から構造式画像を生成したり、分子量やLogPなどの物性値を計算したり、あるいは数百万の化合物の中から特定の骨格を持つものを一瞬で検索したりできます。

  • 公式サイト: Link
  • GitHub: Link (⭐️3.1k+)

インストール

以前は conda が必須でしたが、現在は pip だけで簡単にインストールできます。

terminal
pip install rdkit

基本的な使い方

まずは、最も基本的な「SMILES文字列から分子オブジェクトを作成し、描画する」流れを見てみましょう。

from rdkit import Chem
from rdkit.Chem import Draw

# 1. SMILES文字列から分子オブジェクトを作成
# アスピリンのSMILES
smiles = "CC(=O)Oc1ccccc1C(=O)O"
mol = Chem.MolFromSmiles(smiles)

# 2. 分子情報の取得
# 分子内の原子数
print(f"NumAtoms: {mol.GetNumAtoms()}")

# SMILESへの再変換(正規化されたSMILESが得られます)
print(f"Canonical SMILES: {Chem.MolToSmiles(mol)}")

# 3. 描画
# 画像オブジェクトとして取得し、保存または表示
img = Draw.MolToImage(mol)
# img.show() # ローカル環境ならビューアで開く
img.save("aspirin.png") # ファイルに保存
実行結果
NumAtoms: 13
Canonical SMILES: CC(=O)Oc1ccccc1C(=O)O

Jupyter Notebook や Google Colab 上では、mol オブジェクトをセルの最後で評価するだけで、きれいに描画された構造式が表示されます。

実践例①:「ルール・オブ・ファイブ」記述子の計算

実践的な例として、「経口医薬品らしさ(Drug-likeness)を評価する」 タスクをやってみます。

いわゆる「リピンスキーのルール・オブ・ファイブ」に関わる4つのパラメータ(分子量、LogP、水素結合供与体数・受容体数)を計算します。

1. 記述子計算ツールのインポート

from rdkit import Chem
from rdkit.Chem import Descriptors

# 分子を準備(カフェイン)
smiles_caffeine = "CN1C=NC2=C1C(=O)N(C(=O)N2C)C"
mol = Chem.MolFromSmiles(smiles_caffeine)

2. 各種プロパティの計算

rdkit.Chem.Descriptors モジュールには、多数の計算用関数が用意されています。

# 1. 分子量 (Molecular Weight) < 500
mw = Descriptors.MolWt(mol)

# 2. 脂溶性 (LogP) < 5
logp = Descriptors.MolLogP(mol)

# 3. 水素結合供与体数 (H-Bond Donors) < 5
# OHやNHの数
hbd = Descriptors.NumHDonors(mol)

# 4. 水素結合受容体数 (H-Bond Acceptors) < 10
# NやOの数
hba = Descriptors.NumHAcceptors(mol)

print(f"Molecule: Caffeine")
print(f"MW:   {mw:.2f}")
print(f"LogP: {logp:.2f}")
print(f"HBD:  {hbd}")
print(f"HBA:  {hba}")
実行結果
Molecule: Caffeine
MW:   194.19
LogP: -1.03
HBD:  0
HBA:  6

カフェインは全てのルールを満たしており、経口吸収性が良さそう(そして実際に良い)であることが分かります。

実践例②:部分構造検索

化学者が「こういう骨格を持つ分子だけを探したい」と思った時に使うのが 部分構造検索 です。RDKitでは HasSubstructMatch を使って簡単に実装できます。

# 検索対象の分子リスト
smiles_list = [
    "CCO",          # Ethanol (アルコール)
    "CC(=O)O",      # Acetic acid (カルボン酸)
    "c1ccccc1O",    # Phenol (フェノール性水酸基)
    "CC(=O)Oc1ccccc1C(=O)O" # Aspirin (カルボン酸とエステル)
]
mols = [Chem.MolFromSmiles(s) for s in smiles_list]

# 検索したい部分構造: カルボキシ基 (-C(=O)OH)
# SMARTS記法で定義します
carboxylic_acid = Chem.MolFromSmarts("C(=O)[OH]")

print(f"Searching for carboxylic acid pattern: {Chem.MolToSmarts(carboxylic_acid)}")

for i, m in enumerate(mols):
    # マッチするか判定
    if m.HasSubstructMatch(carboxylic_acid):
        print(f"Match found in molecule {i}: {Chem.MolToSmiles(m)}")
    else:
        print(f"No match in molecule {i}")
実行結果
Searching for carboxylic acid pattern: C(=O)[O&H1]
No match in molecule 0
Match found in molecule 1: CC(=O)O
No match in molecule 2
Match found in molecule 3: CC(=O)Oc1ccccc1C(=O)O

この機能を使えば、何万件もの化合物ライブラリの中から、「特定の骨格を持つもの」や「特定の官能基を持たないもの」をスクリーニングすることができます。

まとめ

今回は RDKit を紹介しました。

  • Point 1: 分子の読み書き、描画、計算など、化合物データ処理の基盤となるライブラリです。
  • Point 2: 物性予測や機械学習のための特徴量生成に必須です。
  • Point 3: 部分構造検索などを駆使して、膨大なデータから目的の分子を見つけ出せます。

「分子(化合物データ)をコンピュータで扱いたい」と思った時に、やりたいことの99%はこのRDKitで実現可能かも。ケモインフォマティクスを学ぶなら、まずはこのライブラリから。

ぜひ試してみてください。

参考リンク

Discussion