LDMX Software
BinaryIO.cxx
1#include <catch2/catch_test_macros.hpp>
2
3#include "Framework/Configure/Parameters.h"
4#include "Framework/Event.h"
6#include "Framework/RunHeader.h"
7#include "Packing/RawDataFile/EventPacket.h"
8#include "Packing/RawDataFile/File.h"
9#include "Packing/RawDataFile/SubsystemPacket.h"
10#include "Packing/Utility/Reader.h"
11#include "Packing/Utility/Writer.h"
12#include "TTree.h"
13
14namespace packing {
15namespace test {} // namespace test
16} // namespace packing
17
21TEST_CASE("BinaryIO", "[Packing][functionality]") {
22 SECTION("Unformatted Data") {
23 std::string test_file{"test.raw"};
24 // test_vec and test_wide have the same data content
25 // but will be stored differently depending on endian-ness of system
26 std::vector<uint16_t> test_vec = {0xFFFF, 0x00FF, 0xFF00, 0xF0F0};
27 uint64_t test_wide = 0xFFFF00FFFF00F0F0;
28
29 SECTION("Write") {
30 packing::utility::Writer w(test_file);
31
32 CHECK(w << test_vec);
33 CHECK(w << test_wide);
34 }
35
36 SECTION("Read") {
37 packing::utility::Reader r(test_file);
38
39 std::vector<uint16_t> read_vec;
40 uint64_t read_wide, dummy;
41 CHECK(r.read(read_vec, 4));
42 CHECK(r >> read_wide);
43 CHECK_FALSE(r >> dummy);
44 CHECK(r.eof());
45 CHECK(read_vec == test_vec);
46 CHECK(read_wide == test_wide);
47 }
48 }
49
50 SECTION("Subsystem Packet") {
51 std::string test_file{"subsystem_packet_test.raw"};
52
53 uint32_t event{420};
54 uint16_t id{0xFAFA};
55 std::vector<uint32_t> data = {0xAAAAAAAA, 0xBBBBBBBB, 0xCCCCCCCC,
56 0xDDDDDDDD, 0xDEDEDEDE, 0xFEDCBA98};
57
58 SECTION("Write") {
59 packing::utility::Writer w(test_file);
60
61 packing::rawdatafile::SubsystemPacket sp(event, id, data);
62
63 CHECK(w << sp);
64 }
65
66 SECTION("Read") {
67 packing::utility::Reader r(test_file);
69
70 CHECK(r >> sp);
71 CHECK(sp.id() == id);
72 CHECK(sp.data() == data);
73 }
74 }
75
76 SECTION("Event Packet") {
77 std::string test_file{"event_packet_test.raw"};
78
79 uint32_t event{420};
80 std::map<uint16_t, std::vector<uint32_t>> unwrapped_data = {
81 {0xFAFA,
82 {0xAAAAAAAA, 0xBBBBBBBB, 0xCCCCCCCC, 0xDDDDDDDD, 0xDEDEDEDE,
83 0xFEDCBA98}},
84 {0xACDC, {0xFEBBBBEF, 0x00112233}}};
85
86 SECTION("Write") {
87 packing::utility::Writer w(test_file);
88
89 packing::rawdatafile::EventPacket ep(event, unwrapped_data);
90
91 CHECK(w << ep);
92 }
93
94 SECTION("Read") {
95 packing::utility::Reader r(test_file);
97
98 CHECK(r >> ep);
99 CHECK(ep.id() == event);
100
101 for (auto& subsys : ep.data()) {
102 REQUIRE(unwrapped_data.find(subsys.id()) != unwrapped_data.end());
103 CHECK(unwrapped_data.at(subsys.id()) == subsys.data());
104 }
105 }
106 }
107
108 SECTION("Entire File") {
109 std::string ecal_object_name("ecalDummyRaw"),
110 hcal_object_name("hcalDummyRaw"),
111 tracker_object_name("trackerDummyRaw"),
112 triggerpad_object_name("triggerpadDummyRaw");
114 ps.addParameter("filename", std::string("file_test.raw"));
115 ps.addParameter("ecal_object_name", ecal_object_name);
116 ps.addParameter("hcal_object_name", hcal_object_name);
117 ps.addParameter("tracker_object_name", tracker_object_name);
118 ps.addParameter("triggerpad_object_name", triggerpad_object_name);
119 ps.addParameter("pass_name", std::string());
120 ps.addParameter("skip_unavailable", true);
121 ps.addParameter("verify_checksum", false);
122
123 std::vector<uint32_t> data = {0xAAAAAAAA, 0xBBBBBBBB, 0xCCCCCCCC,
124 0xDDDDDDDD, 0xDEDEDEDE, 0xFEDCBA98};
125 int i_event{420};
126 int n_events{2};
127 int run{1666};
128
129 SECTION("Write") {
130 ps.addParameter("is_output", true);
132
133 ldmx::RunHeader rh(run);
134 f.writeRunHeader(rh);
135
136 framework::Event event("testwrite");
137 f.connect(event);
138
139 for (int i{0}; i < n_events; i++) {
140 event.getEventHeader().setEventNumber(i_event + i);
141
142 event.add(ecal_object_name, data);
143 event.add(hcal_object_name, data);
144 event.add(triggerpad_object_name, data);
145
146 REQUIRE(f.nextEvent());
147
148 event.Clear();
149 event.onEndOfEvent();
150 }
151
152 f.close();
153 }
154
155 SECTION("Read") {
156 std::cout << "starting Read" << std::endl;
157 ps.addParameter("is_output", false);
159
160 ldmx::RunHeader rh(run);
161 f.writeRunHeader(rh);
162 CHECK(rh.getIntParameter("raw_run") == run);
163
164 framework::Event event("testread");
165 f.connect(event);
166
167 for (int i{0}; i < n_events; i++) {
168 event.getEventHeader().setEventNumber(i);
169
170 REQUIRE(f.nextEvent());
171
172 CHECK(event.getEventNumber() == i_event + i);
173 CHECK(data == event.getCollection<uint32_t>(ecal_object_name));
174 CHECK(data == event.getCollection<uint32_t>(hcal_object_name));
175 CHECK(data == event.getCollection<uint32_t>(triggerpad_object_name));
176 CHECK_FALSE(event.exists(tracker_object_name));
177
178 event.Clear();
179 event.onEndOfEvent();
180 }
181
182 REQUIRE_FALSE(f.nextEvent());
183
184 f.close();
185 }
186 }
187}
Class that provides header information about an event such as event number and timestamp.
Class implementing an event buffer system for storing event data.
Implements an event buffer system for storing event data.
Definition Event.h:41
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:27
void addParameter(const std::string &name, const T &value)
Add a parameter to the parameter list.
Definition Parameters.h:55
Run-specific configuration and data stored in its own output TTree alongside the event TTree in the o...
Definition RunHeader.h:54
Event Packet structure.
Definition EventPacket.h:17
The raw data file object.
Definition File.h:17
std::vector< uint32_t > & data()
Get data.
Reading a raw data file.
Definition Reader.h:19
Writing a raw data file.
Definition Writer.h:19