8 #include "Acts/Seeding/EstimateTrackParamsFromSeed.hpp"
9 #include "Acts/EventData/TransformationHelpers.hpp"
16 const std::string&
name,
42 return StatusCode::SUCCESS;
45 std::optional<Acts::BoundTrackParameters>
49 const Acts::GeometryContext& geoContext,
50 const Acts::MagneticFieldContext& magFieldContext,
51 std::function<
const Acts::Surface&(
const ActsTrk::Seed& seed,
bool useTopSp)> retrieveSurface)
const
53 const auto& sp_collection = seed.sp();
54 if ( sp_collection.size() < 3 )
return std::nullopt;
59 Acts::MagneticFieldProvider::Cache magFieldCache = magneticField.
makeCache( magFieldContext );
60 Acts::Vector3 bField = *magneticField.
getField( Acts::Vector3(bottom_sp->
x(), bottom_sp->
y(), bottom_sp->
z()),
68 const Acts::Surface& surface = retrieveSurface(seed, useTopSp);
79 std::optional<Acts::BoundTrackParameters>
83 const Acts::GeometryContext& geoContext,
84 const Acts::MagneticFieldContext& magFieldContext,
85 const Acts::Surface& surface,
86 const Acts::Vector3& bField)
const
89 const auto& sp_collection = seed.sp();
90 const std::size_t nSp = sp_collection.size();
91 if (nSp < 3)
return std::nullopt;
95 return sp_collection.at(useTopSp ? sp_collection.size() -
i - 1 :
i);
99 Acts::FreeVector freeParams = Acts::estimateTrackParamsFromSeed(
m_spacePointIndicesFun(nSp) | sp_collection_extract, bField);
102 auto spacePointIndicesFun2 = [](std::size_t nSp) -> std::array<std::size_t, 3> {
103 return {0, nSp / 2
ul, nSp - 1};
105 Acts::FreeVector freeParams2 = Acts::estimateTrackParamsFromSeed(spacePointIndicesFun2(nSp) | sp_collection_extract, bField);
106 ATH_MSG_DEBUG(
"update seed p = " << 1.0 / freeParams[Acts::eFreeQOverP] <<
" to " << 1.0 / freeParams2[Acts::eFreeQOverP]);
107 freeParams[Acts::eFreeQOverP] = freeParams2[Acts::eFreeQOverP];
112 freeParams = Acts::reflectFreeParameters(freeParams);
116 Acts::BoundTrackParameters curvilinearParams = Acts::BoundTrackParameters::createCurvilinear(
117 freeParams.segment<4>(Acts::eFreePos0),
118 freeParams.segment<3>(Acts::eFreeDir0),
119 freeParams[Acts::eFreeQOverP],
124 Acts::PropagatorPlainOptions propOptions(geoContext, magFieldContext);
125 propOptions.direction = Acts::Direction::fromScalarZeroAsPositive(
128 freeParams.segment<3>(Acts::eFreePos0),
129 freeParams.segment<3>(Acts::eFreeDir0)
130 ).closest().pathLength());
131 auto boundParamsResult =
m_extrapolator->propagateToSurface(curvilinearParams, surface, propOptions);
132 if (!boundParamsResult.ok()) {
138 Acts::BoundTrackParameters boundParams = *boundParamsResult;
141 Acts::EstimateTrackParamCovarianceConfig covarianceEstimationConfig = {
145 .noTimeVarInflation = 1.0,
147 boundParams.covariance() = Acts::estimateTrackParamCovariance(
148 covarianceEstimationConfig,
149 boundParams.parameters(),
158 return [](std::size_t nSp) -> std::array<std::size_t, 3> {
160 return {0, nSp / 2
ul, nSp - 1};
166 return [firstSp](std::size_t nSp) -> std::array<std::size_t, 3> {
174 return [](std::size_t) -> std::array<std::size_t, 3> {