Source code for mxcubecore.HardwareObjects.abstract.sample_changer.Sample

import sys

from .Component import Component

try:
    from urllib import urlopen
except ImportError:
    from urllib.request import urlopen


[docs]class Sample(Component): """ Entity class holding state of an individual sample or sample slot (an empty sample location). """ # Common properties __HOLDER_LENGTH_PROPERTY__ = "Length" __IMAGE_URL_PROPERTY__ = "Image" __IMAGE_X_PROPERTY__ = "X" __IMAGE_Y_PROPERTY__ = "Y" __INFO_URL_PROPERTY__ = "Info" def __init__(self, container, address, scannable): super(Sample, self).__init__(container, address, scannable) self.properties = {} self.loaded = False self._has_been_loaded = False self._leaf = True ######################### PUBLIC #########################
[docs] def is_loaded(self): """ Returns if the sample is currently loaded for data collection :rtype: bool """ return self.loaded
[docs] def has_been_loaded(self): """ Returns if the sample has already beenloaded for data collection :rtype: bool """ return self._has_been_loaded
[docs] def get_properties(self): """ Returns a dictionary with sample changer specific sample properties :rtype: dictionary """ return self.properties
[docs] def has_property(self, name): """ Returns true if a property is defined :rtype: bool """ return name in self.properties
[docs] def get_property(self, name): """ Returns a given property or None if not defined :rtype: object """ if not self.has_property(name): return None return self.properties[name]
def fetch_image(self): try: if self.has_property(self.__IMAGE_URL_PROPERTY__): img_url = self.get_property(self.__IMAGE_URL_PROPERTY__) if len(img_url) == 0: return None f = urlopen(img_url) img = f.read() return img except Exception: print((sys.exc_info()[1]))
[docs] def clear_info(self): Component.clear_info(self) changed = False if self.loaded: self.loaded = False changed = True if self._has_been_loaded: self._has_been_loaded = False changed = True if changed: self._set_dirty()
# Common properties def get_holder_length(self): return self.get_property(self.__HOLDER_LENGTH_PROPERTY__) def _set_holder_length(self, value): self._set_property(self.__HOLDER_LENGTH_PROPERTY__, value) def _set_image_x(self, value): self._set_property(self.__IMAGE_X_PROPERTY__, value) def get_image_x(self): return self.get_property(self.__IMAGE_X_PROPERTY__) def _set_image_y(self, value): self._set_property(self.__IMAGE_Y_PROPERTY__, value) def get_image_y(self): return self.get_property(self.__IMAGE_Y_PROPERTY__) def _set_image_url(self, value): if (value is not None) and (value.startswith("http://")): value = "https://" + value[7] self._set_property(self.__IMAGE_URL_PROPERTY__, value) def get_image_url(self): return self.get_property(self.__IMAGE_URL_PROPERTY__) def _set_info_url(self, value): self._set_property(self.__INFO_URL_PROPERTY__, value) def get_info_url(self): return self.get_property(self.__INFO_URL_PROPERTY__) ######################### PROTECTED ######################### def _set_loaded(self, loaded, has_been_loaded=None): changed = False if self.loaded != loaded: self.loaded = loaded changed = True if has_been_loaded is None: if loaded: has_been_loaded = True if self._has_been_loaded != has_been_loaded: self._has_been_loaded = has_been_loaded changed = True if changed: self._set_dirty() def _set_property(self, name, value): if (not self.has_property(name)) or (self.get_property(name) != value): self._set_dirty() self.properties[name] = value def _reset_property(self, name, value): if self.has_property(name): self.properties.pop(name) self._set_dirty()