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

Reply via email to