#!/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()