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 (PyMOL-users@lists.sourceforge.net) Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users Archives: http://www.mail-archive.com/pymol-users@lists.sourceforge.net