Exemplo n.º 1
0
 def setUp(self):
     carbon_1 = MagicMock(element='CARBON',
                          charge=6,
                          mass=12,
                          coordinates=(-0.98781, 0.41551, 0.00000))
     hydrogen_1 = MagicMock(element='HYDROGEN',
                            charge=1,
                            mass=1,
                            coordinates=(0.08219, 0.41551, 0.00000))
     hydrogen_2 = MagicMock(element='HYDROGEN',
                            charge=1,
                            mass=1,
                            coordinates=(-1.34447, 0.70319, -0.96692))
     hydrogen_3 = MagicMock(element='HYDROGEN',
                            charge=1,
                            mass=1,
                            coordinates=(-1.34448, 1.10904, 0.73260))
     hydrogen_4 = MagicMock(element='HYDROGEN',
                            charge=1,
                            mass=1,
                            coordinates=(-1.34448, -0.56571, 0.23432))
     self.nuclei_array_ch4 = [
         carbon_1, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4
     ]
     self.molecule_factory = MoleculeFactory(symmetry=True)
     self.symmetry_factory = SymmetryFactory()
Exemplo n.º 2
0
class TestSymmetryC2H6(TestCase):

    def setUp(self):
        carbon_1 = MagicMock(element='CARBON', charge=6, mass=12, coordinates=(-0.5297, 0.0100, -0.5606))
        carbon_2 = MagicMock(element='CARBON', charge=6, mass=12, coordinates=(0.5297, -0.0100, 0.5606))
        hydrogen_1 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(-0.1452, 0.5058, -1.4448))
        hydrogen_2 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(-1.4207, 0.5374, -0.2390))
        hydrogen_3 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(-0.8163, -0.9984, -0.8374))
        hydrogen_4 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(0.1452, -0.5058, 1.4448))
        hydrogen_5 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(0.8163, 0.9984, 0.8374))
        hydrogen_6 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(1.4207, -0.5374, 0.2390))

        self.nuclei_array_c2h6 = [
            carbon_1, carbon_2, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4, hydrogen_5, hydrogen_6
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()

    def test_check_linear_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation, reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, False)

    def test_check_high_symmetry_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation, reflection)
        boolean = self.molecule_factory.check_high_symmetry(rotation)
        self.assertEqual(boolean, False)

    def test_check_n_two_fold_rotation_perpendicular_to_n_fold_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation, reflection)
        boolean = self.molecule_factory.check_n_two_fold_perpendicular_to_n_fold(rotation)
        self.assertEqual(boolean, True)

    def test_check_sigma_h_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation, reflection)
        boolean = self.molecule_factory.check_sigma_h(reflection)
        self.assertEqual(boolean, False)

    def test_check_n_sigma_v_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation, reflection)
        boolean = self.molecule_factory.check_n_sigma_v(3, reflection)
        self.assertEqual(boolean, True)

    def test_point_group_returns_d_3d_symmetry_for_cubane(self):
        symmetry = self.molecule_factory.create(self.nuclei_array_c2h6)[1].label
        testing.assert_equal(symmetry, 'D_{3d}')
Exemplo n.º 3
0
    def setUp(self):
        nitrogen_1 = MagicMock(element='NITROGEN',
                               charge=7,
                               mass=14,
                               coordinates=(0.0000000000, 0.0000000000,
                                            1.0399092291))
        nitrogen_2 = MagicMock(element='NITROGEN',
                               charge=7,
                               mass=14,
                               coordinates=(0.0000000000, 0.0000000000,
                                            -1.0399092291))

        self.nuclei_array_n2 = [nitrogen_1, nitrogen_2]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
