[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [IMP-users] Problem with IMP.core.TransformationSymmetry



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


On 8/22/20 2:30 PM, Jan Kosinski wrote:
I tried to test sth related to the TransformationSymmetry on rigid bodies and I fail to get it work properly in the below simple example.
In the example I create four copies of a chain, create four-fold symmetry constraints and try to generate the updated configuration using model.update(). In the resulting model.rmf, three chain copies are fine and follow the symmetry but one copy of the chains is weirdly rotated.

Your script looks OK to me. I would need to see your input PDB to say for sure, but TransformationSymmetry on a rigid body sets the reference frame of the body, i.e. the coordinate system used for all particles in that body, not the global coordinates of the member particles. I expect if you examine the rigid bodies' reference frames, you'll see they're related by the transformation correctly. The initial reference frame of a rigid body is (usually) the principal axes of the members, not the origin of the global coordinate system, so my guess is that these don't all line up in your case.

Ben
--
" class="">                      https://salilab.org/~ben/
"It is a capital mistake to theorize before one has data."
- Sir Arthur Conan Doyle
_______________________________________________
IMP-users mailing list
" class="">
https://salilab.org/mailman/listinfo/imp-users