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;
206 return R_of(a) < R_of(b);
208 constexpr float quality = 0.f;
209 constexpr float vertexZ = 0.f;
214 seed,
true, gctx, mctx, cctx, retrieveSurface);
215 if (!initialParamsOpt.has_value())
continue;
217 boost::container::small_vector<const xAOD::SpacePoint*, 16> sortedSP;
218 sortedSP.reserve(cand.size());
220 sortedSP.push_back(
sp);
221 std::sort(sortedSP.begin(), sortedSP.end(),
223 return R_of(a) < R_of(b);
226 std::vector<const xAOD::UncalibratedMeasurement*> measList;
227 measList.reserve(sortedSP.size() * 2);
230 measList.push_back(m);
234 auto fitted =
m_fitterTool->fit(measList, *initialParamsOpt, gctx, mctx, cctx);
236 for (
auto track : *fitted) {
237 auto newTrack = tracks.makeTrack();
238 newTrack.copyFrom(track);
243 ACTS_DEBUG(
"After track fit: " << tracks.size() <<
" / " << gnnSeeds.
size()
247 timer.emplace(
"Track selection & conversion",
m_chronoSvc.get());
249 Acts::VectorTrackContainer selTrackBackend;
250 selTrackBackend.reserve(trackBackend.size());
255 for (
auto track : tracks) {
256 if (selector.isValidTrack(track)) {
257 auto newTrack = selectedTracks.makeTrack();
260 newTrack.copyFrom(track);
264 ACTS_DEBUG(
"GNN seeds: " << gnnSeeds.
size() <<
", fitted: " << tracks.size()
265 <<
", selected: " << selectedTracks.size());
268 Acts::ConstVectorTrackContainer constTrackBackend(std::move(selTrackBackend));
269 Acts::ConstVectorMultiTrajectory constTrackStateBackend(std::move(trackStateBackend));
270 std::unique_ptr<ActsTrk::TrackContainer> constTracksContainer
271 = std::make_unique<ActsTrk::TrackContainer>(std::move(constTrackBackend), std::move(constTrackStateBackend) );
275 ATH_CHECK(trackContainerHandle.
record(std::move(constTracksContainer)));
277 return StatusCode::SUCCESS;