Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "GuineaPigPairsFileParser.h"
#include <sstream>
#include <cmath>
GuineaPigPairsFileParser::GuineaPigPairsFileParser(const std::string& filename) {
m_input.open(filename.c_str());
}
bool GuineaPigPairsFileParser::load(IBeamBackgroundFileParser::BeamBackgroundData& result) {
if (not m_input.good()) {
return false;
}
// read one record
std::string tmpline;
// the format
double energy; // unit: GeV
double vx; // unit: c
double vy; // unit: c
double vz; // unit: c
double x; // unit: nm
double y; // unit: nm
double z; // unit: nm
int process;
while(m_input.good()) {
std::getline(m_input, tmpline);
std::stringstream ss;
ss << tmpline;
ss >> energy; if (ss.fail()) { continue; }
ss >> vx; if (ss.fail()) { continue; }
ss >> vy; if (ss.fail()) { continue; }
ss >> vz; if (ss.fail()) { continue; }
ss >> x; if (ss.fail()) { continue; }
ss >> y; if (ss.fail()) { continue; }
ss >> z; if (ss.fail()) { continue; }
ss >> process; if (ss.fail()) { continue; }
int pdgid = 11; // 11: electron; -11: positron
if (energy<0) pdgid = -11;
double p = std::fabs(energy);
double v = sqrt(vx*vx+vy*vy+vz*vz);
// Now, we get a almost valid data
const double nm2mm = 1e-6; // convert from nm to mm
result.pdgid = pdgid;
result.x = x * nm2mm;
result.y = y * nm2mm;
result.z = z * nm2mm;
result.px = p * vx/v;
result.py = p * vy/v;
result.pz = p * vz/v;
result.mass = 0.000511; // assume e-/e+, mass is 0.511 MeV
return true;
}
return false;
}