Belle II Software development
HepevtReader Class Reference

Class to read Hepevt files and store the content in a MCParticle graph. More...

#include <HepevtReader.h>

Public Member Functions

 BELLE2_DEFINE_EXCEPTION (HepEvtCouldNotOpenFileError, "Could not open file %1% !")
 Exception is thrown if the HepEvt file could not be opened.
 
 BELLE2_DEFINE_EXCEPTION (HepEvtInvalidDaughterIndicesError, "Line %1%: Invalid daughter indices d1=%2%, d2=%3%, N=%4% (0<=d1<=d2<=N required)")
 Exception is thrown if the given indices of the daughters are not valid.
 
 BELLE2_DEFINE_EXCEPTION (HepEvtHeaderNotValidError, "Line %1%: Event header not understood: %2%")
 Exception is thrown if the header specifying the event header could not be parsed.
 
 BELLE2_DEFINE_EXCEPTION (HepEvtConvertFieldError, "Line %1%: Could not convert field %2%: %3%")
 Exception is thrown if a field in the HepEvt file could not be converted to a number.
 
 BELLE2_DEFINE_EXCEPTION (HepEvtParticleFormatError, "Line %1%: Particle format not understood, got %2% fields !")
 Exception is thrown if the format of a line of the HepEvt file could not be parsed.
 
 BELLE2_DEFINE_EXCEPTION (HepEvtEmptyEventError, "Line %1%: Number of particles in event is %2% ! (This could mean EOF is reached.) ")
 Exception is thrown if the number of particles for this event is 0 or less.
 
 HepevtReader ()
 Constructor.
 
 ~HepevtReader ()
 Destructor.
 
void open (const std::string &filename)
 Opens an ascii file and prepares it for reading.
 
void closeCurrentInputFile ()
 Closes the current input file to allow opening the next one.
 
int getEvent (MCParticleGraph &graph, double &weight)
 Reads the next event and stores the result in the given MCParticle graph.
 
bool skipEvents (int n)
 Skips a given number of events.
 

Public Attributes

int m_nVirtual
 The number of particles in each event with a set Virtual flag.
 
bool m_wrongSignPz
 Bool to indicate that HER and LER were swapped.
 

Protected Types

typedef boost::tokenizer< boost::char_separator< char > > tokenizer
 Just a typedef for simple use of the boost::tokenizer to split the lines.
 

Protected Member Functions

std::string getLine ()
 Returns the current line from the Hepevt ascii file.
 
int readEventHeader (int &eventID, double &eventWeight)
 Reads the event header from the hepevt file.
 
void readParticle (MCParticleGraph::GraphParticle &particle)
 Reads the information for a single particle from the Hepevt file.
 

Protected Attributes

int m_lineNr
 The current line number within the ascii file.
 
std::ifstream m_input
 The input stream of the ascii file.
 

Static Protected Attributes

static const boost::char_separator< char > sep
 The characters at which to split, defaults to ",; \t".
 

Detailed Description

Class to read Hepevt files and store the content in a MCParticle graph.

The reader supports retrieving the Hepevt information from an ascii text file. Both formats, the short and the long LUND 7 format are supported.

The events are read sequentially with the option of skipping a certain number of events. Random access of events is not possible.

Definition at line 33 of file HepevtReader.h.

Member Typedef Documentation

◆ tokenizer

typedef boost::tokenizer<boost::char_separator<char> > tokenizer
protected

Just a typedef for simple use of the boost::tokenizer to split the lines.

Definition at line 93 of file HepevtReader.h.

Constructor & Destructor Documentation

◆ HepevtReader()

HepevtReader ( )
inline

Constructor.

Definition at line 55 of file HepevtReader.h.

