def testXYZMolecule(self): # fold>>
        mol = XYZMolecule.XYZMolecule( [
                                        (PeriodicTable.Carbon, Measure.Measure((1.0, 1.0, 0.0), Units.bohr)),
                                        (PeriodicTable.Oxygen, Measure.Measure((-1.0, 1.0, 0.0), Units.bohr)),
                                        (PeriodicTable.Nitrogen, Measure.Measure((-1.0, -1.0, 0.0), Units.bohr)),
                                        (PeriodicTable.Fluorine, Measure.Measure((1.0, -1.0, 0.0), Units.bohr)),
                                        (PeriodicTable.Hydrogen, Measure.Measure((0.0, 0.0, 1.0), Units.bohr)),
                                        ]
                                    )

        self.assertEqual(len(mol.elements()), 5)
        self.assertEqual(mol.elements()[0], PeriodicTable.Carbon)
        self.assertEqual(mol.elements()[1], PeriodicTable.Oxygen)
        self.assertEqual(mol.elements()[2], PeriodicTable.Nitrogen)
        self.assertEqual(mol.elements()[3], PeriodicTable.Fluorine)
        self.assertEqual(mol.elements()[4], PeriodicTable.Hydrogen)

        self.assertEqual(len(mol.atomPos()), 5)
        self.assertEqual(mol.atomPos()[0].__class__, Measure.Measure) 
        self.assertEqual(mol.atomPos()[1].__class__, Measure.Measure) 
        self.assertEqual(mol.atomPos()[2].__class__, Measure.Measure) 
        self.assertEqual(mol.atomPos()[3].__class__, Measure.Measure) 
        self.assertEqual(mol.atomPos()[4].__class__, Measure.Measure) 

        self.assertEqual(mol.atomPos()[0].value(), (1.0,1.0,0.0)  ) 
        self.assertEqual(mol.atomPos()[0].unit(), Units.bohr  ) 
        self.assertEqual(mol.atomPos()[1].value(), (-1.0,1.0,0.0)  ) 
        self.assertEqual(mol.atomPos()[1].unit(), Units.bohr  ) 
        self.assertEqual(mol.atomPos()[2].value(), (-1.0,-1.0,0.0)  ) 
        self.assertEqual(mol.atomPos()[2].unit(), Units.bohr  ) 
        self.assertEqual(mol.atomPos()[3].value(), (1.0,-1.0,0.0)  ) 
        self.assertEqual(mol.atomPos()[3].unit(), Units.bohr  ) 
        self.assertEqual(mol.atomPos()[4].value(), (0.0,0.0,1.0)  ) 
        self.assertEqual(mol.atomPos()[4].unit(), Units.bohr  ) 
    def testMomentsOfInertia(self): # fold>>
        mol = XYZMolecule.XYZMolecule( [
                                        (PeriodicTable.H, Measure.Measure( ( 0.0000000000,0.0000000000,0.0000000000  ), Units.bohr) ),
                                        (PeriodicTable.H, Measure.Measure( ( 0.0000000000,1.7920231678,-3.1038751750 ), Units.bohr) ),
                                        (PeriodicTable.H, Measure.Measure( ( 0.0000000000,4.0095495535,2.3149145141  ), Units.bohr) ),
                                        (PeriodicTable.H, Measure.Measure( ( 0.0000000000,6.3710924130,-3.1870231249 ), Units.bohr) ),
                                        (PeriodicTable.H, Measure.Measure( ( 0.0000000000,8.5886187987,2.2317665642  ), Units.bohr) ),
                                        (PeriodicTable.H, Measure.Measure( ( 0.0000000000,10.3806419665,-0.8721086108), Units.bohr) ),
                                        (PeriodicTable.C, Measure.Measure( ( 0.0000000000,1.7920231678,-1.0346250583 ), Units.bohr) ),
                                        (PeriodicTable.C, Measure.Measure( ( 0.0000000000,4.0095495535,0.2456643974  ), Units.bohr) ),
                                        (PeriodicTable.C, Measure.Measure( ( 0.0000000000,6.3710924130,-1.1177730082 ), Units.bohr) ),
                                        (PeriodicTable.C, Measure.Measure( ( 0.0000000000,8.5886187987,0.1625164475  ), Units.bohr) ),
                                        ]
                                    )

        inertia = XYZMolecule.momentsOfInertia(mol)
        self.assertEqual(len(inertia), 3)
        self.assertAlmostEqual(inertia[0][0].asUnit(Units.dalton * Units.angstrom * Units.angstrom).value(),  12.836878, 5)
        self.assertAlmostEqual(inertia[1][0].asUnit(Units.dalton * Units.angstrom * Units.angstrom).value(),  110.58507, 5)
        self.assertAlmostEqual(inertia[2][0].asUnit(Units.dalton * Units.angstrom * Units.angstrom).value(),  123.421950, 5)

        self.assertAlmostEqual(inertia[0][1].value()[0], 0.0) 
        self.assertAlmostEqual(inertia[0][1].value()[1], 0.994406, 5) 
        self.assertAlmostEqual(inertia[0][1].value()[2], 0.105628, 5) 

        self.assertAlmostEqual(inertia[1][1].value()[0], 0.0) 
        self.assertAlmostEqual(inertia[1][1].value()[1], -0.105628, 5) 
        self.assertAlmostEqual(inertia[1][1].value()[2], 0.994406, 5) 

        self.assertAlmostEqual(inertia[2][1].value()[0], 1.0) 
        self.assertAlmostEqual(inertia[2][1].value()[1], 0.0, 5) 
        self.assertAlmostEqual(inertia[2][1].value()[2], 0.0, 5) 
