ATLAS Offline Software
Loading...
Searching...
No Matches
GaussianSumFitterTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7// ATHENA
13
14// ACTS
15#include "Acts/Propagator/MultiEigenStepperLoop.hpp"
16#include "Acts/MagneticField/MagneticFieldContext.hpp"
17#include "Acts/Surfaces/PerigeeSurface.hpp"
18#include "Acts/Utilities/CalibrationContext.hpp"
19#include "Acts/Definitions/TrackParametrization.hpp"
20#include "Acts/Definitions/Units.hpp"
21#include "Acts/Propagator/EigenStepper.hpp"
22#include "Acts/Surfaces/Surface.hpp"
23#include "Acts/TrackFitting/GsfMixtureReduction.hpp"
24#include "Acts/Utilities/Helpers.hpp"
25#include "Acts/EventData/VectorMultiTrajectory.hpp"
26#include "Acts/EventData/VectorTrackContainer.hpp"
27#include "Acts/EventData/BoundTrackParameters.hpp"
28#include "Acts/Utilities/Logger.hpp"
29#include "Acts/Utilities/CalibrationContext.hpp"
31
32// PACKAGE
35#include "ActsInterop/Logger.h"
38#include "Acts/Propagator/DirectNavigator.hpp"
41// STL
42#include <vector>
43#include <bitset>
44#include <type_traits>
45#include <system_error>
46#include <fstream>
47
49
50namespace {
51// Read an ATLAS Bethe-Heitler .par file (format: "n_cmps degree\n[data]").
52Acts::AtlasBetheHeitlerApprox::Data readBHParFile(const std::string& path) {
53 std::ifstream fin(path);
54 if (!fin) {
55 throw std::invalid_argument("Could not open BH par file: " + path);
56 }
57 std::size_t n_cmps = 0, degree = 0;
58 fin >> n_cmps >> degree;
59 if (!fin || n_cmps == 0 || degree == 0) {
60 throw std::invalid_argument("Bad header in BH par file: " + path);
61 }
62 Acts::AtlasBetheHeitlerApprox::Data data(n_cmps);
63 for (auto& cmp : data) {
64 cmp.weightCoeffs.resize(degree + 1);
65 cmp.meanCoeffs.resize(degree + 1);
66 cmp.varCoeffs.resize(degree + 1);
67 for (double& c : cmp.weightCoeffs) { fin >> c; }
68 for (double& c : cmp.meanCoeffs) { fin >> c; }
69 for (double& c : cmp.varCoeffs) { fin >> c; }
70 }
71 if (!fin) {
72 throw std::invalid_argument("Truncated data in BH par file: " + path);
73 }
74 return data;
75}
76} // anonymous namespace
77
78namespace ActsTrk {
79
80
82 ATH_MSG_DEBUG(name() << "::" << __FUNCTION__);
83
87 ATH_CHECK(m_geometryConvTool.retrieve());
88 ATH_CHECK(m_trkSummaryTool.retrieve(EnableTool{!m_refitOnly}));
89 if (m_refitOnly) {
90 ATH_MSG_INFO("Running GSF without track summary");
91 }
92 ATH_CHECK(m_ROTcreator.retrieve(EnableTool{!m_ROTcreator.empty()}));
93
94 m_logger = makeActsAthenaLogger(this, "Acts Gaussian Sum Refit");
95
96 auto field = std::make_shared<ATLASMagneticFieldWrapper>();
97 Acts::MultiEigenStepperLoop<> stepper(field);
98 Acts::Navigator navigator( Acts::Navigator::Config{ m_trackingGeometryTool->trackingGeometry() },
99 logger().cloneWithSuffix("Navigator") );
100 Acts::Propagator<Acts::MultiEigenStepperLoop<>, Acts::Navigator> propagator(std::move(stepper),
101 std::move(navigator),
102 logger().cloneWithSuffix("Prop"));
103
104 // Use the GeantSim Bethe-Heitler parameterisation, which clamps at X/X0=0.20
105 // matching the behaviour in Trk::ElectronCombinedMaterialEffects. The files
106 // store coefficients in logit(z) space; transform=true applies sigmoid/exp to
107 // recover physical z in (0,1).
108 const std::string bhLow = PathResolver::find_file("GeantSim_LT01_cdf_nC6_O5.par", "DATAPATH");
109 const std::string bhHigh = PathResolver::find_file("GeantSim_GT01_cdf_nC6_O5.par", "DATAPATH");
110 ATH_MSG_INFO("ACTS GSF: loading GeantSim BH parameterisation (" << bhLow << ", " << bhHigh << ")");
111 auto bha = std::make_shared<Acts::AtlasBetheHeitlerApprox>(
112 readBHParFile(bhLow), readBHParFile(bhHigh),
113 /*lowTransform=*/true, /*highTransform=*/true,
114 /*lowLimit=*/0.1, /*highLimit=*/0.2, /*clampToRange=*/true,
115 /*noChangeLimit=*/0.0001, /*singleGaussianLimit=*/0.002);
116 m_fitter = std::make_unique<Fitter>(std::move(propagator), bha,
117 logger().cloneWithSuffix("GaussianSumFitter"));
118
119 // Direct Fitter
121 Acts::DirectNavigator directNavigator( logger().cloneWithSuffix("DirectNavigator") );
122 Acts::MultiEigenStepperLoop<> stepperDirect(field);
123 Acts::Propagator<Acts::MultiEigenStepperLoop<>, Acts::DirectNavigator> directPropagator(std::move(stepperDirect),
124 std::move(directNavigator),
125 logger().cloneWithSuffix("DirectPropagator"));
126 m_directFitter = std::make_unique<DirectFitter>(std::move(directPropagator), bha,
127 logger().cloneWithSuffix("DirectGaussianSumFitter"));
128
129 }
130
132 m_calibrator = std::make_unique<ActsTrk::detail::TrkMeasurementCalibrator>();
134
136 m_gsfExtensions.surfaceAccessor.connect<&detail::TrkMeasSurfaceAccessor::operator()>(&m_surfaceAccessor);
137 m_gsfExtensions.mixtureReducer.connect<&Acts::reduceMixtureWithKLDistance>();
138
139 m_outlierFinder.StateChiSquaredPerNumberDoFCut = m_option_outlierChi2Cut;
140 m_gsfExtensions.outlierFinder.connect<&ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder::operator()<ActsTrk::MutableTrackStateBackend>>(&m_outlierFinder);
141 if(m_option_componentMergeMethod == "Mean" ){
142 m_componentMergeMethod = Acts::ComponentMergeMethod::eMean;
143 }else if(m_option_componentMergeMethod == "MaxWeight"){
144 m_componentMergeMethod = Acts::ComponentMergeMethod::eMaxWeight;
145 }else{
146 throw std::runtime_error("Unknown option for ComponentMergeMethod: " + m_option_componentMergeMethod.value());
147 }
148
149 ATH_MSG_INFO("ACTS GSF direct nav " << m_useDirectNavigation.value());
150 ATH_MSG_INFO("ACTS GSF max cmps " << m_maxComponents.value());
151 ATH_MSG_INFO("ACTS GSF merge meth " << m_option_componentMergeMethod.value());
152 ATH_MSG_INFO("ACTS GSF weight ctf " << m_weightCutOff.value());
153 ATH_MSG_INFO("ACTS GSF outlier chi2 " << m_option_outlierChi2Cut.value());
154
155 return StatusCode::SUCCESS;
156}
157
158// refit a track
159// -------------------------------------------------------
160std::unique_ptr<Trk::Track>
161GaussianSumFitterTool::fit(const EventContext& ctx,
162 const Trk::Track& inputTrack,
163 const Trk::RunOutlierRemoval /*runOutlier*/,
164 const Trk::ParticleHypothesis /*prtHypothesis*/) const
165{
166
167
168 std::unique_ptr<Trk::Track> track = nullptr;
169 ATH_MSG_VERBOSE ("--> enter GaussianSumFitter::fit(Track,,) with Track from author = "
170 << inputTrack.info().dumpInfo());
171
172 // protection against not having measurements on the input track
173 if (!inputTrack.measurementsOnTrack() || inputTrack.measurementsOnTrack()->size() < 2) {
174 ATH_MSG_DEBUG("called to refit empty track or track with too little information, reject fit");
175 return nullptr;
176 }
177
178 // protection against not having track parameters on the input track
179 if (!inputTrack.trackParameters() || inputTrack.trackParameters()->empty()) {
180 ATH_MSG_DEBUG("input fails to provide track parameters for seeding the GSF, reject fit");
181 return nullptr;
182 }
183
184 // Construct a perigee surface as the target surface
185 std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(
186 Acts::Vector3::Zero());
187
188 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
189 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
190 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
191
192 // Set the GaussianSumFitter options
193 Acts::GsfOptions<ActsTrk::MutableTrackStateBackend>
194 gsfOptions = prepareOptions(tgContext,
195 mfContext,
196 calContext,
197 *pSurface);
198 gsfOptions.maxComponents = m_maxComponents;
199 gsfOptions.weightCutoff = m_weightCutOff;
200 gsfOptions.componentMergeMethod = m_componentMergeMethod;
201
202
203 std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(inputTrack);
204 const auto initialParams = m_geometryConvTool->convertTrackParametersToActs(ctx, *inputTrack.perigeeParameters());
205
206 return performFit(ctx,
207 gsfOptions,
208 trackSourceLinks,
209 initialParams);
210}
211
212// fit a set of MeasurementBase objects
213// --------------------------------
214std::unique_ptr<Trk::Track>
215GaussianSumFitterTool::fit(const EventContext& ctx,
216 const Trk::MeasurementSet& inputMeasSet,
217 const Trk::TrackParameters& estimatedStartParameters,
218 const Trk::RunOutlierRemoval /*runOutlier*/,
219 const Trk::ParticleHypothesis /*matEffects*/) const
220{
221 std::unique_ptr<Trk::Track> track = nullptr;
222 // protection against not having measurements on the input track
223 if (inputMeasSet.size() < 2) {
224 ATH_MSG_DEBUG("called to refit empty measurement set or a measurement set with too little information, reject fit");
225 return nullptr;
226 }
227
228 // Construct a perigee surface as the target surface
229 std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(
230 Acts::Vector3::Zero());
231
232 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
233 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
234 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
235
236 // Set the GaussianSumFitter options
237 Acts::GsfOptions<ActsTrk::MutableTrackStateBackend>
238 gsfOptions = prepareOptions(tgContext,
239 mfContext,
240 calContext,
241 *pSurface);
242
243 // Set abortOnError to false, else the refitting crashes if no forward propagation is done. Here, we just skip the event and continue.
244 gsfOptions.abortOnError = false;
245
246 std::vector< Acts::SourceLink > trackSourceLinks;
247 detail::MeasurementCalibratorBase::pack(inputMeasSet, trackSourceLinks);
248
249 const auto initialParams = m_geometryConvTool->convertTrackParametersToActs(ctx, estimatedStartParameters);
250
252
253 std::vector<const Acts::Surface*> surfaces;
254 surfaces.reserve(inputMeasSet.size());
255 std::ranges::transform(trackSourceLinks, std::back_inserter(surfaces), m_surfaceAccessor);
256
257 return performDirectFit(ctx,
258 gsfOptions,
259 trackSourceLinks,
260 initialParams,
261 surfaces);
262 }else{
263 return performFit(ctx,
264 gsfOptions,
265 trackSourceLinks,
266 initialParams);
267 }
268}
269
270// fit a set of PrepRawData objects
271// --------------------------------
272std::unique_ptr<Trk::Track>
273GaussianSumFitterTool::fit(const EventContext& /*ctx*/,
274 const Trk::PrepRawDataSet& /*inputPRDColl*/,
275 const Trk::TrackParameters& /*estimatedStartParameters*/,
276 const Trk::RunOutlierRemoval /*runOutlier*/,
277 const Trk::ParticleHypothesis /*prtHypothesis*/) const
278{
279 ATH_MSG_DEBUG("Fit of PrepRawDataSet not yet implemented");
280 return nullptr;
281}
282
283// extend a track fit to include an additional set of MeasurementBase objects
284// re-implements the TrkFitterUtils/TrackFitter.cxx general code in a more
285// mem efficient and stable way
286// --------------------------------
287std::unique_ptr<Trk::Track>
288GaussianSumFitterTool::fit(const EventContext& ctx,
289 const Trk::Track& inputTrack,
290 const Trk::MeasurementSet& addMeasColl,
291 const Trk::RunOutlierRemoval /*runOutlier*/,
292 const Trk::ParticleHypothesis /*matEffects*/) const
293{
294 ATH_MSG_VERBOSE ("--> enter GaussianSumFitter::fit(Track,Meas'BaseSet,,)");
295 ATH_MSG_VERBOSE (" with Track from author = " << inputTrack.info().dumpInfo());
296
297 // protection, if empty MeasurementSet
298 if (addMeasColl.empty()) {
299 ATH_MSG_DEBUG( "client tries to add an empty MeasurementSet to the track fit." );
300 return fit(ctx,inputTrack);
301 }
302
303 // protection against not having measurements on the input track
304 if (!inputTrack.measurementsOnTrack() || (inputTrack.measurementsOnTrack()->size() < 2 && addMeasColl.empty())) {
305 ATH_MSG_DEBUG("called to refit empty track or track with too little information, reject fit");
306 return nullptr;
307 }
308
309 // protection against not having track parameters on the input track
310 if (!inputTrack.trackParameters() || inputTrack.trackParameters()->empty()) {
311 ATH_MSG_DEBUG("input fails to provide track parameters for seeding the GSF, reject fit");
312 return nullptr;
313 }
314
315 std::unique_ptr<Trk::Track> track = nullptr;
316
317 // Construct a perigee surface as the target surface
318 std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
319
320 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
321 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
322 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
323
324 // Set the GaussianSumFitter options
325 Acts::GsfOptions<ActsTrk::MutableTrackStateBackend>
326 gsfOptions = prepareOptions(tgContext,
327 mfContext,
328 calContext,
329 *pSurface);
330
331 std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(inputTrack);
332 const auto initialParams = m_geometryConvTool->convertTrackParametersToActs(ctx, *inputTrack.perigeeParameters());
333
334 detail::MeasurementCalibratorBase::pack(addMeasColl, trackSourceLinks);
335
336 return performFit(ctx, gsfOptions,
337 trackSourceLinks,
338 initialParams);
339}
340
341// extend a track fit to include an additional set of PrepRawData objects
342// --------------------------------
343std::unique_ptr<Trk::Track>
344GaussianSumFitterTool::fit(const EventContext& /*ctx*/,
345 const Trk::Track& /*inputTrack*/,
346 const Trk::PrepRawDataSet& /*addPrdColl*/,
347 const Trk::RunOutlierRemoval /*runOutlier*/,
348 const Trk::ParticleHypothesis /*matEffects*/) const
349{
350
351 ATH_MSG_DEBUG("Fit of Track with additional PrepRawDataSet not yet implemented");
352 return nullptr;
353}
354
355// combined fit of two tracks
356// --------------------------------
357std::unique_ptr<Trk::Track>
358GaussianSumFitterTool::fit(const EventContext& ctx,
359 const Trk::Track& intrk1,
360 const Trk::Track& intrk2,
361 const Trk::RunOutlierRemoval /*runOutlier*/,
362 const Trk::ParticleHypothesis /*matEffects*/) const
363{
364 ATH_MSG_VERBOSE ("--> enter GaussianSumFitter::fit(Track,Track,)");
365 ATH_MSG_VERBOSE (" with Tracks from #1 = " << intrk1.info().dumpInfo()
366 << " and #2 = " << intrk2.info().dumpInfo());
367
368 // protection, if empty track2
369 if (!intrk2.measurementsOnTrack()) {
370 ATH_MSG_DEBUG( "input #2 is empty try to fit track 1 alone" );
371 return fit(ctx,intrk1);
372 }
373
374 // protection, if empty track1
375 if (!intrk1.measurementsOnTrack()) {
376 ATH_MSG_DEBUG( "input #1 is empty try to fit track 2 alone" );
377 return fit(ctx,intrk2);
378 }
379
380 // protection against not having track parameters on the input track
381 if (!intrk1.trackParameters() || intrk1.trackParameters()->empty()) {
382 ATH_MSG_DEBUG("input #1 fails to provide track parameters for seeding the GSF, reject fit");
383 return nullptr;
384 }
385
386 std::unique_ptr<Trk::Track> track = nullptr;
387
388 // Construct a perigee surface as the target surface
389 std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(
390 Acts::Vector3::Zero());
391
392 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
393 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
394 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
395
396 // Set the GaussianSumFitter options
397 Acts::GsfOptions<ActsTrk::MutableTrackStateBackend>
398 gsfOptions = prepareOptions(tgContext,
399 mfContext,
400 calContext,
401 *pSurface);
402
403 std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(intrk1);
404 std::vector<Acts::SourceLink> trackSourceLinks2 = m_ATLASConverterTool->trkTrackToSourceLinks(intrk2);
405 trackSourceLinks.insert(trackSourceLinks.end(), trackSourceLinks2.begin(), trackSourceLinks2.end());
406 const auto initialParams = m_geometryConvTool->convertTrackParametersToActs(ctx, *intrk1.perigeeParameters());
407
408 return performFit(ctx, gsfOptions,
409 trackSourceLinks,
410 initialParams);
411}
412
413// Acts track refit
414std::unique_ptr< ActsTrk::MutableTrackContainer >
416 const Acts::BoundTrackParameters& /*initialParams*/,
417 const Acts::GeometryContext& /*tgContext*/,
418 const Acts::MagneticFieldContext& /*mfContext*/,
419 const Acts::CalibrationContext& /*calContext*/,
420 const Acts::Surface& /*targetSurface*/) const
421{
422 ATH_MSG_VERBOSE("ACTS seed refit is not implemented in GaussianSumFitterTool");
423 return nullptr;
424}
425
426std::unique_ptr< ActsTrk::MutableTrackContainer >
427GaussianSumFitterTool::fit(const std::vector< const xAOD::UncalibratedMeasurement*> & /*clusterList*/,
428 const Acts::BoundTrackParameters& /*initialParams*/,
429 const Acts::GeometryContext& /*tgContext*/,
430 const Acts::MagneticFieldContext& /*mfContext*/,
431 const Acts::CalibrationContext& /*calContext*/,
432 const Acts::Surface* /*targetSurface*/) const
433{
434 ATH_MSG_VERBOSE("ACTS uncalib slink refit is not implemented in GaussianSumFitterTool");
435 return nullptr;
436}
437
438
440 const EventContext& ctx,
441 const ActsTrk::TrackContainer::ConstTrackProxy& track,
442 ActsTrk::MutableTrackContainer& trackContainer,
443 const Acts::PerigeeSurface& pSurface) const {
444 ATH_MSG_VERBOSE("GaussianSumFitterTool::fit(TrackProxy) called");
445
446 const Acts::BoundTrackParameters initialParams = track.createParametersAtReference();
447 std::vector<Acts::SourceLink> sourceLinks;
448 std::vector<const Acts::Surface*> surfSequence;
449
450 for (auto ts : track.trackStates()){
451 surfSequence.push_back(&ts.referenceSurface());
452 if (!ts.hasCalibrated()) {
453 continue;
454 }
455
456 if (ts.typeFlags().hasMeasurement()) {
457 sourceLinks.push_back(ts.getUncalibratedSourceLink());
458 }
459 }
460
461 if (sourceLinks.size() < 2) {
462 ATH_MSG_DEBUG("called to refit 0 or 1 sourceLink with too little information, reject fit");
463 return StatusCode::SUCCESS;
464 }
465
466 Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
467 Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
468 Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
469
470 Acts::GsfOptions<ActsTrk::MutableTrackStateBackend> gsfOptions = prepareOptions(tgContext, mfContext, calContext, pSurface);
471
474 auto xODCalibrator = xAODUnCalibrator_t::NoCalibration(m_trackingGeometryTool.get());
475 calibrator.connect<&xAODUnCalibrator_t::calibrate>(xAOD::UncalibMeasType::PixelClusterType, &xODCalibrator);
476 calibrator.connect<&xAODUnCalibrator_t::calibrate>(xAOD::UncalibMeasType::StripClusterType, &xODCalibrator);
477
478
481
482 auto gsfExtensions = m_gsfExtensions;
483 gsfExtensions.calibrator.connect<&detail::RefittingCalibrator::calibrate>(&calibrator);
484 gsfExtensions.surfaceAccessor.connect<&detail::RefittingSurfaceAccesor::operator()>(&surfaceAcc);
485 gsfOptions.extensions = gsfExtensions;
486 gsfOptions.abortOnError = false;
487
489 m_directFitter->fit(sourceLinks.begin(), sourceLinks.end(), initialParams, gsfOptions, surfSequence, trackContainer);
490 } else {
491 m_fitter->fit(sourceLinks.begin(), sourceLinks.end(), initialParams, gsfOptions, trackContainer);
492 }
493
494 return StatusCode::SUCCESS;
495}
496
497const Acts::GsfExtensions<typename ActsTrk::MutableTrackStateBackend>&
502
504const Acts::Logger&
506{
507 return *m_logger;
508}
509
510Acts::GsfOptions<typename ActsTrk::MutableTrackStateBackend>
511GaussianSumFitterTool::prepareOptions(const Acts::GeometryContext& tgContext,
512 const Acts::MagneticFieldContext& mfContext,
513 const Acts::CalibrationContext& calContext,
514 const Acts::PerigeeSurface& surface) const
515{
516 Acts::PropagatorPlainOptions propagationOption(tgContext, mfContext);
517 propagationOption.maxSteps = m_option_maxPropagationStep;
518
519 Acts::GsfOptions<typename ActsTrk::MutableTrackStateBackend> gsfOptions(tgContext, mfContext, calContext);
520 gsfOptions.extensions=m_gsfExtensions;
521 gsfOptions.propagatorPlainOptions=propagationOption;
522 gsfOptions.referenceSurface = &surface;
523
524 // Set abortOnError to false, else the refitting crashes if no forward propagation is done. Here, we just skip the event and continue.
525 gsfOptions.abortOnError = false;
526 gsfOptions.maxComponents = m_maxComponents;
527 gsfOptions.weightCutoff = m_weightCutOff;
528 gsfOptions.componentMergeMethod = m_componentMergeMethod;
529
530 return gsfOptions;
531}
532
533}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
std::unique_ptr< Trk::Track > performFit(const EventContext &ctx, const Acts::GsfOptions< ActsTrk::MutableTrackStateBackend > &gsfOptions, const std::vector< Acts::SourceLink > &trackSourceLinks, const Acts::BoundTrackParameters &initialParams) const
const Acts::Logger & logger() const
Private access to the logger.
detail::TrkMeasSurfaceAccessor m_surfaceAccessor
Gaudi::Property< std::string > m_option_componentMergeMethod
ToolHandle< IExtrapolationTool > m_extrapolationTool
Acts::GsfOptions< ActsTrk::MutableTrackStateBackend > prepareOptions(const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const Acts::PerigeeSurface &surface) const
ToolHandle< Trk::IRIO_OnTrackCreator > m_ROTcreator
std::unique_ptr< ActsTrk::detail::TrkMeasurementCalibrator > m_calibrator
Gaudi::Property< double > m_weightCutOff
Gaudi::Property< int > m_option_maxPropagationStep
Acts::GsfExtensions< ActsTrk::MutableTrackStateBackend > m_gsfExtensions
virtual StatusCode initialize() override
PublicToolHandle< IGeometryRealmConvTool > m_geometryConvTool
Acts::ComponentMergeMethod m_componentMergeMethod
PublicToolHandle< ITrackingGeometryTool > m_trackingGeometryTool
Gaudi::Property< double > m_option_outlierChi2Cut
Gaudi::Property< bool > m_useDirectNavigation
ToolHandle< ITrackConverterTool > m_ATLASConverterTool
std::unique_ptr< Fitter > m_fitter
std::unique_ptr< const Acts::Logger > m_logger
logging instance
const Acts::GsfExtensions< ActsTrk::MutableTrackStateBackend > & getExtensions() const
std::unique_ptr< DirectFitter > m_directFitter
std::unique_ptr< Trk::Track > performDirectFit(const EventContext &ctx, const Acts::GsfOptions< ActsTrk::MutableTrackStateBackend > &gsfOptions, const std::vector< Acts::SourceLink > &trackSourceLinks, const Acts::BoundTrackParameters &initialParams, const std::vector< const Acts::Surface * > &surfaces) const
ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder m_outlierFinder
virtual std::unique_ptr< Trk::Track > fit(const EventContext &ctx, const Trk::Track &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
refit a track
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trkSummaryTool
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...
Inner detector / ITk calibrator implementation used in the KalmanFilterTool.
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sourceLink, MutableTrackStateProxy trackState) const
void connect(const xAOD::UncalibMeasType type, const Type *instance)
Register a calibrator implementation instance for a given measurement type.
Helper class to access the Acts::Surface for a given Acts::SourceLink which is poiniting to a Trk::Me...
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sl, proxy_t trackState) const
Calibrator delegate implementation to calibrate the ActsTrk fit from Trk::MeasurementBase objects.
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
std::string dumpInfo() const
Returns a string with the name of the fitter of this track (i.e.
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
const DataVector< const TrackParameters > * trackParameters() const
Return a pointer to a vector of TrackParameters.
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
const Perigee * perigeeParameters() const
return Perigee.
int ts
Definition globals.cxx:24
Acts::Result< void > gainMatrixUpdate(const Acts::GeometryContext &gctx, typename trajectory_t::TrackStateProxy trackState, const Acts::Logger &logger)
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Acts::VectorMultiTrajectory MutableTrackStateBackend
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
Acts::CalibrationContext getCalibrationContext(const EventContext &ctx)
The Acts::Calibration context is piped through the Acts fitters to (re)calibrate the Acts::SourceLink...
std::vector< const MeasurementBase * > MeasurementSet
vector of fittable measurements
Definition FitterTypes.h:30
bool RunOutlierRemoval
switch to toggle quality processing after fit
Definition FitterTypes.h:22
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters
std::vector< const PrepRawData * > PrepRawDataSet
vector of clusters and drift circles
Definition FitterTypes.h:26
cmp(x, y)
Definition EI_Lib.py:6