def png_atoms_labeled(smiles, fname, map_idx=True, width=600, height=400, label_scale=2.0, scale_bondwidth=True): """Write out png file of molecule with atoms labeled with their map index. Parameters ---------- smiles: str SMILES fname: str absolute path and filename for png map_idx: bool If True, lable atoms with map index instead of atom index. If set to True, input SMILES must have map indices. """ mol = oechem.OEGraphMol() oechem.OESmilesToMol(mol, smiles) oedepict.OEPrepareDepiction(mol) opts = oedepict.OE2DMolDisplayOptions(width, height, oedepict.OEScale_AutoScale) if map_idx: # check if molecule has map if not cmiles.utils.has_atom_map(mol): raise ValueError( "Input SMILES must have atom maps to display map indices in image" ) opts.SetAtomPropertyFunctor(oedepict.OEDisplayAtomMapIdx()) opts.SetAtomPropertyFunctor(oedepict.OEDisplayAtomMapIdx()) if not map_idx: opts.SetAtomPropertyFunctor(oedepict.OEDisplayAtomIdx()) opts.SetAtomPropertyFunctor(oedepict.OEDisplayAtomMapIdx()) opts.SetAtomPropLabelFont(oedepict.OEFont(oechem.OEDarkGreen)) opts.SetAtomPropLabelFontScale(label_scale) opts.SetBondWidthScaling(scale_bondwidth) disp = oedepict.OE2DMolDisplay(mol, opts) return oedepict.OERenderMolecule(fname, disp)
def render_atom_mapping(filename, molecule1, molecule2, new_to_old_atom_map, width=1200, height=600): """ Render the atom mapping to a PDF file. Parameters ---------- filename : str The PDF filename to write to. molecule1 : openeye.oechem.OEMol Initial molecule molecule2 : openeye.oechem.OEMol Final molecule new_to_old_atom_map : dict of int new_to_old_atom_map[molecule2_atom_index] is the corresponding molecule1 atom index width : int, optional, default=1200 Width in pixels height : int, optional, default=1200 Height in pixels """ from openeye import oechem, oedepict # Make copies of the input molecules molecule1, molecule2 = oechem.OEGraphMol(molecule1), oechem.OEGraphMol(molecule2) oechem.OEGenerate2DCoordinates(molecule1) oechem.OEGenerate2DCoordinates(molecule2) # Add both to an OEGraphMol reaction rmol = oechem.OEGraphMol() rmol.SetRxn(True) def add_molecule(mol): # Add atoms new_atoms = list() old_to_new_atoms = dict() for old_atom in mol.GetAtoms(): new_atom = rmol.NewAtom(old_atom.GetAtomicNum()) new_atoms.append(new_atom) old_to_new_atoms[old_atom] = new_atom # Add bonds for old_bond in mol.GetBonds(): rmol.NewBond(old_to_new_atoms[old_bond.GetBgn()], old_to_new_atoms[old_bond.GetEnd()], old_bond.GetOrder()) return new_atoms, old_to_new_atoms [new_atoms_1, old_to_new_atoms_1] = add_molecule(molecule1) [new_atoms_2, old_to_new_atoms_2] = add_molecule(molecule2) # Label reactant and product for atom in new_atoms_1: atom.SetRxnRole(oechem.OERxnRole_Reactant) for atom in new_atoms_2: atom.SetRxnRole(oechem.OERxnRole_Product) core1 = oechem.OEAtomBondSet() core2 = oechem.OEAtomBondSet() # add all atoms to the set core1.AddAtoms(new_atoms_1) core2.AddAtoms(new_atoms_2) # Label mapped atoms core_change = oechem.OEAtomBondSet() index =1 for (index2, index1) in new_to_old_atom_map.items(): new_atoms_1[index1].SetMapIdx(index) new_atoms_2[index2].SetMapIdx(index) # now remove the atoms that are core, so only uniques are highlighted core1.RemoveAtom(new_atoms_1[index1]) core2.RemoveAtom(new_atoms_2[index2]) if new_atoms_1[index1].GetAtomicNum() != new_atoms_2[index2].GetAtomicNum(): # this means the element type is changing core_change.AddAtom(new_atoms_1[index1]) core_change.AddAtom(new_atoms_2[index2]) index += 1 # Set up image options itf = oechem.OEInterface() oedepict.OEConfigureImageOptions(itf) ext = oechem.OEGetFileExtension(filename) if not oedepict.OEIsRegisteredImageFile(ext): raise Exception('Unknown image type for filename %s' % filename) ofs = oechem.oeofstream() if not ofs.open(filename): raise Exception('Cannot open output file %s' % filename) # Setup depiction options oedepict.OEConfigure2DMolDisplayOptions(itf, oedepict.OE2DMolDisplaySetup_AromaticStyle) opts = oedepict.OE2DMolDisplayOptions(width, height, oedepict.OEScale_AutoScale) oedepict.OESetup2DMolDisplayOptions(opts, itf) opts.SetBondWidthScaling(True) opts.SetAtomPropertyFunctor(oedepict.OEDisplayAtomMapIdx()) opts.SetAtomColorStyle(oedepict.OEAtomColorStyle_WhiteMonochrome) # Depict reaction with component highlights oechem.OEGenerate2DCoordinates(rmol) rdisp = oedepict.OE2DMolDisplay(rmol, opts) oedepict.OEAddHighlighting(rdisp, oechem.OEColor(oechem.OEPink),oedepict.OEHighlightStyle_Stick, core1) oedepict.OEAddHighlighting(rdisp, oechem.OEColor(oechem.OEPurple),oedepict.OEHighlightStyle_Stick, core2) oedepict.OEAddHighlighting(rdisp, oechem.OEColor(oechem.OEGreen),oedepict.OEHighlightStyle_Stick, core_change) oedepict.OERenderMolecule(ofs, ext, rdisp) ofs.close()
# current license or subscription to the applicable OpenEye offering. # THE SAMPLE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED. OPENEYE DISCLAIMS ALL WARRANTIES, INCLUDING, BUT # NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A # PARTICULAR PURPOSE AND NONINFRINGEMENT. In no event shall OpenEye be # liable for any damages or liability in connection with the Sample Code # or its use. from openeye import oechem from openeye import oedepict import sys # @ <SNIPPET-DEPICTMDLREACTION-MAPIDX> if len(sys.argv) != 3: oechem.OEThrow.Usage("%s <mdlreaction> <imagefile>" % sys.argv[0]) ifile = sys.argv[1] ofile = sys.argv[2] ifs = oechem.oemolistream(ifile) qmol = oechem.OEGraphMol() oechem.OEReadMDLReactionQueryFile(ifs, qmol) oedepict.OEPrepareDepiction(qmol) opts = oedepict.OE2DMolDisplayOptions() opts.SetAtomPropertyFunctor(oedepict.OEDisplayAtomMapIdx()) disp = oedepict.OE2DMolDisplay(qmol, opts) oedepict.OERenderMolecule(ofile, disp) # @ </SNIPPET-DEPICTMDLREACTION-MAPIDX>