13 #include <FairLogger.h>
18 #include <H5Gpublic.h>
19 #include <H5Ppublic.h>
30 #include <type_traits>
42 LOG(fatal) <<
"Exceded valid range of event numbers. Looking for " <<
fEventID <<
" max event number is "
44 if (uniqueEvents != numEvents / 2)
45 LOG(error) <<
"Number of events from metaData does not match the number of entries in HDF5 file!";
55 setEventIDAndTimestamps();
72 void AtHDFUnpacker::setEventIDAndTimestamps()
77 TString header_name = TString::Format(
"evt%lld_header",
fDataEventID);
78 auto header = get_header(header_name.Data());
84 }
catch (
const std::out_of_range &e) {
85 LOG(error) <<
"Expected " <<
fNumberTimestamps <<
" but the header is not long enough!";
86 }
catch (
const std::exception &e) {
87 LOG(debug) <<
"Failed to load the header, not setting timestamps.";
93 TString event_name = TString::Format(
"evt%lld_data",
fDataEventID);
96 std::size_t npads =
n_pads(event_name.Data());
98 for (
auto ipad = 0; ipad < npads; ++ipad)
107 AtPadReference PadRef = {rawadc[0], rawadc[1], rawadc[2], rawadc[3]};
109 auto pad = createPadAndSetIsAux(PadRef);
118 if (
fMap->IsAuxPad(padRef)) {
119 auto padName =
fMap->GetAuxName(padRef);
123 auto padNumber =
fMap->GetPadNum(padRef);
126 void AtHDFUnpacker::setAdc(
AtPad *pad,
const std::vector<int16_t> &data)
129 for (Int_t iTb = 0; iTb < 512; iTb++) {
131 pad->
SetADC(iTb, data.at(iTb + 5) - baseline);
138 Float_t baseline = 0;
141 for (Int_t iTb = 5; iTb < 25; iTb++)
142 baseline += data[iTb];
147 void AtHDFUnpacker::setDimensions(
AtPad *pad)
158 (mode ==
IO_MODE::READ) ? fileId = H5Fopen(file, H5F_ACC_RDONLY, H5P_DEFAULT)
159 : fileId = H5Fopen(file, H5F_ACC_RDWR, H5P_DEFAULT);
162 std::cout <<
"> hdf5_wrapper::open_file:MESSAGE, opening file: " << file <<
", ID: " << fileId <<
'\n';
166 std::cerr <<
"> AtHDFUnpacker::open_file:ERROR, invalid ID for file: " << file <<
'\n';
173 hid_t groupId = H5Gopen2(fileId, group, H5P_DEFAULT);
177 H5Gget_num_objs(groupId, &size);
178 return std::make_tuple(groupId, size);
181 std::cerr <<
"> AtHDFUnpacker::open_group:ERROR, invalid ID for group: " << group <<
'\n';
182 return std::make_tuple(-1, -1);
189 hid_t datasetId = H5Dopen2(locId, dataset, H5P_DEFAULT);
190 if (datasetId >= 0) {
193 hid_t dspaceId = H5Dget_space(datasetId);
194 int n_dims = H5Sget_simple_extent_ndims(dspaceId);
195 hsize_t dims[n_dims];
196 H5Sget_simple_extent_dims(dspaceId, dims,
nullptr);
197 std::vector<hsize_t> v_dims(dims, dims + n_dims);
198 return std::make_tuple(datasetId, v_dims);
200 std::cerr <<
"> AtHDFUnpacker::open_dataset:ERROR, invalid ID for dataset: " << dataset <<
'\n';
201 std::vector<hsize_t> v{0};
202 return std::make_tuple(0, v);
208 herr_t retId = H5Fclose(fileId);
210 std::cerr <<
"> AtHDFUnpacker::close_file:ERROR, cannot close file with ID: " << fileId <<
'\n';
215 herr_t retId = H5Gclose(groupId);
217 std::cerr <<
"> AtHDFUnpacker::close_group:ERROR, cannot close group with ID: " << groupId <<
'\n';
222 herr_t retId = H5Dclose(datasetId);
224 std::cerr <<
"> AtHDFUnpacker::close_dataset:ERROR, cannot close dataset with ID: " << datasetId <<
'\n';
231 auto metaID = std::get<0>(meta_size);
233 std::string datasetName =
"meta";
234 auto dataset_dims =
open_dataset(metaID, datasetName.c_str());
235 auto datasetId = std::get<0>(dataset_dims);
236 auto len = std::get<1>(dataset_dims).at(0);
238 auto *data =
new int64_t[len];
239 H5Dread(datasetId, H5T_NATIVE_ULONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
249 auto addToVector = [](hid_t group,
const char *name,
void *op_data) -> herr_t {
250 auto num = std::stoi(std::regex_replace(std::string(name), std::regex(
"[^0-9]"),
""));
251 auto data = (std::vector<long> *)op_data;
252 data->push_back(num);
253 LOG(debug) << name <<
" to " << num <<
" " << data->size();
257 std::vector<long> eventIDs;
258 H5Giterate(
_file,
"get", &idx, addToVector, &eventIDs);
259 fLastEvent = *std::max_element(eventIDs.begin(), eventIDs.end());
260 fFirstEvent = *std::min_element(eventIDs.begin(), eventIDs.end());
272 if (std::get<0>(group_n_entries) == -1)
274 _group = std::get<0>(group_n_entries);
276 return std::get<1>(group_n_entries);
279 std::string AtHDFUnpacker::get_event_name(std::size_t idx)
283 H5Lget_name_by_idx(
_group,
".", H5_INDEX_NAME, H5_ITER_INC, idx, name, 100, H5P_DEFAULT);
284 std::string name_string(name);
287 std::cerr <<
"> AtHDFUnpacker::get_event_name:ERROR, invalid ID " << idx <<
'\n';
292 std::vector<uint64_t> AtHDFUnpacker::get_header(std::string headerName)
294 std::vector<uint64_t> retVec;
297 if (std::get<0>(dataset_dims) == 0)
300 _dataset = std::get<0>(dataset_dims);
303 auto len = std::get<1>(dataset_dims).at(0);
307 H5Dread(
_dataset, H5T_NATIVE_ULONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, retVec.data());
321 std::string dataset_name = i_raw_event;
323 if (std::get<0>(dataset_dims) == 0)
325 _dataset = std::get<0>(dataset_dims);
326 return std::get<1>(dataset_dims)[0];
332 hsize_t counts[2] = {1, 517};
333 hsize_t offsets[2] = {i_pad, 0};
334 hsize_t dims_out[2] = {1, 517};
335 read_slab<int16_t>(
_dataset, counts, offsets, dims_out, data);
336 std::vector<int16_t> datav(data, data + 517);
346 std::size_t AtHDFUnpacker::datasets()
348 H5Literate(
_group, H5_INDEX_NAME, H5_ITER_INC,
nullptr, file_info,
nullptr);
352 herr_t AtHDFUnpacker::file_info(hid_t loc_id,
const char *name,
const H5L_info_t *linfo,
void *opdata)
358 group = H5Gopen2(loc_id, name, H5P_DEFAULT);
362 std::cout <<
"Name : " << name <<
"\n";
372 void AtHDFUnpacker::close()