def __call__(self, **params): p = ParamOverrides(self, params) measured_sheets = [ s for s in topo.sim.objects(CFSheet).values() if hasattr(s, 'measure_maps') and s.measure_maps ] results = Layout() # Could easily be extended to measure CoG of all projections # and e.g. register them using different names (e.g. "Afferent # XCoG"), but then it's not clear how the PlotGroup would be # able to find them automatically (as it currently supports # only a fixed-named plot). requested_proj = p.proj_name for sheet in measured_sheets: for proj in sheet.in_connections: if (proj.name == requested_proj) or \ (requested_proj == '' and (proj.src != sheet)): cog_data = self._update_proj_cog(p, proj) for key, data in cog_data.items(): name = proj.name[0].upper() + proj.name[1:] results.set_path((key, name), data) if p.measurement_storage_hook: p.measurement_storage_hook(results) return results
def __call__(self, **params): p = ParamOverrides(self, params) measured_sheets = [s for s in topo.sim.objects(CFSheet).values() if hasattr(s,'measure_maps') and s.measure_maps] results = Layout() # Could easily be extended to measure CoG of all projections # and e.g. register them using different names (e.g. "Afferent # XCoG"), but then it's not clear how the PlotGroup would be # able to find them automatically (as it currently supports # only a fixed-named plot). requested_proj=p.proj_name for sheet in measured_sheets: for proj in sheet.in_connections: if (proj.name == requested_proj) or \ (requested_proj == '' and (proj.src != sheet)): cog_data = self._update_proj_cog(p, proj) for key, data in cog_data.items(): name = proj.name[0].upper() + proj.name[1:] results.set_path((key, name), data) if p.measurement_storage_hook: p.measurement_storage_hook(results) return results
def _populate_grid(self, results): trees = [] for coord, viewgroup in results.items(): for path, stack in viewgroup.data.items(): grid_container = Layout() coord_map = stack.add_dimension(f.Y, 0, coord[1]) coord_map = coord_map.add_dimension(f.X, 0, coord[0]) grid_container.set_path(path, coord_map) trees.append(grid_container) return Layout.merge(trees)
def _collate_results(self, p): results = Layout() timestamp = self.metadata.timestamp axis_name = p.x_axis.capitalize() axis_feature = [f for f in self.features if f.name.lower() == p.x_axis][0] if axis_feature.cyclic: axis_feature.values.append(axis_feature.range[1]) curve_label = ''.join([p.measurement_prefix, axis_name, 'Tuning']) dimensions = [features.Time, features.Duration] + [f for f in self.outer] + [axis_feature] pattern_dimensions = self.outer + self.inner pattern_dim_label = '_'.join(f.name.capitalize() for f in pattern_dimensions) for label in self.measurement_product: # Deconstruct label into source name and feature_values name = label[0] f_vals = label[1:] # Get data and metadata from the DistributionMatrix objects dist_matrix = self._featureresponses[name][f_vals][p.x_axis] curve_responses = dist_matrix.distribution_matrix output_metadata = self.metadata.outputs[name] rows, cols = output_metadata['shape'] # Create top level NdMapping indexing over time, duration, the outer # feature dimensions and the x_axis dimension if (curve_label, name) not in results: vmap = HoloMap(kdims=dimensions, group=curve_label, label=name) vmap.metadata = AttrDict(**output_metadata) results.set_path((curve_label, name), vmap) metadata = AttrDict(timestamp=timestamp, **output_metadata) # Populate the ViewMap with measurements for each x value for x in curve_responses[0, 0]._data.iterkeys(): y_axis_values = np.zeros(output_metadata['shape'], activity_dtype) for i in range(rows): for j in range(cols): y_axis_values[i, j] = curve_responses[i, j].get_value(x) key = (timestamp,)+f_vals+(x,) im = Image(y_axis_values, bounds=output_metadata['bounds'], label=name, group=' '.join([curve_label, 'Response']), vdims=['Response']) im.metadata = metadata.copy() results[(curve_label, name)][key] = im if axis_feature.cyclic and x == axis_feature.range[0]: symmetric_key = (timestamp,)+f_vals+(axis_feature.range[1],) results[(curve_label, name)][symmetric_key] = im if p.store_responses: info = (p.pattern_generator.__class__.__name__, pattern_dim_label, 'Response') results.set_path(('%s_%s_%s' % info, name), self._responses[name]) return results
def _collate_results(self, responses, label): time = self.metadata.timestamp dims = [f.Time, f.Duration] response_label = label + ' Response' results = Layout() for label, response in responses.items(): name, duration = label path = (response_label.replace(' ', ''), name) label = ' '.join([name, response_label]) metadata = self.metadata['outputs'][name] if path not in results: vmap = HoloMap(key_dimensions=dims) vmap.metadata = AttrDict(**metadata) results.set_path(path, vmap) im = Image(response, metadata['bounds'], label=label, group='Activity') im.metadata=AttrDict(timestamp=time) results[path][(time, duration)] = im return results
def _collate_results(self, p): """ Collate responses into the results dictionary containing a ProjectionGrid for each measurement source. """ results = Layout() timestamp = self.metadata.timestamp dimensions = [features.Time, features.Duration] pattern_dimensions = self.outer + self.inner pattern_dim_label = '_'.join(f.name.capitalize() for f in pattern_dimensions) for labels in self.measurement_product: in_label, out_label, duration = labels input_metadata = self.metadata.inputs[in_label] output_metadata = self.metadata.outputs[out_label] rows, cols, scs = self._compute_roi(p, output_metadata) time_key = (timestamp, duration) view = GridSpace(group='RFs', label=out_label) rc_response = self._featureresponses[in_label][out_label][duration] for i, ii in enumerate(rows): for j, jj in enumerate(cols): coord = scs.matrixidx2sheet(ii, jj) im = Image(rc_response[i, j], input_metadata['bounds'], label=out_label, group='Receptive Field', value_dimensions=['Weight']) im.metadata = AttrDict(timestamp=timestamp) view[coord] = HoloMap((time_key, im), key_dimensions=dimensions, label=out_label, group='Receptive Field') view[coord].metadata = AttrDict(**input_metadata) results.set_path(('%s_Reverse_Correlation' % in_label, out_label), view) if p.store_responses: info = (p.pattern_generator.__class__.__name__, pattern_dim_label, 'Response') results.set_path(('%s_%s_%s' % info, out_label), self._responses[out_label]) return results
def _collate_results(self, p): results = Layout() timestamp = self.metadata.timestamp # Generate dimension info dictionary from features dimensions = [features.Time, features.Duration] + self.outer pattern_dimensions = self.outer + self.inner pattern_dim_label = '_'.join(f.name.capitalize() for f in pattern_dimensions) for label in self.measurement_product: name = label[0] # Measurement source f_vals = label[1:] # Duration and outer feature values #Metadata inner_features = dict([(f.name, f) for f in self.inner]) output_metadata = dict(self.metadata.outputs[name], inner_features=inner_features) # Iterate over inner features fr = self._featureresponses[name][f_vals] for fname, fdist in fr.items(): feature = fname.capitalize() base_name = self.measurement_prefix + feature # Get information from the feature fp = [f for f in self.features if f.name.lower() == fname][0] pref_fn = fp.preference_fn if has_preference_fn(fp)\ else self.preference_fn if p.selectivity_multiplier is not None: pref_fn.selectivity_scale = (pref_fn.selectivity_scale[0], p.selectivity_multiplier) # Get maps and iterate over them response = fdist.apply_DSF(pref_fn) for k, maps in response.items(): for map_name, map_view in maps.items(): # Set labels and metadata map_index = base_name + k + map_name.capitalize() map_label = ' '.join([base_name, map_name.capitalize()]) cyclic = (map_name != 'selectivity' and fp.cyclic) fprange = fp.range if cyclic else (None, None) value_dimension = Dimension(map_label, cyclic=cyclic, range=fprange) self._set_style(fp, map_name) # Create views and stacks im = Image(map_view, bounds=output_metadata['bounds'], label=name, group=map_label, vdims=[value_dimension]) im.metadata=AttrDict(timestamp=timestamp) key = (timestamp,)+f_vals if (map_label.replace(' ', ''), name) not in results: vmap = HoloMap((key, im), kdims=dimensions, label=name, group=map_label) vmap.metadata = AttrDict(**output_metadata) results.set_path((map_index, name), vmap) else: results.path_items[(map_index, name)][key] = im if p.store_responses: info = (p.pattern_generator.__class__.__name__, pattern_dim_label, 'Response') results.set_path(('%s_%s_%s' % info, name), self._responses[name]) return results
def test_viewgroup_set_path(self): tr = Layout() tr.set_path(('Test', 'Path'), -42) self.assertEqual(tr.Test.Path, -42)
def test_layout_set_path(self): tr = Layout() tr.set_path(('Test', 'Path'), -42) self.assertEqual(tr.Test.Path, -42)