Example #1
0
def rmsd2(mol1, mol2, atoms1=None, atoms2=None, mirror=False):
    coords1, coords2 = rmsd_common(mol1, mol2, atoms1, atoms2)
    if mirror:
        return min(_rmsd.rmsd2(coords1, coords2),
                   _rmsd.rmsd2(coords1, -coords2))
    else:
        return _rmsd.rmsd2(coords1, coords2)
Example #2
0
    def test_2(self):
        import StringIO
        mol1 = read.readxyz(StringIO.StringIO(test_in_1))
        mol2 = read.readxyz(StringIO.StringIO(test_in_2))
        res = _rmsd.rmsd2(mol1, mol2)
        self.assertAlmostEqual(res[0], 1.001, 3)
        for i in range(3):
            self.assertAlmostEqual(res[1][3][i], 0.0)
        self.assertAlmostEqual(res[1][3][3], 1.0)

        mat = numpy.array([x[:3] for x in res[1][:3]])
        self.assertAlmostEqual(abs((numpy.dot(mat, mat.transpose()) - numpy.eye(3))).max(), 0.0)
        self.assertAlmostEqual(numpy.linalg.det(mat), 1.0)

        newcoords2 = numpy.dot(mat, mol2.coords.transpose()).transpose() \
                + numpy.array([res[1][i][3] for i in range(3)])
        diff = newcoords2 - mol1.coords
        self.assertAlmostEqual(((diff**2).sum()/(len(mol1)-1)) ** 0.5, res[0])

        res2 = _rmsd.rmsd2(mol1, mol1)
        self.assertAlmostEqual(res2[0], 0.0)
        self.assertAlmostEqual(abs(res2[1] - numpy.eye(4)).max(), 0.0)
Example #3
0
def rotate_to(idx_ifile, mol_ifile, ofile):
    mol = read.readxyz(mol_ifile)

    idxs = []
    coords = []
    for line in idx_ifile:
        if not line.strip() or line.strip()[0] == '#':
            continue
        words = line.split()
        assert len(words) == 4

        idx = int(words[0]) - 1
        assert 0 <= idx < len(mol)
        
        idxs.append(idx)
        coords.append([float(x) for x in words[1:]])

    coords = numpy.array(coords)

    res = _rmsd.rmsd2(coords, mol.coords.take(idxs, axis=0))
    mat = numpy.array(res[1])
    mol.coords = numpy.dot(mat[:3,:3], mol.coords.transpose()).transpose() + mat[:3,3]
    write.writexyz(mol, ofile)