669{
670 nb_output_tracks = 0;
671
672 Acts::VectorTrackContainer track_backend;
673 Acts::VectorMultiTrajectory track_state_backend;
675 std::move(track_backend), std::move(track_state_backend));
676
677 SG::WriteHandle<ActsTrk::TrackContainer> trackContainerHandle(
679
680 Acts::GeometryContext tgContext =
m_ctxProvider.getGeometryContext(eventContext);
681
687 }
688
689
690 float chi2_min = std::numeric_limits<float>::max();
691 float chi2_max = std::numeric_limits<float>::min();
692
693 float ndf_min = std::numeric_limits<float>::max();
694 float ndf_max = std::numeric_limits<float>::min();
695
696 unsigned meas_min = std::numeric_limits<unsigned>::max();
697 unsigned meas_max = std::numeric_limits<unsigned>::min();
698
699 int excluded_ndf = 0;
700 int excluded_no_sp = 0;
701 int excluded_weird_state = 0;
702
703 for (std::size_t i = 0;
i < trackParams.size();
i++) {
704 auto fit_res = trackParams.at(i);
705 auto&
states = measInfo.at(i);
706 if (
states.local_x.size() < 1) {
707 excluded_no_sp += 1;
708 continue;
709 }
710
711
712
713 if (fit_res.ndf >
714 static_cast<float>(std::numeric_limits<unsigned int>::max()) ||
715 fit_res.ndf <
716 static_cast<float>(std::numeric_limits<unsigned int>::min())) {
717 excluded_ndf += 1;
718 continue;
719 }
720
721
722 auto actsTrack = track_container.makeTrack();
723 enum TrackValidity {
VALID, INVALID_STATE, INVALID_GLOBAL };
724 TrackValidity track_validity =
VALID;
725
726
727 actsTrack.chi2() = fit_res.chi2;
728 actsTrack.nDoF() = fit_res.ndf;
729
730 Acts::TrackStatePropMask
const mask =
731 Acts::TrackStatePropMask::Smoothed;
732
733 bool first_state = true;
734 for (
size_t j = 0;
j <
states.local_x.size(); ++
j) {
735 auto actsTSOS = actsTrack.appendTrackState(mask);
736
737
738 LocalMeasurementInfoInTracks singleState;
746 for (
size_t k = 0;
k < 25; ++
k) {
748 }
750
751 std::optional<Acts::BoundTrackParameters> params_opt =
753 if (!params_opt.has_value()) {
754
756 "convertToActsParameters failed: track state is weird");
757 track_validity = INVALID_STATE;
758 break;
759
760 }
761
762 Acts::BoundTrackParameters
const&
parameters = params_opt.value();
764
766 SG::ReadHandle<xAOD::PixelClusterContainer> pixelClustersHandle(
768 ATH_CHECK(pixelClustersHandle.isValid());
770 pixelClustersHandle.cptr();
771
772 SG::ReadHandle<xAOD::StripClusterContainer> stripClustersHandle(
774 ATH_CHECK(stripClustersHandle.isValid());
776 stripClustersHandle.cptr();
777
778
779 int cl_index = -1;
780 if (
auto it = cluster_map.find(
states.athena_id[j]);
781 it != cluster_map.end()) {
782 cl_index =
it->second;
783 } else {
784 return StatusCode::FAILURE;
785 }
786
787
790
792 if (isPixel) {
793 umeas = inputPixelClusters->
at(cl_index);
794 } else {
795 umeas = inputStripClusters->
at(cl_index);
796 }
797
798 actsTSOS.setUncalibratedSourceLink(
800 }
801
802
803
804
805
806
807
808
809 if (first_state) {
810
811
812
813 std::optional<Acts::BoundTrackParameters> params_gl =
815
816 if (!params_gl.has_value()) {
817
819 "convertToActsParameters failed: track state is weird");
820 track_validity = INVALID_GLOBAL;
821 break;
822 }
823
824 Acts::BoundTrackParameters const& parameters_gl =
825 params_gl.value();
826
828 actsTrack.parameters() = parameters_gl.parameters();
829 actsTrack.covariance() = *parameters_gl.covariance();
830 actsTrack.setReferenceSurface(
831 parameters_gl.referenceSurface().getSharedPtr());
832 first_state = false;
833
834 }
835
836 actsTSOS.setReferenceSurface(
837 parameters.referenceSurface().getSharedPtr());
838 actsTSOS.smoothed() =
parameters.parameters();
839 actsTSOS.smoothedCovariance() = *
parameters.covariance();
840
841 actsTSOS.typeFlags().setIsMeasurement();
842 if (!(actsTSOS.hasSmoothed() &&
843 actsTSOS.hasReferenceSurface())) {
845 "TrackState does not have smoothed state ["
846 << actsTSOS.hasSmoothed()
847 << "] or reference surface ["
848 << actsTSOS.hasReferenceSurface() << "].");
849 } else {
851 "TrackState has smoothed state and reference "
852 "surface.");
853 }
854 }
855
856
857 if (track_validity == INVALID_STATE) {
858 ATH_MSG_INFO(
"excluding track " << i <<
" for weird state");
859 excluded_weird_state += 1;
860 track_container.removeTrack(actsTrack.index());
861 } else if (track_validity == INVALID_GLOBAL) {
863 << " for weird global params");
864 track_container.removeTrack(actsTrack.index());
865 }
866
867
868
869 chi2_min = std::min(fit_res.chi2, chi2_min);
870 chi2_max = std::max(fit_res.chi2, chi2_max);
871 ndf_min = std::min(fit_res.ndf, ndf_min);
872 ndf_max = std::max(fit_res.ndf, ndf_max);
873 meas_min = std::min<unsigned>(
states.local_x.size(), meas_min);
874 meas_max = std::max<unsigned>(
states.local_x.size(), meas_max);
875 }
876
877 nb_output_tracks = track_container.size();
878 ATH_MSG_DEBUG(
"Wrote out "<< nb_output_tracks <<
" tracks from " << trackParams.size() <<
" candidates"
879 << ", excluded:"
880 << " no sp: " << excluded_no_sp
881 << ", weird sp: " << excluded_weird_state
882 << ", ndf: " << excluded_ndf
883 );
884
885 Acts::ConstVectorTrackContainer ctrack_backend(
886 std::move(track_container.container()));
887 Acts::ConstVectorMultiTrajectory ctrack_state_backend(
888 std::move(track_container.trackStateContainer()));
889 std::unique_ptr<ActsTrk::TrackContainer> ctrack_container =
890 std::make_unique<ActsTrk::TrackContainer>(
891 std::move(ctrack_backend), std::move(ctrack_state_backend));
892
893 ATH_CHECK(trackContainerHandle.record(std::move(ctrack_container)));
894
895 return StatusCode::SUCCESS;
896}
#define ATH_CHECK
Evaluate an expression and check for errors.
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.