Ejemplo n.º 3
0
    def testToRotationMatrix(self):  # fold>>
        q = Quaternion(Measure.Measure([1.0, 0.0, 0.0], Units.angstrom),
                       Measure.Measure(0.0615, Units.radians))
        m = q.toRotationMatrix()
        self.assertAlmostEqual(m[0][0], 1.0)
        self.assertAlmostEqual(m[0][1], 0.0)
        self.assertAlmostEqual(m[0][2], 0.0)
        self.assertAlmostEqual(m[1][0], 0.0)
        self.assertAlmostEqual(m[1][1], math.cos(0.0615))
        self.assertAlmostEqual(m[1][2], -math.sin(0.0615))
        self.assertAlmostEqual(m[2][0], 0.0)
        self.assertAlmostEqual(m[2][1], math.sin(0.0615))
        self.assertAlmostEqual(m[2][2], math.cos(0.0615))

        q = Quaternion(Measure.Measure([1.0, 0.0, 0.0], Units.angstrom),
                       Measure.Measure(-0.0615, Units.radians))
        m = q.toRotationMatrix()
        self.assertAlmostEqual(m[0][0], 1.0)
        self.assertAlmostEqual(m[0][1], 0.0)
        self.assertAlmostEqual(m[0][2], 0.0)
        self.assertAlmostEqual(m[1][0], 0.0)
        self.assertAlmostEqual(m[1][1], math.cos(-0.0615))
        self.assertAlmostEqual(m[1][2], -math.sin(-0.0615))
        self.assertAlmostEqual(m[2][0], 0.0)
        self.assertAlmostEqual(m[2][1], math.sin(-0.0615))
        self.assertAlmostEqual(m[2][2], math.cos(-0.0615))
Ejemplo n.º 4
0
def momentsOfInertia(molecule, origin_to_center_of_mass=True): # fold>>
    tensor = numpy.zeros((3,3))

    center_of_mass = centerOfMass(molecule)

    for element, coordinate in zip(molecule.elements(), molecule.atomPos()):
        mass_dalton = element.mass().asUnit(Units.dalton).value()

        coordinate_bohr = coordinate.asUnit(Units.bohr).value()
        x = coordinate_bohr[0] - center_of_mass.asUnit(Units.bohr).value()[0]
        y = coordinate_bohr[1] - center_of_mass.asUnit(Units.bohr).value()[1]
        z = coordinate_bohr[2] - center_of_mass.asUnit(Units.bohr).value()[2]

        tensor[0,0] += mass_dalton * (y**2 + z**2)
        tensor[0,1] -= mass_dalton * x * y
        tensor[0,2] -= mass_dalton * x * z
        tensor[1,1] += mass_dalton * (x**2 + z**2)
        tensor[1,2] -= mass_dalton * y * z
        tensor[2,2] += mass_dalton * (x**2 + y**2)


    # symmetrize
    tensor[1,0] = tensor[0,1]
    tensor[2,0] = tensor[0,2]
    tensor[2,1] = tensor[1,2]

    val,vec = numpy.linalg.eig(tensor)

    inertia = []
    for i in xrange(0,3):
        axis = Measure.Measure( (vec[0][i], vec[1][i], vec[2][i]), Units.bohr)
        moment = Measure.Measure(val[i], Units.dalton * Units.bohr * Units.bohr)
        inertia.append( (moment, axis) ) 

    return sorted(inertia, key=lambda x: x[0].value())
