mcpField
O
openbabel

openbabel

github.com/tondevrelデータ・データベース2452 回インストール38 週間前に更新
リポジトリ

openbabel について

Open Babel は、分子ファイルを扱う研究者向けの化学データ相互運用ツールです。多形式変換、3D 構造生成、部分構造検索、一括処理に対応し、Python インターフェースの Pybel も利用できます。

主な機能

  1. 01分子ファイル形式の相互変換
  2. 02SMILES からの 3D 座標生成
  3. 03SMARTS による部分構造検索
  4. 04水素付加とドッキング用リガンド準備
  5. 05フィンガープリントと Tanimoto 類似度の計算
  6. 06大規模分子ファイルの逐次処理

活用シーン

  1. 01SDF や PDB などの形式変換
  2. 02分子の 3D 構造生成と最適化
  3. 03SMARTS パターンによる化合物の抽出
  4. 04大規模な化学データベースの一括処理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/tondevrel/scientific-agent-skills --skill openbabel

インストール後、Claude Code で/openbabelを入力して読み込まれたか確認します。

詳細

Open Babel - ユニバーサル化学データ変換ツール

Open Babel(およびその Python ラッパー pybel)は、化学データの相互運用に欠かせないツールです。研究者は、SMILES、PDB、SDF、CIF、Gaussian の入出力形式など、さまざまな形式間でデータをシームレスに移動できます。

使用する場面

  • 化学ファイルを異なる形式間で変換する場合(例:SDF から PDB)。
  • 2D 構造や SMILES から 3D 座標を生成する場合。
  • SMARTS パターンを使用して部分構造を検索する場合。
  • 分子ドッキングの準備をすばやく行う場合(例:水素の追加、電荷の計算)。
  • 基本的な力場による最小化を実行する場合(UFF、GAFF、MMFF94)。
  • 分子フィンガープリントや Tanimoto 係数を計算する場合。
  • 大規模な化学データベース(数百万個の分子)をバッチ処理する場合。

リファレンスドキュメント

公式ドキュメント:https://openbabel.org/docs/dev/
Python API(Pybel):https://openbabel.org/docs/dev/UseTheLibrary/Python_Pybel.html
検索パターン:openbabel.OBMol、pybel.readfile、pybel.readstring、mol.make3D

基本原則

OB と Pybel
  • OpenBabel(SWIG):低レベルのインターフェースで、C++ クラス(OBMol、OBAtom)に直接アクセスできます。複雑ですが、非常に強力です。
  • Pybel:高レベルの「ラッパー」で、より Pythonic なスタイルです。タスクの 90% ではこちらをおすすめします。
変換エンジン

Open Babel はパイプラインとして動作します:Input Format -> Internal OBMol -> Output Format。変換処理中に、フィルターや変換処理(塩の除去、水素の追加)を追加できます。

クイックリファレンス

インストール
# Recommended via conda/mamba
conda install -c conda-forge openbabel
標準的なインポート
from openbabel import openbabel as ob
from openbabel import pybel
基本パターン - 形式変換
from openbabel import pybel

# 1. Read molecule (from string or file)
mol = pybel.readstring("smi", "CC(=O)Oc1ccccc1C(=O)O") # Aspirin

# 2. Add metadata
mol.title = "Aspirin_001"

# 3. Write to a different format
output_pdb = mol.write("pdb")
# Or write to file
# mol.write("sdf", "aspirin.sdf", overwrite=True)

重要なルール

✅ 推奨事項
  • シンプルに使うなら Pybel を使用する - メモリ管理を行い、分子のプロパティに簡単にアクセスできます。
  • 3D 生成には水素を追加する - 3D 座標を生成する前に、必ず mol.OBMol.AddHydrogens() または mol.addh() を呼び出してください。
  • 部分構造検索には SMARTS を使用する - 官能基を検索する最も堅牢な方法です。
  • バッチ処理を行う - メモリを節約するため、分子をリストに読み込むのではなく pybel.readfile を使用してください。
  • 妥当な構造か確認する - 3D 生成後に、エネルギーが妥当かどうかを確認してください。
  • ファイルイテレーターを閉じる - ファイルハンドルが適切に管理されるよう、list(pybel.readfile(...)) を使用するか、適切にイテレートしてください。
