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)
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)
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)