Drkcore

12 01 2010 chemoinformatics Python Tweet

Molblasterを実装してみた(其の二)

MolBlasterは細切れにして、頻度を返さないといけないんだが、Separateメソッドがバグッてるらしいので、canonical smilesで出してpythonのほうで.でsplitして頻度をみてみた

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 molblast(smi,iter=100,cutnum=5):
    obc = ob.OBConversion()
    obc.SetInAndOutFormats('smi','smi')
    obc.AddOption('c',ob.OBConversion.OUTOPTIONS)
    freq = {}

    for i in range(iter):
        mol = ob.OBMol()       
        obc.ReadString(mol,smi)
        for fragment in obc.WriteString(randomsplit(mol,cutnum=cutnum))[:-2].split('.'):
            freq[fragment] = freq.get(fragment,0) + 1

    return freq

if __name__ == "__main__":
    smiles = 'CCC(C)C(=O)OC1CC(C=C2C1C(C(C=C2)C)CCC(CC(CC(=O)O)O)O)O'

    print molblast(smiles,iter=1000,cutnum=20)

こんな感じ。

{'CCCCC=CC': 2, 'O=COCCC': 1, 'CCC=C(C)C(C)CC': 1, 'CCC(=O)O': 26, 'CCCCC(C)O':
 2, 'CCO': 459, 'CC=CCC(C)C': 2, 'CCC=CC(C)O': 2, 'CCCCC(C)C': 4, 'CCC': 705, 
'CCC=CC=CCC': 1, 'OCCCCC': 10, 'OCCC(C)OC': 1, 'C=CC=CCC': 2, 'CCCC(=C)C': 3, 
...

細切れにしないと頻度が稼げないし、細切れにするとファーマコフォア的な構造特徴が失われてしまう感じだ。というわけで、やってみて分かったけど、多分この方法だと実用的じゃないなぁ。Fragment Dependency Graphとかは面白そうなんだけどなぁ。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021