def get_rmsd_to(self, other_rnamodel, output='', dont_move=False): """Calc rmsd P-atom based rmsd to other rna model""" sup = Bio.PDB.Superimposer() if dont_move: # fix http://biopython.org/DIST/docs/api/Bio.PDB.Vector%27.Vector-class.html coords = array([a.get_vector().get_array() for a in self.atoms]) other_coords = array([a.get_vector().get_array() for a in other_rnamodel.atoms]) s = SVDSuperimposer() s.set(coords,other_coords) return s.get_init_rms() try: sup.set_atoms(self.atoms, other_rnamodel.atoms) except: print(self.fn, len(self.atoms), other_rnamodel.fn, len(other_rnamodel.atoms)) for a,b in zip(self.atoms, other_rnamodel.atoms): print(a.parent, b.parent)#a.get_full_id(), b.get_full_id()) rms = round(sup.rms, 3) if output: io = Bio.PDB.PDBIO() sup.apply(self.struc.get_atoms()) io.set_structure( self.struc ) io.save("aligned.pdb") io = Bio.PDB.PDBIO() sup.apply(other_rnamodel.struc.get_atoms()) io.set_structure( other_rnamodel.struc ) io.save("aligned2.pdb") return rms
def create_DM(pdb_atoms_list, alignement_type): """ This function is used to clusterize all structures. """ svd = SVDSuperimposer() size = len(pdb_atoms_list) FullDM = DistanceMatrix(size) pbar = pg.ProgressBar(widgets=WIDGETS, maxval=(size * (size - 1) / 2)).start() counter = 0 for i, frame1 in enumerate(pdb_atoms_list): for j, frame2 in enumerate(pdb_atoms_list[i + 1:]): svd.set(frame1, frame2) svd.run() rms = svd.get_rms() #RMS with local alignement rms_raw = svd.get_init_rms( ) #RMS with the GLOBAL alignement made before if alignement_type == "l": FullDM.set(i, i + j + 1, rms) else: FullDM.set(i, i + j + 1, rms_raw) pbar.update(counter) counter += 1 pbar.finish() return FullDM
def get_rmsd_to(self, other_rnamodel, output='', dont_move=False): """Calc rmsd P-atom based rmsd to other rna model""" sup = Bio.PDB.Superimposer() if dont_move: # fix http://biopython.org/DIST/docs/api/Bio.PDB.Vector%27.Vector-class.html coords = array([a.get_vector().get_array() for a in self.atoms]) other_coords = array([a.get_vector().get_array() for a in other_rnamodel.atoms]) s = SVDSuperimposer() s.set(coords,other_coords) return s.get_init_rms() try: sup.set_atoms(self.atoms, other_rnamodel.atoms) except: print(self.fn, len(self.atoms), other_rnamodel.fn, len(other_rnamodel.atoms)) for a,b in zip(self.atoms, other_rnamodel.atoms): print(a.parent, b.parent)#a.get_full_id(), b.get_full_id()) rms = round(sup.rms, 3) if output: io = Bio.PDB.PDBIO() sup.apply(self.struc.get_atoms()) io.set_structure( self.struc ) io.save("aligned.pdb") io = Bio.PDB.PDBIO() sup.apply(other_rnamodel.struc.get_atoms()) io.set_structure( other_rnamodel.struc ) io.save("aligned2.pdb") return rms
class SVDSuperimposerTest(unittest.TestCase): def setUp(self): self.x = array([[51.65, -1.90, 50.07], [50.40, -1.23, 50.65], [50.68, -0.04, 51.54], [50.22, -0.02, 52.85]]) self.y = array([[51.30, -2.99, 46.54], [51.09, -1.88, 47.58], [52.36, -1.20, 48.03], [52.71, -1.18, 49.38]]) self.sup = SVDSuperimposer() self.sup.set(self.x, self.y) def test_get_init_rms(self): x = array([[1.19, 1.28, 1.37], [1.46, 1.55, 1.64], [1.73, 1.82, 1.91]]) y = array([[1.91, 1.82, 1.73], [1.64, 1.55, 1.46], [1.37, 1.28, 1.19]]) self.sup.set(x, y) self.assertIsNone(self.sup.init_rms) init_rms = 0.8049844719 self.assertTrue(float("%.3f" % self.sup.get_init_rms()), float("%.3f" % init_rms)) def test_oldTest(self): self.assertTrue( array_equal(around(self.sup.reference_coords, decimals=3), around(self.x, decimals=3))) self.assertTrue( array_equal(around(self.sup.coords, decimals=3), around(self.y, decimals=3))) self.assertIsNone(self.sup.rot) self.assertIsNone(self.sup.tran) self.assertIsNone(self.sup.rms) self.assertIsNone(self.sup.init_rms) self.sup.run() self.assertTrue( array_equal(around(self.sup.reference_coords, decimals=3), around(self.x, decimals=3))) self.assertTrue( array_equal(around(self.sup.coords, decimals=3), around(self.y, decimals=3))) rot = array([[0.68304983, 0.53664371, 0.49543563], [-0.52277295, 0.83293229, -0.18147242], [-0.51005037, -0.13504564, 0.84947707]]) tran = array([38.78608157, -20.65451334, -15.42227366]) self.assertTrue( array_equal(around(self.sup.rot, decimals=3), around(rot, decimals=3))) self.assertTrue( array_equal(around(self.sup.tran, decimals=3), around(tran, decimals=3))) self.assertIsNone(self.sup.rms) self.assertIsNone(self.sup.init_rms) rms = 0.00304266526014 self.assertEqual(float("%.3f" % self.sup.get_rms()), float("%.3f" % rms)) rot_get, tran_get = self.sup.get_rotran() self.assertTrue( array_equal(around(rot_get, decimals=3), around(rot, decimals=3))) self.assertTrue( array_equal(around(tran_get, decimals=3), around(tran, decimals=3))) y_on_x1 = dot(self.y, rot) + tran y_x_solution = array( [[5.16518846e+01, -1.90018270e+00, 5.00708397e+01], [5.03977138e+01, -1.22877050e+00, 5.06488200e+01], [5.06801788e+01, -4.16095666e-02, 5.15368866e+01], [5.02202228e+01, -1.94372374e-02, 5.28534537e+01]]) self.assertTrue( array_equal(around(y_on_x1, decimals=3), around(y_x_solution, decimals=3))) y_on_x2 = self.sup.get_transformed() self.assertTrue( array_equal(around(y_on_x2, decimals=3), around(y_x_solution, decimals=3)))
def run_system(dir): pdb = os.path.basename(dir).split('_')[0] org_dir = os.getcwd() os.chdir(dir) f_coord = "coord.h5" f_RMSD = "RMSD.txt" f_OC = os.path.join("..","..","cmap_coordinates",pdb+'.txt') if not os.path.exists(f_OC): print "Missing coordinates for cmap", dir os.chdir(org_dir) return dir if not os.path.exists(f_coord): print "Missing coordinates, extract_coordinates.py first", dir os.chdir(org_dir) return dir if os.path.exists(f_RMSD) and not _FORCE: print "RMSD file exists, skipping", dir os.chdir(org_dir) return dir h5 = h5py.File(f_coord,'r') C = h5["coord"][:] h5.close() OC = np.loadtxt(f_OC) # Move the coordinates to something sensible #C -= C.mean(axis=0) #OC -= OC.mean(axis=0) median_OC = np.median([np.linalg.norm(a-b) for a,b in zip(OC,OC[1:])]) median_C = np.median([np.linalg.norm(a-b) for a,b in zip(C[-1],C[-1][1:])]) assert(C[0].shape == OC.shape) RMSD = [] org_RMSD = [] sup = SVDSuperimposer() RG = [] OC -= OC.mean(axis=0) OC_RG = ((np.linalg.norm(OC,axis=1)**2).sum()/len(OC)) ** 0.5 for cx in C: cx -= cx.mean(axis=0) rg_cx = ((np.linalg.norm(cx,axis=1)**2).sum()/len(cx)) ** 0.5 RG.append(rg_cx) sup.set(OC,cx) sup.run() RMSD.append(sup.get_rms()) org_RMSD.append(sup.get_init_rms()) rot, tran = sup.get_rotran() cx = np.dot(cx, rot) + tran RMSD = np.array(RMSD) org_RMSD = np.array(org_RMSD) RG = np.array(RG) #print dir, RMSD[-20:].mean(), org_RMSD[-20:].mean(),RG[-20:].mean() print "{} {: 0.4f} {: 0.4f}".format(dir, RMSD[-200:].mean(), RG[-200:].mean() / OC_RG) ''' from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(OC[:,0],OC[:,1],OC[:,2],'b') #ax.plot(OC[:,0],OC[:,1],OC[:,2],'k',alpha=0.5) ax.scatter(cx[:,0],cx[:,1],cx[:,2],color='r') #ax.plot(cx[:,0],cx[:,1],cx[:,2],'k',alpha=0.5) plt.show() exit() print OC #exit() ''' np.savetxt(f_RMSD,RMSD) os.chdir(org_dir) return dir
class SVDSuperimposerTest(unittest.TestCase): def setUp(self): self.x = array([[51.65, -1.90, 50.07], [50.40, -1.23, 50.65], [50.68, -0.04, 51.54], [50.22, -0.02, 52.85]]) self.y = array([[51.30, -2.99, 46.54], [51.09, -1.88, 47.58], [52.36, -1.20, 48.03], [52.71, -1.18, 49.38]]) self.sup = SVDSuperimposer() self.sup.set(self.x, self.y) def test_get_init_rms(self): x = array([[1.19, 1.28, 1.37], [1.46, 1.55, 1.64], [1.73, 1.82, 1.91]]) y = array([[1.91, 1.82, 1.73], [1.64, 1.55, 1.46], [1.37, 1.28, 1.19]]) self.sup.set(x, y) self.assertIsNone(self.sup.init_rms) init_rms = 0.8049844719 self.assertTrue( float('%.3f' % self.sup.get_init_rms()), float('%.3f' % init_rms)) def test_oldTest(self): self.assertTrue( array_equal(around(self.sup.reference_coords, decimals=3), around(self.x, decimals=3))) self.assertTrue( array_equal(around(self.sup.coords, decimals=3), around(self.y, decimals=3))) self.assertIsNone(self.sup.rot) self.assertIsNone(self.sup.tran) self.assertIsNone(self.sup.rms) self.assertIsNone(self.sup.init_rms) self.sup.run() self.assertTrue( array_equal(around(self.sup.reference_coords, decimals=3), around(self.x, decimals=3))) self.assertTrue( array_equal(around(self.sup.coords, decimals=3), around(self.y, decimals=3))) rot = array([[0.68304983, 0.53664371, 0.49543563], [-0.52277295, 0.83293229, -0.18147242], [-0.51005037, -0.13504564, 0.84947707]]) tran = array([38.78608157, -20.65451334, -15.42227366]) self.assertTrue( array_equal(around(self.sup.rot, decimals=3), around(rot, decimals=3))) self.assertTrue( array_equal(around(self.sup.tran, decimals=3), around(tran, decimals=3))) self.assertIsNone(self.sup.rms) self.assertIsNone(self.sup.init_rms) rms = 0.00304266526014 self.assertEqual( float('%.3f' % self.sup.get_rms()), float('%.3f' % rms)) rot_get, tran_get = self.sup.get_rotran() self.assertTrue( array_equal(around(rot_get, decimals=3), around(rot, decimals=3))) self.assertTrue( array_equal(around(tran_get, decimals=3), around(tran, decimals=3))) y_on_x1 = dot(self.y, rot) + tran y_x_solution = array( [[5.16518846e+01, -1.90018270e+00, 5.00708397e+01], [5.03977138e+01, -1.22877050e+00, 5.06488200e+01], [5.06801788e+01, -4.16095666e-02, 5.15368866e+01], [5.02202228e+01, -1.94372374e-02, 5.28534537e+01]]) self.assertTrue( array_equal(around(y_on_x1, decimals=3), around(y_x_solution, decimals=3))) y_on_x2 = self.sup.get_transformed() self.assertTrue( array_equal(around(y_on_x2, decimals=3), around(y_x_solution, decimals=3)))