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 numer if the event could be read and the number was provided in the file.

Definition at line 35 of file HepevtReader.cc.

36{
37 int eventID = -1;
38 int nparticles = readEventHeader(eventID, eventWeight);
39 if (nparticles <= 0) {
40 throw (HepEvtEmptyEventError() << m_lineNr << nparticles);
41 }
42
43 int first = graph.size();
44 //Make list of particles
45 for (int i = 0; i < nparticles; i++) {
46 graph.addParticle();
47 }
48 //Read particles from file
49 for (int i = 0; i < nparticles; ++i) {
50 MCParticleGraph::GraphParticle& p = graph[first + i];
51 readParticle(p);
52
53 if (m_wrongSignPz) { // this means we have to mirror Pz
54 ROOT::Math::PxPyPzEVector p4 = p.get4Vector();
55 p4.SetPz(-1.0 * p4.Pz());
56 p.set4Vector(p4);
57 }
58
59 //Check for sensible daughter indices
60 int d1 = p.getFirstDaughter();
61 int d2 = p.getLastDaughter();
62 if (d1 < 0 || d1 > nparticles || d2 < d1 || d2 > nparticles) {
63 throw (HepEvtInvalidDaughterIndicesError() << m_lineNr << d1 << d2 << nparticles);
64 }
65 if (d1 == 0) p.addStatus(MCParticle::c_StableInGenerator);
66 //Add decays
67 for (int index = d1; index <= d2; ++index) {
68 if (index > 0) p.decaysInto(graph[first + index - 1]);
69 }
70
71 //check if particle should be made virtual according to steering options:
72 if (i < m_nVirtual)
73 p.setVirtual();
74 }
75 return eventID;
76}
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 96 of file HepevtReader.cc.

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

◆ 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 27 of file HepevtReader.cc.

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

◆ 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 112 of file HepevtReader.cc.

113{
114 //Get number of particles from file
115 int nparticles = -1;
116 string line = getLine();
117 if (line == "" || m_input.eof()) return -1;
118
119 vector<double> fields;
120 fields.reserve(15);
121
122 tokenizer tokens(line, sep);
123 int index(0);
124
125 BOOST_FOREACH(const string & tok, tokens) {
126 ++index;
127 try {
128 fields.push_back(boost::lexical_cast<double>(tok));
129 } catch (boost::bad_lexical_cast& e) {
130 throw (HepEvtConvertFieldError() << m_lineNr << index << tok);
131 }
132 }
133
134 switch (fields.size()) {
135 case 1:
136 nparticles = static_cast<int>(fields[0]);
137 break;
138 case 2:
139 nparticles = static_cast<int>(fields[1]);
140 eventID = static_cast<int>(fields[0]);
141 break;
142 case 3:
143 nparticles = static_cast<int>(fields[1]);
144 eventID = static_cast<int>(fields[0]);
145 eventWeight = fields[2];
146 break;
147 default:
148 nparticles = static_cast<int>(fields[0]);
149 break;
150 }
151 return nparticles;
152}
std::string getLine()
Returns the current line from the Hepevt ascii file.
Definition: HepevtReader.cc:96
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 155 of file HepevtReader.cc.

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

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

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: