460 Acts::Result<boost::container::small_vector< typename TrackStateProxy::IndexType, s_maxBranchesPerSurface> >
461 result = boost::container::small_vector< typename TrackStateProxy::IndexType, s_maxBranchesPerSurface>{};
463 using BaseElementType = std::remove_cv_t<std::remove_pointer_t< container_value_t > >;
465 using TheMatchingMeasurement = MatchingMeasurement<DIM, container_value_t >;
466 using MeasCovPair = TheMatchingMeasurement::MeasCovPair;
478 = std::make_pair( project<DIM, Predicted>(parameter_map,
480 project<DIM, PredictedCovariance>(parameter_map,
481 derived().boundParams(boundState).covariance().
value()));
484 auto preCalibrator =
derived().template preCalibrator<DIM, BaseElementType>();
487 for (
const auto &measurement : MeasurementRange<T_Container>(container, sourceLinkBegin, sourceLinkEnd) ) {
488 TheMatchingMeasurement &matching_measurement=selected_measurements.slot();
489 matching_measurement.m_measurement = preCalibrator(geometryContext,
491 derived().
template forwardToCalibrator(measurement),
492 derived().boundParams(boundState));
493 matching_measurement.m_chi2 =
computeChi2(matching_measurement.m_measurement.first,
494 matching_measurement.m_measurement.second,
498 if (matching_measurement.m_chi2<maxChi2Cut.second) {
499 matching_measurement.m_sourceLink=measurement;
500 selected_measurements.acceptAndSort([](
const TheMatchingMeasurement &
a,
501 const TheMatchingMeasurement &
b) {
502 return a.m_chi2 <
b.m_chi2;
509 auto postCalibrator =
derived().template postCalibrator<DIM, BaseElementType>();
510 using post_calib_meas_cov_pair_t
516 static constexpr
bool pre_and_post_calib_types_agree
522 using Empty =
struct {};
523 typename std::conditional< !pre_and_post_calib_types_agree,
524 std::array< post_calib_meas_cov_pair_t, NMeasMax>,
526 if (postCalibrator) {
531 idx: selected_measurements) {
532 TheMatchingMeasurement &a_selected_measurement = selected_measurements.
getSlot(
idx);
536 post_calib_meas_cov_pair_t &calibrated_measurement
537 = [&calibrated, &a_selected_measurement, calibrated_meas_cov_i]() -> post_calib_meas_cov_pair_t & {
538 if constexpr(pre_and_post_calib_types_agree) {
540 (void) calibrated_meas_cov_i;
541 return a_selected_measurement.m_measurement;
544 (void) a_selected_measurement;
545 assert(calibrated_meas_cov_i < calibrated.size());
546 return calibrated[calibrated_meas_cov_i];
551 calibrated_measurement = postCalibrator(geometryContext,
553 derived().
template forwardToCalibrator(a_selected_measurement.m_sourceLink.value()),
554 derived().boundParams(boundState));
556 a_selected_measurement.m_chi2 =
computeChi2(calibrated_measurement.first,
557 calibrated_measurement.second,
561 a_selected_measurement.m_isOutLier = (a_selected_measurement.m_chi2 >= maxChi2Cut.first);
562 if constexpr(!pre_and_post_calib_types_agree) {
563 ++calibrated_meas_cov_i;
570 idx: selected_measurements) {
571 TheMatchingMeasurement &a_selected_measurement = selected_measurements.
getSlot(
idx);
572 a_selected_measurement.m_isOutLier = (a_selected_measurement.m_chi2 >= maxChi2Cut.first);
585 ProjectorBitSetMaker::create(parameter_map),
588 (!selected_measurements.
empty()
589 ? selected_measurements.
getSlot( *(selected_measurements.
begin())).m_isOutLier
591 assert(
result->size() == selected_measurements.
size() );
594 auto use_calibrated_storage = [&postCalibrator]() ->
bool {
595 if constexpr(pre_and_post_calib_types_agree) {
596 (void) postCalibrator;
602 return postCalibrator;
607 unsigned int state_i=0;
609 idx: selected_measurements) {
610 assert( state_i < result->
size());
612 TheMatchingMeasurement &a_selected_measurement = selected_measurements.
getSlot(
idx);
613 trackState.setUncalibratedSourceLink(
derived().makeSourceLink(std::move(a_selected_measurement.m_sourceLink.value())));
615 trackState.typeFlags().set( a_selected_measurement.m_isOutLier
616 ? Acts::TrackStateFlag::OutlierFlag
617 : Acts::TrackStateFlag::MeasurementFlag );
618 trackState.allocateCalibrated(DIM);
619 if (use_calibrated_storage()) {
622 assert( use_calibrated_storage() == !pre_and_post_calib_types_agree);
623 if constexpr(!pre_and_post_calib_types_agree) {
624 assert( state_i < calibrated.size());
625 trackState.template calibrated<DIM>()
626 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(calibrated[state_i].first);
627 trackState.template calibratedCovariance<DIM>()
628 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(calibrated[state_i].second);
629 trackState.chi2() = a_selected_measurement.m_chi2;
633 trackState.template calibrated<DIM>()
634 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(a_selected_measurement.m_measurement.first);
635 trackState.template calibratedCovariance<DIM>()
636 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(a_selected_measurement.m_measurement.second);
637 trackState.chi2() = a_selected_measurement.m_chi2;