def update_externally_derivable_components(self, data=None): """ Update all the externally derived components in all data objects, based on all the Components deriveable based on the links in self. This overrides any ComponentLinks stored in the DerivedComponents of the data itself -- any components which depend on a link not tracked by the LinkManager will be deleted. Parameters ----------- data : Data object Behavior -------- DerivedComponents will be replaced / added into the data object """ if self.data_collection is None: if data is None: return else: data_collection = [data] else: data_collection = self.data_collection for data in data_collection: links = discover_links(data, self._links | self._inverse_links) comps = {} for cid, link in six.iteritems(links): d = DerivedComponent(data, link) comps[cid] = d data._set_externally_derivable_components(comps)
def _add_deriveable_components(self, data): """Find and add any DerivedComponents that a data object can calculate given the ComponentLinks tracked by this LinkManager """ links = discover_links(data, self._links | self._inverse_links) for cid, link in six.iteritems(links): d = DerivedComponent(data, link) if cid not in data.components: data.add_component(d, cid)
def _add_deriveable_components(self, data): """Find and add any DerivedComponents that a data object can calculate given the ComponentLinks tracked by this LinkManager """ links = discover_links(data, self._links | self._inverse_links) for cid, link in six.iteritems(links): d = DerivedComponent(data, link) if cid not in data.components: # Need to hide component since we don't want to show components # that are auto-generated in datasets by default. cid.hidden = True data.add_component(d, cid)
def update_externally_derivable_components(self, data=None): """ Update all the externally derived components in all data objects, based on all the Components deriveable based on the links in self. This overrides any ComponentLinks stored in the DerivedComponents of the data itself -- any components which depend on a link not tracked by the LinkManager will be deleted. Parameters ----------- data : Data object Behavior -------- DerivedComponents will be replaced / added into the data object """ if self.data_collection is None: if data is None: return else: data_collection = [data] else: data_collection = self.data_collection # Only keep actual Data instances since only they support links for now data_collection = [d for d in data_collection if isinstance(d, Data)] for data in data_collection: links = discover_links(data, self._links | self._inverse_links) comps = {} for cid, link in six.iteritems(links): d = DerivedComponent(data, link) comps[cid] = d data._set_externally_derivable_components(comps) # Now update information about pixel-aligned data for data1 in data_collection: equivalent = {} for data2 in data_collection: if data1 is not data2: order = equivalent_pixel_cids(data2, data1) if order is not None: equivalent[data2] = order data1._set_pixel_aligned_data(equivalent)
def add_component_link(self, link, label=None): """ Shortcut method for generating a new :class:`~glue.core.component.DerivedComponent` from a ComponentLink object, and adding it to a data set. Parameters ---------- link : :class:`~glue.core.component_link.ComponentLink` The link to use to generate a new component label : :class:`~glue.core.component_id.ComponentID` or str The ComponentID or label to attach to. Returns ------- component : :class:`~glue.core.component.DerivedComponent` The component that was added """ if label is not None: if not isinstance(label, ComponentID): label = ComponentID(label, parent=self) link.set_to_id(label) if link.get_to_id() is None: raise TypeError("Cannot add component_link: " "has no 'to' ComponentID") for cid in link.get_from_ids(): if cid not in self.components: raise ValueError( "Can only add internal links with add_component_link " "- use DataCollection.add_link to add inter-data links") dc = DerivedComponent(self, link) to_ = link.get_to_id() self.add_component(dc, label=to_) return dc
def add_component_link(self, link, label=None): """ Shortcut method for generating a new :class:`~glue.core.component.DerivedComponent` from a ComponentLink object, and adding it to a data set. :param link: :class:`~glue.core.component_link.ComponentLink` :param label: The ComponentID or label to attach to. :type label: :class:`~glue.core.component_id.ComponentID` or str :returns: The :class:`~glue.core.component.DerivedComponent` that was added """ if label is not None: if not isinstance(label, ComponentID): label = ComponentID(label) link.set_to_id(label) if link.get_to_id() is None: raise TypeError("Cannot add component_link: " "has no 'to' ComponentID") dc = DerivedComponent(self, link) to_ = link.get_to_id() self.add_component(dc, to_) return dc
def _load_derived_component(rec, context): return DerivedComponent(None, link=context.object(rec['link']))
def add_component(self, component, label, hidden=False): """ Add a new component to this data set. :param component: object to add. Can be a Component, array-like object, or ComponentLink :param label: The label. If this is a string, a new :class:`glue.core.component_id.ComponentID` with this label will be created and associated with the Component :type component: :class:`~glue.core.component.Component` or array-like :type label: :class:`str` or :class:`~glue.core.component_id.ComponentID` :raises: TypeError, if label is invalid ValueError if the component has an incompatible shape :returns: The ComponentID associated with the newly-added component """ if isinstance(component, ComponentLink): component = DerivedComponent(self, component) if not isinstance(component, Component): component = Component.autotyped(component) if isinstance(component, DerivedComponent): component.set_parent(self) if not (self._check_can_add(component)): raise ValueError("The dimensions of component %s are " "incompatible with the dimensions of this data: " "%r vs %r" % (label, component.shape, self.shape)) if isinstance(label, ComponentID): component_id = label else: component_id = ComponentID(label, hidden=hidden) is_present = component_id in self._components self._components[component_id] = component first_component = len(self._components) == 1 if first_component: if isinstance(component, DerivedComponent): raise TypeError("Cannot add a derived component as " "first component") self._shape = component.shape self._create_pixel_and_world_components() if self.hub and (not is_present): msg = DataAddComponentMessage(self, component_id) self.hub.broadcast(msg) msg = ComponentsChangedMessage(self) self.hub.broadcast(msg) return component_id
def add_component(self, component, label, hidden=False): """ Add a new component to this data set. :param component: object to add. Can be a Component, array-like object, or ComponentLink :param label: The label. If this is a string, a new :class:`glue.core.component_id.ComponentID` with this label will be created and associated with the Component :type component: :class:`~glue.core.component.Component` or array-like :type label: :class:`str` or :class:`~glue.core.component_id.ComponentID` :raises: TypeError, if label is invalid ValueError if the component has an incompatible shape :returns: The ComponentID associated with the newly-added component """ if isinstance(component, ComponentLink): component = DerivedComponent(self, component) if not isinstance(component, Component): component = Component.autotyped(component) if isinstance(component, DerivedComponent): component.set_parent(self) if not(self._check_can_add(component)): raise ValueError("The dimensions of component %s are " "incompatible with the dimensions of this data: " "%r vs %r" % (label, component.shape, self.shape)) if isinstance(label, ComponentID): component_id = label else: component_id = ComponentID(label, hidden=hidden) is_present = component_id in self._components self._components[component_id] = component first_component = len(self._components) == 1 if first_component: if isinstance(component, DerivedComponent): raise TypeError("Cannot add a derived component as " "first component") self._shape = component.shape self._create_pixel_and_world_components() if self.hub and (not is_present): msg = DataAddComponentMessage(self, component_id) self.hub.broadcast(msg) msg = ComponentsChangedMessage(self) self.hub.broadcast(msg) return component_id