55: m_nVirtual(0), m_wrongSignPz(false), m_lineNr(0) {}
int m_lineNr
The current line number within the ascii file.
Definition: HepevtReader.h:97
bool m_wrongSignPz
Bool to indicate that HER and LER were swapped.
Definition: HepevtReader.h:89
int m_nVirtual
The number of particles in each event with a set Virtual flag.
Definition: HepevtReader.h:88

◆ ~HepevtReader()

~HepevtReader ( )
inline

Destructor.

Definition at line 60 of file HepevtReader.h.

60{ if (m_input) m_input.close(); }
std::ifstream m_input
The input stream of the ascii file.
Definition: HepevtReader.h:98

Member Function Documentation

◆ BELLE2_DEFINE_EXCEPTION()

BELLE2_DEFINE_EXCEPTION ( HepEvtEmptyEventError  ,
"Line %1%: Number of particles in event is %2% ! (This could mean EOF is reached.) "   
)

Exception is thrown if the number of particles for this event is 0 or less.


◆ closeCurrentInputFile()

void closeCurrentInputFile ( )
inline

Closes the current input file to allow opening the next one.

Definition at line 71 of file HepevtReader.h.

71{m_input.close();}

◆ getEvent()

int getEvent ( MCParticleGraph graph,
double &  weight 
)

Reads the next event and stores the result in the given MCParticle graph.

Parameters
graphReference to the graph which should be filled with the information from the Hepevt file.
weightReference to the event weight which can be filled from the file.
Returns
event number if the event could be read and the number was provided in the file.

Definition at line 34 of file HepevtReader.cc.

35{
36 int eventID = -1;
37 int nparticles = readEventHeader(eventID, eventWeight);
38 if (nparticles <= 0) {
39 throw (HepEvtEmptyEventError() << m_lineNr << nparticles);
40 }
41
42 int first = graph.size();
43 //Make list of particles
44 for (int i = 0; i < nparticles; i++) {
45 graph.addParticle();
46 }
47 //Read particles from file
48 for (int i = 0; i < nparticles; ++i) {
49 MCParticleGraph::GraphParticle& p = graph[first + i];
50 readParticle(p);
51
52 if (m_wrongSignPz) { // this means we have to mirror Pz
53 ROOT::Math::PxPyPzEVector p4 = p.get4Vector();
54 p4.SetPz(-1.0 * p4.Pz());
55 p.set4Vector(p4);
56 }
57
58 //Check for sensible daughter indices
59 int d1 = p.getFirstDaughter();
60 int d2 = p.getLastDaughter();
61 if (d1 < 0 || d1 > nparticles || d2 < d1 || d2 > nparticles) {
62 throw (HepEvtInvalidDaughterIndicesError() << m_lineNr << d1 << d2 << nparticles);
63 }
64 if (d1 == 0) p.addStatus(MCParticle::c_StableInGenerator);
65 //Add decays
66 for (int index = d1; index <= d2; ++index) {
67 if (index > 0) p.decaysInto(graph[first + index - 1]);
68 }
69
70 //check if particle should be made virtual according to steering options:
71 if (i < m_nVirtual)
72 p.setVirtual();
73 }
74 return eventID;
75}
int readEventHeader(int &eventID, double &eventWeight)
Reads the event header from the hepevt file.
void readParticle(MCParticleGraph::GraphParticle &particle)
Reads the information for a single particle from the Hepevt file.
Class to represent Particle data in graph.
size_t size() const
Return the number of particles in the graph.
@ c_StableInGenerator
bit 1: Particle is stable, i.e., not decaying in the generator.
Definition: MCParticle.h:49
GraphParticle & addParticle()
Add new particle to the graph.

◆ getLine()

std::string getLine ( )
protected

Returns the current line from the Hepevt ascii file.

  • double eventWeight; /‍**< The event weight if provided in HepEvtfile else 1. *‍/ *‍/
    Returns
    The current line as a string.

Definition at line 95 of file HepevtReader.cc.