Ejemplo n.º 5
0
    def match(cls, reader): # fold>>
        start_pos = reader.currentPos()

        line = reader.readline()
        m1 = re.search("E\(LUMO\)\s:\s+(-?\d+\.\d+)\s+au\s+\(symmetry (\d+)\)", line)
        if m1 is None:
            reader.toPos(start_pos)
            return None

        line = reader.readline()
        m2 = re.search("-\s+E\(H**O\)\s:\s+(-?\d+\.\d+)\s+au\s+\(symmetry (\d+)\)", line)
        if m2 is None:
            reader.toPos(start_pos)
            return None

        line = reader.readline()

        line = reader.readline()
        m3 = re.search("gap\s+:\s+(-?\d+\.\d+)\s+au\s+", line)
        if m3 is None:
            reader.toPos(start_pos)
            return None
       
        try:
            lumo_energy = Measure.Measure(float(m1.group(1)), Units.hartree)
            lumo_symmetry = int(m1.group(2))
            homo_energy = Measure.Measure(float(m2.group(1)), Units.hartree)
            homo_symmetry = int(m2.group(2))
            gap = Measure.Measure(float(m3.group(1)), Units.hartree)
        except ValueError:
            reader.toPos(start_pos)
            return None

        return cls(homo_energy, homo_symmetry, lumo_energy, lumo_symmetry, gap)
Ejemplo n.º 6
0
    def testDiff(self):
        m1 = Measure.Measure(10, Units.hartree)
        m2 = Measure.Measure(5, Units.eV)

        m_diff = m1 - m2
        self.assertEqual(m_diff.unit(), Units.hartree)
        self.assertAlmostEqual(m_diff.value(), 10.0 - 5.0 / 27.21138386, 5)

        m3 = Measure.Measure((10, 11), Units.eV)
        m_diff = m1 - m3

        self.assertEqual(m_diff.unit(), Units.hartree)
        self.assertEqual(len(m_diff.value()), 2)
        self.assertAlmostEqual(m_diff.value()[0], 10.0 - 10.0 / 27.21138386, 5)
        self.assertAlmostEqual(m_diff.value()[1], 10.0 - 11.0 / 27.21138386, 5)

        m_diff = m3 - m1
        self.assertEqual(m_diff.unit(), Units.eV)
        self.assertEqual(len(m_diff.value()), 2)
        self.assertAlmostEqual(
            m_diff.value()[0], 10.0 - 10.0 * 27.21138386,
            2)  # FIXME this value is too wrong. The tolerance is on the second
        # digit. Something serious must be done to the units
        self.assertAlmostEqual(m_diff.value()[1], 11 - 10.0 * 27.21138386, 2)

        m4 = Measure.Measure((12, 15), Units.hartree)
        m_diff = m4 - m3
        self.assertEqual(m_diff.unit(), Units.hartree)
        self.assertEqual(len(m_diff.value()), 2)
        self.assertAlmostEqual(m_diff.value()[0], 12.0 - 10.0 / 27.21138386, 5)
        self.assertAlmostEqual(m_diff.value()[1], 15.0 - 11.0 / 27.21138386, 5)

        m_wrong = Measure.Measure(10, Units.bohr)
        self.assertRaises(Exception, m1.__sub__, m_wrong)
        self.assertRaises(Exception, m_wrong.__sub__, m1)
Ejemplo n.º 7
0
    def testSaveTo(self):
        xyz = XYZFile.XYZFile()
        xyz.createMolecule()
        xyz.setComment("hello 1")
        xyz.addAtom((PeriodicTable.Hydrogen,
                     Measure.Measure((1.0, 2.0, 3.0), Units.angstrom)))
        xyz.addAtom((PeriodicTable.Carbon,
                     Measure.Measure((1.0, 2.0, 3.0), Units.angstrom)))

        xyz.createMolecule()
        xyz.setComment("hello 2")
        xyz.addAtom((PeriodicTable.Oxygen,
                     Measure.Measure((4.0, 6.0, 8.0), Units.angstrom)))
        xyz.addAtom((PeriodicTable.Fluorine,
                     Measure.Measure((5.0, 7.0, 9.0), Units.angstrom)))

        xyz.saveTo(os.path.join(moduleDir(), "testfile_saveTo.xyz"))
        f1 = file(os.path.join(moduleDir(), "testfile_saveTo.xyz")).read()
        f2 = file(os.path.join(moduleDir(), "saveTo.expected")).read()

        md1 = hashlib.md5(f1)
        md2 = hashlib.md5(f2)

        self.assertEqual(md1.hexdigest(), md2.hexdigest())
        os.unlink(os.path.join(moduleDir(), "testfile_saveTo.xyz"))
