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< HepMCEvent > readNextEvent ()
 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 27 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 13 of file HepMCReader.cxx.

13 {
14 ldmx_log(info) << "Opening HepMC file " << filename;
15
16 // Try to detect the file format by reading the first non-empty line
17 std::ifstream test_file(filename);
18 std::string first_line;
19 bool found_line = false;
20
21 if (test_file.is_open()) {
22 // Skip empty lines and find the first non-empty line
23 while (std::getline(test_file, first_line)) {
24 // Trim whitespace
25 first_line.erase(0, first_line.find_first_not_of(" \t\r\n"));
26 first_line.erase(first_line.find_last_not_of(" \t\r\n") + 1);
27
28 if (!first_line.empty()) {
29 found_line = true;
30 break;
31 }
32 }
33 test_file.close();
34 }
35
36 if (found_line) {
37 ldmx_log(debug) << "First non-empty line: " << first_line;
38
39 // Check if it's HepMC2 format
40 if (first_line.find("HepMC::") != std::string::npos ||
41 first_line.find("IO_GenEvent") != std::string::npos) {
42 ldmx_log(info) << "Detected HepMC2 format, using ReaderAsciiHepMC2";
43 reader_ = std::make_shared<HepMC3::ReaderAsciiHepMC2>(filename);
44 } else {
45 ldmx_log(info) << "Assuming HepMC3 format, using ReaderAscii";
46 reader_ = std::make_shared<HepMC3::ReaderAscii>(filename);
47 }
48 } else {
49 ldmx_log(warn)
50 << "Could not find non-empty line, defaulting to HepMC3 format";
51 reader_ = std::make_shared<HepMC3::ReaderAscii>(filename);
52 }
53
54 if (reader_->failed()) {
55 EXCEPTION_RAISE("BadFile", "Failed to open HepMC file: " + filename);
56 }
57}
std::shared_ptr< HepMC3::Reader > reader_
The HepMC3 reader.
Definition HepMCReader.h:50

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 59 of file HepMCReader.cxx.

59 {
60 // Create a new HepMC3 GenEvent
61 auto gen_event = std::make_shared<HepMC3::GenEvent>();
62
63 // Read the next event from the file
64 if (!reader_->read_event(*gen_event)) {
65 ldmx_log(warn) << "No next event was found by the HepMC reader.";
66 return nullptr;
67 }
68
69 // Check if the event is empty
70 if (gen_event->particles().empty()) {
71 ldmx_log(warn) << "Empty event found by HepMC reader.";
72 return nullptr;
73 }
74
75 // Increment event counter and log progress every 100 events
77 if (event_counter_ % 100 == 0) {
78 ldmx_log(debug) << "HepMCReader: Read " << event_counter_ << " events";
79 }
80
81 // Create and return the wrapped event
82 return std::make_unique<HepMCEvent>(gen_event);
83}
int event_counter_
Event counter for tracking progress.
Definition HepMCReader.h:55

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 55 of file HepMCReader.h.

55{0};

Referenced by readNextEvent().

◆ reader_

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

The HepMC3 reader.

Definition at line 50 of file HepMCReader.h.

Referenced by HepMCReader(), and readNextEvent().


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