[ismrmrd] 173/281: adding working example for Matlab API
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:01:11 UTC 2015
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to annotated tag ismrmrd0.5
in repository ismrmrd.
commit 401fa57ca66165f021ba0e72375b5b1cdb1407aa
Author: Joseph Naegele <joseph.naegele at gmail.com>
Date: Wed Aug 28 11:58:03 2013 -0400
adding working example for Matlab API
It seems that Matlab still can't write variable-length strings
using HDF5.
Number of physiological time stamps is currently 8 (32 bytes), but
should be 3 (12 bytes) in hdf5_datatypes.m, AcquisitionHeader.m
---
matlab/+ismrmrd/{old => }/Acquisition.m | 26 +--
matlab/+ismrmrd/AcquisitionHeader.m | 64 +++---
matlab/+ismrmrd/{old => }/Image.m | 18 +-
matlab/+ismrmrd/IsmrmrdDataset.m | 306 ++++++++++++++++++++++-------
matlab/+ismrmrd/example.m | 41 ++++
matlab/+ismrmrd/{old => }/hdf5_datatypes.m | 152 +++++++-------
matlab/+ismrmrd/old/file.m | 256 ------------------------
7 files changed, 410 insertions(+), 453 deletions(-)
diff --git a/matlab/+ismrmrd/old/Acquisition.m b/matlab/+ismrmrd/Acquisition.m
similarity index 76%
rename from matlab/+ismrmrd/old/Acquisition.m
rename to matlab/+ismrmrd/Acquisition.m
index e9e4fe3..a39e893 100644
--- a/matlab/+ismrmrd/old/Acquisition.m
+++ b/matlab/+ismrmrd/Acquisition.m
@@ -1,6 +1,6 @@
% Acquisition
classdef Acquisition
-
+
% Properties
properties
@@ -9,41 +9,41 @@ classdef Acquisition
data = single([]);
end % Properties
-
+
% Methods
methods
-
+
function obj = set.head(obj,v)
if isa(v,'ismrmrd.AcquisitionHeader')
obj.head = v;
else
- % not of the correct type, hope it's a struct
+ % not of the correct type, hope it's a struct
% and try to copy one element at a time
u = fieldnames(obj.head);
for p = 1:length(u)
- obj.head = setfield(obj.head,u{p},getfield(v,u{p}));
+ obj.head = setfield(obj.head, u{p}, getfield(v, u{p}));
end
end
end
-
+
function obj = set.traj(obj,v)
obj.traj = single(v);
end
-
+
function obj = set.data(obj,v)
- obj.data = single(v);
+ obj.data = single(v);
end
function b = isFlagSet(obj,flag)
bitflag = ismrmrd.FlagBit(flag);
b = bitflag.isSet(obj.head.flag);
end
-
+
function obj = setFlag(obj,flag)
- bitflag = ismrmrd.FlagBit(flag);
+ bitflag = ismrmrd.FlagBit(flag);
obj.head.flag = bitor(obj.head.flag, bitflag.bitmask);
end
-
+
end % Methods
-
-end
\ No newline at end of file
+
+end
diff --git a/matlab/+ismrmrd/AcquisitionHeader.m b/matlab/+ismrmrd/AcquisitionHeader.m
index bd28765..7dc468a 100644
--- a/matlab/+ismrmrd/AcquisitionHeader.m
+++ b/matlab/+ismrmrd/AcquisitionHeader.m
@@ -1,5 +1,5 @@
classdef AcquisitionHeader
-
+
properties
version = uint16(0); % First unsigned int indicates the version %
flags = uint64(0); % bit field with flags %
@@ -28,9 +28,9 @@ classdef AcquisitionHeader
user_int = zeros(8,1,'int32'); % Free user parameters %
user_float = zeros(8,1,'single'); % Free user parameters %
end
-
+
methods
-
+
% Constructor
function obj = AcquisitionHeader(bytes)
if (nargin == 1)
@@ -63,7 +63,7 @@ classdef AcquisitionHeader
obj.user_float = typecast(bytes(off:off+31), 'single');
end
end
-
+
% Convert to Bytes
function bytes = toBytes(obj)
% TODO: physiology_time_stamp should be 3.
@@ -97,39 +97,39 @@ classdef AcquisitionHeader
bytes(off:off+31) = typecast(obj.user_int ,'int8'); off=off+32;
bytes(off:off+31) = typecast(obj.user_float ,'int8');
end
-
+
% The flag methods
function val = isFlagSet(obj,flagstring)
flagbit = ismrmrd.FlagBit(getfield(ismrmrd.AcquisitionFlags,flagstring));
val = flagbit.isSet(obj.flags);
end
-
+
function obj = setFlag(obj,flagstring)
flagbit = ismrmrd.FlagBit(getfield(ismrmrd.AcquisitionFlags,flagstring));
obj.flags = bitor(obj.flags, flagbit.bitmask);
end
-
+
% Set methods
function obj = set.version(obj,v)
obj.version = uint16(v);
end
-
+
function obj = set.flags(obj,v)
obj.flags = uint64(v);
end
-
+
function obj = set.measurement_uid(obj,v)
obj.measurement_uid = uint32(v);
end
-
+
function obj = set.scan_counter(obj,v)
obj.scan_counter = uint32(v);
end
-
+
function obj = set.acquisition_time_stamp(obj,v)
obj.acquisition_time_stamp = uint32(v);
end
-
+
function obj = set.physiology_time_stamp(obj,v)
% TODO: physiology_time_stamp should be 3.
%if (length(v)~=3)
@@ -139,85 +139,85 @@ classdef AcquisitionHeader
obj.physiology_time_stamp(1:3) = uint32(v(1:3));
obj.physiology_time_stamp(4:8) = uint32(0);
end
-
+
function obj = set.number_of_samples(obj,v)
obj.number_of_samples = uint16(v);
end
-
+
function obj = set.available_channels(obj,v)
obj.available_channels = uint16(v);
end
-
+
function obj = set.active_channels(obj,v)
obj.active_channels = uint16(v);
end
-
+
function obj = set.channel_mask(obj,v)
if (length(v)~=16)
error('AcquisitionHeader.channel_mask must have 16 elements')
end
obj.channel_mask = uint64(v);
end
-
+
function obj = set.discard_pre(obj,v)
obj.discard_pre = uint16(v);
end
-
+
function obj = set.discard_post(obj,v)
obj.discard_post = uint16(v);
end
-
+
function obj = set.center_sample(obj,v)
obj.center_sample = uint16(v);
end
-
+
function obj = set.encoding_space_ref(obj,v)
obj.encoding_space_ref = uint16(v);
end
-
+
function obj = set.trajectory_dimensions(obj,v)
obj.trajectory_dimensions = uint16(v);
end
-
+
function obj = set.sample_time_us(obj,v)
obj.sample_time_us = single(v);
end
-
+
function obj = set.position(obj,v)
if (length(v)~=3)
error('AcquisitionHeader.position must have 3 elements')
end
obj.position = single(v);
end
-
+
function obj = set.read_dir(obj,v)
if (length(v)~=3)
error('AcquisitionHeader.read_dir must have 3 elements')
end
obj.read_dir = single(v);
end
-
+
function obj = set.phase_dir(obj,v)
if (length(v)~=3)
error('AcquisitionHeader.phase_dir must have 3 elements')
end
obj.phase_dir = single(v);
end
-
+
function obj = set.slice_dir(obj,v)
if (length(v)~=3)
error('AcquisitionHeader.slice_dir must have 3 elements')
end
obj.slice_dir = single(v);
end
-
+
function obj = set.patient_table_position(obj,v)
if (length(v)~=3)
error('AcquisitionHeader.patient_table_position must have 3 elements')
end
obj.patient_table_position = single(v);
end
-
+
function obj = set.idx(obj,v)
if isa(v,'ismrmrd.EncodingCounters')
obj.idx = v;
@@ -230,21 +230,21 @@ classdef AcquisitionHeader
end
end
end
-
+
function obj = set.user_int(obj,v)
if (length(v)~=8)
error('AcquisitionHeader.user_int must have 8 elements')
end
obj.user_int = int32(v);
end
-
+
function obj = set.user_float(obj,v)
if (length(v)~=8)
error('AcquisitionHeader.user_float must have 8 elements')
end
obj.user_float = single(v);
end
-
+
end
-
+
end
diff --git a/matlab/+ismrmrd/old/Image.m b/matlab/+ismrmrd/Image.m
similarity index 84%
rename from matlab/+ismrmrd/old/Image.m
rename to matlab/+ismrmrd/Image.m
index fe591b8..2f75783 100644
--- a/matlab/+ismrmrd/old/Image.m
+++ b/matlab/+ismrmrd/Image.m
@@ -1,6 +1,6 @@
% Image
classdef Image
-
+
% Properties
properties
@@ -8,28 +8,28 @@ classdef Image
data_ = [];
end % Properties
-
+
% Methods
methods
function obj = set.head_(obj,v)
obj.head_ = v;
end
-
+
function obj = set.data_(obj,v)
obj.data_ = single(complex(v));
end
-
+
function b = isFlagSet(obj,flag)
bitflag = ismrmrd.FlagBit(flag);
b = bitflag.isSet(obj.head_.flag);
end
-
+
function obj = setFlag(obj,flag)
- bitflag = ismrmrd.FlagBit(flag);
+ bitflag = ismrmrd.FlagBit(flag);
obj.head_.flag = bitor(obj.head_.flag, bitflag.bitmask_);
end
-
+
end % Methods
-
-end
\ No newline at end of file
+
+end
diff --git a/matlab/+ismrmrd/IsmrmrdDataset.m b/matlab/+ismrmrd/IsmrmrdDataset.m
index fe94bc7..c3e0f5b 100644
--- a/matlab/+ismrmrd/IsmrmrdDataset.m
+++ b/matlab/+ismrmrd/IsmrmrdDataset.m
@@ -1,87 +1,259 @@
classdef IsmrmrdDataset
properties
+ fid = -1;
filename = '';
- dsetname = '';
- file = 0;
+ datapath = '';
+ xmlpath = '';
+ xmlhdr = [];
+ end
- memtype_acqhdr = 0;
- filetype_acqhdr = 0;
- space_acqhdr = 0;
+ methods
- uint16_t = H5T.copy('H5T_NATIVE_UINT16');
- uint32_t = H5T.copy('H5T_NATIVE_UINT32');
- int32_t = H5T.copy('H5T_NATIVE_INT32');
- uint64_t = H5T.copy('H5T_NATIVE_UINT64');
- float_t = H5T.copy('H5T_NATIVE_FLOAT');
+ function obj = IsmrmrdDataset(filename,groupname)
- end
+ % If the file exists, open it for read/write
+ % otherwise, create it
+ if exist(filename,'file')
+ obj.fid = H5F.open(filename,'H5F_ACC_RDWR','H5P_DEFAULT');
+ else
+ fcpl = H5P.create('H5P_FILE_CREATE');
+ obj.fid = H5F.create(filename,'H5F_ACC_TRUNC',fcpl,'H5P_DEFAULT');
+ H5P.close(fcpl);
+ end
-methods
+ % Set the filename
+ obj.filename = filename;
-function obj = IsmrmrdDataset(filename, dsetname)
+ % Set the group name
+ % default is dataset
+ if nargin == 1
+ groupname = 'dataset';
+ end
+ % Set the paths
+ grouppath = ['/' groupname];
+ obj.xmlpath = ['/' groupname '/xml'];
+ obj.datapath = ['/' groupname '/data'];
- if (nargin == 2)
- obj.filename = filename;
- obj.dsetname = dsetname;
+ % Check if the group exists
+ lapl_id=H5P.create('H5P_LINK_ACCESS');
+ if (H5L.exists(obj.fid,grouppath,lapl_id) == 0)
+ % group does not exist, create it and set a default header
+ group_id = H5G.create(obj.fid, grouppath, 0);
+ H5G.close(group_id);
+ % create a default xml header object
+ %obj.xmlhdr = ismrmrd.XMLHeader();
+ obj.xmlhdr = org.ismrm.ismrmrd.xmlhdr.IsmrmrdHeader();
+ else
+ % group exists, read the xml header
+ % and create a new convert it to an xml header object
+ %obj.xmlhdr = ismrmrd.XMLHeader().stringToHeader(obj.readxml());
+ obj.xmlhdr = org.ismrm.ismrmrd.xmlhdr.XMLString.StringToIsmrmrdHeader(obj.readxml());
+ end
+ H5P.close(lapl_id);
- try
- file = H5F.open(filename);
- %dset = H5D.open(file, dsetname);
- catch
- file = H5F.create(filename, 'H5F_ACC_TRUNC', 'H5P_DEFAULT', 'H5P_DEFAULT');
- %dset = H5D.create(file, dsetname, );
end
- obj.file = file;
-
- % Acquisition Header
- size_acqhdr(1) = H5T.get_size(obj.uint16_t); % version
- size_acqhdr(2) = H5T.get_size(obj.uint64_t); % flags
- size_acqhdr(3) = H5T.get_size(obj.uint32_t); % measurement_uid
- size_acqhdr(4) = H5T.get_size(obj.uint32_t); % scan_counter
- sizeof_acqhdr = sum(size_acqhdr);
- offsets_acqhdr(1) = 0;
- offsets_acqhdr(2:4) = cumsum(size_acqhdr(1:3));
-
- memtype_acqhdr = H5T.create('H5T_COMPOUND', sizeof_acqhdr);
- H5T.insert(memtype_acqhdr, 'version', offsets_acqhdr(1), obj.uint16_t);
- H5T.insert(memtype_acqhdr, 'flags', offsets_acqhdr(2), obj.uint64_t);
- H5T.insert(memtype_acqhdr, 'measurement_uid', offsets_acqhdr(3), obj.uint32_t);
- H5T.insert(memtype_acqhdr, 'scan_counter', offsets_acqhdr(4), obj.uint32_t);
-
- filetype_acqhdr = H5T.create('H5T_COMPOUND', sizeof_acqhdr);
- H5T.insert(filetype_acqhdr, 'version', offsets_acqhdr(1), obj.uint16_t);
- H5T.insert(filetype_acqhdr, 'flags', offsets_acqhdr(2), obj.uint64_t);
- H5T.insert(filetype_acqhdr, 'measurement_uid', offsets_acqhdr(3), obj.uint32_t);
- H5T.insert(filetype_acqhdr, 'scan_counter', offsets_acqhdr(4), obj.uint32_t);
-
- obj.memtype_acqhdr = memtype_acqhdr;
- obj.filetype_acqhdr = filetype_acqhdr;
- obj.space_acqhdr = H5S.create_simple(1, 1, []); % 1-D
-
- else
- error('IsmrmrdDataset takes 2 parameters (filename, dataset)');
- end
-end
+ function obj = close(obj)
+ % synchronize the xml header
+ %xmlstring = ismrmrd.XMLHeader.headerToString(obj.xmlhdr);
+ xmlstring = org.ismrm.ismrmrd.xmlhdr.XMLString.IsmrmrdHeaderToString(obj.xmlhdr);
+ obj.writexml(xmlstring);
+ % close the file
+ H5F.close(obj.fid);
+ end
-function obj = appendAcquisition(obj, hdr, data)
- dset = H5D.create(obj.file, obj.dsetname, obj.filetype_acqhdr, obj.space_acqhdr, 'H5P_DEFAULT');
- H5D.write(dset, obj.memtype_acqhdr, 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT', hdr);
- H5D.close(dset)
-end
+ function xmlstring = readxml(obj)
-function getAcquisition
+ % Check if the XML header exists
+ % TODO: set it's value to the default
+ lapl_id=H5P.create('H5P_LINK_ACCESS');
+ if (H5L.exists(obj.fid,obj.xmlpath,lapl_id) == 0)
+ error('No XML header found.');
+ end
+ H5P.close(lapl_id);
-end
+ % Open
+ xml_id = H5D.open(obj.fid, obj.xmlpath);
-function delete(obj)
- H5S.close(obj.space)
- H5T.close(obj.memtype_acqhdr)
- H5T.close(obj.datatype_acqhdr)
- H5F.close(obj.file)
-end
+ % Get the type
+ xml_dtype = H5D.get_type(xml_id);
-end
+ % Read the data
+ hdr = H5D.read(xml_id, xml_dtype, 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT');
+
+ % Output depends on whether or not the stored string was variale length
+ if (H5T.is_variable_str(xml_dtype))
+ xmlstring = hdr{1};
+ else
+ xmlstring = hdr';
+ end
+
+ % Close the XML
+ H5T.close(xml_dtype);
+ H5D.close (xml_id);
+ end
+
+ function writexml(obj,xmlstring)
+ % No validation is performed. You're on your own.
+
+ xmlstring = char(xmlstring)
+ % TODO: add error checking on the write and return a status
+ % TODO: if the matlab variable length string bug is resolved
+ % then we should change this logic to just modify the length
+ % and overwrite.
+
+ % Check if the XML header exists
+ % if it does not exist, create it
+ % if it exists, modify the size appropriately
+ lapl_id=H5P.create('H5P_LINK_ACCESS');
+ if (H5L.exists(obj.fid,obj.xmlpath,lapl_id) == 1)
+ % Delete it
+ H5L.delete(obj.fid, obj.xmlpath,'H5P_DEFAULT');
+ end
+ H5P.close(lapl_id);
+
+ % Set variable length string type
+ xml_dtype = H5T.copy('H5T_C_S1');
+ % Matlab is having trouble writing variable length strings
+ % that are longer that 512 characters. Switched to fixed
+ % length.
+ % H5T.set_size(xml_dtype,'H5T_VARIABLE');
+ H5T.set_size(xml_dtype, length(xmlstring));
+ xml_space_id = H5S.create_simple (1, 1, []);
+ xml_id = H5D.create (obj.fid, obj.xmlpath, xml_dtype, ....
+ xml_space_id, 'H5P_DEFAULT');
+ H5S.close(xml_space_id);
+
+ % Write the data
+ H5D.write(xml_id, xml_dtype, ...
+ 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT', xmlstring);
+
+ % Close the XML
+ H5D.close(xml_id);
+
+ end
+
+ function nacq = getNumberOfAcquisitions(obj)
+
+ dset = H5D.open(obj.fid, obj.datapath);
+ space = H5D.get_space(dset);
+ H5S.get_simple_extent_dims(space);
+ [~,dims,~] = H5S.get_simple_extent_dims(space);
+ nacq = dims(1);
+ H5S.close(space);
+ H5D.close(dset);
+
+ end
+
+ function acq = readAcquisition(obj, nacq)
+
+ % Open the data
+ dset_id = H5D.open(obj.fid, obj.datapath);
+
+ % Open the data space
+ file_space_id = H5D.get_space(dset_id);
+
+ % Initialize the return object
+ acq = ismrmrd.Acquisition;
+
+ % Create a mem_space for reading
+ dims = [1 1];
+ mem_space_id = H5S.create_simple(2,dims,[]);
+
+ % Read the desired acquisition
+ offset = [nacq-1 0];
+ H5S.select_hyperslab(file_space_id,'H5S_SELECT_SET',offset,[1 1],[1 1],[1 1]);
+ d = H5D.read(dset_id, ismrmrd.hdf5_datatypes.getType_Acquisition, ...
+ mem_space_id, file_space_id, 'H5P_DEFAULT');
+
+ % Set the structure bits
+ acq.head = d.head(1);
+ acq.traj = d.traj{1};
+ t = d.data{1};
+ acq.data = t(1:2:end) + 1j*t(2:2:end);
+
+ % Clean up
+ H5S.close(mem_space_id);
+ H5S.close(file_space_id);
+ H5D.close(dset_id);
+ end
+
+ function appendAcquisition(obj, acq)
+ % Append an acquisition
+
+ % TODO: Check the type of the input
+
+ % Check if the Data exists
+ % if it does not exist, create it
+ % if it does exist increase it's size by one
+ lapl_id=H5P.create('H5P_LINK_ACCESS');
+ if (H5L.exists(obj.fid, obj.datapath, lapl_id) == 0)
+ % Data does not exist
+ % create with rank 2, unlimited, and set the chunk size
+ dims = [1 1];
+ maxdims = [H5ML.get_constant_value('H5S_UNLIMITED') 1];
+ file_space_id = H5S.create_simple(2, dims, maxdims);
+
+ dcpl = H5P.create('H5P_DATASET_CREATE');
+ chunk = [1 1];
+ H5P.set_chunk (dcpl, chunk);
+ data_id = H5D.create(obj.fid, obj.datapath, ...
+ ismrmrd.hdf5_datatypes.getType_Acquisition, ...
+ file_space_id, dcpl);
+ H5P.close(dcpl);
+ H5S.close(file_space_id);
+
+ else
+ % Open the data
+ data_id = H5D.open(obj.fid, obj.datapath);
+
+ % Open the data space
+ file_space_id = H5D.get_space(data_id);
+
+ % Get the size, increment by one
+ H5S.get_simple_extent_dims(file_space_id);
+ [~,dims,~] = H5S.get_simple_extent_dims(file_space_id);
+ dims = [dims(1)+1, 1];
+ H5D.set_extent (data_id, dims);
+ H5S.close(file_space_id);
+
+ end
+ H5P.close(lapl_id);
+
+ % Get the file space (room for one more acq)
+ file_space_id = H5D.get_space(data_id);
+ [~,dims,~] = H5S.get_simple_extent_dims(file_space_id);
+
+ % Select the last block
+ offset = [dims(1)-1 0];
+ H5S.select_hyperslab(file_space_id,'H5S_SELECT_SET',offset,[],[],[]);
+
+ % Mem space
+ mem_space_id = H5S.create_simple(2,[1 1],[]);
+
+ % Pack the acquisition into the correct struct for writing
+ swarn = warning('query','MATLAB:structOnObject');
+ warning('off', 'MATLAB:structOnObject')
+ d.head(1) = struct(acq.head);
+ d.head(1).idx = struct(acq.head.idx);
+ warning(swarn.state, 'MATLAB:structOnObject')
+ d.traj{1} = acq.traj;
+ t = zeros(2*length(acq.data),1,'single');
+ t(1:2:end) = real(acq.data);
+ t(2:2:end) = imag(acq.data);
+ d.data{1} = t;
+
+ % Write
+ H5D.write(data_id, ismrmrd.hdf5_datatypes.getType_Acquisition(), ...
+ mem_space_id, file_space_id, 'H5P_DEFAULT', d);
+
+ % Clean up
+ H5S.close(mem_space_id);
+ H5S.close(file_space_id);
+ H5D.close(data_id);
+ end
+
+ end
end
diff --git a/matlab/+ismrmrd/example.m b/matlab/+ismrmrd/example.m
new file mode 100644
index 0000000..ee8ca7a
--- /dev/null
+++ b/matlab/+ismrmrd/example.m
@@ -0,0 +1,41 @@
+function example()
+
+filename = 'test.h5';
+
+if (exist(filename, 'file'))
+ delete(filename) ;
+end
+
+% Create the dataset
+i = ismrmrd.IsmrmrdDataset(filename, 'dataset');
+
+ah = ismrmrd.AcquisitionHeader();
+ah.center_sample = 42;
+ah.active_channels = 32;
+ah.version = 2;
+ah.position = [3.14, 3.14, 3.14]
+
+a = ismrmrd.Acquisition();
+a.head = ah;
+a.data = (1:512)
+a.traj = (1:3);
+
+i.appendAcquisition(a)
+
+% Write the dataset
+i.close();
+
+% Open the dataset
+i = ismrmrd.IsmrmrdDataset(filename, 'dataset')
+
+% Read the dataset
+nacq = i.getNumberOfAcquisitions()
+a = i.readAcquisition(1);
+
+h = a.head;
+
+h.position
+
+i.close();
+
+end
diff --git a/matlab/+ismrmrd/old/hdf5_datatypes.m b/matlab/+ismrmrd/hdf5_datatypes.m
similarity index 95%
rename from matlab/+ismrmrd/old/hdf5_datatypes.m
rename to matlab/+ismrmrd/hdf5_datatypes.m
index 6954366..7d767ad 100644
--- a/matlab/+ismrmrd/old/hdf5_datatypes.m
+++ b/matlab/+ismrmrd/hdf5_datatypes.m
@@ -1,83 +1,83 @@
classdef hdf5_datatypes
-
+
methods (Static)
-
+
function b = getType_float()
b = H5T.copy('H5T_NATIVE_FLOAT');
end
-
+
function b = getType_double()
b = H5T.copy('H5T_NATIVE_DOUBLE');
end
-
+
function b = getType_char()
b = H5T.copy('H5T_NATIVE_CHAR');
end
-
+
function b = getType_complexfloat()
typesize = 2*H5T.get_size('H5T_NATIVE_FLOAT');
b = H5T.create ('H5T_COMPOUND', typesize);
H5T.insert (b, 'real', 0, 'H5T_NATIVE_FLOAT');
H5T.insert (b, 'imag', H5T.get_size('H5T_NATIVE_FLOAT'), 'H5T_NATIVE_FLOAT');
end
-
+
function b = getType_complexdouble()
b = H5T.create ('H5T_COMPOUND', ...
2*H5T.get_size('H5T_NATIVE_DOUBLE'));
H5T.insert (b, 'real', 0, 'H5T_NATIVE_DOUBLE');
H5T.insert (b, 'imag', H5T.get_size('H5T_NATIVE_DOUBLE'), 'H5T_NATIVE_DOUBLE');
end
-
+
function b = getType_ushort()
b = H5T.copy('H5T_NATIVE_USHORT');
end
-
+
function b = getType_EncodingCounters()
-
+
typesize = 17*H5T.get_size('H5T_NATIVE_UINT16');
b = H5T.create ('H5T_COMPOUND', typesize);
-
+
offset = 0;
H5T.insert(b, 'kspace_encode_step_1', offset, 'H5T_NATIVE_UINT16');
-
+
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
- H5T.insert(b, 'kspace_encode_step_2', offset, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'kspace_encode_step_2', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'average', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'slice', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'contrast', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'phase', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'repetition', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'set', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'segment', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'user', offset, H5T.array_create('H5T_NATIVE_UINT16',[8]));
-
+
end
-
+
function b = getType_AcquisitionHeader()
-
+
typesize = 0;
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % version
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT64'); % flag
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT32'); % measurement_uid
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT32'); % scan_counter
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT32'); % acquisition_time_stamp
- typesize = typesize + 3*H5T.get_size('H5T_NATIVE_UINT32'); % pysio_time_stampe(3)
+ typesize = typesize + 8*H5T.get_size('H5T_NATIVE_UINT32'); % physio_time_stamps
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % number_of_samples
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % available_channels
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % active_channels
@@ -87,7 +87,7 @@ classdef hdf5_datatypes
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % center_sample
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % encoding_space_ref
typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % trajectory_dimension
- typesize = typesize + H5T.get_size('H5T_NATIVE_FLOAT'); % sample_time_us
+ typesize = typesize + H5T.get_size('H5T_NATIVE_FLOAT'); % sample_time_us
typesize = typesize + 3*H5T.get_size('H5T_NATIVE_FLOAT'); % position
typesize = typesize + 3*H5T.get_size('H5T_NATIVE_FLOAT'); % read_dir
typesize = typesize + 3*H5T.get_size('H5T_NATIVE_FLOAT'); % phase_dir
@@ -96,28 +96,28 @@ classdef hdf5_datatypes
typesize = typesize + H5T.get_size(ismrmrd.hdf5_datatypes.getType_EncodingCounters()); % idx
typesize = typesize + 8*H5T.get_size('H5T_NATIVE_INT32'); % user_int
typesize = typesize + 8*H5T.get_size('H5T_NATIVE_FLOAT'); % user_float
-
+
b = H5T.create ('H5T_COMPOUND', typesize);
-
+
offset = 0;
- H5T.insert(b, 'version', offset, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'version', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
H5T.insert(b, 'flags', offset, 'H5T_NATIVE_UINT64');
offset = offset + H5T.get_size('H5T_NATIVE_UINT64');
-
+
H5T.insert(b, 'measurement_uid', offset, 'H5T_NATIVE_UINT32');
offset = offset + H5T.get_size('H5T_NATIVE_UINT32');
-
+
H5T.insert(b, 'scan_counter', offset, 'H5T_NATIVE_UINT32');
offset = offset + H5T.get_size('H5T_NATIVE_UINT32');
-
+
H5T.insert(b, 'acquisition_time_stamp', offset, 'H5T_NATIVE_UINT32');
offset = offset + H5T.get_size('H5T_NATIVE_UINT32');
-
- H5T.insert(b, 'physiology_time_stamp', offset, H5T.array_create('H5T_NATIVE_UINT32',[3]));
- offset = offset + 3*H5T.get_size('H5T_NATIVE_UINT32');
-
+
+ H5T.insert(b, 'physiology_time_stamp', offset, H5T.array_create('H5T_NATIVE_UINT32',[8]));
+ offset = offset + 8*H5T.get_size('H5T_NATIVE_UINT32');
+
H5T.insert(b, 'number_of_samples', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
@@ -126,10 +126,10 @@ classdef hdf5_datatypes
H5T.insert(b, 'active_channels', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'channel_mask', offset, H5T.array_create('H5T_NATIVE_UINT64',[16]));
offset = offset + 16*H5T.get_size('H5T_NATIVE_UINT64');
-
+
H5T.insert(b, 'discard_pre', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
@@ -141,10 +141,10 @@ classdef hdf5_datatypes
H5T.insert(b, 'encoding_space_ref', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'trajectory_dimensions', offset, 'H5T_NATIVE_UINT16');
offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
+
H5T.insert(b, 'sample_time_us', offset, 'H5T_NATIVE_FLOAT');
offset = offset + H5T.get_size('H5T_NATIVE_FLOAT');
@@ -159,13 +159,13 @@ classdef hdf5_datatypes
H5T.insert(b, 'slice_dir', offset, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
offset = offset + 3*H5T.get_size('H5T_NATIVE_FLOAT');
-
+
H5T.insert(b, 'patient_table_position', offset, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
offset = offset + 3*H5T.get_size('H5T_NATIVE_FLOAT');
-
+
H5T.insert(b, 'idx', offset, ismrmrd.hdf5_datatypes.getType_EncodingCounters);
offset = offset + H5T.get_size(ismrmrd.hdf5_datatypes.getType_EncodingCounters);
-
+
H5T.insert(b, 'user_int', offset, H5T.array_create('H5T_NATIVE_INT32',[8]));
offset = offset + 8*H5T.get_size('H5T_NATIVE_INT32');
@@ -175,13 +175,13 @@ classdef hdf5_datatypes
end
function b = getType_Acquisition()
-
+
head = H5T.copy(ismrmrd.hdf5_datatypes.getType_AcquisitionHeader);
traj = H5T.vlen_create(ismrmrd.hdf5_datatypes.getType_float());
data = H5T.vlen_create(ismrmrd.hdf5_datatypes.getType_float());
-
+
typesize = H5T.get_size(head) + H5T.get_size(traj) + H5T.get_size(data);
-
+
b = H5T.create ('H5T_COMPOUND', typesize);
offset = 0;
@@ -190,51 +190,51 @@ classdef hdf5_datatypes
H5T.insert(b, 'traj', offset, traj);
offset = offset + H5T.get_size(traj);
H5T.insert(b, 'data', offset, data);
-
+
end
end % Methods (Static)
-
+
end
% boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(AcquisitionHeader_with_data)));
-%
+%
% boost::shared_ptr<DataType> head_type = getIsmrmrdHDF5Type<AcquisitionHeader>();
% boost::shared_ptr<DataType> cxvdatatype = getIsmrmrdHDF5Type<complex_t>();
% cxvdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (cxvdatatype->getId())));
% boost::shared_ptr<DataType> realvdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (PredType::NATIVE_FLOAT.getId())));
-%
+%
% ret->insertMember( "head", HOFFSET(AcquisitionHeader_with_data,head), *head_type);
% ret->insertMember( "traj", HOFFSET(AcquisitionHeader_with_data,traj), *realvdatatype);
% ret->insertMember( "data", HOFFSET(AcquisitionHeader_with_data,data), *cxvdatatype);
-%
+%
% template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader>()
% {
-%
+%
% boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(ImageHeader)));
-%
+%
% ret->insertMember( "version", HOFFSET(ImageHeader, version), PredType::NATIVE_UINT16);
% ret->insertMember( "flags", HOFFSET(ImageHeader, flags), PredType::NATIVE_UINT64);
% ret->insertMember( "measurement_uid", HOFFSET(ImageHeader, measurement_uid), PredType::NATIVE_UINT32);
-%
+%
% std::vector<hsize_t> dims(1,0);
-%
+%
% dims[0] = 3;
% boost::shared_ptr<DataType> mat_size_array_type(new ArrayType(PredType::NATIVE_UINT16, 1, &dims[0]));
% ret->insertMember( "matrix_size", HOFFSET(ImageHeader, matrix_size), *mat_size_array_type);
-%
+%
% dims[0] = 3;
% boost::shared_ptr<DataType> fov_array_type(new ArrayType(PredType::NATIVE_FLOAT, 1, &dims[0]));
% ret->insertMember( "field_of_view", HOFFSET(ImageHeader, field_of_view), *fov_array_type);
-%
+%
% ret->insertMember( "channels", HOFFSET(ImageHeader, channels), PredType::NATIVE_UINT16);
-%
+%
% dims[0] = 3;
% boost::shared_ptr<DataType> position_array_type(new ArrayType(PredType::NATIVE_FLOAT, 1, &dims[0]));
% ret->insertMember( "position", HOFFSET(ImageHeader, position), *position_array_type);
-%
+%
% dims[0] = 3;
% boost::shared_ptr<DataType> phase_dir_array_type(new ArrayType(PredType::NATIVE_FLOAT, 1, &dims[0]));
% ret->insertMember( "phase_dir", HOFFSET(ImageHeader, phase_dir), *phase_dir_array_type);
@@ -246,12 +246,12 @@ end
% dims[0] = 3;
% boost::shared_ptr<DataType> table_array_type(new ArrayType(PredType::NATIVE_FLOAT, 1, &dims[0]));
% ret->insertMember( "patient_table_position", HOFFSET(ImageHeader, patient_table_position), *table_array_type);
-%
+%
% dims[0] = 3;
% boost::shared_ptr<DataType> table_array_type(new ArrayType(PredType::NATIVE_FLOAT, 1, &dims[0]));
% ret->insertMember( "patient_table_position", HOFFSET(ImageHeader, patient_table_position), *table_array_type);
-%
-%
+%
+%
% ret->insertMember( "average", HOFFSET(ImageHeader, average), PredType::NATIVE_UINT16);
% ret->insertMember( "slice", HOFFSET(ImageHeader, slice), PredType::NATIVE_UINT16);
% ret->insertMember( "contrast", HOFFSET(ImageHeader, contrast), PredType::NATIVE_UINT16);
@@ -259,28 +259,28 @@ end
% ret->insertMember( "repetition", HOFFSET(ImageHeader, repetition), PredType::NATIVE_UINT16);
% ret->insertMember( "set", HOFFSET(ImageHeader, set), PredType::NATIVE_UINT16);
% ret->insertMember( "acquisition_time_stamp", HOFFSET(ImageHeader, acquisition_time_stamp), PredType::NATIVE_UINT32);
-%
+%
% dims[0] = 3;
% boost::shared_ptr<DataType> array_type(new ArrayType(PredType::NATIVE_UINT32, 1, &dims[0]));
% ret->insertMember( "physiology_time_stamp", HOFFSET(ImageHeader, physiology_time_stamp), *array_type);
-%
+%
% ret->insertMember( "image_data_type", HOFFSET(ImageHeader, image_data_type), PredType::NATIVE_UINT16);
% ret->insertMember( "image_type", HOFFSET(ImageHeader, image_type), PredType::NATIVE_UINT16);
% ret->insertMember( "image_index", HOFFSET(ImageHeader, image_index), PredType::NATIVE_UINT16);
% ret->insertMember( "image_series_index", HOFFSET(ImageHeader, image_series_index), PredType::NATIVE_UINT16);
-%
+%
% dims[0] = 8;
% boost::shared_ptr<DataType> user_int_array_type(new ArrayType(PredType::NATIVE_INT32, 1, &dims[0]));
% ret->insertMember( "user_int", HOFFSET(ImageHeader, user_int), *user_int_array_type);
-%
+%
% dims[0] = 8;
% boost::shared_ptr<DataType> user_float_array_type(new ArrayType(PredType::NATIVE_FLOAT, 1, &dims[0]));
% ret->insertMember( "user_float", HOFFSET(ImageHeader, user_float), *user_float_array_type);
-%
+%
% return ret;
% }
-%
-%
+%
+%
% template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader_with_data<float> >()
% {
% boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(ImageHeader_with_data<float>)));
@@ -291,7 +291,7 @@ end
% ret->insertMember( "data", HOFFSET(ImageHeader_with_data<float>,data), *vdatatype);
% return ret;
% }
-%
+%
% template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader_with_data<double> >()
% {
% boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(ImageHeader_with_data<double>)));
@@ -302,7 +302,7 @@ end
% ret->insertMember( "data", HOFFSET(ImageHeader_with_data<double>,data), *vdatatype);
% return ret;
% }
-%
+%
% template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader_with_data<unsigned short> >()
% {
% boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(ImageHeader_with_data<unsigned short>)));
@@ -313,7 +313,7 @@ end
% ret->insertMember( "data", HOFFSET(ImageHeader_with_data<unsigned short>,data), *vdatatype);
% return ret;
% }
-%
+%
% template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader_with_data<complex_t> >()
% {
% boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(ImageHeader_with_data<complex_t>)));
@@ -324,7 +324,7 @@ end
% ret->insertMember( "data", HOFFSET(ImageHeader_with_data<complex_t>,data), *vdatatype);
% return ret;
% }
-%
+%
% template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader_with_data<double_complex_t> >()
% {
% boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(ImageHeader_with_data<double_complex_t>)));
@@ -335,16 +335,16 @@ end
% ret->insertMember( "data", HOFFSET(ImageHeader_with_data<double_complex_t>,data), *vdatatype);
% return ret;
% }
-%
+%
% template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader_with_data< std::complex<float> > >()
% {
% return getIsmrmrdHDF5Type<ImageHeader_with_data<complex_t> >();
% }
-%
+%
% template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<ImageHeader_with_data< std::complex<double> > >()
% {
% return getIsmrmrdHDF5Type<ImageHeader_with_data<double_complex_t> >();
% }
-%
+%
% }
-%
+%
diff --git a/matlab/+ismrmrd/old/file.m b/matlab/+ismrmrd/old/file.m
deleted file mode 100644
index ff71db1..0000000
--- a/matlab/+ismrmrd/old/file.m
+++ /dev/null
@@ -1,256 +0,0 @@
-% File
-classdef file
-
- properties
- fid = -1;
- filename = '';
- datapath = '';
- xmlpath = '';
- xmlhdr = [];
- end
-
- methods
-
- function obj = file(filename,groupname)
-
- % If the file exists, open it for read/write
- % otherwise, create it
- if exist(filename,'file')
- obj.fid = H5F.open(filename,'H5F_ACC_RDWR','H5P_DEFAULT');
- else
- fcpl = H5P.create('H5P_FILE_CREATE');
- obj.fid = H5F.create(filename,'H5F_ACC_TRUNC',fcpl,'H5P_DEFAULT');
- H5P.close(fcpl);
- end
-
- % Set the filename
- obj.filename = filename;
-
- % Set the group name
- % default is dataset
- if nargin == 1
- groupname = 'dataset';
- end
- % Set the paths
- grouppath = ['/' groupname];
- obj.xmlpath = ['/' groupname '/xml'];
- obj.datapath = ['/' groupname '/data'];
-
- % Check if the group exists
- lapl_id=H5P.create('H5P_LINK_ACCESS');
- if (H5L.exists(obj.fid,grouppath,lapl_id) == 0)
- % group does not exist, create it and set a default header
- group_id = H5G.create(obj.fid, grouppath, 0);
- H5G.close(group_id);
- % create a default xml header object
- obj.xmlhdr = ismrmrd.XMLHeader();
- else
- % group exists, read the xml header
- % and create a new convert it to an xml header object
- obj.xmlhdr = ismrmrd.XMLHeader().stringToHeader(obj.readxml());
- end
- H5P.close(lapl_id);
-
- end
-
- function obj = close(obj)
- % synchronize the xml header
- xmlstring = ismrmrd.XMLHeader.headerToString(obj.xmlhdr);
- obj.writexml(xmlstring);
- % close the file
- H5F.close(obj.fid);
- end
-
- function xmlstring = readxml(obj)
-
- % Check if the XML header exists
- % TODO: set it's value to the default
- lapl_id=H5P.create('H5P_LINK_ACCESS');
- if (H5L.exists(obj.fid,obj.xmlpath,lapl_id) == 0)
- error('No XML header found.');
- end
- H5P.close(lapl_id);
-
- % Open
- xml_id = H5D.open(obj.fid, obj.xmlpath);
-
- % Get the type
- xml_dtype = H5D.get_type(xml_id);
-
- % Read the data
- hdr = H5D.read(xml_id, xml_dtype, 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT');
-
- % Output depends on whether or not the stored string was variale length
- if (H5T.is_variable_str(xml_dtype))
- xmlstring = hdr{1};
- else
- xmlstring = hdr';
- end
-
- % Close the XML
- H5T.close(xml_dtype);
- H5D.close (xml_id);
- end
-
- function writexml(obj,xmlstring)
- % No validation is performed. You're on your own.
-
- % TODO: add error checking on the write and return a status
- % TODO: if the matlab variable length string bug is resolved
- % then we should change this logic to just modify the length
- % and overwrite.
-
- % Check if the XML header exists
- % if it does not exist, create it
- % if it exists, modify the size appropriately
- lapl_id=H5P.create('H5P_LINK_ACCESS');
- if (H5L.exists(obj.fid,obj.xmlpath,lapl_id) == 1)
- % Delete it
- H5L.delete(obj.fid, obj.xmlpath,'H5P_DEFAULT');
- end
- H5P.close(lapl_id);
-
- % Set variable length string type
- xml_dtype = H5T.copy('H5T_C_S1');
- % Matlab is having trouble writing variable length strings
- % that are longer that 512 characters. Switched to fixed
- % length.
- % H5T.set_size(xml_dtype,'H5T_VARIABLE');
- H5T.set_size(xml_dtype, length(xmlstring));
- xml_space_id = H5S.create_simple (1, 1, []);
- xml_id = H5D.create (obj.fid, obj.xmlpath, xml_dtype, ....
- xml_space_id, 'H5P_DEFAULT');
- H5S.close(xml_space_id);
-
- % Write the data
- H5D.write(xml_id, xml_dtype, ...
- 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT', xmlstring);
-
- % Close the XML
- H5D.close(xml_id);
-
- end
-
- function nacq = getNumberOfAcquisitions(obj)
-
- dset = H5D.open(obj.fid, obj.datapath);
- space = H5D.get_space(dset);
- H5S.get_simple_extent_dims(space);
- [~,dims,~] = H5S.get_simple_extent_dims(space);
- nacq = dims(1);
- H5S.close(space);
- H5D.close(dset);
-
- end
-
- function acq = readAcquisition(obj, nacq)
-
- % Open the data
- dset_id = H5D.open(obj.fid, obj.datapath);
-
- % Open the data space
- file_space_id = H5D.get_space(dset_id);
-
- % Initialize the return object
- acq = ismrmrd.Acquisition;
-
- % Create a mem_space for reading
- dims = [1 1];
- mem_space_id = H5S.create_simple(2,dims,[]);
-
- % Read the desired acquisition
- offset = [nacq-1 0];
- H5S.select_hyperslab(file_space_id,'H5S_SELECT_SET',offset,[1 1],[1 1],[1 1]);
- d = H5D.read(dset_id, ismrmrd.hdf5_datatypes.getType_Acquisition, ...
- mem_space_id, file_space_id, 'H5P_DEFAULT');
-
- % Set the structure bits
- acq.head = d.head(1);
- acq.traj = d.traj{1};
- t = d.data{1};
- acq.data = t(1:2:end) + 1j*t(2:2:end);
-
- % Clean up
- H5S.close(mem_space_id);
- H5S.close(file_space_id);
- H5D.close(dset_id);
- end
-
- function appendAcquisition(obj, acq)
- % Append an acquisition
-
- % TODO: Check the type of the input
-
- % Check if the Data exists
- % if it does not exist, create it
- % if it does exist increase it's size by one
- lapl_id=H5P.create('H5P_LINK_ACCESS');
- if (H5L.exists(obj.fid, obj.datapath, lapl_id) == 0)
- % Data does not exist
- % create with rank 2, unlimited, and set the chunk size
- dims = [1 1];
- maxdims = [H5ML.get_constant_value('H5S_UNLIMITED') 1];
- file_space_id = H5S.create_simple(2, dims, maxdims);
-
- dcpl = H5P.create('H5P_DATASET_CREATE');
- chunk = [1 1];
- H5P.set_chunk (dcpl, chunk);
- data_id = H5D.create(obj.fid, obj.datapath, ...
- ismrmrd.hdf5_datatypes.getType_Acquisition, ...
- file_space_id, dcpl);
- H5P.close(dcpl);
- H5S.close(file_space_id);
-
- else
- % Open the data
- data_id = H5D.open(obj.fid, obj.datapath);
-
- % Open the data space
- file_space_id = H5D.get_space(data_id);
-
- % Get the size, increment by one
- H5S.get_simple_extent_dims(file_space_id);
- [~,dims,~] = H5S.get_simple_extent_dims(file_space_id);
- dims = [dims(1)+1, 1];
- H5D.set_extent (data_id, dims);
- H5S.close(file_space_id);
-
- end
- H5P.close(lapl_id);
-
- % Get the file space (room for one more acq)
- file_space_id = H5D.get_space(data_id);
- [~,dims,~] = H5S.get_simple_extent_dims(file_space_id);
-
- % Select the last block
- offset = [dims(1)-1 0];
- H5S.select_hyperslab(file_space_id,'H5S_SELECT_SET',offset,[],[],[]);
-
- % Mem space
- mem_space_id = H5S.create_simple(2,[1 1],[]);
-
- % Pack the acquisition into the correct struct for writing
- swarn = warning('query','MATLAB:structOnObject');
- warning('off', 'MATLAB:structOnObject')
- d.head(1) = struct(acq.head);
- d.head(1).idx = struct(acq.head.idx);
- warning(swarn.state, 'MATLAB:structOnObject')
- d.traj{1} = acq.traj;
- t = zeros(2*length(acq.data),1,'single');
- t(1:2:end) = real(acq.data);
- t(2:2:end) = imag(acq.data);
- d.data{1} = t;
-
- % Write
- H5D.write(data_id, ismrmrd.hdf5_datatypes.getType_Acquisition(), ...
- mem_space_id, file_space_id, 'H5P_DEFAULT', d);
-
- % Clean up
- H5S.close(mem_space_id);
- H5S.close(file_space_id);
- H5D.close(data_id);
- end
-
- end
-
-end
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git
More information about the debian-science-commits
mailing list