Ejemplo n.º 8
0
    def testMolFile_MixedUnits(self): # fold>>
        d = Dalton20.MolFile()
        d.addComment("hello","ciao")
        d.addAtom("H1",PeriodicTable.H, Measure.Measure((1.0,0.0,0.0), Units.angstrom), "cc-pVDZ")
        d.addAtom("C1",PeriodicTable.C, Measure.Measure((0.0,1.0,0.0), Units.bohr), "cc-pVDZ")

        self.assertRaises(Exception, d.generateOutput)
Ejemplo n.º 9
0
    def match(cls, reader): # fold>>
        start_pos = reader.currentPos()
        regexp1 = re.compile("@\s+B-freq\s+=\s+(\d+\.\d+)\s+C-freq\s+=\s+(\d+\.\d+)\s+beta\(([XYZ]);([XYZ]),([XYZ])\)\s+=\s*(-?\d+\.\d+)")
        regexp2 = re.compile("@\s+B-freq\s+=\s+(\d+\.\d+)\s+C-freq\s+=\s+(\d+\.\d+)\s+beta\(([XYZ]);([XYZ]),([XYZ])\)\s+=\s+beta\(([XYZ]),([XYZ]),([XYZ])\)")
        line = reader.readline()
        m1 = regexp1.search(line)
        m2 = regexp2.search(line)

        if m1 is not None:
            b_freq = Measure.Measure(float(m1.group(1)), Units.frequency_au)
            c_freq = Measure.Measure(float(m1.group(2)), Units.frequency_au)
            components = (m1.group(3), m1.group(4), m1.group(5))
            beta = Measure.Measure(float(m1.group(6)), Units.beta_au)
            refers_to = None
        elif m2 is not None:
            b_freq = Measure.Measure(float(m2.group(1)), Units.frequency_au)
            c_freq = Measure.Measure(float(m2.group(2)), Units.frequency_au)
            components = (m2.group(3), m2.group(4), m2.group(5))
            beta = None
            refers_to = (m2.group(6), m2.group(7), m2.group(8))
        else:
            reader.toPos(start_pos)
            return None

        return cls(b_freq, c_freq, components, beta, refers_to)
Ejemplo n.º 10
0
    def match(cls, reader): # fold>>

        start_pos = reader.currentPos()
        atom_list = []

        line = reader.readline()
        m = re.search("Next geometry", line)
        if m is None:
            reader.toPos(start_pos)
            return None
    
        line = reader.readline()
        m = re.search("-*", line)
        if m is None:
            reader.toPos(start_pos)
            return None
       
        reader.readline()

        valid_data = False

        for line in reader:
            m1 = re.search("\s+(\w+)\s+(\w+)\s+(-?\d+\.\d+)\s+(-?\d+\.\d+)\s+(-?\d+\.\d+)", line)
            if m1 is not None:
                atom_label = m1.group(1)
                sym_label = m1.group(2)
                position = Measure.Measure( (float(m1.group(3)),
                                             float(m1.group(4)),
                                             float(m1.group(5))
                                             ), Units.bohr
                                            )
                atom_list.append( (atom_label, sym_label, position) )
                valid_data = True
                continue

            m2 = re.search("\s+(\w+)\s+(-?\d+\.\d+)\s+(-?\d+\.\d+)\s+(-?\d+\.\d+)", line)
            if m2 is not None:
                atom_label = m2.group(1)
                sym_label = ""
                position = Measure.Measure ( (float(m2.group(2)),
                                              float(m2.group(3)),
                                              float(m2.group(4))
                                              ) , Units.bohr
                                            )

                atom_list.append( (atom_label, sym_label, position))
                valid_data = True
                continue

            break

        if len(atom_list) == 0:
            valid_data = False

        if valid_data == False:
            reader.toPos(start_pos)
            return None

        return cls(atom_list)
