summaryrefslogtreecommitdiff
path: root/src/silx/gui/hdf5/Hdf5Item.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/silx/gui/hdf5/Hdf5Item.py')
-rwxr-xr-xsrc/silx/gui/hdf5/Hdf5Item.py157
1 files changed, 86 insertions, 71 deletions
diff --git a/src/silx/gui/hdf5/Hdf5Item.py b/src/silx/gui/hdf5/Hdf5Item.py
index 8f20649..2777a94 100755
--- a/src/silx/gui/hdf5/Hdf5Item.py
+++ b/src/silx/gui/hdf5/Hdf5Item.py
@@ -1,6 +1,6 @@
# /*##########################################################################
#
-# Copyright (c) 2016-2019 European Synchrotron Radiation Facility
+# Copyright (c) 2016-2023 European Synchrotron Radiation Facility
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -28,7 +28,6 @@ __date__ = "17/01/2019"
import logging
-import collections
import enum
from typing import Optional
@@ -39,6 +38,7 @@ from .Hdf5Node import Hdf5Node
import silx.io.utils
from silx.gui.data.TextFormatter import TextFormatter
from ..hdf5.Hdf5Formatter import Hdf5Formatter
+
_logger = logging.getLogger(__name__)
_formatter = TextFormatter()
_hdf5Formatter = Hdf5Formatter(textFormatter=_formatter)
@@ -46,8 +46,8 @@ _hdf5Formatter = Hdf5Formatter(textFormatter=_formatter)
class DescriptionType(enum.Enum):
- """List of available kind of description.
- """
+ """List of available kind of description."""
+
ERROR = "error"
DESCRIPTION = "description"
TITLE = "title"
@@ -210,9 +210,14 @@ class Hdf5Item(Hdf5Node):
class_ = silx.io.utils.get_h5_class(self.__obj)
if class_ == silx.io.utils.H5Type.EXTERNAL_LINK:
- message = "External link broken. Path %s::%s does not exist" % (self.__obj.filename, self.__obj.path)
+ message = "External link broken. Path %s::%s does not exist" % (
+ self.__obj.filename,
+ self.__obj.path,
+ )
elif class_ == silx.io.utils.H5Type.SOFT_LINK:
- message = "Soft link broken. Path %s does not exist" % (self.__obj.path)
+ message = "Soft link broken. Path %s does not exist" % (
+ self.__obj.path
+ )
else:
name = self.__obj.__class__.__name__.split(".")[-1].capitalize()
message = "%s broken" % (name)
@@ -220,7 +225,10 @@ class Hdf5Item(Hdf5Node):
self.__isBroken = True
else:
self.__obj = obj
- if silx.io.utils.get_h5_class(obj) not in [silx.io.utils.H5Type.GROUP, silx.io.utils.H5Type.FILE]:
+ if silx.io.utils.get_h5_class(obj) not in [
+ silx.io.utils.H5Type.GROUP,
+ silx.io.utils.H5Type.FILE,
+ ]:
try:
# pre-fetch of the data
if obj.shape is None:
@@ -257,7 +265,10 @@ class Hdf5Item(Hdf5Node):
keys.append(name)
except Exception:
lib_name = self.obj.__class__.__module__.split(".")[0]
- _logger.error("Internal %s error (second time). The file is corrupted.", lib_name)
+ _logger.error(
+ "Internal %s error (second time). The file is corrupted.",
+ lib_name,
+ )
_logger.debug("Backtrace", exc_info=True)
for name in keys:
try:
@@ -281,7 +292,14 @@ class Hdf5Item(Hdf5Node):
h5class = silx.io.utils.get_h5_class(class_=class_)
if h5class is None:
_logger.error("Class %s unsupported", class_)
- item = Hdf5Item(text=name, obj=None, parent=self, key=name, h5Class=h5class, linkClass=link)
+ item = Hdf5Item(
+ text=name,
+ obj=None,
+ parent=self,
+ key=name,
+ h5Class=h5class,
+ linkClass=link,
+ )
self.appendChild(item)
def hasChildren(self):
@@ -330,7 +348,7 @@ class Hdf5Item(Hdf5Node):
:param Dict[str,str] attributeDict: Key/value attributes
"""
- attributeDict = collections.OrderedDict()
+ attributeDict = {}
if self.h5Class == silx.io.utils.H5Type.DATASET:
attributeDict["#Title"] = "HDF5 Dataset"
@@ -338,7 +356,9 @@ class Hdf5Item(Hdf5Node):
attributeDict["Path"] = self.obj.name
attributeDict["Shape"] = self._getFormatter().humanReadableShape(self.obj)
attributeDict["Value"] = self._getFormatter().humanReadableValue(self.obj)
- attributeDict["Data type"] = self._getFormatter().humanReadableType(self.obj, full=True)
+ attributeDict["Data type"] = self._getFormatter().humanReadableType(
+ self.obj, full=True
+ )
elif self.h5Class == silx.io.utils.H5Type.GROUP:
attributeDict["#Title"] = "HDF5 Group"
if self.nexusClassName:
@@ -395,14 +415,18 @@ class Hdf5Item(Hdf5Node):
# Check NX_class formatting
lower = text.lower()
formatedNX_class = ""
- if lower.startswith('nx'):
- formatedNX_class = 'NX' + lower[2:]
- if lower == 'nxcansas':
- formatedNX_class = 'NXcanSAS' # That's the only class with capital letters...
+ if lower.startswith("nx"):
+ formatedNX_class = "NX" + lower[2:]
+ if lower == "nxcansas":
+ formatedNX_class = (
+ "NXcanSAS" # That's the only class with capital letters...
+ )
if text != formatedNX_class:
- _logger.error("NX_class: '%s' is malformed (should be '%s')",
- text,
- formatedNX_class)
+ _logger.error(
+ "NX_class: '%s' is malformed (should be '%s')",
+ text,
+ formatedNX_class,
+ )
text = formatedNX_class
self.__nx_class = text
@@ -469,59 +493,44 @@ class Hdf5Item(Hdf5Node):
return None
_NEXUS_CLASS_TO_VALUE_CHILDREN = {
- 'NXaperture': (
- (DescriptionType.DESCRIPTION, 'description'),
- ),
- 'NXbeam_stop': (
- (DescriptionType.DESCRIPTION, 'description'),
- ),
- 'NXdetector': (
- (DescriptionType.NAME, 'local_name'),
- (DescriptionType.DESCRIPTION, 'description')
- ),
- 'NXentry': (
- (DescriptionType.TITLE, 'title'),
- ),
- 'NXenvironment': (
- (DescriptionType.NAME, 'short_name'),
- (DescriptionType.NAME, 'name'),
- (DescriptionType.DESCRIPTION, 'description')
- ),
- 'NXinstrument': (
- (DescriptionType.NAME, 'name'),
- ),
- 'NXlog': (
- (DescriptionType.DESCRIPTION, 'description'),
- ),
- 'NXmirror': (
- (DescriptionType.DESCRIPTION, 'description'),
- ),
- 'NXpositioner': (
- (DescriptionType.NAME, 'name'),
+ "NXaperture": ((DescriptionType.DESCRIPTION, "description"),),
+ "NXbeam_stop": ((DescriptionType.DESCRIPTION, "description"),),
+ "NXdetector": (
+ (DescriptionType.NAME, "local_name"),
+ (DescriptionType.DESCRIPTION, "description"),
),
- 'NXprocess': (
- (DescriptionType.PROGRAM, 'program'),
+ "NXentry": ((DescriptionType.TITLE, "title"),),
+ "NXenvironment": (
+ (DescriptionType.NAME, "short_name"),
+ (DescriptionType.NAME, "name"),
+ (DescriptionType.DESCRIPTION, "description"),
),
- 'NXsample': (
- (DescriptionType.TITLE, 'short_title'),
- (DescriptionType.NAME, 'name'),
- (DescriptionType.DESCRIPTION, 'description')
+ "NXinstrument": ((DescriptionType.NAME, "name"),),
+ "NXlog": ((DescriptionType.DESCRIPTION, "description"),),
+ "NXmirror": ((DescriptionType.DESCRIPTION, "description"),),
+ "NXnote": ((DescriptionType.DESCRIPTION, "description"),),
+ "NXpositioner": ((DescriptionType.NAME, "name"),),
+ "NXprocess": ((DescriptionType.PROGRAM, "program"),),
+ "NXsample": (
+ (DescriptionType.TITLE, "short_title"),
+ (DescriptionType.NAME, "name"),
+ (DescriptionType.DESCRIPTION, "description"),
),
- 'NXsample_component': (
- (DescriptionType.NAME, 'name'),
- (DescriptionType.DESCRIPTION, 'description')
+ "NXsample_component": (
+ (DescriptionType.NAME, "name"),
+ (DescriptionType.DESCRIPTION, "description"),
),
- 'NXsensor': (
- (DescriptionType.NAME, 'short_name'),
- (DescriptionType.NAME, 'name')
+ "NXsensor": (
+ (DescriptionType.NAME, "short_name"),
+ (DescriptionType.NAME, "name"),
),
- 'NXsource': (
- (DescriptionType.NAME, 'name'),
+ "NXsource": (
+ (DescriptionType.NAME, "name"),
), # or its 'short_name' attribute... This is not supported
- 'NXsubentry': (
- (DescriptionType.DESCRIPTION, 'definition'),
- (DescriptionType.PROGRAM, 'program_name'),
- (DescriptionType.TITLE, 'title'),
+ "NXsubentry": (
+ (DescriptionType.DESCRIPTION, "definition"),
+ (DescriptionType.PROGRAM, "program_name"),
+ (DescriptionType.TITLE, "title"),
),
}
"""Mapping from NeXus class to child names containing data to use as value"""
@@ -536,19 +545,25 @@ class Hdf5Item(Hdf5Node):
return DescriptionType.ERROR, self.__error
if self.h5Class == silx.io.utils.H5Type.DATASET:
- return DescriptionType.VALUE, self._getFormatter().humanReadableValue(self.obj)
+ return DescriptionType.VALUE, self._getFormatter().humanReadableValue(
+ self.obj
+ )
elif self.isGroupObj() and self.nexusClassName:
# For NeXus groups, try to find a title or name
# By default, look for a title (most application definitions should have one)
- defaultSequence = ((DescriptionType.TITLE, 'title'),)
- sequence = self._NEXUS_CLASS_TO_VALUE_CHILDREN.get(self.nexusClassName, defaultSequence)
+ defaultSequence = ((DescriptionType.TITLE, "title"),)
+ sequence = self._NEXUS_CLASS_TO_VALUE_CHILDREN.get(
+ self.nexusClassName, defaultSequence
+ )
for kind, child_name in sequence:
for index in range(self.childCount()):
child = self.child(index)
- if (isinstance(child, Hdf5Item) and
- child.h5Class == silx.io.utils.H5Type.DATASET and
- child.basename == child_name):
+ if (
+ isinstance(child, Hdf5Item)
+ and child.h5Class == silx.io.utils.H5Type.DATASET
+ and child.basename == child_name
+ ):
return kind, self._getFormatter().humanReadableValue(child.obj)
description = self.obj.attrs.get("desc", None)