96{
97 std::string line;
98 do {
99 getline(m_input, line);
100 m_lineNr++;
101 size_t commentPos = line.find_first_of('#');
102 if (commentPos != string::npos) {
103 line = line.substr(0, commentPos);
104 }
105 boost::trim(line);
106 } while (line == "" && !m_input.eof());
107 return line;
108}

◆ open()

void open ( const std::string &  filename)

Opens an ascii file and prepares it for reading.

Parameters
filenameThe filename of the Hepevt ascii file which should be read.

Definition at line 26 of file HepevtReader.cc.

27{
28 m_lineNr = 0;
29 m_input.open(filename.c_str());
30 if (!m_input) throw(HepEvtCouldNotOpenFileError() << filename);
31}

◆ readEventHeader()

int readEventHeader ( int &  eventID,
double &  eventWeight 
)
protected

Reads the event header from the hepevt file.

Parameters
eventIDreference to the eventID which can be read from the file
eventWeightreference to the eventWeight which can be read from the file
Returns
The number of particles for the current event.

Definition at line 111 of file HepevtReader.cc.

112{
113 //Get number of particles from file
114 int nparticles = -1;
115 string line = getLine();
116 if (line == "" || m_input.eof()) return -1;
117
118 vector<double> fields;
119 fields.reserve(15);
120
121 tokenizer tokens(line, sep);
122 int index(0);
123
124 for (const string& tok : tokens) {
125 ++index;
126 try {
127 fields.push_back(boost::lexical_cast<double>(tok));
128 } catch (boost::bad_lexical_cast& e) {
129 throw (HepEvtConvertFieldError() << m_lineNr << index << tok);
130 }
131 }
132
133 switch (fields.size()) {
134 case 1:
135 nparticles = static_cast<int>(fields[0]);
136 break;
137 case 2:
138 nparticles = static_cast<int>(fields[1]);
139 eventID = static_cast<int>(fields[0]);
140 break;
141 case 3:
142 nparticles = static_cast<int>(fields[1]);
143 eventID = static_cast<int>(fields[0]);
144 eventWeight = fields[2];
145 break;
146 default:
147 nparticles = static_cast<int>(fields[0]);
148 break;
149 }
150 return nparticles;
151}
std::string getLine()
Returns the current line from the Hepevt ascii file.
Definition: HepevtReader.cc:95
static const boost::char_separator< char > sep
The characters at which to split, defaults to ",; \t".
Definition: HepevtReader.h:95
boost::tokenizer< boost::char_separator< char > > tokenizer
Just a typedef for simple use of the boost::tokenizer to split the lines.
Definition: HepevtReader.h:93

◆ readParticle()

void readParticle ( MCParticleGraph::GraphParticle particle)
protected

Reads the information for a single particle from the Hepevt file.

Parameters
particleReference to the particle which will be filled with the information from the Hepevt file.

Definition at line 154 of file HepevtReader.cc.

