Loading [MathJax]/jax/output/SVG/config.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
GaussianSumFitterTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 // ATHENA
12 
13 // ACTS
14 #include "Acts/Propagator/MultiEigenStepperLoop.hpp"
15 #include "Acts/MagneticField/MagneticFieldContext.hpp"
16 #include "Acts/Surfaces/PerigeeSurface.hpp"
17 #include "Acts/Utilities/CalibrationContext.hpp"
18 #include "Acts/Definitions/TrackParametrization.hpp"
19 #include "Acts/Definitions/Units.hpp"
20 #include "Acts/Propagator/EigenStepper.hpp"
21 #include "Acts/Surfaces/Surface.hpp"
22 #include "Acts/TrackFitting/GsfMixtureReduction.hpp"
23 #include "Acts/Utilities/Helpers.hpp"
24 #include "Acts/EventData/VectorMultiTrajectory.hpp"
25 #include "Acts/EventData/VectorTrackContainer.hpp"
26 #include "Acts/EventData/TrackParameters.hpp"
27 #include "Acts/Utilities/Logger.hpp"
28 #include "Acts/Utilities/CalibrationContext.hpp"
30 
31 // PACKAGE
34 #include "ActsInterop/Logger.h"
37 #include "Acts/Propagator/DirectNavigator.hpp"
39 
40 // STL
41 #include <vector>
42 #include <bitset>
43 #include <type_traits>
44 #include <system_error>
45 
46 namespace ActsTrk {
47 
49  const std::string& n,
50  const IInterface* p) :
51  base_class(t,n,p)
52 {}
53 
55  ATH_MSG_DEBUG(name() << "::" << __FUNCTION__);
56 
58  ATH_CHECK(m_extrapolationTool.retrieve());
59  ATH_CHECK(m_ATLASConverterTool.retrieve());
60  if (!m_refitOnly) {
61  ATH_CHECK(m_trkSummaryTool.retrieve());
62  }else{
63  ATH_MSG_INFO("Running GSF without track summary");
64  }
65 
66  m_logger = makeActsAthenaLogger(this, "Acts Gaussian Sum Refit");
67 
68  auto field = std::make_shared<ATLASMagneticFieldWrapper>();
69  Acts::MultiEigenStepperLoop<> stepper(field);
70  Acts::Navigator navigator( Acts::Navigator::Config{ m_trackingGeometryTool->trackingGeometry() },
71  logger().cloneWithSuffix("Navigator") );
72  Acts::Propagator<Acts::MultiEigenStepperLoop<>, Acts::Navigator> propagator(std::move(stepper),
73  std::move(navigator),
74  logger().cloneWithSuffix("Prop"));
75 
76  Acts::AtlasBetheHeitlerApprox<6, 5> bha = Acts::makeDefaultBetheHeitlerApprox();
77  m_fitter = std::make_unique<Fitter>(std::move(propagator), std::move(bha),
78  logger().cloneWithSuffix("GaussianSumFitter"));
79 
80  // Direct Fitter
82  Acts::DirectNavigator directNavigator( logger().cloneWithSuffix("DirectNavigator") );
83  Acts::MultiEigenStepperLoop<> stepperDirect(field);
84  Acts::Propagator<Acts::MultiEigenStepperLoop<>, Acts::DirectNavigator> directPropagator(std::move(stepperDirect),
85  std::move(directNavigator),
86  logger().cloneWithSuffix("DirectPropagator"));
87  Acts::AtlasBetheHeitlerApprox<6, 5> bhaDirect = Acts::makeDefaultBetheHeitlerApprox();
88  m_directFitter = std::make_unique<DirectFitter>(std::move(directPropagator),std::move(bhaDirect),
89  logger().cloneWithSuffix("DirectGaussianSumFitter"));
90 
91  }
92 
93  m_gsfExtensions.updater.connect<&ActsTrk::detail::FitterHelperFunctions::gainMatrixUpdate<ActsTrk::MutableTrackStateBackend>>();
94  m_calibrator = std::make_unique<ActsTrk::detail::TrkMeasurementCalibrator>(*m_ATLASConverterTool);
95  m_gsfExtensions.calibrator.connect<&ActsTrk::detail::TrkMeasurementCalibrator::calibrate<ActsTrk::MutableTrackStateBackend>>(m_calibrator.get());
96 
97  m_surfaceAccessor.m_converterTool = &(*m_ATLASConverterTool);
98  m_gsfExtensions.surfaceAccessor.connect<&ATLASSourceLinkSurfaceAccessor::operator()>(&m_surfaceAccessor);
99  m_gsfExtensions.mixtureReducer.connect<&Acts::reduceMixtureWithKLDistance>();
100 
102  m_gsfExtensions.outlierFinder.connect<&ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder::operator()<ActsTrk::MutableTrackStateBackend>>(&m_outlierFinder);
103  if(m_option_componentMergeMethod == "Mean" ){
104  m_componentMergeMethod = Acts::ComponentMergeMethod::eMean;
105  }else if(m_option_componentMergeMethod == "MaxWeight"){
106  m_componentMergeMethod = Acts::ComponentMergeMethod::eMaxWeight;
107  }else{
108  throw std::runtime_error("Unknown option for ComponentMergeMethod: " + m_option_componentMergeMethod.value());
109  }
110 
111  ATH_MSG_INFO("ACTS GSF direct nav " << m_useDirectNavigation.value());
112  ATH_MSG_INFO("ACTS GSF max cmps " << m_maxComponents.value());
113  ATH_MSG_INFO("ACTS GSF merge meth " << m_option_componentMergeMethod.value());
114  ATH_MSG_INFO("ACTS GSF weight ctf " << m_weightCutOff.value());
115  ATH_MSG_INFO("ACTS GSF outlier chi2 " << m_option_outlierChi2Cut.value());
116 
117  return StatusCode::SUCCESS;
118 }
119 
120 // refit a track
121 // -------------------------------------------------------
122 std::unique_ptr<Trk::Track>
123 GaussianSumFitterTool::fit(const EventContext& ctx,
124  const Trk::Track& inputTrack,
125  const Trk::RunOutlierRemoval /*runOutlier*/,
126  const Trk::ParticleHypothesis /*prtHypothesis*/) const
127 {
128 
129 
130  std::unique_ptr<Trk::Track> track = nullptr;
131  ATH_MSG_VERBOSE ("--> enter GaussianSumFitter::fit(Track,,) with Track from author = "
132  << inputTrack.info().dumpInfo());
133 
134  // protection against not having measurements on the input track
135  if (!inputTrack.measurementsOnTrack() || inputTrack.measurementsOnTrack()->size() < 2) {
136  ATH_MSG_DEBUG("called to refit empty track or track with too little information, reject fit");
137  return nullptr;
138  }
139 
140  // protection against not having track parameters on the input track
141  if (!inputTrack.trackParameters() || inputTrack.trackParameters()->empty()) {
142  ATH_MSG_DEBUG("input fails to provide track parameters for seeding the GSF, reject fit");
143  return nullptr;
144  }
145 
146  // Construct a perigee surface as the target surface
147  std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(
149 
150  Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
151  Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
152  // CalibrationContext converter not implemented yet.
153  Acts::CalibrationContext calContext{};
154 
155  // Set the GaussianSumFitter options
156  Acts::GsfOptions<ActsTrk::MutableTrackStateBackend>
157  gsfOptions = prepareOptions(tgContext,
158  mfContext,
159  calContext,
160  *pSurface);
161  gsfOptions.maxComponents = m_maxComponents;
162  gsfOptions.weightCutoff = m_weightCutOff;
163  gsfOptions.componentMergeMethod = m_componentMergeMethod;
164 
165 
166  std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(tgContext,inputTrack);
167  const auto& initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters((*inputTrack.perigeeParameters()), tgContext);
168 
169  return performFit(ctx,
170  tgContext,
171  gsfOptions,
172  trackSourceLinks,
173  initialParams);
174 }
175 
176 // fit a set of MeasurementBase objects
177 // --------------------------------
178 std::unique_ptr<Trk::Track>
179 GaussianSumFitterTool::fit(const EventContext& ctx,
180  const Trk::MeasurementSet& inputMeasSet,
181  const Trk::TrackParameters& estimatedStartParameters,
182  const Trk::RunOutlierRemoval /*runOutlier*/,
183  const Trk::ParticleHypothesis /*matEffects*/) const
184 {
185  std::unique_ptr<Trk::Track> track = nullptr;
186  // protection against not having measurements on the input track
187  if (inputMeasSet.size() < 2) {
188  ATH_MSG_DEBUG("called to refit empty measurement set or a measurement set with too little information, reject fit");
189  return nullptr;
190  }
191 
192  // Construct a perigee surface as the target surface
193  std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(
195 
196  Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
197  Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
198  // CalibrationContext converter not implemented yet.
199  Acts::CalibrationContext calContext{};
200 
201  // Set the GaussianSumFitter options
202  Acts::GsfOptions<ActsTrk::MutableTrackStateBackend>
203  gsfOptions = prepareOptions(tgContext,
204  mfContext,
205  calContext,
206  *pSurface);
207 
208  // Set abortOnError to false, else the refitting crashes if no forward propagation is done. Here, we just skip the event and continue.
209  gsfOptions.abortOnError = false;
210 
211  std::vector< Acts::SourceLink > trackSourceLinks;
212  trackSourceLinks.reserve(inputMeasSet.size());
213 
214  for (auto* measSet : inputMeasSet) {
215  trackSourceLinks.push_back(m_ATLASConverterTool->trkMeasurementToSourceLink(tgContext, *measSet));
216  }
217 
218  const auto& initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters(estimatedStartParameters, tgContext);
219 
221 
222  std::vector<const Acts::Surface*> surfaces;
223  surfaces.reserve(inputMeasSet.size());
224  for (auto* measSet : inputMeasSet) {
225  const auto& slink = m_ATLASConverterTool->trkMeasurementToSourceLink(tgContext, *measSet);
226  const auto& sl = slink.get<ATLASSourceLink>();
227  const auto& trkSrf = sl->associatedSurface();
228  const auto& actsSrf = m_ATLASConverterTool->trkSurfaceToActsSurface(trkSrf);
229  surfaces.push_back(&actsSrf);
230  }
231 
232  return performDirectFit(ctx,
233  tgContext,
234  gsfOptions,
235  trackSourceLinks,
236  initialParams,
237  surfaces);
238  }else{
239  return performFit(ctx,
240  tgContext,
241  gsfOptions,
242  trackSourceLinks,
243  initialParams);
244  }
245 }
246 
247 // fit a set of PrepRawData objects
248 // --------------------------------
249 std::unique_ptr<Trk::Track>
250 GaussianSumFitterTool::fit(const EventContext& /*ctx*/,
251  const Trk::PrepRawDataSet& /*inputPRDColl*/,
252  const Trk::TrackParameters& /*estimatedStartParameters*/,
253  const Trk::RunOutlierRemoval /*runOutlier*/,
254  const Trk::ParticleHypothesis /*prtHypothesis*/) const
255 {
256  ATH_MSG_DEBUG("Fit of PrepRawDataSet not yet implemented");
257  return nullptr;
258 }
259 
260 // extend a track fit to include an additional set of MeasurementBase objects
261 // re-implements the TrkFitterUtils/TrackFitter.cxx general code in a more
262 // mem efficient and stable way
263 // --------------------------------
264 std::unique_ptr<Trk::Track>
265 GaussianSumFitterTool::fit(const EventContext& ctx,
266  const Trk::Track& inputTrack,
267  const Trk::MeasurementSet& addMeasColl,
268  const Trk::RunOutlierRemoval /*runOutlier*/,
269  const Trk::ParticleHypothesis /*matEffects*/) const
270 {
271  ATH_MSG_VERBOSE ("--> enter GaussianSumFitter::fit(Track,Meas'BaseSet,,)");
272  ATH_MSG_VERBOSE (" with Track from author = " << inputTrack.info().dumpInfo());
273 
274  // protection, if empty MeasurementSet
275  if (addMeasColl.empty()) {
276  ATH_MSG_DEBUG( "client tries to add an empty MeasurementSet to the track fit." );
277  return fit(ctx,inputTrack);
278  }
279 
280  // protection against not having measurements on the input track
281  if (!inputTrack.measurementsOnTrack() || (inputTrack.measurementsOnTrack()->size() < 2 && addMeasColl.empty())) {
282  ATH_MSG_DEBUG("called to refit empty track or track with too little information, reject fit");
283  return nullptr;
284  }
285 
286  // protection against not having track parameters on the input track
287  if (!inputTrack.trackParameters() || inputTrack.trackParameters()->empty()) {
288  ATH_MSG_DEBUG("input fails to provide track parameters for seeding the GSF, reject fit");
289  return nullptr;
290  }
291 
292  std::unique_ptr<Trk::Track> track = nullptr;
293 
294  // Construct a perigee surface as the target surface
295  std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
296 
297  Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
298  Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
299  // CalibrationContext converter not implemented yet.
300  Acts::CalibrationContext calContext{};
301 
302  // Set the GaussianSumFitter options
303  Acts::GsfOptions<ActsTrk::MutableTrackStateBackend>
304  gsfOptions = prepareOptions(tgContext,
305  mfContext,
306  calContext,
307  *pSurface);
308 
309  std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(tgContext, inputTrack);
310  const auto& initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters(*(inputTrack.perigeeParameters()), tgContext);
311 
312  for (auto* meas : addMeasColl) {
313  trackSourceLinks.push_back(m_ATLASConverterTool->trkMeasurementToSourceLink(tgContext, *meas));
314  }
315 
316  return performFit(ctx,
317  tgContext,
318  gsfOptions,
319  trackSourceLinks,
320  initialParams);
321 }
322 
323 // extend a track fit to include an additional set of PrepRawData objects
324 // --------------------------------
325 std::unique_ptr<Trk::Track>
326 GaussianSumFitterTool::fit(const EventContext& /*ctx*/,
327  const Trk::Track& /*inputTrack*/,
328  const Trk::PrepRawDataSet& /*addPrdColl*/,
329  const Trk::RunOutlierRemoval /*runOutlier*/,
330  const Trk::ParticleHypothesis /*matEffects*/) const
331 {
332 
333  ATH_MSG_DEBUG("Fit of Track with additional PrepRawDataSet not yet implemented");
334  return nullptr;
335 }
336 
337 // combined fit of two tracks
338 // --------------------------------
339 std::unique_ptr<Trk::Track>
340 GaussianSumFitterTool::fit(const EventContext& ctx,
341  const Trk::Track& intrk1,
342  const Trk::Track& intrk2,
343  const Trk::RunOutlierRemoval /*runOutlier*/,
344  const Trk::ParticleHypothesis /*matEffects*/) const
345 {
346  ATH_MSG_VERBOSE ("--> enter GaussianSumFitter::fit(Track,Track,)");
347  ATH_MSG_VERBOSE (" with Tracks from #1 = " << intrk1.info().dumpInfo()
348  << " and #2 = " << intrk2.info().dumpInfo());
349 
350  // protection, if empty track2
351  if (!intrk2.measurementsOnTrack()) {
352  ATH_MSG_DEBUG( "input #2 is empty try to fit track 1 alone" );
353  return fit(ctx,intrk1);
354  }
355 
356  // protection, if empty track1
357  if (!intrk1.measurementsOnTrack()) {
358  ATH_MSG_DEBUG( "input #1 is empty try to fit track 2 alone" );
359  return fit(ctx,intrk2);
360  }
361 
362  // protection against not having track parameters on the input track
363  if (!intrk1.trackParameters() || intrk1.trackParameters()->empty()) {
364  ATH_MSG_DEBUG("input #1 fails to provide track parameters for seeding the GSF, reject fit");
365  return nullptr;
366  }
367 
368  std::unique_ptr<Trk::Track> track = nullptr;
369 
370  // Construct a perigee surface as the target surface
371  std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(
373 
374  Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
375  Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
376  // CalibrationContext converter not implemented yet.
377  Acts::CalibrationContext calContext{};
378 
379  // Set the GaussianSumFitter options
380  Acts::GsfOptions<ActsTrk::MutableTrackStateBackend>
381  gsfOptions = prepareOptions(tgContext,
382  mfContext,
383  calContext,
384  *pSurface);
385 
386  std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(tgContext, intrk1);
387  std::vector<Acts::SourceLink> trackSourceLinks2 = m_ATLASConverterTool->trkTrackToSourceLinks(tgContext, intrk2);
388  trackSourceLinks.insert(trackSourceLinks.end(), trackSourceLinks2.begin(), trackSourceLinks2.end());
389  const auto &initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters(*(intrk1.perigeeParameters()), tgContext);
390 
391  return performFit(ctx,
392  tgContext,
393  gsfOptions,
394  trackSourceLinks,
395  initialParams);
396 }
397 
398 // Acts track refit
399 std::unique_ptr< ActsTrk::MutableTrackContainer >
400 GaussianSumFitterTool::fit(const EventContext& /*ctx*/,
401  const ActsTrk::Seed & /*seed*/,
402  const Acts::BoundTrackParameters& /*initialParams*/,
403  const Acts::GeometryContext& /*tgContext*/,
404  const Acts::MagneticFieldContext& /*mfContext*/,
405  const Acts::CalibrationContext& /*calContext*/,
406  const DetectorElementToActsGeometryIdMap & /*detectorElementToGeometryIdMap*/) const
407 {
408  ATH_MSG_VERBOSE("ACTS seed refit is not implemented in GaussianSumFitterTool");
409  return nullptr;
410 }
411 
412 std::unique_ptr< ActsTrk::MutableTrackContainer >
413 GaussianSumFitterTool::fit(const EventContext& /*ctx*/,
414  const std::vector< ActsTrk::ATLASUncalibSourceLink> & /*clusterList*/,
415  const Acts::BoundTrackParameters& /*initialParams*/,
416  const Acts::GeometryContext& /*tgContext*/,
417  const Acts::MagneticFieldContext& /*mfContext*/,
418  const Acts::CalibrationContext& /*calContext*/,
419  const DetectorElementToActsGeometryIdMap & /*detectorElementToGeometryIdMap*/,
420  const Acts::Surface* /*targetSurface*/) const
421 {
422  ATH_MSG_VERBOSE("ACTS uncalib slink refit is not implemented in GaussianSumFitterTool");
423  return nullptr;
424 }
425 
426 
428  const EventContext& ctx,
429  const ActsTrk::TrackContainer::ConstTrackProxy& track,
431  ATH_MSG_VERBOSE("GaussianSumFitterTool::fit(TrackProxy) called");
432 
433  const Acts::BoundTrackParameters initialParams = track.createParametersAtReference();
434  std::vector<Acts::SourceLink> sourceLinks;
435  std::vector<const Acts::Surface*> surfSequence;
436 
437  for (auto ts : track.trackStatesReversed()) {
438  surfSequence.push_back(&ts.referenceSurface());
439  if (!ts.hasCalibrated()) {
440  continue;
441  }
442 
443  if (ts.typeFlags().test(Acts::TrackStateFlag::MeasurementFlag)) {
444  sourceLinks.push_back(Acts::SourceLink{detail::RefittingCalibrator::RefittingSourceLink(ts)});
445  }
446  }
447 
448  if (sourceLinks.size() < 2) {
449  ATH_MSG_DEBUG("called to refit 0 or 1 sourceLink with too little information, reject fit");
450  return StatusCode::SUCCESS;
451  }
452 
453  // Construct a perigee surface as the target surface
454  std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
455 
456  Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
457  Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
458  Acts::CalibrationContext calContext{};
459 
460  Acts::GsfOptions<ActsTrk::MutableTrackStateBackend> gsfOptions = prepareOptions(tgContext, mfContext, calContext, *pSurface);
461  const Acts::TrackingGeometry* actsTrackingGeometry = m_trackingGeometryTool->trackingGeometry().get();
462 
463  if (!actsTrackingGeometry) {
464  ATH_MSG_ERROR("No Acts tracking geometry.");
465  return StatusCode::FAILURE;
466  }
467 
468  detail::RefittingCalibrator calibrator;
469 
470  auto gsfExtensions = m_gsfExtensions;
471  gsfExtensions.calibrator.connect<&detail::RefittingCalibrator::calibrate>(&calibrator);
472  gsfExtensions.surfaceAccessor.connect<&detail::RefittingCalibrator::accessSurface>();
473  gsfOptions.extensions = gsfExtensions;
474  gsfOptions.abortOnError = false;
475 
476  if (m_useDirectNavigation) {
477  m_directFitter->fit(sourceLinks.begin(), sourceLinks.end(), initialParams, gsfOptions, surfSequence, trackContainer);
478  } else {
479  m_fitter->fit(sourceLinks.begin(), sourceLinks.end(), initialParams, gsfOptions, trackContainer);
480  }
481 
482  return StatusCode::SUCCESS;
483 }
484 
485 std::unique_ptr<Trk::Track>
486 GaussianSumFitterTool::makeTrack(const EventContext& ctx,
487  const Acts::GeometryContext& tgContext,
489  Acts::Result<typename ActsTrk::MutableTrackContainer::TrackProxy, std::error_code>& fitResult) const
490 {
491  if (not fitResult.ok())
492  return nullptr;
493 
494  std::unique_ptr<Trk::Track> newtrack = nullptr;
495  // Get the fit output object
496  const auto& acts_track = fitResult.value();
497  auto finalTrajectory = std::make_unique<Trk::TrackStates>();
498  // initialise the number of dead Pixel and Acts strip
499  int numberOfDeadPixel = 0;
500  int numberOfDeadSCT = 0;
501 
502  std::vector<std::unique_ptr<const Acts::BoundTrackParameters>> actsSmoothedParam;
503  // Loop over all the output state to create track state
504  tracks.trackStateContainer().visitBackwards(acts_track.tipIndex(),
505  [&] (const auto &state) -> void
506  {
507  // First only concider state with an associated detector element not in the TRT
508  auto flag = state.typeFlags();
509  const auto* associatedDetEl = state.referenceSurface().associatedDetectorElement();
510  if (not associatedDetEl)
511  return;
512 
513  const auto* actsElement = dynamic_cast<const ActsDetectorElement*>(associatedDetEl);
514  if (not actsElement)
515  return;
516 
517  const auto* upstreamDetEl = actsElement->upstreamDetectorElement();
518  if (not upstreamDetEl)
519  return;
520 
521  ATH_MSG_VERBOSE("Try casting to TRT for if");
522  if (dynamic_cast<const InDetDD::TRT_BaseElement*>(upstreamDetEl))
523  return;
524 
525  const auto* trkDetElem = dynamic_cast<const Trk::TrkDetElementBase*>(upstreamDetEl);
526  if (not trkDetElem)
527  return;
528 
529  ATH_MSG_VERBOSE("trkDetElem type: " << static_cast<std::underlying_type_t<Trk::DetectorElemType>>(trkDetElem->detectorType()));
530 
531  ATH_MSG_VERBOSE("Try casting to SiDetectorElement");
532  const auto* detElem = dynamic_cast<const InDetDD::SiDetectorElement*>(upstreamDetEl);
533  if (not detElem)
534  return;
535  ATH_MSG_VERBOSE("detElem = " << detElem);
536 
537  // We need to determine the type of state
538  std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
539  std::unique_ptr<Trk::TrackParameters> parm;
540 
541  // State is a hole (no associated measurement), use predicted parameters
542  if (flag.test(Acts::TrackStateFlag::HoleFlag)){
543  ATH_MSG_VERBOSE("State is a hole (no associated measurement), use predicted parameters");
544  const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
545  state.predicted(),
546  state.predictedCovariance(),
547  acts_track.particleHypothesis());
548  parm = m_ATLASConverterTool->actsTrackParametersToTrkParameters(actsParam, tgContext);
549  auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*parm);
550  // Check if this is a hole, a dead sensors or a state outside the sensor boundary
551  ATH_MSG_VERBOSE("Check if this is a hole, a dead sensors or a state outside the sensor boundary");
552  if(boundaryCheck == Trk::BoundaryCheckResult::DeadElement){
553  if (detElem->isPixel()) {
554  ++numberOfDeadPixel;
555  }
556  else if (detElem->isSCT()) {
557  ++numberOfDeadSCT;
558  }
559  // Dead sensors states are not stored
560  return;
561  } else if (boundaryCheck != Trk::BoundaryCheckResult::Candidate){
562  // States outside the sensor boundary are ignored
563  return;
564  }
565  typePattern.set(Trk::TrackStateOnSurface::Hole);
566  }
567  // The state was tagged as an outlier or was missed in the reverse filtering, use filtered parameters
568  else if (flag.test(Acts::TrackStateFlag::OutlierFlag) or not state.hasSmoothed()) {
569  ATH_MSG_VERBOSE("The state was tagged as an outlier or was missed in the reverse filtering, use filtered parameters");
570  const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
571  state.filtered(),
572  state.filteredCovariance(),
573  acts_track.particleHypothesis());
574  parm = m_ATLASConverterTool->actsTrackParametersToTrkParameters(actsParam, tgContext);
575  typePattern.set(Trk::TrackStateOnSurface::Outlier);
576  }
577  // The state is a measurement state, use smoothed parameters
578  else{
579  ATH_MSG_VERBOSE("The state is a measurement state, use smoothed parameters");
580 
581  const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
582  state.smoothed(),
583  state.smoothedCovariance(),
584  acts_track.particleHypothesis());
585 
586  actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam)));
587  parm = m_ATLASConverterTool->actsTrackParametersToTrkParameters(actsParam, tgContext);
588  typePattern.set(Trk::TrackStateOnSurface::Measurement);
589  }
590 
591  std::unique_ptr<Trk::MeasurementBase> measState;
592  if (state.hasUncalibratedSourceLink()){
593  auto sl = state.getUncalibratedSourceLink().template get<ATLASSourceLink>();
594  assert(sl);
595  measState = sl->uniqueClone();
596  }
597  double nDoF = state.calibratedSize();
598  auto quality =Trk::FitQualityOnSurface(state.chi2(), nDoF);
599  const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(quality, std::move(measState), std::move(parm), nullptr, typePattern);
600  // If a state was succesfully created add it to the trajectory
601  if (perState) {
602  ATH_MSG_VERBOSE("State succesfully creates, adding it to the trajectory");
603  finalTrajectory->insert(finalTrajectory->begin(), perState);
604  }
605  });
606 
607  // Convert the perigee state and add it to the trajectory
608  const Acts::BoundTrackParameters actsPer(acts_track.referenceSurface().getSharedPtr(),
609  acts_track.parameters(),
610  acts_track.covariance(),
611  acts_track.particleHypothesis());
612  std::unique_ptr<Trk::TrackParameters> per = m_ATLASConverterTool->actsTrackParametersToTrkParameters(actsPer, tgContext);
613  std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
614  typePattern.set(Trk::TrackStateOnSurface::Perigee);
615  const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(nullptr, std::move(per), nullptr, typePattern);
616  if (perState) finalTrajectory->insert(finalTrajectory->begin(), perState);
617 
618  // Create the track using the states
620  newInfo.setTrackFitter(Trk::TrackInfo::TrackFitter::GaussianSumFilter); //Mark the fitter as GaussianSumFilter
621  newtrack = std::make_unique<Trk::Track>(newInfo, std::move(finalTrajectory), nullptr);
622  if (newtrack && !m_refitOnly) {
623  // Create the track summary and update the holes information
624  if (!newtrack->trackSummary()) {
625  newtrack->setTrackSummary(std::make_unique<Trk::TrackSummary>());
626  newtrack->trackSummary()->update(Trk::numberOfPixelHoles, 0);
627  newtrack->trackSummary()->update(Trk::numberOfSCTHoles, 0);
628  newtrack->trackSummary()->update(Trk::numberOfTRTHoles, 0);
629  newtrack->trackSummary()->update(Trk::numberOfPixelDeadSensors, numberOfDeadPixel);
630  newtrack->trackSummary()->update(Trk::numberOfSCTDeadSensors, numberOfDeadSCT);
631  }
632  m_trkSummaryTool->updateTrackSummary(ctx, *newtrack, true);
633  }
634 
635  return newtrack;
636 }
637 
638 const Acts::GsfExtensions<typename ActsTrk::MutableTrackStateBackend>&
639 GaussianSumFitterTool::getExtensions() const
640 {
641  return m_gsfExtensions;
642 }
643 
645 const Acts::Logger&
647 {
648  return *m_logger;
649 }
650 
651 Acts::GsfOptions<typename ActsTrk::MutableTrackStateBackend>
652 GaussianSumFitterTool::prepareOptions(const Acts::GeometryContext& tgContext,
653  const Acts::MagneticFieldContext& mfContext,
654  const Acts::CalibrationContext& calContext,
655  const Acts::PerigeeSurface& surface) const
656 {
657  Acts::PropagatorPlainOptions propagationOption(tgContext, mfContext);
658  propagationOption.maxSteps = m_option_maxPropagationStep;
659 
660  Acts::GsfOptions<typename ActsTrk::MutableTrackStateBackend> gsfOptions(tgContext, mfContext, calContext);
661  gsfOptions.extensions=m_gsfExtensions;
662  gsfOptions.propagatorPlainOptions=propagationOption;
663  gsfOptions.referenceSurface = &surface;
664 
665  // Set abortOnError to false, else the refitting crashes if no forward propagation is done. Here, we just skip the event and continue.
666  gsfOptions.abortOnError = false;
667  gsfOptions.maxComponents = m_maxComponents;
668  gsfOptions.weightCutoff = m_weightCutOff;
669  gsfOptions.componentMergeMethod = m_componentMergeMethod;
670 
671  return gsfOptions;
672 }
673 
674 }
Trk::noHypothesis
@ noHypothesis
Definition: ParticleHypothesis.h:37
Trk::TrackInfo
Contains information about the 'fitter' of this track.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/TrackInfo.h:32
Trk::TrackStateOnSurface::Perigee
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
Definition: TrackStateOnSurface.h:117
ActsTrk::detail::RefittingCalibrator
Definition: RefittingCalibrator.h:19
Trk::PrepRawDataSet
std::vector< const PrepRawData * > PrepRawDataSet
vector of clusters and drift circles
Definition: FitterTypes.h:26
MeasurementBase.h
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ActsTrk::DetectorElementToActsGeometryIdMap
Definition: DetectorElementToActsGeometryIdMap.h:31
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
ActsGeometryContext.h
ActsTrk::GaussianSumFitterTool::prepareOptions
Acts::GsfOptions< ActsTrk::MutableTrackStateBackend > prepareOptions(const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const Acts::PerigeeSurface &surface) const
Definition: GaussianSumFitterTool.cxx:652
ActsTrk::GaussianSumFitterTool::m_trkSummaryTool
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trkSummaryTool
Definition: GaussianSumFitterTool.h:167
ActsTrk::detail::Navigator
Acts::Navigator Navigator
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:32
Trk::numberOfSCTDeadSensors
@ numberOfSCTDeadSensors
number of TRT hits
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:76
Trk::Track::info
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
ActsTrk::GaussianSumFitterTool::m_trackingGeometryTool
ToolHandle< IActsTrackingGeometryTool > m_trackingGeometryTool
Definition: GaussianSumFitterTool.h:165
RefittingCalibrator.h
ATLASMagneticFieldWrapper.h
ActsTrk::GaussianSumFitterTool::initialize
virtual StatusCode initialize() override
Definition: GaussianSumFitterTool.cxx:54
ActsTrk::GaussianSumFitterTool::m_componentMergeMethod
Acts::ComponentMergeMethod m_componentMergeMethod
Definition: GaussianSumFitterTool.h:194
ActsTrk::GaussianSumFitterTool::performFit
std::unique_ptr< Trk::Track > performFit(const EventContext &ctx, const Acts::GeometryContext &tgContext, const Acts::GsfOptions< ActsTrk::MutableTrackStateBackend > &gsfOptions, const std::vector< Acts::SourceLink > &trackSourceLinks, const Acts::BoundTrackParameters &initialParams) const
Definition: GaussianSumFitterToolFullFit.cxx:20
ReadOfcFromCool.field
field
Definition: ReadOfcFromCool.py:48
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
GaussianSumFitterTool.h
Trk::numberOfSCTHoles
@ numberOfSCTHoles
number of Holes in both sides of a SCT module
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:73
Trk::numberOfTRTHoles
@ numberOfTRTHoles
number of TRT hits which pass the high threshold (only xenon counted) total number of TRT hits which ...
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:83
ActsTrk::GaussianSumFitterTool::GaussianSumFitterTool
GaussianSumFitterTool(const std::string &, const std::string &, const IInterface *)
Definition: GaussianSumFitterTool.cxx:48
Trk::RunOutlierRemoval
bool RunOutlierRemoval
switch to toggle quality processing after fit
Definition: FitterTypes.h:22
ActsTrk::GaussianSumFitterTool::m_logger
std::unique_ptr< const Acts::Logger > m_logger
logging instance
Definition: GaussianSumFitterTool.h:216
makeActsAthenaLogger
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Definition: Tracking/Acts/ActsInterop/src/Logger.cxx:64
Trk::FitQualityOnSurface
Definition: FitQualityOnSurface.h:19
ActsTrk::GaussianSumFitterTool::m_maxComponents
Gaudi::Property< int > m_maxComponents
Definition: GaussianSumFitterTool.h:179
Trk::ParticleHypothesis
ParticleHypothesis
Definition: ParticleHypothesis.h:25
ActsTrk::MutableMultiTrajectory
Athena implementation of ACTS::MultiTrajectory (ReadWrite version) The data is stored in 4 external b...
Definition: MultiTrajectory.h:78
ActsTrk::detail::RefittingCalibrator::accessSurface
static const Acts::Surface * accessSurface(const Acts::SourceLink &sourceLink)
Definition: RefittingCalibrator.h:37
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ActsTrk::GaussianSumFitterTool::performDirectFit
std::unique_ptr< Trk::Track > performDirectFit(const EventContext &ctx, const Acts::GeometryContext &tgContext, const Acts::GsfOptions< ActsTrk::MutableTrackStateBackend > &gsfOptions, const std::vector< Acts::SourceLink > &trackSourceLinks, const Acts::BoundTrackParameters &initialParams, const std::vector< const Acts::Surface * > &surfaces) const
Definition: GaussianSumFitterToolDirectFit.cxx:23
ActsTrk::GaussianSumFitterTool::m_option_componentMergeMethod
Gaudi::Property< std::string > m_option_componentMergeMethod
Definition: GaussianSumFitterTool.h:191
ActsTrk::GaussianSumFitterTool::logger
const Acts::Logger & logger() const
Private access to the logger.
Definition: GaussianSumFitterTool.cxx:646
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ActsTrk::ATLASSourceLinkSurfaceAccessor::m_converterTool
const ActsTrk::IActsToTrkConverterTool * m_converterTool
Definition: ATLASSourceLinkSurfaceAccessor.h:21
xAOD::GaussianSumFilter
@ GaussianSumFilter
Tracks from Gaussian Sum Filter.
Definition: TrackingPrimitives.h:50
Trk::numberOfPixelDeadSensors
@ numberOfPixelDeadSensors
number of pixel hits with broad errors (width/sqrt(12))
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:65
master.flag
bool flag
Definition: master.py:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ActsTrk::GaussianSumFitterTool::m_outlierFinder
ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder m_outlierFinder
Definition: GaussianSumFitterTool.h:213
ActsTrk::Seed
Acts::Seed< xAOD::SpacePoint, 3ul > Seed
Definition: Seed.h:12
TrackSummary.h
Trk::ParametersBase
Definition: ParametersBase.h:55
python.TrackLeptonConfig.trackContainer
string trackContainer
Definition: TrackLeptonConfig.py:23
ActsDetectorElement.h
ActsTrk::GaussianSumFitterTool::m_surfaceAccessor
ATLASSourceLinkSurfaceAccessor m_surfaceAccessor
Definition: GaussianSumFitterTool.h:210
ActsTrk::GaussianSumFitterTool::m_gsfExtensions
Acts::GsfExtensions< ActsTrk::MutableTrackStateBackend > m_gsfExtensions
Definition: GaussianSumFitterTool.h:211
ActsTrk::GaussianSumFitterTool::m_useDirectNavigation
Gaudi::Property< bool > m_useDirectNavigation
Definition: GaussianSumFitterTool.h:182
ActsTrk::GaussianSumFitterTool::m_refitOnly
Gaudi::Property< bool > m_refitOnly
Definition: GaussianSumFitterTool.h:185
Trk::numberOfPixelHoles
@ numberOfPixelHoles
number of pixels which have a ganged ambiguity.
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:59
Trk::MeasurementSet
std::vector< const MeasurementBase * > MeasurementSet
vector of fittable measurements
Definition: FitterTypes.h:30
Trk::MeasurementBase
Definition: MeasurementBase.h:58
Trk::Track::trackParameters
const DataVector< const TrackParameters > * trackParameters() const
Return a pointer to a vector of TrackParameters.
Definition: Tracking/TrkEvent/TrkTrack/src/Track.cxx:97
TRT_BaseElement.h
ActsTrk::GaussianSumFitterTool::m_calibrator
std::unique_ptr< ActsTrk::detail::TrkMeasurementCalibrator > m_calibrator
Definition: GaussianSumFitterTool.h:201
Trk::Track::perigeeParameters
const Perigee * perigeeParameters() const
return Perigee.
Definition: Tracking/TrkEvent/TrkTrack/src/Track.cxx:163
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
Trk::MeasurementBase::associatedSurface
virtual const Surface & associatedSurface() const =0
Interface method to get the associated Surface.
Trk::TrackInfo::dumpInfo
std::string dumpInfo() const
Returns a string with the name of the fitter of this track (i.e.
Definition: Tracking/TrkEvent/TrkTrack/src/TrackInfo.cxx:45
ActsTrk::GaussianSumFitterTool::fit
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
Definition: GaussianSumFitterTool.cxx:123
ActsTrk::GaussianSumFitterTool::m_weightCutOff
Gaudi::Property< double > m_weightCutOff
Definition: GaussianSumFitterTool.h:188
ActsTrk::GaussianSumFitterTool::m_directFitter
std::unique_ptr< DirectFitter > m_directFitter
Definition: GaussianSumFitterTool.h:207
Trk::Track::measurementsOnTrack
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
Definition: Tracking/TrkEvent/TrkTrack/src/Track.cxx:178
ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder::StateChiSquaredPerNumberDoFCut
double StateChiSquaredPerNumberDoFCut
Definition: FitterHelperFunctions.h:50
python.TrackLeptonConfig.quality
quality
Definition: TrackLeptonConfig.py:16
ActsTrk::GaussianSumFitterTool::m_ATLASConverterTool
ToolHandle< ActsTrk::IActsToTrkConverterTool > m_ATLASConverterTool
Definition: GaussianSumFitterTool.h:166
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
ActsTrk::detail::RefittingCalibrator::calibrate
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sourceLink, MutableTrackStateProxy trackState) const
Definition: RefittingCalibrator.cxx:14
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:55
ActsTrk::GaussianSumFitterTool::m_fitter
std::unique_ptr< Fitter > m_fitter
Definition: GaussianSumFitterTool.h:202
ActsTrk::GaussianSumFitterTool::m_extrapolationTool
ToolHandle< IActsExtrapolationTool > m_extrapolationTool
Definition: GaussianSumFitterTool.h:164
ActsTrk::GaussianSumFitterTool::m_option_outlierChi2Cut
Gaudi::Property< double > m_option_outlierChi2Cut
Definition: GaussianSumFitterTool.h:174
Logger.h
python.CaloScaleNoiseConfig.ts
ts
Definition: CaloScaleNoiseConfig.py:87
ActsTrk::GaussianSumFitterTool::makeTrack
std::unique_ptr< Trk::Track > makeTrack(const EventContext &ctx, const Acts::GeometryContext &tgContext, ActsTrk::MutableTrackContainer &tracks, Acts::Result< typename ActsTrk::MutableTrackContainer::TrackProxy, std::error_code > &fitResult) const
Definition: GaussianSumFitterTool.cxx:486
ActsTrk::MutableTrackContainer
Definition: TrackContainer.h:122
TrackContainer.h
python.iconfTool.gui.pad.logger
logger
Definition: pad.py:14
TrackStateOnSurface.h
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32