Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-10 08:20:25

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/CsvSpacePointReader.hpp"
0010 
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/EventData/SourceLink.hpp"
0013 #include "ActsExamples/EventData/SpacePoint.hpp"
0014 #include "ActsExamples/Framework/AlgorithmContext.hpp"
0015 #include "ActsExamples/Io/Csv/CsvInputOutput.hpp"
0016 #include "ActsExamples/Utilities/Paths.hpp"
0017 
0018 #include <stdexcept>
0019 #include <string>
0020 
0021 #include "CsvOutputData.hpp"
0022 
0023 namespace ActsExamples {
0024 
0025 CsvSpacePointReader::CsvSpacePointReader(const Config& cfg,
0026                                          Acts::Logging::Level lvl)
0027     : m_cfg{cfg} {
0028   if (m_cfg.inputStem.empty()) {
0029     throw std::invalid_argument("Missing input filename stem");
0030   }
0031   if (m_cfg.inputCollection != "pixel" && m_cfg.inputCollection != "strip" &&
0032       m_cfg.inputCollection != "overlap") {
0033     throw std::invalid_argument("Invalid input collection " +
0034                                 m_cfg.inputCollection);
0035   }
0036 
0037   auto& filename = m_cfg.inputCollection.empty()
0038                        ? cfg.inputStem
0039                        : cfg.inputStem + '_' + cfg.inputCollection;
0040   m_eventsRange = determineEventFilesRange(cfg.inputDir, filename + ".csv");
0041   m_logger = Acts::getDefaultLogger("CsvSpacePointReader", lvl);
0042 
0043   m_outputSpacePoints.initialize(m_cfg.outputSpacePoints);
0044 }
0045 
0046 std::string CsvSpacePointReader::CsvSpacePointReader::name() const {
0047   return "CsvSpacePointReader";
0048 }
0049 
0050 std::pair<std::size_t, std::size_t> CsvSpacePointReader::availableEvents()
0051     const {
0052   return m_eventsRange;
0053 }
0054 
0055 ProcessCode CsvSpacePointReader::read(const AlgorithmContext& ctx) {
0056   SpacePointContainer spacePoints(
0057       SpacePointColumns::SourceLinks | SpacePointColumns::X |
0058       SpacePointColumns::Y | SpacePointColumns::Z |
0059       SpacePointColumns::VarianceR | SpacePointColumns::VarianceZ |
0060       SpacePointColumns::StripCalibrationDetails);
0061 
0062   const auto& filename = m_cfg.inputCollection.empty()
0063                              ? m_cfg.inputStem
0064                              : m_cfg.inputStem + '_' + m_cfg.inputCollection;
0065   const auto& path =
0066       perEventFilepath(m_cfg.inputDir, filename + ".csv", ctx.eventNumber);
0067 
0068   BoostDescribeCsvReader<SpacePointData> reader(path);
0069   SpacePointData data;
0070 
0071   while (reader.read(data)) {
0072     auto sp = spacePoints.createSpacePoint();
0073     sp.assignSourceLinks(std::array{Acts::SourceLink(data.measurement_id)});
0074     sp.x() = data.sp_x;
0075     sp.y() = data.sp_y;
0076     sp.z() = data.sp_z;
0077     sp.varianceR() = data.sp_covr;
0078     sp.varianceZ() = data.sp_covz;
0079 
0080     if (m_cfg.extendCollection) {
0081       const Acts::Vector3 innerStripHalfVector =
0082           Acts::Vector3(data.sp_bottomStripDirection_0,
0083                         data.sp_bottomStripDirection_1,
0084                         data.sp_bottomStripDirection_2) *
0085           data.sp_bottomHalfStripLength;
0086       const Acts::Vector3 outerStripCenter(data.sp_topStripCenterPosition_0,
0087                                            data.sp_topStripCenterPosition_1,
0088                                            data.sp_topStripCenterPosition_2);
0089       const Acts::Vector3 outerStripHalfVector =
0090           Acts::Vector3(data.sp_topStripDirection_0,
0091                         data.sp_topStripDirection_1,
0092                         data.sp_topStripDirection_2) *
0093           data.sp_topHalfStripLength;
0094       const Acts::Vector3 stripSeparation(data.sp_stripCenterDistance_0,
0095                                           data.sp_stripCenterDistance_1,
0096                                           data.sp_stripCenterDistance_2);
0097 
0098       Eigen::Map<Eigen::Vector3f>(
0099           sp.outerStripCalibrationDetails().outerCenter.data()) =
0100           outerStripCenter.cast<float>();
0101       Eigen::Map<Eigen::Vector3f>(
0102           sp.outerStripCalibrationDetails().innerToOuterSeparation.data()) =
0103           stripSeparation.cast<float>();
0104       Eigen::Map<Eigen::Vector3f>(
0105           sp.outerStripCalibrationDetails().outerHalfVector.data()) =
0106           outerStripHalfVector.cast<float>();
0107       Eigen::Map<Eigen::Vector3f>(
0108           sp.outerStripCalibrationDetails().innerHalfVector.data()) =
0109           innerStripHalfVector.cast<float>();
0110     }
0111   }
0112 
0113   ACTS_DEBUG("Created " << spacePoints.size() << " " << m_cfg.inputCollection
0114                         << " space points");
0115   m_outputSpacePoints(ctx, std::move(spacePoints));
0116 
0117   return ProcessCode::SUCCESS;
0118 }
0119 
0120 }  // namespace ActsExamples