예제 #1
0
def get_geometry(formula, source):
    """
    Get geometry for the specified molecule from the specified source. If the source is 'pubchem'
    the geometry will be retrieved from online pubchem database, if it is 'nist', then the geometry
    will be retrieved from data/geometry_nist.py.

    :param formula: The chemical formula of the molecule in capital letters. E.g. H2O
    :param source: Can be either 'pubchem' or 'nist'.
    :return: The geometry specification, e.g. for H2 - [('H', (0, 0, 0.3713970)), ('H', (0, 0, -0.3713970))]
    """
    if source == 'pubchem':
        geometry = geometry_from_pubchem(formula)
    elif source == 'nist':
        geometry = geometries.get(formula, None)
    else:
        raise ValueError(
            "Source type {} not supported, please use 'pubchem', or 'nist'".
            format(source))

    if not geometry:
        raise LookupError(
            "No geometry information was found for the specified molecule in the specified source."
        )

    return geometry
예제 #2
0
    def test_water_2d(self):
        water_geometry = geometry_from_pubchem('water', structure='2d')
        self.water_natoms = len(water_geometry)

        water_natoms = 3
        self.assertEqual(water_natoms, self.water_natoms)

        self.oxygen_z_1 = water_geometry[0][1][2]
        self.oxygen_z_2 = water_geometry[1][1][2]
        z = 0
        self.assertEqual(z, self.oxygen_z_1)
        self.assertEqual(z, self.oxygen_z_2)

        with pytest.raises(ValueError,
                           match='Incorrect value for the argument structure'):
            _ = geometry_from_pubchem('water', structure='foo')
예제 #3
0
    def test_water_2d(self):
        water_geometry = geometry_from_pubchem('water', structure='2d')
        self.water_natoms = len(water_geometry)

        water_natoms = 3
        self.assertEqual(water_natoms, self.water_natoms)

        self.oxygen_z_1 = water_geometry[0][1][2]
        self.oxygen_z_2 = water_geometry[1][1][2]
        z = 0
        self.assertEqual(z, self.oxygen_z_1)
        self.assertEqual(z, self.oxygen_z_2)
예제 #4
0
    def test_water(self):
        water_geometry = geometry_from_pubchem('water')
        self.water_natoms = len(water_geometry)
        self.water_atoms = [water_atom[0] for water_atom in water_geometry]
        water_oxygen_index = self.water_atoms.index('O')
        water_oxygen = water_geometry.pop(water_oxygen_index)
        water_oxygen_coordinate = numpy.array(water_oxygen[1])
        water_hydrogen1_coordinate = numpy.array(water_geometry[0][1])
        water_hydrogen2_coordinate = numpy.array(water_geometry[1][1])
        water_oxygen_hydrogen1 = \
            water_hydrogen1_coordinate - water_oxygen_coordinate
        water_oxygen_hydrogen2 = \
            water_hydrogen2_coordinate - water_oxygen_coordinate

        self.water_bond_length_1 = numpy.linalg.norm(water_oxygen_hydrogen1)
        self.water_bond_length_2 = numpy.linalg.norm(water_oxygen_hydrogen2)
        self.water_bond_angle = \
            numpy.arccos(numpy.dot(water_oxygen_hydrogen1,
                                   water_oxygen_hydrogen2 /
                                   (numpy.linalg.norm(water_oxygen_hydrogen1) *
                                    numpy.linalg.norm(water_oxygen_hydrogen2))))

        water_natoms = 3
        self.assertEqual(water_natoms, self.water_natoms)

        self.assertAlmostEqual(self.water_bond_length_1,
                               self.water_bond_length_2,
                               places=4)
        water_bond_length_low = 0.9
        water_bond_length_high = 1.1
        self.assertTrue(water_bond_length_low <= self.water_bond_length_1)
        self.assertTrue(water_bond_length_high >= self.water_bond_length_1)

        water_bond_angle_low = 100. / 360 * 2 * numpy.pi
        water_bond_angle_high = 110. / 360 * 2 * numpy.pi
        self.assertTrue(water_bond_angle_low <= self.water_bond_angle)
        self.assertTrue(water_bond_angle_high >= self.water_bond_angle)
예제 #5
0
    def test_none(self):
        none_geometry = geometry_from_pubchem('none')

        self.assertIsNone(none_geometry)
예제 #6
0
    def test_helium(self):
        helium_geometry = geometry_from_pubchem('helium')
        self.helium_natoms = len(helium_geometry)

        helium_natoms = 1
        self.assertEqual(helium_natoms, self.helium_natoms)