def test_ensure_reaction_direction_with_multiple_ts(self): """Tests that ensure reaction direction can handle multiple transition states""" family = self.database.kinetics.families['intra_H_migration'] r = Molecule().from_smiles("[CH2]CCC") p = Molecule().from_smiles("C[CH]CC") rxn = TemplateReaction(reactants=[r], products=[p]) family.add_atom_labels_for_reaction(reaction=rxn) rxn.template = family.get_reaction_template_labels(reaction=rxn) rxn.degeneracy = family.calculate_degeneracy(rxn) rxn.family = 'intra_H_migration' rxn.kinetics = Arrhenius(A=(1, 's^-1')) ri = Molecule().from_adjacency_list(""" multiplicity 2 1 C u1 p0 c0 {2,S} {3,S} {4,S} 2 H u0 p0 c0 {1,S} 3 H u0 p0 c0 {1,S} 4 C u0 p0 c0 i13 {1,S} {5,S} {7,S} {8,S} 5 C u0 p0 c0 i13 {4,S} {6,S} {9,S} {10,S} 6 C u0 p0 c0 {5,S} {11,S} {12,S} {13,S} 7 H u0 p0 c0 {4,S} 8 H u0 p0 c0 {4,S} 9 H u0 p0 c0 {5,S} 10 H u0 p0 c0 {5,S} 11 H u0 p0 c0 {6,S} 12 H u0 p0 c0 {6,S} 13 H u0 p0 c0 {6,S} """) pi = Molecule().from_adjacency_list(""" multiplicity 2 1 C u0 p0 c0 {2,S} {6,S} {7,S} {8,S} 2 C u1 p0 c0 i13 {1,S} {3,S} {4,S} 3 H u0 p0 c0 {2,S} 4 C u0 p0 c0 i13 {2,S} {5,S} {9,S} {10,S} 5 C u0 p0 c0 {4,S} {11,S} {12,S} {13,S} 6 H u0 p0 c0 {1,S} 7 H u0 p0 c0 {1,S} 8 H u0 p0 c0 {1,S} 9 H u0 p0 c0 {4,S} 10 H u0 p0 c0 {4,S} 11 H u0 p0 c0 {5,S} 12 H u0 p0 c0 {5,S} 13 H u0 p0 c0 {5,S} """) rxni = TemplateReaction(reactants=[pi], products=[ri], pairs=[[pi, ri]]) family.add_atom_labels_for_reaction(reaction=rxni) rxni.template = family.get_reaction_template_labels(reaction=rxni) rxn_cluster = [rxn, rxni] ensure_reaction_direction(rxn_cluster) self.assertEqual(rxn_cluster[0].degeneracy, 2) self.assertEqual(rxn_cluster[1].degeneracy, 2) self.assertIn('R2Hall', rxn_cluster[0].template) self.assertIn('R2Hall', rxn_cluster[1].template) self.assertAlmostEqual( rxn_cluster[0].kinetics.get_rate_coefficient(298), rxn_cluster[1].kinetics.get_rate_coefficient(298))
def test_calculate_degeneracy_for_non_reactive_molecule(self): """ tests that the calculateDegeneracy method gets the degeneracy correct for unreactive molecules and that __generateReactions work correctly with the react_non_reactive flag set to `True`. """ from rmgpy.data.rmg import getDB from rmgpy.data.kinetics.family import TemplateReaction adjlist = [ ''' multiplicity 2 1 H u1 p0 c0''', ''' multiplicity 2 1 O u1 p1 c+1 {2,D} 2 N u0 p2 c-1 {1,D}''', ''' 1 O u0 p1 c+1 {2,D} {3,S} 2 N u0 p2 c-1 {1,D} 3 H u0 p0 c0 {1,S}''' ] family = getDB('kinetics').families['R_Recombination'] r1 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[0])]) r2 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[1]) ]) # r2 is not the representative structure of # NO, but it is the correct structure participating in this reaction p1 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[2])]) r2.generate_resonance_structures(keep_isomorphic=True) rxn = TemplateReaction(reactants=[r1, r2], products=[p1]) rxn.degeneracy = family.calculateDegeneracy(rxn) self.assertEqual(rxn.degeneracy, 1)
def test_calculate_degeneracy_for_non_reactive_molecule(self): """ tests that the calculateDegeneracy method gets the degeneracy correct for unreactive molecules and that __generateReactions work correctly with the react_non_reactive flag set to `True`. """ from rmgpy.data.rmg import getDB from rmgpy.data.kinetics.family import TemplateReaction adjlist = [''' multiplicity 2 1 H u1 p0 c0''', ''' multiplicity 2 1 O u1 p1 c+1 {2,D} 2 N u0 p2 c-1 {1,D}''', ''' 1 O u0 p1 c+1 {2,D} {3,S} 2 N u0 p2 c-1 {1,D} 3 H u0 p0 c0 {1,S}'''] family = getDB('kinetics').families['R_Recombination'] r1 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[0])]) r2 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[1])]) # r2 is not the representative structure of # NO, but it is the correct structure participating in this reaction p1 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[2])]) r2.generate_resonance_structures(keep_isomorphic=True) rxn = TemplateReaction(reactants=[r1, r2], products=[p1]) rxn.degeneracy = family.calculateDegeneracy(rxn) self.assertEqual(rxn.degeneracy, 1)
def test_ensure_reaction_direction_with_multiple_TS(self): """Tests that ensure reaction direction can handle multiple transition states""" family = self.database.kinetics.families['intra_H_migration'] r = Molecule().fromSMILES("[CH2]CCC") p = Molecule().fromSMILES("C[CH]CC") rxn = TemplateReaction(reactants=[r], products=[p]) family.addAtomLabelsForReaction(reaction=rxn) rxn.template = family.getReactionTemplateLabels(reaction=rxn) rxn.degeneracy = family.calculateDegeneracy(rxn) rxn.family = 'intra_H_migration' rxn.kinetics = Arrhenius(A=(1,'s^-1')) ri = Molecule().fromAdjacencyList(""" multiplicity 2 1 C u1 p0 c0 {2,S} {3,S} {4,S} 2 H u0 p0 c0 {1,S} 3 H u0 p0 c0 {1,S} 4 C u0 p0 c0 i13 {1,S} {5,S} {7,S} {8,S} 5 C u0 p0 c0 i13 {4,S} {6,S} {9,S} {10,S} 6 C u0 p0 c0 {5,S} {11,S} {12,S} {13,S} 7 H u0 p0 c0 {4,S} 8 H u0 p0 c0 {4,S} 9 H u0 p0 c0 {5,S} 10 H u0 p0 c0 {5,S} 11 H u0 p0 c0 {6,S} 12 H u0 p0 c0 {6,S} 13 H u0 p0 c0 {6,S} """) pi = Molecule().fromAdjacencyList(""" multiplicity 2 1 C u0 p0 c0 {2,S} {6,S} {7,S} {8,S} 2 C u1 p0 c0 i13 {1,S} {3,S} {4,S} 3 H u0 p0 c0 {2,S} 4 C u0 p0 c0 i13 {2,S} {5,S} {9,S} {10,S} 5 C u0 p0 c0 {4,S} {11,S} {12,S} {13,S} 6 H u0 p0 c0 {1,S} 7 H u0 p0 c0 {1,S} 8 H u0 p0 c0 {1,S} 9 H u0 p0 c0 {4,S} 10 H u0 p0 c0 {4,S} 11 H u0 p0 c0 {5,S} 12 H u0 p0 c0 {5,S} 13 H u0 p0 c0 {5,S} """) rxni = TemplateReaction(reactants=[pi], products=[ri],pairs=[[pi,ri]]) family.addAtomLabelsForReaction(reaction=rxni) rxni.template = family.getReactionTemplateLabels(reaction=rxni) rxn_cluster = [rxn,rxni] ensure_reaction_direction(rxn_cluster) self.assertEqual(rxn_cluster[0].degeneracy, 2) self.assertEqual(rxn_cluster[1].degeneracy, 2) self.assertIn('R2Hall', rxn_cluster[0].template) self.assertIn('R2Hall', rxn_cluster[1].template) self.assertAlmostEqual(rxn_cluster[0].kinetics.getRateCoefficient(298), rxn_cluster[1].kinetics.getRateCoefficient(298))
def testaddReverseAttribute(self): """ tests that the addReverseAttribute method gets the reverse degeneracy correct """ from rmgpy.data.rmg import getDB from rmgpy.data.kinetics.family import TemplateReaction adjlist = [ ''' multiplicity 2 1 H u0 p0 c0 {7,S} 2 H u0 p0 c0 {4,S} 3 C u1 p0 c0 {5,S} {7,S} {8,S} 4 C u0 p0 c0 {2,S} {6,S} {7,D} 5 H u0 p0 c0 {3,S} 6 H u0 p0 c0 {4,S} 7 C u0 p0 c0 {1,S} {3,S} {4,D} 8 H u0 p0 c0 {3,S} ''', ''' 1 C u0 p0 c0 {2,S} {4,S} {5,S} {6,S} 2 C u0 p0 c0 i13 {1,S} {3,D} {7,S} 3 C u0 p0 c0 {2,D} {8,S} {9,S} 4 H u0 p0 c0 {1,S} 5 H u0 p0 c0 {1,S} 6 H u0 p0 c0 {1,S} 7 H u0 p0 c0 {2,S} 8 H u0 p0 c0 {3,S} 9 H u0 p0 c0 {3,S} ''', ''' multiplicity 2 1 H u0 p0 c0 {7,S} 2 H u0 p0 c0 {4,S} 3 C u1 p0 c0 {5,S} {7,S} {8,S} 4 C u0 p0 c0 {2,S} {6,S} {7,D} 5 H u0 p0 c0 {3,S} 6 H u0 p0 c0 {4,S} 7 C u0 p0 c0 i13 {1,S} {3,S} {4,D} 8 H u0 p0 c0 {3,S} ''', ''' 1 C u0 p0 c0 {2,S} {4,S} {5,S} {6,S} 2 C u0 p0 c0 {1,S} {3,D} {7,S} 3 C u0 p0 c0 {2,D} {8,S} {9,S} 4 H u0 p0 c0 {1,S} 5 H u0 p0 c0 {1,S} 6 H u0 p0 c0 {1,S} 7 H u0 p0 c0 {2,S} 8 H u0 p0 c0 {3,S} 9 H u0 p0 c0 {3,S} ''' ] family = getDB('kinetics').families['H_Abstraction'] r1 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[0])]) r2 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[1])]) p1 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[2])]) p2 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[3])]) r1.generateResonanceIsomers(keepIsomorphic=True) p1.generateResonanceIsomers(keepIsomorphic=True) rxn = TemplateReaction(reactants=[r1, r2], products=[p1, p2]) rxn.degeneracy = family.calculateDegeneracy(rxn) self.assertEqual(rxn.degeneracy, 6) family.addReverseAttribute(rxn) self.assertEqual(rxn.reverse.degeneracy, 6)
def testaddReverseAttribute(self): """ tests that the addReverseAttribute method gets the reverse degeneracy correct """ from rmgpy.data.rmg import getDB from rmgpy.data.kinetics.family import TemplateReaction adjlist = [''' multiplicity 2 1 H u0 p0 c0 {7,S} 2 H u0 p0 c0 {4,S} 3 C u1 p0 c0 {5,S} {7,S} {8,S} 4 C u0 p0 c0 {2,S} {6,S} {7,D} 5 H u0 p0 c0 {3,S} 6 H u0 p0 c0 {4,S} 7 C u0 p0 c0 {1,S} {3,S} {4,D} 8 H u0 p0 c0 {3,S} ''', ''' 1 C u0 p0 c0 {2,S} {4,S} {5,S} {6,S} 2 C u0 p0 c0 i13 {1,S} {3,D} {7,S} 3 C u0 p0 c0 {2,D} {8,S} {9,S} 4 H u0 p0 c0 {1,S} 5 H u0 p0 c0 {1,S} 6 H u0 p0 c0 {1,S} 7 H u0 p0 c0 {2,S} 8 H u0 p0 c0 {3,S} 9 H u0 p0 c0 {3,S} ''', ''' multiplicity 2 1 H u0 p0 c0 {7,S} 2 H u0 p0 c0 {4,S} 3 C u1 p0 c0 {5,S} {7,S} {8,S} 4 C u0 p0 c0 {2,S} {6,S} {7,D} 5 H u0 p0 c0 {3,S} 6 H u0 p0 c0 {4,S} 7 C u0 p0 c0 i13 {1,S} {3,S} {4,D} 8 H u0 p0 c0 {3,S} ''', ''' 1 C u0 p0 c0 {2,S} {4,S} {5,S} {6,S} 2 C u0 p0 c0 {1,S} {3,D} {7,S} 3 C u0 p0 c0 {2,D} {8,S} {9,S} 4 H u0 p0 c0 {1,S} 5 H u0 p0 c0 {1,S} 6 H u0 p0 c0 {1,S} 7 H u0 p0 c0 {2,S} 8 H u0 p0 c0 {3,S} 9 H u0 p0 c0 {3,S} ''' ] family = getDB('kinetics').families['H_Abstraction'] r1 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[0])]) r2 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[1])]) p1 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[2])]) p2 = Species(molecule=[Molecule().fromAdjacencyList(adjlist[3])]) r1.generate_resonance_structures(keep_isomorphic=True) p1.generate_resonance_structures(keep_isomorphic=True) rxn = TemplateReaction(reactants=[r1, r2], products=[p1, p2]) rxn.degeneracy = family.calculateDegeneracy(rxn) self.assertEqual(rxn.degeneracy, 6) family.addReverseAttribute(rxn) self.assertEqual(rxn.reverse.degeneracy, 6)