def test_exchange_specific_sbo_presence(read_only_model): """Expect all exchange reactions to be annotated with SBO:0000627. SBO:0000627 represents the term 'exchange reaction'. The Systems Biology Ontology defines an exchange reaction as follows: 'A modeling process to provide matter influx or efflux to a model, for example to replenish a metabolic network with raw materials (eg carbon / energy sources). Such reactions are conceptual, created solely for modeling purposes, and do not have a physical correspondence. Exchange reactions, often represented as 'R_EX_', can operate in the negative (uptake) direction or positive (secretion) direction. By convention, a negative flux through an exchange reaction represents uptake of the corresponding metabolite, and a positive flux represent discharge.' Every exchange reaction should be annotated with this. Exchange reactions differ from demand reactions in that the metabolites are removed from or added to the extracellular environment only. """ ann = test_exchange_specific_sbo_presence.annotation exchanges = helpers.find_exchange_rxns(read_only_model) ann["data"] = get_ids(sbo.check_component_for_specific_sbo_term( exchanges, "SBO:0000627")) try: ann["metric"] = len(ann["data"]) / len(exchanges) ann["message"] = wrapper.fill( """A total of {} exchange reactions ({:.2%} of all exchange reactions) lack annotation with the SBO term "SBO:0000627" for 'exchange reaction': {}""".format( len(ann["data"]), ann["metric"], truncate(ann["data"]))) except ZeroDivisionError: ann["metric"] = 1.0 ann["message"] = "The model has no exchange reactions." pytest.skip(ann["message"]) assert len(ann["data"]) == len(exchanges), ann["message"]
def find_untagged_exchange_rxns(model): """ Find exchange reactions whose identifiers do not begin with ``EX_``. Parameters ---------- model : cobra.Model A cobrapy metabolic model """ exchange_rxns = helpers.find_exchange_rxns(model) comp_pattern = "^EX_\w*?" return [rxn for rxn in exchange_rxns if not re.match(comp_pattern, rxn.id)]
def find_false_exchange_rxns(model): """ Find reactions that are tagged with ``EX_`` but are not exchange reactions. Parameters ---------- model : cobra.Model A cobrapy metabolic model """ true_exchange_rxns = helpers.find_exchange_rxns(model) comp_pattern = "^EX_\w*?" all_rxns_tagged_EX = [ rxn for rxn in model.reactions if re.match(comp_pattern, rxn.id) ] # false exchange reactions return set(all_rxns_tagged_EX).difference(set(true_exchange_rxns))
def test_exchange_specific_sbo_presence(model): """Expect all exchange reactions to be annotated with SBO:0000627. SBO:0000627 represents the term 'exchange reaction'. The Systems Biology Ontology defines an exchange reaction as follows: 'A modeling process to provide matter influx or efflux to a model, for example to replenish a metabolic network with raw materials (eg carbon / energy sources). Such reactions are conceptual, created solely for modeling purposes, and do not have a physical correspondence. Exchange reactions, often represented as 'R_EX_', can operate in the negative (uptake) direction or positive (secretion) direction. By convention, a negative flux through an exchange reaction represents uptake of the corresponding metabolite, and a positive flux represent discharge.' Every exchange reaction should be annotated with this. Exchange reactions differ from demand reactions in that the metabolites are removed from or added to the extracellular environment only. Implementation: Check if each exchange reaction has a non-zero "annotation" attribute that contains the key "sbo" with the associated value being one of the SBO terms above. """ ann = test_exchange_specific_sbo_presence.annotation exchanges = helpers.find_exchange_rxns(model) ann["data"] = get_ids(sbo.check_component_for_specific_sbo_term( exchanges, "SBO:0000627")) try: ann["metric"] = len(ann["data"]) / len(exchanges) ann["message"] = wrapper.fill( """A total of {} exchange reactions ({:.2%} of all exchange reactions) lack annotation with the SBO term "SBO:0000627" for 'exchange reaction': {}""".format( len(ann["data"]), ann["metric"], truncate(ann["data"]))) except ZeroDivisionError: ann["metric"] = 1.0 ann["message"] = "The model has no exchange reactions." pytest.skip(ann["message"]) assert len(ann["data"]) == len(exchanges), ann["message"]