2.1.5. HDF5 in Fortran with NAPI

Code examples are provided in this section that write 2-D data to a NeXus HDF5 file in F77, and F90 languages using the NAPI: NeXus Application Programmer Interface (frozen).

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.

2.1.5.1. NAPI F77 Example: write simple NeXus file

Note

The F77 interface is no longer being developed.

 1      program WRITEDATA
 2      
 3      include 'NAPIF.INC'
 4      integer*4 status, file_id(NXHANDLESIZE), counts(1000,50), n_p, n_t, dims(2)
 5      real*4 t(1000), phi(50)
 6
 7!Read in data using local routines
 8      call getdata (n_t, t, n_p, phi, counts)
 9!Open output file
10      status = NXopen ('NXFILE.NXS', NXACC_CREATE, file_id)
11        status = NXputcharattr 
12     +         (file_id, 'user', 'Joe Bloggs', 10, NX_CHAR)
13!Open top-level NXentry group
14        status = NXmakegroup (file_id, 'Entry1', 'NXentry')
15        status = NXopengroup (file_id, 'Entry1', 'NXentry')
16!Open NXdata group within NXentry group
17          status = NXmakegroup (file_id, 'Data1', 'NXdata')
18          status = NXopengroup (file_id, 'Data1', 'NXdata')
19!Output time channels
20            status = NXmakedata 
21     +         (file_id, 'time_of_flight', NX_FLOAT32, 1, n_t)
22            status = NXopendata (file_id, 'time_of_flight')
23              status = NXputdata (file_id, t)
24              status = NXputcharattr 
25     +         (file_id, 'units', 'microseconds', 12, NX_CHAR)
26            status = NXclosedata (file_id)
27!Output detector angles
28            status = NXmakedata (file_id, 'polar_angle', NX_FLOAT32, 1, n_p)
29            status = NXopendata (file_id, 'polar_angle')
30              status = NXputdata (file_id, phi)
31              status = NXputcharattr (file_id, 'units', 'degrees', 7, NX_CHAR)
32            status = NXclosedata (file_id)
33!Output data
34            dims(1) = n_t
35            dims(2) = n_p
36            status = NXmakedata (file_id, 'counts', NX_INT32, 2, dims)
37            status = NXopendata (file_id, 'counts')
38              status = NXputdata (file_id, counts)
39              status = NXputattr (file_id, 'signal', 1, 1, NX_INT32)
40              status = NXputattr
41     +          (file_id, 'axes', 'polar_angle:time_of_flight', 26, NX_CHAR)
42            status = NXclosedata (file_id)
43!Close NXdata and NXentry groups and close file
44          status = NXclosegroup (file_id)
45        status = NXclosegroup (file_id)
46      status = NXclose (file_id)
47
48      stop
49      end

2.1.5.2. 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.

 1program WRITEDATA
 2      
 3   use NXUmodule
 4
 5   type(NXhandle) :: file_id
 6   integer, pointer :: counts(:,:)
 7   real, pointer :: t(:), phi(:)
 8
 9!Use local routines to allocate pointers and fill in data
10   call getlocaldata (t, phi, counts)
11!Open output file
12   if (NXopen ("NXfile.nxs", NXACC_CREATE, file_id) /= NX_OK) stop
13   if (NXUwriteglobals (file_id, user="Joe Bloggs") /= NX_OK) stop
14!Set compression parameters
15   if (NXUsetcompress (file_id, NX_COMP_LZW, 1000) /= NX_OK) stop
16!Open top-level NXentry group
17   if (NXUwritegroup (file_id, "Entry1", "NXentry") /= NX_OK) stop
18   !Open NXdata group within NXentry group
19      if (NXUwritegroup (file_id, "Data1", "NXdata") /= NX_OK) stop
20   !Output time channels
21         if (NXUwritedata (file_id, "time_of_flight", t, "microseconds") /= NX_OK) stop
22   !Output detector angles
23         if (NXUwritedata (file_id, "polar_angle", phi, "degrees") /= NX_OK) stop
24   !Output data
25         if (NXUwritedata (file_id, "counts", counts, "counts") /= NX_OK) stop
26            if (NXputattr (file_id, "signal", 1) /= NX_OK) stop
27            if (NXputattr (file_id, "axes", "polar_angle:time_of_flight") /= NX_OK) stop
28   !Close NXdata group
29      if (NXclosegroup (file_id) /= NX_OK) stop
30!Close NXentry group
31   if (NXclosegroup (file_id) /= NX_OK) stop
32!Close NeXus file
33   if (NXclose (file_id) /= NX_OK) stop
34
35end program WRITEDATA