[ismrmrd] 200/281: Fixed matlab generated files to have the same layout as the ones generated by the C++ code.
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:01:14 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 c9841545dff844ddb7a6963f22823ddebe16789b
Author: Souheil Inati <souheil.inati at nih.gov>
Date: Thu Feb 6 11:37:34 2014 -0500
Fixed matlab generated files to have the same layout as the ones generated by the C++ code.
---
examples/matlab/test_recon_dataset.m | 32 ++-
matlab/+ismrmrd/+util/hdf5_datatypes.m | 384 ++++++++-------------------------
matlab/+ismrmrd/Acquisition.m | 16 +-
matlab/+ismrmrd/AcquisitionHeader.m | 9 +-
matlab/+ismrmrd/IsmrmrdDataset.m | 3 +-
5 files changed, 132 insertions(+), 312 deletions(-)
diff --git a/examples/matlab/test_recon_dataset.m b/examples/matlab/test_recon_dataset.m
index 3cb0a16..00cd4e5 100644
--- a/examples/matlab/test_recon_dataset.m
+++ b/examples/matlab/test_recon_dataset.m
@@ -28,7 +28,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Loading an existing file %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-filename = 'shepp-logan.h5';
+filename = 'testdata.h5';
if exist(filename, 'file')
dset = ismrmrd.IsmrmrdDataset(filename, 'dataset');
else
@@ -62,23 +62,33 @@ rec_FOVz = dset.xmlhdr.getEncoding.get(0).getReconSpace.getFieldOfViewMm.getZ;
if isempty(dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getSlice)
nSlices = 1;
else
- nSlices = dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getSlice.getMaximum;
+ nSlices = dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getSlice.getMaximum;
+ if nSlices == 0;
+ nSlices = 1;
+ end
end
-% Number of coils, in the system information
-nCoils = double(dset.xmlhdr.getAcquisitionSystemInformation.getReceiverChannels);
+% Number of coils, repetitions, contrasts etc.
+% We have to wrap this in a try/catch because a valid xml header may
+% not have an entry for the the parameter in question
+% Encoding limit values in the XML header are zero based
+% Java return values needed to be converte to matlab types for math.
+try
+ nCoils = double(dset.xmlhdr.getAcquisitionSystemInformation.getReceiverChannels);
+catch
+ nCoils = 1;
+end
-% Repetitions, contrasts etc.
-if isempty(dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getRepetition)
+try
+ nReps = double(dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getRepetition.getMaximum) + 1;
+catch
nReps = 1;
-else
- nReps = double(dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getRepetition.getMaximum);
end
-if isempty(dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getContrast)
+try
+ nContrasts = double(dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getContrast.getMaximum) + 1;
+catch
nContrasts = 1;
-else
- nContrasts = double(dset.xmlhdr.getEncoding.get(0).getEncodingLimits.getContrast.getMaximum);
end
% TODO add the other possibilites
diff --git a/matlab/+ismrmrd/+util/hdf5_datatypes.m b/matlab/+ismrmrd/+util/hdf5_datatypes.m
index 14788d7..2562d08 100644
--- a/matlab/+ismrmrd/+util/hdf5_datatypes.m
+++ b/matlab/+ismrmrd/+util/hdf5_datatypes.m
@@ -1,6 +1,11 @@
classdef hdf5_datatypes
% This convenience class defines the HDF5 types used in the
% ISMRMRD HDF5 file
+
+% The names, types, layout and offsets consistent with that generated
+% by the C++ API. See the note at the bottom of the file for how to
+% do this.
+
properties
T_float;
T_double;
@@ -63,144 +68,46 @@ classdef hdf5_datatypes
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');
- 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]));
+ b = H5T.create ('H5T_COMPOUND', 34);
+ H5T.insert(b, 'kspace_encode_step_1', 0, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'kspace_encode_step_2', 2, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'average', 4, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'slice', 6, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'contrast', 8, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'phase', 10, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'repetition', 12, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'set', 14, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'segment', 16, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'user', 18, 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'); % 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
- typesize = typesize + 16*H5T.get_size('H5T_NATIVE_UINT64'); % channel_mask
- typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % discard_pre
- typesize = typesize + H5T.get_size('H5T_NATIVE_UINT16'); % discard_post
- 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 + 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
- typesize = typesize + 3*H5T.get_size('H5T_NATIVE_FLOAT'); % slice_dir
- typesize = typesize + 3*H5T.get_size('H5T_NATIVE_FLOAT'); % patient_table_position
- typesize = typesize + H5T.get_size(ismrmrd.util.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');
- 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, 'number_of_samples', offset, 'H5T_NATIVE_UINT16');
- offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
- H5T.insert(b, 'available_channels', offset, 'H5T_NATIVE_UINT16');
- offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
- 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');
-
- H5T.insert(b, 'discard_post', offset, 'H5T_NATIVE_UINT16');
- offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
- H5T.insert(b, 'center_sample', offset, 'H5T_NATIVE_UINT16');
- offset = offset + H5T.get_size('H5T_NATIVE_UINT16');
-
- 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');
-
- H5T.insert(b, 'position', offset, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
- offset = offset + 3*H5T.get_size('H5T_NATIVE_FLOAT');
-
- H5T.insert(b, 'read_dir', offset, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
- offset = offset + 3*H5T.get_size('H5T_NATIVE_FLOAT');
-
- H5T.insert(b, 'phase_dir', offset, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
- offset = offset + 3*H5T.get_size('H5T_NATIVE_FLOAT');
-
- 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.util.hdf5_datatypes.getType_EncodingCounters);
- offset = offset + H5T.get_size(ismrmrd.util.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');
-
- H5T.insert(b, 'user_float', offset, H5T.array_create('H5T_NATIVE_FLOAT',[8]));
- %offset = offset + 8*H5T.get_size('H5T_NATIVE_FLOAT');
-
+ b = H5T.create ('H5T_COMPOUND', 360);
+ H5T.insert(b, 'version', 0, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'flags', 2, 'H5T_NATIVE_UINT64');
+ H5T.insert(b, 'measurement_uid', 10, 'H5T_NATIVE_UINT32');
+ H5T.insert(b, 'scan_counter', 14, 'H5T_NATIVE_UINT32');
+ H5T.insert(b, 'acquisition_time_stamp', 18, 'H5T_NATIVE_UINT32');
+ H5T.insert(b, 'physiology_time_stamp', 22, H5T.array_create('H5T_NATIVE_UINT32',[3]));
+ H5T.insert(b, 'number_of_samples', 54, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'available_channels', 56, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'active_channels', 58, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'channel_mask', 60, H5T.array_create('H5T_NATIVE_UINT64',[16]));
+ H5T.insert(b, 'discard_pre', 188, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'discard_post', 190, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'center_sample', 192, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'encoding_space_ref', 194, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'trajectory_dimensions', 196, 'H5T_NATIVE_UINT16');
+ H5T.insert(b, 'sample_time_us', 198, 'H5T_NATIVE_FLOAT');
+ H5T.insert(b, 'position', 202, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
+ H5T.insert(b, 'read_dir', 214, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
+ H5T.insert(b, 'phase_dir', 226, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
+ H5T.insert(b, 'slice_dir', 238, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
+ H5T.insert(b, 'patient_table_position', 250, H5T.array_create('H5T_NATIVE_FLOAT',[3]));
+ H5T.insert(b, 'idx', 262, ismrmrd.util.hdf5_datatypes.getType_EncodingCounters);
+ H5T.insert(b, 'user_int', 296, H5T.array_create('H5T_NATIVE_INT32',[8]));
+ H5T.insert(b, 'user_float', 328, H5T.array_create('H5T_NATIVE_FLOAT',[8]));
end
function b = getType_Acquisition()
@@ -209,171 +116,56 @@ classdef hdf5_datatypes
traj = H5T.vlen_create(ismrmrd.util.hdf5_datatypes.getType_float());
data = H5T.vlen_create(ismrmrd.util.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;
- H5T.insert(b, 'head', offset, head);
- offset = offset + H5T.get_size(head);
- H5T.insert(b, 'traj', offset, traj);
- offset = offset + H5T.get_size(traj);
- H5T.insert(b, 'data', offset, data);
+ b = H5T.create ('H5T_COMPOUND', 392);
+ H5T.insert(b, 'head', 0, head);
+ H5T.insert(b, 'traj', 360, traj);
+ H5T.insert(b, 'data', 376, 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);
-%
-% dims[0] = 3;
-% boost::shared_ptr<DataType> slice_dir_array_type(new ArrayType(PredType::NATIVE_FLOAT, 1, &dims[0]));
-% ret->insertMember( "slice_dir", HOFFSET(ImageHeader, slice_dir), *slice_dir_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);
-%
-% 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);
-% ret->insertMember( "phase", HOFFSET(ImageHeader, phase), PredType::NATIVE_UINT16);
-% 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>)));
-% boost::shared_ptr<DataType> head_type = getIsmrmrdHDF5Type<ImageHeader>();
-% boost::shared_ptr<DataType> vdatatype = getIsmrmrdHDF5Type<float>();
-% vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
-% ret->insertMember( "head", HOFFSET(ImageHeader_with_data<float>,head), *head_type);
-% 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>)));
-% boost::shared_ptr<DataType> head_type = getIsmrmrdHDF5Type<ImageHeader>();
-% boost::shared_ptr<DataType> vdatatype = getIsmrmrdHDF5Type<double>();
-% vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
-% ret->insertMember( "head", HOFFSET(ImageHeader_with_data<double>,head), *head_type);
-% 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>)));
-% boost::shared_ptr<DataType> head_type = getIsmrmrdHDF5Type<ImageHeader>();
-% boost::shared_ptr<DataType> vdatatype = getIsmrmrdHDF5Type<unsigned short>();
-% vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
-% ret->insertMember( "head", HOFFSET(ImageHeader_with_data<unsigned short>,head), *head_type);
-% 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>)));
-% boost::shared_ptr<DataType> head_type = getIsmrmrdHDF5Type<ImageHeader>();
-% boost::shared_ptr<DataType> vdatatype = getIsmrmrdHDF5Type<complex_t>();
-% vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
-% ret->insertMember( "head", HOFFSET(ImageHeader_with_data<complex_t>,head), *head_type);
-% 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>)));
-% boost::shared_ptr<DataType> head_type = getIsmrmrdHDF5Type<ImageHeader>();
-% boost::shared_ptr<DataType> vdatatype = getIsmrmrdHDF5Type<double_complex_t>();
-% vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
-% ret->insertMember( "head", HOFFSET(ImageHeader_with_data<double_complex_t>,head), *head_type);
-% 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> >();
-% }
-%
-% }
-%
+% Generate a dataset using the C++ utilities and run
+% h5ls -a -v testdata/dataset/data
+% This produces something the following output
+%"head" +0 struct {
+% "version" +0 native unsigned short
+% "flags" +2 native unsigned long
+% "measurement_uid" +10 native unsigned int
+% "scan_counter" +14 native unsigned int
+% "acquisition_time_stamp" +18 native unsigned int
+% "physiology_time_stamp" +22 [3] native unsigned int
+% "number_of_samples" +54 native unsigned short
+% "available_channels" +56 native unsigned short
+% "active_channels" +58 native unsigned short
+% "channel_mask" +60 [16] native unsigned long
+% "discard_pre" +188 native unsigned short
+% "discard_post" +190 native unsigned short
+% "center_sample" +192 native unsigned short
+% "encoding_space_ref" +194 native unsigned short
+% "trajectory_dimensions" +196 native unsigned short
+% "sample_time_us" +198 native float
+% "position" +202 [3] native float
+% "read_dir" +214 [3] native float
+% "phase_dir" +226 [3] native float
+% "slice_dir" +238 [3] native float
+% "patient_table_position" +250 [3] native float
+% "idx" +262 struct {
+% "kspace_encode_step_1" +0 native unsigned short
+% "kspace_encode_step_2" +2 native unsigned short
+% "average" +4 native unsigned short
+% "slice" +6 native unsigned short
+% "contrast" +8 native unsigned short
+% "phase" +10 native unsigned short
+% "repetition" +12 native unsigned short
+% "set" +14 native unsigned short
+% "segment" +16 native unsigned short
+% "user" +18 [8] native unsigned short
+% } 34 bytes
+% "user_int" +296 [8] native int
+% "user_float" +328 [8] native float
+%} 360 bytes
+%"traj" +360 variable length of native float
+%"data" +376 variable length of native float
+%} 392 bytes
diff --git a/matlab/+ismrmrd/Acquisition.m b/matlab/+ismrmrd/Acquisition.m
index 9dd441d..cdb8dcf 100644
--- a/matlab/+ismrmrd/Acquisition.m
+++ b/matlab/+ismrmrd/Acquisition.m
@@ -87,8 +87,13 @@ classdef Acquisition < handle
function extend(obj,N)
% Extend with blank head and empty traj and data.
- M = N+obj.getNumber();
- obj.head.extend(N);
+ if isempty(obj.head)
+ M = N;
+ obj.head = ismrmrd.AcquisitionHeader(N);
+ else
+ M = N+obj.getNumber();
+ obj.head.extend(N);
+ end
obj.traj{M} = [];
obj.data{M} = [];
end
@@ -117,6 +122,13 @@ classdef Acquisition < handle
end
end
+ function v = trajToFloat(obj)
+ v = cell(1,length(obj.traj));
+ for p = 1:length(obj.traj)
+ v{p} = single(obj.traj{p});
+ end
+ end
+
end
end
\ No newline at end of file
diff --git a/matlab/+ismrmrd/AcquisitionHeader.m b/matlab/+ismrmrd/AcquisitionHeader.m
index cd4e3db..ad2471f 100644
--- a/matlab/+ismrmrd/AcquisitionHeader.m
+++ b/matlab/+ismrmrd/AcquisitionHeader.m
@@ -461,8 +461,13 @@ classdef AcquisitionHeader < handle
obj.flags(range(p)) = obj.flags(range(p)) - bitmask;
end
end
-
-
+ end
+
+ function flagClearAll(obj, range)
+ if nargin < 2
+ range = 1:obj.getNumber;
+ end
+ obj.flags(range) = zeros(1,length(range),'uint64');
end
end
diff --git a/matlab/+ismrmrd/IsmrmrdDataset.m b/matlab/+ismrmrd/IsmrmrdDataset.m
index d38fbae..da55be2 100644
--- a/matlab/+ismrmrd/IsmrmrdDataset.m
+++ b/matlab/+ismrmrd/IsmrmrdDataset.m
@@ -268,9 +268,10 @@ classdef IsmrmrdDataset
mem_space_id = H5S.create_simple(2,[N 1],[]);
% Pack the acquisition into the correct struct for writing
+ % TODO: Error checking.
d = struct();
d.head = acq.head.toStruct();
- d.traj = acq.traj;
+ d.traj = acq.trajToFloat();
d.data = acq.dataToFloat();
% Write
--
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