HDF5 in MATLAB¶
- author:
Paul Kienzle, NIST
Note
Editor’s Note: These files were copied directly from an older version of the NeXus documentation (DocBook) and have not been checked that they will run under current Matlab versions.
input.dat
¶
This is the same data used with HDF5 in Python.
117.92608 1037
217.92591 1318
317.92575 1704
417.92558 2857
517.92541 4516
617.92525 9998
717.92508 23819
817.92491 31662
917.92475 40458
1017.92458 49087
1117.92441 56514
1217.92425 63499
1317.92408 66802
1417.92391 66863
1517.92375 66599
1617.92358 66206
1717.92341 65747
1817.92325 65250
1917.92308 64129
2017.92291 63044
2117.92275 60796
2217.92258 56795
2317.92241 51550
2417.92225 43710
2517.92208 29315
2617.92191 19782
2717.92175 12992
2817.92158 6622
2917.92141 4198
3017.92125 2248
3117.92108 1321
writing data¶
basic_writer.m: Write a NeXus HDF5 file using Matlab
1% Writes a NeXus HDF5 file using matlab
2
3disp 'Write a NeXus HDF5 file'
4filename = 'prj_test.nexus.hdf5';
5timestamp = '2010-10-18T17:17:04-0500';
6
7% read input data
8A = load('input.dat');
9mr = A(:,1);
10I00 = int32(A(:,2));
11
12% clear out old file, if it exists
13
14delete(filename);
15
16% using the simple h5 interface, there is no way to create a group without
17% first creating a dataset; creating the dataset creates all intervening
18% groups.
19
20% store x
21h5create(filename,'/entry/mr_scan/mr',[length(mr)]);
22h5write(filename,'/entry/mr_scan/mr',mr);
23h5writeatt(filename,'/entry/mr_scan/mr','units','degrees');
24h5writeatt(filename,'/entry/mr_scan/mr','long_name','USAXS mr (degrees)');
25
26% store y
27h5create(filename,'/entry/mr_scan/I00',[length(I00)],'DataType','int32');
28h5write(filename,'/entry/mr_scan/I00',I00);
29h5writeatt(filename,'/entry/mr_scan/I00','units','counts');
30h5writeatt(filename,'/entry/mr_scan/I00','long_name','USAXS I00 (counts)');
31
32% indicate that we are plotting y vs. x
33h5writeatt(filename,'/','default','entry');
34h5writeatt(filename,'/entry','default','mr_scan');
35h5writeatt(filename,'/entry/mr_scan','signal','I00');
36h5writeatt(filename,'/entry/mr_scan','axes','mr_scan');
37h5writeatt(filename,'/entry/mr_scan','mr_scan_indices', int32(0));
38
39% add NeXus metadata
40h5writeatt(filename,'/','file_name',filename);
41h5writeatt(filename,'/','file_time',timestamp);
42h5writeatt(filename,'/','instrument','APS USAXS at 32ID-B');
43h5writeatt(filename,'/','creator','basic_writer.m');
44h5writeatt(filename,'/','NeXus_version','4.3.0');
45h5writeatt(filename,'/','HDF5_Version','1.6'); % no 1.8 features used in this example
46h5writeatt(filename,'/entry','NX_class','NXentry');
47h5writeatt(filename,'/entry/mr_scan','NX_class','NXdata');
48
49
50h5disp(filename);
reading data¶
basic_reader.m: Read a NeXus HDF5 file using Matlab
1% Reads NeXus HDF5 file and print the contents
2
3filename = 'prj_test.nexus.hdf5';
4root = h5info(filename,'/');
5attrs = root.Attributes;
6for i = 1:length(attrs)
7 fprintf('%s: %s\n', attrs(i).Name, attrs(i).Value);
8end
9mr = h5read(filename,'/entry/mr_scan/mr');
10i00 = h5read(filename, '/entry/mr_scan/I00');
11fprintf('#\t%s\t%s\n','mr','I00');
12for i = 1:length(mr)
13 fprintf('%d\t%g\t%d\n', i, mr(i), i00(i));
14end
writing data file with links¶
writer_2_1.m: Write a NeXus HDF5 file with links
1% Writes a simple NeXus HDF5 file with links
2% according to the example from Figure 2.1 in the Design chapter
3
4filename = 'writer_2_1.hdf5';
5
6% read input data
7A = load('input.dat');
8two_theta = A(:,1);
9counts = int32(A(:,2));
10
11% clear out old file, if it exists
12delete(filename);
13
14% store x
15h5create(filename,'/entry/instrument/detector/two_theta',[length(two_theta)]);
16h5write(filename,'/entry/instrument/detector/two_theta',two_theta);
17h5writeatt(filename,'/entry/instrument/detector/two_theta','units','degrees');
18
19% store y
20h5create(filename,'/entry/instrument/detector/counts',[length(counts)],'DataType','int32');
21h5write(filename,'/entry/instrument/detector/counts',counts);
22h5writeatt(filename,'/entry/instrument/detector/counts','units','counts');
23
24% create group NXdata with links to detector
25% note: requires the additional file h5link.m
26h5link(filename,'/entry/instrument/detector/two_theta','/entry/data/two_theta');
27h5link(filename,'/entry/instrument/detector/counts','/entry/data/counts');
28
29% indicate that we are plotting y vs. x
30h5writeatt(filename,'/','default','entry');
31h5writeatt(filename,'/entry','default','data');
32h5writeatt(filename,'/entry/data','signal','counts');
33h5writeatt(filename,'/entry/data','axes','two_theta');
34h5writeatt(filename,'/entry/data','two_theta_indices',int32(0));
35
36% add NeXus metadata
37h5writeatt(filename,'/','file_name',filename);
38h5writeatt(filename,'/','file_time',timestamp);
39h5writeatt(filename,'/','instrument','APS USAXS at 32ID-B');
40h5writeatt(filename,'/','creator','writer_2_1.m');
41h5writeatt(filename,'/','NeXus_version','4.3.0');
42h5writeatt(filename,'/','HDF5_Version','1.6'); % no 1.8 features used in this example
43h5writeatt(filename,'/entry','NX_class','NXentry');
44h5writeatt(filename,'/entry/instrument','NX_class','NXinstrument');
45h5writeatt(filename,'/entry/instrument/detector','NX_class','NXdetector');
46h5writeatt(filename,'/entry/data','NX_class','NXdata');
47
48% show structure of the file that was created
49h5disp(filename);
h5link.m: support module for creating NeXus-style HDF5 hard links
1function h5link(filename, from, to)
2%H5LINK Create link to an HDF5 dataset.
3% H5LINK(FILENAME,SOURCE,TARGET) creates an HDF5 link from the
4% dataset at location SOURCE to a dataset at location TARGET. All
5% intermediate groups in the path to target are created.
6%
7% Example: create a link from /hello/world to /goodbye/world
8% h5create('myfile.h5','/hello/world',[100 200]);
9% h5link('myfile.h5','/hello/world','/goodbye/world');
10% hgdisp('myfile.h5');
11%
12% See also: h5create, h5read, h5write, h5info, h5disp
13
14% split from and to into group/dataset
15idx = strfind(from,'/');
16from_path = from(1:idx(end)-1);
17from_data = from(idx(end)+1:end);
18idx = strfind(to,'/');
19to_path = to(1:idx(end)-1);
20to_data = to(idx(end)+1:end);
21
22% open the HDF file
23fid = H5F.open(filename,'H5F_ACC_RDWR','H5P_DEFAULT');
24
25% create target group if it doesn't already exist
26create_intermediate = H5P.create('H5P_LINK_CREATE');
27H5P.set_create_intermediate_group(create_intermediate, 1);
28try
29 H5G.create(fid,to_path,create_intermediate,'H5P_DEFAULT','H5P_DEFAULT');
30catch
31end
32H5P.close(create_intermediate);
33
34% open groups and create link
35from_id = H5G.open(fid, from_path);
36to_id = H5G.open(fid, to_path);
37H5L.create_hard(from_id, from_data, to_id, to_data, 'H5P_DEFAULT','H5P_DEFAULT');
38
39% close all
40H5G.close(from_id);
41H5G.close(to_id);
42H5F.close(fid);
43end
Downloads¶
file |
description |
---|---|
two-column text data file, also used in other examples |
|
writes a NeXus HDF5 file using |
|
reads the NeXus HDF5 file written by |
|
support module for creating NeXus-style HDF5 hard links |
|
like |