今日は昼休み中に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表記が未だにしっくりこないのでその辺が課題です。
ちょっとコード自身もきれいじゃないですね。