❌ 禁止事項
  • RDKit オブジェクトと Open Babel オブジェクトを混在させる - 互換性がありません。両者間でデータを渡すには、SMILES/SDF に変換してください。
  • エラーを無視する - Open Babel はエラーをほとんど表示しません。結果の分子が None でないことを確認してください。
  • 立体化学を忘れる - @ や / を含まない SMILES では、変換時に立体中心の情報が失われます。
  • 複雑な記述子の計算に使用する - 高度な QSAR では、一般的に RDKit が適しています。Open Babel は変換や 3D 処理に最適です。

アンチパターン(絶対に避ける)

from openbabel import pybel

# ❌ BAD: Loading millions of molecules into a list
# mols = list(pybel.readfile("sdf", "huge_database.sdf")) # Crashes RAM

# ✅ GOOD: Iterator-based processing
for mol in pybel.readfile("sdf", "huge_database.sdf"):
    # process one by one
    pass

# ❌ BAD: Generating 3D without hydrogens
mol = pybel.readstring("smi", "C1CCCCC1")
mol.make3D() # ❌ Resulting structure will be distorted/incorrect

# ✅ GOOD: Add H first
mol = pybel.readstring("smi", "C1CCCCC1")
mol.addh()
mol.make3D()
mol.optimize("mmff94")

# ❌ BAD: Manual string manipulation to change format
# pdb_str = sdf_str.replace(...) # ❌ Never works reliably

分子の操作(pybel)

プロパティと原子
mol = pybel.readstring("smi", "c1ccccc1O") # Phenol

print(f"Formula: {mol.formula}")
print(f"Weight: {mol.molwt:.2f}")

# Iterate over atoms
for atom in mol.atoms:
    print(f"Atom: {atom.type}, Coords: {atom.coords}")

# Get data as a dictionary
data = mol.data # Access SDF tags/metadata
部分構造検索(SMARTS)
# Search for carboxylic acid group
smarts = pybel.Smarts("C(=O)[OH]")
mol = pybel.readstring("smi", "CC(=O)O") # Acetic acid

if smarts.findall(mol):
    print("Molecule contains a carboxylic acid!")

3D 構造と力場

生成と最適化
mol = pybel.readstring("smi", "CN1C=NC2=C1C(=O)N(C(=O)N2C)C") # Caffeine

# 1. Prepare for 3D
mol.addh()

# 2. Generate initial 3D (Distance Geometry)
mol.make3D(forcefield='mmff94', steps=50)

# 3. Fine-tune with a local optimizer
# Options: uff, gaff, mmff94, ghemical
mol.optimize(forcefield='mmff94', steps=500)

print(f"3D Energy: {mol.energy:.2f} kJ/mol")

応用:低レベル Open Babel API

OBMol の直接操作
from openbabel import openbabel as ob

# Access the internal OBMol object from a pybel molecule
obmol = mol.OBMol

# Manual atom addition
new_atom = obmol.NewAtom()
new_atom.SetAtomicNum(6) # Carbon
new_atom.SetVector(1.0, 1.0, 1.0)

# Bond information
for i in range(obmol.NumBonds()):
    bond = obmol.GetBond(i)
    print(f"Bond between {bond.GetBeginAtomIdx()} and {bond.GetEndAtomIdx()}")
記述子の計算
# Fingerprints
# Standard types: FP2 (path-based), FP3 (SMARTS patterns), FP4 (functional groups)
fps = mol.calcfp("FP2")
print(f"Fingerprint bits: {fps.bits}")

# Similarity
mol2 = pybel.readstring("smi", "c1ccccc1")
fps2 = mol2.calcfp("FP2")
similarity = fps | fps2 # Tanimoto coefficient

実践的なワークフロー

