Source code for pygtop.interactions

from .exceptions import NoSuchLigandError, NoSuchTargetError, NoSuchInteractionError
from . import gtop
from .pdb import ask_about_molecupy

def get_interaction_by_id(self, interaction_id):
    if not isinstance(interaction_id, int):
        raise TypeError("interaction_id must be int, not '%s'" % str(interaction_id))
    for interaction in self.interactions():
        if interaction.interaction_id() == interaction_id:
            return interaction
    raise NoSuchInteractionError("%s has no interaction %i" % (str(self), interaction_id))


[docs]def get_all_interactions(): """Returns a list of all interactions in the Guide to PHARMACOLOGY database. This can take a few seconds. :returns: list of :py:class:`Interaction` objects""" json_data = gtop.get_json_from_gtop("interactions") return [Interaction(t) for t in json_data]
[docs]class Interaction: """A Guide to PHARMACOLOGY interaction object. :param json_data: A dictionary obtained from the web services.""" def __init__(self, json_data): self.json_data = json_data self._interaction_id = json_data["interactionId"] self._ligand_id = json_data["ligandId"] self._target_id = json_data["targetId"] self._species = json_data["targetSpecies"] self._primary_target = json_data["primaryTarget"] self._endogenous = json_data["endogenous"] self._interaction_type = json_data["type"] self._action = json_data["action"] affinity_values = "".join( [char for char in json_data["affinity"] if char in "0123456789. "] ).split() affinity_values = tuple(sorted([float(val) for val in affinity_values])) self._affinity_low = affinity_values[0] if affinity_values else None self._affinity_high = affinity_values[-1] if affinity_values else None self._affinity_type = json_data["affinityType"] def __repr__(self): return "<Interaction (%i --> %s %i)>" % ( self._ligand_id, self._species, self._target_id )
[docs] def interaction_id(self): """Returns the interaction's GtoP ID. :rtype: int""" return self._interaction_id
[docs] def ligand_id(self): """Returns the GtoP ID of the associated ligand. :rtype: int""" return self._ligand_id
[docs] def ligand(self): """Returns the Ligand object for this interaction. :rtype: :py:class:`.Ligand`""" from .ligands import get_ligand_by_id try: return get_ligand_by_id(self._ligand_id) except NoSuchLigandError: return None
[docs] def target_id(self): """Returns the GtoP ID of the associated target. :rtype: int""" return self._target_id
[docs] def target(self): """Returns the Target object for this interaction. :rtype: :py:class:`.Target`""" from .targets import get_target_by_id try: return get_target_by_id(self._target_id) except NoSuchTargetError: return None
@ask_about_molecupy def gtop_pdbs(self): """Returns a list of PDBs which the Guide to PHARMACOLOGY says contain this interaction. :param bool as_molecupy: Returns the PDBs as \ `molecuPy <http://molecupy.readthedocs.io>`_ PDB objects. :returns: list of ``str`` PDB codes""" json_data = gtop.get_json_from_gtop("targets/%i/pdbStructure" % self._target_id) if json_data: return [ pdb["pdbCode"] for pdb in json_data if pdb["species"].lower() == self._species.lower() and pdb["ligandId"] == self._ligand_id and pdb["pdbCode"] ] else: return [] @ask_about_molecupy def all_external_pdbs(self): """Queries the RSCB PDB database for PDBs containing this interaction by all parameters. :param bool as_molecupy: Returns the PDBs as \ `molecuPy <http://molecupy.readthedocs.io>`_ PDB objects. :returns: list of ``str`` PDB codes""" ligand_external_pdbs = self.ligand().all_external_pdbs() target_external_pdbs = self.target().uniprot_pdbs(species=self.species()) return [code for code in ligand_external_pdbs if code in target_external_pdbs] @ask_about_molecupy def all_pdbs(self): """Get a list of PDB codes containing this interaction using all means available - annotated and external. :param bool as_molecupy: Returns the PDBs as \ `molecuPy <http://molecupy.readthedocs.io>`_ PDB objects. :returns: list of ``str`` PDB codes""" ligand_pdbs = self.ligand().all_pdbs() target_pdbs = self.target().all_pdbs(species=self.species()) return [code for code in ligand_pdbs if code in target_pdbs]
[docs] def species(self): """Returns the species in which the interaction takes place. :rtype: str""" return self._species
[docs] def primary_target(self): """Returns ``True`` if the the interaction represents a ligand interacting with its primary target. :rtype: bool""" return self._primary_target
[docs] def endogenous(self): """Returns ``True`` if the the interaction is an endogenous interaction. :rtype: bool""" return self._endogenous
[docs] def interaction_type(self): """Returns the type of interaction. :rtype: str""" return self._interaction_type
[docs] def action(self): """Returns the action of the interaction. :rtype: str""" return self._action
[docs] def affinity_low(self): """Returns the lowest reported affinity for this interaction. :rtype: float""" return self._affinity_low
[docs] def affinity_high(self): """Returns the highest reported affinity for this interaction. :rtype: float""" return self._affinity_high
[docs] def affinity_type(self): """Returns the units of the interaction. :rtype: str""" return self._affinity_type