Ejemplo n.º 11
0
    def testMeasure(self):  # fold>>
        m = Measure.Measure(10, Units.degrees)
        self.assertEqual(m.value(), 10)
        self.assertEqual(m.unit(), Units.degrees)

        m = Measure.Measure((10, 11), Units.degrees)
        self.assertEqual(m.value(), (10, 11))
        self.assertEqual(m.unit(), Units.degrees)
Ejemplo n.º 12
0
    def match(cls, reader): # fold>>

        start_pos = reader.currentPos()

        line = reader.readline()
        m1 = re.search("@ Singlet linear response function in a.u.", line)
        if m1 is None:
            reader.toPos(start_pos)
            return None

        # read empty line
        line = reader.readline()

        line = reader.readline()
        m3 = re.search("@ A operator, symmetry, frequency:\s+(\w+)\s+(\d)\s+(-?\d+\.\d+)", line)
        if m3 is None:
            reader.toPos(start_pos)
            return None
     
        a_freq = Measure.Measure(float(m3.group(3)), Units.frequency_au)
        if m3.group(1) == "XDIPLEN":
            a_component = "X"
        elif m3.group(1) == "YDIPLEN":
            a_component = "Y"
        elif m3.group(1) == "ZDIPLEN":
            a_component = "Z"
        else:
            a_component = None

        line = reader.readline()
        m4 = re.search("@ B operator, symmetry, frequency:\s+(\w+)\s+(\d)\s+(-?\d+\.\d+)", line)
        if m4 is None:
            reader.toPos(start_pos)
            return None

        b_freq = Measure.Measure(float(m4.group(3)), Units.frequency_au)
        if m4.group(1) == "XDIPLEN":
            b_component = "X"
        elif m4.group(1) == "YDIPLEN":
            b_component = "Y"
        elif m4.group(1) == "ZDIPLEN":
            b_component = "Z"
        else:
            b_component = None

        # read empty line
        line = reader.readline()

        line = reader.readline()
        m5 = re.search("@ Value of linear response -<<A;B>\(omega\):\s+(-?\d+\.\d+)", line)
        if m5 is None:
            reader.toPos(start_pos)
            return None

        alpha = Measure.Measure(float(m5.group(1)), Units.alpha_au)

        return cls(a_freq, b_freq, [a_component, b_component], alpha)
Ejemplo n.º 13
0
    def testMolFile_3(self): # fold>>
        d = Dalton20.MolFile()
        d.addComment("hello","ciao")
        d.addAtom("H1",PeriodicTable.H, Measure.Measure((1.0,0.0,0.0), Units.bohr), "cc-pVDZ")
        d.addAtom("C1",PeriodicTable.C, Measure.Measure((0.0,1.0,0.0), Units.bohr), "cc-pVDZ")
        d.addAtom("C2",PeriodicTable.C, Measure.Measure((0.0,2.0,0.0), Units.bohr), "cc-pVDZ")

        out = d.generateOutput()
        self.assertEqual(out, expectedMolFileResult_3())
Ejemplo n.º 14
0
 def testAddAtom(self):
     xyz = XYZFile.XYZFile()
     xyz.createMolecule()
     xyz.setComment("hello")
     xyz.addAtom((PeriodicTable.Hydrogen, Measure.Measure( (1.0, 2.0, 3.0), Units.angstrom)))
     xyz.addAtom((PeriodicTable.Carbon, Measure.Measure( (1.0, 2.0, 3.0), Units.angstrom)))
     
     self.assertEqual(xyz.atom(0)[0], PeriodicTable.Hydrogen)
     self.assertEqual(xyz.atom(1)[0], PeriodicTable.Carbon)
Ejemplo n.º 15
0
 def translate(self, vector): # fold>>
     for entity, pos in self._coords.allValues():
         if pos.unit() == vector.unit():
             newpos = Measure.Measure( (pos.value()[0]+vector.value()[0], pos.value()[1]+vector.value()[1], pos.value()[2]+vector.value()[2]), pos.unit())
         else:
             x_conv = vector.value()[0]*vector.unit().as(pos.unit())
             y_conv = vector.value()[1]*vector.unit().as(pos.unit())
             z_conv = vector.value()[2]*vector.unit().as(pos.unit())
             newpos = Measure.Measure( (pos.value()[0]+x_conv.asNumber(), pos.value()[1]+y_conv.asNumber(), pos.value()[2]+z_conv.asNumber()), pos.unit())
         self._coords.setValue(entity, newpos)