1. ハイスループット形式コンバーター
def batch_convert(input_file, in_fmt, output_file, out_fmt, add_h=False):
    """Converts large files with optional hydrogen addition."""
    writer = pybel.Outputfile(out_fmt, output_file, overwrite=True)
    
    for mol in pybel.readfile(in_fmt, input_file):
        if add_h:
            mol.addh()
        writer.write(mol)
    
    writer.close()

# batch_convert("library.smi", "smi", "library.sdf", "sdf", add_h=True)
2. ドッキング用リガンドの準備(PDBQT)
def prepare_ligand(smi_str, output_name):
    """Basic prep for AutoDock Vina."""
    mol = pybel.readstring("smi", smi_str)
    mol.addh()
    mol.make3D()
    mol.optimize("gaff")
    
    # Open Babel has a dedicated pdbqt format
    mol.write("pdbqt", f"{output_name}.pdbqt", overwrite=True)
3. 塩の除去(化学データのクリーニング)
def strip_salts(mol):
    """Removes smaller fragments (salts/solvents) from a molecule."""
    if len(mol.reversesmi.split(".")) > 1:
        # Get the largest fragment by number of atoms
        fragments = mol.OBMol.Separate()
        largest = max(fragments, key=lambda x: x.NumAtoms())
        return pybel.Molecule(largest)
    return mol

パフォーマンスの最適化

FP2 による高速検索

数百万個の分子に対して時間のかかる 3D 処理や SMARTS マッチングを行う前に、フィンガープリントによるスクリーニング(Tanimoto)で候補を絞り込みます。

OBConversion による高速処理

形式を変換するだけで原子を操作する必要がない場合は、pybel.Molecule オブジェクトを作成するより、OBConversion クラスを直接使用する方が高速です。

obconv = ob.OBConversion()
obconv.SetInAndOutFormats("smi", "sdf")
obconv.ConvertFile("in.smi", "out.sdf")

よくある問題と解決策

SMILES から生成される「空の分子」
# ❌ Problem: pybel.readstring("smi", "invalid_smiles") returns a blank molecule
# ✅ Solution: Always check for atom count
mol = pybel.readstring("smi", some_input)
if len(mol.atoms) == 0:
    print("Error: Invalid molecule data")
力場のパスに関する問題

一部のシステムでは、Open Babel がデータファイル(力場パラメーター)を見つけられないことがあります。

# ✅ Solution: Manually set BABEL_DATADIR if needed
import os
# os.environ['BABEL_DATADIR'] = '/path/to/openbabel/data'
3D キラリティの反転

入力 SMILES の指定が不十分な場合、make3D によって立体中心が反転することがあります。

# ✅ Solution: Use 'gen3d' operation instead of simple make3D
# which is more robust for preserving stereochemistry.
obconv = ob.OBConversion()
obconv.AddOption("gen3d", ob.OBConversion.GENOPTIONS)

ベストプラクティス

  1. 3D 生成の前に必ず水素を追加する - 水素を含まない構造は正しくありません。
  2. 大きなファイルにはイテレーターを使用する - データベース全体をメモリに読み込まないでください。
  3. 読み込み後に分子を検証する - 原子数と基本的な特性を確認してください。
  4. 適切な力場を使用する - 有機分子には MMFF94、汎用用途には UFF、薬物様分子には GAFF を使用してください。
  5. 立体化学を保持する - 必要に応じて @ と / を使った明示的な SMILES 表記を使用してください。
  6. 類似性の評価にはフィンガープリントを使用する - 計算コストの高い処理の前に、Tanimoto 係数で絞り込んでください。
  7. ファイルライターを明示的に閉じる - コンテキストマネージャーまたは .close() を使用して、データが書き込まれるようにしてください。
  8. 最適化後にエネルギーを確認する - 不合理なエネルギーは、ジオメトリに問題があることを示しています。

Open Babel は化学分野における「接着剤」です。RDKit の高度な 2D 描画機能や PySCF の高度な数学的機能は備えていないかもしれませんが、あらゆる形式に対応し、3D の初期構造を生成できるため、計算化学者にとって欠かせないツールです。

コメント