Cart to frac
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Overview
This script will convert the real space orthonormal cartesian coordinates of a selection to the fractional coordinates given the loaded cell symmetry.
- Thanks to Wikipedia.
Example
# load the script
run cart_to_frac.py
# fetch a protein and test
fetch 1rx1, async=0
# get the coordinates for the organic small
# molecule as fractional coordinates
print cart_to_frac("org")
The Code
from pymol import cmd
def cart_to_frac(objSel,quiet=0,_self=cmd):
"""
Returns an array of fractional atomic coordinates
for a given object or selection.
PARAMS
objSel -- any object or selection
quiet -- suppress output (default, no)
_self -- core CMD object; or none
RETURNS
Python list of fractional coordinates
NOTES/EXAMPLES
cart_to_frac org
x = cart_to_frac("solvent", quiet=1)
"""
import numpy
from numpy import cos, sin, sqrt
a2r = numpy.pi / 180.0
# get the model and coordinates
m = _self.get_model(objSel)
cart_coord = numpy.matrix(m.get_coord_list())
# get the symmetry information
try:
a,b,c,alpha,beta,gamma,gp = _self.get_symmetry(objSel)
except:
print "Error-Failed to get symmetry. Please ensure you have a"
print "valid object with proper crystal symmetry loaded."
return None
# convert to radians
alpha = a2r * alpha
beta = a2r * beta
gamma = a2r * gamma
# (scaled) volume of the cell
v = sqrt(1 -cos(alpha)*cos(alpha) - cos(beta)*cos(beta) - cos(gamma)*cos(gamma) + 2*cos(alpha)*cos(beta)*cos(gamma))
tmat = numpy.matrix( [
[ 1.0 / a, -cos(gamma)/(a*sin(gamma)), (cos(alpha)*cos(gamma)-cos(beta)) / (a*v*sin(gamma)) ],
[ 0.0, 1.0 / (b*sin(gamma)), (cos(beta) *cos(gamma)-cos(alpha))/ (b*v*sin(gamma)) ],
[ 0.0, 0.0, sin(gamma) / (c*v) ] ]
)
r = cart_coord * tmat.T
if not quiet:
for (x,y,z) in r.tolist():
print '%8.5f %8.5f %8.5f' % (x,y,z)
# return the Nx3 results
return r
cmd.extend("cart_to_frac", cart_to_frac)