41 std::unique_ptr<Trk::FitQuality> buildFitQuality(
45 Trk::GaussianSumFitter::GSFTrajectory::const_iterator stateOnSurface =
46 smoothedTrajectory.begin();
47 for (; stateOnSurface != smoothedTrajectory.end(); ++stateOnSurface) {
51 if (!stateOnSurface->fitQualityOnSurface) {
54 chiSquared += stateOnSurface->fitQualityOnSurface.chiSquared();
55 numberDoF += stateOnSurface->fitQualityOnSurface.numberDoF();
60 return std::make_unique<Trk::FitQuality>(
chiSquared, numberDoF);
68 std::unique_ptr<Trk::MeasurementBase>&& measurement,
73 updatedState, useMode);
74 if (combinedLastState) {
75 return {
fitQuality, std::move(measurement), std::move(combinedLastState),
76 std::move(updatedState)};
79 return {
fitQuality, std::move(measurement),
nullptr, std::move(updatedState)};
89 bool reintegrateOutliers) {
103 measurementSet.push_back(meas);
107 if (addMeasurementSet) {
108 for (
const auto* meas : *addMeasurementSet) {
109 measurementSet.push_back(meas);
112 return measurementSet;
122 bool reintegrateOutliers) {
148 prepRawDataSet.push_back(prepRawData);
151 if (addPrepRawDataSet) {
152 for (
const auto* prepRawData : *addPrepRawDataSet) {
153 prepRawDataSet.push_back(prepRawData);
156 return prepRawDataSet;
162 const std::string&
name,
165 , m_trkParametersComparisonFunction{}
167 declareInterface<ITrackFitter>(
this);
177 return StatusCode::FAILURE;
183 if (!m_refitOnMeasurementBase) {
184 ATH_CHECK(m_rioOnTrackCreator.retrieve());
186 m_rioOnTrackCreator.disable();
191 m_particleHypothesis = m_extrapolator->particleHypothesis();
192 return StatusCode::SUCCESS;
199 std::unique_ptr<Trk::Track>
201 const EventContext& ctx,
220 m_trkParametersComparisonFunction));
223 if (m_refitOnMeasurementBase) {
225 stripMeasurements(inputTrack,
nullptr, m_reintegrateOutliers);
226 return fit(ctx, measurementSet, *paramNearestRef, outlierRemoval,
231 stripPrepRawData(inputTrack,
nullptr, m_reintegrateOutliers);
232 return fit(ctx, prepRawDataSet, *paramNearestRef, outlierRemoval,
239 std::unique_ptr<Trk::Track>
259 m_trkParametersComparisonFunction));
261 stripPrepRawData(intrk, &addPrdColl, m_reintegrateOutliers);
262 return fit(ctx, prepRawDataSet, *paramNearestRef, runOutlier, matEffects);
268 std::unique_ptr<Trk::Track>
270 const Track& inputTrack,
277 ATH_MSG_FATAL(
"No estimation of track parameters near origin!");
283 "Attempting to fit track to empty MeasurementBase "
290 inputTrack.
trackParameters()->end(), m_trkParametersComparisonFunction));
293 stripMeasurements(inputTrack, &addSet, m_reintegrateOutliers);
294 return fit(ctx, measurementSet, *paramNearestRef, runOutlier, matEffects);
302 const EventContext& ctx,
311 "called to refit empty track or track with too little "
312 "information, reject fit");
317 "input #1 fails to provide track parameters for "
318 "seeding the GXF, reject fit");
325 stripMeasurements(intrk1,
nullptr, m_reintegrateOutliers);
327 stripMeasurements(intrk2,
nullptr, m_reintegrateOutliers);
329 for (
const auto* meas : measurementSet2) {
330 measurementSet1.push_back(meas);
333 return fit(ctx, measurementSet1, *minPar, runOutlier, matEffects);
340 std::unique_ptr<Trk::Track>
342 const EventContext& ctx,
348 if (prepRawDataSet.size() < 3) {
349 ATH_MSG_WARNING(
"Requesting Fit with less than three prep Raw Data!!!");
356 estimatedParametersNearOrigin.
position(),
357 estimatedParametersNearOrigin.
momentum());
359 std::sort(sortedPrepRawDataSet.begin(), sortedPrepRawDataSet.end(),
360 prdComparisonFunction);
366 forwardFit(ctx, extrapolatorCache, sortedPrepRawDataSet,
367 estimatedParametersNearOrigin);
369 if (forwardTrajectory.empty()) {
374 ctx, extrapolatorCache, forwardTrajectory);
375 if (smoothedTrajectory.empty()) {
380 std::unique_ptr<FitQuality>
fitQuality = buildFitQuality(smoothedTrajectory);
386 auto perigeeMultiStateOnSurface = makePerigee(
387 ctx, extrapolatorCache, smoothedTrajectory);
388 if (!perigeeMultiStateOnSurface.multiComponentState.empty()) {
389 smoothedTrajectory.push_back(std::move(perigeeMultiStateOnSurface));
396 std::reverse(smoothedTrajectory.begin(), smoothedTrajectory.end());
402 return std::make_unique<Track>(
info, convertTrajToTrack(smoothedTrajectory),
410 std::unique_ptr<Trk::Track>
412 const EventContext& ctx,
418 if (measurementSet.size() < 3) {
427 cleanedMeasurementSet.reserve(measurementSet.size());
429 for (
const auto* meas : measurementSet) {
437 cleanedMeasurementSet.push_back(meas);
446 measurementBaseComparisonFunction(
447 estimatedParametersNearOrigin.
position(),
448 estimatedParametersNearOrigin.
momentum());
449 sort(sortedMeasurementSet.begin(), sortedMeasurementSet.end(),
450 measurementBaseComparisonFunction);
457 forwardFit(ctx, extrapolatorCache, sortedMeasurementSet,
458 estimatedParametersNearOrigin);
460 if (forwardTrajectory.empty()) {
466 ctx, extrapolatorCache, forwardTrajectory, ccot);
467 if (smoothedTrajectory.empty()) {
472 std::unique_ptr<FitQuality>
fitQuality = buildFitQuality(smoothedTrajectory);
478 auto perigeeMultiStateOnSurface = makePerigee(
479 ctx, extrapolatorCache, smoothedTrajectory);
480 if (!perigeeMultiStateOnSurface.multiComponentState.empty()) {
481 smoothedTrajectory.push_back(std::move(perigeeMultiStateOnSurface));
487 std::reverse(smoothedTrajectory.begin(), smoothedTrajectory.end());
493 return std::make_unique<Track>(
info, convertTrajToTrack(smoothedTrajectory),
502 const bool slimTransientMTSOS = m_slimTransientMTSOS;
503 auto MTSOS = std::make_unique<MultiComponentStateOnSurfaceDV>();
504 MTSOS->reserve(trajectory.size());
505 for (
GSFTsos& state : trajectory) {
506 MTSOS->push_back(state.convert(slimTransientMTSOS));
516 const EventContext& ctx,
524 multiComponentStateOnSurfaceNearestOrigin = smoothedTrajectory.back();
531 m_extrapolator->extrapolate(ctx,
533 *multiComponentState,
538 if (stateExtrapolatedToPerigee.empty()) {
543 std::unique_ptr<Trk::TrackParameters> combinedPerigee =
547 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
551 if(std::abs(combinedPerigee->
position().z())>5000.) {
552 ATH_MSG_WARNING(
"Pathological perigee well outside of tracking detector!! Returning {}");
556 if (std::abs(combinedPerigee->parameters()[
Trk::qOverP]) > 1e8) {
558 "makePerigee() about to return with 0 momentum!! Returning {}");
564 std::move(combinedPerigee),
565 std::move(stateExtrapolatedToPerigee),
586 const EventContext& ctx,
591 if (forwardTrajectory.empty()) {
593 "Attempting to smooth an empty forward trajectory... Exiting!");
598 smoothedTrajectory.reserve(forwardTrajectory.size());
602 auto trackStateOnSurfaceItr = forwardTrajectory.rbegin();
603 bool foundMeasurement =
false;
604 for (; trackStateOnSurfaceItr != forwardTrajectory.rend(); ++trackStateOnSurfaceItr) {
606 smoothedTrajectory.emplace_back(std::move(*trackStateOnSurfaceItr));
608 foundMeasurement =
true;
612 if(!foundMeasurement){
617 auto smootherPredictionMultiState = std::move(trackStateOnSurfaceItr->multiComponentState);
620 std::unique_ptr<Trk::MeasurementBase> firstSmootherMeasurementOnTrack =
621 std::move(trackStateOnSurfaceItr->measurementOnTrack);
622 if (!firstSmootherMeasurementOnTrack) {
624 "Initial state on surface in smoother does not have an associated "
625 "MeasurementBase object");
631 *firstSmootherMeasurementOnTrack,
633 if (firstSmoothedState.empty()) {
638 "Not all components have covariance. Rejecting smoothed state.");
644 std::unique_ptr<Trk::TrackParameters> combinedFirstSmoothedState =
647 smoothedTrajectory.emplace_back(
648 fitQuality, std::move(firstSmootherMeasurementOnTrack),
649 std::move(combinedFirstSmoothedState),
651 const auto& updatedFirstStateOnSurface = smoothedTrajectory.back();
662 std::move(firstSmoothedState), m_smootherCovFactors[0],
663 m_smootherCovFactors[1], m_smootherCovFactors[2],
664 m_smootherCovFactors[3], m_smootherCovFactors[4]);
668 std::move(smoothedStateWithScaledError),
669 *(updatedFirstStateOnSurface.measurementOnTrack),
670 fitQualityWithScaledErrors);
671 if (updatedState.empty()) {
678 ++trackStateOnSurfaceItr;
680 auto lasttrackStateOnSurface = forwardTrajectory.rend() - 1;
682 auto secondLastTrackStateOnSurface = forwardTrajectory.rend() - 2;
684 for (; trackStateOnSurfaceItr != forwardTrajectory.rend();++trackStateOnSurfaceItr) {
685 auto& trackStateOnSurface = (*trackStateOnSurfaceItr);
687 auto measurement = std::move(trackStateOnSurface.measurementOnTrack);
689 ATH_MSG_WARNING(
"MeasurementBase object could not be extracted from a "
690 "measurement TSOS...continuing");
697 ctx, extrapolatorCache, (*loopUpdatedState),
700 if (extrapolatedState.empty()) {
705 std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
type(
709 std::move(measurement),
nullptr,
710 std::move(extrapolatedState),
type);
711 loopUpdatedState = &(smoothedTrajectory.back().multiComponentState);
716 std::move(extrapolatedState), *measurement,
fitQuality);
717 if (updatedState.empty()) {
722 const bool islast = (trackStateOnSurfaceItr == lasttrackStateOnSurface);
723 if (m_combineWithFitter) {
726 trackStateOnSurface.multiComponentState;
729 m_maximumNumberOfComponents);
730 if (combinedfitterState.empty()) {
732 "Could not combine state from forward fit with "
737 combinedfitterState, *measurement);
738 smoothedTrajectory.emplace_back(
739 smootherHelper(std::move(combinedfitterState), std::move(measurement),
740 combinedFitQuality, islast, m_useMode));
743 smoothedTrajectory.emplace_back(
744 smootherHelper(std::move(updatedState), std::move(measurement),
748 if (ccot && trackStateOnSurfaceItr == secondLastTrackStateOnSurface) {
749 if (!addCCOT(ctx, ccot, smoothedTrajectory)) {
755 loopUpdatedState = &(smoothedTrajectory.back().multiComponentState);
757 return smoothedTrajectory;
766 const EventContext& ctx,
770 const GSFTsos& currentMultiStateOS = smoothedTrajectory.back();
785 ctx, currentMultiComponentState, ownCCOT->associatedSurface(),
788 if (extrapolatedToCaloState.empty()) {
796 if (updatedStateAtCalo.empty()) {
801 auto improvedState = m_extrapolator->extrapolateDirectly(
805 if (improvedState.empty()) {
810 std::unique_ptr<Trk::TrackParameters> combinedSingleState =
820 std::move(locpars), std::move(
covMatrix), currentSurface);
823 smoothedTrajectory.emplace_back(
827 std::move(updatedStateAtCalo));
830 smoothedTrajectory.emplace_back(
835 std::move(combinedSingleState),
836 std::move(improvedState));