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