11 #include <framework/gearbox/Unit.h>
12 #include <framework/gearbox/Const.h>
13 #include <framework/logging/Logger.h>
14 #include <generators/hepevt/HepevtReader.h>
17 #include <boost/lexical_cast.hpp>
18 #include <boost/algorithm/string.hpp>
19 #include <boost/foreach.hpp>
20 #include <boost/format.hpp>
22 #include <TLorentzVector.h>
27 const boost::char_separator<char> HepevtReader::sep(
",; \t");
29 void HepevtReader::open(
const string& filename)
32 m_input.open(filename.c_str());
33 if (!m_input)
throw(HepEvtCouldNotOpenFileError() << filename);
40 int nparticles = readEventHeader(eventID, eventWeight);
41 if (nparticles <= 0) {
42 throw (HepEvtEmptyEventError() << m_lineNr << nparticles);
45 int first = graph.
size();
47 for (
int i = 0; i < nparticles; i++) {
51 for (
int i = 0; i < nparticles; ++i) {
56 TLorentzVector p4 = p.get4Vector();
58 p4.SetPz(-1.0 * p4.Pz());
63 int d1 = p.getFirstDaughter();
64 int d2 = p.getLastDaughter();
65 if (d1 < 0 || d1 > nparticles || d2 < d1 || d2 > nparticles) {
66 throw (HepEvtInvalidDaughterIndicesError() << m_lineNr << d1 << d2 << nparticles);
68 if (d1 == 0) p.addStatus(MCParticle::c_StableInGenerator);
70 for (
int index = d1; index <= d2; ++index) {
71 if (index > 0) p.decaysInto(graph[first + index - 1]);
82 bool HepevtReader::skipEvents(
int n)
86 for (
int i = 0; i < n; i++) {
87 int nparticles = readEventHeader(eventID, weight);
88 if (nparticles < 0)
return false;
89 for (
int j = 0; j < nparticles; j++) getLine();
99 std::string HepevtReader::getLine()
103 getline(m_input, line);
105 size_t commentPos = line.find_first_of(
'#');
106 if (commentPos != string::npos) {
107 line = line.substr(0, commentPos);
110 }
while (line ==
"" && !m_input.eof());
115 int HepevtReader::readEventHeader(
int& eventID,
double& eventWeight)
119 string line = getLine();
120 if (line ==
"" || m_input.eof())
return -1;
122 vector<double> fields;
128 BOOST_FOREACH(
const string & tok, tokens) {
131 fields.push_back(boost::lexical_cast<double>(tok));
132 }
catch (boost::bad_lexical_cast& e) {
133 throw (HepEvtConvertFieldError() << m_lineNr << index << tok);
137 switch (fields.size()) {
139 nparticles =
static_cast<int>(fields[0]);
142 nparticles =
static_cast<int>(fields[1]);
143 eventID =
static_cast<int>(fields[0]);
146 nparticles =
static_cast<int>(fields[1]);
147 eventID =
static_cast<int>(fields[0]);
148 eventWeight = fields[2];
151 nparticles =
static_cast<int>(fields[0]);
160 string line = getLine();
161 vector<double> fields;
167 BOOST_FOREACH(
const string & tok, tokens) {
170 fields.push_back(boost::lexical_cast<double>(tok));
171 }
catch (boost::bad_lexical_cast& e) {
172 throw (HepEvtConvertFieldError() << m_lineNr << index << tok);
176 switch (fields.size()) {
178 particle.setStatus(MCParticle::c_PrimaryParticle);
179 particle.setPDG(
static_cast<int>(fields[1]));
180 particle.setFirstDaughter(
static_cast<int>(fields[2]));
181 particle.setLastDaughter(
static_cast<int>(fields[3]));
182 particle.setMomentum(TVector3(&fields[4]));
183 particle.setMass(fields[7]);
186 particle.setStatus(MCParticle::c_PrimaryParticle);
187 particle.setPDG(
static_cast<int>(fields[5]));
188 particle.setFirstDaughter(0);
189 particle.setLastDaughter(0);
190 particle.setMomentum(TVector3(&fields[0]));
191 particle.setMass(fields[4]);
192 particle.setEnergy(fields[3]);
196 particle.setStatus(MCParticle::c_PrimaryParticle);
197 particle.setPDG(
static_cast<int>(fields[8]));
198 particle.setFirstDaughter(0);
199 particle.setLastDaughter(0);
200 particle.setProductionVertex(TVector3(&fields[0])*Unit::mm);
201 particle.setMomentum(TVector3(&fields[3]));
202 particle.setMass(fields[6]);
203 particle.setEnergy(fields[7]);
207 particle.setStatus(MCParticle::c_PrimaryParticle);
208 particle.setPDG(
static_cast<int>(fields[1]));
209 particle.setFirstDaughter(
static_cast<int>(fields[4]));
210 particle.setLastDaughter(
static_cast<int>(fields[5]));
211 particle.setMomentum(TVector3(&fields[6]));
213 particle.setMass(fields[10]);
214 particle.setProductionVertex(TVector3(&fields[11])*Unit::mm);
215 particle.setProductionTime(fields[14]*Unit::mm / Const::speedOfLight);
216 particle.setValidVertex(
true);
219 const double& E = particle.getEnergy();
220 double dE = fabs(fields[9] - E) / E;
222 B2WARNING(boost::format(
"line %d: Energy of particle does not match with expected energy: %.6e != %.6e")
223 % m_lineNr % fields[9] % E);
224 B2WARNING(boost::format(
"delta E = %.2f%% -> ignoring given value") % (dE * 100));
229 throw (HepEvtParticleFormatError() << m_lineNr << fields.size());