7 #include "Acts/Seeding/EstimateTrackParamsFromSeed.hpp"
8 #include "Acts/EventData/TransformationHelpers.hpp"
15 const std::string&
name,
41 return StatusCode::SUCCESS;
44 std::optional<Acts::BoundTrackParameters>
48 const Acts::GeometryContext& geoContext,
49 const Acts::MagneticFieldContext& magFieldContext,
50 std::function<
const Acts::Surface&(
const ActsTrk::Seed& seed,
bool useTopSp)> retrieveSurface)
const
52 const auto& sp_collection = seed.sp();
53 if ( sp_collection.size() < 3 )
return std::nullopt;
54 const auto& bottom_sp = (useTopSp &&
m_bFieldMode != 2) ? sp_collection.back() : sp_collection.front();
58 Acts::MagneticFieldProvider::Cache magFieldCache = magneticField.
makeCache( magFieldContext );
59 Acts::Vector3 bField = *magneticField.
getField( Acts::Vector3(bottom_sp->x(), bottom_sp->y(), bottom_sp->z()),
67 const Acts::Surface& surface = retrieveSurface(seed, useTopSp);
78 std::optional<Acts::BoundTrackParameters>
82 const Acts::GeometryContext& geoContext,
83 const Acts::MagneticFieldContext& magFieldContext,
84 const Acts::Surface& surface,
85 const Acts::Vector3& bField)
const
88 const auto& sp_collection = seed.sp();
89 const std::size_t nSp = sp_collection.size();
90 if (nSp < 3)
return std::nullopt;
94 return sp_collection.at(useTopSp ? sp_collection.size() -
i - 1 :
i);
98 Acts::FreeVector freeParams = Acts::estimateTrackParamsFromSeed(
m_spacePointIndicesFun(nSp) | sp_collection_extract, bField);
101 auto spacePointIndicesFun2 = [](std::size_t nSp) -> std::array<std::size_t, 3> {
102 return {0, nSp / 2
ul, nSp - 1};
104 Acts::FreeVector freeParams2 = Acts::estimateTrackParamsFromSeed(spacePointIndicesFun2(nSp) | sp_collection_extract, bField);
105 ATH_MSG_DEBUG(
"update seed p = " << 1.0 / freeParams[Acts::eFreeQOverP] <<
" to " << 1.0 / freeParams2[Acts::eFreeQOverP]);
106 freeParams[Acts::eFreeQOverP] = freeParams2[Acts::eFreeQOverP];
111 freeParams = Acts::reflectFreeParameters(freeParams);
115 Acts::BoundTrackParameters curvilinearParams = Acts::BoundTrackParameters::createCurvilinear(
116 freeParams.segment<4>(Acts::eFreePos0),
117 freeParams.segment<3>(Acts::eFreeDir0),
118 freeParams[Acts::eFreeQOverP],
123 Acts::PropagatorPlainOptions propOptions(geoContext, magFieldContext);
124 propOptions.direction = Acts::Direction::fromScalarZeroAsPositive(
127 freeParams.segment<3>(Acts::eFreePos0),
128 freeParams.segment<3>(Acts::eFreeDir0)
129 ).closest().pathLength());
130 auto boundParamsResult =
m_extrapolator->propagateToSurface(curvilinearParams, surface, propOptions);
131 if (!boundParamsResult.ok()) {
137 Acts::BoundTrackParameters boundParams = *boundParamsResult;
140 Acts::EstimateTrackParamCovarianceConfig covarianceEstimationConfig = {
144 .noTimeVarInflation = 1.0,
146 boundParams.covariance() = Acts::estimateTrackParamCovariance(
147 covarianceEstimationConfig,
148 boundParams.parameters(),
157 return [](std::size_t nSp) -> std::array<std::size_t, 3> {
159 return {0, nSp / 2
ul, nSp - 1};
165 return [firstSp](std::size_t nSp) -> std::array<std::size_t, 3> {
173 return [](std::size_t) -> std::array<std::size_t, 3> {