class MoleculeTest(PymatgenTest): def setUp(self): coords = [[0.000000, 0.000000, 0.000000], [0.000000, 0.000000, 1.089000], [1.026719, 0.000000, -0.363000], [-0.513360, -0.889165, -0.363000], [-0.513360, 0.889165, -0.363000]] self.mol = Molecule(["C", "H", "H", "H", "H"], coords) def test_mutable_sequence_methods(self): s = self.mol s[1] = ("F", [0.5, 0.5, 0.5]) self.assertEqual(s.formula, "H3 C1 F1") self.assertArrayAlmostEqual(s[1].coords, [0.5, 0.5, 0.5]) s.reverse() self.assertEqual(s[0].specie, Element("H")) self.assertArrayAlmostEqual(s[0].coords, [-0.513360, 0.889165, -0.363000]) del s[1] self.assertEqual(s.formula, "H2 C1 F1") s[3] = "N", [0,0,0], {"charge": 4} self.assertEqual(s.formula, "H2 N1 F1") self.assertEqual(s[3].charge, 4) def test_insert_remove_append(self): mol = self.mol mol.insert(1, "O", [0.5, 0.5, 0.5]) self.assertEqual(mol.formula, "H4 C1 O1") del mol[2] self.assertEqual(mol.formula, "H3 C1 O1") mol.set_charge_and_spin(0) self.assertEqual(mol.spin_multiplicity, 2) mol.append("N", [1, 1, 1]) self.assertEqual(mol.formula, "H3 C1 N1 O1") self.assertRaises(TypeError, dict, [(mol, 1)]) mol.remove_sites([0, 1]) self.assertEqual(mol.formula, "H3 N1") def test_translate_sites(self): self.mol.translate_sites([0, 1], [0.5, 0.5, 0.5]) self.assertArrayEqual(self.mol.cart_coords[0], [0.5, 0.5, 0.5]) def test_replace(self): self.mol[0] = "Ge" self.assertEqual(self.mol.formula, "Ge1 H4") self.mol.replace_species({Element("Ge"): {Element("Ge"): 0.5, Element("Si"): 0.5}}) self.assertEqual(self.mol.formula, "Si0.5 Ge0.5 H4") #this should change the .5Si .5Ge sites to .75Si .25Ge self.mol.replace_species({Element("Ge"): {Element("Ge"): 0.5, Element("Si"): 0.5}}) self.assertEqual(self.mol.formula, "Si0.75 Ge0.25 H4") d = 0.1 pre_perturbation_sites = self.mol.sites[:] self.mol.perturb(distance=d) post_perturbation_sites = self.mol.sites for i, x in enumerate(pre_perturbation_sites): self.assertAlmostEqual(x.distance(post_perturbation_sites[i]), d, 3, "Bad perturbation distance") def test_add_site_property(self): self.mol.add_site_property("charge", [4.1, -2, -2, -2, -2]) self.assertEqual(self.mol[0].charge, 4.1) self.assertEqual(self.mol[1].charge, -2) self.mol.add_site_property("magmom", [3, 2, 2, 2, 2]) self.assertEqual(self.mol[0].charge, 4.1) self.assertEqual(self.mol[0].magmom, 3) def test_to_from_dict(self): d = self.mol.as_dict() mol2 = Molecule.from_dict(d) self.assertEqual(type(mol2), Molecule) def test_apply_operation(self): op = SymmOp.from_axis_angle_and_translation([0, 0, 1], 90) self.mol.apply_operation(op) self.assertArrayAlmostEqual(self.mol[2].coords, [0.000000, 1.026719, -0.363000]) def test_substitute(self): coords = [[0.000000, 0.000000, 1.08], [0.000000, 0.000000, 0.000000], [1.026719, 0.000000, -0.363000], [-0.513360, -0.889165, -0.363000], [-0.513360, 0.889165, -0.363000]] sub = Molecule(["X", "C", "H", "H", "H"], coords) self.mol.substitute(1, sub) self.assertAlmostEqual(self.mol.get_distance(0, 4), 1.54) f = Molecule(["X", "F"], [[0, 0, 0], [0, 0, 1.11]]) self.mol.substitute(2, f) self.assertAlmostEqual(self.mol.get_distance(0, 7), 1.35) oh = Molecule(["X", "O", "H"], [[0, 0.780362, -.456316], [0, 0, .114079], [0, -.780362, -.456316]]) self.mol.substitute(1, oh) self.assertAlmostEqual(self.mol.get_distance(0, 7), 1.43) self.mol.substitute(3, "methyl") self.assertEqual(self.mol.formula, "H7 C3 O1 F1") coords = [[0.00000, 1.40272, 0.00000], [0.00000, 2.49029, 0.00000], [-1.21479, 0.70136, 0.00000], [-2.15666, 1.24515, 0.00000], [-1.21479, -0.70136, 0.00000], [-2.15666, -1.24515, 0.00000], [0.00000, -1.40272, 0.00000], [0.00000, -2.49029, 0.00000], [1.21479, -0.70136, 0.00000], [2.15666, -1.24515, 0.00000], [1.21479, 0.70136, 0.00000], [2.15666, 1.24515, 0.00000]] benzene = Molecule(["C", "H", "C", "H", "C", "H", "C", "H", "C", "H", "C", "H"], coords) benzene.substitute(1, sub) self.assertEqual(benzene.formula, "H8 C7") #Carbon attached should be in plane. self.assertAlmostEqual(benzene[11].coords[2], 0) def test_to_from_file_string(self): for fmt in ["xyz", "json", "g03"]: s = self.mol.to(fmt=fmt) self.assertIsNotNone(s) m = Molecule.from_str(s, fmt=fmt) self.assertEqual(m, self.mol) self.assertIsInstance(m, Molecule) self.mol.to(filename="CH4_testing.xyz") self.assertTrue(os.path.exists("CH4_testing.xyz")) os.remove("CH4_testing.xyz")
class MoleculeTest(PymatgenTest): def setUp(self): coords = [[0.000000, 0.000000, 0.000000], [0.000000, 0.000000, 1.089000], [1.026719, 0.000000, -0.363000], [-0.513360, -0.889165, -0.363000], [-0.513360, 0.889165, -0.363000]] self.mol = Molecule(["C", "H", "H", "H", "H"], coords) def test_insert_remove_append(self): mol = self.mol mol.insert(1, "O", [0.5, 0.5, 0.5]) self.assertEqual(mol.formula, "H4 C1 O1") mol.remove(2) self.assertEqual(mol.formula, "H3 C1 O1") mol.set_charge_and_spin(0) self.assertEqual(mol.spin_multiplicity, 2) mol.append("N", [0.25, 0.25, 0.25]) self.assertEqual(mol.formula, "H3 C1 N1 O1") self.assertRaises(TypeError, dict, [(mol, 1)]) mol.remove_sites([0, 1]) self.assertEqual(mol.formula, "H3 N1") def test_translate_sites(self): self.mol.translate_sites([0, 1], [0.5, 0.5, 0.5]) self.assertArrayEqual(self.mol.cart_coords[0], [0.5, 0.5, 0.5]) def test_replace(self): self.mol.replace(0, "Ge") self.assertEqual(self.mol.formula, "Ge1 H4") self.mol.replace_species({Element("Ge"): {Element("Ge"): 0.5, Element("Si"): 0.5}}) self.assertEqual(self.mol.formula, "Si0.5 Ge0.5 H4") #this should change the .5Si .5Ge sites to .75Si .25Ge self.mol.replace_species({Element("Ge"): {Element("Ge"): 0.5, Element("Si"): 0.5}}) self.assertEqual(self.mol.formula, "Si0.75 Ge0.25 H4") d = 0.1 pre_perturbation_sites = self.mol.sites[:] self.mol.perturb(distance=d) post_perturbation_sites = self.mol.sites for i, x in enumerate(pre_perturbation_sites): self.assertAlmostEqual(x.distance(post_perturbation_sites[i]), d, 3, "Bad perturbation distance") def test_add_site_property(self): self.mol.add_site_property("charge", [4.1, -2, -2, -2, -2]) self.assertEqual(self.mol[0].charge, 4.1) self.assertEqual(self.mol[1].charge, -2) self.mol.add_site_property("magmom", [3, 2, 2, 2, 2]) self.assertEqual(self.mol[0].charge, 4.1) self.assertEqual(self.mol[0].magmom, 3) def test_to_from_dict(self): d = self.mol.to_dict mol2 = Molecule.from_dict(d) self.assertEqual(type(mol2), Molecule) def test_apply_operation(self): op = SymmOp.from_axis_angle_and_translation([0, 0, 1], 90) self.mol.apply_operation(op) self.assertArrayAlmostEqual(self.mol[2].coords, [0.000000, 1.026719, -0.363000]) def test_substitute(self): coords = [[0.000000, 0.000000, 1.08], [0.000000, 0.000000, 0.000000], [1.026719, 0.000000, -0.363000], [-0.513360, -0.889165, -0.363000], [-0.513360, 0.889165, -0.363000]] sub = Molecule(["X", "C", "H", "H", "H"], coords) self.mol.substitute(1, sub) self.assertAlmostEqual(self.mol.get_distance(0, 4), 1.54) sub = Molecule(["X", "F"], [[0, 0, 0], [0, 0, 1.11]]) self.mol.substitute(2, sub) self.assertAlmostEqual(self.mol.get_distance(0, 7), 1.35) oh = Molecule(["X", "O", "H"], [[0, 0.780362, -.456316], [0, 0, .114079], [0, -.780362, -.456316]]) self.mol.substitute(1, oh) self.assertAlmostEqual(self.mol.get_distance(0, 7), 1.43) self.mol.substitute(3, "methyl") self.assertEqual(self.mol.formula, "H7 C3 O1 F1")
class MoleculeTest(PymatgenTest): def setUp(self): coords = [[0.000000, 0.000000, 0.000000], [0.000000, 0.000000, 1.089000], [1.026719, 0.000000, -0.363000], [-0.513360, -0.889165, -0.363000], [-0.513360, 0.889165, -0.363000]] self.mol = Molecule(["C", "H", "H", "H", "H"], coords) def test_mutable_sequence_methods(self): s = self.mol s[1] = ("F", [0.5, 0.5, 0.5]) self.assertEqual(s.formula, "H3 C1 F1") self.assertArrayAlmostEqual(s[1].coords, [0.5, 0.5, 0.5]) s.reverse() self.assertEqual(s[0].specie, Element("H")) self.assertArrayAlmostEqual(s[0].coords, [-0.513360, 0.889165, -0.363000]) del s[1] self.assertEqual(s.formula, "H2 C1 F1") s[3] = "N", [0, 0, 0], {"charge": 4} self.assertEqual(s.formula, "H2 N1 F1") self.assertEqual(s[3].charge, 4) def test_insert_remove_append(self): mol = self.mol mol.insert(1, "O", [0.5, 0.5, 0.5]) self.assertEqual(mol.formula, "H4 C1 O1") mol.remove(2) self.assertEqual(mol.formula, "H3 C1 O1") mol.set_charge_and_spin(0) self.assertEqual(mol.spin_multiplicity, 2) mol.append("N", [0.25, 0.25, 0.25]) self.assertEqual(mol.formula, "H3 C1 N1 O1") self.assertRaises(TypeError, dict, [(mol, 1)]) mol.remove_sites([0, 1]) self.assertEqual(mol.formula, "H3 N1") def test_translate_sites(self): self.mol.translate_sites([0, 1], [0.5, 0.5, 0.5]) self.assertArrayEqual(self.mol.cart_coords[0], [0.5, 0.5, 0.5]) def test_replace(self): self.mol.replace(0, "Ge") self.assertEqual(self.mol.formula, "Ge1 H4") self.mol.replace_species( {Element("Ge"): { Element("Ge"): 0.5, Element("Si"): 0.5 }}) self.assertEqual(self.mol.formula, "Si0.5 Ge0.5 H4") #this should change the .5Si .5Ge sites to .75Si .25Ge self.mol.replace_species( {Element("Ge"): { Element("Ge"): 0.5, Element("Si"): 0.5 }}) self.assertEqual(self.mol.formula, "Si0.75 Ge0.25 H4") d = 0.1 pre_perturbation_sites = self.mol.sites[:] self.mol.perturb(distance=d) post_perturbation_sites = self.mol.sites for i, x in enumerate(pre_perturbation_sites): self.assertAlmostEqual(x.distance(post_perturbation_sites[i]), d, 3, "Bad perturbation distance") def test_add_site_property(self): self.mol.add_site_property("charge", [4.1, -2, -2, -2, -2]) self.assertEqual(self.mol[0].charge, 4.1) self.assertEqual(self.mol[1].charge, -2) self.mol.add_site_property("magmom", [3, 2, 2, 2, 2]) self.assertEqual(self.mol[0].charge, 4.1) self.assertEqual(self.mol[0].magmom, 3) def test_to_from_dict(self): d = self.mol.to_dict mol2 = Molecule.from_dict(d) self.assertEqual(type(mol2), Molecule) def test_apply_operation(self): op = SymmOp.from_axis_angle_and_translation([0, 0, 1], 90) self.mol.apply_operation(op) self.assertArrayAlmostEqual(self.mol[2].coords, [0.000000, 1.026719, -0.363000]) def test_substitute(self): coords = [[0.000000, 0.000000, 1.08], [0.000000, 0.000000, 0.000000], [1.026719, 0.000000, -0.363000], [-0.513360, -0.889165, -0.363000], [-0.513360, 0.889165, -0.363000]] sub = Molecule(["X", "C", "H", "H", "H"], coords) self.mol.substitute(1, sub) self.assertAlmostEqual(self.mol.get_distance(0, 4), 1.54) f = Molecule(["X", "F"], [[0, 0, 0], [0, 0, 1.11]]) self.mol.substitute(2, f) self.assertAlmostEqual(self.mol.get_distance(0, 7), 1.35) oh = Molecule(["X", "O", "H"], [[0, 0.780362, -.456316], [0, 0, .114079], [0, -.780362, -.456316]]) self.mol.substitute(1, oh) self.assertAlmostEqual(self.mol.get_distance(0, 7), 1.43) self.mol.substitute(3, "methyl") self.assertEqual(self.mol.formula, "H7 C3 O1 F1") coords = [[0.00000, 1.40272, 0.00000], [0.00000, 2.49029, 0.00000], [-1.21479, 0.70136, 0.00000], [-2.15666, 1.24515, 0.00000], [-1.21479, -0.70136, 0.00000], [-2.15666, -1.24515, 0.00000], [0.00000, -1.40272, 0.00000], [0.00000, -2.49029, 0.00000], [1.21479, -0.70136, 0.00000], [2.15666, -1.24515, 0.00000], [1.21479, 0.70136, 0.00000], [2.15666, 1.24515, 0.00000]] benzene = Molecule( ["C", "H", "C", "H", "C", "H", "C", "H", "C", "H", "C", "H"], coords) benzene.substitute(1, sub) self.assertEqual(benzene.formula, "H8 C7") #Carbon attached should be in plane. self.assertAlmostEqual(benzene[11].coords[2], 0)
class MoleculeTest(PymatgenTest): def setUp(self): coords = [[0.000000, 0.000000, 0.000000], [0.000000, 0.000000, 1.089000], [1.026719, 0.000000, -0.363000], [-0.513360, -0.889165, -0.363000], [-0.513360, 0.889165, -0.363000]] self.mol = Molecule(["C", "H", "H", "H", "H"], coords) def test_insert_remove_append(self): mol = self.mol mol.insert(1, "O", [0.5, 0.5, 0.5]) self.assertEqual(mol.formula, "H4 C1 O1") mol.remove(2) self.assertEqual(mol.formula, "H3 C1 O1") mol.set_charge_and_spin(0) self.assertEqual(mol.spin_multiplicity, 2) mol.append("N", [0.25, 0.25, 0.25]) self.assertEqual(mol.formula, "H3 C1 N1 O1") self.assertRaises(TypeError, dict, [(mol, 1)]) mol.remove_sites([0, 1]) self.assertEqual(mol.formula, "H3 N1") def test_translate_sites(self): self.mol.translate_sites([0, 1], [0.5, 0.5, 0.5]) self.assertArrayEqual(self.mol.cart_coords[0], [0.5, 0.5, 0.5]) def test_replace(self): self.mol.replace(0, "Ge") self.assertEqual(self.mol.formula, "Ge1 H4") self.mol.replace_species( {Element("Ge"): { Element("Ge"): 0.5, Element("Si"): 0.5 }}) self.assertEqual(self.mol.formula, "Si0.5 Ge0.5 H4") #this should change the .5Si .5Ge sites to .75Si .25Ge self.mol.replace_species( {Element("Ge"): { Element("Ge"): 0.5, Element("Si"): 0.5 }}) self.assertEqual(self.mol.formula, "Si0.75 Ge0.25 H4") d = 0.1 pre_perturbation_sites = self.mol.sites[:] self.mol.perturb(distance=d) post_perturbation_sites = self.mol.sites for i, x in enumerate(pre_perturbation_sites): self.assertAlmostEqual(x.distance(post_perturbation_sites[i]), d, 3, "Bad perturbation distance") def test_add_site_property(self): self.mol.add_site_property("charge", [4.1, -2, -2, -2, -2]) self.assertEqual(self.mol[0].charge, 4.1) self.assertEqual(self.mol[1].charge, -2) self.mol.add_site_property("magmom", [3, 2, 2, 2, 2]) self.assertEqual(self.mol[0].charge, 4.1) self.assertEqual(self.mol[0].magmom, 3) def test_to_from_dict(self): d = self.mol.to_dict mol2 = Molecule.from_dict(d) self.assertEqual(type(mol2), Molecule) def test_apply_operation(self): op = SymmOp.from_axis_angle_and_translation([0, 0, 1], 90) self.mol.apply_operation(op) self.assertArrayAlmostEqual(self.mol[2].coords, [0.000000, 1.026719, -0.363000]) def test_substitute(self): coords = [[0.000000, 0.000000, 1.08], [0.000000, 0.000000, 0.000000], [1.026719, 0.000000, -0.363000], [-0.513360, -0.889165, -0.363000], [-0.513360, 0.889165, -0.363000]] sub = Molecule(["X", "C", "H", "H", "H"], coords) self.mol.substitute(1, sub) self.assertAlmostEqual(self.mol.get_distance(0, 4), 1.54) sub = Molecule(["X", "F"], [[0, 0, 0], [0, 0, 1.11]]) self.mol.substitute(2, sub) self.assertAlmostEqual(self.mol.get_distance(0, 7), 1.35) oh = Molecule(["X", "O", "H"], [[0, 0.780362, -.456316], [0, 0, .114079], [0, -.780362, -.456316]]) self.mol.substitute(1, oh) self.assertAlmostEqual(self.mol.get_distance(0, 7), 1.43)