41#include "Acts/TrackFinding/TrackStateCreator.hpp"
42#include "Acts/Surfaces/PlaneSurface.hpp"
43#include "Acts/Surfaces/RectangleBounds.hpp"
44#include "Acts/Utilities/VectorHelpers.hpp"
49#include "GaudiKernel/PhysicalConstants.h"
68 template <
typename propagator_state_t,
typename stepper_t,
70 Acts::Result<void> act(propagator_state_t& state,
const stepper_t& ,
71 const navigator_t& navigator, result_type& result,
72 const Acts::Logger& )
const {
73 const Acts::Surface* currentSurface = navigator.currentSurface(state.navigation);
74 if (currentSurface ==
nullptr) {
75 return Acts::Result<void>::success();
78 assert(result !=
nullptr &&
"Result type is nullptr");
80 if (currentSurface->surfacePlacement() !=
nullptr) {
81 const auto* detElem =
dynamic_cast<const ActsDetectorElement*
>(currentSurface->surfacePlacement());
82 if(detElem !=
nullptr) {
87 return Acts::Result<void>::success();
120 return StatusCode::SUCCESS;
159 std::vector<const xAOD::UncalibratedMeasurementContainer *> uncalibratedMeasurementContainers;
160 std::size_t total_measurements = 0;
165 for (std::size_t icontainer = 0; icontainer < uncalibratedMeasurementContainers.size(); ++icontainer) {
166 measurementIndex.
addMeasurements(*uncalibratedMeasurementContainers[icontainer]);
170 for (std::size_t icontainer = 0; icontainer < uncalibratedMeasurementContainers.size(); ++icontainer) {
171 ATH_MSG_DEBUG(
"Create " << uncalibratedMeasurementContainers[icontainer]->
size() <<
174 *uncalibratedMeasurementContainers[icontainer],
191 event_stat.resize(m_stat.size());
200 Acts::VectorTrackContainer actsTrackBackend;
201 Acts::VectorMultiTrajectory actsTrackStateBackend;
203 auto atomicMax=[](std::size_t new_val, std::atomic<std::size_t> &dest) ->
void {
204 std::size_t is_value;
207 if (is_value>=new_val)
return;
208 }
while (!dest.compare_exchange_weak(is_value, new_val));
210 atomicMax(actsTrackBackend.size(), m_nTrackReserve);
211 atomicMax(actsTrackStateBackend.size(), m_nTrackStateReserve);
214 actsTrackStateBackend);
221 int extension_index{0};
223 std::unordered_map<uint32_t, uint32_t> extensions;
228 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track =
getActsTrack(*trackParticle);
229 if (!optional_track.has_value()) {
230 ATH_MSG_ERROR(
"No valid ACTS track associated with TrackParticle " << trackParticle->index());
231 return StatusCode::FAILURE;
234 const ActsTrk::TrackContainer::ConstTrackProxy& track = optional_track.value();
237 float trackEta = Acts::VectorHelpers::eta(track.momentum());
243 <<
"], skipping extension ------ !!!!!");
248 layerHasExtensionHandle(*trackParticle) = trackData.
hasClusterVec;
249 layerExtensionChi2Handle(*trackParticle) = trackData.
chi2Vec;
250 layerClusterRawTimeHandle(*trackParticle) = trackData.
rawTimeVec;
251 layerClusterTimeHandle(*trackParticle) = trackData.
timeVec;
252 extrapXHandle(*trackParticle) = trackData.
extrapX;
253 extrapYHandle(*trackParticle) = trackData.
extrapY;
254 numHGTDHitsHandle(*trackParticle) = trackData.
numHGTDHits;
259 float trackpT = track.transverseMomentum();
260 float trackPhi = track.phi();
261 float trackNmeasurements = track.nMeasurements();
264 " has ACTS track with eta: " << trackEta <<
265 ", phi: " << trackPhi <<
266 ", pT: " << trackpT <<
267 " and nMeasurements: " << trackNmeasurements);
272 ATH_MSG_ERROR(
"Problem finding last measurement state for acts track");
273 return StatusCode::FAILURE;
275 const Acts::BoundTrackParameters lastMeasurementStateParameters = track.createParametersFromState(*
lastMeasurementState);
278 const Acts::Surface& refSurface = track.referenceSurface();
279 const Acts::BoundTrackParameters parametersAtRefSurface(refSurface.getSharedPtr(),
282 track.particleHypothesis());
284 ATH_MSG_DEBUG(
"Initial track parameters for extension - lastMeasurementStateParameters:");
285 ATH_MSG_DEBUG(
" - eta: " << -1 * log(tan(lastMeasurementStateParameters.theta() * 0.5)));
286 ATH_MSG_DEBUG(
" - phi: " << lastMeasurementStateParameters.phi());
287 ATH_MSG_DEBUG(
" - pT: " << std::abs(1./lastMeasurementStateParameters.qOverP() * std::sin(lastMeasurementStateParameters.theta())));
288 ATH_MSG_DEBUG(
" - theta: " << lastMeasurementStateParameters.theta());
289 ATH_MSG_DEBUG(
" - qOverP: " << lastMeasurementStateParameters.qOverP());
290 ATH_MSG_DEBUG(
" - covariance exists: " << (lastMeasurementStateParameters.covariance().has_value() ?
"yes" :
"no"));
294 Acts::VectorTrackContainer trackBackend;
295 Acts::VectorMultiTrajectory trackStateBackend;
307 lastMeasurementStateParameters,
314 const detail::RecoTrackContainer::TrackProxy& trackProxy = tracksContainerTemp.at(extension_index);
316 extensions.insert(std::make_pair(trackParticle->index(), actsTracksContainer.size() - 1));
324 layerHasExtensionHandle(*trackParticle) = trackData.
hasClusterVec;
325 layerExtensionChi2Handle(*trackParticle) = trackData.
chi2Vec;
326 layerClusterRawTimeHandle(*trackParticle) = trackData.
rawTimeVec;
327 layerClusterTimeHandle(*trackParticle) = trackData.
timeVec;
328 extrapXHandle(*trackParticle) = trackData.
extrapX;
329 extrapYHandle(*trackParticle) = trackData.
extrapY;
330 numHGTDHitsHandle(*trackParticle) = trackData.
numHGTDHits;
337 ATH_MSG_DEBUG(
" \\__ Found " << actsTracksContainer.size() <<
" extensions");
340 if (actsTrackBackend.size() > m_nTrackReserve) {
341 m_nTrackReserve =
static_cast<std::size_t
>( std::ceil(
m_memorySafetyMargin * actsTrackBackend.size()) );
343 if (actsTrackStateBackend.size() > m_nTrackStateReserve) {
344 m_nTrackStateReserve =
static_cast<std::size_t
>( std::ceil(
m_memorySafetyMargin * actsTrackStateBackend.size()) );
348 Acts::ConstVectorTrackContainer constTrackBackend( std::move(actsTrackBackend) );
349 Acts::ConstVectorMultiTrajectory constTrackStateBackend( std::move(actsTrackStateBackend) );
350 std::unique_ptr< ActsTrk::TrackContainer> constTracksContainer = std::make_unique< ActsTrk::TrackContainer >( std::move(constTrackBackend),
351 std::move(constTrackStateBackend) );
356 ATH_CHECK(trackContainerHandle.
record(std::move(constTracksContainer)));
360 for (
const std::pair< const uint32_t,uint32_t> &ext : extensions) {
362 hgtdTrackLink(*trackParticles->
at(ext.first))
368 return StatusCode::SUCCESS;
372 const EventContext &ctx,
376 const Acts::BoundTrackParameters initialParameters,
380 const Acts::Surface& refSurface,
381 int& extension_index)
const{
384 auto [options, secondOptions, measurementSelector] =
getDefaultOptions(ctx, detContext, measurements,
nullptr);
387 std::size_t category_i = 0;
389 auto stopBranchProxy = [&](
const detail::RecoTrackContainer::TrackProxy &track,
391 return stopBranch(track, trackState, trackSelectorCfg, detContext.
geometry, measurementIndex, 0, event_stat[category_i]);
393 options.extensions.branchStopper.connect(stopBranchProxy);
395 Acts::PropagatorOptions<detail::Stepper::Options, detail::Navigator::Options,
396 Acts::ActorList<Acts::MaterialInteractor>>
399 Acts::TrackExtrapolationStrategy extrapolationStrategy =
400 Acts::TrackExtrapolationStrategy::first;
403 Acts::Result<std::vector<TrkProxy> > result =
404 trackFinder().
ckf.findTracks(initialParameters, options, tracksContainerTemp);
407 if (not result.ok()) {
412 ATH_MSG_DEBUG(
"Built " << tracksContainerTemp.size() <<
" extensions from it");
413 auto &foundTracks = result.value();
416 int best_track_index = -1;
417 float best_track_chi2 = 1000;
418 TrkProxy &best_track_proxy = foundTracks.at(0);
420 for (
TrkProxy &firstTrack : foundTracks) {
421 if((firstTrack.chi2() > 0) and (firstTrack.chi2() < best_track_chi2)){
422 best_track_index = firstTrack.index();
423 best_track_chi2 = firstTrack.chi2();
424 best_track_proxy = firstTrack;
428 if(best_track_index == -1)
return false;
430 ATH_MSG_DEBUG(
"Best extension index " << best_track_proxy.index() <<
431 " nMeas " << best_track_proxy.nMeasurements() <<
432 " chi2 " << best_track_proxy.chi2());
437 extrapolationStrategy,
440 tracksContainerTemp)){
442 extension_index = best_track_index;
453 const EventContext& ctx,
455 const detail::RecoTrackContainer::TrackProxy& trackProxy,
463 Acts::GeometryContext geoContext =
m_ctxProvider.getGeometryContext(ctx);
464 const Acts::TrackingGeometry* acts_tracking_geometry =
m_trackingGeometrySvc->trackingGeometry().get();
468 std::size_t nMeasurements = 0;
469 std::size_t nHoles = 0;
470 std::size_t nOutliers = 0;
471 std::size_t nHGTDHits = 0;
473 std::vector<char> hasHitInLayer = {
false,
false,
false,
false};
474 std::vector<float> chi2PerLayer = {-1.0, -1.0, -1.0, -1.0};
475 std::vector<float> timePerLayer = {-1.0, -1.0, -1.0, -1.0};
476 std::vector<float> rawTimePerLayer = {-1.0, -1.0, -1.0, -1.0};
482 bool foundExtrapolation =
false;
484 for (
auto state : trackProxy.trackStatesReversed()) {
485 auto flags = state.typeFlags();
486 if (flags.isHole()) {
488 }
else if (flags.isOutlier()) {
490 }
else if (flags.isMeasurement()) {
494 const auto& surface = state.referenceSurface();
495 Acts::GeometryIdentifier geoID = surface.geometryId();
499 if (layerIndex != 99) {
501 const auto& calibrated = state.template calibrated<3>();
502 const auto& predicted = state.predicted();
503 const auto& calibCov = state.template calibratedCovariance<3>();
505 Eigen::Vector2d residual2d;
506 residual2d(0) = calibrated(0) - predicted(Acts::eBoundLoc0);
507 residual2d(1) = calibrated(1) - predicted(Acts::eBoundLoc1);
510 AmgSymMatrix(2) cov_2d{calibCov.template block<2,2>(0,0)};
513 const auto& predictedCov = state.predictedCovariance();
514 AmgSymMatrix(2) predicted_cov_2d{predictedCov.template block<2,2>(0,0)};
517 AmgSymMatrix(2) residual_cov = cov_2d + predicted_cov_2d;
521 if (residual_cov.determinant() != 0) {
522 chi2 = residual2d.transpose() * residual_cov.inverse() * residual2d;
528 if (layerIndex < 4) {
530 hasHitInLayer[layerIndex] =
true;
531 chi2PerLayer[layerIndex] =
chi2/ndf;
534 float rawTime = 0.0f;
535 float calibratedTime = 0.0f;
537 if (state.hasCalibrated()) {
540 const auto& calibrated = state.template calibrated<3>();
542 ATH_MSG_DEBUG(
"Got time from calibrated<3>: " << calibratedTime);
543 }
catch (
const std::exception& e) {
544 ATH_MSG_WARNING(
"Failed to extract time from calibrated<3>: " << e.what());
552 rawTime = cluster->
time();
559 rawTimePerLayer[layerIndex] = calibratedTime;
566 acts_tracking_geometry,
568 timePerLayer[layerIndex] = correctedTime;
569 ATH_MSG_DEBUG(
"Applied TOF correction: " << calibratedTime <<
" -> " << correctedTime);
572 timePerLayer[layerIndex] = calibratedTime;
573 ATH_MSG_DEBUG(
"No cluster found for TOF correction, using calibrated time: " << calibratedTime);
581 if (!foundExtrapolation) {
582 foundExtrapolation =
true;
583 if (state.hasPredicted()) {
585 const auto& predicted = state.predicted();
586 Acts::Vector2 localPos(predicted[Acts::eBoundLoc0], predicted[Acts::eBoundLoc1]);
589 Acts::Vector3 globalPos = surface.localToGlobal(
592 Acts::Vector3::Zero());
594 extrapX = globalPos.x();
595 extrapY = globalPos.y();
596 extrapZ = globalPos.z();
598 ATH_MSG_DEBUG(
"Extrapolated position (predicted) at HGTD: x=" << extrapX
599 <<
", y=" << extrapY <<
", z=" << extrapZ);
602 Acts::Vector3 globalPos = surface.center(geoContext);
603 extrapX = globalPos.x();
604 extrapY = globalPos.y();
605 extrapZ = globalPos.z();
607 ATH_MSG_DEBUG(
"Extrapolated position (surface center) at HGTD: x=" << extrapX
608 <<
", y=" << extrapY <<
", z=" << extrapZ);
612 <<
", chi2=" << chi2PerLayer[layerIndex]
613 <<
", time=" << timePerLayer[layerIndex]);
619 <<
" nMeasurements=" << nMeasurements
620 <<
" nHGTDHits=" << nHGTDHits
621 <<
" nHoles=" << nHoles
622 <<
" nOutliers=" << nOutliers
623 <<
" extrapolation found: " << (foundExtrapolation ?
"yes" :
"no"));
627 data.hasClusterVec = std::move(hasHitInLayer);
628 data.chi2Vec = std::move(chi2PerLayer);
629 data.timeVec = std::move(timePerLayer);
630 data.rawTimeVec = std::move(rawTimePerLayer);
631 data.extrapX = extrapX;
632 data.extrapY = extrapY;
633 data.extrapZ = extrapZ;
634 data.numHGTDHits = nHGTDHits;
641 std::uint32_t volume = geoID.volume();
642 std::uint32_t layer = geoID.layer();
645 bool isPositiveEndcap = (volume == 25);
646 bool isNegativeEndcap = (volume == 2);
649 if (isPositiveEndcap) {
658 }
else if (isNegativeEndcap) {
676 float measuredTimeErr,
677 const Acts::TrackingGeometry*,
678 const Acts::GeometryContext& geoContext)
const {
682 if (!trackParticle || !cluster) {
684 return {measuredTime, measuredTimeErr};
688 const Acts::Surface* surface =
nullptr;
691 }
catch (
const std::exception& e) {
693 return {measuredTime, measuredTimeErr};
697 ATH_MSG_WARNING(
"Could not determine surface for HGTD cluster with id "
699 return {measuredTime, measuredTimeErr};
703 Acts::Vector3 globalHitPos;
708 globalHitPos = surface->localToGlobal(
710 Acts::Vector2(localPos[0], localPos[1]),
711 Acts::Vector3::Zero());
712 }
catch (
const std::exception& e) {
715 globalHitPos = surface->center(geoContext);
728 double d0 = trackParticle->
d0();
729 double z0 = trackParticle->
z0();
730 double phi0 = trackParticle->
phi0();
732 Amg::Vector3D trackOrigin(-d0 * std::sin(phi0), d0 * std::cos(phi0), z0);
733 ATH_MSG_DEBUG(
"Track perigee: d0=" << d0 <<
", z0=" << z0 <<
", phi0=" << phi0);
734 ATH_MSG_DEBUG(
"Track origin (perigee): (" << trackOrigin.x() <<
", "
735 << trackOrigin.y() <<
", " << trackOrigin.z() <<
")");
738 float dx = globalHitPos.x() - trackOrigin.x();
739 float dy = globalHitPos.y() - trackOrigin.y();
740 float dz = globalHitPos.z() - trackOrigin.z();
743 float distance = std::sqrt(dx*dx + dy*dy + dz*dz);
744 float tof = distance / Gaudi::Units::c_light;
747 float correctedTime = measuredTime - tof;
750 << trackOrigin.y() <<
", " << trackOrigin.z() <<
")");
752 << globalHitPos.y() <<
", " << globalHitPos.z() <<
")");
753 ATH_MSG_DEBUG(
"Distance = " << distance <<
" mm, TOF = " << tof
754 <<
" ns, Corrected time = " << correctedTime);
756 return {correctedTime, measuredTimeErr};
760 const EventContext& ctx,
764 if (state.hasUncalibratedSourceLink()) {
766 assert( uncalib_cluster !=
nullptr);
775 ATH_MSG_DEBUG(
"Source link contains non-HGTD measurement type: " <<
static_cast<int>(clusterType));
779 if (state.hasReferenceSurface()) {
780 const auto& surface = state.referenceSurface();
781 Acts::GeometryIdentifier geoID = surface.geometryId();
787 ATH_MSG_DEBUG(
"This is an HGTD surface with ID: " << geoID.volume() <<
":" << geoID.layer());
792 const Acts::GeometryContext& geoContext =
m_ctxProvider.getGeometryContext(ctx);
793 Acts::Vector3 statePos = surface.center(geoContext);
797 double minDistance = 100.0;
801 const Acts::Surface* clusterSurface =
m_surfAcc.get(cluster);
803 if (!clusterSurface)
continue;
806 Acts::GeometryIdentifier clusterGeoID = clusterSurface->geometryId();
807 if (clusterGeoID.volume() == geoID.volume() && clusterGeoID.layer() == geoID.layer()) {
809 Acts::Vector3 clusterPos = clusterSurface->center(geoContext);
812 double dx = clusterPos.x() - statePos.x();
813 double dy = clusterPos.y() - statePos.y();
814 double distance = std::sqrt(dx*dx + dy*dy);
817 if (distance < minDistance) {
818 minDistance = distance;
819 closestCluster = cluster;
820 ATH_MSG_DEBUG(
"Found possible cluster match at distance " << distance <<
" mm");
825 if (closestCluster) {
826 ATH_MSG_DEBUG(
"Found closest cluster at distance " << minDistance <<
" mm");
827 return closestCluster;
835 ATH_MSG_DEBUG(
"State doesn't have uncalibrated source link");
842 const Acts::Surface& refSurface,
843 const Acts::TrackExtrapolationStrategy& extrapolationStrategy,
848 std::array<unsigned int, 4> expectedLayerPattern{};
853 if (not track.hasReferenceSurface()) {
854 auto extrapolationResult =
858 extrapolationStrategy,
859 expectedLayerPattern);
860 if (not extrapolationResult.ok()) {
863 <<
" failed with error " << extrapolationResult.error()
864 <<
" dropping track candidate.");
870 for(
const auto ts : track.trackStatesReversed()) {
872 if(detElem !=
nullptr) {
881 Acts::trimTrack(track,
true,
true,
true,
true);
882 Acts::calculateTrackQuantities(track);
885 for (
const auto trackState : track.trackStatesReversed()) {
893 if ( not
trackFinder().trackSelector.isValidTrack(track)) {
894 ATH_MSG_WARNING(
"Track " << track.index() <<
" failed track selection");
901 auto actsDestProxy = actsTracksContainer.makeTrack();
902 actsDestProxy.copyFrom(track);
905 ATH_MSG_DEBUG(
"Added Track " << track.index() <<
" into container");
912 const Acts::Surface &referenceSurface,
914 Acts::TrackExtrapolationStrategy strategy,
917 Acts::PropagatorOptions<detail::Stepper::Options, detail::Navigator::Options,
918 Acts::ActorList<Acts::MaterialInteractor, Collector>>
921 auto findResult = findTrackStateForExtrapolation(
922 options.geoContext, track, referenceSurface, strategy,
logger());
924 if (!findResult.ok()) {
926 return findResult.error();
929 auto &[trackState, distance] = *findResult;
931 options.direction = Acts::Direction::fromScalarZeroAsPositive(distance);
933 Acts::BoundTrackParameters parameters = track.createParametersFromState(trackState);
934 ATH_MSG_VERBOSE(
"Extrapolating track to reference surface at distance "
935 << distance <<
" with direction " << options.direction
936 <<
" with starting parameters " << parameters);
938 auto state = propagator.makeState<
decltype(options), Acts::ForcedSurfaceReached>(referenceSurface, options);
940 collectorResult = &expectedLayerPattern;
942 auto initRes = propagator.initialize(state, parameters);
944 ATH_MSG_WARNING(
"Failed to initialize propagation state: " << initRes.error().message());
945 return initRes.error();
948 auto propagateOnlyResult =
949 propagator.propagate(state);
951 if (!propagateOnlyResult.ok()) {
952 ATH_MSG_WARNING(
"Failed to extrapolate track: " << propagateOnlyResult.error().message());
953 return propagateOnlyResult.error();
956 auto propagateResult = propagator.makeResult(
957 std::move(state), propagateOnlyResult, options,
true, &referenceSurface);
959 if (!propagateResult.ok()) {
960 ATH_MSG_WARNING(
"Failed to extrapolate track: " << propagateResult.error().message());
961 return propagateResult.error();
964 track.setReferenceSurface(referenceSurface.getSharedPtr());
965 track.parameters() = propagateResult->endParameters.value().parameters();
966 track.covariance() = propagateResult->endParameters.value().covariance().value();
968 return Acts::Result<void>::success();
const ActsDetectorElement * getActsDetectorElement(const Acts::Surface &surf)
Attempts to retrieve the ActsDetectorElement associated to the passed ActsSurface.
#define ATH_CHECK
Evaluate an expression and check for errors.
ElementLink()
Default constructor.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define AmgSymMatrix(dim)
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration.
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.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerName
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterRawTimeKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_numHGTDHitsKey
virtual StatusCode execute(const EventContext &ctx) const override
const xAOD::HGTDCluster * getHGTDClusterFromState(const EventContext &ctx, const ActsTrk::detail::RecoConstTrackStateContainerProxy &state, const xAOD::HGTDClusterContainer *hgtdClusters) const
Get xAOD::HGTDCluster from track state, so it is possible to retrieve its raw time and position for e...
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerExtensionChi2Key
Gaudi::Property< float > m_minEtaAcceptance
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerHasExtensionKey
bool addTrack(const DetectorContextHolder &detContext, detail::RecoTrackContainerProxy &track, const Acts::Surface &refSurface, const Acts::TrackExtrapolationStrategy &extrapolationStrategy, detail::RecoTrackContainer &actsTracksContainer, const detail::MeasurementIndex &measurementIndex, const detail::RecoTrackContainer &tracksContainerTemp) const
add extension to track container if it passes the track selector criteria
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_extrapYKey
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
subtracts the time of flight (TOF) from a measured hit time.
std::size_t getHGTDLayerIndex(const Acts::GeometryIdentifier &geoID) const
returns the index of HGTD layer where surfaces lies.
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_actsTrackLinkKey
virtual StatusCode initialize() override
Gaudi::Property< float > m_maxEtaAcceptance
SG::ReadHandleKeyArray< xAOD::UncalibratedMeasurementContainer > m_uncalibratedMeasurementContainerKeys
bool findExtension(const EventContext &ctx, const DetectorContextHolder &detContext, const detail::TrackFindingMeasurements &measurements, const detail::MeasurementIndex &measurementIndex, const Acts::BoundTrackParameters lastMeasurementStateParameters, detail::RecoTrackContainer &tracksContainerTemp, detail::RecoTrackContainer &actsTracksContainer, EventStats &event_stat, const Acts::Surface &refSurface, int &extension_index) const
invoke track finding procedure to extend ITk tracks to HGTD layers using CKF.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterTimeKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_extrapXKey
Acts::Result< void > extrapolateTrackToReferenceSurface(const DetectorContextHolder &detContext, detail::RecoTrackContainerProxy &track, const Acts::Surface &referenceSurface, const detail::Extrapolator &propagator, Acts::TrackExtrapolationStrategy strategy, ExpectedLayerPattern &expectedLayerPattern) const
it can happen that the last hit of an extension doesn't have a surface associated with it,...
ActsTrk::detail::xAODUncalibMeasSurfAcc m_surfAcc
SG::ReadHandleKey< xAOD::HGTDClusterContainer > m_HGTDClusterContainerName
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_hgtdTrackLinkKey
Gaudi::Property< float > m_memorySafetyMargin
std::array< unsigned int, 4 > ExpectedLayerPattern
TrackExtensionData processTrackExtension(const EventContext &ctx, const xAOD::TrackParticle *trackParticle, const detail::RecoTrackContainer::TrackProxy &trackProxy, const xAOD::HGTDClusterContainer *hgtdClusters) const
Create and fills the TrackExtensionData with HGTD hits at the extension.
static xAOD::UncalibMeasType measurementType(const detail::RecoTrackContainer::TrackStateProxy &trackState)
ToolHandle< ActsTrk::TrackStatePrinterTool > m_trackStatePrinter
SG::WriteHandleKey< ActsTrk::TrackContainer > m_trackContainerKey
detail::RecoTrackContainer::TrackProxy TrkProxy
CKF_pimpl & trackFinder()
ToolHandle< GenericMonitoringTool > m_monTool
Gaudi::Property< double > m_absEtaMax
virtual StatusCode initialize() override
StatusCode getContainersFromKeys(const EventContext &ctx, HandleArrayKeyType &handleKeyArray, std::vector< const ContainerType * > &outputContainers, std::size_t &sum) const
Take the array of handle keys and for each key retrieve containers, then append them to the output ve...
void checkCounts(const detail::RecoTrackContainer::TrackProxy &track) const
static void addCountsAndProperties(detail::RecoTrackContainer &tracksContainer, bool add_counts)
const Acts::Logger & logger() const
Private access to the logger.
Gaudi::Property< double > m_absEtaMin
BranchStopperResult stopBranch(const detail::RecoTrackContainer::TrackProxy &track, const detail::RecoTrackContainer::TrackStateProxy &trackState, const Acts::TrackSelector::EtaBinnedConfig &trackSelectorCfg, const Acts::GeometryContext &tgContext, const detail::MeasurementIndex &measurementIndex, const std::size_t typeIndex, EventStats::value_type &event_stat_category_i) const
Branch stopper.
static void initCounts(const detail::RecoTrackContainer::TrackProxy &track)
Gaudi::Property< bool > m_checkCounts
ServiceHandle< ActsTrk::ITrackingGeometrySvc > m_trackingGeometrySvc
TrackFindingDefaultOptions getDefaultOptions(const EventContext &ctx, const DetectorContextHolder &detContext, const detail::TrackFindingMeasurements &measurements, const Acts::PerigeeSurface *pSurface) const
Get CKF options for first and second pass + pointer to MeasurementSelector.
ContextUtility m_ctxProvider
Utility to fetch the geometry, magnetic field and calibration context in the event.
std::vector< std::array< unsigned int, kNStat > > EventStats
static void updateCounts(const detail::RecoTrackContainer::TrackProxy &track, Acts::ConstTrackStateTypeMap typeFlags, xAOD::UncalibMeasType detType)
Gaudi::Property< bool > m_addCounts
Acts::CombinatorialKalmanFilterBranchStopperResult BranchStopperResult
void addMeasurements(const xAOD::UncalibratedMeasurementContainer &clusterContainer)
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)
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
Helper class to access the Acts::surface associated with an Uncalibrated xAOD measurement.
const T * at(size_type n) const
Access an element, as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
Handle class for adding a decoration to an object.
const_pointer_type cptr() const
Dereference the pointer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
float time() const
Return the measured time in ns.
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.
double chi2(TH1 *h0, TH1 *h1)
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
RecoTrackStateContainer::ConstTrackStateProxy RecoConstTrackStateContainerProxy
void addToExpectedLayerPattern(std::array< unsigned int, 4 > &pattern, const ActsDetectorElement &detElement)
RecoTrackContainer::TrackProxy RecoTrackContainerProxy
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
std::optional< ActsTrk::TrackContainer::ConstTrackStateProxy > lastMeasurementState(const xAOD::TrackParticle &trkPart, const bool skipOutlier=true)
Returns the track state proxy corresponding to the last measurement on track.
constexpr double timeToAthena(T actsT)
Converts a time unit from Acts to Athena units.
std::optional< ActsTrk::TrackContainer::ConstTrackProxy > getActsTrack(const xAOD::TrackParticle &trkPart)
Return the proxy to the Acts track from which the track particle was made frome.
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".
HGTDCluster_v1 HGTDCluster
Define the version of the pixel cluster class.
Data structure to hold HGTD track extension results Contains information about hits,...
std::vector< float > chi2Vec
Chi2 contribution per 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.
std::vector< char > hasClusterVec
Whether extension has cluster in each HGTD layer.
Acts::GeometryContext geometry
Acts::MagneticFieldContext magField
Acts::TrackSelector trackSelector
static void add(track_container_t &trackContainer)
static void set(track_proxy_t &track, std::array< unsigned int, 4 > values)