LDMX Software
HepMCReader.cxx
2
3#include <fstream>
4#include <string>
5
6namespace simcore {
7namespace hepmc {
8
9HepMCReader::HepMCReader(std::string& filename) {
10 ldmx_log(info) << "Opening HepMC file " << filename;
11
12 // Try to detect the file format by reading the first non-empty line
13 std::ifstream test_file(filename);
14 std::string first_line;
15 bool found_line = false;
16
17 if (test_file.is_open()) {
18 // Skip empty lines and find the first non-empty line
19 while (std::getline(test_file, first_line)) {
20 // Trim whitespace
21 first_line.erase(0, first_line.find_first_not_of(" \t\r\n"));
22 first_line.erase(first_line.find_last_not_of(" \t\r\n") + 1);
23
24 if (!first_line.empty()) {
25 found_line = true;
26 break;
27 }
28 }
29 test_file.close();
30 }
31
32 if (found_line) {
33 ldmx_log(debug) << "First non-empty line: " << first_line;
34
35 // Check if it's HepMC2 format
36 if (first_line.find("HepMC::") != std::string::npos ||
37 first_line.find("IO_GenEvent") != std::string::npos) {
38 ldmx_log(info) << "Detected HepMC2 format, using ReaderAsciiHepMC2";
39 reader_ = std::make_shared<HepMC3::ReaderAsciiHepMC2>(filename);
40 } else {
41 ldmx_log(info) << "Assuming HepMC3 format, using ReaderAscii";
42 reader_ = std::make_shared<HepMC3::ReaderAscii>(filename);
43 }
44 } else {
45 ldmx_log(warn)
46 << "Could not find non-empty line, defaulting to HepMC3 format";
47 reader_ = std::make_shared<HepMC3::ReaderAscii>(filename);
48 }
49
50 if (reader_->failed()) {
51 EXCEPTION_RAISE("BadFile", "Failed to open HepMC file: " + filename);
52 }
53}
54
55std::unique_ptr<HepMCEvent> HepMCReader::readNextEvent() {
56 // Create a new HepMC3 GenEvent
57 auto gen_event = std::make_shared<HepMC3::GenEvent>();
58
59 // Read the next event from the file
60 if (!reader_->read_event(*gen_event)) {
61 ldmx_log(warn) << "No next event was found by the HepMC reader.";
62 return nullptr;
63 }
64
65 // Check if the event is empty
66 if (gen_event->particles().empty()) {
67 ldmx_log(warn) << "Empty event found by HepMC reader.";
68 return nullptr;
69 }
70
71 // Increment event counter and log progress every 100 events
73 if (event_counter_ % 100 == 0) {
74 ldmx_log(debug) << "HepMCReader: Read " << event_counter_ << " events";
75 }
76
77 // Create and return the wrapped event
78 return std::make_unique<HepMCEvent>(gen_event);
79}
80
81} // namespace hepmc
82} // namespace simcore
Class for reading HepMC event data.
HepMCReader(std::string &fileName)
Class constructor.
std::shared_ptr< HepMC3::Reader > reader_
The HepMC3 reader.
Definition HepMCReader.h:52
std::unique_ptr< HepMCEvent > readNextEvent()
Read the next event.
int event_counter_
Event counter for tracking progress.
Definition HepMCReader.h:57
Dynamically loadable photonuclear models either from SimCore or external libraries implementing this ...