28 [](std::ifstream& fileStream) {
30 std::getline(fileStream, line);
31 return std::stoul(line,
nullptr, 16);
39 for (std::size_t
index = 0;
index < m_GHITZTxtOutputKeys.size();
index++) {
40 m_GHITZTxtOutputEvents.push_back({});
43 ATH_CHECK(m_GHITZBinInputKeys.initialize());
44 ATH_CHECK(m_GHITZBinOutputKeys.initialize());
45 ATH_CHECK(m_GHITZBinInputKeys.size() == m_GHITZBinInputPaths.size());
47 for (std::size_t
index = 0;
index < m_GHITZBinInputKeys.size();
index++) {
48 m_GHITZBinInputEvents.push_back({});
50 m_GHITZBinInputPaths.value().at(
index),
51 [](std::ifstream& fileStream) {
52 std::array<char, 8> line;
53 fileStream.read(line.data(), 8);
54 return *std::bit_cast<uint64_t*>(line.data());
56 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
58 m_GHITZBinInputEvents.back()
62 for (std::size_t
index = 0;
index < m_GHITZBinOutputKeys.size();
index++) {
63 m_GHITZBinOutputEvents.push_back({});
66 ATH_CHECK(m_CLUSTERTxtInputKeys.initialize());
67 ATH_CHECK(m_CLUSTERTxtOutputKeys.initialize());
68 ATH_CHECK(m_CLUSTERTxtInputKeys.size() == m_CLUSTERTxtInputPaths.size());
70 for (std::size_t
index = 0;
index < m_CLUSTERTxtInputKeys.size();
index++) {
71 m_CLUSTERTxtInputEvents.push_back({});
73 m_CLUSTERTxtInputPaths.value().at(
index),
74 [](std::ifstream& fileStream) {
76 std::getline(fileStream, line);
77 return std::stoul(line,
nullptr, 16);
81 m_CLUSTERTxtInputEvents.back()
85 for (std::size_t
index = 0;
index < m_CLUSTERTxtOutputKeys.size();
index++) {
86 m_CLUSTERTxtOutputEvents.push_back({});
89 ATH_CHECK(m_CLUSTERBinInputKeys.initialize());
90 ATH_CHECK(m_CLUSTERBinOutputKeys.initialize());
91 ATH_CHECK(m_CLUSTERBinInputKeys.size() == m_CLUSTERBinInputPaths.size());
93 for (std::size_t
index = 0;
index < m_CLUSTERBinInputKeys.size();
index++) {
94 m_CLUSTERBinInputEvents.push_back({});
96 m_CLUSTERBinInputPaths.value().at(
index),
97 [](std::ifstream& fileStream) {
98 std::array<char, 8> line;
99 fileStream.read(line.data(), 8);
100 return *std::bit_cast<uint64_t*>(line.data());
102 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_STRIP_CLUSTER(word).last; },
104 m_CLUSTERBinInputEvents.back()
108 for (std::size_t
index = 0;
index < m_CLUSTERBinOutputKeys.size();
index++) {
109 m_CLUSTERBinOutputEvents.push_back({});
112 return StatusCode::SUCCESS;
120 ATH_CHECK(GHITZTxtInputHandle.
record(std::make_unique<std::vector<uint64_t>>(
129 ATH_CHECK(GHITZBinInputHandle.
record(std::make_unique<std::vector<uint64_t>>(
138 ATH_CHECK(CLUSTERTxtInputHandle.
record(std::make_unique<std::vector<uint64_t>>(
147 ATH_CHECK(CLUSTERBinInputHandle.
record(std::make_unique<std::vector<uint64_t>>(
153 std::lock_guard
lock(m_mutex);
155 if (m_GHITZTxtOutputEvents.at(
index).size() < (ctx.evt() + 1)) {
156 m_GHITZTxtOutputEvents.at(
index).resize(ctx.evt() + 1);
161 m_GHITZTxtOutputEvents.at(
index).at(ctx.evt()) = *GHITZTxtOutputHandle;
165 if (m_GHITZBinOutputEvents.at(
index).size() < (ctx.evt() + 1)) {
166 m_GHITZBinOutputEvents.at(
index).resize(ctx.evt() + 1);
171 m_GHITZBinOutputEvents.at(
index).at(ctx.evt()) = *GHITZBinOutputHandle;
175 if (m_CLUSTERTxtOutputEvents.at(
index).size() < (ctx.evt() + 1)) {
176 m_CLUSTERTxtOutputEvents.at(
index).resize(ctx.evt() + 1);
181 m_CLUSTERTxtOutputEvents.at(
index).at(ctx.evt()) = *CLUSTERTxtOutputHandle;
185 if (m_CLUSTERBinOutputEvents.at(
index).size() < (ctx.evt() + 1)) {
186 m_CLUSTERBinOutputEvents.at(
index).resize(ctx.evt() + 1);
191 m_CLUSTERBinOutputEvents.at(
index).at(ctx.evt()) = *CLUSTERBinOutputHandle;
195 return StatusCode::SUCCESS;
202 auto outstreamlambda = [](
203 std::ofstream& fileStream,
206 std::array<char, 32> buffer;
207 auto result = std::format_to(buffer.begin(),
"{:016x}\n", word);
208 fileStream.write(buffer.data(), std::distance(buffer.begin(), result));
215 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
217 m_GHITZTxtOutputEvents.at(
index)
228 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
230 m_GHITZBinOutputEvents.at(
index)
240 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
242 m_GHITZTxtOutputEvents.at(
index)
253 std::ofstream& fileStream,
256 fileStream.write(std::bit_cast<char*>(&word), 8);
258 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
260 m_GHITZBinOutputEvents.at(
index)
270 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_STRIP_CLUSTER(word).last; },
272 m_CLUSTERTxtOutputEvents.at(
index)
283 std::ofstream& fileStream,
286 fileStream.write(std::bit_cast<char*>(&word), 8);
288 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_STRIP_CLUSTER(word).last; },
290 m_CLUSTERBinOutputEvents.at(
index)
294 return StatusCode::SUCCESS;
298 const std::string& path,
299 const auto& fileReadFunction,
300 const auto& endOfBlockCondition,
301 const int32_t hitCountDown,
302 std::vector<std::vector<uint64_t>>& events
306 "\tpath: " << path <<
"\n"
309 std::ifstream fileStream(path, std::ios::binary);
312 FileState fileState{};
314 while (fileStream.peek() != EOF) {
315 const uint64_t word = fileReadFunction(fileStream);
323 if (action == DataFormatAction::KEEP) {
324 events.back().push_back(word);
326 else if (action == DataFormatAction::NEW_EVENT) {
327 events.push_back({word});
330 ATH_CHECK(action != DataFormatAction::ERROR);
331 ATH_CHECK(action == DataFormatAction::DISCARD);
335 ATH_CHECK(fileState.dataFormatState == FileState::DataFormatState::FOOTER);
338 return StatusCode::SUCCESS;
342 const std::string& path,
343 const auto& fileWriteFunction,
344 const auto& endOfBlockCondition,
345 const int32_t hitCountDown,
346 const std::vector<std::vector<uint64_t>>& events
350 "\tpath: " << path <<
"\n"
353 std::ofstream fileStream(path, std::ios::binary);
355 FileState fileState{};
357 for (
const auto& event : events) {
358 bool firstWord =
true;
360 for (
const auto& word : event) {
369 action == DataFormatAction::NEW_EVENT &&
372 fileWriteFunction(fileStream, word);
376 action == DataFormatAction::NEW_EVENT ||
377 action == DataFormatAction::KEEP
379 fileWriteFunction(fileStream, word);
382 ATH_CHECK(action != DataFormatAction::ERROR);
383 ATH_CHECK(action == DataFormatAction::DISCARD);
390 ATH_CHECK(fileState.dataFormatState == FileState::DataFormatState::FOOTER);
393 return StatusCode::SUCCESS;
398 const auto& endOfBlockCondition,
399 const int32_t hitCountDown,
403 "\ndataFormatStateMachine:\n" <<
404 "\tword: " << std::hex << word << std::dec <<
"\n" <<
405 "\tfileState.countDown: " << fileState.countDown <<
"\n" <<
406 "\tfileState.dataFormatState: " <<
static_cast<int>(fileState.dataFormatState)
409 if (fileState.countDown != 0) {
411 .countDown = fileState.countDown - 1,
412 .dataFormatState = fileState.dataFormatState,
415 return DataFormatAction::KEEP;
418 fileState.dataFormatState == FileState::DataFormatState::FOOTER &&
419 fileState.countDown == 0 &&
424 .dataFormatState = FileState::DataFormatState::HEADER,
427 return DataFormatAction::NEW_EVENT;
430 fileState.dataFormatState == FileState::DataFormatState::FOOTER &&
431 fileState.countDown == 0
435 .dataFormatState = FileState::DataFormatState::FOOTER,
438 return DataFormatAction::DISCARD;
441 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
442 fileState.countDown == 0 &&
447 .dataFormatState = FileState::DataFormatState::FOOTER,
450 return DataFormatAction::KEEP;
453 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
454 fileState.countDown == 0 &&
459 .dataFormatState = FileState::DataFormatState::HEADER,
462 return DataFormatAction::KEEP;
465 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
466 fileState.countDown == 0 &&
471 .dataFormatState = FileState::DataFormatState::HITS,
474 return DataFormatAction::KEEP;
477 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
478 fileState.countDown == 0 &&
483 .dataFormatState = FileState::DataFormatState::HITS,
486 return DataFormatAction::KEEP;
489 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
490 fileState.countDown == 0 &&
495 .dataFormatState = FileState::DataFormatState::HITS,
498 return DataFormatAction::KEEP;
501 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
502 fileState.countDown == 0 &&
507 .dataFormatState = FileState::DataFormatState::HITS,
510 return DataFormatAction::KEEP;
513 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
514 fileState.countDown == 0 &&
519 .dataFormatState = FileState::DataFormatState::HITS,
522 return DataFormatAction::KEEP;
525 fileState.dataFormatState == FileState::DataFormatState::HITS &&
526 fileState.countDown == 0 &&
527 endOfBlockCondition(word)
530 .countDown = hitCountDown,
531 .dataFormatState = FileState::DataFormatState::HEADER,
534 return DataFormatAction::KEEP;
537 fileState.dataFormatState == FileState::DataFormatState::HITS &&
538 fileState.countDown == 0
541 .countDown = hitCountDown,
542 .dataFormatState = FileState::DataFormatState::HITS,
545 return DataFormatAction::KEEP;
548 return DataFormatAction::ERROR;