117 ACTS_DEBUG(
"TrackFindingGNNAlg::execute() - begin");
119 std::optional<Athena::Chrono> timer;
120 timer.emplace(
"GNN get spacepoint handles",
m_chronoSvc.get());
122 const Acts::GeometryContext gctx =
m_ctxProvider.getGeometryContext(ctx);
123 const Acts::MagneticFieldContext mctx =
m_ctxProvider.getMagneticFieldContext(ctx);
124 const Acts::CalibrationContext cctx =
m_ctxProvider.getCalibrationContext(ctx);
133 auto stripSPOVHandle =
137 std::vector<const xAOD::SpacePointContainer*> spacePointCollections{
138 pixelSPHandle.cptr(), stripSPHandle.cptr(), stripSPOVHandle.cptr()};
141 timer.emplace(
"GNN seed building",
m_chronoSvc.get());
146 ACTS_DEBUG(
"GNN produced " << gnnSeeds.
size() <<
" seed candidates");
149 timer.emplace(
"GNN parameter estimation + fit",
m_chronoSvc.get());
151 Acts::VectorTrackContainer trackBackend;
152 Acts::VectorMultiTrajectory trackStateBackend;
153 constexpr std::size_t nTracksExpected = 3000;
154 trackBackend.reserve(nTracksExpected);
155 trackStateBackend.reserve(nTracksExpected * 30);
162 return Acts::fastHypot(
sp->x(),
sp->y(),
sp->z());
168 boost::container::small_vector<const xAOD::SpacePoint*, 3>> {
170 boost::container::small_vector<const xAOD::SpacePoint*, 3> picked;
175 picked.push_back(last);
176 for (std::size_t i = 1; i < cand.size() && picked.size() < 3; ++i) {
179 picked.push_back(
sp);
183 if (picked.size() < 3)
188 auto retrieveSurface = [&](
const ActsTrk::Seed& seed,
bool useTopSp) ->
const Acts::Surface& {
193 throw std::runtime_error(
"retrieveSurface: no Acts surface for GeometryIdentifier " + std::to_string(geoId.value()));
200 auto pickedOpt = spacePointSelector(cand);
201 if (!pickedOpt.has_value())
continue;
203 auto picked = *pickedOpt;
204 constexpr float quality = 0.f;
205 constexpr float vertexZ = 0.f;
210 seed,
true, gctx, mctx, cctx, retrieveSurface);
211 if (!initialParamsOpt.has_value())
continue;
214 std::vector<const xAOD::UncalibratedMeasurement*> measList;
215 measList.reserve(cand.size() * 2);
218 measList.push_back(m);
222 auto fitted =
m_fitterTool->fit(measList, *initialParamsOpt, gctx, mctx, cctx);
224 for (
auto track : *fitted) {
225 auto newTrack = tracks.makeTrack();
226 newTrack.copyFrom(track);
231 ACTS_DEBUG(
"After track fit: " << tracks.size() <<
" / " << gnnSeeds.
size()
235 timer.emplace(
"Track selection & conversion",
m_chronoSvc.get());
237 Acts::VectorTrackContainer selTrackBackend;
238 selTrackBackend.reserve(trackBackend.size());
243 for (
auto track : tracks) {
244 if (selector.isValidTrack(track)) {
245 auto newTrack = selectedTracks.makeTrack();
248 newTrack.copyFrom(track);
252 ACTS_DEBUG(
"GNN seeds: " << gnnSeeds.
size() <<
", fitted: " << tracks.size()
253 <<
", selected: " << selectedTracks.size());
256 Acts::ConstVectorTrackContainer constTrackBackend(std::move(selTrackBackend));
257 Acts::ConstVectorMultiTrajectory constTrackStateBackend(std::move(trackStateBackend));
258 std::unique_ptr<ActsTrk::TrackContainer> constTracksContainer
259 = std::make_unique<ActsTrk::TrackContainer>(std::move(constTrackBackend), std::move(constTrackStateBackend) );
263 ATH_CHECK(trackContainerHandle.
record(std::move(constTracksContainer)));
265 return StatusCode::SUCCESS;