Ejemplo n.º 16
0
    def testNegative(self):
        m = -Measure.Measure(10, Units.degrees)

        self.assertEqual(m.value(), -10)
        self.assertEqual(m.unit(), Units.degrees)

        m = -Measure.Measure((10, 11), Units.degrees)
        in_rad = m.asUnit(Units.radians)
        self.assertEqual(in_rad.value()[0], -math.pi * 10.0 / 180.0)
        self.assertEqual(in_rad.value()[1], -math.pi * 11.0 / 180.0)
        self.assertEqual(in_rad.unit(), Units.radians)
Ejemplo n.º 17
0
    def testMolFile_checkOrderOfGroups(self): # fold>>
        """check if the increasing order is respected"""
        d = Dalton20.MolFile()
        d.addComment("hello","ciao")
        d.addAtom("O1",PeriodicTable.O, Measure.Measure((0.0,3.0,0.0), Units.angstrom), "cc-pVDZ")
        d.addAtom("H1",PeriodicTable.H, Measure.Measure((1.0,0.0,0.0), Units.angstrom), "cc-pVDZ")
        d.addAtom("C1",PeriodicTable.C, Measure.Measure((0.0,1.0,0.0), Units.angstrom), "cc-pVDZ")
        d.addAtom("C2",PeriodicTable.C, Measure.Measure((0.0,2.0,0.0), Units.angstrom), "cc-pVDZ")
        d.forceAtomBasis(True)

        out = d.generateOutput()
        self.assertEqual(out, expectedMolFileResult_orderOfGroups())
    def testFromGraph(self):
        g = Graph.Graph()
        elements = Infoset.Infoset(g, InfosetType.getElementType())
        coords = Infoset.Infoset(g, InfosetType.getCoordsType())

        e = g.createEntity()
        elements.setValue(e, PeriodicTable.C)
        coords.setValue(e,Measure.Measure( ( 0.0000000000,8.5886187987,0.1625164475  ), Units.bohr))
        e = g.createEntity()
        elements.setValue(e, PeriodicTable.C)
        coords.setValue(e,Measure.Measure( ( 0.0000000000,8.5886187987,0.1625164475  ), Units.bohr))

        mol = XYZMolecule.fromGraph(g)

        self.assertEqual(mol.__class__, XYZMolecule.XYZMolecule)
Ejemplo n.º 19
0
    def testSearch(self):
        reinitdb()
        db = DBAccess.DBAccess(os.path.join(moduleDir(), "testdb"))

        for i in xrange(1, 90):
            graph = Graph.Graph()
            coords = Infoset.Infoset(graph, InfosetType.getCoordsType())
            labels = Infoset.Infoset(graph, InfosetType.getAtomLabelType())
            bondtypes = Infoset.Infoset(graph, InfosetType.getBondTypeType())
            energy = Infoset.Infoset(graph, InfosetType.getHFEnergyType())
            angles = Infoset.Infoset(graph, InfosetType.getAngleType())

            node1 = graph.createEntity()
            node2 = graph.createEntity()
            node3 = graph.createEntity()
            link = graph.createEntity((node1, node2))
            angle = graph.createEntity((node1, node2, node3))

            coords.setValue(node1, (10.0, 0.0, 0.0))
            coords.setValue(node2, (10.0, 2.0, 0.0))
            coords.setValue(node3, (10.0, 2.0, 3.0))

            bondtypes.setValue(link, 2)

            angles.setValue(angle, Measure.Measure(float(i), Units.degrees))
            db.store(graph)
Ejemplo n.º 20
0
    def match(cls, reader): # fold>>

        start_pos = reader.currentPos()

        line = reader.readline()
        m = re.search("Dipole moment", line)
        if m is None:
            reader.toPos(start_pos)
            return None
    
        line = reader.readline()
        m = re.search("-*", line)
        if m is None:
            reader.toPos(start_pos)
            return None
       
        reader.readline()

        valid_data = False

        line = reader.readline()
        m1 = re.search("\s+(-?\d+\.\d+)\s+au\s+(-?\d+\.\d+)\s+Debye", line)

        if m1 is None:
            reader.toPos(start_pos)
            return None

        try:
            dipole = Measure.Measure(float(m1.group(2)), Units.debye)
        except ValueError:
            reader.toPos(start_pos)
            return None

        return cls(dipole)
Ejemplo n.º 21
0
    def testStoreAndRetrieve(self):
        reinitdb()
        graph = Graph.Graph()
        coords = Infoset.Infoset(graph, InfosetType.getCoordsType())
        labels = Infoset.Infoset(graph, InfosetType.getAtomLabelType())
        bondtypes = Infoset.Infoset(graph, InfosetType.getBondTypeType())
        energy = Infoset.Infoset(graph, InfosetType.getHFEnergyType())
        angles = Infoset.Infoset(graph, InfosetType.getAngleType())

        node1 = graph.createEntity()
        node2 = graph.createEntity()
        node3 = graph.createEntity()
        link = graph.createEntity((node1, node2))
        angle = graph.createEntity((node1, node2, node3))

        coords.setValue(node1, (10.0, 0.0, 0.0))
        coords.setValue(node2, (10.0, 2.0, 0.0))
        coords.setValue(node3, (10.0, 2.0, 3.0))

        bondtypes.setValue(link, 2)
        angles.setValue(angle, Measure.Measure(45, Units.degrees))

        db = DBAccess.DBAccess(os.path.join(moduleDir(), "testdb"))
        db.store(graph)

        molecule_list = db.retrieveAll()
        self.assertEqual(len(molecule_list), 1)
Ejemplo n.º 22
0
def _getOptions(argv):  # fold>>
    options = Options()

    opts, args = getopt.getopt(argv[1:], "t:h", ["translate=", "help"])

    for opt in opts:
        if opt[0] == "-t" or opt[0] == "--translate":
            try:
                print opt[1]
                t = tuple(map(float, opt[1].split(",")))
            except:
                _usage("unable to convert translation vector")
                sys.exit(1)

            if len(t) != 3:
                _usage("translation vector length is not equal to 3")
                sys.exit(1)

            options.translate = Measure.Measure(t, Units.angstrom)

        if opt[0] == "-h" or opt[0] == "--help":
            _usage()
            sys.exit(1)

    if len(args) < 2:
        _usage("Too few arguments")
        sys.exit(1)

    options.input_filename = args[0]
    options.output_filename = args[1]

    return options
Ejemplo n.º 23
0
    def match(cls, reader):  # fold>>

        start_pos = reader.currentPos()
        atom_list = []

        valid_data = False
        for line in reader:

            m1 = re.search(
                "(\w+)\s+(-?\d+\.\d+)\s+(-?\d+\.\d+)\s+(-?\d+\.\d+)", line)
            if m1 is not None:
                atom_label = m1.group(1)
                position = Measure.Measure((float(
                    m1.group(2)), float(m1.group(3)), float(m1.group(4))),
                                           Units.angstrom)
                atom_list.append((atom_label, position))
                valid_data = True
                continue

            break

        reader.readbackline()
        if len(atom_list) == 0:
            valid_data = False

        if valid_data == False:
            reader.toPos(start_pos)
            return None

        return cls(atom_list)
