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 SMILES | RDKit内で一意化した文字列表現 | canonicalizationはtoolkitとversionに依存し得る |
| isomeric SMILES | 同位体・立体化学を含むSMILES | 未指定立体中心は補われない |
| Standard InChI | layer化された標準識別子 | 標準化規則によって表現が統合される場合がある |
| InChIKey | InChIを固定長文字列へhash化し照合 | 不可逆で、Keyだけから構造は復元できない |
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などがあります。
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数などを目的に応じて選びます。
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などは表現する特徴が異なります。
Tanimoto係数では、とを各bit vectorのon-bit数、を共通on-bit数とします。
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は条件を満たす構造集合を表します。
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等で連続色表示できます。
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. 特徴量表の構築
- 元構造とsource IDを保持する。
- parse失敗、valence warning、混合物を記録する。
- 標準化後SMILESとInChIKeyを生成し、重複を調査する。
- 記述子の定義・RDKit versionを固定する。
- 欠損、無限大、ほぼ定数の特徴量を確認する。
- 目的変数、単位、測定条件を構造と対応させる。
- random splitだけでなくscaffold・series単位の分割を検討する。
作成したとは数値計算・機械学習章へ渡します。立体情報が重要な場合は、単一2D fingerprintだけでなく立体記述子を併用します。
9. 参考資料
- RDKit: Getting Started with the RDKit in Python
- The RDKit Book
- RDKit InChI API
- RDKit MolStandardize API
最終更新: