示例#1
0
 def testChekcTypeOneError(self):
     if IGNORE_TEST:
         return
     games_pp1 = GAMES_PP(self.simple1)
     reaction = games_pp1.simple.getReaction(PGA_CONS)
     pga = games_pp1.simple.getMolecule(PGA)
     rubp = games_pp1.simple.getMolecule(RUBP)
     som_pga = games_pp1.getNode(pga)
     som_rubp = games_pp1.getNode(rubp)
     som_pga_rubp = games_pp1.mergeNodes(som_pga, som_rubp, reaction)
     self.assertTrue(len(games_pp1.type_one_errors) == ZERO)
     is_error = games_pp1.checkTypeOneError((pga, rubp), reaction)
     self.assertTrue(is_error)
     error = games_pp1.type_one_errors[ZERO]
     self.assertEqual(error.node1, pga.name)
     self.assertEqual(error.node2, rubp.name)
     self.assertEqual(error.reactions, [reaction.label])
示例#2
0
class TestGAMES_PP(unittest.TestCase):
    def setUp(self):
        # BIOMD0000000383
        self.simple1 = SimpleSBML()
        self.simple1.initialize(cn.TEST_FILE_GAMES_PP1)
        self.games_pp = GAMES_PP(self.simple1)
        # BIOMD0000000018
        self.simple2 = SimpleSBML()
        self.simple2.initialize(cn.TEST_FILE_GAMES_PP2)

    def testConstructor(self):
        if IGNORE_TEST:
            return
        self.assertEqual(len(self.games_pp.reactions), NUM_REACTIONS)
        for r in self.games_pp.reactions:
            print(r.category)
            self.assertFalse(r.category == cn.REACTION_BOUNDARY)
        self.assertEqual(len(self.games_pp.molecules), NUM_MOLECULES)
        for m in self.games_pp.molecules:
            self.assertTrue(isinstance(m, Molecule))
        self.assertEqual(len(self.games_pp.soms), NUM_MOLECULES)
        self.assertTrue(isinstance(self.games_pp.soms[0], SOM))
        init_identifier = ""
        for som in self.games_pp.soms:
            init_identifier = init_identifier + som.identifier
            if som != self.games_pp.soms[-1]:
                init_identifier = init_identifier + ";"
        self.assertEqual(self.games_pp.identifier, init_identifier)

    def testConvertReactionToSOMReaction(self):
        if IGNORE_TEST:
            return
        reaction1 = self.games_pp.simple.getReaction(PGA_CONS)
        reaction2 = self.games_pp.simple.getReaction(PGA_PROD_VC)
        som_reaction1 = self.games_pp.convertReactionToSOMReaction(reaction1)
        som_reaction2 = self.games_pp.convertReactionToSOMReaction(reaction2)
        self.assertTrue(isinstance(som_reaction1, SOMReaction))
        self.assertTrue(isinstance(som_reaction2, SOMReaction))
        ms_rubp = som_reaction1.products[0]
        self.assertTrue(isinstance(ms_rubp, SOMStoichiometry))
        self.assertEqual(
            list(ms_rubp.som.molecules)[0],
            self.games_pp.simple.getMolecule(RUBP))
        ms_nadph = None
        for ms in som_reaction2.reactants:
            if ms.som.identifier == SOM_NADPH:
                ms_nadph = ms
                break
        self.assertTrue(ms_nadph.som.identifier == SOM_NADPH)
        self.assertEqual(ms_nadph.stoichiometry, NADPH_STOICHIOMETRY)

    def testGetStoichiometryMatrix(self):
        if IGNORE_TEST:
            return
        # For regular stoichiometry matrix
        mat = self.games_pp.getStoichiometryMatrix(self.games_pp.reactions,
                                                   self.games_pp.molecules,
                                                   som=False)
        self.assertTrue(isinstance(mat, pd.DataFrame))
        self.assertEqual(mat.shape, (NUM_MOLECULES, NUM_REACTIONS))
        self.assertEqual(mat[PGA_CONS][PGA], PGA_CONS_WITH_PGA)
        self.assertEqual(mat[PGA_PROD_VC][RUBP], PGA_PROD_VC_WITH_RUBP)
        # For SOM stoichiometry matrix
        som_reactions = []
        for r in self.games_pp.reactions:
            som_reactions.append(self.games_pp.convertReactionToSOMReaction(r))
        som_mat = self.games_pp.getStoichiometryMatrix(som_reactions,
                                                       self.games_pp.nodes,
                                                       som=True)
        self.assertTrue(isinstance(som_mat, pd.DataFrame))
        self.assertEqual(som_mat[PGA_CONS][SOM_PGA], PGA_CONS_WITH_PGA)
        self.assertEqual(som_mat[PGA_PROD_VC][SOM_RUBP], PGA_PROD_VC_WITH_RUBP)

    def testDecomposeMatrix(self):
        if IGNORE_TEST:
            return
        # should be all None before decomposition
        self.assertTrue(self.games_pp.perm_inverse is None)
        self.assertTrue(self.games_pp.permuted_matrix is None)
        self.assertTrue(self.games_pp.lower_inverse is None)
        self.assertTrue(self.games_pp.echelon_df is None)
        som_reactions = []
        for r in self.games_pp.reactions:
            som_reactions.append(self.games_pp.convertReactionToSOMReaction(r))
        som_mat = self.games_pp.getStoichiometryMatrix(som_reactions,
                                                       self.games_pp.nodes,
                                                       som=True)
        echelon = self.games_pp.decomposeMatrix(som_mat).T
        self.assertFalse(self.games_pp.perm_inverse is None)
        self.assertFalse(self.games_pp.permuted_matrix is None)
        self.assertFalse(self.games_pp.lower_inverse is None)
        self.assertFalse(self.games_pp.echelon_df is None)
        self.assertTrue(isinstance(self.games_pp.perm_inverse, np.ndarray))
        self.assertTrue(isinstance(self.games_pp.permuted_matrix,
                                   pd.DataFrame))
        self.assertTrue(isinstance(self.games_pp.lower_inverse, pd.DataFrame))
        self.assertTrue(isinstance(self.games_pp.echelon_df, pd.DataFrame))
        # Checking lower echelon - lower left element should be 0.0 (zero)
        self.assertTrue(echelon.iloc[echelon.shape[0] - 1][0] == ZERO_F)
        # On the ohter hand, upper left should be nonzero
        self.assertFalse(echelon.iloc[0][0] == ZERO_F)

    def testGetRREFMatrix(self):
        if IGNORE_TEST:
            return
        self.assertTrue(self.games_pp.rref_operation is None)
        self.assertTrue(self.games_pp.rref_df is None)
        som_reactions = []
        for r in self.games_pp.reactions:
            som_reactions.append(self.games_pp.convertReactionToSOMReaction(r))
        som_mat = self.games_pp.getStoichiometryMatrix(som_reactions,
                                                       self.games_pp.nodes,
                                                       som=True)
        echelon = self.games_pp.decomposeMatrix(som_mat).T
        rref = self.games_pp.getRREFMatrix(echelon)
        self.assertTrue(isinstance(self.games_pp.rref_operation, pd.DataFrame))
        self.assertTrue(isinstance(self.games_pp.rref_df, pd.DataFrame))
        # Choose the last row of rref.T
        last_row = rref.T.iloc[-1:]
        # Get the first nonzero index
        nonzero_species = (last_row != 0).idxmax(axis=1)[0]
        # The SUM of nonzero species column must be the same as the single value
        self.assertEqual(last_row[nonzero_species][0],
                         sum(rref.T[nonzero_species]))

    def testConverMatrixToSOMReactions(self):
        if IGNORE_TEST:
            return
        som_reactions1 = []
        for r in self.games_pp.reactions:
            som_reactions1.append(
                self.games_pp.convertReactionToSOMReaction(r))
        som_mat = self.games_pp.getStoichiometryMatrix(som_reactions1,
                                                       self.games_pp.nodes,
                                                       som=True)
        som_reactions2 = self.games_pp.convertMatrixToSOMReactions(som_mat)
        sr1 = None
        sr2 = None
        for sr in som_reactions1:
            if sr.label == PGA_PROD_VC:
                sr1 = sr
                break
        for sr in som_reactions2:
            if sr.label == PGA_PROD_VC:
                sr2 = sr
                break
        sr1_reactants = {ms.som for ms in sr1.reactants}
        sr2_reactants = {ms.som for ms in sr2.reactants}
        sr1_products = {ms.som for ms in sr1.products}
        sr2_products = {ms.som for ms in sr2.products}
        sr1_reactsom = sum([ms.stoichiometry for ms in sr1.reactants])
        sr2_reactsom = sum([ms.stoichiometry for ms in sr2.reactants])
        sr1_prodsom = sum([ms.stoichiometry for ms in sr1.products])
        sr2_prodsom = sum([ms.stoichiometry for ms in sr2.products])
        self.assertEqual(sr1_reactants, sr2_reactants)
        self.assertEqual(sr1_products, sr2_products)
        self.assertEqual(sr1_reactsom, sr2_reactsom)
        self.assertEqual(sr1_prodsom, sr2_prodsom)

    def testGetNode(self):
        if IGNORE_TEST:
            return
        co2 = self.games_pp.simple.getMolecule(CO2)
        co2_node = self.games_pp.getNode(co2)
        self.assertEqual(type(co2_node), SOM)
        self.assertEqual(co2_node.molecules, {co2})

    def testMergeNodes(self):
        if IGNORE_TEST:
            return
        reaction = self.games_pp.simple.getReaction(PGA_CONS)
        pga = self.games_pp.simple.getMolecule(PGA)
        rubp = self.games_pp.simple.getMolecule(RUBP)
        som_pga = self.games_pp.getNode(pga)
        som_rubp = self.games_pp.getNode(rubp)
        som_pga_rubp = self.games_pp.mergeNodes(som_pga, som_rubp, reaction)
        self.assertTrue(isinstance(som_pga_rubp, SOM))
        self.assertTrue(pga in som_pga_rubp.molecules)
        self.assertTrue(rubp in som_pga_rubp.molecules)
        self.assertTrue(reaction in som_pga_rubp.reactions)

    def testAddReaction(self):
        if IGNORE_TEST:
            return
        self.assertEqual(len(self.games_pp.reactions_lu), 0)
        reaction = self.games_pp.simple.getReaction(PGA_CONS)
        self.games_pp.addReaction(reaction)
        self.assertTrue(reaction in self.games_pp.reactions_lu)
        self.games_pp.addReaction(reaction)
        self.assertTrue(len(self.games_pp.reactions_lu), 1)

    def testProcessUniUniReaction(self):
        if IGNORE_TEST:
            return
        reaction = self.games_pp.simple.getReaction(PGA_CONS)
        som = self.games_pp.processUniUniReaction(reaction)
        self.assertTrue(isinstance(som, SOM))
        self.assertTrue(som in self.games_pp.nodes)
        pga = self.games_pp.simple.getMolecule(PGA)
        rubp = self.games_pp.simple.getMolecule(RUBP)
        self.assertTrue(pga in som.molecules)
        self.assertTrue(rubp in som.molecules)

    def testAddArc(self):
        if IGNORE_TEST:
            return
        reaction = self.games_pp.simple.getReaction(PGA_PROD_VC)
        co2 = self.games_pp.simple.getMolecule(CO2)
        pga = self.games_pp.simple.getMolecule(PGA)
        som_co2 = self.games_pp.getNode(co2)
        som_pga = self.games_pp.getNode(pga)
        self.games_pp.addArc(som_co2, som_pga, reaction)
        self.assertTrue(self.games_pp.has_edge(som_co2, som_pga))
        self.assertEqual(
            self.games_pp.get_edge_data(som_co2, som_pga)[REACTION],
            [PGA_PROD_VC])

    def testProcessUniMultiReaction(self):
        if IGNORE_TEST:
            return
        games_pp2 = GAMES_PP(self.simple2)
        self.assertTrue(isinstance(games_pp2, GAMES_PP))
        reaction = games_pp2.simple.getReaction(CH2FH4toHCHO)
        reactant1 = games_pp2.simple.getMolecule(CH2FH4)
        product1 = games_pp2.simple.getMolecule(FH4)
        product2 = games_pp2.simple.getMolecule(HCHO)
        games_pp2.processUniMultiReaction(reaction)
        som_reactant1 = games_pp2.getNode(reactant1)
        som_product1 = games_pp2.getNode(product1)
        som_product2 = games_pp2.getNode(product2)
        self.assertTrue(games_pp2.has_edge(som_product1, som_reactant1))
        self.assertTrue(games_pp2.has_edge(som_product2, som_reactant1))

    def testProcessMultiUniReaction(self):
        if IGNORE_TEST:
            return
        games_pp2 = GAMES_PP(self.simple2)
        self.assertTrue(isinstance(games_pp2, GAMES_PP))
        reaction = games_pp2.simple.getReaction(HCHOtoCH2FH4)
        reactant1 = games_pp2.simple.getMolecule(FH4)
        reactant2 = games_pp2.simple.getMolecule(HCHO)
        product1 = games_pp2.simple.getMolecule(CH2FH4)
        games_pp2.processMultiUniReaction(reaction)
        som_product1 = games_pp2.getNode(product1)
        som_reactant1 = games_pp2.getNode(reactant1)
        som_reactant2 = games_pp2.getNode(reactant2)
        self.assertTrue(games_pp2.has_edge(som_reactant1, som_product1))
        self.assertTrue(games_pp2.has_edge(som_reactant2, som_product1))

    def testProcessEqualSOMReaction(self):
        if IGNORE_TEST:
            return
        print("type three", self.games_pp.type_three_errors)
        self.assertEqual(len(self.games_pp.type_three_errors), ZERO)
        # Add an arc
        reaction = self.games_pp.simple.getReaction(PGA_PROD_VC)
        co2 = self.games_pp.simple.getMolecule(CO2)
        pga = self.games_pp.simple.getMolecule(PGA)
        som_co2 = self.games_pp.getNode(co2)
        som_pga = self.games_pp.getNode(pga)
        self.games_pp.addArc(som_co2, som_pga, reaction)
        # Process a dummy reaction
        soms_co2 = SOMStoichiometry(som_co2, 1.0)
        soms_pga = SOMStoichiometry(som_pga, 1.0)
        som_reaction = SOMReaction([soms_co2], [soms_pga], "dummy")
        self.games_pp.processEqualSOMReaction(som_reaction)
        self.assertTrue(len(self.games_pp.type_three_errors) > ZERO)

    def testProcessUnequalSOMReaction(self):
        if IGNORE_TEST:
            return
        games_pp2 = GAMES_PP(self.simple2)
        self.assertTrue(len(games_pp2.edges) == 0)
        reaction = games_pp2.simple.getReaction(CH2FH4toHCHO)
        som_reaction = games_pp2.convertReactionToSOMReaction(reaction)
        games_pp2.processUnequalSOMReaction(som_reaction)
        self.assertTrue(len(games_pp2.edges) == 2)
        reactant1 = games_pp2.simple.getMolecule(FH4)
        reactant2 = games_pp2.simple.getMolecule(HCHO)
        product1 = games_pp2.simple.getMolecule(CH2FH4)
        games_pp2.processUniMultiReaction(reaction)
        som_product1 = games_pp2.getNode(product1)
        som_reactant1 = games_pp2.getNode(reactant1)
        som_reactant2 = games_pp2.getNode(reactant2)
        self.assertTrue(games_pp2.has_edge(som_reactant1, som_product1))
        self.assertTrue(games_pp2.has_edge(som_reactant2, som_product1))

    def testAddTypeOneError(self):
        if IGNORE_TEST:
            return
        games_pp2 = GAMES_PP(self.simple2)
        self.assertTrue(len(games_pp2.type_one_errors) == ZERO)
        reaction = games_pp2.simple.getReaction(CH2FH4toHCHO)
        reactant1 = games_pp2.simple.getMolecule(FH4)
        product1 = games_pp2.simple.getMolecule(CH2FH4)
        games_pp2.addTypeOneError(reactant1, product1, reaction)
        self.assertTrue(len(games_pp2.type_one_errors) == ONE)
        error = games_pp2.type_one_errors[ZERO]
        self.assertEqual(error.node1, reactant1.name)
        self.assertEqual(error.node2, product1.name)
        self.assertEqual(error.reactions, [reaction.label])

    def testChekcTypeOneError(self):
        if IGNORE_TEST:
            return
        games_pp1 = GAMES_PP(self.simple1)
        reaction = games_pp1.simple.getReaction(PGA_CONS)
        pga = games_pp1.simple.getMolecule(PGA)
        rubp = games_pp1.simple.getMolecule(RUBP)
        som_pga = games_pp1.getNode(pga)
        som_rubp = games_pp1.getNode(rubp)
        som_pga_rubp = games_pp1.mergeNodes(som_pga, som_rubp, reaction)
        self.assertTrue(len(games_pp1.type_one_errors) == ZERO)
        is_error = games_pp1.checkTypeOneError((pga, rubp), reaction)
        self.assertTrue(is_error)
        error = games_pp1.type_one_errors[ZERO]
        self.assertEqual(error.node1, pga.name)
        self.assertEqual(error.node2, rubp.name)
        self.assertEqual(error.reactions, [reaction.label])

    def testCheckTypeTwoError(self):
        if IGNORE_TEST:
            return
        # Create a dummy cycle by adding two conflicting arcs
        games_pp2 = GAMES_PP(self.simple2)
        self.assertTrue(isinstance(games_pp2, GAMES_PP))
        unimulti_reaction = games_pp2.simple.getReaction(CH2FH4toHCHO)
        multiuni_reaction = games_pp2.simple.getReaction(HCHOtoCH2FH4)
        fh4 = games_pp2.simple.getMolecule(FH4)
        # hcho = games_pp2.simple.getMolecule(HCHO)
        ch2fh4 = games_pp2.simple.getMolecule(CH2FH4)
        som_fh4 = games_pp2.getNode(fh4)
        som_ch2fh4 = games_pp2.getNode(ch2fh4)
        # do we need the next two methods if we're giving a cycle?
        games_pp2.addArc(som_fh4, som_ch2fh4, unimulti_reaction)
        games_pp2.addArc(som_ch2fh4, som_fh4, multiuni_reaction)
        self.assertTrue(len(games_pp2.type_two_errors) == ZERO)
        games_pp2.checkTypeTwoError()
        self.assertTrue(len(games_pp2.type_two_errors) == ONE)
        error = games_pp2.type_two_errors[ZERO]
        self.assertTrue(games_pp2.has_edge(error[ZERO], error[ONE]))
        self.assertTrue(games_pp2.has_edge(error[ONE], error[ZERO]))
        error_reactions = set(
            games_pp2.get_edge_data(error[ZERO], error[ONE])[REACTION])
        error_reactions = error_reactions.union(
            set(games_pp2.get_edge_data(error[ONE], error[ZERO])[REACTION]))
        self.assertTrue(CH2FH4toHCHO in error_reactions)
        self.assertTrue(HCHOtoCH2FH4 in error_reactions)

    def testProcessErrorReaction(self):
        if IGNORE_TEST:
            return
        games_pp1 = GAMES_PP(self.simple1)
        self.assertTrue(len(games_pp1.echelon_errors) == ZERO)
        reaction = self.games_pp.simple.getReaction(PGA_PROD_VO)
        games_pp1.processErrorReaction(reaction)
        self.assertTrue(len(games_pp1.echelon_errors) == ONE)
        self.assertTrue(reaction in games_pp1.echelon_errors)

    def testAnalyze(self):
        if IGNORE_TEST:
            return
        games_pp1 = GAMES_PP(self.simple1)
        games_pp2 = GAMES_PP(self.simple2)
        self.assertTrue(games_pp1.analyze(rref=False))
        self.assertTrue(games_pp2.analyze())
        self.assertTrue(len(games_pp1.echelon_errors) > ZERO)
        self.assertTrue(len(games_pp1.type_one_errors) == ZERO)
        self.assertTrue(len(games_pp1.type_two_errors) == ZERO)
        self.assertTrue(len(games_pp2.type_one_errors) > ZERO)