# -*- coding: utf-8 -*-
"""Manager for Bio2BEL FamPlex."""
from typing import Mapping
import networkx as nx
from tqdm import tqdm
from bio2bel.manager.bel_manager import BELManagerMixin
from pybel import BELGraph
from pybel.dsl import Protein
from .equivalences import append_equivalences_graph, get_equivalences_df
from .relations import build_relations_graph, get_relations_df
__all__ = [
'Manager',
]
[docs]class Manager(BELManagerMixin):
"""Protein family and complex hierarchy."""
def __init__(self, *args, **kwargs): # noqa:D107
relations_df = get_relations_df()
self.graph = build_relations_graph(relations_df)
equivalences_df = get_equivalences_df()
append_equivalences_graph(equivalences_df, self.graph)
@classmethod
def _get_connection(cls):
pass
[docs] @staticmethod
def is_populated() -> bool:
"""Return if the database is populated."""
return True
[docs] def summarize(self) -> Mapping[str, int]:
"""Summarize the database."""
return dict(
relations=self.count_relations(),
entries=self.count_entries(),
)
[docs] def count_entries(self) -> int:
"""Count the number of entries in the database."""
return self.graph.number_of_nodes()
[docs] def count_relations(self) -> int:
"""Count the number of relationships in the database."""
return self.graph.number_of_edges()
[docs] def to_bel(self) -> BELGraph:
"""Generate a BEL graph."""
return self.graph
[docs] def normalize_terms(self, graph: BELGraph, use_tqdm: bool = False) -> None:
"""Normalize FamPlex nodes in the graph."""
it = graph.nodes()
if use_tqdm:
it = tqdm(it, total=graph.number_of_nodes())
m = {
node: Protein(namespace=node.namespace, name=node.name, identifier=node.name)
for node in it
if isinstance(node, Protein) and node.namespace.upper() == 'FPLX'
}
nx.relabel_nodes(graph, m, copy=False)