def depict(self, sketch=True, filename=None, ipython=False, optimize=False, optimizemode='std', removeHs=True, atomlabels=None, highlightAtoms=None, resolution=(400, 200)): """ Depicts the molecules. It is possible to save it into an svg file and also generates a jupiter-notebook rendering Parameters ---------- sketch: bool Set to True for 2D depiction filename: str Set the filename for the svg file ipython: bool Set to True to return the jupiter-notebook rendering optimize: bool Set to True to optimize the conformation. Works only with 3D. optimizemode: ['std', 'mmff'] Set the optimization mode for 3D conformation removeHs: bool Set to True to hide hydrogens in the depiction atomlabels: str Accept any combinations of the following pararemters as unique string '%a%i%c%*' a:atom name, i:atom index, c:atom formal charge (+/-), *:chiral (* if atom is chiral) highlightAtoms: list List of atom to highlight. It can be also a list of atom list, in this case different colors will be used resolution: tuple of integers Resolution in pixels: (X, Y) Returns ------- ipython_svg: SVG object if ipython is set to True Example ------- >>> sm.depict(ipython=True, optimize=True, optimizemode='std') # doctest: +SKIP >>> sm.depict(ipython=True, sketch=True) # doctest: +SKIP >>> sm.depict(ipython=True, sketch=True) # doctest: +SKIP >>> sm.depict(ipython=True, sketch=True, atomlabels="%a%i%c") # doctest: +SKIP >>> ids = np.intersect1d(sm.get('idx', 'hybridization SP2'), sm.get('idx', 'element C')) # doctest: +SKIP >>> sm.depict(ipython=True, sketch=True,highlightAtoms=ids.tolist(), removeHs=False) # doctest: +SKIP """ from rdkit import Chem from rdkit.Chem.AllChem import Compute2DCoords, EmbedMolecule, MMFFOptimizeMolecule, ETKDG from copy import deepcopy if sketch and optimize: raise ValueError('Impossible to use optimization in 2D sketch representation') if optimizemode not in ['std', 'mmff']: raise ValueError('Optimization mode {} not understood. Can be "std" or "ff"'.format(optimizemode)) elements = self._element indexes = self._idx formalcharges = self._formalcharge chirals = self._chiral _mol = deepcopy(self._mol) if sketch: Compute2DCoords(_mol) if removeHs: _mol = Chem.RemoveHs(_mol) elements = self.get('element', 'element H', invert=True) indexes = self.get('idx', 'element H', invert=True) formalcharges = self.get('formalcharge', 'element H', invert=True) chirals = self.get('chiral', 'element H', invert=True) _labelsFunc = ['a', 'i', 'c', '*'] if atomlabels is not None: labels = atomlabels.split('%')[1:] formalcharges = ['' if c == 0 else "+" if c == 1 else "-" for c in formalcharges] chirals = ['' if c == '' else '*' for c in chirals] values = [elements, indexes, formalcharges, chirals] idxs = [_labelsFunc.index(l) for l in labels] labels_required = [values[i] for i in idxs] atomlabels = ["".join([str(i) for i in a]) for a in list(zip(*labels_required))] if optimize: if optimizemode == 'std': EmbedMolecule(_mol, ETKDG()) elif optimizemode == 'mmff': MMFFOptimizeMolecule(_mol) return _depictMol(_mol, filename=filename, ipython=ipython, atomlabels=atomlabels, highlightAtoms=highlightAtoms, resolution=resolution)
def depict( self, ids=None, sketch=True, filename=None, ipython=False, optimize=False, optimizemode="std", removeHs=True, legends=None, highlightAtoms=None, mols_perrow=3, ): """ Depicts the molecules into a grid. It is possible to save it into an svg file and also generates a jupiter-notebook rendering Parameters ---------- ids: list The index of the molecules to depict sketch: bool Set to True for 2D depiction filename: str Set the filename for the svg file ipython: bool Set to True to return the jupiter-notebook rendering optimize: bool Set to True to optimize the conformation. Works only with 3D. optimizemode: ['std', 'mmff'] Set the optimization mode for 3D conformation removeHs: bool Set to True to hide hydrogens in the depiction legends: str The name to used for each molecule. Can be 'names':the name of themselves; or 'items': a incremental id highlightAtoms: list A List of atom to highligh for each molecule. It can be also a list of atom list, in this case different colors will be used mols_perrow: int The number of molecules to depict per row of the grid Returns ------- ipython_svg: SVG object if ipython is set to True """ from rdkit.Chem.AllChem import ( Compute2DCoords, EmbedMolecule, MMFFOptimizeMolecule, ETKDG, ) from rdkit.Chem import RemoveHs from moleculekit.smallmol.util import depictMultipleMols if sketch and optimize: raise ValueError( "Impossible to use optmization in 2D sketch representation") if legends is not None and legends not in ["names", "items"]: raise ValueError('The "legends" should be "names" or "items"') _smallmols = self.getMols(ids) if ids is None: _mols = [m._mol for m in self._mols] else: _mols = [m._mol for m in self.getMols(ids)] if highlightAtoms is not None: if len(highlightAtoms) != len(_mols): raise ValueError( "The highlightAtoms {} should have the same length of the " "mols {}".format(len(highlightAtoms), len(_mols))) if sketch: for _m in _mols: Compute2DCoords(_m) if removeHs: _mols = [RemoveHs(_m) for _m in _mols] # activate 3D coords optimization if optimize: if optimizemode == "std": for _m in _mols: EmbedMolecule(_m) elif optimizemode == "mmff": for _m in _mols: MMFFOptimizeMolecule(_m, ETKDG()) legends_list = [] if legends == "names": legends_list = [_m.getProp("ligname") for _m in _smallmols] elif legends == "items": legends_list = [str(n + 1) for n in range(len(_smallmols))] return depictMultipleMols( _mols, ipython=ipython, legends=legends_list, highlightAtoms=highlightAtoms, filename=filename, mols_perrow=mols_perrow, )