441 Acts::Result<boost::container::small_vector< typename TrackStateProxy::IndexType, s_maxBranchesPerSurface> >
442 result = boost::container::small_vector< typename TrackStateProxy::IndexType, s_maxBranchesPerSurface>{};
444 using iterator_t = decltype(measurement_range.begin());
446 using BaseElementType = std::remove_cv_t<std::remove_pointer_t< container_value_t > >;
448 using TheMatchingMeasurement = MatchingMeasurement<DIM, container_value_t >;
449 using MeasCovPair = TheMatchingMeasurement::MeasCovPair;
457 Acts::SubspaceIndices<DIM> parameter_map =
derived().template parameterMap<DIM>(geometryContext,
461 = std::make_pair( project<DIM, Predicted>(parameter_map,
463 project<DIM, PredictedCovariance>(parameter_map,
464 derived().boundParams(boundState).covariance().
value()));
467 auto preCalibrator =
derived().template preCalibrator<DIM, BaseElementType>();
470 for (
const auto &measurement : measurement_range ) {
471 TheMatchingMeasurement &matching_measurement=selected_measurements.slot();
472 matching_measurement.m_measurement = preCalibrator(geometryContext,
474 derived().forwardToCalibrator(measurement),
475 derived().boundParams(boundState));
476 matching_measurement.m_chi2 =
computeChi2(matching_measurement.m_measurement.first,
477 matching_measurement.m_measurement.second,
481 if (matching_measurement.m_chi2<maxChi2Cut.second) {
482 matching_measurement.m_sourceLink=measurement;
483 selected_measurements.acceptAndSort([](
const TheMatchingMeasurement &
a,
484 const TheMatchingMeasurement &
b) {
485 return a.m_chi2 <
b.m_chi2;
492 auto postCalibrator =
derived().template postCalibrator<DIM, BaseElementType>();
493 using post_calib_meas_cov_pair_t
499 static constexpr
bool pre_and_post_calib_types_agree
505 using Empty =
struct {};
506 typename std::conditional< !pre_and_post_calib_types_agree,
507 std::array< post_calib_meas_cov_pair_t, NMeasMax>,
509 if (postCalibrator) {
514 idx: selected_measurements) {
515 TheMatchingMeasurement &a_selected_measurement = selected_measurements.
getSlot(
idx);
519 post_calib_meas_cov_pair_t &calibrated_measurement
520 = [&calibrated, &a_selected_measurement, calibrated_meas_cov_i]() -> post_calib_meas_cov_pair_t & {
521 if constexpr(pre_and_post_calib_types_agree) {
523 (void) calibrated_meas_cov_i;
524 return a_selected_measurement.m_measurement;
527 (void) a_selected_measurement;
528 assert(calibrated_meas_cov_i < calibrated.size());
529 return calibrated[calibrated_meas_cov_i];
534 calibrated_measurement = postCalibrator(geometryContext,
536 derived().forwardToCalibrator(a_selected_measurement.m_sourceLink.value()),
537 derived().boundParams(boundState));
539 a_selected_measurement.m_chi2 =
computeChi2(calibrated_measurement.first,
540 calibrated_measurement.second,
544 a_selected_measurement.m_isOutLier = (a_selected_measurement.m_chi2 >= maxChi2Cut.first);
545 if constexpr(!pre_and_post_calib_types_agree) {
546 ++calibrated_meas_cov_i;
553 idx: selected_measurements) {
554 TheMatchingMeasurement &a_selected_measurement = selected_measurements.
getSlot(
idx);
555 a_selected_measurement.m_isOutLier = (a_selected_measurement.m_chi2 >= maxChi2Cut.first);
565 Acts::BoundSubspaceIndices boundSubspaceIndices;
566 std::copy(parameter_map.begin(), parameter_map.end(), boundSubspaceIndices.begin());
571 boundSubspaceIndices,
574 (!selected_measurements.
empty()
575 ? selected_measurements.
getSlot( *(selected_measurements.
begin())).m_isOutLier
577 assert(
result->size() == selected_measurements.
size() );
580 auto use_calibrated_storage = [&postCalibrator]() ->
bool {
581 if constexpr(pre_and_post_calib_types_agree) {
582 (void) postCalibrator;
588 return postCalibrator;
593 unsigned int state_i=0;
595 idx: selected_measurements) {
596 assert( state_i < result->
size());
598 TheMatchingMeasurement &a_selected_measurement = selected_measurements.
getSlot(
idx);
599 trackState.setUncalibratedSourceLink(
derived().makeSourceLink(std::move(a_selected_measurement.m_sourceLink.value())));
601 trackState.typeFlags().set( a_selected_measurement.m_isOutLier
602 ? Acts::TrackStateFlag::OutlierFlag
603 : Acts::TrackStateFlag::MeasurementFlag );
604 trackState.allocateCalibrated(DIM);
605 if (use_calibrated_storage()) {
608 assert( use_calibrated_storage() == !pre_and_post_calib_types_agree);
609 if constexpr(!pre_and_post_calib_types_agree) {
610 assert( state_i < calibrated.size());
611 trackState.template calibrated<DIM>()
612 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(calibrated[state_i].first);
613 trackState.template calibratedCovariance<DIM>()
614 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(calibrated[state_i].second);
615 trackState.chi2() = a_selected_measurement.m_chi2;
619 trackState.template calibrated<DIM>()
620 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(a_selected_measurement.m_measurement.first);
621 trackState.template calibratedCovariance<DIM>()
622 = MeasurementSelectorMatrixTraits::matrixTypeCast<typename MeasurementSelectorTraits<derived_t>::MatrixFloatType>(a_selected_measurement.m_measurement.second);
623 trackState.chi2() = a_selected_measurement.m_chi2;