155{
156 string line = getLine();
157 vector<double> fields;
158 fields.reserve(15);
159
160 tokenizer tokens(line, sep);
161 int index(0);
162
163 for (const string& tok : tokens) {
164 ++index;
165 try {
166 fields.push_back(boost::lexical_cast<double>(tok));
167 } catch (boost::bad_lexical_cast& e) {
168 throw (HepEvtConvertFieldError() << m_lineNr << index << tok);
169 }
170 }
171
172 switch (fields.size()) {
173 case 8:
174 particle.setStatus(MCParticle::c_PrimaryParticle);
175 particle.setPDG(static_cast<int>(fields[1]));
176 particle.setFirstDaughter(static_cast<int>(fields[2]));
177 particle.setLastDaughter(static_cast<int>(fields[3]));
178 particle.setMomentum(ROOT::Math::XYZVector(fields[4], fields[5], fields[6]));
179 particle.setMass(fields[7]);
180 break;
181 case 6:
182 particle.setStatus(MCParticle::c_PrimaryParticle);
183 particle.setPDG(static_cast<int>(fields[5]));
184 particle.setFirstDaughter(0);
185 particle.setLastDaughter(0);
186 particle.setMomentum(ROOT::Math::XYZVector(fields[0], fields[1], fields[2]));
187 particle.setMass(fields[4]);
188 particle.setEnergy(fields[3]);
189 break;
190 //modified Pit
191 case 9:
192 particle.setStatus(MCParticle::c_PrimaryParticle);
193 particle.setPDG(static_cast<int>(fields[8]));
194 particle.setFirstDaughter(0);
195 particle.setLastDaughter(0);
196 particle.setProductionVertex(ROOT::Math::XYZVector(fields[0], fields[1], fields[2])*Unit::mm);
197 particle.setMomentum(ROOT::Math::XYZVector(fields[3], fields[4], fields[5]));
198 particle.setMass(fields[6]);
199 particle.setEnergy(fields[7]);
200 break;
201 //end modified Pit
202 case 15:
203 particle.setStatus(MCParticle::c_PrimaryParticle);
204 particle.setPDG(static_cast<int>(fields[1]));
205 particle.setFirstDaughter(static_cast<int>(fields[4]));
206 particle.setLastDaughter(static_cast<int>(fields[5]));
207 particle.setMomentum(ROOT::Math::XYZVector(fields[6], fields[7], fields[8]));
208 //particle.setEnergy(fields[9]);
209 particle.setMass(fields[10]);
210 particle.setProductionVertex(ROOT::Math::XYZVector(fields[11], fields[12], fields[13])*Unit::mm);
211 particle.setProductionTime(fields[14]*Unit::mm / Const::speedOfLight);
212 particle.setValidVertex(true);
213 {
214 //Warn if energy in Hepevt file differs from calculated energy by more than 0.1%
215 const double& E = particle.getEnergy();
216 double dE = fabs(fields[9] - E) / E;
217 if (dE > 1e-3) {
218 B2WARNING(boost::format("line %d: Energy of particle does not match with expected energy: %.6e != %.6e")
219 % m_lineNr % fields[9] % E);
220 B2WARNING(boost::format("delta E = %.2f%% -> ignoring given value") % (dE * 100));
221 }
222 }
223 break;
224 default:
225 throw (HepEvtParticleFormatError() << m_lineNr << fields.size());
226 }
227}
R E
internal precision of FFTW codelets
static const double speedOfLight
[cm/ns]
Definition: Const.h:695
@ c_PrimaryParticle
bit 0: Particle is primary particle.
Definition: MCParticle.h:47
static const double mm
[millimeters]
Definition: Unit.h:70

◆ skipEvents()

bool skipEvents ( int  n)

Skips a given number of events.

Parameters
nThe number of events which should be skipped.
Returns
True if the events could be skipped.

Definition at line 78 of file HepevtReader.cc.

79{
80 int eventID;
81 double weight;
82 for (int i = 0; i < n; i++) {
83 int nparticles = readEventHeader(eventID, weight);
84 if (nparticles < 0) return false;
85 for (int j = 0; j < nparticles; j++) getLine();
86 }
87 return true;
88}

Member Data Documentation

◆ m_input

std::ifstream m_input
protected

The input stream of the ascii file.

Definition at line 98 of file HepevtReader.h.

◆ m_lineNr

int m_lineNr
protected

The current line number within the ascii file.

Definition at line 97 of file HepevtReader.h.

◆ m_nVirtual

int m_nVirtual

The number of particles in each event with a set Virtual flag.

Definition at line 88 of file HepevtReader.h.

◆ m_wrongSignPz

bool m_wrongSignPz

Bool to indicate that HER and LER were swapped.

Definition at line 89 of file HepevtReader.h.

◆ sep

const boost::char_separator< char > sep
staticprotected

The characters at which to split, defaults to ",; \t".

Definition at line 95 of file HepevtReader.h.


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