def parse_group_sbml(groups_sbml, chebi): doc = libsbml.SBMLReader().readSBMLFromFile(groups_sbml) groups_model = doc.getModel() groups_plugin = groups_model.getPlugin("groups") r_id2g_id, s_id2gr_id, ub_sps = {}, {}, set() if groups_plugin: for group in groups_plugin.getListOfGroups(): gr_members = [it.getIdRef() for it in group.getListOfMembers()] gr_id, gr_name = group.getId(), group.getName() gr_sbo = group.getSBOTermID() gr_type = next(get_annotations(group, libsbml.BQB_IS_DESCRIBED_BY), None) if not gr_type: continue if SBO_BIOCHEMICAL_REACTION == gr_sbo: if GROUP_TYPE_EQUIV == gr_type: for r_id in gr_members: r_id2g_id[r_id] = gr_id, gr_name, len(gr_members) elif SBO_CHEMICAL_MACROMOLECULE == gr_sbo: if GROUP_TYPE_UBIQUITOUS == gr_type: ub_sps = set(gr_members) elif GROUP_TYPE_EQUIV == gr_type: for s_id in gr_members: term = get_chebi_term_by_annotation(group, chebi) s_id2gr_id[s_id] = gr_id, term if term else gr_name, len(gr_members) else: raise GrPlError() return r_id2g_id, s_id2gr_id, ub_sps
def parse_group_sbml(groups_sbml, chebi): doc = libsbml.SBMLReader().readSBMLFromFile(groups_sbml) groups_model = doc.getModel() groups_plugin = groups_model.getPlugin("groups") r_id2g_id, s_id2gr_id, ub_sps = {}, {}, set() if groups_plugin: for group in groups_plugin.getListOfGroups(): gr_members = [it.getIdRef() for it in group.getListOfMembers()] gr_id, gr_name = group.getId(), group.getName() gr_sbo = group.getSBOTermID() gr_type = next(get_annotations(group, libsbml.BQB_IS_DESCRIBED_BY), None) if not gr_type: continue if SBO_BIOCHEMICAL_REACTION == gr_sbo: if GROUP_TYPE_EQUIV == gr_type: for r_id in gr_members: r_id2g_id[r_id] = gr_id, gr_name, len(gr_members) elif SBO_CHEMICAL_MACROMOLECULE == gr_sbo: if GROUP_TYPE_UBIQUITOUS == gr_type: ub_sps = set(gr_members) elif GROUP_TYPE_EQUIV == gr_type: for s_id in gr_members: term = get_chebi_term_by_annotation(group, chebi) s_id2gr_id[s_id] = gr_id, term if term else gr_name, len(gr_members) else: raise GrPlError() return r_id2g_id, s_id2gr_id, ub_sps
def serialize_generalization(r_id2clu, s_id2clu, sbml, chebi, path): doc = libsbml.SBMLReader().readSBML(sbml) model = doc.getModel() groups_plugin = model.getPlugin("groups") clu2r_ids, clu2s_ids = invert_map(r_id2clu), invert_map(s_id2clu) wb = openpyxl.Workbook() ws = wb.create_sheet(0, "Metabolite Groups") row = 1 add_values(ws, row, 1, ["Group Id", "Group Name", "Group CHEBI", "Id", "Name", "Compartment", "CHEBI"], HEADER_STYLE) row += 1 processed_s_ids = set() for (g_id, ch_term), s_ids in sorted(clu2s_ids.items(), key=lambda ((g_id, _), s_ids): g_id): group = groups_plugin.getGroup(g_id) add_values(ws, row, 1, [g_id, group.getName(), ch_term.get_id() if ch_term else '']) for s_id in sorted(s_ids, key=lambda s_id: s_id[s_id.find('__'):]): species = model.getSpecies(s_id) ch_term = get_chebi_term_by_annotation(species, chebi) add_values(ws, row, 4, [s_id, species.getName(), model.getCompartment(species.getCompartment()).getName(), ch_term.get_id() if ch_term else '']) row += 1 processed_s_ids |= s_ids
add_values(ws, row, 1, [g_id, group.getName(), ch_term.get_id() if ch_term else '']) for s_id in sorted(s_ids, key=lambda s_id: s_id[s_id.find('__'):]): species = model.getSpecies(s_id) ch_term = get_chebi_term_by_annotation(species, chebi) add_values(ws, row, 4, [s_id, species.getName(), model.getCompartment(species.getCompartment()).getName(), ch_term.get_id() if ch_term else '']) row += 1 processed_s_ids |= s_ids ws = wb.create_sheet(1, "Ungrouped metabolites") row = 1 add_values(ws, row, 1, ["Id", "Name", "Compartment", "CHEBI"], HEADER_STYLE) row += 1 unm_l = 0 for species in sorted(model.getListOfSpecies(), key=lambda s: s.getId()[s.getId().find('__'):]): if species.getId() not in processed_s_ids: ch_term = get_chebi_term_by_annotation(species, chebi) add_values(ws, row, 1, [species.getId(), species.getName(), model.getCompartment(species.getCompartment()).getName(), ch_term.get_id() if ch_term else '']) row += 1 unm_l += 1 print unm_l ws = wb.create_sheet(2, "Reaction Groups") row = 1 add_values(ws, row, 1, ["Group Id", "Id", "Name", "Formula", "Gene Association"], HEADER_STYLE) row += 1 processed_r_ids = set() for (g_id, g_name), r_ids in sorted(clu2r_ids.items(), key=lambda ((g_id, g_name), _): g_id): add_values(ws, row, 1, [g_id]) for r_id in sorted(r_ids, key=lambda r_id: r_id[r_id.find('__'):]):