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;
205 std::ofstream& fileStream,
208 fileStream << std::format(
"{:016x}\n", word);
210 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
212 m_GHITZTxtOutputEvents.at(
index)
223 std::ofstream& fileStream,
226 fileStream.write(std::bit_cast<char*>(&word), 8);
228 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
230 m_GHITZBinOutputEvents.at(
index)
240 std::ofstream& fileStream,
243 fileStream << std::format(
"{:016x}\n", word);
245 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
247 m_GHITZTxtOutputEvents.at(
index)
258 std::ofstream& fileStream,
261 fileStream.write(std::bit_cast<char*>(&word), 8);
263 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_GHITZ_w1(word).last; },
265 m_GHITZBinOutputEvents.at(
index)
275 std::ofstream& fileStream,
278 fileStream << std::format(
"{:016x}\n", word);
280 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_STRIP_CLUSTER(word).last; },
282 m_CLUSTERTxtOutputEvents.at(
index)
293 std::ofstream& fileStream,
296 fileStream.write(std::bit_cast<char*>(&word), 8);
298 [](
const uint64_t word) { return FPGADataFormatUtilities::get_bitfields_STRIP_CLUSTER(word).last; },
300 m_CLUSTERBinOutputEvents.at(
index)
304 return StatusCode::SUCCESS;
308 const std::string& path,
309 const auto& fileReadFunction,
310 const auto& endOfBlockCondition,
311 const int32_t hitCountDown,
312 std::vector<std::vector<uint64_t>>& events
316 "\tpath: " << path <<
"\n"
319 std::ifstream fileStream(path, std::ios::binary);
322 FileState fileState{};
324 while (fileStream.peek() != EOF) {
325 const uint64_t word = fileReadFunction(fileStream);
333 if (action == DataFormatAction::KEEP) {
334 events.back().push_back(word);
336 else if (action == DataFormatAction::NEW_EVENT) {
337 events.push_back({word});
340 ATH_CHECK(action != DataFormatAction::ERROR);
341 ATH_CHECK(action == DataFormatAction::DISCARD);
345 ATH_CHECK(fileState.dataFormatState == FileState::DataFormatState::FOOTER);
348 return StatusCode::SUCCESS;
352 const std::string& path,
353 const auto& fileWriteFunction,
354 const auto& endOfBlockCondition,
355 const int32_t hitCountDown,
356 const std::vector<std::vector<uint64_t>>& events
360 "\tpath: " << path <<
"\n"
363 std::ofstream fileStream(path, std::ios::binary);
365 FileState fileState{};
367 for (
const auto& event : events) {
368 bool firstWord =
true;
370 for (
const auto& word : event) {
379 action == DataFormatAction::NEW_EVENT &&
382 fileWriteFunction(fileStream, word);
386 action == DataFormatAction::NEW_EVENT ||
387 action == DataFormatAction::KEEP
389 fileWriteFunction(fileStream, word);
392 ATH_CHECK(action != DataFormatAction::ERROR);
393 ATH_CHECK(action == DataFormatAction::DISCARD);
400 ATH_CHECK(fileState.dataFormatState == FileState::DataFormatState::FOOTER);
403 return StatusCode::SUCCESS;
408 const auto& endOfBlockCondition,
409 const int32_t hitCountDown,
413 "\ndataFormatStateMachine:\n" <<
414 "\tword: " << std::hex << word << std::dec <<
"\n" <<
415 "\tfileState.countDown: " << fileState.countDown <<
"\n" <<
416 "\tfileState.dataFormatState: " <<
static_cast<int>(fileState.dataFormatState)
419 if (fileState.countDown != 0) {
421 .countDown = fileState.countDown - 1,
422 .dataFormatState = fileState.dataFormatState,
425 return DataFormatAction::KEEP;
428 fileState.dataFormatState == FileState::DataFormatState::FOOTER &&
429 fileState.countDown == 0 &&
434 .dataFormatState = FileState::DataFormatState::HEADER,
437 return DataFormatAction::NEW_EVENT;
440 fileState.dataFormatState == FileState::DataFormatState::FOOTER &&
441 fileState.countDown == 0
445 .dataFormatState = FileState::DataFormatState::FOOTER,
448 return DataFormatAction::DISCARD;
451 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
452 fileState.countDown == 0 &&
457 .dataFormatState = FileState::DataFormatState::FOOTER,
460 return DataFormatAction::KEEP;
463 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
464 fileState.countDown == 0 &&
469 .dataFormatState = FileState::DataFormatState::HEADER,
472 return DataFormatAction::KEEP;
475 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
476 fileState.countDown == 0 &&
481 .dataFormatState = FileState::DataFormatState::HITS,
484 return DataFormatAction::KEEP;
487 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
488 fileState.countDown == 0 &&
493 .dataFormatState = FileState::DataFormatState::HITS,
496 return DataFormatAction::KEEP;
499 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
500 fileState.countDown == 0 &&
505 .dataFormatState = FileState::DataFormatState::HITS,
508 return DataFormatAction::KEEP;
511 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
512 fileState.countDown == 0 &&
517 .dataFormatState = FileState::DataFormatState::HITS,
520 return DataFormatAction::KEEP;
523 fileState.dataFormatState == FileState::DataFormatState::HEADER &&
524 fileState.countDown == 0 &&
529 .dataFormatState = FileState::DataFormatState::HITS,
532 return DataFormatAction::KEEP;
535 fileState.dataFormatState == FileState::DataFormatState::HITS &&
536 fileState.countDown == 0 &&
537 endOfBlockCondition(word)
540 .countDown = hitCountDown,
541 .dataFormatState = FileState::DataFormatState::HEADER,
544 return DataFormatAction::KEEP;
547 fileState.dataFormatState == FileState::DataFormatState::HITS &&
548 fileState.countDown == 0
551 .countDown = hitCountDown,
552 .dataFormatState = FileState::DataFormatState::HITS,
555 return DataFormatAction::KEEP;
558 return DataFormatAction::ERROR;