Function executing the algorithm.
236{
237
238
241
244
245
246
247
250
253
254 if(stripMeasMap->size() == 0 || pixelMeasMap->size() == 0){
255 ATH_MSG_FATAL(
"Maps relating traccc measurements to xAOD cluster containers are empty!!");
256 return StatusCode::FAILURE;
257 }
258
259
262
264
265 traccc_track_container::buffer traccc_tracks_buffer;
266 traccc_tracks_buffer.tracks =
268 nullptr, vecmem::copy::type::device_to_host);
269 traccc_tracks_buffer.states =
271 nullptr, vecmem::copy::type::device_to_host);
272
273 traccc_track_container::const_device traccc_tracks(
274 traccc_tracks_buffer);
275
276 ATH_MSG_DEBUG(
"Read " << traccc_tracks.tracks.size() <<
" tracks from device.");
278
279
280 Acts::VectorTrackContainer trackBackend;
281 Acts::VectorMultiTrajectory trackStateBackend;
283 std::move(trackStateBackend));
284
285
286 unsigned nExcludedFitOutcome = 0;
287 unsigned nExcludedNoState = 0;
288 unsigned nExcludedBadNdf = 0;
289 unsigned nExcludedWeirdState = 0;
290 unsigned nExcludedWeirdGlobal = 0;
291
292 for (std::size_t i = 0;
i < traccc_tracks.tracks.size(); ++
i) {
293
294 const traccc::edm::track
track = traccc_tracks.tracks.at(i);
295
296 const auto fitOutcome =
track.fit_outcome();
297 if (fitOutcome == traccc::track_fit_outcome::FAILURE_NON_POSITIVE_NDF ||
298 fitOutcome == traccc::track_fit_outcome::FAILURE_NOT_ALL_SMOOTHED ||
299 fitOutcome == traccc::track_fit_outcome::UNKNOWN) {
301 << static_cast<int>(fitOutcome));
302 ++nExcludedFitOutcome;
303 continue;
304 }
305
306 if (
track.constituent_links().empty()) {
307 ++nExcludedNoState;
308 continue;
309 }
310
312 static_cast<float>(std::numeric_limits<unsigned int>::max()) ||
314 static_cast<float>(std::numeric_limits<unsigned int>::min())) {
315 ++nExcludedBadNdf;
316 continue;
317 }
318
320
321 auto actsTrack = trackContainer.makeTrack();
322 actsTrack.chi2() =
track.chi2();
323 actsTrack.nDoF() =
track.ndf();
324
325 Acts::TrackStatePropMask const state_mask =
326 Acts::TrackStatePropMask::Smoothed;
327
328 bool firstState = true;
329
330 for (
const auto [linkType, stateIdx] :
track.constituent_links()) {
331
332 assert(linkType == traccc::edm::track_constituent_link::track_state);
333
334 const auto& state = traccc_tracks.states.at(stateIdx);
335 const auto& meas_index = state.measurement_index();
336
337 auto trackState = actsTrack.appendTrackState(state_mask);
338 trackState.typeFlags().setIsMeasurement();
339
340 const std::optional<Acts::BoundTrackParameters> smoothed =
342
343 if (!smoothed) {
344 ATH_MSG_DEBUG(
"Track " << i <<
": degenerate smoothed state, "
345 "dropping track");
347 break;
348 }
349
351 &
makeSourceLink(meas_index, *pixelMeasMap, *stripMeasMap, *pixel_clusters, *strip_clusters);
352
354
355
356
357
358
359
360 if (firstState) {
361 const std::optional<Acts::BoundTrackParameters>
global =
363 if (!global) {
365 << i
366 << ": degenerate global parameters, "
367 "dropping track");
369 break;
370 }
371 actsTrack.parameters() =
global->parameters();
372 actsTrack.covariance() = *
global->covariance();
373 actsTrack.setReferenceSurface(
374 global->referenceSurface().getSharedPtr());
375 firstState = false;
376 }
377
378 try {
379 trackState.setReferenceSurface(
380 smoothed->referenceSurface().getSharedPtr());
381 trackState.smoothed() = smoothed->parameters();
382 trackState.smoothedCovariance() = *smoothed->covariance();
383 } catch (const std::exception& e) {
384 ATH_MSG_ERROR(
"Track " << i <<
": failed to set track state ("
386 }
387
388 }
389
391 ++nExcludedWeirdState;
392 trackContainer.removeTrack(actsTrack.index());
394 ++nExcludedWeirdGlobal;
395 trackContainer.removeTrack(actsTrack.index());
396 } else {
397
398 const auto& pars = actsTrack.parameters();
399 const double qop = pars[Acts::eBoundQOverP];
400 const double p = (qop != 0) ? 1.0 / std::abs(qop) : 0.0;
401 const double pT =
p * std::sin(pars[Acts::eBoundTheta]);
403 <<
track.constituent_links().size()
404 <<
" chi2=" <<
track.chi2()
405 <<
" ndf=" <<
track.ndf()
406 << " |p|=" << p << " GeV pT=" << pT << " GeV");
407 }
408
409 }
410
413 << nExcludedFitOutcome << " (fit outcome), "
414 << nExcludedNoState << " (no state), "
415 << nExcludedBadNdf << " (bad ndf), "
416 << nExcludedWeirdState << " (weird state), "
417 << nExcludedWeirdGlobal << " (weird global params)");
418
424
426
427 Acts::ConstVectorTrackContainer constTrackBackend(
428 std::move(trackContainer.container()));
429 Acts::ConstVectorMultiTrajectory constTrackStateBackend(
430 std::move(trackContainer.trackStateContainer()));
431 auto constTrackContainer = std::make_unique<ActsTrk::TrackContainer>(
432 std::move(constTrackBackend), std::move(constTrackStateBackend));
433
434 SG::WriteHandle<ActsTrk::TrackContainer> outputHandle(
436 ATH_CHECK(outputHandle.record(std::move(constTrackContainer)));
437
438 return StatusCode::SUCCESS;
439}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_FATAL(x,...)
std::atomic< int > m_nExcludedWeirdState
std::atomic< int > m_nExcludedBadNdf
std::atomic< int > m_nTracksOut
std::optional< Acts::BoundTrackParameters > convertGlobalToActsParameters(traccc::bound_track_parameters< traccc::default_algebra > const &trkParams) const
SG::ReadHandleKey< xAOD::StripClusterContainer > m_inputStripClustersKey
const xAOD::UncalibratedMeasurement & makeSourceLink(const unsigned int &meas_index, std::span< const unsigned int > pixelMap, std::span< const unsigned int > stripMap, const xAOD::PixelClusterContainer &pixel_clusters, const xAOD::StripClusterContainer &strip_clusters) const
ToolHandle< AthDevice::ICopyTool > m_copy
SG::ReadHandleKey< xAOD::PixelClusterContainer > m_inputPixelClustersKey
SG::ReadHandleKey< std::vector< unsigned int > > m_inputMeasToStripClKey
std::atomic< int > m_nTracksIn
The object counters for debug prints in finalize method {.
SG::ReadHandleKey< traccc_track_container::buffer > m_inputTracksKey
std::atomic< int > m_nExcludedWeirdGlobal
SG::WriteHandleKey< ActsTrk::TrackContainer > m_outputTracksKey
ToolHandle< AthDevice::IMemoryResourceTool > m_hostMR
std::atomic< int > m_nExcludedNoState
SG::ReadHandleKey< std::vector< unsigned int > > m_inputMeasToPixelSPKey
std::atomic< int > m_nExcludedFitOutcome
std::optional< Acts::BoundTrackParameters > convertSmoothedToActsParameters(traccc::edm::track_state< state_t > const &state) const
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.