ATLAS Offline Software
TrackExtensionAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
5 #include "src/TrackFindingAlg.h"
6 #include "Acts/Propagator/PropagatorOptions.hpp"
8 
9 // Athena
10 #include "AsgTools/ToolStore.h"
19 
20 // ACTS
21 #include "Acts/Definitions/Units.hpp"
22 #include "Acts/Geometry/TrackingGeometry.hpp"
23 #include "Acts/Geometry/GeometryIdentifier.hpp"
24 #include "Acts/MagneticField/MagneticFieldProvider.hpp"
25 #include "Acts/Surfaces/Surface.hpp"
26 #include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
27 #include "Acts/Surfaces/PerigeeSurface.hpp"
28 #include "Acts/Utilities/TrackHelpers.hpp"
29 #include "Acts/TrackFinding/TrackStateCreator.hpp"
30 
31 // ActsTrk
38 #include "ActsInterop/Logger.h"
39 #include "ActsInterop/TableUtils.h"
45 
46 // STL
47 #include <initializer_list>
48 #include <sstream>
49 #include <functional>
50 #include <tuple>
51 #include <utility>
52 #include <algorithm>
53 
54 
55 namespace ActsTrk{
56 
64  ATH_CHECK(m_extrapolationTool.retrieve());
65  ATH_CHECK(m_pixelCalibTool.retrieve(EnableTool{not m_pixelCalibTool.empty()}));
66  ATH_CHECK(m_stripCalibTool.retrieve(EnableTool{not m_stripCalibTool.empty()}));
67  ATH_CHECK(m_hgtdCalibTool.retrieve(EnableTool{not m_hgtdCalibTool.empty()}));
69  ATH_CHECK(m_trackStatePrinter.retrieve(EnableTool{not m_trackStatePrinter.empty()}));
70  ATH_CHECK(m_actsFitter.retrieve());
73 
74  auto magneticField = std::make_unique<ATLASMagneticFieldWrapper>();
75  std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry = m_trackingGeometryTool->trackingGeometry();
76 
77  detail::Stepper stepper(std::move(magneticField));
78  detail::Navigator::Config cfg{trackingGeometry};
79  cfg.resolvePassive = false;
80  cfg.resolveMaterial = true;
81  cfg.resolveSensitive = true;
82  detail::Navigator navigator(cfg, m_logger->cloneWithSuffix("Navigator"));
83  detail::Propagator propagator(std::move(stepper), std::move(navigator), m_logger->cloneWithSuffix("Prop"));
84 
85  // Using the CKF propagator as extrapolator
86  detail::Extrapolator extrapolator = propagator;
87 
88 
89  // update once shared code for configuring this is available
90  Acts::TrackSelector::EtaBinnedConfig trackSelectorCfg(std::vector<double>({0, 4}));
91  trackSelectorCfg.cutSets[0].ptMin = 1000;
92  trackSelectorCfg.cutSets[0].ptMax = 1000000;
93  trackSelectorCfg.cutSets[0].minMeasurements = 3;
94  trackSelectorCfg.cutSets[0].maxHoles = 1;
95  trackSelectorCfg.cutSets[0].maxOutliers = 1;
96  trackSelectorCfg.cutSets[0].maxSharedHits = 1;
97  trackSelectorCfg.cutSets[0].maxChi2 = 25.;
98 
99  detail::CKF_config ckfConfig{
100  std::move(extrapolator),
101  detail::CKF{std::move(propagator), m_logger->cloneWithSuffix("CKF")},
102  {},
103  Acts::TrackSelector{trackSelectorCfg}};
104 
105  m_ckfConfig = std::make_unique<detail::CKF_config>(std::move(ckfConfig));
106  return StatusCode::SUCCESS;
107  }
108 
109 
110 
111 
112  StatusCode TrackExtensionAlg::execute(const EventContext& context) const {
114  ATH_CHECK(protoTracksHandle.isValid());
115 
116  Acts::VectorTrackContainer tback;
117  Acts::VectorMultiTrajectory tsBack;
119 
120  // track finding goes here
121  Acts::VectorTrackContainer trackBackend;
122  Acts::VectorMultiTrajectory trackStateBackend;
123  detail::RecoTrackContainer tracksContainerTemp(trackBackend, trackStateBackend);
124 
125  // Get Beam pos and make pSurface
127  ATH_CHECK( beamSpotHandle.isValid() );
128  const InDet::BeamSpotData* beamSpotData = beamSpotHandle.cptr();
129 
130  // Beam Spot Position
131  Acts::Vector3 beamPos( beamSpotData->beamPos().x() * Acts::UnitConstants::mm,
132  beamSpotData->beamPos().y() * Acts::UnitConstants::mm,
133  0 );
134 
135  // Construct a perigee surface as the target surface
136  std::shared_ptr<Acts::PerigeeSurface> perigeeSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(beamPos);
137 
138  const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(context).context();
139  const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(context);
140  const Acts::CalibrationContext calContext{getCalibrationContext(context)};
141 
143 
145  ATH_MSG_DEBUG("Measurements (pixels only) size: " << pixelClustersHandle->size());
146  // potential TODO: filtering only certain layers
147  detail::TrackFindingMeasurements measurements(1ul /* number of measurement containers*/);
148  measurements.addMeasurements(0, *pixelClustersHandle, *m_trackingGeometryTool->surfaceIdMap());
149  std::optional<detail::MeasurementIndex> measurementIndex;
150 
151  if (m_trackStatePrinter.isSet()) {
152  measurementIndex.emplace(1ul);
153  measurementIndex->addMeasurements(*pixelClustersHandle);
154  }
155 
156  using DefaultTrackStateCreator = Acts::TrackStateCreator<ActsTrk::detail::UncalibSourceLinkAccessor::Iterator,detail::RecoTrackContainer>;
157 
159  DefaultTrackStateCreator::SourceLinkAccessor slAccessorDelegate;
160  slAccessorDelegate.connect<&ActsTrk::detail::UncalibSourceLinkAccessor::range>(&slAccessor);
161 
162  Acts::PropagatorPlainOptions plainOptions(tgContext, mfContext);
163  plainOptions.maxSteps = 1000;
164  plainOptions.direction= m_propagateForward ? Acts::Direction::Forward() : Acts::Direction::Backward();
165 
166 
167 
169  mfContext,
170  calContext,
171  m_ckfConfig->ckfExtensions,
172  plainOptions,
173  perigeeSurface.get());
174 
175  options.targetSurface = perigeeSurface.get();
176 
182 
183  DefaultTrackStateCreator defaultTrackStateCreator{};
184  defaultTrackStateCreator.sourceLinkAccessor = slAccessorDelegate;
185  defaultTrackStateCreator.calibrator.template connect<&detail::OnTrackCalibrator<detail::RecoTrackStateContainer>::calibrate>(&calibrator);
186 
187  options.extensions.createTrackStates.template connect<
188  &DefaultTrackStateCreator
189  ::createTrackStates>(&defaultTrackStateCreator);
190 
191  if ( not m_truthParticlesKey.empty() ) {
192  auto truthHandle = SG::ReadHandle(m_truthParticlesKey, context);
193  for ( auto truthParticle: *truthHandle ) {
194  ATH_MSG_DEBUG("truth: eta: " << truthParticle->eta() << " phi: " << truthParticle->phi() << " pt: " << truthParticle->pt());
195  }
196  }
197 
198  ATH_MSG_DEBUG("Size of proto tracks collection " << protoTracksHandle->size());
199  for (const ActsTrk::ProtoTrack& protoTrack : *protoTracksHandle) {
200  if(protoTrack.measurements.empty()) continue;
201 
202  const Acts::Surface* refSurface = surfAcc.get(protoTrack.measurements[0]);
203 
204  auto res = m_actsFitter->fit(protoTrack.measurements, *protoTrack.parameters,
205  tgContext, mfContext, calContext, refSurface);
206  if(!res) continue;
207  if (res->size() == 0 ) continue;
208  ATH_MSG_DEBUG(".......Done fit of track with "<< protoTrack.measurements.size() << " measurements");
209  const auto trackProxy = res->getTrack(0);
210  if (not trackProxy.hasReferenceSurface()) {
211  ATH_MSG_INFO("There is not reference surface for this track");
212  continue;
213  }
214 
215  Acts::BoundTrackParameters parametersAtRefSurface( trackProxy.referenceSurface().getSharedPtr(),
216  trackProxy.parameters(),
217  trackProxy.covariance(),
218  trackProxy.particleHypothesis());
219 
220 
221 
222  ATH_MSG_DEBUG("proto track: eta: " << -1 * log(tan( parametersAtRefSurface.theta() * 0.5)) << " phi: " << parametersAtRefSurface.phi() << " pt:" << abs(1./protoTrack.parameters->qOverP() * sin(protoTrack.parameters->theta())));
223  ATH_MSG_DEBUG("Extending proto track of " << protoTrack.measurements.size() << " measurements");
224  auto result = m_ckfConfig->ckf.findTracks(parametersAtRefSurface, options,
225  tracksContainerTemp);
226 
227 
228  ATH_MSG_DEBUG("Built " << tracksContainerTemp.size() << " tracks from it");
229  for (detail::RecoTrackContainer::TrackProxy tempTrackProxy : tracksContainerTemp) {
230  auto destTrackProxy = trackContainer.makeTrack();
231  ATH_MSG_DEBUG("Reco MTJ size " << trackStateBackend.size() );
232  for ( size_t stateIndex=0; stateIndex < trackStateBackend.size(); ++stateIndex) {
233  auto state = trackStateBackend.getTrackState(stateIndex);
234  if (m_trackStatePrinter.isSet()) m_trackStatePrinter->printTrackState(tgContext, state, *measurementIndex, false);
235  }
236  ATH_MSG_DEBUG("Track has: " << tempTrackProxy.nMeasurements() << " measurements ");
237  ATH_MSG_DEBUG("track: eta: " << -1 * log(tan( tempTrackProxy.theta() * 0.5)) << " phi: " << tempTrackProxy.phi() << " pt:" << abs(1./tempTrackProxy.qOverP() * sin(protoTrack.parameters->theta())));
238 
239  destTrackProxy.copyFrom(tempTrackProxy);
240  }
241  }
242 
243 
244 
245  // convert to const version
246  Acts::ConstVectorTrackContainer ctback( std::move(tback) );
247  Acts::ConstVectorMultiTrajectory ctsBack( std::move(tsBack) );
248  std::unique_ptr< ActsTrk::TrackContainer > ctrackContainer = std::make_unique< ActsTrk::TrackContainer >( std::move(ctback), std::move(ctsBack) );
249 
251  ATH_CHECK(trackContainerHandle.record(std::move(ctrackContainer)));
252 
253  return StatusCode::SUCCESS;
254  }
255 
256 } // EOF namespace
ActsTrk::TrackExtensionAlg::m_pixelClusters
SG::ReadHandleKey< xAOD::PixelClusterContainer > m_pixelClusters
Definition: TrackExtensionAlg.h:59
ActsTrk::getCalibrationContext
Acts::CalibrationContext getCalibrationContext(const EventContext &ctx)
The Acts::Calibration context is piped through the Acts fitters to (re)calibrate the Acts::SourceLink...
Definition: CalibrationContext.h:15
SCT_ClusterOnTrack.h
ActsTrk::TrackExtensionAlg::m_extrapolationTool
ToolHandle< IActsExtrapolationTool > m_extrapolationTool
Definition: TrackExtensionAlg.h:77
get_generator_info.result
result
Definition: get_generator_info.py:21
python.SystemOfUnits.mm
float mm
Definition: SystemOfUnits.py:98
TrackParameters.h
ActsTrk::TrackExtensionAlg::execute
virtual StatusCode execute(const EventContext &context) const override
Definition: TrackExtensionAlg.cxx:112
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ActsTrk::detail::TrackFindingMeasurements
Definition: TrackFindingMeasurements.h:17
ActsGeometryContext.h
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
ActsTrk::detail::Navigator
Acts::Navigator Navigator
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:31
ActsTrk::ProtoTrack
Definition: ProtoTrack.h:15
ActsTrk::detail::Extrapolator
Propagator Extrapolator
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:34
fillPileUpNoiseLumi.connect
string connect
Definition: fillPileUpNoiseLumi.py:70
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:210
ATLASMagneticFieldWrapper.h
ActsTrk::TrackExtensionAlg::CKFOptions
Acts::CombinatorialKalmanFilterOptions< detail::RecoTrackContainer > CKFOptions
Definition: TrackExtensionAlg.h:56
ActsTrk::prefixFromTrackContainerName
std::string prefixFromTrackContainerName(const std::string &tracks)
Parse TrackContainer name to get the prefix for backends The name has to contain XYZTracks,...
Definition: TrackContainerHandlesHelper.cxx:20
ActsTrk::TrackExtensionAlg::m_actsFitter
ToolHandle< ActsTrk::IFitterTool > m_actsFitter
Definition: TrackExtensionAlg.h:90
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
TrackFindingMeasurements.h
ActsTrk::detail::RecoTrackContainer
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:22
ActsTrk::TrackExtensionAlg::m_trackContainerKey
SG::WriteHandleKey< ActsTrk::TrackContainer > m_trackContainerKey
Definition: TrackExtensionAlg.h:66
MeasurementIndex.h
ActsTrk::MutableTrackContainerHandlesHelper::initialize
StatusCode initialize(const std::string &prefix)
Sets up the handles.
Definition: TrackContainerHandlesHelper.cxx:47
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:274
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
ActsTrk::TrackExtensionAlg::initialize
virtual StatusCode initialize() override
Definition: TrackExtensionAlg.cxx:57
OnTrackCalibrator.h
ActsTrk::TrackExtensionAlg::m_stripCalibTool
ToolHandle< ActsTrk::IOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_stripCalibTool
Definition: TrackExtensionAlg.h:83
CalibrationContext.h
SCT_ClusterCollection.h
ActsTrk::TrackExtensionAlg::m_propagateForward
Gaudi::Property< bool > m_propagateForward
Definition: TrackExtensionAlg.h:93
ActsTrk::detail::GenUncalibSourceLinkAccessor
Accessor for the above source link container.
Definition: AtlasUncalibSourceLinkAccessor.h:113
ActsTrk::detail::GenUncalibSourceLinkAccessor::range
std::pair< Iterator, Iterator > range(const Acts::Surface &surface) const
Definition: AtlasUncalibSourceLinkAccessor.h:169
ActsTrk::TrackExtensionAlg::m_truthParticlesKey
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_truthParticlesKey
Definition: TrackExtensionAlg.h:63
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::detail::CKF_config
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:40
ActsTrk::TrackExtensionAlg::m_trackingGeometryTool
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
Definition: TrackExtensionAlg.h:75
res
std::pair< std::vector< unsigned int >, bool > res
Definition: JetGroupProductTest.cxx:11
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
python.AtlRunQueryLib.options
options
Definition: AtlRunQueryLib.py:378
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
TrackSummary.h
detail::ul
unsigned long ul
Definition: PrimitiveHelpers.h:46
python.TrackLeptonConfig.trackContainer
string trackContainer
Definition: TrackLeptonConfig.py:23
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
ActsDetectorElement.h
PixelClusterCollection.h
Monitored.h
Header file to be included by clients of the Monitored infrastructure.
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
ActsTrk::TrackExtensionAlg::m_protoTrackCollectionKey
SG::ReadHandleKey< ActsTrk::ProtoTrackCollection > m_protoTrackCollectionKey
Definition: TrackExtensionAlg.h:61
ActsTrk::detail::TrackFindingMeasurements::addMeasurements
void addMeasurements(std::size_t typeIndex, const xAOD::UncalibratedMeasurementContainer &clusterContainer, const DetectorElementToActsGeometryIdMap &detectorElementToGeoid)
Definition: TrackFindingMeasurements.cxx:15
InDet::BeamSpotData::beamPos
const Amg::Vector3D & beamPos() const noexcept
Definition: BeamSpotData.h:68
ActsTrk::TrackExtensionAlg::m_beamSpotKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Definition: TrackExtensionAlg.h:71
ActsTrk::TrackExtensionAlg::m_pixelCalibTool
ToolHandle< ActsTrk::IOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_pixelCalibTool
Definition: TrackExtensionAlg.h:80
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
RIO_OnTrack.h
ActsTrk::TrackExtensionAlg::m_hgtdCalibTool
ToolHandle< ActsTrk::IOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_hgtdCalibTool
Definition: TrackExtensionAlg.h:86
AtlasMeasurementSelector.h
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
WriteCaloSwCorrections.cfg
cfg
Definition: WriteCaloSwCorrections.py:23
ActsTrk::detail::TrackFindingMeasurements::measurementRanges
const ActsTrk::detail::MeasurementRangeList & measurementRanges() const
SurfaceOfMeasurementUtil.h
ActsTrk::detail::Stepper
Acts::SympyStepper Stepper
Adapted from Acts Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithmFunction....
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:30
xAODUncalibMeasSurfAcc.h
ActsTrk::TrackExtensionAlg::m_tracksBackendHandlesHelper
ActsTrk::MutableTrackContainerHandlesHelper m_tracksBackendHandlesHelper
Definition: TrackExtensionAlg.h:69
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
InDet::BeamSpotData
Definition: BeamSpotData.h:21
FitterHelperFunctions.h
ActsTrk::detail::Propagator
Acts::Propagator< Stepper, Navigator > Propagator
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:32
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
TrackFindingAlg.h
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
ActsTrk::TrackExtensionAlg::m_ckfConfig
std::unique_ptr< detail::CKF_config > m_ckfConfig
Definition: TrackExtensionAlg.h:96
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MSTrackingVolumeBuilder.cxx:24
TrackExtensionAlg.h
ActsTrk::detail::CKF
Acts::CombinatorialKalmanFilter< Propagator, RecoTrackContainer > CKF
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:33
ActsTrk::detail::xAODUncalibMeasSurfAcc
Helper class to access the Acts::surface associated with an Uncalibrated xAOD measurement.
Definition: xAODUncalibMeasSurfAcc.h:22
TableUtils.h
ActsTrk::TrackExtensionAlg::m_logger
std::unique_ptr< const Acts::Logger > m_logger
Definition: TrackExtensionAlg.h:97
ActsTrk::detail::OnTrackCalibrator
Inner detector / ITk calibrator implementation used in the KalmanFilterTool.
Definition: IOnTrackCalibratorTool.h:14
ToolStore.h
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
Logger.h
PixelClusterOnTrack.h
ActsTrk::TrackExtensionAlg::m_trackStatePrinter
ToolHandle< ActsTrk::TrackStatePrinterTool > m_trackStatePrinter
Definition: TrackExtensionAlg.h:88
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TrackContainer.h
ActsTrk::DefaultTrackStateCreator
Acts::TrackStateCreator< ActsTrk::detail::UncalibSourceLinkAccessor::Iterator, detail::RecoTrackContainer > DefaultTrackStateCreator
Definition: TrackFindingAlg.h:44
SG::ReadCondHandle::cptr
const_pointer_type cptr()
Definition: ReadCondHandle.h:71