[ismrmrd] 07/281: More work on HDF5 interface
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:00:48 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 51ab520f4cc6512b6b9662e87b2b5505de40cad2
Author: Michael S. Hansen <michael.hansen at nih.gov>
Date: Tue Jul 31 16:17:57 2012 -0400
More work on HDF5 interface
---
CMakeLists.txt | 8 +-
ismrmrd_hdf5.cpp | 103 +++++++++++++-
ismrmrd_hdf5.h | 6 +-
ismrmrd_hdf5_datatypes.h | 343 -----------------------------------------------
schema/ismrmrd.xsd | 93 +++++++------
5 files changed, 148 insertions(+), 405 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9262257..f3719cd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,7 +10,7 @@ find_package(HDF5 1.8 COMPONENTS C CXX HL REQUIRED)
#Process the XSD files
SET(XSDS schema/ismrmrd.xsd)
-SET(XSD_ARGS cxx-tree --generate-serialization)
+SET(XSD_ARGS cxx-tree --generate-serialization --export-symbol EXPORTISMRMRD --hxx-prologue-file ${CMAKE_SOURCE_DIR}/ismrmrd_export.h)
WRAP_XSD(XSDS_SOURCES XSD_INCLUDES ${CMAKE_CURRENT_BINARY_DIR}/schema ${XSDS} OPTIONS ${XSD_ARGS})
@@ -18,10 +18,10 @@ INCLUDE_DIRECTORIES(${XSD_INCLUDES} ${XERCESC_INCLUDE_DIR} ${Boost_INCLUDE_DIR}
add_executable(ismrmrd_test main.cpp ${XSDS_SOURCES})
target_link_libraries(ismrmrd_test ${XERCESC_LIBRARIES})
-add_library(ismrmrd SHARED ismrmrd_hdf5.cpp)
-target_link_libraries(ismrmrd ${HDF5_LIBRARIES})
+add_library(ismrmrd SHARED ismrmrd_hdf5.cpp ${XSDS_SOURCES})
+target_link_libraries(ismrmrd ${HDF5_LIBRARIES} ${XERCESC_LIBRARIES})
-INSTALL(FILES ismrmrd.h ismrmrd_hdf5.h ismrmrd_hdf5_datatypes.h ismrmrd_export.h DESTINATION include)
+INSTALL(FILES ismrmrd.h ${XSDS_SOURCES} ismrmrd_hdf5.h ismrmrd_hdf5_datatypes.h ismrmrd_export.h DESTINATION include)
INSTALL(FILES schema/ismrmrd.xsd DESTINATION schema)
INSTALL(FILES cmake/FindIsmrmrd.cmake DESTINATION cmake)
INSTALL(TARGETS ismrmrd DESTINATION lib)
diff --git a/ismrmrd_hdf5.cpp b/ismrmrd_hdf5.cpp
index a76b826..865d7c2 100644
--- a/ismrmrd_hdf5.cpp
+++ b/ismrmrd_hdf5.cpp
@@ -163,36 +163,125 @@ int IsmrmrdDataset::appendAcquisition(Acquisition* a)
return 0;
}
+boost::shared_ptr< Acquisition > IsmrmrdDataset::readAcquisition(unsigned long int index)
+{
+ boost::shared_ptr<Acquisition> ret;
+ if (!linkExists(data_path_.c_str())) {
+ std::cerr << "Data path does not exist in HDF5 dataset" << std::endl;
+ return ret;
+ }
+
+
+ boost::shared_ptr<DataType> datatype = getIsmrmrdHDF5Type<AcquisitionHeader_with_data>();
+ if (!dataset_open_) {
+ try{
+ dataset_ = boost::shared_ptr<DataSet>(new DataSet(file_->openDataSet(data_path_.c_str())));
+ dataset_open_ = true;
+ } catch( Exception& e ) {
+ std::cout << "Exception caught while opening (creating) HDF5 dataset" << std::endl;
+ std::cout << e.getDetailMsg() << std::endl;
+ return ret;
+ }
+ }
+
+ try {
+ DataSpace dataspace = dataset_->getSpace();
+ DataType dtype = dataset_->getDataType();
+
+ if (!(dtype == *datatype)) {
+ std::cout << "Attempting to open HDF5 dataset with the wrong type" << std::endl;
+ return ret;
+ }
+
+ int rank = dataspace.getSimpleExtentNdims();
+ std::vector<hsize_t> dims(rank,0);
+ dataspace.getSimpleExtentDims(&dims[0]);
+
+ if (dims[0] <= index) {
+ std::cout << "Attempting to access non-existing hyperslice in HDF5 dataset" << std::endl;
+ return ret;
+ }
+
+ std::vector<hsize_t> slice_dims(rank,0);
+ std::vector<hsize_t> offset(rank,0);
+
+ slice_dims[0] = 1;
+ offset[0] = index;
+
+
+ dataspace.selectHyperslab( H5S_SELECT_SET, &slice_dims[0], &offset[0] );
+
+ DataSpace memspace(rank,&slice_dims[0]);
+
+ AcquisitionHeader_with_data tmp;
+
+ //OK finally ready, now read the data.
+ dataset_->read(reinterpret_cast<void*>(&tmp), *datatype, memspace, dataspace, H5P_DEFAULT);
+
+ ret = boost::shared_ptr<Acquisition>(new Acquisition());
+ ret->head_ = tmp.head;
+ ret->traj_ = reinterpret_cast<float*>(tmp.traj.p);
+ ret->data_ = reinterpret_cast<float*>(tmp.data.p);
+
+ } catch (...) {
+ std::cout << "Error caught while attempting to read HDF5 file" << std::endl;
+ return ret;
+ }
+
+ return ret;
+
+}
+
int IsmrmrdDataset::writeHeader(std::string& xml) {
std::vector<hsize_t> dims(1,1);
std::vector<hsize_t> max_dims(1,1);
boost::shared_ptr<DataSet> xml_dataset;
- hid_t datatype = H5Tcopy (H5T_C_S1);
- H5Tset_size (datatype, H5T_VARIABLE);
+ boost::shared_ptr<DataType> datatype(new StrType(0, H5T_VARIABLE));
try {
if (!linkExists(xml_header_path_.c_str())) {
DataSpace mspace1( dims.size(), &dims[0], &max_dims[0]);
- xml_dataset = boost::shared_ptr<DataSet>(new DataSet(file_->createDataSet( xml_header_path_.c_str(), datatype, mspace1)));
+ xml_dataset = boost::shared_ptr<DataSet>(new DataSet(file_->createDataSet( xml_header_path_.c_str(), *datatype, mspace1)));
} else {
xml_dataset = boost::shared_ptr<DataSet>(new DataSet(file_->openDataSet(xml_header_path_.c_str())));
- DataType mtype = dataset_->getDataType();
- if (!(mtype == (datatype))) {
+ DataType mtype = xml_dataset->getDataType();
+ if (!(mtype == (*datatype))) {
std::cout << "Attempting to append XML data to HDF5 dataset with the wrong type" << std::endl;
return -1;
}
}
DataSpace mspace1 = xml_dataset->getSpace();
- xml_dataset->write( xml.c_str(), datatype, mspace1);
+ xml_dataset->write(xml,*datatype,mspace1);
+
} catch( Exception& e ) {
std::cout << "Exception caught while writing XML Header to HDF5 file" << std::endl;
std::cout << e.getDetailMsg() << std::endl;
return -1;
}
+ return 0;
+}
+boost::shared_ptr<std::string> IsmrmrdDataset::readHeader()
+{
+ boost::shared_ptr<std::string> ret(new std::string(""));
+ if (!linkExists(xml_header_path_.c_str())) {
+ std::cerr << "Path for XML parameters not found in HDF5 file" << std::endl;
+ return ret;
+ }
- return 0;
+ try {
+ boost::shared_ptr<DataSet> xml_dataset = boost::shared_ptr<DataSet>(new DataSet(file_->openDataSet(xml_header_path_.c_str())));
+ boost::shared_ptr<DataType> datatype(new StrType(0, H5T_VARIABLE));
+ xml_dataset->read(*ret,*datatype);
+ } catch( Exception& e ) {
+ std::cout << "Exception caught while readin XML Header to HDF5 file" << std::endl;
+ std::cout << e.getDetailMsg() << std::endl;
+ return ret;
+ }
+
+ return ret;
}
+
} //End of ISMRMRD namespace
diff --git a/ismrmrd_hdf5.h b/ismrmrd_hdf5.h
index 309ec40..f8c992d 100644
--- a/ismrmrd_hdf5.h
+++ b/ismrmrd_hdf5.h
@@ -49,6 +49,9 @@ public:
int appendAcquisition(Acquisition* a);
int writeHeader(std::string& xml);
+ boost::shared_ptr<std::string> readHeader();
+ boost::shared_ptr<Acquisition> readAcquisition(unsigned long index = 0);
+
protected:
int openHDF5File();
bool linkExists(const char* name);
@@ -81,9 +84,6 @@ struct AcquisitionHeader_with_data
hvl_t data;
};
-EXPORTISMRMRD int H5AppendAcquisition(Acquisition* a, const char* filename, const char* varname);
-EXPORTISMRMRD boost::shared_ptr<Acquisition> H5ReadAcquisition(const char* filename, const char* varname, unsigned long index = 0);
-
} //end of ISMRMRD namespace
diff --git a/ismrmrd_hdf5_datatypes.h b/ismrmrd_hdf5_datatypes.h
index 6357e59..22865fb 100644
--- a/ismrmrd_hdf5_datatypes.h
+++ b/ismrmrd_hdf5_datatypes.h
@@ -127,349 +127,6 @@ template <> boost::shared_ptr<DataType> getIsmrmrdHDF5Type<AcquisitionHeader_wit
return ret;
}
-
-/*
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<mdhCutOff>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(mdhCutOff)));
-
- ret->insertMember( "ushPre", HOFFSET(mdhCutOff,ushPre), PredType::NATIVE_UINT16);
- ret->insertMember( "ushPost", HOFFSET(mdhCutOff,ushPost), PredType::NATIVE_UINT16);
-
- return ret;
-};
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<mdhSlicePosVec>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(mdhSlicePosVec)));
-
- ret->insertMember( "flSag", HOFFSET(mdhSlicePosVec,flSag), PredType::NATIVE_FLOAT);
- ret->insertMember( "flCor", HOFFSET(mdhSlicePosVec,flCor), PredType::NATIVE_FLOAT);
- ret->insertMember( "flTra", HOFFSET(mdhSlicePosVec,flTra), PredType::NATIVE_FLOAT);
-
- return ret;
-};
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<mdhSliceData>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(mdhSliceData)));
-
- std::vector<hsize_t> dims(1,4);
- boost::shared_ptr<DataType> array_type(new ArrayType(PredType::NATIVE_FLOAT, 1, &dims[0]));
- boost::shared_ptr<DataType> slicepos_type = getSiemensHDF5Type<mdhSlicePosVec>();
-
- ret->insertMember( "sSlicePosVec", HOFFSET(mdhSliceData,sSlicePosVec), *slicepos_type);
- ret->insertMember( "aflQuaternion", HOFFSET(mdhSliceData,aflQuaternion), *array_type);
- return ret;
-};
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<sMDH>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(sMDH)));
-
- std::vector<hsize_t> dims(1,2);
- boost::shared_ptr<DataType> array_type_eval(new ArrayType(PredType::NATIVE_UINT, 1, &dims[0]));
-
- dims[0] = 4;
- boost::shared_ptr<DataType> array_type_icepara(new ArrayType(PredType::NATIVE_USHORT, 1, &dims[0]));
- boost::shared_ptr<DataType> array_type_freepara(new ArrayType(PredType::NATIVE_USHORT, 1, &dims[0]));
-
- boost::shared_ptr<DataType> lc_type = getSiemensHDF5Type<mdhLC>();
- boost::shared_ptr<DataType> cutoff_type = getSiemensHDF5Type<mdhCutOff>();
-
- boost::shared_ptr<DataType> slicedata_type = getSiemensHDF5Type<mdhSliceData>();
-
- ret->insertMember( "ulFlagsAndDMALength", HOFFSET(sMDH,ulFlagsAndDMALength), PredType::NATIVE_UINT32);
- ret->insertMember( "lMeasUID", HOFFSET(sMDH,lMeasUID), PredType::NATIVE_INT32);
- ret->insertMember( "ulScanCounter", HOFFSET(sMDH,ulScanCounter), PredType::NATIVE_UINT32);
- ret->insertMember( "ulTimeStamp", HOFFSET(sMDH,ulTimeStamp), PredType::NATIVE_UINT32);
- ret->insertMember( "ulPMUTimeStamp", HOFFSET(sMDH,ulPMUTimeStamp), PredType::NATIVE_UINT32);
- ret->insertMember( "aulEvalInfoMask", HOFFSET(sMDH,aulEvalInfoMask), *array_type_eval);
- ret->insertMember( "ushSamplesInScan", HOFFSET(sMDH,ushSamplesInScan), PredType::NATIVE_UINT16);
- ret->insertMember( "ushUsedChannels", HOFFSET(sMDH,ushUsedChannels), PredType::NATIVE_UINT16);
- ret->insertMember( "sLC", HOFFSET(sMDH,sLC), *lc_type);
- ret->insertMember( "sCutOff", HOFFSET(sMDH,sCutOff), *cutoff_type);
- ret->insertMember( "ushKSpaceCentreColumn", HOFFSET(sMDH,ushKSpaceCentreColumn), PredType::NATIVE_UINT16);
- ret->insertMember( "ushCoilSelect", HOFFSET(sMDH,ushCoilSelect), PredType::NATIVE_UINT16);
- ret->insertMember( "fReadOutOffcentre", HOFFSET(sMDH,fReadOutOffcentre), PredType::NATIVE_FLOAT);
- ret->insertMember( "ulTimeSinceLastRF", HOFFSET(sMDH,ulTimeSinceLastRF), PredType::NATIVE_UINT16);
- ret->insertMember( "ushKSpaceCentreLineNo", HOFFSET(sMDH,ushKSpaceCentreLineNo), PredType::NATIVE_UINT16);
- ret->insertMember( "ushKSpaceCentrePartitionNo", HOFFSET(sMDH,ushKSpaceCentrePartitionNo), PredType::NATIVE_UINT16);
- ret->insertMember( "aushIceProgramPara", HOFFSET(sMDH,aushIceProgramPara), *array_type_icepara);
- ret->insertMember( "aushFreePara", HOFFSET(sMDH,aushFreePara), *array_type_freepara);
- ret->insertMember( "sSliceData", HOFFSET(sMDH,sSliceData), *slicedata_type);
- ret->insertMember( "ushChannelId", HOFFSET(sMDH,ushChannelId), PredType::NATIVE_UINT16);
- ret->insertMember( "ushPTABPosNeg", HOFFSET(sMDH,ushPTABPosNeg), PredType::NATIVE_UINT16);
-
- return ret;
-}
-
-struct MDH_with_data
-{
- sMDH mdh;
- hvl_t data;
-};
-
-struct complex_t
-{
- float real;
- float imag;
-};
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<complex_t>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(complex_t)));
- ret->insertMember( "real", HOFFSET(complex_t,real), PredType::NATIVE_FLOAT);
- ret->insertMember( "imag", HOFFSET(complex_t,imag), PredType::NATIVE_FLOAT);
- return ret;
-}
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<MDH_with_data>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(MDH_with_data)));
-
- boost::shared_ptr<DataType> mdh_type = getSiemensHDF5Type<sMDH>();
- boost::shared_ptr<DataType> vdatatype = getSiemensHDF5Type<complex_t>();
- vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
-
- ret->insertMember( "mdh", HOFFSET(MDH_with_data,mdh), *mdh_type);
- ret->insertMember( "data", HOFFSET(MDH_with_data,data), *vdatatype);
-
- return ret;
-}
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<sScanHeader>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(sScanHeader)));
-
- std::vector<hsize_t> dims(1,2);
- boost::shared_ptr<DataType> array_type_eval(new ArrayType(PredType::NATIVE_UINT, 1, &dims[0]));
-
- dims[0] = 24;
- boost::shared_ptr<DataType> array_type_icepara(new ArrayType(PredType::NATIVE_USHORT, 1, &dims[0]));
- dims[0] = 4;
- boost::shared_ptr<DataType> array_type_reserved(new ArrayType(PredType::NATIVE_USHORT, 1, &dims[0]));
-
- boost::shared_ptr<DataType> lc_type = getSiemensHDF5Type<mdhLC>();
- boost::shared_ptr<DataType> cutoff_type = getSiemensHDF5Type<mdhCutOff>();
-
- boost::shared_ptr<DataType> slicedata_type = getSiemensHDF5Type<mdhSliceData>();
-
- ret->insertMember( "ulFlagsAndDMALength", HOFFSET(sScanHeader,ulFlagsAndDMALength), PredType::NATIVE_UINT32);
- ret->insertMember( "lMeasUID", HOFFSET(sScanHeader,lMeasUID), PredType::NATIVE_INT32);
- ret->insertMember( "ulScanCounter", HOFFSET(sScanHeader,ulScanCounter), PredType::NATIVE_UINT32);
- ret->insertMember( "ulTimeStamp", HOFFSET(sScanHeader,ulTimeStamp), PredType::NATIVE_UINT32);
- ret->insertMember( "ulPMUTimeStamp", HOFFSET(sScanHeader,ulPMUTimeStamp), PredType::NATIVE_UINT32);
- ret->insertMember( "ushSystemType", HOFFSET(sScanHeader,ushSystemType), PredType::NATIVE_UINT16);
- ret->insertMember( "ulPTABPosDelay", HOFFSET(sScanHeader,ulPTABPosDelay), PredType::NATIVE_UINT16);
- ret->insertMember( "lPTABPosX", HOFFSET(sScanHeader,lPTABPosX), PredType::NATIVE_INT32);
- ret->insertMember( "lPTABPosY", HOFFSET(sScanHeader,lPTABPosY), PredType::NATIVE_INT32);
- ret->insertMember( "lPTABPosZ", HOFFSET(sScanHeader,lPTABPosZ), PredType::NATIVE_INT32);
- ret->insertMember( "ulReserved1", HOFFSET(sScanHeader,ulReserved1), PredType::NATIVE_UINT32);
- ret->insertMember( "aulEvalInfoMask", HOFFSET(sScanHeader,aulEvalInfoMask), *array_type_eval);
- ret->insertMember( "ushSamplesInScan", HOFFSET(sScanHeader,ushSamplesInScan), PredType::NATIVE_UINT16);
- ret->insertMember( "ushUsedChannels", HOFFSET(sScanHeader,ushUsedChannels), PredType::NATIVE_UINT16);
- ret->insertMember( "sLC", HOFFSET(sScanHeader,sLC), *lc_type);
- ret->insertMember( "sCutOff", HOFFSET(sScanHeader,sCutOff), *cutoff_type);
- ret->insertMember( "ushKSpaceCentreColumn", HOFFSET(sScanHeader,ushKSpaceCentreColumn), PredType::NATIVE_UINT16);
- ret->insertMember( "ushCoilSelect", HOFFSET(sScanHeader,ushCoilSelect), PredType::NATIVE_UINT16);
- ret->insertMember( "fReadOutOffcentre", HOFFSET(sScanHeader,fReadOutOffcentre), PredType::NATIVE_FLOAT);
- ret->insertMember( "ulTimeSinceLastRF", HOFFSET(sScanHeader,ulTimeSinceLastRF), PredType::NATIVE_UINT16);
- ret->insertMember( "ushKSpaceCentreLineNo", HOFFSET(sScanHeader,ushKSpaceCentreLineNo), PredType::NATIVE_UINT16);
- ret->insertMember( "ushKSpaceCentrePartitionNo", HOFFSET(sScanHeader,ushKSpaceCentrePartitionNo), PredType::NATIVE_UINT16);
- ret->insertMember( "sSliceData", HOFFSET(sScanHeader,sSliceData), *slicedata_type);
- ret->insertMember( "aushIceProgramPara", HOFFSET(sScanHeader,aushIceProgramPara), *array_type_icepara);
- ret->insertMember( "aushReservedPara", HOFFSET(sScanHeader,aushReservedPara), *array_type_reserved);
- ret->insertMember( "ushApplicationCounter", HOFFSET(sScanHeader,ushApplicationCounter), PredType::NATIVE_UINT16);
- ret->insertMember( "ushApplicationMask", HOFFSET(sScanHeader,ushApplicationMask), PredType::NATIVE_UINT16);
- ret->insertMember( "ulCRC", HOFFSET(sScanHeader,ulCRC), PredType::NATIVE_UINT32);
-
- return ret;
-}
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<sChannelHeader>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(sChannelHeader)));
-
- ret->insertMember( "ulTypeAndChannelLength", HOFFSET(sChannelHeader,ulTypeAndChannelLength), PredType::NATIVE_UINT32);
- ret->insertMember( "lMeasUID", HOFFSET(sChannelHeader,lMeasUID), PredType::NATIVE_INT32);
- ret->insertMember( "ulScanCounter", HOFFSET(sChannelHeader,ulScanCounter), PredType::NATIVE_UINT32);
- ret->insertMember( "ulReserved1", HOFFSET(sChannelHeader,ulReserved1), PredType::NATIVE_UINT32);
- ret->insertMember( "ulSequenceTime", HOFFSET(sChannelHeader,ulSequenceTime), PredType::NATIVE_UINT32);
- ret->insertMember( "ulUnused2", HOFFSET(sChannelHeader,ulUnused2), PredType::NATIVE_UINT32);
- ret->insertMember( "ulChannelId", HOFFSET(sChannelHeader,ulChannelId), PredType::NATIVE_UINT16);
- ret->insertMember( "ulUnused3", HOFFSET(sChannelHeader,ulUnused3), PredType::NATIVE_UINT16);
- ret->insertMember( "ulCRC", HOFFSET(sChannelHeader,ulCRC), PredType::NATIVE_UINT32);
-
- return ret;
-}
-
-struct sChannelHeader_with_data
-{
- sChannelHeader channelHeader;
- hvl_t data;
-};
-
-void ClearsChannelHeader_with_data(sChannelHeader_with_data* b)
-{
- if (b->data.len) {
- if (b->data.p) {
- complex_t* ptr = reinterpret_cast<complex_t*>(b->data.p);
- delete [] ptr;
- }
- b->data.p = 0;
- b->data.len = 0;
- }
-}
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<sChannelHeader_with_data>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(sChannelHeader_with_data)));
-
- boost::shared_ptr<DataType> channelheader_type = getSiemensHDF5Type<sChannelHeader>();
- boost::shared_ptr<DataType> vdatatype = getSiemensHDF5Type<complex_t>();
- vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
- ret->insertMember( "channelHeader", HOFFSET(sChannelHeader_with_data, channelHeader), *channelheader_type);
- ret->insertMember( "data", HOFFSET(sChannelHeader_with_data,data), *vdatatype);
- return ret;
-}
-
-struct sScanHeader_with_data
-{
- sScanHeader scanHeader;
- hvl_t data;
-};
-
-struct sScanHeader_with_syncdata
-{
- sScanHeader scanHeader;
- uint32_t last_scan_counter;
- hvl_t syncdata;
-};
-
-void ClearsScanHeader_with_data(sScanHeader_with_data* c)
-{
- if (c->data.len) {
- if (c->data.p) {
- for (unsigned int i = 0; i < c->data.len; i++) {
- sChannelHeader_with_data* ptr = reinterpret_cast<sChannelHeader_with_data*>(c->data.p);
- ClearsChannelHeader_with_data(ptr+i);
- }
- }
- c->data.p = 0;
- c->data.len = 0;
- }
-}
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<sScanHeader_with_data>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(sScanHeader_with_data)));
-
- boost::shared_ptr<DataType> scanheader_type = getSiemensHDF5Type<sScanHeader>();
- boost::shared_ptr<DataType> vdatatype = getSiemensHDF5Type<sChannelHeader_with_data>();
- vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
- ret->insertMember( "scanHeader", HOFFSET(sScanHeader_with_data, scanHeader), *scanheader_type);
- ret->insertMember( "data", HOFFSET(sScanHeader_with_data,data), *vdatatype);
- return ret;
-}
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<sScanHeader_with_syncdata>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(sScanHeader_with_syncdata)));
-
- boost::shared_ptr<DataType> scanheader_type = getSiemensHDF5Type<sScanHeader>();
- boost::shared_ptr<DataType> vdatatype = boost::shared_ptr<DataType>(new DataType(PredType::NATIVE_CHAR));
- vdatatype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create (vdatatype->getId())));
- ret->insertMember( "scanHeader", HOFFSET(sScanHeader_with_syncdata, scanHeader), *scanheader_type);
- ret->insertMember( "last_scan_counter", HOFFSET(sScanHeader_with_syncdata, last_scan_counter), PredType::NATIVE_UINT32);
- ret->insertMember( "syncdata", HOFFSET(sScanHeader_with_syncdata,syncdata), *vdatatype);
- return ret;
-}
-
-struct MeasurementHeaderBuffer
-{
- hvl_t bufName_;
- uint32_t bufLen_;
- hvl_t buf_;
-};
-
-void ClearMeasurementHeaderBuffer(MeasurementHeaderBuffer* b)
-{
- if (b->bufName_.len) {
- if (b->bufName_.p) {
- char* ptr = reinterpret_cast<char*>(b->bufName_.p);
- delete [] ptr;
- }
- b->bufName_.p = 0;
- b->bufName_.len = 0;
- }
-
- if (b->buf_.len) {
- if (b->buf_.p) {
- char* ptr = reinterpret_cast<char*>(b->buf_.p);
- delete [] ptr;
- }
- b->buf_.len = 0;
- b->buf_.p = 0;
- }
-}
-
-struct MeasurementHeader
-{
-
-public:
- uint32_t dma_length;
- uint32_t nr_buffers;
- hvl_t buffers;
-
-};
-
-void ClearMeasurementHeader(MeasurementHeader* h)
-{
- if (h->buffers.len) {
- if (h->buffers.p) {
- MeasurementHeaderBuffer* ptr = reinterpret_cast<MeasurementHeaderBuffer*>(h->buffers.p);
- for (unsigned int i = 0; i < h->buffers.len; i++) {
- ClearMeasurementHeaderBuffer(ptr+i);
- }
- }
- h->buffers.p = 0;
- h->buffers.len = 0;
- }
-}
-
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<MeasurementHeaderBuffer>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(MeasurementHeaderBuffer)));
-
- boost::shared_ptr<DataType> buf_type(new DataType(PredType::NATIVE_CHAR));
- buf_type = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create ( buf_type->getId())));
-
- ret->insertMember( "bufName_", HOFFSET(MeasurementHeaderBuffer, bufName_), *buf_type);
- ret->insertMember( "bufLen_", HOFFSET(MeasurementHeaderBuffer,bufLen_), PredType::NATIVE_UINT32);
- ret->insertMember( "buf_", HOFFSET(MeasurementHeaderBuffer, buf_), *buf_type);
-
- return ret;
-}
-
-
-
-template <> boost::shared_ptr<DataType> getSiemensHDF5Type<MeasurementHeader>()
-{
- boost::shared_ptr<CompType> ret = boost::shared_ptr<CompType>(new CompType(sizeof(MeasurementHeader)));
-
- boost::shared_ptr<DataType> vtype = getSiemensHDF5Type<MeasurementHeaderBuffer>();
- vtype = boost::shared_ptr<DataType>(new DataType(H5Tvlen_create ( vtype->getId())));
-
- ret->insertMember( "dma_length", HOFFSET(MeasurementHeader,dma_length), PredType::NATIVE_UINT32);
- ret->insertMember( "nr_buffers", HOFFSET(MeasurementHeader,nr_buffers), PredType::NATIVE_UINT32);
- ret->insertMember( "buffers", HOFFSET(MeasurementHeader, buffers), *vtype);
-
- return ret;
-}
-*/
-
}
#endif /* ISMRMRD_HDF5_DATATYPES_H_ */
diff --git a/schema/ismrmrd.xsd b/schema/ismrmrd.xsd
index da4f419..cc9fbf6 100644
--- a/schema/ismrmrd.xsd
+++ b/schema/ismrmrd.xsd
@@ -1,32 +1,28 @@
-<?xml version="1.0"?>
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-targetNamespace="http://www.ismrm.org/ISMRMRD"
-xmlns="http://www.ismrm.org/ISMRMRD"
-elementFormDefault="qualified">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<xs:schema xmlns="http://www.ismrm.org/ISMRMRD" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.ismrm.org/ISMRMRD">
<xs:element name="ismrmrdHeader">
<xs:complexType>
<xs:sequence>
- <xs:element name="subjectInformation" type="subjectInformationType" minOccurs="0" maxOccurs="1" />
- <xs:element name="acquisitionSystemInformation" type="acquisitionSystemInformationType" minOccurs="0" maxOccurs="1" />
- <xs:element name="experimentalConditions" type="experimentalConditionsType" minOccurs="1" maxOccurs="1"/>
- <xs:element name="encoding" maxOccurs="65535" minOccurs="1">
+ <xs:element maxOccurs="1" minOccurs="0" name="subjectInformation" type="subjectInformationType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="acquisitionSystemInformation" type="acquisitionSystemInformationType"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="experimentalConditions" type="experimentalConditionsType"/>
+ <xs:element maxOccurs="65535" minOccurs="1" name="encoding">
<xs:complexType>
<xs:all>
- <xs:element name="encodedSpace" type="encodingSpaceType" minOccurs="1" maxOccurs="1"/>
- <xs:element name="reconSpace" type="encodingSpaceType" minOccurs="1" maxOccurs="1"/>
- <xs:element name="encodingLimits" type="encodingLimitsType" minOccurs="1" maxOccurs="1"/>
- <xs:element name="trajectory" type="trajectoryType" minOccurs="1" maxOccurs="1"/>
- <xs:element name="trajectoryDescription" type="trajectoryDescriptionType" minOccurs="0" maxOccurs="1" />
+ <xs:element maxOccurs="1" minOccurs="1" name="encodedSpace" type="encodingSpaceType"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="reconSpace" type="encodingSpaceType"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="encodingLimits" type="encodingLimitsType"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="trajectory" type="trajectoryType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="trajectoryDescription" type="trajectoryDescriptionType"/>
</xs:all>
</xs:complexType>
</xs:element>
- <xs:element name="userParameters" minOccurs="0" maxOccurs="1">
+ <xs:element maxOccurs="1" minOccurs="0" name="userParameters">
<xs:complexType>
<xs:sequence>
- <xs:element name="userParameterLong" type="userParameterLongType" minOccurs="0" maxOccurs="unbounded"/>
- <xs:element name="userParameterDouble" type="userParameterDoubleType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterLong" type="userParameterLongType"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterDouble" type="userParameterDoubleType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -36,8 +32,8 @@ elementFormDefault="qualified">
<xs:complexType name="subjectInformationType">
<xs:all>
- <xs:element name="patientName" type="xs:string" minOccurs="0"/>
- <xs:element name="patientWeight_kg" type="xs:float" minOccurs="0"/>
+ <xs:element minOccurs="0" name="patientName" type="xs:string"/>
+ <xs:element minOccurs="0" name="patientWeight_kg" type="xs:float"/>
</xs:all>
</xs:complexType>
@@ -49,9 +45,10 @@ elementFormDefault="qualified">
<xs:complexType name="acquisitionSystemInformationType">
<xs:all>
- <xs:element name="systemVendor" type="xs:string" minOccurs="0"/>
- <xs:element name="systemModel" type="xs:string" minOccurs="0"/>
- <xs:element name="systemFieldStrength_T" type="xs:float" minOccurs="0"/>
+ <xs:element minOccurs="0" name="systemVendor" type="xs:string"/>
+ <xs:element minOccurs="0" name="systemModel" type="xs:string"/>
+ <xs:element minOccurs="0" name="systemFieldStrength_T" type="xs:float"/>
+ <xs:element minOccurs="0" name="receivedChannels" type="xs:unsignedShort"/>
</xs:all>
</xs:complexType>
@@ -60,18 +57,18 @@ elementFormDefault="qualified">
<xs:element name="matrixSize">
<xs:complexType>
<xs:sequence>
- <xs:element type="xs:unsignedShort" name="x" default="1" minOccurs="1" maxOccurs="1"/>
- <xs:element type="xs:unsignedShort" name="y" default="1" minOccurs="1" maxOccurs="1"/>
- <xs:element type="xs:unsignedShort" name="z" default="1" minOccurs="1" maxOccurs="1"/>
+ <xs:element default="1" maxOccurs="1" minOccurs="1" name="x" type="xs:unsignedShort"/>
+ <xs:element default="1" maxOccurs="1" minOccurs="1" name="y" type="xs:unsignedShort"/>
+ <xs:element default="1" maxOccurs="1" minOccurs="1" name="z" type="xs:unsignedShort"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="fieldOfView_m">
<xs:complexType>
<xs:sequence>
- <xs:element type="xs:float" name="x" minOccurs="1" maxOccurs="1"/>
- <xs:element type="xs:float" name="y" minOccurs="1" maxOccurs="1"/>
- <xs:element type="xs:float" name="z" minOccurs="1" maxOccurs="1"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="x" type="xs:float"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="y" type="xs:float"/>
+ <xs:element maxOccurs="1" minOccurs="1" name="z" type="xs:float"/>
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -80,24 +77,24 @@ elementFormDefault="qualified">
<xs:complexType name="limitType">
<xs:all>
- <xs:element name="minimum" type="xs:unsignedShort" default="0"/>
- <xs:element name="maximum" type="xs:unsignedShort" default="0"/>
- <xs:element name="center" type="xs:unsignedShort" default="0"/>
+ <xs:element default="0" name="minimum" type="xs:unsignedShort"/>
+ <xs:element default="0" name="maximum" type="xs:unsignedShort"/>
+ <xs:element default="0" name="center" type="xs:unsignedShort"/>
</xs:all>
</xs:complexType>
<xs:complexType name="encodingLimitsType">
<xs:all>
- <xs:element name="kspace_encoding_step_0" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="kspace_encoding_step_1" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="kspace_encoding_step_2" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="average" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="slice" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="contrast" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="phase" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="repetition" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="set" type="limitType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="segment" type="limitType" minOccurs="0" maxOccurs="1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="kspace_encoding_step_0" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="kspace_encoding_step_1" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="kspace_encoding_step_2" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="average" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="slice" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="contrast" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="phase" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="repetition" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="set" type="limitType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="segment" type="limitType"/>
</xs:all>
</xs:complexType>
@@ -114,23 +111,23 @@ elementFormDefault="qualified">
<xs:complexType name="trajectoryDescriptionType">
<xs:sequence>
- <xs:element name="identifier" type="xs:string" minOccurs="1" maxOccurs="1" />
- <xs:element name="userParameterLong" type="userParameterLongType" minOccurs="0" maxOccurs="unbounded"/>
- <xs:element name="userParameterDouble" type="userParameterDoubleType" minOccurs="0" maxOccurs="unbounded"/>
- <xs:element name="comment" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element maxOccurs="1" minOccurs="1" name="identifier" type="xs:string"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterLong" type="userParameterLongType"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="userParameterDouble" type="userParameterDoubleType"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="comment" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="userParameterLongType">
<xs:all>
- <xs:element name="name" type="xs:string"/>
+ <xs:element name="name" type="xs:string"/>
<xs:element name="value" type="xs:long"/>
</xs:all>
</xs:complexType>
<xs:complexType name="userParameterDoubleType">
<xs:all>
- <xs:element name="name" type="xs:string"/>
+ <xs:element name="name" type="xs:string"/>
<xs:element name="value" type="xs:double"/>
</xs:all>
</xs:complexType>
--
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