Belle II Software development
LHEReader Class Reference

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

#include <LHEReader.h>

Public Member Functions

 BELLE2_DEFINE_EXCEPTION (LHECouldNotOpenFileError, "Could not open file %1% !")
 Exception is thrown if the LHE file could not be opened.
 
 BELLE2_DEFINE_EXCEPTION (LHEInvalidDaughterIndicesError, "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 (LHEHeaderNotValidError, "Line %1%: Event header not understood: %2%")
 Exception is thrown if the header specifying the event header could not be parsed.
 
 BELLE2_DEFINE_EXCEPTION (LHEConvertFieldError, "Line %1%: Could not convert field %2%: %3%")
 Exception is thrown if a field in the LHE file could not be converted to a number.
 
 BELLE2_DEFINE_EXCEPTION (LHEParticleFormatError, "Line %1%: Particle format not understood, got %2% fields !")
 Exception is thrown if the format of a line of the LHE file could not be parsed.
 
 BELLE2_DEFINE_EXCEPTION (LHEEmptyEventError, "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.
 
 LHEReader ()
 Constructor.
 
 ~LHEReader ()
 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.
 
void setInitialIndex (int index)
 Set the maximum index of particles in each event that must be set as c_Initial (1-based).
 
void setVirtualIndex (int index)
 Set the maximum index of particles in each event that must be set as c_IsVirtual (1-based).
 

Public Attributes

bool m_wrongSignPz
 Bool to indicate that HER and LER were swapped.
 
double m_meanDecayLength = 0.
 Mean lifetime*c of displaced particle.
 
double m_Rmin = 0.
 Minimum of vertex distance to IP.
 
double m_Rmax = 0.
 Maximum of vertex distance to IP.
 
int m_pdgDisplaced = 0
 PDG code of the displaced particle being studied.
 

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 LHE ascii file.
 
int readEventHeader (double &eventWeight)
 Reads the event header from the hepevt file.
 
int readParticle (MCParticleGraph::GraphParticle &particle)
 Reads the information for a single particle from the LHE 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.
 
int m_indexInitial
 Maximum index of particles in each event that must be set as c_Initial (1-based).
 
int m_indexVirtual
 Maximum index of particles in each event that must be set as c_IsVirtual (1-based).
 

Static Protected Attributes

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

Detailed Description

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

The class is very similar to the HepEvt Reader

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 31 of file LHEReader.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 110 of file LHEReader.h.

Constructor & Destructor Documentation

◆ LHEReader()

LHEReader ( )
inline

Constructor.

Definition at line 52 of file LHEReader.h.

52 :
53 m_wrongSignPz(false),
54 m_lineNr(0),
57 {}
int m_lineNr
The current line number within the ascii file.
Definition: LHEReader.h:114
int m_indexVirtual
Maximum index of particles in each event that must be set as c_IsVirtual (1-based).
Definition: LHEReader.h:142
int m_indexInitial
Maximum index of particles in each event that must be set as c_Initial (1-based).
Definition: LHEReader.h:140
bool m_wrongSignPz
Bool to indicate that HER and LER were swapped.
Definition: LHEReader.h:102

◆ ~LHEReader()

~LHEReader ( )
inline

Destructor.

Definition at line 62 of file LHEReader.h.

62{ if (m_input) m_input.close(); }
std::ifstream m_input
The input stream of the ascii file.
Definition: LHEReader.h:115

Member Function Documentation

◆ BELLE2_DEFINE_EXCEPTION()

BELLE2_DEFINE_EXCEPTION ( LHEEmptyEventError  ,
"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 73 of file LHEReader.h.

73{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 LHE 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 36 of file LHEReader.cc.

37{
38 int nparticles = readEventHeader(eventWeight);
39 if (nparticles <= 0) {
40 throw (LHEEmptyEventError() << 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
49 double r, x = 0, y = 0, z = 0, t = 0;
50 //Read particles from file
51 for (int i = 0; i < nparticles; ++i) {
52 MCParticleGraph::GraphParticle& p = graph[first + i];
53 int mother = readParticle(p);
54
55 // add the mother
56 if (mother > 0) {
57 MCParticleGraph::GraphParticle* q = &graph[mother - 1];
58 p.comesFrom(*q);
59 }
60
61 // if positron goes to positive z-direction, we have to rotate along y-axis by 180deg
62 if (m_wrongSignPz) {
63 ROOT::Math::PxPyPzEVector p4 = p.get4Vector();
64 p4.SetPz(-1.0 * p4.Pz());
65 p4.SetPx(-1.0 * p4.Px());
66 p.set4Vector(p4);
67 }
68
69 //move vertex position of selected particle and its daughters
70 if (m_meanDecayLength > 0) {
71 if (p.getPDG() == m_pdgDisplaced) {
72 TF1 fr("fr", "exp(-x/[0])", 0, 1000000);
73 ROOT::Math::PxPyPzEVector p4 = p.get4Vector();
74 fr.SetRange(m_Rmin, m_Rmax);
75 fr.SetParameter(0, m_meanDecayLength * p4.Gamma());
76 r = fr.GetRandom();
77 x = r * p4.Px() / p4.P();
78 y = r * p4.Py() / p4.P();
79 z = r * p4.Pz() / p4.P();
80 p.setDecayVertex(x, y, z);
81 t = (r / Const::speedOfLight) * (p4.E() / p4.P());
82 p.setDecayTime(t);
83 p.setValidVertex(true);
84 }
85
86 if (mother > 0) {
87 if (graph[mother - 1].getPDG() == m_pdgDisplaced) {
88 p.setProductionVertex(x, y, z);
89 p.setProductionTime(t);
90 p.setValidVertex(true);
91 }
92 }
93 }
94
95
96 // initial 2 (e+/e-), virtual 3 (Z/gamma*)
97 // check if particle should be made virtual according to steering options:
98 if (i < m_indexVirtual && i >= m_indexInitial)
99 p.addStatus(MCParticle::c_IsVirtual);
100
101 if (i < m_indexInitial)
102 p.addStatus(MCParticle::c_Initial);
103
104 if (m_indexVirtual < m_indexInitial) B2WARNING("IsVirtual particle requested but is overwritten by Initial");
105
106 }
107// return eventID;
108 return -1;
109}
static const double speedOfLight
[cm/ns]
Definition: Const.h:695
int readParticle(MCParticleGraph::GraphParticle &particle)
Reads the information for a single particle from the LHE file.
Definition: LHEReader.cc:196
double m_Rmin
Minimum of vertex distance to IP.
Definition: LHEReader.h:104
int m_pdgDisplaced
PDG code of the displaced particle being studied.
Definition: LHEReader.h:106
double m_Rmax
Maximum of vertex distance to IP.
Definition: LHEReader.h:105
int readEventHeader(double &eventWeight)
Reads the event header from the hepevt file.
Definition: LHEReader.cc:149
double m_meanDecayLength
Mean lifetime*c of displaced particle.
Definition: LHEReader.h:103
Class to represent Particle data in graph.
size_t size() const
Return the number of particles in the graph.
@ c_Initial
bit 5: Particle is initial such as e+ or e- and not going to Geant4
Definition: MCParticle.h:57
@ c_IsVirtual
bit 4: Particle is virtual and not going to Geant4.
Definition: MCParticle.h:55
GraphParticle & addParticle()
Add new particle to the graph.

◆ getLine()

std::string getLine ( )
protected

Returns the current line from the LHE ascii file.

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

Definition at line 130 of file LHEReader.cc.

131{
132 std::string line;
133 do {
134 getline(m_input, line);
135 m_lineNr++;
136 size_t commentPos = line.find_first_of('#');
137 if (commentPos != string::npos) {
138 line = line.substr(0, commentPos);
139 }
140 boost::trim(line);
141
142 } while (line == "" && !m_input.eof());
143
144 return line;
145}

◆ open()

void open ( const std::string &  filename)

Opens an ascii file and prepares it for reading.

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

Definition at line 28 of file LHEReader.cc.

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

◆ readEventHeader()

int readEventHeader ( double &  eventWeight)
protected

Reads the event header from the hepevt file.

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

Definition at line 149 of file LHEReader.cc.

150{
151
152 // Search for next <event>
153 std::string line2;
154 do {
155 getline(m_input, line2);
156 m_lineNr++;
157 size_t commentPos = line2.find_first_of('#');
158 if (commentPos != string::npos) {
159 line2 = line2.substr(0, commentPos);
160 }
161 boost::trim(line2);
162
163 } while (line2 != "<event>" && !m_input.eof());
164
165 //Get number of particles from file
166 int nparticles = -1;
167 string line = getLine();
168
169 if (line == "" || m_input.eof()) return -1;
170
171 vector<double> fields;
172 fields.reserve(15);
173
174 tokenizer tokens(line, sep);
175 int index(0);
176
177 BOOST_FOREACH(const string & tok, tokens) {
178 ++index;
179 try {
180 fields.push_back(boost::lexical_cast<double>(tok));
181 } catch (boost::bad_lexical_cast& e) {
182 throw (LHEConvertFieldError() << m_lineNr << index << tok);
183 }
184 }
185
186 switch (fields.size()) {
187 default:
188 eventWeight = 1.0;
189 nparticles = static_cast<int>(fields[0]); //other fields in LHE contain effective couplings
190 break;
191 }
192 return nparticles;
193}
std::string getLine()
Returns the current line from the LHE ascii file.
Definition: LHEReader.cc:130
static const boost::char_separator< char > sep
The characters at which to split, defaults to ",; \t".
Definition: LHEReader.h:112
boost::tokenizer< boost::char_separator< char > > tokenizer
Just a typedef for simple use of the boost::tokenizer to split the lines.
Definition: LHEReader.h:110

◆ readParticle()

int readParticle ( MCParticleGraph::GraphParticle particle)
protected

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

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

Definition at line 196 of file LHEReader.cc.

197{
198 int mother = -1;
199
200 string line = getLine();
201 vector<double> fields;
202 fields.reserve(15);
203
204 tokenizer tokens(line, sep);
205 int index(0);
206
207 BOOST_FOREACH(const string & tok, tokens) {
208 ++index;
209 try {
210 fields.push_back(boost::lexical_cast<double>(tok));
211 } catch (boost::bad_lexical_cast& e) {
212 throw (LHEConvertFieldError() << m_lineNr << index << tok);
213 }
214 }
215
216 switch (fields.size()) {
217 case 13:
218 particle.addStatus(MCParticle::c_PrimaryParticle);
219 particle.setPDG(static_cast<int>(fields[0]));
220 mother = static_cast<int>(fields[2]);
221 particle.setMomentum(ROOT::Math::XYZVector(fields[6], fields[7], fields[8]));
222 particle.setEnergy(fields[9]);
223 particle.setMass(fields[10]);
224 break;
225 default:
226 throw (LHEParticleFormatError() << m_lineNr << fields.size());
227 }
228
229 return mother;
230}
@ c_PrimaryParticle
bit 0: Particle is primary particle.
Definition: MCParticle.h:47

◆ setInitialIndex()

void setInitialIndex ( int  index)
inline

Set the maximum index of particles in each event that must be set as c_Initial (1-based).

Parameters
[in]indexMaximum index for c_Initial.

Definition at line 94 of file LHEReader.h.

94{ m_indexInitial = index; }

◆ setVirtualIndex()

void setVirtualIndex ( int  index)
inline

Set the maximum index of particles in each event that must be set as c_IsVirtual (1-based).

Parameters
[in]indexMaximum index for c_IsVirtual.

Definition at line 100 of file LHEReader.h.

100{ m_indexVirtual = index; }

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

113{
114// int eventID;
115 double weight;
116 for (int i = 0; i < n; i++) {
117// int nparticles = readEventHeader(eventID, weight);
118 int nparticles = readEventHeader(weight);
119 if (nparticles < 0) return false;
120 for (int j = 0; j < nparticles; j++) getLine();
121 }
122 return true;
123}

Member Data Documentation

◆ m_indexInitial

int m_indexInitial
protected

Maximum index of particles in each event that must be set as c_Initial (1-based).

Definition at line 140 of file LHEReader.h.

◆ m_indexVirtual

int m_indexVirtual
protected

Maximum index of particles in each event that must be set as c_IsVirtual (1-based).

Definition at line 142 of file LHEReader.h.

◆ m_input

std::ifstream m_input
protected

The input stream of the ascii file.

Definition at line 115 of file LHEReader.h.

◆ m_lineNr

int m_lineNr
protected

The current line number within the ascii file.

Definition at line 114 of file LHEReader.h.

◆ m_meanDecayLength

double m_meanDecayLength = 0.

Mean lifetime*c of displaced particle.

Definition at line 103 of file LHEReader.h.

◆ m_pdgDisplaced

int m_pdgDisplaced = 0

PDG code of the displaced particle being studied.

Definition at line 106 of file LHEReader.h.

◆ m_Rmax

double m_Rmax = 0.

Maximum of vertex distance to IP.

Definition at line 105 of file LHEReader.h.

◆ m_Rmin

double m_Rmin = 0.

Minimum of vertex distance to IP.

Definition at line 104 of file LHEReader.h.

◆ m_wrongSignPz

bool m_wrongSignPz

Bool to indicate that HER and LER were swapped.

Definition at line 102 of file LHEReader.h.

◆ sep

const boost::char_separator< char > sep
staticprotected

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

Definition at line 112 of file LHEReader.h.


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