File indexing completed on 2026-04-07 07:46:30
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ActsExamples/Io/Csv/CsvParticleWriter.hpp"
0010
0011 #include "Acts/Definitions/Units.hpp"
0012 #include "ActsExamples/Framework/AlgorithmContext.hpp"
0013 #include "ActsExamples/Io/Csv/CsvInputOutput.hpp"
0014 #include "ActsExamples/Utilities/Paths.hpp"
0015
0016 #include <stdexcept>
0017 #include <vector>
0018
0019 #include "CsvOutputData.hpp"
0020
0021 namespace ActsExamples {
0022
0023 CsvParticleWriter::CsvParticleWriter(const Config& cfg,
0024 Acts::Logging::Level lvl)
0025 : WriterT(cfg.inputParticles, "CsvParticleWriter", lvl), m_cfg(cfg) {
0026
0027 if (m_cfg.outputStem.empty()) {
0028 throw std::invalid_argument("Missing output filename stem");
0029 }
0030 }
0031
0032 ProcessCode CsvParticleWriter::writeT(const AlgorithmContext& ctx,
0033 const SimParticleContainer& particles) {
0034 auto pathParticles = perEventFilepath(
0035 m_cfg.outputDir, m_cfg.outputStem + ".csv", ctx.eventNumber);
0036 BoostDescribeCsvWriter<ParticleData> writer(pathParticles,
0037 m_cfg.outputPrecision);
0038
0039 ParticleData data;
0040 for (const auto& particle : particles) {
0041 const auto particleID = particle.particleId().asVector();
0042 data.particle_id_pv = particleID[0];
0043 data.particle_id_sv = particleID[1];
0044 data.particle_id_part = particleID[2];
0045 data.particle_id_gen = particleID[3];
0046 data.particle_id_subpart = particleID[4];
0047 data.particle_type = particle.pdg();
0048 data.process = static_cast<decltype(data.process)>(particle.process());
0049 data.vx = particle.position().x() / Acts::UnitConstants::mm;
0050 data.vy = particle.position().y() / Acts::UnitConstants::mm;
0051 data.vz = particle.position().z() / Acts::UnitConstants::mm;
0052 data.vt = particle.time() / Acts::UnitConstants::mm;
0053 const auto p = particle.absoluteMomentum() / Acts::UnitConstants::GeV;
0054 data.px = p * particle.direction().x();
0055 data.py = p * particle.direction().y();
0056 data.pz = p * particle.direction().z();
0057 data.m = particle.mass() / Acts::UnitConstants::GeV;
0058 data.q = particle.charge() / Acts::UnitConstants::e;
0059 writer.append(data);
0060 }
0061
0062 return ProcessCode::SUCCESS;
0063 }
0064
0065 }