Ejemplo n.º 24
0
    def testInit(self):  # fold>>

        q = Quaternion(Measure.Measure([1.0, 2.0, 3.0], Units.angstrom),
                       Measure.Measure(45.0, Units.degrees))

        self.assertAlmostEqual(q._w(), math.cos(math.pi / 8.0))
        self.assertAlmostEqual(q._x(), 1.0 * math.sin(math.pi / 8.0))
        self.assertAlmostEqual(q._y(), 2.0 * math.sin(math.pi / 8.0))
        self.assertAlmostEqual(q._z(), 3.0 * math.sin(math.pi / 8.0))

        q = Quaternion(Measure.Measure([1.0, 2.0, 3.0], Units.angstrom),
                       Measure.Measure(math.pi / 4.0, Units.radians))

        self.assertAlmostEqual(q._w(), math.cos(math.pi / 8.0))
        self.assertAlmostEqual(q._x(), 1.0 * math.sin(math.pi / 8.0))
        self.assertAlmostEqual(q._y(), 2.0 * math.sin(math.pi / 8.0))
        self.assertAlmostEqual(q._z(), 3.0 * math.sin(math.pi / 8.0))
    def testRotate(self): # fold>>
        mol = XYZMolecule.XYZMolecule( [
                                        (PeriodicTable.Carbon, Measure.Measure( (1.0, 1.0, 0.0), Units.bohr)),
                                        (PeriodicTable.Oxygen, Measure.Measure( (-1.0, 1.0, 0.0), Units.bohr)),
                                        (PeriodicTable.Nitrogen, Measure.Measure( (-1.0, -1.0, 0.0), Units.bohr)),
                                        (PeriodicTable.Fluorine, Measure.Measure( (1.0, -1.0, 0.0), Units.bohr)),
                                        (PeriodicTable.Hydrogen, Measure.Measure( (0.0, 0.0, 1.0), Units.bohr)),
                                        ]
                                    )

        mol.rotate( Measure.Measure( (0.0,0.0,1.0) ,Units.bohr), Measure.Measure(45.0, Units.degrees) )

        self.assertAlmostEqual(mol.atomPos()[0].value()[0], 0.0)
        self.assertAlmostEqual(mol.atomPos()[0].value()[1], math.sqrt(2.0))
        self.assertAlmostEqual(mol.atomPos()[0].value()[2], 0.0)
        self.assertEqual(mol.atomPos()[0].unit(), Units.bohr  ) 

        self.assertAlmostEqual(mol.atomPos()[1].value()[0], -math.sqrt(2.0))
        self.assertAlmostEqual(mol.atomPos()[1].value()[1], 0.0)
        self.assertAlmostEqual(mol.atomPos()[1].value()[2], 0.0)
        self.assertEqual(mol.atomPos()[1].unit(), Units.bohr  ) 

        self.assertAlmostEqual(mol.atomPos()[2].value()[0], 0.0)
        self.assertAlmostEqual(mol.atomPos()[2].value()[1], -math.sqrt(2.0))
        self.assertAlmostEqual(mol.atomPos()[2].value()[2], 0.0)
        self.assertEqual(mol.atomPos()[2].unit(), Units.bohr  ) 

        self.assertAlmostEqual(mol.atomPos()[3].value()[0], math.sqrt(2.0))
        self.assertAlmostEqual(mol.atomPos()[3].value()[1], 0.0)
        self.assertAlmostEqual(mol.atomPos()[3].value()[2], 0.0)
        self.assertEqual(mol.atomPos()[3].unit(), Units.bohr  ) 
Ejemplo n.º 26
0
    def match(cls, reader):  # fold>>
        start_pos = reader.currentPos()
        line = reader.readline()
        m = re.search("Energy at final geometry is\s+:\s+(-?\d*\.\d*)", line)
        if m is not None:
            return cls( Measure.Measure(float(m.group(1)), Units.hartree))

        reader.toPos(start_pos)
        return None
Ejemplo n.º 27
0
    def match(cls, reader):  # fold>>
        start_pos = reader.currentPos()
        line = reader.readline()
        m = re.search("ZPVE\s+=\s+(-?\d*\.\d*)", line)
        if m is not None:
            return cls(Measure.Measure(float(m.group(1)), Units.unknown))

        reader.toPos(start_pos)
        return None
Ejemplo n.º 28
0
    def rotate(self, axis, angle): # fold>>
        atom_list = []
        q = Quaternion(axis, angle)
        m = q.toRotationMatrix()
        for entity, pos in self._coords.allValues():
            arr = numpy.array([ pos.value()[0], pos.value()[1], pos.value()[2], 1.0 ])
            rotated = numpy.dot(m, arr)
            newpos = Measure.Measure( (rotated[0], rotated[1], rotated[2]), pos.unit())

            self._coords.setValue(entity, newpos)
Ejemplo n.º 29
0
    def match(cls, reader):  # fold>>
        start_pos = reader.currentPos()
        line = reader.readline()
        m = re.search("Total mass:\s+(\d*\.\d*)", line)

        if m is not None:
            return cls( Measure.Measure(float(m.group(1)), Units.dalton))

        reader.toPos(start_pos)
        return None
Ejemplo n.º 30
0
    def testGraphInfoset(self):  # fold>>
        graph = Graph.Graph()
        energy = Infoset.Infoset(graph, InfosetType.getHFEnergyType())
        energy.setValue(None, Measure.Measure(10.4, Units.hartree))

        self.assertEqual(energy.dimensionality(), 0)
        self.assertEqual(energy.size(), 1)

        self.assertEqual(energy.value(None).value(), 10.4)
        self.assertEqual(energy.value(None).unit(), Units.hartree)