[Insight-developers] HDF5 writer streaming
David Froger
david.froger at inria.fr
Mon Dec 30 01:40:06 EST 2013
Hi all,
I would like to add writer streaming support to the HDF5 module. Writer
streaming would includes:
1) Write a whole array in a new HDF5 file by iteration on subregion writting.
For example: write NZ times an array of dimension (NY*NX) in a new HDF5 file
that will finally store an array of dimensions (NZ*NY*NX).
2) Paste (override) a subregion in an existing HDF5 file. (This require to
open the file in a different mode).
I know how to do it in HDF5, I've looked at the source code of the HDF5 ITK
module, and have some questions on how to patch the HDF5 module.
To support reading and writing subregion, HDF5 manipulates simple arrays
defining the start and the size of the region to read/write. These arrays are
'HDFSize' and 'offset' in the method HDF5ImageIO::SetupStreaming of the file
itkHDF5ImageIO.cxx, and their values are set according to the size and index
of the region 'this->GetIORegion()':
void
HDF5ImageIO
::SetupStreaming(H5::DataSpace *imageSpace, H5::DataSpace *slabSpace)
{
ImageIORegion regionToRead = this->GetIORegion();
ImageIORegion::SizeType size = regionToRead.GetSize();
ImageIORegion::IndexType start = regionToRead.GetIndex();
//
int numComponents = this->GetNumberOfComponents();
const int HDFDim(this->GetNumberOfDimensions() +
(numComponents > 1 ? 1 : 0));
hsize_t *offset = new hsize_t[HDFDim];
hsize_t *HDFSize = new hsize_t[HDFDim];
int limit;
//
// fastest moving dimension is intra-voxel
// index
if(numComponents > 1)
{
limit = HDFDim - 1;
offset[limit] = 0;
HDFSize[limit] = numComponents;
}
else
{
limit = HDFDim;
}
for(int i=0; i < limit; i++)
{
offset[limit - i - 1] = start[i];
HDFSize[limit - i - 1] = size[i];
}
slabSpace->setExtentSimple(HDFDim,HDFSize);
imageSpace->selectHyperslab(H5S_SELECT_SET,HDFSize,offset);
delete[] HDFSize;
delete[] offset;
}
When reading a file, 'this->GetIORegion()' can be modified by calling
reader->GetOutput()->SetRequestedRegion(requestedRegion);
which enables input streaming.
But how to modifiy 'this->GetIORegion()' when writing in a file, for case 1)
and 2)?
Which example / source code can I look to get started with writer streaming?
Thanks for your help!
David
More information about the Insight-developers
mailing list