def test__rigid_bodies_drms(self): """ Test drms measure taking into account rigid bodies""" m = IMP.Model() sel = atom.CAlphaPDBSelector() prot1 = atom.read_pdb(self.open_input_file("mini.pdb"), m, sel) prot2 = atom.read_pdb(self.open_input_file("mini.pdb"), m, sel) hchains1 = atom.get_by_type(prot1, atom.CHAIN_TYPE) hchains2 = atom.get_by_type(prot2, atom.CHAIN_TYPE) xyzs1 = core.XYZs(atom.get_leaves(prot1)) xyzs2 = core.XYZs(atom.get_leaves(prot2)) x = 0 ranges = [] for h in hchains1: ls1 = (atom.get_leaves(h)) y = x + len(ls1) ranges.append((x, y)) x = y drms = atom.get_drms(xyzs1, xyzs2) rb_drms = atom.get_rigid_bodies_drms(xyzs1, xyzs2, ranges) self.assertAlmostEqual(rb_drms, 0) self.assertAlmostEqual(drms, rb_drms, delta=1e-3, msg="rb_drms != drms") # Same thing after transformation of each of the chains for h in hchains2: R = alg.get_random_rotation_3d() v = alg.get_random_vector_in(alg.get_unit_bounding_box_3d()) T = alg.Transformation3D(R, v) ls = atom.get_leaves(h) for l in ls: core.transform(l.get_as_xyz(), T) drms = atom.get_drms(xyzs1, xyzs2) rb_drms = atom.get_rigid_bodies_drms(xyzs1, xyzs2, ranges) self.assertAlmostEqual(drms, rb_drms, delta=0.3, msg="rb_drms != drms")
def test__rigid_bodies_drms(self): """ Test drms measure taking into account rigid bodies""" m = IMP.kernel.Model() sel = atom.CAlphaPDBSelector() prot1 = atom.read_pdb(self.open_input_file("mini.pdb"), m, sel) prot2 = atom.read_pdb(self.open_input_file("mini.pdb"), m, sel) hchains1 = atom.get_by_type(prot1, atom.CHAIN_TYPE) hchains2 = atom.get_by_type(prot2, atom.CHAIN_TYPE) xyzs1 = core.XYZs(atom.get_leaves(prot1)) xyzs2 = core.XYZs(atom.get_leaves(prot2)) x = 0 ranges = [] for h in hchains1: ls1 = (atom.get_leaves(h)) y = x + len(ls1) ranges.append((x, y)) x = y drms = atom.get_drms(xyzs1, xyzs2) rb_drms = atom.get_rigid_bodies_drms(xyzs1, xyzs2, ranges) self.assertAlmostEqual(rb_drms, 0) self.assertAlmostEqual( drms, rb_drms, delta=1e-3, msg="rb_drms != drms") # Same thing after transformation of each of the chains for h in hchains2: R = alg.get_random_rotation_3d() v = alg.get_random_vector_in(alg.get_unit_bounding_box_3d()) T = alg.Transformation3D(R, v) ls = atom.get_leaves(h) for l in ls: core.transform(l.get_as_xyz(), T) drms = atom.get_drms(xyzs1, xyzs2) rb_drms = atom.get_rigid_bodies_drms(xyzs1, xyzs2, ranges) self.assertAlmostEqual(drms, rb_drms, delta=0.3, msg="rb_drms != drms")
def get_drms_for_backbone(assembly, native_assembly): """ Measure the DRMS ob the backbone between two assemblies. @param assembly The DRMS is computed for this assembly @param native_assembly The assembly that acts as a reference Notes: 1) The components of the assembly can be proteins or nucleic acids 2) If a protein, the c-alphas are used for calculating the drms 3) If a nucleic acid, the backbone of C4' atoms is used 4) The chains are treated as rigid bodies to speed the calculation. WARNING: if the function fails with a segmentation fault, one of the possible problems is that IMP reads some HETATM as calphas. Check that the chain does not have heteroatoms. """ begin_range = 0 ranges = [] backbone = [] h_chains = atom.get_by_type(assembly, atom.CHAIN_TYPE) for h in h_chains: atoms = representation.get_backbone(h) backbone.extend(atoms) end_range = begin_range + len(atoms) ranges.append((begin_range, end_range )) begin_range = end_range # log.debug("Ranges %s number of CA %s", ranges, len(calphas1)) xyzs = [core.XYZ(l) for l in backbone] native_chains = atom.get_by_type(native_assembly, atom.CHAIN_TYPE) native_backbone = [] for h in native_chains: native_backbone.extend( representation.get_backbone(h)) native_xyzs = [core.XYZ(l) for l in native_backbone] if(len(xyzs) != len(native_xyzs)): raise ValueError( "Cannot compute DRMS for sets of atoms of different size") drms = atom.get_rigid_bodies_drms(xyzs, native_xyzs, ranges) if(drms < 0 or math.isnan(drms) or drms > 100): log.debug("len(xyzs) = %s. len(native_xyzs) = %s",len(xyzs), len(native_xyzs)) log.debug("drms = %s",drms) atom.write_pdb(native_assembly, "drms_filtering_calphas.pdb") raise ValueError("There is a problem with the drms") return drms
def get_drms_for_backbone(assembly, native_assembly): """ Measure the DRMS ob the backbone between two assemblies. @param assembly The DRMS is computed for this assembly @param native_assembly The assembly that acts as a reference Notes: 1) The components of the assembly can be proteins or nucleic acids 2) If a protein, the c-alphas are used for calculating the drms 3) If a nucleic acid, the backbone of C4' atoms is used 4) The chains are treated as rigid bodies to speed the calculation. WARNING: if the function fails with a segmentation fault, one of the possible problems is that IMP reads some HETATM as calphas. Check that the chain does not have heteroatoms. """ log.debug("Measuring DRMS of the backbone") begin_range = 0 ranges = [] backbone = [] h_chains = atom.get_by_type(assembly, atom.CHAIN_TYPE) for h in h_chains: atoms = representation.get_backbone(h) """" for a in atoms: print "atom ===> ", at = atom.Atom(a) hr = at.get_parent() res = atom.Residue(hr) ch = atom.Chain(h) ch.show() print " - ", res.show() print " - ", at.show() print "" """ backbone.extend(atoms) end_range = begin_range + len(atoms) ranges.append((begin_range, end_range)) begin_range = end_range log.debug("Ranges %s number of atoms %s", ranges, len(backbone)) xyzs = [core.XYZ(l) for l in backbone] native_chains = atom.get_by_type(native_assembly, atom.CHAIN_TYPE) names = [atom.Chain(ch).get_id() for ch in native_chains] native_backbone = [] for h in native_chains: native_backbone.extend(representation.get_backbone(h)) native_xyzs = [core.XYZ(l) for l in native_backbone] if len(xyzs) != len(native_xyzs): raise ValueError( "Cannot compute DRMS for sets of atoms of different size") log.debug("Getting rigid bodies rmsd") drms = atom.get_rigid_bodies_drms(xyzs, native_xyzs, ranges) if drms < 0 or math.isnan(drms): # or drms > 100: log.debug( "len(xyzs) = %s. len(native_xyzs) = %s", len(xyzs), len(native_xyzs)) log.debug("drms = %s", drms) atom.write_pdb(assembly, "drms_model_calphas.pdb") atom.write_pdb(native_assembly, "drms_native_calphas.pdb") raise ValueError("There is a problem with the drms. I wrote the pdbs " "for you: drms_model_calphas.pdb drms_native_calphas.pdb") return drms