8#include "Acts/Seeding/EstimateTrackParamsFromSeed.hpp"
9#include "Acts/SpacePointFormation2/StripSpacePointCalibration.hpp"
10#include "Acts/EventData/StripSpacePointCalibrationDetails.hpp"
11#include "Acts/EventData/TransformationHelpers.hpp"
20template <
typename sp_range_t>
21Acts::FreeVector estimateTrackParamsFromSeed(
22 const sp_range_t& spRange,
23 const Acts::Vector3& bField,
24 const std::size_t stripCalibrationIterations) {
25 std::array<const xAOD::SpacePoint*, 3> spArray{};
26 std::array<Acts::Vector3, 3> spPositions{};
29 for (
const auto*
sp : spRange) {
31 throw std::invalid_argument(
"Empty space point found.");
33 if (i >= spArray.size()) {
34 throw std::invalid_argument(
"More than 3 space points provided.");
37 spPositions[
i] = Acts::Vector3(
sp->x(),
sp->y(),
sp->z());
40 if (i < spArray.size()) {
41 throw std::invalid_argument(
"Less than 3 space points provided.");
45 return sp->elementIdList().size() > 1;
48 std::array<Acts::Vector3, 3> spTangents{};
50 for (std::size_t i = 0;
i < stripCalibrationIterations; ++
i) {
51 Acts::estimateTrackParamsFromSeed(
52 spPositions[0], 0, spPositions[1], spPositions[2], bField,
53 &spTangents[0], &spTangents[1], &spTangents[2]);
55 for (std::size_t j = 0;
j < spArray.size(); ++
j) {
57 const bool isStrip =
sp->elementIdList().size() > 1;
62 Acts::OuterStripSpacePointCalibrationDetails calibrationDetails;
63 Eigen::Map<Eigen::Vector3f>(calibrationDetails.outerCenter.data()) =
sp->topStripCenter();
64 Eigen::Map<Eigen::Vector3f>(calibrationDetails.innerToOuterSeparation.data()) =
sp->stripCenterDistance();
65 Eigen::Map<Eigen::Vector3f>(calibrationDetails.outerHalfVector.data()) =
sp->topHalfStripLength() *
sp->topStripDirection();
66 Eigen::Map<Eigen::Vector3f>(calibrationDetails.innerHalfVector.data()) =
sp->bottomHalfStripLength() *
sp->bottomStripDirection();
67 const Acts::OuterStripSpacePointCalibrationDetailsDerived derivedCalibrationDetails =
68 Acts::deriveOuterStripSpacePointCalibrationDetails(calibrationDetails);
70 const std::optional<Eigen::Vector3f> calibratedPosition =
71 Acts::calibrateOuterStripSpacePoint(spTangents[j].cast<float>(), derivedCalibrationDetails);
72 if (!calibratedPosition.has_value()) {
75 spPositions[
j] = calibratedPosition->cast<
double>();
80 return Acts::estimateTrackParamsFromSeed(
81 spPositions[0], 0, spPositions[1], spPositions[2], bField);
87 const std::string& name,
88 const IInterface* parent)
89 : base_class(
type, name, parent)
114 return StatusCode::SUCCESS;
117 std::optional<Acts::BoundTrackParameters>
121 const Acts::GeometryContext& geoContext,
122 const Acts::MagneticFieldContext& magFieldContext,
123 std::function<
const Acts::Surface&(
const ActsTrk::Seed& seed,
bool useTopSp)> retrieveSurface)
const
125 const auto& sp_collection = seed.sp();
126 if ( sp_collection.size() < 3 )
return std::nullopt;
131 Acts::MagneticFieldProvider::Cache magFieldCache = magneticField.
makeCache( magFieldContext );
132 Acts::Vector3 bField = *magneticField.
getField( Acts::Vector3(bottom_sp->
x(), bottom_sp->
y(), bottom_sp->
z()),
140 const Acts::Surface& surface = retrieveSurface(seed, useTopSp);
151 std::optional<Acts::BoundTrackParameters>
155 const Acts::GeometryContext& geoContext,
156 const Acts::MagneticFieldContext& magFieldContext,
157 const Acts::Surface& surface,
158 const Acts::Vector3& bField)
const
161 const auto& sp_collection = seed.sp();
162 const std::size_t nSp = sp_collection.size();
163 if (nSp < 3)
return std::nullopt;
166 const auto sp_collection_extract = std::views::transform([&sp_collection, useTopSp](std::size_t i) {
167 return sp_collection.at(useTopSp ? sp_collection.size() - i - 1 : i);
174 const auto spacePointIndicesFun2 = [](std::size_t nSp) -> std::array<std::size_t, 3> {
175 return {0, nSp / 2ul, nSp - 1};
177 const Acts::FreeVector freeParams2 = estimateTrackParamsFromSeed(spacePointIndicesFun2(nSp) | sp_collection_extract, bField,
m_stripCalibrationIterations);
178 ATH_MSG_DEBUG(
"update seed p = " << 1.0 / freeParams[Acts::eFreeQOverP] <<
" to " << 1.0 / freeParams2[Acts::eFreeQOverP]);
179 freeParams[Acts::eFreeQOverP] = freeParams2[Acts::eFreeQOverP];
184 freeParams = Acts::reflectFreeParameters(freeParams);
188 Acts::BoundTrackParameters curvilinearParams = Acts::BoundTrackParameters::createCurvilinear(
189 freeParams.segment<4>(Acts::eFreePos0),
190 freeParams.segment<3>(Acts::eFreeDir0),
191 freeParams[Acts::eFreeQOverP],
193 Acts::ParticleHypothesis::pion());
196 Acts::PropagatorPlainOptions propOptions(geoContext, magFieldContext);
197 propOptions.direction = Acts::Direction::fromScalarZeroAsPositive(
200 freeParams.segment<3>(Acts::eFreePos0),
201 freeParams.segment<3>(Acts::eFreeDir0)
202 ).closest().pathLength());
204 std::optional<Acts::BoundTrackParameters> boundParams;
205 auto boundParamsResult =
206 m_extrapolator->propagateToSurface(curvilinearParams, surface, propOptions);
208 if (!boundParamsResult.ok()) {
212 ATH_MSG_DEBUG(
"Using curvilinear parameters due to propagation failure");
213 boundParams = curvilinearParams;
218 boundParams = *boundParamsResult;
223 Acts::EstimateTrackParamCovarianceConfig covarianceEstimationConfig = {
227 .noTimeVarInflation = 1.0,
229 boundParams->covariance() = Acts::estimateTrackParamCovariance(
230 covarianceEstimationConfig,
231 boundParams->parameters(),
240 return [](std::size_t nSp) -> std::array<std::size_t, 3> {
242 return {0, nSp / 2ul, nSp - 1};
248 return [firstSp](std::size_t nSp) -> std::array<std::size_t, 3> {
250 std::size_t first = std::min(firstSp, nSp - 3ul);
251 return {first, first + 1, first + 2};
256 return [](std::size_t) -> std::array<std::size_t, 3> {
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Acts::Result< Acts::Vector3 > getField(const Acts::Vector3 &position, Acts::MagneticFieldProvider::Cache &gcache) const override
MagneticFieldProvider::Cache makeCache(const Acts::MagneticFieldContext &mctx) const override
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)