File indexing completed on 2025-12-16 09:25:25
0001
0002
0003
0004
0005
0006
0007
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
0030 struct VertexInfo {
0031
0032 Vector3 position{};
0033
0034 SquareMatrix3 covariance{};
0035
0036 int nTracks = 0;
0037
0038 double trk1Weight = 0;
0039
0040 double trk1Comp = 0;
0041
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
0058 std::ifstream beamspotData(beamspotDataPath);
0059 std::ifstream tracksData(tracksDataPath);
0060 std::ifstream verticesData(verticesDataPath);
0061
0062
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
0071 std::getline(beamspotData, line);
0072 while (beamspotData && std::getline(beamspotData, line)) {
0073
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
0090 std::getline(tracksData, line);
0091 while (tracksData && std::getline(tracksData, line)) {
0092
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
0119 tracks.emplace_back(perigeeSurface, params, std::move(covMat),
0120 ParticleHypothesis::pion());
0121 }
0122
0123
0124 std::getline(verticesData, line);
0125 while (verticesData && std::getline(verticesData, line)) {
0126
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 }