17HDF5FileLayout::HDF5FileLayout(HDF5FileLayoutParameters conf,
23 m_conf_params = get_v0_file_layout_params();
25 fill_path_params_maps(m_conf_params);
31HDF5FileLayout::check_config()
37 if (m_conf_params.record_name_prefix.compare(
"TriggerRecord") == 0) {
38 if (m_conf_params.digits_for_sequence_number == 0) {
40 m_conf_params.digits_for_sequence_number = 4;
42 }
else if (m_conf_params.record_name_prefix.compare(
"TimeSlice") == 0) {
43 if (m_conf_params.digits_for_sequence_number != 0) {
45 m_conf_params.digits_for_sequence_number = 0;
48 throw InvalidRecordName(
ERS_HERE, m_conf_params.record_name_prefix);
53HDF5FileLayout::get_path_params(daqdataformats::SourceID::Subsystem type)
const
56 return m_path_params_map.at(type);
57 }
catch (std::out_of_range&) {
58 throw FileLayoutUnconfiguredSubsystem(
ERS_HERE, type, daqdataformats::SourceID::subsystem_to_string(type));
63HDF5FileLayout::get_record_number_string(uint64_t record_number,
64 daqdataformats::sequence_number_t seq_num)
const
66 std::ostringstream record_number_string;
68 int width = m_conf_params.digits_for_record_number;
69 record_number_string << m_conf_params.record_name_prefix << std::setw(width) << std::setfill(
'0') << record_number;
71 if (m_conf_params.digits_for_sequence_number > 0) {
73 width = m_conf_params.digits_for_sequence_number;
74 record_number_string <<
"." << std::setw(width) << std::setfill(
'0') << seq_num;
77 return record_number_string.str();
81HDF5FileLayout::get_trigger_number_string(daqdataformats::trigger_number_t trig_num,
82 daqdataformats::sequence_number_t seq_num)
const
84 return get_record_number_string(trig_num, seq_num);
88HDF5FileLayout::get_timeslice_number_string(daqdataformats::timeslice_number_t ts_num)
const
90 return get_record_number_string(ts_num);
96std::vector<std::string>
97HDF5FileLayout::get_path_elements(
const daqdataformats::TriggerRecordHeader& trh)
const
100 std::vector<std::string> path_elements;
103 path_elements.push_back(get_trigger_number_string(trh.get_trigger_number(), trh.get_sequence_number()));
106 path_elements.push_back(m_conf_params.raw_data_group_name);
109 path_elements.push_back(trh.get_header().element_id.to_string() +
"_" +
110 m_conf_params.record_header_dataset_name);
112 return path_elements;
118std::vector<std::string>
119HDF5FileLayout::get_path_elements(
const daqdataformats::TimeSliceHeader& tsh)
const
122 std::vector<std::string> path_elements;
125 path_elements.push_back(get_timeslice_number_string(tsh.timeslice_number));
128 path_elements.push_back(m_conf_params.raw_data_group_name);
131 path_elements.push_back(tsh.element_id.to_string() +
"_" + m_conf_params.record_header_dataset_name);
133 return path_elements;
139std::vector<std::string>
140HDF5FileLayout::get_path_elements(
const daqdataformats::FragmentHeader& fh)
const
143 std::vector<std::string> path_elements;
147 path_elements.push_back(get_trigger_number_string(fh.trigger_number, fh.sequence_number));
150 path_elements.push_back(m_conf_params.raw_data_group_name);
153 path_elements.push_back(
154 fh.element_id.to_string() +
"_" +
155 daqdataformats::fragment_type_to_string(
static_cast<daqdataformats::FragmentType
>(fh.fragment_type)));
157 return path_elements;
164HDF5FileLayout::get_path_string(
const daqdataformats::TimeSliceHeader& tsh)
const
166 std::ostringstream path_string;
167 path_string <<
"/" << get_timeslice_number_string(tsh.timeslice_number)
168 <<
"/" << m_conf_params.raw_data_group_name
169 <<
"/" << tsh.element_id.to_string() <<
"_" << m_conf_params.record_header_dataset_name;
170 return path_string.str();
177HDF5FileLayout::get_record_header_path(uint64_t rec_num,
178 daqdataformats::sequence_number_t seq_num)
const
180 return get_record_number_string(rec_num, seq_num) +
"/" + m_conf_params.record_header_dataset_name;
187HDF5FileLayout::get_trigger_record_header_path(daqdataformats::trigger_number_t trig_num,
188 daqdataformats::sequence_number_t seq_num)
const
190 return get_trigger_number_string(trig_num, seq_num) +
"/" + m_conf_params.record_header_dataset_name;
197HDF5FileLayout::get_timeslice_header_path(daqdataformats::timeslice_number_t ts_num)
const
199 return get_timeslice_number_string(ts_num) +
"/" + m_conf_params.record_header_dataset_name;
206HDF5FileLayout::get_fragment_path(uint64_t trig_num,
207 daqdataformats::sequence_number_t seq_num,
208 daqdataformats::SourceID element_id)
const
211 auto const& path_params = get_path_params(element_id.subsystem);
213 std::ostringstream path_string;
214 path_string << get_trigger_number_string(trig_num, seq_num) <<
"/" << path_params.detector_group_name <<
"/"
215 << path_params.element_name_prefix << std::setw(path_params.digits_for_element_number)
216 << std::setfill(
'0') << element_id.id;
217 return path_string.str();
224HDF5FileLayout::get_fragment_path(uint64_t trig_num,
225 daqdataformats::sequence_number_t seq_num,
226 daqdataformats::SourceID::Subsystem type,
227 uint32_t element_id)
const
229 daqdataformats::SourceID sid{
type, element_id };
230 return get_fragment_path(trig_num, seq_num, sid);
237HDF5FileLayout::get_fragment_path(uint64_t trig_num,
238 daqdataformats::sequence_number_t seq_num,
239 const std::string& typestring,
240 uint32_t element_id)
const
242 daqdataformats::SourceID sid{ daqdataformats::SourceID::string_to_subsystem(typestring), element_id };
243 return get_fragment_path(trig_num, seq_num, sid);
250HDF5FileLayout::get_fragment_type_path(uint64_t trig_num,
251 daqdataformats::sequence_number_t seq_num,
252 daqdataformats::SourceID::Subsystem type)
const
254 auto const& path_params = get_path_params(type);
256 std::ostringstream path_string;
257 path_string << get_trigger_number_string(trig_num, seq_num) <<
"/" << path_params.detector_group_name;
258 return path_string.str();
265HDF5FileLayout::get_fragment_type_path(uint64_t trig_num,
266 daqdataformats::sequence_number_t seq_num,
267 std::string typestring)
const
269 return get_fragment_type_path(trig_num, seq_num, daqdataformats::SourceID::string_to_subsystem(typestring));
272daqdataformats::SourceID
273HDF5FileLayout::get_source_id_from_path_elements(std::vector<std::string>
const& path_elements)
const
277 daqdataformats::SourceID::Subsystem systype = m_detector_group_name_to_type_map.at(path_elements[1]);
280 auto path_params = get_path_params(systype);
283 auto ele_id = std::stoi(path_elements[3].substr(path_params.element_name_prefix.size()));
285 return daqdataformats::SourceID(systype, ele_id);
289HDF5FileLayout::fill_path_params_maps(HDF5FileLayoutParameters
const& flp)
291 for (
auto const& path_param : flp.path_params_list) {
292 auto sys_type = daqdataformats::SourceID::string_to_subsystem(path_param.detector_group_type);
294 if (sys_type == daqdataformats::SourceID::Subsystem::kUnknown)
295 throw FileLayoutInvalidSubsystem(
ERS_HERE, path_param.detector_group_type);
297 m_path_params_map[sys_type] = path_param;
298 m_detector_group_name_to_type_map[path_param.detector_group_name] = sys_type;
305HDF5FileLayoutParameters
306HDF5FileLayout::get_v0_file_layout_params()
308 HDF5FileLayoutParameters flp;
309 flp.record_name_prefix =
"TriggerRecord";
310 flp.digits_for_record_number = 6;
311 flp.digits_for_sequence_number = 0;
312 flp.record_header_dataset_name =
"TriggerRecordHeader";
314 HDF5PathParameters pp;
316 pp.detector_group_type =
"TPC";
317 pp.detector_group_name =
"TPC";
318 pp.element_name_prefix =
"Link";
319 pp.digits_for_element_number = 2;
320 flp.path_params_list.push_back(pp);
322 pp.detector_group_type =
"PDS";
323 pp.detector_group_name =
"PDS";
324 pp.element_name_prefix =
"Element";
325 pp.digits_for_element_number = 2;
326 flp.path_params_list.push_back(pp);
328 pp.detector_group_type =
"NDLArTPC";
329 pp.detector_group_name =
"NDLArTPC";
330 pp.element_name_prefix =
"Element";
331 pp.digits_for_element_number = 2;
332 flp.path_params_list.push_back(pp);
334 pp.detector_group_type =
"NDLArPDS";
335 pp.detector_group_name =
"NDLArPDS";
336 pp.element_name_prefix =
"Element";
337 pp.digits_for_element_number = 2;
338 flp.path_params_list.push_back(pp);
340 pp.detector_group_type =
"DataSelection";
341 pp.detector_group_name =
"Trigger";
342 pp.element_name_prefix =
"Element";
343 pp.digits_for_element_number = 2;
344 flp.path_params_list.push_back(pp);
void warning(const Issue &issue)
void error(const Issue &issue)