451 Acts::Result<boost::container::small_vector< typename TrackStateProxy::IndexType, s_maxBranchesPerSurface> >
452 result = boost::container::small_vector< typename TrackStateProxy::IndexType, s_maxBranchesPerSurface>{};
454 using iterator_t = decltype(measurement_range.begin());
456 using BaseElementType = std::remove_cv_t<std::remove_pointer_t< container_value_t > >;
458 using TheMatchingMeasurement = MatchingMeasurement<DIM, container_value_t >;
459 using MeasCovPair = TheMatchingMeasurement::MeasCovPair;
467 Acts::SubspaceIndices<DIM> parameter_map =
derived().template parameterMap<DIM>(geometryContext,
471 = std::make_pair( project<DIM, Predicted>(parameter_map,
473 project<DIM, PredictedCovariance>(parameter_map,
474 derived().boundParams(boundState).covariance().
value()));
477 auto preCalibrator =
derived().template preCalibrator<DIM, BaseElementType>();
478 auto postCalibrator =
derived().template postCalibrator<DIM, BaseElementType>();
480 for (
const auto &measurement : measurement_range ) {
481 TheMatchingMeasurement &matching_measurement=selected_measurements.slot();
482 if (forced && postCalibrator) {
484 const auto &
m =
derived().forwardToCalibrator(measurement);
485 matching_measurement.m_measurement = std::make_pair(
m.template localPosition<DIM>(),
m.template localCovariance<DIM>() );
486 matching_measurement.m_chi2 = 0.0f;
487 matching_measurement.m_sourceLink=measurement;
488 if (!selected_measurements.acceptNoSort())
break;
490 matching_measurement.m_measurement = preCalibrator(geometryContext,
492 derived().forwardToCalibrator(measurement),
493 derived().boundParams(boundState));
494 matching_measurement.m_chi2 =
computeChi2(matching_measurement.m_measurement.first,
495 matching_measurement.m_measurement.second,
499 if (matching_measurement.m_chi2<maxChi2Cut.second) {
500 matching_measurement.m_sourceLink=measurement;
501 selected_measurements.acceptAndSort([](
const TheMatchingMeasurement &
a,
502 const TheMatchingMeasurement &
b) {
503 return a.m_chi2 <
b.m_chi2;
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().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 = (!forced && 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 = (!forced && a_selected_measurement.m_chi2 >= maxChi2Cut.first);
582 Acts::BoundSubspaceIndices boundSubspaceIndices;
583 std::copy(parameter_map.begin(), parameter_map.end(), boundSubspaceIndices.begin());
588 boundSubspaceIndices,
591 (!selected_measurements.
empty()
592 ? selected_measurements.
getSlot( *(selected_measurements.
begin())).m_isOutLier
594 assert(
result->size() == selected_measurements.
size() );
597 auto use_calibrated_storage = [&postCalibrator]() ->
bool {
598 if constexpr(pre_and_post_calib_types_agree) {
599 (void) postCalibrator;
605 return postCalibrator;
610 unsigned int state_i=0;
612 idx: selected_measurements) {
613 assert( state_i < result->
size());
615 TheMatchingMeasurement &a_selected_measurement = selected_measurements.
getSlot(
idx);
616 trackState.setUncalibratedSourceLink(
derived().makeSourceLink(std::move(a_selected_measurement.m_sourceLink.value())));
618 trackState.typeFlags().set( a_selected_measurement.m_isOutLier
619 ? Acts::TrackStateFlag::OutlierFlag
620 : Acts::TrackStateFlag::MeasurementFlag );
621 trackState.allocateCalibrated(DIM);
622 if (use_calibrated_storage()) {
625 assert( use_calibrated_storage() == !pre_and_post_calib_types_agree);
626 if constexpr(!pre_and_post_calib_types_agree) {
627 assert( state_i < calibrated.size());
628 trackState.template calibrated<DIM>()
629 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(calibrated[state_i].first);
630 trackState.template calibratedCovariance<DIM>()
631 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(calibrated[state_i].second);
632 trackState.chi2() = a_selected_measurement.m_chi2;
636 trackState.template calibrated<DIM>()
637 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(a_selected_measurement.m_measurement.first);
638 trackState.template calibratedCovariance<DIM>()
639 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(a_selected_measurement.m_measurement.second);
640 trackState.chi2() = a_selected_measurement.m_chi2;