def test_plot_reaction_profile(): r = Reactant(name='reactant', smiles='C') p = Product(name='product', smiles='C') tsguess = TSguess(atoms=r.atoms, reactant=ReactantComplex(r), product=ProductComplex(p)) tsguess.bond_rearrangement = BondRearrangement() ts = TransitionState(tsguess) reaction = Reaction(r, p) reaction.ts = ts plotting.plot_reaction_profile(reactions=[reaction], units=KjMol, name='test') assert os.path.exists('test_reaction_profile.png') os.remove('test_reaction_profile.png') with pytest.raises(AssertionError): plotting.plot_reaction_profile(reactions=[reaction], units=KjMol, name='test', free_energy=True, enthalpy=True) return None
def test_calculate_reaction_profile_energies(): test_reac = Reactant(name='test', smiles='C') test_reac.energy = -1 test_prod = Product(name='test', smiles='C') test_prod.energy = -1.03187251 tsguess = TSguess(atoms=test_reac.atoms, reactant=ReactantComplex(test_reac), product=ProductComplex()) tsguess.bond_rearrangement = BondRearrangement() ts = TransitionState(tsguess) ts.energy = -0.96812749 reaction = Reaction(test_reac, test_prod) reaction.ts = ts energies = plotting.calculate_reaction_profile_energies(reactions=[reaction], units=KcalMol) # Energies have been set to ∆E = -20 and ∆E‡ = 20 kcal mol-1 respectively assert energies[0] == 0 assert 19 < energies[1] < 21 assert -21 < energies[2] < -19 # Copying the reaction should give relative energies [0, 20, -20, 0, -40] energies = plotting.calculate_reaction_profile_energies(reactions=[reaction, deepcopy(reaction)], units=KcalMol) # Energies have been set to ∆E = -20 and ∆E‡ = 20 kcal mol-1 respectively assert energies[0] == 0 assert -0.1 < energies[3] < 0.1 assert -41 < energies[4] < -39
def test_reaction_warnings(): test_reac = Reactant(name='test', smiles='C') test_reac.energy = -1 test_prod = Product(name='test', smiles='C') test_prod.energy = -1.03187251 tsguess = TSguess(atoms=test_reac.atoms, reactant=ReactantComplex(test_reac), product=ProductComplex()) tsguess.bond_rearrangement = BondRearrangement() ts = TransitionState(tsguess) ts.energy = -0.98 ts.imaginary_frequencies = [-100] reaction = Reaction(test_reac, test_prod) reaction.ts = None # Should be some warning with no TS assert len( plotting.get_reaction_profile_warnings(reactions=[reaction])) > 10 # Should be no warnings with a TS that exists and has an energy and one # imaginary freq reaction.ts = ts warnings = plotting.get_reaction_profile_warnings(reactions=[reaction]) assert 'None' in warnings
def test_calc_delta_e(): r1 = reaction.Reactant(name='h', atoms=[Atom('H', 0.0, 0.0, 0.0)]) r1.energy = -0.5 r2 = reaction.Reactant(name='h', atoms=[Atom('H', 0.0, 0.0, 0.0)]) r2.energy = -0.5 tsguess = TSguess(atoms=None, reactant=ReactantComplex(r1), product=ProductComplex(r2)) tsguess.bond_rearrangement = BondRearrangement() ts = TransitionState(tsguess) ts.energy = -0.8 p = reaction.Product( name='hh', atoms=[Atom('H', 0.0, 0.0, 0.0), Atom('H', 1.0, 0.0, 0.0)]) p.energy = -1.0 reac = reaction.Reaction(r1, r2, p) reac.ts = ts assert -1E-6 < reac.calc_delta_e() < 1E-6 assert 0.2 - 1E-6 < reac.calc_delta_e_ddagger() < 0.2 + 1E-6
def test_ts_conformer(tmpdir): os.chdir(tmpdir) ch3cl = Reactant(charge=0, mult=1, atoms=[ Atom('Cl', 1.63664, 0.02010, -0.05829), Atom('C', -0.14524, -0.00136, 0.00498), Atom('H', -0.52169, -0.54637, -0.86809), Atom('H', -0.45804, -0.50420, 0.92747), Atom('H', -0.51166, 1.03181, -0.00597) ]) f = Reactant(charge=-1, mult=1, atoms=[Atom('F', 4.0, 0.0, 0.0)]) ch3f = Product(charge=0, mult=1, atoms=[ Atom('C', -0.05250, 0.00047, -0.00636), Atom('F', 1.31229, -0.01702, 0.16350), Atom('H', -0.54993, -0.04452, 0.97526), Atom('H', -0.34815, 0.92748, -0.52199), Atom('H', -0.36172, -0.86651, -0.61030) ]) cl = Reactant(charge=-1, mult=1, atoms=[Atom('Cl', 4.0, 0.0, 0.0)]) f_ch3cl_tsguess = TSguess(reactant=ReactantComplex(f, ch3cl), product=ProductComplex(ch3f, cl), atoms=[ Atom('F', -2.66092, -0.01426, 0.09700), Atom('Cl', 1.46795, 0.05788, -0.06166), Atom('C', -0.66317, -0.01826, 0.02488), Atom('H', -0.78315, -0.58679, -0.88975), Atom('H', -0.70611, -0.54149, 0.97313), Atom('H', -0.80305, 1.05409, 0.00503) ]) f_ch3cl_tsguess.bond_rearrangement = BondRearrangement(breaking_bonds=[ (2, 1) ], forming_bonds=[(0, 2)]) f_ch3cl_ts = TransitionState(ts_guess=f_ch3cl_tsguess) atoms = conf_gen.get_simanl_atoms( species=f_ch3cl_ts, dist_consts=get_distance_constraints(f_ch3cl_ts)) regen = Molecule(name='regenerated_ts', charge=-1, mult=1, atoms=atoms) # regen.print_xyz_file() # Ensure the making/breaking bonds retain their length regen_coords = regen.get_coordinates() assert are_coords_reasonable(regen_coords) is True assert 1.9 < np.linalg.norm(regen_coords[0] - regen_coords[2]) < 2.1 assert 2.0 < np.linalg.norm(regen_coords[1] - regen_coords[2]) < 2.2 os.chdir(here)
def test_plot_reaction_profile(): r = Reactant(name='reactant', smiles='C') p = Product(name='product', smiles='C') tsguess = TSguess(atoms=r.atoms, reactant=ReactantComplex(r), product=ProductComplex(p)) tsguess.bond_rearrangement = BondRearrangement() ts = TransitionState(tsguess) reaction = Reaction(r, p) reaction.ts = ts plotting.plot_reaction_profile(reactions=[reaction], units=KjMol, name='test_reaction') assert os.path.exists('test_reaction_reaction_profile.png') os.remove('test_reaction_reaction_profile.png')
def test_plot_reaction_profile(): # only tests the file is created with the right name os.chdir(os.path.join(here, 'data')) r = Reactant(name='reactant', smiles='C') p = Product(name='product', smiles='C') tsguess = TSguess(atoms=r.atoms, reactant=ReactantComplex(r), product=ProductComplex(p)) tsguess.bond_rearrangement = BondRearrangement() ts = TransitionState(tsguess) reaction = Reaction(r, p) reaction.ts = ts plotting.plot_reaction_profile(reactions=[reaction], units=KjMol, name='test_reaction') assert os.path.exists('test_reaction_reaction_profile.png') os.remove('test_reaction_reaction_profile.png') os.chdir(here)
def test_optts_no_reactants_products(): da_ts_guess = TSguess(atoms=xyz_file_to_atoms('da_TS_guess.xyz')) da_ts = TransitionState(da_ts_guess) da_ts.optimise() assert len(da_ts.imaginary_frequencies) == 1 imag_freq = da_ts.imaginary_frequencies[0] assert -500 < imag_freq < -300 # cm-1 # Should raise exceptions for TSs not initialised with reactants and # products with pytest.raises(ValueError): _ = da_ts.could_have_correct_imag_mode() with pytest.raises(ValueError): _ = da_ts.has_correct_imag_mode()
mult=1, atoms=[ Atom('C', -0.05250, 0.00047, -0.00636), Atom('F', 1.31229, -0.01702, 0.16350), Atom('H', -0.54993, -0.04452, 0.97526), Atom('H', -0.34815, 0.92748, -0.52199), Atom('H', -0.36172, -0.86651, -0.61030) ]) cl = Product(charge=-1, mult=1, atoms=[Atom('Cl', 4.0, 0.0, 0.0)]) product_complex = ProductComplex(ch3f, cl) tsguess = TSguess(reactant=reac_complex, product=product_complex, atoms=[ Atom('F', -2.66092, -0.01426, 0.09700), Atom('Cl', 1.46795, 0.05788, -0.06166), Atom('C', -0.66317, -0.01826, 0.02488), Atom('H', -0.78315, -0.58679, -0.88975), Atom('H', -0.70611, -0.54149, 0.97313), Atom('H', -0.80305, 1.05409, 0.00503) ]) tsguess.bond_rearrangement = BondRearrangement(breaking_bonds=[(2, 1)], forming_bonds=[(0, 2)]) ts = TransitionState(ts_guess=tsguess) @testutils.work_in_zipped_dir(os.path.join(here, 'data', 'ts.zip')) def test_ts_guess_class(): # Force ORCA to appear available
def test_no_graph(): ts_no_graph = TSguess(atoms=None) assert ts_no_graph.graph is None