function h5_read, label, start=start, count=count, transpose=transpose, filename=filename, close=close, single=single

	common h5_file_info, file_id, file_name, group_name, group_content

	if (size (file_id, /type) eq 0) then file_id = !Values.D_NaN

	if (size (filename, /type) eq 7) then h5_open_file, filename

	if (finite (file_id, /NaN)) then begin
		print, "ERROR: no HDF5 file is open!"
		stop
		return, !Values.D_NaN
	end

	dataset = H5D_OPEN (file_id, label)

	num = n_elements (start) < n_elements (count)
	if (num ge 1) then begin
		start = start[0:num-1]
		count = count[0:num-1]
		dataspace = H5D_GET_SPACE (dataset)
		H5S_SELECT_HYPERSLAB, dataspace, start, count, /reset
		mem_space = H5S_CREATE_SIMPLE (count)
                if keyword_set(single) then $
		  data = float(H5D_READ (dataset, file_space=dataspace, memory_space=mem_space)) $
                else $
		  data = H5D_READ (dataset, file_space=dataspace, memory_space=mem_space)

		H5S_CLOSE, dataspace
		H5S_CLOSE, mem_space
	end else begin
                if keyword_set(single) then $
		  data = float(H5D_READ (dataset)) $
                else $
		  data = H5D_READ (dataset)
	end
	H5D_CLOSE, dataset

	if (keyword_set (transpose) and (size (data, /n_dimensions) ge 2)) then begin
		target_size = reverse (size (data, /dimensions))
		data = reform (transpose (data), target_size)
	end

	if ((size (data, /n_dimensions) eq 1) and (n_elements (data) eq 1)) then begin
		data = data[0]
	end

	if (keyword_set (close)) then h5_close_file

	return, data
end