Unverified Commit 4cbc6e00 authored by stephen scott tucker's avatar stephen scott tucker Committed by GitHub
Browse files

Snirf writing (#117)

* Rewrote SNIRF writing. Deleted functions no longer in use. Refactored Group creation fn

* Changes to snirf writing clients

* fix to checkForHomerUpdates following GetVernum change
parent 2ecfb701
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
function gid = HDF5_CreateGroup(fid, group)
if strcmp(group, '/') || strcmp(group, '\')
    gid = H5G.open(fid, '/');
    return
end
try
    gid = H5G.open(fid, group);
catch
    rootgroup = fileparts(group);
    gid = HDF5_CreateGroup(fid, rootgroup);
    gid = H5G.create(gid, group, 'H5P_DEFAULT','H5P_DEFAULT','H5P_DEFAULT');
end
+0 −101
Original line number Diff line number Diff line
function err = HDF5_DatasetWrite(fname, location, data)

if exist(fname,'file')
    fid = H5F.open(fname, 'H5F_ACC_RDWR', 'H5P_DEFAULT');
else
    fid = H5F.create(fname, 'H5F_ACC_TRUNC', 'H5P_DEFAULT', 'H5P_DEFAULT');
end
if fid<0
    err = -1;
    return;
end

% Create group where dataset is located
group = filesepStandard(fileparts(location), 'nameonly');
gid = CreateGroup(fid, group);
if gid < 0
    err = -1;
    return;
end

% Update dataset
err = WriteDataset(fid, location, data);




% ----------------------------------------------------------------
function gid = CreateGroup(fid, group)
if group == '/'
    gid = H5G.open(fid, '/');
    return;
end

try
    gid = H5G.open(fid, group);
catch
    [rootgroup, group] = filesepStandard(fileparts(group));
    gid = CreateGroup(fid, rootgroup);
    gid = H5G.create(gid, group, 'H5P_DEFAULT','H5P_DEFAULT','H5P_DEFAULT');
end



% --------------------------------------------------------------
function err = WriteDataset(fid, location, data)

err = 0;

% data = HDF5_Transpose(data);
dims = size(data);
h5_dims = fliplr(dims);
unlimited = H5ML.get_constant_value('H5S_UNLIMITED');
h5_maxdims = [unlimited, unlimited];

if isnumeric(data)
    type_id = H5T.copy('H5T_NATIVE_DOUBLE');
elseif ischar(data)
    type_id = H5T.copy('H5T_C_S1'); 
else
    err = -1;
    return;
end

space_id = H5S.create_simple(2, h5_dims, h5_maxdims);
proplist_id = H5P.create('H5P_DATASET_CREATE');

% Open or create dataset
try
    dset_id = H5D.open(fid, location);
    H5D.set_extent(dset_id, h5_dims);
catch
    H5P.set_chunk(proplist_id, h5_dims);
    dset_id = H5D.create(fid, location, type_id, space_id, proplist_id);
end
file_space_id = H5D.get_space(dset_id);

% Write dataset
% H5D.write(dset_id, type_id, space_id, file_space_id, proplist_id, data);
H5D.write(dset_id, type_id, space_id, file_space_id, 'H5P_DEFAULT', data);

% Close space, type, dataset and file
H5S.close(space_id);
H5T.close(type_id);
H5D.close(dset_id);
H5F.close(fid);



% ----------------------------------------------------------------
function [dset_id, type_id, space_id, proplist_id] = CreateDataset(fid, location, h5_dims)

h5_maxdims = h5_dims;

type_id = H5T.copy('H5T_NATIVE_DOUBLE');
space_id = H5S.create_simple(2, h5_dims, h5_maxdims);
proplist_id = H5P.create('H5P_DATASET_CREATE');
H5P.set_chunk(proplist_id, [h5_dims(1), h5_dims(2)]);

dset_id = H5D.create(fid, location, type_id, space_id, proplist_id);

+0 −39
Original line number Diff line number Diff line
function HDF5_DatasetWriteStrings(fname, location, data)

if ~exist(fname, 'file')
    fid = H5F.create(fname, 'H5F_ACC_TRUNC', 'H5P_DEFAULT', 'H5P_DEFAULT');
else
    fid = H5F.open(fname,'H5F_ACC_RDWR','H5P_DEFAULT');
end
if iscell(data)
    data = cell2str_new(data);
end

filetype = H5T.copy('H5T_FORTRAN_S1'); 
H5T.set_size(filetype, size(data,2)); 
memtype = H5T.copy('H5T_C_S1'); 
H5T.set_size(memtype, size(data,2)); 

% Create dataspace. Setting maximum size to [] sets the maximum 
% size to be the current size. 
space = H5S.create_simple(1, size(data,1), []); 

% Create the dataset and write the string data to it. 
try
    dset = H5D.create(fid, location, filetype, space, 'H5P_DEFAULT'); 
catch
    dset = H5D.open(fid, location);
end

% Transpose the data to match the layout in the H5 file to match C 
% generated H5 file. 
H5D.write(dset, memtype, 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT',  data'); 

% Close and release resources. 
H5D.close(dset); 
H5S.close(space); 
H5T.close(filetype); 
H5T.close(memtype); 
H5F.close(fid); 

+0 −51
Original line number Diff line number Diff line
function h5save(fname, varval, varname)

if nargin==1
    varname = '';
end
if exist(fname, 'file')
    delete(fname);
end
fid = H5F.create(fname, 'H5F_ACC_TRUNC', 'H5P_DEFAULT', 'H5P_DEFAULT');
H5F.close(fid);

h5savevar(fname, varval, varname);



% ---------------------------------------------------------------------------
function h5savevar(fname, varval, varname)

% Simple matrices: uint, int, double, char, etc
if ~isstruct(varval) && ~isobject(varval)
    
    % Create new leaf variable if it doesn't exist. 
    if ~exist(fname, 'file') || ~h5exist(h5info(fname), varname)
        % Since HDF5 does not support empty or null variable, if varval is null 
        % add a _0 suffix to the var name and then don't write to it.          
        if ~isempty(varval)
            hdf5write(fname, varname, varval, 'WriteMode','append');
        else
            varname_0 = eval( sprintf('''%s_0'';', varname) );
            hdf5write(fname, varname_0, 0, 'WriteMode','append');
        end
    end
  
% Structs and Classes
else
    
    for jj=1:length(varval)
        props = propnames(varval(jj));
        for ii=1:length(props)
            if isempty(varname) || varname(1)=='/'
                subvarname = sprintf('%s_%d/%s', varname, jj, props{ii});
            else
                subvarname = sprintf('/%s_%d/%s', varname, jj, props{ii});
            end
            subvar = eval( sprintf('varval(jj).%s', props{ii}) );
            h5savevar(fname, subvar, subvarname);
        end
    end
    
end
+0 −6
Original line number Diff line number Diff line
function h5write_safe(fname, name, val)

if ~isempty(val)
    h5create(fname, name, [size(val,1), size(val,2)]);
    h5write(fname, name, val);
end
Loading