summaryrefslogtreecommitdiff
path: root/examples/hdf5widget.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/hdf5widget.py')
-rwxr-xr-xexamples/hdf5widget.py167
1 files changed, 106 insertions, 61 deletions
diff --git a/examples/hdf5widget.py b/examples/hdf5widget.py
index 95607ff..7a8e7ae 100755
--- a/examples/hdf5widget.py
+++ b/examples/hdf5widget.py
@@ -2,7 +2,7 @@
# coding: utf-8
# /*##########################################################################
#
-# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
+# Copyright (c) 2016-2018 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
@@ -50,6 +50,7 @@ import h5py
import silx.gui.hdf5
import silx.utils.html
+from silx.third_party import six
from silx.gui import qt
from silx.gui.data.DataViewerFrame import DataViewerFrame
from silx.gui.widgets.ThreadPoolPushButton import ThreadPoolPushButton
@@ -62,8 +63,13 @@ except ImportError:
_file_cache = {}
+def str_attrs(str_list):
+ """Return a numpy array of unicode strings"""
+ text_dtype = h5py.special_dtype(vlen=six.text_type)
+ return numpy.array(str_list, dtype=text_dtype)
+
+
def get_hdf5_with_all_types():
- global _file_cache
ID = "alltypes"
if ID in _file_cache:
return _file_cache[ID].name
@@ -105,7 +111,6 @@ def get_hdf5_with_all_types():
def get_hdf5_with_all_links():
- global _file_cache
ID = "alllinks"
if ID in _file_cache:
return _file_cache[ID].name
@@ -138,7 +143,6 @@ def get_hdf5_with_all_links():
def get_hdf5_with_1000_datasets():
- global _file_cache
ID = "dataset1000"
if ID in _file_cache:
return _file_cache[ID].name
@@ -157,7 +161,6 @@ def get_hdf5_with_1000_datasets():
def get_hdf5_with_10000_datasets():
- global _file_cache
ID = "dataset10000"
if ID in _file_cache:
return _file_cache[ID].name
@@ -176,7 +179,6 @@ def get_hdf5_with_10000_datasets():
def get_hdf5_with_100000_datasets():
- global _file_cache
ID = "dataset100000"
if ID in _file_cache:
return _file_cache[ID].name
@@ -195,7 +197,6 @@ def get_hdf5_with_100000_datasets():
def get_hdf5_with_recursive_links():
- global _file_cache
ID = "recursive_links"
if ID in _file_cache:
return _file_cache[ID].name
@@ -222,7 +223,6 @@ def get_hdf5_with_recursive_links():
def get_hdf5_with_external_recursive_links():
- global _file_cache
ID = "external_recursive_links"
if ID in _file_cache:
return _file_cache[ID][0].name
@@ -254,7 +254,6 @@ def get_hdf5_with_external_recursive_links():
def get_hdf5_with_nxdata():
- global _file_cache
ID = "nxdata"
if ID in _file_cache:
return _file_cache[ID].name
@@ -267,50 +266,55 @@ def get_hdf5_with_nxdata():
g0d = h5.create_group("scalars")
g0d0 = g0d.create_group("0D_scalar")
- g0d0.attrs["NX_class"] = "NXdata"
- g0d0.attrs["signal"] = "scalar"
+ g0d0.attrs["NX_class"] = u"NXdata"
+ g0d0.attrs["signal"] = u"scalar"
g0d0.create_dataset("scalar", data=10)
g0d1 = g0d.create_group("2D_scalars")
- g0d1.attrs["NX_class"] = "NXdata"
- g0d1.attrs["signal"] = "scalars"
+ g0d1.attrs["NX_class"] = u"NXdata"
+ g0d1.attrs["signal"] = u"scalars"
ds = g0d1.create_dataset("scalars", data=numpy.arange(3*10).reshape((3, 10)))
- ds.attrs["interpretation"] = "scalar"
+ ds.attrs["interpretation"] = u"scalar"
g0d1 = g0d.create_group("4D_scalars")
- g0d1.attrs["NX_class"] = "NXdata"
- g0d1.attrs["signal"] = "scalars"
+ g0d1.attrs["NX_class"] = u"NXdata"
+ g0d1.attrs["signal"] = u"scalars"
ds = g0d1.create_dataset("scalars", data=numpy.arange(2*2*3*10).reshape((2, 2, 3, 10)))
- ds.attrs["interpretation"] = "scalar"
+ ds.attrs["interpretation"] = u"scalar"
# SPECTRA
g1d = h5.create_group("spectra")
g1d0 = g1d.create_group("1D_spectrum")
- g1d0.attrs["NX_class"] = "NXdata"
- g1d0.attrs["signal"] = "count"
- g1d0.attrs["axes"] = "energy_calib"
- g1d0.attrs["uncertainties"] = b"energy_errors",
+ g1d0.attrs["NX_class"] = u"NXdata"
+ g1d0.attrs["signal"] = u"count"
+ g1d0.attrs["auxiliary_signals"] = str_attrs(["count.5", "count2"])
+ g1d0.attrs["axes"] = u"energy_calib"
+ g1d0.attrs["uncertainties"] = str_attrs(["energy_errors"])
g1d0.create_dataset("count", data=numpy.arange(10))
+ g1d0.create_dataset("count.5", data=.5*numpy.arange(10))
+ d2 = g1d0.create_dataset("count2", data=2*numpy.arange(10))
+ d2.attrs["long_name"] = u"count multiplied by 2"
g1d0.create_dataset("energy_calib", data=(10, 5)) # 10 * idx + 5
g1d0.create_dataset("energy_errors", data=3.14*numpy.random.rand(10))
+ g1d0.create_dataset("title", data="Title example provided as dataset")
g1d1 = g1d.create_group("2D_spectra")
- g1d1.attrs["NX_class"] = "NXdata"
- g1d1.attrs["signal"] = "counts"
+ g1d1.attrs["NX_class"] = u"NXdata"
+ g1d1.attrs["signal"] = u"counts"
ds = g1d1.create_dataset("counts", data=numpy.arange(3*10).reshape((3, 10)))
- ds.attrs["interpretation"] = "spectrum"
+ ds.attrs["interpretation"] = u"spectrum"
g1d2 = g1d.create_group("4D_spectra")
- g1d2.attrs["NX_class"] = "NXdata"
- g1d2.attrs["signal"] = "counts"
- g1d2.attrs["axes"] = b"energy",
+ g1d2.attrs["NX_class"] = u"NXdata"
+ g1d2.attrs["signal"] = u"counts"
+ g1d2.attrs["axes"] = str_attrs(["energy"])
ds = g1d2.create_dataset("counts", data=numpy.arange(2*2*3*10).reshape((2, 2, 3, 10)))
- ds.attrs["interpretation"] = "spectrum"
- ds = g1d2.create_dataset("errors", data=4.5*numpy.random.rand(2, 2, 3, 10))
+ ds.attrs["interpretation"] = u"spectrum"
+ g1d2.create_dataset("errors", data=4.5*numpy.random.rand(2, 2, 3, 10))
ds = g1d2.create_dataset("energy", data=5+10*numpy.arange(15),
shuffle=True, compression="gzip")
- ds.attrs["long_name"] = "Calibrated energy"
+ ds.attrs["long_name"] = u"Calibrated energy"
ds.attrs["first_good"] = 3
ds.attrs["last_good"] = 12
g1d2.create_dataset("energy_errors", data=10*numpy.random.rand(15))
@@ -319,34 +323,54 @@ def get_hdf5_with_nxdata():
g2d = h5.create_group("images")
g2d0 = g2d.create_group("2D_regular_image")
- g2d0.attrs["NX_class"] = "NXdata"
- g2d0.attrs["signal"] = "image"
- g2d0.attrs["axes"] = b"rows_calib", b"columns_coordinates"
+ g2d0.attrs["NX_class"] = u"NXdata"
+ g2d0.attrs["signal"] = u"image"
+ g2d0.attrs["auxiliary_signals"] = str_attrs(["image2", "image3"])
+ g2d0.attrs["axes"] = str_attrs(["rows_calib", "columns_coordinates"])
+ g2d0.attrs["title"] = u"Title example provided as group attr"
g2d0.create_dataset("image", data=numpy.arange(4*6).reshape((4, 6)))
+ g2d0.create_dataset("image2", data=1/(1.+numpy.arange(4*6).reshape((4, 6))))
+ ds = g2d0.create_dataset("image3", data=-numpy.arange(4*6).reshape((4, 6)))
+ ds.attrs["long_name"] = u"3rd image (2nd auxiliary)"
ds = g2d0.create_dataset("rows_calib", data=(10, 5))
- ds.attrs["long_name"] = "Calibrated Y"
+ ds.attrs["long_name"] = u"Calibrated Y"
g2d0.create_dataset("columns_coordinates", data=0.5+0.02*numpy.arange(6))
+ g2d4 = g2d.create_group("RGBA_image")
+ g2d4.attrs["NX_class"] = u"NXdata"
+ g2d4.attrs["signal"] = u"image"
+ g2d4.attrs["auxiliary_signals"] = u"squared image"
+ g2d4.attrs["axes"] = str_attrs(["rows_calib", "columns_coordinates"])
+ rgba_image = numpy.linspace(0, 1, num=7*8*3).reshape((7, 8, 3))
+ rgba_image[:, :, 1] = 1 - rgba_image[:, :, 1] # invert G channel to add some color
+ ds = g2d4.create_dataset("image", data=rgba_image)
+ ds.attrs["interpretation"] = u"rgba-image"
+ ds = g2d4.create_dataset("squared image", data=rgba_image**2)
+ ds.attrs["interpretation"] = u"rgba-image"
+ ds = g2d4.create_dataset("rows_calib", data=(10, 5))
+ ds.attrs["long_name"] = u"Calibrated Y"
+ g2d4.create_dataset("columns_coordinates", data=0.5+0.02*numpy.arange(8))
+
g2d1 = g2d.create_group("2D_irregular_data")
- g2d1.attrs["NX_class"] = "NXdata"
- g2d1.attrs["signal"] = "data"
- g2d1.attrs["axes"] = b"rows_coordinates", b"columns_coordinates"
+ g2d1.attrs["NX_class"] = u"NXdata"
+ g2d1.attrs["signal"] = u"data"
+ g2d1.attrs["axes"] = str_attrs(["rows_coordinates", "columns_coordinates"])
g2d1.create_dataset("data", data=numpy.arange(64*128).reshape((64, 128)))
g2d1.create_dataset("rows_coordinates", data=numpy.arange(64) + numpy.random.rand(64))
g2d1.create_dataset("columns_coordinates", data=numpy.arange(128) + 2.5 * numpy.random.rand(128))
g2d2 = g2d.create_group("3D_images")
- g2d2.attrs["NX_class"] = "NXdata"
- g2d2.attrs["signal"] = "images"
+ g2d2.attrs["NX_class"] = u"NXdata"
+ g2d2.attrs["signal"] = u"images"
ds = g2d2.create_dataset("images", data=numpy.arange(2*4*6).reshape((2, 4, 6)))
- ds.attrs["interpretation"] = "image"
+ ds.attrs["interpretation"] = u"image"
g2d3 = g2d.create_group("5D_images")
- g2d3.attrs["NX_class"] = "NXdata"
- g2d3.attrs["signal"] = "images"
- g2d3.attrs["axes"] = b"rows_coordinates", b"columns_coordinates"
+ g2d3.attrs["NX_class"] = u"NXdata"
+ g2d3.attrs["signal"] = u"images"
+ g2d3.attrs["axes"] = str_attrs(["rows_coordinates", "columns_coordinates"])
ds = g2d3.create_dataset("images", data=numpy.arange(2*2*2*4*6).reshape((2, 2, 2, 4, 6)))
- ds.attrs["interpretation"] = "image"
+ ds.attrs["interpretation"] = u"image"
g2d3.create_dataset("rows_coordinates", data=5+10*numpy.arange(4))
g2d3.create_dataset("columns_coordinates", data=0.5+0.02*numpy.arange(6))
@@ -354,42 +378,65 @@ def get_hdf5_with_nxdata():
g = h5.create_group("scatters")
gd0 = g.create_group("x_y_scatter")
- gd0.attrs["NX_class"] = "NXdata"
- gd0.attrs["signal"] = "y"
- gd0.attrs["axes"] = b"x",
+ gd0.attrs["NX_class"] = u"NXdata"
+ gd0.attrs["signal"] = u"y"
+ gd0.attrs["axes"] = str_attrs(["x"])
+ gd0.attrs["title"] = u"simple y = f(x) scatters cannot be distinguished from curves"
gd0.create_dataset("y", data=numpy.random.rand(128) - 0.5)
gd0.create_dataset("x", data=2*numpy.random.rand(128))
gd0.create_dataset("x_errors", data=0.05*numpy.random.rand(128))
gd0.create_dataset("errors", data=0.05*numpy.random.rand(128))
gd1 = g.create_group("x_y_value_scatter")
- gd1.attrs["NX_class"] = "NXdata"
- gd1.attrs["signal"] = "values"
- gd1.attrs["axes"] = b"x", b"y"
+ gd1.attrs["NX_class"] = u"NXdata"
+ gd1.attrs["signal"] = u"values"
+ gd1.attrs["auxiliary_signals"] = str_attrs(["values.5", "values2"])
+ gd1.attrs["axes"] = str_attrs(["x", "y"])
+ gd1.attrs["title"] = u"x, y, values scatter with asymmetric y_errors"
gd1.create_dataset("values", data=3.14*numpy.random.rand(128))
+ gd1.create_dataset("values.5", data=0.5*3.14*numpy.random.rand(128))
+ gd1.create_dataset("values2", data=2.*3.14*numpy.random.rand(128))
gd1.create_dataset("y", data=numpy.random.rand(128))
- gd1.create_dataset("y_errors", data=0.02*numpy.random.rand(128))
- gd1.create_dataset("x", data=numpy.random.rand(128))
+ y_errors = [0.03*numpy.random.rand(128), 0.04*numpy.random.rand(128)]
+ gd1.create_dataset("y_errors", data=y_errors)
+ ds = gd1.create_dataset("x", data=2*numpy.random.rand(128))
+ ds.attrs["long_name"] = u"horizontal axis"
gd1.create_dataset("x_errors", data=0.02*numpy.random.rand(128))
# NDIM > 3
g = h5.create_group("cubes")
gd0 = g.create_group("3D_cube")
- gd0.attrs["NX_class"] = "NXdata"
- gd0.attrs["signal"] = "cube"
- gd0.attrs["axes"] = b"img_idx", b"rows_coordinates", b"cols_coordinates"
+ gd0.attrs["NX_class"] = u"NXdata"
+ gd0.attrs["signal"] = u"cube"
+ gd0.attrs["axes"] = str_attrs(["img_idx", "rows_coordinates", "cols_coordinates"])
gd0.create_dataset("cube", data=numpy.arange(4*5*6).reshape((4, 5, 6)))
gd0.create_dataset("img_idx", data=numpy.arange(4))
gd0.create_dataset("rows_coordinates", data=0.1*numpy.arange(5))
gd0.create_dataset("cols_coordinates", data=[0.2, 0.3]) # linear calibration
gd1 = g.create_group("5D")
- gd1.attrs["NX_class"] = "NXdata"
- gd1.attrs["signal"] = "hypercube"
+ gd1.attrs["NX_class"] = u"NXdata"
+ gd1.attrs["signal"] = u"hypercube"
gd1.create_dataset("hypercube",
data=numpy.arange(2*3*4*5*6).reshape((2, 3, 4, 5, 6)))
+ # invalid NXdata
+ g = h5.create_group("invalid")
+ g0 = g.create_group("invalid NXdata")
+ g0.attrs["NX_class"] = u"NXdata"
+
+ g1 = g.create_group("invalid NXentry")
+ g1.attrs["NX_class"] = u"NXentry"
+ g1.attrs["default"] = u"missing NXdata group"
+
+ g2 = g.create_group("invalid NXroot")
+ g2.attrs["NX_class"] = u"NXroot"
+ g2.attrs["default"] = u"invalid NXentry in NXroot"
+ g20 = g2.create_group("invalid NXentry in NXroot")
+ g20.attrs["NX_class"] = u"NXentry"
+ g20.attrs["default"] = u"missing NXdata group"
+
h5.close()
_file_cache[ID] = tmp
@@ -397,7 +444,6 @@ def get_hdf5_with_nxdata():
def get_edf_with_all_types():
- global _file_cache
ID = "alltypesedf"
if ID in _file_cache:
return _file_cache[ID].name
@@ -422,7 +468,6 @@ def get_edf_with_all_types():
def get_edf_with_100000_frames():
- global _file_cache
ID = "frame100000"
if ID in _file_cache:
return _file_cache[ID].name
@@ -586,7 +631,7 @@ class Hdf5TreeViewExample(qt.QMainWindow):
hasDataset = True
break
- if len(menu.children()):
+ if not menu.isEmpty():
menu.addSeparator()
if hasDataset:
@@ -602,7 +647,7 @@ class Hdf5TreeViewExample(qt.QMainWindow):
selectedObjects = event.source().selectedH5Nodes()
menu = event.menu()
- if len(menu.children()):
+ if not menu.isEmpty():
menu.addSeparator()
for obj in selectedObjects: