Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-29 07:55:46

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 #pragma once
0009 
0010 #include "Acts/Definitions/Algebra.hpp"
0011 #include "Acts/Definitions/Units.hpp"
0012 #include "Acts/Surfaces/PerigeeSurface.hpp"
0013 #include "Acts/Vertexing/Vertex.hpp"
0014 #include "ActsTests/CommonHelpers/DataDirectory.hpp"
0015 
0016 #include <fstream>
0017 #include <iterator>
0018 #include <regex>
0019 
0020 namespace ActsTests {
0021 
0022 using namespace Acts;
0023 
0024 using namespace Acts::UnitLiterals;
0025 using Covariance = BoundSquareMatrix;
0026 
0027 enum VertexCsvData { BeamSpotData, VerticesData, TracksData };
0028 
0029 /// @brief Helper struct to store reference vertex related information
0030 struct VertexInfo {
0031   // The position
0032   Vector3 position;
0033   // The covariance
0034   SquareMatrix3 covariance;
0035   // Number of tracks
0036   int nTracks = 0;
0037   // Weight of first track
0038   double trk1Weight = 0;
0039   // Vertex compatibility value of first track
0040   double trk1Comp = 0;
0041   // Chi2 of first track
0042   double trk1Chi2 = 0;
0043 };
0044 
0045 inline std::tuple<Vertex, std::vector<VertexInfo>,
0046                   std::vector<BoundTrackParameters>>
0047 readTracksAndVertexCSV(const std::string& toolString,
0048                        const std::string& fileBase = "vertexing_event_mu20") {
0049   const auto beamspotDataPath =
0050       ActsTests::getDataPath(fileBase + "_beamspot.csv");
0051   const auto tracksDataPath = ActsTests::getDataPath(fileBase + "_tracks.csv");
0052   const auto verticesDataPath =
0053       ActsTests::getDataPath(fileBase + "_vertices_" + toolString + ".csv");
0054 
0055   const std::regex comma(",");
0056 
0057   // Open source files
0058   std::ifstream beamspotData(beamspotDataPath);
0059   std::ifstream tracksData(tracksDataPath);
0060   std::ifstream verticesData(verticesDataPath);
0061 
0062   // String to store the read lines
0063   std::string line{};
0064 
0065   std::shared_ptr<PerigeeSurface> perigeeSurface;
0066   std::vector<BoundTrackParameters> tracks;
0067   std::vector<VertexInfo> vertices;
0068   Vertex beamspotConstraint;
0069 
0070   // Read in beamspot data
0071   std::getline(beamspotData, line);  // skip header
0072   while (beamspotData && std::getline(beamspotData, line)) {
0073     // Tokenize line and store result in vector
0074     std::vector<std::string> row{
0075         std::sregex_token_iterator(line.begin(), line.end(), comma, -1),
0076         std::sregex_token_iterator()};
0077 
0078     Vector3 beamspotPos;
0079     SquareMatrix3 beamspotCov;
0080     beamspotPos << std::stod(row[0]) * (1_mm), std::stod(row[1]) * (1_mm),
0081         std::stod(row[2]) * (1_mm);
0082     beamspotCov << std::stod(row[3]), 0, 0, 0, std::stod(row[4]), 0, 0, 0,
0083         std::stod(row[5]);
0084     beamspotConstraint.setPosition(beamspotPos);
0085     beamspotConstraint.setCovariance(beamspotCov);
0086     perigeeSurface = Surface::makeShared<PerigeeSurface>(beamspotPos);
0087   }
0088 
0089   // Read in track data
0090   std::getline(tracksData, line);  // skip header
0091   while (tracksData && std::getline(tracksData, line)) {
0092     // Tokenize line and store result in vector
0093     std::vector<std::string> row{
0094         std::sregex_token_iterator(line.begin(), line.end(), comma, -1),
0095         std::sregex_token_iterator()};
0096 
0097     BoundVector params;
0098     params << std::stod(row[0]), std::stod(row[1]), std::stod(row[2]),
0099         std::stod(row[3]), std::stod(row[4]) * 1. / (1_MeV), std::stod(row[5]);
0100     Covariance covMat;
0101     covMat << std::stod(row[6]), std::stod(row[7]), std::stod(row[8]),
0102         std::stod(row[9]), std::stod(row[10]) * 1. / (1_MeV),
0103         std::stod(row[11]), std::stod(row[7]), std::stod(row[12]),
0104         std::stod(row[13]), std::stod(row[14]),
0105         std::stod(row[15]) * 1. / (1_MeV), std::stod(row[16]),
0106         std::stod(row[8]), std::stod(row[13]), std::stod(row[17]),
0107         std::stod(row[18]), std::stod(row[19]) * 1. / (1_MeV),
0108         std::stod(row[20]), std::stod(row[9]), std::stod(row[14]),
0109         std::stod(row[18]), std::stod(row[21]),
0110         std::stod(row[22]) * 1. / (1_MeV), std::stod(row[23]),
0111         std::stod(row[10]) * 1. / (1_MeV), std::stod(row[15]) * 1. / (1_MeV),
0112         std::stod(row[19]) * 1. / (1_MeV), std::stod(row[22]) * 1. / (1_MeV),
0113         std::stod(row[24]) * 1. / (1_MeV * 1_MeV),
0114         std::stod(row[25]) * 1. / (1_MeV), std::stod(row[11]),
0115         std::stod(row[16]), std::stod(row[20]), std::stod(row[23]),
0116         std::stod(row[25]) * 1. / (1_MeV), std::stod(row[26]);
0117 
0118     // TODO we do not have a hypothesis at hand here. defaulting to pion
0119     tracks.emplace_back(perigeeSurface, params, std::move(covMat),
0120                         ParticleHypothesis::pion());
0121   }
0122 
0123   // Read in reference vertex data
0124   std::getline(verticesData, line);  // skip header
0125   while (verticesData && std::getline(verticesData, line)) {
0126     // Tokenize line and store result in vector
0127     std::vector<std::string> row{
0128         std::sregex_token_iterator(line.begin(), line.end(), comma, -1),
0129         std::sregex_token_iterator()};
0130 
0131     Vector3 pos;
0132     pos << std::stod(row[0]) * (1_mm), std::stod(row[1]) * (1_mm),
0133         std::stod(row[2]) * (1_mm);
0134     SquareMatrix3 cov;
0135     cov << std::stod(row[3]), std::stod(row[4]), std::stod(row[5]),
0136         std::stod(row[6]), std::stod(row[7]), std::stod(row[8]),
0137         std::stod(row[9]), std::stod(row[10]), std::stod(row[11]);
0138     VertexInfo vertexInfo;
0139     vertexInfo.position = pos;
0140     vertexInfo.covariance = cov;
0141     vertexInfo.nTracks = std::stoi(row[12]);
0142     vertexInfo.trk1Weight = std::stod(row[13]);
0143     vertexInfo.trk1Comp = std::stod(row[14]);
0144     vertexInfo.trk1Chi2 = std::stod(row[15]);
0145     vertices.push_back(vertexInfo);
0146   }
0147 
0148   return {beamspotConstraint, vertices, tracks};
0149 }
0150 
0151 }  // namespace ActsTests