import pandas as pd import numpy as np from rdkit.Chem import AllChem,Draw,rdFMCS from rdkit import Chem, DataStructs from rdkit.Chem.Draw import rdDepictor from svglib.svglib import svg2rlg from reportlab.graphics import renderPDF, renderPM import matplotlib.pyplot as plt import seaborn as sns from .my_utils import get_mol import warnings warnings.filterwarnings('ignore') def view_difference(mol1, mol2,legends): mol1=get_mol(mol1) mol2=get_mol(mol2) mcs = rdFMCS.FindMCS([mol1,mol2]) mcs_mol = Chem.MolFromSmarts(mcs.smartsString) match1 = mol1.GetSubstructMatch(mcs_mol) target_atm1 = [] for atom in mol1.GetAtoms(): if atom.GetIdx() not in match1: target_atm1.append(atom.GetIdx()) match2 = mol2.GetSubstructMatch(mcs_mol) target_atm2 = [] for atom in mol2.GetAtoms(): if atom.GetIdx() not in match2: target_atm2.append(atom.GetIdx()) png=Draw.MolsToGridImage([mol1, mol2],subImgSize=(300,300),useSVG=False,highlightAtomLists=[target_atm1, target_atm2],legends=legends) # svg=Draw.MolsToGridImage([mol1, mol2],subImgSize=(300,300), useSVG=True,highlightAtomLists=[target_atm1, target_atm2],legends=legends) svg='' return (png,svg) def save_svg(png_svg, svg_file, ipython=False): '''Save the png and svg to file - png_svg [png,svg] - svg_file file_name.svg - ipython In ipython something interesting is heppening! ''' if ipython: png=png_svg[0].data svg=png_svg[1].data else: png=png_svg[0]#.data svg=png_svg[1]#.data with open(svg_file, 'w') as f: f.write(svg) # drawing = svg2rlg(svg_file) # renderPDF.drawToFile(drawing, f"{svg_file.replace('.svg')}+'.pdf'") # renderPM.drawToFile(drawing, svg_file.replace('.svg','')+'.png', fmt="PNG") # plot=plt.imshow(png.data) if ipython: with open(svg_file.replace('.svg','')+'.png', 'wb+') as f: f.write(png) else: png.save(svg_file.replace('.svg','')+'.png') def show_mols(smiles_mols,legends=[],subImgSize=(800,600)): '''Display multiple mols with legends''' mols=[get_mol(ismiles_mol) for ismiles_mol in smiles_mols] mol_cls,legends_cls=[],[] for i in range(len(mols)): if mols[i]==None: continue mol_cls.append(mols[i]) if len(legends)>i: legends_cls.append(legends[i]) else: legends_cls.append('') svg=Draw.MolsToGridImage(mol_cls,subImgSize=subImgSize, molsPerRow=3,useSVG=True,legends=legends_cls) png=Draw.MolsToGridImage(mol_cls,subImgSize=subImgSize,useSVG=False,molsPerRow=3,legends=legends_cls) return png,svg def plot_xy(x,y,x_label='',y_label='',save_file=''): '''Plot x-y graph''' plt.figure(figsize=(7, 4.5), dpi=500) plt.rc('font', family='Times New Roman', size=12, weight='bold') plt.plot(x,y) plt.xlabel(x_label) plt.ylabel(y_label) if save_file!='': plt.savefig(save_file, dpi=500) plt.show() def scatter_xy(x,y,x_label='',y_label='',save_file='', xlims=None, ylims=None): '''Plot x-y graph''' plt.figure(figsize=(7, 4.5), dpi=500) plt.rc('font', family='Times New Roman', size=12, weight='bold') plt.scatter(x,y) plt.xlabel(x_label) plt.ylabel(y_label) if xlims != None: plt.xlim(xlims[0],xlims[1]) if ylims != None: plt.ylim(ylims[0],ylims[1]) if save_file!='': plt.savefig(save_file, dpi=500) plt.show() def plot_density(x,x_label='',y_label='Density (%)',save_file=''): '''Plot x-y graph''' plt.figure(figsize=(7, 4.5), dpi=500) plt.rc('font', family='Times New Roman', size=12, weight='bold') sns.displot(x, stat="density") plt.xlabel(x_label) plt.ylabel(y_label) if save_file!='': plt.savefig(save_file, dpi=500) plt.show()