Writing an HDF file with C, FORTRAN, Python, MATLAB and R

Language

HDF4

Python

import numpy
from pyhdf.SD import SD, SDC
 
# Open file for writing
fileName = "SDS.hdf"
filehdf  = SD(fileName, SDC.WRITE | SDC.CREATE)
 
# Init the data buffer to write : a vector of values from 0 to 24, separated by 1
data = numpy.arange(25)
# Make it a 2D array
data.shape = (5, 5)
 
# Create the dataset : set its name, data type et dimensions
sds_name = "SDStemplate"
sds = filehdf.create(sds_name, SDC.INT32, data.shape)
 
# Write the data to it
sds[:] = data
 
# Terminate access to the data set
sds.endaccess()
 
# Close the file
filehdf.end()

C

#include "mfhdf.h"
#define FILE_NAME "SDS.hdf"
#define SDS_NAME  "SDStemplate"
#define X_LENGTH  5
#define Y_LENGTH  5
 
main( )
{
    /************************* Variable declaration **************************/
    int32 sd_id, sds_id, sds_index;
    intn  status;
    int32 start[2], edges[2];
    int32 data[Y_LENGTH][X_LENGTH];
    int   i, j;
    /********************* End of variable declaration ***********************/
 
    /*
    * Data set data initialization.
    */
    for ( j = 0; j < Y_LENGTH; j++ ) {
        for ( i = 0; i < X_LENGTH; i++ )
            data[j][i] = ( i + j ) + 1;
    }
 
    /*
    * Open the file and initialize the SD interface.
    */
    sd_id = SDstart ( FILE_NAME, DFACC_WRITE );
    /*
     * Attach to the first data set.
    */
    sds_index = 0;
    sds_id = SDselect ( sd_id, sds_index );
    /*
    * Define the location and size of the data to be written to the data set.
    */
    start[0] = 0;
    start[1] = 0;
    edges[0] = Y_LENGTH;
    edges[1] = X_LENGTH;
 
    /*
    * Write the stored data to the data set. The third argument is set to NULL
    * to specify contiguous data elements. The last argument must
    * be explicitly cast to a generic pointer since SDwritedata is designed
    * to write generic data.
    */
    status = SDwritedata ( sds_id, start, NULL, edges, ( VOIDP ) data );
    /*
    * Terminate access to the data set.
    */
    status = SDendaccess ( sds_id );
    /*
    * Terminate access to the SD interface and close the file.
    */
    status = SDend ( sd_id );
}

FORTRAN

program  write_dataprogram  write_data
    implicit none
 
C
C     Parameter declaration.
C
    character * 7  FILE_NAME
    character * 11 SDS_NAME
    integer      X_LENGTH, Y_LENGTH, RANK
    parameter   ( FILE_NAME = "SDS.hdf",
    +             SDS_NAME  = "SDStemplate",
    +             X_LENGTH  = 5,
    +             Y_LENGTH  = 16,
    +             RANK      = 2 )
    integer       DFACC_WRITE, DFNT_INT32
    parameter   ( DFACC_WRITE = 2,
    +             DFNT_INT32  = 24 )
 
C
C     Function declaration.
C
    integer sfstart, sfselect, sfwdata, sfendacc, sfend
 
C**** Variable declaration *******************************************
C
    integer sd_id, sds_id, sds_index, status
    integer start ( 2 ), edges ( 2 ), stride ( 2 )
    integer i, j
    integer data( X_LENGTH, Y_LENGTH )
C
C**** End of variable declaration ************************************
C
 
C
C     Data set data initialization.
C
    do  20 j = 1, Y_LENGTH
        do  10 i = 1, X_LENGTH
            data ( i, j ) = i + j - 1
 10         continue
 20     continue
 
C
C     Open the file and initialize the SD interface.
C
    sd_id = sfstart( FILE_NAME, DFACC_WRITE )
C
C     Attach to the first data set.
C
    sds_index = 0
    sds_id = sfselect(sd_id, sds_index)
C
C     Define the location and size of the data to be written
C     to the data set. Note that setting values of the array stride to 1
C     specifies the contiguous writing of data.
C
    start  ( 1 ) = 0
    start  ( 2 ) = 0
    edges  ( 1 ) = X_LENGTH
    edges  ( 2 ) = Y_LENGTH
    stride ( 1 ) = 1
    stride ( 2 ) = 1
C
C     Write the stored data to the data set named in SDS_NAME.
C     Note that the routine sfwdata is used instead of sfwcdata
C     to write the numeric data.
C
    status = sfwdata ( sds_id, start, stride, edges, data )
C
C     Terminate access to the data set.
C
    status = sfendacc ( sds_id )
C
C     Terminate access to the SD interface and close the file.
C
    status = sfend ( sd_id )
    end

MATLAB

file_name = 'sds.hdf';
sds_name = 'a_sds';
 
% Open an existing hdf file or create it
sd_id = hdfsd( 'start',file_name , 'write');
if sd_id == -1
    sd_id = hdfsd( 'start', file_name, 'DFACC_CREATE');
end
 
 
% Create a dataset with its name, data type, rank and dimensions
data = [0 0 0; 1 1 1; 2 2 2; 3 3 3];
data_type = 'double';
rank = ndims(data);
dimsizes  = fliplr(size(data));
sds_id = hdfsd('create', sd_id, sds_name, data_type, rank, dimsizes);
 
 
% Write data to hdf file
sds_start = zeros(1,  ndims(data));
sds_stride = [] ;
sds_edges = fliplr(size(data));
status = hdfsd('writedata', sds_id, sds_start, sds_stride,  sds_edges, data) ;
 
 
% Close access to the sds
status = hdfsd('endaccess',sds_id);
 
 
% Close access to the hdf file
status = hdfsd('end',sd_id);

HDF5

MATLAB

filename = 'test.h5';
 
% Create the file
fid = H5F.create(filename);
% Create a group
gid = H5G.create(fid, 'group','H5P_DEFAULT');
% Create a dataset
fid = H5F.open(filename);
h5create(filename, '/group/sds1', [2 7],'Datatype', 'double','FillValue',5.5);
 
% Add attributes
h5writeatt(filename, '/group', 'Description', 'this is a group');
h5writeatt(filename, '/', 'Description', 'this is an example');
 
% Write data
h5write(filename,  '/group/sds1', [1 2 1 1 1 1 1 ;3  5 0 0 0 0 0]);
h5disp(filename);
 
% Close access
H5G.close(gid)
H5F.close(fid)

R

#To install the package rhdf5 , you need a current version (>2.15.0) of R
#After installing R you can run the following commands from the R command shell to install the bioconductor package rhdf5.
#source("http://bioconductor.org/biocLite.R")
#biocLite("rhdf5")
 
library(rhdf5)
 
filename="/home/Projets/R/myExample.h5"
groupname = "group"
 
 
# Create an h5 file
h5createFile(filename)
 
# Create a group in the h5 file
h5createGroup(filename, groupname)
 
# Create datasets in the h5 file
h5createDataset(filename, "group/toto", c(5,5))
h5createDataset(filename, "sds", c(4,2), storage.mode="integer")
 
# Write data in dataset named "group/tata" and "sds"
vec <- c(1,2,3,4,5,6) 
h5write(vec, filename, "group/tata")
# Or
fid <- H5Fopen(filename)
sdsid <- H5Dopen(fid, "sds")
H5Dwrite(sdsid, c(1,2,3,4,5,6,7,8))
H5Dclose(sdsid)
H5Fclose(fid)
 
# Create attributes
fid <- H5Fopen(filename)
sdsid <- H5Dopen(fid, "sds")
h5createAttribute(sdsid, "unit", 1,1)
h5createAttribute(fid, "Description", 1, 1,storage.mode="character", size = 22)
 
 
# Write attribute value
aid <- H5Aopen(sdsid, "unit")
H5Awrite(aid, 69)
H5Aclose(aid)
aid <- H5Aopen(fid, "Description")
H5Awrite(aid, "this is an example")
H5Aclose(aid)
 
# Close access
H5Dclose(sdsid)
H5Fclose(fid)

More news

Highlights

AERIS/ICARE was migrated his good old FTP server to SFTP

For security reason, we are abandoning the FTP protocol in favor of SFTP on our distribution server. Depending of the way you are using this service, you can have to change the commands you are used to. Note that not all applications support the SFTP protocol, and some additional tools may need to be installed […]

01.03.2024

Tutorials

How to convert a matplotlib figure to a numpy array or a PIL image

Language/Format: Python
Description: For manipulating a figure build with matplotlib, it is sometimes requested to convert it in a format understandable by other python libraries. This can be useful for using scipy image filters or manually adding annotations for example.
This page details how to convert a matplotlib figure to a numpy 3D array of RGBA values, or directly to a PIL ( Python Imaging Library ) Image.
Author(s): Nicolas Pascal (ICARE)

10.02.2017

Tutorials

Reading a NetCDF file with Matlab and R

Language/Format: MATLAB
Description: This page gives pieces of code to read data in a NetCDF file
Author(s): Aminata NDIAYE (ICARE)

15.12.2015

Search