27#include "Acts/TrackFinding/TrackStateCreator.hpp"
28#include "Acts/Surfaces/PlaneSurface.hpp"
29#include "Acts/Surfaces/RectangleBounds.hpp"
30#include "Acts/Utilities/VectorHelpers.hpp"
35#include "GaudiKernel/PhysicalConstants.h"
80 auto magneticField = std::make_unique<ATLASMagneticFieldWrapper>();
81 std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry =
m_trackingGeometryTool->trackingGeometry();
84 detail::Navigator::Config cfg{trackingGeometry};
85 cfg.resolvePassive =
true;
86 cfg.resolveMaterial =
true;
87 cfg.resolveSensitive =
true;
95 Acts::TrackSelector::EtaBinnedConfig trackSelectorCfg(std::vector<double>({0, 4}));
96 trackSelectorCfg.cutSets[0].ptMin = 500;
97 trackSelectorCfg.cutSets[0].ptMax = 1000000;
98 trackSelectorCfg.cutSets[0].minMeasurements = 1;
99 trackSelectorCfg.cutSets[0].maxHoles = 4;
100 trackSelectorCfg.cutSets[0].maxOutliers = 4;
101 trackSelectorCfg.cutSets[0].maxHolesAndOutliers = 4;
102 trackSelectorCfg.cutSets[0].maxSharedHits = 4;
103 trackSelectorCfg.cutSets[0].maxChi2 = 10000000.0;
108 std::move(extrapolator),
111 Acts::TrackSelector{trackSelectorCfg}};
113 m_trackFinder = std::make_unique<detail::CKF_config>(std::move(ckfConfig));
115 return StatusCode::SUCCESS;
172 std::unordered_set<uint32_t> hgtdVolumes {};
173 std::unordered_map<uint32_t, std::unordered_set<uint32_t>> hgtdLayers {};
176 const Acts::Surface* surface =
m_surfAcc.get(cluster);
179 Acts::GeometryIdentifier geoID = surface->geometryId();
180 uint32_t vol = geoID.volume();
181 uint32_t layer = geoID.layer();
183 hgtdVolumes.insert(vol);
184 hgtdLayers[vol].insert(layer);
188 ATH_MSG_ERROR(
"Failed to retrieve surface for cluster " << cluster->index());
189 return StatusCode::FAILURE;
193 ATH_MSG_DEBUG(
"Found " << hgtdVolumes.size() <<
" different HGTD volumes");
194 for (std::uint32_t vol : hgtdVolumes) {
195 ATH_MSG_DEBUG(
"HGTD Volume " << vol <<
" has " << hgtdLayers[vol].
size() <<
" layers:");
196 for (std::uint32_t lyr : hgtdLayers[vol]) {
205 using DefaultTrackStateCreator = Acts::TrackStateCreator<ActsTrk::detail::UncalibSourceLinkAccessor::Iterator,detail::RecoTrackContainer>;
208 DefaultTrackStateCreator::SourceLinkAccessor slAccessorDelegate;
214 <<
" source links from measurements in "
219 {uncalibratedMeasurementContainer},
223 Acts::PropagatorPlainOptions plainOptions(geoContext, mfContext);
224 plainOptions.direction = Acts::Direction::Forward();
240 defaultTrackStateCreator.sourceLinkAccessor = slAccessorDelegate;
241 defaultTrackStateCreator.calibrator.template connect<&detail::OnTrackCalibrator<detail::RecoTrackStateContainer>::calibrate>(&calibrator);
243 options.extensions.createTrackStates.template connect<
244 &DefaultTrackStateCreator::createTrackStates>(&defaultTrackStateCreator);
256 if (!link_to_track.
isValid()) {
257 ATH_MSG_ERROR(
"Invalid ACTS track link for TrackParticle " << trackParticle->index());
258 return StatusCode::FAILURE;
261 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = *link_to_track;
262 if (!optional_track.has_value()) {
263 ATH_MSG_ERROR(
"No valid ACTS track associated with TrackParticle " << trackParticle->index());
264 return StatusCode::FAILURE;
267 const ActsTrk::TrackContainer::ConstTrackProxy& track = optional_track.value();
269 Acts::VectorTrackContainer trackBackend;
270 Acts::VectorMultiTrajectory trackStateBackend;
274 float trackEta = Acts::VectorHelpers::eta(track.momentum());
281 <<
"], skipping extension ------ !!!!!");
284 layerHasExtensionHandle(*trackParticle) = trackData.
hasClusterVec;
285 layerExtensionChi2Handle(*trackParticle) = trackData.
chi2Vec;
286 layerClusterRawTimeHandle(*trackParticle) = trackData.
rawTimeVec;
287 layerClusterTimeHandle(*trackParticle) = trackData.
timeVec;
288 extrapXHandle(*trackParticle) = trackData.
extrapX;
289 extrapYHandle(*trackParticle) = trackData.
extrapY;
290 numHGTDHitsHandle(*trackParticle) = trackData.
numHGTDHits;
295 float trackpT = track.transverseMomentum();
296 float trackPhi = track.phi();
297 float trackNmeasurements = track.nMeasurements();
299 ATH_MSG_DEBUG(
"TrackParticle " << trackParticle->index() <<
" has ACTS track with eta: " << trackEta <<
", phi = " << trackPhi <<
" pT: " << trackpT <<
" and nMeasurements: " << trackNmeasurements);
302 const auto lastMeasurementState = Acts::findLastMeasurementState(track);
303 if (not lastMeasurementState.ok()) {
304 ATH_MSG_ERROR(
"Problem finding last measurement state for acts track");
305 return StatusCode::FAILURE;
307 const Acts::BoundTrackParameters lastMeasurementStateParameters = track.createParametersFromState(*lastMeasurementState);
310 const Acts::Surface& refSurface = track.referenceSurface();
311 const Acts::BoundTrackParameters parametersAtRefSurface(refSurface.getSharedPtr(),
314 track.particleHypothesis());
316 ATH_MSG_DEBUG(
"Initial track parameters for extension - lastMeasurementStateParameters:");
317 ATH_MSG_DEBUG(
" - eta: " << -1 * log(tan(lastMeasurementStateParameters.theta() * 0.5)));
318 ATH_MSG_DEBUG(
" - phi: " << lastMeasurementStateParameters.phi());
319 ATH_MSG_DEBUG(
" - pT: " << std::abs(1./lastMeasurementStateParameters.qOverP() * std::sin(lastMeasurementStateParameters.theta())));
320 ATH_MSG_DEBUG(
" - theta: " << lastMeasurementStateParameters.theta());
321 ATH_MSG_DEBUG(
" - qOverP: " << lastMeasurementStateParameters.qOverP());
322 ATH_MSG_DEBUG(
" - covariance exists: " << (lastMeasurementStateParameters.covariance().has_value() ?
"yes" :
"no"));
325 auto result =
m_trackFinder->ckf.findTracks(lastMeasurementStateParameters, options,tracksContainerTemp);
327 ATH_MSG_DEBUG(
"Built " << tracksContainerTemp.size() <<
" tracks from it");
329 for (
const detail::RecoTrackContainer::TrackProxy trackProxy : tracksContainerTemp) {
334 layerHasExtensionHandle(*trackParticle) = trackData.
hasClusterVec;
335 layerExtensionChi2Handle(*trackParticle) = trackData.
chi2Vec;
336 layerClusterRawTimeHandle(*trackParticle) = trackData.
rawTimeVec;
337 layerClusterTimeHandle(*trackParticle) = trackData.
timeVec;
338 extrapXHandle(*trackParticle) = trackData.
extrapX;
339 extrapYHandle(*trackParticle) = trackData.
extrapY;
340 numHGTDHitsHandle(*trackParticle) = trackData.
numHGTDHits;
344 return StatusCode::SUCCESS;
356 ATH_MSG_DEBUG(
"Measurements (HGTD only) size: " << HGTDClustersHandle->size());
366 const Acts::Surface* surface =
m_surfAcc.get(cluster);
367 if (not surface)
continue;
372 auto localPosition = cluster->localPosition<3>();
373 double clusterTime = localPosition[2];
382 mon_cluster_x, mon_cluster_y, mon_cluster_z,
391 return StatusCode::SUCCESS;
395 const EventContext& ctx,
397 const detail::RecoTrackContainer::TrackProxy& trackProxy)
const {
409 std::size_t nMeasurements = 0;
410 std::size_t nHoles = 0;
411 std::size_t nOutliers = 0;
412 std::size_t nHGTDHits = 0;
414 std::vector<bool> hasHitInLayer = {
false,
false,
false,
false};
415 std::vector<float> chi2PerLayer = {0.0, 0.0, 0.0, 0.0};
416 std::vector<float> timePerLayer = {0.0, 0.0, 0.0, 0.0};
417 std::vector<float> rawTimePerLayer = {0.0, 0.0, 0.0, 0.0};
419 std::vector<int> truthClassPerLayer = {-1, -1, -1, -1};
420 std::vector<bool> isShadowedPerLayer = {
false,
false,
false,
false};
421 std::vector<bool> isMergedPerLayer = {
false,
false,
false,
false};
422 std::vector<bool> primaryExpectedPerLayer = {
false,
false,
false,
false};
428 bool foundExtrapolation =
false;
430 trackProxy.container().trackStateContainer().visitBackwards(
431 trackProxy.tipIndex(),
432 [&](
const auto& state) {
433 auto flags = state.typeFlags();
434 if (flags.isHole()) {
436 }
else if (flags.isOutlier()) {
438 }
else if (flags.isMeasurement()) {
443 const auto& surface = state.referenceSurface();
444 Acts::GeometryIdentifier geoID = surface.geometryId();
446 if (isHGTDSurface(geoID)) {
447 std::size_t layerIndex = getHGTDLayerIndex(geoID);
449 const auto& calibrated = state.template calibrated<3>();
450 const auto& predicted = state.predicted();
451 const auto& calibCov = state.template calibratedCovariance<3>();
455 Eigen::Vector2d residual2d;
456 residual2d(0) = calibrated(0) - predicted(Acts::eBoundLoc0);
457 residual2d(1) = calibrated(1) - predicted(Acts::eBoundLoc1);
460 AmgSymMatrix(2) cov_2d{calibCov.template block<2,2>(0,0)};
463 const auto& predictedCov = state.predictedCovariance();
464 AmgSymMatrix(2) predicted_cov_2d{predictedCov.template block<2,2>(0,0)};
467 AmgSymMatrix(2) residual_cov = cov_2d + predicted_cov_2d;
473 if (residual_cov.determinant() != 0)
475 chi2 = residual2d.transpose() * residual_cov.inverse() * residual2d;
482 if (layerIndex < 4) {
484 hasHitInLayer[layerIndex] = true;
485 chi2PerLayer[layerIndex] =chi2/ndf;
489 float rawTime = 0.0f;
490 float calibratedTime = 0.0f;
492 if (state.hasCalibrated()) {
495 const auto& calibrated = state.template calibrated<3>();
496 calibratedTime = static_cast<float>(calibrated(2));
497 ATH_MSG_DEBUG(
"Got time from calibrated<3>: " << calibratedTime);
498 } catch (const std::exception& e) {
499 ATH_MSG_WARNING(
"Failed to extract time from calibrated<3>: " << e.what());
505 const xAOD::HGTDCluster* cluster = getHGTDClusterFromState(ctx, state);
508 auto localPos = cluster->localPosition<3>();
509 rawTime = static_cast<float>(localPos[2]);
510 ATH_MSG_DEBUG(
"Got raw time from cluster local position: " << rawTime);
512 ATH_MSG_WARNING(
"Could not get cluster from state");
516 rawTimePerLayer[layerIndex] = rawTime;
520 auto [correctedTime, timeErr] = correctTOF(
525 acts_tracking_geometry,
527 timePerLayer[layerIndex] = correctedTime;
528 ATH_MSG_DEBUG(
"Applied TOF correction: " << calibratedTime <<
" -> " << correctedTime);
531 timePerLayer[layerIndex] = calibratedTime;
532 ATH_MSG_DEBUG(
"No cluster found for TOF correction, using calibrated time: " << calibratedTime);
537 ATH_MSG_DEBUG(
"State does not have calibrated data");
541 if (!foundExtrapolation) {
542 foundExtrapolation = true;
543 if (state.hasPredicted()) {
545 const auto& predicted = state.predicted();
546 Acts::Vector2 localPos(predicted[Acts::eBoundLoc0], predicted[Acts::eBoundLoc1]);
549 Acts::Vector3 globalPos = surface.localToGlobal(
552 Acts::Vector3::Zero());
554 extrapX = globalPos.x();
555 extrapY = globalPos.y();
556 extrapZ = globalPos.z();
558 ATH_MSG_DEBUG(
"Extrapolated position (predicted) at HGTD: x=" << extrapX
559 <<
", y=" << extrapY <<
", z=" << extrapZ);
562 Acts::Vector3 globalPos = surface.center(geoContext);
563 extrapX = globalPos.x();
564 extrapY = globalPos.y();
565 extrapZ = globalPos.z();
567 ATH_MSG_DEBUG(
"Extrapolated position (surface center) at HGTD: x=" << extrapX
568 <<
", y=" << extrapY <<
", z=" << extrapZ);
572 ATH_MSG_DEBUG(
"Found HGTD hit on layer " << layerIndex
573 <<
", chi2=" << chi2PerLayer[layerIndex]
574 <<
", time=" << timePerLayer[layerIndex]);
584 if (nHGTDHits == 0 && !foundExtrapolation) {
587 if (getExtrapolationPosition(ctx, trackProxy, extrapX, extrapY, extrapZ)) {
588 ATH_MSG_DEBUG(
"!!! Didn't find any HGTD hits but calculated extrapolation position: x=" << extrapX
589 <<
", y=" << extrapY <<
", z=" << extrapZ);
590 foundExtrapolation =
true;
595 <<
" nMeasurements=" << nMeasurements
596 <<
" nHGTDHits=" << nHGTDHits
597 <<
" nHoles=" << nHoles
598 <<
" nOutliers=" << nOutliers
599 <<
" extrapolation found: " << (foundExtrapolation ?
"yes" :
"no"));
603 data.hasClusterVec = std::move(hasHitInLayer);
604 data.chi2Vec = std::move(chi2PerLayer);
605 data.timeVec = std::move(timePerLayer);
606 data.rawTimeVec = std::move(rawTimePerLayer);
607 data.extrapX = extrapX;
608 data.extrapY = extrapY;
609 data.extrapZ = extrapZ;
610 data.numHGTDHits = nHGTDHits;
617 std::uint32_t volume = geoID.volume();
618 std::uint32_t layer = geoID.layer();
621 bool isPositiveEndcap = (volume == 25);
622 bool isNegativeEndcap = (volume == 2);
625 if (isPositiveEndcap) {
634 }
else if (isNegativeEndcap) {
649 const EventContext& ctx,
650 const detail::RecoTrackContainer::TrackProxy& track,
651 float&
x,
float&
y,
float&
z)
const {
659 bool foundHGTDSurface =
false;
663 track.container().trackStateContainer().visitBackwards(
665 [
this, &foundHGTDSurface, &
x, &
y, &
z, geoContext](
const auto& state) {
667 if (foundHGTDSurface || !state.hasReferenceSurface()) {
671 const auto& surface = state.referenceSurface();
672 Acts::GeometryIdentifier geoID = surface.geometryId();
677 if (state.hasPredicted()) {
679 const auto& predicted = state.predicted();
683 Acts::Vector2 localPos(predicted[Acts::eBoundLoc0], predicted[Acts::eBoundLoc1]);
686 Acts::Vector3 globalPos = surface.localToGlobal(
689 Acts::Vector3::Zero());
696 ATH_MSG_DEBUG(
"Predicted position on HGTD surface: (" <<
x <<
", " <<
y <<
", " <<
z <<
")");
697 foundHGTDSurface =
true;
700 Acts::Vector3 globalPos = surface.center(geoContext);
705 ATH_MSG_DEBUG(
"Fallback to surface center for HGTD: (" <<
x <<
", " <<
y <<
", " <<
z <<
")");
706 foundHGTDSurface =
true;
711 return foundHGTDSurface;
717 std::uint32_t volume = geoID.volume();
718 std::uint32_t layer = geoID.layer();
721 if (volume == 2 || volume == 25) {
723 if (layer == 2 || layer == 4 || layer == 6 || layer == 8) {
737 float measuredTimeErr,
738 const Acts::TrackingGeometry* ,
739 const Acts::GeometryContext& geoContext)
const {
743 if (!trackParticle || !cluster) {
745 return {measuredTime, measuredTimeErr};
749 const Acts::Surface* surface =
nullptr;
752 }
catch (
const std::exception& e) {
754 return {measuredTime, measuredTimeErr};
758 ATH_MSG_WARNING(
"Could not determine surface for HGTD cluster with id "
760 return {measuredTime, measuredTimeErr};
764 Acts::Vector3 globalHitPos;
769 globalHitPos = surface->localToGlobal(
771 Acts::Vector2(localPos[0], localPos[1]),
772 Acts::Vector3::Zero());
773 }
catch (
const std::exception& e) {
776 globalHitPos = surface->center(geoContext);
788 double d0 = trackParticle->
d0();
789 double z0 = trackParticle->
z0();
790 double phi0 = trackParticle->
phi0();
792 Amg::Vector3D trackOrigin(-d0 * std::sin(phi0), d0 * std::cos(phi0), z0);
793 ATH_MSG_DEBUG(
"Track perigee: d0=" << d0 <<
", z0=" << z0 <<
", phi0=" << phi0);
794 ATH_MSG_DEBUG(
"Track origin (perigee): (" << trackOrigin.x() <<
", "
795 << trackOrigin.y() <<
", " << trackOrigin.z() <<
")");
798 float dx = globalHitPos.x() - trackOrigin.x();
799 float dy = globalHitPos.y() - trackOrigin.y();
800 float dz = globalHitPos.z() - trackOrigin.z();
803 float distance = std::sqrt(dx*dx + dy*dy + dz*dz);
804 float tof = distance / Gaudi::Units::c_light;
807 float correctedTime = measuredTime - tof;
810 << trackOrigin.y() <<
", " << trackOrigin.z() <<
")");
812 << globalHitPos.y() <<
", " << globalHitPos.z() <<
")");
813 ATH_MSG_DEBUG(
"Distance = " << distance <<
" mm, TOF = " << tof
814 <<
" ns, Corrected time = " << correctedTime);
816 return {correctedTime, measuredTimeErr};
820 if (state.hasUncalibratedSourceLink()) {
822 assert( sl !=
nullptr);
831 ATH_MSG_DEBUG(
"Source link contains non-HGTD measurement type: " <<
static_cast<int>(clusterType));
835 if (state.hasReferenceSurface()) {
836 const auto& surface = state.referenceSurface();
837 Acts::GeometryIdentifier geoID = surface.geometryId();
841 ATH_MSG_DEBUG(
"This is an HGTD surface with ID: " << geoID.volume() <<
":" << geoID.layer());
854 Acts::Vector3 statePos = surface.center(geoContext);
858 double minDistance = 100.0;
862 const Acts::Surface* clusterSurface =
m_surfAcc.get(cluster);
864 if (!clusterSurface)
continue;
867 Acts::GeometryIdentifier clusterGeoID = clusterSurface->geometryId();
868 if (clusterGeoID.volume() == geoID.volume() && clusterGeoID.layer() == geoID.layer()) {
870 Acts::Vector3 clusterPos = clusterSurface->center(geoContext);
873 double dx = clusterPos.x() - statePos.x();
874 double dy = clusterPos.y() - statePos.y();
875 double distance = std::sqrt(dx*dx + dy*dy);
878 if (distance < minDistance) {
879 minDistance = distance;
880 closestCluster = cluster;
881 ATH_MSG_DEBUG(
"Found possible cluster match at distance " << distance <<
" mm");
886 if (closestCluster) {
887 ATH_MSG_DEBUG(
"Found closest cluster at distance " << minDistance <<
" mm");
888 return closestCluster;
895 ATH_MSG_DEBUG(
"State doesn't have uncalibrated source link");
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration.
char data[hepevt_bytes_allocation_ATLAS]
Header file to be included by clients of the Monitored infrastructure.
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
size_t size() const
Number of registered mappings.
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
bool isHGTDSurface(const Acts::GeometryIdentifier &geoID) const
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerName
StatusCode collectMeasurements(const EventContext &context, detail::TrackFindingMeasurements &measurements) const
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterRawTimeKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_numHGTDHitsKey
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
SG::ReadHandleKey< xAOD::UncalibratedMeasurementContainer > m_uncalibratedMeasurementContainerKey_HGTD
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerExtensionChi2Key
bool getExtrapolationPosition(const EventContext &ctx, const detail::RecoTrackContainer::TrackProxy &track, float &x, float &y, float &z) const
Gaudi::Property< float > m_minEtaAcceptance
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerHasExtensionKey
Acts::CombinatorialKalmanFilterOptions< detail::RecoTrackContainer > CKFOptions
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_extrapYKey
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
Acts::CalibrationContext m_calibrationContext
const Acts::Logger & logger() const
Private access to the logger.
std::pair< float, float > correctTOF(const xAOD::TrackParticle *trackParticle, const xAOD::HGTDCluster *cluster, float measuredTime, float measuredTimeErr, const Acts::TrackingGeometry *trackingGeometry, const Acts::GeometryContext &geoContext) const
std::size_t getHGTDLayerIndex(const Acts::GeometryIdentifier &geoID) const
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_actsTrackLinkKey
virtual StatusCode initialize() override
Gaudi::Property< float > m_maxEtaAcceptance
const xAOD::HGTDCluster * getHGTDClusterFromState(const EventContext &ctx, const ActsTrk::detail::RecoConstTrackStateContainerProxy &state) const
ToolHandle< ActsTrk::IPixelOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_pixelCalibTool
std::unique_ptr< detail::CKF_config > m_trackFinder
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterTimeKey
std::unique_ptr< const Acts::Logger > m_logger
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_extrapXKey
ActsTrk::detail::xAODUncalibMeasSurfAcc m_surfAcc
ToolHandle< GenericMonitoringTool > m_monTool
ToolHandle< ActsTrk::IStripOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_stripCalibTool
ToolHandle< ActsTrk::IHGTDOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_hgtdCalibTool
SG::ReadHandleKey< xAOD::HGTDClusterContainer > m_HGTDClusterContainerName
virtual StatusCode execute(const EventContext &) const override
ToolHandle< ActsTrk::TrackStatePrinterTool > m_trackStatePrinter
TrackExtensionData processTrackExtension(const EventContext &ctx, const xAOD::TrackParticle *trackParticle, const detail::RecoTrackContainer::TrackProxy &trackProxy) const
std::pair< Iterator, Iterator > range(const Acts::Surface &surface) const
Inner detector / ITk calibrator implementation used in the KalmanFilterTool.
const std::vector< std::size_t > & measurementOffsets() const
void addMeasurements(std::size_t typeIndex, const xAOD::UncalibratedMeasurementContainer &clusterContainer, const DetectorElementToActsGeometryIdMap &detectorElementToGeoid, const MeasurementIndex *measurementIndex=nullptr)
const MeasurementRangeList & measurementRanges() const
Helper class to access the Acts::surface associated with an Uncalibrated xAOD measurement.
bool msgLvl(const MSG::Level lvl) const
size_type size() const noexcept
Returns the number of elements in the collection.
ElementLink implementation for ROOT usage.
bool isValid() const
Check if the element can be found.
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
Handle class for reading a decoration on an object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
Handle class for adding a decoration to an object.
float z0() const
Returns the parameter.
float d0() const
Returns the parameter.
float phi0() const
Returns the parameter, which has range to .
DetectorIdentType identifier() const
Returns the full Identifier of the measurement.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
virtual xAOD::UncalibMeasType type() const =0
Returns the type of the measurement type as a simple enumeration.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Acts::Propagator< Stepper, Navigator > Propagator
Acts::SympyStepper Stepper
Adapted from Acts Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithmFunction....
Acts::Navigator Navigator
GenUncalibSourceLinkAccessor< MeasurementRangeList > UncalibSourceLinkAccessor
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
RecoTrackStateContainer::ConstTrackStateProxy RecoConstTrackStateContainerProxy
Acts::CombinatorialKalmanFilter< Propagator, RecoTrackContainer > CKF
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
const xAOD::UncalibratedMeasurement & getUncalibratedMeasurement(const ATLASUncalibSourceLink &source_link)
Acts::TrackStateCreator< ActsTrk::detail::UncalibSourceLinkAccessor::Iterator, detail::RecoTrackContainer > DefaultTrackStateCreator
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Matrix< double, 3, 1 > Vector3D
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
HGTDClusterContainer_v1 HGTDClusterContainer
Define the version of the HGTD cluster container.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
UncalibMeasType
Define the type of the uncalibrated measurement.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
UncalibratedMeasurementContainer_v1 UncalibratedMeasurementContainer
Define the version of the uncalibrated measurement container.
HGTDCluster_v1 HGTDCluster
Define the version of the pixel cluster class.
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
Data structure to hold HGTD track extension results Contains information about hits,...
std::vector< float > chi2Vec
Chi2 contribution per HGTD layer.
std::vector< bool > hasClusterVec
Whether track has cluster in each HGTD layer.
std::vector< float > timeVec
TOF-corrected time per HGTD layer.
float extrapY
Extrapolated Y position at HGTD.
float extrapX
Extrapolated X position at HGTD.
std::vector< float > rawTimeVec
Raw measured time per HGTD layer.
int numHGTDHits
Total number of HGTD hits on extended track.