欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

rdkit Recap、BRICS分子片段拆分与合成

发布时间:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的这篇文章主要介绍了 rdkit Recap、BRICS分子片段拆分与合成 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

参考:https://zhuanlan.zhihu.com/p/142885672
https://www.jianshu.com/p/199e697981ef

1、BRICS分子片段拆分与合成

1)BRICS分子片段拆分

from rdkit import Chem from rdkit.Chem import BRICS aspirin= Chem.MolFromSmiles('CC(=O)OC1=CC=CC=C1C(O)=O') fragments=BRICS.BRICSDecompose(aspirin,allNodes=None, minFragmentSize=1, onlyUseReactions=None, silent=True, keepNonLeafNodes=False, singlePass=False, returnMols=False)from rdkit.Chem import AllChem, DrawDraw.MolsToGridImage([Chem.MolFromSmiles(i) for i in sorted(fragments)],subImgSize=(300,300), molsPerRow=2)

这种拆分带数字,合成那种也必须是这种带数字的才能再合成


多个分子片段库构建:

allfrag=set() #创建一个集合,命名为allfrag for i in smi:single=BRICS.BRICSDecompose(i)allfrag.update(single)
合成
fragms = [Chem.MolFromSmiles(x) for x in sorted(fragments)] ms = BRICS.BRICSBuild(fragms) # print(ms) prods = [next(ms) for x in range(3)] [prod.UpdatePropertyCache(strict=False) for prod in prods] #纠正不正确的化学键 Chem.Draw.MolsToGridImage(prods, molsPerRow=4, subImgSize=(200, 200))

拆分端不带数字或者自定义

主要是这个函数Chem.FragmentOnBonds 的拆分实现,dummyLabels=[(0, 0)] 第一个0表示前面替换,后一个对应后端;这里元组只能是数字

from rdkit import Chem from rdkit.Chem import BRICS import numpy as npdef fragment_recursive(mol, frags):try:bonds = list(BRICS.FindBRICSBonds(mol))if len(bonds) == 0:frags.append(Chem.MolToSmiles(mol))return fragsidxs, labs = list(zip(*bonds))# print(bonds)# print(idxs, labs)bond_idxs = []for a1, a2 in idxs:bond = mol.GetBondBetweenAtoms(a1, a2)bond_idxs.append(bond.GetIdx())order = np.argsort(bond_idxs).tolist()bond_idxs = [bond_idxs[i] for i in order]broken = Chem.FragmentOnBonds(mol,bondIndices=[bond_idxs[0]],dummyLabels=[(0, 0)])head, tail = Chem.GetMolFrags(broken, asMols=True)#print(mol_to_smiles(head), mol_to_smiles(tail))frags.append(Chem.MolToSmiles(head))return fragment_recursive(tail, frags)except Exception as e:print (e)passaspirin= Chem.MolFromSmiles('CC(=O)OC1=CC=CC=C1C(O)=O') fragments=fragment_recursive(aspirin, []) print (fragments)


再可以替型号去掉

这里输入的是上面dummyLabels=[(0, 0)] 都为0,结果只有*星号

def remove_dummy(smiles):try:stripped_smi=smiles.replace('*','[H]')mol=Chem.MolFromSmiles(stripped_smi)return Chem.MolToSmiles(mol)except Exception as e:print (e)return Noneclean_fragments=[remove_dummy(smi) for smi in fragments] print (clean_fragments)

2、Recap拆分

Recap可以模仿实验室中的正向合成过程来进行逆向操作,对分子进行一系列的转换与分解,最终得到一组合理的分子片段

from rdkit.Chem import Recap from rdkit.Chem import AllChem as Chemm = Chem.MolFromSmiles('c1ccccc1OCCOC(=O)CC') hierarch = Recap.RecapDecompose(m) #叶子节点函数:hierarch.GetLeaves() print(hierarch.GetLeaves().keys())#子孙节点函数:hierarch.GetAllChildren() print(hierarch.GetAllChildren().keys())#祖先节点函数,返回列表:getUltimateParents() print(hierarch.getUltimateParents()[0].smiles)


拆分的片段

leaves = list(hierarch.GetLeaves().values()) Chem.Draw.MolsToGridImage([x.mol for x in leaves], molsPerRow=4, subImgSize=(200, 200))

总结

以上是生活随笔为你收集整理的rdkit Recap、BRICS分子片段拆分与合成的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。