Source code for schrodinger.application.desmond.depictor
from schrodinger.infra import canvas2d
from .image_generator import SchrodImageGenerator
[docs]def singleton(cls):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
[docs]@singleton
class Depictor(SchrodImageGenerator):
def __init__(self):
SchrodImageGenerator.__init__(self)
self._model.setShowHydrogenPreference(-1)
self._model.setFontSize(18)
[docs]def ct2chmmol(st):
"""
convert mmct to chmmol object
"""
adaptor = canvas2d.ChmMmctAdaptor()
stereo = canvas2d.ChmMmctAdaptor.StereoFromGeometry_Safe
mol = adaptor.create(st.handle, stereo)
return mol
[docs]def get_aligned_chmmol_from_ct(ct0, ct1, ma0, ma1, attached_atom0,
attached_atom1):
"""
generated aligned chmmol pair from ct and SMARTS
:type ct0: Structure
:param ct0: reference structure
:type ct1: Structure
:param ct1: structure to be aligned
:type smarts0: string
:param smarts0: SMARTS pattern for ct0
:type smarts1: string
:param smarts1: SMARTS pattern for ct1
:return two ChmMol instances as a tuple
"""
# convert to 0-base index
ma0 = [i - 1 for i in ma0]
ma1 = [i - 1 for i in ma1]
# convert ct to chmmol
chmmol0 = ct2chmmol(ct0)
chmmol1 = ct2chmmol(ct1)
return align_chmmol(chmmol0, chmmol1, ma0, ma1, attached_atom0,
attached_atom1)
[docs]def show_attached_hydrogen(chmmol, attached_atom):
for atom in attached_atom:
chmmol.getAtom(atom).setHydrogensHidden(False)
[docs]def align_chmmol(chmmol0, chmmol1, ma0, ma1, attached_atom0, attached_atom1):
"""
generated aligned chmmol pair from ct and SMARTS
:type chmmol0: ChmMol
:param chmmol0: reference structure
:type chmmol1: ChmMol
:param chmmol0: structure to be aligned
:type smarts0: string
:param smarts0: SMARTS pattern for ct0
:type smarts1: string
:param smarts1: SMARTS pattern for ct1
:return two ChmMol instances as a tuple
"""
HYDROGEN = canvas2d.ChmAtomOption.H_Never
RESCALE = canvas2d.ChmCoordGenOption.Physical
# we try to minimize the number of hydrogen to be rendered, in order to
# avoid the accidental flipping that can cause stereo center to be
# shown incorrectly
chmmol0.markHydrogens(canvas2d.ChmAtomOption.H_Never)
chmmol1.markHydrogens(canvas2d.ChmAtomOption.H_Never)
# we show the selected hydrogens
show_attached_hydrogen(chmmol0, attached_atom0)
show_attached_hydrogen(chmmol1, attached_atom1)
for i in range(0, len(ma0)):
atom0 = chmmol0.getAtom(ma0[i])
atom1 = chmmol1.getAtom(ma1[i])
# show hydrogen atoms in stereo center
if atom0.isHydrogen():
atom0.setHidden(False)
if atom1.isHydrogen():
atom1.setHidden(False)
# generate 2D coordinates
canvas2d.Chm2DCoordGen.generateAndApply(chmmol0, HYDROGEN, RESCALE)
canvas2d.Chm2DCoordGen.generateAndApply(chmmol1, HYDROGEN, RESCALE)
# allow adjustment of 2D coordinates after alignment
FIXUP = False
BYPASSCOORDGEN = False
CopyOverOriginalTemplateCoords = False
# align 2D coordinates
canvas2d.Chm2DCoordGen.generateFromTemplateAndApply(
chmmol1, chmmol0, ma1, ma0, HYDROGEN, RESCALE, FIXUP, BYPASSCOORDGEN,
CopyOverOriginalTemplateCoords)
return chmmol0, chmmol1