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

16 {
17 ldmx_log(info) << "Opening HepMC file " << filename;
18
19 // ROOT files start with the "root" magic bytes
20 std::string magic(4, '\0');
21 std::ifstream(filename, std::ios::binary).read(magic.data(), magic.size());
22 if (magic == "root") {
23 // WriterRootTree stores a TTree, WriterRoot one object per event
24 std::unique_ptr<TFile> file{TFile::Open(filename.c_str())};
25 if (file && file->Get<TTree>("hepmc3_tree")) {
26 ldmx_log(info) << "Detected HepMC3 ROOT tree format";
27 reader_ = std::make_shared<HepMC3::ReaderRootTree>(filename);
28 } else {
29 ldmx_log(info) << "Detected HepMC3 ROOT format";
30 reader_ = std::make_shared<HepMC3::ReaderRoot>(filename);
31 }
32 } else {
33 // HepMC2/3 ascii, LHEF or HEPEVT
34 reader_ = HepMC3::deduce_reader(filename);
35 }
36
37 if (!reader_ || reader_->failed()) {
38 EXCEPTION_RAISE("BadFile", "Failed to open HepMC file: " + filename);
39 }
40}
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 42 of file HepMCReader.cxx.

42 {
43 // Create a new HepMC3 GenEvent
44 auto gen_event = std::make_shared<HepMC3::GenEvent>();
45
46 // Read the next event from the file
47 if (!reader_->read_event(*gen_event)) {
48 ldmx_log(warn) << "No next event was found by the HepMC reader.";
49 return nullptr;
50 }
51
52 // Geant4 expects GeV and mm
53 gen_event->set_units(HepMC3::Units::GEV, HepMC3::Units::MM);
54
55 // Check if the event is empty
56 if (gen_event->particles().empty()) {
57 ldmx_log(warn) << "Empty event found by HepMC reader.";
58 return nullptr;
59 }
60
61 // Increment event counter and log progress every 100 events
63 if (event_counter_ % 100 == 0) {
64 ldmx_log(debug) << "HepMCReader: Read " << event_counter_ << " events";
65 }
66
67 // Create and return the wrapped event
68 return std::make_unique<HepMCEvent>(gen_event);
69}
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: