; Writes a data snapshot in the HDF5 format

pro pc_write_qvar, varfile, obj, tags=tags, group=group, time=time, datadir=datadir, quiet=quiet

	datadir = pc_get_datadir (datadir)
	default, group, 'points'
	filename = varfile

	; case-insensitve replacements for dataset names
	replace = { t:'', xx:'_', vv:'v_' }
	search = strlowcase (tag_names (replace))
	num_replace = n_elements (search)

	if (strmid (group, strlen (group)-1) eq '/') then group = strmid (group, 0, strlen (group)-1)
	if (strmid (filename, strlen (filename)-4) eq '.dat') then filename = strmid (filename, 0, strlen (filename)-4)
	if (strmid (filename, strlen (filename)-3) ne '.h5') then filename += '.h5'
	h5_open_file, datadir+'/allprocs/'+filename, /write, /truncate
	h5_write, 'number', n_elements (obj.mass)
	if (keyword_set (group)) then h5_create_group, group

	; write from qvar structure (pc_read_qvar)
	labels = strlowcase (tag_names (obj))
	tags = labels

	num_content = n_elements (labels)
	for i = 0, num_content-1 do begin
		label = labels[i]
		tag_name = label
		for j = 0, num_replace-1 do begin
			if (label eq search[j]) then label = replace.(j)
		end
		if (label eq '') then continue

		pos = (where (tag_name eq strlowcase (tag_names (obj))))[0]
		if (size (obj.(pos), /n_dimensions) eq 2) then begin
			num_dims = (size (obj.(pos), /dimensions))[1]
			components = [ 'x', 'y', 'z' ]
			for comp = 0, num_dims-1 do begin
				if (num_dims eq 3) then begin
					space = strpos (label, '_')
					if (space ge 0) then begin
						comp_label = strmid (label, 0, space) + components[comp] + strmid (label, space+1)
					end else begin
						comp_label = strmid (label, 0, strlen (label)-1) + components[comp]
					end
				end else begin
					comp_label = label + str (comp+1)
				end
				h5_write, group+'/'+comp_label, reform ((obj.(pos))[*,comp])
			end
		end else begin
			h5_write, group+'/'+label, obj.(pos)
		end
	end

	if (size (time, /type) eq 0) then time = obj.t
	if (size (obj.mass, /type) eq 4) then time = float (time)
	if (size (obj.mass, /type) eq 5) then time = double (time)
	h5_write, 'time', time

	h5_close_file
end