[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