LDMX Software
simcore::hepmc::HepMCReader Class Reference

Reads HepMC event data into a HepMCEvent object. More...

#include <HepMCReader.h>

Public Member Functions

 HepMCReader (std::string &fileName)
 Class constructor.
 
virtual ~HepMCReader ()=default
 Class destructor.
 
std::unique_ptr< HepMCEventreadNextEvent ()
 Read the next event.
 

Private Attributes

std::shared_ptr< HepMC3::Reader > reader_
 The HepMC3 reader.
 
int event_counter_ {0}
 Event counter for tracking progress.
 

Detailed Description

Reads HepMC event data into a HepMCEvent object.

Definition at line 29 of file HepMCReader.h.

Constructor & Destructor Documentation

◆ HepMCReader()

simcore::hepmc::HepMCReader::HepMCReader ( std::string & fileName)

Class constructor.

Parameters
fileNameThe input file name.

Definition at line 9 of file HepMCReader.cxx.

9 {
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}
std::shared_ptr< HepMC3::Reader > reader_
The HepMC3 reader.
Definition HepMCReader.h:52

References reader_.

Member Function Documentation

◆ readNextEvent()

std::unique_ptr< HepMCEvent > simcore::hepmc::HepMCReader::readNextEvent ( )

Read the next event.

Returns
The next HepMC event.

Definition at line 55 of file HepMCReader.cxx.

55 {
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}
int event_counter_
Event counter for tracking progress.
Definition HepMCReader.h:57

References event_counter_, and reader_.

Referenced by simcore::generators::HepMCPrimaryGenerator::GeneratePrimaryVertex().

Member Data Documentation

◆ event_counter_

int simcore::hepmc::HepMCReader::event_counter_ {0}
mutableprivate

Event counter for tracking progress.

Definition at line 57 of file HepMCReader.h.

57{0};

Referenced by readNextEvent().

◆ reader_

std::shared_ptr<HepMC3::Reader> simcore::hepmc::HepMCReader::reader_
private

The HepMC3 reader.

Definition at line 52 of file HepMCReader.h.

Referenced by HepMCReader(), and readNextEvent().


The documentation for this class was generated from the following files: