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();
239 defaultTrackStateCreator.sourceLinkAccessor = slAccessorDelegate;
240 defaultTrackStateCreator.calibrator.template connect<&detail::OnTrackCalibrator<detail::RecoTrackStateContainer>::calibrate>(&calibrator);
242 options.extensions.createTrackStates.template connect<
243 &DefaultTrackStateCreator::createTrackStates>(&defaultTrackStateCreator);
255 if (!link_to_track.
isValid()) {
256 ATH_MSG_ERROR(
"Invalid ACTS track link for TrackParticle " << trackParticle->index());
257 return StatusCode::FAILURE;
260 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = *link_to_track;
261 if (!optional_track.has_value()) {
262 ATH_MSG_ERROR(
"No valid ACTS track associated with TrackParticle " << trackParticle->index());
263 return StatusCode::FAILURE;
266 const ActsTrk::TrackContainer::ConstTrackProxy& track = optional_track.value();
268 Acts::VectorTrackContainer trackBackend;
269 Acts::VectorMultiTrajectory trackStateBackend;
273 float trackEta = Acts::VectorHelpers::eta(track.momentum());
280 <<
"], skipping extension ------ !!!!!");
283 layerHasExtensionHandle(*trackParticle) = trackData.
hasClusterVec;
284 layerExtensionChi2Handle(*trackParticle) = trackData.
chi2Vec;
285 layerClusterRawTimeHandle(*trackParticle) = trackData.
rawTimeVec;
286 layerClusterTimeHandle(*trackParticle) = trackData.
timeVec;
287 extrapXHandle(*trackParticle) = trackData.
extrapX;
288 extrapYHandle(*trackParticle) = trackData.
extrapY;
289 numHGTDHitsHandle(*trackParticle) = trackData.
numHGTDHits;
294 float trackpT = track.transverseMomentum();
295 float trackPhi = track.phi();
296 float trackNmeasurements = track.nMeasurements();
298 ATH_MSG_DEBUG(
"TrackParticle " << trackParticle->index() <<
" has ACTS track with eta: " << trackEta <<
", phi = " << trackPhi <<
" pT: " << trackpT <<
" and nMeasurements: " << trackNmeasurements);
301 const auto lastMeasurementState = Acts::findLastMeasurementState(track);
302 if (not lastMeasurementState.ok()) {
303 ATH_MSG_ERROR(
"Problem finding last measurement state for acts track");
304 return StatusCode::FAILURE;
306 const Acts::BoundTrackParameters lastMeasurementStateParameters = track.createParametersFromState(*lastMeasurementState);
309 const Acts::Surface& refSurface = track.referenceSurface();
310 const Acts::BoundTrackParameters parametersAtRefSurface(refSurface.getSharedPtr(),
313 track.particleHypothesis());
315 ATH_MSG_DEBUG(
"Initial track parameters for extension - lastMeasurementStateParameters:");
316 ATH_MSG_DEBUG(
" - eta: " << -1 * log(tan(lastMeasurementStateParameters.theta() * 0.5)));
317 ATH_MSG_DEBUG(
" - phi: " << lastMeasurementStateParameters.phi());
318 ATH_MSG_DEBUG(
" - pT: " << std::abs(1./lastMeasurementStateParameters.qOverP() * std::sin(lastMeasurementStateParameters.theta())));
319 ATH_MSG_DEBUG(
" - theta: " << lastMeasurementStateParameters.theta());
320 ATH_MSG_DEBUG(
" - qOverP: " << lastMeasurementStateParameters.qOverP());
321 ATH_MSG_DEBUG(
" - covariance exists: " << (lastMeasurementStateParameters.covariance().has_value() ?
"yes" :
"no"));
324 auto result =
m_trackFinder->ckf.findTracks(lastMeasurementStateParameters, options,tracksContainerTemp);
326 ATH_MSG_DEBUG(
"Built " << tracksContainerTemp.size() <<
" tracks from it");
328 for (
const detail::RecoTrackContainer::TrackProxy trackProxy : tracksContainerTemp) {
333 layerHasExtensionHandle(*trackParticle) = trackData.
hasClusterVec;
334 layerExtensionChi2Handle(*trackParticle) = trackData.
chi2Vec;
335 layerClusterRawTimeHandle(*trackParticle) = trackData.
rawTimeVec;
336 layerClusterTimeHandle(*trackParticle) = trackData.
timeVec;
337 extrapXHandle(*trackParticle) = trackData.
extrapX;
338 extrapYHandle(*trackParticle) = trackData.
extrapY;
339 numHGTDHitsHandle(*trackParticle) = trackData.
numHGTDHits;
343 return StatusCode::SUCCESS;
355 ATH_MSG_DEBUG(
"Measurements (HGTD only) size: " << HGTDClustersHandle->size());
365 const Acts::Surface* surface =
m_surfAcc.get(cluster);
366 if (not surface)
continue;
371 auto localPosition = cluster->localPosition<3>();
372 double clusterTime = localPosition[2];
381 mon_cluster_x, mon_cluster_y, mon_cluster_z,
390 return StatusCode::SUCCESS;
394 const EventContext& ctx,
396 const detail::RecoTrackContainer::TrackProxy& trackProxy)
const {
408 std::size_t nMeasurements = 0;
409 std::size_t nHoles = 0;
410 std::size_t nOutliers = 0;
411 std::size_t nHGTDHits = 0;
413 std::vector<bool> hasHitInLayer = {
false,
false,
false,
false};
414 std::vector<float> chi2PerLayer = {0.0, 0.0, 0.0, 0.0};
415 std::vector<float> timePerLayer = {0.0, 0.0, 0.0, 0.0};
416 std::vector<float> rawTimePerLayer = {0.0, 0.0, 0.0, 0.0};
418 std::vector<int> truthClassPerLayer = {-1, -1, -1, -1};
419 std::vector<bool> isShadowedPerLayer = {
false,
false,
false,
false};
420 std::vector<bool> isMergedPerLayer = {
false,
false,
false,
false};
421 std::vector<bool> primaryExpectedPerLayer = {
false,
false,
false,
false};
427 bool foundExtrapolation =
false;
429 trackProxy.container().trackStateContainer().visitBackwards(
430 trackProxy.tipIndex(),
431 [&](
const auto& state) {
432 auto flags = state.typeFlags();
433 if (flags.isHole()) {
435 }
else if (flags.isOutlier()) {
437 }
else if (flags.isMeasurement()) {
442 const auto& surface = state.referenceSurface();
443 Acts::GeometryIdentifier geoID = surface.geometryId();
445 if (isHGTDSurface(geoID)) {
446 std::size_t layerIndex = getHGTDLayerIndex(geoID);
448 const auto& calibrated = state.template calibrated<3>();
449 const auto& predicted = state.predicted();
450 const auto& calibCov = state.template calibratedCovariance<3>();
454 Eigen::Vector2d residual2d;
455 residual2d(0) = calibrated(0) - predicted(Acts::eBoundLoc0);
456 residual2d(1) = calibrated(1) - predicted(Acts::eBoundLoc1);
459 AmgSymMatrix(2) cov_2d{calibCov.template block<2,2>(0,0)};
462 const auto& predictedCov = state.predictedCovariance();
463 AmgSymMatrix(2) predicted_cov_2d{predictedCov.template block<2,2>(0,0)};
466 AmgSymMatrix(2) residual_cov = cov_2d + predicted_cov_2d;
472 if (residual_cov.determinant() != 0)
474 chi2 = residual2d.transpose() * residual_cov.inverse() * residual2d;
481 if (layerIndex < 4) {
483 hasHitInLayer[layerIndex] = true;
484 chi2PerLayer[layerIndex] =chi2/ndf;
488 float rawTime = 0.0f;
489 float calibratedTime = 0.0f;
491 if (state.hasCalibrated()) {
494 const auto& calibrated = state.template calibrated<3>();
495 calibratedTime = static_cast<float>(calibrated(2));
496 ATH_MSG_DEBUG(
"Got time from calibrated<3>: " << calibratedTime);
497 } catch (const std::exception& e) {
498 ATH_MSG_WARNING(
"Failed to extract time from calibrated<3>: " << e.what());
504 const xAOD::HGTDCluster* cluster = getHGTDClusterFromState(state);
507 auto localPos = cluster->localPosition<3>();
508 rawTime = static_cast<float>(localPos[2]);
509 ATH_MSG_DEBUG(
"Got raw time from cluster local position: " << rawTime);
511 ATH_MSG_WARNING(
"Could not get cluster from state");
515 rawTimePerLayer[layerIndex] = rawTime;
519 auto [correctedTime, timeErr] = correctTOF(
524 acts_tracking_geometry,
526 timePerLayer[layerIndex] = correctedTime;
527 ATH_MSG_DEBUG(
"Applied TOF correction: " << calibratedTime <<
" -> " << correctedTime);
530 timePerLayer[layerIndex] = calibratedTime;
531 ATH_MSG_DEBUG(
"No cluster found for TOF correction, using calibrated time: " << calibratedTime);
536 ATH_MSG_DEBUG(
"State does not have calibrated data");
540 if (!foundExtrapolation) {
541 foundExtrapolation = true;
542 if (state.hasPredicted()) {
544 const auto& predicted = state.predicted();
545 Acts::Vector2 localPos(predicted[Acts::eBoundLoc0], predicted[Acts::eBoundLoc1]);
548 Acts::Vector3 globalPos = surface.localToGlobal(
551 Acts::Vector3::Zero());
553 extrapX = globalPos.x();
554 extrapY = globalPos.y();
555 extrapZ = globalPos.z();
557 ATH_MSG_DEBUG(
"Extrapolated position (predicted) at HGTD: x=" << extrapX
558 <<
", y=" << extrapY <<
", z=" << extrapZ);
561 Acts::Vector3 globalPos = surface.center(geoContext);
562 extrapX = globalPos.x();
563 extrapY = globalPos.y();
564 extrapZ = globalPos.z();
566 ATH_MSG_DEBUG(
"Extrapolated position (surface center) at HGTD: x=" << extrapX
567 <<
", y=" << extrapY <<
", z=" << extrapZ);
571 ATH_MSG_DEBUG(
"Found HGTD hit on layer " << layerIndex
572 <<
", chi2=" << chi2PerLayer[layerIndex]
573 <<
", time=" << timePerLayer[layerIndex]);
583 if (nHGTDHits == 0 && !foundExtrapolation) {
586 if (getExtrapolationPosition(ctx, trackProxy, extrapX, extrapY, extrapZ)) {
587 ATH_MSG_DEBUG(
"!!! Didn't find any HGTD hits but calculated extrapolation position: x=" << extrapX
588 <<
", y=" << extrapY <<
", z=" << extrapZ);
589 foundExtrapolation =
true;
594 <<
" nMeasurements=" << nMeasurements
595 <<
" nHGTDHits=" << nHGTDHits
596 <<
" nHoles=" << nHoles
597 <<
" nOutliers=" << nOutliers
598 <<
" extrapolation found: " << (foundExtrapolation ?
"yes" :
"no"));
602 data.hasClusterVec = std::move(hasHitInLayer);
603 data.chi2Vec = std::move(chi2PerLayer);
604 data.timeVec = std::move(timePerLayer);
605 data.rawTimeVec = std::move(rawTimePerLayer);
606 data.extrapX = extrapX;
607 data.extrapY = extrapY;
608 data.extrapZ = extrapZ;
609 data.numHGTDHits = nHGTDHits;
616 std::uint32_t volume = geoID.volume();
617 std::uint32_t layer = geoID.layer();
620 bool isPositiveEndcap = (volume == 25);
621 bool isNegativeEndcap = (volume == 2);
624 if (isPositiveEndcap) {
633 }
else if (isNegativeEndcap) {
648 const EventContext& ctx,
649 const detail::RecoTrackContainer::TrackProxy& track,
650 float&
x,
float&
y,
float&
z)
const {
658 bool foundHGTDSurface =
false;
662 track.container().trackStateContainer().visitBackwards(
664 [
this, &foundHGTDSurface, &
x, &
y, &
z, geoContext](
const auto& state) {
666 if (foundHGTDSurface || !state.hasReferenceSurface()) {
670 const auto& surface = state.referenceSurface();
671 Acts::GeometryIdentifier geoID = surface.geometryId();
676 if (state.hasPredicted()) {
678 const auto& predicted = state.predicted();
682 Acts::Vector2 localPos(predicted[Acts::eBoundLoc0], predicted[Acts::eBoundLoc1]);
685 Acts::Vector3 globalPos = surface.localToGlobal(
688 Acts::Vector3::Zero());
695 ATH_MSG_DEBUG(
"Predicted position on HGTD surface: (" <<
x <<
", " <<
y <<
", " <<
z <<
")");
696 foundHGTDSurface =
true;
699 Acts::Vector3 globalPos = surface.center(geoContext);
704 ATH_MSG_DEBUG(
"Fallback to surface center for HGTD: (" <<
x <<
", " <<
y <<
", " <<
z <<
")");
705 foundHGTDSurface =
true;
710 return foundHGTDSurface;
716 std::uint32_t volume = geoID.volume();
717 std::uint32_t layer = geoID.layer();
720 if (volume == 2 || volume == 25) {
722 if (layer == 2 || layer == 4 || layer == 6 || layer == 8) {
736 float measuredTimeErr,
737 const Acts::TrackingGeometry* ,
738 const Acts::GeometryContext& geoContext)
const {
742 if (!trackParticle || !cluster) {
744 return {measuredTime, measuredTimeErr};
748 const Acts::Surface* surface =
nullptr;
751 }
catch (
const std::exception& e) {
753 return {measuredTime, measuredTimeErr};
757 ATH_MSG_WARNING(
"Could not determine surface for HGTD cluster with id "
759 return {measuredTime, measuredTimeErr};
763 Acts::Vector3 globalHitPos;
768 globalHitPos = surface->localToGlobal(
770 Acts::Vector2(localPos[0], localPos[1]),
771 Acts::Vector3::Zero());
772 }
catch (
const std::exception& e) {
775 globalHitPos = surface->center(geoContext);
787 double d0 = trackParticle->
d0();
788 double z0 = trackParticle->
z0();
789 double phi0 = trackParticle->
phi0();
791 Amg::Vector3D trackOrigin(-d0 * std::sin(phi0), d0 * std::cos(phi0), z0);
792 ATH_MSG_DEBUG(
"Track perigee: d0=" << d0 <<
", z0=" << z0 <<
", phi0=" << phi0);
793 ATH_MSG_DEBUG(
"Track origin (perigee): (" << trackOrigin.x() <<
", "
794 << trackOrigin.y() <<
", " << trackOrigin.z() <<
")");
797 float dx = globalHitPos.x() - trackOrigin.x();
798 float dy = globalHitPos.y() - trackOrigin.y();
799 float dz = globalHitPos.z() - trackOrigin.z();
802 float distance = std::sqrt(dx*dx + dy*dy + dz*dz);
803 float tof = distance / Gaudi::Units::c_light;
806 float correctedTime = measuredTime - tof;
809 << trackOrigin.y() <<
", " << trackOrigin.z() <<
")");
811 << globalHitPos.y() <<
", " << globalHitPos.z() <<
")");
812 ATH_MSG_DEBUG(
"Distance = " << distance <<
" mm, TOF = " << tof
813 <<
" ns, Corrected time = " << correctedTime);
815 return {correctedTime, measuredTimeErr};
819 if (state.hasUncalibratedSourceLink()) {
821 assert( sl !=
nullptr);
830 ATH_MSG_DEBUG(
"Source link contains non-HGTD measurement type: " <<
static_cast<int>(clusterType));
834 if (state.hasReferenceSurface()) {
835 const auto& surface = state.referenceSurface();
836 Acts::GeometryIdentifier geoID = surface.geometryId();
840 ATH_MSG_DEBUG(
"This is an HGTD surface with ID: " << geoID.volume() <<
":" << geoID.layer());
843 EventContext ctx = Gaudi::Hive::currentContext();
856 Acts::Vector3 statePos = surface.center(geoContext);
860 double minDistance = 100.0;
864 const Acts::Surface* clusterSurface =
m_surfAcc.get(cluster);
866 if (!clusterSurface)
continue;
869 Acts::GeometryIdentifier clusterGeoID = clusterSurface->geometryId();
870 if (clusterGeoID.volume() == geoID.volume() && clusterGeoID.layer() == geoID.layer()) {
872 Acts::Vector3 clusterPos = clusterSurface->center(geoContext);
875 double dx = clusterPos.x() - statePos.x();
876 double dy = clusterPos.y() - statePos.y();
877 double distance = std::sqrt(dx*dx + dy*dy);
880 if (distance < minDistance) {
881 minDistance = distance;
882 closestCluster = cluster;
883 ATH_MSG_DEBUG(
"Found possible cluster match at distance " << distance <<
" mm");
888 if (closestCluster) {
889 ATH_MSG_DEBUG(
"Found closest cluster at distance " << minDistance <<
" mm");
890 return closestCluster;
897 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-2025 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.
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
ToolHandle< ActsTrk::IOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_stripCalibTool
ToolHandle< ActsTrk::IOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_hgtdCalibTool
Gaudi::Property< float > m_maxEtaAcceptance
std::unique_ptr< detail::CKF_config > m_trackFinder
const xAOD::HGTDCluster * getHGTDClusterFromState(const ActsTrk::detail::RecoConstTrackStateContainerProxy &state) const
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
SG::ReadHandleKey< xAOD::HGTDClusterContainer > m_HGTDClusterContainerName
ToolHandle< ActsTrk::IOnTrackCalibratorTool< detail::RecoTrackStateContainer > > m_pixelCalibTool
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
Test to see if the link can be dereferenced.
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.