Skip to content
Snippets Groups Projects
GuineaPigPairsFileParser.cpp 1.82 KiB
Newer Older
#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;

}