ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimActsTrackInspectionTool.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
8#include <format>
9
11 const std::string& name, const IInterface* ifc)
12 : AthAlgTool(algname, name, ifc) {
13}
14
16 return StatusCode::SUCCESS;
17}
18
20{
21 FPGATrackSimActsEventTracks t_actsTracks;
22 for (const ActsTrk::TrackContainer::ConstTrackProxy tp : tracksContainer)
23 {
24 std::deque<std::unique_ptr<FpgaActsTrack::Measurement>> t_TrackMeasurements;
25 const Acts::BoundVector& parameters = tp.parameters();
26 tracksContainer.trackStateContainer().visitBackwards(tp.tipIndex(), [&t_TrackMeasurements](const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy& state) -> void
27 {
28 if (state.hasUncalibratedSourceLink()) {
29 try {
30 std::reference_wrapper<const xAOD::UncalibratedMeasurement> measurementRef =
31 std::cref(ActsTrk::getUncalibratedMeasurement(state.getUncalibratedSourceLink().get<ActsTrk::ATLASUncalibSourceLink>()));
32 const xAOD::UncalibratedMeasurement& measurement = measurementRef.get();
33 assert(static_cast<unsigned int>(measurement.type() < xAOD::UncalibMeasType::nTypes));
34
35 if (measurement.type() == xAOD::UncalibMeasType::PixelClusterType) {
36 const xAOD::PixelCluster* pixelCluster = static_cast<const xAOD::PixelCluster*>(&measurement);
37 t_TrackMeasurements.emplace_front(std::make_unique<FpgaActsTrack::Measurement>(FpgaActsTrack::Measurement{
38 pixelCluster->identifier(),
39 "Pixel",
40 { pixelCluster->globalPosition().x(),
41 pixelCluster->globalPosition().y(),
42 pixelCluster->globalPosition().z() },
43 state.typeFlags().test(Acts::TrackStateFlag::MeasurementFlag),
44 state.typeFlags().test(Acts::TrackStateFlag::OutlierFlag),
45 state.typeFlags().test(Acts::TrackStateFlag::HoleFlag),
46 state.typeFlags().test(Acts::TrackStateFlag::MaterialFlag),
47 state.typeFlags().test(Acts::TrackStateFlag::SharedHitFlag) }));
48 }
49 else if (measurement.type() == xAOD::UncalibMeasType::StripClusterType) {
50 const xAOD::StripCluster* stripCluster = static_cast<const xAOD::StripCluster*>(&measurement);
51 t_TrackMeasurements.emplace_front(std::make_unique<FpgaActsTrack::Measurement>(FpgaActsTrack::Measurement{
52 stripCluster->identifier(),
53 "Strip",
54 { stripCluster->globalPosition().x(),
55 stripCluster->globalPosition().y(),
56 stripCluster->globalPosition().z()},
57 state.typeFlags().test(Acts::TrackStateFlag::MeasurementFlag),
58 state.typeFlags().test(Acts::TrackStateFlag::OutlierFlag),
59 state.typeFlags().test(Acts::TrackStateFlag::HoleFlag),
60 state.typeFlags().test(Acts::TrackStateFlag::MaterialFlag),
61 state.typeFlags().test(Acts::TrackStateFlag::SharedHitFlag) }));
62 }
63
64 }
65 catch (const std::bad_any_cast&) {
66 }
67 }
68 });
69 t_actsTracks.emplace_back(std::make_unique<FpgaActsTrack>(FpgaActsTrack{ parameters, std::move(t_TrackMeasurements), tp.chi2(), tp.nDoF() }));
70 }
71
72 return t_actsTracks;
73}
74
75
77 const fpgaActsEventTracks& tracks) const
78{
79 std::ostringstream printoutTable;
80 unsigned int t_trackCoutner = 0, t_measCounter = 0;
81 printoutTable << "\n|-------------------------------------------------------------------------------------------------------------------------------|\n";
82 for (const auto& track : tracks)
83 {
84 ++t_trackCoutner;
85 printoutTable << "| # | QopT | Eta | Phi | d0 | z0 | chi2 | ndof |\n"
86 << "|-------------------------------------------------------------------------------------------------------------------------------|\n"
87 << std::format("| {:>5} | {:>16.10f} | {:>15.10f} | {:>15.10f} | {:>16.10f} | {:>16.10f} | {:>12.10f} | {:>8} |\n",
88 t_trackCoutner,
89 track->parameters[Acts::eBoundQOverP] / std::sin(track->parameters[Acts::eBoundTheta]),
90 -std::log(std::tan(track->parameters[Acts::eBoundTheta] / 2.0)),
91 track->parameters[Acts::eBoundPhi],
92 track->parameters[Acts::eBoundLoc0],
93 track->parameters[Acts::eBoundLoc1],
94 track->chi2,
95 track->ndof
96 );
97 t_measCounter = 0;
98 printoutTable << "| |_______________________________________________________________________________________________________________________|\n"
99 << "| | ## | type | x | y | z | outlier | meas | hole | Identifier |\n"
100 << "| |-----------------------------------------------------------------------------------------------------------------------|\n";
101 for (const auto& measurement : track->trackMeasurements)
102 {
103 ++t_measCounter;
104 printoutTable << std::format("| | {:>4} | {} | {:>16.5f} | {:>16.5f} | {:>16.5f} | {:>7} | {:>5} | {:6>5} | {:>18} |\n",
105 t_measCounter,
106 measurement->type.c_str(),
107 measurement->coordinates.x,
108 measurement->coordinates.y,
109 measurement->coordinates.z,
110 measurement->outlierFlag,
111 measurement->measurementFlag,
112 measurement->holeFlag,
113 measurement->identifier);
114 }
115 printoutTable << "|-------------------------------------------------------------------------------------------------------------------------------|\n";
116 }
117
118 return printoutTable.str();
119}
120
121
123 const std::map<std::string, std::map<uint32_t, std::vector<uint32_t>> >& tracksForAllEvents) const
124{
125 std::ostringstream printoutTable;
126 printoutTable << "Printing out ACTS statistics";
127 printoutTable << "\n|---------------------------------------------------------------------------------------|"
128 << "\n| Collection Name | Outliers (avg) | Measurements (avg) | Holes (avg) |"
129 << "\n|---------------------------------------------------------------------------------------|";
130 for (const auto& collection : tracksForAllEvents)
131 {
132 printoutTable << std::format("\n| {:>33} | {:>14.2f} | {:>18.2f} | {:>11.2f} |",
133 collection.first,
134 collection.second.at(Acts::TrackStateFlag::OutlierFlag).size() ?
135 std::accumulate(collection.second.at(Acts::TrackStateFlag::OutlierFlag).begin(),
136 collection.second.at(Acts::TrackStateFlag::OutlierFlag).end(), 0.0)
137 / collection.second.at(Acts::TrackStateFlag::OutlierFlag).size() : 0,
138
139 collection.second.at(Acts::TrackStateFlag::MeasurementFlag).size() ? std::accumulate(collection.second.at(Acts::TrackStateFlag::MeasurementFlag).begin(), collection.second.at(Acts::TrackStateFlag::MeasurementFlag).end(), 0.0) / collection.second.at(Acts::TrackStateFlag::MeasurementFlag).size() : 0,
140
141 collection.second.at(Acts::TrackStateFlag::HoleFlag).size() ? std::accumulate(collection.second.at(Acts::TrackStateFlag::HoleFlag).begin(), collection.second.at(Acts::TrackStateFlag::HoleFlag).end(), 0.0) / collection.second.at(Acts::TrackStateFlag::HoleFlag).size() : 0);
142 }
143 printoutTable << "\n|---------------------------------------------------------------------------------------|";
144 return printoutTable.str();
145}
FPGATrackSim::ActsTrackInspectionTool::fpgaActsEventTracks FPGATrackSimActsEventTracks
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
std::string getPrintoutStatistics(const std::map< std::string, std::map< uint32_t, std::vector< uint32_t > > > &tracksForAllEvents) const
std::string getPrintoutActsEventTracks(const fpgaActsEventTracks &tracks) const
std::vector< std::unique_ptr< FpgaActsTrack > > fpgaActsEventTracks
ActsTrackInspectionTool(const std::string &, const std::string &, const IInterface *)
fpgaActsEventTracks getActsTracks(const ActsTrk::TrackContainer &tracksContainer) const