Exemplo n.º 4
0
    def setUp(self):
        carbon_1 = MagicMock(element='CARBON', charge=6, mass=12, coordinates=(-0.5297, 0.0100, -0.5606))
        carbon_2 = MagicMock(element='CARBON', charge=6, mass=12, coordinates=(0.5297, -0.0100, 0.5606))
        hydrogen_1 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(-0.1452, 0.5058, -1.4448))
        hydrogen_2 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(-1.4207, 0.5374, -0.2390))
        hydrogen_3 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(-0.8163, -0.9984, -0.8374))
        hydrogen_4 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(0.1452, -0.5058, 1.4448))
        hydrogen_5 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(0.8163, 0.9984, 0.8374))
        hydrogen_6 = MagicMock(element='HYDROGEN', charge=1, mass=1, coordinates=(1.4207, -0.5374, 0.2390))

        self.nuclei_array_c2h6 = [
            carbon_1, carbon_2, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4, hydrogen_5, hydrogen_6
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
Exemplo n.º 5
0
class TestSymmetryN2O(TestCase):
    def setUp(self):
        nitrogen_1 = MagicMock(element='NITROGEN',
                               charge=7,
                               mass=14,
                               coordinates=(0.0000000000, 0.0000000000,
                                            -2.2684205883))
        nitrogen_2 = MagicMock(element='NITROGEN',
                               charge=7,
                               mass=14,
                               coordinates=(0.0000000000, 0.0000000000,
                                            -0.1349300877))
        oxygen_1 = MagicMock(element='OXYGEN',
                             charge=8,
                             mass=16,
                             coordinates=(0.0000000000, 0.0000000000,
                                          2.1042369647))

        self.nuclei_array_n2o = [nitrogen_1, nitrogen_2, oxygen_1]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()

    def test_check_linear_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_n2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, True)

    def test_point_group_returns_c_inf_v_symmetry_for_nitrous_oxide(self):
        symmetry = self.molecule_factory.create(self.nuclei_array_n2o)[1].label
        testing.assert_equal(symmetry, 'C_{4v}')
Exemplo n.º 6
0
class TestSymmetryN2(TestCase):
    def setUp(self):
        nitrogen_1 = MagicMock(element='NITROGEN',
                               charge=7,
                               mass=14,
                               coordinates=(0.0000000000, 0.0000000000,
                                            1.0399092291))
        nitrogen_2 = MagicMock(element='NITROGEN',
                               charge=7,
                               mass=14,
                               coordinates=(0.0000000000, 0.0000000000,
                                            -1.0399092291))

        self.nuclei_array_n2 = [nitrogen_1, nitrogen_2]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()

    def test_check_linear_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_n2)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, True)

    # D_{4h} because D_{inf h} is not useful for reducing integrals
    def test_point_group_returns_d_4_h_symmetry_for_nitrogen(self):
        symmetry = self.molecule_factory.create(self.nuclei_array_n2)[1].label
        testing.assert_equal(symmetry, 'D_{4h}')
Exemplo n.º 7
0
    def setUp(self):
        nitrogen_1 = MagicMock(element='NITROGEN',
                               charge=7,
                               mass=14,
                               coordinates=(0.0000000000, 0.0000000000,
                                            -2.2684205883))
        nitrogen_2 = MagicMock(element='NITROGEN',
                               charge=7,
                               mass=14,
                               coordinates=(0.0000000000, 0.0000000000,
                                            -0.1349300877))
        oxygen_1 = MagicMock(element='OXYGEN',
                             charge=8,
                             mass=16,
                             coordinates=(0.0000000000, 0.0000000000,
                                          2.1042369647))

        self.nuclei_array_n2o = [nitrogen_1, nitrogen_2, oxygen_1]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
Exemplo n.º 8
0
    def setUp(self):
        oxygen_1 = MagicMock(element='OXYGEN',
                             charge=8,
                             mass=16,
                             coordinates=(-1.4186923158, 0.1090030362,
                                          0.0000000000))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.7313653816, -1.6895740638,
                                            0.0000000000))
        fluorine_1 = MagicMock(element='FLUORINE',
                               charge=9,
                               mass=19,
                               coordinates=(1.2899273141, 0.0031592817,
                                            0.0000000000))

        self.nuclei_array_hof = [oxygen_1, hydrogen_1, fluorine_1]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
