構造をランダムに切断したい

現在の創薬シーンにおいてはフラグメントベースのドラッグデザイン(FBDD)やそれをcomputational的に行うのは主流に近いと思います。
ランダムに結合を切る方法としてhttp://www.ncbi.nlm.nih.gov/pubmed/16995724というのがあるのでopenbabelを使って簡単に実装してみます。

molblasterのアルゴリズムは単純で、ボンドをサンプリングしてカットしていくというのを何回か繰り返してフラグメントの頻度を数えるというものです。というわけで、一回にどのくらいの数のボンドを切断するかと、何回繰り返すかで精度が変化するようです。

import openbabel as ob
from random import sample

def randomsplit(mol,cutnum=5):
    cutlist =  sample(range(mol.NumBonds()),cutnum)

    delbonds = []
    for i,bond in enumerate(ob.OBMolBondIter(mol)): 
        if i in cutlist: delbonds.append(bond)
    for b in delbonds: mol.DeleteBond(b)
        
    return mol


def molblaster(smi,iter=100):
    obc = ob.OBConversion()
    obc.SetInAndOutFormats('smi','smi')

    for i in range(iter):
        mol = ob.OBMol()       
        obc.ReadString(mol,smi)
        yield obc.WriteString(randomsplit(mol))[:-1]

if __name__ == "__main__":
    smiles = 'C(C)CCc1ccccc1Cl'

    for smi_string in molblaster(smiles):
        print smi_string

自分専用お気に入りフラグメントデータベースを持つことがモデラーとしてのキャリアの第一歩だという噂です。