diff options
Diffstat (limited to 'examples/hdf5widget.py')
-rwxr-xr-x | examples/hdf5widget.py | 167 |
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: |