@@ -1203,6 +1203,137 @@ class DLL_EXPORT HDF5_IO
12031203 return true ;
12041204 }
12051205
1206+ // -----------------------------------------------------------------------------
1207+
1208+ template <typename T_real>
1209+ bool load_spectra_vol_sec12 (std::string path, size_t detector_num, data_struct::Spectra_Volume<T_real>* spec_vol, data_struct::Scan_Info<T_real> &scan_info, [[maybe_unused]] bool logerr = true )
1210+ {
1211+ std::stack<std::pair<hid_t , H5_OBJECTS> > close_map;
1212+ hid_t file_id = -1 , xspres_grp_id = -1 ;
1213+ hid_t pos_id = -1 ;
1214+ hsize_t pos_dims_in[2 ];
1215+ hsize_t pos_offset[2 ];
1216+ hsize_t pos_count[2 ];
1217+
1218+ {
1219+ std::lock_guard<std::mutex> lock (_mutex);
1220+ if (false == _open_h5_object (file_id, H5O_FILE, close_map, path, -1 ))
1221+ {
1222+ return false ;
1223+ }
1224+
1225+ if (false == _open_h5_object (pos_id, H5O_DATASET, close_map, " metadata/positions" , file_id))
1226+ {
1227+ return false ;
1228+ }
1229+ else
1230+ {
1231+ hid_t dataspace_id = H5Dget_space (pos_id);
1232+ close_map.push ({ dataspace_id, H5O_DATASPACE });
1233+ int rank = H5Sget_simple_extent_ndims (dataspace_id);
1234+ if (rank != 2 )
1235+ {
1236+ _close_h5_objects (close_map);
1237+ logE << " Unknown positions layout. Rank is not 2\n " ;
1238+ return false ;
1239+ }
1240+
1241+ // start reading in positions
1242+
1243+ int status_n = H5Sget_simple_extent_dims (dataspace_id, &pos_dims_in[0 ], nullptr );
1244+ if (status_n < 0 )
1245+ {
1246+ _close_h5_objects (close_map);
1247+ logE << " Getting dataset rank for metadata/positions\n " ;
1248+ return false ;
1249+ }
1250+
1251+ for (hsize_t i = 0 ; i < rank; i++)
1252+ {
1253+ pos_offset[i] = 0 ;
1254+ pos_count[i] = pos_dims_in[i];
1255+ }
1256+
1257+ pos_count[1 ] = 1 ;
1258+ T_real *temp_read_in_x = new T_real[pos_count[0 ]];
1259+ T_real *temp_read_in_y = new T_real[pos_count[0 ]];
1260+ hid_t memoryspace_meta_id = H5Screate_simple (1 , pos_count, nullptr );
1261+ H5Sselect_hyperslab (dataspace_id, H5S_SELECT_SET, pos_offset, nullptr , pos_count, nullptr );
1262+ herr_t error = _read_h5d<T_real>(pos_id, memoryspace_meta_id, dataspace_id, H5P_DEFAULT, (void *)temp_read_in_x);
1263+ if (error < 0 )
1264+ {
1265+ logW<<" Error reading in x positions\n " ;
1266+ }
1267+
1268+ pos_offset[1 ] = 1 ;
1269+ H5Sselect_hyperslab (dataspace_id, H5S_SELECT_SET, pos_offset, nullptr , pos_count, nullptr );
1270+ error = _read_h5d<T_real>(pos_id, memoryspace_meta_id, dataspace_id, H5P_DEFAULT, (void *)temp_read_in_y);
1271+ if (error < 0 )
1272+ {
1273+ logW<<" Error reading in x positions\n " ;
1274+ }
1275+
1276+ T_real start_val = temp_read_in_y[0 ];
1277+ for (unsigned int i=1 ; i< pos_count[0 ]; i++)
1278+ {
1279+ if ( temp_read_in_y[i] != start_val)
1280+ {
1281+ scan_info.meta_info .requested_cols = i;
1282+ break ;
1283+ }
1284+ }
1285+ scan_info.meta_info .requested_rows = pos_count[0 ] / scan_info.meta_info .requested_cols ;
1286+ scan_info.meta_info .x_axis .resize (scan_info.meta_info .requested_cols );
1287+ scan_info.meta_info .y_axis .resize (scan_info.meta_info .requested_rows );
1288+
1289+ // generate hashmap for pos to index
1290+ std::unordered_map<T_real, int > pos_to_idx_hash;
1291+
1292+ for (unsigned int i=0 ; i < scan_info.meta_info .requested_cols ; i++)
1293+ {
1294+ scan_info.meta_info .x_axis [i] = temp_read_in_x[i];
1295+ pos_to_idx_hash[temp_read_in_x[i]] = i;
1296+ }
1297+ for (unsigned int i=0 , j=0 ; i < pos_count[0 ]; i+= scan_info.meta_info .requested_cols , j++)
1298+ {
1299+ scan_info.meta_info .y_axis [j] = temp_read_in_x[i];
1300+ }
1301+
1302+ // start reading in spectra volume
1303+ // read whole dataset in as spec_row , then alloc spec_vol and copy
1304+ data_struct::Spectra_Line<T_real> spec_row;
1305+ if (false == _load_spectra_line_xspress3 (file_id, detector_num, &spec_row))
1306+ {
1307+ logW<<" Failed to load spectra data.\n " ;
1308+ _close_h5_objects (close_map);
1309+ return false ;
1310+ }
1311+ // copy from line to vol depending on positions
1312+ spec_vol->resize_and_zero (scan_info.meta_info .requested_rows , scan_info.meta_info .requested_cols , spec_row[0 ].size ());
1313+ unsigned int i = 0 ;
1314+ for (unsigned int y=0 ; y< scan_info.meta_info .requested_rows ; y++)
1315+ {
1316+ for (unsigned int x=0 ; x< scan_info.meta_info .requested_cols ; x++)
1317+ {
1318+ unsigned int prop_x = pos_to_idx_hash[temp_read_in_x[i]];
1319+ for (unsigned int s=0 ; s< spec_row[0 ].size (); s++)
1320+ {
1321+ (*spec_vol)[y][prop_x][s] = spec_row[i][s];
1322+ }
1323+ i++;
1324+ }
1325+ }
1326+
1327+ scan_info.meta_info .scan_type = STR_SCAN_TYPE_2D_MAP;
1328+
1329+ delete [] temp_read_in_x;
1330+ delete [] temp_read_in_y;
1331+ _close_h5_objects (close_map);
1332+ return true ;
1333+ }
1334+ }
1335+ }
1336+
12061337 // -----------------------------------------------------------------------------
12071338 // load spectra volume as float (T_real) but scan_info as double (T_real2)
12081339 template <typename T_real, typename T_real2>
@@ -5736,7 +5867,7 @@ class DLL_EXPORT HDF5_IO
57365867
57375868 const std::string& get_filename () { return _cur_filename; }
57385869
5739- bool polar_copy_raw (const std::string filename);
5870+ bool copy_to_raw_grp (const std::string filename, const std::string src_path );
57405871
57415872 // -----------------------------------------------------------------------------
57425873
0 commit comments