Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-07 07:46:30

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
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   // inputParticles is already checked by base constructor
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 }  // namespace ActsExamples