Dear PyMOL users,
I wrote a script to display isomesh around the center of the view.
When the view is moved, the isomesh will be updated automatically.
You can also change contour level by PageDown&PageUp keys.
This script is intended to implement interface similar to COOT for
examing electron density maps.
Comments and suggestions are welcome.
Best regards,
Takanori Nakane
=== SCRIPT START (save as dynamic_mesh.py) ===
# Dynamic Mesh by Takanori Nakane
# version 0.1: 20120819
'''
This script was tested on PyMOL 1.2 and 1.5.
Example:
fetch 1HWK, async=1
fetch 1HWK, 1hwk_map, type=2fofc, async=1
run dynamic_mesh.py
dynamic_mesh 1hwk_map
show sticks, resn 117
show ribbon
zoom chain A and resn 117
Note: On PyMOL <= 1.4, you have to download the electron density
map from the Uppsala Electron Density Server manually.
'''
from pymol.callback import Callback
from pymol import cmd
class DynamicMesh(Callback):
def __init__(self, meshname, level = 0.8, radius = 8):
self.center = cmd.get_position()
self.level = level
self.radius = radius
self.mesh = meshname
cmd.set("auto_zoom", 0)
cmd.pseudoatom("__center__", pos = self.center, quiet = 1)
cmd.hide("everything", "__center__")
cmd.set_key("pgup", self.contour_plus)
cmd.set_key("pgdn", self.contour_minus)
# TODO: Where should I unregister them?
self.update()
def contour_plus(self):
self.level += 0.1
print "Map level: " + str(self.level)
self.update()
def contour_minus(self):
if (self.level < 0.15):
return
self.level -= 0.1
print "Map level: " + str(self.level)
self.update()
def update(self):
self.center = cmd.get_position()
cmd.alter_state(0, "__center__", "(x, y, z) = p", space={'p':
self.center})
cmd.isomesh("dynamic_mesh", self.mesh, self.level, "__center__", carve
= self.radius)
def __call__(self):
tmp = cmd.get_position()
r = (self.center[0] - tmp[0]) * (self.center[0] - tmp[0]) + \
(self.center[1] - tmp[1]) * (self.center[1] - tmp[1]) + \
(self.center[2] - tmp[2]) * (self.center[2] - tmp[2])
if (r > 0.3): # increase this number if it is too slow
self.update()
def get_extent(self):
tmp = cmd.get_position()
return [[tmp[0] - self.radius, tmp[1] - self.radius, tmp[2] -
self.radius], \
[tmp[0] + self.radius, tmp[1] + self.radius, tmp[2] +
self.radius]]
def dynamic_mesh(meshname, level = 0.8, radius = 8):
'''
DESCRIPTION
Make 'dynamic' mesh from volumetric data such as electron density map.
The mesh will dynamically follow the center of the view.
Contour leveo of isomesh can be changed by PageDown and PageUp keys.
NOTE: Crystallographic operations will not be applied to the map.
Only pre-calculated volume can be displayed.
USAGE
dynamic_mesh meshname [, level [, radius]]
ARGUMENTS
mesh_name = string: name of volumetric object to display
level = float: contour level of isomesh {default: 0.8}
radius = float: radius of isomesh around the center of the view {default: 8}
SEE ALSO
isomesh
'''
cmd.delete("dynamic_mesh") # TODO: support multiple meshs
cmd.delete("dynamic_callback")
cmd.load_callback(DynamicMesh(meshname, float(level),
float(radius)),'dymesh_callback')
cmd.extend('dynamic_mesh', dynamic_mesh)
cmd.auto_arg[0]['dynamic_mesh'] = [ cmd.object_sc, 'object', '']
=== SCRIPT END ===
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
PyMOL-users mailing list ([email protected])
Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users
Archives: http://www.mail-archive.com/[email protected]