2.2.1. Example NeXus programs using NAPI¶
2.2.1.1. NAPI Simple 2-D Write Example (C, F77, F90)¶
Code examples are provided in this section that write 2-D data to a NeXus HDF5 file in C, F77, and F90 languages using the NAPI.
The following code reads a two-dimensional set counts
with dimension scales of t
and phi
using
local routines, and then writes a NeXus file containing a single
NXentry
group and a single NXdata
group.
This is the simplest data file that conforms to the NeXus standard.
The same code is provided in C, F77, and F90 versions.
Compare these code examples with Example NeXus C programs using native HDF5 commands.
NAPI C Example: write simple NeXus file¶
Note
This example uses the signal/axes attributes applied to the data field, as described in Associating plottable data by name using the axes attribute. New code should use the method described in Associating plottable data using attributes applied to the NXdata group.
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 | #include "napi.h"
int main()
{
int counts[50][1000], n_t=1000, n_p=50, dims[2], i;
float t[1000], phi[50];
NXhandle file_id;
/*
* Read in data using local routines to populate phi and counts
*
* for example you may create a getdata() function and call
*
* getdata (n_t, t, n_p, phi, counts);
*/
/* Open output file and output global attributes */
NXopen ("NXfile.nxs", NXACC_CREATE5, &file_id);
NXputattr (file_id, "user_name", "Joe Bloggs", 10, NX_CHAR);
/* Open top-level NXentry group */
NXmakegroup (file_id, "Entry1", "NXentry");
NXopengroup (file_id, "Entry1", "NXentry");
/* Open NXdata group within NXentry group */
NXmakegroup (file_id, "Data1", "NXdata");
NXopengroup (file_id, "Data1", "NXdata");
/* Output time channels */
NXmakedata (file_id, "time_of_flight", NX_FLOAT32, 1, &n_t);
NXopendata (file_id, "time_of_flight");
NXputdata (file_id, t);
NXputattr (file_id, "units", "microseconds", 12, NX_CHAR);
NXclosedata (file_id);
/* Output detector angles */
NXmakedata (file_id, "polar_angle", NX_FLOAT32, 1, &n_p);
NXopendata (file_id, "polar_angle");
NXputdata (file_id, phi);
NXputattr (file_id, "units", "degrees", 7, NX_CHAR);
NXclosedata (file_id);
/* Output data */
dims[0] = n_t;
dims[1] = n_p;
NXmakedata (file_id, "counts", NX_INT32, 2, dims);
NXopendata (file_id, "counts");
NXputdata (file_id, counts);
i = 1;
NXputattr (file_id, "signal", &i, 1, NX_INT32);
NXputattr (file_id, "axes", "polar_angle:time_of_flight", 26, NX_CHAR);
NXclosedata (file_id);
/* Close NXentry and NXdata groups and close file */
NXclosegroup (file_id);
NXclosegroup (file_id);
NXclose (&file_id);
return;
}
|
NAPI F77 Example: write simple NeXus file¶
Note
The F77 interface is no longer being developed.
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 | program WRITEDATA
include 'NAPIF.INC'
integer*4 status, file_id(NXHANDLESIZE), counts(1000,50), n_p, n_t, dims(2)
real*4 t(1000), phi(50)
!Read in data using local routines
call getdata (n_t, t, n_p, phi, counts)
!Open output file
status = NXopen ('NXFILE.NXS', NXACC_CREATE, file_id)
status = NXputcharattr
+ (file_id, 'user', 'Joe Bloggs', 10, NX_CHAR)
!Open top-level NXentry group
status = NXmakegroup (file_id, 'Entry1', 'NXentry')
status = NXopengroup (file_id, 'Entry1', 'NXentry')
!Open NXdata group within NXentry group
status = NXmakegroup (file_id, 'Data1', 'NXdata')
status = NXopengroup (file_id, 'Data1', 'NXdata')
!Output time channels
status = NXmakedata
+ (file_id, 'time_of_flight', NX_FLOAT32, 1, n_t)
status = NXopendata (file_id, 'time_of_flight')
status = NXputdata (file_id, t)
status = NXputcharattr
+ (file_id, 'units', 'microseconds', 12, NX_CHAR)
status = NXclosedata (file_id)
!Output detector angles
status = NXmakedata (file_id, 'polar_angle', NX_FLOAT32, 1, n_p)
status = NXopendata (file_id, 'polar_angle')
status = NXputdata (file_id, phi)
status = NXputcharattr (file_id, 'units', 'degrees', 7, NX_CHAR)
status = NXclosedata (file_id)
!Output data
dims(1) = n_t
dims(2) = n_p
status = NXmakedata (file_id, 'counts', NX_INT32, 2, dims)
status = NXopendata (file_id, 'counts')
status = NXputdata (file_id, counts)
status = NXputattr (file_id, 'signal', 1, 1, NX_INT32)
status = NXputattr
+ (file_id, 'axes', 'polar_angle:time_of_flight', 26, NX_CHAR)
status = NXclosedata (file_id)
!Close NXdata and NXentry groups and close file
status = NXclosegroup (file_id)
status = NXclosegroup (file_id)
status = NXclose (file_id)
stop
end
|
NAPI F90 Example: write simple NeXus file¶
Note
This example uses the signal/axes attributes applied to the data field, as described in Associating plottable data by name using the axes attribute. New code should use the method described in Associating plottable data using attributes applied to the NXdata group.
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 | program WRITEDATA
use NXUmodule
type(NXhandle) :: file_id
integer, pointer :: counts(:,:)
real, pointer :: t(:), phi(:)
!Use local routines to allocate pointers and fill in data
call getlocaldata (t, phi, counts)
!Open output file
if (NXopen ("NXfile.nxs", NXACC_CREATE, file_id) /= NX_OK) stop
if (NXUwriteglobals (file_id, user="Joe Bloggs") /= NX_OK) stop
!Set compression parameters
if (NXUsetcompress (file_id, NX_COMP_LZW, 1000) /= NX_OK) stop
!Open top-level NXentry group
if (NXUwritegroup (file_id, "Entry1", "NXentry") /= NX_OK) stop
!Open NXdata group within NXentry group
if (NXUwritegroup (file_id, "Data1", "NXdata") /= NX_OK) stop
!Output time channels
if (NXUwritedata (file_id, "time_of_flight", t, "microseconds") /= NX_OK) stop
!Output detector angles
if (NXUwritedata (file_id, "polar_angle", phi, "degrees") /= NX_OK) stop
!Output data
if (NXUwritedata (file_id, "counts", counts, "counts") /= NX_OK) stop
if (NXputattr (file_id, "signal", 1) /= NX_OK) stop
if (NXputattr (file_id, "axes", "polar_angle:time_of_flight") /= NX_OK) stop
!Close NXdata group
if (NXclosegroup (file_id) /= NX_OK) stop
!Close NXentry group
if (NXclosegroup (file_id) /= NX_OK) stop
!Close NeXus file
if (NXclose (file_id) /= NX_OK) stop
end program WRITEDATA
|
2.2.1.2. NAPI Python Simple 3-D Write Example¶
A single code example is provided in this section that writes 3-D data to a NeXus HDF5 file in the Python language using the NAPI.
The data to be written to the file is a simple three-dimensional array (2 x 3 x 4) of integers. The single dataset is intended to demonstrate the order in which each value of the array is stored in a NeXus HDF5 data file.
NAPI Python Example: write simple NeXus file¶
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 | #!/usr/bin/python
import sys
import nxs
import numpy
a = numpy.zeros((2,3,4),dtype=numpy.int)
val = 0
for i in range(2):
for j in range(3):
for k in range(4):
a[i,j,k] = val
val = val + 1
nf = nxs.open("simple3D.h5", "w5")
nf.makegroup("entry","NXentry")
nf.opengroup("entry","NXentry")
nf.makegroup("data","NXdata")
nf.opengroup("data","NXdata")
nf.putattr("signal","test")
nf.makedata("test",'int32',[2,3,4])
nf.opendata("test")
nf.putdata(a)
nf.closedata()
nf.closegroup() # NXdata
nf.closegroup() # NXentry
nf.close()
exit
|
2.2.1.3. View a NeXus HDF5 file using h5dump¶
For the purposes of an example, it is instructive to view the content of the
NeXus HDF5 file produced by the above program. Since HDF5 is a binary file
format, we cannot show the contents of the file directly in this manual.
Instead, we first we view the content by showing the output from
the h5dump
tool provided as part of the HDF5 tool kit:
h5dump simple3D.h5
NAPI Python Example: h5dump
output of NeXus HDF5 file¶
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 | HDF5 "simple3D.h5" {
GROUP "/" {
ATTRIBUTE "NeXus_version" {
DATATYPE H5T_STRING {
STRSIZE 5;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SCALAR
DATA {
(0): "4.1.0"
}
}
ATTRIBUTE "file_name" {
DATATYPE H5T_STRING {
STRSIZE 11;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SCALAR
DATA {
(0): "simple3D.h5"
}
}
ATTRIBUTE "HDF5_Version" {
DATATYPE H5T_STRING {
STRSIZE 5;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SCALAR
DATA {
(0): "1.6.6"
}
}
ATTRIBUTE "file_time" {
DATATYPE H5T_STRING {
STRSIZE 24;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SCALAR
DATA {
(0): "2011-11-18 17:26:27+0100"
}
}
GROUP "entry" {
ATTRIBUTE "NX_class" {
DATATYPE H5T_STRING {
STRSIZE 7;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SCALAR
DATA {
(0): "NXentry"
}
}
GROUP "data" {
ATTRIBUTE "NX_class" {
DATATYPE H5T_STRING {
STRSIZE 6;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SCALAR
DATA {
(0): "NXdata"
}
}
DATASET "test" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 2, 3, 4 ) / ( 2, 3, 4 ) }
DATA {
(0,0,0): 0, 1, 2, 3,
(0,1,0): 4, 5, 6, 7,
(0,2,0): 8, 9, 10, 11,
(1,0,0): 12, 13, 14, 15,
(1,1,0): 16, 17, 18, 19,
(1,2,0): 20, 21, 22, 23
}
ATTRIBUTE "signal" {
DATATYPE H5T_STD_I32LE
DATASPACE SCALAR
DATA {
(0): 1
}
}
}
}
}
}
}
|
2.2.1.4. View a NeXus HDF5 file using h5toText.py¶
The output of h5dump
contains a lot of structural information
about the HDF5 file that can distract us from the actual content we added to the file.
Next, we show the output from a custom Python tool (h5toText.py
) built for
this documentation and later moved into the spec2nexus package. [1]
This tool was developed to show the actual data content of an
HDF5 file that we create.
[1] | spec2nexus : http://spec2nexus.readthedocs.org |
NAPI Python Example: h5toText
output of NeXus HDF5 file¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | simple3D.h5:NeXus data file
@NeXus_version = 4.1.0
@file_name = simple3D.h5
@HDF5_Version = 1.6.6
@file_time = 2011-11-18 17:26:27+0100
entry:NXentry
@NX_class = NXentry
data:NXdata
@NX_class = NXdata
test:NX_INT32[2,3,4] = __array
@signal = 1
__array = [
[
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
]
[
[12, 13, 14, 15]
[16, 17, 18, 19]
[20, 21, 22, 23]
]
]
|