Exemplo n.º 9
0
    def setUp(self):
        oxygen_1 = MagicMock(element='OXYGEN',
                             charge=8,
                             mass=16,
                             coordinates=(0.0000000000, 0.0000000000,
                                          -0.1363928482))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.0000000000, 1.4236595095,
                                            0.9813433754))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.0000000000, -1.4236595095,
                                            0.9813433754))

        self.nuclei_array_h2o = [oxygen_1, hydrogen_1, hydrogen_2]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
    def setUp(self):
        carbon_1 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.7516, -0.0225, -0.0209))
        carbon_2 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.7516, 0.0225, 0.0209))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.1851, -0.0039, 0.9875))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.1669, 0.8330, -0.5693))
        hydrogen_3 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.1155, -0.9329, -0.5145))
        hydrogen_4 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.1669, -0.8334, 0.5687))
        hydrogen_5 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.1157, 0.9326, 0.5151))
        hydrogen_6 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.1850, 0.0044, -0.9875))

        self.nuclei_array_c2h6 = [
            carbon_1, carbon_2, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4,
            hydrogen_5, hydrogen_6
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
Exemplo n.º 11
0
    def setUp(self):
        carbon_1 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.0000000000, 1.2594652672,
                                          0.0000000000))
        carbon_2 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.0000000000, -1.2594652672,
                                          0.0000000000))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.7400646600, 2.3216269636,
                                            0.0000000000))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.7400646600, 2.3216269636,
                                            0.0000000000))
        hydrogen_3 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.7400646600, -2.3216269636,
                                            0.0000000000))
        hydrogen_4 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.7400646600, -2.3216269636,
                                            0.0000000000))

        self.nuclei_array_c2h4 = [
            carbon_1, carbon_2, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
Exemplo n.º 12
0
 def setUp(self):
     particle_1 = MagicMock(element='HYDROGEN',
                            charge=1,
                            mass=1,
                            coordinates=(0.4391356726, 0.1106588251,
                                         -0.4635601962))
     particle_2 = MagicMock(element='HYDROGEN',
                            charge=1,
                            mass=1,
                            coordinates=(-0.5185079933, 0.3850176090,
                                         0.0537084789))
     particle_3 = MagicMock(element='HYDROGEN',
                            charge=1,
                            mass=1,
                            coordinates=(0.0793723207, -0.4956764341,
                                         0.4098517173))
     self.nuclei_array = [particle_1, particle_2, particle_3]
     self.molecule_factory = MoleculeFactory(symmetry=True)
     self.symmetry_factory = SymmetryFactory()
Exemplo n.º 13
0
class TestSymmetryH2O(TestCase):
    def setUp(self):
        oxygen_1 = MagicMock(element='OXYGEN',
                             charge=8,
                             mass=16,
                             coordinates=(0.0000000000, 0.0000000000,
                                          -0.1363928482))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.0000000000, 1.4236595095,
                                            0.9813433754))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.0000000000, -1.4236595095,
                                            0.9813433754))

        self.nuclei_array_h2o = [oxygen_1, hydrogen_1, hydrogen_2]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()

    def test_brute_force_rotation_symmetry_returns_list_of_one_axis_of_rotations(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(len(rotation), 1)

    def test_brute_force_rotation_symmetry_returns_axis_of_rotation_of_two_fold_symmetry(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(rotation[0].fold, 2)

    def test_brute_force_reflection_symmetry_returns_list_of_two_reflection_planes(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(len(reflection), 2)

    def test_check_linear_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, False)

    def test_check_high_symmetry_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_high_symmetry(rotation)
        self.assertEqual(boolean, False)

    def test_get_n_fold_returns_two(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        n = self.molecule_factory.return_principal_axis(rotation).fold
        self.assertEqual(n, 2)

    def test_check_n_two_fold_rotation_perpendicular_to_n_fold_returns_false(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_n_two_fold_perpendicular_to_n_fold(
            rotation)
        self.assertEqual(boolean, False)

    def test_check_sigma_h_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_sigma_h(reflection)
        self.assertEqual(boolean, False)

    def test_check_n_sigma_v_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_h2o)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_n_sigma_v(2, reflection)
        self.assertEqual(boolean, True)

    def test_point_group_returns_c_2v_symmetry_for_water(self):
        symmetry = self.molecule_factory.create(self.nuclei_array_h2o)[1].label
        testing.assert_equal(symmetry, 'C_{2v}')
Exemplo n.º 14
0
class TestSymmetryC2H4(TestCase):
    def setUp(self):
        carbon_1 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.0000000000, 1.2594652672,
                                          0.0000000000))
        carbon_2 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.0000000000, -1.2594652672,
                                          0.0000000000))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.7400646600, 2.3216269636,
                                            0.0000000000))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.7400646600, 2.3216269636,
                                            0.0000000000))
        hydrogen_3 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.7400646600, -2.3216269636,
                                            0.0000000000))
        hydrogen_4 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.7400646600, -2.3216269636,
                                            0.0000000000))

        self.nuclei_array_c2h4 = [
            carbon_1, carbon_2, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()

    def test_brute_force_rotation_symmetry_returns_list_of_three_axis_of_rotations(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(len(rotation), 3)

    def test_brute_force_reflection_symmetry_returns_list_of_three_reflection_planes(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(len(reflection), 3)

    def test_check_linear_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, False)

    def test_check_high_symmetry_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_high_symmetry(rotation)
        self.assertEqual(boolean, False)

    def test_check_n_two_fold_rotation_perpendicular_to_n_fold_returns_true(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_n_two_fold_perpendicular_to_n_fold(
            rotation)
        self.assertEqual(boolean, True)

    def test_check_sigma_h_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_sigma_h(reflection)
        self.assertEqual(boolean, True)

    def test_point_group_returns_d_2h_symmetry_for_ethene(self):
        symmetry = self.molecule_factory.create(
            self.nuclei_array_c2h4)[1].label
        testing.assert_equal(symmetry, 'D_{2h}')
Exemplo n.º 15
0
    def setUp(self):
        carbon_1 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(1.2455, 0.5367, -0.0729))
        carbon_2 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.9239, -0.9952, 0.0237))
        carbon_3 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.1226, -0.7041, 1.1548))
        carbon_4 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.1989, 0.8277, 1.0582))
        carbon_5 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.1226, 0.7042, -1.1548))
        carbon_6 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.9239, 0.9952, -0.0237))
        carbon_7 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-1.2454, -0.5367, 0.0729))
        carbon_8 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.1989, -0.8277, -1.0582))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(2.2431, 0.9666, -0.1313))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.6638, -1.7924, 0.0426))
        hydrogen_3 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-0.2209, -1.2683, 2.0797))
        hydrogen_4 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.3583, 1.4907, 1.9059))
        hydrogen_5 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.2208, 1.2681, -2.0799))
        hydrogen_6 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.6640, 1.7922, -0.0427))
        hydrogen_7 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-2.2430, -0.9665, 0.1313))
        hydrogen_8 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-0.3583, -1.4906, -1.9058))

        self.nuclei_array_c8h8 = [
            carbon_1, carbon_2, carbon_3, carbon_4, carbon_5, carbon_6,
            carbon_7, carbon_8, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4,
            hydrogen_5, hydrogen_6, hydrogen_7, hydrogen_8
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
        self.inversion_symmetry = InversionSymmetry()
Exemplo n.º 16
0
class TestSymmetryC8H8(TestCase):
    def setUp(self):
        carbon_1 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(1.2455, 0.5367, -0.0729))
        carbon_2 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.9239, -0.9952, 0.0237))
        carbon_3 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.1226, -0.7041, 1.1548))
        carbon_4 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.1989, 0.8277, 1.0582))
        carbon_5 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.1226, 0.7042, -1.1548))
        carbon_6 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.9239, 0.9952, -0.0237))
        carbon_7 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-1.2454, -0.5367, 0.0729))
        carbon_8 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.1989, -0.8277, -1.0582))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(2.2431, 0.9666, -0.1313))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.6638, -1.7924, 0.0426))
        hydrogen_3 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-0.2209, -1.2683, 2.0797))
        hydrogen_4 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.3583, 1.4907, 1.9059))
        hydrogen_5 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.2208, 1.2681, -2.0799))
        hydrogen_6 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.6640, 1.7922, -0.0427))
        hydrogen_7 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-2.2430, -0.9665, 0.1313))
        hydrogen_8 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-0.3583, -1.4906, -1.9058))

        self.nuclei_array_c8h8 = [
            carbon_1, carbon_2, carbon_3, carbon_4, carbon_5, carbon_6,
            carbon_7, carbon_8, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4,
            hydrogen_5, hydrogen_6, hydrogen_7, hydrogen_8
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()
        self.inversion_symmetry = InversionSymmetry()

    def test_check_linear_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c8h8)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, False)

    def test_check_high_symmetry_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c8h8)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_high_symmetry(rotation)
        self.assertEqual(boolean, True)

    def test_point_group_returns_o_h_symmetry_for_cubane(self):
        symmetry = self.molecule_factory.create(
            self.nuclei_array_c8h8)[1].label
        testing.assert_equal(symmetry, 'O_{h}')
