17 HDFDataManager::HDFDataManager(std::string
const &a_filename) :
18 m_filename( a_filename ) {
20#if defined (GIDIP_HAVE_COMPILER_FLOATING_POINT_EXCEPTIONS)
21 LUPI_FPE_disable_and_clear( __FILE__, __LINE__ );
24 m_file_id = H5Fopen( a_filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT );
25 H5Eset_auto1(
nullptr,
nullptr );
27 m_dataset_ints = H5Dopen2( m_file_id,
"iData", H5P_DEFAULT );
28 m_iDataPresent = m_dataset_ints != H5I_INVALID_HID;
29 if( m_iDataPresent ) m_dataspace_ints = H5Dget_space( m_dataset_ints );
31 m_dataset_doubles = H5Dopen2( m_file_id,
"dData", H5P_DEFAULT );
32 m_dDataPresent = m_dataset_doubles != H5I_INVALID_HID;
33 if( m_dDataPresent ) m_dataspace_doubles = H5Dget_space( m_dataset_doubles );
35#if defined (GIDIP_HAVE_COMPILER_FLOATING_POINT_EXCEPTIONS)
37 LUPI_FPE_test( __FILE__, __LINE__ );
38 LUPI_FPE_enable( __FILE__, __LINE__ );
45 HDFDataManager::~HDFDataManager()
47 if( m_iDataPresent ) {
48 H5Dclose(m_dataset_ints);
49 H5Sclose(m_dataspace_ints);
51 if( m_iDataPresent ) {
52 H5Dclose(m_dataset_doubles);
53 H5Sclose(m_dataspace_doubles);
58 void HDFDataManager::getDoubles(nf_Buffer<double> &result,
size_t startIndex,
size_t endIndex)
60 if( !m_dDataPresent )
throw LUPI::Exception(
"HDFDataManager::getDoubles: HDF5 file " + m_filename +
" has no 'dData' dataset." );
65 hsize_t size = endIndex - startIndex;
67 hsize_t dims[] {size};
68 hsize_t
offset[] {startIndex};
69 hsize_t count[] {size};
72 m_num_double_reads ++;
73 m_num_double_elem += size;
77 memspace = H5Screate_simple(1, dims,
nullptr);
78 status = H5Sselect_hyperslab(m_dataspace_doubles, H5S_SELECT_SET,
offset, m_stride, count, m_block);
79 if( status != 0 )
throw "H5Sselect_hyperslab error in HDFDataManager::getDoubles.";
81 status = H5Dread(m_dataset_doubles, H5T_NATIVE_DOUBLE, memspace, m_dataspace_doubles, H5P_DEFAULT, result.data());
82 if( status != 0 )
throw "H5Dread error in HDFDataManager::getDoubles.";
88 void HDFDataManager::getInts(nf_Buffer<int> &result,
size_t startIndex,
size_t endIndex)
90 if( !m_iDataPresent )
throw LUPI::Exception(
"HDFDataManager::getInts: HDF5 file " + m_filename +
" has no 'iData' dataset." );
94 hsize_t size = endIndex - startIndex;
96 hsize_t dims[] {size};
97 hsize_t
offset[] {startIndex};
98 hsize_t count[] {size};
103 m_num_int_elem += size;
105 memspace = H5Screate_simple(1, dims,
nullptr);
106 status = H5Sselect_hyperslab(m_dataspace_ints, H5S_SELECT_SET,
offset, m_stride, count, m_block);
107 if( status != 0 )
throw "H5Sselect_hyperslab error in HDFDataManager::getDoubles.";
109 status = H5Dread(m_dataset_ints, H5T_NATIVE_INT, memspace, m_dataspace_ints, H5P_DEFAULT, result.data());
110 if( status != 0 )
throw "H5Dread error in HDFDataManager::getDoubles.";
G4ThreadLocal T * G4GeomSplitter< T >::offset