LDMX Software
HepMCReader.cxx
2
3#include <fstream>
4#include <string>
5
6#include "Framework/Exception/Exception.h"
7#include "HepMC3/ReaderFactory.h"
8#include "HepMC3/ReaderRoot.h"
9#include "HepMC3/ReaderRootTree.h"
10#include "TFile.h"
11#include "TTree.h"
12
13namespace simcore {
14namespace hepmc {
15
16HepMCReader::HepMCReader(std::string& filename) {
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}
41
42std::unique_ptr<HepMCEvent> HepMCReader::readNextEvent() {
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}
70
71} // namespace hepmc
72} // 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:50
std::unique_ptr< HepMCEvent > readNextEvent()
Read the next event.
int event_counter_
Event counter for tracking progress.
Definition HepMCReader.h:55
Dynamically loadable photonuclear models either from SimCore or external libraries implementing this ...