[chimera-dev] Re: Chimera and lighting
Eric Pettersen
pett at cgl.ucsf.edu
Thu Oct 23 14:56:37 PDT 2003
The points that Tom make in his message are all good. In the 1700
release, SimpleSession needed the original source files to restore
molecular models, and therefore the only way to restore attributes was
to use OSL identifiers to map to restored atoms, bonds, etc. Chimera's
OSL lookup code is complex and therefore slowish, especially when used
massively like this. Also, OSLs don't always uniquely identify atoms
(some small molecules have all their carbons named 'C' for instance).
The 1864 release embeds the molecular info in the session file and uses
some tricks to create a mapping between the Python id before saving and
the corresponding object after restoring. With OSLs bypassed, the
restore process is much faster. Going the whole nine yards, we
eliminated oslMap (a necessary evil at the time) and replaced it with
modelMap.
Assuming that EMANimator is using a ChimeraExtension.py to register
itself in the tools menu, you can leverage the osl_map() trick that Tom
wrote about to make your sessions always restore -- without using IDLE.
In your ChimeraExtension.py add something like this:
def fixRestore():
def osl_map(model_id_string):
... body of the osl_map function that Tom wrote
import SimpleSession
SimpleSession.oslMap = osl_map
import chimera
chimera.registerPostGraphicsFunc(fixRestore)
This will cause the fixRestore function to be called before command
line files are processed.
Eric Pettersen
UCSF Computer Graphics Lab
pett at cgl.ucsf.edu
http://www.cgl.ucsf.edu
On Wednesday, October 22, 2003, at 09:50 AM, Thomas Goddard wrote:
> Hi Steve,
>
> The SimpleSession.oslMap() call is not available in Chimera 1.1846.
> There is something similar SimpleSession.modelMap which can be used to
> emulate oslMap(). I successfully restored an EMANimator session in
> Chimera 1.1846 after defining in the IDLE shell:
>
> def osl_map(model_id_string):
> id = int(model_id_string[1:])
> import SimpleSession
> # modelMap is a dictionary mapping (id,subid) to a list of
> models.
> m = SimpleSession.modelMap[(id, 0)][0]
> return '#%d' % m.id
> import SimpleSession
> SimpleSession.oslMap = osl_map
>
> You can use this trick to open your existing session files. I
> suggest
> you change your EMANimator session saving code to make it immune from
> these SimpleSession API changes. Then you might open old session files
> as above, and save them in the improved format.
>
> Unfortunately the SimpleSession state saving is tricky because of
> the need for backwards compatibility. I do not know which
> SimpleSession APIs are guaranteed to exist in all future Chimera
> versions. To deal with this in my volume viewer session code, I do
> not put any SimpleSession calls in the actual session file. Instead I
> save all state data in dictionaries and tuples and such, and then call
> a restore routine in the volume viewer module. That routine then uses
> whatever SimpleSession calls are needed (like oslMap). This way I can
> adapt the session restore code without modifying any session files.
>
> Another suggestion is to put all your session file code in a function
> and after that call the function in a try / except block.
>
> def restore_volume_viewer():
> volume_viewer_state = {...}
> VolumeViewer.session.restore_volume_state(volume_viewer_state)
> try:
> restore_volume_viewer()
> except:
> reportRestoreError('Error restoring volume viewer')
>
> This minimizes namespace polution in the session file, and will allow
> other parts of the session restore to work if your part fails.
>
> I played with EMANimator last week and figured it all out I think.
> I was amazed you figured out the SimpleSession stuff for saving state.
>
> Tom
>
> -----------
> Here's an example of volume viewer session file code.
>
> def restore_volume_viewer():
> volume_viewer_state = \
> {
> 'adjust_camera': 0,
> 'auto_show_subregion': 0,
> 'box_padding': '0',
> 'class': 'Volume_Dialog_State',
> 'data_cache_size': '32',
> 'data_panel_shown': 0,
> 'data_set_states': [
> {
> 'class': 'Data_Set_State',
> 'data_region_state': [
> {
> 'class': 'Data_Region_State',
> 'component_display_parameters': [
> {
> 'class': 'Component_Display_Parameters_State',
> 'default_rgba': ( 1, 1, 1, 1, ),
> 'hidden': 0,
> 'solid_brightness_factor': 1.0,
> 'solid_colors': [
> ( 1, 1, 1, 1, ),
> ( 1, 1, 1, 1, ),
> ],
> 'solid_levels': [
> ( 2.8447514853193487, 0, ),
> ( 3.5993542671203613, 1, ),
> ],
> 'surface_brightness_factor': 1.0,
> 'surface_colors': [
> ( 1.0, 1.0, 1.0, 1.0, ),
> ],
> 'surface_levels': [ 2.4433076821628106, ],
> 'transparency_depth': 0.047138079248299998,
> 'transparency_factor': 0.0,
> 'version': 1,
> },
> ],
> 'name': '',
> 'region': (
> [ 0, 0, 0, ],
> [ 49, 49, 49, ],
> [ 1, 1, 1, ],
> ),
> 'region_list': {
> 'class': 'Region_List_State',
> 'current_index': 0,
> 'named_regions': [ ],
> 'region_list': [
> (
> ( 0, 0, 0, ),
> ( 49, 49, 49, ),
> ),
> ],
> 'version': 1,
> },
> 'rendering_options': {
> 'bt_correction': 0,
> 'class': 'Rendering_Options_State',
> 'colormap_size': 256,
> 'dim_transparency': 0,
> 'flip_normals': 1,
> 'line_thickness': 1,
> 'linear_interpolation': 1,
> 'maximum_intensity_projection': 0,
> 'mesh_lighting': 1,
> 'minimal_texture_memory': 0,
> 'outline_box_rgb': ( 1, 1, 1, ),
> 'show_outline_box': 0,
> 'smooth_lines': 0,
> 'two_sided_lighting': 1,
> 'use_2d_textures': 1,
> 'use_colormap': 1,
> 'version': 1,
> },
> 'representation': 'surface',
> 'solid_model': None,
> 'surface_model': {
> 'active': 1,
> 'class': 'Model_State',
> 'display': 1,
> 'id': 0,
> 'name': 'groel.mrc',
> 'osl_identifier': '#0',
> 'subid': 0,
> 'version': 2,
> 'xform': {
> 'class': 'Xform_State',
> 'rotation_angle': 1.538469230769508,
> 'rotation_axis': ( 0.5773502691895197,
> 0.5773502691895197, 0.5773502691895197, ),
> 'translation': ( 0.0, 0.0, 0.0, ),
> 'version': 1,
> },
> },
> 'version': 2,
> },
> ],
> 'data_state': {
> 'available_subsamplings': {},
> 'class': 'Data_State',
> 'file_type': 'mrc',
> 'path':
> '/usr/local/src/chimera-demos/volume/examples/groel.mrc',
> 'version': 1,
> 'xyz_origin': [ -24.5, -24.5, -24.5, ],
> 'xyz_step': [ 1.0, 1.0, 1.0, ],
> },
> 'name': 'groel.mrc',
> 'version': 1,
> },
> ],
> 'display_panel_shown': 1,
> 'focus_region_name': '',
> 'geometry': '537x358+200+633',
> 'immediate_update': 1,
> 'is_visible': 1,
> 'limit_voxel_count': 1,
> 'no_colormap_multi_component_data': 1,
> 'options_panel_shown': 0,
> 'region_panel_shown': 0,
> 'representation': 'surface',
> 'selectable_subregions': 0,
> 'show_atom_box_button': 0,
> 'show_bounds': 0,
> 'show_named_regions': 0,
> 'show_on_open': 1,
> 'subregion_button': 'button 2',
> 'version': 4,
> 'voxel_limit': '1',
> 'voxel_limit_for_open': '1',
> }
> import VolumeViewer.session
> VolumeViewer.session.restore_volume_state(volume_viewer_state)
>
> try:
> restore_volume_viewer()
> except:
> reportRestoreError('Error restoring volume viewer')
>
> _______________________________________________
> Chimera-dev mailing list
> Chimera-dev at cgl.ucsf.edu
> http://www.cgl.ucsf.edu/mailman/listinfo/chimera-dev
>
More information about the Chimera-dev
mailing list