Exemplo n.º 17
0
class TestSymmetryCH4(TestCase):
    def setUp(self):
        carbon_1 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.98781, 0.41551, 0.00000))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(0.08219, 0.41551, 0.00000))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.34447, 0.70319, -0.96692))
        hydrogen_3 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.34448, 1.10904, 0.73260))
        hydrogen_4 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.34448, -0.56571, 0.23432))
        self.nuclei_array_ch4 = [
            carbon_1, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()

    def test_center_molecule_changes_to_carbon_1_at_origin(self):
        carbon_1 = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)[0]
        testing.assert_array_almost_equal(carbon_1.coordinates,
                                          (0.0, 0.0, 0.0), 6)

    def test_center_molecule_changes_to_hydrogen_1(self):
        hydrogen_1 = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)[1]
        testing.assert_array_almost_equal(hydrogen_1.coordinates,
                                          (1.07, 0.0, 0.0), 6)

    def test_center_molecule_changes_to_hydrogen_2(self):
        hydrogen_2 = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)[2]
        testing.assert_array_almost_equal(hydrogen_2.coordinates,
                                          (-0.35666, 0.28768, -0.96692), 6)

    def test_center_molecule_changes_to_hydrogen_3(self):
        hydrogen_3 = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)[3]
        testing.assert_array_almost_equal(hydrogen_3.coordinates,
                                          (-0.35667, 0.69353, 0.73260), 6)

    def test_center_molecule_changes_to_hydrogen_4(self):
        hydrogen_4 = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)[4]
        testing.assert_array_almost_equal(hydrogen_4.coordinates,
                                          (-0.35667, -0.98122, 0.23432), 6)

    def test_brute_force_rotation_symmetry_returns_list_of_seven_axis_of_rotations(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(len(rotation), 7)

    def test_brute_force_rotation_symmetry_returns_list_of_four_axis_of_rotations_with_n_three(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual([symmetry.fold for symmetry in rotation].count(3), 4)

    def test_brute_force_rotation_symmetry_returns_list_of_four_axis_of_rotations_with_n_two(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual([symmetry.fold for symmetry in rotation].count(2), 3)

    def test_brute_force_reflection_symmetry_returns_a_list_of_six_reflection_planes(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(len(reflection), 6)

    def test_check_linear_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, False)

    def test_check_high_symmetry_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_ch4)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_high_symmetry(rotation)
        self.assertEqual(boolean, True)

    def test_point_group_returns_t_d_symmetry_for_methane(self):
        symmetry = self.molecule_factory.create(self.nuclei_array_ch4)[1].label
        testing.assert_equal(symmetry, 'T_{d}')
Exemplo n.º 18
0
class TestSymmetryHOF(TestCase):
    def setUp(self):
        oxygen_1 = MagicMock(element='OXYGEN',
                             charge=8,
                             mass=16,
                             coordinates=(-1.4186923158, 0.1090030362,
                                          0.0000000000))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.7313653816, -1.6895740638,
                                            0.0000000000))
        fluorine_1 = MagicMock(element='FLUORINE',
                               charge=9,
                               mass=19,
                               coordinates=(1.2899273141, 0.0031592817,
                                            0.0000000000))

        self.nuclei_array_hof = [oxygen_1, hydrogen_1, fluorine_1]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()

    def test_brute_force_rotation_symmetry_returns_list_of_zero_axis_of_rotations(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_hof)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(len(rotation), 0)

    def test_brute_force_reflection_symmetry_returns_list_of_one_reflection_planes(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_hof)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.assertEqual(len(reflection), 1)

    def test_check_linear_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_hof)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, False)

    def test_check_high_symmetry_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_hof)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_high_symmetry(rotation)
        self.assertEqual(boolean, False)

    def test_check_sigma_h_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_hof)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_sigma_h(reflection)
        self.assertEqual(boolean, True)

    def test_point_group_returns_c_s_symmetry_for_hypofluorous_acid(self):
        symmetry = self.molecule_factory.create(self.nuclei_array_hof)[1].label
        testing.assert_equal(symmetry, 'C_{s}')
