summaryrefslogtreecommitdiff
path: root/doc/source/modules/gui/hdf5/getting_started.rst
blob: e843cac838faa35ab74704103d3aa77eb39798b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
.. currentmodule:: silx.gui.hdf5

Getting started with HDF5 widgets
=================================

Silx provides an implementation of a tree model and a tree view for HDF5 files.
The aim of this tree is to provide a convenient read-only widget for a big
amount of data and supporting file formats often used in synchrotrons.

This page provides some source code to show how to use this widget.

Commented source code
---------------------

Import and create your tree view
++++++++++++++++++++++++++++++++

HDF5 widgets are all exposed by the package `silx.gui.hdf5`.

.. testsetup:: *

   from silx.gui import qt
   app = qt.QApplication([])
   import silx.gui.hdf5
   treeview = silx.gui.hdf5.Hdf5TreeView()
   header = treeview.header()
   model = treeview.findHdf5TreeModel()

.. testcode::

   import silx.gui.hdf5
   treeview = silx.gui.hdf5.Hdf5TreeView()

Custom your tree view
+++++++++++++++++++++

The tree view can be customized to be sorted by default.

.. testcode::

   # Sort content of files by time or name
   treeview.setSortingEnabled(True)

The model can be customized to support mouse interaction.
A convenient method :meth:`Hdf5TreeView.findHdf5TreeModel` returns the main
HDF5 model used through proxy models.

.. testcode::

   model = treeview.findHdf5TreeModel()

   # Avoid the user to drop file in the widget
   model.setFileDropEnabled(False)

   # Allow the user to reorder files with drag-and-drop
   model.setFileMoveEnabled(True)

The tree view is also provided with a custom header which help to choose
visible columns.

.. testcode::

   header = treeview.header()

   # Select displayed columns
   column_ids = [treeview.findHdf5TreeModel().NAME_COLUMN]
   header.setSections(column_ids)

   # Do not allow the user to custom visible columns
   header.setEnableHideColumnsPopup(False)

Add a file by name
++++++++++++++++++

The model can be used to add HDF5. It is internally using
:func:`silx.io.open`.

.. code-block:: python

   model.insertFile("test.h5")

Add a file with h5py
++++++++++++++++++++

The model internally uses :mod:`h5py` object API. We can use h5py file, group
and dataset as it is.

.. code-block:: python

   import h5py
   h5 = h5py.File("test.h5")

   # We can use file
   model.insertH5pyObject(h5)

   # or group or dataset
   model.insertH5pyObject(h5["group1"])
   model.insertH5pyObject(h5["group1/dataset50"])

Add a file with silx
++++++++++++++++++++

Silx also provides an input API. It supports HDF5 files through :mod:`h5py`.

.. code-block:: python

   import silx.io

   # We can load HDF5 files
   model.insertH5pyObject(silx.io.open("test.h5"))

   # or Spec files
   model.insertH5pyObject(silx.io.open("test.dat"))


Custom context menu
+++++++++++++++++++

The :class:`Hdf5TreeView` provides a callback API to populate the context menu.
The callback receives a :class:`Hdf5ContextMenuEvent` every time the user
requests the context menu. The event contains :class:`H5Node` objects which wrap
h5py objects with extra information.

.. testcode::

   def my_action_callback(obj):
      # do what you want
      pass

   def my_callback(event):
      objects = list(event.source().selectedH5Nodes())
      obj = objects[0]  # for single selection

      menu = event.menu()
      if obj.ntype is h5py.Dataset:
         action = qt.QAction("My funky action on datasets only", menu)
         action.triggered.connect(lambda: my_action_callback(obj))
         menu.addAction(action)

   treeview.addContextMenuCallback(my_callback)

Capture selection
+++++++++++++++++

The :class:`Hdf5TreeView` widget provides default Qt signals inherited from
`QAbstractItemView`.

- `activated`:
      This signal is emitted when the item specified by index is
      activated by the user. How to activate items depends on the platform;
      e.g., by single- or double-clicking the item, or by pressing the
      Return or Enter key when the item is current.
- `clicked`:
      This signal is emitted when a mouse button is clicked. The item the mouse
      was clicked on is specified by index. The signal is only emitted when the
      index is valid.
- `doubleClicked`:
      This signal is emitted when a mouse button is double-clicked. The item
      the mouse was double-clicked on is specified by index. The signal is
      only emitted when the index is valid.
- `entered`:
      This signal is emitted when the mouse cursor enters the item specified by
      index. Mouse tracking needs to be enabled for this feature to work.
- `pressed`:
      This signal is emitted when a mouse button is pressed. The item the mouse
      was pressed on is specified by index. The signal is only emitted when the
      index is valid.

The method :meth:`Hdf5TreeView.selectedH5Nodes` returns an iterator of :class:`H5Node`
objects which wrap h5py objects with extra information.

.. testcode::

   def my_callback(index):
       objects = list(treeview.selectedH5Nodes())
       obj = objects[0]  # for single selection

       print(obj)

       print(obj.basename)             # not provided by h5py
       print(obj.name)
       print(obj.file.filename)

       print(obj.local_basename)       # not provided by h5py
       print(obj.local_name)           # not provided by h5py
       print(obj.local_file.filename)  # not provided by h5py

       print(obj.attrs)

       if obj.ntype is h5py.Dataset:
           print(obj.dtype)
           print(obj.shape)
           print(obj.value)        # create a copy of data of the dataset
           print(obj.h5py_object)  # reference to the Hdf5 dataset (or group)

   treeview.clicked.connect(my_callback)

Example
-------

.. toctree::
   :hidden:

   examples_hdf5widget.rst

The :doc:`examples_hdf5widget` sample code provides an example of properties of
the view, the model and the header.

.. image:: img/Hdf5Example.png
   :height: 200px
   :width: 400px
   :alt: Example for HDF5TreeView features
   :align: center

Source code: :doc:`examples_hdf5widget`.

After installing `silx` and downloading the script, you can start it from the
command prompt:

.. code-block:: bash

   python hdf5widget.py <files>

This example loads files added to the command line, or files dropped from the
file system. It also provides a GUI to display test files created
programmatically.