示例#1
0
    def test_deletion(self, user_response):
        tab = MetaboliteTab()
        model = Model()
        metabolite1 = Metabolite("m1")
        metabolite2 = Metabolite("m2")
        metabolite3 = Metabolite("m3")
        model.add_metabolites([metabolite1, metabolite2, metabolite3])
        model.setup_metabolite_table()
        assert len(
            model.metabolites) == model.QtMetaboliteTable.rowCount() == 3
        tab.set_model(model)
        tab.confirmDeletion = Mock(return_value=user_response)

        item = tab.dataTable.item(1, 0)
        selected_metabolite = item.link
        source_index = tab.dataTable.indexFromItem(item)
        view_index = tab.proxyModel.mapFromSource(source_index)
        tab.dataView.selectRow(view_index.row())

        assert tab.confirmDeletion.called is False
        tab.deleteItemSlot()
        assert tab.confirmDeletion.called is True
        assert (selected_metabolite in model.metabolites) is not user_response
        assert tab.dataTable.findItems(
            selected_metabolite.id) is not user_response
        if user_response:
            assert len(
                model.metabolites) == model.QtMetaboliteTable.rowCount() == 2
示例#2
0
    def test_map_metabolite_by_formula(self, database, progress):
        model = Model()
        met1 = Metabolite("m1", formula="H2O")
        model.add_metabolites([met1])

        update_metabolite_database_mapping(database, model, progress)
        assert model.database_mapping[met1] == 1
示例#3
0
    def test_map_metabolite_by_name(self, database, progress):
        model = Model()
        met1 = Metabolite("m1", name="Water")
        model.add_metabolites([met1])

        update_metabolite_database_mapping(database, model, progress)
        assert model.database_mapping[met1] == 1
示例#4
0
    def test_not_mapped_for_name_substring(self, database, progress):
        model = Model()
        met1 = Metabolite("m1", name="ater")
        model.add_metabolites([met1])

        update_metabolite_database_mapping(database, model, progress)
        assert model.database_mapping[met1] is None
示例#5
0
    def test_get_item_from_model(self):
        model = Model("test id")
        reaction = Reaction("r_id")
        metabolite = Metabolite("m_id")
        gene = Gene("g_id")
        # ToDo: Add gene group

        model.add_reactions([reaction])
        model.add_metabolites([metabolite]),
        model.add_gene(gene)
        # ToDo: Add gene group

        assert get_item_from_model("Model", model.id, model) is model
        assert get_item_from_model("Reaction", reaction.id, model) is reaction
        assert get_item_from_model("Metabolite", metabolite.id, model) is metabolite
        assert get_item_from_model("Gene", gene.id, model) is gene

        # Test expected errors

        # GeneGroup not implemented
        with pytest.raises(NotImplementedError):
            get_item_from_model("GeneGroup", "test_id", model)

        # ID not in model
        with pytest.raises(KeyError):
            get_item_from_model("Reaction", "Not in model", model)
        with pytest.raises(KeyError):
            get_item_from_model("Metabolite", "Not in model", model)
        with pytest.raises(KeyError):
            get_item_from_model("Gene", "Not in model", model)
示例#6
0
    def test_map_metabolite_by_annotation(self, database, progress):
        model = Model()
        met1 = Metabolite("m1")
        model.add_metabolites([met1])
        met1.annotation.add(
            Annotation(identifier="MNXM2", collection="metanetx.chemical"))

        update_metabolite_database_mapping(database, model, progress)
        assert model.database_mapping[met1] == 1
示例#7
0
 def test_edit_item_dialog_reject(self):
     tab = MetaboliteTab()
     model = Model()
     metabolite1 = Metabolite("m1")
     model.add_metabolites([metabolite1])
     model.setup_metabolite_table()
     model.QtMetaboliteTable.update_row_from_link = Mock()
     tab.set_model(model)
     tab.dataView.selectRow(0)
     assert model.QtMetaboliteTable.update_row_from_link.called is False
     tab.editItemSlot()
     assert model.QtMetaboliteTable.update_row_from_link.called is False
示例#8
0
    def test_addition_of_attributes_only_when_set(self):
        model = Model("Test")
        metabolite = Metabolite(id="test")
        model.add_metabolites([metabolite])

        add_metabolites(self.root, model)

        metabolite_node = self.root.find(sbml3_listOfSpecies+"/"+sbml3_species)
        assert metabolite_node is not None
        assert metabolite_node.get(fbc_charge) is None
        assert metabolite_node.get(fbc_chemicalFormula) is None
        assert metabolite_node.get("name") is None
        assert metabolite_node.get("compartment") is None
示例#9
0
    def test_no_map_by_stoichiometry_if_any_metabolite_not_mapped(
            self, database, progress):
        model = Model()
        met1 = Metabolite("m1")
        met2 = Metabolite("m2")
        model.add_metabolites((met1, met2))
        model.database_mapping.update({met1: 1})

        reaction = Reaction("r1")
        reaction.add_metabolites({met1: -1, met2: -1})
        model.add_reactions([reaction])

        update_reaction_database_mapping(database, model, progress)
        assert reaction not in model.database_mapping
示例#10
0
    def test_map_reaction_by_stoichiometry(self, database, progress):
        model = Model()
        met1 = Metabolite("m1")
        met2 = Metabolite("m2")
        met3 = Metabolite("m3")
        met4 = Metabolite("m4")
        model.add_metabolites((met1, met2, met3, met4))
        model.database_mapping.update({met1: 1, met2: 2, met3: 3, met4: 4})
        reaction = Reaction("r1")
        reaction.add_metabolites({met1: -1, met2: -1, met3: 1, met4: 1})
        model.add_reactions([reaction])

        update_reaction_database_mapping(database, model, progress)

        assert model.database_mapping[reaction] == 1
示例#11
0
    def test_map_reaction_by_annotation(self, database, progress):
        model = Model()
        met1 = Metabolite("m1")
        met2 = Metabolite("m2")
        model.add_metabolites([met1, met2])

        reaction = Reaction("r1")
        reaction.add_metabolites({met1: -1, met2: 1})
        reaction.annotation.add(
            Annotation(identifier="MNXR14892", collection="metanetx.reaction"))
        model.add_reactions([reaction])

        update_reaction_database_mapping(database, model, progress)

        assert model.database_mapping[reaction] == 1
def test_add_compartments_defined_in_metabolite():
    model = Model()
    metabolite = Metabolite(id="test", compartment="c")
    model.add_metabolites([metabolite])

    root = Element("Root")
    add_compartments(root, model)

    compartment_list = root.find(sbml3_listOfCompartments)
    assert compartment_list is not None

    compartment = compartment_list.find(sbml3_compartment)
    assert compartment is not None
    assert compartment.get("id") == "c"
    assert compartment.get("name") is None
示例#13
0
    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()
示例#14
0
    def test_add_item_dialog_reject(self):
        tab = MetaboliteTab()
        model = Model()
        model.add_metabolites = Mock()
        model.QtMetaboliteTable.update_row_from_item = Mock()
        tab.set_model(model)

        assert model.add_metabolites.called is False
        assert model.QtMetaboliteTable.update_row_from_item.called is False
        tab.addItemSlot()
        assert model.add_metabolites.called is False
        assert model.QtMetaboliteTable.update_row_from_item.called is False
示例#15
0
    def test_update_iteratively(self):
        """ Check that metabolite are successfully
        updated one after another """

        react = Reaction("rea")
        met1 = Metabolite("met1", formula="C7H8O2")
        met2 = Metabolite("met2")
        met3 = Metabolite("met3")  # Update to CO2 in second iteration
        react.add_metabolites({met1: 1, met3: 1, met2: -1})

        react1 = Reaction("rea2")  # Transfer C8H8O4
        met4 = Metabolite("met4", formula="C8H8O4")
        react1.add_metabolites({met2: -1, met4: 1})

        # Setup model
        model = Model("id")
        model.add_metabolites([met1, met2, met3, met4])
        model.add_reactions([react, react1])

        return_value = update_formulae_iteratively(model)

        assert met2.formula == met4.formula
        assert met3.formula == "CO2"
        assert set(return_value) == set([met2, met3])
