LDMX Software
File.cxx
1
2#include "Packing/RawDataFile/File.h"
3
4#include "DetDescr/DetectorID.h"
5#include "Packing/Utility/CRC.h"
6#include "Packing/Utility/Mask.h"
7
8namespace packing {
9namespace rawdatafile {
10
12 is_output_ = ps.get<bool>("is_output");
13 skip_unavailable_ = ps.get<bool>("skip_unavailable");
14
15 std::string fn = ps.get<std::string>("filename");
16
17 ecal_object_name_ = ps.get<std::string>("ecal_object_name");
18 hcal_object_name_ = ps.get<std::string>("hcal_object_name");
19 tracker_object_name_ = ps.get<std::string>("tracker_object_name");
20 triggerpad_object_name_ = ps.get<std::string>("triggerpad_object_name");
21 pass_name_ = ps.get<std::string>("pass_name");
22
23 std::cerr << "creating file" << std::endl;
24 if (is_output_) {
25 writer_.open(fn);
26 // leave entry count undefined
27 entries_ = 0;
28 i_entry_ = 0;
29 } else {
30 reader_.open(fn);
31 // get entry count from file
32 // get run id number from file
33 uint32_t word;
34 reader_ >> word;
35
36 uint8_t version = word & utility::MASK<4>;
37 if (version != 0) {
38 EXCEPTION_RAISE("RawFileVers", "Unable to handle raw file version " +
39 std::to_string(version));
40 }
41
42 run_ = ((word >> 4) & utility::MASK<28>);
43
44 reader_.seek<uint32_t>(-2, std::ios::end);
45 // save EOF in number of 32-bit-width words
46 auto eof{reader_.tell<uint32_t>()};
47 uint32_t crc_read_in;
48 reader_ >> entries_ >> crc_read_in;
49 i_entry_ = 0;
50
51 reader_.seek<uint32_t>(1, std::ios::beg);
52
53 if (ps.get<bool>("verify_checksum")) {
54 utility::CRC crc;
55 for (auto ifile{reader_.tell<uint32_t>()}; ifile < eof; ifile++) {
56 reader_ >> word;
57 crc << word;
58 }
59
60 if (crc.get() != crc_read_in) {
61 EXCEPTION_RAISE("CRCNotOk",
62 "Failure to verify CRC checksum of entire input file.");
63 }
64
65 reader_.seek<uint32_t>(1, std::ios::beg);
66 } // verify checksum of input file
67 } // input or output file
68}
69
71 event_ = &event;
72 return true;
73}
74
76 static std::map<uint16_t, std::string> eid_to_name = {
77 {ldmx::SubdetectorIDType::EID_TRACKER, tracker_object_name_},
78 {ldmx::SubdetectorIDType::EID_TRIGGER_SCINT, triggerpad_object_name_},
79 {ldmx::SubdetectorIDType::EID_ECAL, ecal_object_name_},
80 {ldmx::SubdetectorIDType::EID_HCAL, hcal_object_name_},
81 };
82
83 if (is_output_) {
84 // dump buffers into event packet and write out
85 std::map<uint16_t, std::vector<uint32_t>> the_subsys_data;
86 for (auto const &[id, name] : eid_to_name) {
87 if (skip_unavailable_ and not event_->exists(name, pass_name_)) continue;
88 the_subsys_data[id] = event_->getCollection<uint32_t>(name, pass_name_);
89 }
90
91 EventPacket write_event(event_->getEventNumber(), the_subsys_data);
92 writer_ << write_event;
93 crc_ << write_event;
94 if (!writer_) return false;
95
96 entries_++;
97 i_entry_++;
98 } else {
99 // check for EoF
100 if (i_entry_ + 1 > entries_) return false;
101
102 i_entry_++;
103
104 // read buffers from event packet and add to event bus
105 static EventPacket read_event;
106 reader_ >> read_event;
107 if (!reader_) {
108 // ERROR
109 return false;
110 }
111
112 event_->getEventHeader().setEventNumber(read_event.id());
113
114 for (auto &subsys : read_event.data()) {
115 // construct name if not provided by default EID mappings
116 if (eid_to_name.find(subsys.id()) == eid_to_name.end()) {
117 std::cerr << subsys.id() << " unrecognized electronics ID."
118 << std::endl;
119 eid_to_name[subsys.id()] = "EID" + std::to_string(subsys.id());
120 }
121
122 event_->add(eid_to_name.at(subsys.id()), subsys.data());
123 } // loop over subsystems
124 } // input or output
125 return true;
126}
127
129 if (is_output_) {
130 // use passed run number
131 run_ = header.getRunNumber();
132 // Why cant we just take the header from above?
133 uint32_t temp_header =
134 (0 & utility::MASK<4>)+((run_ & utility::MASK<28>) << 4);
135 writer_ << temp_header;
136 crc_ << temp_header;
137 } else {
138 // put our read-in run number here
139 header.setIntParameter("raw_run", run_);
140 }
141}
142
144 event_ = nullptr;
145 if (is_output_) {
146 writer_ << entries_;
147 crc_ << entries_;
148 writer_ << crc_.get();
149 }
150}
151
152} // namespace rawdatafile
153} // namespace packing
Implements an event buffer system for storing event data.
Definition Event.h:42
bool exists(const std::string &name, const std::string &passName, bool unique=true) const
Check for the existence of an object or collection with the given name and pass name in the event.
Definition Event.cxx:92
int getEventNumber() const
Get the event number.
Definition Event.h:81
ldmx::EventHeader & getEventHeader()
Get the event header.
Definition Event.h:59
const std::vector< ContentType > & getCollection(const std::string &collectionName, const std::string &passName) const
Get a collection (std::vector) of objects from the event bus.
Definition Event.h:400
void add(const std::string &collectionName, T &obj)
Adds an object to the event bus.
Definition Event.h:184
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:29
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
void setEventNumber(int eventNumber)
Set the event number.
Run-specific configuration and data stored in its own output TTree alongside the event TTree in the o...
Definition RunHeader.h:57
void setIntParameter(const std::string &name, int value)
Set an int parameter value.
Definition RunHeader.h:172
int getRunNumber() const
Definition RunHeader.h:77
Event Packet structure.
Definition EventPacket.h:17
bool skip_unavailable_
for writing, do we skip subsystems if their raw object is unavailable
Definition File.h:59
void writeRunHeader(ldmx::RunHeader &header)
Write the run header.
Definition File.cxx:128
uint32_t run_
run number corresponding to this file of raw data
Definition File.h:69
std::string tracker_object_name_
the event bus object name of the Tracker encoded data
Definition File.h:53
uint32_t i_entry_
current entry index (may not be same as event number)
Definition File.h:65
framework::Event * event_
handle to the event bus we are reading from or writing to
Definition File.h:67
std::string triggerpad_object_name_
the event bus object name of the Trigger Pad encoded data
Definition File.h:55
uint32_t entries_
number of entries in the file
Definition File.h:63
std::string ecal_object_name_
the event bus object name of the ECal encoded data
Definition File.h:49
utility::Reader reader_
utility class for reading binary data files
Definition File.h:71
utility::Writer writer_
utility class for writing binary data files
Definition File.h:73
bool connect(framework::Event &event)
Connect the passed event bus to this event file.
Definition File.cxx:70
std::string hcal_object_name_
the event bus object name of the HCal encoded data
Definition File.h:51
utility::CRC crc_
crc calculator for output mode
Definition File.h:75
bool is_output_
are we reading or writing?
Definition File.h:47
bool nextEvent()
Load the next event into our connected event bus.
Definition File.cxx:75
void close()
close this file
Definition File.cxx:143
File(const framework::config::Parameters &params)
General file constructor.
Definition File.cxx:11
std::string pass_name_
for writing, we also should be able to specify a pass name
Definition File.h:57
The HGC ROC and FPGA use a CRC checksum to double check that the data transfer has been done correctl...
Definition CRC.h:50
uint32_t get()
Get the calculate checksum from the calculator.
Definition CRC.h:110
void open(const std::string &file_name)
Open a file with this reader.
Definition Reader.h:35
int tell()
Tell us where the reader is.
Definition Reader.h:87
void seek(int off, std::ios_base::seekdir dir=std::ios::beg)
Go ("seek") a specific position in the file.
Definition Reader.h:61
void open(const std::string &file_name)
Open a file with this writer.
Definition Writer.h:35