DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
FileSourceBuffer.hpp
Go to the documentation of this file.
1
8#ifndef DATAHANDLINGLIBS_INCLUDE_DATAHANDLINGLIBS_UTILS_FILESOURCEBUFFER_HPP_
9#define DATAHANDLINGLIBS_INCLUDE_DATAHANDLINGLIBS_UTILS_FILESOURCEBUFFER_HPP_
10
13
14#include "logging/Logging.hpp"
15
16#include <fstream>
17#include <limits>
18#include <string>
19#include <vector>
20
22
23namespace dunedaq {
24namespace datahandlinglibs {
25
27{
28public:
29 explicit FileSourceBuffer(int input_limit, int chunk_size = 0)
30 : m_input_limit(input_limit)
31 , m_chunk_size(chunk_size)
34 {}
35
40
41 void read(const std::string& sourcefile)
42 {
43 m_source_filename = sourcefile;
44 try {
45
46 // Open file
47 m_rawdata_ifs.open(m_source_filename, std::ios::in | std::ios::binary);
48 if (!m_rawdata_ifs) {
49 throw CannotOpenFile(ERS_HERE, m_source_filename);
50 }
51
52 // Check file size
53 m_rawdata_ifs.ignore(std::numeric_limits<std::streamsize>::max());
54 std::streamsize filesize = m_rawdata_ifs.gcount();
55 if (filesize > m_input_limit) { // bigger than configured limit
56 std::ostringstream oss;
57 oss << "File size limit exceeded, "
58 << "filesize is " << filesize << ", "
59 << "configured limit is " << m_input_limit << ", "
60 << "filename is " << m_source_filename;
62 }
63
64 // Check for exact match
65 if (m_chunk_size > 0) {
66 int remainder = filesize % m_chunk_size;
67 if (remainder > 0) {
68 ers::info(FileHasExtraData(ERS_HERE, remainder, filesize, m_chunk_size, m_source_filename));
69 }
70 // Set usable element count
71 m_element_count = filesize / m_chunk_size;
72 TLOG_DEBUG(TLVL_BOOKKEEPING) << "Available elements: " << std::to_string(m_element_count);
73 }
74
75 // Read file into input buffer
76 m_rawdata_ifs.seekg(0, std::ios::beg);
77 m_input_buffer.reserve(filesize);
78 m_input_buffer.insert(
79 m_input_buffer.begin(), std::istreambuf_iterator<char>(m_rawdata_ifs), std::istreambuf_iterator<char>());
80 TLOG_DEBUG(TLVL_BOOKKEEPING) << "Available bytes " << std::to_string(m_input_buffer.size());
81
82 } catch (const std::exception& ex) {
83 throw GenericConfigurationError(ERS_HERE, "Cannot read file: " + m_source_filename, ex.what());
84 }
85 }
86
87 const int& num_elements() { return std::ref(m_element_count); }
88
89 std::vector<std::uint8_t>& get() // NOLINT(build/unsigned)
90 {
91 return std::ref(m_input_buffer);
92 }
93
94private:
95 // Configuration
99 std::string m_source_filename;
100
101 // Internals
102 std::ifstream m_rawdata_ifs;
103 std::vector<std::uint8_t> m_input_buffer; // NOLINT(build/unsigned)
104};
105
106} // namespace datahandlinglibs
107} // namespace dunedaq
108
109#endif // DATAHANDLINGLIBS_INCLUDE_DATAHANDLINGLIBS_UTILS_FILESOURCEBUFFER_HPP_
#define ERS_HERE
FileSourceBuffer(FileSourceBuffer &&)=delete
FileSourceBuffer is not move-constructible.
void read(const std::string &sourcefile)
FileSourceBuffer(int input_limit, int chunk_size=0)
FileSourceBuffer & operator=(FileSourceBuffer &&)=delete
FileSourceBuffer is not move-assignable.
FileSourceBuffer(const FileSourceBuffer &)=delete
FileSourceBuffer is not copy-constructible.
FileSourceBuffer & operator=(const FileSourceBuffer &)=delete
FileSourceBuffer is not copy-assginable.
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112
Including Qt Headers.
SourceID[" << sourceid << "] Command daqdataformats::SourceID Readout Initialization std::string initerror Configuration std::string conferror GenericConfigurationError
void warning(const Issue &issue)
Definition ers.hpp:115
void info(const Issue &issue)
Definition ers.hpp:95