Source code for gbd_mapping_generator.cause_builder

"""Tools for automatically generating the GBD cause mapping."""
from .base_template_builder import gbd_record_attrs, modelable_entity_attrs
from .data import get_cause_data, get_cause_list
from .globals import ID_TYPES
from .util import (
    SPACING,
    TAB,
    TEXTWIDTH,
    make_import,
    make_module_docstring,
    make_record,
    text_wrap,
    to_id,
)

IMPORTABLES_DEFINED = ("Cause", "causes")


[docs]def get_base_types(): cause_attrs = [ ("name", "str"), ("kind", "str"), ("gbd_id", ID_TYPES.C_ID), ("me_id", f"Union[{ID_TYPES.ME_ID}, Unknown]"), ("most_detailed", "bool"), ("level", "int"), ("restrictions", "Restrictions"), ] cause_attrs += [ ("parent", '"Cause" = None'), ("sub_causes", 'Tuple["Cause", ...] = None'), ("sequelae", "Tuple[Sequela, ...] = None"), ("etiologies", "Tuple[Etiology, ...] = None"), ] return { "Cause": { "attrs": tuple(cause_attrs), "superclass": ("ModelableEntity", modelable_entity_attrs), "docstring": "Container for cause GBD ids and metadata", }, "Causes": { "attrs": tuple([(name, "Cause") for name in get_cause_list()]), "superclass": ("GbdRecord", gbd_record_attrs), "docstring": "Container for GBD causes.", }, }
[docs]def make_cause( name, c_id, me_id, most_detailed, level, restrictions, sequelae=None, etiologies=None ): out = "" out += TAB + f"'{name}': Cause(\n" out += TAB * 2 + f"name='{name}',\n" out += TAB * 2 + f"kind='cause',\n" out += TAB * 2 + f"gbd_id={ID_TYPES.C_ID}({c_id}),\n" out += TAB * 2 + f"me_id={to_id(me_id, ID_TYPES.ME_ID)},\n" out += TAB * 2 + f"level={level},\n" out += TAB * 2 + f"most_detailed={bool(most_detailed)},\n" out += TAB * 2 + f"parent=None,\n" out += TAB * 2 + f"restrictions=Restrictions(\n" for restriction, value in restrictions: out += TAB * 3 + f"{restriction}={value},\n" out += TAB * 2 + "),\n" for entity_name, entity in zip(["sequelae", "etiologies"], [sequelae, etiologies]): field = 2 * TAB + f"{entity_name}=(" offset = len(field) out += field if entity: char_count = offset for item in entity: if entity_name == "sub_causes": item_name = f"causes.{item}, " else: item_name = f"{entity_name}.{item}, " if char_count == offset: out += item_name char_count += len(item_name) elif char_count + len(item_name) > TEXTWIDTH: out += "\n" + " " * offset + item_name char_count = offset + len(item_name) else: out += item_name char_count += len(item_name) out += "),\n" out += TAB + "),\n" return out
[docs]def make_causes(causes_list): out = f"causes = Causes(**{{\n" for ( name, c_id, me_id, most_detailed, cause_level, parent, restrictions, sequelae, etiologies, sub_causes, ) in causes_list: out += make_cause( name, c_id, me_id, most_detailed, cause_level, restrictions, sequelae, etiologies ) out += "})\n\n" for ( name, c_id, me_id, most_detailed, cause_level, parent, restrictions, sequelae, etiologies, sub_causes, ) in causes_list: if name != parent: out += f"causes.{name}.parent = causes.{parent}\n" if sub_causes: if name in sub_causes: sub_causes.remove(name) out += text_wrap( f"causes.{name}.sub_causes = (", [f"causes.{s}" for s in sub_causes] + [")"] ) out += "\n" return out
[docs]def build_mapping_template(): out = make_module_docstring("Mapping templates for GBD causes.", __file__) out += make_import("typing", ("Union", "Tuple")) + "\n" out += make_import(".id", (ID_TYPES.C_ID, ID_TYPES.ME_ID, "Unknown")) out += make_import(".base_template", ("Restrictions", "ModelableEntity", "GbdRecord")) out += make_import(".sequela_template", ("Sequela",)) out += make_import(".etiology_template", ("Etiology",)) for entity, info in get_base_types().items(): out += SPACING out += make_record(entity, **info) return out
[docs]def build_mapping(): out = make_module_docstring("Mapping of GBD causes.", __file__) out += make_import(".id", (ID_TYPES.C_ID, ID_TYPES.ME_ID, "UNKNOWN")) out += make_import(".base_template", ("Restrictions",)) out += make_import(".cause_template", ("Cause", "Causes")) out += make_import(".sequela", ("sequelae",)) out += make_import(".etiology", ("etiologies",)) + SPACING out += make_causes(get_cause_data()) return out