RDKit-MMPA2

今日は昼休み中にRDKitのMMPAスクリプトをいじってました。
kzfmさんのブログを拝見させていただいたのがきっかけです。
RDKit_2013_03_2/Contrib/mmpa配下のrfag.pyの切断ルールをRECAP風にアレンジしてみました。
209行目以降

        #SMARTS for "acyclic and not in a functional group"
        smarts = Chem.MolFromSmarts("[#6+0;!$(*=,#[!#6])]!@!=!#[*]")

        #finds the relevant bonds to break
        #find the atoms maches
        matching_atoms = mol.GetSubstructMatches(smarts)

        #SMARTS for "acyclic and not in a functional group"
        ##smarts = Chem.MolFromSmarts("[#6+0;!$(*=,#[!#6])]!@!=!#[*]")
        ether = Chem.MolFromSmarts( "[#6:1]-!@[O;+0]-!@[#6:2]" )
        amide = Chem.MolFromSmarts( "[C;!$(C([#7])[#7]):1](=!@[O:2])!@[#7;+0;!D1:3]" ) 
        cyclic_amine = Chem.MolFromSmarts( "[#7;R;D3;+0:1]-!@[*:2]" )
        ester  = Chem.MolFromSmarts( "[C:1](=!@[O:2])!@[O;+0:3]" ) 
        aromatic_n = Chem.MolFromSmarts( "[n;+0:1]-!@[C:2]" ) 
        aroc_aroc = Chem.MolFromSmarts( "[c:1]-!@[c:2]" ) 
        aron_aroc = Chem.MolFromSmarts( "[n;+0:1]-!@[c:2]" ) 
        sulfone_amide = Chem.MolFromSmarts( "[#7;+0;D2,D3:1]-!@[S:2](=[O:3])=[O:4]" ) 
        aroc_N_aroc = Chem.MolFromSmarts( "[c:1]-[#7;+0:2]-!@[c:3]"  )


        #finds the relevant bonds to break
        #find the atoms maches
        ##matching_atoms = mol.GetSubstructMatches(smarts)
        ether = tuple([ ((i[0],i[1]), (i[1],i[2]))[0] for i in mol.GetSubstructMatches( ether ) if i != None])
        amide = tuple([ (i[0],i[2]) for i in mol.GetSubstructMatches( amide ) if i != None])
        cyclic_amine = mol.GetSubstructMatches( cyclic_amine )
        ester = tuple([ (i[0],i[2]) for i in mol.GetSubstructMatches( ester ) if i != None])
        aromatic_n = mol.GetSubstructMatches( aromatic_n )
        aroc_aroc = mol.GetSubstructMatches( aroc_aroc )
        aron_aroc = mol.GetSubstructMatches( aron_aroc )
        sulfone_amide = tuple([ (i[0],i[1]) for i in mol.GetSubstructMatches( sulfone_amide ) if i != None ])
        aroc_N_aroc  = tuple([ ((i[0],i[1]), (i[1],i[2]))[0] for i in mol.GetSubstructMatches( aroc_N_aroc  ) if i != None ])

        matching_atoms = ether + amide + cyclic_amine + ester + aromatic_n + aroc_aroc + aron_aroc + sulfone_amide + aroc_N_aroc

とします。
これでエーテル、アミド、環状アミン、エステル、芳香環−芳香環、芳香族n−芳香環、スルフォンアミド、芳香環−N−芳香環(buchwald_amination)のボンドのサーチをかけてマッチした部分の結合に関わるアトムインデックスをゲッツします。
エーテルは飽和炭素ー酸素ー飽和炭素のインデックスをとるのでインデックスは前のペアと
後ろのペアを返すようにしました。
同様に芳香環−N−芳香環も同じです。
アミドやエステルはC(=O)N, C(=O)Oのインデックスになるので0と2のインデックスだけとるようにリスト内包表記にします。
で、後はカットするのですがデフォルトのトリプルカットですとバレンスがおかしくなる可能性があるのでシングルカットにしました。
二回目以降をコメントアウトしただけですけど。

        for x in xrange( total ):
            #print matches[x]
            bonds_selected.append(matching_atoms[x])
            delete_bonds(bonds_selected)
            bonds_selected = []
"""
            for y in xrange(x+1,total):
                #print matching_atoms[x],matching_atoms[y]
                bonds_selected.append(matching_atoms[x])
                bonds_selected.append(matching_atoms[y])
                delete_bonds(bonds_selected)
                bonds_selected = []

                for z in xrange(y+1, total):
                    #print matching_atoms[x],matching_atoms[y],matching_atoms[z]
                    bonds_selected.append(matching_atoms[x])
                    bonds_selected.append(matching_atoms[y])
                    bonds_selected.append(matching_atoms[z])
                    delete_bonds(bonds_selected)
                    bonds_selected = []
"""

シングルカットなのである意味Rグループ分解と同じと言えば同じですが
合成する側から見ると、一気に処理できるのはいいかも。
フラッグメチルやハロゲンの効果はこのスクリプトからは見えませんけど。
あ、これの後は一緒にあるindexing.pyをいじらず実行するとRECAP風MMPができます。
SMART表記が未だにしっくりこないのでその辺が課題です。
ちょっとコード自身もきれいじゃないですね。

Advertisement

Published by iwatobipen

I'm medicinal chemist in mid size of pharmaceutical company. I love chemoinfo, cording, organic synthesis, my family.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: