예제 #1
0
    def test_setting_resetting_boundaries(self):
        gene = Gene()
        reaction = Reaction(lower_bound=-1000., upper_bound=1000.)
        reaction.add_child(gene)
        gene.functional = True

        condition = GeneSetting(gene, False)

        assert gene.functional is True
        assert reaction.upper_bound == 1000.
        assert reaction.lower_bound == -1000.

        condition.do()

        assert gene.functional is False
        assert reaction.upper_bound == 0.
        assert reaction.lower_bound == 0.

        condition.undo()

        assert gene.functional is True
        assert reaction.upper_bound == 1000.
        assert reaction.lower_bound == -1000.

        # Check that calling undo second time does not change value
        condition.undo()

        assert gene.functional is True
        assert reaction.upper_bound == 1000.
        assert reaction.lower_bound == -1000.
예제 #2
0
    def test_reaction_is_disabled_with_disabled_gene_only(self):
        reaction = Reaction()
        gene = Gene()
        gene.functional = False
        reaction.add_child(gene)

        assert reaction.functional is False
예제 #3
0
    def test_reaction_is_disabled_with_gene_in_and_group(self):
        reaction = Reaction()
        genegroup = GeneGroup(type="and")
        reaction.add_child(genegroup)
        gene = Gene()
        genegroup.add_child(gene)
        gene.functional = False

        assert reaction.functional is False
예제 #4
0
    def test_get_items(self):
        evidence1 = Evidence(entity=Gene("g1"))
        evidence2 = Evidence(entity=Gene("g2"))
        self.table.update_row_from_item(evidence1)
        self.table.update_row_from_item(evidence2)

        items = self.table.get_items()
        assert len(items) == 2
        assert items[0] is evidence1
        assert items[1] is evidence2
예제 #5
0
 def test_nested_genegroups_with_gene(self):
     genegroup1 = GeneGroup()
     genegroup2 = GeneGroup()
     gene = Gene("gene id")
     genegroup1.add_child(genegroup2)
     genegroup2.add_child(gene)
     assert genegroup1.gem_reaction_rule == gene.id
     gene2 = Gene("gene2 id")
     genegroup2.add_child(gene2)
     assert genegroup1.gem_reaction_rule == "("+gene.id+" and "+gene2.id+")"
예제 #6
0
 def test_two_genes_one_gene_group(self, reaction):
     gene1 = Gene("test 1")
     gene2 = Gene("test 2")
     group = GeneGroup(type="and")
     group.add_child(gene1)
     group.add_child(gene2)
     reaction.add_child(group)
     assert reaction.gene_reaction_rule == gene1.id + " and " + gene2.id
     group.type = "or"
     assert reaction.gene_reaction_rule == gene1.id + " or " + gene2.id
예제 #7
0
 def test_multiple_nested(self):
     reaction = Reaction()
     parent = reaction
     for _ in range(5):
         genegroup = GeneGroup()
         parent.add_child(genegroup)
         parent = genegroup
     gene = Gene("Gene id")
     parent.add_child(gene)
     assert reaction.gene_reaction_rule == gene.id
     gene2 = Gene("Gene 2")
     parent.add_child(gene2)
     assert reaction.gene_reaction_rule == "(" + gene.id+" and "+gene2.id+")"
예제 #8
0
 def test_gene_and_gene_group(self):
     gene1 = Gene("gene 1")
     gene2 = Gene("gene 2")
     gene3 = Gene("gene 3")
     genegroup1 = GeneGroup(type="and")
     genegroup2 = GeneGroup(type="or")
     reaction = Reaction()
     reaction.add_child(genegroup1)
     genegroup1.add_child(gene1)
     genegroup1.add_child(genegroup2)
     genegroup2.add_child(gene2)
     assert reaction.gene_reaction_rule == gene1.id+" and "+gene2.id
     genegroup2.add_child(gene3)
     assert reaction.gene_reaction_rule == gene1.id+" and ("+gene2.id+" or "+gene3.id+")"
예제 #9
0
 def test_default_values(self):
     gene = Gene()
     assert gene.id == ""
     assert gene.name == ""
     assert gene.genome == ""
     assert gene.annotation == set()
     assert gene.functional is True
예제 #10
0
    def test_gene_addition(self):
        reaction = Reaction("reaction_id")
        gene = Gene("gene_id")

        reaction.add_child(gene)
        assert gene in reaction.genes
        assert reaction in gene.reactions
예제 #11
0
    def test_full_example(self):
        """ Test that a minimal evidence example is parsed correctly """

        xml_tree = ET.fromstring(full_evidence)
        model = Model()
        reaction = Reaction("Test")
        target_item = Gene("target_id")
        reference = Reference("ref_id")
        model.add_reaction(reaction)
        model.add_gene(target_item)
        model.add_reference(reference)

        assert len(model.all_evidences) == 0
        assert len(reaction.evidences) == 0

        parse_evidences_from_xml(xml_tree, model)

        assert len(model.all_evidences) == 1
        assert len(reaction.evidences) == 1

        evidence = list(reaction.evidences)[0]
        assert evidence.entity is reaction
        assert evidence.target is target_item
        assert evidence.assertion == "Catalyzed by"
        assert evidence.eco == "ECO:0000000"
        assert len(evidence.references) == 1
        assert list(evidence.references)[0] is reference
        assert evidence.comment == "test comment"
예제 #12
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)
예제 #13
0
    def save_state(self):
        genes_added = 0
        for gene_id in self.plainTextEdit.toPlainText().split("\n"):
            try:
                gene = self.model.genes.get_by_id(gene_id.strip())
            except KeyError:
                if self.comboBox_missing.currentText() == "Add":
                    gene = Gene(gene_id.strip())
                    self.model.add_gene(gene)
                    self.model.QtGeneTable.update_row_from_item(gene)
                    genes_added += 1
                else:
                    continue

            # Generate an evidence item for each gene
            evidence = Evidence(entity=gene,
                                eco=self.evidence.eco,
                                assertion=self.evidence.assertion,
                                comment=self.evidence.comment,
                                target=self.evidence.target)

            # Add reference
            for reference in self.evidence.references:
                evidence.add_reference(reference)

            # Add evidence to model
            self.model.all_evidences[evidence.internal_id] = evidence

        if genes_added:
            QMessageBox(self).information(
                self, "Genes added",
                "{} new genes added!".format(str(genes_added)))
예제 #14
0
    def test_setting_item(self):
        gene = Gene("test_id", "name", "genome")
        model = Model()

        widget = GeneAttributesDisplayWidget()

        # Test prestate
        assert widget.iDLineEdit.text() == ""
        assert widget.nameLineEdit.text() == ""
        assert widget.genomeLineEdit.text() == ""

        widget.set_item(gene, model)

        assert widget.iDLineEdit.text() == gene.id
        assert widget.nameLineEdit.text() == gene.name
        assert widget.genomeLineEdit.text() == gene.genome

        assert widget.valid_inputs() is True
        assert widget.content_changed is False

        widget.set_item(None, model)

        assert widget.iDLineEdit.text() == ""
        assert widget.nameLineEdit.text() == ""
        assert widget.genomeLineEdit.text() == ""

        assert widget.valid_inputs() is False
        assert widget.content_changed is False
예제 #15
0
def _parse_gene_xml_tree(node, reaction, genes):
    """ Parse the gene tree as saved in an sbml file with fbc package """

    # Check that
    if node.tag == fbc_geneProductAssociation:
        top_level_child = _parse_gene_xml_tree(node.getchildren()[0], reaction,
                                               genes)
        reaction.add_child(top_level_child)
    elif node.tag in (fbc_and, fbc_or):
        gene_group = GeneGroup(id=node.get(ge_id),
                               type="and" if node.tag == fbc_and else "or")
        for child in node.getchildren():
            child_object = _parse_gene_xml_tree(child, reaction, genes)
            gene_group.add_child(child_object)
        return gene_group

    elif node.tag == fbc_geneProductRef:
        gene_id = clip(node.attrib[fbc_geneProduct], "G_")
        # Resubstitute dots
        gene_id = gene_id.replace(SBML_DOT, ".")
        try:
            return genes.get_by_id(gene_id)
        except KeyError:
            new_gene = Gene(id=gene_id, name=gene_id)
            genes.append(new_gene)
            warn("Gene {0} not found in gene list. New gene created!".format(
                gene_id))
            return new_gene
    else:
        raise TypeError("Unknown node.tag {0} at line {1}".format(
            node.tag, node.sourceline))
예제 #16
0
    def test_copy_evidence(self):
        entity = Reaction()
        target = Gene()
        eco = "ECO:000000"
        assertion = "Presence"
        comment = "test comment"
        reference = Reference()
        evidence = Evidence(entity=entity,
                            eco=eco,
                            assertion=assertion,
                            comment=comment,
                            target=target)
        evidence.add_reference(reference)

        # Create copy
        copy = evidence.copy()

        # Check the correctness of the copy
        assert evidence.entity is copy.entity
        assert evidence.target is copy.target
        assert evidence.eco == copy.eco
        assert evidence.assertion == copy.assertion
        assert evidence.comment == copy.comment
        assert evidence.references == copy.references
        assert evidence.references is not copy.references

        # Check that the copy is not linked
        assert copy not in entity.evidences
        assert copy not in reference.linked_items
        assert copy not in target.evidences
예제 #17
0
 def addItemSlot(self):
     new_gene = Gene()
     dialog = GeneEditDialog(self, new_gene, self.model)
     status = dialog.exec_()
     if status:
         self.model.genes.append(new_gene)
         self.dataTable.update_row_from_item(new_gene)
예제 #18
0
    def test_evidence_init(self):
        entity = Reaction()
        target = Gene("id2")
        eco = "ECO:000000"
        assertion = "Presence"
        comment = "test comment"
        reference = Reference()
        evidence = Evidence(entity=entity,
                            eco=eco,
                            assertion=assertion,
                            comment=comment,
                            target=target)
        evidence.add_reference(reference)

        # Check proper linking
        assert evidence.entity is entity
        assert evidence in entity.evidences
        assert evidence.target is target
        assert evidence in target.evidences

        # Check attributes
        assert evidence.assertion == assertion
        assert evidence.eco == eco
        assert evidence.comment == comment

        # Check id is set
        assert type(evidence.internal_id) is str
        assert evidence.internal_id != ""

        # Check the references
        assert reference in evidence.references
        assert evidence in reference.linked_items
예제 #19
0
    def test_execute_action_deletion(self):
        action = "deletion"

        # Delete Gene
        target = Mock()
        gene = Gene()
        self.widget.execute_action((target, action, gene))
        target.remove_child.assert_called_once_with(gene)

        # Delete GeneGroup
        target = Mock()
        gene_group = GeneGroup()
        gene_group.delete_children = Mock()
        self.widget.execute_action((target, action, gene_group))
        target.remove_child.assert_called_once_with(gene_group)
        assert gene_group.delete_children.called is False

        # Check that children are deleted if genegroup has only one parent
        target = Mock()
        gene_group = GeneGroup()
        gene_group.add_parent(self.reaction)
        gene_group.delete_children = Mock()
        self.widget.execute_action((target, action, gene_group))
        target.remove_child.assert_called_once_with(gene_group)
        assert gene_group.delete_children.called is True
예제 #20
0
    def test_gene_deletion(self):
        receiver = MockSlot()
        gene = Gene("Test id")
        self.widget.changed.connect(receiver.slot)
        self.reaction.add_child(gene)
        self.widget.set_item(self.reaction, self.model)

        # Check prior state
        assert len(self.widget.cached_actions) == 0
        assert self.widget.geneTable.rowCount() == 1
        assert gene in self.reaction._children

        # Action
        self.widget.geneView.setCurrentIndex(
            self.widget.geneTable.item(0).index())
        self.widget.delete_item()

        # Check emission of the changed signal
        assert receiver.called is True
        assert receiver.last_caller is self.widget

        # Check cached actions
        assert len(self.widget.cached_actions) == 1
        action = self.widget.cached_actions[0]
        assert action[0] is self.reaction
        assert action[1] == "deletion"
        assert action[2] is gene

        # Check the table item
        assert self.widget.geneTable.rowCount() == 0

        # Check that child is still present
        assert gene in self.reaction._children
예제 #21
0
    def test_add_gene(self):
        receiver = MockSlot()
        self.widget.changed.connect(receiver.slot)
        self.widget.set_item(self.reaction, self.model)

        # Check prior state
        assert len(self.widget.cached_actions) == 0
        assert self.widget.geneTable.rowCount() == 0
        assert len(self.reaction._children) == 0

        # Action
        new_gene_id = "test id"
        new_gene = Gene(new_gene_id)
        self.widget.add_gene(new_gene)

        # Check emission of the changed signal
        assert receiver.called is True
        assert receiver.last_caller is self.widget

        # Check cached actions
        assert len(self.widget.cached_actions) == 1
        action = self.widget.cached_actions[0]
        assert action[0] is self.reaction
        assert action[1] == "addition"
        assert action[2] is new_gene

        # Check the table item
        assert self.widget.geneTable.rowCount() == 1
        assert self.widget.geneTable.item(0, 0).text() == new_gene_id
        assert self.widget.geneTable.item(0, 0).link is new_gene

        # Check that no children has been added
        assert len(self.reaction._children) == 0
예제 #22
0
    def test_addition_emits_changed(self):
        parent = QWidget()
        widget = GeneSettingDisplayWidget(parent)
        test = ModelTest()
        gene = Gene()
        setting = GeneSetting(gene, False)
        model = Model()

        test.add_setting(setting)
        widget.set_item(test, model)

        detector = Mock()
        widget.changed.connect(detector.test)

        widget.dataTable.update_row_from_item(GeneSetting(Gene(), True))
        assert detector.test.called is True
        assert widget.content_changed is True
예제 #23
0
    def setup_complete_model(self):
        self.model = Model("model")

        # Setup reaction1
        self.metabolite = Metabolite("m1")
        self.reaction = Reaction("r1")
        self.gene = Gene("g1")
        self.reaction.add_child(self.gene)
        self.model.add_genes((self.gene,))
        self.reaction.add_metabolites({self.metabolite: -1})
        self.model.add_reactions((self.reaction,))

        # Setup reaction2
        self.metabolite2 = Metabolite("m2")
        self.reaction2 = Reaction("r2")
        self.gene2 = Gene("g2")
        self.genegroup = GeneGroup()
        self.genegroup.add_child(self.gene2)
        self.reaction2.add_child(self.genegroup)
        self.model.add_genes((self.gene2,))
        self.reaction2.add_metabolites({self.metabolite2: 1})
        self.model.add_reactions((self.reaction2,))

        # Setup evidences
        self.evidence = Evidence(assertion="Catalyzes")
        self.evidence.set_entity(self.gene)
        self.evidence.set_target(self.reaction)
        self.reference = Reference()
        self.model.add_reference(self.reference)
        self.evidence.add_reference(self.reference)
        self.model.add_evidence(self.evidence)

        # Setup test case
        self.testcase = ModelTest()
        reaction_setting = ReactionSetting(self.reaction, 1000., -1000., 0.)
        gene_setting = GeneSetting(gene=self.gene2, activity=False)
        outcome = Outcome(self.reaction2, 0., "greater")
        self.testcase.add_outcome(outcome)
        self.testcase.add_setting(gene_setting)
        self.testcase.add_setting(reaction_setting)
        self.model.add_test(self.testcase)
        self.reference2 = Reference()
        self.model.add_reference(self.reference2)
        self.testcase.add_reference(self.reference2)

        self.model.setup_tables()
예제 #24
0
    def __init__(self, model, parent=None):
        super(BatchEvidenceDialog, self).__init__(parent)
        self.setupUi(self)
        self.model = model
        self.evidence = Evidence(entity=Gene())

        self.accepted.connect(self.save_state)
        self.pushButton.clicked.connect(self.edit_evidence)
예제 #25
0
    def test_removal_of_nested_or_groups(self):
        reaction = Reaction("r1")
        gene_group1 = GeneGroup(type="or")
        gene_group2 = GeneGroup(type="or")
        gene1 = Gene("g1")
        gene2 = Gene("g2")
        gene3 = Gene("g3")
        gene_group1.add_child(gene1)
        for x in (gene2, gene3):
            gene_group2.add_child(x)
        gene_group1.add_child(gene_group2)
        reaction.add_child(gene_group1)

        assert reaction.genes == set([gene1, gene2, gene3])
        prune_gene_tree(reaction)
        assert reaction.genes == set([gene1, gene2, gene3])
        assert not gene_group2._children
        assert not gene_group2._parents
예제 #26
0
    def setup_items(self):
        self.table = GeneTable()

        self.test_id = "Test id"
        self.test_name = "test_name"
        self.test_genome = "test_genome"
        self.gene = Gene(id=self.test_id,
                         name=self.test_name,
                         genome=self.test_genome)
예제 #27
0
 def setup_items(self):
     self.test_id = "test.id"
     self.test_name = "test_name"
     self.test_genome = "test_genome"
     self.gene = Gene(id=self.test_id,
                      name=self.test_name,
                      genome=self.test_genome)
     self.model = Model("Test_model")
     self.model.genes.append(self.gene)
예제 #28
0
 def patch_gene_selection_accepted(self, monkeypatch):
     gene = Gene("test")
     monkeypatch.setattr(
         "GEMEditor.model.selection.gene.GeneSelectionDialog.exec_",
         Mock(return_value=True))
     monkeypatch.setattr(
         "GEMEditor.model.selection.gene.GeneSelectionDialog.selected_items",
         Mock(return_value=[gene]))
     return gene
예제 #29
0
 def patch_gene_selection_accepted(self, monkeypatch):
     gene = Gene()
     monkeypatch.setattr(
         "GEMEditor.dialogs.evidence.GeneSelectionDialog",
         Mock(return_value=Mock(
             **{
                 "exec_": Mock(return_value=True),
                 "selected_items": Mock(return_value=[gene])
             })))
     return gene
예제 #30
0
    def test_valid_input(self):
        gene = Gene(id="test")
        model = Model()

        widget = GeneAttributesDisplayWidget()

        widget.set_item(gene, model)
        assert widget.valid_inputs() is True
        widget.iDLineEdit.clear()
        assert widget.valid_inputs() is False