Skip to content

Commit 364cf2b

Browse files
authored
Merge pull request #234 from aglowacki/master
Added importer for sec12 datasets
2 parents 37d6d6d + 619e00d commit 364cf2b

3 files changed

Lines changed: 144 additions & 4 deletions

File tree

src/io/file/hdf5_io.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ bool HDF5_IO::end_save_seq(bool loginfo)
512512

513513
//-----------------------------------------------------------------------------
514514

515-
bool HDF5_IO::polar_copy_raw(const std::string filename)
515+
bool HDF5_IO::copy_to_raw_grp(const std::string filename, const std::string src_path)
516516
{
517517
hid_t src_file_id = -1;
518518
hid_t src_grp_id = -1;
@@ -547,7 +547,7 @@ bool HDF5_IO::polar_copy_raw(const std::string filename)
547547
return false;
548548
}
549549
//copy /entry to /MAPS/raw
550-
herr_t status = H5Ocopy(src_grp_id, "entry", maps_grp_id, "Raw", ocpypl_id, H5P_DEFAULT);
550+
herr_t status = H5Ocopy(src_grp_id, src_path.c_str(), maps_grp_id, "Raw", ocpypl_id, H5P_DEFAULT);
551551
if (status > 0)
552552
{
553553
logW << "Failed to copy from /entry to /MAPS/Raw\n";

src/io/file/hdf5_io.h

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

src/io/file/hl_file_io.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,7 @@ DLL_EXPORT bool load_spectra_volume(std::string dataset_directory,
924924
data_struct::Params_Override<double>* null_po = nullptr;
925925
io::file::HDF5_IO::inst()->save_scan_scalers(&scan_info, null_po);
926926
// copy /entry to /MAPS/raw
927-
io::file::HDF5_IO::inst()->polar_copy_raw(dataset_directory+dataset_file);
927+
io::file::HDF5_IO::inst()->copy_to_raw_grp(dataset_directory+dataset_file, "entry");
928928
return true;
929929
}
930930
else
@@ -1167,6 +1167,15 @@ DLL_EXPORT bool load_spectra_volume(std::string dataset_directory,
11671167

11681168
return true;
11691169
}
1170+
// try sec12 dataset
1171+
else if(true == io::file::HDF5_IO::inst()->load_spectra_vol_sec12(fullpath, detector_num, spectra_volume, scan_info_edf))
1172+
{
1173+
scan_type = scan_info_edf.meta_info.scan_type;
1174+
io::file::HDF5_IO::inst()->start_save_seq(true);
1175+
io::file::HDF5_IO::inst()->save_scan_scalers(&scan_info_edf, params_override);
1176+
io::file::HDF5_IO::inst()->copy_to_raw_grp(dataset_directory+dataset_file, "metadata");
1177+
return true;
1178+
}
11701179
}
11711180

11721181
//try loading emd dataset if it ends in .emd

0 commit comments

Comments
 (0)