37 std::unique_ptr<Trk::FitQuality>
47 Trk::GaussianSumFitter::GSFTrajectory::const_iterator stateOnSurface =
48 smoothedTrajectory.begin();
49 for (; stateOnSurface != smoothedTrajectory.end(); ++stateOnSurface) {
53 if (!stateOnSurface->fitQualityOnSurface) {
56 chiSquared += stateOnSurface->fitQualityOnSurface.chiSquared();
57 numberDoF += stateOnSurface->fitQualityOnSurface.numberDoF();
62 return std::make_unique<Trk::FitQuality>(
chiSquared, numberDoF);
72 std::unique_ptr<Trk::MeasurementBase>&& measurement,
80 if (combinedLastState) {
81 return {
fitQuality, std::move(measurement), std::move(combinedLastState),std::move(updatedState)};
84 return {
fitQuality, std::move(measurement),
nullptr, std::move(updatedState)};
90 const std::string&
name,
94 , m_trkParametersComparisonFunction{}
95 , m_sortingReferencePoint{ 0, 0, 0 }
97 declareInterface<ITrackFitter>(
this);
98 declareProperty(
"SortingReferencePoint", m_sortingReferencePoint);
108 return StatusCode::FAILURE;
116 if (!m_refitOnMeasurementBase) {
117 ATH_CHECK(m_rioOnTrackCreator.retrieve());
119 m_rioOnTrackCreator.disable();
123 m_sortingReferencePoint[1],
124 m_sortingReferencePoint[2]);
126 m_trkParametersComparisonFunction =
129 return StatusCode::SUCCESS;
138 std::unique_ptr<Trk::Track>
140 const EventContext& ctx,
159 m_trkParametersComparisonFunction));
164 if (m_refitOnMeasurementBase) {
178 measurementSet.push_back(meas);
179 }
else if (m_reintegrateOutliers &&
181 measurementSet.push_back(meas);
188 *parametersNearestReference,
214 prepRawDataSet.push_back(prepRawData);
219 *parametersNearestReference,
228 std::unique_ptr<Trk::Track>
230 const EventContext& ctx,
238 if (prepRawDataSet.empty()) {
247 estimatedParametersNearOrigin.
position(),
248 estimatedParametersNearOrigin.
momentum());
250 std::sort(sortedPrepRawDataSet.begin(),
251 sortedPrepRawDataSet.end(),
252 prdComparisonFunction);
258 forwardPRDfit(ctx, extrapolatorCache, sortedPrepRawDataSet,
259 estimatedParametersNearOrigin, particleHypothesis);
261 if (forwardTrajectory.empty()) {
266 smootherFit(ctx, extrapolatorCache, forwardTrajectory, particleHypothesis);
267 if (smoothedTrajectory.empty()) {
272 std::unique_ptr<FitQuality>
fitQuality = buildFitQuality(smoothedTrajectory);
278 auto perigeeMultiStateOnSurface =
279 makePerigee(ctx, extrapolatorCache, smoothedTrajectory, particleHypothesis);
280 if (!perigeeMultiStateOnSurface.multiComponentState.empty()) {
281 smoothedTrajectory.push_back(std::move(perigeeMultiStateOnSurface));
288 std::reverse(smoothedTrajectory.begin(), smoothedTrajectory.end());
294 return std::make_unique<Track>(
295 info, convertTrajToTrack(smoothedTrajectory),
303 std::unique_ptr<Trk::Track>
305 const EventContext& ctx,
313 if (measurementSet.empty()) {
323 cleanedMeasurementSet.reserve(measurementSet.size());
325 for (
const auto* meas : measurementSet) {
328 "There is an empty MeasurementBase object in the track! ");
334 cleanedMeasurementSet.push_back(meas);
343 estimatedParametersNearOrigin.
position(),
344 estimatedParametersNearOrigin.
momentum());
345 sort(sortedMeasurementSet.begin(),
346 sortedMeasurementSet.end(),
347 measurementBaseComparisonFunction);
354 forwardMeasurementFit(ctx, extrapolatorCache, sortedMeasurementSet,
355 estimatedParametersNearOrigin, particleHypothesis);
357 if (forwardTrajectory.empty()) {
363 ctx, extrapolatorCache, forwardTrajectory, particleHypothesis, ccot);
364 if (smoothedTrajectory.empty()) {
369 std::unique_ptr<FitQuality>
fitQuality = buildFitQuality(smoothedTrajectory);
375 auto perigeeMultiStateOnSurface =
376 makePerigee(ctx, extrapolatorCache, smoothedTrajectory, particleHypothesis);
377 if (!perigeeMultiStateOnSurface.multiComponentState.empty()) {
378 smoothedTrajectory.push_back(std::move(perigeeMultiStateOnSurface));
384 std::reverse(smoothedTrajectory.begin(), smoothedTrajectory.end());
390 return std::make_unique<Track>(
391 info, convertTrajToTrack(smoothedTrajectory),
399 std::unique_ptr<Trk::Track>
407 if (addPrdColl.empty()) {
409 "client tries to add an empty PrepRawDataSet to the track fit.");
410 return fit(ctx, intrk, runOutlier, matEffects);
416 m_trkParametersComparisonFunction));
420 intrk, addPrdColl,
false,
true);
423 return fit(ctx, PRDColl, *estimatedStartParameters, runOutlier, matEffects);
430 std::unique_ptr<Trk::Track>
432 const Track& inputTrack,
439 if (measurementSet.empty()) {
441 "Client tries to add an empty MeasurementSet to the track fit.");
442 return fit(ctx, inputTrack, runOutlier, matEffects);
446 ATH_MSG_FATAL(
"No estimation of track parameters near origin!");
451 ATH_MSG_FATAL(
"Attempting to fit track to empty MeasurementBase "
459 m_trkParametersComparisonFunction));
462 inputTrack, measurementSet);
466 ctx, combinedMS, *parametersNearestReference, runOutlier, matEffects);
473 std::unique_ptr<Trk::Track>
484 ATH_MSG_WARNING(
"called to refit empty track or track with too little "
485 "information, reject fit");
490 "seeding the GXF, reject fit");
502 if (tsos->measurementOnTrack()->type(
507 ms.push_back(tsos->measurementOnTrack());
517 if (tsos->measurementOnTrack()->type(
521 ms.push_back(tsos->measurementOnTrack());
524 return fit(ctx,
ms, *minPar, runOutlier, matEffects);
530 bool slimTransientMTSOS = m_slimTransientMTSOS;
531 auto MTSOS = std::make_unique<MultiComponentStateOnSurfaceDV>();
532 MTSOS->reserve(trajectory.size());
533 for (
GSFTsos& state : trajectory) {
534 MTSOS->push_back(state.convert(slimTransientMTSOS));
545 const EventContext& ctx,
554 multiComponentStateOnSurfaceNearestOrigin = smoothedTrajectory.back();
561 m_extrapolator->extrapolate(ctx,
563 *multiComponentState,
565 m_directionToPerigee,
569 if (stateExtrapolatedToPerigee.empty()) {
574 std::unique_ptr<Trk::TrackParameters> combinedPerigee =
578 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
582 if(std::abs(combinedPerigee->
position().z())>5000.) {
583 ATH_MSG_WARNING(
"Pathological perigee well outside of tracking detector!! Returning {}");
587 if (std::abs(combinedPerigee->parameters()[
Trk::qOverP]) > 1e8) {
589 "makePerigee() about to return with 0 momentum!! Returning {}");
595 std::move(combinedPerigee),
596 std::move(stateExtrapolatedToPerigee),
606 const EventContext& ctx,
616 for (
const auto* rawData : inputPrepRawDataSet) {
617 if (!(rawData->detectorElement())) {
620 prepRawDataSet.push_back(rawData);
625 const AmgVector(5)&
par = estimatedTrackParametersNearOrigin.parameters();
637 multiComponentStateNearOrigin.push_back(
638 std::move(componentParametersNearOrigin));
642 forwardTrajectory.reserve(prepRawDataSet.size());
643 for (
const auto* prepRawData : prepRawDataSet) {
645 bool stepIsValid = stepForwardFit(
651 prepRawData->detectorElement()->surface(prepRawData->identify()),
652 multiComponentStateNearOrigin,
659 return forwardTrajectory;
668 const EventContext& ctx,
675 if (inputMeasurementSet.empty()) {
676 ATH_MSG_ERROR(
"forwardMeasurementFit: Input MeasurementSet is empty!");
681 const AmgVector(5)&
par = estimatedTrackParametersNearOrigin.parameters();
692 multiComponentStateNearOrigin.push_back(
693 std::move(componentParametersNearOrigin));
696 forwardTrajectory.reserve(inputMeasurementSet.size());
697 for (
const auto* measurement : inputMeasurementSet) {
699 bool stepIsValid = stepForwardFit(ctx,
704 measurement->associatedSurface(),
705 multiComponentStateNearOrigin,
712 return forwardTrajectory;
721 const EventContext& ctx,
731 if (!originalPrepRawData && !originalMeasurement) {
737 if (!originalMeasurement && m_refitOnMeasurementBase) {
738 ATH_MSG_WARNING(
"No measurement base information passed to StepForwardFit");
745 m_extrapolator->extrapolate(ctx,
752 if (extrapolatedState.empty()) {
758 std::unique_ptr<Trk::MeasurementBase> measurement =
nullptr;
759 if (originalMeasurement) {
760 measurement.reset(originalMeasurement->
clone());
762 std::unique_ptr<Trk::TrackParameters> combinedState =
764 if (!combinedState) {
770 m_rioOnTrackCreator->correct(*originalPrepRawData, *combinedState, ctx));
771 combinedState.reset();
786 if (updatedState.empty()) {
796 std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
type(0);
798 forwardTrajectory.emplace_back(
800 std::move(measurement),
807 updatedState = std::move(extrapolatedState);
810 std::move(measurement),
812 std::move(extrapolatedState));
823 const EventContext& ctx,
829 if (forwardTrajectory.empty()) {
831 "Attempting to smooth an empty forward trajectory... Exiting!");
836 smoothedTrajectory.reserve(forwardTrajectory.size());
840 GSFTrajectory::reverse_iterator trackStateOnSurfaceItr =
841 forwardTrajectory.rbegin();
842 bool foundMeasurement =
false;
843 for (; trackStateOnSurfaceItr != forwardTrajectory.rend();
844 ++trackStateOnSurfaceItr) {
846 smoothedTrajectory.emplace_back(std::move(*trackStateOnSurfaceItr));
848 foundMeasurement =
true;
853 if(!foundMeasurement){
859 std::move(trackStateOnSurfaceItr->multiComponentState);
862 std::unique_ptr<Trk::MeasurementBase> firstSmootherMeasurementOnTrack =
863 std::move(trackStateOnSurfaceItr->measurementOnTrack);
864 if (!firstSmootherMeasurementOnTrack) {
866 "Initial state on surface in smoother does not have an associated "
867 "MeasurementBase object");
873 *firstSmootherMeasurementOnTrack,
875 if (firstSmoothedState.empty()) {
881 "Not all components have covariance. Rejecting smoothed state.");
886 std::unique_ptr<Trk::TrackParameters> combinedFirstSmoothedState =
888 smoothedTrajectory.emplace_back(
889 fitQuality, std::move(firstSmootherMeasurementOnTrack),
890 std::move(combinedFirstSmoothedState),
892 const auto& updatedFirstStateOnSurface = smoothedTrajectory.back();
896 ++trackStateOnSurfaceItr;
898 auto lasttrackStateOnSurface = forwardTrajectory.rend() - 1;
900 auto secondLastTrackStateOnSurface = forwardTrajectory.rend() - 2;
907 std::move(firstSmoothedState), 15., 5., 15., 5., 15.);
910 std::move(smoothedStateWithScaledError),
911 *(updatedFirstStateOnSurface.measurementOnTrack),
912 fitQualityWithScaledErrors);
913 if (updatedState.empty()) {
923 for (; trackStateOnSurfaceItr != forwardTrajectory.rend();
924 ++trackStateOnSurfaceItr) {
925 auto& trackStateOnSurface = (*trackStateOnSurfaceItr);
927 std::unique_ptr<Trk::MeasurementBase> measurement =
928 std::move(trackStateOnSurface.measurementOnTrack);
930 ATH_MSG_WARNING(
"MeasurementBase object could not be extracted from a "
931 "measurement TSOS... continuing");
938 m_extrapolator->extrapolate(ctx,
946 if (extrapolatedState.empty()) {
952 std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
type(0);
954 smoothedTrajectory.emplace_back(
956 std::move(measurement),
958 std::move(extrapolatedState),
960 loopUpdatedState = &(smoothedTrajectory.back().multiComponentState);
965 if (updatedState.empty()) {
970 bool islast = (trackStateOnSurfaceItr == lasttrackStateOnSurface);
971 if (m_combineWithFitter) {
977 forwardsMultiState, updatedState, m_maximumNumberOfComponents);
979 if (combinedfitterState.empty()) {
985 smoothedTrajectory.emplace_back(smootherHelper(std::move(combinedfitterState), std::move(measurement),
986 combinedFitQuality, islast, m_useMode));
989 smoothedTrajectory.emplace_back(smootherHelper(std::move(updatedState), std::move(measurement),
993 if (ccot && trackStateOnSurfaceItr == secondLastTrackStateOnSurface) {
994 if (!addCCOT(ctx, ccot, smoothedTrajectory)) {
1000 loopUpdatedState = &(smoothedTrajectory.back().multiComponentState);
1002 return smoothedTrajectory;
1011 const EventContext& ctx,
1015 const GSFTsos& currentMultiStateOS = smoothedTrajectory.back();
1030 ctx, currentMultiComponentState, ownCCOT->associatedSurface(),
1033 if (extrapolatedToCaloState.empty()) {
1041 if (updatedStateAtCalo.empty()) {
1046 auto improvedState = m_extrapolator->extrapolateDirectly(
1050 if (improvedState.empty()) {
1055 std::unique_ptr<Trk::TrackParameters> combinedSingleState =
1065 std::move(locpars), std::move(
covMatrix), currentSurface);
1068 smoothedTrajectory.emplace_back(
1072 std::move(updatedStateAtCalo));
1075 smoothedTrajectory.emplace_back(
1079 std::move(combinedSingleState),
1080 std::move(improvedState));