diff options
author | Picca Frédéric-Emmanuel <picca@debian.org> | 2017-11-25 16:55:20 +0100 |
---|---|---|
committer | Picca Frédéric-Emmanuel <picca@debian.org> | 2017-11-25 16:55:20 +0100 |
commit | e19c96eff0c310c06c4f268c8b80cb33bd08996f (patch) | |
tree | f2b4a365ed899be04766f3937bcc2d58d22be065 /silx/io/fabioh5.py | |
parent | bfa4dba15485b4192f8bbe13345e9658c97ecf76 (diff) |
New upstream version 0.6.1+dfsg
Diffstat (limited to 'silx/io/fabioh5.py')
-rw-r--r-- | silx/io/fabioh5.py | 75 |
1 files changed, 63 insertions, 12 deletions
diff --git a/silx/io/fabioh5.py b/silx/io/fabioh5.py index 3dfba96..2cee032 100644 --- a/silx/io/fabioh5.py +++ b/silx/io/fabioh5.py @@ -44,6 +44,12 @@ from . import commonh5 from silx.third_party import six from silx import version as silx_version +try: + import h5py +except ImportError as e: + h5py = None + + _logger = logging.getLogger(__name__) @@ -71,6 +77,7 @@ class RawHeaderData(commonh5.LazyLoadableDataset): """Initialize hold data by merging all headers of each frames. """ headers = [] + types = set([]) for frame in range(self.__fabio_file.nframes): if self.__fabio_file.nframes == 1: header = self.__fabio_file.header @@ -81,10 +88,33 @@ class RawHeaderData(commonh5.LazyLoadableDataset): for key, value in header.items(): data.append("%s: %s" % (str(key), str(value))) - headers.append(u"\n".join(data).encode("utf-8")) + data = "\n".join(data) + try: + line = data.encode("ascii") + types.add(numpy.string_) + except UnicodeEncodeError: + try: + line = data.encode("utf-8") + types.add(numpy.unicode_) + except UnicodeEncodeError: + # Fallback in void + line = numpy.void(data) + types.add(numpy.void) + + headers.append(line) + + if numpy.void in types: + dtype = numpy.void + elif numpy.unicode_ in types: + dtype = numpy.unicode_ + else: + dtype = numpy.string_ + + if dtype == numpy.unicode_ and h5py is not None: + # h5py only support vlen unicode + dtype = h5py.special_dtype(vlen=six.text_type) - # create the header list - return numpy.array(headers, dtype=numpy.string_) + return numpy.array(headers, dtype=dtype) class MetadataGroup(commonh5.LazyLoadableGroup): @@ -214,6 +244,7 @@ class FabioReader(object): self.__counters = {} self.__positioners = {} self.__measurements = {} + self.__key_filters = set([]) self.__data = None self.__frame_count = self.__fabio_file.nframes self._read(self.__fabio_file) @@ -323,6 +354,13 @@ class FabioReader(object): def _read(self, fabio_file): """Read all metadata from the fabio file and store it into this object.""" + + self.__key_filters.clear() + if hasattr(fabio_file, "RESERVED_HEADER_KEYS"): + # Provided in fabio 0.5 + for key in fabio_file.RESERVED_HEADER_KEYS: + self.__key_filters.add(key.lower()) + for frame in range(fabio_file.nframes): if fabio_file.nframes == 1: header = fabio_file.header @@ -330,10 +368,22 @@ class FabioReader(object): header = fabio_file.getframe(frame).header self._read_frame(frame, header) + def _is_filtered_key(self, key): + """ + If this function returns True, the :meth:`_read_key` while not be + called with this `key`while reading the metatdata frame. + + :param str key: A key of the metadata + :rtype: bool + """ + return key.lower() in self.__key_filters + def _read_frame(self, frame_id, header): """Read all metadata from a frame and store it into this object.""" for key, value in header.items(): + if self._is_filtered_key(key): + continue self._read_key(frame_id, key, value) def _read_key(self, frame_id, name, value): @@ -372,8 +422,10 @@ class FabioReader(object): if has_none: # Fix missing data according to the array type - if result_type.kind in ["S", "U"]: - none_value = "" + if result_type.kind == "S": + none_value = b"" + elif result_type.kind == "U": + none_value = u"" elif result_type.kind == "f": none_value = numpy.float("NaN") elif result_type.kind == "i": @@ -472,10 +524,10 @@ class FabioReader(object): result_type = numpy.result_type(*types) - if issubclass(result_type.type, numpy.string_): + if issubclass(result_type.type, (numpy.string_, six.binary_type)): # use the raw data to create the result return numpy.string_(value) - elif issubclass(result_type.type, numpy.unicode_): + elif issubclass(result_type.type, (numpy.unicode_, six.text_type)): # use the raw data to create the result return numpy.unicode_(value) else: @@ -526,11 +578,10 @@ class EdfFabioReader(FabioReader): self._read_mnemonic_key(frame_id, "counter", header) FabioReader._read_frame(self, frame_id, header) - def _read_key(self, frame_id, name, value): - """Overwrite the method to filter counter or motor keys.""" - if name in self.__catch_keys: - return - FabioReader._read_key(self, frame_id, name, value) + def _is_filtered_key(self, key): + if key in self.__catch_keys: + return True + return FabioReader._is_filtered_key(self, key) def _get_mnemonic_key(self, base_key, header): mnemonic_values_key = base_key + "_mne" |