@log_call def selected_data(self): if self.index_cursor in range(-self.n_data, self.n_data): debug("retriving data at index=%s" %self.index_cursor) return self.parent.request_data(Hdf5DataSpec, index=self.index_cursor) else: warning('Index cursor is set to wrong value.') return None def request_data(self, spec, **kwargs): if spec is Hdf5DataSpec: return self.selected_data return None register_pipeline_node(SequentialHdf5SelectorNode) class SequentialHdf5SelectorInspector(InspectorPage): """Sequential hdf5 selector inspector. """ def __init__(self, *args, **kwargs): """Initializer. """ InspectorPage.__init__(self, *args, **kwargs) n_data_label = wx.StaticText(self, -1, 'Number of data') n_data = wx.TextCtrl(self, -1, "%s" %self.target.n_data, style=wx.TE_READONLY) cursor_label = wx.StaticText(self, -1, 'Current Index') cursor_spin = wx.SpinCtrl(self, -1, min=0, max=self.target.n_data, initial=self.target.index_cursor) self.Bind(wx.EVT_SPINCTRL, self.OnCursorSpin) data_label = wx.StaticText(self, -1, 'Selected data')
return None species_section = self.hdf5_data.get('/species', None) if species_section is None: return None return dict((id, dict(name=name, radius=radius, D=D)) for id, name, radius, D in species_section.value) @property def world_size(self): """Property getter for world size. """ if self.data_section is None: return None attrs = self.data_section.attrs if bool(attrs) == False: return None return attrs.get('world_size', None) def request_data(spec, **kwargs): """Provides data for children. """ if spec is ParticlesSpec: return self.particles elif spec is SpeciesTableSpec: return self.species_table elif spec is WorldSizeSpec: return self.world_size register_pipeline_node(ParticleConstructorNode)
""" # examine cache if self._particle_data: pass else: # self._particle_data is None uri = self.parent.request_data(UriSpec) if isinstance(uri, str): parsed = urlparse(uri) fullpath = parsed.netloc+parsed.path if os.path.exists(fullpath): pass #TBDDDDDDD # self._particle_data is left None if something wrong in loading data. return self._particle_data def request_data(self, spec, **params): """Provides particle data. """ if spec is ParticleDataSpec: return self.particle_data # this may be None if datasource is not valid. return None # Finally, register node to registry. register_pipeline_node(SimpleParticleLoaderNode) # You may write doctests, which runs on executing this module. if __name__=='__main__': # TBD from doctest import testmod, ELLIPSIS testmod(optionflags=ELLIPSIS)
warning('Failed to open %s: %s', fullpath, str(e)) pass # self._particle_space is left None if something wrong in loading data. return self._particle_space @log_call def request_data(self, spec, **kwargs): """Provides particle data. """ if spec == NumberOfItemsSpec: debug('Serving NumberOfItemsSpec') if self.fetch_particle_space(**kwargs) is None: return 0 else: return 1 elif spec == ParticleSpaceSpec: debug('Serving ParticleSpaceSpec') # this may be None if datasource is not valid. return self.fetch_particle_space(**kwargs) return None register_pipeline_node(ParticleCSVLoaderNode) if __name__=='__main__': # TBD from doctest import testmod, ELLIPSIS testmod(optionflags = ELLIPSIS)
return # otherwise: reset node cursor self.node_cursor = '/' debug('%s' % self.hdf5_data) @property @log_call def hdf5_data(self): """Property getter for had5_data """ if self.parent: return self.parent.request_data(Hdf5DataSpec) debug('No parent.') register_pipeline_node(SimpleHdf5TreeVisualizerNode) class Hdf5TreeCtrl(TreeCtrlPlus): """Tree ctrl for simple hdf5 tree visualizer. """ def __init__(self, *args, **kwargs): """Initializer. """ style = kwargs.pop( 'style', 0) | wx.TR_NO_BUTTONS | wx.TR_HAS_BUTTONS | wx.SUNKEN_BORDER kwargs['style'] = style self.selection_callback = kwargs.pop('selection_callback', None) TreeCtrlPlus.__init__(self, *args, **kwargs) self._hdf5_file = None
if self.hdf5_data.get(self.node_cursor): return # otherwise: reset node cursor self.node_cursor = '/' debug('%s' %self.hdf5_data) @property @log_call def hdf5_data(self): """Property getter for had5_data """ if self.parent: return self.parent.request_data(Hdf5DataSpec) debug('No parent.') register_pipeline_node(SimpleHdf5TreeVisualizerNode) class Hdf5TreeCtrl(TreeCtrlPlus): """Tree ctrl for simple hdf5 tree visualizer. """ def __init__(self, *args, **kwargs): """Initializer. """ style = kwargs.pop('style', 0)|wx.TR_NO_BUTTONS|wx.TR_HAS_BUTTONS|wx.SUNKEN_BORDER kwargs['style'] = style self.selection_callback = kwargs.pop('selection_callback', None) TreeCtrlPlus.__init__(self, *args, **kwargs) self._hdf5_file = None def get_hdf5_file(self):
if particle_space is not None: self.sid_list = particle_space.species @log_call def request_data(self, spec, **kwargs): """Provides particle data. """ if spec == NumberOfItemsSpec: debug('Serving NumberOfItemsSpec') return self.parent.request_data(NumberOfItemsSpec, **kwargs) elif spec == ParticleSpaceSpec: debug('Serving ParticleSpaceSpec') return self.fetch_particle_space(**kwargs) return None register_pipeline_node(ParticleSpaceFilterNode) class ParticleSpaceFilterInspector(InspectorPage): """Inspector page for ParticleSpaceFilter. """ # PROP_NAMES = ['filename', 'mode', 'driver', 'libver', 'userblock_size', # 'name', 'id', 'ref', 'attrs'] def __init__(self, *args, **kwargs): """Initializer. """ InspectorPage.__init__(self, *args, **kwargs) widgets = [] self.max_num_entry = wx.TextCtrl( self, wx.ID_ANY, "10000", style=wx.TE_PROCESS_ENTER)
warning('Invalid timestamp/particles') species_section = chunk.get('/species') if species_section == None: warning('No species table for index=%d' % (i)) continue # iterate for species... for id, name, radius, dvalue in species_section: # count number of particles n_particles = sum(particles['species_id'] == id) bin_ = populations.setdefault(name, []) bin_.append((ts, n_particles)) print populations return populations register_pipeline_node(TimecourseVisualizerNode) class TimecourseVisualizer(VisualizerPage): """Simple timecourse visualizer. """ def __init__(self, *args, **kwargs): """ """ VisualizerPage.__init__(self, *args, **kwargs) figure = Figure() figure.add_subplot('111') canvas = FigureCanvasWxAgg(self, -1, figure) self.sizer.Add(canvas, 1, wx.ALL | wx.EXPAND, 5) self.figure = figure self.canvas = canvas
if uri is None: return debug('hdf5 data uri=%s' % uri) try: parsed = urlparse(uri) fullpath = parsed.netloc + parsed.path if os.path.exists(fullpath): self._hdf5_data = File(fullpath) except IOError, e: warning('Failed to open %s: %s', fullpath, str(e)) pass # self._hdf5_data is left None if something wrong in loading data. return self._hdf5_data @log_call def request_data(self, spec, **kwargs): """Provides particle data. """ if spec == Hdf5DataSpec: debug('Serving Hdf5DataSpec') return self.hdf5_data # this may be None if datasource is not valid. return None register_pipeline_node(SimpleHdf5LoaderNode) if __name__ == '__main__': # TBD from doctest import testmod, ELLIPSIS testmod(optionflags=ELLIPSIS)
elif spec == Hdf5DataSpec: index = kwargs.get('index', 0) data = self.cache.get(index, None) if data is None: path = self.bundle.get_path_at(index) if not (path is None): try: data = File(path, mode='r') self.cache[index] = data except IOError: pass return data return None register_pipeline_node(Hdf5BundleLoaderNode) class Hdf5BundleLoaderInspector(InspectorPage): """Sequential hdf5 selector inspector. """ def __init__(self, *args, **kwargs): """Initializer. """ InspectorPage.__init__(self, *args, **kwargs) glob_pattern_label = wx.StaticText(self, -1, 'Glob pattern') glob_pattern = wx.TextCtrl(self, -1, "%s" % self.target.glob_pattern) self.Bind(wx.EVT_TEXT, self.OnGlobPatternText, glob_pattern) self.sizer.Add(glob_pattern_label, 0, wx.ALL | wx.EXPAND, 5) self.sizer.Add(glob_pattern, 0, wx.ALL | wx.EXPAND, 5) self.glob_pattern = glob_pattern
def selected_data(self): if self.index_cursor in range(-self.n_data, self.n_data): debug("retriving data at index=%s" % self.index_cursor) return self.parent.request_data(Hdf5DataSpec, index=self.index_cursor) else: warning('Index cursor is set to wrong value.') return None def request_data(self, spec, **kwargs): if spec is Hdf5DataSpec: return self.selected_data return None register_pipeline_node(SequentialHdf5SelectorNode) class SequentialHdf5SelectorInspector(InspectorPage): """Sequential hdf5 selector inspector. """ def __init__(self, *args, **kwargs): """Initializer. """ InspectorPage.__init__(self, *args, **kwargs) n_data_label = wx.StaticText(self, -1, 'Number of data') n_data = wx.TextCtrl(self, -1, "%s" % self.target.n_data, style=wx.TE_READONLY) cursor_label = wx.StaticText(self, -1, 'Current Index')
return debug('hdf5 data uri=%s' % uri) try: parsed = urlparse(uri) fullpath = parsed.netloc+parsed.path if os.path.exists(fullpath): self._hdf5_data = File(fullpath) except IOError, e: warning('Failed to open %s: %s', fullpath, str(e)) pass # self._hdf5_data is left None if something wrong in loading data. return self._hdf5_data @log_call def request_data(self, spec, **kwargs): """Provides particle data. """ if spec==Hdf5DataSpec: debug('Serving Hdf5DataSpec') return self.hdf5_data # this may be None if datasource is not valid. return None register_pipeline_node(SimpleHdf5LoaderNode) if __name__=='__main__': # TBD from doctest import testmod, ELLIPSIS testmod(optionflags=ELLIPSIS)
except IOError, e: warning('Failed to open %s: %s', fullpath, str(e)) pass # self._particle_space is left None if something wrong in loading data. return self._particle_space @log_call def request_data(self, spec, **kwargs): """Provides particle data. """ if spec == NumberOfItemsSpec: debug('Serving NumberOfItemsSpec') if self.fetch_particle_space(**kwargs) is None: return 0 else: return 1 elif spec == ParticleSpaceSpec: debug('Serving ParticleSpaceSpec') # this may be None if datasource is not valid. return self.fetch_particle_space(**kwargs) return None register_pipeline_node(ParticleCSVLoaderNode) if __name__ == '__main__': # TBD from doctest import testmod, ELLIPSIS testmod(optionflags=ELLIPSIS)
pass # self._particle_space is left None if something wrong in loading data. return self._particle_space @log_call def request_data(self, spec, **kwargs): """Provides particle data. """ if spec == NumberOfItemsSpec: debug('Serving NumberOfItemsSpec') ps = self.fetch_particle_space(**kwargs) if ps is None: return 0 else: return ps.getNumberOfItems() elif spec == ParticleSpaceSpec: debug('Serving ParticleSpaceSpec') # this may be None if datasource is not valid. ps = self.fetch_particle_space(**kwargs) return ps return None register_pipeline_node(ParticleSpatiocyteLoaderNode) if __name__ == '__main__': # TBD from doctest import testmod, ELLIPSIS testmod(optionflags=ELLIPSIS)
warning("Invalid timestamp/particles") species_section = chunk.get("/species") if species_section == None: warning("No species table for index=%d" % (i)) continue # iterate for species... for id, name, radius, dvalue in species_section: # count number of particles n_particles = sum(particles["species_id"] == id) bin_ = populations.setdefault(name, []) bin_.append((ts, n_particles)) print populations return populations register_pipeline_node(TimecourseVisualizerNode) class TimecourseVisualizer(VisualizerPage): """Simple timecourse visualizer. """ def __init__(self, *args, **kwargs): """ """ VisualizerPage.__init__(self, *args, **kwargs) figure = Figure() figure.add_subplot("111") canvas = FigureCanvasWxAgg(self, -1, figure) self.sizer.Add(canvas, 1, wx.ALL | wx.EXPAND, 5) self.figure = figure
species_section = self.hdf5_data.get('/species', None) if species_section is None: return None return dict( (id, dict(name=name, radius=radius, D=D)) for id, name, radius, D in species_section.value) @property def world_size(self): """Property getter for world size. """ if self.data_section is None: return None attrs = self.data_section.attrs if bool(attrs)==False: return None return attrs.get('world_size', None) def request_data(spec, **kwargs): """Provides data for children. """ if spec is ParticlesSpec: return self.particles elif spec is SpeciesTableSpec: return self.species_table elif spec is WorldSizeSpec: return self.world_size register_pipeline_node(ParticleConstructorNode)
# self._particle_space is left None if something wrong in loading data. return self._particle_space @log_call def request_data(self, spec, **kwargs): """Provides particle data. """ if spec == NumberOfItemsSpec: debug('Serving NumberOfItemsSpec') ps = self.fetch_particle_space(**kwargs) if ps is None: return 0 else: return ps.getNumberOfItems() elif spec == ParticleSpaceSpec: debug('Serving ParticleSpaceSpec') # this may be None if datasource is not valid. ps = self.fetch_particle_space(**kwargs) return ps return None register_pipeline_node(ParticleSpatiocyteLoaderNode) if __name__=='__main__': # TBD from doctest import testmod, ELLIPSIS testmod(optionflags = ELLIPSIS)
""" # examine cache if self._particle_data: pass else: # self._particle_data is None uri = self.parent.request_data(UriSpec) if isinstance(uri, str): parsed = urlparse(uri) fullpath = parsed.netloc + parsed.path if os.path.exists(fullpath): pass #TBDDDDDDD # self._particle_data is left None if something wrong in loading data. return self._particle_data def request_data(self, spec, **params): """Provides particle data. """ if spec is ParticleDataSpec: return self.particle_data # this may be None if datasource is not valid. return None # Finally, register node to registry. register_pipeline_node(SimpleParticleLoaderNode) # You may write doctests, which runs on executing this module. if __name__ == '__main__': # TBD from doctest import testmod, ELLIPSIS testmod(optionflags=ELLIPSIS)
return ps @log_call def update_list(self, **kwargs): ps = self.parent.request_data(ParticleSpaceSpec, **kwargs) if ps is None: return if self.sid_color_map is None: self.sid_color_map = {} for sp in ps.species: if sp not in self.sid_color_map.keys(): self.sid_color_map[sp] = get_new_color(len(self.sid_color_map)) register_pipeline_node(ParticleSpaceVisualizerNode) class ParticleSpaceVisualizer(Vtk3dVisualizerPage): @log_call def update(self): self.render() register_visualizer_page('ParticleSpaceVisualizerNode', ParticleSpaceVisualizer) class ParticleSpaceVisualizerInspector(InspectorPage): """Inspector page for ParticleSpaceVisualizer. """ def __init__(self, *args, **kwargs): """Initializer. """
self.sid_list = particle_space.species @log_call def request_data(self, spec, **kwargs): """Provides particle data. """ if spec == NumberOfItemsSpec: debug('Serving NumberOfItemsSpec') return self.parent.request_data(NumberOfItemsSpec, **kwargs) elif spec == ParticleSpaceSpec: debug('Serving ParticleSpaceSpec') return self.fetch_particle_space(**kwargs) return None register_pipeline_node(ParticleSpaceFilterNode) class ParticleSpaceFilterInspector(InspectorPage): """Inspector page for ParticleSpaceFilter. """ # PROP_NAMES = ['filename', 'mode', 'driver', 'libver', 'userblock_size', # 'name', 'id', 'ref', 'attrs'] def __init__(self, *args, **kwargs): """Initializer. """ InspectorPage.__init__(self, *args, **kwargs) widgets = []
self.renderer.GetActiveCamera().ParallelProjectionOn() self.particles_visual = ParticlesVisual(renderer=self.renderer, name='particles') @log_call def internal_update(self): """Reset cached particles """ self.particles_visual.update( dict(world_size=self.parent.world_size, species_table=self.parent.species_table, particles=self.parent.particles)) self.particles_visual.enable() register_pipeline_node(ParticleVisualizerNode) class ParticleVisualizer(Vtk3dVisualizerPage): """Visualizer. """ @log_call def update(self): """Updates content of the rendering window. TODO: this method call should be handled in superclass... """ self.render() register_visualizer_page('ParticleVisualizerNode', ParticleVisualizer)
elif spec==Hdf5DataSpec: index = kwargs.get('index', 0) data = self.cache.get(index, None) if data is None: path = self.bundle.get_path_at(index) if not(path is None): try: data = File(path, mode='r') self.cache[index] = data except IOError: pass return data return None register_pipeline_node(Hdf5BundleLoaderNode) class Hdf5BundleLoaderInspector(InspectorPage): """Sequential hdf5 selector inspector. """ def __init__(self, *args, **kwargs): """Initializer. """ InspectorPage.__init__(self, *args, **kwargs) glob_pattern_label = wx.StaticText(self, -1, 'Glob pattern') glob_pattern = wx.TextCtrl(self, -1, "%s" %self.target.glob_pattern) self.Bind(wx.EVT_TEXT, self.OnGlobPatternText, glob_pattern) self.sizer.Add(glob_pattern_label, 0, wx.ALL|wx.EXPAND, 5) self.sizer.Add(glob_pattern, 0, wx.ALL|wx.EXPAND, 5) self.glob_pattern = glob_pattern