ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrk::GaussianSumFitterTool Class Reference

#include <GaussianSumFitterTool.h>

Inheritance diagram for ActsTrk::GaussianSumFitterTool:
Collaboration diagram for ActsTrk::GaussianSumFitterTool:

Public Member Functions

virtual ~GaussianSumFitterTool ()=default
virtual StatusCode initialize () override
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 refit a track
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::PrepRawDataSet &, const Trk::TrackParameters &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 fit a set of PrepRawData objects
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::MeasurementSet &, const Trk::TrackParameters &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 fit a set of MeasurementBase objects
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &, const Trk::PrepRawDataSet &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 extend a track fit including a new set of PrepRawData objects
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &, const Trk::MeasurementSet &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 extend a track fit including a new set of MeasurementBase objects
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &intrk1, const Trk::Track &intrk2, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 combined track fit
virtual std::unique_ptr< ActsTrk::MutableTrackContainerfit (const ActsTrk::Seed &seed, const Acts::BoundTrackParameters &initialParams, const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const Acts::Surface &targetSurface) const override
 Acts seed fit.
virtual std::unique_ptr< ActsTrk::MutableTrackContainerfit (const std::vector< const xAOD::UncalibratedMeasurement * > &clusterList, const Acts::BoundTrackParameters &initialParams, const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const Acts::Surface *targetSurface) const override
virtual StatusCode fit (const EventContext &ctx, const ActsTrk::TrackContainer::ConstTrackProxy &track, ActsTrk::MutableTrackContainer &trackContainer, const Acts::PerigeeSurface &pSurface) const override

Private Types

using TrackState_t = MutableTrackStateBackend::TrackStateProxy
 Abrivate the track state proxy.
using Fitter
 Type erased track fitter function.
using DirectFitter

Private Member Functions

