Source code for pypath.entity

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#  This file is part of the `pypath` python module
#  Exports tables for webservice.
#  Copyright (c) 2014-2020 - EMBL
#  File author(s): Dénes Türei (
#                  Nicolàs Palacio
#                  Olga Ivanova
#  Distributed under the GPLv3 License.
#  See accompanying file LICENSE.txt or copy at
#  Website:

Provides classes for representing molecular entities and their collections.
A molecular entity is defined by its identifier, type and taxon.

from future.utils import iteritems

import importlib as imp
import collections

import pypath.common as common
import pypath.intera as intera
import pypath.session_mod as session_mod
import pypath.mapping as mapping

EntityKey = collections.namedtuple(

[docs]class Entity(session_mod.Logger): """ Represents a molecular entity such as protein, miRNA, lncRNA or small molecule. :arg str identifier: An identifier from the reference database e.g. UniProt ID for proteins. :arg str entity_type: The type of the molecular entity, defaults to ``'protein'``. :arg str id_type: The type of the identifier (the reference database), default is ``'uniprot'``. :arg int taxon: The NCBI Taxonomy Identifier of the molecular entity, e.g. ``9606`` for human. Use ``0`` for non taxon specific molecules e.g. metabolites or drug compounds. :arg NoneType,dict attrs: A dictionary of additional attributes. """ __slots__ = [ 'identifier', 'entity_type', 'id_type', 'taxon', 'attrs', 'label', 'key', ] def __init__( self, identifier, entity_type = 'protein', id_type = 'uniprot', taxon = 9606, attrs = None, ): self.identifier = identifier self.entity_type = entity_type or self.get_entity_type() # override `protein` in case this is a `complex` self.entity_type = 'complex' if self.is_complex() else entity_type self.id_type = id_type self.taxon = taxon self.key = self._key self.attrs = attrs or {} self.set_label() def reload(self): modname = self.__class__.__module__ mod = __import__(modname, fromlist = [modname.split('.')[0]]) import importlib as imp imp.reload(mod) new = getattr(mod, self.__class__.__name__) setattr(self, '__class__', new) @staticmethod def entity_name_str(entity): return ( entity if isinstance(entity, common.basestring) else str(entity) ) @classmethod def igraph_vertex_name(cls, igraph_v): return cls.entity_name_str(igraph_v['name']) @staticmethod def igraph_vertex_label(igraph_v): return igraph_v['label'] @classmethod def igraph_vertex_name_label(cls, igraph_v): return ( cls.igraph_vertex_name(igraph_v), cls.igraph_vertex_label(igraph_v), ) @staticmethod def _is_protein(key): return ( isinstance(key, common.basestring) and not key.startswith('MIMAT') and not key.startswith('COMPLEX') ) @staticmethod def _is_mirna(key): return ( isinstance(key, common.basestring) and key.startswith('MIMAT') ) @staticmethod def _is_complex(key): return isinstance(key, intera.Complex) or ( isinstance(key, common.basestring) and key.startswith('COMPLEX') ) @classmethod def _get_entity_type(cls, key): return ( 'complex' if cls._is_complex(key) else 'mirna' if cls._is_mirna(key) else 'protein' ) def is_protein(self): return self._is_protein(self.identifier) def is_mirna(self): return self._is_mirna(self.identifier) def is_complex(self): return self._is_complex(self.identifier) def get_entity_type(self): return self._get_entity_type(self.identifier) @property def _key(self): return EntityKey( identifier = self.identifier, id_type = self.id_type, entity_type = self.entity_type, taxon = self.taxon, ) def __hash__(self): return hash(self.key) def __eq__(self, other): return ( self.__hash__() == other.__hash__() if hasattr(other, 'key') else self.identifier == other ) def __lt__(self, other): return ( self.key < other.key if hasattr(other, 'key') else self.identifier < other ) def __gt__(self, other): return ( self.key < other.key if hasattr(other, 'key') else self.identifier < other ) def set_label(self): self.label = mapping.label( name = self.identifier, id_type = self.id_type, ncbi_tax_id = self.taxon, ) or self.identifier def __repr__(self): return '<Entity: %s>' % (self.label or self.identifier) def __iadd__(self, other): if self == other: self.update_attrs(**other.attrs) return self def update_attrs(self, **kwargs): for key, val in iteritems(kwargs): if key in self.attrs: self.attrs[key] = common.combine_attrs((self.attrs[key], val)) else: self.attrs[key] = val
class EntityList(object): def __init__(self, entities): self._entities = ( entities if isinstance(entities, (list, tuple, set)) else list(entities) ) def __iter__(self): for e in self._entities: yield e def __len__(self): return len(self._entities) def __repr__(self): return '<EntityList (%u elements)>' % len(self) def __add__(self, other): return EntityList(set(itertools.chain(self._entities, list(other)))) def __iadd__(self, other): self._entities = set(itertools.chain(self._entities, list(other))) return self @property def labels(self): for e in self: yield e.label @property def ids(self): for e in self: yield e.identifier identifiers = ids @property def entities(self): for e in self: yield e @property def list_ids(self): return list(self.ids) @property def list_labels(self): return list(self.labels) @property def list_entities(self): return list(self.entities) l = labels i = ids e = entities ll = list_labels li = list_ids le = list_entities