Exemplo n.º 19
0
 def __init__(self, symmetry=False, error=1e-3):
     self.symmetry = symmetry
     self.error = error
     self.symmetry_factory = SymmetryFactory(error)
Exemplo n.º 20
0
class MoleculeFactory:
    def __init__(self, symmetry=False, error=1e-3):
        self.symmetry = symmetry
        self.error = error
        self.symmetry_factory = SymmetryFactory(error)

    def create(self, nuclei_array):

        if not self.symmetry:
            return nuclei_array, PointGroup([], [], [], [], 'C_{1}')

        nuclei_array = self.center_molecule(nuclei_array)

        if len(nuclei_array) == 1:  # Point
            return nuclei_array, Oh()

        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        nuclei_array, rotation, reflection = self.standard_orientation(
            nuclei_array, rotation, reflection)

        if self.check_linear(nuclei_array):  # Linear
            if len(inversion) == 1:
                return nuclei_array, D4h()
            else:
                return nuclei_array, C4v()

        if self.check_high_symmetry(rotation):  # Polyhedral
            if not len(inversion) == 1:
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion, 'T_{d}')
            elif any([vector.fold == 5 for vector in rotation]):
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion, 'I_{h}')
            else:
                return nuclei_array, PointGroup(rotation, reflection,
                                                inversion, improper, 'O_{h}')

        if len(rotation) == 0:  # Nonaxial
            if self.check_sigma_h(reflection):
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion, 'C_{s}')
            elif len(inversion) == 1:
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion, 'C_{i}')
            else:
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion, 'C_{1}')

        n = self.return_principal_axis(rotation).fold

        if self.check_n_two_fold_perpendicular_to_n_fold(rotation):  # Dihedral
            if self.check_sigma_h(reflection):
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion,
                                                'D_{' + str(n) + 'h}')
            elif self.check_n_sigma_v(n, reflection):
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion,
                                                'D_{' + str(n) + 'd}')
            else:
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion,
                                                'D_{' + str(n) + '}')

        else:  # Cyclic
            if self.check_sigma_h(reflection):
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion,
                                                'C_{' + str(n) + 'h}')
            elif self.check_n_sigma_v(n, reflection):
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion,
                                                'C_{' + str(n) + 'v}')
            elif self.check_improper_rotation(n, improper):
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion,
                                                'S_{2' + str(n) + '}')
            else:
                return nuclei_array, PointGroup(rotation, reflection, improper,
                                                inversion,
                                                'C_{' + str(n) + '}')

    def center_molecule(self, nuclei_array):
        number_of_nuclei = len(nuclei_array)
        center = [0, 0, 0]

        for nuclei in nuclei_array:
            center[0] += nuclei.coordinates[0] / number_of_nuclei
            center[1] += nuclei.coordinates[1] / number_of_nuclei
            center[2] += nuclei.coordinates[2] / number_of_nuclei

        for nuclei in nuclei_array:
            x = nuclei.coordinates[0] - center[0]
            y = nuclei.coordinates[1] - center[1]
            z = nuclei.coordinates[2] - center[2]
            nuclei.coordinates = (x, y, z)

        nuclei_array.sort(key=lambda nucleus: rho(nucleus.coordinates))

        if rho(nuclei_array[0].coordinates) <= self.error:

            for i, nuclei in enumerate(nuclei_array):
                if i == 0:
                    translation = nuclei.coordinates
                    nuclei.coordinates = (0.0, 0.0, 0.0)
                else:
                    x = nuclei.coordinates[0] - translation[0]
                    y = nuclei.coordinates[1] - translation[1]
                    z = nuclei.coordinates[2] - translation[2]
                    nuclei.coordinates = (x, y, z)

        return nuclei_array

    def standard_orientation(self, nuclei_array, rotation_symmetry,
                             reflection_symmetry):
        vector_i = vector_j = (0.0, 0.0, 0.0)

        if len(rotation_symmetry) > 1:
            highest_n_folds = heapq.nlargest(
                2, [rotation.fold for rotation in rotation_symmetry])
            for rotation in rotation_symmetry:
                if rotation.fold == highest_n_folds[0]:
                    vector_i = rotation.vector
                    break
            for rotation in rotation_symmetry:
                if rotation.fold == highest_n_folds[
                        1] and rotation.vector != vector_i:
                    vector_j = rotation.vector
                    break

        if len(rotation_symmetry) == 1:
            vector_i = rotation_symmetry[0].vector
            for reflection in reflection_symmetry:
                if phi(reflection.vector) > self.error:
                    vector_j = reflection.vector
                    break

        if len(rotation_symmetry) == 0 and len(reflection_symmetry) > 1:
            vector_i = reflection_symmetry[0].vector
            vector_j = reflection_symmetry[1].vector

        if rho(nuclei_array[0].coordinates) > 1e-3:
            i = 0
        else:
            i = 1

        if len(rotation_symmetry) == 0 and len(reflection_symmetry) == 1:
            vector_i = reflection_symmetry[0].vector
            vector_j = nuclei_array[i].coordinates

        if len(rotation_symmetry) == 0 and len(reflection_symmetry) == 0:
            vector_i = nuclei_array[i].coordinates
            vector_j = nuclei_array[i + 1].coordinates

        if rho(vector_i) <= self.error:
            vector_i = (1.0, 0.0, 0.0)

        quaternion_i = create_quaternion((-vector_i[1], vector_i[0], 0.0),
                                         -theta(vector_i))
        quaternion_j = create_quaternion((0.0, 0.0, 1.0), -phi(vector_j))
        quaternion = quaternion_multi(quaternion_j, quaternion_i)

        for rotation in rotation_symmetry:
            rotation.vector = quaternion_rotation(quaternion, rotation.vector)
        for reflection in reflection_symmetry:
            reflection.vector = quaternion_rotation(quaternion,
                                                    reflection.vector)
        for nuclei in nuclei_array:
            nuclei.coordinates = quaternion_rotation(quaternion,
                                                     nuclei.coordinates)

        return nuclei_array, rotation_symmetry, reflection_symmetry

    def check_improper_rotation(self, n, improper_rotations):
        for improper_rotation in improper_rotations:
            if improper_rotation.fold == 2 * n:
                return True
        return False

    def check_n_sigma_v(self, n, reflection_symmetry):
        i = 0
        for reflection in reflection_symmetry:
            coordinates = cartesian_to_spherical(reflection.vector)
            if coordinates[1] - pi / 2 <= self.error:
                i += 1
        if n == i:
            return True
        else:
            return False

    def check_n_two_fold_perpendicular_to_n_fold(self, rotation_symmetry):
        principal_axis = self.return_principal_axis(rotation_symmetry)
        axis_of_rotation = []
        for rotation in rotation_symmetry:
            if principal_axis != rotation and rotation.fold == 2 and (
                    theta(rotation.vector) - pi / 2 <= self.error):
                axis_of_rotation.append(rotation.vector)
        if len(axis_of_rotation) == principal_axis.fold:
            return True
        else:
            return False

    def check_sigma_h(self, reflection_symmetry):
        for reflection in reflection_symmetry:
            if theta(reflection.vector) % pi <= self.error:
                return True
        return False

    def check_high_symmetry(self, rotation_symmetry):
        i = 0
        for rotation in rotation_symmetry:
            if rotation.fold > 2:
                i += 1
        if i > 2:
            return True
        else:
            return False

    def check_linear(self, nuclei_array):
        for nuclei in nuclei_array:
            if theta(nuclei.coordinates) % pi > self.error:
                return False
        return True

    def return_principal_axis(self, rotation_symmetry):
        for rotation in rotation_symmetry:
            if theta(rotation.vector) % pi <= self.error:
                return rotation
