Okay, sorry I now realized what you meant by the DRdata datatype. I am using that to know I need to get iq_data out but am not certain how to read this data from the dataset. Or are you suggesting there are class functions I can use from the DataType object to easily pull out my data?
On Tue, Jul 12, 2016 at 1:23 PM, Todd Dobmeyer <[email protected]> wrote: > What do you mean by the DRdata datatype? I am not sure what you mean or > how I would use it. This is my first time working with HDF5, sorry for some > newbie questions. > > On Tue, Jul 12, 2016 at 1:05 PM, David <[email protected]> wrote: > >> 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 >> > >
_______________________________________________ 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
