14#include "Acts/Geometry/TrackingGeometry.hpp"
15#include "Acts/Geometry/GeometryIdentifier.hpp"
16#include "Acts/Utilities/TrackHelpers.hpp"
17#include "Acts/TrackFitting/MbfSmoother.hpp"
18#include "Acts/Utilities/Logger.hpp"
31#include <Acts/Propagator/StandardAborters.hpp>
40 static std::size_t sourceLinkHash(
const Acts::SourceLink& slink) {
43 return uncalibMeas.identifier();
46 static bool sourceLinkEquality(
const Acts::SourceLink&
a,
const Acts::SourceLink& b) {
52 static std::optional<ActsTrk::detail::RecoTrackStateContainerProxy> getFirstMeasurementFromTrack(
typename ActsTrk::detail::RecoTrackContainer::TrackProxy trackProxy) {
53 std::optional<ActsTrk::detail::RecoTrackStateContainerProxy> firstMeasurement {std::nullopt};
54 for (
auto st : trackProxy.trackStatesReversed()) {
58 if (not
st.typeFlags().hasMeasurement())
continue;
59 if (
st.typeFlags().isOutlier())
continue;
60 firstMeasurement =
st;
62 return firstMeasurement;
109 return StatusCode::FAILURE;
115 return StatusCode::FAILURE;
121 return StatusCode::FAILURE;
126 Acts::GreedyAmbiguityResolution::Config cfg;
137 return StatusCode::FAILURE;
141 return StatusCode::SUCCESS;
148 return StatusCode::SUCCESS;
166 std::vector<const ActsTrk::SeedContainer *> seedContainers;
167 std::size_t total_seeds = 0;
171 std::vector< std::unique_ptr< std::vector<int> > > destinies {};
173 destinies.reserve( seedContainers.size() );
174 for (std::size_t i(0); i<seedContainers.size(); ++i) {
175 destinies.push_back( std::make_unique< std::vector<int> >( seedContainers.at(i)->size(),
DestinyType::UNKNOWN) );
180 std::vector<const xAOD::UncalibratedMeasurementContainer *> uncalibratedMeasurementContainers;
181 std::size_t total_measurements = 0;
188 std::vector< const InDet::SiDetectorElementStatus *> det_el_status_arr;
189 const std::vector<const InDetDD::SiDetectorElementCollection*> &det_el_collections =volumeIdToDetectorElementCollMap->collections();
190 det_el_status_arr.resize( det_el_collections.size(),
nullptr);
194 const std::vector<const InDetDD::SiDetectorElementCollection*>::const_iterator
195 det_el_col_iter = std::find(det_el_collections.begin(),
196 det_el_collections.end(),
197 &det_el_status->getDetectorElements());
198 det_el_status_arr.at(det_el_col_iter - det_el_collections.begin()) = det_el_status.
cptr();
202 for (std::size_t icontainer = 0; icontainer < uncalibratedMeasurementContainers.size(); ++icontainer) {
203 measurementIndex.
addMeasurements(*uncalibratedMeasurementContainers[icontainer]);
207 for (std::size_t icontainer = 0; icontainer < uncalibratedMeasurementContainers.size(); ++icontainer) {
210 *uncalibratedMeasurementContainers[icontainer],
226 for (std::size_t icontainer = 0; icontainer < seedContainers.size(); ++icontainer)
228 duplicateSeedDetector.
addSeeds(icontainer, *seedContainers[icontainer], measurementIndex,
231 const bool reverseSearch = m_autoReverseSearch && shouldReverseSearch(seed);
232 const bool refitSeeds = icontainer < m_refitSeeds.size() && m_refitSeeds[icontainer];
233 const bool useTopSp = reverseSearch && !refitSeeds;
244 Acts::Vector3 beamPos( beamSpotData->
beamPos().x() * Acts::UnitConstants::mm,
245 beamSpotData->
beamPos().y() * Acts::UnitConstants::mm,
249 std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(beamPos);
255 std::vector<const InDetDD::SiDetectorElementCollection*> detElementsCollections;
256 std::size_t total_detElems = 0;
262 Acts::VectorTrackContainer actsTrackBackend;
263 Acts::VectorMultiTrajectory actsTrackStateBackend;
265 std::lock_guard<std::mutex>
lock( m_mutex );
266 actsTrackBackend.reserve(m_nTrackReserve);
267 actsTrackStateBackend.reserve(m_nTrackStateReserve);
270 actsTrackStateBackend);
279 event_stat.resize(m_stat.size());
289 std::optional<std::vector<unsigned int>> trackCategories;
290 if (
m_ambi) trackCategories.emplace();
293 for (std::size_t icontainer = 0; icontainer < seedContainers.size(); ++icontainer)
300 duplicateSeedDetector,
301 *seedContainers.at(icontainer),
302 *detElementsCollections.at(icontainer),
312 ATH_MSG_DEBUG(
" \\__ Created " << actsTracksContainer.size() <<
" tracks");
314 mon_nTracks = actsTracksContainer.size();
323 for (std::size_t i(0); i<destinies.size(); ++i) {
332 std::lock_guard<std::mutex>
lock( m_mutex );
334 if (actsTrackBackend.size() > m_nTrackReserve) {
335 m_nTrackReserve =
static_cast<std::size_t
>( std::ceil(
m_memorySafetyMargin * actsTrackBackend.size()) );
337 if (actsTrackStateBackend.size() > m_nTrackStateReserve) {
338 m_nTrackStateReserve =
static_cast<std::size_t
>( std::ceil(
m_memorySafetyMargin * actsTrackStateBackend.size()) );
347 ATH_MSG_DEBUG(
" \\__ Created " << actsTracksContainer.size() <<
" resolved tracks");
349 std::move(actsTrackBackend),
350 std::move(actsTrackStateBackend) ) );
351 return StatusCode::SUCCESS;
356 Acts::VectorTrackContainer resolvedTrackBackend;
357 Acts::VectorMultiTrajectory resolvedTrackStateBackend;
358 resolvedTrackBackend.reserve( actsTrackBackend.size() );
359 resolvedTrackStateBackend.reserve( actsTrackStateBackend.size() );
368 Acts::GreedyAmbiguityResolution::State state;
369 m_ambi->computeInitialState(actsTracksContainer, state, &sourceLinkHash,
370 &sourceLinkEquality);
379 for (
auto iTrack : state.selectedTracks) {
380 int actsTrackIndex = state.trackTips.at(iTrack);
381 auto destProxy = resolvedTracksContainer.makeTrack();
382 destProxy.copyFrom(actsTracksContainer.getTrack(actsTrackIndex));
384 unsigned int category_i = trackCategories->at(actsTrackIndex);
388 auto [nShared, nBadTrackMeasurements] = sharedHits_forFinalAmbi.
computeSharedHits(destProxy, resolvedTracksContainer, measurementIndex);
389 if (nBadTrackMeasurements > 0)
390 ATH_MSG_ERROR(
"computeSharedHits: " << nBadTrackMeasurements <<
" track measurements not found in input track");
394 ATH_MSG_DEBUG(
" \\__ Created " << resolvedTracksContainer.size() <<
" resolved tracks");
398 std::move(resolvedTrackBackend),
399 std::move(resolvedTrackStateBackend)) );
401 return StatusCode::SUCCESS;
405 Acts::VectorTrackContainer&& originalTrackBackend,
406 Acts::VectorMultiTrajectory&& originalTrackStateBackend)
const
409 Acts::ConstVectorTrackContainer constTrackBackend( std::move(originalTrackBackend) );
410 Acts::ConstVectorMultiTrajectory constTrackStateBackend( std::move(originalTrackStateBackend) );
411 std::unique_ptr< ActsTrk::TrackContainer> constTracksContainer = std::make_unique< ActsTrk::TrackContainer >( std::move(constTrackBackend),
412 std::move(constTrackStateBackend) );
416 ATH_CHECK(trackContainerHandle.
record(std::move(constTracksContainer)));
417 return StatusCode::SUCCESS;
423 const double r = bottom_sp->
radius();
424 const double z = std::abs(bottom_sp->
z());
429 return r > rBoundary ||
z > zBoundary;
444 std::size_t typeIndex,
445 const char *seedType,
447 std::vector<int>* destiny,
448 const Acts::PerigeeSurface& pSurface,
449 std::optional<std::vector<unsigned int>>& trackCategories)
const
453 auto [options, secondOptions, measurementSelector] =
getDefaultOptions(ctx, detContext, measurements, &pSurface);
456 Acts::VectorTrackContainer trackBackend;
457 Acts::VectorMultiTrajectory trackStateBackend;
466 std::size_t category_i = 0;
468 auto stopBranchProxy = [&](
const detail::RecoTrackContainer::TrackProxy &track,
470 return stopBranch(track, trackState, trackSelectorCfg, detContext.
geometry, measurementIndex, typeIndex, event_stat[category_i]);
472 options.extensions.branchStopper.connect(stopBranchProxy);
474 Acts::PropagatorOptions<detail::Stepper::Options, detail::Navigator::Options,
475 Acts::ActorList<Acts::MaterialInteractor>>
478 Acts::TrackExtrapolationStrategy extrapolationStrategy =
479 Acts::TrackExtrapolationStrategy::first;
482 ATH_MSG_DEBUG(
"Invoke track finding with " << seeds.
size() <<
' ' << seedType <<
" seeds.");
485 std::size_t nPrinted = 0;
488 auto retrieveSurfaceFunction =
489 [
this, &detElements] (
const ActsTrk::Seed& seed,
bool useTopSp) ->
const Acts::Surface& {
492 :
sp->elementIdList().front());
500 for (
unsigned int iseed = 0; iseed < seeds.
size(); ++iseed)
506 tracksContainerTemp.clear();
510 const bool useTopSp = reverseSearch && !refitSeeds;
513 const bool isDupSeed = duplicateSeedDetector.
isDuplicate(typeIndex, iseed);
516 ATH_MSG_DEBUG(
"skip " << seedType <<
" seed " << iseed <<
" - already found");
525 options.propagatorPlainOptions.direction = reverseSearch ? Acts::Direction::Backward() : Acts::Direction::Forward();
526 secondOptions.propagatorPlainOptions.direction = options.propagatorPlainOptions.direction.invert();
527 options.targetSurface = reverseSearch ? &pSurface :
nullptr;
528 secondOptions.targetSurface = reverseSearch ? nullptr : &pSurface;
532 std::optional<Acts::BoundTrackParameters> optTrackParams =
537 retrieveSurfaceFunction);
539 if (!optTrackParams) {
540 ATH_MSG_DEBUG(
"Failed to estimate track parameters for seed " << iseed);
550 Acts::BoundTrackParameters *initialParameters = &(*optTrackParams);
551 printSeed(iseed, detContext, seeds, *initialParameters, measurementIndex, nPrinted, seedType);
552 if (isDupSeed)
continue;
554 double etaInitial = -std::log(std::tan(0.5 * initialParameters->theta()));
560 std::unique_ptr<Acts::BoundTrackParameters> refitSeedParameters;
562 refitSeedParameters =
doRefit(seed, *initialParameters, detContext, reverseSearch);
563 if (refitSeedParameters.get() ==
nullptr) {
568 if (refitSeedParameters.get() != initialParameters) {
569 initialParameters = refitSeedParameters.get();
570 printSeed(iseed, detContext, seeds, *initialParameters, measurementIndex, nPrinted, seedType,
true);
574 auto measurementRangesForced =
576 : std::unique_ptr<ActsTrk::detail::MeasurementRangeListFlat>();
577 measurementSelector->setMeasurementRangesForced(measurementRangesForced.get());
578 if (measurementRangesForced)
582 Acts::Result<std::vector<TrkProxy> > result =
583 trackFinder().
ckf.findTracks(*initialParameters, options, tracksContainerTemp);
586 if (not result.ok()) {
587 ATH_MSG_WARNING(
"Track finding failed for " << seedType <<
" seed " << iseed <<
" with error" << result.error());
591 auto &tracksForSeed = result.value();
595 std::size_t ntracks = 0ul;
598 std::size_t nfirst = 0;
599 for (
TrkProxy &firstTrack : tracksForSeed) {
601 auto smoothingResult = Acts::smoothTrack(detContext.
geometry, firstTrack,
logger(), Acts::MbfSmoother());
602 if (!smoothingResult.ok()) {
604 << iseed <<
" and first track " << firstTrack.index()
605 <<
" failed with error " << smoothingResult.error());
615 extrapolationStrategy,
620 duplicateSeedDetector,
634 std::optional<detail::RecoTrackStateContainerProxy> firstMeas = getFirstMeasurementFromTrack(firstTrack);
636 if (not firstMeas.has_value()) {
637 ATH_MSG_ERROR(
"Could not retrieve first measurement from track proxy. Is it ill-formed?");
638 return StatusCode::FAILURE;
643 std::vector<typename detail::RecoTrackContainer::TrackProxy> secondTracksForSeed =
649 if ( secondTracksForSeed.empty() ) {
650 ATH_MSG_DEBUG(
"No viable result from second track finding for " << seedType <<
" seed " << iseed <<
" track " << nfirst);
655 extrapolationStrategy,
660 duplicateSeedDetector,
673 auto originalFirstMeasurementPrevious = firstMeasurement.previous();
674 for (
auto &secondTrack : secondTracksForSeed) {
675 secondTrack.reverseTrackStates(
true);
677 firstMeasurement.previous() = secondTrack.outermostTrackState().index();
678 secondTrack.tipIndex() = firstTrack.tipIndex();
682 auto secondSmoothingResult = Acts::smoothTrack(detContext.
geometry,
685 if ( not secondSmoothingResult.ok() ) {
688 secondTrack.reverseTrackStates(
true);
695 extrapolationStrategy,
700 duplicateSeedDetector,
712 firstMeasurement.previous() = originalFirstMeasurementPrevious;
726 ATH_MSG_DEBUG(
"Track finding found no track candidates for " << seedType <<
" seed " << iseed);
728 }
else if (ntracks >= 2) {
733 std::cout << std::flush;
738 return StatusCode::SUCCESS;
747 const auto lastMeasurementIndex = track.tipIndex();
750 tracksContainer.trackStateContainer().visitBackwards(
751 lastMeasurementIndex,
752 [&duplicateSeedDetector,&measurementIndex](
const detail::RecoTrackStateContainer::ConstTrackStateProxy &state) ->
void
755 if (not state.hasUncalibratedSourceLink())
765 const std::vector< const InDet::SiDetectorElementStatus *> &det_el_status_arr,
767 const Acts::TrackingGeometry *
769 ATH_CHECK(acts_tracking_geometry !=
nullptr);
771 using Counter =
struct {
unsigned int n_volumes, n_volumes_with_status, n_missing_detector_elements, n_detector_elements, n_disabled_detector_elements;};
772 Counter counter {0u,0u,0u,0u,0u};
773 acts_tracking_geometry->visitVolumes([&counter,
774 &volume_id_to_det_el_coll,
777 this](
const Acts::TrackingVolume *volume_ptr) {
779 if (!volume_ptr)
return;
782 det_el_status = det_el_status_arr.at(volume_id_to_det_el_coll.
collecionMap().at(volume_ptr->geometryId().volume()));
784 ++counter.n_volumes_with_status;
785 volume_ptr->visitSurfaces([&counter, det_el_status, &measurements,
this](
const Acts::Surface *surface_ptr) {
786 if (!surface_ptr)
return;
787 const Acts::Surface &surface = *surface_ptr;
788 const Acts::SurfacePlacementBase* detector_element = surface.surfacePlacement();
789 if (detector_element) {
790 ++counter.n_detector_elements;
794 if (!old_range.
empty()) {
795 auto geoid_to_string = [](
const Acts::GeometryIdentifier &id) -> std::string {
796 std::stringstream amsg;
800 std::string a_msg ( geoid_to_string(surface_ptr->geometryId()));
802 <<
" measurements because surface " << a_msg);
804 ++counter.n_disabled_detector_elements;
810 ++counter.n_missing_detector_elements;
813 ATH_MSG_DEBUG(
"Volumes with detector element status " << counter.n_volumes_with_status <<
" / " << counter.n_volumes
814 <<
" disabled detector elements " << counter.n_disabled_detector_elements
815 <<
" / " << counter.n_detector_elements
816 <<
" missing detector elements "
817 << counter.n_missing_detector_elements);
818 return StatusCode::SUCCESS;
827 double etaSeed = std::atanh(pos[2] / pos.norm());
834 const Acts::BoundTrackParameters &seedParameters,
836 std::size_t& nPrinted,
837 const char *seedType,
843 ATH_MSG_INFO(
"CKF results for " << seeds.
size() <<
' ' << seedType <<
" seeds:");
853 template <
typename propagator_state_t,
typename stepper_t,
854 typename navigator_t>
855 Acts::Result<void> act(propagator_state_t& state,
const stepper_t& ,
856 const navigator_t& navigator, result_type& result,
857 const Acts::Logger& )
const {
858 const Acts::Surface* currentSurface = navigator.currentSurface(state.navigation);
859 if (currentSurface ==
nullptr) {
860 return Acts::Result<void>::success();
863 assert(result !=
nullptr &&
"Result type is nullptr");
865 if (currentSurface->surfacePlacement() !=
nullptr) {
866 const auto* detElem =
dynamic_cast<const ActsDetectorElement*
>(currentSurface->surfacePlacement());
867 if(detElem !=
nullptr) {
872 return Acts::Result<void>::success();
880 const Acts::Surface &referenceSurface,
882 Acts::TrackExtrapolationStrategy strategy,
885 Acts::PropagatorOptions<detail::Stepper::Options, detail::Navigator::Options,
886 Acts::ActorList<Acts::MaterialInteractor, Collector>>
889 auto findResult = findTrackStateForExtrapolation(
890 options.geoContext, track, referenceSurface, strategy,
logger());
892 if (!findResult.ok()) {
894 return findResult.error();
897 auto &[trackState, distance] = *findResult;
899 options.direction = Acts::Direction::fromScalarZeroAsPositive(distance);
901 Acts::BoundTrackParameters parameters = track.createParametersFromState(trackState);
902 ATH_MSG_VERBOSE(
"Extrapolating track to reference surface at distance "
903 << distance <<
" with direction " << options.direction
904 <<
" with starting parameters " << parameters);
906 auto state = propagator.makeState<
decltype(options), Acts::ForcedSurfaceReached>(referenceSurface, options);
908 collectorResult = &expectedLayerPattern;
910 auto initRes = propagator.initialize(state, parameters);
912 ATH_MSG_WARNING(
"Failed to initialize propagation state: " << initRes.error().message());
913 return initRes.error();
917 auto propagateOnlyResult =
918 propagator.propagate(state);
920 if (!propagateOnlyResult.ok()) {
921 ATH_MSG_WARNING(
"Failed to extrapolate track: " << propagateOnlyResult.error().message());
922 return propagateOnlyResult.error();
925 auto propagateResult = propagator.makeResult(
926 std::move(state), propagateOnlyResult, options,
true, &referenceSurface);
928 if (!propagateResult.ok()) {
929 ATH_MSG_WARNING(
"Failed to extrapolate track: " << propagateResult.error().message());
930 return propagateResult.error();
933 track.setReferenceSurface(referenceSurface.getSharedPtr());
934 track.parameters() = propagateResult->endParameters.value().parameters();
936 propagateResult->endParameters.value().covariance().value();
938 return Acts::Result<void>::success();
943 const Acts::Surface& pSurface,
944 const Acts::TrackExtrapolationStrategy& extrapolationStrategy,
950 std::vector<int>* destiny,
952 std::size_t& ntracks,
954 std::size_t category_i,
955 const char *seedType,
956 std::optional<std::vector<unsigned int>>& trackCategories)
const
959 std::array<unsigned int, 4> expectedLayerPattern{};
964 if (not track.hasReferenceSurface()) {
965 auto extrapolationResult =
969 extrapolationStrategy,
970 expectedLayerPattern);
972 if (not extrapolationResult.ok()) {
974 << iseed <<
" and " << track.index()
975 <<
" failed with error " << extrapolationResult.error()
976 <<
" dropping track candidate.");
978 return StatusCode::SUCCESS;
983 for(
const auto ts : track.trackStatesReversed()) {
984 const auto& surface =
ts.referenceSurface();
985 if(surface.surfacePlacement() !=
nullptr) {
986 const auto* detElem =
dynamic_cast<const ActsDetectorElement*
>(surface.surfacePlacement());
987 if(detElem !=
nullptr) {
998 Acts::trimTrack(track,
true,
true,
true,
true);
999 Acts::calculateTrackQuantities(track);
1002 for (
const auto trackState : track.trackStatesReversed()) {
1013 if ( not
trackFinder().trackSelector.isValidTrack(track) or
1015 ATH_MSG_DEBUG(
"Track " << ntracks <<
" from " << seedType <<
" seed " << iseed <<
" failed track selection");
1019 return StatusCode::SUCCESS;
1026 storeSeedInfo(tracksContainerTemp, track, duplicateSeedDetector, measurementIndex);
1029 auto actsDestProxy = actsTracksContainer.makeTrack();
1030 actsDestProxy.copyFrom(track);
1034 auto setTrackCategory = [&]() {
1035 if (!trackCategories)
return;
1036 if (!(actsDestProxy.index() < trackCategories->size())) trackCategories->resize(actsDestProxy.index()+1);
1037 trackCategories->at(actsDestProxy.index()) = category_i;
1041 return StatusCode::SUCCESS;
1044 auto [nShared, nBadTrackMeasurements] = sharedHits.
computeSharedHits(actsDestProxy, actsTracksContainer, measurementIndex);
1046 if (nBadTrackMeasurements > 0) {
1047 ATH_MSG_ERROR(
"computeSharedHits: " << nBadTrackMeasurements <<
" track measurements not found in input for " << seedType <<
" seed " << iseed <<
" track");
1050 ATH_MSG_DEBUG(
"found " << actsDestProxy.nSharedHits() <<
" shared hits in " << seedType <<
" seed " << iseed <<
" track");
1062 ATH_MSG_DEBUG(
"found " << actsDestProxy.nSharedHits() <<
" shared hits in " << seedType <<
" seed " << iseed <<
" track");
1066 auto [nSharedRemoved, nRemoveBadTrackMeasurements] = sharedHits.
computeSharedHits(actsDestProxy, actsTracksContainer, measurementIndex,
true);
1068 ATH_MSG_DEBUG(
"Removed " << nSharedRemoved <<
" shared hits in " << seedType <<
" seed " << iseed <<
" track and the matching track");
1070 if (nRemoveBadTrackMeasurements > 0) {
1071 ATH_MSG_ERROR(
"computeSharedHits with remove flag ON: " << nRemoveBadTrackMeasurements <<
1072 " track measurements not found in input for " << seedType <<
" seed " << iseed <<
" track");
1075 if (actsDestProxy.nSharedHits() != 0) {
1076 ATH_MSG_ERROR(
"computeSharedHits with remove flag ON returned " <<
1077 actsDestProxy.nSharedHits()<<
" while expecting 0 for" <<
1078 seedType <<
" seed " << iseed <<
" track");
1082 actsTracksContainer.removeTrack(actsDestProxy.index());
1083 ATH_MSG_DEBUG(
"Track " << ntracks <<
" from " << seedType <<
" seed " << iseed <<
" failed shared hit selection");
1094 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
Header file to be included by clients of the Monitored infrastructure.
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)
IdentifierHash identifyHash() const
Identifier hash.
const std::array< unsigned char, 256 > & collecionMap() const
SG::WriteHandleKeyArray< std::vector< int > > m_seedDestiny
Gaudi::Property< bool > m_countSharedHits
Gaudi::Property< unsigned int > m_maximumSharedHits
Gaudi::Property< float > m_memorySafetyMargin
SG::ReadHandleKeyArray< xAOD::UncalibratedMeasurementContainer > m_uncalibratedMeasurementContainerKeys
SG::ReadHandleKeyArray< ActsTrk::SeedContainer > m_seedContainerKeys
std::size_t getSeedCategory(std::size_t typeIndex, const ActsTrk::Seed &seed, bool useTopSp) const
SG::ReadCondHandleKey< ActsTrk::ActsVolumeIdToDetectorElementCollectionMap > m_volumeIdToDetectorElementCollMapKey
SG::ReadCondHandleKeyArray< InDetDD::SiDetectorElementCollection > m_detEleCollKeys
TrackFindingAlg(const std::string &name, ISvcLocator *pSvcLocator)
void printSeed(unsigned int iseed, const DetectorContextHolder &detContext, const ActsTrk::SeedContainer &seeds, const Acts::BoundTrackParameters &seedParameters, const detail::MeasurementIndex &measurementIndex, std::size_t &nPrinted, const char *seedType, bool isKF=false) const
Gaudi::Property< std::vector< bool > > m_refitSeeds
void storeSeedInfo(const detail::RecoTrackContainer &tracksContainer, const detail::RecoTrackContainerProxy &track, detail::DuplicateSeedDetector &duplicateSeedDetector, const detail::MeasurementIndex &measurementIndex) const
std::optional< Acts::GreedyAmbiguityResolution > m_ambi
StatusCode propagateDetectorElementStatusToMeasurements(const ActsTrk::ActsVolumeIdToDetectorElementCollectionMap &volume_id_to_det_el_coll, const std::vector< const InDet::SiDetectorElementStatus * > &det_el_status_arr, detail::TrackFindingMeasurements &measurements) const
Gaudi::Property< unsigned int > m_nMeasurementsMin
ToolHandle< ActsTrk::ITrackParamsEstimationTool > m_paramEstimationTool
Gaudi::Property< unsigned int > m_seedMeasOffset
virtual StatusCode initialize() override
StatusCode findTracks(const EventContext &ctx, const DetectorContextHolder &detContext, const detail::TrackFindingMeasurements &measurements, const detail::MeasurementIndex &measurementIndex, detail::SharedHitCounter &sharedHits, detail::DuplicateSeedDetector &duplicateSeedDetector, const ActsTrk::SeedContainer &seeds, const InDetDD::SiDetectorElementCollection &detElements, detail::RecoTrackContainer &actsTracksContainer, std::size_t seedCollectionIndex, const char *seedType, EventStats &event_stat, std::vector< int > *destiny, const Acts::PerigeeSurface &pSurface, std::optional< std::vector< unsigned int > > &trackCategories) const
invoke track finding procedure
Gaudi::Property< std::vector< double > > m_useTopSpRZboundary
Acts::Result< void > extrapolateTrackToReferenceSurface(const DetectorContextHolder &detContext, detail::RecoTrackContainerProxy &track, const Acts::Surface &referenceSurface, const detail::Extrapolator &propagator, Acts::TrackExtrapolationStrategy strategy, ExpectedLayerPattern &expectedLayerPattern) const
Gaudi::Property< bool > m_autoReverseSearch
StatusCode storeTrackCollectionToStoreGate(const EventContext &ctx, Acts::VectorTrackContainer &&originalTrackBackend, Acts::VectorMultiTrajectory &&originalTrackStateBackend) const
Gaudi::Property< unsigned int > m_maximumIterations
std::array< unsigned int, 4 > ExpectedLayerPattern
Gaudi::Property< bool > m_forceTrackOnSeed
Gaudi::Property< bool > m_skipDuplicateSeeds
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
virtual StatusCode execute(const EventContext &ctx) const override
virtual StatusCode finalize() override
StatusCode addTrack(const DetectorContextHolder &detContext, detail::RecoTrackContainerProxy &track, const Acts::Surface &pSurface, const Acts::TrackExtrapolationStrategy &extrapolationStrategy, detail::SharedHitCounter &sharedHits, detail::RecoTrackContainer &actsTracksContainer, const detail::MeasurementIndex &measurementIndex, const detail::RecoTrackContainer &tracksContainerTemp, detail::DuplicateSeedDetector &duplicateSeedDetector, std::vector< int > *destiny, EventStats &event_stat, std::size_t &ntracks, std::size_t iseed, std::size_t category_i, const char *seedType, std::optional< std::vector< unsigned int > > &trackCategories) const
Gaudi::Property< std::size_t > m_ambiStrategy
bool shouldReverseSearch(const ActsTrk::Seed &seed) const
SG::ReadHandleKeyArray< InDet::SiDetectorElementStatus > m_detElStatus
Gaudi::Property< std::vector< float > > m_statEtaBins
Gaudi::Property< bool > m_doTwoWay
Gaudi::Property< bool > m_dumpAllStatEtaBins
static xAOD::UncalibMeasType measurementType(const detail::RecoTrackContainer::TrackStateProxy &trackState)
ToolHandle< ActsTrk::TrackStatePrinterTool > m_trackStatePrinter
SG::WriteHandleKey< ActsTrk::TrackContainer > m_trackContainerKey
detail::RecoTrackContainer::TrackProxy TrkProxy
void copyStats(const EventStats &event_stat) const
CKF_pimpl & trackFinder()
std::size_t getStatCategory(std::size_t seed_collection, float eta) const
ToolHandle< GenericMonitoringTool > m_monTool
static void addCounts(detail::RecoTrackContainer &tracksContainer)
std::vector< typename detail::RecoTrackContainer::TrackProxy > doTwoWayTrackFinding(const detail::RecoTrackStateContainerProxy &firstMeasurement, const TrkProxy &trackProxy, detail::RecoTrackContainer &tracksContainerTemp, const TrackFinderOptions &options) const
Perform two-way track finding.
TrackFindingBaseAlg(const std::string &name, ISvcLocator *pSvcLocator)
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
ToolHandle< ActsTrk::IActsToTrkConverterTool > m_ATLASConverterTool
@ kNForcedSeedMeasurements
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
std::size_t computeStatSum(std::size_t seed_collection, EStat counter_i, const EventStats &stat) const
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
const Acts::Logger & logger() const
Private access to the logger.
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
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.
std::unique_ptr< Acts::BoundTrackParameters > doRefit(const MeasurementSource &measurement, const Acts::BoundTrackParameters &initialParameters, const DetectorContextHolder &detContext, const bool paramsAtOutermostSurface) const
Perform Kalman Filter fit and update given initialParameters.
virtual StatusCode finalize() override
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
bool selectCountsFinal(const detail::RecoTrackContainer::TrackProxy &track) const
Gaudi::Property< std::vector< std::string > > m_seedLabels
void addMeasurement(const ActsTrk::ATLASUncalibSourceLink &sl, const MeasurementIndex &measurementIndex)
bool isDuplicate(std::size_t typeIndex, index_t iseed)
void addSeeds(std::size_t typeIndex, const ActsTrk::SeedContainer &seeds, const MeasurementIndex &measurementIndex)
void addMeasurements(const xAOD::UncalibratedMeasurementContainer &clusterContainer)
auto computeSharedHits(typename track_container_t::TrackProxy &track, track_container_t &tracks, const MeasurementIndex &measurementIndex, bool removeSharedHits=false) -> ReturnSharedAndBad
const std::vector< std::size_t > & measurementOffsets() const
std::unique_ptr< MeasurementRangeListFlat > createMeasurementRangesForced(const ActsTrk::Seed &seed, const MeasurementIndex &measurementIndex) const
void addMeasurements(std::size_t typeIndex, const xAOD::UncalibratedMeasurementContainer &clusterContainer, const DetectorElementToActsGeometryIdMap &detectorElementToGeoid, const MeasurementIndex *measurementIndex=nullptr)
MeasurementRange markSurfaceInsensitive(const Acts::GeometryIdentifier &identifier)
Class to hold the SiDetectorElement objects to be put in the detector store.
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Class to hold geometrical description of a silicon detector element.
Trk::Surface & surface()
Element Surface.
const Amg::Vector3D & beamPos() const noexcept
bool isGood(IdentifierHash hash) const
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
const_pointer_type cptr()
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
Property holding a SG store/key/clid from which a WriteHandle is made.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
Abstract Base Class for tracking surfaces.
Eigen::Map< const Eigen::Matrix< float, 3, 1 > > ConstVectorMap
DetectorIdentType identifier() const
Returns the full Identifier of the measurement.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
RecoTrackStateContainer::TrackStateProxy RecoTrackStateContainerProxy
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
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...
const xAOD::UncalibratedMeasurement & getUncalibratedMeasurement(const ATLASUncalibSourceLink &source_link)
Acts::CalibrationContext getCalibrationContext(const EventContext &ctx)
The Acts::Calibration context is piped through the Acts fitters to (re)calibrate the Acts::SourceLink...
const xAOD::UncalibratedMeasurement * ATLASUncalibSourceLink
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
std::size_t size() const noexcept
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)
unsigned int elementEndIndex() const
unsigned int elementBeginIndex() const