
Hi Jordan, I see one mistake in your code, related to a confusing aspect of Chimera transform objects. mvo = apply(chimera.Vector, origin) vo = ref_model.openState.xform.apply(mvo) Here you use Xform.apply(Vector). Xform is a rotation and a translation but when applied to a Vector you get only the rotation applied. That is what you want if you are reorienting an axis, but not if you are repositioning the origin. The Xform.apply(Point) method applies both the rotation and translation. So you want: mvo = apply(chimera.Point, origin) vo = ref_model.openState.xform.apply(mvo) In fact, that apply() call is old style Python and I would use: mvo = chimera.Point(*origin) vo = ref_model.openState.xform.apply(mvo) The * in front of the argument means each element of the sequence origin is passed as a separate argument. This change messes up the translate() lines further down: xf.translate(vo) xf.rotate(va, angle_deg) xf.translate(-vo) The Xform.translate(Vector) requires a Vector argument not a Point. So I'd change that to use Xform.translate(x,y,z) as follows xf.translate(vo.x, vo.y, vo.z) xf.rotate(va, angle_deg) xf.translate(-vo.x, -vo.y, -vo.z) An important detail to note is that the transform xf when applied to a point first translates by -vo, then rotates, the translates by +vo. That is the order is backwards from the above function calls that created the transform. (In the ContrainedMove code there is an incorrect comment about translate(u) actually translating by -u -- I didn't realize what was going on when I wrote that code.) If I understand your code correctly you are specifying a line (origin and axis) to rotate about in the coordinate system of ref_model, then expressing that line in Chimera global coordinates, and then rotating the second model about that line. There are so many pits to fall into with the Xform / Vector / Point Chimera code. And there is not documentation for it, other than reading the source code. This is especially excruciating because it is hard to even find the source code. I looked at Chimera source code file chimera/libs/_chimera/pyinterface to see the Python interface to the C++ Xform, Vector, and Point objects. And then when I needed to actually look at the Xform C++ code I found that in otf/lib/geom3d/Xform.cpp which is in the Chimera foreign source code distribution (200 Mb) in a tar ball: chimera/foreign/otf/otf.tar.gz This source code is available from the Chimera web site. Could we make it any more difficult for you? It's a shameful mess. Feel free to ask further questions. There is a Chimera developers mailing list chimera-dev@cgl.ucsf.edu that is more appropriate for coding questions. Tom