Difference between revisions of "Dynamic mesh"

From PyMOLWiki
Jump to: navigation, search
(Supported map_auto_expand_sym)
(moved to github)
 
Line 1: Line 1:
 +
{{Infobox script-repo
 +
|type      = module
 +
|filename  = dynamic_mesh.py
 +
|author    = [[User:TakanoriNakane|Takanori Nakane]]
 +
|license  = BSD-2-Clause
 +
}}
 +
 
'''dynamic_mesh''' displays [[isomesh]] around the center of the view. When the view is moved, the isomesh will be updated automatically.
 
'''dynamic_mesh''' displays [[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.
 
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.
Line 6: Line 13:
 
== Usage ==
 
== Usage ==
  
  dynamic_mesh mapname [, level [, radius [, sym_source]]]
+
  dynamic_mesh map_name [, level [, radius [, name [ sym_source ]]]]
  
where
+
== Arguments ==
  
map_name = string: name of volumetric object(map) to display  
+
* map_name = string: name of volumetric object(map) to display  
level = float: contour level of isomesh {default: 0.8}
+
* level = float: contour level of isomesh {default: 1.0}
radius = float: radius of isomesh around the center of the view {default: 8}
+
* radius = float: radius of isomesh around the center of the view {default: 8}
sym_source = string: name of object from which symmetry
+
* name = string: name of mesh object {default: dynamic_mesh}
                  information is derived {default: None}
+
* sym_source = string: name of object from which symmetry information is derived {default: map_name}
  
 
== Example ==
 
== Example ==
Line 29: Line 36:
  
 
Note: On PyMOL <= 1.4, you have to download the electron density map from the Uppsala Electron Density Server manually.
 
Note: On PyMOL <= 1.4, you have to download the electron density map from the Uppsala Electron Density Server manually.
 
== Script ==
 
 
<syntaxhighlight lang="python">
 
# Dynamic Mesh by Takanori Nakane, License: BSD-2 Clause
 
# version 0.2:  20120825
 
 
'''
 
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, sym_source=1hwk
 
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, radius, sym_source):
 
        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)
 
        if sym_source != None:
 
            cmd.set("map_auto_expand_sym", 1)
 
            cmd.set_symmetry("__center__", *cmd.get_symmetry(sym_source))
 
        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, sym_source = None):
 
    '''
 
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 can be applied to the map.
 
 
USAGE
 
 
    dynamic_mesh mapname [, level [, radius [, sym_source]]]
 
 
ARGUMENTS
 
 
    map_name = string: name of volumetric object(map) to display
 
 
    level = float: contour level of isomesh {default: 0.8}
 
 
    radius = float: radius of isomesh around the center of the view {default: 8}
 
 
    sym_source = string: name of object from which symmetry
 
                        information is derived {default: None}
 
 
SEE ALSO
 
 
    isomesh
 
    '''
 
 
    cmd.delete("dynamic_mesh") # TODO: support multiple meshs
 
    cmd.delete("dymesh_callback")
 
    cmd.load_callback(DynamicMesh(meshname, float(level), float(radius), sym_source), 'dymesh_callback')
 
 
cmd.extend('dynamic_mesh', dynamic_mesh)
 
cmd.auto_arg[0]['dynamic_mesh'] = [ cmd.map_sc, 'map object', ', ']
 
cmd.auto_arg[3]['dynamic_mesh'] = [ cmd.object_sc, 'object', ', ']
 
</syntaxhighlight>
 
  
 
== See Also ==
 
== See Also ==
Line 152: Line 47:
 
[[Category:Script_Library]]
 
[[Category:Script_Library]]
 
[[Category:UI_Scripts]]
 
[[Category:UI_Scripts]]
 +
[[Category:Pymol-script-repo]]

Latest revision as of 12:15, 30 August 2012

Type Python Module
Download dynamic_mesh.py
Author(s) Takanori Nakane
License BSD-2-Clause
This code has been put under version control in the project Pymol-script-repo

dynamic_mesh displays 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.

Note: PyMOL's Density Wizard (Menu > Wizard > Density) provides similar functionality. It is implemented using wizard framework, while this uses CallBack object.

Usage

dynamic_mesh map_name [, level [, radius [, name [ sym_source ]]]]

Arguments

  • map_name = string: name of volumetric object(map) to display
  • level = float: contour level of isomesh {default: 1.0}
  • radius = float: radius of isomesh around the center of the view {default: 8}
  • name = string: name of mesh object {default: dynamic_mesh}
  • sym_source = string: name of object from which symmetry information is derived {default: map_name}

Example

fetch 1HWK, async=1
fetch 1HWK, 1hwk_map, type=2fofc, async=1
run dynamic_mesh.py
dynamic_mesh 1hwk_map, sym_source=1hwk
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.

See Also