ライブラリ中の特定の構造を削除する

サブストラクチャーサーチで集めたライブラリや、テンプレート構造を使って作ったバーチャルライブラリ群のプロパティを分析ししたいときに、テンプレート構造やサーチクエリに使った構造は要らない(むしろ邪魔)ことが多いと思います。

そういう場合プロパティの全平均からの差分と評価したりするのですが、構造自体を消してしまいたいこともあります。

import openbabel as ob
import sys

input = sys.argv[1]
 
obc = ob.OBConversion()
obc.SetInAndOutFormats("smi", "sdf")
 
mol = ob.OBMol()
next = obc.ReadFile(mol,input)

sp = ob.OBSmartsPattern()
sp.Init("c1ccccc1")

while next:
    sp.Match(mol);
    maplist = sp.GetUMapList()
    if len(maplist) > 0:
        del_atoms = []
        for i,atom in enumerate(ob.OBMolAtomIter(mol),1):
            if i in maplist[0]:
                del_atoms.append(atom)
        for a in del_atoms: mol.DeleteAtom(a)
    print obc.WriteString(mol)
    mol = ob.OBMol()
    next = obc.Read(mol)

これで例えばCOCc1ccccc1からベンゼン環を削除してCOCという構造だけを残すことができます。