#!/www/html/D-I-TASSER/conda-envs/DIT-py3/bin/python3.9
#coding: utf-8
###** html/families.cgi - GLASS GPCR family browsing ******************
###
### Copyright © 2015 Regents of the University of Michigan
###
### All rights reserved.
"""Generate a family tree for GPCRs."""
import inspect
import os.path
import sys
__CURRENT_FILE = inspect.getfile(inspect.currentframe())
__CURRENT_DIR = os.path.dirname(os.path.realpath(__CURRENT_FILE))
__BASE_PATH = __CURRENT_DIR
sys.path.append(os.path.join(__BASE_PATH, "src"))
from dbquery import DatabaseQuery
from glass import GlassWebMod
##** Entry page class *************************************************
class GlassGpcrFamilies(GlassWebMod):
"""Generate a family tree for GPCRs."""
## Initialisation
def __init__(self):
"""Initialise an object."""
GlassWebMod.__init__(self)
self._query = DatabaseQuery()
self._data = dict()
self._content = None
## Context manager
def __enter__(self):
"""Should prepare for the response."""
return GlassWebMod.__enter__(self)
def __exit__(self, *args):
"""Should clean up all used resources and report error."""
return (self._query.__exit__(*args) or
GlassWebMod.__exit__(self, *args))
## Database query
def prepare_family_data(self):
"""Read family data from the database."""
for row in self._query.call("family_root"):
parent = row["parent"]
if parent in self._data:
self._data[parent].append([row["id"], row["name"]])
else:
self._data[parent] = [[row["id"], row["name"]]]
def generate_families(self, parent):
"""Generate code for a item list under the given parent."""
code = list()
# print(self._data[parent], file=sys.stderr)
items = sorted(self._data[parent], key=lambda x: x[1])
for item in items:
node = item[0]
if node in self._data:
item.append(self.generate_families(node))
code.append(self.format("family_open", *item))
else:
code.append(self.format("family_item", *item))
return "".join(code)
def prepare(self):
"""Get all related information from the database."""
try:
self.prepare_family_data();
self._content = self.generate_families(0);
except:
self.log_error()
self.error_info = ("err_internal", )
## Response
def response(self):
"""Prepare data and give proper response."""
self.prepare()
#if self.error_info is not None:
# self.make_error_page(self.format(*self.error_info))
# return
code = self.format("family", families=self._content)
self.make_page("GPCR families", code)
##** Main routine *****************************************************
if __name__ == "__main__":
with GlassGpcrFamilies() as page:
page.response()