[chimera-dev] problems with xformCoord and coord

Greg Couch gregc at cgl.ucsf.edu
Wed Sep 9 12:03:41 PDT 2009


On Wed, 9 Sep 2009, Elisabeth Ortega wrote:

> Dear All,
>
> I'm doing a script change the coordinates x,y,z for one molecule to move it
> using xformCoord coordinate system but my script doesn't work very well.
> My function looks like:
>
> atom.setCoord(a.coord()-0.1*(vector(x,y,z)))
>
> How can I write it in xformCoord? a.setCoord doesn't return to me xformCoord
> even if I write all the variables using xformCoord.
>
> In other words, I'm asking about the "translation" of the function
> atom.setCoord() in xformCoord coordinates.
>
> Thank You
>
> --
> Elisabeth Ortega Carrasco
> Universitat Autónoma de Barcelona (Spain)
> eortega at klingon.uab.es

Hi Elisabeth,

Here's a small script to illustrate how to get a model's transformation 
matrix and how atom coordinates are transformed (assuming that there is 
only a Molecule open and that it has been moved relative to its starting 
position):

 	m = chimera.openModels.list()[0]
 	a = m.atoms[0]
 	xf = m.openState.xform
 	print a.xformCoord()
 	print a.coord()
 	c = xf.apply(a.coord())
 	print c

The first and third lines of output are always the same -- i.e., 
a.xformCoord() is equivalent to xf.apply(a.coord()).

The model's transformation matrix (xform) converts coordinates from the 
model's coordinate frame to the lab coordinate frame (x-axis is to the 
right, y-axis is up, z-axis is out of the screen).

Atom coordinates are always kept in the molecule's coordinate frame.  To
move in a different coordinate frame, represented by the xf transformation
matrix, do:

 	c = xf.apply(a.coord()) + chimera.Vector(x, y, z)
 	xfinv = xf.inverse()
 	a.setCoord(xfinv.apply(c))

And if you wanted to add a setXformCoord method to Atom:

 	def setXformCoord(self, coord):
 		xfinv = self.molecule.openState.xform.inverse()
 		self.setCoord(xfinv.apply(coord))
 	chimera.Atom.setXformCoord = setXformCoord

And then you could call atom.setXformCoord(coord).  It's not very 
efficient, because it inverts the transformation matrix every time, but it 
might do what you want.

 	- Greg


More information about the Chimera-dev mailing list