500{
501 nb_output_tracks = 0;
502
503 Acts::VectorTrackContainer track_backend;
504 Acts::VectorMultiTrajectory track_state_backend;
506 std::move(track_backend), std::move(track_state_backend));
507
508 SG::WriteHandle<ActsTrk::TrackContainer> trackContainerHandle(
510
511 Acts::GeometryContext tgContext =
m_ctxProvider.getGeometryContext(eventContext);
512
518 }
519
520
521 float chi2_min = std::numeric_limits<float>::max();
522 float chi2_max = std::numeric_limits<float>::min();
523
524 float ndf_min = std::numeric_limits<float>::max();
525 float ndf_max = std::numeric_limits<float>::min();
526
527 unsigned meas_min = std::numeric_limits<unsigned>::max();
528 unsigned meas_max = std::numeric_limits<unsigned>::min();
529
530 int excluded_ndf = 0;
531 int excluded_no_sp = 0;
532 int excluded_weird_state = 0;
533
534 for (std::size_t i = 0;
i < trackParams.size();
i++) {
535 auto fit_res = trackParams.at(i);
536 auto&
states = measInfo.at(i);
537 if (
states.local_x.size() < 1) {
538 excluded_no_sp += 1;
539 continue;
540 }
541
542
543
544 if (fit_res.ndf >
545 static_cast<float>(std::numeric_limits<unsigned int>::max()) ||
546 fit_res.ndf <
547 static_cast<float>(std::numeric_limits<unsigned int>::min())) {
548 excluded_ndf += 1;
549 continue;
550 }
551
552
553 auto actsTrack = track_container.makeTrack();
556
557
558 actsTrack.chi2() = fit_res.chi2;
559 actsTrack.nDoF() = fit_res.ndf;
560
561 Acts::TrackStatePropMask
const mask =
562 Acts::TrackStatePropMask::Smoothed;
563
564 bool first_state = true;
565 for (
size_t j = 0;
j <
states.local_x.size(); ++
j) {
566 auto actsTSOS = actsTrack.appendTrackState(mask);
567
568
569 LocalMeasurementInfoInTracks singleState;
577 for (
size_t k = 0;
k < 25; ++
k) {
579 }
581
582 std::optional<Acts::BoundTrackParameters> params_opt =
584 if (!params_opt.has_value()) {
585
587 "convertToActsParameters failed: track state is weird");
588 track_validity = INVALID_STATE;
589 break;
590
591 }
592
593 Acts::BoundTrackParameters
const&
parameters = params_opt.value();
595
597 SG::ReadHandle<xAOD::PixelClusterContainer> pixelClustersHandle(
599 ATH_CHECK(pixelClustersHandle.isValid());
601 pixelClustersHandle.cptr();
602
603 SG::ReadHandle<xAOD::StripClusterContainer> stripClustersHandle(
605 ATH_CHECK(stripClustersHandle.isValid());
607 stripClustersHandle.cptr();
608
609
610 int cl_index = -1;
611 if (
auto it = cluster_map.find(
states.athena_id[j]);
612 it != cluster_map.end()) {
613 cl_index =
it->second;
614 } else {
615 return StatusCode::FAILURE;
616 }
617
618
621
623 if (isPixel) {
624 umeas = inputPixelClusters->
at(cl_index);
625 } else {
626 umeas = inputStripClusters->
at(cl_index);
627 }
628
629 actsTSOS.setUncalibratedSourceLink(
631 }
632
633
634
635
636
637
638
639
640 if (first_state) {
641
642
643
644 std::optional<Acts::BoundTrackParameters> params_gl =
646
647 if (!params_gl.has_value()) {
648
650 "convertToActsParameters failed: track state is weird");
651 track_validity = INVALID_GLOBAL;
652 break;
653 }
654
655 Acts::BoundTrackParameters const& parameters_gl =
656 params_gl.value();
657
659 actsTrack.parameters() = parameters_gl.parameters();
660 actsTrack.covariance() = *parameters_gl.covariance();
661 actsTrack.setReferenceSurface(
662 parameters_gl.referenceSurface().getSharedPtr());
663 first_state = false;
664
665 }
666
667 actsTSOS.setReferenceSurface(
668 parameters.referenceSurface().getSharedPtr());
669 actsTSOS.smoothed() =
parameters.parameters();
670 actsTSOS.smoothedCovariance() = *
parameters.covariance();
671
672 actsTSOS.typeFlags().setIsMeasurement();
673 if (!(actsTSOS.hasSmoothed() &&
674 actsTSOS.hasReferenceSurface())) {
676 "TrackState does not have smoothed state ["
677 << actsTSOS.hasSmoothed()
678 << "] or reference surface ["
679 << actsTSOS.hasReferenceSurface() << "].");
680 } else {
682 "TrackState has smoothed state and reference "
683 "surface.");
684 }
685 }
686
687
688 if (track_validity == INVALID_STATE) {
689 ATH_MSG_INFO(
"excluding track " << i <<
" for weird state");
690 excluded_weird_state += 1;
691 track_container.removeTrack(actsTrack.index());
692 } else if (track_validity == INVALID_GLOBAL) {
694 << " for weird global params");
695 track_container.removeTrack(actsTrack.index());
696 }
697
698
699
700 chi2_min = std::min(fit_res.chi2, chi2_min);
701 chi2_max = std::max(fit_res.chi2, chi2_max);
702 ndf_min = std::min(fit_res.ndf, ndf_min);
703 ndf_max = std::max(fit_res.ndf, ndf_max);
704 meas_min = std::min<unsigned>(
states.local_x.size(), meas_min);
705 meas_max = std::max<unsigned>(
states.local_x.size(), meas_max);
706 }
707
708 nb_output_tracks = track_container.size();
709 ATH_MSG_DEBUG(
"Wrote out "<< nb_output_tracks <<
" tracks from " << trackParams.size() <<
" candidates"
710 << ", excluded:"
711 << " no sp: " << excluded_no_sp
712 << ", weird sp: " << excluded_weird_state
713 << ", ndf: " << excluded_ndf
714 );
715
716 Acts::ConstVectorTrackContainer ctrack_backend(
717 std::move(track_container.container()));
718 Acts::ConstVectorMultiTrajectory ctrack_state_backend(
719 std::move(track_container.trackStateContainer()));
720 std::unique_ptr<ActsTrk::TrackContainer> ctrack_container =
721 std::make_unique<ActsTrk::TrackContainer>(
722 std::move(ctrack_backend), std::move(ctrack_state_backend));
723
724 ATH_CHECK(trackContainerHandle.record(std::move(ctrack_container)));
725
726 return StatusCode::SUCCESS;
727}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x,...)
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...
const T * at(size_type n) const
Access an element, as an rvalue.
SG::WriteHandleKey< ActsTrk::TrackContainer > m_ActsTracccTrackContainerKey
ActsTrk::ContextUtility m_ctxProvider
Utility to fetch the geometry, magnetic field and calibration context in the event.
SG::WriteHandleKey< xAOD::PixelClusterContainer > m_xAODPixelClusterFromInDetClusterKey
std::optional< Acts::BoundTrackParameters > convertToActsParameters(const LocalMeasurementInfoInTracks &state) const
Gaudi::Property< bool > m_doTruth
Truth association for plotting and debugging.
SG::WriteHandleKey< xAOD::StripClusterContainer > m_xAODStripClusterFromInDetClusterKey
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
PixelClusterContainer_v1 PixelClusterContainer
Define the version of the pixel cluster container.
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
StripClusterContainer_v1 StripClusterContainer
Define the version of the strip cluster container.