ATLAS Offline Software
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::initialize
virtual StatusCode initialize() override
Definition: FPGATrackSimActsTrackInspectionTool.cxx:15
UncalibratedMeasurement.h
getMenu.algname
algname
Definition: getMenu.py:54
ActsTrk::TrackContainer
Definition: TrackContainer.h:30
vtune_athena.format
format
Definition: vtune_athena.py:14
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
ParticleTest.tp
tp
Definition: ParticleTest.py:25
FPGATrackSim::ActsTrackInspectionTool::getActsTracks
fpgaActsEventTracks getActsTracks(const ActsTrk::TrackContainer &tracksContainer) const
Definition: FPGATrackSimActsTrackInspectionTool.cxx:19
FPGATrackSim::ActsTrackInspectionTool::ActsTrackInspectionTool
ActsTrackInspectionTool(const std::string &, const std::string &, const IInterface *)
Definition: FPGATrackSimActsTrackInspectionTool.cxx:10
FPGATrackSim::ActsTrackInspectionTool::getPrintoutActsEventTracks
std::string getPrintoutActsEventTracks(const fpgaActsEventTracks &tracks) const
Definition: FPGATrackSimActsTrackInspectionTool.cxx:76
FPGATrackSimActsTrackInspectionTool.h
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
PixelClusterContainer.h
FPGATrackSim::ActsTrackInspectionTool::FpgaActsTrack
Definition: FPGATrackSimActsTrackInspectionTool.h:25
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
FPGATrackSim::ActsTrackInspectionTool::fpgaActsEventTracks
std::vector< std::unique_ptr< FpgaActsTrack > > fpgaActsEventTracks
Definition: FPGATrackSimActsTrackInspectionTool.h:48
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
runIDAlign.accumulate
accumulate
Update flags based on parser line args.
Definition: runIDAlign.py:107
StripClusterContainer.h
FPGATrackSim::ActsTrackInspectionTool::getPrintoutStatistics
std::string getPrintoutStatistics(const std::map< std::string, std::map< uint32_t, std::vector< uint32_t >> > &tracksForAllEvents) const
Definition: FPGATrackSimActsTrackInspectionTool.cxx:122
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
physics_parameters.parameters
parameters
Definition: physics_parameters.py:144
xAOD::track
@ track
Definition: TrackingPrimitives.h:513
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
AthAlgTool
Definition: AthAlgTool.h:26
FPGATrackSimActsEventTracks
FPGATrackSim::ActsTrackInspectionTool::fpgaActsEventTracks FPGATrackSimActsEventTracks
Definition: FPGATrackSimActsTrackInspectionTool.h:59