Use the DRdata datatype that's already in the file.
On Tue, Jul 12, 2016 at 8:26 AM, Steven Walton <[email protected]>
wrote:
> So I don't have too much experience with compound data but I thought I'd
> take a crack at it. I had an issue a while ago trying to use pointer
> arrays, hdf5 allowing me to use float* but not float**. There are two ways
> you can rewrite this, assuming the data isn't rank 1. You could use a ctype
> array and use malloc to allocate the space, or you can use
> boost::multi_array. I found the latter to be nicer to work with. Data needs
> to be contiguous for hdf5 to understand it. If that doesn't work are you
> able to pull out the whole compound data at once? It appears that you have
> a nested structure.
>
> If I am reading this right you have
> typedef struct
> {
> float f_i;
> float f_q;
> } iq_data;
>
> typedef struct
> {
> bunch of stuff
> iq_data nested;
> } DRdata;
>
> You could also always try opening the data with python's h5py. I find the
> tool useful as it just reads whatever data you throw at it.
>
> On Tue, Jul 12, 2016 at 7:57 AM, Todd Dobmeyer <[email protected]>
> wrote:
>
>> Binh-Minh
>>
>> Making your change keeps me from crashing, but unfortunately doesn't get
>> any of the data. So to better understand my data, I have 7500 pieces of
>> DATA in the DATASPACE. Inside 1 piece of data is an array of Compound
>> objects each containing 2 floats. The Compound object is called iq_data and
>> the 2 floats inside are f_i and f_q.
>>
>> I originally did the 2D array thinking I needed the outside dimension to
>> be 7500 and the inner dimensions to be 1000. But now I think I need a 1D
>> array that holds 7500*1000 compound objects or 7500*1000*2 floats. However,
>> I cannot figure out how to read the data. Do I read "iq_data" or do I try
>> and read "f_i" and "f_q"?
>>
>> Thanks again and I hope I clarified things!
>> Todd
>>
>> On Tue, Jul 12, 2016 at 2:14 AM, Binh-Minh Ribler <[email protected]>
>> wrote:
>>
>>> Hi Todd,
>>>
>>>
>>> I'm not sure I understood your data completely, but I wonder what you
>>> will get if you change this line:
>>>
>>>
>>> complex_t** iqData = new complex_t*[nelems];
>>>
>>>
>>> to:
>>>
>>>
>>> complex_t* iqData = new complex_t[nelems];
>>>
>>>
>>> and read without the for loop...
>>>
>>>
>>> Binh-Minh
>>>
>>>
>>> ------------------------------
>>> *From:* Hdf-forum <[email protected]> on behalf of
>>> Todd Dobmeyer <[email protected]>
>>> *Sent:* Monday, July 11, 2016 3:10 PM
>>> *To:* [email protected]
>>> *Subject:* [Hdf-forum] Reading Nested Compound objects in C++
>>>
>>> All
>>>
>>> I have an HDF5 file I need to read in a C++ application. I performed an
>>> h5dump on the data and have the following structure (with many items
>>> removed that I am not interested in). I have successfully read in all 7500
>>> values of "num_samps" using the C++ HDF5 library. What I am struggling to
>>> figure out how to read is the array of compound "iq_data". I know in the
>>> datatype it says there are 1000 compound objects. I don't know if I can get
>>> this value out of the DataType, but I do know the num_samps points to this
>>> array size as well, which is fine since I can read this. Can any of you
>>> help me figure out how to read the "iq_data" array. Below is the sample
>>> data followed by my code I have so far. In my code "numSamps" is good, but
>>> "iqData" is not holding anything useful. I am sure I am missing something.
>>>
>>> Thanks for your help!
>>> Todd Dobmeyer
>>>
>>> --------------SAMPLE DATA-------------------------
>>>
>>> HDF5 "hdfFile.be01" {
>>> GROUP "/" {
>>> DATATYPE "DRdata" H5T_COMPOUND {
>>> H5T_ARRAY { [5] H5T_STD_U32LE } "guid";
>>> H5T_STD_I32LE "version";
>>> ...
>>> H5T_STD_U32LE "num_samps";
>>> ...
>>> H5T_STD_U32LE "sequence_dummy";
>>> H5T_ARRAY { [1000] H5T_COMPOUND {
>>> H5T_IEEE_F32LE "f_i";
>>> H5T_IEEE_F32LE "f_q";
>>> } } "iq_data";
>>> }
>>> DATASET "DRx1data" {
>>> DATATYPE "/DRx1"
>>> DATASPACE SIMPLE { ( 7500 ) / ( H5S_UNLIMITED ) }
>>> DATA {
>>> (0): {
>>> [ 352430272, 25602, 2314, 1442149219, 43629 ],
>>> 1,
>>> 1.44215e+09,
>>> 1442149219,
>>> 0,
>>> 1,
>>> 1,
>>> 0,
>>> 1,
>>> 0,
>>> 0,
>>> 0,
>>> 3,
>>> 0,
>>> 0,
>>> 0,
>>> 0,
>>> 1,
>>> 31095000,
>>> 20000,
>>> 0,
>>> 1000,
>>> 1000, // (this is num_samps)
>>> 1,
>>> 1000,
>>> [ {
>>> 1.09068e+09,
>>> 4.53469e+08
>>> }, {
>>> 4.03303e+08,
>>> 4.11846e+08
>>> }, {
>>> -1.35295e+08,
>>> -1.70107e+08
>>> }, ...
>>>
>>> --------------------CODE------------------
>>>
>>>
>>> typedef struct {
>>>
>>> float f_i;
>>>
>>> float f_q;
>>>
>>> } complex_t;
>>>
>>>
>>> int main(int argc, char *argv[])
>>>
>>> {
>>>
>>> std::string path = "/data/hdfFile.be01";
>>>
>>> // Open the file, dataset, and dataspace
>>>
>>> H5::H5File file(path, H5F_ACC_RDONLY);
>>>
>>> H5::DataSet dataset = file.openDataSet("DRx1data");
>>>
>>> H5::DataSpace dataspace = dataset.getSpace();
>>>
>>> // Get the number of elements and number of samples
>>>
>>> int nelems = dataspace.getSimpleExtentNpoints();
>>>
>>> int numSamps[nelems];
>>>
>>> // Create number of samples type
>>>
>>> H5::CompType sampsType(sizeof(uint));
>>>
>>> sampsType.insertMember("num_samps", 0, H5::PredType::STD_U32LE);
>>>
>>> // Read the number of samples
>>>
>>> dataset.read(numSamps, sampsType);
>>>
>>> // Now try to read the I/Q data
>>>
>>> H5::CompType iqDataType(sizeof(complex_t));
>>>
>>> iqDataType.insertMember("f_i", HOFFSET(complex_t, f_i),
>>> H5::PredType::NATIVE_FLOAT);
>>>
>>> iqDataType.insertMember("f_q", HOFFSET(complex_t, f_q),
>>> H5::PredType::NATIVE_FLOAT);
>>>
>>> complex_t** iqData = new complex_t*[nelems];
>>>
>>> for(int i = 0 ; i < nelems ; ++i)
>>>
>>> {
>>>
>>> iqData[i] = new complex_t[numSamps[i]];
>>>
>>> }
>>>
>>> dataset.read(iqData, iqDataType);
>>>
>>>
>>> _______________________________________________
>>> Hdf-forum is for HDF software users discussion.
>>> [email protected]
>>> http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
>>> Twitter: https://twitter.com/hdf5
>>>
>>
>>
>> _______________________________________________
>> Hdf-forum is for HDF software users discussion.
>> [email protected]
>> http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
>> Twitter: https://twitter.com/hdf5
>>
>
>
> _______________________________________________
> Hdf-forum is for HDF software users discussion.
> [email protected]
> http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
> Twitter: https://twitter.com/hdf5
>
_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5