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,