8 #include "Acts/EventData/Types.hpp"
17 #include "Acts/Definitions/TrackParametrization.hpp"
18 #include "Acts/Definitions/Units.hpp"
19 #include "Acts/EventData/Types.hpp"
20 #include "Acts/EventData/VectorTrackContainer.hpp"
21 #include "Acts/Propagator/Navigator.hpp"
22 #include "Acts/Propagator/Propagator.hpp"
23 #include "Acts/Propagator/SympyStepper.hpp"
24 #include "Acts/Surfaces/PerigeeSurface.hpp"
25 #include "Acts/Surfaces/Surface.hpp"
26 #include "Acts/TrackFitting/GlobalChiSquareFitter.hpp"
27 #include "Acts/Utilities/CalibrationContext.hpp"
28 #include "Acts/Utilities/Helpers.hpp"
29 #include "Acts/Utilities/Logger.hpp"
57 Acts::SympyStepper stepper{std::make_shared<ATLASMagneticFieldWrapper>()};
62 m_fitter = std::make_unique<CurvedFitter_t>(std::move(propagator),
63 logger().cloneWithSuffix(
"GlobalChiSquareFitter"));
65 Acts::StraightLineStepper stepper{};
70 m_slFitter = std::make_unique<StraightFitter_t>(std::move(propagator),
71 logger().cloneWithSuffix(
"GlobalChiSquareFitter"));
78 extensionTemplate.outlierFinder.connect<&detail::FitterHelperFunctions::ATLASOutlierFinder::operator()
80 extensionTemplate.updater.connect<&detail::FitterHelperFunctions::gainMatrixUpdate<MutableTrackStateBackend>>();
88 configureMe = extensionTemplate;
89 configureMe.calibrator.connect<&detail::TrkMeasurementCalibrator::calibrate<MutableTrackStateBackend>>(&
m_trkMeasCalibrator);
90 configureMe.surfaceAccessor.connect<&detail::TrkMeasSurfaceAccessor::operator()>(&
m_trkMeasSurfAcc);
97 configureMe = extensionTemplate;
98 configureMe.calibrator.connect<&detail::TrkPrepRawDataCalibrator::calibrate<MutableTrackStateBackend>>(&
m_prdCalibrator);
99 configureMe.surfaceAccessor.connect<&detail::TrkPrepRawDataSurfaceAcc::operator()>(&
m_prdSurfaceAcc);
105 configureMe = extensionTemplate;
106 configureMe.surfaceAccessor.connect<&detail::xAODUncalibMeasSurfAcc::operator()>(&
m_unalibMeasSurfAcc);
117 return StatusCode::SUCCESS;
121 const Acts::BoundTrackParameters& initialPars,
125 m_fitter->fit(soureLinks.begin(), soureLinks.end(), initialPars, gx2fOptions, tracks) :
126 m_slFitter->fit(soureLinks.begin(), soureLinks.end(), initialPars, gx2fOptions, tracks);
131 const Acts::MagneticFieldContext& mfContext,
132 const Acts::CalibrationContext& calContext,
133 const Acts::Surface* surface,
135 Acts::PropagatorPlainOptions propagationOption{tgContext, mfContext};
141 std::move(propagationOption),
149 const EventContext& ctx,
const Trk::Track& inputTrack,
153 ATH_MSG_VERBOSE(
"--> enter GlobalChiSquareFitterTool::fit(Track,,) with Track from author = "
158 ATH_MSG_DEBUG(
"called to refit empty track or track with too little information, reject fit");
164 ATH_MSG_DEBUG(
"input fails to provide track parameters for seeding the GX2F, reject fit");
171 std::vector<Acts::SourceLink> trackSourceLinks =
m_ATLASConverterTool->trkTrackToSourceLinks(inputTrack);
174 if (trackSourceLinks.empty()) {
175 ATH_MSG_DEBUG(
"input contain measurement but no source link created, probable issue "
176 <<
"with the converter, reject fit ");
181 const Acts::MagneticFieldContext mfContext{
m_extrapolationTool->getMagneticFieldContext(ctx)};
186 const Acts::BoundTrackParameters initialParamsWithHypothesis(
187 initialParams.referenceSurface().getSharedPtr(),
188 initialParams.parameters(), initialParams.covariance(),
197 std::move(multiTrajBackEnd));
199 auto result =
fit(trackSourceLinks, initialParamsWithHypothesis, gx2fOptions, tracks);
215 if (inputMeasSet.size() < 2) {
216 ATH_MSG_DEBUG(
"Called to refit empty measurement set or a measurement set with too "
217 <<
"little information, reject fit");
225 const Acts::MagneticFieldContext mfContext{
m_extrapolationTool->getMagneticFieldContext(ctx)};
230 std::vector<Acts::SourceLink> trackSourceLinks;
234 if (trackSourceLinks.empty()) {
235 ATH_MSG_DEBUG(
"input contain measurement but no source link created, probable issue "
236 <<
"with the converter, reject fit ");
240 const auto initialParams =
m_ATLASConverterTool->trkTrackParametersToActsParameters(estimatedStartParameters, tgContext);
245 std::move(multiTrajBackEnd));
250 auto result =
fit(trackSourceLinks, initialParams, gx2fOptions, tracks);
264 ATH_MSG_DEBUG(
"--> entering GlobalChiSquareFitterTool::fit(PRDS,TP,)");
270 const Acts::MagneticFieldContext mfContext =
m_extrapolationTool->getMagneticFieldContext(ctx);
273 std::vector<Acts::SourceLink> trackSourceLinks;
278 if (trackSourceLinks.empty()) {
279 ATH_MSG_WARNING(
"input contain measurement but no source link created, probable issue "
280 "with the converter, reject fit ");
284 const auto initialParams =
m_ATLASConverterTool->trkTrackParametersToActsParameters(estimatedStartParameters, tgContext);
294 std::move(multiTrajBackEnd));
296 auto result =
fit(trackSourceLinks, initialParams, gx2fOptions, tracks);
306 const std::vector<ATLASUncalibSourceLink>& measList,
307 const Acts::BoundTrackParameters& initialParams,
308 const Acts::GeometryContext& tgContext,
309 const Acts::MagneticFieldContext& mfContext,
310 const Acts::CalibrationContext& calContext,
311 const Acts::Surface* targetSurface)
const {
313 if (measList.empty()) {
318 std::shared_ptr<Acts::Surface> pSurface{};
319 if (!targetSurface) {
321 targetSurface = pSurface.get();
324 std::vector<Acts::SourceLink> sourceLinks;
325 sourceLinks.reserve(measList.size());
337 auto tracks = std::make_unique<MutableTrackContainer>( std::move(trackContainerBackEnd),
338 std::move(multiTrajBackEnd) );
340 auto result =
fit(sourceLinks, initialParams, gx2fOptions, *tracks);
353 const EventContext& ctx,
const Trk::Track& inputTrack,
357 ATH_MSG_VERBOSE(
"--> enter GlobalChiSquareFitterTool::fit(Track,Meas'BaseSet,,)");
361 if (addMeasColl.empty()) {
362 ATH_MSG_DEBUG(
"client tries to add an empty MeasurementSet to the track fit.");
363 return fit(ctx, inputTrack);
368 ATH_MSG_DEBUG(
"Called to refit empty track or track with too little information, reject fit");
374 ATH_MSG_DEBUG(
"input fails to provide track parameters for seeding the GX2F, reject fit");
382 const Acts::MagneticFieldContext mfContext{
m_extrapolationTool->getMagneticFieldContext(ctx)};
385 std::vector<Acts::SourceLink> trackSourceLinks =
m_ATLASConverterTool->trkTrackToSourceLinks(inputTrack);
389 if (trackSourceLinks.empty()) {
390 ATH_MSG_DEBUG(
"input contain measurement but no source link created, probable issue "
391 <<
"with the converter, reject fit ");
400 std::move(multiTrajBackEnd));
405 auto result =
fit(trackSourceLinks, initialParams, gx2fOptions, tracks);
419 "Fit of Track with additional PrepRawDataSet not yet implemented");
429 ATH_MSG_VERBOSE(
"--> enter GlobalChiSquareFitterTool::fit(Track,Track,)");
437 return fit(ctx, intrk1);
443 return fit(ctx, intrk2);
448 ATH_MSG_DEBUG(
"input #1 fails to provide track parameters for seeding the GX2F, reject fit");
456 const Acts::MagneticFieldContext mfContext{
m_extrapolationTool->getMagneticFieldContext(ctx)};
459 std::vector<Acts::SourceLink> trackSourceLinks =
m_ATLASConverterTool->trkTrackToSourceLinks(intrk1);
460 std::vector<Acts::SourceLink> trackSourceLinks2 =
m_ATLASConverterTool->trkTrackToSourceLinks(intrk2);
461 trackSourceLinks.insert(trackSourceLinks.end(), std::make_move_iterator(trackSourceLinks2.begin()),
462 std::make_move_iterator(trackSourceLinks2.end()));
465 if (trackSourceLinks.empty()) {
466 ATH_MSG_DEBUG(
"input contain measurement but no source link created, probable issue "
467 <<
"with the converter, reject fit ");
474 const Acts::BoundTrackParameters initialParamsWithHypothesis(
475 initialParams.referenceSurface().getSharedPtr(),
476 initialParams.parameters(), initialParams.covariance(),
482 std::move(multiTrajBackEnd));
487 auto result =
fit(trackSourceLinks, initialParamsWithHypothesis, gx2fOptions, tracks);
496 const Acts::BoundTrackParameters& initialParams,
497 const Acts::GeometryContext& tgContext,
498 const Acts::MagneticFieldContext& mfContext,
499 const Acts::CalibrationContext& calContext,
500 const Acts::Surface& targetSurface)
const {
502 std::vector<ATLASUncalibSourceLink> sourceLinks;
503 sourceLinks.reserve(6);
506 sourceLinks.insert(sourceLinks.end(), sp->measurements().begin(), sp->measurements().end());
508 return fit(sourceLinks, initialParams, tgContext, mfContext, calContext, &targetSurface);
513 const EventContext& ,
514 const TrackContainer::ConstTrackProxy& ,
516 const Acts::PerigeeSurface& )
const
518 ATH_MSG_ERROR(
"Track refit method not implemented in GlobalChiSquareFitterTool yet");
519 return StatusCode::FAILURE;