[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