def _mols2imageStream(mols, f, format, size, legend, highlightMatch=None): """Return an input stream for the molecule as drawn""" highlights = None if highlightMatch: pattern = MolFromSmarts(highlightMatch) highlights = [mol.GetSubstructMatch(pattern) for mol in mols] kek = True if mols[0].HasProp("_drawingBondsWedged"): kek=False fit = False options = DrawingOptions() subim = (size,size) if size >150: subim = (size *2,size *2) options.coordScale = 3 options.bondLineWidth = 3.6 options.dblBondOffset = 0.435 options.atomLabelFontSize = 60 if kek: options.bondLineWidth = 4.5 options.dblBondOffset = 0.6 options.atomLabelFontSize = 150 fit = True elif kek: options.dblBondOffset = 0.4 image = Draw.MolsToGridImage(mols,molsPerRow=min(len(mols),4),subImgSize=subim, kekulize=kek,highlightAtomLists=highlights, fitImage=fit, options=options ) image.save(f, format)
def GenerateImageFile(ValidMols, MolNames, AtomLists, BondLists): """Generate a non SVG image file.""" Outfile = OptionsInfo["Outfile"] NumOfMolsPerRow = OptionsInfo["NumOfMolsPerRow"] Width = OptionsInfo["MolImageWidth"] Height = OptionsInfo["MolImageHeight"] # Setup drawing options... UpdatedDrawingOptions = DrawingOptions() UpdatedDrawingOptions.atomLabelFontSize = int( OptionsInfo["AtomLabelFontSize"]) UpdatedDrawingOptions.bondLineWidth = float(OptionsInfo["BondLineWidth"]) MolsImage = Draw.MolsToGridImage(ValidMols, molsPerRow=NumOfMolsPerRow, subImgSize=(Width, Height), legends=MolNames, highlightAtomLists=AtomLists, highlightBondLists=BondLists, useSVG=False, kekulize=OptionsInfo["Kekulize"], options=UpdatedDrawingOptions) MiscUtil.PrintInfo("\nGenerating image file %s..." % Outfile) if MiscUtil.CheckFileExt(Outfile, "pdf"): if MolsImage.mode == 'RGBA': MolsImage = MolsImage.convert('RGB') MolsImage.save(Outfile)
def generate_png(mol, pngpath, logfile=devnull, size=300): with stdout_redirected(to=sys.stdout, stdout=sys.stderr): with stdout_redirected(to=logfile, stdout=sys.stdout): nhmol = RemoveHs(mol, implicitOnly=False, updateExplicitCount=True, sanitize=False) SanitizeMol(nhmol, catchErrors=True) op = DrawingOptions() op.atomLabelFontSize = size / 25 MolToFile(PrepareMolForDrawing(nhmol,forceCoords=True,addChiralHs=True),\ pngpath,fitImage=True,size=(size, size),options=op)
def _mols2imageStream(mols, f, format, size, legend, highlightMatch=None): """Return an input stream for the molecule as drawn""" highlights = None if highlightMatch: pattern = MolFromSmarts(highlightMatch) highlights = [mol.GetSubstructMatch(pattern) for mol in mols] kek = True if mols[0].HasProp("_drawingBondsWedged"): kek = False fit = False options = DrawingOptions() subim = (size, size) if size > 150: subim = (size * 2, size * 2) options.coordScale = 3 options.bondLineWidth = 3.6 options.dblBondOffset = 0.435 options.atomLabelFontSize = 60 if kek: options.bondLineWidth = 4.5 options.dblBondOffset = 0.6 options.atomLabelFontSize = 150 fit = True elif kek: options.dblBondOffset = 0.4 image = Draw.MolsToGridImage(mols, molsPerRow=min(len(mols), 4), subImgSize=subim, kekulize=kek, highlightAtomLists=highlights, fitImage=fit, options=options) image.save(f, format)
from rdkit.Chem.Draw.MolDrawing import MolDrawing, DrawingOptions # 二、芳香性 芳香性是一个简单又复杂的话题。无论是实验化学家还是理论化学家都无法给出一个明确的定义 rdkit除了通过模式匹配已知的芳香体系进行识别 , 还定义了一些识别方向体系的规则 。 这些具体规则如下 : 1.芳香性仅仅和环上的原子和键有关 。 2.芳香性键必须由2两个芳香性原子组成 。 3.由2个芳香性原子组成的键不一定就是芳香键。 m = Chem.MolFromSmiles('C1=CC2=C(C=C1)C1=CC=CC=C21') opts = DrawingOptions() opts.atomLabelFontSize = 400 opts.includeAtomNumbers = True opts.dblBondLengthFrac = 0.8 opts.includeAtomNumbers = True opts.dotsPerAngstrom = 1000 img = Draw.MolToImage(m, options=opts, size=(500, 500)) img.save( '/drug_development/studyRdkit/st_rdcit/img/mol41.jpg' ) # 基于RDKit方向模型判断其上的原子和键的芳香性 atom3 = m.GetAtomWithIdx(3).GetIsAromatic() atom6 = m.GetAtomWithIdx(6).GetIsAromatic() bond_36 = m.GetBondBetweenAtoms(3, 6).GetIsAromatic()
def gen_plot(QCA, fnm): try: d = np.loadtxt(fnm, usecols=(5, 2, 6), skiprows=3) if d.size == 0: return except StopIteration: print("No data for", fnm) return entry = np.genfromtxt(fnm, usecols=(0, ), skip_header=HEADER_LEN, dtype=np.dtype("str"))[0] smiles = np.genfromtxt(fnm, usecols=(7, ), skip_header=HEADER_LEN, dtype=np.dtype("str"), comments=None)[0] scanned = np.genfromtxt(fnm, usecols=(4, ), skip_header=HEADER_LEN, dtype=np.dtype("str"))[0] scanned = eval('[' + scanned.replace('-', ',') + ']') scanned = [x + 1 for x in scanned] #print(scanned) print(fnm, smiles) mol_id = np.genfromtxt(fnm, usecols=(1, ), skip_header=HEADER_LEN, dtype=np.dtype("str")) with open(fnm, 'r') as fd: ds_name = fd.readline().strip("\n") method = fd.readline().strip("\n") basis = fd.readline().strip("\n") scan = d[:, 0] qm_abs_min = d[:, 1].min() qmene = d[:, 1] * const.hartree2kcalmol qmene -= qmene.min() mmene = d[:, 2] mmene -= mmene.min() mm_min_pt = scan[np.argsort(mmene)[0]] qm_min_pt = scan[np.argsort(qmene)[0]] qcmol = QCA.db.get(mol_id[0]).get("data") try: mol = rdutil.mol.build_from_smiles(smiles) molnoindex = rdutil.mol.build_from_smiles( re.sub(":[1-9][0-9]*", "", smiles)) except Exception as e: print(e) return AllChem.ComputeGasteigerCharges(mol) totalcharge = 0.0 for i, atom in enumerate(mol.GetAtoms()): totalcharge += float(atom.GetProp('_GasteigerCharge')) atom_map = rdutil.mol.atom_map(mol) inv = {val: key for key, val in atom_map.items()} #print(atom_map) scanned = [inv[i] for i in scanned] #scanned = [rdutil.mol.atom_map_invert( atom_map)[i] for i in scanned] #print(scanned) molflat = rdutil.mol.build_from_smiles(smiles) try: ret = rdutil.mol.embed_qcmol_3d(mol, qcmol) #print("EMBED WAS RET:", ret) #AllChem.GenerateDepictionMatching3DStructure(molflat, mol) AllChem.Compute2DCoords(molnoindex) except Exception as e: print("Could not generate conformation:") print(e) return options = DrawingOptions() options.atomLabelFontSize = 110 options.atomLabelFontFace = "sans" options.dotsPerAngstrom = 400 options.bondLineWidth = 8 options.coordScale = 1 png = Draw.MolToImage(molnoindex, highlightAtoms=scanned, highlightColor=[0, .8, 0], size=(500 * 12, 500 * 4), fitImage=True, options=options) fig = plt.figure(figsize=(8, 3.5), dpi=300, constrained_layout=True) matplotlib.rc("font", **{"size": 10}) gs = GridSpec(2, 2, figure=fig) ax1 = fig.add_subplot(gs[:2, 0]) ax1.plot(scan, qmene, 'bo-', lw=1, ms=2, label="QM") ax1.plot(scan, mmene, 'ro-', lw=1, ms=2, label="MM") ax1.set_ylabel("Energy (kcal/mol)") ax1.set_xlabel("Scan value") ax1.spines['top'].set_visible(False) ax1.spines['right'].set_visible(False) ax1.legend(loc='best') ax2 = fig.add_subplot(gs[0, 1]) ax2.imshow(png) ax2.axis('off') ax3 = fig.add_subplot(gs[1, 1]) kwargs = {"fontsize": 8, "fontname": "Monospace"} #ax3.text(.5,1.1,"{:^60s}".format(re.sub(":[1-9][0-9]*","",smiles)), fontsize=4, fontname="Monospace", ha='center') ax3.text(0, .9, "{:<16s}{:>39s}".format("QCA Dataset:", ds_name), **kwargs) ax3.text(0, .8, "{:<16s}{:>39s}".format("QCA Entry:", entry.split("-")[1]), **kwargs) ax3.text(0, .7, "{:<16s}{:>39s}".format("MM spec:", "Parsley unconstrained"), **kwargs) ax3.text(0, .6, "{:<16s}{:>39s}".format("MM charges:", "ANTECHAMBER AM1-BCC"), **kwargs) ax3.text( 0, .5, "{:<16s}{:>39s}".format("Total charge", "{:6.2f}".format(totalcharge)), **kwargs) ax3.text( 0, .4, "{:<16s}{:>39s}".format("QM spec:", "{}/{}".format(method, basis)), **kwargs) ax3.text( 0, .3, "{:<16s}{:>39s}".format("QM Absolute min:", "{:16.13e} au".format(qm_abs_min)), **kwargs) ax3.text( 0, .2, "{:<16s}{:>39s}".format("QM Min point:", "{:8.2f}".format(qm_min_pt)), **kwargs) ax3.text( 0, .1, "{:<16s}{:>39s}".format("MM Min point:", "{:8.2f}".format(mm_min_pt)), **kwargs) ax3.text(0, .0, "{:<16s}{:>39s}".format("OFFSB ver", "1.0"), **kwargs) ax3.axis('off') fig.savefig(re.sub("\.*$", ".png", fnm)) fig = None plt.close("all") return