Chemical Identity, Search and Molecular Features

RDKitケモインフォマティクス

分子を識別し、部分構造と類似性で検索し、原子・分子記述子を機械学習へ渡せる表形式データに変換します。

入力
SMILES、SDF、MOL、CSV
主要処理
標準化、検索、fingerprint、記述子
出力
InChIKey、bit vector、DataFrame、SVG

1. 概要

ケモインフォマティクスでは、分子を結合表として扱います。典型的な流れは read → sanitize → standardize → identify → featurize → search/model です。三次元配座を生成するRDKit構造前処理編とは目的を分けます。

同じ化合物の定義を先に決める

塩、溶媒和物、同位体、立体異性体、互変異性体、プロトン化状態を区別するかで、重複判定と目的変数の対応が変わります。

2. SMILES・InChI・InChIKey

表現用途注意
canonical SMILESRDKit内で一意化した文字列表現canonicalizationはtoolkitとversionに依存し得る
isomeric SMILES同位体・立体化学を含むSMILES未指定立体中心は補われない
Standard InChIlayer化された標準識別子標準化規則によって表現が統合される場合がある
InChIKeyInChIを固定長文字列へhash化し照合不可逆で、Keyだけから構造は復元できない
Python
from rdkit import Chem
from rdkit.Chem import inchi

mol = Chem.MolFromSmiles("C[C@H](O)C(=O)O")
canonical = Chem.MolToSmiles(mol, canonical=True, isomericSmiles=True)
inchi_text = inchi.MolToInchi(mol)
inchi_key = inchi.InchiToInchiKey(inchi_text)

print(canonical)
print(inchi_text)
print(inchi_key)

データ表には元SMILES、標準化後SMILES、InChIKey、標準化処理versionを別列で残すと追跡しやすくなります。

3. 構造標準化

標準化は「正しい唯一の構造」を発見する処理ではなく、解析目的に合わせて表記ゆれを統一する規則です。RDKitのrdMolStandardizeにはcleanup、fragment選択、uncharging、tautomer canonicalizationなどがあります。

Python
from rdkit import Chem
from rdkit.Chem.MolStandardize import rdMolStandardize

raw = Chem.MolFromSmiles("CC(=O)[O-].[Na+]")
clean = rdMolStandardize.Cleanup(raw)
parent = rdMolStandardize.FragmentParent(clean)
uncharged = rdMolStandardize.Uncharger().uncharge(parent)

print(Chem.MolToSmiles(raw))
print(Chem.MolToSmiles(uncharged))
目的変数との整合性

測定値が塩型や特定pHに対応する場合、largest fragmentやunchargingで情報を捨てると構造と測定条件が不一致になります。元構造を保持し、処理規則をdataset単位で固定します。

4. 分子記述子とGasteiger電荷

分子記述子は構造全体を数値へ圧縮します。分子量、Crippen LogP、TPSA、水素結合donor/acceptor、回転可能結合数、ring数などを目的に応じて選びます。

Python
from rdkit.Chem import AllChem, Descriptors

values = {
    "MolWt": Descriptors.MolWt(mol),
    "MolLogP": Descriptors.MolLogP(mol),
    "TPSA": Descriptors.TPSA(mol),
    "HBD": Descriptors.NumHDonors(mol),
    "HBA": Descriptors.NumHAcceptors(mol),
}

AllChem.ComputeGasteigerCharges(mol)
charges = [atom.GetDoubleProp("_GasteigerCharge") for atom in mol.GetAtoms()]
print(values, charges)

Gasteiger電荷は結合表と経験的parameterから反復的に得る高速な部分電荷です。Mulliken、NPA、Hirshfeldなど波動関数に基づくpopulation analysisとは定義が異なり、値を混在させません。

5. Fingerprintと分子類似度

fingerprintは分子中の局所環境やpathをbitまたはcountへ写像します。Morgan、RDKit topological、MACCS keysなどは表現する特徴が異なります。

T(A,B)=nABnA+nB-nAB

Tanimoto係数では、nAnBを各bit vectorのon-bit数、nABを共通on-bit数とします。

Python
from rdkit import Chem, DataStructs
from rdkit.Chem import rdFingerprintGenerator

mols = [Chem.MolFromSmiles(s) for s in ["CCO", "CCCO", "c1ccccc1O"]]
generator = rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048)
fps = [generator.GetFingerprint(m) for m in mols]

similarities = DataStructs.BulkTanimotoSimilarity(fps[0], fps[1:])
print(similarities)
類似度は表現との組です

同じ分子対でもfingerprint type、radius、bit数、feature設定で値が変わります。異なる設定で得たTanimoto係数を同じ閾値で比較しません。bit collisionと分子サイズ依存にも注意します。

6. SMARTSによる部分構造検索

SMARTSはatom・bond queryを記述します。SMILESが一つの分子を表すのに対し、SMARTSは条件を満たす構造集合を表します。

Python
amide = Chem.MolFromSmarts("[NX3][CX3](=[OX1])")
target = Chem.MolFromSmiles("CC(=O)NC1=CC=CC=C1")

matches = target.GetSubstructMatches(amide, useChirality=True)
print(matches)

params = Chem.SubstructMatchParameters()
params.useChirality = True
params.uniquify = True
print(target.GetSubstructMatches(amide, params))

芳香族性、形式電荷、原子価、hydrogen数、ring条件を必要なだけ明示します。官能基名から作った短いpatternは、想定外の化学環境に一致しないかpositive/negative test setで検証します。

7. 二次元表示と寄与の可視化

部分構造matchは該当原子と結合を強調し、Gasteiger電荷やatom-wise contributionはSimilarityMaps等で連続色表示できます。

Python
from rdkit.Chem.Draw import rdMolDraw2D

hit_atoms = list(target.GetSubstructMatch(amide))
drawer = rdMolDraw2D.MolDraw2DSVG(420, 280)
rdMolDraw2D.PrepareAndDrawMolecule(drawer, target, highlightAtoms=hit_atoms)
drawer.FinishDrawing()

with open("amide_match.svg", "w", encoding="utf-8") as f:
    f.write(drawer.GetDrawingText())

色だけで意味を伝えず、color scale、単位、正負、highlight条件をcaptionへ記載します。複数分子比較では共通coreの配向を揃えます。

8. 特徴量表の構築

  1. 元構造とsource IDを保持する。
  2. parse失敗、valence warning、混合物を記録する。
  3. 標準化後SMILESとInChIKeyを生成し、重複を調査する。
  4. 記述子の定義・RDKit versionを固定する。
  5. 欠損、無限大、ほぼ定数の特徴量を確認する。
  6. 目的変数、単位、測定条件を構造と対応させる。
  7. random splitだけでなくscaffold・series単位の分割を検討する。

作成したXy数値計算・機械学習章へ渡します。立体情報が重要な場合は、単一2D fingerprintだけでなく立体記述子を併用します。

9. 参考資料

最終更新: