schrodinger.application.glide.ligand_designer module

This module provides the APIs behind the Ligand Designer panel and workflow. It combines binding site Phase hypothesis generation with R-group enumeration and Glide grid generation and docking. The docking uses a Glide HTTP server for speed.

class schrodinger.application.glide.ligand_designer.State

Bases: enum.Enum

An enumeration.

NEW = 1
READY = 4
RUNNING_GRIDGEN = 2
STARTING_SERVER = 3
STOPPED = 5
class schrodinger.application.glide.ligand_designer.Pose(structure, source_lig)

Bases: tuple

__contains__

Return key in self.

__init__

Initialize self. See help(type(self)) for accurate signature.

__len__

Return len(self).

count(value) → integer -- return number of occurrences of value
index(value[, start[, stop]]) → integer -- return first index of value.

Raises ValueError if the value is not present.

source_lig

Alias for field number 1

structure

Alias for field number 0

exception schrodinger.application.glide.ligand_designer.ServerTimedOutError

Bases: RuntimeError

Exception raised if the Glide server times out

__init__

Initialize self. See help(type(self)) for accurate signature.

args
with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

class schrodinger.application.glide.ligand_designer.Site

Bases: object

Base class for a generic “hypothesis site”. A site is defined by a point in space (.xyz property) and has a method to check whether a pose satisfies the desired interaction.

Subclasses must override the .xyz property.

xyz
Returns:Cartesian coordinates of this site
Return type:iterable(float, float, float)
isSatisfied(pose)

Check if a pose satisfies the interaction with the given site.

Return type:bool
__init__

Initialize self. See help(type(self)) for accurate signature.

class schrodinger.application.glide.ligand_designer.PhaseSite(site)

Bases: schrodinger.application.glide.ligand_designer.Site

A site from a Phase hypothesis.

__init__(site)
Parameters:site (schrodinger.infra.phase.PhpSite) – Phase site
xyz
Returns:Cartesian coordinates of this site
Return type:iterable(float, float, float)
isSatisfied(pose)

Check if the ligand pose has any Phase sites that are close enough and have the right type to satisfy the interaction with this PhaseSite.

Return type:bool
class schrodinger.application.glide.ligand_designer.WatermapSite(atom, wmap_eid)

Bases: schrodinger.application.glide.ligand_designer.Site

A WaterMap site.

__init__(atom, wmap_eid)
Parameters:
atom
xyz
Returns:Cartesian coordinates of this site
Return type:iterable(float, float, float)
dg
Returns:the WaterMap dG value, if available
Return type:float or None
name
Returns:the name of this WaterMap site
Return type:str
wmap_eid
Returns:the WaterMap entry ID
Return type:str or NoneType
isSatisfied(pose)

True if any ligand atoms are within WMAP_DISPLACEMENT_CUTOFF of the WaterMap site.

class schrodinger.application.glide.ligand_designer.SphereSite(sphere_data)

Bases: schrodinger.application.glide.ligand_designer.Site

A site for a growth space sphere.

__init__(sphere_data)
Parameters:sphere_data (namedtuple(float, float, float, float)) – The sphere’s x, y, z coordinates and radius
xyz
Returns:Cartesian coordinates of this site
Return type:iterable(float, float, float)
isSatisfied(pose)

True if any ligand atoms are within the sphere

class schrodinger.application.glide.ligand_designer.FilterWrapper(filter_obj, descriptors=None)

Bases: object

A wrapper for schrodinger.ui.qt.filter_dialog_dir.filter_core.Filter to filter an iterable of Structure while computing RDKit descriptors, modifying the structure in-place.

Variables:structures_checked – How many structures were passed to filterStructures
__init__(filter_obj, descriptors=None)
Parameters:
filterStructures(structures)

Generator which filters an iterable of structures, yielding those that pass, after adding descriptor properties to them. The input structures are modified.

Parameters:structures (iterable of schrodinger.structure.Structure) – structures to filter
Return type:generator of schrodinger.structure.Structure
class schrodinger.application.glide.ligand_designer.LigandDesignerTask(keywords=None, tmpdir=None, *args, **kwargs)

Bases: schrodinger.tasks.tasks.AbstractTask

A LigandDesignerTask stores a ligand, a receptor, and optionally a WaterMap, and provides methods for finding hypotheses and finding which bonds may be enumerated upon for a given hypothesis.

Variables:
input
Variables:
  • ligand_st (schrodinger.Structure.structure) – ligand structure
  • original_ligand_st (schrodinger.Structure.structure) – original ligand before enumerations
  • receptor_st (schrodinger.Structure.structure) – receptor structure
  • wmap_sts (list(schrodinger.Structure.structure)) – watermap structures
  • site (Site) – target site
  • leaving_atom_index – this atom and others reachable from it in the direction “away” from the core will be replaced by the R-group
  • leaving_atom_index – The atom number of the core atom bonded to the leaving atom
  • r_groups (iterable of schrodinger.structure.Structure) – R-group library
output
Variables:
  • poses (list[Pose]) – List of poses resulting from enumeration job
  • num_ligands – Number of ligands generated by R-group enumeration.
  • ligands_matched – Number of ligands matched by the filter.
  • num_poses – Number of poses returned from Glide.
posesDocked
GRIDGEN_RETRIES = 600
__init__(keywords=None, tmpdir=None, *args, **kwargs)
Parameters:
filter_obj
backend
hypo
getHypoCt()

Get the Phase ligand hypothesis for the binding site as a Structure.

Return type:schrodinger.Structure
getCurrentInteractions(start=None)
Parameters:start (int or NoneType) – Starting index to renumber sites or None to not renumber
Returns:receptor sites from PhpComplex
Return type:list[phase.PhpSite]
getPotentialInteractions(start=None, slider_value=0)
Parameters:
  • start (int or NoneType) – Starting index to renumber sites or None to not renumber
  • slider_value (float) – Normalized value (0-1) influencing how many interactions are shown
Returns:

receptor sites from PhpDeNovoPharm

Return type:

list[phase.PhpSite]

getBindingSiteAtoms()
Returns:Atom indices of the receptor that are close to the ligand
Return type:list[int]
getWmapSites()

The WaterMap sites, as a dict by name, sorted by delta G.

getSite(site_name)

Return a Site by name. It may be a WatermapSite (conventinally named W1, W2, etc.) or a Phase hypothesis site (with names such as D1, D2 for donors; A1, A2 for acceptors; R1, R2 for aromatic rings; etc.).

getBonds(min_angle=90.0, bond_order=None)

Return a list of ligand bonds that could be broken to perform an R-group enumeration in an attempt to satisfy the interaction with a given site.

Parameters:
  • min_angle (float) – minimum angle, in degrees, between the site and the bond to be broken for R-group enumeration, with the leaving atom at the vertex
  • bond_order (int or NoneType) – required bond order, or None to allow any bond order
Returns:

list of (staying_atom_index, leaving_atom_index) tuples

Return type:

list of (int, int)

resetPicks()

Reset user picks

run()

Start the real run method by connecting it to the _backendReady signal and getting the backend ready.

Implementation of abstract method of tasks.AbstractFunctionTask.

DONE = 3
DataClass

alias of builtins.object

FAILED = 2
RUNNING = 1
WAITING = 0
classmethod addSubParam(name, param, update_owner=True)
blockSignals(self, bool) → bool
block_signal_propagation()
childEvent(self, QChildEvent)
children(self) → object
classmethod configureParam()

Override this class method to set up the abstract param class (e.g. setParamReference on child params.)

connectNotify(self, QMetaMethod)
customEvent(self, QEvent)
classmethod defaultValue(*args, **kwargs)
deleteLater(self)
destroyed

destroyed(self, QObject = None) [signal]

disconnect(self)
disconnectNotify(self, QMetaMethod)
dumpObjectInfo(self)
dumpObjectTree(self)
dynamicPropertyNames(self) → object
event(self, QEvent) → bool
eventFilter(self, QObject, QEvent) → bool
findChild(self, type, name: str = '', options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) → QObject

findChild(self, Tuple, name: str = ‘’, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> QObject

findChildren(self, type, name: str = '', options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) → List[QObject]

findChildren(self, Tuple, name: str = ‘’, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject] findChildren(self, type, QRegExp, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject] findChildren(self, Tuple, QRegExp, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject] findChildren(self, type, QRegularExpression, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject] findChildren(self, Tuple, QRegularExpression, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject]

classmethod fromJson(json_obj)

A factory method which constructs a new object from a given dict loaded from a json string or file.

Parameters:json_obj (dict) – A json-loaded dictionary to create an object from.
Returns:An instance of this class.

:rtype : cls

classmethod fromJsonFilename(filename)
classmethod fromJsonImplementation(json_dict)

Sets the value of this compound param value object from a JSON dict.

getAbstractParam(*args, **kwargs)
classmethod getParamSignal(*args, **kwargs)
classmethod getParamValue(*args, **kwargs)
classmethod getSubParam(name)
classmethod getSubParams()
getTaskDirectory()

Return the absolute path of the task directory

getTaskFilename(fname)

Return the appropriate absolute path for an input or output file

get_version()

Method to get the version of a particular object. Defaults to the current version of mmshare. This class can be overridden for custom versioning behavior.

guard()

Context manager that saves any Exception raised inside

inherits(self, str) → bool
initAbstract()
initConcrete(auto_task_dir=False)
initializeValue()
inputChanged
inputReplaced
installEventFilter(self, QObject)
classmethod isAbstract()
isDefault(*args, **kwargs)
isSignalConnected(self, QMetaMethod) → bool
isStartable()
isWidgetType(self) → bool
isWindowType(self) → bool
killTimer(self, int)
max_progress
max_progressChanged
max_progressReplaced
metaObject(self) → QMetaObject
moveToThread(self, QThread)
name
nameChanged
nameReplaced
objectName(self) → str
objectNameChanged

objectNameChanged(self, str) [signal]

outputChanged
outputReplaced
classmethod owner()
classmethod ownerChain()

Returns a list of param owners starting from the toplevel param and ending with self. Examples:

foo.bar.atom.coord.ownerChain() will return [foo, bar, atom, coord] where every item is a concrete param.

Foo.bar.atom.coord.x.ownerChain() will return [Foo, Foo.bar, Foo.atom.coord, Foo.atom.coord.x] where every item is an abstract params.

classmethod paramName()
parent(self) → QObject
preprocessors()
Returns:A list of bound preprocessing methods
progress
progressChanged
progressReplaced
property(self, str) → Any
pyqtConfigure(...)

Each keyword argument is either the name of a Qt property or a Qt signal. For properties the property is set to the given value which should be of an appropriate type. For signals the signal is connected to the given value which should be a callable.

receivers(self, PYQT_SIGNAL) → int
removeEventFilter(self, QObject)
replicate()

Create a new task with the same input and settings (but no output)

reportValidation(results)

Present validation messages to the user. This is an implmentation of the ValidationMixin interface and does not need to be called directly.

This method assumes that error and question methods have been defined in the subclass, as in e.g. widget_mixins.MessageBoxMixin.

Parameters:results (validation.ValidationResults) – Set of validation results generated by validate
Returns:if True, there were no validation errors and the user decided to continue despite any warnings. If False, there was at least one validation error or the user decided to abort when faced with a warning.
reset(*args, **kwargs)
runValidation(silent=False, validate_children=True, stop_on_fail=True)

Runs validation and reports the results (unless run silently).

Parameters:
  • silent (bool) – run without any reporting (i.e. error messages to the user). This is useful if we want to programmatically test validity. Changes return value of this method from ValidationResults to a boolean.
  • validate_children (bool) – run validation on all child objects. See _validateChildren for documentation on what this entails.
  • stop_on_fail (bool) – stop validation when first failure is encountered
Returns:

if silent is False, returns the validation results. If silent is True, returns a boolean generated by reportValidation.

Return type:

ValidationResults or bool

sender(self) → QObject
senderSignalIndex(self) → int
setAutoTaskDir(auto_task_dir)
setObjectName(self, str)
classmethod setParamValue(*args, **kwargs)
setParent(self, QObject)
setProperty(self, str, Any) → bool
setValue(*args, **kwargs)
signalsBlocked(self) → bool
start(skip_preprocessing=False)
startTimer(self, int, timerType: Qt.TimerType = Qt.CoarseTimer) → int
staticMetaObject = <PyQt5.QtCore.QMetaObject object>
status
statusChanged
statusReplaced
taskDone
taskFailed
taskStarted
taskdir
thread(self) → QThread
timerEvent(self, QTimerEvent)
toDict(*args, **kwargs)
toJson(_mark_version=True)

Create and returns a data structure made up of jsonable items.

Return type:An instance of one the classes from NATIVE_JSON_DATATYPES
toJsonImplementation(*args, **kwargs)
tr(self, str, disambiguation: str = None, n: int = -1) → str
valueChanged
wait(timeout=None)

Block until the task is finished executing or timeout seconds have passed.

Parameters:timeout (NoneType or int) – Amount of time in seconds to wait before timing out. If None or a negative number, this method will wait until the task is finished.
class schrodinger.application.glide.ligand_designer.LigandDesigner(ligand_st, receptor_st, keywords=None, tmpdir=None)

Bases: PyQt5.QtCore.QObject

A LigandDesigner is set up with a ligand and a receptor. It provides methods for performing the enumeration job. This is an R-group enumeration on a single bond, followed by core-constrained Glide docking of each generated ligand and a filter to ensure that the poses satisfy the hypothesis.

A LigandDesigner keeps its state and intermediate files in a scratch directory. A unique subdirectory is created for each ligand-receptor complex; if another object is created for the same complex, it will share the same directory. This allows the reuse of existing grid files, for example. However, only one LigandDesigner at a time can be performing an enumeration because the underlying Glide server process is single-threaded.

The LigandDesigner implements a non-blocking workflow, so the caller needs to take action to drive it. This is done by calling the isReady() method until true. Example:

ld = LigandDesigner(lig, recep) while not ld.isReady():

time.sleep(1)

# now we are ready!

The idea is that the caller is free to do other stuff while waiting; for example, interacting with the user.

__init__(ligand_st, receptor_st, keywords=None, tmpdir=None)
Parameters:
  • ligand_st (schrodinger.Structure.structure) – ligand structure
  • receptor_st (schrodinger.Structure.structure) – receptor structure
  • keywords (dict) – docking keywords to use to override the defaults
  • tmpdir (path-like object) – directory under which the job files will be written. Default is $SCHRODINGER_TMPDIR.
default_docking_keywords
state
start()

Start the ligand designer workflow.

stop()

Stop the ligand designer workflow.

isReady()

Return True if the LigandDesigner is ready to enumerate. This method has the side effect of taking steps to advance towards the READY state.

Returns:server is ready?
Return type:bool
startEnumeration(site, atom, rgroups, filter_wrapper=None)

Start asynchronous enumeration. If there was a problem with the server, the method will return (not raise!) an exception.

Parameters:
  • site (Site) – target site
  • atom (int) – leaving atom index (this atom and others reachable from it in the direction “away” from the core will be replaced by the R-group).
  • rgroups (iterable of schrodinger.structure.Structure) – R-group library
  • filter_wrapper (FilterWrapper) – optional filter to apply to the enumeration output
Return type:

Exception or NoneType

blockSignals(self, bool) → bool
childEvent(self, QChildEvent)
children(self) → object
connectNotify(self, QMetaMethod)
customEvent(self, QEvent)
deleteLater(self)
destroyed

destroyed(self, QObject = None) [signal]

disconnect(self)
disconnectNotify(self, QMetaMethod)
dumpObjectInfo(self)
dumpObjectTree(self)
dynamicPropertyNames(self) → object
event(self, QEvent) → bool
eventFilter(self, QObject, QEvent) → bool
findChild(self, type, name: str = '', options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) → QObject

findChild(self, Tuple, name: str = ‘’, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> QObject

findChildren(self, type, name: str = '', options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) → List[QObject]

findChildren(self, Tuple, name: str = ‘’, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject] findChildren(self, type, QRegExp, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject] findChildren(self, Tuple, QRegExp, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject] findChildren(self, type, QRegularExpression, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject] findChildren(self, Tuple, QRegularExpression, options: Union[Qt.FindChildOptions, Qt.FindChildOption] = Qt.FindChildrenRecursively) -> List[QObject]

inherits(self, str) → bool
installEventFilter(self, QObject)
isSignalConnected(self, QMetaMethod) → bool
isWidgetType(self) → bool
isWindowType(self) → bool
killTimer(self, int)
metaObject(self) → QMetaObject
moveToThread(self, QThread)
objectName(self) → str
objectNameChanged

objectNameChanged(self, str) [signal]

parent(self) → QObject
property(self, str) → Any
pyqtConfigure(...)

Each keyword argument is either the name of a Qt property or a Qt signal. For properties the property is set to the given value which should be of an appropriate type. For signals the signal is connected to the given value which should be a callable.

receivers(self, PYQT_SIGNAL) → int
removeEventFilter(self, QObject)
sender(self) → QObject
senderSignalIndex(self) → int
setObjectName(self, str)
setParent(self, QObject)
setProperty(self, str, Any) → bool
signalsBlocked(self) → bool
startTimer(self, int, timerType: Qt.TimerType = Qt.CoarseTimer) → int
staticMetaObject = <PyQt5.QtCore.QMetaObject object>
thread(self) → QThread
timerEvent(self, QTimerEvent)
tr(self, str, disambiguation: str = None, n: int = -1) → str
class schrodinger.application.glide.ligand_designer.GridgenJob(receptor_st, ligand_st, jobdir)

Bases: object

__init__(receptor_st, ligand_st, jobdir)
Parameters:
  • ligand_st (schrodinger.Structure.structure) – ligand structure
  • receptor_st (schrodinger.Structure.structure) – receptor structure
  • jobdir (path-like object) – job directory
writeInputs()

Write the input files.

launch()

Launch the gridgen job.

isDone()

Return true if the gridgen job is done. This is based in the existence of the grid file and, if available, the job record.

schrodinger.application.glide.ligand_designer.read_json_file(filename)

Read a JSON file. If there are issues reading it (doesn’t exist, syntax errors…) quietly return an empty dict.

Return type:object
schrodinger.application.glide.ligand_designer.md5sum(input_str)

MD5 hex digest of a string.

Return type:str
schrodinger.application.glide.ligand_designer.get_structure_digest(st, length=8)

Return an abbreviated MD5 hex digest given a Structure, after stripping out the structure-level properties.

Parameters:
Returns:

hex digest

Return type:

str

schrodinger.application.glide.ligand_designer.renumber_phase_sites(sites, start)

Renumber sites to ensure that sites from different phase backends have unique names.

Note: sites is modified in-place but also returned.

Parameters:
  • sites (list[phase.PhaseSite]) – List of phase sites
  • start (int) – Starting number
schrodinger.application.glide.ligand_designer.add_rdkit_descriptors(st, property_names)

Add RDKit descriptors to the maestro structure

Parameters:property_names (list[str]) – Maestro properties corresponding to RDKit descriptors
schrodinger.application.glide.ligand_designer.filter_r_groups(st, staying_atom_idx, leaving_atom_idx, r_groups)

Given a structure and a bond to break, return only R-groups that are anticipated to be chemically compatible.

Returns:R groups compatible with the given bond
Return type:collections.Iterable[schrodinger.structure.Structure]