rdkit Recap、BRICS分子片段拆分与合成
生活随笔
收集整理的這篇文章主要介紹了
rdkit Recap、BRICS分子片段拆分与合成
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
參考: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)這種拆分帶數(shù)字,合成那種也必須是這種帶數(shù)字的才能再合成
多個分子片段庫構(gòu)建:
合成
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))拆分端不帶數(shù)字或者自定義
主要是這個函數(shù)Chem.FragmentOnBonds 的拆分實現(xiàn),dummyLabels=[(0, 0)] 第一個0表示前面替換,后一個對應后端;這里元組只能是數(shù)字
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,結(jié)果只有*星號
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可以模仿實驗室中的正向合成過程來進行逆向操作,對分子進行一系列的轉(zhuǎn)換與分解,最終得到一組合理的分子片段
from rdkit.Chem import Recap from rdkit.Chem import AllChem as Chemm = Chem.MolFromSmiles('c1ccccc1OCCOC(=O)CC') hierarch = Recap.RecapDecompose(m) #葉子節(jié)點函數(shù):hierarch.GetLeaves() print(hierarch.GetLeaves().keys())#子孫節(jié)點函數(shù):hierarch.GetAllChildren() print(hierarch.GetAllChildren().keys())#祖先節(jié)點函數(shù),返回列表: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))總結(jié)
以上是生活随笔為你收集整理的rdkit Recap、BRICS分子片段拆分与合成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP:错误控制运算符
- 下一篇: AXE模式隐私号基于语音流分析的用户接听