示例#16
0
class TestEditModelSettings:

    @pytest.fixture(autouse=True)
    def setup_items(self):
        self.test_id = "Test_id"
        self.test_name = "Test_name"
        self.model = Model(self.test_id, self.test_name)
        self.parent = QWidget()
        self.comp1_name = "Cytoplasm"
        self.comp1_id = "c"
        self.new_comp_id = "n"
        self.new_comp_name = "Nucleus"
        self.new_comp = Compartment(self.new_comp_id, self.new_comp_name)
        self.comp1 = Compartment(self.comp1_id, self.comp1_name)
        self.model.gem_compartments[self.comp1_id] = self.comp1
        self.metabolite = Metabolite("test", compartment=self.comp1_id)
        self.model.add_metabolites([self.metabolite])
        self.model.setup_tables()
        self.dialog = EditModelDialog(model=self.model)

    @pytest.fixture()
    def patch_progress(self, monkeypatch):
        monkeypatch.setattr("PyQt5.QtWidgets.QProgressDialog", Mock())
        monkeypatch.setattr("PyQt5.QtWidgets.QApplication.processEvents", Mock())

    def test_setup(self):
        assert self.model.name == self.test_name
        assert self.model.id == self.test_id
        assert self.comp1_id in self.model.gem_compartments
        assert self.model.gem_compartments[self.comp1_id] == self.comp1

        assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is False
        assert self.dialog.input_name.text() == self.test_name
        assert self.dialog.input_id.text() == self.test_id
        assert self.dialog.compartmentTable.rowCount() == 1

        assert self.metabolite in self.model.metabolites

    def test_change_in_id_enables_button(self):
        model = Model()
        model.gem_compartments["c"] = Compartment("c", "Cytoplasm")
        dialog = EditModelDialog(model=model)
        save_button = dialog.buttonBox.button(QDialogButtonBox.Save)

        # Change id
        assert save_button.isEnabled() is False
        QtTest.QTest.keyClick(dialog.input_id, "M")
        assert save_button.isEnabled() is True

        # Undo change
        QtTest.QTest.keyClick(dialog.input_id, QtCore.Qt.Key_Backspace)
        assert save_button.isEnabled() is False

    def test_change_in_name_enables_button(self):
        model = Model()
        model.gem_compartments["c"] = Compartment("c", "Cytoplasm")
        dialog = EditModelDialog(model=model)
        save_button = dialog.buttonBox.button(QDialogButtonBox.Save)

        # Change id
        assert save_button.isEnabled() is False
        QtTest.QTest.keyClicks(dialog.input_name, "M")
        assert save_button.isEnabled() is True

        # Undo change
        QtTest.QTest.keyClick(dialog.input_name, QtCore.Qt.Key_Backspace)
        assert save_button.isEnabled() is False

    def test_add_compartment(self):
        row_count = self.dialog.compartmentTable.rowCount()
        self.dialog._add_new_compartment_to_table(self.new_comp)
        assert self.dialog.compartmentTable.rowCount() == row_count + 1
        assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is True
        assert self.dialog.input_changed() is True

    def test_compartment_deletion(self):
        assert self.dialog.compartmentTable.rowCount() == 1
        self.dialog.compartmentTableView.selectRow(0)
        QtTest.QTest.mouseClick(self.dialog.button_del_compartment, QtCore.Qt.LeftButton)
        assert self.dialog.compartmentTable.rowCount() == 0

    def test_change_compartment_name(self):
        assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is False
        self.dialog.compartmentTable.item(0, 1).setText(self.new_comp_name)
        assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is True

    def test_save_changes_id(self):
        QtTest.QTest.keyClicks(self.dialog.input_id, self.test_id)
        self.dialog.save_changes()
        assert self.model.id == self.test_id + self.test_id

    def test_save_changes_name(self):
        QtTest.QTest.keyClicks(self.dialog.input_name, self.test_name)
        self.dialog.save_changes()
        assert self.model.name == self.test_name + self.test_name

    def test_save_changes_compartment_addition(self):
        self.dialog._add_new_compartment_to_table(self.new_comp)
        assert self.dialog.compartmentTable.rowCount() == 2
        self.dialog.save_changes()
        assert self.model.gem_compartments == {self.comp1_id: self.comp1,
                                               self.new_comp_id: self.new_comp}
        assert self.metabolite in self.model.metabolites

    def test_save_changes_compartment_deletion(self):
        self.dialog.compartmentTable.setRowCount(0)
        assert self.metabolite in self.model.metabolites
        self.dialog.save_changes()
        assert self.model.gem_compartments == {}
        assert self.metabolite not in self.model.metabolites

    def test_save_changed_compartment_name(self):
        self.dialog.compartmentTable.item(0, 1).setText(self.new_comp_name)
        assert self.dialog.buttonBox.button(QDialogButtonBox.Save).isEnabled() is True
        self.dialog.save_changes()
        assert self.model.gem_compartments[self.comp1_id].name == self.new_comp_name

    def test_save_changed_compartment_id(self):
        new_id = "z"
        self.dialog.compartmentTable.item(0, 0).setText(new_id)
        self.dialog.save_changes()
        assert "z" in self.model.gem_compartments
        assert self.metabolite.compartment == new_id
        assert self.model.gem_compartments[new_id] is self.comp1
        assert self.comp1.name == self.comp1_name
示例#17
0
class TestModelDisplayWidget:
    @pytest.fixture(autouse=True)
    def setup_items(self):
        self.parent = QWidget()
        self.widget = ModelDisplayWidget(self.parent)

        self.test_id = "Test_model"
        self.test_name = "Test name"
        self.model = Model(self.test_id, name=self.test_name)

        self.comp1_abbrev = "c"
        self.comp1_name = "Cytoplasm"
        self.comp1 = Compartment(self.comp1_abbrev, self.comp1_name)
        self.model.gem_compartments[self.comp1_abbrev] = self.comp1

        self.gene = Gene(id="test_id", name="test_name")
        self.metabolite = Metabolite(id="test_id", compartment="c")
        self.reaction = Reaction(id="test_id")

        self.model.add_metabolites([self.metabolite])
        self.model.add_reactions([self.reaction])
        self.model.genes.append(self.gene)

    def test_setup(self):
        assert len(self.model.metabolites) == 1
        assert len(self.model.reactions) == 1
        assert len(self.model.genes) == 1
        assert self.model.id == self.test_id
        assert self.model.name == self.test_name
        assert self.model.gem_compartments[self.comp1_abbrev] == self.comp1

    def test_model_addition(self):
        path = "Test_path"
        self.widget.set_model(self.model, path=path)

        assert self.widget.label_model_id.text() == self.test_id
        assert self.widget.label_model_name.text() == self.test_name
        assert self.widget.label_number_genes.text() == str(
            len(self.model.genes))
        assert self.widget.label_number_reactions.text() == str(
            len(self.model.reactions))
        assert self.widget.label_number_metabolites.text() == str(
            len(self.model.metabolites))
        assert self.widget.label_model_path.text() == path

    def test_clear_information(self):
        path = "Test_path"
        self.widget.set_model(self.model, path=path)

        self.widget.clear_information()
        assert self.widget.label_model_name.text() == ""
        assert self.widget.label_model_id.text() == ""
        assert self.widget.label_number_reactions.text() == ""
        assert self.widget.label_number_metabolites.text() == ""
        assert self.widget.label_number_genes.text() == ""
        assert self.widget.label_model_path.text() == path

    def test_setting_empty_model(self):
        path = "Test_path"
        self.widget.set_model(self.model, path=path)

        self.widget.set_model(None)
        assert self.widget.label_model_name.text() == ""
        assert self.widget.label_model_id.text() == ""
        assert self.widget.label_number_reactions.text() == ""
        assert self.widget.label_number_metabolites.text() == ""
        assert self.widget.label_number_genes.text() == ""
        assert self.widget.label_model_path.text() == ""
示例#18
0
class TestMetaboliteIO:

    @pytest.fixture(autouse=True)
    def setup_items(self):

        self.test_id = "test_id"
        self.test_name = "test_name"
        self.test_formula = "H2O"
        self.test_charge = 0
        self.test_compartment = "t"
        self.metabolite = Metabolite(id=self.test_id,
                                     name=self.test_name,
                                     formula=self.test_formula,
                                     charge=self.test_charge,
                                     compartment=self.test_compartment)

        self.annotation1 = Annotation("chebi", "CHEBI:37671")
        self.metabolite.annotation.add(self.annotation1)

        self.model = Model("Test")
        self.model.add_metabolites([self.metabolite])
        self.root = Element("root")

    def test_setup(self):

        assert self.metabolite.id == self.test_id
        assert self.metabolite.name == self.test_name
        assert self.metabolite.formula == self.test_formula
        assert self.metabolite.compartment == self.test_compartment
        assert self.metabolite.charge == self.test_charge

        assert len(self.model.metabolites) == 1
        assert len(self.metabolite.annotation) == 1
        assert isinstance(self.metabolite.annotation, set)
        assert self.annotation1 in self.metabolite.annotation

    def test_adding_metabolites_to_xml(self):

        add_metabolites(self.root, self.model)

        assert len(self.root) == 1

        metabolite_list_node = self.root.find(sbml3_listOfSpecies)
        assert metabolite_list_node is not None
        assert len(metabolite_list_node) == 1

        metabolite = metabolite_list_node.find(sbml3_species)
        assert metabolite is not None
        assert metabolite.get(fbc_charge) is None
        assert metabolite.get("compartment") == self.test_compartment
        assert metabolite.get(fbc_chemicalFormula) == self.test_formula
        assert metabolite.get("id") == cobra_metabolite_prefix + self.test_id
        assert metabolite.get("name") == self.test_name

        annotation_node = metabolite.find("/".join([sbml3_annotation, rdf_RDF, rdf_description,
                                                    bqbiol_is, rdf_bag, rdf_li]))
        assert annotation_node is not None
        assert annotation_node.get(rdf_resource) == "http://identifiers.org/chebi/CHEBI:37671"

    def test_addition_of_attributes_only_when_set(self):
        model = Model("Test")
        metabolite = Metabolite(id="test")
        model.add_metabolites([metabolite])

        add_metabolites(self.root, model)

        metabolite_node = self.root.find(sbml3_listOfSpecies+"/"+sbml3_species)
        assert metabolite_node is not None
        assert metabolite_node.get(fbc_charge) is None
        assert metabolite_node.get(fbc_chemicalFormula) is None
        assert metabolite_node.get("name") is None
        assert metabolite_node.get("compartment") is None

    def test_parsing_of_valid_metabolite(self):
        parent_node = ET.fromstring(valid_metabolite_with_annotation)
        metabolites = parse_metabolites(parent_node)
        assert len(metabolites) == 1

        metabolite = metabolites[0]
        assert metabolite.id == "13GLUCAN"
        assert metabolite.name == "1,3-beta-D-Glucan"
        assert metabolite.compartment == "c"
        assert metabolite.formula == "C18H32O16"
        assert metabolite.charge == 0
        assert len(metabolite.annotation) == 3

        assert Annotation("inchi", "InChI=1S/C18H32O16/c19-1-4-7(22)10(25)11(26)17(31-4)34-15-9(24)6(3-21)32-18(13(15)28)33-14-8(23)5(2-20)30-16(29)12(14)27/h4-29H,1-3H2/t4-,5-,6-,7-,8-,9-,10+,11-,12-,13-,14+,15+,16-,17+,18+/m1/s1") in metabolite.annotation
        assert Annotation("chebi", "CHEBI:37671") in metabolite.annotation
        assert Annotation("kegg.compound", "C00965") in metabolite.annotation

    def test_parsing_of_valid_metabolite_wo_annotation(self):
        parent_node = ET.fromstring(valid_metabolite_wo_annotation)
        metabolites = parse_metabolites(parent_node)
        assert len(metabolites) == 1

        metabolite = metabolites[0]
        assert metabolite.id == "13GLUCAN"
        assert metabolite.name == "1,3-beta-D-Glucan"
        assert metabolite.compartment == "c"
        assert metabolite.formula == ""
        assert metabolite.charge == 0

    def test_read_write_consistency(self):

        root = Element("root")
        add_metabolites(root, self.model)

        metabolites = parse_metabolites(root)
        assert len(metabolites) == 1

        metabolite = metabolites[0]
        assert metabolite.id == self.test_id
        assert metabolite.name == self.test_name
        assert metabolite.charge == self.test_charge
        assert metabolite.formula == self.test_formula
        assert isinstance(metabolite.annotation, set)

        assert self.annotation1 in metabolite.annotation