Acts::GsfOptions< ActsTrk::MutableTrackStateBackendprepareOptions (const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const Acts::PerigeeSurface &surface) const
std::unique_ptr< Trk::TrackperformFit (const EventContext &ctx, const Acts::GsfOptions< ActsTrk::MutableTrackStateBackend > &gsfOptions, const std::vector< Acts::SourceLink > &trackSourceLinks, const Acts::BoundTrackParameters &initialParams) const
std::unique_ptr< Trk::TrackperformDirectFit (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
const Acts::GsfExtensions< ActsTrk::MutableTrackStateBackend > & getExtensions () const
const Acts::Logger & logger () const
 Private access to the logger.

Private Attributes

ToolHandle< IExtrapolationToolm_extrapolationTool {this, "ExtrapolationTool", ""}
PublicToolHandle< ITrackingGeometryToolm_trackingGeometryTool {this, "TrackingGeometryTool", ""}
PublicToolHandle< IGeometryRealmConvToolm_geometryConvTool {this, "GeometryRealmConvTool", ""}
ToolHandle< ITrackConverterToolm_ATLASConverterTool {this, "ATLASConverterTool", ""}
ToolHandle< Trk::IExtendedTrackSummaryToolm_trkSummaryTool {this, "SummaryTool", "", "ToolHandle for track summary tool"}
ToolHandle< Trk::IBoundaryCheckToolm_boundaryCheckTool
ToolHandle< Trk::IRIO_OnTrackCreatorm_ROTcreator {this, "RotCreatorTool", ""}
Gaudi::Property< double > m_option_outlierChi2Cut
Gaudi::Property< int > m_option_maxPropagationStep
Gaudi::Property< int > m_maxComponents
Gaudi::Property< bool > m_useDirectNavigation
Gaudi::Property< bool > m_refitOnly
Gaudi::Property< double > m_weightCutOff
Gaudi::Property< std::string > m_option_componentMergeMethod
Acts::ComponentMergeMethod m_componentMergeMethod
std::unique_ptr< ActsTrk::detail::TrkMeasurementCalibratorm_calibrator {nullptr}
std::unique_ptr< Fitterm_fitter {nullptr}
std::unique_ptr< DirectFitterm_directFitter {nullptr}
detail::TrkMeasSurfaceAccessor m_surfaceAccessor {}
Acts::GsfExtensions< ActsTrk::MutableTrackStateBackendm_gsfExtensions
ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder m_outlierFinder {0}
std::unique_ptr< const Acts::Logger > m_logger {nullptr}
 logging instance

Detailed Description

Definition at line 47 of file GaussianSumFitterTool.h.

Member Typedef Documentation

◆ DirectFitter

Initial value:
Acts::GaussianSumFitter< Acts::Propagator<Acts::MultiEigenStepperLoop<>, Acts::DirectNavigator>,
Acts::VectorMultiTrajectory MutableTrackStateBackend

Definition at line 197 of file GaussianSumFitterTool.h.

◆ Fitter

Initial value:
Acts::GaussianSumFitter< Acts::Propagator<Acts::MultiEigenStepperLoop<>, Acts::Navigator>,

Type erased track fitter function.

Definition at line 191 of file GaussianSumFitterTool.h.

◆ TrackState_t

using ActsTrk::GaussianSumFitterTool::TrackState_t = MutableTrackStateBackend::TrackStateProxy
private

Abrivate the track state proxy.

Definition at line 156 of file GaussianSumFitterTool.h.

Constructor & Destructor Documentation

◆ ~GaussianSumFitterTool()

virtual ActsTrk::GaussianSumFitterTool::~GaussianSumFitterTool ( )
virtualdefault

Member Function Documentation

◆ fit() [1/9]

std::unique_ptr< ActsTrk::MutableTrackContainer > ActsTrk::GaussianSumFitterTool::fit ( const ActsTrk::Seed & seed,
const Acts::BoundTrackParameters & initialParams,
const Acts::GeometryContext & tgContext,
const Acts::MagneticFieldContext & mfContext,
const Acts::CalibrationContext & calContext,
const Acts::Surface & targetSurface ) const
overridevirtual

Acts seed fit.

Definition at line 415 of file GaussianSumFitterTool.cxx.

421{
422 ATH_MSG_VERBOSE("ACTS seed refit is not implemented in GaussianSumFitterTool");
423 return nullptr;
424}
#define ATH_MSG_VERBOSE(x)

◆ fit() [2/9]

StatusCode ActsTrk::GaussianSumFitterTool::fit ( const EventContext & ctx,
const ActsTrk::TrackContainer::ConstTrackProxy & track,
ActsTrk::MutableTrackContainer & trackContainer,
const Acts::PerigeeSurface & pSurface ) const
overridevirtual

Definition at line 439 of file GaussianSumFitterTool.cxx.

443 {
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
472 detail::RefittingCalibrator calibrator{m_geometryConvTool.get(), m_ROTcreator.get()};
473 using xAODUnCalibrator_t = detail::OnTrackCalibrator<ActsTrk::MutableTrackStateBackend>;
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
479 detail::RefittingSurfaceAccesor surfaceAcc{m_geometryConvTool.get(),
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}
#define ATH_MSG_DEBUG(x)
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
Acts::GsfExtensions< ActsTrk::MutableTrackStateBackend > m_gsfExtensions
PublicToolHandle< IGeometryRealmConvTool > m_geometryConvTool
PublicToolHandle< ITrackingGeometryTool > m_trackingGeometryTool
Gaudi::Property< bool > m_useDirectNavigation
std::unique_ptr< Fitter > m_fitter
std::unique_ptr< DirectFitter > m_directFitter
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sourceLink, MutableTrackStateProxy trackState) const
int ts
Definition globals.cxx:24
Acts::CalibrationContext getCalibrationContext(const EventContext &ctx)
The Acts::Calibration context is piped through the Acts fitters to (re)calibrate the Acts::SourceLink...

◆ fit() [3/9]

std::unique_ptr< Trk::Track > ActsTrk::GaussianSumFitterTool::fit ( const EventContext & ctx,
const Trk::MeasurementSet & inputMeasSet,
const Trk::TrackParameters & estimatedStartParameters,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

fit a set of MeasurementBase objects

Definition at line 215 of file GaussianSumFitterTool.cxx.

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}
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
detail::TrkMeasSurfaceAccessor m_surfaceAccessor
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
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...

◆ fit() [4/9]

std::unique_ptr< Trk::Track > ActsTrk::GaussianSumFitterTool::fit ( const EventContext & ctx,
const Trk::PrepRawDataSet & ,
const Trk::TrackParameters & ,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

fit a set of PrepRawData objects

Definition at line 273 of file GaussianSumFitterTool.cxx.

278{
279 ATH_MSG_DEBUG("Fit of PrepRawDataSet not yet implemented");
280 return nullptr;
281}

◆ fit() [5/9]

std::unique_ptr< Trk::Track > ActsTrk::GaussianSumFitterTool::fit ( const EventContext & ctx,
const Trk::Track & inputTrack,
const Trk::MeasurementSet & addMeasColl,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

extend a track fit including a new set of MeasurementBase objects

Definition at line 288 of file GaussianSumFitterTool.cxx.

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}
ToolHandle< ITrackConverterTool > m_ATLASConverterTool
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
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.

◆ fit() [6/9]

std::unique_ptr< Trk::Track > ActsTrk::GaussianSumFitterTool::fit ( const EventContext & ctx,
const Trk::Track & ,
const Trk::PrepRawDataSet & ,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

extend a track fit including a new set of PrepRawData objects

Definition at line 344 of file GaussianSumFitterTool.cxx.

349{
350
351 ATH_MSG_DEBUG("Fit of Track with additional PrepRawDataSet not yet implemented");
352 return nullptr;
353}

◆ fit() [7/9]

std::unique_ptr< Trk::Track > ActsTrk::GaussianSumFitterTool::fit ( const EventContext & ctx,
const Trk::Track & inputTrack,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

refit a track

Definition at line 161 of file GaussianSumFitterTool.cxx.

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}
Gaudi::Property< double > m_weightCutOff
Acts::ComponentMergeMethod m_componentMergeMethod

◆ fit() [8/9]

std::unique_ptr< Trk::Track > ActsTrk::GaussianSumFitterTool::fit ( const EventContext & ctx,
const Trk::Track & intrk1,
const Trk::Track & intrk2,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

combined track fit

Definition at line 358 of file GaussianSumFitterTool.cxx.

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}

◆ fit() [9/9]

std::unique_ptr< ActsTrk::MutableTrackContainer > ActsTrk::GaussianSumFitterTool::fit ( const std::vector< const xAOD::UncalibratedMeasurement * > & clusterList,
const Acts::BoundTrackParameters & initialParams,
const Acts::GeometryContext & tgContext,
const Acts::MagneticFieldContext & mfContext,
const Acts::CalibrationContext & calContext,
const Acts::Surface * targetSurface ) const
overridevirtual

Definition at line 427 of file GaussianSumFitterTool.cxx.

433{
434 ATH_MSG_VERBOSE("ACTS uncalib slink refit is not implemented in GaussianSumFitterTool");
435 return nullptr;
436}

◆ getExtensions()

const Acts::GsfExtensions< typename ActsTrk::MutableTrackStateBackend > & ActsTrk::GaussianSumFitterTool::getExtensions ( ) const
private

Definition at line 498 of file GaussianSumFitterTool.cxx.

499{
500 return m_gsfExtensions;
501}

◆ initialize()

StatusCode ActsTrk::GaussianSumFitterTool::initialize ( )
overridevirtual

Definition at line 81 of file GaussianSumFitterTool.cxx.

81 {
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
135 m_surfaceAccessor = detail::TrkMeasSurfaceAccessor{m_geometryConvTool.get()};
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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
const Acts::Logger & logger() const
Private access to the logger.
Gaudi::Property< std::string > m_option_componentMergeMethod
std::unique_ptr< ActsTrk::detail::TrkMeasurementCalibrator > m_calibrator
Gaudi::Property< double > m_option_outlierChi2Cut
std::unique_ptr< const Acts::Logger > m_logger
logging instance
ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder m_outlierFinder
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trkSummaryTool
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)
Acts::Result< void > gainMatrixUpdate(const Acts::GeometryContext &gctx, typename trajectory_t::TrackStateProxy trackState, const Acts::Logger &logger)

◆ logger()

const Acts::Logger & ActsTrk::GaussianSumFitterTool::logger ( ) const
private

Private access to the logger.

Definition at line 505 of file GaussianSumFitterTool.cxx.

506{
507 return *m_logger;
508}

◆ performDirectFit()

std::unique_ptr< Trk::Track > ActsTrk::GaussianSumFitterTool::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
private

Definition at line 23 of file GaussianSumFitterToolDirectFit.cxx.

28{
30 ATH_MSG_ERROR("ACTS GSF UseDirectNavigation is false, but direct navigation is used");
31 return nullptr;
32 }
33 if (trackSourceLinks.empty()) {
34 ATH_MSG_DEBUG("input contain measurement but no source link created, probable issue with the converter, reject fit ");
35 return nullptr;
36 }
37
38
39 ActsTrk::MutableTrackBackend trackContainerBackEnd;
40 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
41 ActsTrk::MutableTrackContainer tracks( std::move(trackContainerBackEnd),
42 std::move(multiTrajBackEnd));
43 auto result = m_directFitter->fit(trackSourceLinks.begin(),
44 trackSourceLinks.end(),
45 initialParams,
46 gsfOptions,
47 surfaces,
48 tracks);
49
50 return m_ATLASConverterTool->convertFitResult(ctx, result,
52}
#define ATH_MSG_ERROR(x)
@ GaussianSumFilter
Tracks from Gaussian Sum Filter.
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
Acts::VectorTrackContainer MutableTrackBackend

◆ performFit()

std::unique_ptr< Trk::Track > ActsTrk::GaussianSumFitterTool::performFit ( const EventContext & ctx,
const Acts::GsfOptions< ActsTrk::MutableTrackStateBackend > & gsfOptions,
const std::vector< Acts::SourceLink > & trackSourceLinks,
const Acts::BoundTrackParameters & initialParams ) const
private

Definition at line 20 of file GaussianSumFitterToolFullFit.cxx.

24{
26 ATH_MSG_ERROR("ACTS GSF UseDirectNavigation is true, but standard navigation is used");
27 return nullptr;
28 }
29 if (trackSourceLinks.empty()) {
30 ATH_MSG_DEBUG("input contain measurement but no source link created, probable issue with the converter, reject fit ");
31 return nullptr;
32 }
33
34 ActsTrk::MutableTrackBackend trackContainerBackEnd;
35 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
36 ActsTrk::MutableTrackContainer tracks( std::move(trackContainerBackEnd),
37 std::move(multiTrajBackEnd));
38 // Perform the fit
39 auto result = m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
40 initialParams, gsfOptions, tracks);
41
42 return m_ATLASConverterTool->convertFitResult(ctx, result,
44}

◆ prepareOptions()

Acts::GsfOptions< typename ActsTrk::MutableTrackStateBackend > ActsTrk::GaussianSumFitterTool::prepareOptions ( const Acts::GeometryContext & tgContext,
const Acts::MagneticFieldContext & mfContext,
const Acts::CalibrationContext & calContext,
const Acts::PerigeeSurface & surface ) const
private

Definition at line 511 of file GaussianSumFitterTool.cxx.

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}
Gaudi::Property< int > m_option_maxPropagationStep

Member Data Documentation

◆ m_ATLASConverterTool

ToolHandle<ITrackConverterTool> ActsTrk::GaussianSumFitterTool::m_ATLASConverterTool {this, "ATLASConverterTool", ""}
private

Definition at line 160 of file GaussianSumFitterTool.h.

160{this, "ATLASConverterTool", ""};

◆ m_boundaryCheckTool

ToolHandle<Trk::IBoundaryCheckTool> ActsTrk::GaussianSumFitterTool::m_boundaryCheckTool
private
Initial value:
{this,
"BoundaryCheckTool",
"",
"Boundary checking tool for detector sensitivities"}

Definition at line 162 of file GaussianSumFitterTool.h.

162 {this,
163 "BoundaryCheckTool",
164 "",
165 "Boundary checking tool for detector sensitivities"};

◆ m_calibrator

std::unique_ptr<ActsTrk::detail::TrkMeasurementCalibrator> ActsTrk::GaussianSumFitterTool::m_calibrator {nullptr}
private

Definition at line 194 of file GaussianSumFitterTool.h.

194{nullptr};

◆ m_componentMergeMethod

Acts::ComponentMergeMethod ActsTrk::GaussianSumFitterTool::m_componentMergeMethod
private

Definition at line 188 of file GaussianSumFitterTool.h.

◆ m_directFitter

std::unique_ptr<DirectFitter> ActsTrk::GaussianSumFitterTool::m_directFitter {nullptr}
private

Definition at line 199 of file GaussianSumFitterTool.h.

199{nullptr};

◆ m_extrapolationTool

ToolHandle<IExtrapolationTool> ActsTrk::GaussianSumFitterTool::m_extrapolationTool {this, "ExtrapolationTool", ""}
private

Definition at line 157 of file GaussianSumFitterTool.h.

157{this, "ExtrapolationTool", ""};

◆ m_fitter

std::unique_ptr<Fitter> ActsTrk::GaussianSumFitterTool::m_fitter {nullptr}
private

Definition at line 195 of file GaussianSumFitterTool.h.

195{nullptr};

◆ m_geometryConvTool

PublicToolHandle<IGeometryRealmConvTool> ActsTrk::GaussianSumFitterTool::m_geometryConvTool {this, "GeometryRealmConvTool", ""}
private

Definition at line 159 of file GaussianSumFitterTool.h.

159{this, "GeometryRealmConvTool", ""};

◆ m_gsfExtensions

Acts::GsfExtensions<ActsTrk::MutableTrackStateBackend> ActsTrk::GaussianSumFitterTool::m_gsfExtensions
private

Definition at line 203 of file GaussianSumFitterTool.h.

◆ m_logger

std::unique_ptr<const Acts::Logger> ActsTrk::GaussianSumFitterTool::m_logger {nullptr}
private

logging instance

Definition at line 208 of file GaussianSumFitterTool.h.

208{nullptr};

◆ m_maxComponents

Gaudi::Property< int > ActsTrk::GaussianSumFitterTool::m_maxComponents
private
Initial value:
{this, "MaxComponents", 12,
"Maximum number of components in GSF"}

Definition at line 173 of file GaussianSumFitterTool.h.

173 {this, "MaxComponents", 12,
174 "Maximum number of components in GSF"};

◆ m_option_componentMergeMethod

Gaudi::Property<std::string> ActsTrk::GaussianSumFitterTool::m_option_componentMergeMethod
private
Initial value:
{this, "ComponentMergeMethod", "MaxWeight"
, "method to merge components {Mean, MaxWeight}"}

Definition at line 185 of file GaussianSumFitterTool.h.

185 {this, "ComponentMergeMethod", "MaxWeight"
186 , "method to merge components {Mean, MaxWeight}"};

◆ m_option_maxPropagationStep

Gaudi::Property< int > ActsTrk::GaussianSumFitterTool::m_option_maxPropagationStep
private
Initial value:
{this, "MaxPropagationStep", 5000,
"Maximum number of steps for one propagate call"}

Definition at line 170 of file GaussianSumFitterTool.h.

170 {this, "MaxPropagationStep", 5000,
171 "Maximum number of steps for one propagate call"};

◆ m_option_outlierChi2Cut

Gaudi::Property< double > ActsTrk::GaussianSumFitterTool::m_option_outlierChi2Cut
private
Initial value:
{this, "OutlierChi2Cut", 12.5,
"Chi2 cut used by the outlier finder" }

Definition at line 168 of file GaussianSumFitterTool.h.

168 {this, "OutlierChi2Cut", 12.5,
169 "Chi2 cut used by the outlier finder" };

◆ m_outlierFinder

ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder ActsTrk::GaussianSumFitterTool::m_outlierFinder {0}
private

Definition at line 205 of file GaussianSumFitterTool.h.

205{0};

◆ m_refitOnly

Gaudi::Property<bool> ActsTrk::GaussianSumFitterTool::m_refitOnly
private
Initial value:
{this, "RefitOnly", false,
"Do refit only. Track summary will not be added"}

Definition at line 179 of file GaussianSumFitterTool.h.

179 {this, "RefitOnly", false,
180 "Do refit only. Track summary will not be added"};

◆ m_ROTcreator

ToolHandle<Trk::IRIO_OnTrackCreator> ActsTrk::GaussianSumFitterTool::m_ROTcreator {this, "RotCreatorTool", ""}
private

Definition at line 166 of file GaussianSumFitterTool.h.

166{this, "RotCreatorTool", ""};

◆ m_surfaceAccessor

detail::TrkMeasSurfaceAccessor ActsTrk::GaussianSumFitterTool::m_surfaceAccessor {}
private

Definition at line 202 of file GaussianSumFitterTool.h.

202{};

◆ m_trackingGeometryTool

PublicToolHandle<ITrackingGeometryTool> ActsTrk::GaussianSumFitterTool::m_trackingGeometryTool {this, "TrackingGeometryTool", ""}
private

Definition at line 158 of file GaussianSumFitterTool.h.

158{this, "TrackingGeometryTool", ""};

◆ m_trkSummaryTool

ToolHandle<Trk::IExtendedTrackSummaryTool> ActsTrk::GaussianSumFitterTool::m_trkSummaryTool {this, "SummaryTool", "", "ToolHandle for track summary tool"}
private

Definition at line 161 of file GaussianSumFitterTool.h.

161{this, "SummaryTool", "", "ToolHandle for track summary tool"};

◆ m_useDirectNavigation

Gaudi::Property<bool> ActsTrk::GaussianSumFitterTool::m_useDirectNavigation
private
Initial value:
{this, "UseDirectNavigation", false,
"GSF with direct navigation when refitting measurements"}

Definition at line 176 of file GaussianSumFitterTool.h.

176 {this, "UseDirectNavigation", false,
177 "GSF with direct navigation when refitting measurements"};

◆ m_weightCutOff

Gaudi::Property< double > ActsTrk::GaussianSumFitterTool::m_weightCutOff
private
Initial value:
{this, "WeightCutOff", 1.e-4,
"component weight cut off"}

Definition at line 182 of file GaussianSumFitterTool.h.

182 {this, "WeightCutOff", 1.e-4,
183 "component weight cut off"};

The documentation for this class was generated from the following files: