def parse_metabolites(metabolites_node, model=None, progress=None, use_fbc=True): species_node = metabolites_node.find(sbml3_listOfSpecies) if species_node is None: return elif progress is None: pass elif not progress.wasCanceled(): progress.setLabelText("Reading metabolites...") progress.setRange(0, len(species_node)) else: return metabolites = [] for i, xml_element in enumerate(species_node.iterfind(sbml3_species)): if progress is None: pass elif not progress.wasCanceled(): progress.setValue(i) QApplication.processEvents() else: return new_metabolite = Metabolite(id=clip(xml_element.get("id"), "M_"), name=xml_element.get("name"), compartment=xml_element.get("compartment")) if use_fbc: formula = xml_element.get(fbc_chemicalFormula) if formula: if re.match(formula_validator, formula): new_metabolite.formula = formula else: # Todo: Implement logging of errors print("Formula '{}' for {} is invalid!".format( formula, new_metabolite.id)) charge = xml_element.get(fbc_charge) if charge is not None: new_metabolite.charge = int(charge) # Defaults to the standard value of 0 if charge not set in file annotate_element_from_xml(xml_element, new_metabolite) metabolites.append(new_metabolite) if model is not None: model.add_metabolites(metabolites) return metabolites
def test_updating(self): model = Model() met1 = Metabolite(id="met1", formula="H2O", name="Water", charge=0., compartment="c") react1 = Reaction(id="react1", name="test2", subsystem="test2", lower_bound=0., upper_bound=1000.) react1.add_metabolites({met1: -1}) model.add_metabolites([met1]) model.add_reactions([react1]) model.setup_tables() assert model.QtReactionTable.rowCount() == 1 assert model.QtMetaboliteTable.rowCount() == 1 # Check that content is right for i, element in enumerate(model.QtMetaboliteTable.header): assert str(getattr(met1, element.lower())) == model.QtMetaboliteTable.item(0, i).text() # Check that metabolite id is in table assert met1.id in model.QtReactionTable.item(0, 2).text() # Change metabolite met1.id = "new_id" met1.name = "new_name" met1.formula = "H2O2" met1.name = "None" met1.charge = 1. met1.compartment = "e" # Tables are out of sync for i, element in enumerate(model.QtMetaboliteTable.header): assert str(getattr(met1, element.lower())) != model.QtMetaboliteTable.item(0, i).text() # Check reaction table out of sync assert react1.id not in model.QtReactionTable.item(0, 2).text() model.gem_update_metabolites([met1]) # Metabolite table updated for i, element in enumerate(model.QtMetaboliteTable.header): assert str(getattr(met1, element.lower())) == model.QtMetaboliteTable.item(0, i).text() # Reaction table updated assert met1.id in model.QtReactionTable.item(0, 2).text()