class TestSymmetryC2H6(TestCase):
    def setUp(self):
        carbon_1 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(0.7516, -0.0225, -0.0209))
        carbon_2 = MagicMock(element='CARBON',
                             charge=6,
                             mass=12,
                             coordinates=(-0.7516, 0.0225, 0.0209))
        hydrogen_1 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.1851, -0.0039, 0.9875))
        hydrogen_2 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.1669, 0.8330, -0.5693))
        hydrogen_3 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(1.1155, -0.9329, -0.5145))
        hydrogen_4 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.1669, -0.8334, 0.5687))
        hydrogen_5 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.1157, 0.9326, 0.5151))
        hydrogen_6 = MagicMock(element='HYDROGEN',
                               charge=1,
                               mass=1,
                               coordinates=(-1.1850, 0.0044, -0.9875))

        self.nuclei_array_c2h6 = [
            carbon_1, carbon_2, hydrogen_1, hydrogen_2, hydrogen_3, hydrogen_4,
            hydrogen_5, hydrogen_6
        ]
        self.molecule_factory = MoleculeFactory(symmetry=True)
        self.symmetry_factory = SymmetryFactory()

    def test_check_linear_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_linear(nuclei_array)
        self.assertEqual(boolean, False)

    def test_check_high_symmetry_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_high_symmetry(rotation)
        self.assertEqual(boolean, False)

    def test_check_n_two_fold_rotation_perpendicular_to_n_fold_returns_true(
            self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_n_two_fold_perpendicular_to_n_fold(
            rotation)
        self.assertEqual(boolean, True)

    def test_check_sigma_h_returns_false(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_sigma_h(reflection)
        self.assertEqual(boolean, False)

    def test_check_n_sigma_v_returns_true(self):
        nuclei_array = self.molecule_factory.center_molecule(
            self.nuclei_array_c2h6)
        rotation, reflection, improper, inversion = self.symmetry_factory.brute_force_symmetry(
            nuclei_array)
        self.molecule_factory.standard_orientation(nuclei_array, rotation,
                                                   reflection)
        boolean = self.molecule_factory.check_n_sigma_v(3, reflection)
        self.assertEqual(boolean, True)

    def test_point_group_returns_d_3d_symmetry_for_cubane(self):
        symmetry = self.molecule_factory.create(
            self.nuclei_array_c2h6)[1].label
        testing.assert_equal(symmetry, 'D_{3d}')