Hi Ben, OKay, I see, I think it’s like you suggest, but I have to add some crazy code block to update the members, as below in bold: import IMP import IMP.core import IMP.atom import IMP.container import IMP.rmf import RMF import sys IMP.setup_from_argv(sys.argv, "rigid bodies") m = IMP.Model() rbs = [] hs = [] for i in range(4): mp1 = IMP.atom.read_pdb(IMP.core.get_example_path('example_protein.pdb'), m) chains = IMP.atom.get_by_type(mp1, IMP.atom.CHAIN_TYPE) hs.append(IMP.atom.Hierarchy(chains[0])) rbs.append(IMP.atom.create_rigid_body(chains[0])) for i, rb in enumerate(rbs[1:]): # the other 3 particles are all symmetric copies of the first IMP.core.Reference.setup_particle(rb, rbs[0]) # the symmetry operation is rotation around the z axis tr = IMP.algebra.Transformation3D( IMP.algebra.get_rotation_about_axis(IMP.algebra.get_basis_vector_3d(2), 2 * 3.14 / len(rbs) * (i + 1)), IMP.algebra.Vector3D(0, 0, 0)) sm = IMP.core.TransformationSymmetry(tr) c = IMP.core.SingletonConstraint(sm, None, m, rb) m.add_score_state(c) #crazy code block: for rb in rbs: rb.update_members() m.update() for rb in rbs: rb.set_reference_frame(rb.get_reference_frame()) #this updates the members immediately too m.update() #end of the crazy code block modelrmf = RMF.create_rmf_file('model.rmf') IMP.rmf.add_hierarchies(modelrmf, hs) IMP.rmf.save_frame(modelrmf) If skip any of the updates, the members do not get all updated. Is there an easier way to update the members here? For the PDB file, I take it from your examples (IMP.core.get_example_path('example_protein.pdb')) so I guess you can just run this script if you want to see the PDB file and the result. Best, Jan
|