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 }
36
41
42 void read(const std::string& sourcefile)
43 {
44 m_source_filename = sourcefile;
45 try {
46
47 // Open file
48 m_rawdata_ifs.open(m_source_filename, std::ios::in | std::ios::binary);
49 if (!m_rawdata_ifs) {
50 throw CannotOpenFile(ERS_HERE, m_source_filename);
51 }
52
53 // Check file size
54 m_rawdata_ifs.ignore(std::numeric_limits<std::streamsize>::max());
55 std::streamsize filesize = m_rawdata_ifs.gcount();
56 if (filesize > m_input_limit) { // bigger than configured limit
57 std::ostringstream oss;
58 oss << "File size limit exceeded, "
59 << "filesize is " << filesize << ", "
60 << "configured limit is " << m_input_limit << ", "
61 << "filename is " << m_source_filename;
63 }
64
65 // Check for exact match
66 if (m_chunk_size > 0) {
67 int remainder = filesize % m_chunk_size;
68 if (remainder > 0) {
69 ers::info(FileHasExtraData(ERS_HERE, remainder, filesize, m_chunk_size, m_source_filename));
70 }
71 // Set usable element count
72 m_element_count = filesize / m_chunk_size;
73 TLOG_DEBUG(TLVL_BOOKKEEPING) << "Available elements: " << std::to_string(m_element_count);
74 }
75
76 // Read file into input buffer
77 m_rawdata_ifs.seekg(0, std::ios::beg);
78 m_input_buffer.reserve(filesize);
79 m_input_buffer.insert(
80 m_input_buffer.begin(), std::istreambuf_iterator<char>(m_rawdata_ifs), std::istreambuf_iterator<char>());
81 TLOG_DEBUG(TLVL_BOOKKEEPING) << "Available bytes " << std::to_string(m_input_buffer.size());
82
83 } catch (const std::exception& ex) {
84 throw GenericConfigurationError(ERS_HERE, "Cannot read file: " + m_source_filename, ex.what());
85 }
86 }
87
88 const int& num_elements() { return std::ref(m_element_count); }
89
90 std::vector<std::uint8_t>& get() // NOLINT(build/unsigned)
91 {
92 return std::ref(m_input_buffer);
93 }
94
95private:
96 // Configuration
100 std::string m_source_filename;
101
102 // Internals
103 std::ifstream m_rawdata_ifs;
104 std::vector<std::uint8_t> m_input_buffer; // NOLINT(build/unsigned)
105};
106
107} // namespace datahandlinglibs
108} // namespace dunedaq
109
110#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:116
The DUNE-DAQ namespace.
SourceID[" << sourceid << "] Command daqdataformats::SourceID Readout Initialization std::string initerror Configuration std::string conferror GenericConfigurationError
void warning(const Issue &issue)
Definition ers.hpp:150
void info(const Issue &issue)
Definition ers.hpp:121