Re: [Chimera-users] Rotation about an axis

Hi Jordan, Aha! It turns out I wrote code that does exactly what you want last year. It is called the symmetric molecule copies command at the bottom of the Chimera experimental features web page: http://www.cgl.ucsf.edu/chimera/experimental/experimental.html It is not distributed with Chimera yet but you can download it on that page and install it with your existing Chimera. I hate to discourage you from Python programming in Chimera but I think this is just what you need. You open one copy of your molecule and then use this "sym" command to make the hexamer. Then when you move the original copy of the molecule relative to your map, the other 5 copies automatically reposition to maintain the 6-fold symmetry. To get a more detailed description look at the "details" link on the experimental features page. The hexamer symmetry comes from the BIOMT matrices in the PDB file. This sym command treats those matrices in the coordinate system of the density map (yes, a bit weird). The key here is to make sure the symmetry axis of the density map matches the symmetry axis of the BIOMT matrices. The easiest approach is probably to make the BIOMT matrices produce a hexamer about the z-axis through (0,0,0). When you open your density map in Chimera it may not have the hexamer density centered at (0,0,0). You will need to adjust its origin so the density hexamer is centered at (0,0,0). Use the volume dialog menu entry Features / Origin and Scale to adjust the position of the lower left front corner of the map. Assuming the hexamer is centered in a 128 x 128 x 100 grid with voxel size 0.8 angstroms you would set the origin to (-50.8, -50.8, -39.6) = (-63.5 * 0.8, -63.5 * 0.8, -49.5 * 0.8). The weird 63.5 = 128/2 - .5 instead of 64 = 128/2 is easiest to understand if you think of a map that is only 2 by 2 by 2 in size. Remember to press the Enter key in one of the origin fields in the volume dialog to have the new position take effect. In any case that may still be a half voxel off depending on your map, or it may be way off. Of course you have to know the position of the center of the hexamer in your density to make this work. A way to verify that you have set the correct origin is to open 2 copies of the map -- set the map origins, then use constrained move to rotate just one copy keeping the other one fixed. It is easy then to visually see if the two copies are concentric. For convenience you can save your map as an MRC file with the new origin with the volume dialog File / Save As... menu entry. Saving a Chimera session also saves the origin in the Chimera session file (the map is not modified). I can see various troubles with using the Multiscale tool. First Multiscale low resolution surfaces are not reliably synchronized to the individual PDB models. If you change a PDB model position Multiscale won't realize it and the low resolution surface will not move to the new location. If you are using the latest Chimera snapshot (1.2224, April 10, 2006) then the problems will be even more severe because I changed the way Multiscale positions PDB models. Instead of setting the pdb_model.openState.xform it changes the atom coordinates of the model (setting atom.coord = x,y,z). All the xforms of the 6 models in a hexamer would be the same in Chimera 1.2224. This change was made to allow correctly moving individual chains of multiscale models, possible with the "movement mouse mode" feature on the experimental features web page. Lastly some clarification about Chimera's coordinate systems. First there is a global Chimera coordinates system with the x axis always horizontal relative to your graphics window, the y axis always vertical, and the z axis always pointing out of the screen at you. When you rotate models with the mouse, this coordinate system does not change -- the individual matrices positioning the models are changed. The origin of this global coordinate system is not necessarily in the center of the screen. It can be anywhere including off-screen. The global coordinates for the center of the screen are set to match the center of the bounding box of the first model you open in Chimera. Besides the global coordinate system each model has a local coordinate system. With a PDB file, the atom coordinate positions are in the local coordinate system. If you open a PDB model in Chimera and rotate it, the atom.coord x,y,z values do not change -- they are expressed in the local coordinate system which is fixed to the atoms and rotates with the model. (You can however change the atom.coord positions using Python code.) The pdb_model.openState.xform 3 row by 4 column matrix gives the rotation and translation that maps the local coordinates (e.g. a PDB atom position) into Chimera global coordinates. Other types of Chimera models like density maps are just like PDB models having a local coordinate system -- the density map grid points have unchanging coordinates in the local coordinate system. More than you wanted to know. Tom
Date: Thu, 20 Apr 2006 19:51:40 -0700 From: "Jordan Benjamin" <jordan.benjamin@gmail.com> To: "Thomas Goddard" <goddard@cgl.ucsf.edu> Subject: Re: [Chimera-users] Rotation about an axis
Ah, it looks like it still works for normal models. The weird behavior was with a model that had been generated with the Multiscale Models tool from crystal contacts. I still wish I understood the global-vs-local issue better though.
On 4/20/06, Jordan Benjamin <jordan.benjamin@gmail.com> wrote:
Thank you for your help on this. I have a further question. Basically, I'm trying to dock into electron density the crystal structure of a protein that forms a hexamer. I would like to be able to have six copies of the monomer structure loaded at once, and when I move or rotate one copy, I'd like to be able to transform the other five to match. So, I thought the ConstrainedMove code would be a good starting point, since what I'm trying to do is the same thing it does, just with the rotation specified by degrees instead of by dragging the mouse.
After you sent the email below, I modifed the function I was writing accordingly, and it worked. However, I'm trying to use it now, and it's not working. I'm a little lost on debugging it, because I don't even know what Chimera's concept of a global coordinate system is, nor do I have any way to visually display the local origin and axis for each object. Is there a way to do these things that you know of? Do you know of a simple way to rotate an object X degrees around a specified axis (relative to another object if needed)?
If these are really hard questions and the answer is just that I should read the source code until I figure it out, that's totally fine. I just thought I'd ask.
At least with Chimera the code IS available, unlike the situation with Amira where things would be undocumented and broken, and there'd be no way to fix them...
Thanks so much, Jordan
The function I was using is as follows (yes, it's brittle and ugly, but it's all I had time for): def update_hexamer(ref_model,model,*rest): origin = (0,0,0) axis = (0,0,1) angle_deg = 60
mvo = chimera.Point(*origin) vo = ref_model.openState.xform.apply(mvo) mva = apply(chimera.Vector, axis) va = ref_model.openState.xform.apply(mva)
xf_original = model.openState.xform
for i in range(5): xf = chimera.Xform() xf.translate(*vo) xf.rotate(va, angle_deg+60*i) xf.translate(-vo.x, -vo.y, -vo.z) model.openState.globalXform(xf) rest[i].openState.xform = model.openState.xform model.openState.xform = xf_original
participants (1)
-
Thomas Goddard