class TestOpanXYZGoodDirectData(SuperOpanXYZ): # Confirming sanity of an OpanXYZ generated directly from data. # There are checks here of some of the generated resuls when using # 'x_iter' methods with 'None'. def setUp(self): # Load the object # Imports from opan.xyz import OpanXYZ # Create the object self.xyz = OpanXYZ(atom_syms=self.good_direct_atoms, coords=self.good_direct_geom) # Long messages self.longMessage = True def test_XYZ_GoodDirectDataNumAtoms(self): self.assertEqual(self.xyz.num_atoms, len(self.good_direct_atoms)) def test_XYZ_GoodDirectDataNumGeoms(self): self.assertEqual(self.xyz.num_geoms, 1) def test_XYZ_GoodDirectDataNumCoords(self): self.assertEqual(self.xyz.geoms[0].shape[0], self.xyz.num_atoms * 3) def test_XYZ_GoodDirectDataCoords(self): for i in range(self.good_direct_geom[0].shape[0]): self.assertAlmostEqual(self.xyz.geoms[0][i], self.good_direct_geom[0][i], delta=1e-8, msg="Coordinates element (" + str(i) + ')') def test_XYZ_GoodDirectDataIterO1Dist(self): for tup in zip(self.good_direct_O1Dist, self.xyz.dist_iter(0, 1, None), range(self.good_direct_O1Dist.shape[0])): self.assertAlmostEqual( tup[0], tup[1], delta=1e-5, msg="Distance between O1 and atom #" + str(tup[2]) + " (" + self.xyz.atom_syms[tup[2]].capitalize() + ")") def test_XYZ_GoodDirectDataIterCuO1Angle(self): for tup in zip(self.good_direct_CuO1Angle, self.xyz.angle_iter(0, 0, 1, None), range(self.good_direct_CuO1Angle.shape[0])): self.assertAlmostEqual( tup[0], tup[1], delta=5e-3, msg="Angle Cu-O-X with atom #" + str(tup[2]) + " (" + self.xyz.atom_syms[tup[2]].capitalize() + ")") def test_XYZ_GoodDirectDataIterDihed(self): for tup in zip(self.good_direct_Dihed, self.xyz.dihed_iter(0, None, 1, 0, 2), range(self.good_direct_Dihed.shape[0])): self.assertAlmostEqual( tup[0], tup[1], delta=5e-3, msg="Dihedral with atom #" + str(tup[2]) + " (" + self.xyz.atom_syms[tup[2]].capitalize() + ")")
class TestOpanXYZGoodDirectData(SuperOpanXYZ): # Confirming sanity of an OpanXYZ generated directly from data. # There are checks here of some of the generated resuls when using # 'x_iter' methods with 'None'. def setUp(self): # Load the object # Imports from opan.xyz import OpanXYZ # Create the object self.xyz = OpanXYZ(atom_syms=self.good_direct_atoms, coords=self.good_direct_geom) # Long messages self.longMessage = True def test_XYZ_GoodDirectDataNumAtoms(self): self.assertEqual(self.xyz.num_atoms, len(self.good_direct_atoms)) def test_XYZ_GoodDirectDataNumGeoms(self): self.assertEqual(self.xyz.num_geoms, 1) def test_XYZ_GoodDirectDataNumCoords(self): self.assertEqual(self.xyz.geoms[0].shape[0], self.xyz.num_atoms * 3) def test_XYZ_GoodDirectDataCoords(self): for i in range(self.good_direct_geom[0].shape[0]): self.assertAlmostEqual(self.xyz.geoms[0][i], self.good_direct_geom[0][i], delta=1e-8, msg="Coordinates element (" + str(i) + ')') def test_XYZ_GoodDirectDataIterO1Dist(self): for tup in zip( self.good_direct_O1Dist, self.xyz.dist_iter(0,1,None), range(self.good_direct_O1Dist.shape[0]) ): self.assertAlmostEqual(tup[0], tup[1], delta=1e-5, msg="Distance between O1 and atom #" + str(tup[2]) + " (" + self.xyz.atom_syms[tup[2]].capitalize() + ")") def test_XYZ_GoodDirectDataIterCuO1Angle(self): for tup in zip( self.good_direct_CuO1Angle, self.xyz.angle_iter(0,0,1,None), range(self.good_direct_CuO1Angle.shape[0]) ): self.assertAlmostEqual(tup[0], tup[1], delta=5e-3, msg="Angle Cu-O-X with atom #" + str(tup[2]) + " (" + self.xyz.atom_syms[tup[2]].capitalize() + ")") def test_XYZ_GoodDirectDataIterDihed(self): for tup in zip( self.good_direct_Dihed, self.xyz.dihed_iter(0,None, 1,0,2), range(self.good_direct_Dihed.shape[0]) ): self.assertAlmostEqual(tup[0], tup[1], delta=5e-3, msg="Dihedral with atom #" + str(tup[2]) + " (" + self.xyz.atom_syms[tup[2]].capitalize() + ")")
class TestOpanXYZGoodFileData(SuperOpanXYZ): # Ensuring importing a known OpenBabel xyz file with good data reports # the correct geometric parameters, etc. @classmethod def setUpClass(cls): from opan.test.utils import setUpTestDir # Set up the directory and add the good file setUpTestDir(cls.testdir) # Write the file with open(cls.file_name, 'w') as f: f.write(cls.file_text_good) @classmethod def tearDownClass(cls): import os from opan.test.utils import tearDownTestDir # Delete the xyz file os.remove(cls.file_name) # Remove the test directory tearDownTestDir(cls.testdir) def setUp(self): # Load the object # Imports from opan.xyz import OpanXYZ # Create the object self.xyz = OpanXYZ(path=self.file_name) # Long messages self.longMessage = True def test_XYZ_GoodFileDataNumAtoms(self): self.assertEqual(self.xyz.num_atoms, self.num_atoms) def test_XYZ_GoodFileDataNumGeoms(self): self.assertEqual(self.xyz.num_geoms, self.num_geoms) def test_XYZ_GoodFileDataAtomSyms(self): for i in range(len(self.xyz.atom_syms)): self.assertEqual(self.xyz.atom_syms[i], self.atom_syms[i], msg="Coordinates element (" + str(i) + ')') def test_XYZ_GoodFileDataCoords(self): for g in range(len(self.geoms)): for i in range(self.geoms[g].shape[0]): self.assertAlmostEqual(self.xyz.geoms[g][i], self.geoms[g][i], delta=1e-6, msg="Geometry #" + str(g) + ", coordinate element #" + str(i)) def test_XYZ_GoodFileDataDistances(self): for t in zip(self.dist_Cu_O, self.xyz.dist_iter(None, 0, 1), range(self.dist_Cu_O.shape[0])): self.assertAlmostEqual(t[0], t[1], delta=1e-5, msg="Cu-O distance mismatch at geom #" + str(t[2]) + ": " + str(t[0:2])) for t in zip(self.dist_O_H1, self.xyz.dist_iter(None, 1, 2), range(self.dist_O_H1.shape[0])): self.assertAlmostEqual(t[0], t[1], delta=1e-5, msg="O-H1 distance mismatch at geom #" + str(t[2]) + ": " + str(t[0:2])) def test_XYZ_GoodFileDataAngles(self): for t in zip(self.angle_Cu_O_H1, self.xyz.angle_iter(None, 0, 1, 2), range(self.angle_Cu_O_H1.shape[0])): self.assertAlmostEqual(t[0], t[1], delta=1e-2, msg="Cu-O-H1 angle mismatch at geom #" + str(t[2]) + ": " + str(t[0:2])) def test_XYZ_GoodFileDataDihedrals(self): for t in zip(self.dihed_H2_O_Cu_H1, self.xyz.dihed_iter(None, 3, 1, 0, 2), range(self.dihed_H2_O_Cu_H1.shape[0])): self.assertAlmostEqual( t[0], t[1], delta=1e-2, msg="H2-Cu-O-H1 dihedral mismatch at geom #" + str(t[2]) + ": " + str(t[0:2])) def test_XYZ_GoodFileDataIterGeom(self): import numpy as np idxs = [1, 4, 8] for t in zip( np.array(self.geoms)[idxs], self.xyz.geom_iter(idxs), range(len(idxs))): for i in range(t[0].shape[0]): self.assertAlmostEqual(t[0][i], t[1][i], delta=1e-6, msg="Geometry #" + str(t[2]) + \ ", coordinate element #" + str(i)) def test_XYZ_GoodFileDataDisplacements(self): for t in zip(self.displ_Cu_O, self.xyz.displ_iter(None, 0, 1), range(len(self.displ_Cu_O))): for i in range(self.displ_Cu_O[0].shape[0]): self.assertAlmostEqual( t[0][i], t[1][i], delta=1e-6, msg="Displacement #{0}, dimension #{1}".format(t[2], i)) def test_XYZ_GoodFileDataZeroDisplacement(self): # Have to use assertTrue b/c numpy confuses assertEqual &c. self.assertTrue(all(self.xyz.displ_single(0, 0, 0) == [0.0, 0.0, 0.0]))
class TestOpanXYZGoodFileData(SuperOpanXYZ): # Ensuring importing a known OpenBabel xyz file with good data reports # the correct geometric parameters, etc. @classmethod def setUpClass(cls): from opan.test.utils import setUpTestDir # Set up the directory and add the good file setUpTestDir(cls.testdir) # Write the file with open(cls.file_name, 'w') as f: f.write(cls.file_text_good) @classmethod def tearDownClass(cls): import os from opan.test.utils import tearDownTestDir # Delete the xyz file os.remove(cls.file_name) # Remove the test directory tearDownTestDir(cls.testdir) def setUp(self): # Load the object # Imports from opan.xyz import OpanXYZ # Create the object self.xyz = OpanXYZ(path=self.file_name) # Long messages self.longMessage = True def test_XYZ_GoodFileDataNumAtoms(self): self.assertEqual(self.xyz.num_atoms, self.num_atoms) def test_XYZ_GoodFileDataNumGeoms(self): self.assertEqual(self.xyz.num_geoms, self.num_geoms) def test_XYZ_GoodFileDataAtomSyms(self): for i in range(len(self.xyz.atom_syms)): self.assertEqual(self.xyz.atom_syms[i], self.atom_syms[i], msg="Coordinates element (" + str(i) + ')') def test_XYZ_GoodFileDataCoords(self): for g in range(len(self.geoms)): for i in range(self.geoms[g].shape[0]): self.assertAlmostEqual(self.xyz.geoms[g][i], self.geoms[g][i], delta=1e-6, msg="Geometry #" + str(g) + ", coordinate element #" + str(i)) def test_XYZ_GoodFileDataDistances(self): for t in zip(self.dist_Cu_O, self.xyz.dist_iter(None, 0, 1), range(self.dist_Cu_O.shape[0])): self.assertAlmostEqual(t[0], t[1], delta=1e-5, msg="Cu-O distance mismatch at geom #" + str(t[2]) + ": " + str(t[0:2])) for t in zip(self.dist_O_H1, self.xyz.dist_iter(None, 1, 2), range(self.dist_O_H1.shape[0])): self.assertAlmostEqual(t[0], t[1], delta=1e-5, msg="O-H1 distance mismatch at geom #" + str(t[2]) + ": " + str(t[0:2])) def test_XYZ_GoodFileDataAngles(self): for t in zip(self.angle_Cu_O_H1, self.xyz.angle_iter(None, 0, 1, 2), range(self.angle_Cu_O_H1.shape[0])): self.assertAlmostEqual(t[0], t[1], delta=1e-2, msg="Cu-O-H1 angle mismatch at geom #" + str(t[2]) + ": " + str(t[0:2])) def test_XYZ_GoodFileDataDihedrals(self): for t in zip(self.dihed_H2_O_Cu_H1, self.xyz.dihed_iter(None, 3, 1, 0, 2), range(self.dihed_H2_O_Cu_H1.shape[0])): self.assertAlmostEqual(t[0], t[1], delta=1e-2, msg="H2-Cu-O-H1 dihedral mismatch at geom #" + str(t[2]) + ": " + str(t[0:2])) def test_XYZ_GoodFileDataIterGeom(self): import numpy as np idxs = [1,4,8] for t in zip(np.array(self.geoms)[idxs], self.xyz.geom_iter(idxs), range(len(idxs)) ): for i in range(t[0].shape[0]): self.assertAlmostEqual(t[0][i], t[1][i], delta=1e-6, msg="Geometry #" + str(t[2]) + \ ", coordinate element #" + str(i)) def test_XYZ_GoodFileDataDisplacements(self): for t in zip(self.displ_Cu_O, self.xyz.displ_iter(None, 0, 1), range(len(self.displ_Cu_O)) ): for i in range(self.displ_Cu_O[0].shape[0]): self.assertAlmostEqual(t[0][i], t[1][i], delta=1e-6, msg="Displacement #{0}, dimension #{1}".format(t[2], i)) def test_XYZ_GoodFileDataZeroDisplacement(self): # Have to use assertTrue b/c numpy confuses assertEqual &c. self.assertTrue(all(self.xyz.displ_single(0,0,0) == [0.0, 0.0, 0.0]))