File indexing completed on 2026-09-10 08:20:22
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ActsExamples/Validation/TrackSummaryPlotTool.hpp"
0010
0011 #include "Acts/Utilities/VectorHelpers.hpp"
0012
0013 #include <format>
0014
0015 using namespace Acts::Experimental;
0016 using namespace ActsExamples;
0017
0018 namespace {
0019
0020 ProfileHistogram1 makeProfile(
0021 const TrackSummaryPlotTool::TrackSummaryPlotTool::Config& cfg,
0022 std::string name, const std::string& title,
0023 const Acts::Experimental::AxisVariant& ax) {
0024 if (!cfg.prefix.empty()) {
0025 name = std::format("{}_{}", cfg.prefix, name);
0026 }
0027 const auto& yAxis = cfg.varBinning.at("Num");
0028 Acts::Range1D<double> yRange{yAxis.bin(0).lower(),
0029 yAxis.bin(yAxis.size() - 1).upper()};
0030 return ProfileHistogram1(name, title, {ax}, yAxis.metadata(), yRange);
0031 }
0032
0033 }
0034
0035 namespace ActsExamples {
0036
0037 TrackSummaryPlotTool::TrackSummaryPlotTool(
0038 const TrackSummaryPlotTool::Config& cfg, Acts::Logging::Level lvl)
0039 : m_cfg(cfg),
0040 m_logger(Acts::getDefaultLogger("TrackSummaryPlotTool", lvl)) {
0041 ACTS_DEBUG(
0042 "Initialize the histograms for track info plots"
0043 << (m_cfg.prefix.empty() ? "" : ", use prefix '" + m_cfg.prefix + "'"));
0044
0045 m_profiles.insert(
0046 {"nStates_vs_eta",
0047 makeProfile(m_cfg, "nStates_vs_eta", "Number of total states vs. #eta",
0048 m_cfg.varBinning.at("Eta"))});
0049 m_profiles.insert(
0050 {"nMeasurements_vs_eta", makeProfile(m_cfg, "nMeasurements_vs_eta",
0051 "Number of measurements vs. #eta",
0052 m_cfg.varBinning.at("Eta"))});
0053 m_profiles.insert({"nHoles_vs_eta", makeProfile(m_cfg, "nHoles_vs_eta",
0054 "Number of holes vs. #eta",
0055 m_cfg.varBinning.at("Eta"))});
0056 m_profiles.insert(
0057 {"nOutliers_vs_eta",
0058 makeProfile(m_cfg, "nOutliers_vs_eta", "Number of outliers vs. #eta",
0059 m_cfg.varBinning.at("Eta"))});
0060 m_profiles.insert(
0061 {"nSharedHits_vs_eta", makeProfile(m_cfg, "nSharedHits_vs_eta",
0062 "Number of Shared Hits vs. #eta",
0063 m_cfg.varBinning.at("Eta"))});
0064 m_profiles.insert(
0065 {"nStates_vs_pT",
0066 makeProfile(m_cfg, "nStates_vs_pT", "Number of total states vs. pT",
0067 m_cfg.varBinning.at("Pt"))});
0068 m_profiles.insert(
0069 {"nMeasurements_vs_pT", makeProfile(m_cfg, "nMeasurements_vs_pT",
0070 "Number of measurements vs. pT",
0071 m_cfg.varBinning.at("Pt"))});
0072 m_profiles.insert({"nHoles_vs_pT", makeProfile(m_cfg, "nHoles_vs_pT",
0073 "Number of holes vs. pT",
0074 m_cfg.varBinning.at("Pt"))});
0075 m_profiles.insert(
0076 {"nOutliers_vs_pT",
0077 makeProfile(m_cfg, "nOutliers_vs_pT", "Number of outliers vs. pT",
0078 m_cfg.varBinning.at("Pt"))});
0079 m_profiles.insert(
0080 {"nSharedHits_vs_pT",
0081 makeProfile(m_cfg, "nSharedHits_vs_pT", "Number of Shared Hits vs. pT",
0082 m_cfg.varBinning.at("Pt"))});
0083 }
0084
0085 void TrackSummaryPlotTool::fill(
0086 const Acts::BoundTrackParameters& fittedParameters, std::size_t nStates,
0087 std::size_t nMeasurements, std::size_t nOutliers, std::size_t nHoles,
0088 std::size_t nSharedHits) {
0089 using Acts::VectorHelpers::eta;
0090 using Acts::VectorHelpers::perp;
0091 const auto momentum = fittedParameters.momentum();
0092 const double fit_eta = eta(momentum);
0093 const double fit_pT = perp(momentum);
0094
0095 m_profiles.at("nStates_vs_eta").fill({fit_eta}, static_cast<double>(nStates));
0096 m_profiles.at("nMeasurements_vs_eta")
0097 .fill({fit_eta}, static_cast<double>(nMeasurements));
0098 m_profiles.at("nOutliers_vs_eta")
0099 .fill({fit_eta}, static_cast<double>(nOutliers));
0100 m_profiles.at("nHoles_vs_eta").fill({fit_eta}, static_cast<double>(nHoles));
0101 m_profiles.at("nSharedHits_vs_eta")
0102 .fill({fit_eta}, static_cast<double>(nSharedHits));
0103
0104 m_profiles.at("nStates_vs_pT").fill({fit_pT}, static_cast<double>(nStates));
0105 m_profiles.at("nMeasurements_vs_pT")
0106 .fill({fit_pT}, static_cast<double>(nMeasurements));
0107 m_profiles.at("nOutliers_vs_pT")
0108 .fill({fit_pT}, static_cast<double>(nOutliers));
0109 m_profiles.at("nHoles_vs_pT").fill({fit_pT}, static_cast<double>(nHoles));
0110 m_profiles.at("nSharedHits_vs_pT")
0111 .fill({fit_pT}, static_cast<double>(nSharedHits));
0112 }
0113
0114 }